From f5dde45c18ad9f9b37541ac3d61c00d8ee8f6c98 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 19:40:36 +0200 Subject: [PATCH 001/158] docs: reconcile protocol docstrings with implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BitchatProtocol.swift: stop advertising "timing obfuscation prevents traffic analysis" — what exists is randomized relay jitter (RelayController, 10-220 ms) and PKCS#7-style padding to 256/512/1024/2048-byte blocks (MessagePadding); there is no cover traffic or per-message timing obfuscation. Also update the stale Message Types list (Delivery/Read are Noise payloads, no Version negotiation type; add CourierEnvelope/RequestSync/FileTransfer). - MessageType.swift: header said "6 essential" types; the enum has 9 cases. WHITEPAPER.md needed no changes: the #1372 rewrite already replaced the old Bloom-filter and MessageRetryService claims, and its numbers (dedup 1000/5min, jitter, outbox 100/peer 24h 8 attempts, courier 16 KiB/24h/40-20-5-2 quotas, spray 4/8, gossip 1000/15s/6h) all match the code. Co-Authored-By: Claude Fable 5 --- bitchat/Protocols/BitchatProtocol.swift | 16 +++++++++------- .../Sources/BitFoundation/MessageType.swift | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/bitchat/Protocols/BitchatProtocol.swift b/bitchat/Protocols/BitchatProtocol.swift index 4ebe6509..267d8cc5 100644 --- a/bitchat/Protocols/BitchatProtocol.swift +++ b/bitchat/Protocols/BitchatProtocol.swift @@ -18,7 +18,7 @@ /// - Efficient binary message encoding /// - Message fragmentation for large payloads /// - TTL-based routing for mesh networks -/// - Privacy features like padding and timing obfuscation +/// - Privacy features: message padding and randomized relay jitter /// - Integration points for end-to-end encryption /// /// ## Protocol Design @@ -38,18 +38,20 @@ /// 7. **Decoding**: Binary data parsed back to message objects /// /// ## Security Considerations -/// - Message padding obscures actual content length -/// - Timing obfuscation prevents traffic analysis +/// - Message padding (to 256/512/1024/2048-byte blocks) obscures actual content length +/// - Randomized relay jitter reduces the traffic-analysis signal; there is no +/// cover traffic or per-message timing obfuscation /// - Integration with Noise Protocol for E2E encryption /// - No persistent identifiers in protocol headers /// /// ## Message Types /// - **Announce/Leave**: Peer presence notifications -/// - **Message**: User chat messages (broadcast or directed) +/// - **Message**: Public chat messages /// - **Fragment**: Multi-part message handling -/// - **Delivery/Read**: Message acknowledgments -/// - **Noise**: Encrypted channel establishment -/// - **Version**: Protocol version negotiation +/// - **NoiseHandshake/NoiseEncrypted**: Encrypted channel establishment and +/// all private payloads (messages, delivery acks, read receipts) +/// - **CourierEnvelope**: Sealed store-and-forward mail +/// - **RequestSync/FileTransfer**: Gossip history sync and media transfer /// /// ## Future Extensions /// The protocol is designed to be extensible: diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index ceac0cd0..23f391b9 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -7,7 +7,7 @@ // /// Simplified BitChat protocol message types. -/// Reduced from 24 types to just 6 essential ones. +/// Consolidated from the original 24 wire types down to the 9 cases below. /// All private communication metadata (receipts, status) is embedded in noiseEncrypted payloads. public enum MessageType: UInt8 { // Public messages (unencrypted) From 688b954fb8c990b0a7852d325cf8ac3810a4ddb6 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 19:44:55 +0200 Subject: [PATCH 002/158] Add capability bits to announce TLV Announces now carry an optional capabilities TLV (0x05): a little-endian bitfield with named bits for upcoming features (prekeys, wifiBulk, gateway, groups, board, vouch, meshDiagnostics). Old clients skip the unknown TLV; peers without it decode as nil so features can distinguish "legacy peer" from "advertises nothing". PeerCapabilities lives in BitFoundation with a minimal-length encoding that preserves unknown bits for forward compatibility. Peer capabilities are stored in the BLE peer registry on verified announce and exposed via BLEService.peerCapabilities(_:). The local advertisement set is empty until each feature ships its bit. Co-Authored-By: Claude Fable 5 --- bitchat/Protocols/Packets.swift | 32 ++++++++++++- .../Protocols/PeerCapabilities+Local.swift | 7 +++ bitchat/Services/BLE/BLEPeerRegistry.swift | 11 ++++- bitchat/Services/BLE/BLEService.swift | 12 ++++- bitchatTests/Protocols/PacketsTests.swift | 37 +++++++++++++++ .../BitFoundation/PeerCapabilities.swift | 45 +++++++++++++++++++ .../PeerCapabilitiesTests.swift | 43 ++++++++++++++++++ 7 files changed, 182 insertions(+), 5 deletions(-) create mode 100644 bitchat/Protocols/PeerCapabilities+Local.swift create mode 100644 localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift create mode 100644 localPackages/BitFoundation/Tests/BitFoundationTests/PeerCapabilitiesTests.swift diff --git a/bitchat/Protocols/Packets.swift b/bitchat/Protocols/Packets.swift index 8914d4b7..309860aa 100644 --- a/bitchat/Protocols/Packets.swift +++ b/bitchat/Protocols/Packets.swift @@ -1,3 +1,4 @@ +import BitFoundation import Foundation // MARK: - Protocol TLV Packets @@ -7,12 +8,28 @@ struct AnnouncementPacket { let noisePublicKey: Data // Noise static public key (Curve25519.KeyAgreement) let signingPublicKey: Data // Ed25519 public key for signing let directNeighbors: [Data]? // 8-byte peer IDs + let capabilities: PeerCapabilities? // advertised feature bits; nil when absent (old clients) + + init( + nickname: String, + noisePublicKey: Data, + signingPublicKey: Data, + directNeighbors: [Data]?, + capabilities: PeerCapabilities? = nil + ) { + self.nickname = nickname + self.noisePublicKey = noisePublicKey + self.signingPublicKey = signingPublicKey + self.directNeighbors = directNeighbors + self.capabilities = capabilities + } private enum TLVType: UInt8 { case nickname = 0x01 case noisePublicKey = 0x02 case signingPublicKey = 0x03 case directNeighbors = 0x04 + case capabilities = 0x05 } func encode() -> Data? { @@ -48,6 +65,15 @@ struct AnnouncementPacket { } } + // TLV for capabilities (optional) + if let capabilities = capabilities { + let capabilityBytes = capabilities.encoded() + guard capabilityBytes.count <= 255 else { return nil } + data.append(TLVType.capabilities.rawValue) + data.append(UInt8(capabilityBytes.count)) + data.append(capabilityBytes) + } + return data } @@ -57,6 +83,7 @@ struct AnnouncementPacket { var noisePublicKey: Data? var signingPublicKey: Data? var directNeighbors: [Data]? + var capabilities: PeerCapabilities? while offset + 2 <= data.count { let typeRaw = data[offset] @@ -87,6 +114,8 @@ struct AnnouncementPacket { } directNeighbors = neighbors } + case .capabilities: + capabilities = PeerCapabilities(encoded: Data(value)) } } else { // Unknown TLV; skip (tolerant decoder for forward compatibility) @@ -99,7 +128,8 @@ struct AnnouncementPacket { nickname: nickname, noisePublicKey: noisePublicKey, signingPublicKey: signingPublicKey, - directNeighbors: directNeighbors + directNeighbors: directNeighbors, + capabilities: capabilities ) } } diff --git a/bitchat/Protocols/PeerCapabilities+Local.swift b/bitchat/Protocols/PeerCapabilities+Local.swift new file mode 100644 index 00000000..40f97b9f --- /dev/null +++ b/bitchat/Protocols/PeerCapabilities+Local.swift @@ -0,0 +1,7 @@ +import BitFoundation + +extension PeerCapabilities { + /// Capabilities this build advertises in its announce packets. + /// Each feature adds its bit here when it ships. + static let localSupported: PeerCapabilities = [] +} diff --git a/bitchat/Services/BLE/BLEPeerRegistry.swift b/bitchat/Services/BLE/BLEPeerRegistry.swift index 29776748..4db3e931 100644 --- a/bitchat/Services/BLE/BLEPeerRegistry.swift +++ b/bitchat/Services/BLE/BLEPeerRegistry.swift @@ -9,6 +9,7 @@ struct BLEPeerInfo: Equatable { var signingPublicKey: Data? var isVerifiedNickname: Bool var lastSeen: Date + var capabilities: PeerCapabilities = [] } struct BLEPeerAnnounceUpdate: Equatable { @@ -107,6 +108,10 @@ struct BLEPeerRegistry { peers[peerID]?.noisePublicKey?.sha256Fingerprint() } + func capabilities(for peerID: PeerID) -> PeerCapabilities { + peers[peerID.toShort()]?.capabilities ?? [] + } + func displayNicknames(selfNickname: String) -> [PeerID: String] { let connected = peers.filter { $0.value.isConnected } let tuples = connected.map { ($0.key, $0.value.nickname, true) } @@ -157,7 +162,8 @@ struct BLEPeerRegistry { noisePublicKey: Data, signingPublicKey: Data?, isConnected: Bool, - now: Date + now: Date, + capabilities: PeerCapabilities = [] ) -> BLEPeerAnnounceUpdate { let existing = peers[peerID] let update = BLEPeerAnnounceUpdate( @@ -173,7 +179,8 @@ struct BLEPeerRegistry { noisePublicKey: noisePublicKey, signingPublicKey: signingPublicKey, isVerifiedNickname: true, - lastSeen: now + lastSeen: now, + capabilities: capabilities ) return update diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 865a89be..d1ed84f2 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -619,6 +619,12 @@ final class BLEService: NSObject { } } + /// Capabilities the peer advertised in its last verified announce. + /// Empty for peers that predate the capabilities TLV. + func peerCapabilities(_ peerID: PeerID) -> PeerCapabilities { + collectionsQueue.sync { peerRegistry.capabilities(for: peerID) } + } + func getPeerNicknames() -> [PeerID: String] { return collectionsQueue.sync { peerRegistry.displayNicknames(selfNickname: myNickname) @@ -1261,7 +1267,8 @@ final class BLEService: NSObject { nickname: myNickname, noisePublicKey: noisePub, signingPublicKey: signingPub, - directNeighbors: connectedPeerIDs + directNeighbors: connectedPeerIDs, + capabilities: PeerCapabilities.localSupported ) guard let payload = announcement.encode() else { @@ -3315,7 +3322,8 @@ extension BLEService { noisePublicKey: announcement.noisePublicKey, signingPublicKey: announcement.signingPublicKey, isConnected: isConnected, - now: now + now: now, + capabilities: announcement.capabilities ?? [] ) ?? BLEPeerAnnounceUpdate(isNewPeer: false, wasDisconnected: false, previousNickname: nil) }, shouldEmitReconnectLog: { [weak self] peerID, now in diff --git a/bitchatTests/Protocols/PacketsTests.swift b/bitchatTests/Protocols/PacketsTests.swift index 78c244de..2368925a 100644 --- a/bitchatTests/Protocols/PacketsTests.swift +++ b/bitchatTests/Protocols/PacketsTests.swift @@ -1,3 +1,4 @@ +import BitFoundation import Foundation import Testing @@ -108,6 +109,42 @@ struct PacketsTests { #expect(decoded.directNeighbors == nil) } + @Test + func announcementPacketRoundTripsCapabilities() throws { + let capabilities: PeerCapabilities = [.prekeys, .board, .meshDiagnostics] + let packet = AnnouncementPacket( + nickname: "alice", + noisePublicKey: Data(repeating: 0x11, count: 32), + signingPublicKey: Data(repeating: 0x22, count: 32), + directNeighbors: nil, + capabilities: capabilities + ) + + let encoded = try #require(packet.encode()) + let decoded = try #require(AnnouncementPacket.decode(from: encoded)) + #expect(decoded.capabilities == capabilities) + } + + @Test + func announcementPacketWithoutCapabilitiesDecodesNilAndUnknownBitsSurvive() throws { + let legacy = try #require( + AnnouncementPacket( + nickname: "alice", + noisePublicKey: Data(repeating: 0x11, count: 32), + signingPublicKey: Data(repeating: 0x22, count: 32), + directNeighbors: nil + ).encode() + ) + // The TLV is emitted only when capabilities are set, so legacy peers + // (and this packet) decode as nil rather than empty. + #expect(try #require(AnnouncementPacket.decode(from: legacy)).capabilities == nil) + + var withFutureBits = legacy + withFutureBits.append(makeTLV(type: 0x05, value: Data([0x80, 0x01]))) + let decoded = try #require(AnnouncementPacket.decode(from: withFutureBits)) + #expect(decoded.capabilities?.rawValue == 0x0180) + } + @Test func privateMessagePacketRejectsUnknownTypeAndTruncation() { let unknownTLV = Data([0x7F, 0x01, 0x41]) diff --git a/localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift b/localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift new file mode 100644 index 00000000..94858d9b --- /dev/null +++ b/localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift @@ -0,0 +1,45 @@ +import Foundation + +/// Feature capabilities a peer advertises in its announce packet. +/// +/// Encoded as a little-endian bitfield with trailing zero bytes dropped, so the +/// wire form grows only when high bits are assigned. Decoders keep the low 64 +/// bits and ignore any longer field, and unknown bits are preserved verbatim — +/// old clients skip the TLV entirely, new clients degrade per-feature. +public struct PeerCapabilities: OptionSet, Equatable, Hashable, Sendable { + public let rawValue: UInt64 + + public init(rawValue: UInt64) { + self.rawValue = rawValue + } + + public static let prekeys = PeerCapabilities(rawValue: 1 << 0) + public static let wifiBulk = PeerCapabilities(rawValue: 1 << 1) + public static let gateway = PeerCapabilities(rawValue: 1 << 2) + public static let groups = PeerCapabilities(rawValue: 1 << 3) + public static let board = PeerCapabilities(rawValue: 1 << 4) + public static let vouch = PeerCapabilities(rawValue: 1 << 5) + public static let meshDiagnostics = PeerCapabilities(rawValue: 1 << 6) + + /// Minimal little-endian byte encoding; always at least one byte so an + /// empty set is distinguishable from an absent TLV. + public func encoded() -> Data { + var value = rawValue + var bytes = Data() + repeat { + bytes.append(UInt8(truncatingIfNeeded: value)) + value >>= 8 + } while value != 0 + return bytes + } + + /// Accepts any length; bytes beyond the low 64 bits are ignored for + /// forward compatibility. + public init(encoded data: Data) { + var value: UInt64 = 0 + for (index, byte) in data.prefix(8).enumerated() { + value |= UInt64(byte) << (8 * index) + } + self.init(rawValue: value) + } +} diff --git a/localPackages/BitFoundation/Tests/BitFoundationTests/PeerCapabilitiesTests.swift b/localPackages/BitFoundation/Tests/BitFoundationTests/PeerCapabilitiesTests.swift new file mode 100644 index 00000000..1c83530f --- /dev/null +++ b/localPackages/BitFoundation/Tests/BitFoundationTests/PeerCapabilitiesTests.swift @@ -0,0 +1,43 @@ +// +// PeerCapabilitiesTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +@testable import BitFoundation + +struct PeerCapabilitiesTests { + @Test + func encodingIsMinimalAndRoundTrips() { + #expect(PeerCapabilities([]).encoded() == Data([0x00])) + #expect(PeerCapabilities.prekeys.encoded() == Data([0x01])) + #expect(PeerCapabilities.meshDiagnostics.encoded() == Data([0x40])) + + let high = PeerCapabilities(rawValue: 1 << 9) + #expect(high.encoded() == Data([0x00, 0x02])) + + let all: PeerCapabilities = [.prekeys, .wifiBulk, .gateway, .groups, .board, .vouch, .meshDiagnostics] + #expect(PeerCapabilities(encoded: all.encoded()) == all) + #expect(PeerCapabilities(encoded: high.encoded()) == high) + #expect(PeerCapabilities(encoded: PeerCapabilities([]).encoded()) == []) + } + + @Test + func decodingToleratesUnknownBitsAndOversizedFields() { + // Unknown bits survive a round-trip untouched. + let unknown = PeerCapabilities(encoded: Data([0xFF, 0xFF])) + #expect(unknown.rawValue == 0xFFFF) + #expect(unknown.contains(.gateway)) + + // Fields longer than 8 bytes keep the low 64 bits and ignore the rest. + let oversized = Data([0x01] + [UInt8](repeating: 0x00, count: 7) + [0xAA, 0xBB]) + #expect(PeerCapabilities(encoded: oversized) == .prekeys) + + // Empty value decodes to no capabilities. + #expect(PeerCapabilities(encoded: Data()) == []) + } +} From 112c0ec1ed5a1dc3d4ba8dcfd648f9bdf5c5cc35 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 19:54:39 +0200 Subject: [PATCH 003/158] Cashu ecash chips: detect, render, and redeem tokens + /pay command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-level Cashu support, no wire-protocol changes: - CashuTokenDecoder: summarizes V3 (cashuA base64url-JSON) tokens — amount summed across proofs, unit, mint host, memo — and V4 (cashuB) via a minimal bounded CBOR reader. All input is treated as adversarial: size caps, depth/item budgets, overflow guards, display sanitization; malformed payloads fail closed to a generic chip. - PaymentChipView: cashu chips now show "500 sat · mint.example.com" (+ memo) instead of a generic label; tap opens a cashu: wallet URL and falls back to https://redeem.cashu.me when no wallet handles it; context menu adds copy token / redeem in wallet / redeem on web. - extractCashuLinks now returns bare deduplicated bearer strings so the chip can decode them (cashu: URIs still detected via the embedded token). - /pay : validates the token decodes, sends it as the message body; DMs send directly, public channels require an explicit "/pay public" confirm since tokens are bearer instruments. Suggested everywhere except public geohash channels. - Tests: decoder (V3/V4 decode, summation, URI forms, truncation/ garbage/huge fuzzing, CBOR depth bounds) and /pay command flows. Co-Authored-By: Claude Fable 5 --- bitchat/Localizable.xcstrings | 60 ++++ bitchat/Models/CommandInfo.swift | 17 +- bitchat/Services/CashuTokenDecoder.swift | 317 ++++++++++++++++++ bitchat/Services/CommandProcessor.swift | 41 +++ bitchat/ViewModels/ChatViewModel.swift | 8 + .../Views/Components/PaymentChipView.swift | 170 +++++++++- bitchat/Views/MessageTextHelpers.swift | 15 +- bitchatTests/CashuTokenDecoderTests.swift | 306 +++++++++++++++++ bitchatTests/CommandProcessorTests.swift | 103 ++++++ 9 files changed, 1014 insertions(+), 23 deletions(-) create mode 100644 bitchat/Services/CashuTokenDecoder.swift create mode 100644 bitchatTests/CashuTokenDecoderTests.swift diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 7301e613..66fd04b4 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -15425,6 +15425,18 @@ } } }, + "content.commands.pay" : { + "comment" : "Autocomplete description for the /pay command that sends a Cashu ecash token", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "send a cashu ecash token in this chat" + } + } + } + }, "content.commands.slap" : { "extractionState" : "manual", "localizations" : { @@ -18469,6 +18481,18 @@ } } }, + "content.input.token_placeholder" : { + "comment" : "Placeholder shown after /pay in the command suggestion panel", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "token" + } + } + } + }, "content.jump.new_count" : { "comment" : "Count of messages that arrived while scrolled up, shown in the jump-to-latest pill", "extractionState" : "manual", @@ -19734,6 +19758,18 @@ } } }, + "content.payment.copy_token" : { + "comment" : "Context menu action copying a Cashu token to the pasteboard", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "copy token" + } + } + } + }, "content.payment.lightning" : { "extractionState" : "manual", "localizations" : { @@ -19913,6 +19949,30 @@ } } }, + "content.payment.redeem_wallet" : { + "comment" : "Context menu action opening a Cashu token in an ecash wallet app", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "redeem in wallet" + } + } + } + }, + "content.payment.redeem_web" : { + "comment" : "Context menu action opening a Cashu token in the web redemption page", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "redeem on web" + } + } + } + }, "encryption.accessibility.establishing" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Models/CommandInfo.swift b/bitchat/Models/CommandInfo.swift index 1f8245be..0ad3d554 100644 --- a/bitchat/Models/CommandInfo.swift +++ b/bitchat/Models/CommandInfo.swift @@ -20,6 +20,7 @@ enum CommandInfo: String, Identifiable { case hug case message = "msg" case slap + case pay case unblock case who case favorite = "fav" @@ -33,6 +34,8 @@ enum CommandInfo: String, Identifiable { switch self { case .block, .hug, .message, .slap, .unblock, .favorite, .unfavorite: return "<" + String(localized: "content.input.nickname_placeholder") + ">" + case .pay: + return "<" + String(localized: "content.input.token_placeholder") + ">" case .clear, .help, .who: return nil } @@ -45,6 +48,7 @@ enum CommandInfo: String, Identifiable { case .help: String(localized: "content.commands.help") case .hug: String(localized: "content.commands.hug") case .message: String(localized: "content.commands.message") + case .pay: String(localized: "content.commands.pay") case .slap: String(localized: "content.commands.slap") case .unblock: String(localized: "content.commands.unblock") case .who: String(localized: "content.commands.who") @@ -54,12 +58,19 @@ enum CommandInfo: String, Identifiable { } static func all(isGeoPublic: Bool, isGeoDM: Bool) -> [CommandInfo] { - let baseCommands: [CommandInfo] = [.block, .unblock, .clear, .help, .hug, .message, .slap, .who] + var commands: [CommandInfo] = [.block, .unblock, .clear, .help, .hug, .message, .slap, .who] + // Cashu tokens are bearer instruments: in a public geohash any nearby + // stranger can redeem one, so don't *suggest* /pay there (the + // processor still allows it behind an explicit "public" confirm). + // Payments make sense in every DM and in mesh public. + if !isGeoPublic { + commands.append(.pay) + } // The processor rejects favorites in geohash contexts, so only // suggest them where they actually work: mesh. if isGeoPublic || isGeoDM { - return baseCommands + return commands } - return baseCommands + [.favorite, .unfavorite] + return commands + [.favorite, .unfavorite] } } diff --git a/bitchat/Services/CashuTokenDecoder.swift b/bitchat/Services/CashuTokenDecoder.swift new file mode 100644 index 00000000..78c3b3c2 --- /dev/null +++ b/bitchat/Services/CashuTokenDecoder.swift @@ -0,0 +1,317 @@ +// +// CashuTokenDecoder.swift +// bitchat +// +// Decodes Cashu ecash tokens (V3 `cashuA` = base64url JSON, V4 `cashuB` = +// base64url CBOR) just far enough to summarize them for the UI: total +// amount, unit, mint host, and memo. The app never contacts a mint — tokens +// are bearer strings and redemption is delegated to an external wallet. +// +// This parses attacker-controlled message content, so every path is +// bounds-checked, size-capped, and returns nil instead of trapping. +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation + +enum CashuTokenDecoder { + + struct TokenInfo: Equatable { + /// Token serialization version: "A" (JSON) or "B" (CBOR). + let version: String + /// Sum of all proof amounts; nil when no valid amounts were found. + let amount: Int? + /// Currency unit as declared by the token (commonly "sat"), if any. + let unit: String? + /// Host of the (first) mint URL, for display. + let mintHost: String? + /// Optional sender memo, sanitized for display. + let memo: String? + + /// "500 sat" style summary, defaulting the unit to sats per NUT-00. + var displayAmount: String? { + amount.map { "\($0) \(unit ?? "sat")" } + } + } + + /// Upper bound on accepted token length in characters. Real tokens are a + /// few KB; anything much bigger is abuse we shouldn't spend CPU on. + static let maxTokenLength = 60_000 + /// Per-proof and total amount sanity caps (order of total sats in existence). + private static let maxAmount: Int64 = 2_100_000_000_000_000 + + // MARK: - Public API + + /// Extracts the bare `cashuA…`/`cashuB…` token from raw text that may be + /// a `cashu:`/`cashu://` URI and/or percent-encoded. Returns nil when the + /// input doesn't look like a Cashu token at all. + static func bareToken(from raw: String) -> String? { + var token = raw.trimmingCharacters(in: .whitespacesAndNewlines) + let lower = token.lowercased() + if lower.hasPrefix("cashu://") { + token = String(token.dropFirst(8)) + } else if lower.hasPrefix("cashu:") { + token = String(token.dropFirst(6)) + } + if token.contains("%"), let decoded = token.removingPercentEncoding { + token = decoded + } + guard token.count >= 12, token.count <= maxTokenLength else { return nil } + guard token.hasPrefix("cashuA") || token.hasPrefix("cashuB") else { return nil } + // Base64 / base64url payload charset ('.' appears in some legacy multi-part tokens) + let allowed = CharacterSet.alphanumerics.union(CharacterSet(charactersIn: "-_+/=.")) + guard token.unicodeScalars.allSatisfy({ allowed.contains($0) }) else { return nil } + return token + } + + /// Decodes a token (raw or `cashu:` URI form) into a display summary. + /// V3 tokens must parse as JSON; V4 tokens whose CBOR we cannot walk + /// still return a generic `TokenInfo` (version "B", no amount) because + /// the payload may use encodings this minimal reader doesn't support. + static func decode(_ raw: String) -> TokenInfo? { + guard let token = bareToken(from: raw) else { return nil } + let version = String(token[token.index(token.startIndex, offsetBy: 5)]) + guard let payload = base64URLDecode(String(token.dropFirst(6))), !payload.isEmpty else { + return nil + } + switch version { + case "A": + return decodeV3(payload) + case "B": + return decodeV4(payload) ?? TokenInfo(version: "B", amount: nil, unit: nil, mintHost: nil, memo: nil) + default: + return nil + } + } + + // MARK: - Base64url + + private static func base64URLDecode(_ input: String) -> Data? { + var s = input + .replacingOccurrences(of: "-", with: "+") + .replacingOccurrences(of: "_", with: "/") + // Normalize padding (wallets emit both padded and unpadded forms) + s = s.replacingOccurrences(of: "=", with: "") + let remainder = s.count % 4 + if remainder == 1 { return nil } + if remainder > 0 { s += String(repeating: "=", count: 4 - remainder) } + return Data(base64Encoded: s) + } + + // MARK: - V3 (JSON) + + private static func decodeV3(_ payload: Data) -> TokenInfo? { + guard let obj = (try? JSONSerialization.jsonObject(with: payload)) as? [String: Any], + let entries = obj["token"] as? [[String: Any]], + !entries.isEmpty else { + return nil + } + var total: Int64 = 0 + var sawAmount = false + var mintHost: String? + for entry in entries { + if mintHost == nil, let mint = entry["mint"] as? String { + mintHost = sanitizedHost(from: mint) + } + for proof in (entry["proofs"] as? [[String: Any]]) ?? [] { + guard let number = proof["amount"] as? NSNumber else { continue } + let value = number.int64Value + guard value > 0, value <= maxAmount else { continue } + total += value + guard total <= maxAmount else { return nil } + sawAmount = true + } + } + return TokenInfo( + version: "A", + amount: sawAmount ? Int(total) : nil, + unit: sanitizedUnit(obj["unit"] as? String), + mintHost: mintHost, + memo: sanitizedMemo(obj["memo"] as? String) + ) + } + + // MARK: - V4 (CBOR) + + /// Minimal walk of the NUT-00 TokenV4 CBOR map: + /// { "m": mint, "u": unit, "d": memo, "t": [ { "i": bytes, "p": [ { "a": amount, … } ] } ] } + private static func decodeV4(_ payload: Data) -> TokenInfo? { + var reader = CBORReader(data: payload) + guard case .map(let pairs)? = reader.parseValue(depth: 0) else { return nil } + var mintHost: String? + var unit: String? + var memo: String? + var total: Int64 = 0 + var sawAmount = false + for (key, value) in pairs { + guard case .text(let name) = key else { continue } + switch (name, value) { + case ("m", .text(let mint)): + mintHost = sanitizedHost(from: mint) + case ("u", .text(let u)): + unit = sanitizedUnit(u) + case ("d", .text(let d)): + memo = sanitizedMemo(d) + case ("t", .array(let groups)): + for case .map(let group) in groups { + for case (.text("p"), .array(let proofs)) in group { + for case .map(let proof) in proofs { + for case (.text("a"), .unsigned(let amount)) in proof { + guard amount > 0, amount <= UInt64(maxAmount) else { continue } + total += Int64(amount) + guard total <= maxAmount else { return nil } + sawAmount = true + } + } + } + } + default: + break + } + } + return TokenInfo( + version: "B", + amount: sawAmount ? Int(total) : nil, + unit: unit, + mintHost: mintHost, + memo: memo + ) + } + + // MARK: - Display Sanitization (values are attacker-controlled) + + private static func sanitizedHost(from mint: String) -> String? { + guard mint.count <= 512, let host = URL(string: mint)?.host, !host.isEmpty else { return nil } + return String(host.lowercased().prefix(48)) + } + + private static func sanitizedUnit(_ unit: String?) -> String? { + guard let unit, !unit.isEmpty, unit.count <= 12, + unit.unicodeScalars.allSatisfy({ CharacterSet.alphanumerics.contains($0) }) else { + return nil + } + return unit + } + + private static func sanitizedMemo(_ memo: String?) -> String? { + guard let memo, memo.count <= 512 else { return nil } + let stripped = CharacterSet.controlCharacters.union(.newlines) + var cleaned = "" + cleaned.unicodeScalars.append(contentsOf: memo.unicodeScalars.filter { !stripped.contains($0) }) + cleaned = cleaned.trimmingCharacters(in: .whitespaces) + guard !cleaned.isEmpty else { return nil } + return String(cleaned.prefix(80)) + } +} + +// MARK: - Minimal CBOR Reader + +/// Just enough definite-length CBOR to traverse a TokenV4 map. Bounded in +/// depth, item count, and byte length; indefinite-length items and anything +/// else exotic make the parse fail (the caller degrades to a generic chip). +private struct CBORReader { + indirect enum Value { + case unsigned(UInt64) + case text(String) + case array([Value]) + case map([(Value, Value)]) + /// Parsed-and-skipped content we don't need (byte strings, negatives, floats…) + case opaque + } + + private let bytes: [UInt8] + private var index = 0 + /// Total item budget so hostile nesting can't run away. + private var itemBudget = 50_000 + private static let maxDepth = 16 + private static let maxContainerCount: UInt64 = 10_000 + + init(data: Data) { + bytes = [UInt8](data) + } + + mutating func parseValue(depth: Int) -> Value? { + guard depth < Self.maxDepth, itemBudget > 0 else { return nil } + itemBudget -= 1 + guard let (major, argument) = readHead() else { return nil } + switch major { + case 0: // unsigned int + return .unsigned(argument) + case 1: // negative int (argument already consumed) + return .opaque + case 2: // byte string + return readBytes(count: argument) != nil ? .opaque : nil + case 3: // text string + guard let raw = readBytes(count: argument) else { return nil } + return String(bytes: raw, encoding: .utf8).map(Value.text) ?? .opaque + case 4: // array + guard argument <= Self.maxContainerCount else { return nil } + var items: [Value] = [] + items.reserveCapacity(Int(min(argument, 64))) + for _ in 0.. (major: UInt8, argument: UInt64)? { + guard index < bytes.count else { return nil } + let head = bytes[index] + index += 1 + let major = head >> 5 + let info = head & 0x1F + switch info { + case 0...23: + return (major, UInt64(info)) + case 24: + return readUInt(width: 1).map { (major, $0) } + case 25: + return readUInt(width: 2).map { (major, $0) } + case 26: + return readUInt(width: 4).map { (major, $0) } + case 27: + return readUInt(width: 8).map { (major, $0) } + default: // 28-30 reserved, 31 indefinite + return nil + } + } + + private mutating func readUInt(width: Int) -> UInt64? { + guard bytes.count - index >= width else { return nil } + var value: UInt64 = 0 + for _ in 0.. [UInt8]? { + guard count <= UInt64(bytes.count - index) else { return nil } + let length = Int(count) + let slice = Array(bytes[index..<(index + length)]) + index += length + return slice + } +} diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index 9f2f8e9b..81337fc4 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -45,6 +45,8 @@ protocol CommandContextProvider: AnyObject { /// Empties the peer's chat (single-writer store intent for `/clear`). func clearPrivateChat(_ peerID: PeerID) func sendPublicRaw(_ content: String) + /// Sends a normal public message (with local echo) to the active channel. + func sendPublicMessage(_ content: String) // MARK: - System Messages func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) @@ -106,6 +108,8 @@ final class CommandProcessor { case "/unfav": if inGeoPublic || inGeoDM { return .error(message: "favorites are only for mesh peers in #mesh") } return handleFavorite(args, add: false) + case "/pay": + return handlePay(args) case "/help": return .success(message: Self.helpText) default: @@ -125,6 +129,7 @@ final class CommandProcessor { /slap @name — slap with a large trout /block @name · /unblock @name /fav @name · /unfav @name — favorites (mesh only) + /pay — send a cashu ecash token in this chat /help — this list """ @@ -331,6 +336,42 @@ final class CommandProcessor { return .error(message: "cannot unblock \(nickname): not found") } + /// `/pay ` — validates the token decodes, then sends it as + /// the message body in the current chat. Cashu tokens are bearer + /// instruments (whoever redeems first gets the funds), so posting one to + /// a public channel requires an explicit `/pay public` confirm. + /// The app never contacts a mint; it only relays the string. + private func handlePay(_ args: String) -> CommandResult { + var parts = args.trimmed.split(separator: " ").map(String.init) + guard !parts.isEmpty else { + return .success(message: "usage: /pay — paste a cashu token: /pay cashuA…") + } + + let confirmedPublic = parts.count > 1 && parts.last?.lowercased() == "public" + if confirmedPublic { parts.removeLast() } + + guard parts.count == 1, let token = CashuTokenDecoder.bareToken(from: parts[0]) else { + return .error(message: "that doesn't look like a cashu token — expected cashuA… or cashuB…") + } + guard let info = CashuTokenDecoder.decode(token) else { + return .error(message: "couldn't decode that cashu token — not sending it") + } + + let summary = info.displayAmount ?? "a cashu token" + + if let peerID = contextProvider?.selectedPrivateChatPeer { + contextProvider?.sendPrivateMessage(token, to: peerID) + return .success(message: "sent \(summary) — cashu is a bearer token; whoever redeems it first gets the funds") + } + + guard confirmedPublic else { + return .error(message: "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public") + } + + contextProvider?.sendPublicMessage(token) + return .success(message: "sent \(summary) to the public channel — anyone here can redeem it") + } + private func handleFavorite(_ args: String, add: Bool) -> CommandResult { let targetName = args.trimmed guard !targetName.isEmpty else { diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 578b6509..5f055d25 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1677,6 +1677,14 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele publicConversationCoordinator.sendPublicRaw(content) } + // Send a normal public message (with local echo) to the active channel. + // CommandContextProvider hook for commands that post real messages + // (`/pay`); only called when no private chat is selected. + @MainActor + func sendPublicMessage(_ content: String) { + sendMessage(content) + } + /// Handle incoming public message @MainActor func handlePublicMessage(_ message: BitchatMessage) { diff --git a/bitchat/Views/Components/PaymentChipView.swift b/bitchat/Views/Components/PaymentChipView.swift index e01887d0..bdda8772 100644 --- a/bitchat/Views/Components/PaymentChipView.swift +++ b/bitchat/Views/Components/PaymentChipView.swift @@ -7,12 +7,17 @@ // import SwiftUI +#if os(iOS) +import UIKit +#else +import AppKit +#endif struct PaymentChipView: View { @Environment(\.colorScheme) private var colorScheme @Environment(\.openURL) private var openURL @ThemedPalette private var palette - + enum PaymentType { case cashu(String) case lightning(String) @@ -35,14 +40,33 @@ struct PaymentChipView: View { return URL(string: link) } } - + + /// The bare `cashuA…`/`cashuB…` bearer string, when this is a Cashu chip. + var cashuToken: String? { + if case .cashu(let link) = self { + return CashuTokenDecoder.bareToken(from: link) + } + return nil + } + + /// Web fallback for redemption when no wallet handles `cashu:` URLs. + /// The token only reaches the site the user's browser loads; the app + /// itself never contacts a mint. + var cashuWebRedeemURL: URL? { + guard let token = cashuToken, + let enc = token.addingPercentEncoding(withAllowedCharacters: Self.cashuAllowedCharacters) else { + return nil + } + return URL(string: "https://redeem.cashu.me/?token=\(enc)") + } + var emoji: String { switch self { case .cashu: "🥜" case .lightning: "⚡" } } - + var label: String { switch self { case .cashu: @@ -52,27 +76,56 @@ struct PaymentChipView: View { } } } - + let paymentType: PaymentType - + /// Decoded once at construction; tokens are capped in size so this is + /// cheap, and rows re-render often enough that lazy decode in `body` + /// would just repeat the work. + private let cashuInfo: CashuTokenDecoder.TokenInfo? + + init(paymentType: PaymentType) { + self.paymentType = paymentType + if case .cashu(let link) = paymentType { + self.cashuInfo = CashuTokenDecoder.decode(link) + } else { + self.cashuInfo = nil + } + } + private var fgColor: Color { palette.primary } private var bgColor: Color { palette.secondary.opacity(colorScheme == .dark ? 0.18 : 0.12) } private var border: Color { fgColor.opacity(0.25) } - + + /// "500 sat · mint.example.com", degrading to the generic label when the + /// token didn't decode (V4 payloads we can't walk, malformed input…). + private var primaryLabel: String { + guard let info = cashuInfo else { return paymentType.label } + var parts: [String] = [] + if let amount = info.displayAmount { parts.append(amount) } + if let host = info.mintHost { parts.append(host) } + return parts.isEmpty ? paymentType.label : parts.joined(separator: " · ") + } + + private var memoLabel: String? { cashuInfo?.memo } + var body: some View { Button { - #if os(iOS) - if let url = paymentType.url { openURL(url) } - #else - if let url = paymentType.url { NSWorkspace.shared.open(url) } - #endif + primaryAction() } label: { HStack(spacing: 6) { Text(paymentType.emoji) - Text(paymentType.label) - .bitchatFont(size: 12, weight: .semibold) + VStack(alignment: .leading, spacing: 1) { + Text(primaryLabel) + .bitchatFont(size: 12, weight: .semibold) + if let memoLabel { + Text(memoLabel) + .bitchatFont(size: 10) + .opacity(0.7) + .lineLimit(1) + } + } } .padding(.vertical, 6) .padding(.horizontal, 12) @@ -87,13 +140,102 @@ struct PaymentChipView: View { .foregroundColor(fgColor) } .buttonStyle(.plain) + .contextMenu { + if let token = paymentType.cashuToken { + Button { + copyToPasteboard(token) + } label: { + Label(String(localized: "content.payment.copy_token", comment: "Context menu action copying a Cashu token to the pasteboard"), systemImage: "doc.on.doc") + } + Button { + redeemCashu() + } label: { + Label(String(localized: "content.payment.redeem_wallet", comment: "Context menu action opening a Cashu token in an ecash wallet app"), systemImage: "wallet.pass") + } + if let webURL = paymentType.cashuWebRedeemURL { + Button { + openExternalURL(webURL) + } label: { + Label(String(localized: "content.payment.redeem_web", comment: "Context menu action opening a Cashu token in the web redemption page"), systemImage: "safari") + } + } + } + } + .accessibilityLabel(Text(verbatim: accessibilityText)) + } + + private var accessibilityText: String { + var text = "\(paymentType.label): \(primaryLabel)" + if let memoLabel { text += ", \(memoLabel)" } + return text + } + + // MARK: - Actions + + private func primaryAction() { + switch paymentType { + case .cashu: + redeemCashu() + case .lightning: + #if os(iOS) + if let url = paymentType.url { openURL(url) } + #else + if let url = paymentType.url { NSWorkspace.shared.open(url) } + #endif + } + } + + /// Redemption is delegated: try a wallet registered for `cashu:` URLs + /// first, then fall back to the web redemption page. Uses the platform + /// opener directly (not the `openURL` environment) because the message + /// list overrides that action for cashu/lightning schemes without a + /// fallback path. + private func redeemCashu() { + let walletURL = paymentType.url + let webURL = paymentType.cashuWebRedeemURL + #if os(iOS) + if let walletURL { + UIApplication.shared.open(walletURL, options: [:]) { accepted in + if !accepted, let webURL { + UIApplication.shared.open(webURL) + } + } + } else if let webURL { + UIApplication.shared.open(webURL) + } + #else + if let walletURL, NSWorkspace.shared.urlForApplication(toOpen: walletURL) != nil { + NSWorkspace.shared.open(walletURL) + } else if let webURL { + NSWorkspace.shared.open(webURL) + } else if let walletURL { + NSWorkspace.shared.open(walletURL) + } + #endif + } + + private func openExternalURL(_ url: URL) { + #if os(iOS) + UIApplication.shared.open(url) + #else + NSWorkspace.shared.open(url) + #endif + } + + private func copyToPasteboard(_ string: String) { + #if os(iOS) + UIPasteboard.general.string = string + #else + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(string, forType: .string) + #endif } } #Preview { let cashuLink = "https://example.com/cashu" let lightningLink = "https://example.com/lightning" - + List { HStack { PaymentChipView(paymentType: .cashu(cashuLink)) diff --git a/bitchat/Views/MessageTextHelpers.swift b/bitchat/Views/MessageTextHelpers.swift index bd653ec9..c684d3f1 100644 --- a/bitchat/Views/MessageTextHelpers.swift +++ b/bitchat/Views/MessageTextHelpers.swift @@ -21,17 +21,20 @@ extension String { return current >= threshold } - // Extract up to `max` Cashu tokens (cashuA/cashuB). Allow dot '.' and shorter lengths. + // Extract up to `max` distinct Cashu tokens (cashuA/cashuB), as the bare + // bearer strings. Allow dot '.' and shorter lengths. The `cashu:` URI + // form matches too — the token embedded after the scheme is the match. func extractCashuLinks(max: Int = 3) -> [String] { let regex = MessageFormattingEngine.Patterns.cashu let ns = self as NSString let range = NSRange(location: 0, length: ns.length) var found: [String] = [] - for m in regex.matches(in: self, range: range) { - if m.numberOfRanges > 0 { - let token = ns.substring(with: m.range(at: 0)) - let enc = token.addingPercentEncoding(withAllowedCharacters: .alphanumerics.union(CharacterSet(charactersIn: "-_"))) ?? token - found.append("cashu:\(enc)") + for m in regex.matches(in: self, range: range) where m.numberOfRanges > 0 { + let token = ns.substring(with: m.range(at: 0)) + // Dedup: repeated tokens are one bearer instrument (and duplicate + // ForEach IDs) — one chip is enough. + if !found.contains(token) { + found.append(token) if found.count >= max { break } } } diff --git a/bitchatTests/CashuTokenDecoderTests.swift b/bitchatTests/CashuTokenDecoderTests.swift new file mode 100644 index 00000000..6fa0aefa --- /dev/null +++ b/bitchatTests/CashuTokenDecoderTests.swift @@ -0,0 +1,306 @@ +// +// CashuTokenDecoderTests.swift +// bitchatTests +// +// Tests for the Cashu token summary decoder: V3 JSON decode, minimal V4 +// CBOR traversal, URI normalization, detection ranges, and adversarial +// (truncated / garbage / huge) input. The decoder renders attacker-controlled +// message content, so "never crash" matters as much as "decode correctly". +// This is free and unencumbered software released into the public domain. +// + +import Foundation +import Testing +@testable import bitchat + +struct CashuTokenDecoderTests { + + // MARK: - Token Builders + + private func base64URL(_ data: Data) -> String { + data.base64EncodedString() + .replacingOccurrences(of: "+", with: "-") + .replacingOccurrences(of: "/", with: "_") + .replacingOccurrences(of: "=", with: "") + } + + private func makeV3Token( + entries: [(mint: String, amounts: [Int])], + unit: String? = "sat", + memo: String? = nil + ) -> String { + var json: [String: Any] = [ + "token": entries.map { entry in + [ + "mint": entry.mint, + "proofs": entry.amounts.map { + ["amount": $0, "id": "009a1f293253e41e", "secret": "s", "C": "02c"] as [String: Any] + } + ] as [String: Any] + } + ] + if let unit { json["unit"] = unit } + if let memo { json["memo"] = memo } + let data = try! JSONSerialization.data(withJSONObject: json) + return "cashuA" + base64URL(data) + } + + /// Tiny deterministic CBOR encoder (definite lengths only) for building + /// V4 test tokens without depending on the decoder under test. + private enum CBOREncode { + static func head(_ major: UInt8, _ value: UInt64) -> [UInt8] { + switch value { + case 0...23: + return [(major << 5) | UInt8(value)] + case 24...0xFF: + return [(major << 5) | 24, UInt8(value)] + case 0x100...0xFFFF: + return [(major << 5) | 25, UInt8(value >> 8), UInt8(value & 0xFF)] + default: + return [(major << 5) | 26, + UInt8((value >> 24) & 0xFF), UInt8((value >> 16) & 0xFF), + UInt8((value >> 8) & 0xFF), UInt8(value & 0xFF)] + } + } + static func uint(_ v: UInt64) -> [UInt8] { head(0, v) } + static func bytes(_ b: [UInt8]) -> [UInt8] { head(2, UInt64(b.count)) + b } + static func text(_ s: String) -> [UInt8] { + let utf8 = Array(s.utf8) + return head(3, UInt64(utf8.count)) + utf8 + } + static func array(_ items: [[UInt8]]) -> [UInt8] { + head(4, UInt64(items.count)) + items.flatMap { $0 } + } + static func map(_ pairs: [(String, [UInt8])]) -> [UInt8] { + head(5, UInt64(pairs.count)) + pairs.flatMap { text($0.0) + $0.1 } + } + } + + private func makeV4Token( + mint: String = "https://mint.example.com", + unit: String = "sat", + memo: String? = nil, + amounts: [UInt64] = [1, 4] + ) -> String { + var pairs: [(String, [UInt8])] = [ + ("m", CBOREncode.text(mint)), + ("u", CBOREncode.text(unit)) + ] + if let memo { pairs.append(("d", CBOREncode.text(memo))) } + let proofs = amounts.map { amount in + CBOREncode.map([ + ("a", CBOREncode.uint(amount)), + ("s", CBOREncode.text("secret")), + ("c", CBOREncode.bytes([0x02, 0xAB, 0xCD])) + ]) + } + pairs.append(("t", CBOREncode.array([ + CBOREncode.map([ + ("i", CBOREncode.bytes([0x00, 0xAD, 0x26, 0x8C])), + ("p", CBOREncode.array(proofs)) + ]) + ]))) + return "cashuB" + base64URL(Data(CBOREncode.map(pairs))) + } + + // MARK: - V3 Decode + + @Test func v3DecodeValidToken() { + let token = makeV3Token( + entries: [("https://mint.example.com", [2, 8])], + unit: "sat", + memo: "thanks!" + ) + let info = CashuTokenDecoder.decode(token) + #expect(info != nil) + #expect(info?.version == "A") + #expect(info?.amount == 10) + #expect(info?.unit == "sat") + #expect(info?.mintHost == "mint.example.com") + #expect(info?.memo == "thanks!") + #expect(info?.displayAmount == "10 sat") + } + + @Test func v3AmountSumsAcrossEntriesAndProofs() { + let token = makeV3Token(entries: [ + ("https://a.mint.example", [1, 2, 4]), + ("https://b.mint.example", [8, 16]) + ]) + let info = CashuTokenDecoder.decode(token) + #expect(info?.amount == 31) + // First mint wins for the display host + #expect(info?.mintHost == "a.mint.example") + } + + @Test func v3MissingUnitDefaultsToSatForDisplay() { + let token = makeV3Token(entries: [("https://mint.example.com", [5])], unit: nil) + let info = CashuTokenDecoder.decode(token) + #expect(info?.unit == nil) + #expect(info?.displayAmount == "5 sat") + } + + @Test func v3RejectsNonsenseAmounts() { + // Negative and absurd amounts must not poison the sum + let json: [String: Any] = [ + "token": [[ + "mint": "https://mint.example.com", + "proofs": [ + ["amount": -5, "id": "x", "secret": "s", "C": "c"], + ["amount": 3, "id": "x", "secret": "s", "C": "c"] + ] + ] as [String: Any]] + ] + let token = "cashuA" + base64URL(try! JSONSerialization.data(withJSONObject: json)) + #expect(CashuTokenDecoder.decode(token)?.amount == 3) + } + + @Test func v3MemoIsSanitizedForDisplay() { + let token = makeV3Token( + entries: [("https://mint.example.com", [1])], + memo: "line1\nline2\u{0007}" + String(repeating: "x", count: 300) + ) + let memo = CashuTokenDecoder.decode(token)?.memo + #expect(memo != nil) + #expect(memo?.contains("\n") == false) + #expect(memo?.contains("\u{0007}") == false) + #expect((memo?.count ?? 0) <= 80) + } + + // MARK: - V4 (CBOR) Decode + + @Test func v4DecodeValidToken() { + let token = makeV4Token(memo: "Thank you", amounts: [1, 4, 16]) + let info = CashuTokenDecoder.decode(token) + #expect(info?.version == "B") + #expect(info?.amount == 21) + #expect(info?.unit == "sat") + #expect(info?.mintHost == "mint.example.com") + #expect(info?.memo == "Thank you") + } + + @Test func v4UnparseableCBORDegradesToGenericToken() { + // Valid base64 payload, but not CBOR we can walk: still a token, + // rendered as a generic chip with no amount. + let token = "cashuB" + base64URL(Data([0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02])) + let info = CashuTokenDecoder.decode(token) + #expect(info?.version == "B") + #expect(info?.amount == nil) + #expect(info?.mintHost == nil) + } + + // MARK: - URI Form and Normalization + + @Test func uriFormsDecode() { + let token = makeV3Token(entries: [("https://mint.example.com", [7])]) + for wrapped in ["cashu:\(token)", "cashu://\(token)", "CASHU:\(token)"] { + #expect(CashuTokenDecoder.bareToken(from: wrapped) == token, "failed for \(wrapped)") + #expect(CashuTokenDecoder.decode(wrapped)?.amount == 7) + } + } + + @Test func percentEncodedURIDecodes() { + let token = makeV3Token(entries: [("https://mint.example.com", [7])]) + let encoded = token.addingPercentEncoding(withAllowedCharacters: .alphanumerics)! + #expect(CashuTokenDecoder.decode("cashu:\(encoded)")?.amount == 7) + } + + @Test func bareTokenRejectsNonTokens() { + #expect(CashuTokenDecoder.bareToken(from: "hello world") == nil) + #expect(CashuTokenDecoder.bareToken(from: "cashuC" + String(repeating: "a", count: 50)) == nil) + #expect(CashuTokenDecoder.bareToken(from: "cashuA{not-base64!}") == nil) + #expect(CashuTokenDecoder.bareToken(from: "cashuA") == nil) // too short + } + + // MARK: - Adversarial Input (never crash, fail closed) + + @Test func truncatedTokensNeverCrash() { + let v3 = makeV3Token(entries: [("https://mint.example.com", [1, 2, 4, 8])], memo: "memo") + let v4 = makeV4Token(memo: "memo", amounts: [1, 2, 4, 8]) + for token in [v3, v4] { + for length in stride(from: 0, to: token.count, by: 3) { + _ = CashuTokenDecoder.decode(String(token.prefix(length))) + } + } + // Truncating the payload must not produce a phantom V3 summary + #expect(CashuTokenDecoder.decode(String(v3.prefix(v3.count - 10))) == nil) + } + + @Test func garbagePayloadsNeverCrash() { + var rng = SystemRandomNumberGenerator() + for _ in 0..<200 { + let length = Int.random(in: 0..<600, using: &rng) + let junk = Data((0.. CommandProcessor { + CommandProcessor( + contextProvider: context, + meshService: MockTransport(), + identityManager: MockIdentityManager(MockKeychain()) + ) + } + @MainActor private func withSelectedChannel( _ channel: ChannelID, @@ -477,6 +575,11 @@ private final class MockCommandContextProvider: CommandContextProvider { sentPublicRawMessages.append(content) } + private(set) var sentPublicMessages: [String] = [] + func sendPublicMessage(_ content: String) { + sentPublicMessages.append(content) + } + func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) { localPrivateSystemMessages.append((content, peerID)) } From 6056d20a131f5bc15eea7fefdc07931d7dc05ed8 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 20:00:55 +0200 Subject: [PATCH 004/158] Add mesh diagnostics: /ping, /trace, and topology map - New protocol types ping=0x26 / pong=0x27 (9-byte payload: 8-byte nonce + origin TTL) with per-peer inbound rate limiting (5 per 10s) - /ping @name reports RTT and hop count, 10s timeout - /trace @name prints the estimated path from gossiped directNeighbors - Topology map sheet (circular Canvas layout) reachable from App Info - Ping/pong ride the deterministic directed-relay path like DMs - Tests: payload round-trip, hop-count math, command output, edge normalization, layout Co-Authored-By: Claude Fable 5 --- bitchat/App/AppChromeModel.swift | 22 ++ bitchat/Localizable.xcstrings | 132 ++++++++++ bitchat/Models/CommandInfo.swift | 12 +- .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEReceivePipeline.swift | 7 +- bitchat/Services/BLE/BLEService.swift | 159 +++++++++++ bitchat/Services/CommandProcessor.swift | 77 ++++++ bitchat/Services/MeshTopologyTracker.swift | 7 + bitchat/Services/Transport.swift | 53 ++++ bitchat/Services/TransportConfig.swift | 5 + bitchat/Sync/SyncTypeFlags.swift | 3 + bitchat/ViewModels/ChatViewModel.swift | 6 +- bitchat/Views/AppInfoView.swift | 45 ++++ bitchat/Views/ContentView.swift | 2 +- bitchat/Views/MeshTopologyView.swift | 217 +++++++++++++++ bitchatTests/CommandProcessorTests.swift | 5 + bitchatTests/Mocks/MockTransport.swift | 21 ++ .../Services/MeshDiagnosticsTests.swift | 247 ++++++++++++++++++ .../BitFoundation/MeshPingPayload.swift | 57 ++++ .../Sources/BitFoundation/MessageType.swift | 8 +- .../MeshPingPayloadTests.swift | 70 +++++ 21 files changed, 1147 insertions(+), 10 deletions(-) create mode 100644 bitchat/Views/MeshTopologyView.swift create mode 100644 bitchatTests/Services/MeshDiagnosticsTests.swift create mode 100644 localPackages/BitFoundation/Sources/BitFoundation/MeshPingPayload.swift create mode 100644 localPackages/BitFoundation/Tests/BitFoundationTests/MeshPingPayloadTests.swift diff --git a/bitchat/App/AppChromeModel.swift b/bitchat/App/AppChromeModel.swift index 3f9cacd7..7c7a3a38 100644 --- a/bitchat/App/AppChromeModel.swift +++ b/bitchat/App/AppChromeModel.swift @@ -59,6 +59,28 @@ final class AppChromeModel: ObservableObject { isAppInfoPresented = true } + /// Builds the mesh topology map model from the transport's gossiped + /// graph plus the live nickname table. Unknown nodes (heard about via a + /// neighbor claim but never announced to us) fall back to a short ID. + func meshTopologyDisplayModel() -> MeshTopologyDisplayModel { + let mesh = chatViewModel.meshService + guard let snapshot = mesh.currentMeshTopology() else { return .empty } + let nicknames = mesh.getPeerNicknames() + + let nodes = snapshot.nodes.map { peerID -> MeshTopologyDisplayModel.Node in + let isSelf = peerID == snapshot.localPeerID + let label: String + if isSelf { + label = chatViewModel.nickname + } else { + label = nicknames[peerID] ?? "\(peerID.id.prefix(8))…" + } + return MeshTopologyDisplayModel.Node(id: peerID.id, label: label, isSelf: isSelf) + } + let edges = snapshot.edges.map { ($0.a.id, $0.b.id) } + return MeshTopologyDisplayModel(nodes: nodes, edges: edges) + } + func triggerScreenshotPrivacyWarning() { showScreenshotPrivacyWarning = true } diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 7301e613..6b87a876 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -5171,6 +5171,54 @@ } } }, + "app_info.network.title" : { + "comment" : "Section header for network diagnostics in the app info sheet", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "network" + } + } + } + }, + "app_info.network.topology.description" : { + "comment" : "Row description for the mesh topology map", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "map of peers and links learned from mesh announces" + } + } + } + }, + "app_info.network.topology.hint" : { + "comment" : "Accessibility hint for the mesh topology row", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "opens the mesh topology map" + } + } + } + }, + "app_info.network.topology.title" : { + "comment" : "Row title opening the mesh topology map", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh topology" + } + } + } + }, "app_info.privacy.ephemeral.description" : { "extractionState" : "manual", "localizations" : { @@ -15425,6 +15473,18 @@ } } }, + "content.commands.ping" : { + "comment" : "Description of the /ping command in the suggestions panel", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "measure round-trip time to a mesh peer" + } + } + } + }, "content.commands.slap" : { "extractionState" : "manual", "localizations" : { @@ -15604,6 +15664,18 @@ } } }, + "content.commands.trace" : { + "comment" : "Description of the /trace command in the suggestions panel", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimate the mesh path to a peer" + } + } + } + }, "content.commands.unblock" : { "extractionState" : "manual", "localizations" : { @@ -35194,6 +35266,66 @@ } } }, + "topology.caption" : { + "comment" : "Caption under the mesh topology map", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated from gossiped neighbor lists (up to 10 per peer) — your device is highlighted" + } + } + } + }, + "topology.empty" : { + "comment" : "Empty state of the mesh topology map", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "no mesh links yet — the map fills in as peer announces arrive" + } + } + } + }, + "topology.refresh" : { + "comment" : "Accessibility label of the topology refresh button", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "refresh topology" + } + } + } + }, + "topology.summary" : { + "comment" : "Topology map summary: number of peers and links", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$ld peers · %2$ld links" + } + } + } + }, + "topology.title" : { + "comment" : "Title of the mesh topology map sheet", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh topology" + } + } + } + }, "verification.my_qr.accessibility_label" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Models/CommandInfo.swift b/bitchat/Models/CommandInfo.swift index 1f8245be..a52bb7d5 100644 --- a/bitchat/Models/CommandInfo.swift +++ b/bitchat/Models/CommandInfo.swift @@ -24,6 +24,8 @@ enum CommandInfo: String, Identifiable { case who case favorite = "fav" case unfavorite = "unfav" + case ping + case trace var id: String { rawValue } @@ -31,7 +33,7 @@ enum CommandInfo: String, Identifiable { var placeholder: String? { switch self { - case .block, .hug, .message, .slap, .unblock, .favorite, .unfavorite: + case .block, .hug, .message, .slap, .unblock, .favorite, .unfavorite, .ping, .trace: return "<" + String(localized: "content.input.nickname_placeholder") + ">" case .clear, .help, .who: return nil @@ -50,16 +52,18 @@ enum CommandInfo: String, Identifiable { case .who: String(localized: "content.commands.who") case .favorite: String(localized: "content.commands.favorite") case .unfavorite: String(localized: "content.commands.unfavorite") + case .ping: String(localized: "content.commands.ping") + case .trace: String(localized: "content.commands.trace") } } static func all(isGeoPublic: Bool, isGeoDM: Bool) -> [CommandInfo] { let baseCommands: [CommandInfo] = [.block, .unblock, .clear, .help, .hug, .message, .slap, .who] - // The processor rejects favorites in geohash contexts, so only - // suggest them where they actually work: mesh. + // The processor rejects favorites and mesh diagnostics in geohash + // contexts, so only suggest them where they actually work: mesh. if isGeoPublic || isGeoDM { return baseCommands } - return baseCommands + [.favorite, .unfavorite] + return baseCommands + [.favorite, .unfavorite, .ping, .trace] } } diff --git a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift index 18b144d2..9028c9e5 100644 --- a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift +++ b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift @@ -12,7 +12,7 @@ enum BLEOutboundPacketPolicy { switch MessageType(rawValue: packetType) { case .noiseEncrypted, .noiseHandshake: return true - case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope: + case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .ping, .pong: return false } } diff --git a/bitchat/Services/BLE/BLEReceivePipeline.swift b/bitchat/Services/BLE/BLEReceivePipeline.swift index 71aacbaf..b8375793 100644 --- a/bitchat/Services/BLE/BLEReceivePipeline.swift +++ b/bitchat/Services/BLE/BLEReceivePipeline.swift @@ -51,8 +51,13 @@ struct BLEReceivePipeline { // Courier envelopes are directed opaque ciphertext like DMs; a // remote handover toward a relayed announce rides this same // deterministic relay treatment instead of the broadcast clamp. + // Ping/pong diagnostics also ride it: probes need the same + // deterministic multi-hop relay as DMs (always relay, jitter, + // no TTL cap) so RTT and hop counts reflect the real path. isDirectedEncrypted: (packet.type == MessageType.noiseEncrypted.rawValue - || packet.type == MessageType.courierEnvelope.rawValue) && packet.recipientID != nil, + || packet.type == MessageType.courierEnvelope.rawValue + || packet.type == MessageType.ping.rawValue + || packet.type == MessageType.pong.rawValue) && packet.recipientID != nil, isFragment: packet.type == MessageType.fragment.rawValue, isDirectedFragment: packet.type == MessageType.fragment.rawValue && packet.recipientID != nil, isHandshake: packet.type == MessageType.noiseHandshake.rawValue, diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 865a89be..c3e39764 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -67,6 +67,22 @@ final class BLEService: NSObject { #endif private var selfBroadcastTracker = BLESelfBroadcastTracker() private let meshTopology = MeshTopologyTracker() + + // Mesh diagnostics: outstanding /ping probes keyed by nonce, plus the + // inbound per-peer ping budget so a directed unencrypted probe cannot be + // turned into an amplification primitive. Both are owned by + // collectionsQueue barriers like the other mutable collections. + private struct PendingMeshPing { + let peerID: PeerID + let sentAt: Date + let completion: @MainActor (MeshPingResult?) -> Void + let timeout: DispatchWorkItem + } + private var pendingMeshPings: [Data: PendingMeshPing] = [:] + private var meshPingResponseLimiter = SyncResponseRateLimiter( + maxResponses: TransportConfig.meshPingInboundMaxPerPeer, + window: TransportConfig.meshPingInboundWindowSeconds + ) // 5. Fragment Reassembly (necessary for messages > MTU) private var fragmentAssemblyBuffer = BLEFragmentAssemblyBuffer() @@ -2406,6 +2422,143 @@ extension BLEService { PeerID(routingData: data) } + // MARK: - Mesh Diagnostics (/ping, /trace, topology map) + + /// Sends a directed unencrypted ping probe (8-byte nonce + origin TTL). + /// The completion fires exactly once on the main actor: with RTT/hops + /// when the matching pong returns, or nil after the timeout window. + func sendMeshPing(to peerID: PeerID, completion: @escaping @MainActor (MeshPingResult?) -> Void) { + messageQueue.async { [weak self] in + guard let self, + let recipientData = peerID.toShort().routingData, + let payload = MeshPingPayload( + nonce: Data((0.. PendingMeshPing? in + guard pendingMeshPings[pong.nonce]?.peerID == peerID else { return nil } + return pendingMeshPings.removeValue(forKey: pong.nonce) + } + guard let pending else { return } + pending.timeout.cancel() + let rttMs = Int((Date().timeIntervalSince(pending.sentAt) * 1000).rounded()) + let result = MeshPingResult( + rttMs: max(0, rttMs), + hops: MeshPingPayload.hopCount(originTTL: pong.originTTL, receivedTTL: packet.ttl) + ) + Task { @MainActor in pending.completion(result) } + } + + /// Estimated intermediate hops toward `peerID`, BFS over gossiped + /// bidirectionally-confirmed neighbor claims ([] = direct, nil = none). + func computeMeshPath(to peerID: PeerID) -> [PeerID]? { + refreshLocalTopology() + if let route = computeRoute(to: peerID) { + return route.compactMap { PeerID(routingData: $0) } + } + // Confirmed claims can lag a brand-new link (the peer's next announce + // hasn't arrived yet); a live direct connection is still a known path. + return isPeerConnected(peerID) ? [] : nil + } + + /// Mesh graph for the topology map. Edges are advisory: announces cap + /// neighbor lists at 10, so an edge claimed by either endpoint counts. + func currentMeshTopology() -> MeshTopologySnapshot? { + refreshLocalTopology() + let claims = meshTopology.adjacencySnapshot() + var nodes = Set() + var edges = Set() + for (source, neighbors) in claims { + guard let sourcePeer = PeerID(routingData: source) else { continue } + nodes.insert(sourcePeer) + for neighborData in neighbors { + guard let neighborPeer = PeerID(routingData: neighborData), + neighborPeer != sourcePeer else { continue } + nodes.insert(neighborPeer) + edges.insert(MeshTopologyEdge(sourcePeer, neighborPeer)) + } + } + nodes.insert(myPeerID) + return MeshTopologySnapshot( + localPeerID: myPeerID, + nodes: nodes.sorted(), + edges: edges.sorted { ($0.a, $0.b) < ($1.a, $1.b) } + ) + } + private func forwardAlongRouteIfNeeded(_ packet: BitchatPacket) -> Bool { let myRoutingData = routingData(for: myPeerID) ?? (myPeerIDData.isEmpty ? nil : myPeerIDData) let plan = BLERouteForwardingPolicy.plan( @@ -3203,6 +3356,12 @@ extension BLEService { case .courierEnvelope: handleCourierEnvelope(packet, from: peerID) + case .ping: + handleMeshPing(packet, from: senderID) + + case .pong: + handleMeshPong(packet, from: senderID) + case .leave: handleLeave(packet, from: senderID) diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index 9f2f8e9b..db9b07dd 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -49,6 +49,9 @@ protocol CommandContextProvider: AnyObject { // MARK: - System Messages func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) func addPublicSystemMessage(_ content: String) + /// Routes deferred command output (e.g. an async /ping result) into the + /// conversation where the user typed the command. + func addCommandOutput(_ content: String) // MARK: - Favorites /// Toggles the favorite via the unified peer flow, which persists by the @@ -106,6 +109,12 @@ final class CommandProcessor { case "/unfav": if inGeoPublic || inGeoDM { return .error(message: "favorites are only for mesh peers in #mesh") } return handleFavorite(args, add: false) + case "/ping": + if inGeoPublic || inGeoDM { return .error(message: "ping only works for mesh peers in #mesh") } + return handlePing(args) + case "/trace": + if inGeoPublic || inGeoDM { return .error(message: "trace only works for mesh peers in #mesh") } + return handleTrace(args) case "/help": return .success(message: Self.helpText) default: @@ -125,6 +134,8 @@ final class CommandProcessor { /slap @name — slap with a large trout /block @name · /unblock @name /fav @name · /unfav @name — favorites (mesh only) + /ping @name — measure round-trip time (mesh only) + /trace @name — estimated mesh path (mesh only) /help — this list """ @@ -331,6 +342,72 @@ final class CommandProcessor { return .error(message: "cannot unblock \(nickname): not found") } + // MARK: - Mesh Diagnostics + + private enum MeshPeerResolution { + case resolved(peerID: PeerID, nickname: String) + case failed(CommandResult) + } + + /// Resolves a mesh peer for /ping and /trace. Geohash identities are + /// rejected — diagnostics measure the BLE mesh, not Nostr. + private func resolveMeshPeer(_ args: String, command: String) -> MeshPeerResolution { + let targetName = args.trimmed + guard !targetName.isEmpty else { + return .failed(.error(message: "usage: /\(command) ")) + } + let nickname = targetName.hasPrefix("@") ? String(targetName.dropFirst()) : targetName + guard let peerID = contextProvider?.getPeerIDForNickname(nickname), + !peerID.isGeoDM, !peerID.isGeoChat else { + return .failed(.error(message: "cannot \(command) \(nickname): not found on mesh")) + } + return .resolved(peerID: peerID, nickname: nickname) + } + + private func handlePing(_ args: String) -> CommandResult { + let target: (peerID: PeerID, nickname: String) + switch resolveMeshPeer(args, command: "ping") { + case .resolved(let peerID, let nickname): target = (peerID, nickname) + case .failed(let result): return result + } + + let nickname = target.nickname + let currentProvider = contextProvider + meshService?.sendMeshPing(to: target.peerID) { [weak currentProvider] result in + let provider = currentProvider + guard let result else { + provider?.addCommandOutput("no reply from \(nickname)") + return + } + let hopText: String = result.hops.map { hops in + hops == 1 ? " · direct (1 hop)" : " · \(hops) hops" + } ?? "" + provider?.addCommandOutput("pong from \(nickname): \(result.rttMs) ms\(hopText)") + } + return .success(message: "pinging \(nickname)…") + } + + private func handleTrace(_ args: String) -> CommandResult { + let target: (peerID: PeerID, nickname: String) + switch resolveMeshPeer(args, command: "trace") { + case .resolved(let peerID, let nickname): target = (peerID, nickname) + case .failed(let result): return result + } + + guard let mesh = meshService, + let intermediates = mesh.computeMeshPath(to: target.peerID) else { + return .success(message: "no known path to \(target.nickname)") + } + // Graph-derived from gossiped neighbor claims, not route-recorded — + // present it as an estimate. + let hopNames = intermediates.map { hop in + mesh.peerNickname(peerID: hop) ?? "\(hop.id.prefix(8))…" + } + let chain = (["you"] + hopNames + [target.nickname]).joined(separator: " → ") + let hops = intermediates.count + 1 + return .success(message: "estimated path: \(chain) (\(hops) hop\(hops == 1 ? "" : "s"))") + } + private func handleFavorite(_ args: String, add: Bool) -> CommandResult { let targetName = args.trimmed guard !targetName.isEmpty else { diff --git a/bitchat/Services/MeshTopologyTracker.swift b/bitchat/Services/MeshTopologyTracker.swift index fdd8749f..55ef88a0 100644 --- a/bitchat/Services/MeshTopologyTracker.swift +++ b/bitchat/Services/MeshTopologyTracker.swift @@ -34,6 +34,13 @@ final class MeshTopologyTracker { } } + /// Raw directed neighbor claims, for diagnostics (topology map, /trace). + /// Callers treat the claims as advisory: announces cap `directNeighbors` + /// at 10, so an edge may be claimed by only one of its endpoints. + func adjacencySnapshot() -> [Data: Set] { + queue.sync { claims } + } + func removePeer(_ data: Data?) { guard let peer = sanitize(data) else { return } queue.sync(flags: .barrier) { diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 27c38700..7d0cbae5 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -31,6 +31,40 @@ struct TransportPeerSnapshot: Equatable, Hashable { } } +/// Outcome of a `/ping` probe over the mesh. +struct MeshPingResult: Equatable { + /// Round-trip time in milliseconds. + let rttMs: Int + /// Total hops to the peer (1 = directly connected), derived from the + /// pong's TTL decrements; nil when the reply carried inconsistent TTLs. + let hops: Int? +} + +/// Undirected mesh link between two peers, normalized so `(a, b)` and +/// `(b, a)` collapse to one edge. +struct MeshTopologyEdge: Hashable { + let a: PeerID + let b: PeerID + + init(_ first: PeerID, _ second: PeerID) { + if first < second { + a = first + b = second + } else { + a = second + b = first + } + } +} + +/// Point-in-time view of the mesh graph learned from gossiped announces +/// (each announce carries up to 10 `directNeighbors`). +struct MeshTopologySnapshot: Equatable { + let localPeerID: PeerID + let nodes: [PeerID] + let edges: [MeshTopologyEdge] +} + enum TransportEvent: @unchecked Sendable { case messageReceived(BitchatMessage) case publicMessageReceived(peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) @@ -124,6 +158,17 @@ protocol Transport: AnyObject { // transport cannot courier (no connected courier, or unsupported). func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool + // Mesh diagnostics (optional for transports). Defaults are inert so + // queue-backed transports (e.g. NostrTransport) stay untouched. + /// Sends a directed ping probe; the completion fires exactly once on the + /// main actor with the measured result, or nil on timeout/unsupported. + func sendMeshPing(to peerID: PeerID, completion: @escaping @MainActor (MeshPingResult?) -> Void) + /// Estimated intermediate hops toward `peerID` from gossiped topology + /// ([] = direct link, nil = no known path). + func computeMeshPath(to peerID: PeerID) -> [PeerID]? + /// Current mesh graph for the topology map; nil when unsupported. + func currentMeshTopology() -> MeshTopologySnapshot? + // QR verification (optional for transports) func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) @@ -154,6 +199,14 @@ extension Transport { func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { false } + + // Mesh diagnostics are mesh-transport-only; other transports report + // "no reply"/"no path" rather than pretending to measure anything. + func sendMeshPing(to peerID: PeerID, completion: @escaping @MainActor (MeshPingResult?) -> Void) { + Task { @MainActor in completion(nil) } + } + func computeMeshPath(to peerID: PeerID) -> [PeerID]? { nil } + func currentMeshTopology() -> MeshTopologySnapshot? { nil } func sendFileBroadcast(_ packet: BitchatFilePacket, transferId: String) {} func sendFilePrivate(_ packet: BitchatFilePacket, to peerID: PeerID, transferId: String) {} func cancelTransfer(_ transferId: String) {} diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 59d15c55..04cc0c21 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -16,6 +16,11 @@ enum TransportConfig { static let bleFragmentRelayTtlCap: UInt8 = 7 static let bleFragmentRelayTtlCapDense: UInt8 = 5 // Contain fragment floods in dense graphs + // Mesh diagnostics (/ping) + static let meshPingTimeoutSeconds: TimeInterval = 10 // Give up on a probe after this window + static let meshPingInboundMaxPerPeer: Int = 5 // Inbound ping budget per peer... + static let meshPingInboundWindowSeconds: TimeInterval = 10 // ...per sliding window (anti-amplification) + // UI / Storage Caps static let privateChatCap: Int = 1337 static let meshTimelineCap: Int = 1337 diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index 430485a0..fc5812ef 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -23,6 +23,9 @@ struct SyncTypeFlags: OptionSet { // Courier envelopes are directed deposits between trusted peers and // must never spread via gossip sync. case .courierEnvelope: return nil + // Ping/pong are ephemeral directed probes; replaying them via gossip + // sync would only produce stale, unanswerable echoes. + case .ping, .pong: return nil } } diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 578b6509..bea1e619 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1514,9 +1514,11 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele /// Command output belongs in the conversation where the user typed the /// command; the public timeline is invisible while a DM is open. The DM /// selection is read *after* processing so commands that switch chats - /// (`/msg`) print into the conversation they just opened. + /// (`/msg`) print into the conversation they just opened. Internal (not + /// private) because CommandProcessor routes deferred output (async /ping + /// results) through it via CommandContextProvider. @MainActor - private func addCommandOutput(_ content: String) { + func addCommandOutput(_ content: String) { if let peerID = selectedPrivateChatPeer { addLocalPrivateSystemMessage(content, to: peerID) } else { diff --git a/bitchat/Views/AppInfoView.swift b/bitchat/Views/AppInfoView.swift index 152c09df..008e8e4f 100644 --- a/bitchat/Views/AppInfoView.swift +++ b/bitchat/Views/AppInfoView.swift @@ -5,6 +5,11 @@ struct AppInfoView: View { @ThemedPalette private var palette @AppStorage(AppTheme.storageKey) private var appThemeRawValue = AppTheme.matrix.rawValue + /// Supplies the mesh topology map data. Nil (previews, missing wiring) + /// hides the topology row entirely. + var topologyProvider: (@MainActor () -> MeshTopologyDisplayModel)? + @State private var showTopology = false + private var selectedTheme: AppTheme { AppTheme(rawValue: appThemeRawValue) ?? .matrix } @@ -75,6 +80,15 @@ struct AppInfoView: View { ] } + enum Network { + static let title: LocalizedStringKey = "app_info.network.title" + static let topology = AppInfoFeatureInfo( + icon: "point.3.connected.trianglepath.dotted", + title: "app_info.network.topology.title", + description: "app_info.network.topology.description" + ) + } + enum Privacy { static let title: LocalizedStringKey = "app_info.privacy.title" static let noTracking = AppInfoFeatureInfo( @@ -129,6 +143,11 @@ struct AppInfoView: View { .themedSheetBackground() } .frame(width: 600, height: 700) + .sheet(isPresented: $showTopology) { + if let topologyProvider { + MeshTopologyView(provider: topologyProvider) + } + } #else NavigationView { ScrollView { @@ -143,6 +162,11 @@ struct AppInfoView: View { } } } + .sheet(isPresented: $showTopology) { + if let topologyProvider { + MeshTopologyView(provider: topologyProvider) + } + } #endif } @@ -238,6 +262,27 @@ struct AppInfoView: View { } } + // Network diagnostics + if topologyProvider != nil { + VStack(alignment: .leading, spacing: 16) { + SectionHeader(Strings.Network.title) + + Button { + showTopology = true + } label: { + HStack(spacing: 0) { + FeatureRow(info: Strings.Network.topology) + Image(systemName: "chevron.right") + .font(.bitchatSystem(size: 12)) + .foregroundColor(secondaryTextColor) + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityHint(Text("app_info.network.topology.hint")) + } + } + // Privacy VStack(alignment: .leading, spacing: 16) { SectionHeader(Strings.Privacy.title) diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index 86bb31ad..bd434ad1 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -149,7 +149,7 @@ struct ContentView: View { #endif } .sheet(isPresented: $appChromeModel.isAppInfoPresented) { - AppInfoView() + AppInfoView(topologyProvider: { appChromeModel.meshTopologyDisplayModel() }) } .sheet(isPresented: Binding( get: { appChromeModel.showingFingerprintFor != nil && !showSidebar && selectedPrivatePeerID == nil }, diff --git a/bitchat/Views/MeshTopologyView.swift b/bitchat/Views/MeshTopologyView.swift new file mode 100644 index 00000000..a8bc4e3e --- /dev/null +++ b/bitchat/Views/MeshTopologyView.swift @@ -0,0 +1,217 @@ +// +// MeshTopologyView.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import SwiftUI + +/// Display model for the mesh topology map: nodes are known mesh peers, +/// edges are gossiped `directNeighbors` claims. Built on the main actor from +/// a `MeshTopologySnapshot` plus the current nickname table. +struct MeshTopologyDisplayModel { + struct Node: Identifiable, Equatable { + let id: String + let label: String + let isSelf: Bool + } + + let nodes: [Node] + /// Pairs of `Node.id`; every id is present in `nodes`. + let edges: [(String, String)] + + static let empty = MeshTopologyDisplayModel(nodes: [], edges: []) +} + +/// Minimal diagnostics sheet: the mesh graph on a circular layout (self in +/// the center), drawn with Canvas so it stays cheap at any peer count. +struct MeshTopologyView: View { + @Environment(\.dismiss) private var dismiss + @Environment(\.appTheme) private var appTheme + @ThemedPalette private var palette + + /// Fetches a fresh model; called on appear and on manual refresh. + let provider: @MainActor () -> MeshTopologyDisplayModel + @State private var model: MeshTopologyDisplayModel = .empty + + var body: some View { + #if os(macOS) + VStack(spacing: 0) { + HStack { + Text("topology.title") + .bitchatFont(size: 16, weight: .bold) + .foregroundColor(palette.primary) + Spacer() + refreshButton + Button("app_info.done") { + dismiss() + } + .buttonStyle(.plain) + .foregroundColor(palette.primary) + } + .padding() + .themedSurface(opacity: 0.95) + + content + } + .frame(width: 500, height: 520) + .themedSheetBackground() + #else + NavigationView { + content + .themedSheetBackground() + .navigationTitle(Text("topology.title")) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + refreshButton + } + ToolbarItem(placement: .navigationBarTrailing) { + SheetCloseButton { dismiss() } + .foregroundColor(palette.primary) + } + } + } + #endif + } + + private var refreshButton: some View { + Button { + model = provider() + } label: { + Image(systemName: "arrow.clockwise") + .font(.bitchatSystem(size: 14)) + .foregroundColor(palette.primary) + } + .buttonStyle(.plain) + .accessibilityLabel(Text("topology.refresh")) + } + + @ViewBuilder + private var content: some View { + VStack(spacing: 12) { + if model.nodes.count <= 1 { + Spacer() + Text("topology.empty") + .bitchatFont(size: 14) + .foregroundColor(palette.secondary) + .multilineTextAlignment(.center) + .padding(.horizontal, 32) + Spacer() + } else { + graphCanvas + .padding(.horizontal, 8) + } + + VStack(spacing: 4) { + Text(summaryText) + .bitchatFont(size: 13, weight: .semibold) + .foregroundColor(palette.primary) + Text("topology.caption") + .bitchatFont(size: 11) + .foregroundColor(palette.secondary) + .multilineTextAlignment(.center) + } + .padding(.horizontal) + .padding(.bottom, 16) + } + .onAppear { model = provider() } + .accessibilityElement(children: .combine) + .accessibilityLabel(Text(summaryText)) + } + + private var summaryText: String { + String( + format: String( + localized: "topology.summary", + comment: "Topology map summary: number of peers and links" + ), + locale: .current, + model.nodes.count, + model.edges.count + ) + } + + private var graphCanvas: some View { + Canvas { context, size in + let positions = Self.layout(nodes: model.nodes, in: size) + let fontDesign = appTheme.bodyFontDesign + + // Edges first so nodes draw on top. + for (fromID, toID) in model.edges { + guard let from = positions[fromID], let to = positions[toID] else { continue } + var path = Path() + path.move(to: from) + path.addLine(to: to) + context.stroke(path, with: .color(palette.secondary.opacity(0.45)), lineWidth: 1) + } + + for node in model.nodes { + guard let center = positions[node.id] else { continue } + let radius: CGFloat = node.isSelf ? 7 : 5 + let dot = Path(ellipseIn: CGRect( + x: center.x - radius, + y: center.y - radius, + width: radius * 2, + height: radius * 2 + )) + context.fill(dot, with: .color(node.isSelf ? palette.accent : palette.primary)) + if node.isSelf { + let ring = Path(ellipseIn: CGRect( + x: center.x - radius - 3, + y: center.y - radius - 3, + width: (radius + 3) * 2, + height: (radius + 3) * 2 + )) + context.stroke(ring, with: .color(palette.accent.opacity(0.6)), lineWidth: 1) + } + context.draw( + Text(node.label) + .font(.system(size: 10, design: fontDesign)) + .foregroundColor(node.isSelf ? palette.accent : palette.secondary), + at: CGPoint(x: center.x, y: center.y + radius + 4), + anchor: .top + ) + } + } + .accessibilityHidden(true) // The combined summary label narrates the graph. + } + + /// Circular layout: self in the center, everyone else evenly spaced on a + /// ring. Deterministic (nodes arrive sorted), so refreshes don't shuffle. + static func layout(nodes: [MeshTopologyDisplayModel.Node], in size: CGSize) -> [String: CGPoint] { + let center = CGPoint(x: size.width / 2, y: size.height / 2) + // Leave room for the label row under each ring node. + let radius = max(20, min(size.width, size.height) / 2 - 36) + var positions: [String: CGPoint] = [:] + + let ringNodes = nodes.filter { !$0.isSelf } + for node in nodes where node.isSelf { + positions[node.id] = center + } + for (index, node) in ringNodes.enumerated() { + let angle = (2 * CGFloat.pi * CGFloat(index)) / CGFloat(max(1, ringNodes.count)) - CGFloat.pi / 2 + positions[node.id] = CGPoint( + x: center.x + radius * cos(angle), + y: center.y + radius * sin(angle) + ) + } + return positions + } +} + +#Preview("Topology") { + MeshTopologyView(provider: { + MeshTopologyDisplayModel( + nodes: [ + .init(id: "self", label: "me", isSelf: true), + .init(id: "a", label: "alice", isSelf: false), + .init(id: "b", label: "bob", isSelf: false), + .init(id: "c", label: "carol", isSelf: false) + ], + edges: [("self", "a"), ("a", "b"), ("self", "c")] + ) + }) +} diff --git a/bitchatTests/CommandProcessorTests.swift b/bitchatTests/CommandProcessorTests.swift index 99bed2b5..f5eab5f4 100644 --- a/bitchatTests/CommandProcessorTests.swift +++ b/bitchatTests/CommandProcessorTests.swift @@ -435,6 +435,7 @@ private final class MockCommandContextProvider: CommandContextProvider { private(set) var sentPublicRawMessages: [String] = [] private(set) var localPrivateSystemMessages: [(content: String, peerID: PeerID)] = [] private(set) var publicSystemMessages: [String] = [] + private(set) var commandOutputs: [String] = [] private(set) var toggledFavorites: [PeerID] = [] private(set) var favoriteNotifications: [(peerID: PeerID, isFavorite: Bool)] = [] @@ -485,6 +486,10 @@ private final class MockCommandContextProvider: CommandContextProvider { publicSystemMessages.append(content) } + func addCommandOutput(_ content: String) { + commandOutputs.append(content) + } + func toggleFavorite(peerID: PeerID) { toggledFavorites.append(peerID) } diff --git a/bitchatTests/Mocks/MockTransport.swift b/bitchatTests/Mocks/MockTransport.swift index e4cf08de..5f1243e8 100644 --- a/bitchatTests/Mocks/MockTransport.swift +++ b/bitchatTests/Mocks/MockTransport.swift @@ -196,6 +196,27 @@ final class MockTransport: Transport { return courierSendResult } + // MARK: - Mesh Diagnostics + + private(set) var sentMeshPings: [PeerID] = [] + var meshPingResult: MeshPingResult? + var meshPaths: [PeerID: [PeerID]] = [:] + var meshTopologySnapshot: MeshTopologySnapshot? + + func sendMeshPing(to peerID: PeerID, completion: @escaping @MainActor (MeshPingResult?) -> Void) { + sentMeshPings.append(peerID) + let result = meshPingResult + Task { @MainActor in completion(result) } + } + + func computeMeshPath(to peerID: PeerID) -> [PeerID]? { + meshPaths[peerID] + } + + func currentMeshTopology() -> MeshTopologySnapshot? { + meshTopologySnapshot + } + // MARK: - Test Helpers /// Clears all recorded method calls for fresh assertions diff --git a/bitchatTests/Services/MeshDiagnosticsTests.swift b/bitchatTests/Services/MeshDiagnosticsTests.swift new file mode 100644 index 00000000..142474f4 --- /dev/null +++ b/bitchatTests/Services/MeshDiagnosticsTests.swift @@ -0,0 +1,247 @@ +// +// MeshDiagnosticsTests.swift +// bitchatTests +// +// Tests for /ping and /trace command handling and the topology snapshot +// types backing the mesh topology map. +// This is free and unencumbered software released into the public domain. +// + +import Foundation +import Testing +import BitFoundation +@testable import bitchat + +@Suite(.serialized) +struct MeshDiagnosticsTests { + + // MARK: - Helpers + + @MainActor + private func makeProcessor( + context: DiagnosticsMockContext, + transport: MockTransport + ) -> CommandProcessor { + CommandProcessor( + contextProvider: context, + meshService: transport, + identityManager: MockIdentityManager(MockKeychain()) + ) + } + + /// Waits for the async ping completion (MainActor hop) to land. + @MainActor + private func waitForCommandOutput(_ context: DiagnosticsMockContext) async { + for _ in 0..<100 { + if !context.commandOutputs.isEmpty { return } + await Task.yield() + try? await Task.sleep(nanoseconds: 5_000_000) + } + } + + // MARK: - /ping + + @MainActor + @Test func pingWithoutArgumentShowsUsage() { + let context = DiagnosticsMockContext() + let processor = makeProcessor(context: context, transport: MockTransport()) + let result = processor.process("/ping") + switch result { + case .error(let message): + #expect(message == "usage: /ping ") + default: + Issue.record("Expected usage error") + } + } + + @MainActor + @Test func pingUnknownPeerFails() { + let context = DiagnosticsMockContext() + let processor = makeProcessor(context: context, transport: MockTransport()) + let result = processor.process("/ping @ghost") + switch result { + case .error(let message): + #expect(message == "cannot ping ghost: not found on mesh") + default: + Issue.record("Expected error result") + } + } + + @MainActor + @Test func pingGeoDMPeerIsRejected() { + let context = DiagnosticsMockContext() + context.nicknameToPeerID["alice"] = PeerID(nostr_: "aabbccddeeff00112233445566778899") + let processor = makeProcessor(context: context, transport: MockTransport()) + let result = processor.process("/ping @alice") + switch result { + case .error(let message): + #expect(message == "cannot ping alice: not found on mesh") + default: + Issue.record("Expected error for geo peer") + } + } + + @MainActor + @Test func pingSuccessReportsRttAndHops() async { + let context = DiagnosticsMockContext() + let peerID = PeerID(str: "abcd1234abcd1234") + context.nicknameToPeerID["alice"] = peerID + let transport = MockTransport() + transport.meshPingResult = MeshPingResult(rttMs: 42, hops: 2) + let processor = makeProcessor(context: context, transport: transport) + + let result = processor.process("/ping @alice") + switch result { + case .success(let message): + #expect(message == "pinging alice…") + default: + Issue.record("Expected immediate 'pinging' feedback") + } + #expect(transport.sentMeshPings == [peerID]) + + await waitForCommandOutput(context) + #expect(context.commandOutputs == ["pong from alice: 42 ms · 2 hops"]) + } + + @MainActor + @Test func pingDirectPeerReportsSingleHop() async { + let context = DiagnosticsMockContext() + context.nicknameToPeerID["alice"] = PeerID(str: "abcd1234abcd1234") + let transport = MockTransport() + transport.meshPingResult = MeshPingResult(rttMs: 8, hops: 1) + let processor = makeProcessor(context: context, transport: transport) + + _ = processor.process("/ping alice") + await waitForCommandOutput(context) + #expect(context.commandOutputs == ["pong from alice: 8 ms · direct (1 hop)"]) + } + + @MainActor + @Test func pingTimeoutReportsNoReply() async { + let context = DiagnosticsMockContext() + context.nicknameToPeerID["alice"] = PeerID(str: "abcd1234abcd1234") + let transport = MockTransport() + transport.meshPingResult = nil + let processor = makeProcessor(context: context, transport: transport) + + _ = processor.process("/ping @alice") + await waitForCommandOutput(context) + #expect(context.commandOutputs == ["no reply from alice"]) + } + + // MARK: - /trace + + @MainActor + @Test func traceDirectPeerShowsOneHop() { + let context = DiagnosticsMockContext() + let bob = PeerID(str: "b0b0b0b0b0b0b0b0") + context.nicknameToPeerID["bob"] = bob + let transport = MockTransport() + transport.meshPaths[bob] = [] + let processor = makeProcessor(context: context, transport: transport) + + let result = processor.process("/trace @bob") + switch result { + case .success(let message): + #expect(message == "estimated path: you → bob (1 hop)") + default: + Issue.record("Expected success result") + } + } + + @MainActor + @Test func traceMultiHopUsesNicknamesWithShortIDFallback() { + let context = DiagnosticsMockContext() + let bob = PeerID(str: "b0b0b0b0b0b0b0b0") + let alice = PeerID(str: "a11cea11cea11cea") + let unknown = PeerID(str: "dead00beef001234") + context.nicknameToPeerID["bob"] = bob + let transport = MockTransport() + transport.peerNicknames = [alice: "alice"] + transport.meshPaths[bob] = [alice, unknown] + let processor = makeProcessor(context: context, transport: transport) + + let result = processor.process("/trace bob") + switch result { + case .success(let message): + #expect(message == "estimated path: you → alice → dead00be… → bob (3 hops)") + default: + Issue.record("Expected success result") + } + } + + @MainActor + @Test func traceWithoutPathReportsNoKnownPath() { + let context = DiagnosticsMockContext() + context.nicknameToPeerID["bob"] = PeerID(str: "b0b0b0b0b0b0b0b0") + let processor = makeProcessor(context: context, transport: MockTransport()) + + let result = processor.process("/trace @bob") + switch result { + case .success(let message): + #expect(message == "no known path to bob") + default: + Issue.record("Expected success result") + } + } + + // MARK: - Topology snapshot types + + @Test func topologyEdgeNormalizesEndpointOrder() { + let a = PeerID(str: "aaaa000000000000") + let b = PeerID(str: "bbbb000000000000") + #expect(MeshTopologyEdge(a, b) == MeshTopologyEdge(b, a)) + #expect(Set([MeshTopologyEdge(a, b), MeshTopologyEdge(b, a)]).count == 1) + } + + @Test func topologyLayoutPlacesSelfInCenter() { + let nodes: [MeshTopologyDisplayModel.Node] = [ + .init(id: "self", label: "me", isSelf: true), + .init(id: "a", label: "alice", isSelf: false), + .init(id: "b", label: "bob", isSelf: false) + ] + let size = CGSize(width: 200, height: 200) + let positions = MeshTopologyView.layout(nodes: nodes, in: size) + + #expect(positions["self"] == CGPoint(x: 100, y: 100)) + #expect(positions.count == 3) + // Ring nodes sit on the same radius around the center. + let radiusA = hypot((positions["a"]?.x ?? 0) - 100, (positions["a"]?.y ?? 0) - 100) + let radiusB = hypot((positions["b"]?.x ?? 0) - 100, (positions["b"]?.y ?? 0) - 100) + #expect(abs(radiusA - radiusB) < 0.001) + #expect(radiusA > 0) + } +} + +/// Minimal CommandContextProvider for diagnostics tests; records deferred +/// command output so async /ping results can be asserted. +@MainActor +private final class DiagnosticsMockContext: CommandContextProvider { + var nickname: String = "tester" + var activeChannel: ChannelID = .mesh + var selectedPrivateChatPeer: PeerID? + var blockedUsers: Set = [] + let idBridge = NostrIdentityBridge(keychain: MockKeychain()) + + var nicknameToPeerID: [String: PeerID] = [:] + private(set) var commandOutputs: [String] = [] + + func getPeerIDForNickname(_ nickname: String) -> PeerID? { + nicknameToPeerID[nickname] + } + + func getVisibleGeoParticipants() -> [CommandGeoParticipant] { [] } + func nostrPubkeyForDisplayName(_ displayName: String) -> String? { nil } + func startPrivateChat(with peerID: PeerID) {} + func sendPrivateMessage(_ content: String, to peerID: PeerID) {} + func clearCurrentPublicTimeline() {} + func clearPrivateChat(_ peerID: PeerID) {} + func sendPublicRaw(_ content: String) {} + func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) {} + func addPublicSystemMessage(_ content: String) {} + func toggleFavorite(peerID: PeerID) {} + + func addCommandOutput(_ content: String) { + commandOutputs.append(content) + } +} diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MeshPingPayload.swift b/localPackages/BitFoundation/Sources/BitFoundation/MeshPingPayload.swift new file mode 100644 index 00000000..54265b8c --- /dev/null +++ b/localPackages/BitFoundation/Sources/BitFoundation/MeshPingPayload.swift @@ -0,0 +1,57 @@ +// +// MeshPingPayload.swift +// BitFoundation +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import struct Foundation.Data + +/// Wire payload shared by the `ping` (0x26) and `pong` (0x27) message types. +/// +/// Layout (9 bytes): +/// - 8 bytes: random nonce (a pong echoes the nonce of the ping it answers) +/// - 1 byte: origin TTL — the TTL the packet was launched with, so the +/// receiver can compute the hop count as `originTTL - receivedTTL`. +/// +/// Both directions are unencrypted and unsigned: the payload carries no +/// private data, and the unguessable nonce already binds a pong to a probe +/// the local device actually sent. +public struct MeshPingPayload: Equatable { + public static let nonceLength = 8 + private static let encodedLength = nonceLength + 1 + + public let nonce: Data + public let originTTL: UInt8 + + public init?(nonce: Data, originTTL: UInt8) { + guard nonce.count == Self.nonceLength else { return nil } + self.nonce = nonce + self.originTTL = originTTL + } + + public func encode() -> Data { + var data = Data(capacity: Self.encodedLength) + data.append(nonce) + data.append(originTTL) + return data + } + + /// Accepts payloads with trailing bytes so future revisions can extend + /// the format without breaking older clients. + public static func decode(_ data: Data) -> MeshPingPayload? { + guard data.count >= encodedLength else { return nil } + let nonce = Data(data.prefix(nonceLength)) + let originTTL = data[data.index(data.startIndex, offsetBy: nonceLength)] + return MeshPingPayload(nonce: nonce, originTTL: originTTL) + } + + /// Number of links a packet crossed, derived from TTL decrements plus the + /// final delivery link (a directly connected peer is 1 hop away). + /// Returns nil when the TTLs are inconsistent (received above origin). + public static func hopCount(originTTL: UInt8, receivedTTL: UInt8) -> Int? { + guard originTTL >= receivedTTL else { return nil } + return Int(originTTL - receivedTTL) + 1 + } +} diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index ceac0cd0..41ff6adb 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -24,7 +24,11 @@ public enum MessageType: UInt8 { // Fragmentation (simplified) case fragment = 0x20 // Single fragment type for large messages case fileTransfer = 0x22 // Binary file/audio/image payloads - + + // Mesh diagnostics (0x23-0x25 and 0x28 are reserved by other features) + case ping = 0x26 // Directed echo request (nonce + origin TTL) + case pong = 0x27 // Directed echo reply (echoed nonce + origin TTL) + public var description: String { switch self { case .announce: return "announce" @@ -36,6 +40,8 @@ public enum MessageType: UInt8 { case .noiseEncrypted: return "noiseEncrypted" case .fragment: return "fragment" case .fileTransfer: return "fileTransfer" + case .ping: return "ping" + case .pong: return "pong" } } } diff --git a/localPackages/BitFoundation/Tests/BitFoundationTests/MeshPingPayloadTests.swift b/localPackages/BitFoundation/Tests/BitFoundationTests/MeshPingPayloadTests.swift new file mode 100644 index 00000000..8032bd9c --- /dev/null +++ b/localPackages/BitFoundation/Tests/BitFoundationTests/MeshPingPayloadTests.swift @@ -0,0 +1,70 @@ +// +// MeshPingPayloadTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +@testable import BitFoundation + +struct MeshPingPayloadTests { + + @Test func encodeDecodeRoundTrip() throws { + let nonce = Data([0x01, 0x02, 0x03, 0x04, 0xAA, 0xBB, 0xCC, 0xFF]) + let payload = try #require(MeshPingPayload(nonce: nonce, originTTL: 7)) + + let encoded = payload.encode() + #expect(encoded.count == 9) + #expect(encoded.prefix(8) == nonce) + #expect(encoded.last == 7) + + let decoded = try #require(MeshPingPayload.decode(encoded)) + #expect(decoded == payload) + } + + @Test func decodeToleratesTrailingBytes() throws { + let nonce = Data(repeating: 0x42, count: 8) + let payload = try #require(MeshPingPayload(nonce: nonce, originTTL: 3)) + var extended = payload.encode() + extended.append(contentsOf: [0xDE, 0xAD]) + + let decoded = try #require(MeshPingPayload.decode(extended)) + #expect(decoded == payload) + } + + @Test func decodeRespectsSliceIndices() throws { + // Data slices keep their parent's indices; decoding must not assume + // startIndex == 0. + let nonce = Data(repeating: 0x11, count: 8) + let payload = try #require(MeshPingPayload(nonce: nonce, originTTL: 5)) + let framed = Data([0x00, 0x00]) + payload.encode() + let slice = framed.dropFirst(2) + + let decoded = try #require(MeshPingPayload.decode(slice)) + #expect(decoded == payload) + } + + @Test func rejectsTruncatedPayload() { + #expect(MeshPingPayload.decode(Data(repeating: 0x01, count: 8)) == nil) + #expect(MeshPingPayload.decode(Data()) == nil) + } + + @Test func rejectsWrongNonceLength() { + #expect(MeshPingPayload(nonce: Data(repeating: 0, count: 7), originTTL: 7) == nil) + #expect(MeshPingPayload(nonce: Data(repeating: 0, count: 9), originTTL: 7) == nil) + } + + @Test func hopCountMath() { + // Direct link: no TTL decrement, one hop. + #expect(MeshPingPayload.hopCount(originTTL: 7, receivedTTL: 7) == 1) + // One relay in between: two hops. + #expect(MeshPingPayload.hopCount(originTTL: 7, receivedTTL: 6) == 2) + // Full TTL consumed. + #expect(MeshPingPayload.hopCount(originTTL: 7, receivedTTL: 1) == 7) + // Inconsistent TTLs (received above origin) are rejected. + #expect(MeshPingPayload.hopCount(originTTL: 3, receivedTTL: 7) == nil) + } +} From 18dcc747d75c3274373c63f89ed11f6461241f66 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 20:02:12 +0200 Subject: [PATCH 005/158] Originate v2 source routes and wire fragmentIdFilter targeted resync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part A — source-route origination policy: - Gate route application (BLESourceRouteOriginationPolicy): only packets we author, directed at a single peer, with TTL headroom, whose recipient is not directly connected. Relays no longer attach routes to (and re-sign) packets they merely forward. - Version-gate paths: MeshTopologyTracker records the highest protocol version observed per peer; BFS routes require every intermediate hop and the recipient to be v2-observed, capped at 4 intermediate hops. - Degrade on failure: BLESourceRouteFailureCache marks a routed send that sees no inbound traffic from the recipient within 10s as failed and floods for 60s before retrying routes. Part B — REQUEST_SYNC fragmentIdFilter (TLV 0x06): - Requester: BLEFragmentAssemblyBuffer reports stalled broadcast reassemblies (no new fragment for 5s, retried at most every 10s); the maintenance pass sends a types=fragment REQUEST_SYNC naming the stalled 8-byte fragment stream IDs to each connected peer. - Responder: GossipSyncManager restricts the fragment diff to exactly the named streams, bypassing the since-cursor while the GCS filter still excludes pieces the requester holds; RSR/TTL-0/rate-limit semantics unchanged and REQUEST_SYNC stays link-local. - Bounds: at most 60 IDs per request (60*17-1 = 1019 bytes <= the 1024-byte decoder cap); oversized 0x06 values are ignored, not fatal. Docs: SOURCE_ROUTING.md gains the iOS origination policy (§8); REQUEST_SYNC_MANAGER.md documents 0x05/0x06 as implemented. Co-Authored-By: Claude Fable 5 --- bitchat/Models/RequestSyncPacket.swift | 38 +++++- .../BLE/BLEFragmentAssemblyBuffer.swift | 37 +++++- bitchat/Services/BLE/BLEService.swift | 63 +++++++-- .../BLE/BLESourceRouteFailureCache.swift | 95 ++++++++++++++ .../BLE/BLESourceRouteOriginationPolicy.swift | 40 ++++++ bitchat/Services/MeshTopologyTracker.swift | 44 +++++-- bitchat/Services/TransportConfig.swift | 19 +++ bitchat/Sync/GossipSyncManager.swift | 44 +++++-- bitchatTests/GossipSyncManagerTests.swift | 95 +++++++++++++- .../BLEFragmentAssemblyBufferTests.swift | 76 +++++++++++ .../BLESourceRouteFailureCacheTests.swift | 98 ++++++++++++++ ...BLESourceRouteOriginationPolicyTests.swift | 98 ++++++++++++++ .../Services/MeshTopologyTrackerTests.swift | 124 +++++++++++++++++- ...RequestSyncPacketFragmentFilterTests.swift | 76 +++++++++++ docs/REQUEST_SYNC_MANAGER.md | 8 +- docs/SOURCE_ROUTING.md | 43 +++++- .../Sources/BitFoundation/BitchatPacket.swift | 2 +- 17 files changed, 966 insertions(+), 34 deletions(-) create mode 100644 bitchat/Services/BLE/BLESourceRouteFailureCache.swift create mode 100644 bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift create mode 100644 bitchatTests/Services/BLESourceRouteFailureCacheTests.swift create mode 100644 bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift create mode 100644 bitchatTests/Sync/RequestSyncPacketFragmentFilterTests.swift diff --git a/bitchat/Models/RequestSyncPacket.swift b/bitchat/Models/RequestSyncPacket.swift index 0db8e7aa..0c6cb3cd 100644 --- a/bitchat/Models/RequestSyncPacket.swift +++ b/bitchat/Models/RequestSyncPacket.swift @@ -1,10 +1,21 @@ +import BitFoundation import Foundation // REQUEST_SYNC payload TLV (type, length16, value) // - 0x01: P (uint8) — Golomb-Rice parameter // - 0x02: M (uint32, big-endian) — hash range (N * 2^P) // - 0x03: data (opaque) — GR bitstream bytes (MSB-first) +// - 0x04: types (SyncTypeFlags) — packet types the filter covers +// - 0x05: sinceTimestamp (uint64, big-endian) — filter coverage cursor +// - 0x06: fragmentIdFilter (UTF-8) — comma-separated 16-hex-char (8-byte) +// fragment stream IDs; restricts the fragment diff to exactly those +// streams (targeted resync for stalled reassemblies) struct RequestSyncPacket { + /// Maximum fragment IDs one 0x06 filter may carry. Each ID encodes as + /// 16 hex chars plus a comma separator, so the largest encoded value is + /// 60 * 17 - 1 = 1019 bytes, which fits the 1024-byte decoder cap. + static let maxFragmentIdFilterCount = 60 + let p: Int let m: UInt32 let data: Data @@ -12,6 +23,29 @@ struct RequestSyncPacket { let sinceTimestamp: UInt64? let fragmentIdFilter: String? + /// Encodes 8-byte fragment stream IDs as the 0x06 filter string, + /// dropping malformed IDs and capping at `maxFragmentIdFilterCount`. + static func encodeFragmentIdFilter(_ fragmentIDs: [Data]) -> String? { + let tokens = fragmentIDs + .filter { $0.count == 8 } + .prefix(maxFragmentIdFilterCount) + .map { $0.hexEncodedString() } + guard !tokens.isEmpty else { return nil } + return tokens.joined(separator: ",") + } + + /// Decodes a 0x06 filter string back into 8-byte fragment stream IDs, + /// ignoring malformed tokens and capping at `maxFragmentIdFilterCount`. + static func decodeFragmentIdFilter(_ filter: String?) -> Set? { + guard let filter else { return nil } + var ids: Set = [] + for token in filter.split(separator: ",").prefix(maxFragmentIdFilterCount) { + guard token.count == 16, let id = Data(hexString: String(token)) else { continue } + ids.insert(id) + } + return ids.isEmpty ? nil : ids + } + init(p: Int, m: UInt32, data: Data, types: SyncTypeFlags? = nil, sinceTimestamp: UInt64? = nil, fragmentIdFilter: String? = nil) { self.p = p self.m = m @@ -88,7 +122,9 @@ struct RequestSyncPacket { sinceTimestamp = ts } case 0x06: - if let fid = String(data: v, encoding: .utf8) { + // Same acceptance cap as the GCS payload; an oversized filter + // is ignored rather than failing the whole request. + if v.count <= maxAcceptBytes, let fid = String(data: v, encoding: .utf8) { fragmentIdFilter = fid } default: diff --git a/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift b/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift index 4d41b2d3..ad6e007c 100644 --- a/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift +++ b/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift @@ -64,6 +64,9 @@ struct BLEFragmentAssemblyBuffer { let type: UInt8 let total: Int let timestamp: Date + let isBroadcast: Bool + var lastFragmentAt: Date + var lastResyncRequestAt: Date? } private var fragmentsByKey: [BLEFragmentKey: [Int: Data]] = [:] @@ -106,6 +109,7 @@ struct BLEFragmentAssemblyBuffer { } fragmentsByKey[header.key]?[header.index] = header.fragmentData + metadataByKey[header.key]?.lastFragmentAt = now guard let fragments = fragmentsByKey[header.key], fragments.count == header.total else { @@ -138,10 +142,41 @@ struct BLEFragmentAssemblyBuffer { } fragmentsByKey[header.key] = [:] - metadataByKey[header.key] = Metadata(type: header.originalType, total: header.total, timestamp: now) + metadataByKey[header.key] = Metadata( + type: header.originalType, + total: header.total, + timestamp: now, + isBroadcast: header.isBroadcastFragment, + lastFragmentAt: now + ) return true } + /// Fragment stream IDs (8-byte, big-endian) of incomplete broadcast + /// reassemblies that have not seen a new fragment for `stalledAfter` + /// seconds — candidates for a targeted REQUEST_SYNC. Each returned + /// stream is marked so it is not re-requested within `retryAfter`. + /// Directed reassemblies are excluded: peers only archive broadcast + /// fragments for gossip sync, so a targeted request cannot recover them. + mutating func stalledBroadcastFragmentIDs( + stalledAfter: TimeInterval, + retryAfter: TimeInterval, + now: Date = Date() + ) -> [Data] { + var stalled: [Data] = [] + for (key, metadata) in metadataByKey { + guard metadata.isBroadcast, + let fragments = fragmentsByKey[key], + fragments.count < metadata.total, + now.timeIntervalSince(metadata.lastFragmentAt) >= stalledAfter else { continue } + if let lastRequest = metadata.lastResyncRequestAt, + now.timeIntervalSince(lastRequest) < retryAfter { continue } + metadataByKey[key]?.lastResyncRequestAt = now + stalled.append(withUnsafeBytes(of: key.id.bigEndian) { Data($0) }) + } + return stalled + } + private static func assemblyLimit(for originalType: UInt8) -> Int { if originalType == MessageType.fileTransfer.rawValue { // Allow headroom for TLV metadata and binary framing overhead. diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 865a89be..54bbbfe3 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -67,7 +67,9 @@ final class BLEService: NSObject { #endif private var selfBroadcastTracker = BLESelfBroadcastTracker() private let meshTopology = MeshTopologyTracker() - + // Route health for originated source routes; guarded by collectionsQueue. + private var sourceRouteFailures = BLESourceRouteFailureCache() + // 5. Fragment Reassembly (necessary for messages > MTU) private var fragmentAssemblyBuffer = BLEFragmentAssemblyBuffer() private var outboundFragmentTransfers = BLEOutboundFragmentTransferScheduler() @@ -576,6 +578,7 @@ final class BLEService: NSObject { let entries = outboundFragmentTransfers.removeAll().map { ($0.id, $0.workItems) } peerRegistry.removeAll() fragmentAssemblyBuffer.removeAll() + sourceRouteFailures = BLESourceRouteFailureCache() // Also clear pending message queues to avoid stale state across sessions pendingNoiseSessionQueues.removeAll() pendingDirectedRelays.removeAll() @@ -2375,13 +2378,31 @@ extension BLEService { } private func computeRoute(to peerID: PeerID) -> [Data]? { - meshTopology.computeRoute(from: myPeerIDData, to: routingData(for: peerID)) + // Version-gated: every hop and the recipient must have been observed + // speaking v2, since a v1-only node drops v2 frames on decode. + meshTopology.computeRoute( + from: myPeerIDData, + to: routingData(for: peerID), + maxHops: TransportConfig.bleSourceRouteMaxIntermediateHops, + requiringVersion: 2 + ) } private func applyRouteIfAvailable(_ packet: BitchatPacket, to recipient: PeerID) -> BitchatPacket { - guard let route = computeRoute(to: recipient), route.count >= 1 else { - return packet - } + let now = Date() + let route = BLESourceRouteOriginationPolicy.route( + for: packet, + to: recipient, + localPeerIDData: myPeerIDData, + isRecipientConnected: { self.isPeerConnected($0) }, + shouldAttemptRoute: { peer in + self.collectionsQueue.sync(flags: .barrier) { + self.sourceRouteFailures.shouldAttemptRoute(to: peer, now: now) + } + }, + computeRoute: { self.computeRoute(to: $0) } + ) + guard let route else { return packet } // Create new packet with route applied and version upgraded to 2 let routedPacket = BitchatPacket( type: packet.type, @@ -2399,6 +2420,9 @@ extension BLEService { SecureLogger.error("❌ Failed to re-sign packet with route", category: .security) return packet // Return original packet if signing fails } + collectionsQueue.sync(flags: .barrier) { + sourceRouteFailures.noteRoutedSend(to: recipient, now: now) + } return signedPacket } @@ -3170,13 +3194,23 @@ extension BLEService { // Update peer info without verbose logging - update the peer we received from, not the original sender updatePeerLastSeen(peerID) - // Track recent traffic timestamps for adaptive behavior + // Track recent traffic timestamps for adaptive behavior; the same + // barrier hop confirms route health for the packet's originator. collectionsQueue.async(flags: .barrier) { [weak self] in guard let self = self else { return } self.recentTrafficTracker.recordPacket(at: Date()) + self.sourceRouteFailures.noteInboundActivity(from: senderID) + } + + // Per-peer protocol version: originated source routes only use hops + // observed speaking v2 (a v1-only node cannot decode v2 frames). + if packet.version >= 2 { + meshTopology.recordObservedVersion(packet.version, for: packet.senderID) + if peerID != senderID { + meshTopology.recordObservedVersion(packet.version, for: routingData(for: peerID)) + } } - // Process by type switch context.messageType { case .announce: @@ -3681,10 +3715,21 @@ extension BLEService { // Clean old processed messages efficiently messageDeduplicator.cleanup() - // Clean old fragments (> configured seconds old) - collectionsQueue.sync(flags: .barrier) { + // Clean old fragments (> configured seconds old), then ask peers for + // the specific fragment streams whose reassembly has stalled instead + // of waiting for the next periodic GCS fragment round. + let stalledFragmentIDs = collectionsQueue.sync(flags: .barrier) { () -> [Data] in let cutoff = now.addingTimeInterval(-TransportConfig.bleFragmentLifetimeSeconds) fragmentAssemblyBuffer.removeExpired(before: cutoff) + sourceRouteFailures.prune(now: now) + return fragmentAssemblyBuffer.stalledBroadcastFragmentIDs( + stalledAfter: TransportConfig.bleFragmentResyncStallSeconds, + retryAfter: TransportConfig.bleFragmentResyncRetrySeconds, + now: now + ) + } + if !stalledFragmentIDs.isEmpty { + gossipSyncManager?.requestMissingFragments(fragmentIDs: stalledFragmentIDs) } // Clean old connection timeout backoff entries (> window) diff --git a/bitchat/Services/BLE/BLESourceRouteFailureCache.swift b/bitchat/Services/BLE/BLESourceRouteFailureCache.swift new file mode 100644 index 00000000..fcf23d2c --- /dev/null +++ b/bitchat/Services/BLE/BLESourceRouteFailureCache.swift @@ -0,0 +1,95 @@ +import BitFoundation +import Foundation + +/// Tracks whether source-routed sends to a recipient appear to be working. +/// +/// A routed unicast rides exactly one path, so a broken hop silently loses the +/// packet where a flood would have healed around it. Rather than building a +/// retransmission machine (MessageRouter already retries at a higher layer), +/// this cache degrades: a routed send that sees no inbound traffic from the +/// recipient within the confirmation window marks the route as failed, and +/// subsequent sends fall back to flooding until the suppression TTL lapses. +struct BLESourceRouteFailureCache { + struct Config { + /// How long a routed send may go unconfirmed before it counts as a + /// route failure. + var confirmationWindowSeconds: TimeInterval = TransportConfig.bleSourceRouteConfirmationWindowSeconds + /// How long to flood instead of routing after a failure. + var suppressionSeconds: TimeInterval = TransportConfig.bleSourceRouteSuppressionSeconds + } + + private struct State { + var pendingSince: Date? + var suppressedUntil: Date? + } + + private let config: Config + private var states: [PeerID: State] = [:] + + init(config: Config = Config()) { + self.config = config + } + + /// Whether the next directed send to `recipient` may carry a source + /// route. Flips the recipient into suppression when the last routed send + /// went unconfirmed past the confirmation window. + mutating func shouldAttemptRoute(to recipient: PeerID, now: Date = Date()) -> Bool { + guard var state = states[recipient] else { return true } + + if let until = state.suppressedUntil { + guard now >= until else { return false } + state.suppressedUntil = nil + } + + if let pending = state.pendingSince, + now.timeIntervalSince(pending) > config.confirmationWindowSeconds { + // The routed send was never confirmed: treat the route as broken + // and flood until the suppression window lapses. + state.pendingSince = nil + state.suppressedUntil = now.addingTimeInterval(config.suppressionSeconds) + states[recipient] = state + return false + } + + states[recipient] = state + return true + } + + /// Records that a source-routed packet was sent to `recipient`. Keeps the + /// earliest unconfirmed send so back-to-back packets share one deadline. + mutating func noteRoutedSend(to recipient: PeerID, now: Date = Date()) { + var state = states[recipient] ?? State() + if state.pendingSince == nil { + state.pendingSince = now + } + states[recipient] = state + } + + /// Any inbound packet authored by `peer` confirms the pending routed send + /// (delivery acks and replies arrive this way). Deliberately does not + /// lift an active suppression: that traffic may have arrived via flood. + mutating func noteInboundActivity(from peer: PeerID) { + guard var state = states[peer] else { return } + state.pendingSince = nil + if state.suppressedUntil == nil { + states.removeValue(forKey: peer) + } else { + states[peer] = state + } + } + + /// Drops entries that can no longer influence a routing decision. An + /// expired-but-unconverted pending entry is kept for as long as the + /// suppression it would trigger could still be active. + mutating func prune(now: Date = Date()) { + let pendingRetention = config.confirmationWindowSeconds + config.suppressionSeconds + states = states.filter { _, state in + if let until = state.suppressedUntil, now < until { return true } + if let pending = state.pendingSince, + now.timeIntervalSince(pending) <= pendingRetention { + return true + } + return false + } + } +} diff --git a/bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift b/bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift new file mode 100644 index 00000000..5cc8bf9c --- /dev/null +++ b/bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift @@ -0,0 +1,40 @@ +import BitFoundation +import Foundation + +/// Decides whether an outbound directed packet should carry a v2 source +/// route. Pure gating logic so BLEService's hot send path stays a thin wire. +enum BLESourceRouteOriginationPolicy { + /// Returns the intermediate-hop route to attach, or nil to keep the + /// current flood/direct-write behavior unchanged. + /// + /// Routes are only originated when every gate passes: + /// - we authored the packet (relays must not rewrite and re-sign someone + /// else's packet; route-following for in-flight routed packets lives in + /// `BLERouteForwardingPolicy`), + /// - the packet is directed at a single peer (not broadcast), + /// - the packet has TTL headroom to traverse hops (link-local TTL-0 + /// packets like REQUEST_SYNC never route), + /// - the recipient is not directly connected (a direct write already + /// delivers in one hop), + /// - routing to the recipient is not suppressed by a recent unconfirmed + /// routed send, and + /// - the topology yields a complete path. + static func route( + for packet: BitchatPacket, + to recipient: PeerID, + localPeerIDData: Data, + isRecipientConnected: (PeerID) -> Bool, + shouldAttemptRoute: (PeerID) -> Bool, + computeRoute: (PeerID) -> [Data]? + ) -> [Data]? { + guard packet.senderID == localPeerIDData else { return nil } + guard let recipientData = packet.recipientID, + recipientData.count == 8, + !recipientData.allSatisfy({ $0 == 0xFF }) else { return nil } + guard packet.ttl > 1 else { return nil } + guard !isRecipientConnected(recipient) else { return nil } + guard shouldAttemptRoute(recipient) else { return nil } + guard let route = computeRoute(recipient), !route.isEmpty else { return nil } + return route + } +} diff --git a/bitchat/Services/MeshTopologyTracker.swift b/bitchat/Services/MeshTopologyTracker.swift index fdd8749f..eb4e0c3c 100644 --- a/bitchat/Services/MeshTopologyTracker.swift +++ b/bitchat/Services/MeshTopologyTracker.swift @@ -10,6 +10,10 @@ final class MeshTopologyTracker { private var claims: [RoutingID: Set] = [:] // Last time we received an update from a node private var lastSeen: [RoutingID: Date] = [:] + // Highest protocol version observed from each node's decoded packets. + // Nodes absent from this map are assumed v1-only and are never used as + // hops (or targets) for version-gated routes. + private var observedVersions: [RoutingID: (version: UInt8, seenAt: Date)] = [:] // Maximum age for topology claims to be considered fresh for routing // Routes computed using stale topology can fail when the network has changed @@ -19,18 +23,29 @@ final class MeshTopologyTracker { queue.sync(flags: .barrier) { self.claims.removeAll() self.lastSeen.removeAll() + self.observedVersions.removeAll() } } /// Update the topology with a node's self-reported neighbor list - func updateNeighbors(for sourceData: Data?, neighbors: [Data]) { + func updateNeighbors(for sourceData: Data?, neighbors: [Data], at now: Date = Date()) { guard let source = sanitize(sourceData) else { return } // Sanitize neighbors and exclude self-loops let validNeighbors = Set(neighbors.compactMap { sanitize($0) }).subtracting([source]) - + queue.sync(flags: .barrier) { self.claims[source] = validNeighbors - self.lastSeen[source] = Date() + self.lastSeen[source] = now + } + } + + /// Record the protocol version observed on a decoded packet from a node. + /// Only versions above the v1 baseline are stored; the highest wins. + func recordObservedVersion(_ version: UInt8, for peerData: Data?, at now: Date = Date()) { + guard version > 1, let peer = sanitize(peerData) else { return } + queue.sync(flags: .barrier) { + let current = self.observedVersions[peer]?.version ?? 1 + self.observedVersions[peer] = (version: max(version, current), seenAt: now) } } @@ -39,28 +54,37 @@ final class MeshTopologyTracker { queue.sync(flags: .barrier) { self.claims.removeValue(forKey: peer) self.lastSeen.removeValue(forKey: peer) + self.observedVersions.removeValue(forKey: peer) } } - + /// Prune nodes that haven't updated their topology in `age` seconds - func prune(olderThan age: TimeInterval) { - let deadline = Date().addingTimeInterval(-age) + func prune(olderThan age: TimeInterval, now: Date = Date()) { + let deadline = now.addingTimeInterval(-age) queue.sync(flags: .barrier) { let stale = self.lastSeen.filter { $0.value < deadline } for (peer, _) in stale { self.claims.removeValue(forKey: peer) self.lastSeen.removeValue(forKey: peer) } + self.observedVersions = self.observedVersions.filter { $0.value.seenAt >= deadline } } } - func computeRoute(from start: Data?, to goal: Data?, maxHops: Int = 10) -> [Data]? { + /// BFS over confirmed, fresh edges. When `requiringVersion` is set, every + /// node on the path except the source (i.e. all intermediate hops and the + /// target) must have been observed speaking at least that protocol + /// version — a v1-only hop cannot decode a v2 routed packet. + func computeRoute(from start: Data?, to goal: Data?, maxHops: Int = 10, requiringVersion: UInt8? = nil, now: Date = Date()) -> [Data]? { guard let source = sanitize(start), let target = sanitize(goal) else { return nil } if source == target { return [] } // Direct connection, no intermediate hops return queue.sync { - let now = Date() let freshnessDeadline = now.addingTimeInterval(-Self.routeFreshnessThreshold) + func meetsRequiredVersion(_ peer: RoutingID) -> Bool { + guard let requiringVersion else { return true } + return (observedVersions[peer]?.version ?? 1) >= requiringVersion + } // BFS var visited: Set = [source] @@ -86,6 +110,10 @@ final class MeshTopologyTracker { for neighbor in neighbors { if visited.contains(neighbor) { continue } + // Version gate: skip nodes not known to speak the + // required protocol version. + guard meetsRequiredVersion(neighbor) else { continue } + // CONFIRMED EDGE CHECK: // 'last' claims 'neighbor' (checked above) // Does 'neighbor' claim 'last'? diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 59d15c55..649a8be9 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -208,6 +208,25 @@ enum TransportConfig { static let bleSubscriptionRateLimitWindowSeconds: TimeInterval = 60.0 // Window for tracking subscription attempts static let bleSubscriptionRateLimitMaxAttempts: Int = 5 // Max attempts before extended cooldown + // Source routing (v2 directed packets) + // Longest path we will originate, in intermediate hops between us and the + // recipient. Keep small: every hop must be a fresh, confirmed, v2-capable + // node, and long stale paths fail more often than floods. + static let bleSourceRouteMaxIntermediateHops: Int = 4 + // A routed send with no inbound traffic from the recipient within this + // window counts as a route failure. + static let bleSourceRouteConfirmationWindowSeconds: TimeInterval = 10.0 + // After a route failure, directed sends to that recipient flood instead + // of routing until this lapses. + static let bleSourceRouteSuppressionSeconds: TimeInterval = 60.0 + + // Targeted fragment resync (REQUEST_SYNC fragmentIdFilter) + // A broadcast reassembly with no new fragment for this long is stalled + // and triggers a targeted REQUEST_SYNC naming its fragment stream. + static let bleFragmentResyncStallSeconds: TimeInterval = 5.0 + // Minimum spacing between targeted resync requests for the same stream. + static let bleFragmentResyncRetrySeconds: TimeInterval = 10.0 + // Store-and-forward for directed packets at relays. Spooled packets retry // on each maintenance flush until the window lapses; a longer window lets // brief link gaps (walking between rooms, reconnect churn) heal themselves. diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index c966a7ca..5f68b2b1 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -258,11 +258,29 @@ final class GossipSyncManager { delegate?.sendPacket(signed) } - private func sendRequestSync(to peerID: PeerID, types: SyncTypeFlags) { + /// Targeted fragment recovery: ask connected peers for the specific + /// fragment streams whose reassembly has stalled, instead of waiting on + /// the next periodic GCS fragment round to cover them. + func requestMissingFragments(fragmentIDs: [Data]) { + queue.async { [weak self] in + self?._requestMissingFragments(fragmentIDs) + } + } + + private func _requestMissingFragments(_ fragmentIDs: [Data]) { + guard let filter = RequestSyncPacket.encodeFragmentIdFilter(fragmentIDs) else { return } + guard let connectedPeers = delegate?.getConnectedPeers(), !connectedPeers.isEmpty else { return } + SecureLogger.debug("Requesting \(fragmentIDs.count) stalled fragment stream(s) from \(connectedPeers.count) peer(s)", category: .sync) + for peerID in connectedPeers { + sendRequestSync(to: peerID, types: .fragment, fragmentIdFilter: filter) + } + } + + private func sendRequestSync(to peerID: PeerID, types: SyncTypeFlags, fragmentIdFilter: String? = nil) { // Register the request for RSR validation requestSyncManager.registerRequest(to: peerID) - - let payload = buildGcsPayload(for: types) + + let payload = buildGcsPayload(for: types, fragmentIdFilter: fragmentIdFilter) var recipient = Data() var temp = peerID.id while temp.count >= 2 && recipient.count < 8 { @@ -340,9 +358,19 @@ final class GossipSyncManager { } if requestedTypes.contains(.fragment) { + // A fragment-ID filter narrows the diff to exactly the named + // fragment streams (targeted resync for stalled reassemblies) + // and bypasses the since-cursor for them; the GCS filter still + // excludes the pieces the requester already holds. Fragment + // payloads start with the 8-byte stream ID. + let fragmentIdFilter = RequestSyncPacket.decodeFragmentIdFilter(request.fragmentIdFilter) let frags = fragments.allPackets(isFresh: isPacketFresh) for pkt in frags { - if let since, pkt.timestamp < since { continue } + if let fragmentIdFilter { + guard fragmentIdFilter.contains(Data(pkt.payload.prefix(8))) else { continue } + } else if let since, pkt.timestamp < since { + continue + } let idBytes = PacketIdUtil.computeId(pkt) if !mightContain(idBytes) { var toSend = pkt @@ -369,7 +397,7 @@ final class GossipSyncManager { } // Build REQUEST_SYNC payload using current candidates and GCS params - private func buildGcsPayload(for types: SyncTypeFlags) -> Data { + private func buildGcsPayload(for types: SyncTypeFlags, fragmentIdFilter: String? = nil) -> Data { var candidates: [BitchatPacket] = [] if types.contains(.announce) { for (_, pair) in latestAnnouncementByPeer where isPacketFresh(pair.packet) { @@ -387,7 +415,7 @@ final class GossipSyncManager { } if candidates.isEmpty { let p = GCSFilter.deriveP(targetFpr: config.gcsTargetFpr) - let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types) + let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types, fragmentIdFilter: fragmentIdFilter) return req.encode() } @@ -406,7 +434,7 @@ final class GossipSyncManager { } let takeN = min(candidates.count, min(nMax, cap)) if takeN <= 0 { - let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types) + let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types, fragmentIdFilter: fragmentIdFilter) return req.encode() } let included = Array(candidates.prefix(takeN)) @@ -424,7 +452,7 @@ final class GossipSyncManager { let sinceTimestamp: UInt64? = (covered < candidates.count && covered > 0) ? included[covered - 1].timestamp : nil - let req = RequestSyncPacket(p: params.p, m: params.m, data: params.data, types: types, sinceTimestamp: sinceTimestamp) + let req = RequestSyncPacket(p: params.p, m: params.m, data: params.data, types: types, sinceTimestamp: sinceTimestamp, fragmentIdFilter: fragmentIdFilter) return req.encode() } diff --git a/bitchatTests/GossipSyncManagerTests.swift b/bitchatTests/GossipSyncManagerTests.swift index c44de8f6..cbd49959 100644 --- a/bitchatTests/GossipSyncManagerTests.swift +++ b/bitchatTests/GossipSyncManagerTests.swift @@ -469,6 +469,98 @@ struct GossipSyncManagerTests { #expect(sentPackets[0].type == MessageType.fragment.rawValue) } + // MARK: - Fragment-ID filter (targeted resync) + + private func makeFragmentPacket(sender: Data, fragmentID: Data, index: UInt16, timestamp: UInt64) -> BitchatPacket { + // Fragment payload: 8-byte stream ID + index + total + original type. + var payload = fragmentID + payload.append(contentsOf: withUnsafeBytes(of: index.bigEndian) { Data($0) }) + payload.append(contentsOf: withUnsafeBytes(of: UInt16(4).bigEndian) { Data($0) }) + payload.append(MessageType.fileTransfer.rawValue) + payload.append(Data([0xEE])) + return BitchatPacket( + type: MessageType.fragment.rawValue, + senderID: sender, + recipientID: nil, + timestamp: timestamp, + payload: payload, + signature: nil, + ttl: 1 + ) + } + + @Test func handleRequestSyncHonorsFragmentIdFilter() async throws { + var config = GossipSyncManager.Config() + config.fragmentCapacity = 10 + config.messageSyncIntervalSeconds = 0 + config.fragmentSyncIntervalSeconds = 0 + config.fileTransferSyncIntervalSeconds = 0 + + let requestSyncManager = RequestSyncManager() + let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) + let delegate = RecordingDelegate() + manager.delegate = delegate + + let sender = try #require(Data(hexString: "aabbccddeeff0011")) + let wantedID = try #require(Data(hexString: "0102030405060708")) + let otherID = try #require(Data(hexString: "1112131415161718")) + let nowMs = UInt64(Date().timeIntervalSince1970 * 1000) + + let wanted = makeFragmentPacket(sender: sender, fragmentID: wantedID, index: 1, timestamp: nowMs - 60_000) + let other = makeFragmentPacket(sender: sender, fragmentID: otherID, index: 2, timestamp: nowMs) + manager.onPublicPacketSeen(wanted) + manager.onPublicPacketSeen(other) + + // The since-cursor sits after both fragments; without the filter the + // responder would send nothing for `wanted`. The filter both bypasses + // the cursor and restricts the diff to exactly the named stream. + let request = RequestSyncPacket( + p: 7, + m: 1, + data: Data(), + types: .fragment, + sinceTimestamp: nowMs + 1, + fragmentIdFilter: RequestSyncPacket.encodeFragmentIdFilter([wantedID]) + ) + manager.handleRequestSync(from: PeerID(str: "FFFFFFFFFFFFFFFF"), request: request) + + try await TestHelpers.waitFor({ delegate.packets.count == 1 }, timeout: TestConstants.shortTimeout) + // Barrier: flush the sync queue so a late second packet would be visible. + manager._performMaintenanceSynchronously(now: Date()) + let sentPackets = delegate.packets + #expect(sentPackets.count == 1) + let sent = try #require(sentPackets.first) + #expect(sent.type == MessageType.fragment.rawValue) + #expect(sent.payload.prefix(8) == wantedID) + #expect(sent.ttl == 0) + #expect(sent.isRSR) + } + + @Test func requestMissingFragmentsSendsFilteredRequestToConnectedPeers() async throws { + var config = GossipSyncManager.Config() + config.messageSyncIntervalSeconds = 0 + config.fragmentSyncIntervalSeconds = 0 + config.fileTransferSyncIntervalSeconds = 0 + + let requestSyncManager = RequestSyncManager() + let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) + let delegate = RecordingDelegate() + delegate.connectedPeers = [PeerID(str: "FFFFFFFFFFFFFFFF")] + manager.delegate = delegate + + let stalledID = try #require(Data(hexString: "0102030405060708")) + manager.requestMissingFragments(fragmentIDs: [stalledID]) + + try await TestHelpers.waitFor({ delegate.packets.count == 1 }, timeout: TestConstants.shortTimeout) + let sent = try #require(delegate.packets.first) + #expect(sent.type == MessageType.requestSync.rawValue) + #expect(sent.ttl == 0) + let request = try #require(RequestSyncPacket.decode(from: sent.payload)) + #expect(request.types == .fragment) + let ids = try #require(RequestSyncPacket.decodeFragmentIdFilter(request.fragmentIdFilter)) + #expect(ids == Set([stalledID])) + } + // MARK: - Archive persistence @Test func publicMessagesRestoreFromArchiveAcrossRestart() async throws { @@ -545,6 +637,7 @@ struct GossipSyncManagerTests { private final class RecordingDelegate: GossipSyncManager.Delegate { var onSend: (() -> Void)? + var connectedPeers: [PeerID] = [] private(set) var lastPacket: BitchatPacket? private(set) var packets: [BitchatPacket] = [] private let lock = NSLock() @@ -566,6 +659,6 @@ private final class RecordingDelegate: GossipSyncManager.Delegate { } func getConnectedPeers() -> [PeerID] { - return [] + return connectedPeers } } diff --git a/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift b/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift index ed7c66a1..ace2cfbe 100644 --- a/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift +++ b/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift @@ -135,6 +135,82 @@ struct BLEFragmentAssemblyBufferTests { } } + @Test + func stalledBroadcastAssemblyReportsFragmentIDOnceUntilRetryLapses() throws { + var buffer = BLEFragmentAssemblyBuffer() + let fragmentID = Data((1...8).map { UInt8($0) }) + let packet = makePacket(payload: makePayload(count: 256)) + let fragments = try makeFragments(for: packet, chunkSize: 128, fragmentID: fragmentID) + let first = try #require(BLEFragmentHeader(packet: fragments[0])) + + let t0 = Date(timeIntervalSince1970: 100) + _ = buffer.append(first, maxInFlightAssemblies: 8, now: t0) + + // Not yet stalled. + let early = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(4)) + #expect(early.isEmpty) + + // Stalled: reported once, big-endian stream ID. + let stalled = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(6)) + #expect(stalled == [fragmentID]) + + // Within the retry window: not re-reported. + let repeated = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(8)) + #expect(repeated.isEmpty) + + // After the retry window it is requested again. + let retried = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(17)) + #expect(retried == [fragmentID]) + } + + @Test + func newFragmentResetsStallClockAndCompletionStopsRequests() throws { + var buffer = BLEFragmentAssemblyBuffer() + let fragmentID = Data((10...17).map { UInt8($0) }) + let packet = makePacket(payload: makePayload(count: 384)) + let fragments = try makeFragments(for: packet, chunkSize: 128, fragmentID: fragmentID) + let headers = try fragments.map { try #require(BLEFragmentHeader(packet: $0)) } + #expect(headers.count >= 3) + + let t0 = Date(timeIntervalSince1970: 100) + _ = buffer.append(headers[0], maxInFlightAssemblies: 8, now: t0) + // A fragment arriving at t0+4 resets the stall clock. + _ = buffer.append(headers[1], maxInFlightAssemblies: 8, now: t0.addingTimeInterval(4)) + let afterProgress = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(6)) + #expect(afterProgress.isEmpty) + + // Completion removes the assembly entirely. + var result: BLEFragmentAssemblyBuffer.AppendResult? + for header in headers.dropFirst(2) { + result = buffer.append(header, maxInFlightAssemblies: 8, now: t0.addingTimeInterval(5)) + } + guard case .complete = result else { + Issue.record("Expected assembly to complete") + return + } + let afterCompletion = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(60)) + #expect(afterCompletion.isEmpty) + } + + @Test + func directedAssembliesAreNeverReportedAsStalled() throws { + var buffer = BLEFragmentAssemblyBuffer() + let fragment = makeFragmentPacket( + fragmentID: Data(repeating: 0x0A, count: 8), + index: 0, + total: 2, + originalType: MessageType.message.rawValue, + fragmentData: Data([0x01]), + recipientID: Data(hexString: "0102030405060708") + ) + let header = try #require(BLEFragmentHeader(packet: fragment)) + + let t0 = Date(timeIntervalSince1970: 100) + _ = buffer.append(header, maxInFlightAssemblies: 8, now: t0) + let stalled = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(60)) + #expect(stalled.isEmpty) + } + private func makePacket(payload: Data, timestamp: UInt64 = 0x0102030405) -> BitchatPacket { BitchatPacket( type: MessageType.message.rawValue, diff --git a/bitchatTests/Services/BLESourceRouteFailureCacheTests.swift b/bitchatTests/Services/BLESourceRouteFailureCacheTests.swift new file mode 100644 index 00000000..5d3315f6 --- /dev/null +++ b/bitchatTests/Services/BLESourceRouteFailureCacheTests.swift @@ -0,0 +1,98 @@ +// +// BLESourceRouteFailureCacheTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import BitFoundation +@testable import bitchat + +struct BLESourceRouteFailureCacheTests { + private let recipient = PeerID(str: "0102030405060708") + private let config = BLESourceRouteFailureCache.Config( + confirmationWindowSeconds: 10, + suppressionSeconds: 60 + ) + + private func attempts(_ cache: inout BLESourceRouteFailureCache, at date: Date) -> Bool { + cache.shouldAttemptRoute(to: recipient, now: date) + } + + @Test func allowsRoutingByDefault() { + var cache = BLESourceRouteFailureCache(config: config) + #expect(attempts(&cache, at: Date())) + } + + @Test func unconfirmedRoutedSendSuppressesRouting() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + // Inside the confirmation window: keep routing. + #expect(attempts(&cache, at: t0.addingTimeInterval(5))) + // Past the window with no inbound traffic: route failed, flood. + #expect(!attempts(&cache, at: t0.addingTimeInterval(11))) + // Still suppressed for the suppression TTL. + #expect(!attempts(&cache, at: t0.addingTimeInterval(40))) + // Suppression lapses: routing may be attempted again. + #expect(attempts(&cache, at: t0.addingTimeInterval(11 + 61))) + } + + @Test func inboundActivityConfirmsPendingSend() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + cache.noteInboundActivity(from: recipient) + // Confirmed: no suppression even long after the window. + #expect(attempts(&cache, at: t0.addingTimeInterval(30))) + } + + @Test func inboundActivityDoesNotLiftActiveSuppression() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + // Trip the failure → suppression starts at t0+15. + #expect(!attempts(&cache, at: t0.addingTimeInterval(15))) + // Inbound traffic may have arrived via flood; suppression holds. + cache.noteInboundActivity(from: recipient) + #expect(!attempts(&cache, at: t0.addingTimeInterval(20))) + #expect(attempts(&cache, at: t0.addingTimeInterval(15 + 61))) + } + + @Test func backToBackSendsShareOneDeadline() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + cache.noteRoutedSend(to: recipient, now: t0.addingTimeInterval(8)) + // Deadline runs from the first unconfirmed send. + #expect(!attempts(&cache, at: t0.addingTimeInterval(11))) + } + + @Test func pruneDropsExpiredEntries() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + // Past confirmation + suppression: the entry can no longer matter. + cache.prune(now: t0.addingTimeInterval(75)) + #expect(attempts(&cache, at: t0.addingTimeInterval(76))) + } + + @Test func pruneKeepsEntriesThatStillMatter() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + cache.prune(now: t0.addingTimeInterval(30)) + // The unconverted pending entry survives pruning and still converts + // into a suppression on the next routing decision. + #expect(!attempts(&cache, at: t0.addingTimeInterval(31))) + } +} diff --git a/bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift b/bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift new file mode 100644 index 00000000..c762a0c7 --- /dev/null +++ b/bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift @@ -0,0 +1,98 @@ +// +// BLESourceRouteOriginationPolicyTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import BitFoundation +@testable import bitchat + +struct BLESourceRouteOriginationPolicyTests { + private let localPeerIDData = Data(hexString: "0102030405060708")! + private let recipient = PeerID(str: "1112131415161718") + private let hop = Data(hexString: "2122232425262728")! + + private func makePacket( + senderID: Data? = nil, + recipientID: Data? = Data(hexString: "1112131415161718"), + ttl: UInt8 = 7 + ) -> BitchatPacket { + BitchatPacket( + type: MessageType.noiseEncrypted.rawValue, + senderID: senderID ?? localPeerIDData, + recipientID: recipientID, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: Data([0x01]), + signature: nil, + ttl: ttl + ) + } + + private func route( + packet: BitchatPacket, + isRecipientConnected: Bool = false, + shouldAttemptRoute: Bool = true, + computedRoute: [Data]? = nil + ) -> [Data]? { + BLESourceRouteOriginationPolicy.route( + for: packet, + to: recipient, + localPeerIDData: localPeerIDData, + isRecipientConnected: { _ in isRecipientConnected }, + shouldAttemptRoute: { _ in shouldAttemptRoute }, + computeRoute: { _ in computedRoute ?? [self.hop] } + ) + } + + @Test func routesWhenAllGatesPass() { + #expect(route(packet: makePacket()) == [hop]) + } + + @Test func relayedPacketNeverGetsRoute() { + let relayed = makePacket(senderID: Data(hexString: "aabbccddeeff0011")) + #expect(route(packet: relayed) == nil) + } + + @Test func broadcastRecipientNeverGetsRoute() { + let broadcast = makePacket(recipientID: Data(repeating: 0xFF, count: 8)) + #expect(route(packet: broadcast) == nil) + let noRecipient = makePacket(recipientID: nil) + #expect(route(packet: noRecipient) == nil) + } + + @Test func linkLocalTTLNeverGetsRoute() { + // TTL 0/1 packets (e.g. REQUEST_SYNC) cannot traverse hops. + #expect(route(packet: makePacket(ttl: 0)) == nil) + #expect(route(packet: makePacket(ttl: 1)) == nil) + } + + @Test func directlyConnectedRecipientNeverGetsRoute() { + #expect(route(packet: makePacket(), isRecipientConnected: true) == nil) + } + + @Test func suppressedRecipientFallsBackToFlood() { + #expect(route(packet: makePacket(), shouldAttemptRoute: false) == nil) + } + + @Test func missingOrEmptyRouteFallsBackToFlood() { + var sawComputeRoute = false + let result = BLESourceRouteOriginationPolicy.route( + for: makePacket(), + to: recipient, + localPeerIDData: localPeerIDData, + isRecipientConnected: { _ in false }, + shouldAttemptRoute: { _ in true }, + computeRoute: { _ in + sawComputeRoute = true + return nil + } + ) + #expect(result == nil) + #expect(sawComputeRoute) + #expect(route(packet: makePacket(), computedRoute: []) == nil) + } +} diff --git a/bitchatTests/Services/MeshTopologyTrackerTests.swift b/bitchatTests/Services/MeshTopologyTrackerTests.swift index 1ae0f5f5..fa5d2a4d 100644 --- a/bitchatTests/Services/MeshTopologyTrackerTests.swift +++ b/bitchatTests/Services/MeshTopologyTrackerTests.swift @@ -94,10 +94,132 @@ struct MeshTopologyTrackerTests { tracker.updateNeighbors(for: a, neighbors: [b]) tracker.updateNeighbors(for: b, neighbors: [a]) - + // When start == end, route should be empty (no intermediate hops needed) let route = try #require(tracker.computeRoute(from: a, to: a)) #expect(route == []) } + @Test func noPathReturnsNil() throws { + let tracker = MeshTopologyTracker() + let a = try hex("0101010101010101") + let b = try hex("0202020202020202") + let c = try hex("0303030303030303") + let d = try hex("0404040404040404") + + // Two disconnected islands: A-B and C-D + tracker.updateNeighbors(for: a, neighbors: [b]) + tracker.updateNeighbors(for: b, neighbors: [a]) + tracker.updateNeighbors(for: c, neighbors: [d]) + tracker.updateNeighbors(for: d, neighbors: [c]) + + #expect(tracker.computeRoute(from: a, to: d) == nil) + } + + /// Build a confirmed line topology n0 - n1 - ... - n(count-1). + private func makeLine(_ tracker: MeshTopologyTracker, count: Int) throws -> [Data] { + let nodes = try (0.. 0 { neighbors.append(nodes[i - 1]) } + if i < count - 1 { neighbors.append(nodes[i + 1]) } + tracker.updateNeighbors(for: nodes[i], neighbors: neighbors) + } + return nodes + } + + @Test func maxHopsCapsIntermediateHopCount() throws { + let tracker = MeshTopologyTracker() + // 7 nodes: source + 5 intermediates + target + let nodes = try makeLine(tracker, count: 7) + + // 5 intermediates exceed a 4-hop cap + #expect(tracker.computeRoute(from: nodes[0], to: nodes[6], maxHops: 4) == nil) + // 4 intermediates fit exactly + let route = try #require(tracker.computeRoute(from: nodes[0], to: nodes[5], maxHops: 4)) + #expect(route == Array(nodes[1...4])) + } + + @Test func staleNeighborBlocksRoute() throws { + let tracker = MeshTopologyTracker() + let a = try hex("0101010101010101") + let b = try hex("0202020202020202") + let c = try hex("0303030303030303") + + let staleDate = Date().addingTimeInterval(-120) // past 60s freshness + tracker.updateNeighbors(for: a, neighbors: [b]) + tracker.updateNeighbors(for: b, neighbors: [a, c], at: staleDate) + tracker.updateNeighbors(for: c, neighbors: [b]) + + #expect(tracker.computeRoute(from: a, to: c) == nil) + + // Refreshing B restores the route. + tracker.updateNeighbors(for: b, neighbors: [a, c]) + let route = try #require(tracker.computeRoute(from: a, to: c)) + #expect(route == [b]) + } + + @Test func versionGateBlocksV1AndUnknownHops() throws { + let tracker = MeshTopologyTracker() + let a = try hex("0101010101010101") + let b = try hex("0202020202020202") + let c = try hex("0303030303030303") + + tracker.updateNeighbors(for: a, neighbors: [b]) + tracker.updateNeighbors(for: b, neighbors: [a, c]) + tracker.updateNeighbors(for: c, neighbors: [b]) + + // Without the gate the route exists. + #expect(tracker.computeRoute(from: a, to: c) == [b]) + // Version-unknown hops are assumed v1-only and block gated routes. + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == nil) + + // A v1 observation does not unlock the gate. + tracker.recordObservedVersion(1, for: b) + tracker.recordObservedVersion(2, for: c) + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == nil) + + // Once the hop is observed speaking v2 the route opens. + tracker.recordObservedVersion(2, for: b) + let route = try #require(tracker.computeRoute(from: a, to: c, requiringVersion: 2)) + #expect(route == [b]) + } + + @Test func versionGateRequiresV2Target() throws { + let tracker = MeshTopologyTracker() + let a = try hex("0101010101010101") + let b = try hex("0202020202020202") + let c = try hex("0303030303030303") + + tracker.updateNeighbors(for: a, neighbors: [b]) + tracker.updateNeighbors(for: b, neighbors: [a, c]) + tracker.updateNeighbors(for: c, neighbors: [b]) + tracker.recordObservedVersion(2, for: b) + + // The recipient must decode the v2 frame too. + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == nil) + + tracker.recordObservedVersion(2, for: c) + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == [b]) + } + + @Test func pruneDropsStaleObservedVersions() throws { + let tracker = MeshTopologyTracker() + let a = try hex("0101010101010101") + let b = try hex("0202020202020202") + let c = try hex("0303030303030303") + + tracker.updateNeighbors(for: a, neighbors: [b]) + tracker.updateNeighbors(for: b, neighbors: [a, c]) + tracker.updateNeighbors(for: c, neighbors: [b]) + let old = Date().addingTimeInterval(-120) + tracker.recordObservedVersion(2, for: b, at: old) + tracker.recordObservedVersion(2, for: c, at: old) + + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == [b]) + tracker.prune(olderThan: 60) + // Claims are fresh but the version observations aged out. + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == nil) + } + } diff --git a/bitchatTests/Sync/RequestSyncPacketFragmentFilterTests.swift b/bitchatTests/Sync/RequestSyncPacketFragmentFilterTests.swift new file mode 100644 index 00000000..d055bde6 --- /dev/null +++ b/bitchatTests/Sync/RequestSyncPacketFragmentFilterTests.swift @@ -0,0 +1,76 @@ +// +// RequestSyncPacketFragmentFilterTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import BitFoundation +@testable import bitchat + +struct RequestSyncPacketFragmentFilterTests { + + @Test func fragmentIdFilterRoundTripsThroughWireEncoding() throws { + let id1 = try #require(Data(hexString: "00112233445566aa")) + let id2 = try #require(Data(hexString: "ffeeddccbbaa9988")) + let filter = try #require(RequestSyncPacket.encodeFragmentIdFilter([id1, id2])) + + let packet = RequestSyncPacket(p: 7, m: 128, data: Data([0x01]), types: .fragment, fragmentIdFilter: filter) + let decoded = try #require(RequestSyncPacket.decode(from: packet.encode())) + + #expect(decoded.fragmentIdFilter == filter) + let ids = try #require(RequestSyncPacket.decodeFragmentIdFilter(decoded.fragmentIdFilter)) + #expect(ids == Set([id1, id2])) + } + + @Test func encodeCapsFilterAtMaxCountWithinDecoderBudget() throws { + let ids = (0..<100).map { i -> Data in + var id = Data(repeating: 0, count: 8) + id[7] = UInt8(i) + return id + } + let filter = try #require(RequestSyncPacket.encodeFragmentIdFilter(ids)) + + let tokens = filter.split(separator: ",") + #expect(tokens.count == RequestSyncPacket.maxFragmentIdFilterCount) + // 60 IDs * 17 bytes ("<16 hex>,") - 1 = 1019 ≤ the 1024-byte cap. + #expect(filter.utf8.count == 1019) + #expect(filter.utf8.count <= 1024) + } + + @Test func encodeDropsMalformedIDs() throws { + let good = try #require(Data(hexString: "0011223344556677")) + let short = Data([0x01, 0x02]) + let filter = try #require(RequestSyncPacket.encodeFragmentIdFilter([short, good])) + #expect(filter == good.hexEncodedString()) + #expect(RequestSyncPacket.encodeFragmentIdFilter([short]) == nil) + #expect(RequestSyncPacket.encodeFragmentIdFilter([]) == nil) + } + + @Test func decodeIgnoresMalformedTokens() throws { + let good = try #require(Data(hexString: "0011223344556677")) + let ids = try #require( + RequestSyncPacket.decodeFragmentIdFilter("zzzz,0011,0011223344556677,") + ) + #expect(ids == Set([good])) + #expect(RequestSyncPacket.decodeFragmentIdFilter(nil) == nil) + #expect(RequestSyncPacket.decodeFragmentIdFilter("not-hex") == nil) + } + + @Test func decoderIgnoresOversizedFilterValue() throws { + // Hand-roll a payload whose 0x06 TLV exceeds the acceptance cap; the + // request must still decode, with the filter dropped. + var payload = RequestSyncPacket(p: 7, m: 128, data: Data([0x01])).encode() + let oversized = Data(repeating: UInt8(ascii: "a"), count: 1025) + payload.append(0x06) + payload.append(UInt8((oversized.count >> 8) & 0xFF)) + payload.append(UInt8(oversized.count & 0xFF)) + payload.append(oversized) + + let decoded = try #require(RequestSyncPacket.decode(from: payload)) + #expect(decoded.fragmentIdFilter == nil) + } +} diff --git a/docs/REQUEST_SYNC_MANAGER.md b/docs/REQUEST_SYNC_MANAGER.md index b304508e..a885f159 100644 --- a/docs/REQUEST_SYNC_MANAGER.md +++ b/docs/REQUEST_SYNC_MANAGER.md @@ -20,9 +20,11 @@ The new implementation introduces a **RequestSyncManager** to track outgoing syn ### Request Sync Payload The `REQUEST_SYNC` packet payload (TLV encoded) has been updated to include: -* **Future Filters**: - * `sinceTimestamp` (Type 0x05): To request packets since a certain time (UInt64 big-endian). - * `fragmentIdFilter` (Type 0x06): To request specific fragments (UTF-8 string). +* `sinceTimestamp` (Type 0x05): filter-coverage cursor (UInt64 big-endian). The requester's GCS filter only covers packets at or after this timestamp; the responder skips older packets instead of re-sending them every round. +* `fragmentIdFilter` (Type 0x06): targeted fragment resync (UTF-8 string). Comma-separated 16-hex-char (8-byte) fragment **stream IDs** — the ID that prefixes every fragment payload. + * **Requester**: when a broadcast reassembly stalls (no new fragment for 5 s), the fragment assembler reports the stream ID and a `REQUEST_SYNC` with `types = fragment` and this filter goes to each connected peer (re-requested at most every 10 s per stream). Directed reassemblies are excluded — peers only archive broadcast fragments for sync. + * **Responder**: when the filter is present, the fragment diff is restricted to exactly the named streams and the `sinceTimestamp` cursor is bypassed for them; the GCS filter still excludes pieces the requester already holds. Responses keep RSR marking, TTL 0, per-peer response rate limiting (8/30 s), and `REQUEST_SYNC` itself remains link-local (TTL 0, never relayed). + * **Bounds**: at most 60 IDs per request. Each ID encodes as 16 hex chars plus a comma separator, so the largest value is 60 × 17 − 1 = 1019 bytes, within the decoder's 1024-byte acceptance cap; oversized filter values are ignored (the rest of the request still decodes). ## Architecture diff --git a/docs/SOURCE_ROUTING.md b/docs/SOURCE_ROUTING.md index 6832a16e..55d00232 100644 --- a/docs/SOURCE_ROUTING.md +++ b/docs/SOURCE_ROUTING.md @@ -2,7 +2,7 @@ This document specifies the Source-Based Routing extension (v2) for the BitChat protocol. This upgrade enables efficient unicast routing across the mesh by allowing senders to specify an explicit path of intermediate relays. -**Status:** Implemented in Android and iOS. Backward compatible (v1 clients ignore routing data). +**Status:** Implemented in Android and iOS: both decode routed packets, forward along routes, and originate routes. iOS origination is policy-gated (see §8). Backward compatible (v1 clients never receive routed frames from iOS: routes are only originated when every node on the path has been observed speaking v2). --- @@ -144,3 +144,44 @@ When a node receives a packet **not** addressed to itself: * **Fallback:** If the Next Hop is unreachable, **fall back to broadcast/flood** to ensure delivery. 3. **If NO (Standard):** * Flood the packet to all connected neighbors (subject to TTL and probability rules). + +--- + +## 8. iOS Origination Policy + +iOS attaches a route (upgrading the packet to v2 and re-signing it) only when +**all** of the following hold at send time (`BLESourceRouteOriginationPolicy`): + +1. **Authored locally.** The packet's `SenderID` is our own peer ID. Relays + never rewrite someone else's packet — adding a route would force a + re-sign under the wrong key. Relays only *follow* existing routes + (`BLERouteForwardingPolicy`). +2. **Directed.** The packet has a single-peer `RecipientID` (not the + broadcast ID). In practice this covers Noise-encrypted private traffic, + private file transfers, and their fragments (fragments inherit the + parent's route and version, per §5). +3. **TTL headroom.** `TTL > 1`. Link-local packets (e.g. `REQUEST_SYNC`, + always TTL 0) never carry routes. +4. **Recipient not directly connected.** A direct write already delivers in + one hop; a route would only add bytes. +5. **Complete v2 path exists.** BFS over the confirmed-edge mesh graph + (`MeshTopologyTracker`, built from verified announce `directNeighbors` + claims, entries expiring after 60 s) finds a path with **at most 4 + intermediate hops** where every intermediate hop **and the recipient** + has been observed originating or relaying a v2 packet. Nodes never seen + speaking v2 are assumed v1-only and are excluded — a v1 client cannot + decode a v2 frame, so routing through it would silently drop the packet. +6. **No recent route failure.** See below. + +If any gate fails, behavior is exactly the pre-routing flood/direct-write +path — v1 peers observe no change. + +### Failure Fallback + +A routed unicast rides one path; a broken hop loses the packet where a flood +would heal around it. iOS keeps a small per-recipient health cache +(`BLESourceRouteFailureCache`): a routed send that sees no inbound packet +authored by the recipient within 10 s counts as a route failure, and directed +sends to that recipient fall back to flooding for the next 60 s before +routing is attempted again. Retransmission of the payload itself stays where +it always was (MessageRouter and higher layers). diff --git a/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift b/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift index b46a552d..ca29a2b2 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift @@ -14,7 +14,7 @@ import struct Foundation.Date /// including TTL for hop limiting and optional encryption. /// - Note: Packets larger than BLE MTU (512 bytes) are automatically fragmented public struct BitchatPacket: Codable { - let version: UInt8 + public let version: UInt8 public let type: UInt8 public let senderID: Data public let recipientID: Data? From 81168adad108cf02058915abaeac3f1457e3e3c5 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 20:11:17 +0200 Subject: [PATCH 006/158] Add geohash bulletin board: persistent signed notices over mesh sync New MessageType 0x23 carries TLV-encoded board posts and tombstones, self-signed with the author's Ed25519 key ("bitchat-board-v1" / "bitchat-board-del-v1" domains) so notices verify without the author present. BoardStore persists raw signed packets under Application Support/board/ (200 posts, 5 per author, oldest evicted; expiry sweep; tombstones retained until the deleted post's original expiry) and is wiped on panic. Board packets join gossip sync as bit 8 of the existing variable-length types bitfield (a second byte old decoders already accept and ignore), with a 60s round and its own capacity, served straight from the board store so retention has one owner. Posts relay like broadcasts; urgent posts get the announce-class TTL cap. UI: a pin button in the header opens the board for the current channel (geohash board, or mesh-local board), with urgent-pinned newest-first listing, compose with urgent toggle and 1/3/7-day expiry, and swipe-delete on own posts. Geohash posts also publish one-way as Nostr kind-1 location notes when relays are reachable. Co-Authored-By: Claude Fable 5 --- bitchat/App/AppChromeModel.swift | 3 + bitchat/Protocols/BoardPackets.swift | 348 ++++++++++++++++++ .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEReceivePipeline.swift | 4 + bitchat/Services/BLE/BLEService.swift | 71 ++++ bitchat/Services/Board/BoardManager.swift | 165 +++++++++ bitchat/Services/Board/BoardStore.swift | 305 +++++++++++++++ bitchat/Services/RelayController.swift | 5 +- bitchat/Services/Transport.swift | 5 + bitchat/Sync/GossipSyncManager.swift | 41 +++ bitchat/Sync/SyncTypeFlags.swift | 6 + bitchat/ViewModels/ChatViewModel.swift | 4 + bitchat/Views/BoardView.swift | 270 ++++++++++++++ bitchat/Views/ContentHeaderView.swift | 33 ++ .../Protocols/BoardPacketsTests.swift | 211 +++++++++++ bitchatTests/Services/BoardStoreTests.swift | 277 ++++++++++++++ bitchatTests/Sync/GossipSyncBoardTests.swift | 130 +++++++ .../Sync/SyncTypeFlagsBoardTests.swift | 78 ++++ .../Sources/BitFoundation/MessageType.swift | 4 +- 19 files changed, 1958 insertions(+), 4 deletions(-) create mode 100644 bitchat/Protocols/BoardPackets.swift create mode 100644 bitchat/Services/Board/BoardManager.swift create mode 100644 bitchat/Services/Board/BoardStore.swift create mode 100644 bitchat/Views/BoardView.swift create mode 100644 bitchatTests/Protocols/BoardPacketsTests.swift create mode 100644 bitchatTests/Services/BoardStoreTests.swift create mode 100644 bitchatTests/Sync/GossipSyncBoardTests.swift create mode 100644 bitchatTests/Sync/SyncTypeFlagsBoardTests.swift diff --git a/bitchat/App/AppChromeModel.swift b/bitchat/App/AppChromeModel.swift index 3f9cacd7..d90df814 100644 --- a/bitchat/App/AppChromeModel.swift +++ b/bitchat/App/AppChromeModel.swift @@ -18,6 +18,9 @@ final class AppChromeModel: ObservableObject { private let chatViewModel: ChatViewModel private var cancellables = Set() + /// Bulletin-board coordinator, created on first use of the board sheet. + private(set) lazy var boardManager = BoardManager(transport: chatViewModel.meshService) + init(chatViewModel: ChatViewModel, privateInboxModel: PrivateInboxModel) { self.chatViewModel = chatViewModel self.nickname = chatViewModel.nickname diff --git a/bitchat/Protocols/BoardPackets.swift b/bitchat/Protocols/BoardPackets.swift new file mode 100644 index 00000000..d265a1c1 --- /dev/null +++ b/bitchat/Protocols/BoardPackets.swift @@ -0,0 +1,348 @@ +// +// BoardPackets.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import CryptoKit +import Foundation + +// MARK: - Board wire format (MessageType.boardPost payloads) +// +// TLV layout (type u8, length u16 big-endian, value), matching REQUEST_SYNC: +// - 0x01: kind (u8) — 0x01 post, 0x02 tombstone +// - 0x02: postID (16B random) +// - 0x03: geohash (UTF-8, empty = mesh-local board, max 12 chars) +// - 0x04: content (UTF-8, 1...512 bytes) [post] +// - 0x05: authorSigningKey (32B Ed25519 public key) +// - 0x06: authorNickname (UTF-8, max 64 bytes) +// - 0x07: createdAt (u64 big-endian, ms) [post] +// - 0x08: expiresAt (u64 big-endian, ms, max 7 days after createdAt) [post] +// - 0x09: flags (u8, bit0 = urgent) [post] +// - 0x0A: signature (64B Ed25519) +// - 0x0B: deletedAt (u64 big-endian, ms) [tombstone] +// Unknown TLVs are skipped for forward compatibility. + +enum BoardWireConstants { + static let postIDLength = 16 + static let signingKeyLength = 32 + static let signatureLength = 64 + static let contentMaxBytes = 512 + static let nicknameMaxBytes = 64 + static let geohashMaxLength = 12 + /// Posts may live at most 7 days past their creation timestamp. + static let maxLifetimeMs: UInt64 = 7 * 24 * 60 * 60 * 1000 + static let postSigningContext = "bitchat-board-v1" + static let tombstoneSigningContext = "bitchat-board-del-v1" + static let geohashAlphabet = Set("0123456789bcdefghjkmnpqrstuvwxyz") +} + +private enum BoardTLVType: UInt8 { + case kind = 0x01 + case postID = 0x02 + case geohash = 0x03 + case content = 0x04 + case authorSigningKey = 0x05 + case authorNickname = 0x06 + case createdAt = 0x07 + case expiresAt = 0x08 + case flags = 0x09 + case signature = 0x0A + case deletedAt = 0x0B +} + +private enum BoardWireKind: UInt8 { + case post = 0x01 + case tombstone = 0x02 +} + +/// A signed, persistent bulletin-board notice. +struct BoardPostPacket: Equatable { + let postID: Data + /// Empty string scopes the post to the mesh-local board. + let geohash: String + let content: String + let authorSigningKey: Data + let authorNickname: String + let createdAt: UInt64 + let expiresAt: UInt64 + let flags: UInt8 + let signature: Data + + static let urgentFlag: UInt8 = 0x01 + + var isUrgent: Bool { flags & Self.urgentFlag != 0 } + + /// Canonical bytes covered by the Ed25519 signature. Variable-length + /// fields are length-prefixed so no two field combinations can collide. + static func signingBytes( + postID: Data, + geohash: String, + content: String, + authorSigningKey: Data, + authorNickname: String, + createdAt: UInt64, + expiresAt: UInt64, + flags: UInt8 + ) -> Data { + var out = Data() + BoardWireEncoding.appendContext(BoardWireConstants.postSigningContext, to: &out) + out.append(postID) + BoardWireEncoding.appendLengthPrefixed(Data(geohash.utf8), to: &out) + BoardWireEncoding.appendLengthPrefixed(Data(content.utf8), to: &out) + out.append(authorSigningKey) + BoardWireEncoding.appendLengthPrefixed(Data(authorNickname.utf8), to: &out) + BoardWireEncoding.appendUInt64(createdAt, to: &out) + BoardWireEncoding.appendUInt64(expiresAt, to: &out) + out.append(flags) + return out + } + + var signingBytes: Data { + Self.signingBytes( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: authorSigningKey, + authorNickname: authorNickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags + ) + } + + func verifySignature() -> Bool { + BoardWireEncoding.verify(signature: signature, over: signingBytes, publicKey: authorSigningKey) + } +} + +/// A signed deletion marker. Only the author's key can produce one; receivers +/// keep it until the post's original expiry so the delete outruns the post. +struct BoardTombstonePacket: Equatable { + let postID: Data + let authorSigningKey: Data + let deletedAt: UInt64 + let signature: Data + + static func signingBytes(postID: Data, deletedAt: UInt64) -> Data { + var out = Data() + BoardWireEncoding.appendContext(BoardWireConstants.tombstoneSigningContext, to: &out) + out.append(postID) + BoardWireEncoding.appendUInt64(deletedAt, to: &out) + return out + } + + var signingBytes: Data { + Self.signingBytes(postID: postID, deletedAt: deletedAt) + } + + func verifySignature() -> Bool { + BoardWireEncoding.verify(signature: signature, over: signingBytes, publicKey: authorSigningKey) + } +} + +/// Decoded board payload: either a live post or a tombstone. +enum BoardWire: Equatable { + case post(BoardPostPacket) + case tombstone(BoardTombstonePacket) + + func encode() -> Data { + var out = Data() + func putTLV(_ t: BoardTLVType, _ v: Data) { + out.append(t.rawValue) + let len = UInt16(v.count) + out.append(UInt8((len >> 8) & 0xFF)) + out.append(UInt8(len & 0xFF)) + out.append(v) + } + switch self { + case .post(let post): + putTLV(.kind, Data([BoardWireKind.post.rawValue])) + putTLV(.postID, post.postID) + putTLV(.geohash, Data(post.geohash.utf8)) + putTLV(.content, Data(post.content.utf8)) + putTLV(.authorSigningKey, post.authorSigningKey) + putTLV(.authorNickname, Data(post.authorNickname.utf8)) + putTLV(.createdAt, BoardWireEncoding.uint64Data(post.createdAt)) + putTLV(.expiresAt, BoardWireEncoding.uint64Data(post.expiresAt)) + putTLV(.flags, Data([post.flags])) + putTLV(.signature, post.signature) + case .tombstone(let tombstone): + putTLV(.kind, Data([BoardWireKind.tombstone.rawValue])) + putTLV(.postID, tombstone.postID) + putTLV(.authorSigningKey, tombstone.authorSigningKey) + putTLV(.deletedAt, BoardWireEncoding.uint64Data(tombstone.deletedAt)) + putTLV(.signature, tombstone.signature) + } + return out + } + + /// Structural decode; the caller must still verify the signature before + /// ingesting (`verifySignature()`). + static func decode(from data: Data) -> BoardWire? { + var off = data.startIndex + var kind: BoardWireKind? + var postID: Data? + var geohash: String? + var content: String? + var contentBytes = 0 + var authorSigningKey: Data? + var authorNickname: String? + var nicknameBytes = 0 + var createdAt: UInt64? + var expiresAt: UInt64? + var flags: UInt8? + var signature: Data? + var deletedAt: UInt64? + + while off + 3 <= data.endIndex { + let t = data[off]; off += 1 + let len = (Int(data[off]) << 8) | Int(data[off + 1]); off += 2 + guard off + len <= data.endIndex else { return nil } + let v = data.subdata(in: off..<(off + len)); off += len + switch BoardTLVType(rawValue: t) { + case .kind: + guard v.count == 1 else { return nil } + kind = BoardWireKind(rawValue: v[v.startIndex]) + case .postID: + guard v.count == BoardWireConstants.postIDLength else { return nil } + postID = v + case .geohash: + guard v.count <= BoardWireConstants.geohashMaxLength else { return nil } + geohash = String(data: v, encoding: .utf8) + case .content: + guard v.count <= BoardWireConstants.contentMaxBytes else { return nil } + contentBytes = v.count + content = String(data: v, encoding: .utf8) + case .authorSigningKey: + guard v.count == BoardWireConstants.signingKeyLength else { return nil } + authorSigningKey = v + case .authorNickname: + guard v.count <= BoardWireConstants.nicknameMaxBytes else { return nil } + nicknameBytes = v.count + authorNickname = String(data: v, encoding: .utf8) + case .createdAt: + createdAt = BoardWireEncoding.uint64(from: v) + case .expiresAt: + expiresAt = BoardWireEncoding.uint64(from: v) + case .flags: + guard v.count == 1 else { return nil } + flags = v[v.startIndex] + case .signature: + guard v.count == BoardWireConstants.signatureLength else { return nil } + signature = v + case .deletedAt: + deletedAt = BoardWireEncoding.uint64(from: v) + case nil: + continue // forward compatible; ignore unknown TLVs + } + } + + guard let postID, let authorSigningKey, let signature else { return nil } + + switch kind { + case .post: + guard let geohash, let content, let authorNickname, + let createdAt, let expiresAt, let flags, + contentBytes >= 1, + nicknameBytes <= BoardWireConstants.nicknameMaxBytes, + isValidGeohashField(geohash), + expiresAt > createdAt, + expiresAt - createdAt <= BoardWireConstants.maxLifetimeMs else { + return nil + } + return .post(BoardPostPacket( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: authorSigningKey, + authorNickname: authorNickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags, + signature: signature + )) + case .tombstone: + guard let deletedAt else { return nil } + return .tombstone(BoardTombstonePacket( + postID: postID, + authorSigningKey: authorSigningKey, + deletedAt: deletedAt, + signature: signature + )) + case nil: + return nil + } + } + + func verifySignature() -> Bool { + switch self { + case .post(let post): return post.verifySignature() + case .tombstone(let tombstone): return tombstone.verifySignature() + } + } + + /// Cheap TLV peek for relay policy: is this payload an urgent post? + /// Avoids a full decode on the hot relay path. + static func urgentFlag(in data: Data) -> Bool { + var off = data.startIndex + while off + 3 <= data.endIndex { + let t = data[off]; off += 1 + let len = (Int(data[off]) << 8) | Int(data[off + 1]); off += 2 + guard off + len <= data.endIndex else { return false } + if t == BoardTLVType.flags.rawValue, len == 1 { + return data[off] & BoardPostPacket.urgentFlag != 0 + } + off += len + } + return false + } + + /// Empty geohash = mesh-local board; otherwise 1-12 chars of the geohash + /// base32 alphabet. + private static func isValidGeohashField(_ geohash: String) -> Bool { + geohash.isEmpty || geohash.allSatisfy { BoardWireConstants.geohashAlphabet.contains($0) } + } +} + +enum BoardWireEncoding { + static func appendContext(_ context: String, to out: inout Data) { + let bytes = Data(context.utf8) + out.append(UInt8(min(bytes.count, 255))) + out.append(bytes.prefix(255)) + } + + static func appendLengthPrefixed(_ value: Data, to out: inout Data) { + let len = UInt16(min(value.count, Int(UInt16.max))) + out.append(UInt8((len >> 8) & 0xFF)) + out.append(UInt8(len & 0xFF)) + out.append(value.prefix(Int(UInt16.max))) + } + + static func appendUInt64(_ value: UInt64, to out: inout Data) { + var be = value.bigEndian + withUnsafeBytes(of: &be) { out.append(contentsOf: $0) } + } + + static func uint64Data(_ value: UInt64) -> Data { + var out = Data() + appendUInt64(value, to: &out) + return out + } + + static func uint64(from data: Data) -> UInt64? { + guard data.count == 8 else { return nil } + var value: UInt64 = 0 + for byte in data { value = (value << 8) | UInt64(byte) } + return value + } + + static func verify(signature: Data, over message: Data, publicKey: Data) -> Bool { + guard let key = try? Curve25519.Signing.PublicKey(rawRepresentation: publicKey) else { + return false + } + return key.isValidSignature(signature, for: message) + } +} diff --git a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift index 18b144d2..7c23725f 100644 --- a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift +++ b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift @@ -12,7 +12,7 @@ enum BLEOutboundPacketPolicy { switch MessageType(rawValue: packetType) { case .noiseEncrypted, .noiseHandshake: return true - case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope: + case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .boardPost: return false } } diff --git a/bitchat/Services/BLE/BLEReceivePipeline.swift b/bitchat/Services/BLE/BLEReceivePipeline.swift index 71aacbaf..02fe152a 100644 --- a/bitchat/Services/BLE/BLEReceivePipeline.swift +++ b/bitchat/Services/BLE/BLEReceivePipeline.swift @@ -58,6 +58,10 @@ struct BLEReceivePipeline { isHandshake: packet.type == MessageType.noiseHandshake.rawValue, isAnnounce: packet.type == MessageType.announce.rawValue, isRequestSync: packet.type == MessageType.requestSync.rawValue, + // Board posts relay like broadcast messages; urgent ones get the + // announce-class TTL headroom so alerts travel the extra hop. + isUrgentBoardPost: packet.type == MessageType.boardPost.rawValue + && BoardWire.urgentFlag(in: packet.payload), degree: degree, highDegreeThreshold: highDegreeThreshold ) diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 865a89be..8185be7f 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -53,6 +53,8 @@ final class BLEService: NSObject { // reject. Injectable for tests; main-actor policy because favorites live // on the main actor. var courierStore: CourierStore = .shared + // Bulletin-board posts this device carries; injectable for tests. + var boardStore: BoardStore = .shared var courierDepositPolicy: @MainActor (Data, Bool) -> CourierDepositTier? = { depositorNoiseKey, isVerifiedPeer in if FavoritesPersistenceService.shared.isMutualFavorite(depositorNoiseKey) { return .favorite } return isVerifiedPeer ? .verified : nil @@ -297,6 +299,14 @@ final class BLEService: NSObject { let archive = meshBackgroundEnabled ? GossipMessageArchive() : nil let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager, archive: archive) manager.delegate = self + // Board posts sync from the board store (their retention owner) so + // deleted/expired posts drop out of rounds immediately. Real sessions + // only, matching the archive: unit tests stay hermetic. + if meshBackgroundEnabled { + manager.boardPacketsProvider = { [weak self] in + self?.boardStore.syncCandidates() ?? [] + } + } // Only start the periodic sync timers when real Bluetooth exists. In unit // tests there is no mesh to sync with, and the periodic sign/broadcast // churn just keeps the process busy and aggravates flaky exit hangs. @@ -3203,6 +3213,10 @@ extension BLEService { case .courierEnvelope: handleCourierEnvelope(packet, from: peerID) + case .boardPost: + // Invalid or deleted posts must not spread; skip the relay step. + guard handleBoardPost(packet, from: senderID) else { return } + case .leave: handleLeave(packet, from: senderID) @@ -3374,6 +3388,63 @@ extension BLEService { ) } + // MARK: - Board (geohash bulletin board) + + /// Validates and stores an incoming board post or tombstone. Returns + /// whether the packet is worth relaying onward. + private func handleBoardPost(_ packet: BitchatPacket, from peerID: PeerID) -> Bool { + guard let wire = BoardWire.decode(from: packet.payload) else { + SecureLogger.warning("⚠️ Malformed board packet from \(peerID.id.prefix(8))…", category: .session) + return false + } + // Posts are self-authenticating: the payload embeds the author's + // Ed25519 key and signature, so verification does not depend on the + // author still being around to announce. + guard wire.verifySignature() else { + if logRateLimiter.shouldLog(key: "board-sig:\(peerID.id)") { + SecureLogger.warning("🚫 Dropping board packet with invalid signature from \(peerID.id.prefix(8))…", category: .security) + } + return false + } + switch boardStore.ingest(wire, packet: packet) { + case .accepted, .duplicate: + return true + case .rejected: + return false + } + } + + /// Broadcasts a pre-signed board payload (post or tombstone) built by the + /// board manager, and ingests it locally so it shows up on our own board + /// and joins gossip sync immediately. + func sendBoardPayload(_ payload: Data) { + guard let wire = BoardWire.decode(from: payload), wire.verifySignature() else { + SecureLogger.error("❌ Refusing to send invalid board payload", category: .session) + return + } + messageQueue.async { [weak self] in + guard let self = self else { return } + let basePacket = BitchatPacket( + type: MessageType.boardPost.rawValue, + senderID: Data(hexString: self.myPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: self.messageTTL + ) + guard let signedPacket = self.noiseService.signPacket(basePacket) else { + SecureLogger.error("❌ Failed to sign board packet", category: .security) + return + } + // Pre-mark our own broadcast as processed to avoid handling a relayed self copy + let dedupID = BLESelfBroadcastTracker.dedupID(for: signedPacket) + self.messageDeduplicator.markProcessed(dedupID) + self.boardStore.ingest(wire, packet: signedPacket) + self.broadcastPacket(signedPacket) + } + } + // Handle REQUEST_SYNC: decode payload and respond with missing packets via sync manager private func handleRequestSync(_ packet: BitchatPacket, from peerID: PeerID) { // REQUEST_SYNC is link-local by design (always sent with ttl 0): a diff --git a/bitchat/Services/Board/BoardManager.swift b/bitchat/Services/Board/BoardManager.swift new file mode 100644 index 00000000..989fda34 --- /dev/null +++ b/bitchat/Services/Board/BoardManager.swift @@ -0,0 +1,165 @@ +// +// BoardManager.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitLogger +import Combine +import Foundation + +/// UI-facing coordinator for the bulletin board: builds and signs posts and +/// tombstones with the device's Noise signing key, hands them to the mesh +/// transport, and mirrors the store's live posts for SwiftUI. +@MainActor +final class BoardManager: ObservableObject { + /// Live posts across all boards, newest state from the store. + @Published private(set) var posts: [BoardPostPacket] = [] + + private let transport: Transport + private let store: BoardStore + private let publishToNostr: (_ content: String, _ geohash: String, _ nickname: String) -> Void + private var cancellable: AnyCancellable? + + init( + transport: Transport, + store: BoardStore = .shared, + publishToNostr: ((String, String, String) -> Void)? = nil + ) { + self.transport = transport + self.store = store + self.publishToNostr = publishToNostr ?? Self.livePublishToNostr + cancellable = store.$postsSnapshot + .receive(on: DispatchQueue.main) + .sink { [weak self] snapshot in + self?.posts = snapshot + } + } + + /// Posts for one board context, urgent first, then newest first. + func posts(forGeohash geohash: String) -> [BoardPostPacket] { + posts + .filter { $0.geohash == geohash } + .sorted { + if $0.isUrgent != $1.isUrgent { return $0.isUrgent } + return $0.createdAt > $1.createdAt + } + } + + func isOwnPost(_ post: BoardPostPacket) -> Bool { + let key = transport.noiseSigningPublicKeyData() + return !key.isEmpty && key == post.authorSigningKey + } + + /// Creates, signs, and broadcasts a board post. Returns false when the + /// content is empty/oversized or signing fails. + @discardableResult + func createPost( + content: String, + geohash: String, + urgent: Bool, + expiryDays: Int, + nickname: String + ) -> Bool { + guard let trimmed = content.trimmedOrNilIfEmpty, + trimmed.utf8.count <= BoardWireConstants.contentMaxBytes else { + return false + } + let signingKey = transport.noiseSigningPublicKeyData() + guard signingKey.count == BoardWireConstants.signingKeyLength else { return false } + + var cleanNickname = nickname + while cleanNickname.utf8.count > BoardWireConstants.nicknameMaxBytes { + cleanNickname.removeLast() + } + let createdAt = UInt64(Date().timeIntervalSince1970 * 1000) + let lifetimeMs = min( + UInt64(max(1, expiryDays)) * 24 * 60 * 60 * 1000, + BoardWireConstants.maxLifetimeMs + ) + let expiresAt = createdAt + lifetimeMs + let flags: UInt8 = urgent ? BoardPostPacket.urgentFlag : 0 + var postID = Data(count: BoardWireConstants.postIDLength) + let status = postID.withUnsafeMutableBytes { buffer -> Int32 in + guard let base = buffer.baseAddress else { return -1 } + return SecRandomCopyBytes(kSecRandomDefault, buffer.count, base) + } + guard status == errSecSuccess else { return false } + + let signingBytes = BoardPostPacket.signingBytes( + postID: postID, + geohash: geohash, + content: trimmed, + authorSigningKey: signingKey, + authorNickname: cleanNickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags + ) + guard let signature = transport.noiseSignData(signingBytes) else { + SecureLogger.error("Board: failed to sign post", category: .session) + return false + } + let post = BoardPostPacket( + postID: postID, + geohash: geohash, + content: trimmed, + authorSigningKey: signingKey, + authorNickname: cleanNickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags, + signature: signature + ) + transport.sendBoardPayload(BoardWire.post(post).encode()) + + // One-way Nostr bridge (v1): geohash posts also go out as kind-1 + // location notes so online users see them. No inbound merge yet. + if !geohash.isEmpty { + publishToNostr(trimmed, geohash, cleanNickname) + } + return true + } + + /// Signs and broadcasts a tombstone for one of our own posts. + @discardableResult + func deletePost(_ post: BoardPostPacket) -> Bool { + guard isOwnPost(post) else { return false } + let deletedAt = UInt64(Date().timeIntervalSince1970 * 1000) + let signingBytes = BoardTombstonePacket.signingBytes(postID: post.postID, deletedAt: deletedAt) + guard let signature = transport.noiseSignData(signingBytes) else { + SecureLogger.error("Board: failed to sign tombstone", category: .session) + return false + } + let tombstone = BoardTombstonePacket( + postID: post.postID, + authorSigningKey: post.authorSigningKey, + deletedAt: deletedAt, + signature: signature + ) + transport.sendBoardPayload(BoardWire.tombstone(tombstone).encode()) + return true + } + + private static func livePublishToNostr(content: String, geohash: String, nickname: String) { + let relays = GeoRelayDirectory.shared.closestRelays(toGeohash: geohash, count: TransportConfig.nostrGeoRelayCount) + guard !relays.isEmpty else { + SecureLogger.debug("Board: no geo relays for \(geohash); skipping Nostr bridge", category: .session) + return + } + do { + let identity = try NostrIdentityBridge().deriveIdentity(forGeohash: geohash) + let event = try NostrProtocol.createGeohashTextNote( + content: content, + geohash: geohash, + senderIdentity: identity, + nickname: nickname + ) + NostrRelayManager.shared.sendEvent(event, to: relays) + } catch { + SecureLogger.error("Board: failed to bridge post to Nostr: \(error)", category: .session) + } + } +} diff --git a/bitchat/Services/Board/BoardStore.swift b/bitchat/Services/Board/BoardStore.swift new file mode 100644 index 00000000..c08a12e4 --- /dev/null +++ b/bitchat/Services/Board/BoardStore.swift @@ -0,0 +1,305 @@ +// +// BoardStore.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import Combine +import Foundation + +/// Outcome of feeding a board packet into the store, so the transport can +/// decide whether the packet is still worth relaying. +enum BoardIngestResult { + /// New post or tombstone accepted (or a quota rejected it locally while + /// it remains valid for other devices). + case accepted + /// Already known; nothing changed. + case duplicate + /// Invalid, expired, or deleted; do not relay. + case rejected +} + +/// Persistent storage for bulletin-board posts and their tombstones. +/// +/// Posts are signed public notices designed to outlive chat: they stay on +/// disk until their author-chosen expiry (max 7 days) and re-enter gossip +/// sync after a restart. Tombstones are retained until the deleted post's +/// original expiry so the delete keeps outrunning stale copies of the post. +/// +/// The on-disk format is the raw signed packets themselves (like +/// `GossipMessageArchive`); state is rebuilt by re-verifying and re-ingesting +/// them on launch. Wiped on panic. +final class BoardStore { + enum Limits { + static let maxPosts = 200 + static let maxPostsPerAuthor = 5 + /// Retention for a tombstone whose post we never saw: we cannot know + /// the original expiry, so cap at the max post lifetime. + static let orphanTombstoneLifetimeMs = BoardWireConstants.maxLifetimeMs + } + + private struct StoredPost { + let post: BoardPostPacket + let packet: BitchatPacket + let rawPacket: Data + } + + private struct StoredTombstone { + let tombstone: BoardTombstonePacket + let packet: BitchatPacket + let rawPacket: Data + let retainUntil: UInt64 + } + + /// On-disk entry: the raw signed packet, plus the retention deadline for + /// tombstones (derived from the deleted post's original expiry, which is + /// no longer recoverable once the post is gone). + private struct PersistedEntry: Codable { + let packet: Data + let retainUntil: UInt64? + } + + static let shared = BoardStore() + + /// Live posts, published on the main thread for the board UI. + @Published private(set) var postsSnapshot: [BoardPostPacket] = [] + + private var posts: [StoredPost] = [] + private var tombstones: [StoredTombstone] = [] + private let queue = DispatchQueue(label: "chat.bitchat.board.store") + private let fileURL: URL? + private let now: () -> Date + + /// - Parameter fileURL: Overrides the on-disk location (tests). Ignored + /// when `persistsToDisk` is false. + init(persistsToDisk: Bool = true, fileURL: URL? = nil, now: @escaping () -> Date = Date.init) { + self.now = now + self.fileURL = persistsToDisk ? (fileURL ?? Self.defaultFileURL()) : nil + loadFromDisk() + } + + // MARK: - Ingest + + /// Ingest a board packet whose payload decodes to `wire`. The caller must + /// have verified the wire signature already (`BoardWire.verifySignature`). + @discardableResult + func ingest(_ wire: BoardWire, packet: BitchatPacket) -> BoardIngestResult { + guard let rawPacket = packet.toBinaryData(padding: false) else { return .rejected } + let nowMs = currentMs() + return queue.sync { + let result = ingestLocked(wire, packet: packet, rawPacket: rawPacket, nowMs: nowMs) + if result == .accepted { + persistLocked() + } + return result + } + } + + // MARK: - Reads + + /// Live posts scoped to one board (geohash, or "" for the mesh board). + func posts(forGeohash geohash: String) -> [BoardPostPacket] { + let nowMs = currentMs() + return queue.sync { + pruneExpiredLocked(nowMs: nowMs) + return posts.map(\.post).filter { $0.geohash == geohash } + } + } + + /// Raw signed packets (posts and live tombstones) for gossip sync rounds. + func syncCandidates() -> [BitchatPacket] { + let nowMs = currentMs() + return queue.sync { + pruneExpiredLocked(nowMs: nowMs) + return posts.map(\.packet) + tombstones.map(\.packet) + } + } + + // MARK: - Maintenance + + func pruneExpired() { + let nowMs = currentMs() + queue.sync { + pruneExpiredLocked(nowMs: nowMs) + persistLocked() + } + } + + /// Panic wipe: drop all board data from memory and disk. + func wipe() { + queue.sync { + posts.removeAll() + tombstones.removeAll() + if let fileURL { + try? FileManager.default.removeItem(at: fileURL) + } + publishSnapshotLocked() + } + } + + // MARK: - Internals (call only on `queue`) + + private func ingestLocked( + _ wire: BoardWire, + packet: BitchatPacket, + rawPacket: Data, + nowMs: UInt64, + retainUntilOverride: UInt64? = nil + ) -> BoardIngestResult { + pruneExpiredLocked(nowMs: nowMs) + switch wire { + case .post(let post): + return ingestPostLocked(post, packet: packet, rawPacket: rawPacket, nowMs: nowMs) + case .tombstone(let tombstone): + return ingestTombstoneLocked(tombstone, packet: packet, rawPacket: rawPacket, nowMs: nowMs, retainUntilOverride: retainUntilOverride) + } + } + + private func ingestPostLocked(_ post: BoardPostPacket, packet: BitchatPacket, rawPacket: Data, nowMs: UInt64) -> BoardIngestResult { + guard post.expiresAt > nowMs else { return .rejected } + if tombstones.contains(where: { $0.tombstone.postID == post.postID && $0.tombstone.authorSigningKey == post.authorSigningKey }) { + return .rejected + } + guard !posts.contains(where: { $0.post.postID == post.postID }) else { return .duplicate } + + posts.append(StoredPost(post: post, packet: packet, rawPacket: rawPacket)) + + // Per-author cap, then global cap; oldest posts are evicted first. + let authorPosts = posts.filter { $0.post.authorSigningKey == post.authorSigningKey } + if authorPosts.count > Limits.maxPostsPerAuthor { + evictOldestLocked(from: authorPosts, keep: Limits.maxPostsPerAuthor) + } + if posts.count > Limits.maxPosts { + evictOldestLocked(from: posts, keep: Limits.maxPosts) + } + publishSnapshotLocked() + // Even when the new post itself was the eviction victim it stays + // valid mesh-wide; peers with room should still receive it. + return .accepted + } + + private func ingestTombstoneLocked( + _ tombstone: BoardTombstonePacket, + packet: BitchatPacket, + rawPacket: Data, + nowMs: UInt64, + retainUntilOverride: UInt64? = nil + ) -> BoardIngestResult { + guard !tombstones.contains(where: { $0.tombstone.postID == tombstone.postID }) else { return .duplicate } + + // Cap so a doctored file cannot pin a tombstone past any legal expiry. + let maxRetain = tombstone.deletedAt &+ Limits.orphanTombstoneLifetimeMs + let retainUntil: UInt64 + if let index = posts.firstIndex(where: { $0.post.postID == tombstone.postID }) { + let target = posts[index].post + // Only the author's key can delete: the tombstone signature was + // already verified against its embedded key, so it suffices to + // require that key to be the post's author key. + guard target.authorSigningKey == tombstone.authorSigningKey else { return .rejected } + retainUntil = target.expiresAt + posts.remove(at: index) + publishSnapshotLocked() + } else if let retainUntilOverride { + // Restored from disk: the post is long gone, so trust the + // retention deadline recorded when the delete was first applied. + retainUntil = min(retainUntilOverride, maxRetain) + } else { + // Post unknown (tombstone raced ahead); keep it around so the + // post is suppressed if it arrives later. + retainUntil = maxRetain + } + guard retainUntil > nowMs else { return .rejected } + tombstones.append(StoredTombstone(tombstone: tombstone, packet: packet, rawPacket: rawPacket, retainUntil: retainUntil)) + return .accepted + } + + private func evictOldestLocked(from candidates: [StoredPost], keep: Int) { + let victims = candidates + .sorted { $0.post.createdAt < $1.post.createdAt } + .prefix(max(0, candidates.count - keep)) + guard !victims.isEmpty else { return } + let victimIDs = Set(victims.map { $0.post.postID }) + posts.removeAll { victimIDs.contains($0.post.postID) } + } + + private func pruneExpiredLocked(nowMs: UInt64) { + let postsBefore = posts.count + posts.removeAll { $0.post.expiresAt <= nowMs } + tombstones.removeAll { $0.retainUntil <= nowMs } + if posts.count != postsBefore { + publishSnapshotLocked() + } + } + + private func publishSnapshotLocked() { + let snapshot = posts.map(\.post) + DispatchQueue.main.async { [weak self] in + self?.postsSnapshot = snapshot + } + } + + private func currentMs() -> UInt64 { + UInt64(max(0, now().timeIntervalSince1970) * 1000) + } + + // MARK: - Persistence + + private func persistLocked() { + guard let fileURL else { return } + let payloads = posts.map { PersistedEntry(packet: $0.rawPacket, retainUntil: nil) } + + tombstones.map { PersistedEntry(packet: $0.rawPacket, retainUntil: $0.retainUntil) } + do { + if payloads.isEmpty { + try? FileManager.default.removeItem(at: fileURL) + return + } + try FileManager.default.createDirectory( + at: fileURL.deletingLastPathComponent(), + withIntermediateDirectories: true + ) + let data = try JSONEncoder().encode(payloads) + var options: Data.WritingOptions = [.atomic] + #if os(iOS) + options.insert(.completeFileProtection) + #endif + try data.write(to: fileURL, options: options) + } catch { + SecureLogger.error("Failed to persist board store: \(error)", category: .session) + } + } + + private func loadFromDisk() { + guard let fileURL, + let data = try? Data(contentsOf: fileURL), + let payloads = try? JSONDecoder().decode([PersistedEntry].self, from: data) else { + return + } + let nowMs = currentMs() + queue.sync { + for entry in payloads { + guard let packet = BitchatPacket.from(entry.packet), + packet.type == MessageType.boardPost.rawValue, + let wire = BoardWire.decode(from: packet.payload), + wire.verifySignature() else { continue } + _ = ingestLocked(wire, packet: packet, rawPacket: entry.packet, nowMs: nowMs, retainUntilOverride: entry.retainUntil) + } + publishSnapshotLocked() + } + } + + private static func defaultFileURL() -> URL? { + guard let base = try? FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) else { return nil } + return base + .appendingPathComponent("board", isDirectory: true) + .appendingPathComponent("posts.json") + } +} diff --git a/bitchat/Services/RelayController.swift b/bitchat/Services/RelayController.swift index fae850ea..10b4f2c6 100644 --- a/bitchat/Services/RelayController.swift +++ b/bitchat/Services/RelayController.swift @@ -19,6 +19,7 @@ struct RelayController { isHandshake: Bool, isAnnounce: Bool, isRequestSync: Bool = false, + isUrgentBoardPost: Bool = false, degree: Int, highDegreeThreshold: Int) -> RelayDecision { let ttlCap = min(ttl, TransportConfig.messageTTLDefault) @@ -64,7 +65,7 @@ struct RelayController { // - Dense graphs: keep lower but still allow multi-hop bridging // - Thin chains (degree <= 2): every hop counts and flood cost is // minimal, so relay at full incoming depth - // - Announces get a bit more headroom + // - Announces (and urgent board posts) get a bit more headroom let ttlLimit: UInt8 = { if degree >= highDegreeThreshold { return max(UInt8(2), min(ttlCap, UInt8(5))) @@ -72,7 +73,7 @@ struct RelayController { if degree <= 2 { return ttlCap } - let preferred = UInt8(isAnnounce ? 7 : 6) + let preferred = UInt8((isAnnounce || isUrgentBoardPost) ? 7 : 6) return max(UInt8(2), min(ttlCap, preferred)) }() let newTTL = ttlLimit &- 1 diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 27c38700..b02bfdf8 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -124,6 +124,10 @@ protocol Transport: AnyObject { // transport cannot courier (no connected courier, or unsupported). func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool + // Bulletin board (mesh transports only): broadcast a pre-signed board + // payload (post or tombstone) so it spreads over relay and gossip sync. + func sendBoardPayload(_ payload: Data) + // QR verification (optional for transports) func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) @@ -154,6 +158,7 @@ extension Transport { func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { false } + func sendBoardPayload(_ payload: Data) {} func sendFileBroadcast(_ packet: BitchatFilePacket, transferId: String) {} func sendFilePrivate(_ packet: BitchatFilePacket, to peerID: PeerID, transferId: String) {} func cancelTransfer(_ transferId: String) {} diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index c966a7ca..31d5006b 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -76,6 +76,11 @@ final class GossipSyncManager { var fragmentSyncIntervalSeconds: TimeInterval = 30.0 var fileTransferSyncIntervalSeconds: TimeInterval = 60.0 var messageSyncIntervalSeconds: TimeInterval = 15.0 + // Board posts are few but long-lived (days, until each post's own + // expiry), so they get a slow round with their own capacity instead + // of competing with the 15-minute message window. + var boardCapacity: Int = 200 + var boardSyncIntervalSeconds: TimeInterval = 60.0 var responseRateLimitMaxResponses: Int = 8 var responseRateLimitWindowSeconds: TimeInterval = 30.0 } @@ -86,6 +91,12 @@ final class GossipSyncManager { private let archive: GossipMessageArchive? weak var delegate: Delegate? + /// Source of raw signed board packets (posts + tombstones). The board + /// store is the single owner of board retention (expiry, tombstones, + /// caps, persistence), so sync rounds query it instead of keeping a + /// second copy here. Must be thread-safe; set before `start()`. + var boardPacketsProvider: (() -> [BitchatPacket])? + // Storage: broadcast packets by type, and latest announce per sender private var messages = PacketStore() private var fragments = PacketStore() @@ -119,6 +130,9 @@ final class GossipSyncManager { if config.fileTransferCapacity > 0 && config.fileTransferSyncIntervalSeconds > 0 { schedules.append(SyncSchedule(types: .fileTransfer, interval: config.fileTransferSyncIntervalSeconds, lastSent: .distantPast)) } + if config.boardCapacity > 0 && config.boardSyncIntervalSeconds > 0 { + schedules.append(SyncSchedule(types: .board, interval: config.boardSyncIntervalSeconds, lastSent: .distantPast)) + } syncSchedules = schedules if archive != nil { @@ -155,6 +169,9 @@ final class GossipSyncManager { if self.config.fileTransferCapacity > 0 && self.config.fileTransferSyncIntervalSeconds > 0 { types.formUnion(.fileTransfer) } + if self.config.boardCapacity > 0 && self.config.boardSyncIntervalSeconds > 0 && self.boardPacketsProvider != nil { + types.formUnion(.board) + } self.sendRequestSync(to: peerID, types: types) } } @@ -366,6 +383,22 @@ final class GossipSyncManager { } } } + + if requestedTypes.contains(.boardPost) { + // The board store already filters to live posts and tombstones; + // no freshness window applies (posts sync until their own expiry). + let boardPackets = boardPacketsProvider?() ?? [] + for pkt in boardPackets { + if let since, pkt.timestamp < since { continue } + let idBytes = PacketIdUtil.computeId(pkt) + if !mightContain(idBytes) { + var toSend = pkt + toSend.ttl = 0 + toSend.isRSR = true // Mark as solicited response + delegate?.sendPacket(to: peerID, packet: toSend) + } + } + } } // Build REQUEST_SYNC payload using current candidates and GCS params @@ -385,6 +418,9 @@ final class GossipSyncManager { if types.contains(.fileTransfer) { candidates.append(contentsOf: fileTransfers.allPackets(isFresh: isPacketFresh)) } + if types.contains(.boardPost) { + candidates.append(contentsOf: boardPacketsProvider?() ?? []) + } if candidates.isEmpty { let p = GCSFilter.deriveP(targetFpr: config.gcsTargetFpr) let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types) @@ -401,6 +437,8 @@ final class GossipSyncManager { cap = max(1, config.fragmentCapacity) } else if types == .fileTransfer { cap = max(1, config.fileTransferCapacity) + } else if types == .board { + cap = max(1, config.boardCapacity) } else { cap = max(1, config.seenCapacity) } @@ -492,6 +530,9 @@ final class GossipSyncManager { // fragment traffic can't crowd messages out of the filter. for index in syncSchedules.indices { guard syncSchedules[index].interval > 0 else { continue } + // No board source wired up means nothing to offer or store; + // skip the round entirely. + if syncSchedules[index].types == .board && boardPacketsProvider == nil { continue } if syncSchedules[index].lastSent == .distantPast || now.timeIntervalSince(syncSchedules[index].lastSent) >= syncSchedules[index].interval { syncSchedules[index].lastSent = now sendPeriodicSync(for: syncSchedules[index].types) diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index 430485a0..f7b2ae9e 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -20,6 +20,7 @@ struct SyncTypeFlags: OptionSet { case .fragment: return 5 case .requestSync: return 6 case .fileTransfer: return 7 + case .boardPost: return 8 // Courier envelopes are directed deposits between trusted peers and // must never spread via gossip sync. case .courierEnvelope: return nil @@ -36,6 +37,10 @@ struct SyncTypeFlags: OptionSet { case 5: return .fragment case 6: return .requestSync case 7: return .fileTransfer + // Bit 8 spills the encoded bitfield into a second byte. Decoders since + // type-aware sync (#853) accept 1-8 bytes and map unknown bits to no + // known type, so old clients ignore board rounds instead of choking. + case 8: return .boardPost default: return nil } @@ -45,6 +50,7 @@ struct SyncTypeFlags: OptionSet { static let message = SyncTypeFlags(messageTypes: [.message]) static let fragment = SyncTypeFlags(messageTypes: [.fragment]) static let fileTransfer = SyncTypeFlags(messageTypes: [.fileTransfer]) + static let board = SyncTypeFlags(messageTypes: [.boardPost]) static let publicMessages = SyncTypeFlags(messageTypes: [.announce, .message]) diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 578b6509..bda66071 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1205,6 +1205,10 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele GossipMessageArchive.wipeDefault() StoreAndForwardMetrics.shared.reset() + // Drop bulletin-board posts and tombstones (memory and disk); board + // posts are signed with our identity key and persist for days. + BoardStore.shared.wipe() + // Identity manager has cleared persisted identity data above // Clear autocomplete state diff --git a/bitchat/Views/BoardView.swift b/bitchat/Views/BoardView.swift new file mode 100644 index 00000000..8c443847 --- /dev/null +++ b/bitchat/Views/BoardView.swift @@ -0,0 +1,270 @@ +// +// BoardView.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import SwiftUI + +/// The bulletin board for one context: a geohash channel, or the mesh-local +/// board when `geohash` is empty. Urgent posts pin to the top; own posts can +/// be swipe-deleted, which broadcasts a signed tombstone. +struct BoardView: View { + /// Empty string = mesh-local board. + let geohash: String + let senderNickname: String + @ObservedObject var board: BoardManager + + @ThemedPalette private var palette + @Environment(\.dynamicTypeSize) private var dynamicTypeSize + @Environment(\.dismiss) private var dismiss + @State private var draft: String = "" + @State private var urgent = false + @State private var expiryDays = 7 + + private var maxDraftLines: Int { dynamicTypeSize.isAccessibilitySize ? 5 : 3 } + private var posts: [BoardPostPacket] { board.posts(forGeohash: geohash) } + + private enum Strings { + static let boardName = String(localized: "board.title", defaultValue: "board", comment: "Title prefix of the bulletin board sheet") + static let description = String(localized: "board.description", defaultValue: "persistent notices carried by the mesh. posts are signed, spread device-to-device, and expire on their own.", comment: "Explainer under the board sheet title") + static let emptyTitle = String(localized: "board.empty_title", defaultValue: "no notices yet", comment: "Title shown when the board has no posts") + static let emptySubtitle = String(localized: "board.empty_subtitle", defaultValue: "pin the first notice for people around here.", comment: "Subtitle shown when the board has no posts") + static let urgentBadge = String(localized: "board.urgent_badge", defaultValue: "urgent", comment: "Badge shown on urgent board posts") + static let urgentToggle = String(localized: "board.compose.urgent", defaultValue: "urgent", comment: "Label for the urgent toggle in the board composer") + static let placeholder = String(localized: "board.compose.placeholder", defaultValue: "post a notice…", comment: "Placeholder for the board composer text field") + static let send = String(localized: "board.accessibility.post", defaultValue: "Post notice", comment: "Accessibility label for the board post button") + static let deleteAction = String(localized: "board.action.delete", defaultValue: "delete", comment: "Delete action for own board posts") + static let expiryLabel = String(localized: "board.compose.expiry", defaultValue: "expires in", comment: "Label for the board post expiry picker") + static let closeHint = String(localized: "board.accessibility.close", defaultValue: "Close board", comment: "Accessibility label for the board close button") + + static func expiryDaysOption(_ days: Int) -> String { + String( + format: String(localized: "board.compose.expiry_days", defaultValue: "%lldd", comment: "Expiry picker option, number of days abbreviated"), + locale: .current, + days + ) + } + + static func postAccessibilityLabel(author: String, content: String, urgent: Bool) -> String { + let base = String( + format: String(localized: "board.accessibility.post_row", defaultValue: "Notice from %@: %@", comment: "Accessibility label for a board post row"), + locale: .current, + author, content + ) + return urgent ? "\(urgentBadge), \(base)" : base + } + } + + var body: some View { + VStack(spacing: 0) { + headerSection + postList + composer + } + .themedSurface() + #if os(macOS) + .frame(minWidth: 420, idealWidth: 440, minHeight: 620, idealHeight: 680) + #endif + .themedSheetBackground() + } + + private var headerSection: some View { + VStack(alignment: .leading, spacing: 8) { + HStack(spacing: 12) { + Text(verbatim: geohash.isEmpty ? "\(Strings.boardName) @ #mesh" : "\(Strings.boardName) @ #\(geohash)") + .bitchatFont(size: 18) + Spacer() + SheetCloseButton { dismiss() } + .accessibilityLabel(Strings.closeHint) + } + Text(Strings.description) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.horizontal, 16) + .padding(.top, 16) + .padding(.bottom, 12) + .themedSurface() + } + + private var postList: some View { + Group { + if posts.isEmpty { + ScrollView { + VStack(alignment: .leading, spacing: 4) { + Text(Strings.emptyTitle) + .bitchatFont(size: 13, weight: .semibold) + Text(Strings.emptySubtitle) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 16) + .padding(.vertical, 12) + } + } else { + List { + ForEach(posts, id: \.postID) { post in + postRow(post) + .listRowBackground(palette.background) + .listRowSeparatorTint(palette.divider) + } + } + .listStyle(.plain) + .scrollContentBackground(.hidden) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .themedSurface() + } + + private func postRow(_ post: BoardPostPacket) -> some View { + let isOwn = board.isOwnPost(post) + let author = post.authorNickname.trimmedOrNilIfEmpty ?? "anon" + return VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 6) { + if post.isUrgent { + Image(systemName: "exclamationmark.triangle.fill") + .font(.bitchatSystem(size: 11)) + .foregroundColor(palette.alertRed) + Text(Strings.urgentBadge) + .bitchatFont(size: 11, weight: .semibold) + .foregroundColor(palette.alertRed) + } + Text(verbatim: "@\(author)") + .bitchatFont(size: 12, weight: .semibold) + Text(timestampText(forMs: post.createdAt)) + .bitchatFont(size: 11) + .foregroundColor(palette.secondary) + Spacer() + if isOwn { + Button { + board.deletePost(post) + } label: { + Image(systemName: "trash") + .font(.bitchatSystem(size: 12)) + .foregroundColor(palette.secondary) + } + .buttonStyle(.plain) + .accessibilityLabel(Strings.deleteAction) + } + } + Text(post.content) + .bitchatFont(size: 14) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.vertical, 4) + .accessibilityElement(children: .ignore) + .accessibilityLabel(Strings.postAccessibilityLabel(author: author, content: post.content, urgent: post.isUrgent)) + .accessibilityActions { + if isOwn { + Button(Strings.deleteAction) { board.deletePost(post) } + } + } + .swipeActions(edge: .trailing, allowsFullSwipe: false) { + if isOwn { + Button(role: .destructive) { + board.deletePost(post) + } label: { + Label(Strings.deleteAction, systemImage: "trash") + } + } + } + } + + private var composer: some View { + VStack(alignment: .leading, spacing: 8) { + HStack(alignment: .top, spacing: 10) { + TextField(Strings.placeholder, text: $draft, axis: .vertical) + .textFieldStyle(.plain) + .bitchatFont(size: 14) + .lineLimit(maxDraftLines, reservesSpace: true) + .padding(.vertical, 6) + Button(action: send) { + Image(systemName: "arrow.up.circle.fill") + .font(.bitchatSystem(size: 20)) + .foregroundColor(sendEnabled ? palette.accent : .secondary) + } + .padding(.top, 2) + .buttonStyle(.plain) + .disabled(!sendEnabled) + .accessibilityLabel(Strings.send) + } + HStack(spacing: 12) { + Toggle(isOn: $urgent) { + Text(Strings.urgentToggle) + .bitchatFont(size: 12) + .foregroundColor(urgent ? palette.alertRed : palette.secondary) + } + .toggleStyle(.switch) + .fixedSize() + .accessibilityLabel(Strings.urgentToggle) + Spacer() + Text(Strings.expiryLabel) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + Picker(Strings.expiryLabel, selection: $expiryDays) { + ForEach([1, 3, 7], id: \.self) { days in + Text(Strings.expiryDaysOption(days)).tag(days) + } + } + .pickerStyle(.segmented) + .fixedSize() + .accessibilityLabel(Strings.expiryLabel) + } + } + .padding(.horizontal, 16) + .padding(.vertical, 14) + .themedSurface() + .overlay(Divider(), alignment: .top) + } + + private var sendEnabled: Bool { + let trimmed = draft.trimmed + return !trimmed.isEmpty && trimmed.utf8.count <= BoardWireConstants.contentMaxBytes + } + + private func send() { + guard let content = draft.trimmedOrNilIfEmpty else { return } + let sent = board.createPost( + content: content, + geohash: geohash, + urgent: urgent, + expiryDays: expiryDays, + nickname: senderNickname + ) + if sent { + draft = "" + urgent = false + } + } + + private func timestampText(forMs ms: UInt64) -> String { + let date = Date(timeIntervalSince1970: TimeInterval(ms) / 1000) + let now = Date() + if let days = Calendar.current.dateComponents([.day], from: date, to: now).day, days < 7 { + let rel = Self.relativeFormatter.string(from: date, to: now) ?? "" + return rel.isEmpty ? "" : "\(rel) ago" + } + return Self.absDateFormatter.string(from: date) + } + + private static let relativeFormatter: DateComponentsFormatter = { + let f = DateComponentsFormatter() + f.allowedUnits = [.day, .hour, .minute] + f.maximumUnitCount = 1 + f.unitsStyle = .abbreviated + f.collapsesLargestUnit = true + return f + }() + + private static let absDateFormatter: DateFormatter = { + let f = DateFormatter() + f.setLocalizedDateFormatFromTemplate("MMM d") + return f + }() +} diff --git a/bitchat/Views/ContentHeaderView.swift b/bitchat/Views/ContentHeaderView.swift index eb188ed7..3fc2bd82 100644 --- a/bitchat/Views/ContentHeaderView.swift +++ b/bitchat/Views/ContentHeaderView.swift @@ -25,6 +25,9 @@ struct ContentHeaderView: View { /// Courier envelopes this device is carrying for offline third parties. @State private var carriedMailCount = 0 + /// Bulletin board sheet for the current channel context. + @State private var showBoard = false + var body: some View { HStack(spacing: 0) { Text(verbatim: "bitchat/") @@ -139,6 +142,20 @@ struct ContentHeaderView: View { ) } + Button(action: { showBoard = true }) { + Image(systemName: "pin") + .font(.bitchatSystem(size: 12)) + .foregroundColor(palette.secondary.opacity(0.9)) + .headerTapTarget() + } + .buttonStyle(.plain) + .accessibilityLabel( + String(localized: "content.accessibility.board", defaultValue: "Bulletin board", comment: "Accessibility label for the bulletin board button") + ) + .help( + String(localized: "content.header.board", defaultValue: "Bulletin board: persistent notices for this channel", comment: "Tooltip for the bulletin board button") + ) + if case .location(let channel) = locationChannelsModel.selectedChannel { Button(action: { locationChannelsModel.toggleBookmark(channel.geohash) }) { Image(systemName: locationChannelsModel.isBookmarked(channel.geohash) ? "bookmark.fill" : "bookmark") @@ -242,6 +259,13 @@ struct ContentHeaderView: View { .environmentObject(locationChannelsModel) .environmentObject(peerListModel) } + .sheet(isPresented: $showBoard) { + BoardView( + geohash: boardGeohash, + senderNickname: appChromeModel.nickname, + board: appChromeModel.boardManager + ) + } .sheet(isPresented: $showLocationNotes, onDismiss: { notesGeohash = nil }) { @@ -311,6 +335,15 @@ private extension ContentHeaderView { dynamicTypeSize.isAccessibilitySize ? 2 : 1 } + /// The board scope for the current channel: the geohash channel's board, + /// or the mesh-local board ("") in mesh chat. + var boardGeohash: String { + if case .location(let channel) = locationChannelsModel.selectedChannel { + return channel.geohash + } + return "" + } + /// Whether anyone is actually reachable on the current channel — the /// state the count icon's color encodes visually. var headerPeersReachable: Bool { diff --git a/bitchatTests/Protocols/BoardPacketsTests.swift b/bitchatTests/Protocols/BoardPacketsTests.swift new file mode 100644 index 00000000..9e1ff450 --- /dev/null +++ b/bitchatTests/Protocols/BoardPacketsTests.swift @@ -0,0 +1,211 @@ +// +// BoardPacketsTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import CryptoKit +import Foundation +import Testing +@testable import bitchat + +struct BoardPacketsTests { + + private let authorKey = Curve25519.Signing.PrivateKey() + + private func makeSignedPost( + geohash: String = "9q8yy", + content: String = "water point at the north gate", + nickname: String = "ranger", + createdAt: UInt64 = 1_700_000_000_000, + lifetimeMs: UInt64 = 24 * 60 * 60 * 1000, + flags: UInt8 = 0, + signWith key: Curve25519.Signing.PrivateKey? = nil, + claimKey: Data? = nil + ) throws -> BoardPostPacket { + let signer = key ?? authorKey + let publicKey = claimKey ?? signer.publicKey.rawRepresentation + let postID = Data((0..<16).map { _ in UInt8.random(in: 0...255) }) + let expiresAt = createdAt + lifetimeMs + let signingBytes = BoardPostPacket.signingBytes( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: publicKey, + authorNickname: nickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags + ) + let signature = try signer.signature(for: signingBytes) + return BoardPostPacket( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: publicKey, + authorNickname: nickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags, + signature: signature + ) + } + + private func makeSignedTombstone( + postID: Data, + deletedAt: UInt64 = 1_700_000_100_000, + signWith key: Curve25519.Signing.PrivateKey? = nil, + claimKey: Data? = nil + ) throws -> BoardTombstonePacket { + let signer = key ?? authorKey + let publicKey = claimKey ?? signer.publicKey.rawRepresentation + let signature = try signer.signature(for: BoardTombstonePacket.signingBytes(postID: postID, deletedAt: deletedAt)) + return BoardTombstonePacket( + postID: postID, + authorSigningKey: publicKey, + deletedAt: deletedAt, + signature: signature + ) + } + + // MARK: - Round trips + + @Test func postRoundTrip() throws { + let post = try makeSignedPost(flags: BoardPostPacket.urgentFlag) + let encoded = BoardWire.post(post).encode() + let decoded = try #require(BoardWire.decode(from: encoded)) + #expect(decoded == .post(post)) + #expect(decoded.verifySignature()) + guard case .post(let roundTripped) = decoded else { + Issue.record("expected a post") + return + } + #expect(roundTripped.isUrgent) + #expect(roundTripped.geohash == "9q8yy") + } + + @Test func meshLocalPostRoundTrip() throws { + let post = try makeSignedPost(geohash: "") + let decoded = try #require(BoardWire.decode(from: BoardWire.post(post).encode())) + #expect(decoded == .post(post)) + #expect(decoded.verifySignature()) + } + + @Test func tombstoneRoundTrip() throws { + let post = try makeSignedPost() + let tombstone = try makeSignedTombstone(postID: post.postID) + let encoded = BoardWire.tombstone(tombstone).encode() + let decoded = try #require(BoardWire.decode(from: encoded)) + #expect(decoded == .tombstone(tombstone)) + #expect(decoded.verifySignature()) + } + + // MARK: - Signature verification + + @Test func forgedPostSignatureFailsVerification() throws { + // Signed by an attacker's key but claiming the victim's key as author. + let attacker = Curve25519.Signing.PrivateKey() + let victim = Curve25519.Signing.PrivateKey() + let forged = try makeSignedPost(signWith: attacker, claimKey: victim.publicKey.rawRepresentation) + let decoded = try #require(BoardWire.decode(from: BoardWire.post(forged).encode())) + #expect(!decoded.verifySignature()) + } + + @Test func tamperedContentFailsVerification() throws { + let post = try makeSignedPost(content: "meet at noon") + let tampered = BoardPostPacket( + postID: post.postID, + geohash: post.geohash, + content: "meet at midnight", + authorSigningKey: post.authorSigningKey, + authorNickname: post.authorNickname, + createdAt: post.createdAt, + expiresAt: post.expiresAt, + flags: post.flags, + signature: post.signature + ) + let decoded = try #require(BoardWire.decode(from: BoardWire.post(tampered).encode())) + #expect(!decoded.verifySignature()) + } + + @Test func forgedTombstoneSignatureFailsVerification() throws { + let post = try makeSignedPost() + let attacker = Curve25519.Signing.PrivateKey() + let forged = try makeSignedTombstone( + postID: post.postID, + signWith: attacker, + claimKey: post.authorSigningKey + ) + let decoded = try #require(BoardWire.decode(from: BoardWire.tombstone(forged).encode())) + #expect(!decoded.verifySignature()) + } + + // MARK: - Decode validation + + @Test func rejectsExpiryBeyondSevenDays() throws { + let tooLong = try makeSignedPost(lifetimeMs: BoardWireConstants.maxLifetimeMs + 1) + #expect(BoardWire.decode(from: BoardWire.post(tooLong).encode()) == nil) + + let exactlySevenDays = try makeSignedPost(lifetimeMs: BoardWireConstants.maxLifetimeMs) + #expect(BoardWire.decode(from: BoardWire.post(exactlySevenDays).encode()) != nil) + } + + @Test func rejectsExpiryBeforeCreation() throws { + let post = try makeSignedPost() + let inverted = BoardPostPacket( + postID: post.postID, + geohash: post.geohash, + content: post.content, + authorSigningKey: post.authorSigningKey, + authorNickname: post.authorNickname, + createdAt: post.expiresAt, + expiresAt: post.createdAt, + flags: post.flags, + signature: post.signature + ) + #expect(BoardWire.decode(from: BoardWire.post(inverted).encode()) == nil) + } + + @Test func rejectsOversizedContent() throws { + let oversized = try makeSignedPost(content: String(repeating: "x", count: BoardWireConstants.contentMaxBytes + 1)) + #expect(BoardWire.decode(from: BoardWire.post(oversized).encode()) == nil) + + let maxed = try makeSignedPost(content: String(repeating: "x", count: BoardWireConstants.contentMaxBytes)) + #expect(BoardWire.decode(from: BoardWire.post(maxed).encode()) != nil) + } + + @Test func rejectsInvalidGeohashCharacters() throws { + let invalid = try makeSignedPost(geohash: "9q8yA") // "A" is outside base32 + #expect(BoardWire.decode(from: BoardWire.post(invalid).encode()) == nil) + } + + @Test func toleratesUnknownTLVs() throws { + let post = try makeSignedPost() + var encoded = BoardWire.post(post).encode() + // Append an unknown TLV; decoders must skip it. + encoded.append(contentsOf: [0x7F, 0x00, 0x02, 0xDE, 0xAD]) + let decoded = try #require(BoardWire.decode(from: encoded)) + #expect(decoded == .post(post)) + #expect(decoded.verifySignature()) + } + + @Test func rejectsTruncatedPayload() throws { + let post = try makeSignedPost() + let encoded = BoardWire.post(post).encode() + #expect(BoardWire.decode(from: encoded.prefix(encoded.count - 1)) == nil) + } + + // MARK: - Urgent flag peek + + @Test func urgentFlagPeekMatchesFullDecode() throws { + let urgent = try makeSignedPost(flags: BoardPostPacket.urgentFlag) + let calm = try makeSignedPost() + let tombstone = try makeSignedTombstone(postID: calm.postID) + #expect(BoardWire.urgentFlag(in: BoardWire.post(urgent).encode())) + #expect(!BoardWire.urgentFlag(in: BoardWire.post(calm).encode())) + #expect(!BoardWire.urgentFlag(in: BoardWire.tombstone(tombstone).encode())) + #expect(!BoardWire.urgentFlag(in: Data())) + } +} diff --git a/bitchatTests/Services/BoardStoreTests.swift b/bitchatTests/Services/BoardStoreTests.swift new file mode 100644 index 00000000..5712084c --- /dev/null +++ b/bitchatTests/Services/BoardStoreTests.swift @@ -0,0 +1,277 @@ +// +// BoardStoreTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import CryptoKit +import Foundation +import Testing +@testable import bitchat + +struct BoardStoreTests { + + private final class MutableClock: @unchecked Sendable { + var now: Date + init(now: Date) { self.now = now } + } + + private let baseDate = Date(timeIntervalSince1970: 1_700_000_000) + private var baseMs: UInt64 { UInt64(baseDate.timeIntervalSince1970 * 1000) } + + private func makeStore(clock: MutableClock, fileURL: URL? = nil) -> BoardStore { + BoardStore(persistsToDisk: fileURL != nil, fileURL: fileURL, now: { clock.now }) + } + + private func tempFileURL() -> URL { + FileManager.default.temporaryDirectory + .appendingPathComponent("board-store-\(UUID().uuidString).json") + } + + private func makePost( + author: Curve25519.Signing.PrivateKey, + geohash: String = "9q8yy", + content: String = "note", + createdAt: UInt64, + lifetimeMs: UInt64 = 24 * 60 * 60 * 1000 + ) throws -> (wire: BoardWire, packet: BitchatPacket, post: BoardPostPacket) { + let postID = Data((0..<16).map { _ in UInt8.random(in: 0...255) }) + let key = author.publicKey.rawRepresentation + let expiresAt = createdAt + lifetimeMs + let signingBytes = BoardPostPacket.signingBytes( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: key, + authorNickname: "tester", + createdAt: createdAt, + expiresAt: expiresAt, + flags: 0 + ) + let post = BoardPostPacket( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: key, + authorNickname: "tester", + createdAt: createdAt, + expiresAt: expiresAt, + flags: 0, + signature: try author.signature(for: signingBytes) + ) + let wire = BoardWire.post(post) + return (wire, makePacket(payload: wire.encode(), timestamp: createdAt), post) + } + + private func makeTombstone( + for post: BoardPostPacket, + author: Curve25519.Signing.PrivateKey, + deletedAt: UInt64, + claimKey: Data? = nil + ) throws -> (wire: BoardWire, packet: BitchatPacket) { + let tombstone = BoardTombstonePacket( + postID: post.postID, + authorSigningKey: claimKey ?? author.publicKey.rawRepresentation, + deletedAt: deletedAt, + signature: try author.signature(for: BoardTombstonePacket.signingBytes(postID: post.postID, deletedAt: deletedAt)) + ) + let wire = BoardWire.tombstone(tombstone) + return (wire, makePacket(payload: wire.encode(), timestamp: deletedAt)) + } + + private func makePacket(payload: Data, timestamp: UInt64) -> BitchatPacket { + BitchatPacket( + type: MessageType.boardPost.rawValue, + senderID: Data((0..<8).map { _ in UInt8.random(in: 0...255) }), + recipientID: nil, + timestamp: timestamp, + payload: payload, + signature: nil, + ttl: 7 + ) + } + + // MARK: - Ingest basics + + @Test func ingestStoresAndDeduplicates() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs) + + #expect(store.ingest(entry.wire, packet: entry.packet) == .accepted) + #expect(store.ingest(entry.wire, packet: entry.packet) == .duplicate) + #expect(store.posts(forGeohash: "9q8yy").count == 1) + #expect(store.posts(forGeohash: "").isEmpty) + #expect(store.syncCandidates().count == 1) + } + + @Test func rejectsAlreadyExpiredPost() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs - 2 * 60 * 60 * 1000, lifetimeMs: 60 * 60 * 1000) + + #expect(store.ingest(entry.wire, packet: entry.packet) == .rejected) + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + } + + // MARK: - Caps and eviction + + @Test func perAuthorCapEvictsOldest() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + + var oldestID: Data? + for index in 0..<(BoardStore.Limits.maxPostsPerAuthor + 1) { + let entry = try makePost(author: author, createdAt: baseMs + UInt64(index) * 1000) + if index == 0 { oldestID = entry.post.postID } + #expect(store.ingest(entry.wire, packet: entry.packet) == .accepted) + } + + let posts = store.posts(forGeohash: "9q8yy") + #expect(posts.count == BoardStore.Limits.maxPostsPerAuthor) + #expect(!posts.contains { $0.postID == oldestID }) + } + + @Test func globalCapEvictsOldest() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + + var oldestID: Data? + var author = Curve25519.Signing.PrivateKey() + for index in 0..<(BoardStore.Limits.maxPosts + 1) { + if index % BoardStore.Limits.maxPostsPerAuthor == 0 { + author = Curve25519.Signing.PrivateKey() + } + let entry = try makePost(author: author, createdAt: baseMs + UInt64(index) * 1000) + if index == 0 { oldestID = entry.post.postID } + #expect(store.ingest(entry.wire, packet: entry.packet) == .accepted) + } + + let posts = store.posts(forGeohash: "9q8yy") + #expect(posts.count == BoardStore.Limits.maxPosts) + #expect(!posts.contains { $0.postID == oldestID }) + } + + // MARK: - Expiry sweep + + @Test func expiredPostsAreSwept() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let shortLived = try makePost(author: author, createdAt: baseMs, lifetimeMs: 60 * 60 * 1000) + let longLived = try makePost(author: author, createdAt: baseMs, lifetimeMs: 48 * 60 * 60 * 1000) + store.ingest(shortLived.wire, packet: shortLived.packet) + store.ingest(longLived.wire, packet: longLived.packet) + #expect(store.posts(forGeohash: "9q8yy").count == 2) + + clock.now = baseDate.addingTimeInterval(2 * 60 * 60) // 2h later + let remaining = store.posts(forGeohash: "9q8yy") + #expect(remaining.count == 1) + #expect(remaining.first?.postID == longLived.post.postID) + #expect(store.syncCandidates().count == 1) + } + + // MARK: - Tombstones + + @Test func tombstoneDeletesPostAndPropagatesUntilOriginalExpiry() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs, lifetimeMs: 24 * 60 * 60 * 1000) + store.ingest(entry.wire, packet: entry.packet) + + let tombstone = try makeTombstone(for: entry.post, author: author, deletedAt: baseMs + 1000) + #expect(store.ingest(tombstone.wire, packet: tombstone.packet) == .accepted) + + // Post is gone, tombstone still syncs so the delete propagates. + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + #expect(store.syncCandidates().count == 1) + + // Replayed copy of the deleted post is refused. + #expect(store.ingest(entry.wire, packet: entry.packet) == .rejected) + + // After the post's original expiry the tombstone is dropped too. + clock.now = baseDate.addingTimeInterval(25 * 60 * 60) + #expect(store.syncCandidates().isEmpty) + } + + @Test func tombstoneFromWrongKeyIsRejected() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let attacker = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs) + store.ingest(entry.wire, packet: entry.packet) + + // Attacker signs with their own key (self-consistent wire, so it + // passes signature verification) but targets the victim's post. + let forged = try makeTombstone(for: entry.post, author: attacker, deletedAt: baseMs + 1000) + #expect(store.ingest(forged.wire, packet: forged.packet) == .rejected) + #expect(store.posts(forGeohash: "9q8yy").count == 1) + } + + @Test func tombstoneArrivingBeforePostSuppressesIt() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs) + + let tombstone = try makeTombstone(for: entry.post, author: author, deletedAt: baseMs + 1000) + #expect(store.ingest(tombstone.wire, packet: tombstone.packet) == .accepted) + #expect(store.ingest(entry.wire, packet: entry.packet) == .rejected) + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + } + + // MARK: - Persistence and wipe + + @Test func persistsAcrossRestart() throws { + let fileURL = tempFileURL() + defer { try? FileManager.default.removeItem(at: fileURL) } + let clock = MutableClock(now: baseDate) + let author = Curve25519.Signing.PrivateKey() + + let first = makeStore(clock: clock, fileURL: fileURL) + let entry = try makePost(author: author, createdAt: baseMs) + let deleted = try makePost(author: author, createdAt: baseMs + 1) + first.ingest(entry.wire, packet: entry.packet) + first.ingest(deleted.wire, packet: deleted.packet) + let tombstone = try makeTombstone(for: deleted.post, author: author, deletedAt: baseMs + 1000) + first.ingest(tombstone.wire, packet: tombstone.packet) + + let second = makeStore(clock: clock, fileURL: fileURL) + let restored = second.posts(forGeohash: "9q8yy") + #expect(restored.count == 1) + #expect(restored.first?.postID == entry.post.postID) + // Post + tombstone both restored into sync. + #expect(second.syncCandidates().count == 2) + + // Restart after expiry drops everything. + clock.now = baseDate.addingTimeInterval(25 * 60 * 60) + let third = makeStore(clock: clock, fileURL: fileURL) + #expect(third.posts(forGeohash: "9q8yy").isEmpty) + #expect(third.syncCandidates().isEmpty) + } + + @Test func wipeClearsMemoryAndDisk() throws { + let fileURL = tempFileURL() + defer { try? FileManager.default.removeItem(at: fileURL) } + let clock = MutableClock(now: baseDate) + let author = Curve25519.Signing.PrivateKey() + + let store = makeStore(clock: clock, fileURL: fileURL) + let entry = try makePost(author: author, createdAt: baseMs) + store.ingest(entry.wire, packet: entry.packet) + #expect(FileManager.default.fileExists(atPath: fileURL.path)) + + store.wipe() + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + #expect(store.syncCandidates().isEmpty) + #expect(!FileManager.default.fileExists(atPath: fileURL.path)) + } +} diff --git a/bitchatTests/Sync/GossipSyncBoardTests.swift b/bitchatTests/Sync/GossipSyncBoardTests.swift new file mode 100644 index 00000000..acfbf127 --- /dev/null +++ b/bitchatTests/Sync/GossipSyncBoardTests.swift @@ -0,0 +1,130 @@ +// +// GossipSyncBoardTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +/// Board posts ride gossip sync through a provider that queries the board +/// store, so retention (expiry, tombstones, caps) has a single owner. +struct GossipSyncBoardTests { + + private let myPeerID = PeerID(str: "0102030405060708") + + private func makeBoardPacket(timestamp: UInt64) throws -> BitchatPacket { + BitchatPacket( + type: MessageType.boardPost.rawValue, + senderID: try #require(Data(hexString: "aabbccddeeff0011")), + recipientID: nil, + timestamp: timestamp, + payload: Data([0x42]), + signature: nil, + ttl: 7 + ) + } + + private func quietConfig() -> GossipSyncManager.Config { + var config = GossipSyncManager.Config() + config.messageSyncIntervalSeconds = 0 + config.fragmentSyncIntervalSeconds = 0 + config.fileTransferSyncIntervalSeconds = 0 + return config + } + + @Test func boardRequestIsServedFromProvider() async throws { + let manager = GossipSyncManager(myPeerID: myPeerID, config: quietConfig(), requestSyncManager: RequestSyncManager()) + let delegate = RecordingBoardDelegate() + manager.delegate = delegate + let boardPacket = try makeBoardPacket(timestamp: UInt64(Date().timeIntervalSince1970 * 1000)) + manager.boardPacketsProvider = { return [boardPacket] } + + let request = RequestSyncPacket(p: 4, m: 1, data: Data(), types: .board) + manager.handleRequestSync(from: PeerID(str: "FFFFFFFFFFFFFFFF"), request: request) + + try await TestHelpers.waitFor({ delegate.packets.count == 1 }, timeout: TestConstants.shortTimeout) + let sent = try #require(delegate.packets.first) + #expect(sent.type == MessageType.boardPost.rawValue) + #expect(sent.isRSR) + } + + @Test func nonBoardRequestDoesNotServeBoardPackets() async throws { + let manager = GossipSyncManager(myPeerID: myPeerID, config: quietConfig(), requestSyncManager: RequestSyncManager()) + let delegate = RecordingBoardDelegate() + manager.delegate = delegate + let boardPacket = try makeBoardPacket(timestamp: UInt64(Date().timeIntervalSince1970 * 1000)) + manager.boardPacketsProvider = { return [boardPacket] } + + let request = RequestSyncPacket(p: 4, m: 1, data: Data(), types: .publicMessages) + manager.handleRequestSync(from: PeerID(str: "FFFFFFFFFFFFFFFF"), request: request) + + // Follow with a board request; only its response should arrive, which + // also proves the first request produced nothing. + let boardRequest = RequestSyncPacket(p: 4, m: 1, data: Data(), types: .board) + manager.handleRequestSync(from: PeerID(str: "FFFFFFFFFFFFFFFF"), request: boardRequest) + + try await TestHelpers.waitFor({ delegate.packets.count == 1 }, timeout: TestConstants.shortTimeout) + #expect(delegate.packets.count == 1) + #expect(delegate.packets.first?.type == MessageType.boardPost.rawValue) + } + + @Test func maintenanceEmitsBoardRoundOnlyWithProvider() throws { + var config = quietConfig() + config.boardSyncIntervalSeconds = 1 + + // Without a provider the board schedule stays silent. + let unwired = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: RequestSyncManager()) + let unwiredDelegate = RecordingBoardDelegate() + unwired.delegate = unwiredDelegate + unwired._performMaintenanceSynchronously(now: Date()) + #expect(unwiredDelegate.packets.isEmpty) + + // With a provider, maintenance sends a board-typed request. + let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: RequestSyncManager()) + let delegate = RecordingBoardDelegate() + manager.delegate = delegate + manager.boardPacketsProvider = { return [] } + manager._performMaintenanceSynchronously(now: Date()) + + #expect(delegate.packets.count == 1) + let payload = try #require(delegate.packets.first?.payload) + let request = try #require(RequestSyncPacket.decode(from: payload)) + #expect(request.types == .board) + } +} + +private final class RecordingBoardDelegate: GossipSyncManager.Delegate { + private let lock = NSLock() + private var _packets: [BitchatPacket] = [] + + var packets: [BitchatPacket] { + lock.lock() + defer { lock.unlock() } + return _packets + } + + func sendPacket(_ packet: BitchatPacket) { + lock.lock() + _packets.append(packet) + lock.unlock() + } + + func sendPacket(to peerID: PeerID, packet: BitchatPacket) { + lock.lock() + _packets.append(packet) + lock.unlock() + } + + func signPacketForBroadcast(_ packet: BitchatPacket) -> BitchatPacket { + packet + } + + func getConnectedPeers() -> [PeerID] { + [] + } +} diff --git a/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift b/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift new file mode 100644 index 00000000..49fd553b --- /dev/null +++ b/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift @@ -0,0 +1,78 @@ +// +// SyncTypeFlagsBoardTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +/// The board sync flag is the first bit outside the original single byte of +/// type flags. These tests pin down the wire compatibility contract: the +/// types TLV has been a variable-length (1-8 byte) little-endian bitfield +/// since type-aware sync, so widening to two bytes must decode everywhere +/// and unknown bits must be ignored, not rejected. +struct SyncTypeFlagsBoardTests { + + @Test func boardFlagEncodesIntoSecondByte() throws { + let data = try #require(SyncTypeFlags.board.toData()) + // Little-endian: low byte first, board bit (bit 8) in byte 2. + #expect(data == Data([0x00, 0x01])) + } + + @Test func boardFlagRoundTrips() throws { + let flags = SyncTypeFlags(messageTypes: [.message, .boardPost]) + let data = try #require(flags.toData()) + let decoded = try #require(SyncTypeFlags.decode(data)) + #expect(decoded.contains(.message)) + #expect(decoded.contains(.boardPost)) + #expect(!decoded.contains(.fragment)) + #expect(Set(decoded.toMessageTypes()) == Set([.message, .boardPost])) + } + + /// An old decoder is modeled by bits it has no mapping for: the shared + /// decode path accepts the bytes and simply maps unknown bits to no + /// message type, so a board-only request reads as "nothing I can serve". + @Test func unknownBitsDecodeToNoTypes() throws { + // Bits 9-15 are unassigned; a future (or unknown) two-byte bitfield + // must decode without error and yield no known types. + let decoded = try #require(SyncTypeFlags.decode(Data([0x00, 0xFE]))) + #expect(decoded.toMessageTypes().isEmpty) + for type in [MessageType.announce, .message, .fragment, .fileTransfer, .boardPost] { + #expect(!decoded.contains(type)) + } + } + + @Test func mixedKnownAndUnknownBitsKeepKnownTypes() throws { + // Known low-byte flags survive alongside unknown high bits. + let decoded = try #require(SyncTypeFlags.decode(Data([0x03, 0xFE]))) + #expect(decoded.contains(.announce)) + #expect(decoded.contains(.message)) + #expect(Set(decoded.toMessageTypes()) == Set([.announce, .message])) + } + + @Test func requestSyncPacketRoundTripsBoardFlag() throws { + let request = RequestSyncPacket( + p: 4, + m: 128, + data: Data([0xAB, 0xCD]), + types: SyncTypeFlags(messageTypes: [.boardPost]) + ) + let decoded = try #require(RequestSyncPacket.decode(from: request.encode())) + let types = try #require(decoded.types) + #expect(types.contains(.boardPost)) + #expect(!types.contains(.message)) + } + + @Test func singleByteLegacyEncodingStillDecodes() throws { + // Requests from old clients keep the one-byte bitfield. + let decoded = try #require(SyncTypeFlags.decode(Data([0x03]))) + #expect(decoded.contains(.announce)) + #expect(decoded.contains(.message)) + #expect(!decoded.contains(.boardPost)) + } +} diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index ceac0cd0..cb708d56 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -24,7 +24,8 @@ public enum MessageType: UInt8 { // Fragmentation (simplified) case fragment = 0x20 // Single fragment type for large messages case fileTransfer = 0x22 // Binary file/audio/image payloads - + case boardPost = 0x23 // Signed geohash bulletin-board post or tombstone + public var description: String { switch self { case .announce: return "announce" @@ -36,6 +37,7 @@ public enum MessageType: UInt8 { case .noiseEncrypted: return "noiseEncrypted" case .fragment: return "fragment" case .fileTransfer: return "fileTransfer" + case .boardPost: return "boardPost" } } } From 26b247c329d81a40c320826ac8dc5c68135faf43 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 20:13:48 +0200 Subject: [PATCH 007/158] Transitive verification: vouch for verified peers over Noise When a Noise session establishes with a peer I verified and that peer advertises the .vouch capability, send signed attestations (up to 16, most recently verified first, at most once per peer per 24h) for the OTHER fingerprints I verified. Receivers accept vouches only from senders they verified themselves, verify the Ed25519 signature against the sender's announce-bound signing key, and surface the result as a new derived trust tier: vouched (unfilled seal) between casual and trusted. Protocol: - NoisePayloadType.vouch = 0x12 carries a batch of TLV attestations: voucheeFingerprint (32B), voucheeSigningKey (32B), timestamp (uint64 ms BE), Ed25519 signature over "bitchat-vouch-v1" | fingerprint | signingKey | timestamp. The voucher is implicit in the authenticated session. - PeerCapabilities.localSupported now advertises .vouch. Storage (SecureIdentityStateManager / IdentityCache): - vouches keyed by vouchee, capped at 8 vouchers each; validity is recomputed on read (voucher still verified-by-me, < 30 days old), so unverifying a voucher retires their vouches without cascade deletes. - New IdentityCache fields are Optional so pre-existing encrypted caches decode cleanly; TrustLevel.vouched is inserted mid-ladder but raw values are strings, so persisted values are unaffected (and vouched itself is never persisted). - Panic wipe clears vouch state with the rest of the identity cache. UI: unfilled checkmark.seal badge in the mesh peer list (filled seal stays exclusive to verified) and a "vouched for by N people you verified" section with voucher names in FingerprintView; VoiceOver labels and xcstrings entries included. Tests: attestation encode/decode + signature (forged/tampered/expired), accept-policy gates, batch cap, trust-level derivation incl. voucher invalidation, persistence compat, and coordinator exchange/accept policies. Full macOS suite: 1088 tests passing. Co-Authored-By: Claude Fable 5 --- bitchat/App/PeerListModel.swift | 19 +- bitchat/App/VerificationModel.swift | 30 +- bitchat/Identity/IdentityModels.swift | 41 ++- .../Identity/SecureIdentityStateManager.swift | 172 ++++++++- bitchat/Localizable.xcstrings | 70 ++++ bitchat/Protocols/BitchatProtocol.swift | 5 +- .../Protocols/PeerCapabilities+Local.swift | 2 +- bitchat/Protocols/VouchAttestation.swift | 225 ++++++++++++ bitchat/Services/BLE/BLEService.swift | 12 + bitchat/Services/Transport.swift | 15 + .../ChatTransportEventCoordinator.swift | 8 + bitchat/ViewModels/ChatViewModel.swift | 9 + bitchat/ViewModels/ChatVouchCoordinator.swift | 210 +++++++++++ bitchat/ViewModels/NostrInboundPipeline.swift | 6 +- bitchat/Views/FingerprintView.swift | 43 +++ bitchat/Views/MeshPeerList.swift | 13 + ...ransportEventCoordinatorContextTests.swift | 6 + .../ChatVouchCoordinatorContextTests.swift | 285 +++++++++++++++ bitchatTests/Mocks/MockIdentityManager.swift | 47 ++- .../Protocols/VouchAttestationTests.swift | 176 ++++++++++ ...SecureIdentityStateManagerVouchTests.swift | 326 ++++++++++++++++++ .../Services/UnifiedPeerServiceTests.swift | 33 ++ 22 files changed, 1734 insertions(+), 19 deletions(-) create mode 100644 bitchat/Protocols/VouchAttestation.swift create mode 100644 bitchat/ViewModels/ChatVouchCoordinator.swift create mode 100644 bitchatTests/ChatVouchCoordinatorContextTests.swift create mode 100644 bitchatTests/Protocols/VouchAttestationTests.swift create mode 100644 bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift diff --git a/bitchat/App/PeerListModel.swift b/bitchat/App/PeerListModel.swift index 38f20a1c..1846b487 100644 --- a/bitchat/App/PeerListModel.swift +++ b/bitchat/App/PeerListModel.swift @@ -14,6 +14,9 @@ struct MeshPeerRow: Identifiable, Equatable { let isMutualFavorite: Bool let encryptionStatus: EncryptionStatus let showsVerifiedBadgeWhenOffline: Bool + /// Vouched-for by someone I verified, without an explicit verification of + /// mine — rendered as the unfilled seal (verified gets the filled one). + let showsVouchedBadge: Bool var id: String { peerID.id } } @@ -183,13 +186,12 @@ final class PeerListModel: ObservableObject { let myPeerID = chatViewModel.meshService.myPeerID let meshRows = allPeers.map { peer in let isMe = peer.peerID == myPeerID - let verifiedBadge: Bool - if !isMe && !peer.isConnected, - let fingerprint = chatViewModel.getFingerprint(for: peer.peerID) { - verifiedBadge = peerIdentityStore.isVerified(fingerprint) - } else { - verifiedBadge = false - } + let fingerprint = isMe ? nil : chatViewModel.getFingerprint(for: peer.peerID) + let isVerifiedFingerprint = fingerprint.map { peerIdentityStore.isVerified($0) } ?? false + let verifiedBadge = !peer.isConnected && isVerifiedFingerprint + // Vouched is subordinate to verified: never show both seals. + let vouchedBadge = !isVerifiedFingerprint + && (fingerprint.map { chatViewModel.isVouchedFingerprint($0) } ?? false) return MeshPeerRow( peerID: peer.peerID, @@ -202,7 +204,8 @@ final class PeerListModel: ObservableObject { isReachable: peer.isReachable, isMutualFavorite: peer.isMutualFavorite, encryptionStatus: chatViewModel.getEncryptionStatus(for: peer.peerID), - showsVerifiedBadgeWhenOffline: verifiedBadge + showsVerifiedBadgeWhenOffline: verifiedBadge, + showsVouchedBadge: vouchedBadge ) } diff --git a/bitchat/App/VerificationModel.swift b/bitchat/App/VerificationModel.swift index bf31f05f..a1c7cd1c 100644 --- a/bitchat/App/VerificationModel.swift +++ b/bitchat/App/VerificationModel.swift @@ -9,6 +9,14 @@ struct FingerprintPresentationState: Equatable { let theirFingerprint: String? let myFingerprint: String let isVerified: Bool + /// Number of currently-valid vouches from peers the user verified + /// (0 when the peer is explicitly verified — the stronger badge wins). + let voucherCount: Int + /// Display names of the (verified) vouchers, where known. + let voucherNames: [String] + + /// Vouched for by ≥1 peer the user verified (and not explicitly verified). + var isVouched: Bool { voucherCount > 0 } var canToggleVerification: Bool { encryptionStatus == .noiseSecured || encryptionStatus == .noiseVerified @@ -82,6 +90,24 @@ final class VerificationModel: ObservableObject { let encryptionStatus = chatViewModel.getEncryptionStatus(for: statusPeerID) let theirFingerprint = chatViewModel.getFingerprint(for: statusPeerID) let peerNickname = resolveDisplayName(for: peerID, statusPeerID: statusPeerID) + let isVerified = theirFingerprint.map { peerIdentityStore.isVerified($0) } ?? false + + // Vouch state is recomputed on read: only vouchers still in the + // verified set count, so removing a verification silently retires the + // vouches that peer gave. + let vouchers: [VouchRecord] + if !isVerified, let theirFingerprint { + vouchers = chatViewModel.identityManager.validVouchers(for: theirFingerprint) + } else { + vouchers = [] + } + let voucherNames = vouchers.compactMap { record -> String? in + guard let social = chatViewModel.identityManager.getSocialIdentity(for: record.voucherFingerprint) else { + return nil + } + if let petname = social.localPetname, !petname.isEmpty { return petname } + return social.claimedNickname.isEmpty ? nil : social.claimedNickname + } return FingerprintPresentationState( statusPeerID: statusPeerID, @@ -89,7 +115,9 @@ final class VerificationModel: ObservableObject { encryptionStatus: encryptionStatus, theirFingerprint: theirFingerprint, myFingerprint: chatViewModel.getMyFingerprint(), - isVerified: theirFingerprint.map { peerIdentityStore.isVerified($0) } ?? false + isVerified: isVerified, + voucherCount: vouchers.count, + voucherNames: voucherNames ) } diff --git a/bitchat/Identity/IdentityModels.swift b/bitchat/Identity/IdentityModels.swift index ad83962f..921a071a 100644 --- a/bitchat/Identity/IdentityModels.swift +++ b/bitchat/Identity/IdentityModels.swift @@ -126,13 +126,37 @@ struct SocialIdentity: Codable { var notes: String? } +/// Trust ladder: unknown → casual → vouched → trusted → verified. +/// +/// Persistence compatibility: `TrustLevel` is stored by its *String* raw +/// value ("unknown", "casual", …), not by ordinal position, so inserting +/// `vouched` mid-ladder cannot corrupt previously persisted values — every +/// pre-existing case keeps the exact raw value it was written with. The +/// `vouched` tier is additionally never persisted into `SocialIdentity` +/// (it's recomputed on read from stored vouches), so downgraded builds never +/// encounter the unfamiliar raw value. enum TrustLevel: String, Codable { case unknown case casual + /// Transitively trusted: vouched for by at least one peer *I* verified. + /// Derived at read time — never written to persistent storage. + case vouched case trusted case verified } +// MARK: - Vouching (transitive verification) + +/// One accepted vouch: a peer I verified (the voucher) attested that they +/// verified the vouchee. Validity is recomputed on read — a record only +/// counts while its voucher remains in `verifiedFingerprints` and its +/// timestamp is within `VouchAttestation.maxAge` — so unverifying a voucher +/// silently invalidates the vouches they gave without a cascade delete. +struct VouchRecord: Codable, Equatable { + let voucherFingerprint: String + let timestamp: Date +} + // MARK: - Identity Cache /// Persistent storage for identity mappings and relationships. @@ -154,7 +178,22 @@ struct IdentityCache: Codable { // Blocked Nostr pubkeys (lowercased hex) for geohash chats var blockedNostrPubkeys: Set = [] - + + // Vouching (transitive verification). All three fields are Optional so + // caches persisted before this feature decode cleanly — the synthesized + // decoder uses decodeIfPresent for optionals, and a missing key must not + // trip the "unreadable cache" recovery path that discards everything. + + // Vouchee fingerprint -> accepted vouches (capped per vouchee) + var vouchesByVouchee: [String: [VouchRecord]]? = nil + + // Peer fingerprint -> when we last sent them a vouch batch (rate limit) + var vouchBatchSentAt: [String: Date]? = nil + + // Fingerprint -> when we verified it (orders outgoing vouch batches; + // entries verified before this field exists sort as oldest) + var verifiedAt: [String: Date]? = nil + // Schema version for future migrations var version: Int = 1 } diff --git a/bitchat/Identity/SecureIdentityStateManager.swift b/bitchat/Identity/SecureIdentityStateManager.swift index fe63f871..021ea776 100644 --- a/bitchat/Identity/SecureIdentityStateManager.swift +++ b/bitchat/Identity/SecureIdentityStateManager.swift @@ -133,6 +133,17 @@ protocol SecureIdentityStateManagerProtocol { func setVerified(fingerprint: String, verified: Bool) func isVerified(fingerprint: String) -> Bool func getVerifiedFingerprints() -> Set + + // MARK: Vouching (transitive verification) + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool + func validVouchers(for fingerprint: String) -> [VouchRecord] + func isVouched(fingerprint: String) -> Bool + func effectiveTrustLevel(for fingerprint: String) -> TrustLevel + func lastVouchBatchSent(to fingerprint: String) -> Date? + func markVouchBatchSent(to fingerprint: String, at date: Date) + func signingPublicKey(forFingerprint fingerprint: String) -> Data? + func mostRecentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] } /// Singleton manager for secure identity state persistence and retrieval. @@ -550,16 +561,20 @@ final class SecureIdentityStateManager: SecureIdentityStateManagerProtocol { queue.async(flags: .barrier) { if verified { self.cache.verifiedFingerprints.insert(fingerprint) + var verifiedAt = self.cache.verifiedAt ?? [:] + verifiedAt[fingerprint] = Date() + self.cache.verifiedAt = verifiedAt } else { self.cache.verifiedFingerprints.remove(fingerprint) + self.cache.verifiedAt?.removeValue(forKey: fingerprint) } - + // Update trust level if social identity exists if var identity = self.cache.socialIdentities[fingerprint] { identity.trustLevel = verified ? .verified : .casual self.cache.socialIdentities[fingerprint] = identity } - + self.saveIdentityCache() } } @@ -576,6 +591,159 @@ final class SecureIdentityStateManager: SecureIdentityStateManagerProtocol { } } + // MARK: - Vouching (transitive verification) + + /// Maximum vouchers retained per vouchee (most recent kept). + static let maxVouchersPerVouchee = 8 + + /// Records an accepted vouch, enforcing every accept-policy gate that can + /// be evaluated against stored state (signature verification is the + /// caller's job — it needs the sender's announce-bound signing key): + /// - the voucher must be a fingerprint *I* verified + /// - self-vouches are ignored + /// - vouches for peers I already verified are ignored (nothing to add) + /// - attestations outside the validity window are ignored + /// - at most `maxVouchersPerVouchee` vouchers are kept per vouchee + /// + /// Returns true when the vouch was stored (or refreshed). + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool { + recordVouch( + voucheeFingerprint: voucheeFingerprint, + voucherFingerprint: voucherFingerprint, + timestamp: timestamp, + now: Date() + ) + } + + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date, now: Date) -> Bool { + queue.sync(flags: .barrier) { + guard voucheeFingerprint != voucherFingerprint, + self.cache.verifiedFingerprints.contains(voucherFingerprint), + !self.cache.verifiedFingerprints.contains(voucheeFingerprint) else { + return false + } + let age = now.timeIntervalSince(timestamp) + guard age <= VouchAttestation.maxAge, age >= -VouchAttestation.maxClockSkew else { + return false + } + + var records = self.cache.vouchesByVouchee?[voucheeFingerprint] ?? [] + if let index = records.firstIndex(where: { $0.voucherFingerprint == voucherFingerprint }) { + let newest = max(records[index].timestamp, timestamp) + records[index] = VouchRecord(voucherFingerprint: voucherFingerprint, timestamp: newest) + } else { + records.append(VouchRecord(voucherFingerprint: voucherFingerprint, timestamp: timestamp)) + } + // Keep the most recent vouchers up to the cap. + records.sort { $0.timestamp > $1.timestamp } + let capped = Array(records.prefix(Self.maxVouchersPerVouchee)) + guard capped.contains(where: { $0.voucherFingerprint == voucherFingerprint }) else { + return false // Full of fresher vouches; nothing changed. + } + + var vouches = self.cache.vouchesByVouchee ?? [:] + vouches[voucheeFingerprint] = capped + self.cache.vouchesByVouchee = vouches + self.saveIdentityCache() + return true + } + } + + /// The vouches that currently count for `fingerprint`. Validity is + /// recomputed here rather than maintained by cascade deletes: a record + /// only counts while its voucher is still verified-by-me and its + /// timestamp is within the expiry window. + func validVouchers(for fingerprint: String) -> [VouchRecord] { + validVouchers(for: fingerprint, now: Date()) + } + + func validVouchers(for fingerprint: String, now: Date) -> [VouchRecord] { + queue.sync { + self.validVouchersLocked(for: fingerprint, now: now) + } + } + + /// Requires `queue`. + private func validVouchersLocked(for fingerprint: String, now: Date) -> [VouchRecord] { + guard let records = cache.vouchesByVouchee?[fingerprint] else { return [] } + return records.filter { record in + record.voucherFingerprint != fingerprint + && cache.verifiedFingerprints.contains(record.voucherFingerprint) + && now.timeIntervalSince(record.timestamp) <= VouchAttestation.maxAge + } + } + + /// True when the peer has at least one valid vouch and no explicit + /// verification of ours. + func isVouched(fingerprint: String) -> Bool { + isVouched(fingerprint: fingerprint, now: Date()) + } + + func isVouched(fingerprint: String, now: Date) -> Bool { + queue.sync { + guard !self.cache.verifiedFingerprints.contains(fingerprint) else { return false } + return !self.validVouchersLocked(for: fingerprint, now: now).isEmpty + } + } + + /// The trust level to display: explicit verification wins, then the + /// persisted level, with `vouched` layered in (derived, never persisted) + /// between `casual` and `trusted`. + func effectiveTrustLevel(for fingerprint: String) -> TrustLevel { + effectiveTrustLevel(for: fingerprint, now: Date()) + } + + func effectiveTrustLevel(for fingerprint: String, now: Date) -> TrustLevel { + queue.sync { + if self.cache.verifiedFingerprints.contains(fingerprint) { return .verified } + let stored = self.cache.socialIdentities[fingerprint]?.trustLevel ?? .unknown + let vouched = !self.validVouchersLocked(for: fingerprint, now: now).isEmpty + switch stored { + case .verified, .trusted: + return stored + case .vouched, .casual, .unknown: + if vouched { return .vouched } + // `.vouched` should never be persisted; degrade defensively. + return stored == .vouched ? .casual : stored + } + } + } + + func lastVouchBatchSent(to fingerprint: String) -> Date? { + queue.sync { cache.vouchBatchSentAt?[fingerprint] } + } + + func markVouchBatchSent(to fingerprint: String, at date: Date) { + queue.async(flags: .barrier) { + var sentAt = self.cache.vouchBatchSentAt ?? [:] + sentAt[fingerprint] = date + self.cache.vouchBatchSentAt = sentAt + self.saveIdentityCache() + } + } + + /// The peer's announce-bound Ed25519 signing key, if seen this session. + func signingPublicKey(forFingerprint fingerprint: String) -> Data? { + queue.sync { cryptographicIdentities[fingerprint]?.signingPublicKey } + } + + /// Verified fingerprints ordered most recently verified first (entries + /// without a recorded verification time sort last), excluding the given + /// fingerprint. Feeds the outgoing vouch batch. + func mostRecentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] { + queue.sync { + let verifiedAt = cache.verifiedAt ?? [:] + let ordered = cache.verifiedFingerprints + .filter { $0 != fingerprint } + .sorted { + (verifiedAt[$0] ?? .distantPast, $0) > (verifiedAt[$1] ?? .distantPast, $1) + } + return Array(ordered.prefix(limit)) + } + } + var debugNicknameIndex: [String: Set] { queue.sync { cache.nicknameIndex } } diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 7301e613..2198615b 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -22419,6 +22419,18 @@ } } }, + "fingerprint.badge.vouched" : { + "comment" : "Badge shown when a peer is vouched for by people the user verified but not directly verified", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ VOUCHED" + } + } + } + }, "fingerprint.handshake_pending" : { "extractionState" : "manual", "localizations" : { @@ -22956,6 +22968,40 @@ } } }, + "fingerprint.message.vouched_by" : { + "comment" : "How many people the user verified have vouched for this peer", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "vouched for by %#@people@ you verified" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d person" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d people" + } + } + } + } + } + } + } + } + }, "fingerprint.their_label" : { "extractionState" : "manual", "localizations" : { @@ -31924,6 +31970,18 @@ } } }, + "mesh_peers.state.vouched" : { + "comment" : "State label for a peer vouched for by someone the user verified", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "vouched" + } + } + } + }, "mesh_peers.tooltip.new_messages" : { "extractionState" : "manual", "localizations" : { @@ -32103,6 +32161,18 @@ } } }, + "mesh_peers.tooltip.vouched" : { + "comment" : "Tooltip for the vouched (unfilled seal) badge next to a peer", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "vouched for by someone you verified" + } + } + } + }, "recording %@" : { "comment" : "Voice note recording duration indicator", "localizations" : { diff --git a/bitchat/Protocols/BitchatProtocol.swift b/bitchat/Protocols/BitchatProtocol.swift index 4ebe6509..ec2ced61 100644 --- a/bitchat/Protocols/BitchatProtocol.swift +++ b/bitchat/Protocols/BitchatProtocol.swift @@ -75,7 +75,9 @@ enum NoisePayloadType: UInt8 { // Verification (QR-based OOB binding) case verifyChallenge = 0x10 // Verification challenge case verifyResponse = 0x11 // Verification response - + // Transitive verification (web of trust) + case vouch = 0x12 // Batch of vouch attestations + var description: String { switch self { case .privateMessage: return "privateMessage" @@ -83,6 +85,7 @@ enum NoisePayloadType: UInt8 { case .delivered: return "delivered" case .verifyChallenge: return "verifyChallenge" case .verifyResponse: return "verifyResponse" + case .vouch: return "vouch" } } } diff --git a/bitchat/Protocols/PeerCapabilities+Local.swift b/bitchat/Protocols/PeerCapabilities+Local.swift index 40f97b9f..29b94b4c 100644 --- a/bitchat/Protocols/PeerCapabilities+Local.swift +++ b/bitchat/Protocols/PeerCapabilities+Local.swift @@ -3,5 +3,5 @@ import BitFoundation extension PeerCapabilities { /// Capabilities this build advertises in its announce packets. /// Each feature adds its bit here when it ships. - static let localSupported: PeerCapabilities = [] + static let localSupported: PeerCapabilities = [.vouch] } diff --git a/bitchat/Protocols/VouchAttestation.swift b/bitchat/Protocols/VouchAttestation.swift new file mode 100644 index 00000000..a765a11b --- /dev/null +++ b/bitchat/Protocols/VouchAttestation.swift @@ -0,0 +1,225 @@ +// +// VouchAttestation.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import CryptoKit +import Foundation + +/// A signed statement that the *sender of the enclosing Noise payload* has +/// verified the identity described here ("transitive verification"). +/// +/// The voucher's identity is deliberately implicit: attestations only travel +/// inside an authenticated Noise session (`NoisePayloadType.vouch`), so the +/// receiver verifies the Ed25519 signature against the session peer's +/// announce-bound signing key and stores the vouch keyed by that peer's +/// fingerprint. Nothing in the attestation names the voucher, so a captured +/// attestation cannot be replayed by a third party whose signing key doesn't +/// match. +/// +/// Wire format — single attestation (TLV, 1-byte type + 1-byte length): +/// - `0x01` voucheeFingerprint: 32 bytes, SHA-256 of the vouchee's Noise static key +/// - `0x02` voucheeSigningKey: 32 bytes, Ed25519; anchors the vouch to a concrete identity +/// - `0x03` timestamp: 8 bytes big-endian, milliseconds since 1970 +/// - `0x04` signature: 64 bytes, Ed25519 by the VOUCHER's signing key over +/// `"bitchat-vouch-v1" | voucheeFingerprint | voucheeSigningKey | timestamp` +/// +/// Unknown TLV types are skipped for forward compatibility. +/// +/// Batch format (the `vouch` Noise payload body): +/// `[count: UInt8]` then per attestation `[length: UInt16 BE][attestation TLV]`. +struct VouchAttestation: Equatable { + static let signingContext = "bitchat-vouch-v1" + /// Receiver-side expiry for attestations. + static let maxAge: TimeInterval = 30 * 24 * 60 * 60 + /// Tolerated clock skew for attestations timestamped in the future. + static let maxClockSkew: TimeInterval = 60 * 60 + /// Upper bound of attestations carried/accepted in one batch payload. + static let maxBatchCount = 16 + + static let fingerprintSize = 32 + static let signingKeySize = 32 + static let signatureSize = 64 + + let voucheeFingerprint: Data // 32 bytes + let voucheeSigningKey: Data // 32 bytes + let timestampMs: UInt64 + let signature: Data // 64 bytes + + private enum TLVType: UInt8 { + case voucheeFingerprint = 0x01 + case voucheeSigningKey = 0x02 + case timestamp = 0x03 + case signature = 0x04 + } + + var voucheeFingerprintHex: String { voucheeFingerprint.hexEncodedString() } + + var timestamp: Date { Date(timeIntervalSince1970: TimeInterval(timestampMs) / 1000) } + + /// The exact bytes the voucher signs. + static func signableBytes( + voucheeFingerprint: Data, + voucheeSigningKey: Data, + timestampMs: UInt64 + ) -> Data { + var message = Data(signingContext.utf8) + message.append(voucheeFingerprint) + message.append(voucheeSigningKey) + var timestampBE = timestampMs.bigEndian + withUnsafeBytes(of: ×tampBE) { message.append(contentsOf: $0) } + return message + } + + var signableBytes: Data { + Self.signableBytes( + voucheeFingerprint: voucheeFingerprint, + voucheeSigningKey: voucheeSigningKey, + timestampMs: timestampMs + ) + } + + /// Builds and signs an attestation. `sign` is the voucher's Ed25519 + /// signing primitive (e.g. `Transport.noiseSignData`). + static func build( + voucheeFingerprint: Data, + voucheeSigningKey: Data, + timestampMs: UInt64 = UInt64(Date().timeIntervalSince1970 * 1000), + sign: (Data) -> Data? + ) -> VouchAttestation? { + guard voucheeFingerprint.count == fingerprintSize, + voucheeSigningKey.count == signingKeySize else { return nil } + let message = signableBytes( + voucheeFingerprint: voucheeFingerprint, + voucheeSigningKey: voucheeSigningKey, + timestampMs: timestampMs + ) + guard let signature = sign(message), signature.count == signatureSize else { return nil } + return VouchAttestation( + voucheeFingerprint: voucheeFingerprint, + voucheeSigningKey: voucheeSigningKey, + timestampMs: timestampMs, + signature: signature + ) + } + + /// Verifies the Ed25519 signature against the voucher's announce-bound + /// signing key. + func verifySignature(voucherSigningKey: Data) -> Bool { + guard let publicKey = try? Curve25519.Signing.PublicKey(rawRepresentation: voucherSigningKey) else { + return false + } + return publicKey.isValidSignature(signature, for: signableBytes) + } + + /// Whether the attestation is outside its validity window (older than + /// `maxAge`, or timestamped implausibly far in the future). + func isExpired(now: Date = Date()) -> Bool { + let age = now.timeIntervalSince(timestamp) + return age > Self.maxAge || age < -Self.maxClockSkew + } + + // MARK: - Encoding + + func encode() -> Data? { + guard voucheeFingerprint.count == Self.fingerprintSize, + voucheeSigningKey.count == Self.signingKeySize, + signature.count == Self.signatureSize else { return nil } + var data = Data() + func appendTLV(_ type: TLVType, _ value: Data) { + data.append(type.rawValue) + data.append(UInt8(value.count)) + data.append(value) + } + appendTLV(.voucheeFingerprint, voucheeFingerprint) + appendTLV(.voucheeSigningKey, voucheeSigningKey) + var timestampBE = timestampMs.bigEndian + appendTLV(.timestamp, withUnsafeBytes(of: ×tampBE) { Data($0) }) + appendTLV(.signature, signature) + return data + } + + static func decode(from data: Data) -> VouchAttestation? { + var fingerprint: Data? + var signingKey: Data? + var timestampMs: UInt64? + var signature: Data? + + var offset = data.startIndex + while offset < data.endIndex { + guard data.index(offset, offsetBy: 2, limitedBy: data.endIndex) != nil, + offset + 1 < data.endIndex else { return nil } + let type = data[offset] + let length = Int(data[offset + 1]) + let valueStart = offset + 2 + guard let valueEnd = data.index(valueStart, offsetBy: length, limitedBy: data.endIndex) else { + return nil + } + let value = Data(data[valueStart.. Data? { + guard !attestations.isEmpty, attestations.count <= maxBatchCount else { return nil } + var data = Data() + data.append(UInt8(attestations.count)) + for attestation in attestations { + guard let encoded = attestation.encode(), encoded.count <= Int(UInt16.max) else { return nil } + var lengthBE = UInt16(encoded.count).bigEndian + withUnsafeBytes(of: &lengthBE) { data.append(contentsOf: $0) } + data.append(encoded) + } + return data + } + + /// Decodes a batch payload, dropping malformed entries and ignoring + /// anything beyond `maxBatchCount` (sender-declared count is not trusted). + static func decodeList(from data: Data) -> [VouchAttestation] { + guard data.count > 1 else { return [] } + let declaredCount = Int(data[data.startIndex]) + let limit = min(declaredCount, maxBatchCount) + var attestations: [VouchAttestation] = [] + var offset = data.startIndex + 1 + while attestations.count < limit, offset < data.endIndex { + guard let lengthEnd = data.index(offset, offsetBy: 2, limitedBy: data.endIndex) else { break } + let length = Int(data[offset]) << 8 | Int(data[offset + 1]) + guard let entryEnd = data.index(lengthEnd, offsetBy: length, limitedBy: data.endIndex) else { break } + if let attestation = decode(from: Data(data[lengthEnd.. Void) { + // Appends to the encryption service's handler array, so this never + // displaces the callbacks installed by installNoiseSessionCallbacks. + noiseService.addOnPeerAuthenticatedHandler(handler) + } } // MARK: - GossipSyncManager Delegate diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 27c38700..04dfe90d 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -128,6 +128,18 @@ protocol Transport: AnyObject { func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) + // Vouching / transitive verification (optional for transports) + /// Capabilities the peer advertised in its last verified announce; + /// empty for peers that predate the capabilities TLV. + func peerCapabilities(_ peerID: PeerID) -> PeerCapabilities + /// Sends an encoded vouch-attestation batch inside the Noise session. + func sendVouchAttestations(_ payload: Data, to peerID: PeerID) + /// Appends a peer-authenticated observer. Unlike + /// `installNoiseSessionCallbacks` this never touches the (single-slot) + /// handshake-required callback, so secondary features can observe + /// session establishment without disturbing the primary registration. + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) + // Pending file management (BCH-01-002: files held in memory until user accepts) func acceptPendingFile(id: String) -> URL? func declinePendingFile(id: String) @@ -153,6 +165,9 @@ extension Transport { func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} + func peerCapabilities(_ peerID: PeerID) -> PeerCapabilities { [] } + func sendVouchAttestations(_ payload: Data, to peerID: PeerID) {} + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) {} func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { false } func sendFileBroadcast(_ packet: BitchatFilePacket, transferId: String) {} func sendFilePrivate(_ packet: BitchatFilePacket, to peerID: PeerID, transferId: String) {} diff --git a/bitchat/ViewModels/ChatTransportEventCoordinator.swift b/bitchat/ViewModels/ChatTransportEventCoordinator.swift index 75571b2e..a24273d7 100644 --- a/bitchat/ViewModels/ChatTransportEventCoordinator.swift +++ b/bitchat/ViewModels/ChatTransportEventCoordinator.swift @@ -71,6 +71,7 @@ protocol ChatTransportEventContext: AnyObject { // MARK: Verification payloads func handleVerifyChallengePayload(from peerID: PeerID, payload: Data) func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) + func handleVouchPayload(from peerID: PeerID, payload: Data) } extension ChatViewModel: ChatTransportEventContext { @@ -129,6 +130,10 @@ extension ChatViewModel: ChatTransportEventContext { func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) { verificationCoordinator.handleVerifyResponsePayload(from: peerID, payload: payload) } + + func handleVouchPayload(from peerID: PeerID, payload: Data) { + vouchCoordinator.handleVouchPayload(from: peerID, payload: payload) + } } final class ChatTransportEventCoordinator { @@ -371,6 +376,9 @@ private extension ChatTransportEventCoordinator { case .verifyResponse: context.handleVerifyResponsePayload(from: peerID, payload: payload) + + case .vouch: + context.handleVouchPayload(from: peerID, payload: payload) } } diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 578b6509..cedfc816 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -177,6 +177,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele lazy var nostrCoordinator = ChatNostrCoordinator(context: self) lazy var mediaTransferCoordinator = ChatMediaTransferCoordinator(context: self) lazy var verificationCoordinator = ChatVerificationCoordinator(context: self) + lazy var vouchCoordinator = ChatVouchCoordinator(context: self) // Computed properties for compatibility @MainActor @@ -1485,6 +1486,14 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele func setupNoiseCallbacks() { verificationCoordinator.setupNoiseCallbacks() + vouchCoordinator.setupNoiseCallbacks() + } + + /// Whether the fingerprint currently counts as vouched (≥1 valid vouch + /// from a voucher I verified, and no explicit verification of mine). + @MainActor + func isVouchedFingerprint(_ fingerprint: String) -> Bool { + identityManager.isVouched(fingerprint: fingerprint) } // MARK: - BitchatDelegate Methods diff --git a/bitchat/ViewModels/ChatVouchCoordinator.swift b/bitchat/ViewModels/ChatVouchCoordinator.swift new file mode 100644 index 00000000..fc13e07f --- /dev/null +++ b/bitchat/ViewModels/ChatVouchCoordinator.swift @@ -0,0 +1,210 @@ +import BitFoundation +import BitLogger +import Foundation + +/// The narrow surface `ChatVouchCoordinator` needs from its owner. +/// +/// Follows the `ChatDeliveryContext` exemplar: the coordinator depends on the +/// minimal context it actually uses instead of holding an `unowned` back-ref +/// to the whole `ChatViewModel`. This keeps the coordinator independently +/// testable (see `ChatVouchCoordinatorContextTests`) and makes its true +/// dependencies explicit. +@MainActor +protocol ChatVouchContext: AnyObject { + // MARK: Identity & trust state + func getFingerprint(for peerID: PeerID) -> String? + func isVerifiedFingerprint(_ fingerprint: String) -> Bool + /// The peer's announce-bound Ed25519 signing key, if known this session. + func signingKey(forFingerprint fingerprint: String) -> Data? + /// Verified fingerprints ordered most recently verified first. + func recentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] + /// Stores an accepted vouch (identity manager enforces the storage gates). + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool + func lastVouchBatchSent(to fingerprint: String) -> Date? + func markVouchBatchSent(to fingerprint: String, at date: Date) + + // MARK: Transport + func peerCapabilities(for peerID: PeerID) -> PeerCapabilities + /// Appends a session-established observer (additive; never displaces the + /// verification coordinator's callbacks). + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) + /// Signs `data` with our Noise (Ed25519) signing key. + func noiseSignData(_ data: Data) -> Data? + func sendVouchAttestations(_ payload: Data, to peerID: PeerID) + + // MARK: UI refresh + /// Signals that derived trust state changed so peer list / fingerprint + /// views recompute badges. + func notifyPeerTrustChanged() +} + +extension ChatViewModel: ChatVouchContext { + // `getFingerprint(for:)` and `isVerifiedFingerprint(_:)` are shared + // requirements with the verification context and satisfied by existing + // `ChatViewModel` members. The members below flatten nested service + // accesses into intent-named calls. + + func signingKey(forFingerprint fingerprint: String) -> Data? { + identityManager.signingPublicKey(forFingerprint: fingerprint) + } + + func recentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] { + identityManager.mostRecentlyVerifiedFingerprints(limit: limit, excluding: fingerprint) + } + + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool { + identityManager.recordVouch( + voucheeFingerprint: voucheeFingerprint, + voucherFingerprint: voucherFingerprint, + timestamp: timestamp + ) + } + + func lastVouchBatchSent(to fingerprint: String) -> Date? { + identityManager.lastVouchBatchSent(to: fingerprint) + } + + func markVouchBatchSent(to fingerprint: String, at date: Date) { + identityManager.markVouchBatchSent(to: fingerprint, at: date) + } + + func peerCapabilities(for peerID: PeerID) -> PeerCapabilities { + meshService.peerCapabilities(peerID) + } + + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) { + meshService.addPeerAuthenticatedObserver(handler) + } + + func noiseSignData(_ data: Data) -> Data? { + meshService.noiseSignData(data) + } + + func sendVouchAttestations(_ payload: Data, to peerID: PeerID) { + meshService.sendVouchAttestations(payload, to: peerID) + } + + func notifyPeerTrustChanged() { + // PeerListModel refreshes on this notification; the view-model change + // covers FingerprintView / VerificationModel consumers. + NotificationCenter.default.post(name: Notification.Name("peerStatusUpdated"), object: nil) + notifyUIChanged() + } +} + +/// Transitive verification ("vouching"): when a Noise session comes up with a +/// peer I verified, I attest — over that authenticated, encrypted session — +/// to the other identities I have verified. Receivers accept such vouches +/// only from peers *they* verified, giving a serverless +/// verified-by-people-you-verified tier (`TrustLevel.vouched`). +@MainActor +final class ChatVouchCoordinator { + /// Minimum spacing between vouch batches to the same peer (persisted). + static let batchInterval: TimeInterval = 24 * 60 * 60 + + private unowned let context: any ChatVouchContext + + init(context: any ChatVouchContext) { + self.context = context + } + + /// Registers the session-established hook. Additive alongside the + /// verification coordinator's callbacks; call once at bootstrap. + func setupNoiseCallbacks() { + context.addPeerAuthenticatedObserver { [weak self] peerID, fingerprint in + DispatchQueue.main.async { [weak self] in + self?.peerAuthenticated(peerID, fingerprint: fingerprint) + } + } + } + + /// Exchange policy: on session establishment with a peer I verified that + /// advertises the `.vouch` capability, send attestations for up to + /// `VouchAttestation.maxBatchCount` *other* verified fingerprints (most + /// recently verified first), at most once per peer per `batchInterval`. + func peerAuthenticated(_ peerID: PeerID, fingerprint: String, now: Date = Date()) { + guard context.isVerifiedFingerprint(fingerprint) else { return } + guard context.peerCapabilities(for: peerID).contains(.vouch) else { return } + if let lastSent = context.lastVouchBatchSent(to: fingerprint), + now.timeIntervalSince(lastSent) < Self.batchInterval { + return + } + + let candidates = context.recentlyVerifiedFingerprints( + limit: VouchAttestation.maxBatchCount, + excluding: fingerprint + ) + var attestations: [VouchAttestation] = [] + for candidate in candidates { + // Only fingerprints whose announce-bound signing key we know can + // be anchored to a concrete identity; skip the rest. + guard let fingerprintData = Data(hexString: candidate), + fingerprintData.count == VouchAttestation.fingerprintSize, + let signingKey = context.signingKey(forFingerprint: candidate), + signingKey.count == VouchAttestation.signingKeySize, + let attestation = VouchAttestation.build( + voucheeFingerprint: fingerprintData, + voucheeSigningKey: signingKey, + timestampMs: UInt64(now.timeIntervalSince1970 * 1000), + sign: context.noiseSignData + ) else { + continue + } + attestations.append(attestation) + } + + guard !attestations.isEmpty, + let payload = VouchAttestation.encodeList(attestations) else { return } + context.sendVouchAttestations(payload, to: peerID) + context.markVouchBatchSent(to: fingerprint, at: now) + SecureLogger.debug( + "🪪 Sent \(attestations.count) vouch attestation(s) to \(peerID.id.prefix(8))…", + category: .security + ) + } + + /// Accept policy: process inbound vouches only from a sender I verified, + /// only with a valid Ed25519 signature under the sender's announce-bound + /// signing key, and only within the validity window. Self-vouches and + /// vouches for already-verified peers are dropped by the identity + /// manager's storage gates. + func handleVouchPayload(from peerID: PeerID, payload: Data, now: Date = Date()) { + guard let senderFingerprint = context.getFingerprint(for: peerID), + context.isVerifiedFingerprint(senderFingerprint) else { + SecureLogger.debug( + "🪪 Ignoring vouch payload from unverified peer \(peerID.id.prefix(8))…", + category: .security + ) + return + } + guard let senderSigningKey = context.signingKey(forFingerprint: senderFingerprint) else { + SecureLogger.debug( + "🪪 No signing key for vouching peer \(peerID.id.prefix(8))…; dropping batch", + category: .security + ) + return + } + + var acceptedCount = 0 + for attestation in VouchAttestation.decodeList(from: payload) { + guard attestation.verifySignature(voucherSigningKey: senderSigningKey), + !attestation.isExpired(now: now) else { continue } + let stored = context.recordVouch( + voucheeFingerprint: attestation.voucheeFingerprintHex, + voucherFingerprint: senderFingerprint, + timestamp: attestation.timestamp + ) + if stored { acceptedCount += 1 } + } + + if acceptedCount > 0 { + SecureLogger.info( + "🪪 Accepted \(acceptedCount) vouch(es) from \(senderFingerprint.prefix(8))…", + category: .security + ) + context.notifyPeerTrustChanged() + } + } +} diff --git a/bitchat/ViewModels/NostrInboundPipeline.swift b/bitchat/ViewModels/NostrInboundPipeline.swift index 337fa474..0ebbfc7d 100644 --- a/bitchat/ViewModels/NostrInboundPipeline.swift +++ b/bitchat/ViewModels/NostrInboundPipeline.swift @@ -297,7 +297,7 @@ final class NostrInboundPipeline { context.handleDelivered(noisePayload, senderPubkey: senderPubkey, convKey: convKey) case .readReceipt: context.handleReadReceipt(noisePayload, senderPubkey: senderPubkey, convKey: convKey) - case .verifyChallenge, .verifyResponse: + case .verifyChallenge, .verifyResponse, .vouch: break } } @@ -349,7 +349,7 @@ final class NostrInboundPipeline { context.handleDelivered(payload, senderPubkey: senderPubkey, convKey: convKey) case .readReceipt: context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: convKey) - case .verifyChallenge, .verifyResponse: + case .verifyChallenge, .verifyResponse, .vouch: break } } @@ -428,7 +428,7 @@ final class NostrInboundPipeline { context.handleDelivered(payload, senderPubkey: senderPubkey, convKey: targetPeerID) case .readReceipt: context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: targetPeerID) - case .verifyChallenge, .verifyResponse: + case .verifyChallenge, .verifyResponse, .vouch: break } } diff --git a/bitchat/Views/FingerprintView.swift b/bitchat/Views/FingerprintView.swift index 06fc865f..fb4541f5 100644 --- a/bitchat/Views/FingerprintView.swift +++ b/bitchat/Views/FingerprintView.swift @@ -37,6 +37,14 @@ struct FingerprintView: View { } static let markVerified: LocalizedStringKey = "fingerprint.action.mark_verified" static let removeVerification: LocalizedStringKey = "fingerprint.action.remove_verification" + static let vouchedBadge: LocalizedStringKey = "fingerprint.badge.vouched" + static func vouchedBy(_ count: Int) -> String { + String( + format: String(localized: "fingerprint.message.vouched_by", comment: "How many people the user verified have vouched for this peer"), + locale: .current, + count + ) + } static func unknownPeer() -> String { String(localized: "common.unknown", comment: "Label for an unknown peer") } @@ -146,6 +154,41 @@ struct FingerprintView: View { } } + // Vouched (transitively verified) status: shown whenever the + // peer isn't explicitly verified but people I verified vouch + // for them, independent of the current session state. + if fingerprintState.isVouched && !fingerprintState.isVerified { + VStack(spacing: 8) { + HStack(spacing: 6) { + Image(systemName: "checkmark.seal") + .font(.bitchatSystem(size: 14)) + .foregroundColor(.teal) + Text(Strings.vouchedBadge) + .bitchatFont(size: 14, weight: .bold) + .foregroundColor(.teal) + } + .frame(maxWidth: .infinity) + + Text(Strings.vouchedBy(fingerprintState.voucherCount)) + .bitchatFont(size: 12) + .foregroundColor(textColor.opacity(0.7)) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity) + + if !fingerprintState.voucherNames.isEmpty { + Text(fingerprintState.voucherNames.joined(separator: ", ")) + .bitchatFont(size: 12) + .foregroundColor(textColor.opacity(0.7)) + .multilineTextAlignment(.center) + .lineLimit(nil) + .fixedSize(horizontal: false, vertical: true) + .frame(maxWidth: .infinity) + } + } + .padding(.top, 8) + .accessibilityElement(children: .combine) + } + // Verification status if fingerprintState.canToggleVerification { VStack(spacing: 12) { diff --git a/bitchat/Views/MeshPeerList.swift b/bitchat/Views/MeshPeerList.swift index 244cd6dc..b09ef476 100644 --- a/bitchat/Views/MeshPeerList.swift +++ b/bitchat/Views/MeshPeerList.swift @@ -25,6 +25,8 @@ struct MeshPeerList: View { static let favorite = String(localized: "mesh_peers.state.favorite", comment: "State label for a favorited peer") static let unread = String(localized: "mesh_peers.state.unread", comment: "State label for a peer with unread private messages") static let blocked = String(localized: "mesh_peers.state.blocked", comment: "State label for a blocked peer") + static let vouched = String(localized: "mesh_peers.state.vouched", comment: "State label for a peer vouched for by someone the user verified") + static let vouchedTooltip = String(localized: "mesh_peers.tooltip.vouched", comment: "Tooltip for the vouched (unfilled seal) badge next to a peer") static let addFavorite = String(localized: "content.accessibility.add_favorite", comment: "Accessibility label to add a favorite") static let removeFavorite = String(localized: "content.accessibility.remove_favorite", comment: "Accessibility label to remove a favorite") static let showFingerprint = String(localized: "mesh_peers.action.fingerprint", comment: "Context menu action that shows a peer's fingerprint/verification screen") @@ -134,6 +136,16 @@ struct MeshPeerList: View { .foregroundColor(baseColor) } } + + // Vouched (transitively verified): unfilled seal, + // deliberately distinct from verified's filled one. + // Never shown alongside a verified badge. + if peer.showsVouchedBadge { + Image(systemName: "checkmark.seal") + .font(.bitchatSystem(size: 10)) + .foregroundColor(baseColor) + .help(Strings.vouchedTooltip) + } } Spacer() @@ -241,6 +253,7 @@ struct MeshPeerList: View { parts.append(Strings.offline) } } + if peer.showsVouchedBadge { parts.append(Strings.vouched) } if peer.isFavorite { parts.append(Strings.favorite) } if peer.hasUnread { parts.append(Strings.unread) } if peer.isBlocked { parts.append(Strings.blocked) } diff --git a/bitchatTests/ChatTransportEventCoordinatorContextTests.swift b/bitchatTests/ChatTransportEventCoordinatorContextTests.swift index 1c1fc46f..bd112e9b 100644 --- a/bitchatTests/ChatTransportEventCoordinatorContextTests.swift +++ b/bitchatTests/ChatTransportEventCoordinatorContextTests.swift @@ -156,6 +156,12 @@ private final class MockChatTransportEventContext: ChatTransportEventContext { func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) { verifyResponsePayloads.append((peerID, payload)) } + + private(set) var vouchPayloads: [(peerID: PeerID, payload: Data)] = [] + + func handleVouchPayload(from peerID: PeerID, payload: Data) { + vouchPayloads.append((peerID, payload)) + } } // MARK: - Helpers diff --git a/bitchatTests/ChatVouchCoordinatorContextTests.swift b/bitchatTests/ChatVouchCoordinatorContextTests.swift new file mode 100644 index 00000000..0602b7ef --- /dev/null +++ b/bitchatTests/ChatVouchCoordinatorContextTests.swift @@ -0,0 +1,285 @@ +// +// ChatVouchCoordinatorContextTests.swift +// bitchatTests +// +// Exercises `ChatVouchCoordinator` against a mock `ChatVouchContext` — +// proving the exchange policy (verified + capable peers only, batch cap, +// 24h rate limit) and the accept policy (verified senders only, real +// Ed25519 signature verification, expiry) without a `ChatViewModel`. +// Storage-level gates (self-vouch, already-verified vouchee, per-vouchee +// cap) are covered by `SecureIdentityStateManagerVouchTests`. +// + +import CryptoKit +import Foundation +import BitFoundation +import Testing + +@testable import bitchat + +// MARK: - Mock Context + +@MainActor +private final class MockChatVouchContext: ChatVouchContext { + // Identity & trust state + var fingerprintsByPeerID: [PeerID: String] = [:] + var verifiedFingerprints: Set = [] + var signingKeysByFingerprint: [String: Data] = [:] + var recentVerified: [String] = [] + private(set) var recentVerifiedRequests: [(limit: Int, excluding: String)] = [] + private(set) var recordedVouches: [(vouchee: String, voucher: String, timestamp: Date)] = [] + var recordVouchResult = true + var lastBatchSentAt: [String: Date] = [:] + private(set) var markedBatchSent: [(fingerprint: String, date: Date)] = [] + + func getFingerprint(for peerID: PeerID) -> String? { fingerprintsByPeerID[peerID] } + func isVerifiedFingerprint(_ fingerprint: String) -> Bool { verifiedFingerprints.contains(fingerprint) } + func signingKey(forFingerprint fingerprint: String) -> Data? { signingKeysByFingerprint[fingerprint] } + + func recentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] { + recentVerifiedRequests.append((limit, fingerprint)) + return Array(recentVerified.filter { $0 != fingerprint }.prefix(limit)) + } + + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool { + recordedVouches.append((voucheeFingerprint, voucherFingerprint, timestamp)) + return recordVouchResult + } + + func lastVouchBatchSent(to fingerprint: String) -> Date? { lastBatchSentAt[fingerprint] } + + func markVouchBatchSent(to fingerprint: String, at date: Date) { + markedBatchSent.append((fingerprint, date)) + lastBatchSentAt[fingerprint] = date + } + + // Transport + var capabilitiesByPeerID: [PeerID: PeerCapabilities] = [:] + var mySigningKey = Curve25519.Signing.PrivateKey() + private(set) var installedObservers: [(PeerID, String) -> Void] = [] + private(set) var sentVouchPayloads: [(payload: Data, peerID: PeerID)] = [] + + func peerCapabilities(for peerID: PeerID) -> PeerCapabilities { capabilitiesByPeerID[peerID] ?? [] } + + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) { + installedObservers.append(handler) + } + + func noiseSignData(_ data: Data) -> Data? { try? mySigningKey.signature(for: data) } + + func sendVouchAttestations(_ payload: Data, to peerID: PeerID) { + sentVouchPayloads.append((payload, peerID)) + } + + // UI refresh + private(set) var trustChangedCount = 0 + + func notifyPeerTrustChanged() { trustChangedCount += 1 } +} + +// MARK: - Tests + +struct ChatVouchCoordinatorContextTests { + private let peerID = PeerID(str: "1122334455667788") + private let peerFingerprint = String(repeating: "0f", count: 32) + + @MainActor + private func makeVerifiedCapablePeer() -> (MockChatVouchContext, ChatVouchCoordinator) { + let context = MockChatVouchContext() + let coordinator = ChatVouchCoordinator(context: context) + context.fingerprintsByPeerID[peerID] = peerFingerprint + context.verifiedFingerprints.insert(peerFingerprint) + context.capabilitiesByPeerID[peerID] = [.vouch] + return (context, coordinator) + } + + // MARK: Exchange policy + + @Test @MainActor + func peerAuthenticated_sendsBatchForVerifiedCapablePeer() throws { + let (context, coordinator) = makeVerifiedCapablePeer() + let vouchees = [String(repeating: "01", count: 32), String(repeating: "02", count: 32)] + context.recentVerified = vouchees + for vouchee in vouchees { + context.signingKeysByFingerprint[vouchee] = Data(repeating: 0x33, count: 32) + } + + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint) + + // Candidates are requested most-recent-first, excluding the target. + #expect(context.recentVerifiedRequests.count == 1) + #expect(context.recentVerifiedRequests.first?.limit == VouchAttestation.maxBatchCount) + #expect(context.recentVerifiedRequests.first?.excluding == peerFingerprint) + + let sent = try #require(context.sentVouchPayloads.first) + #expect(sent.peerID == peerID) + let attestations = VouchAttestation.decodeList(from: sent.payload) + #expect(attestations.map(\.voucheeFingerprintHex) == vouchees) + // Every attestation carries a valid signature under our signing key. + let myPublicKey = context.mySigningKey.publicKey.rawRepresentation + #expect(attestations.allSatisfy { $0.verifySignature(voucherSigningKey: myPublicKey) }) + + // The rate limit is stamped only after an actual send. + #expect(context.markedBatchSent.map(\.fingerprint) == [peerFingerprint]) + } + + @Test @MainActor + func peerAuthenticated_requiresVerificationAndCapability() { + let (context, coordinator) = makeVerifiedCapablePeer() + context.recentVerified = [String(repeating: "01", count: 32)] + context.signingKeysByFingerprint[context.recentVerified[0]] = Data(repeating: 0x33, count: 32) + + // Not verified by me: nothing. + context.verifiedFingerprints.remove(peerFingerprint) + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint) + #expect(context.sentVouchPayloads.isEmpty) + + // Verified but no .vouch capability: nothing. + context.verifiedFingerprints.insert(peerFingerprint) + context.capabilitiesByPeerID[peerID] = [] + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint) + #expect(context.sentVouchPayloads.isEmpty) + #expect(context.markedBatchSent.isEmpty) + } + + @Test @MainActor + func peerAuthenticated_rateLimitsPerPeerPer24Hours() { + let (context, coordinator) = makeVerifiedCapablePeer() + context.recentVerified = [String(repeating: "01", count: 32)] + context.signingKeysByFingerprint[context.recentVerified[0]] = Data(repeating: 0x33, count: 32) + + let now = Date() + context.lastBatchSentAt[peerFingerprint] = now.addingTimeInterval(-60 * 60) + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint, now: now) + #expect(context.sentVouchPayloads.isEmpty) + + // Once the interval has elapsed the batch goes out again. + context.lastBatchSentAt[peerFingerprint] = now.addingTimeInterval(-ChatVouchCoordinator.batchInterval - 1) + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint, now: now) + #expect(context.sentVouchPayloads.count == 1) + } + + @Test @MainActor + func peerAuthenticated_skipsCandidatesWithoutSigningKeysAndEmptyBatches() { + let (context, coordinator) = makeVerifiedCapablePeer() + let withKey = String(repeating: "01", count: 32) + let withoutKey = String(repeating: "02", count: 32) + context.recentVerified = [withoutKey, withKey] + context.signingKeysByFingerprint[withKey] = Data(repeating: 0x33, count: 32) + + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint) + let attestations = VouchAttestation.decodeList(from: context.sentVouchPayloads[0].payload) + #expect(attestations.map(\.voucheeFingerprintHex) == [withKey]) + + // No signable candidates at all: nothing is sent or rate-stamped. + let freshPeer = PeerID(str: "aabbccddeeff0011") + let freshFingerprint = String(repeating: "0e", count: 32) + context.fingerprintsByPeerID[freshPeer] = freshFingerprint + context.verifiedFingerprints.insert(freshFingerprint) + context.capabilitiesByPeerID[freshPeer] = [.vouch] + context.recentVerified = [withoutKey] + coordinator.peerAuthenticated(freshPeer, fingerprint: freshFingerprint) + #expect(context.sentVouchPayloads.count == 1) + #expect(!context.markedBatchSent.contains { $0.fingerprint == freshFingerprint }) + } + + // MARK: Accept policy + + @MainActor + private func makeInboundBatch( + signedBy key: Curve25519.Signing.PrivateKey, + vouchee: String = String(repeating: "07", count: 32), + timestampMs: UInt64 = UInt64(Date().timeIntervalSince1970 * 1000) + ) throws -> Data { + let voucheeData = try #require(Data(hexString: vouchee)) + let attestation = try #require(VouchAttestation.build( + voucheeFingerprint: voucheeData, + voucheeSigningKey: Data(repeating: 0x44, count: 32), + timestampMs: timestampMs, + sign: { try? key.signature(for: $0) } + )) + return try #require(VouchAttestation.encodeList([attestation])) + } + + @Test @MainActor + func handleVouchPayload_acceptsValidVouchFromVerifiedSender() throws { + let (context, coordinator) = makeVerifiedCapablePeer() + let senderKey = Curve25519.Signing.PrivateKey() + context.signingKeysByFingerprint[peerFingerprint] = senderKey.publicKey.rawRepresentation + + let vouchee = String(repeating: "07", count: 32) + let payload = try makeInboundBatch(signedBy: senderKey, vouchee: vouchee) + coordinator.handleVouchPayload(from: peerID, payload: payload) + + #expect(context.recordedVouches.count == 1) + #expect(context.recordedVouches.first?.vouchee == vouchee) + #expect(context.recordedVouches.first?.voucher == peerFingerprint) + #expect(context.trustChangedCount == 1) + } + + @Test @MainActor + func handleVouchPayload_rejectsUnverifiedOrUnknownSender() throws { + let (context, coordinator) = makeVerifiedCapablePeer() + let senderKey = Curve25519.Signing.PrivateKey() + context.signingKeysByFingerprint[peerFingerprint] = senderKey.publicKey.rawRepresentation + let payload = try makeInboundBatch(signedBy: senderKey) + + // Sender's fingerprint is not in my verified set. + context.verifiedFingerprints.remove(peerFingerprint) + coordinator.handleVouchPayload(from: peerID, payload: payload) + #expect(context.recordedVouches.isEmpty) + + // Unknown peer entirely. + coordinator.handleVouchPayload(from: PeerID(str: "ffeeddccbbaa9988"), payload: payload) + #expect(context.recordedVouches.isEmpty) + #expect(context.trustChangedCount == 0) + } + + @Test @MainActor + func handleVouchPayload_rejectsForgedSignaturesAndExpiredAttestations() throws { + let (context, coordinator) = makeVerifiedCapablePeer() + let senderKey = Curve25519.Signing.PrivateKey() + context.signingKeysByFingerprint[peerFingerprint] = senderKey.publicKey.rawRepresentation + + // Signed by an imposter key: signature check against the sender's + // announce-bound key fails. + let imposter = Curve25519.Signing.PrivateKey() + let forged = try makeInboundBatch(signedBy: imposter) + coordinator.handleVouchPayload(from: peerID, payload: forged) + #expect(context.recordedVouches.isEmpty) + + // Correctly signed but expired. + let staleMs = UInt64(Date().addingTimeInterval(-31 * 24 * 60 * 60).timeIntervalSince1970 * 1000) + let expired = try makeInboundBatch(signedBy: senderKey, timestampMs: staleMs) + coordinator.handleVouchPayload(from: peerID, payload: expired) + #expect(context.recordedVouches.isEmpty) + #expect(context.trustChangedCount == 0) + + // No signing key known for the sender: batch dropped. + context.signingKeysByFingerprint.removeValue(forKey: peerFingerprint) + let valid = try makeInboundBatch(signedBy: senderKey) + coordinator.handleVouchPayload(from: peerID, payload: valid) + #expect(context.recordedVouches.isEmpty) + } + + @Test @MainActor + func handleVouchPayload_skipsUIRefreshWhenNothingStored() throws { + let (context, coordinator) = makeVerifiedCapablePeer() + let senderKey = Curve25519.Signing.PrivateKey() + context.signingKeysByFingerprint[peerFingerprint] = senderKey.publicKey.rawRepresentation + context.recordVouchResult = false // e.g. self-vouch dropped by the store + + let payload = try makeInboundBatch(signedBy: senderKey) + coordinator.handleVouchPayload(from: peerID, payload: payload) + #expect(context.recordedVouches.count == 1) + #expect(context.trustChangedCount == 0) + } + + @Test @MainActor + func setupNoiseCallbacks_installsAdditiveObserver() { + let (context, coordinator) = makeVerifiedCapablePeer() + coordinator.setupNoiseCallbacks() + #expect(context.installedObservers.count == 1) + } +} diff --git a/bitchatTests/Mocks/MockIdentityManager.swift b/bitchatTests/Mocks/MockIdentityManager.swift index 633c388b..1ff1926a 100644 --- a/bitchatTests/Mocks/MockIdentityManager.swift +++ b/bitchatTests/Mocks/MockIdentityManager.swift @@ -107,12 +107,55 @@ final class MockIdentityManager: SecureIdentityStateManagerProtocol { func removeEphemeralSession(peerID: PeerID) {} func setVerified(fingerprint: String, verified: Bool) {} - + func isVerified(fingerprint: String) -> Bool { true } - + func getVerifiedFingerprints() -> Set { Set() } + + // MARK: Vouching (transitive verification) + + private var vouchesByVouchee: [String: [VouchRecord]] = [:] + private var vouchBatchSentAt: [String: Date] = [:] + + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool { + guard voucheeFingerprint != voucherFingerprint else { return false } + var records = vouchesByVouchee[voucheeFingerprint] ?? [] + records.removeAll { $0.voucherFingerprint == voucherFingerprint } + records.append(VouchRecord(voucherFingerprint: voucherFingerprint, timestamp: timestamp)) + vouchesByVouchee[voucheeFingerprint] = records + return true + } + + func validVouchers(for fingerprint: String) -> [VouchRecord] { + vouchesByVouchee[fingerprint] ?? [] + } + + func isVouched(fingerprint: String) -> Bool { + !(vouchesByVouchee[fingerprint] ?? []).isEmpty + } + + func effectiveTrustLevel(for fingerprint: String) -> TrustLevel { + socialIdentities[fingerprint]?.trustLevel ?? .unknown + } + + func lastVouchBatchSent(to fingerprint: String) -> Date? { + vouchBatchSentAt[fingerprint] + } + + func markVouchBatchSent(to fingerprint: String, at date: Date) { + vouchBatchSentAt[fingerprint] = date + } + + func signingPublicKey(forFingerprint fingerprint: String) -> Data? { + nil + } + + func mostRecentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] { + [] + } } diff --git a/bitchatTests/Protocols/VouchAttestationTests.swift b/bitchatTests/Protocols/VouchAttestationTests.swift new file mode 100644 index 00000000..064cf4d8 --- /dev/null +++ b/bitchatTests/Protocols/VouchAttestationTests.swift @@ -0,0 +1,176 @@ +import CryptoKit +import Foundation +import Testing + +@testable import bitchat + +struct VouchAttestationTests { + private let voucherKey = Curve25519.Signing.PrivateKey() + + private func makeAttestation( + fingerprint: Data = Data(repeating: 0xAA, count: 32), + signingKey: Data = Data(repeating: 0xBB, count: 32), + timestampMs: UInt64 = UInt64(Date().timeIntervalSince1970 * 1000), + signedBy key: Curve25519.Signing.PrivateKey? = nil + ) throws -> VouchAttestation { + let signer = key ?? voucherKey + return try #require( + VouchAttestation.build( + voucheeFingerprint: fingerprint, + voucheeSigningKey: signingKey, + timestampMs: timestampMs, + sign: { try? signer.signature(for: $0) } + ) + ) + } + + @Test + func roundTripsAndVerifiesSignature() throws { + let attestation = try makeAttestation() + let encoded = try #require(attestation.encode()) + let decoded = try #require(VouchAttestation.decode(from: encoded)) + + #expect(decoded == attestation) + #expect(decoded.voucheeFingerprintHex == String(repeating: "aa", count: 32)) + #expect(decoded.verifySignature(voucherSigningKey: voucherKey.publicKey.rawRepresentation)) + } + + @Test + func decodeSkipsUnknownTLVsAndRejectsMalformedInput() throws { + let attestation = try makeAttestation() + var encoded = try #require(attestation.encode()) + + // Unknown TLV appended: skipped for forward compatibility. + encoded.append(contentsOf: [0x7F, 0x02, 0x01, 0x02]) + #expect(VouchAttestation.decode(from: encoded) == attestation) + + // Truncation and missing fields are rejected. + #expect(VouchAttestation.decode(from: encoded.dropLast()) == nil) + #expect(VouchAttestation.decode(from: Data([0x01, 0x20])) == nil) + #expect(VouchAttestation.decode(from: Data()) == nil) + + // Wrong field sizes are rejected. + var wrongSize = Data([0x01, 0x10]) + wrongSize.append(Data(repeating: 0xAA, count: 16)) + #expect(VouchAttestation.decode(from: wrongSize) == nil) + } + + @Test + func buildRejectsWrongKeyAndFingerprintSizes() { + let sign: (Data) -> Data? = { try? self.voucherKey.signature(for: $0) } + #expect(VouchAttestation.build( + voucheeFingerprint: Data(repeating: 0xAA, count: 16), + voucheeSigningKey: Data(repeating: 0xBB, count: 32), + sign: sign + ) == nil) + #expect(VouchAttestation.build( + voucheeFingerprint: Data(repeating: 0xAA, count: 32), + voucheeSigningKey: Data(repeating: 0xBB, count: 16), + sign: sign + ) == nil) + } + + @Test + func forgedSignatureFailsVerification() throws { + let attestation = try makeAttestation() + let otherKey = Curve25519.Signing.PrivateKey() + + // Verifying against a key that didn't sign fails. + #expect(!attestation.verifySignature(voucherSigningKey: otherKey.publicKey.rawRepresentation)) + + // An attestation signed by an imposter fails against the real key. + let forged = try makeAttestation(signedBy: otherKey) + #expect(!forged.verifySignature(voucherSigningKey: voucherKey.publicKey.rawRepresentation)) + #expect(!attestation.verifySignature(voucherSigningKey: Data(repeating: 0x01, count: 3))) + } + + @Test + func tamperedFieldsFailVerification() throws { + let attestation = try makeAttestation() + let publicKey = voucherKey.publicKey.rawRepresentation + + var tamperedFingerprint = attestation.voucheeFingerprint + tamperedFingerprint[0] ^= 0xFF + let tampered = VouchAttestation( + voucheeFingerprint: tamperedFingerprint, + voucheeSigningKey: attestation.voucheeSigningKey, + timestampMs: attestation.timestampMs, + signature: attestation.signature + ) + #expect(!tampered.verifySignature(voucherSigningKey: publicKey)) + + let backdated = VouchAttestation( + voucheeFingerprint: attestation.voucheeFingerprint, + voucheeSigningKey: attestation.voucheeSigningKey, + timestampMs: attestation.timestampMs - 1, + signature: attestation.signature + ) + #expect(!backdated.verifySignature(voucherSigningKey: publicKey)) + } + + @Test + func expiryWindowIsEnforced() throws { + let now = Date() + let fresh = try makeAttestation(timestampMs: UInt64(now.timeIntervalSince1970 * 1000)) + #expect(!fresh.isExpired(now: now)) + + let thirtyOneDaysAgo = now.addingTimeInterval(-31 * 24 * 60 * 60) + let expired = try makeAttestation(timestampMs: UInt64(thirtyOneDaysAgo.timeIntervalSince1970 * 1000)) + #expect(expired.isExpired(now: now)) + + let farFuture = now.addingTimeInterval(2 * 60 * 60) + let fromTheFuture = try makeAttestation(timestampMs: UInt64(farFuture.timeIntervalSince1970 * 1000)) + #expect(fromTheFuture.isExpired(now: now)) + + // A verified-but-expired attestation still has a valid signature; the + // two checks are independent gates. + #expect(expired.verifySignature(voucherSigningKey: voucherKey.publicKey.rawRepresentation)) + } + + @Test + func batchRoundTripsAndEnforcesCap() throws { + let attestations = try (0..<3).map { index in + try makeAttestation(fingerprint: Data(repeating: UInt8(index + 1), count: 32)) + } + let payload = try #require(VouchAttestation.encodeList(attestations)) + #expect(VouchAttestation.decodeList(from: payload) == attestations) + + #expect(VouchAttestation.encodeList([]) == nil) + + let tooMany = try (0..<17).map { index in + try makeAttestation(fingerprint: Data(repeating: UInt8(index + 1), count: 32)) + } + #expect(VouchAttestation.encodeList(tooMany) == nil) + } + + @Test + func decodeListIgnoresEntriesBeyondCapAndMalformedEntries() throws { + let attestations = try (0..<17).map { index in + try makeAttestation(fingerprint: Data(repeating: UInt8(index + 1), count: 32)) + } + // Hand-build an oversized batch that lies about its count. + var payload = Data([UInt8(attestations.count)]) + for attestation in attestations { + let encoded = try #require(attestation.encode()) + payload.append(UInt8(encoded.count >> 8)) + payload.append(UInt8(encoded.count & 0xFF)) + payload.append(encoded) + } + let decoded = VouchAttestation.decodeList(from: payload) + #expect(decoded.count == VouchAttestation.maxBatchCount) + #expect(decoded == Array(attestations.prefix(VouchAttestation.maxBatchCount))) + + // A malformed middle entry is dropped without killing the batch. + let good = try makeAttestation() + let goodEncoded = try #require(good.encode()) + var mixed = Data([2]) + mixed.append(contentsOf: [0x00, 0x03, 0xDE, 0xAD, 0xBE]) + mixed.append(UInt8(goodEncoded.count >> 8)) + mixed.append(UInt8(goodEncoded.count & 0xFF)) + mixed.append(goodEncoded) + #expect(VouchAttestation.decodeList(from: mixed) == [good]) + + #expect(VouchAttestation.decodeList(from: Data()) == []) + #expect(VouchAttestation.decodeList(from: Data([5])) == []) + } +} diff --git a/bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift b/bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift new file mode 100644 index 00000000..9984e09f --- /dev/null +++ b/bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift @@ -0,0 +1,326 @@ +import Foundation +import Testing + +@testable import bitchat + +/// Vouch storage, accept-policy gates, derived trust levels, and persistence +/// compatibility for `SecureIdentityStateManager`. +/// +/// Ordering note: mutations use barrier blocks on the manager's concurrent +/// queue and reads use `queue.sync`, so a read submitted after a mutation +/// always observes it — no polling needed. +struct SecureIdentityStateManagerVouchTests { + private let voucher = String(repeating: "0a", count: 32) + private let vouchee = String(repeating: "0b", count: 32) + + private func makeManager() -> SecureIdentityStateManager { + SecureIdentityStateManager(MockKeychain()) + } + + // MARK: - Accept-policy gates + + @Test + func recordVouch_rejectsUnverifiedVoucher() { + let manager = makeManager() + + #expect(!manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date())) + #expect(manager.validVouchers(for: vouchee).isEmpty) + + manager.setVerified(fingerprint: voucher, verified: true) + #expect(manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date())) + #expect(manager.validVouchers(for: vouchee).count == 1) + } + + @Test + func recordVouch_ignoresSelfVouch() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + + #expect(!manager.recordVouch(voucheeFingerprint: voucher, voucherFingerprint: voucher, timestamp: Date())) + #expect(manager.validVouchers(for: voucher).isEmpty) + } + + @Test + func recordVouch_ignoresAlreadyVerifiedVouchee() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + manager.setVerified(fingerprint: vouchee, verified: true) + + #expect(!manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date())) + #expect(!manager.isVouched(fingerprint: vouchee)) + } + + @Test + func recordVouch_rejectsStaleAndFarFutureTimestamps() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + + let stale = Date().addingTimeInterval(-31 * 24 * 60 * 60) + #expect(!manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: stale)) + + let farFuture = Date().addingTimeInterval(2 * 60 * 60) + #expect(!manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: farFuture)) + + #expect(manager.validVouchers(for: vouchee).isEmpty) + } + + @Test + func recordVouch_capsVouchersPerVoucheeKeepingMostRecent() { + let manager = makeManager() + let base = Date() + + // 9 verified vouchers vouch with strictly increasing timestamps. + let vouchers = (0..<9).map { String(format: "%02x", $0 + 0x10) + String(repeating: "00", count: 31) } + for (index, voucherFingerprint) in vouchers.enumerated() { + manager.setVerified(fingerprint: voucherFingerprint, verified: true) + let stored = manager.recordVouch( + voucheeFingerprint: vouchee, + voucherFingerprint: voucherFingerprint, + timestamp: base.addingTimeInterval(TimeInterval(index)), + now: base.addingTimeInterval(TimeInterval(index)) + ) + #expect(stored) + } + + let records = manager.validVouchers(for: vouchee) + #expect(records.count == SecureIdentityStateManager.maxVouchersPerVouchee) + // The oldest voucher fell off the end. + #expect(!records.contains { $0.voucherFingerprint == vouchers[0] }) + #expect(records.contains { $0.voucherFingerprint == vouchers[8] }) + + // An attestation older than everything retained is not stored. + let older = String(repeating: "0c", count: 32) + manager.setVerified(fingerprint: older, verified: true) + #expect(!manager.recordVouch( + voucheeFingerprint: vouchee, + voucherFingerprint: older, + timestamp: base.addingTimeInterval(-1), + now: base + )) + + // A repeat vouch from a retained voucher refreshes, not duplicates. + #expect(manager.recordVouch( + voucheeFingerprint: vouchee, + voucherFingerprint: vouchers[8], + timestamp: base.addingTimeInterval(100), + now: base.addingTimeInterval(100) + )) + #expect(manager.validVouchers(for: vouchee).count == SecureIdentityStateManager.maxVouchersPerVouchee) + } + + // MARK: - Derived trust & invalidation + + @Test + func unverifyingVoucher_invalidatesTheirVouchesWithoutDeletingThem() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date()) + #expect(manager.isVouched(fingerprint: vouchee)) + + // Removing my verification of the voucher retires their vouches… + manager.setVerified(fingerprint: voucher, verified: false) + #expect(!manager.isVouched(fingerprint: vouchee)) + #expect(manager.validVouchers(for: vouchee).isEmpty) + + // …but the records survive: re-verifying the voucher restores them + // (recompute on read, no cascade delete). + manager.setVerified(fingerprint: voucher, verified: true) + #expect(manager.isVouched(fingerprint: vouchee)) + } + + @Test + func validVouchers_expireAtReadTime() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + + let now = Date() + let timestamp = now.addingTimeInterval(-29 * 24 * 60 * 60) + #expect(manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: timestamp, now: now)) + #expect(manager.isVouched(fingerprint: vouchee, now: now)) + + let twoDaysLater = now.addingTimeInterval(2 * 24 * 60 * 60) + #expect(manager.validVouchers(for: vouchee, now: twoDaysLater).isEmpty) + #expect(!manager.isVouched(fingerprint: vouchee, now: twoDaysLater)) + } + + @Test + func effectiveTrustLevel_slotsVouchedBetweenCasualAndTrusted() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + + // Unknown peer with a valid vouch reads as vouched. + #expect(manager.effectiveTrustLevel(for: vouchee) == .unknown) + manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date()) + #expect(manager.effectiveTrustLevel(for: vouchee) == .vouched) + + // Explicit trust outranks a vouch. + manager.updateSocialIdentity(SocialIdentity( + fingerprint: vouchee, + localPetname: nil, + claimedNickname: "bob", + trustLevel: .trusted, + isFavorite: false, + isBlocked: false, + notes: nil + )) + #expect(manager.effectiveTrustLevel(for: vouchee) == .trusted) + + // Explicit verification outranks everything. + manager.setVerified(fingerprint: vouchee, verified: true) + #expect(manager.effectiveTrustLevel(for: vouchee) == .verified) + #expect(!manager.isVouched(fingerprint: vouchee)) + + // Losing the voucher downgrades vouched back to the stored level. + manager.setVerified(fingerprint: vouchee, verified: false) + manager.setVerified(fingerprint: voucher, verified: false) + #expect(manager.effectiveTrustLevel(for: vouchee) == .casual) + } + + // MARK: - Exchange-policy state + + @Test + func mostRecentlyVerifiedFingerprints_ordersAndExcludes() { + let manager = makeManager() + let first = String(repeating: "01", count: 32) + let second = String(repeating: "02", count: 32) + let third = String(repeating: "03", count: 32) + manager.setVerified(fingerprint: first, verified: true) + manager.setVerified(fingerprint: second, verified: true) + manager.setVerified(fingerprint: third, verified: true) + + let ordered = manager.mostRecentlyVerifiedFingerprints(limit: 16, excluding: third) + #expect(ordered == [second, first]) + + let limited = manager.mostRecentlyVerifiedFingerprints(limit: 1, excluding: third) + #expect(limited == [second]) + } + + @Test + func vouchBatchSentAt_roundTrips() { + let manager = makeManager() + #expect(manager.lastVouchBatchSent(to: voucher) == nil) + + let sentAt = Date(timeIntervalSince1970: 1_700_000_000) + manager.markVouchBatchSent(to: voucher, at: sentAt) + #expect(manager.lastVouchBatchSent(to: voucher) == sentAt) + } + + @Test + func signingPublicKey_returnsAnnounceBoundKeyByFingerprint() async { + let manager = makeManager() + let signingKey = Data(repeating: 0x22, count: 32) + manager.upsertCryptographicIdentity( + fingerprint: voucher, + noisePublicKey: Data(repeating: 0x11, count: 32), + signingPublicKey: signingKey, + claimedNickname: nil + ) + + let stored = await waitUntil { manager.signingPublicKey(forFingerprint: voucher) == signingKey } + #expect(stored) + #expect(manager.signingPublicKey(forFingerprint: vouchee) == nil) + } + + // MARK: - Panic wipe + + @Test + func clearAllIdentityData_wipesVouchState() async { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date()) + manager.markVouchBatchSent(to: voucher, at: Date()) + #expect(manager.isVouched(fingerprint: vouchee)) + + manager.clearAllIdentityData() + + let wiped = await waitUntil { !manager.isVouched(fingerprint: vouchee) } + #expect(wiped) + #expect(manager.validVouchers(for: vouchee).isEmpty) + #expect(manager.lastVouchBatchSent(to: voucher) == nil) + #expect(manager.mostRecentlyVerifiedFingerprints(limit: 16, excluding: "").isEmpty) + } + + // MARK: - Persistence compatibility + + @Test + func trustLevelRawValuesAreStable() throws { + // Raw values are what's persisted; they must never change when cases + // are added mid-ladder. + #expect(TrustLevel.unknown.rawValue == "unknown") + #expect(TrustLevel.casual.rawValue == "casual") + #expect(TrustLevel.vouched.rawValue == "vouched") + #expect(TrustLevel.trusted.rawValue == "trusted") + #expect(TrustLevel.verified.rawValue == "verified") + + let legacy = Data(#"["unknown","casual","trusted","verified"]"#.utf8) + let decoded = try JSONDecoder().decode([TrustLevel].self, from: legacy) + #expect(decoded == [.unknown, .casual, .trusted, .verified]) + } + + @Test + func identityCachePersistedBeforeVouchingDecodesCleanly() throws { + // A cache captured before the vouch fields existed must decode without + // tripping the "unreadable cache" recovery path. + let legacyJSON = Data(""" + { + "socialIdentities": {}, + "nicknameIndex": {}, + "verifiedFingerprints": ["\(voucher)"], + "lastInteractions": {}, + "blockedNostrPubkeys": [], + "version": 1 + } + """.utf8) + + let decoded = try JSONDecoder().decode(IdentityCache.self, from: legacyJSON) + #expect(decoded.vouchesByVouchee == nil) + #expect(decoded.vouchBatchSentAt == nil) + #expect(decoded.verifiedAt == nil) + #expect(decoded.verifiedFingerprints == [voucher]) + } + + @Test + func identityCacheRoundTripsVouchState() throws { + var cache = IdentityCache() + cache.verifiedFingerprints = [voucher] + cache.vouchesByVouchee = [vouchee: [VouchRecord(voucherFingerprint: voucher, timestamp: Date(timeIntervalSince1970: 1_700_000_000))]] + cache.vouchBatchSentAt = [voucher: Date(timeIntervalSince1970: 1_700_000_001)] + cache.verifiedAt = [voucher: Date(timeIntervalSince1970: 1_700_000_002)] + + let decoded = try JSONDecoder().decode(IdentityCache.self, from: JSONEncoder().encode(cache)) + #expect(decoded.vouchesByVouchee == cache.vouchesByVouchee) + #expect(decoded.vouchBatchSentAt == cache.vouchBatchSentAt) + #expect(decoded.verifiedAt == cache.verifiedAt) + } + + @Test + func vouchStateSurvivesReload() async { + let keychain = MockKeychain() + let manager = SecureIdentityStateManager(keychain) + manager.setVerified(fingerprint: voucher, verified: true) + manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date()) + let saved = await waitUntil { manager.isVouched(fingerprint: self.vouchee) } + #expect(saved) + manager.forceSave() + + let reloaded = SecureIdentityStateManager(keychain) + #expect(reloaded.isVouched(fingerprint: vouchee)) + #expect(reloaded.validVouchers(for: vouchee).count == 1) + } + + // MARK: - Helpers + + private func waitUntil( + timeout: TimeInterval = 1.0, + condition: @escaping () -> Bool + ) async -> Bool { + let deadline = Date().addingTimeInterval(timeout) + while Date() < deadline { + if condition() { + return true + } + try? await Task.sleep(nanoseconds: 10_000_000) + } + return condition() + } +} diff --git a/bitchatTests/Services/UnifiedPeerServiceTests.swift b/bitchatTests/Services/UnifiedPeerServiceTests.swift index f5a5fd6c..172bf5b1 100644 --- a/bitchatTests/Services/UnifiedPeerServiceTests.swift +++ b/bitchatTests/Services/UnifiedPeerServiceTests.swift @@ -292,4 +292,37 @@ private final class TestIdentityManager: SecureIdentityStateManagerProtocol { func getVerifiedFingerprints() -> Set { verified } + + // MARK: Vouching (unused by these tests) + + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool { + false + } + + func validVouchers(for fingerprint: String) -> [VouchRecord] { + [] + } + + func isVouched(fingerprint: String) -> Bool { + false + } + + func effectiveTrustLevel(for fingerprint: String) -> TrustLevel { + verified.contains(fingerprint) ? .verified : .unknown + } + + func lastVouchBatchSent(to fingerprint: String) -> Date? { + nil + } + + func markVouchBatchSent(to fingerprint: String, at date: Date) {} + + func signingPublicKey(forFingerprint fingerprint: String) -> Data? { + nil + } + + func mostRecentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] { + [] + } } From ee148a018b889bdfc9f145ba974cf838ac50b794 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 20:14:05 +0200 Subject: [PATCH 008/158] Prekey bundles: forward-secret async first contact for courier mail Courier envelopes were sealed with one-way Noise X to the recipient's long-lived static key, so a later compromise of that key exposed every envelope captured in transit. This adds one-time prekey bundles: - PrekeyBundle (MessageType 0x24): 8 one-time Curve25519 public prekeys bound to the owner's Noise static key by an Ed25519 signature over "bitchat-prekey-bundle-v1" canonical bytes; gossiped mesh-wide on its own 60s sync round (SyncTypeFlags bit 9, 200-peer cap, 24h freshness) and verified against the announce-bound signing key before caching. - Sealed envelope v2: Noise X where the responder static is the one-time prekey, prologue "bitchat-prekey-v1" || prekeyID. Sender identity rides encrypted inside and is authenticated exactly like v1 (blocked-sender check included). CourierEnvelope gains an optional prekeyID TLV that v1 decoders skip as unknown. - Local prekeys live in the Keychain; consumed privates survive a 48h grace window for spray-and-wait redeliveries, then are deleted (the forward-secrecy clock starts at deletion). The batch tops back up and re-gossips when unconsumed count drops below 3, and everything is wiped in panic mode. - Routing: courier sealing picks a cached verified bundle when one exists (one prekey per message, reused across deposit retries), with the advertised .prekeys capability as a veto for on-mesh peers, and falls back to static sealing otherwise. Co-Authored-By: Claude Fable 5 --- .../Protocols/PeerCapabilities+Local.swift | 2 +- .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEService.swift | 166 ++++++++- bitchat/Services/Courier/CourierStore.swift | 12 +- bitchat/Services/NoiseEncryptionService.swift | 106 +++++- .../Services/Prekeys/LocalPrekeyStore.swift | 208 +++++++++++ .../Services/Prekeys/PrekeyBundleStore.swift | 210 +++++++++++ bitchat/Services/TransportConfig.swift | 12 + bitchat/Sync/GossipSyncManager.swift | 80 ++++- bitchat/Sync/SyncTypeFlags.swift | 8 + bitchat/ViewModels/ChatViewModel.swift | 5 + .../EndToEnd/PrekeyEndToEndTests.swift | 332 ++++++++++++++++++ bitchatTests/GossipSyncManagerTests.swift | 56 ++- bitchatTests/Prekeys/NoisePrekeyTests.swift | 234 ++++++++++++ .../Prekeys/PrekeyBundleStoreTests.swift | 197 +++++++++++ bitchatTests/Prekeys/PrekeyBundleTests.swift | 133 +++++++ .../BitFoundation/CourierEnvelope.swift | 27 +- .../Sources/BitFoundation/MessageType.swift | 8 +- .../Sources/BitFoundation/PrekeyBundle.swift | 195 ++++++++++ 19 files changed, 1968 insertions(+), 25 deletions(-) create mode 100644 bitchat/Services/Prekeys/LocalPrekeyStore.swift create mode 100644 bitchat/Services/Prekeys/PrekeyBundleStore.swift create mode 100644 bitchatTests/EndToEnd/PrekeyEndToEndTests.swift create mode 100644 bitchatTests/Prekeys/NoisePrekeyTests.swift create mode 100644 bitchatTests/Prekeys/PrekeyBundleStoreTests.swift create mode 100644 bitchatTests/Prekeys/PrekeyBundleTests.swift create mode 100644 localPackages/BitFoundation/Sources/BitFoundation/PrekeyBundle.swift diff --git a/bitchat/Protocols/PeerCapabilities+Local.swift b/bitchat/Protocols/PeerCapabilities+Local.swift index 40f97b9f..06973dde 100644 --- a/bitchat/Protocols/PeerCapabilities+Local.swift +++ b/bitchat/Protocols/PeerCapabilities+Local.swift @@ -3,5 +3,5 @@ import BitFoundation extension PeerCapabilities { /// Capabilities this build advertises in its announce packets. /// Each feature adds its bit here when it ships. - static let localSupported: PeerCapabilities = [] + static let localSupported: PeerCapabilities = [.prekeys] } diff --git a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift index 18b144d2..314b53f2 100644 --- a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift +++ b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift @@ -12,7 +12,7 @@ enum BLEOutboundPacketPolicy { switch MessageType(rawValue: packetType) { case .noiseEncrypted, .noiseHandshake: return true - case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope: + case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .prekeyBundle: return false } } diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index d1ed84f2..1e76b0a3 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -60,6 +60,13 @@ final class BLEService: NSObject { // Local-only store-and-forward counters; nil in unit tests. var sfMetrics: StoreAndForwardMetrics? + // Verified one-time prekey bundles gossiped by other peers, used to seal + // courier mail forward-secretly. Injectable for tests. + var prekeyBundleStore: PrekeyBundleStore = .shared + // Throttle for re-broadcasting our own (unchanged) bundle; guarded by + // collectionsQueue barriers. + private var lastPrekeyBundleSentAt: Date? + #if DEBUG // Test-only tap on the outbound pipeline so multi-node tests can ferry // packets between in-process service instances. @@ -290,7 +297,10 @@ final class BLEService: NSObject { fileTransferSyncIntervalSeconds: TransportConfig.syncFileTransferIntervalSeconds, messageSyncIntervalSeconds: TransportConfig.syncMessageIntervalSeconds, responseRateLimitMaxResponses: TransportConfig.syncResponseRateLimitMaxResponses, - responseRateLimitWindowSeconds: TransportConfig.syncResponseRateLimitWindowSeconds + responseRateLimitWindowSeconds: TransportConfig.syncResponseRateLimitWindowSeconds, + prekeyBundleCapacity: TransportConfig.syncPrekeyBundleCapacity, + prekeyBundleSyncIntervalSeconds: TransportConfig.syncPrekeyBundleIntervalSeconds, + prekeyBundleMaxAgeSeconds: TransportConfig.syncPrekeyBundleMaxAgeSeconds ) // Only real Bluetooth sessions archive to disk; unit tests stay hermetic. @@ -333,6 +343,8 @@ final class BLEService: NSObject { ingressLinks.removeAll() recentTrafficTracker.removeAll() scheduledRelays.cancelAll() + // Let the post-panic identity publish its fresh bundle promptly. + lastPrekeyBundleSentAt = nil return transfers } @@ -1303,6 +1315,10 @@ final class BLEService: NSObject { } // Ensure our own announce is included in sync state gossipSyncManager?.onPublicPacketSeen(signedPacket) + + // Keep our prekey bundle riding alongside presence (throttled; the + // send is a no-op when the bundle was refreshed recently). + sendPrekeyBundle() } // MARK: QR Verification over Noise @@ -1695,6 +1711,10 @@ extension BLEService { handleReceivedPacket(packet, from: fromPeerID) } + func _test_hasGossipPrekeyBundle(for peerID: PeerID) -> Bool { + gossipSyncManager?._hasPrekeyBundle(for: peerID) ?? false + } + func _test_acceptsIngress(packet: BitchatPacket, boundPeerID: PeerID?) -> Bool { let claimedSenderID = PeerID(hexData: packet.senderID) guard case .success = BLEIngressLinkRegistry.packetContext( @@ -2509,10 +2529,13 @@ extension BLEService { // MARK: Courier Store-and-Forward - /// Seal `content` to the recipient's static key (one-way Noise X) and hand - /// the envelope to the given couriers for physical delivery. Returns false - /// when no courier is connected, the payload cannot be built, or sealing - /// fails; link writes are queued asynchronously after the envelope is ready. + /// Seal `content` for the recipient and hand the envelope to the given + /// couriers for physical delivery. When a verified one-time prekey bundle + /// is cached for the recipient, sealing targets one of its prekeys + /// (forward secret, envelope v2); otherwise it falls back to their static + /// key (one-way Noise X, v1) exactly as before. Returns false when no + /// courier is connected, the payload cannot be built, or sealing fails; + /// link writes are queued asynchronously after the envelope is ready. func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { let connected = couriers.filter { isPeerConnected($0) } guard !connected.isEmpty, @@ -2523,7 +2546,15 @@ extension BLEService { let payload: Data do { let now = Date() - let sealed = try noiseService.sealCourierPayload(typedPayload, recipientStaticKey: recipientNoiseKey) + let sealed: Data + let prekeyID: UInt32? + if let prekey = assignRecipientPrekey(messageID: messageID, recipientNoiseKey: recipientNoiseKey) { + sealed = try noiseService.sealPrekeyPayload(typedPayload, recipientPrekey: prekey) + prekeyID = prekey.id + } else { + sealed = try noiseService.sealCourierPayload(typedPayload, recipientStaticKey: recipientNoiseKey) + prekeyID = nil + } let envelope = CourierEnvelope( recipientTag: CourierEnvelope.recipientTag( noiseStaticKey: recipientNoiseKey, @@ -2531,7 +2562,8 @@ extension BLEService { ), expiry: UInt64((now.timeIntervalSince1970 + CourierEnvelope.maxLifetimeSeconds) * 1000), ciphertext: sealed, - copies: TransportConfig.courierInitialCopies + copies: TransportConfig.courierInitialCopies, + prekeyID: prekeyID ) guard let encoded = envelope.encode() else { return false } payload = encoded @@ -2550,6 +2582,22 @@ extension BLEService { return true } + /// The prekey to seal a courier message with, or nil to fall back to + /// static sealing. The real signal is a verified, unexpired bundle with a + /// spare prekey; the advertised `.prekeys` capability only acts as a veto + /// for peers we currently see on the mesh (a cached bundle can outlive a + /// peer's downgrade to a build that no longer holds the privates). + /// Re-deposits of the same message reuse its assigned prekey, so one + /// message consumes exactly one prekey ID regardless of courier count. + private func assignRecipientPrekey(messageID: String, recipientNoiseKey: Data) -> PrekeyBundle.Prekey? { + let shortID = PeerID(publicKey: recipientNoiseKey) + let knownOnMesh = collectionsQueue.sync { peerRegistry.info(for: shortID) != nil } + if knownOnMesh, !peerCapabilities(shortID).contains(.prekeys) { + return nil + } + return prekeyBundleStore.assignPrekey(messageID: messageID, recipientNoiseKey: recipientNoiseKey) + } + private func makeCourierPacket(_ payload: Data, to peerID: PeerID) -> BitchatPacket { let packet = BitchatPacket( type: MessageType.courierEnvelope.rawValue, @@ -2585,7 +2633,19 @@ extension BLEService { private func openCourierEnvelope(_ envelope: CourierEnvelope) { do { - let (typedPayload, senderStaticKey) = try noiseService.openCourierPayload(envelope.ciphertext) + let typedPayload: Data + let senderStaticKey: Data + if let prekeyID = envelope.prekeyID { + // Envelope v2: sealed to one of our one-time prekeys. Opening + // consumes the prekey (48h redelivery grace); regenerate and + // re-gossip a fresh bundle when the batch runs low. + (typedPayload, senderStaticKey) = try noiseService.openPrekeyPayload(envelope.ciphertext, prekeyID: prekeyID) + if noiseService.replenishPrekeysIfNeeded() { + sendPrekeyBundle(force: true) + } + } else { + (typedPayload, senderStaticKey) = try noiseService.openCourierPayload(envelope.ciphertext) + } guard let typeRaw = typedPayload.first, let payloadType = NoisePayloadType(rawValue: typeRaw), payloadType == .privateMessage else { @@ -2716,6 +2776,93 @@ extension BLEService { } } + // MARK: One-Time Prekey Bundles + + /// Broadcasts our signed prekey bundle and tracks it for gossip sync. + /// Unforced sends (piggybacked on announces) are throttled — gossip does + /// the spreading, the broadcast just keeps our own gossip entry fresh. + /// Forced sends (bundle changed after consumption) go immediately. + private func sendPrekeyBundle(force: Bool = false) { + let now = Date() + let shouldSend: Bool = collectionsQueue.sync(flags: .barrier) { + if !force, + let last = lastPrekeyBundleSentAt, + now.timeIntervalSince(last) < TransportConfig.prekeyBundleRebroadcastSeconds { + return false + } + lastPrekeyBundleSentAt = now + return true + } + guard shouldSend else { return } + guard let bundle = noiseService.currentPrekeyBundle(), + let payload = bundle.encode() else { + SecureLogger.error("❌ Failed to build prekey bundle", category: .security) + return + } + let packet = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: myPeerIDData, + recipientID: nil, + timestamp: UInt64(now.timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: messageTTL + ) + guard let signedPacket = noiseService.signPacket(packet) else { + SecureLogger.error("❌ Failed to sign prekey bundle packet", category: .security) + return + } + if DispatchQueue.getSpecific(key: messageQueueKey) != nil { + broadcastPacket(signedPacket) + } else { + messageQueue.async { [weak self] in + self?.broadcastPacket(signedPacket) + } + } + gossipSyncManager?.onPublicPacketSeen(signedPacket) + } + + /// Ingests a gossiped prekey bundle: verify the inner Ed25519 signature + /// against the owner's announce-bound signing key, cache the latest copy + /// per owner, and only then let the packet enter our own gossip store so + /// we never help spread a bundle we couldn't attribute. + private func handlePrekeyBundle(_ packet: BitchatPacket, from peerID: PeerID) { + guard let bundle = PrekeyBundle.decode(packet.payload) else { + SecureLogger.debug("🔑 Ignoring malformed prekey bundle from \(peerID.id.prefix(8))…", category: .security) + return + } + // Our own bundle is tracked at send time; a copy echoing back adds nothing. + guard bundle.noiseStaticPublicKey != noiseService.getStaticPublicKeyData() else { return } + guard let signingKey = announceBoundSigningKey(forNoiseKey: bundle.noiseStaticPublicKey), + noiseService.verifyPrekeyBundleSignature(bundle, signingPublicKey: signingKey) else { + SecureLogger.debug("🔑 Ignoring prekey bundle without verifiable signature (owner \(PeerID(publicKey: bundle.noiseStaticPublicKey).id.prefix(8))…)", category: .security) + return + } + if prekeyBundleStore.ingest(bundle) { + SecureLogger.debug("🔑 Cached prekey bundle for \(PeerID(publicKey: bundle.noiseStaticPublicKey).id.prefix(8))… (\(bundle.prekeys.count) prekeys)", category: .security) + } + gossipSyncManager?.onPublicPacketSeen(packet) + } + + /// Ed25519 signing key bound to a Noise static key by a verified + /// announce: from the live registry when the owner is on the mesh, else + /// from identities persisted for offline verification. + private func announceBoundSigningKey(forNoiseKey noiseKey: Data) -> Data? { + let shortID = PeerID(publicKey: noiseKey) + if let info = collectionsQueue.sync(execute: { peerRegistry.info(for: shortID) }), + info.noisePublicKey == noiseKey, + let signingKey = info.signingPublicKey { + return signingKey + } + for candidate in identityManager.getCryptoIdentitiesByPeerIDPrefix(shortID) + where candidate.publicKey == noiseKey { + if let signingKey = candidate.signingPublicKey { + return signingKey + } + } + return nil + } + // MARK: Link capability snapshots (thread-safe via bleQueue) private func readLinkState(_ body: (BLELinkStateStore) -> T) -> T { @@ -3210,6 +3357,9 @@ extension BLEService { case .courierEnvelope: handleCourierEnvelope(packet, from: peerID) + case .prekeyBundle: + handlePrekeyBundle(packet, from: senderID) + case .leave: handleLeave(packet, from: senderID) diff --git a/bitchat/Services/Courier/CourierStore.swift b/bitchat/Services/Courier/CourierStore.swift index 063c94d5..a24eb371 100644 --- a/bitchat/Services/Courier/CourierStore.swift +++ b/bitchat/Services/Courier/CourierStore.swift @@ -42,9 +42,11 @@ final class CourierStore { var sprayedTo: Set /// Last speculative multi-hop handover toward a relayed announce. var lastRemoteHandoverAt: Date? + /// Prekey-sealed (envelope v2) discriminator; nil for static-sealed v1. + let prekeyID: UInt32? var envelope: CourierEnvelope { - CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies) + CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies, prekeyID: prekeyID) } init( @@ -56,7 +58,8 @@ final class CourierStore { tier: CourierDepositTier, copies: UInt8, sprayedTo: Set = [], - lastRemoteHandoverAt: Date? = nil + lastRemoteHandoverAt: Date? = nil, + prekeyID: UInt32? = nil ) { self.recipientTag = recipientTag self.expiry = expiry @@ -67,6 +70,7 @@ final class CourierStore { self.copies = copies self.sprayedTo = sprayedTo self.lastRemoteHandoverAt = lastRemoteHandoverAt + self.prekeyID = prekeyID } // Files written before tiers/spray lack the newer fields; treat that @@ -82,6 +86,7 @@ final class CourierStore { copies = try container.decodeIfPresent(UInt8.self, forKey: .copies) ?? 1 sprayedTo = try container.decodeIfPresent(Set.self, forKey: .sprayedTo) ?? [] lastRemoteHandoverAt = try container.decodeIfPresent(Date.self, forKey: .lastRemoteHandoverAt) + prekeyID = try container.decodeIfPresent(UInt32.self, forKey: .prekeyID) } } @@ -186,7 +191,8 @@ final class CourierStore { depositorNoiseKey: depositorNoiseKey, storedAt: date, tier: tier, - copies: envelope.copies + copies: envelope.copies, + prekeyID: envelope.prekeyID )) persistLocked() return true diff --git a/bitchat/Services/NoiseEncryptionService.swift b/bitchat/Services/NoiseEncryptionService.swift index 8a99d9ec..5e244efb 100644 --- a/bitchat/Services/NoiseEncryptionService.swift +++ b/bitchat/Services/NoiseEncryptionService.swift @@ -172,6 +172,10 @@ final class NoiseEncryptionService { // Security components private let rateLimiter = NoiseRateLimiter() private let keychain: KeychainManagerProtocol + + // One-time prekeys for forward-secret courier sealing (lazy generation + // inside the store; the batch is minted on first bundle build). + private let localPrekeys: LocalPrekeyStore // Session maintenance private var rekeyTimer: Timer? @@ -200,6 +204,7 @@ final class NoiseEncryptionService { init(keychain: KeychainManagerProtocol) { self.keychain = keychain + self.localPrekeys = LocalPrekeyStore(keychain: keychain) // BCH-01-009: Load or create static identity key with proper error handling let loadedKey: Curve25519.KeyAgreement.PrivateKey @@ -412,13 +417,109 @@ final class NoiseEncryptionService { } return (payload: payload, senderStaticKey: senderKey.rawRepresentation) } - + + // MARK: - One-Time Prekey Envelopes (forward-secret Noise X) + + /// Domain separation for prekey-sealed envelopes: distinct from both the + /// interactive XX transcripts and static-sealed courier envelopes, and + /// bound to the specific prekey ID so a ciphertext cannot be replayed + /// against a different prekey. + private static let prekeyProloguePrefix = Data("bitchat-prekey-v1".utf8) + + private static func prekeyPrologue(for prekeyID: UInt32) -> Data { + var prologue = prekeyProloguePrefix + var big = prekeyID.bigEndian + withUnsafeBytes(of: &big) { prologue.append(contentsOf: $0) } + return prologue + } + + /// Encrypt a payload to one of the recipient's gossiped one-time prekeys + /// (Noise X where the responder static is the prekey, not the identity + /// key). Unlike `sealCourierPayload`, this is forward secret: once the + /// recipient consumes the prekey and its grace window lapses, the private + /// key is deleted and captured ciphertext becomes undecryptable even if + /// the recipient's identity key is later compromised. The initiator's + /// static still rides inside (encrypted), so the recipient authenticates + /// the sender exactly as with static-sealed envelopes. + func sealPrekeyPayload(_ payload: Data, recipientPrekey: PrekeyBundle.Prekey) throws -> Data { + let remoteKey = try NoiseHandshakeState.validatePublicKey(recipientPrekey.publicKey) + let handshake = NoiseHandshakeState( + role: .initiator, + pattern: .X, + keychain: keychain, + localStaticKey: staticIdentityKey, + remoteStaticKey: remoteKey, + prologue: Self.prekeyPrologue(for: recipientPrekey.id) + ) + return try handshake.writeMessage(payload: payload) + } + + /// Decrypt an envelope sealed to one of our one-time prekeys. On success + /// the prekey is marked consumed (its private key survives a 48h grace + /// window for spray-and-wait redeliveries, then is deleted for good). + /// Returns the payload and the sender's authenticated static key, same + /// contract as `openCourierPayload`. + func openPrekeyPayload(_ envelopeCiphertext: Data, prekeyID: UInt32) throws -> (payload: Data, senderStaticKey: Data) { + guard let prekeyPrivate = localPrekeys.privateKey(for: prekeyID) else { + throw NoiseEncryptionError.unknownPrekey + } + let handshake = NoiseHandshakeState( + role: .responder, + pattern: .X, + keychain: keychain, + localStaticKey: prekeyPrivate, + prologue: Self.prekeyPrologue(for: prekeyID) + ) + let payload = try handshake.readMessage(envelopeCiphertext) + guard let senderKey = handshake.getRemoteStaticPublicKey() else { + throw NoiseError.missingKeys + } + localPrekeys.markConsumed(prekeyID) + return (payload: payload, senderStaticKey: senderKey.rawRepresentation) + } + + /// Current signed prekey bundle for gossip, minting the initial batch on + /// first use. Nil only when signing fails. + func currentPrekeyBundle() -> PrekeyBundle? { + let (prekeys, generatedAt) = localPrekeys.currentBundlePrekeys() + guard !prekeys.isEmpty else { return nil } + let unsigned = PrekeyBundle( + noiseStaticPublicKey: getStaticPublicKeyData(), + prekeys: prekeys, + generatedAt: generatedAt, + signature: Data(count: PrekeyBundle.signatureLength) + ) + guard let signature = signData(unsigned.signableBytes()) else { return nil } + return PrekeyBundle( + noiseStaticPublicKey: unsigned.noiseStaticPublicKey, + prekeys: prekeys, + generatedAt: generatedAt, + signature: signature + ) + } + + /// Verify a peer's bundle signature against their announce-bound Ed25519 + /// signing key. + func verifyPrekeyBundleSignature(_ bundle: PrekeyBundle, signingPublicKey: Data) -> Bool { + verifySignature(bundle.signature, for: bundle.signableBytes(), publicKey: signingPublicKey) + } + + /// Prune dead prekeys and top the batch back up when consumption runs it + /// low. Returns true when the published bundle changed and should be + /// re-gossiped. + @discardableResult + func replenishPrekeysIfNeeded() -> Bool { + localPrekeys.replenishIfNeeded() + } + /// Clear persistent identity (for panic mode) func clearPersistentIdentity() { // Clear from keychain let deletedStatic = keychain.deleteIdentityKey(forKey: "noiseStaticKey") let deletedSigning = keychain.deleteIdentityKey(forKey: "ed25519SigningKey") SecureLogger.logKeyOperation(.delete, keyType: "identity keys", success: deletedStatic && deletedSigning) + // One-time prekey privates go with the identity they were bound to. + localPrekeys.wipe() SecureLogger.warning("Panic mode activated - identity cleared", category: .security) // Stop rekey timer stopRekeyTimer() @@ -812,4 +913,7 @@ struct NoiseMessage: Codable { enum NoiseEncryptionError: Error { case handshakeRequired case sessionNotEstablished + /// Envelope references a prekey ID we don't hold (never ours, already + /// deleted after its grace window, or wiped in a panic). + case unknownPrekey } diff --git a/bitchat/Services/Prekeys/LocalPrekeyStore.swift b/bitchat/Services/Prekeys/LocalPrekeyStore.swift new file mode 100644 index 00000000..83dfa4ae --- /dev/null +++ b/bitchat/Services/Prekeys/LocalPrekeyStore.swift @@ -0,0 +1,208 @@ +// +// LocalPrekeyStore.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import CryptoKit +import Foundation + +/// Owns this device's one-time Curve25519 prekey private keys. +/// +/// Privates persist in the Keychain (single blob, same protection class as +/// the identity keys). A batch of `batchSize` unconsumed prekeys backs the +/// gossiped bundle; when consumption drops the unconsumed count below +/// `replenishThreshold`, the batch tops back up and the bundle's +/// `generatedAt` bumps so peers replace their cached copy. +/// +/// Redelivery grace: spray-and-wait means the same prekey-sealed ciphertext +/// (or a re-seal of the same message to the same prekey ID) can arrive via +/// several couriers days apart. A consumed prekey's private key is therefore +/// retained for `consumedGraceSeconds` after first use and only then deleted. +/// Tradeoff: during the grace window a compromise of the device still exposes +/// mail sealed to that prekey — the forward-secrecy clock starts at deletion, +/// not at first open. Refusing new ciphertexts while accepting redeliveries +/// is not possible (the recipient cannot distinguish them), so the window is +/// kept short and fixed. +final class LocalPrekeyStore { + struct Record: Codable { + let id: UInt32 + let privateKey: Data + let createdAt: Date + var consumedAt: Date? + } + + private struct Persisted: Codable { + var records: [Record] + var nextID: UInt32 + var generatedAt: UInt64 + } + + enum Policy { + static let batchSize = PrekeyBundle.maxPrekeys + static let replenishThreshold = 3 + /// How long a consumed prekey private survives for duplicate courier + /// deliveries of mail sealed to it. + static let consumedGraceSeconds: TimeInterval = 48 * 60 * 60 + /// Unconsumed prekeys older than this are rotated out: no honest + /// sender seals to a bundle that stale (see + /// `PrekeyBundleStore.Limits.maxBundleAgeForSealingSeconds`). + static let unconsumedRetentionSeconds: TimeInterval = 30 * 24 * 60 * 60 + } + + private static let keychainKey = "prekeysV1" + + private let keychain: KeychainManagerProtocol + private let now: () -> Date + private let queue = DispatchQueue(label: "chat.bitchat.prekeys.local") + + // Guarded by `queue`. + private var records: [Record] = [] + private var nextID: UInt32 = 0 + private var generatedAt: UInt64 = 0 + private var loaded = false + + init(keychain: KeychainManagerProtocol, now: @escaping () -> Date = Date.init) { + self.keychain = keychain + self.now = now + } + + // MARK: - Bundle contents (public prekeys) + + /// Unconsumed public prekeys for the gossiped bundle, generating the + /// initial batch on first use. Sorted by ID for canonical signing bytes. + func currentBundlePrekeys() -> (prekeys: [PrekeyBundle.Prekey], generatedAt: UInt64) { + queue.sync { + loadLocked() + _ = replenishLocked() + let prekeys = records + .filter { $0.consumedAt == nil } + .sorted { $0.id < $1.id } + .compactMap { record -> PrekeyBundle.Prekey? in + guard let key = try? Curve25519.KeyAgreement.PrivateKey(rawRepresentation: record.privateKey) else { return nil } + return PrekeyBundle.Prekey(id: record.id, publicKey: key.publicKey.rawRepresentation) + } + return (prekeys, generatedAt) + } + } + + // MARK: - Opening (private prekeys) + + /// Private key for a prekey ID: unconsumed, or consumed within the + /// redelivery grace window. + func privateKey(for id: UInt32) -> Curve25519.KeyAgreement.PrivateKey? { + queue.sync { + loadLocked() + let date = now() + guard let record = records.first(where: { $0.id == id }) else { return nil } + if let consumedAt = record.consumedAt, + date.timeIntervalSince(consumedAt) > Policy.consumedGraceSeconds { + return nil + } + return try? Curve25519.KeyAgreement.PrivateKey(rawRepresentation: record.privateKey) + } + } + + /// Marks a prekey consumed (starts its grace clock). Idempotent: a + /// redelivery within the grace window does not restart the clock. + func markConsumed(_ id: UInt32) { + queue.sync { + loadLocked() + guard let index = records.firstIndex(where: { $0.id == id }), + records[index].consumedAt == nil else { return } + records[index].consumedAt = now() + persistLocked() + } + } + + /// Prunes dead prekeys and tops the unconsumed batch back up when it runs + /// low. Returns true when the published bundle changed (caller should + /// re-gossip). + @discardableResult + func replenishIfNeeded() -> Bool { + queue.sync { + loadLocked() + return replenishLocked() + } + } + + var unconsumedCount: Int { + queue.sync { + loadLocked() + return records.filter { $0.consumedAt == nil }.count + } + } + + /// Panic wipe: drop all prekey privates from memory and the Keychain. + func wipe() { + queue.sync { + records.removeAll() + nextID = 0 + generatedAt = 0 + loaded = true + _ = keychain.deleteIdentityKey(forKey: Self.keychainKey) + } + } + + // MARK: - Internals (call only on `queue`) + + private func replenishLocked() -> Bool { + let date = now() + + // Consumed prekeys past the grace window are gone for good; stale + // unconsumed ones rotate out (their bundle is too old to seal to). + let recordsBefore = records.count + let unconsumedBefore = records.filter { $0.consumedAt == nil }.count + records.removeAll { record in + if let consumedAt = record.consumedAt { + return date.timeIntervalSince(consumedAt) > Policy.consumedGraceSeconds + } + return date.timeIntervalSince(record.createdAt) > Policy.unconsumedRetentionSeconds + } + // Only a change to the *unconsumed* set alters the published bundle; + // grace-expired consumed keys were never in it. + let unconsumed = records.filter { $0.consumedAt == nil }.count + var bundleChanged = unconsumed != unconsumedBefore + + if unconsumed < Policy.replenishThreshold { + for _ in unconsumed.. +// + +import BitFoundation +import BitLogger +import Foundation + +/// Signature-verified one-time prekey bundles received from other peers. +/// +/// One bundle per Noise static key: a newer `generatedAt` replaces the cached +/// copy, keeping the IDs we already sealed with marked used so a prekey is +/// never reused across messages. Assignments are remembered per message ID so +/// deposit retries of the same message re-use its prekey (and its budget) +/// instead of burning a fresh one per courier. +/// +/// Only public key material lives here; it persists to disk so a sender can +/// prekey-seal for recipients met long ago. Included in the panic wipe. +final class PrekeyBundleStore { + struct StoredBundle: Codable { + let noiseKey: Data + var generatedAt: UInt64 + var prekeyIDs: [UInt32] + var prekeyPublicKeys: [Data] + /// IDs this device already sealed with (never reused). + var usedIDs: Set + /// messageID → prekey ID, so re-deposits of one message share one prekey. + var assignments: [String: UInt32] + var updatedAt: Date + } + + enum Limits { + static let maxPeers = 200 + /// Don't seal to bundles older than this: the owner may have rotated + /// the unconsumed keys out (see `LocalPrekeyStore.Policy`). + static let maxBundleAgeForSealingSeconds: TimeInterval = 7 * 24 * 60 * 60 + } + + static let shared = PrekeyBundleStore() + + private var bundles: [Data: StoredBundle] = [:] + private let queue = DispatchQueue(label: "chat.bitchat.prekeys.bundles") + private let fileURL: URL? + private let maxPeers: Int + private let now: () -> Date + + /// - Parameter fileURL: Overrides the on-disk location (tests). Ignored + /// when `persistsToDisk` is false. + init( + persistsToDisk: Bool = true, + fileURL: URL? = nil, + maxPeers: Int = Limits.maxPeers, + now: @escaping () -> Date = Date.init + ) { + self.now = now + self.maxPeers = maxPeers + self.fileURL = persistsToDisk ? (fileURL ?? Self.defaultFileURL()) : nil + loadFromDisk() + } + + // MARK: - Ingest + + /// Stores a bundle whose signature the caller has already verified + /// against the owner's announce-bound signing key. Returns false when an + /// equal-or-newer bundle is already cached (nothing changed). + @discardableResult + func ingest(_ bundle: PrekeyBundle) -> Bool { + guard bundle.noiseStaticPublicKey.count == PrekeyBundle.keyLength, + !bundle.prekeys.isEmpty else { return false } + return queue.sync { + if let existing = bundles[bundle.noiseStaticPublicKey], + existing.generatedAt >= bundle.generatedAt { + return false + } + let previous = bundles[bundle.noiseStaticPublicKey] + let newIDs = Set(bundle.prekeys.map(\.id)) + // Keep consumption state for IDs the fresh bundle still offers + // (a top-up keeps the owner's unconsumed keys); drop the rest. + let carriedUsed = (previous?.usedIDs ?? []).intersection(newIDs) + let carriedAssignments = (previous?.assignments ?? [:]).filter { newIDs.contains($0.value) } + bundles[bundle.noiseStaticPublicKey] = StoredBundle( + noiseKey: bundle.noiseStaticPublicKey, + generatedAt: bundle.generatedAt, + prekeyIDs: bundle.prekeys.map(\.id), + prekeyPublicKeys: bundle.prekeys.map(\.publicKey), + usedIDs: carriedUsed, + assignments: carriedAssignments, + updatedAt: now() + ) + enforceCapLocked() + persistLocked() + return true + } + } + + // MARK: - Sealing support + + /// Whether an unexpired bundle with sealable prekeys is cached for a peer. + func hasUsableBundle(for noiseKey: Data) -> Bool { + queue.sync { + guard let bundle = bundles[noiseKey], isFreshLocked(bundle) else { return false } + return bundle.usedIDs.count < bundle.prekeyIDs.count + } + } + + /// The prekey to seal a message with: the message's existing assignment if + /// any (re-deposits reuse it), else the lowest unused ID, which is then + /// marked used. Nil when no fresh bundle is cached or all its prekeys are + /// spent — callers fall back to static sealing. + func assignPrekey(messageID: String, recipientNoiseKey: Data) -> PrekeyBundle.Prekey? { + queue.sync { + guard var bundle = bundles[recipientNoiseKey], isFreshLocked(bundle) else { return nil } + + if let assigned = bundle.assignments[messageID], + let index = bundle.prekeyIDs.firstIndex(of: assigned) { + return PrekeyBundle.Prekey(id: assigned, publicKey: bundle.prekeyPublicKeys[index]) + } + + guard let index = bundle.prekeyIDs.indices + .filter({ !bundle.usedIDs.contains(bundle.prekeyIDs[$0]) }) + .min(by: { bundle.prekeyIDs[$0] < bundle.prekeyIDs[$1] }) else { + return nil + } + let id = bundle.prekeyIDs[index] + bundle.usedIDs.insert(id) + bundle.assignments[messageID] = id + bundle.updatedAt = now() + bundles[recipientNoiseKey] = bundle + persistLocked() + return PrekeyBundle.Prekey(id: id, publicKey: bundle.prekeyPublicKeys[index]) + } + } + + // MARK: - Maintenance + + /// Panic wipe: drop all cached bundles from memory and disk. + func wipe() { + queue.sync { + bundles.removeAll() + if let fileURL { + try? FileManager.default.removeItem(at: fileURL) + } + } + } + + // MARK: - Internals (call only on `queue`) + + private func isFreshLocked(_ bundle: StoredBundle) -> Bool { + let ageSeconds = now().timeIntervalSince1970 - Double(bundle.generatedAt) / 1000 + return ageSeconds <= Limits.maxBundleAgeForSealingSeconds + } + + private func enforceCapLocked() { + while bundles.count > maxPeers { + guard let victim = bundles.min(by: { $0.value.updatedAt < $1.value.updatedAt }) else { return } + bundles.removeValue(forKey: victim.key) + } + } + + private func persistLocked() { + guard let fileURL else { return } + do { + if bundles.isEmpty { + try? FileManager.default.removeItem(at: fileURL) + return + } + try FileManager.default.createDirectory( + at: fileURL.deletingLastPathComponent(), + withIntermediateDirectories: true + ) + let data = try JSONEncoder().encode(Array(bundles.values)) + var options: Data.WritingOptions = [.atomic] + #if os(iOS) + options.insert(.completeFileProtection) + #endif + try data.write(to: fileURL, options: options) + } catch { + SecureLogger.error("Failed to persist prekey bundle store: \(error)", category: .security) + } + } + + private func loadFromDisk() { + guard let fileURL else { return } + queue.sync { + guard let data = try? Data(contentsOf: fileURL), + let stored = try? JSONDecoder().decode([StoredBundle].self, from: data) else { + return + } + for bundle in stored where bundle.prekeyIDs.count == bundle.prekeyPublicKeys.count { + bundles[bundle.noiseKey] = bundle + } + } + } + + private static func defaultFileURL() -> URL? { + guard let base = try? FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) else { return nil } + return base + .appendingPathComponent("prekeys", isDirectory: true) + .appendingPathComponent("bundles.json") + } +} diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 59d15c55..515d49ab 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -289,4 +289,16 @@ enum TransportConfig { // Cooldown between speculative multi-hop handovers of the same envelope // toward a recipient heard only via relayed announces. static let courierRemoteHandoverCooldownSeconds: TimeInterval = 10 * 60 + + // One-time prekey bundles (forward-secret courier sealing) + // Own gossip-sync round for bundles: modest cadence, bounded peer count, + // and a long freshness window so bundles persist mesh-wide while their + // owners are away. + static let syncPrekeyBundleCapacity: Int = 200 + static let syncPrekeyBundleIntervalSeconds: TimeInterval = 60.0 + static let syncPrekeyBundleMaxAgeSeconds: TimeInterval = 24 * 60 * 60 + // Unforced re-broadcasts of our own (unchanged) bundle, piggybacked on + // announces, keep it alive in peers' gossip stores; changed bundles are + // sent immediately. + static let prekeyBundleRebroadcastSeconds: TimeInterval = 60 * 60 } diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index c966a7ca..e0cdd2ab 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -78,6 +78,11 @@ final class GossipSyncManager { var messageSyncIntervalSeconds: TimeInterval = 15.0 var responseRateLimitMaxResponses: Int = 8 var responseRateLimitWindowSeconds: TimeInterval = 30.0 + // Prekey bundles: one per peer, own sync round, long freshness so + // bundles persist mesh-wide while their owners are offline. + var prekeyBundleCapacity: Int = 200 + var prekeyBundleSyncIntervalSeconds: TimeInterval = 60.0 + var prekeyBundleMaxAgeSeconds: TimeInterval = 24 * 60 * 60 } private let myPeerID: PeerID @@ -91,6 +96,10 @@ final class GossipSyncManager { private var fragments = PacketStore() private var fileTransfers = PacketStore() private var latestAnnouncementByPeer: [PeerID: (id: String, packet: BitchatPacket)] = [:] + // Latest verified prekey bundle per owner. Unlike announces, bundles are + // NOT dropped on leave/stale peer: their whole purpose is reaching a + // sender while the owner is away. + private var latestPrekeyBundleByPeer: [PeerID: (id: String, packet: BitchatPacket)] = [:] private var archiveDirty = false // Timer @@ -119,6 +128,9 @@ final class GossipSyncManager { if config.fileTransferCapacity > 0 && config.fileTransferSyncIntervalSeconds > 0 { schedules.append(SyncSchedule(types: .fileTransfer, interval: config.fileTransferSyncIntervalSeconds, lastSent: .distantPast)) } + if config.prekeyBundleCapacity > 0 && config.prekeyBundleSyncIntervalSeconds > 0 { + schedules.append(SyncSchedule(types: .prekeyBundle, interval: config.prekeyBundleSyncIntervalSeconds, lastSent: .distantPast)) + } syncSchedules = schedules if archive != nil { @@ -155,6 +167,9 @@ final class GossipSyncManager { if self.config.fileTransferCapacity > 0 && self.config.fileTransferSyncIntervalSeconds > 0 { types.formUnion(.fileTransfer) } + if self.config.prekeyBundleCapacity > 0 && self.config.prekeyBundleSyncIntervalSeconds > 0 { + types.formUnion(.prekeyBundle) + } self.sendRequestSync(to: peerID, types: types) } } @@ -169,9 +184,15 @@ final class GossipSyncManager { // messages get the long town-crier window; fragments, file transfers and // announces keep the short one. private func isPacketFresh(_ packet: BitchatPacket) -> Bool { - let maxAgeSeconds = packet.type == MessageType.message.rawValue - ? config.publicMessageMaxAgeSeconds - : config.maxMessageAgeSeconds + let maxAgeSeconds: TimeInterval + switch packet.type { + case MessageType.message.rawValue: + maxAgeSeconds = config.publicMessageMaxAgeSeconds + case MessageType.prekeyBundle.rawValue: + maxAgeSeconds = config.prekeyBundleMaxAgeSeconds + default: + maxAgeSeconds = config.maxMessageAgeSeconds + } let nowMs = UInt64(Date().timeIntervalSince1970 * 1000) let ageThresholdMs = UInt64(maxAgeSeconds * 1000) @@ -225,6 +246,23 @@ final class GossipSyncManager { guard isPacketFresh(packet) else { return } let idHex = PacketIdUtil.computeId(packet).hexEncodedString() fileTransfers.insert(idHex: idHex, packet: packet, capacity: max(1, config.fileTransferCapacity)) + case .prekeyBundle: + // Callers only feed verified bundles here (own bundles at send + // time, peers' after signature verification), so gossip never + // spreads a bundle this node couldn't attribute. + guard isBroadcastRecipient else { return } + guard isPacketFresh(packet) else { return } + let sender = PeerID(hexData: packet.senderID) + if let existing = latestPrekeyBundleByPeer[sender], + existing.packet.timestamp >= packet.timestamp { + return + } + // Bounded peer count; replacing a known owner's bundle is always + // allowed so the cap can't block refreshes. + guard latestPrekeyBundleByPeer[sender] != nil + || latestPrekeyBundleByPeer.count < max(1, config.prekeyBundleCapacity) else { return } + let idHex = PacketIdUtil.computeId(packet).hexEncodedString() + latestPrekeyBundleByPeer[sender] = (id: idHex, packet: packet) default: break } @@ -366,6 +404,24 @@ final class GossipSyncManager { } } } + + // Like announces, prekey bundles are exempt from the since-cursor: + // there is at most one per owner (newer replaces older), so the + // resend cost is bounded and a joining peer must be able to learn + // bundles generated long before it arrived. + if requestedTypes.contains(.prekeyBundle) { + for (_, pair) in latestPrekeyBundleByPeer { + let (idHex, pkt) = pair + guard isPacketFresh(pkt) else { continue } + let idBytes = Data(hexString: idHex) ?? Data() + if !mightContain(idBytes) { + var toSend = pkt + toSend.ttl = 0 + toSend.isRSR = true // Mark as solicited response + delegate?.sendPacket(to: peerID, packet: toSend) + } + } + } } // Build REQUEST_SYNC payload using current candidates and GCS params @@ -385,6 +441,11 @@ final class GossipSyncManager { if types.contains(.fileTransfer) { candidates.append(contentsOf: fileTransfers.allPackets(isFresh: isPacketFresh)) } + if types.contains(.prekeyBundle) { + for (_, pair) in latestPrekeyBundleByPeer where isPacketFresh(pair.packet) { + candidates.append(pair.packet) + } + } if candidates.isEmpty { let p = GCSFilter.deriveP(targetFpr: config.gcsTargetFpr) let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types) @@ -401,6 +462,8 @@ final class GossipSyncManager { cap = max(1, config.fragmentCapacity) } else if types == .fileTransfer { cap = max(1, config.fileTransferCapacity) + } else if types == .prekeyBundle { + cap = max(1, config.prekeyBundleCapacity) } else { cap = max(1, config.seenCapacity) } @@ -442,6 +505,9 @@ final class GossipSyncManager { } fragments.removeExpired(isFresh: isPacketFresh) fileTransfers.removeExpired(isFresh: isPacketFresh) + latestPrekeyBundleByPeer = latestPrekeyBundleByPeer.filter { _, pair in + isPacketFresh(pair.packet) + } } // MARK: - Archive (public message persistence) @@ -529,6 +595,8 @@ final class GossipSyncManager { } private func removeState(for peerID: PeerID) { + // Deliberately keeps the peer's prekey bundle: bundles exist to reach + // owners who left the mesh, and they age out on their own schedule. _ = latestAnnouncementByPeer.removeValue(forKey: peerID) let messageCountBefore = messages.packets.count messages.remove { PeerID(hexData: $0.senderID) == peerID } @@ -554,6 +622,12 @@ extension GossipSyncManager { } } + func _hasPrekeyBundle(for peerID: PeerID) -> Bool { + queue.sync { + latestPrekeyBundleByPeer[peerID] != nil + } + } + func _messageCount(for peerID: PeerID) -> Int { queue.sync { messages.allPackets { _ in true }.filter { PeerID(hexData: $0.senderID) == peerID }.count diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index 430485a0..dae6e728 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -23,6 +23,11 @@ struct SyncTypeFlags: OptionSet { // Courier envelopes are directed deposits between trusted peers and // must never spread via gossip sync. case .courierEnvelope: return nil + // Bit 8 is reserved for the board feature. The bitfield is already a + // wire-tolerant little-endian UInt64 (1-8 bytes, unknown high bits + // ignored by `type(forBit:)`), so bits 8+ need no format change: old + // clients decode the wider flags and simply never match the new bits. + case .prekeyBundle: return 9 } } @@ -36,6 +41,8 @@ struct SyncTypeFlags: OptionSet { case 5: return .fragment case 6: return .requestSync case 7: return .fileTransfer + // Bit 8 reserved (board). + case 9: return .prekeyBundle default: return nil } @@ -45,6 +52,7 @@ struct SyncTypeFlags: OptionSet { static let message = SyncTypeFlags(messageTypes: [.message]) static let fragment = SyncTypeFlags(messageTypes: [.fragment]) static let fileTransfer = SyncTypeFlags(messageTypes: [.fileTransfer]) + static let prekeyBundle = SyncTypeFlags(messageTypes: [.prekeyBundle]) static let publicMessages = SyncTypeFlags(messageTypes: [.announce, .message]) diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 578b6509..e4ab59d4 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1205,6 +1205,11 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele GossipMessageArchive.wipeDefault() StoreAndForwardMetrics.shared.reset() + // Drop cached peers' prekey bundles (who we could write to is + // metadata too). Our own prekey privates are keychain-backed and go + // with deleteAllKeychainData above plus the identity reset below. + PrekeyBundleStore.shared.wipe() + // Identity manager has cleared persisted identity data above // Clear autocomplete state diff --git a/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift b/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift new file mode 100644 index 00000000..f7c61f3f --- /dev/null +++ b/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift @@ -0,0 +1,332 @@ +// +// PrekeyEndToEndTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import CoreBluetooth +import BitFoundation +@testable import bitchat + +/// Forward-secret courier flow through real BLEService instances: Bob gossips +/// a signed prekey bundle, Alice verifies and caches it, seals to a one-time +/// prekey instead of Bob's static key, Carol carries the opaque envelope, and +/// Bob opens it with the matching prekey private. +struct PrekeyEndToEndTests { + + // MARK: - Helpers + + private final class PacketTap { + private let lock = NSLock() + private var packets: [BitchatPacket] = [] + + func record(_ packet: BitchatPacket) { + lock.lock(); packets.append(packet); lock.unlock() + } + + func first(ofType type: MessageType) -> BitchatPacket? { + lock.lock(); defer { lock.unlock() } + return packets.first { $0.type == type.rawValue } + } + } + + private final class NoiseCaptureDelegate: BitchatDelegate { + private let lock = NSLock() + private var payloads: [(peerID: PeerID, type: NoisePayloadType, payload: Data)] = [] + + func didReceiveNoisePayload(from peerID: PeerID, type: NoisePayloadType, payload: Data, timestamp: Date) { + lock.lock(); payloads.append((peerID, type, payload)); lock.unlock() + } + + func snapshot() -> [(peerID: PeerID, type: NoisePayloadType, payload: Data)] { + lock.lock(); defer { lock.unlock() } + return payloads + } + + // Unused BitchatDelegate requirements. + func didReceiveMessage(_ message: BitchatMessage) {} + func didConnectToPeer(_ peerID: PeerID) {} + func didDisconnectFromPeer(_ peerID: PeerID) {} + func didUpdatePeerList(_ peers: [PeerID]) {} + func didUpdateBluetoothState(_ state: CBManagerState) {} + func didReceivePublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) {} + } + + private func makeService() -> BLEService { + let keychain = MockKeychain() + let service = BLEService( + keychain: keychain, + idBridge: NostrIdentityBridge(keychain: MockKeychainHelper()), + identityManager: MockIdentityManager(keychain), + initializeBluetoothManagers: false + ) + service.courierStore = CourierStore(persistsToDisk: false) + service.prekeyBundleStore = PrekeyBundleStore(persistsToDisk: false) + return service + } + + private func preseedConnectedPeer(_ peer: BLEService, in service: BLEService) { + let packet = BitchatPacket( + type: MessageType.message.rawValue, + senderID: Data(hexString: peer.myPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: Data("ping".utf8), + signature: nil, + ttl: 1 + ) + service._test_handlePacket(packet, fromPeerID: peer.myPeerID) + } + + /// Broadcast announce + prekey bundle from `peer` and return both packets. + private func captureAnnounceAndBundle(from peer: BLEService, tap: PacketTap) async throws -> (announce: BitchatPacket, bundle: BitchatPacket) { + peer.sendBroadcastAnnounce() + let published = await TestHelpers.waitUntil( + { tap.first(ofType: .announce) != nil && tap.first(ofType: .prekeyBundle) != nil }, + timeout: TestConstants.defaultTimeout + ) + #expect(published) + return ( + announce: try #require(tap.first(ofType: .announce)), + bundle: try #require(tap.first(ofType: .prekeyBundle)) + ) + } + + // MARK: - Tests + + @Test func prekeySealedMailTravelsViaCourierAndOpens() async throws { + let alice = makeService() + let carol = makeService() + let bob = makeService() + carol.courierDepositPolicy = { _, _ in .favorite } + + let bobDelegate = NoiseCaptureDelegate() + bob.delegate = bobDelegate + + let aliceOut = PacketTap() + alice._test_onOutboundPacket = aliceOut.record + let carolOut = PacketTap() + carol._test_onOutboundPacket = carolOut.record + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + preseedConnectedPeer(carol, in: alice) + + // 1. While Bob is still around, Alice hears his verified announce + // (binding his signing key) and his gossiped prekey bundle. + let (announce, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(announce, fromPeerID: bob.myPeerID, preseedPeer: false) + alice._test_handlePacket(bundlePacket, fromPeerID: bob.myPeerID, preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.defaultTimeout + ) + #expect(cached) + + // 2. Bob goes dark; Alice seals for him and deposits with Carol. + // The envelope must be v2: sealed to a one-time prekey. + #expect(alice.sendCourierMessage( + "burn after reading", + messageID: "prekey-msg-1", + recipientNoiseKey: bob.noiseStaticPublicKeyData(), + via: [carol.myPeerID] + )) + let deposited = await TestHelpers.waitUntil( + { aliceOut.first(ofType: .courierEnvelope) != nil }, + timeout: TestConstants.defaultTimeout + ) + #expect(deposited) + let depositPacket = try #require(aliceOut.first(ofType: .courierEnvelope)) + let sealedEnvelope = try #require(CourierEnvelope.decode(depositPacket.payload)) + #expect(sealedEnvelope.prekeyID != nil) + + // 3. Carol carries it (opaque, prekey or not). + carol._test_handlePacket(depositPacket, fromPeerID: alice.myPeerID, signingPublicKey: alice.noiseSigningPublicKeyData()) + let carried = await TestHelpers.waitUntil( + { !carol.courierStore.isEmpty }, + timeout: TestConstants.defaultTimeout + ) + #expect(carried) + + // 4. Bob resurfaces near Carol → handover, and the v2 discriminator + // survives the store round-trip. + bob.sendBroadcastAnnounce() + let reannounced = await TestHelpers.waitUntil( + { bobOut.first(ofType: .announce) != nil }, + timeout: TestConstants.defaultTimeout + ) + #expect(reannounced) + let handoverTrigger = try #require(bobOut.first(ofType: .announce)) + carol._test_handlePacket(handoverTrigger, fromPeerID: bob.myPeerID, preseedPeer: false) + + let handedOver = await TestHelpers.waitUntil( + { carolOut.first(ofType: .courierEnvelope) != nil }, + timeout: TestConstants.defaultTimeout + ) + #expect(handedOver) + let handoverPacket = try #require(carolOut.first(ofType: .courierEnvelope)) + let handedEnvelope = try #require(CourierEnvelope.decode(handoverPacket.payload)) + #expect(handedEnvelope.prekeyID == sealedEnvelope.prekeyID) + + // 5. Bob opens it with the matching one-time prekey private and sees + // Alice as the authenticated sender. + bob._test_handlePacket(handoverPacket, fromPeerID: carol.myPeerID) + let received = await TestHelpers.waitUntil( + { !bobDelegate.snapshot().isEmpty }, + timeout: TestConstants.defaultTimeout + ) + #expect(received) + + let delivered = try #require(bobDelegate.snapshot().first) + #expect(delivered.type == .privateMessage) + #expect(delivered.peerID == PeerID(hexData: alice.noiseStaticPublicKeyData())) + let message = try #require(PrivateMessagePacket.decode(from: delivered.payload)) + #expect(message.messageID == "prekey-msg-1") + #expect(message.content == "burn after reading") + + // 6. Redelivery tolerance: the same envelope arriving via another + // packet (spray-and-wait) still opens inside the grace window. + let redelivery = BitchatPacket( + type: MessageType.courierEnvelope.rawValue, + senderID: Data(hexString: carol.myPeerID.id) ?? Data(), + recipientID: handoverPacket.recipientID, + timestamp: handoverPacket.timestamp + 1, + payload: handoverPacket.payload, + signature: nil, + ttl: 1 + ) + bob._test_handlePacket(redelivery, fromPeerID: carol.myPeerID) + let redelivered = await TestHelpers.waitUntil( + { bobDelegate.snapshot().count == 2 }, + timeout: TestConstants.defaultTimeout + ) + #expect(redelivered) + } + + @Test func withoutBundleSealingFallsBackToStatic() async throws { + let alice = makeService() + let bob = makeService() + + let bobDelegate = NoiseCaptureDelegate() + bob.delegate = bobDelegate + let aliceOut = PacketTap() + alice._test_onOutboundPacket = aliceOut.record + + // Bob is a connected "courier" who happens to be the recipient: the + // envelope reaches him directly and the recipient tag matches. + preseedConnectedPeer(bob, in: alice) + + // Alice never saw a bundle for Bob → v1 static-sealed envelope. + #expect(alice.sendCourierMessage( + "plain static seal", + messageID: "static-msg-1", + recipientNoiseKey: bob.noiseStaticPublicKeyData(), + via: [bob.myPeerID] + )) + let deposited = await TestHelpers.waitUntil( + { aliceOut.first(ofType: .courierEnvelope) != nil }, + timeout: TestConstants.defaultTimeout + ) + #expect(deposited) + let depositPacket = try #require(aliceOut.first(ofType: .courierEnvelope)) + let envelope = try #require(CourierEnvelope.decode(depositPacket.payload)) + #expect(envelope.prekeyID == nil) + + // Bob opens the v1 envelope exactly as before the prekey change. + // (No preseed: Alice is absent from Bob's mesh, so the sender should + // resolve to her full noise-key ID like the courier case.) + bob._test_handlePacket(depositPacket, fromPeerID: alice.myPeerID, preseedPeer: false) + let received = await TestHelpers.waitUntil( + { !bobDelegate.snapshot().isEmpty }, + timeout: TestConstants.defaultTimeout + ) + #expect(received) + let delivered = try #require(bobDelegate.snapshot().first) + #expect(delivered.peerID == PeerID(hexData: alice.noiseStaticPublicKeyData())) + let message = try #require(PrivateMessagePacket.decode(from: delivered.payload)) + #expect(message.content == "plain static seal") + } + + @Test func unverifiableBundleIsIgnored() async throws { + let alice = makeService() + let bob = makeService() + + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + // Alice receives Bob's bundle but never saw a verified announce, so + // no signing key is bound to his noise key: the bundle must not be + // cached or enter Alice's gossip store. + let (_, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(bundlePacket, fromPeerID: bob.myPeerID, preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.shortTimeout + ) + #expect(!cached) + } + + @Test func forgedBundleSignatureIsRejected() async throws { + let alice = makeService() + let bob = makeService() + + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + let (announce, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(announce, fromPeerID: bob.myPeerID, preseedPeer: false) + + // Mallory tampers with the gossiped bundle in flight. + let bundle = try #require(PrekeyBundle.decode(bundlePacket.payload)) + var forgedSignature = bundle.signature + forgedSignature[0] ^= 0x01 + let forged = PrekeyBundle( + noiseStaticPublicKey: bundle.noiseStaticPublicKey, + prekeys: bundle.prekeys, + generatedAt: bundle.generatedAt, + signature: forgedSignature + ) + let forgedPacket = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: bundlePacket.senderID, + recipientID: nil, + timestamp: bundlePacket.timestamp, + payload: try #require(forged.encode()), + signature: bundlePacket.signature, + ttl: bundlePacket.ttl + ) + alice._test_handlePacket(forgedPacket, fromPeerID: bob.myPeerID, preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.shortTimeout + ) + #expect(!cached) + } + + @Test func verifiedBundleEntersGossipStore() async throws { + let alice = makeService() + let bob = makeService() + + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + let (announce, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(announce, fromPeerID: bob.myPeerID, preseedPeer: false) + alice._test_handlePacket(bundlePacket, fromPeerID: bob.myPeerID, preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.defaultTimeout + ) + #expect(cached) + // The verified bundle now participates in Alice's sync rounds. + #expect(alice._test_hasGossipPrekeyBundle(for: bob.myPeerID)) + } +} diff --git a/bitchatTests/GossipSyncManagerTests.swift b/bitchatTests/GossipSyncManagerTests.swift index c44de8f6..82c5c87d 100644 --- a/bitchatTests/GossipSyncManagerTests.swift +++ b/bitchatTests/GossipSyncManagerTests.swift @@ -139,6 +139,7 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 1 config.fragmentSyncIntervalSeconds = 1 config.fileTransferSyncIntervalSeconds = 1 + config.prekeyBundleSyncIntervalSeconds = 1 config.maintenanceIntervalSeconds = 0 let requestSyncManager = RequestSyncManager() @@ -195,19 +196,22 @@ struct GossipSyncManagerTests { manager._performMaintenanceSynchronously(now: Date()) // One request per due schedule so each type group gets the full - // filter capacity: publicMessages, fragment, and fileTransfer. + // filter capacity: publicMessages, fragment, fileTransfer, and + // prekeyBundle. let sentPackets = delegate.packets - #expect(sentPackets.count == 3) + #expect(sentPackets.count == 4) let decoded = sentPackets.compactMap { RequestSyncPacket.decode(from: $0.payload) } - #expect(decoded.count == 3) + #expect(decoded.count == 4) let allTypes = decoded.compactMap(\.types).reduce(SyncTypeFlags(rawValue: 0)) { $0.union($1) } #expect(allTypes.contains(.announce)) #expect(allTypes.contains(.message)) #expect(allTypes.contains(.fragment)) #expect(allTypes.contains(.fileTransfer)) + #expect(allTypes.contains(.prekeyBundle)) #expect(decoded.contains { $0.types == .publicMessages }) #expect(decoded.contains { $0.types == .fragment }) #expect(decoded.contains { $0.types == .fileTransfer }) + #expect(decoded.contains { $0.types == .prekeyBundle }) } @Test func truncatedFilterCarriesSinceCursor() throws { @@ -292,6 +296,7 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 0 config.fragmentSyncIntervalSeconds = 0 config.fileTransferSyncIntervalSeconds = 0 + config.prekeyBundleSyncIntervalSeconds = 0 let requestSyncManager = RequestSyncManager() let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) @@ -363,6 +368,7 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 0 config.fragmentSyncIntervalSeconds = 0 config.fileTransferSyncIntervalSeconds = 0 + config.prekeyBundleSyncIntervalSeconds = 0 config.responseRateLimitMaxResponses = 1 config.responseRateLimitWindowSeconds = 60 @@ -417,6 +423,7 @@ struct GossipSyncManagerTests { #expect(types.contains(.message)) #expect(types.contains(.fragment)) #expect(types.contains(.fileTransfer)) + #expect(types.contains(.prekeyBundle)) } @Test func handleRequestSyncHonorsTypeFilter() async throws { @@ -469,6 +476,49 @@ struct GossipSyncManagerTests { #expect(sentPackets[0].type == MessageType.fragment.rawValue) } + @Test func prekeyBundlesServeSyncAndSurviveStalePeerCleanup() async throws { + var config = GossipSyncManager.Config() + config.messageSyncIntervalSeconds = 0 + config.fragmentSyncIntervalSeconds = 0 + config.fileTransferSyncIntervalSeconds = 0 + config.prekeyBundleSyncIntervalSeconds = 0 + config.stalePeerCleanupIntervalSeconds = 0 + config.stalePeerTimeoutSeconds = 5 + + let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: RequestSyncManager()) + let delegate = RecordingDelegate() + manager.delegate = delegate + + let sender = try #require(Data(hexString: "aabbccddeeff0011")) + let senderPeer = PeerID(hexData: sender) + let bundlePacket = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: sender, + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: Data([0x01]), + signature: nil, + ttl: 1 + ) + manager.onPublicPacketSeen(bundlePacket) + manager._performMaintenanceSynchronously(now: Date()) + #expect(manager._hasPrekeyBundle(for: senderPeer)) + + // Bundles outlive the owner's announce: a leave plus stale cleanup + // must not drop them (they exist to reach offline owners). + manager.removeAnnouncementForPeer(senderPeer) + manager._performMaintenanceSynchronously(now: Date().addingTimeInterval(config.stalePeerTimeoutSeconds + 1)) + #expect(manager._hasPrekeyBundle(for: senderPeer)) + + // And a .prekeyBundle sync request is answered with the stored packet. + let request = RequestSyncPacket(p: 7, m: 1, data: Data(), types: .prekeyBundle) + manager.handleRequestSync(from: PeerID(str: "FFFFFFFFFFFFFFFF"), request: request) + try await TestHelpers.waitFor({ delegate.packets.count == 1 }, timeout: TestConstants.shortTimeout) + let served = try #require(delegate.packets.first) + #expect(served.type == MessageType.prekeyBundle.rawValue) + #expect(served.isRSR) + } + // MARK: - Archive persistence @Test func publicMessagesRestoreFromArchiveAcrossRestart() async throws { diff --git a/bitchatTests/Prekeys/NoisePrekeyTests.swift b/bitchatTests/Prekeys/NoisePrekeyTests.swift new file mode 100644 index 00000000..7e58f04b --- /dev/null +++ b/bitchatTests/Prekeys/NoisePrekeyTests.swift @@ -0,0 +1,234 @@ +// +// NoisePrekeyTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import CryptoKit +import BitFoundation +@testable import bitchat + +/// Forward-secret one-way Noise X envelopes sealed to one-time prekeys +/// instead of the recipient's identity static key. +struct NoisePrekeyTests { + + @Test func sealAndOpenRoundTrip() throws { + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + + let payload = Data("meet at the north gate".utf8) + let sealed = try alice.sealPrekeyPayload(payload, recipientPrekey: prekey) + + let opened = try bob.openPrekeyPayload(sealed, prekeyID: prekey.id) + #expect(opened.payload == payload) + // The X pattern authenticates the sender: Bob learns Alice's real static key. + #expect(opened.senderStaticKey == alice.getStaticPublicKeyData()) + } + + @Test func wrongPrekeyIDCannotOpen() throws { + // The prologue binds the ciphertext to a specific prekey ID; opening + // with a different (existing) prekey must fail. + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + #expect(bundle.prekeys.count >= 2) + + let sealed = try alice.sealPrekeyPayload(Data("secret".utf8), recipientPrekey: bundle.prekeys[0]) + #expect(throws: (any Error).self) { + _ = try bob.openPrekeyPayload(sealed, prekeyID: bundle.prekeys[1].id) + } + } + + @Test func unknownPrekeyIDThrows() throws { + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + + let sealed = try alice.sealPrekeyPayload(Data("secret".utf8), recipientPrekey: prekey) + #expect(throws: NoiseEncryptionError.unknownPrekey) { + _ = try bob.openPrekeyPayload(sealed, prekeyID: 0xDEAD_BEEF) + } + } + + @Test func wrongRecipientCannotOpen() throws { + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let carol = NoiseEncryptionService(keychain: MockKeychain()) + let bobBundle = try #require(bob.currentPrekeyBundle()) + // Ensure Carol holds a prekey under the same ID as Bob's. + _ = try #require(carol.currentPrekeyBundle()) + let prekey = try #require(bobBundle.prekeys.first) + + let sealed = try alice.sealPrekeyPayload(Data("secret".utf8), recipientPrekey: prekey) + #expect(throws: (any Error).self) { + _ = try carol.openPrekeyPayload(sealed, prekeyID: prekey.id) + } + } + + @Test func tamperedCiphertextFailsToOpen() throws { + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + + var sealed = try alice.sealPrekeyPayload(Data("secret".utf8), recipientPrekey: prekey) + sealed[sealed.count - 1] ^= 0x01 + #expect(throws: (any Error).self) { + _ = try bob.openPrekeyPayload(sealed, prekeyID: prekey.id) + } + } + + @Test func consumedPrekeyStillOpensRedeliveredCiphertext() throws { + // Spray-and-wait can deliver the same ciphertext via several couriers + // days apart; the consumed private survives a grace window for that. + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + + let sealed = try alice.sealPrekeyPayload(Data("hello".utf8), recipientPrekey: prekey) + let first = try bob.openPrekeyPayload(sealed, prekeyID: prekey.id) + let second = try bob.openPrekeyPayload(sealed, prekeyID: prekey.id) + #expect(first.payload == second.payload) + } + + @Test func prekeyAndStaticSealsAreNotInterchangeable() throws { + // Domain-separated prologues: a static-sealed envelope must not open + // via the prekey path and vice versa, even with matching key material. + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + + let staticSealed = try alice.sealCourierPayload(Data("x".utf8), recipientStaticKey: bob.getStaticPublicKeyData()) + #expect(throws: (any Error).self) { + _ = try bob.openPrekeyPayload(staticSealed, prekeyID: prekey.id) + } + + let prekeySealed = try alice.sealPrekeyPayload(Data("x".utf8), recipientPrekey: prekey) + #expect(throws: (any Error).self) { + _ = try bob.openCourierPayload(prekeySealed) + } + } + + @Test func sealRejectsInvalidPrekeyPublicKey() { + let alice = NoiseEncryptionService(keychain: MockKeychain()) + #expect(throws: (any Error).self) { + _ = try alice.sealPrekeyPayload(Data("x".utf8), recipientPrekey: PrekeyBundle.Prekey(id: 1, publicKey: Data(repeating: 0, count: 32))) + } + #expect(throws: (any Error).self) { + _ = try alice.sealPrekeyPayload(Data("x".utf8), recipientPrekey: PrekeyBundle.Prekey(id: 1, publicKey: Data(repeating: 1, count: 8))) + } + } + + @Test func sealsAreNotLinkableAcrossSends() throws { + // Fresh ephemeral per seal even to the same prekey. + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + let payload = Data("same message".utf8) + + let a = try alice.sealPrekeyPayload(payload, recipientPrekey: prekey) + let b = try alice.sealPrekeyPayload(payload, recipientPrekey: prekey) + #expect(a != b) + #expect(a.prefix(32) != b.prefix(32)) + } +} + +/// Local one-time prekey lifecycle: batch generation, consumption, the 48h +/// redelivery grace window, replenishment, and the panic wipe. +struct LocalPrekeyStoreTests { + + private final class Clock { + var now: Date + init(_ now: Date = Date()) { self.now = now } + } + + private func makeStore(clock: Clock, keychain: MockKeychain = MockKeychain()) -> LocalPrekeyStore { + LocalPrekeyStore(keychain: keychain, now: { clock.now }) + } + + @Test func mintsFullBatchOnFirstUse() { + let store = makeStore(clock: Clock()) + let (prekeys, generatedAt) = store.currentBundlePrekeys() + #expect(prekeys.count == LocalPrekeyStore.Policy.batchSize) + #expect(generatedAt > 0) + #expect(Set(prekeys.map(\.id)).count == prekeys.count) + } + + @Test func consumptionBelowThresholdTriggersReplenishAndBumpsGeneration() { + let clock = Clock() + let store = makeStore(clock: clock) + let (initial, firstGeneratedAt) = store.currentBundlePrekeys() + + // Consuming down to the threshold does not regenerate... + let keepUnconsumed = LocalPrekeyStore.Policy.replenishThreshold + for prekey in initial.dropLast(keepUnconsumed) { + store.markConsumed(prekey.id) + } + #expect(!store.replenishIfNeeded()) + #expect(store.unconsumedCount == keepUnconsumed) + + // ...one more consumption does, topping back up to a full batch with + // a newer generation stamp. + clock.now = clock.now.addingTimeInterval(60) + store.markConsumed(initial[initial.count - keepUnconsumed].id) + #expect(store.replenishIfNeeded()) + let (replenished, secondGeneratedAt) = store.currentBundlePrekeys() + #expect(replenished.count == LocalPrekeyStore.Policy.batchSize) + #expect(secondGeneratedAt > firstGeneratedAt) + // Surviving unconsumed prekeys stay in the fresh bundle. + let survivorIDs = Set(initial.suffix(keepUnconsumed - 1).map(\.id)) + #expect(survivorIDs.isSubset(of: Set(replenished.map(\.id)))) + } + + @Test func consumedPrivateSurvivesGraceWindowThenDies() { + let clock = Clock() + let store = makeStore(clock: clock) + let (prekeys, _) = store.currentBundlePrekeys() + let id = prekeys[0].id + + store.markConsumed(id) + // Within the grace window: still retrievable for redeliveries. + clock.now = clock.now.addingTimeInterval(LocalPrekeyStore.Policy.consumedGraceSeconds - 60) + #expect(store.privateKey(for: id) != nil) + + // Past the grace window: gone (even before replenish prunes it). + clock.now = clock.now.addingTimeInterval(120) + #expect(store.privateKey(for: id) == nil) + store.replenishIfNeeded() + #expect(store.privateKey(for: id) == nil) + } + + @Test func persistsAcrossInstances() { + let keychain = MockKeychain() + let clock = Clock() + let first = LocalPrekeyStore(keychain: keychain, now: { clock.now }) + let (prekeys, generatedAt) = first.currentBundlePrekeys() + first.markConsumed(prekeys[0].id) + + let second = LocalPrekeyStore(keychain: keychain, now: { clock.now }) + let (reloaded, reloadedGeneratedAt) = second.currentBundlePrekeys() + #expect(reloadedGeneratedAt == generatedAt) + #expect(Set(reloaded.map(\.id)) == Set(prekeys.dropFirst().map(\.id))) + // The consumed key is still openable within grace after a relaunch. + #expect(second.privateKey(for: prekeys[0].id) != nil) + } + + @Test func wipeRemovesEverything() { + let keychain = MockKeychain() + let store = LocalPrekeyStore(keychain: keychain) + let (prekeys, _) = store.currentBundlePrekeys() + store.wipe() + #expect(store.privateKey(for: prekeys[0].id) == nil) + #expect(keychain.getIdentityKey(forKey: "prekeysV1") == nil) + } +} diff --git a/bitchatTests/Prekeys/PrekeyBundleStoreTests.swift b/bitchatTests/Prekeys/PrekeyBundleStoreTests.swift new file mode 100644 index 00000000..319757f0 --- /dev/null +++ b/bitchatTests/Prekeys/PrekeyBundleStoreTests.swift @@ -0,0 +1,197 @@ +// +// PrekeyBundleStoreTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import CryptoKit +import BitFoundation +@testable import bitchat + +/// Sender-side cache of peers' verified prekey bundles: latest-wins ingest, +/// per-message prekey assignment (never reused across messages), expiry, and +/// the peer cap. +struct PrekeyBundleStoreTests { + + private func makeBundle( + noiseKey: Data = Curve25519.KeyAgreement.PrivateKey().publicKey.rawRepresentation, + ids: [UInt32] = [0, 1, 2], + generatedAt: UInt64 = UInt64(Date().timeIntervalSince1970 * 1000) + ) -> PrekeyBundle { + PrekeyBundle( + noiseStaticPublicKey: noiseKey, + prekeys: ids.map { PrekeyBundle.Prekey(id: $0, publicKey: Curve25519.KeyAgreement.PrivateKey().publicKey.rawRepresentation) }, + generatedAt: generatedAt, + signature: Data(count: PrekeyBundle.signatureLength) + ) + } + + @Test func ingestKeepsLatestByGeneratedAt() { + let store = PrekeyBundleStore(persistsToDisk: false) + let noiseKey = Data(repeating: 0xB0, count: 32) + let nowMs = UInt64(Date().timeIntervalSince1970 * 1000) + + let old = makeBundle(noiseKey: noiseKey, ids: [0, 1], generatedAt: nowMs - 1000) + let new = makeBundle(noiseKey: noiseKey, ids: [2, 3], generatedAt: nowMs) + + #expect(store.ingest(new)) + // Older (and equal) bundles never displace a newer one. + #expect(!store.ingest(old)) + #expect(!store.ingest(new)) + + let assigned = store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey) + #expect(assigned?.id == 2) + } + + @Test func assignmentsConsumeDistinctPrekeysPerMessage() { + let store = PrekeyBundleStore(persistsToDisk: false) + let noiseKey = Data(repeating: 0xB1, count: 32) + #expect(store.ingest(makeBundle(noiseKey: noiseKey, ids: [10, 11]))) + + let first = store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey) + let second = store.assignPrekey(messageID: "m2", recipientNoiseKey: noiseKey) + #expect(first?.id == 10) + #expect(second?.id == 11) + // Exhausted: fall back to static sealing. + #expect(store.assignPrekey(messageID: "m3", recipientNoiseKey: noiseKey) == nil) + #expect(!store.hasUsableBundle(for: noiseKey)) + } + + @Test func redepositOfSameMessageReusesItsPrekey() { + let store = PrekeyBundleStore(persistsToDisk: false) + let noiseKey = Data(repeating: 0xB2, count: 32) + #expect(store.ingest(makeBundle(noiseKey: noiseKey, ids: [5, 6, 7]))) + + let first = store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey) + let retry = store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey) + #expect(first?.id == retry?.id) + #expect(first?.publicKey == retry?.publicKey) + // Only one prekey was burned. + let next = store.assignPrekey(messageID: "m2", recipientNoiseKey: noiseKey) + #expect(next?.id == 6) + } + + @Test func topUpBundleKeepsConsumptionStateForSurvivingIDs() { + let store = PrekeyBundleStore(persistsToDisk: false) + let noiseKey = Data(repeating: 0xB3, count: 32) + let nowMs = UInt64(Date().timeIntervalSince1970 * 1000) + #expect(store.ingest(makeBundle(noiseKey: noiseKey, ids: [0, 1], generatedAt: nowMs - 1000))) + #expect(store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey)?.id == 0) + + // The owner topped up: ID 1 survives (still unconsumed on their side), + // ID 0 rotated out, new IDs appear. + #expect(store.ingest(makeBundle(noiseKey: noiseKey, ids: [1, 8, 9], generatedAt: nowMs))) + // m1's assignment referenced a rotated-out ID; a re-deposit picks a + // fresh one rather than sealing to a dead key. + #expect(store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey)?.id == 1) + #expect(store.assignPrekey(messageID: "m2", recipientNoiseKey: noiseKey)?.id == 8) + } + + @Test func expiredBundleIsNeverUsed() { + var current = Date() + let store = PrekeyBundleStore(persistsToDisk: false, now: { current }) + let noiseKey = Data(repeating: 0xB4, count: 32) + #expect(store.ingest(makeBundle(noiseKey: noiseKey, generatedAt: UInt64(current.timeIntervalSince1970 * 1000)))) + #expect(store.hasUsableBundle(for: noiseKey)) + + current = current.addingTimeInterval(PrekeyBundleStore.Limits.maxBundleAgeForSealingSeconds + 60) + #expect(!store.hasUsableBundle(for: noiseKey)) + #expect(store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey) == nil) + } + + @Test func peerCapEvictsLeastRecentlyUpdated() { + var current = Date() + let store = PrekeyBundleStore(persistsToDisk: false, maxPeers: 2, now: { current }) + let keys = (0..<3).map { Data(repeating: UInt8(0xC0 + $0), count: 32) } + + for key in keys { + #expect(store.ingest(makeBundle(noiseKey: key, generatedAt: UInt64(current.timeIntervalSince1970 * 1000)))) + current = current.addingTimeInterval(1) + } + // Oldest entry evicted; the two most recent survive. + #expect(!store.hasUsableBundle(for: keys[0])) + #expect(store.hasUsableBundle(for: keys[1])) + #expect(store.hasUsableBundle(for: keys[2])) + } + + @Test func persistsAcrossInstancesAndWipes() throws { + let dir = FileManager.default.temporaryDirectory + .appendingPathComponent("prekey-bundle-store-tests-\(UUID().uuidString)", isDirectory: true) + let fileURL = dir.appendingPathComponent("bundles.json") + defer { try? FileManager.default.removeItem(at: dir) } + + let noiseKey = Data(repeating: 0xB5, count: 32) + let first = PrekeyBundleStore(fileURL: fileURL) + #expect(first.ingest(makeBundle(noiseKey: noiseKey, ids: [1, 2]))) + #expect(first.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey)?.id == 1) + + // Consumption state survives a relaunch, so a restart can't reuse a prekey. + let second = PrekeyBundleStore(fileURL: fileURL) + #expect(second.assignPrekey(messageID: "m2", recipientNoiseKey: noiseKey)?.id == 2) + + second.wipe() + #expect(!FileManager.default.fileExists(atPath: fileURL.path)) + let third = PrekeyBundleStore(fileURL: fileURL) + #expect(!third.hasUsableBundle(for: noiseKey)) + } +} + +/// Envelope v2 wire compatibility: the prekey ID rides an optional TLV that +/// v1 decoders skip as unknown. +struct CourierEnvelopeV2Tests { + + @Test func prekeyIDRoundTrips() throws { + let envelope = CourierEnvelope( + recipientTag: Data(repeating: 0x11, count: CourierEnvelope.tagLength), + expiry: UInt64(Date().timeIntervalSince1970 * 1000) + 60_000, + ciphertext: Data("ciphertext".utf8), + copies: 4, + prekeyID: 0xAABB_CCDD + ) + let encoded = try #require(envelope.encode()) + let decoded = try #require(CourierEnvelope.decode(encoded)) + #expect(decoded == envelope) + #expect(decoded.prekeyID == 0xAABB_CCDD) + } + + @Test func v1EnvelopeDecodesWithNilPrekeyID() throws { + let envelope = CourierEnvelope( + recipientTag: Data(repeating: 0x22, count: CourierEnvelope.tagLength), + expiry: UInt64(Date().timeIntervalSince1970 * 1000) + 60_000, + ciphertext: Data("legacy".utf8) + ) + let encoded = try #require(envelope.encode()) + let decoded = try #require(CourierEnvelope.decode(encoded)) + #expect(decoded.prekeyID == nil) + } + + @Test func v1EncodingIsByteIdenticalWithoutPrekeyID() throws { + // Static-sealed envelopes must stay on the pre-prekey wire format. + let tag = Data(repeating: 0x33, count: CourierEnvelope.tagLength) + let expiry: UInt64 = 1_800_000_000_000 + let ciphertext = Data("same".utf8) + let v1 = try #require(CourierEnvelope(recipientTag: tag, expiry: expiry, ciphertext: ciphertext).encode()) + let v1Explicit = try #require(CourierEnvelope(recipientTag: tag, expiry: expiry, ciphertext: ciphertext, prekeyID: nil).encode()) + #expect(v1 == v1Explicit) + // And a v2 envelope is the v1 bytes plus one trailing TLV a v1 + // decoder skips as unknown. + let v2 = try #require(CourierEnvelope(recipientTag: tag, expiry: expiry, ciphertext: ciphertext, prekeyID: 7).encode()) + #expect(v2.prefix(v1.count) == v1) + #expect(v2.count == v1.count + 3 + 4) + } + + @Test func withCopiesPreservesPrekeyID() { + let envelope = CourierEnvelope( + recipientTag: Data(repeating: 0x44, count: CourierEnvelope.tagLength), + expiry: 1, + ciphertext: Data([0x01]), + copies: 4, + prekeyID: 9 + ) + #expect(envelope.withCopies(2).prekeyID == 9) + } +} diff --git a/bitchatTests/Prekeys/PrekeyBundleTests.swift b/bitchatTests/Prekeys/PrekeyBundleTests.swift new file mode 100644 index 00000000..8d9b212b --- /dev/null +++ b/bitchatTests/Prekeys/PrekeyBundleTests.swift @@ -0,0 +1,133 @@ +// +// PrekeyBundleTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import CryptoKit +import BitFoundation +@testable import bitchat + +/// Wire format and signature binding for gossiped one-time prekey bundles. +struct PrekeyBundleTests { + + private func makePrekeys(_ count: Int) -> [PrekeyBundle.Prekey] { + (0.. CourierEnvelope { - CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies) + CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies, prekeyID: prekeyID) } public var isExpired: Bool { @@ -97,6 +106,14 @@ public struct CourierEnvelope: Equatable { encoded.append(copies) } + // Omitted for v1 static-sealed envelopes so they stay byte-identical + // to the pre-prekey wire format. + if let prekeyID { + encoded.append(TLVType.prekeyID.rawValue) + appendBE(UInt16(4), into: &encoded) + appendBE(prekeyID, into: &encoded) + } + return encoded } @@ -108,6 +125,7 @@ public struct CourierEnvelope: Equatable { var expiry: UInt64? var ciphertext: Data? var copies: UInt8 = 1 + var prekeyID: UInt32? while cursor < end { let typeRaw = data[cursor] @@ -133,6 +151,9 @@ public struct CourierEnvelope: Equatable { case .copies: guard length == 1 else { return nil } copies = value.first ?? 1 + case .prekeyID: + guard length == 4 else { return nil } + prekeyID = value.reduce(UInt32(0)) { ($0 << 8) | UInt32($1) } case nil: // Unknown TLV: skip for forward compatibility. continue @@ -140,7 +161,7 @@ public struct CourierEnvelope: Equatable { } guard let recipientTag, let expiry, let ciphertext else { return nil } - return CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies) + return CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies, prekeyID: prekeyID) } // MARK: - Recipient Tags diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index ceac0cd0..a15177e1 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -16,14 +16,17 @@ public enum MessageType: UInt8 { case leave = 0x03 // "I'm leaving" case courierEnvelope = 0x04 // Store-and-forward envelope carried by a trusted peer case requestSync = 0x21 // GCS filter-based sync request (local-only) - + // Noise encryption case noiseHandshake = 0x10 // Handshake (init or response determined by payload) case noiseEncrypted = 0x11 // All encrypted payloads (messages, receipts, etc.) - + // Fragmentation (simplified) case fragment = 0x20 // Single fragment type for large messages case fileTransfer = 0x22 // Binary file/audio/image payloads + + // 0x23, 0x25-0x28 reserved for in-flight protocol work. + case prekeyBundle = 0x24 // Signed batch of one-time prekeys (gossiped) public var description: String { switch self { @@ -36,6 +39,7 @@ public enum MessageType: UInt8 { case .noiseEncrypted: return "noiseEncrypted" case .fragment: return "fragment" case .fileTransfer: return "fileTransfer" + case .prekeyBundle: return "prekeyBundle" } } } diff --git a/localPackages/BitFoundation/Sources/BitFoundation/PrekeyBundle.swift b/localPackages/BitFoundation/Sources/BitFoundation/PrekeyBundle.swift new file mode 100644 index 00000000..0e73a2c0 --- /dev/null +++ b/localPackages/BitFoundation/Sources/BitFoundation/PrekeyBundle.swift @@ -0,0 +1,195 @@ +// +// PrekeyBundle.swift +// BitFoundation +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation + +/// TLV payload for gossiped one-time prekey bundles (MessageType 0x24). +/// +/// A bundle publishes a batch of one-time Curve25519 public prekeys bound to +/// the owner's Noise static key by an Ed25519 signature over domain-prefixed +/// canonical bytes. Anyone holding the owner's announce-verified signing key +/// can verify a bundle offline, which is what lets bundles spread and persist +/// mesh-wide via gossip sync while the owner is away. Senders seal courier +/// mail to one of these prekeys (one-way Noise X) instead of the owner's +/// long-lived static key, restoring forward secrecy for async first contact. +public struct PrekeyBundle: Equatable { + public struct Prekey: Equatable { + public let id: UInt32 + /// Curve25519.KeyAgreement public key (32 bytes). + public let publicKey: Data + + public init(id: UInt32, publicKey: Data) { + self.id = id + self.publicKey = publicKey + } + } + + /// Noise static public key identifying whose prekeys these are (32 bytes). + public let noiseStaticPublicKey: Data + /// One-time prekeys, at most `maxPrekeys` per bundle. + public let prekeys: [Prekey] + /// Milliseconds since epoch when this bundle was generated; newer bundles + /// replace older ones for the same noise key. + public let generatedAt: UInt64 + /// Ed25519 signature over `signableBytes()` by the owner's announce-bound + /// signing key. + public let signature: Data + + public static let keyLength = 32 + public static let signatureLength = 64 + public static let maxPrekeys = 8 + private static let prekeyEntryLength = 4 + keyLength + + /// Domain separation for the bundle signature so it can never be confused + /// with announce or packet signatures. + private static let signingContext = Data("bitchat-prekey-bundle-v1".utf8) + + private enum TLVType: UInt8 { + case noiseStaticPublicKey = 0x01 + case prekeys = 0x02 + case generatedAt = 0x03 + case signature = 0x04 + } + + public init(noiseStaticPublicKey: Data, prekeys: [Prekey], generatedAt: UInt64, signature: Data) { + self.noiseStaticPublicKey = noiseStaticPublicKey + self.prekeys = prekeys + self.generatedAt = generatedAt + self.signature = signature + } + + /// Canonical bytes covered by the Ed25519 signature: domain context, + /// owner key, prekey count, each (id, key) pair, and the generation time. + /// Encoders and verifiers must derive these identically. + public func signableBytes() -> Data { + var out = Data() + out.reserveCapacity(1 + Self.signingContext.count + Self.keyLength + 1 + + prekeys.count * Self.prekeyEntryLength + 8) + out.append(UInt8(min(Self.signingContext.count, 255))) + out.append(Self.signingContext.prefix(255)) + out.append(paddedKey(noiseStaticPublicKey)) + out.append(UInt8(min(prekeys.count, 255))) + for prekey in prekeys.prefix(255) { + appendBE(prekey.id, into: &out) + out.append(paddedKey(prekey.publicKey)) + } + appendBE(generatedAt, into: &out) + return out + } + + public func encode() -> Data? { + guard noiseStaticPublicKey.count == Self.keyLength, + signature.count == Self.signatureLength, + !prekeys.isEmpty, prekeys.count <= Self.maxPrekeys, + prekeys.allSatisfy({ $0.publicKey.count == Self.keyLength }) else { + return nil + } + + var entries = Data() + entries.reserveCapacity(prekeys.count * Self.prekeyEntryLength) + for prekey in prekeys { + appendBE(prekey.id, into: &entries) + entries.append(prekey.publicKey) + } + + var encoded = Data() + encoded.reserveCapacity(4 * 3 + Self.keyLength + entries.count + 8 + Self.signatureLength) + + encoded.append(TLVType.noiseStaticPublicKey.rawValue) + appendBE(UInt16(noiseStaticPublicKey.count), into: &encoded) + encoded.append(noiseStaticPublicKey) + + encoded.append(TLVType.prekeys.rawValue) + appendBE(UInt16(entries.count), into: &encoded) + encoded.append(entries) + + encoded.append(TLVType.generatedAt.rawValue) + appendBE(UInt16(8), into: &encoded) + appendBE(generatedAt, into: &encoded) + + encoded.append(TLVType.signature.rawValue) + appendBE(UInt16(signature.count), into: &encoded) + encoded.append(signature) + + return encoded + } + + public static func decode(_ data: Data) -> PrekeyBundle? { + var cursor = data.startIndex + let end = data.endIndex + + var noiseStaticPublicKey: Data? + var prekeys: [Prekey]? + var generatedAt: UInt64? + var signature: Data? + + while cursor < end { + let typeRaw = data[cursor] + cursor = data.index(after: cursor) + + guard data.distance(from: cursor, to: end) >= 2 else { return nil } + let length = Int(data[cursor]) << 8 | Int(data[data.index(after: cursor)]) + cursor = data.index(cursor, offsetBy: 2) + guard data.distance(from: cursor, to: end) >= length else { return nil } + let value = data[cursor.. 0, length % prekeyEntryLength == 0, + length / prekeyEntryLength <= maxPrekeys else { return nil } + var parsed: [Prekey] = [] + var entryStart = value.startIndex + while entryStart < value.endIndex { + let idEnd = value.index(entryStart, offsetBy: 4) + let id = value[entryStart.. Data { + let fixed = key.prefix(Self.keyLength) + guard fixed.count < Self.keyLength else { return Data(fixed) } + return Data(fixed) + Data(repeating: 0, count: Self.keyLength - fixed.count) + } +} + +private func appendBE(_ value: T, into data: inout Data) { + var big = value.bigEndian + withUnsafeBytes(of: &big) { data.append(contentsOf: $0) } +} From b1ff5e6b821bfb2a1532da4e1ee6d3c2d4235977 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 20:18:00 +0200 Subject: [PATCH 009/158] NIP-13 proof-of-work for geohash channels: mine on send, relax rate limits for PoW senders Outgoing kind-20000 geohash messages mine a NIP-13 nonce tag (8 leading zero bits, ~256 hashes, typically <1 ms) off the main actor before signing. Mining is hard-capped at 2 s and cancellable (newer send or channel switch): on cap/cancel the committed target steps down so the message still ships promptly with an honest commitment - sending is never blocked and nothing is dropped. The hot loop serializes the canonical event once and rewrites only the fixed-width nonce bytes. Inbound kind-20000 events are scored per NIP-13 commitment semantics (committed target counts; the ID must actually meet it, extra work earns nothing) and never hard-rejected: validated PoW >= 8 bits skips the per-sender rate-limit bucket while the per-content flood bucket still applies, so old non-mining clients keep working under today's strict limits while bulk spam gets expensive. Presence heartbeats (kind 20001), kind-1 notes, and DMs are unchanged; no UI beyond a pow= field in an existing sampled debug log. Reimplemented from scratch rather than cherry-picking the stale feature/pow-geohash-mining-ui branch (unbounded loop, hard receive filtering, mining UI, XCTest, force unwraps). Co-Authored-By: Claude Fable 5 --- bitchat/Nostr/NostrPoW.swift | 215 +++++++++++++++++ bitchat/Nostr/NostrProtocol.swift | 67 +++++- .../ViewModels/ChatLifecycleCoordinator.swift | 2 +- .../ViewModels/ChatOutgoingCoordinator.swift | 189 +++++++-------- .../ChatPublicConversationCoordinator.swift | 18 +- bitchat/ViewModels/ChatViewModel.swift | 10 + bitchat/ViewModels/MessageRateLimiter.swift | 28 ++- bitchat/ViewModels/NostrInboundPipeline.swift | 14 +- .../ChatNostrCoordinatorContextTests.swift | 1 + .../ChatOutgoingCoordinatorContextTests.swift | 3 + ...cConversationCoordinatorContextTests.swift | 6 +- bitchatTests/MessageRateLimiterTests.swift | 119 ++++++++++ bitchatTests/Nostr/NostrPoWTests.swift | 222 ++++++++++++++++++ .../PerformanceBaselineTests.swift | 1 + 14 files changed, 769 insertions(+), 126 deletions(-) create mode 100644 bitchat/Nostr/NostrPoW.swift create mode 100644 bitchatTests/MessageRateLimiterTests.swift create mode 100644 bitchatTests/Nostr/NostrPoWTests.swift diff --git a/bitchat/Nostr/NostrPoW.swift b/bitchat/Nostr/NostrPoW.swift new file mode 100644 index 00000000..006bba6d --- /dev/null +++ b/bitchat/Nostr/NostrPoW.swift @@ -0,0 +1,215 @@ +import BitFoundation +import CryptoKit +import Foundation + +/// NIP-13 proof-of-work for Nostr events. +/// +/// Outgoing kind-20000 geohash messages mine a `["nonce", "", ""]` +/// tag so the event ID carries at least `target` leading zero bits. Inbound +/// events are scored (never hard-rejected — the network has clients that do +/// not mine): validated PoW at or above `rateLimitBypassBits` relaxes the +/// per-sender public rate limit, everything else keeps the strict limits. +enum NostrPoW { + + // MARK: - Tuning + + /// Difficulty (leading zero bits of the event ID) mined onto outgoing + /// geohash messages. 8 bits is ~256 hash attempts — typically well under + /// 100 ms on any supported device. + static let targetBits = 8 + + /// Inbound events whose validated NIP-13 difficulty is at least this many + /// bits skip the per-sender rate-limit bucket (the content-flood bucket + /// still applies). See `MessageRateLimiter.allow`. + static let rateLimitBypassBits = 8 + + /// Hard cap on mining wall-clock time. When it hits, the committed target + /// steps down until a difficulty reachable in a small extra budget is + /// found and the message is sent anyway — mining never blocks sending. + static let miningTimeCap: TimeInterval = 2.0 + + /// Budget for each stepped-down attempt after the main cap (or a task + /// cancellation) hits. + private static let fallbackTimeCap: TimeInterval = 0.15 + + /// The hot loop checks the deadline and task cancellation every this many + /// hash attempts. + private static let checkInterval: UInt64 = 1024 + + /// The nonce value is a fixed-width hex counter so the serialized event + /// template can be mutated in place without reallocation. + private static let nonceLength = 16 + + // MARK: - Scoring + + /// Number of leading zero bits in a byte sequence (NIP-13 difficulty of + /// an event-ID hash). + static func leadingZeroBits>(_ bytes: Bytes) -> Int { + var total = 0 + for byte in bytes { + if byte == 0 { + total += 8 + } else { + total += byte.leadingZeroBitCount + break + } + } + return total + } + + /// Validated NIP-13 difficulty of an inbound event. + /// + /// The committed target in the nonce tag is what counts: the actual + /// leading zero bits of the ID must meet it (otherwise the claim is void + /// and the event scores 0), and work beyond the commitment earns no extra + /// credit — this stops spammers who mine a low target from getting lucky + /// high scores. Events without a well-formed commitment score 0. + static func validatedDifficulty(idHex: String, tags: [[String]]) -> Int { + guard let nonceTag = tags.last(where: { $0.first == "nonce" }), + nonceTag.count >= 3, + let committed = Int(nonceTag[2]), + committed > 0, committed <= 256, + let idData = Data(hexString: idHex) + else { + return 0 + } + return leadingZeroBits(idData) >= committed ? committed : 0 + } + + // MARK: - Mining + + /// Mine a `["nonce", value, target]` tag for the given unsigned-event + /// fields. Nonisolated async: runs off the calling actor. + /// + /// Bounded by `miningTimeCap`: when the cap hits — or the surrounding + /// task is cancelled — the committed target steps down (halving to 0, + /// which any hash satisfies) so the event still ships promptly with an + /// honest commitment at the difficulty actually reached. Returns nil only + /// if canonical serialization fails; the caller then sends unmined. + static func mineNonceTag( + pubkey: String, + createdAt: Int, + kind: Int, + tags: [[String]], + content: String, + targetBits: Int = NostrPoW.targetBits + ) async -> [String]? { + var target = min(max(targetBits, 0), 256) + var budget = miningTimeCap + while true { + if let tag = mineAttempt( + pubkey: pubkey, + createdAt: createdAt, + kind: kind, + baseTags: tags, + content: content, + targetBits: target, + budget: budget + ) { + return tag + } + // Target 0 succeeds on the first hash, so reaching it with nil + // means serialization itself failed — give up on mining. + if target == 0 { return nil } + target /= 2 + budget = fallbackTimeCap + } + } + + /// One bounded mining pass at a fixed committed target. Allocation-light: + /// the canonical serialization is built once and only the fixed-width + /// nonce bytes are rewritten per attempt (the event ID is recomputed for + /// every attempt, per NIP-13). Returns nil on timeout/cancellation or if + /// the template could not be built. + private static func mineAttempt( + pubkey: String, + createdAt: Int, + kind: Int, + baseTags: [[String]], + content: String, + targetBits: Int, + budget: TimeInterval + ) -> [String]? { + let targetString = String(targetBits) + guard let template = serializedTemplate( + pubkey: pubkey, + createdAt: createdAt, + kind: kind, + baseTags: baseTags, + content: content, + targetString: targetString + ) else { + return nil + } + var buffer = template.buffer + let nonceRange = template.nonceRange + + let deadline = DispatchTime.now().uptimeNanoseconds &+ UInt64(budget * 1_000_000_000) + let hexDigits = [UInt8]("0123456789abcdef".utf8) + var nonce = UInt64.random(in: .min ... .max) + var attempts: UInt64 = 0 + + while true { + // Write the nonce as 16 lowercase hex chars, in place. + var value = nonce + var index = nonceRange.upperBound + while index > nonceRange.lowerBound { + index -= 1 + buffer[index] = hexDigits[Int(value & 0xF)] + value >>= 4 + } + + if leadingZeroBits(SHA256.hash(data: buffer)) >= targetBits { + // Identical to the bytes just written into the buffer. + return ["nonce", String(format: "%016llx", nonce), targetString] + } + + nonce &+= 1 + attempts &+= 1 + if attempts % checkInterval == 0, + Task.isCancelled || DispatchTime.now().uptimeNanoseconds >= deadline { + return nil + } + } + } + + /// Canonical NIP-01 serialization of the event with a placeholder nonce, + /// plus the byte range of the nonce value inside it. + /// + /// The range is located by serializing twice with two same-length + /// placeholders and diffing the buffers — the only differing bytes are + /// the nonce value, so this stays correct however `JSONSerialization` + /// escapes the surrounding fields (and even if the content contains the + /// placeholder text itself). + private static func serializedTemplate( + pubkey: String, + createdAt: Int, + kind: Int, + baseTags: [[String]], + content: String, + targetString: String + ) -> (buffer: Data, nonceRange: Range)? { + func serialize(noncePlaceholder: String) -> Data? { + var tags = baseTags + tags.append(["nonce", noncePlaceholder, targetString]) + let serialized: [Any] = [0, pubkey, createdAt, kind, tags, content] + return try? JSONSerialization.data(withJSONObject: serialized, options: [.withoutEscapingSlashes]) + } + + guard let zeros = serialize(noncePlaceholder: String(repeating: "0", count: nonceLength)), + let effs = serialize(noncePlaceholder: String(repeating: "f", count: nonceLength)), + zeros.count == effs.count + else { + return nil + } + + var firstDiff = -1 + var lastDiff = -1 + for index in 0..= 0, lastDiff - firstDiff + 1 == nonceLength else { return nil } + return (zeros, firstDiff..<(firstDiff + nonceLength)) + } +} diff --git a/bitchat/Nostr/NostrProtocol.swift b/bitchat/Nostr/NostrProtocol.swift index d59a5200..83578e2b 100644 --- a/bitchat/Nostr/NostrProtocol.swift +++ b/bitchat/Nostr/NostrProtocol.swift @@ -170,6 +170,63 @@ struct NostrProtocol { nickname: String? = nil, teleported: Bool = false ) throws -> NostrEvent { + let event = NostrEvent( + pubkey: senderIdentity.publicKeyHex, + createdAt: Date(), + kind: .ephemeralEvent, + tags: ephemeralGeohashTags(geohash: geohash, nickname: nickname, teleported: teleported), + content: content + ) + let schnorrKey = try senderIdentity.schnorrSigningKey() + return try event.sign(with: schnorrKey) + } + + /// Create a kind-20000 geohash message carrying a NIP-13 proof-of-work + /// nonce tag (see `NostrPoW`). Mining runs off the calling actor and is + /// bounded by `NostrPoW.miningTimeCap`; when the cap hits (or the + /// surrounding task is cancelled) the event ships at the highest + /// committed difficulty still met, and if mining is impossible it ships + /// unmined — sending is never blocked. + static func createMinedEphemeralGeohashEvent( + content: String, + geohash: String, + senderIdentity: NostrIdentity, + nickname: String? = nil, + teleported: Bool = false, + powTargetBits: Int = NostrPoW.targetBits + ) async throws -> NostrEvent { + var tags = ephemeralGeohashTags(geohash: geohash, nickname: nickname, teleported: teleported) + // Fix created_at up front: the mined nonce commits to the full + // serialized event, so the signed event must reuse the exact value. + let createdAt = Int(Date().timeIntervalSince1970) + if let nonceTag = await NostrPoW.mineNonceTag( + pubkey: senderIdentity.publicKeyHex, + createdAt: createdAt, + kind: EventKind.ephemeralEvent.rawValue, + tags: tags, + content: content, + targetBits: powTargetBits + ) { + tags.append(nonceTag) + } + let event = NostrEvent( + pubkey: senderIdentity.publicKeyHex, + createdAt: Date(timeIntervalSince1970: TimeInterval(createdAt)), + kind: .ephemeralEvent, + tags: tags, + content: content + ) + let schnorrKey = try senderIdentity.schnorrSigningKey() + return try event.sign(with: schnorrKey) + } + + /// Tags for a kind-20000 geohash message (shared by the plain and mined + /// variants). + private static func ephemeralGeohashTags( + geohash: String, + nickname: String?, + teleported: Bool + ) -> [[String]] { var tags = [["g", geohash]] if let nickname = nickname?.trimmedOrNilIfEmpty { tags.append(["n", nickname]) @@ -177,15 +234,7 @@ struct NostrProtocol { if teleported { tags.append(["t", "teleport"]) } - let event = NostrEvent( - pubkey: senderIdentity.publicKeyHex, - createdAt: Date(), - kind: .ephemeralEvent, - tags: tags, - content: content - ) - let schnorrKey = try senderIdentity.schnorrSigningKey() - return try event.sign(with: schnorrKey) + return tags } /// Create a geohash presence heartbeat (kind 20001) diff --git a/bitchat/ViewModels/ChatLifecycleCoordinator.swift b/bitchat/ViewModels/ChatLifecycleCoordinator.swift index bea1b5b2..60c199f6 100644 --- a/bitchat/ViewModels/ChatLifecycleCoordinator.swift +++ b/bitchat/ViewModels/ChatLifecycleCoordinator.swift @@ -324,7 +324,7 @@ private extension ChatLifecycleCoordinator { do { let identity = try context.deriveNostrIdentity(forGeohash: channel.geohash) - let event = try NostrProtocol.createEphemeralGeohashEvent( + let event = try await NostrProtocol.createMinedEphemeralGeohashEvent( content: message, geohash: channel.geohash, senderIdentity: identity, diff --git a/bitchat/ViewModels/ChatOutgoingCoordinator.swift b/bitchat/ViewModels/ChatOutgoingCoordinator.swift index 915ea7fa..b53de6c9 100644 --- a/bitchat/ViewModels/ChatOutgoingCoordinator.swift +++ b/bitchat/ViewModels/ChatOutgoingCoordinator.swift @@ -68,10 +68,22 @@ extension ChatViewModel: ChatOutgoingContext { final class ChatOutgoingCoordinator { private unowned let context: any ChatOutgoingContext + /// In-flight NIP-13 mining for the most recent geohash send. A newer send + /// (or leaving the channel) cancels it, which only expedites the mining — + /// the message still goes out at the difficulty already reached. + /// (Read access is internal so tests can await the send's completion.) + private(set) var geohashMiningTask: Task? + init(context: any ChatOutgoingContext) { self.context = context } + /// Finish any in-flight geohash PoW mining early (the pending message + /// still sends, at whatever committed difficulty it reached). + func expeditePendingGeohashMining() { + geohashMiningTask?.cancel() + } + func sendMessage(_ content: String) { guard let trimmed = content.trimmedOrNilIfEmpty else { return } @@ -92,120 +104,109 @@ final class ChatOutgoingCoordinator { } let mentions = context.parseMentions(from: content) - let preparedMessage = preparePublicMessage(content: content, trimmed: trimmed, mentions: mentions) - guard let preparedMessage else { return } - appendLocalEcho(preparedMessage.message) - routePublicMessage( - originalContent: content, - mentions: mentions, - geoContext: preparedMessage.geoContext, - messageID: preparedMessage.message.id, - timestamp: preparedMessage.message.timestamp - ) + switch context.activeChannel { + case .mesh: + sendMeshPublicMessage(originalContent: content, trimmed: trimmed, mentions: mentions) + case .location(let channel): + sendGeohashPublicMessage(trimmed, mentions: mentions, channel: channel) + } } } private extension ChatOutgoingCoordinator { - func preparePublicMessage( - content: String, - trimmed: String, - mentions: [String] - ) -> (message: BitchatMessage, geoContext: ChatViewModel.GeoOutgoingContext?)? { - var geoContext: ChatViewModel.GeoOutgoingContext? - var displaySender = context.nickname - var localSenderPeerID = context.myPeerID - var messageID: String? - var messageTimestamp = Date() + func sendMeshPublicMessage(originalContent: String, trimmed: String, mentions: [String]) { + let message = BitchatMessage( + sender: context.nickname, + content: trimmed, + timestamp: Date(), + isRelay: false, + senderPeerID: context.myPeerID, + mentions: mentions.isEmpty ? nil : mentions + ) - switch context.activeChannel { - case .mesh: - break + appendLocalEcho(message, to: .mesh) + context.recordPublicActivity(forChannelKey: "mesh") + context.sendMeshMessage( + originalContent, + mentions: mentions, + messageID: message.id, + timestamp: message.timestamp + ) + } - case .location(let channel): + /// Geohash sends mine a NIP-13 nonce tag first (off the main actor, see + /// `NostrPoW`), so the whole echo-and-send runs in a task once the signed + /// event — whose ID is also the local message ID — exists. Typical mining + /// at the default target is well under 100 ms and hard-capped at + /// `NostrPoW.miningTimeCap`, so sending is never meaningfully delayed. + func sendGeohashPublicMessage(_ trimmed: String, mentions: [String], channel: GeohashChannel) { + let identity: NostrIdentity + do { + identity = try context.deriveNostrIdentity(forGeohash: channel.geohash) + } catch { + SecureLogger.error("❌ Failed to prepare geohash message: \(error)", category: .session) + context.addSystemMessage( + String(localized: "system.location.send_failed", comment: "System message when a location channel send fails") + ) + return + } + + let displaySender = context.nickname + "#" + String(identity.publicKeyHex.suffix(4)) + let senderPeerID = PeerID(nostr: identity.publicKeyHex) + let teleported = context.isTeleported + let nickname = context.nickname + + // A newer send expedites the previous one's mining so sends keep + // their order and mining delays never stack. + geohashMiningTask?.cancel() + geohashMiningTask = Task { @MainActor [weak context = self.context] in + let event: NostrEvent do { - let identity = try context.deriveNostrIdentity(forGeohash: channel.geohash) - let suffix = String(identity.publicKeyHex.suffix(4)) - displaySender = context.nickname + "#" + suffix - localSenderPeerID = PeerID(nostr: identity.publicKeyHex) - - let teleported = context.isTeleported - let event = try NostrProtocol.createEphemeralGeohashEvent( + event = try await NostrProtocol.createMinedEphemeralGeohashEvent( content: trimmed, geohash: channel.geohash, senderIdentity: identity, - nickname: context.nickname, - teleported: teleported - ) - - messageID = event.id - messageTimestamp = Date(timeIntervalSince1970: TimeInterval(event.created_at)) - geoContext = ( - channel: channel, - event: event, - identity: identity, + nickname: nickname, teleported: teleported ) } catch { SecureLogger.error("❌ Failed to prepare geohash message: \(error)", category: .session) - context.addSystemMessage( - String(localized: "system.location.send_failed", comment: "System message when a location channel send fails") - ) - return nil - } - } - - let message = BitchatMessage( - id: messageID, - sender: displaySender, - content: trimmed, - timestamp: messageTimestamp, - isRelay: false, - senderPeerID: localSenderPeerID, - mentions: mentions.isEmpty ? nil : mentions - ) - - return (message, geoContext) - } - - func appendLocalEcho(_ message: BitchatMessage) { - context.appendPublicMessage(message, to: ConversationID(channelID: context.activeChannel)) - - let contentKey = context.normalizedContentKey(message.content) - context.recordContentKey(contentKey, timestamp: message.timestamp) - } - - func routePublicMessage( - originalContent: String, - mentions: [String], - geoContext: ChatViewModel.GeoOutgoingContext?, - messageID: String, - timestamp: Date - ) { - switch context.activeChannel { - case .mesh: - context.recordPublicActivity(forChannelKey: "mesh") - context.sendMeshMessage( - originalContent, - mentions: mentions, - messageID: messageID, - timestamp: timestamp - ) - - case .location(let channel): - context.recordPublicActivity(forChannelKey: "geo:\(channel.geohash)") - - guard let geoContext, geoContext.channel.geohash == channel.geohash else { - SecureLogger.error("Geo: missing send context for \(channel.geohash)", category: .session) - context.addSystemMessage( + context?.addSystemMessage( String(localized: "system.location.send_failed", comment: "System message when a location channel send fails") ) return } + guard let context else { return } - Task { @MainActor [weak context = self.context] in - context?.sendGeohash(context: geoContext) - } + let message = BitchatMessage( + id: event.id, + sender: displaySender, + content: trimmed, + timestamp: Date(timeIntervalSince1970: TimeInterval(event.created_at)), + isRelay: false, + senderPeerID: senderPeerID, + mentions: mentions.isEmpty ? nil : mentions + ) + + context.appendPublicMessage(message, to: ConversationID(channelID: .location(channel))) + let contentKey = context.normalizedContentKey(message.content) + context.recordContentKey(contentKey, timestamp: message.timestamp) + + context.recordPublicActivity(forChannelKey: "geo:\(channel.geohash)") + context.sendGeohash(context: ( + channel: channel, + event: event, + identity: identity, + teleported: teleported + )) } } + + func appendLocalEcho(_ message: BitchatMessage, to conversationID: ConversationID) { + context.appendPublicMessage(message, to: conversationID) + + let contentKey = context.normalizedContentKey(message.content) + context.recordContentKey(contentKey, timestamp: message.timestamp) + } } diff --git a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift index d6777a71..5a9ad6db 100644 --- a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift @@ -82,7 +82,9 @@ protocol ChatPublicConversationContext: AnyObject { // MARK: Inbound public message processing func processActionMessage(_ message: BitchatMessage) -> BitchatMessage func isMessageBlocked(_ message: BitchatMessage) -> Bool - func allowPublicMessage(senderKey: String, contentKey: String) -> Bool + /// `powBits` is the validated NIP-13 difficulty of the source Nostr event + /// (0 for mesh messages); sufficient PoW relaxes the per-sender bucket. + func allowPublicMessage(senderKey: String, contentKey: String, powBits: Int) -> Bool /// Buffers a visible-channel message for the batched (~80 ms) pipeline /// flush, which commits it to `conversationID` in the store. func enqueuePublicMessage(_ message: BitchatMessage, to conversationID: ConversationID) @@ -137,8 +139,8 @@ extension ChatViewModel: ChatPublicConversationContext { meshService.sendMessage(content, mentions: mentions, messageID: messageID, timestamp: timestamp) } - func allowPublicMessage(senderKey: String, contentKey: String) -> Bool { - publicRateLimiter.allow(senderKey: senderKey, contentKey: contentKey) + func allowPublicMessage(senderKey: String, contentKey: String, powBits: Int) -> Bool { + publicRateLimiter.allow(senderKey: senderKey, contentKey: contentKey, powBits: powBits) } func enqueuePublicMessage(_ message: BitchatMessage, to conversationID: ConversationID) { @@ -367,7 +369,7 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { guard let context else { return } do { let identity = try context.deriveNostrIdentity(forGeohash: channel.geohash) - let event = try NostrProtocol.createEphemeralGeohashEvent( + let event = try await NostrProtocol.createMinedEphemeralGeohashEvent( content: content, geohash: channel.geohash, senderIdentity: identity, @@ -395,7 +397,11 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { ) } - func handlePublicMessage(_ message: BitchatMessage) { + /// - Parameter powBits: validated NIP-13 difficulty of the source Nostr + /// event (0 for mesh messages). Sufficient PoW relaxes the per-sender + /// rate limit; low/no-PoW events keep the strict limits so old clients + /// still get through at normal rates. + func handlePublicMessage(_ message: BitchatMessage, powBits: Int = 0) { let finalMessage = context.processActionMessage(message) if context.isMessageBlocked(finalMessage) { return } @@ -405,7 +411,7 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { if shouldRateLimit { let senderKey = normalizedSenderKey(for: finalMessage) let contentKey = context.normalizedContentKey(finalMessage.content) - if !context.allowPublicMessage(senderKey: senderKey, contentKey: contentKey) { + if !context.allowPublicMessage(senderKey: senderKey, contentKey: contentKey, powBits: powBits) { return } } diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 578b6509..d995ecff 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -311,6 +311,9 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele get { conversations.activeChannel } set { guard conversations.activeChannel != newValue else { return } + // Leaving a channel expedites any in-flight NIP-13 mining: the + // pending message still sends, at the difficulty already reached. + outgoingCoordinator.expeditePendingGeohashMining() conversations.setActiveChannel(newValue) visibleMessagesCache = nil objectWillChange.send() @@ -1683,6 +1686,13 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele publicConversationCoordinator.handlePublicMessage(message) } + /// Handle an incoming public Nostr message with its validated NIP-13 + /// difficulty; sufficient PoW relaxes the per-sender rate limit. + @MainActor + func handlePublicMessage(_ message: BitchatMessage, powBits: Int) { + publicConversationCoordinator.handlePublicMessage(message, powBits: powBits) + } + /// Check for mentions and send notifications func checkForMentions(_ message: BitchatMessage) { publicConversationCoordinator.checkForMentions(message) diff --git a/bitchat/ViewModels/MessageRateLimiter.swift b/bitchat/ViewModels/MessageRateLimiter.swift index 5bca9a6d..a0309447 100644 --- a/bitchat/ViewModels/MessageRateLimiter.swift +++ b/bitchat/ViewModels/MessageRateLimiter.swift @@ -48,15 +48,25 @@ struct MessageRateLimiter { self.contentRefill = contentRefillPerSec } - mutating func allow(senderKey: String, contentKey: String, now: Date = Date()) -> Bool { - var senderBucket = senderBuckets[senderKey] ?? TokenBucket( - capacity: senderCapacity, - tokens: senderCapacity, - refillPerSec: senderRefill, - lastRefill: now - ) - let senderAllowed = senderBucket.allow(now: now) - senderBuckets[senderKey] = senderBucket + /// - Parameter powBits: validated NIP-13 difficulty of the event + /// (`NostrPoW.validatedDifficulty`; 0 for mesh or no-PoW events). + /// At or above `NostrPoW.rateLimitBypassBits` the per-sender bucket is + /// skipped entirely — each such message paid for itself with work — but + /// the per-content flood bucket still applies. + mutating func allow(senderKey: String, contentKey: String, powBits: Int = 0, now: Date = Date()) -> Bool { + let senderAllowed: Bool + if powBits >= NostrPoW.rateLimitBypassBits { + senderAllowed = true + } else { + var senderBucket = senderBuckets[senderKey] ?? TokenBucket( + capacity: senderCapacity, + tokens: senderCapacity, + refillPerSec: senderRefill, + lastRefill: now + ) + senderAllowed = senderBucket.allow(now: now) + senderBuckets[senderKey] = senderBucket + } var contentBucket = contentBuckets[contentKey] ?? TokenBucket( capacity: contentCapacity, diff --git a/bitchat/ViewModels/NostrInboundPipeline.swift b/bitchat/ViewModels/NostrInboundPipeline.swift index 337fa474..2d2e6825 100644 --- a/bitchat/ViewModels/NostrInboundPipeline.swift +++ b/bitchat/ViewModels/NostrInboundPipeline.swift @@ -32,7 +32,10 @@ protocol NostrInboundPipelineContext: AnyObject { func recordGeoParticipant(pubkeyHex: String) // MARK: Inbound public messages - func handlePublicMessage(_ message: BitchatMessage) + /// `powBits` is the validated NIP-13 difficulty of the source event + /// (`NostrPoW.validatedDifficulty`); it relaxes the per-sender rate limit + /// downstream. + func handlePublicMessage(_ message: BitchatMessage, powBits: Int) func checkForMentions(_ message: BitchatMessage) func sendHapticFeedback(for message: BitchatMessage) func parseMentions(from content: String) -> [String] @@ -152,6 +155,7 @@ final class NostrInboundPipeline { let rawTs = Date(timeIntervalSince1970: TimeInterval(event.created_at)) let timestamp = min(rawTs, Date()) let mentions = context.parseMentions(from: content) + let powBits = NostrPoW.validatedDifficulty(idHex: event.id, tags: event.tags) let message = BitchatMessage( id: event.id, sender: senderName, @@ -165,7 +169,7 @@ final class NostrInboundPipeline { Task { @MainActor [weak context] in guard let context else { return } let isBlocked = context.isNostrBlocked(pubkeyHexLowercased: event.pubkey.lowercased()) - context.handlePublicMessage(message) + context.handlePublicMessage(message, powBits: powBits) if !isBlocked { context.checkForMentions(message) context.sendHapticFeedback(for: message) @@ -187,10 +191,12 @@ final class NostrInboundPipeline { guard event.isValidSignature() else { return } context.recordProcessedNostrEvent(event.id) + let powBits = NostrPoW.validatedDifficulty(idHex: event.id, tags: event.tags) + // Sampled: fires for every geo event and floods dev logs in busy geohashes. geoEventLogCount += 1 if geoEventLogCount == 1 || geoEventLogCount.isMultiple(of: TransportConfig.nostrInboundEventLogInterval) { - SecureLogger.debug("GeoTeleport: recv #\(geoEventLogCount) pub=\(event.pubkey.prefix(8))… tags=\(event.tags.map { "[" + $0.joined(separator: ",") + "]" }.joined(separator: ","))", category: .session) + SecureLogger.debug("GeoTeleport: recv #\(geoEventLogCount) pub=\(event.pubkey.prefix(8))… pow=\(powBits) tags=\(event.tags.map { "[" + $0.joined(separator: ",") + "]" }.joined(separator: ","))", category: .session) } if context.isNostrBlocked(pubkeyHexLowercased: event.pubkey) { @@ -255,7 +261,7 @@ final class NostrInboundPipeline { Task { @MainActor [weak context] in guard let context else { return } - context.handlePublicMessage(message) + context.handlePublicMessage(message, powBits: powBits) context.checkForMentions(message) context.sendHapticFeedback(for: message) } diff --git a/bitchatTests/ChatNostrCoordinatorContextTests.swift b/bitchatTests/ChatNostrCoordinatorContextTests.swift index 7777310e..5cbd0c7d 100644 --- a/bitchatTests/ChatNostrCoordinatorContextTests.swift +++ b/bitchatTests/ChatNostrCoordinatorContextTests.swift @@ -71,6 +71,7 @@ private final class MockChatNostrContext: ChatNostrContext { private(set) var hapticMessageIDs: [String] = [] func handlePublicMessage(_ message: BitchatMessage) { handledPublicMessages.append(message) } + func handlePublicMessage(_ message: BitchatMessage, powBits: Int) { handledPublicMessages.append(message) } func checkForMentions(_ message: BitchatMessage) { mentionCheckedMessageIDs.append(message.id) } func sendHapticFeedback(for message: BitchatMessage) { hapticMessageIDs.append(message.id) } func parseMentions(from content: String) -> [String] { [] } diff --git a/bitchatTests/ChatOutgoingCoordinatorContextTests.swift b/bitchatTests/ChatOutgoingCoordinatorContextTests.swift index 6ed7c6da..e8d11baa 100644 --- a/bitchatTests/ChatOutgoingCoordinatorContextTests.swift +++ b/bitchatTests/ChatOutgoingCoordinatorContextTests.swift @@ -192,6 +192,9 @@ struct ChatOutgoingCoordinatorContextTests { context.isTeleported = true coordinator.sendMessage("hello geo") + // Geohash sends mine a NIP-13 nonce tag off-main before echoing and + // sending; await the send task, then drain the main queue. + await coordinator.geohashMiningTask?.value await drainMainActorTasks() // Local echo carries the geohash sender suffix (#last-4-of-pubkey) and diff --git a/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift b/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift index 9bcd2b93..be76fe82 100644 --- a/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift +++ b/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift @@ -186,7 +186,7 @@ private final class MockChatPublicConversationContext: ChatPublicConversationCon // Inbound public message processing var blockedMessageIDs: Set = [] var rateLimitAllowed = true - private(set) var rateLimitChecks: [(senderKey: String, contentKey: String)] = [] + private(set) var rateLimitChecks: [(senderKey: String, contentKey: String, powBits: Int)] = [] private(set) var enqueuedMessages: [(messageID: String, conversationID: ConversationID)] = [] var enqueuedMessageIDs: [String] { enqueuedMessages.map(\.messageID) } var stablePeerIDs: [PeerID: PeerID] = [:] @@ -199,8 +199,8 @@ private final class MockChatPublicConversationContext: ChatPublicConversationCon blockedMessageIDs.contains(message.id) } - func allowPublicMessage(senderKey: String, contentKey: String) -> Bool { - rateLimitChecks.append((senderKey, contentKey)) + func allowPublicMessage(senderKey: String, contentKey: String, powBits: Int) -> Bool { + rateLimitChecks.append((senderKey, contentKey, powBits)) return rateLimitAllowed } diff --git a/bitchatTests/MessageRateLimiterTests.swift b/bitchatTests/MessageRateLimiterTests.swift new file mode 100644 index 00000000..c9959761 --- /dev/null +++ b/bitchatTests/MessageRateLimiterTests.swift @@ -0,0 +1,119 @@ +// +// MessageRateLimiterTests.swift +// bitchatTests +// +// Tests for the public-intake token buckets, including the NIP-13 +// proof-of-work relaxation of the per-sender bucket. +// + +import Foundation +import Testing +@testable import bitchat + +struct MessageRateLimiterTests { + + private func makeLimiter( + senderCapacity: Double = 2, + contentCapacity: Double = 100 + ) -> MessageRateLimiter { + MessageRateLimiter( + senderCapacity: senderCapacity, + senderRefillPerSec: 0.0001, + contentCapacity: contentCapacity, + contentRefillPerSec: 0.0001 + ) + } + + @Test func senderBucketBlocksAfterCapacity() { + var limiter = makeLimiter() + let now = Date() + + let first = limiter.allow(senderKey: "s", contentKey: "c1", now: now) + let second = limiter.allow(senderKey: "s", contentKey: "c2", now: now) + let third = limiter.allow(senderKey: "s", contentKey: "c3", now: now) + let otherSender = limiter.allow(senderKey: "other", contentKey: "c4", now: now) + + #expect(first) + #expect(second) + #expect(!third) + #expect(otherSender) + } + + @Test func validPoWBypassesExhaustedSenderBucket() { + var limiter = makeLimiter() + let now = Date() + + // Exhaust the sender bucket with plain (no-PoW) messages. + let first = limiter.allow(senderKey: "s", contentKey: "c1", now: now) + let second = limiter.allow(senderKey: "s", contentKey: "c2", now: now) + let exhausted = limiter.allow(senderKey: "s", contentKey: "c3", now: now) + + // A message carrying sufficient validated PoW still passes, and so + // does more-than-sufficient PoW; plain messages stay blocked. + let powExact = limiter.allow( + senderKey: "s", + contentKey: "c4", + powBits: NostrPoW.rateLimitBypassBits, + now: now + ) + let powHigh = limiter.allow(senderKey: "s", contentKey: "c5", powBits: 20, now: now) + let plainAgain = limiter.allow(senderKey: "s", contentKey: "c6", now: now) + + #expect(first) + #expect(second) + #expect(!exhausted) + #expect(powExact) + #expect(powHigh) + #expect(!plainAgain) + } + + @Test func lowPoWDoesNotBypassSenderBucket() { + var limiter = makeLimiter(senderCapacity: 1) + let now = Date() + + let first = limiter.allow(senderKey: "s", contentKey: "c1", now: now) + let lowPow = limiter.allow( + senderKey: "s", + contentKey: "c2", + powBits: NostrPoW.rateLimitBypassBits - 1, + now: now + ) + let zeroPow = limiter.allow(senderKey: "s", contentKey: "c3", powBits: 0, now: now) + + #expect(first) + #expect(!lowPow) + #expect(!zeroPow) + } + + @Test func powDoesNotBypassContentFloodBucket() { + var limiter = makeLimiter(senderCapacity: 100, contentCapacity: 1) + let now = Date() + + let first = limiter.allow(senderKey: "a", contentKey: "same", now: now) + // Identical content spammed with PoW is still throttled by the + // content bucket: PoW only relaxes the per-sender limit. + let powSameContent = limiter.allow(senderKey: "b", contentKey: "same", powBits: 20, now: now) + let powNewContent = limiter.allow(senderKey: "b", contentKey: "different", powBits: 20, now: now) + + #expect(first) + #expect(!powSameContent) + #expect(powNewContent) + } + + @Test func powBypassDoesNotDrainSenderBucket() { + var limiter = makeLimiter(senderCapacity: 1) + let now = Date() + + // PoW messages don't consume sender tokens, so a subsequent plain + // message still has its full budget. + let powFirst = limiter.allow(senderKey: "s", contentKey: "c1", powBits: 20, now: now) + let powSecond = limiter.allow(senderKey: "s", contentKey: "c2", powBits: 20, now: now) + let plain = limiter.allow(senderKey: "s", contentKey: "c3", now: now) + let plainExhausted = limiter.allow(senderKey: "s", contentKey: "c4", now: now) + + #expect(powFirst) + #expect(powSecond) + #expect(plain) + #expect(!plainExhausted) + } +} diff --git a/bitchatTests/Nostr/NostrPoWTests.swift b/bitchatTests/Nostr/NostrPoWTests.swift new file mode 100644 index 00000000..1905e0f0 --- /dev/null +++ b/bitchatTests/Nostr/NostrPoWTests.swift @@ -0,0 +1,222 @@ +// +// NostrPoWTests.swift +// bitchatTests +// +// Tests for NIP-13 proof-of-work: leading-zero-bit counting, commitment +// semantics, and nonce-tag mining for geohash (kind 20000) events. +// + +import CryptoKit +import Foundation +import Testing +import BitFoundation +@testable import bitchat + +struct NostrPoWTests { + + // MARK: - Leading zero bits + + @Test func leadingZeroBitsVectors() { + #expect(NostrPoW.leadingZeroBits(Data()) == 0) + #expect(NostrPoW.leadingZeroBits(Data([0x80])) == 0) + #expect(NostrPoW.leadingZeroBits(Data([0xFF, 0x00])) == 0) + #expect(NostrPoW.leadingZeroBits(Data([0x40])) == 1) + #expect(NostrPoW.leadingZeroBits(Data([0x01])) == 7) + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0x00, 0xF0])) == 16) + #expect(NostrPoW.leadingZeroBits(Data(repeating: 0x00, count: 32)) == 256) + } + + @Test func leadingZeroBitsExactByteBoundaries() { + // Zero byte contributes exactly 8, then the next byte decides. + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0xFF])) == 8) + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0x80])) == 8) + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0x7F])) == 9) + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0x01])) == 15) + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0x00, 0x01])) == 23) + } + + @Test func leadingZeroBitsMatchesNIP13ExampleVector() throws { + // Worked example from the NIP-13 spec: this event ID has 36 leading + // zero bits. + let idHex = "000000000e9d97a1ab09fc381030b346cdd7a142ad57e6df0b46dc9bef6c7e2d" + let idData = try #require(Data(hexString: idHex)) + #expect(NostrPoW.leadingZeroBits(idData) == 36) + } + + // MARK: - Commitment semantics + + /// An ID with exactly 16 leading zero bits. + private let id16 = "0000f000" + String(repeating: "ab", count: 28) + + @Test func committedTargetCountsNotActualDifficulty() { + // Claimed < actual: only the committed target is credited, so lucky + // extra zeroes earn nothing beyond the commitment. + let tags = [["g", "u4pruy"], ["nonce", "12345", "8"]] + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: tags) == 8) + } + + @Test func unmetCommitmentScoresZero() { + // Actual < claimed: the commitment is not met, so the claim is void. + let tags = [["nonce", "12345", "24"]] + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: tags) == 0) + } + + @Test func exactCommitmentIsCredited() { + let tags = [["nonce", "12345", "16"]] + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: tags) == 16) + } + + @Test func missingOrMalformedNonceTagScoresZero() { + // No nonce tag at all: leading zeroes without a commitment earn no + // credit (old clients simply keep the strict rate limits). + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["g", "u4pruy"]]) == 0) + // Nonce tag without a committed target. + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["nonce", "12345"]]) == 0) + // Non-numeric or nonsensical targets. + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["nonce", "1", "high"]]) == 0) + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["nonce", "1", "0"]]) == 0) + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["nonce", "1", "-4"]]) == 0) + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["nonce", "1", "400"]]) == 0) + // Malformed event ID. + #expect(NostrPoW.validatedDifficulty(idHex: "not-hex", tags: [["nonce", "1", "8"]]) == 0) + } + + // MARK: - Mining + + @Test func minedNonceTagMeetsCommittedDifficulty() async throws { + let pubkey = String(repeating: "a", count: 64) + let createdAt = 1_700_000_000 + let baseTags = [["g", "u4pruydq"], ["n", "tester"]] + let content = "hello pow" + + let nonceTag = try #require(await NostrPoW.mineNonceTag( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags, + content: content, + targetBits: 8 + )) + + #expect(nonceTag.count == 3) + #expect(nonceTag.first == "nonce") + #expect(nonceTag[2] == "8") + + // Recompute the canonical NIP-01 event ID with the mined tag appended + // and verify the committed difficulty is genuinely met. + let idData = try Self.eventIDHash( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags + [nonceTag], + content: content + ) + #expect(NostrPoW.leadingZeroBits(idData) >= 8) + let idHex = idData.map { String(format: "%02x", $0) }.joined() + #expect(NostrPoW.validatedDifficulty(idHex: idHex, tags: baseTags + [nonceTag]) == 8) + } + + @Test func miningSurvivesContentThatNeedsEscaping() async throws { + // The in-place template mutation must stay correct when the content + // gets JSON-escaped — including content that contains hex runs that + // look exactly like the internal nonce placeholder. + let pubkey = String(repeating: "b", count: 64) + let createdAt = 1_700_000_123 + let content = "she said \"hi\"\n0000000000000000 / ffffffffffffffff 😀\\" + let baseTags = [["g", "9q8yy"]] + + let nonceTag = try #require(await NostrPoW.mineNonceTag( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags, + content: content, + targetBits: 4 + )) + + let idData = try Self.eventIDHash( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags + [nonceTag], + content: content + ) + #expect(NostrPoW.leadingZeroBits(idData) >= 4) + } + + @Test func minedGeohashEventValidatesEndToEnd() async throws { + let identity = try NostrIdentity.generate() + let event = try await NostrProtocol.createMinedEphemeralGeohashEvent( + content: "hello from a mined event", + geohash: "u4pruydq", + senderIdentity: identity, + nickname: "miner", + teleported: false + ) + + // The signed event's own ID (recomputed by sign()) carries the work. + #expect(event.isValidSignature()) + let idData = try #require(Data(hexString: event.id)) + #expect(NostrPoW.leadingZeroBits(idData) >= NostrPoW.targetBits) + #expect(NostrPoW.validatedDifficulty(idHex: event.id, tags: event.tags) == NostrPoW.targetBits) + + // Mining must not disturb the regular geohash tags. + #expect(event.tags.contains(["g", "u4pruydq"])) + #expect(event.tags.contains(["n", "miner"])) + #expect(event.kind == NostrProtocol.EventKind.ephemeralEvent.rawValue) + } + + @Test func cancelledMiningStillProducesHonestCommitment() async throws { + // Cancelling the surrounding task expedites mining: it steps the + // committed target down and still returns a tag whose commitment the + // hash actually meets — the message is never dropped or dishonest. + let pubkey = String(repeating: "c", count: 64) + let createdAt = 1_700_000_456 + let baseTags = [["g", "gbsuv"]] + let content = "expedited" + + let miningTask = Task { + await NostrPoW.mineNonceTag( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags, + content: content, + targetBits: 240 // unreachable: forces the cap/cancel path + ) + } + miningTask.cancel() + + let nonceTag = try #require(await miningTask.value) + let committed = try #require(Int(nonceTag[2])) + #expect(committed >= 0) + #expect(committed < 240) + + if committed > 0 { + let idData = try Self.eventIDHash( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags + [nonceTag], + content: content + ) + #expect(NostrPoW.leadingZeroBits(idData) >= committed) + } + } + + // MARK: - Helpers + + /// Canonical NIP-01 event ID hash, computed independently of the + /// production code path. + private static func eventIDHash( + pubkey: String, + createdAt: Int, + kind: Int, + tags: [[String]], + content: String + ) throws -> Data { + let serialized: [Any] = [0, pubkey, createdAt, kind, tags, content] + let json = try JSONSerialization.data(withJSONObject: serialized, options: [.withoutEscapingSlashes]) + return Data(SHA256.hash(data: json)) + } +} diff --git a/bitchatTests/Performance/PerformanceBaselineTests.swift b/bitchatTests/Performance/PerformanceBaselineTests.swift index 39ed95bf..d496529c 100644 --- a/bitchatTests/Performance/PerformanceBaselineTests.swift +++ b/bitchatTests/Performance/PerformanceBaselineTests.swift @@ -611,6 +611,7 @@ private final class PerfNostrContext: ChatNostrContext { private(set) var handledPublicMessageCount = 0 func handlePublicMessage(_ message: BitchatMessage) { handledPublicMessageCount += 1 } + func handlePublicMessage(_ message: BitchatMessage, powBits: Int) { handledPublicMessageCount += 1 } func checkForMentions(_ message: BitchatMessage) {} func sendHapticFeedback(for message: BitchatMessage) {} func parseMentions(from content: String) -> [String] { From 7ad19ab4c3b900cb0b874e1d1ff624bb05be8ae8 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 20:22:38 +0200 Subject: [PATCH 010/158] Private groups: creator-managed encrypted group chat over the mesh Small encrypted crews (hard cap 16) between public broadcast and 1:1 DMs: Protocol - MessageType.groupMessage = 0x25: broadcast packets with a cleartext 16-byte group ID + epoch, ChaCha20-Poly1305 ciphertext (epoch bound as AEAD AAD), inner Ed25519 sender signature over "bitchat-group-msg-v1"|groupID|messageID|timestamp|content - NoisePayloadType.groupInvite = 0x06 / .groupKeyUpdate = 0x07: creator-signed group state (key, epoch, roster) 1:1 over Noise; signature over "bitchat-group-v1"|groupID|epoch|key-hash|roster-hash and the Noise session peer must BE the creator - SyncTypeFlags bit 10 (groupMessage): variable-length LE bitfield widens 1 -> 2 bytes inside the length-prefixed REQUEST_SYNC TLV; old clients ignore unknown bits and answer with types they know - PeerCapabilities.localSupported now advertises .groups Storage - GroupStore: symmetric keys in the keychain, roster/name/epoch as protected JSON in Application Support; wiped in panicClearAllData() Behavior - Non-members relay 0x25 like any broadcast but cannot read it; group messages join gossip-sync backfill with the public-message window - Receivers drop wrong-epoch envelopes, bad sender signatures, and senders missing from the creator-signed roster - Fire-and-flood delivery (no per-member acks in v1) UI - Groups open as chat windows through the private-chat sheet (virtual "group_" peer IDs); groups section in the people sheet; /group create/invite/remove/leave/list commands; invitees get a system message + notification and the group appears in their people sheet Co-Authored-By: Claude Fable 5 --- bitchat/App/PeerListModel.swift | 36 ++ bitchat/App/PrivateConversationModels.swift | 35 +- bitchat/Localizable.xcstrings | 385 ++++++++++++ bitchat/Models/CommandInfo.swift | 10 +- bitchat/Protocols/BitchatProtocol.swift | 14 +- .../Protocols/PeerCapabilities+Local.swift | 2 +- .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEService.swift | 65 ++ bitchat/Services/CommandProcessor.swift | 41 ++ bitchat/Services/Groups/GroupProtocol.swift | 532 ++++++++++++++++ bitchat/Services/Groups/GroupStore.swift | 194 ++++++ bitchat/Services/Transport.swift | 14 + bitchat/Sync/GossipSyncManager.swift | 45 +- bitchat/Sync/SyncTypeFlags.swift | 10 + bitchat/ViewModels/ChatGroupCoordinator.swift | 566 ++++++++++++++++++ .../ChatPeerIdentityCoordinator.swift | 9 + .../ChatTransportEventCoordinator.swift | 18 + bitchat/ViewModels/ChatViewModel.swift | 13 + .../ChatViewModel+PrivateChat.swift | 6 + bitchat/ViewModels/NostrInboundPipeline.swift | 12 +- bitchat/Views/ContentSheetViews.swift | 62 +- bitchat/Views/GroupChatList.swift | 86 +++ ...ransportEventCoordinatorContextTests.swift | 12 + bitchatTests/CommandProcessorTests.swift | 28 + bitchatTests/GossipSyncManagerTests.swift | 4 +- .../Services/GroupProtocolTests.swift | 302 ++++++++++ bitchatTests/Services/GroupStoreTests.swift | 170 ++++++ .../Sync/SyncTypeFlagsGroupTests.swift | 62 ++ .../Sources/BitFoundation/MessageType.swift | 6 +- .../Sources/BitFoundation/PeerID.swift | 24 + 30 files changed, 2731 insertions(+), 34 deletions(-) create mode 100644 bitchat/Services/Groups/GroupProtocol.swift create mode 100644 bitchat/Services/Groups/GroupStore.swift create mode 100644 bitchat/ViewModels/ChatGroupCoordinator.swift create mode 100644 bitchat/Views/GroupChatList.swift create mode 100644 bitchatTests/Services/GroupProtocolTests.swift create mode 100644 bitchatTests/Services/GroupStoreTests.swift create mode 100644 bitchatTests/Sync/SyncTypeFlagsGroupTests.swift diff --git a/bitchat/App/PeerListModel.swift b/bitchat/App/PeerListModel.swift index 38f20a1c..e6595428 100644 --- a/bitchat/App/PeerListModel.swift +++ b/bitchat/App/PeerListModel.swift @@ -26,11 +26,22 @@ struct GeohashPersonRow: Identifiable, Equatable { let isBlocked: Bool } +struct GroupChatRow: Identifiable, Equatable { + let peerID: PeerID + let name: String + let memberCount: Int + let isCreator: Bool + let hasUnread: Bool + + var id: String { peerID.id } +} + @MainActor final class PeerListModel: ObservableObject { @Published private(set) var allPeers: [BitchatPeer] = [] @Published private(set) var meshRows: [MeshPeerRow] = [] @Published private(set) var geohashPeople: [GeohashPersonRow] = [] + @Published private(set) var groupRows: [GroupChatRow] = [] @Published private(set) var reachableMeshPeerCount = 0 @Published private(set) var connectedMeshPeerCount = 0 @Published private(set) var visibleGeohashPeerCount = 0 @@ -129,6 +140,13 @@ final class PeerListModel: ObservableObject { } .store(in: &cancellables) + chatViewModel.groupStore.$groups + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.refresh() + } + .store(in: &cancellables) + peerIdentityStore.$encryptionStatuses .receive(on: DispatchQueue.main) .sink { [weak self] _ in @@ -217,22 +235,40 @@ final class PeerListModel: ObservableObject { } let geohashPeople = buildGeohashPeople() + let groupRows = buildGroupRows() self.meshRows = meshRows reachableMeshPeerCount = meshCounts.reachable connectedMeshPeerCount = meshCounts.connected self.geohashPeople = geohashPeople visibleGeohashPeerCount = geohashPeople.count + self.groupRows = groupRows renderID = ( meshRows.map { "\($0.id)-\($0.isConnected)-\($0.isReachable)-\($0.hasUnread)-\($0.isFavorite)-\($0.isBlocked)" } + geohashPeople.map { "geo:\($0.id)-\($0.isTeleported)-\($0.isBlocked)-\($0.displayName)" + } + + groupRows.map { + "group:\($0.id)-\($0.name)-\($0.memberCount)-\($0.hasUnread)" } ).joined(separator: "|") } + private func buildGroupRows() -> [GroupChatRow] { + let myFingerprint = chatViewModel.meshService.noiseIdentityFingerprint() + return chatViewModel.groupStore.groups.map { group in + GroupChatRow( + peerID: group.peerID, + name: group.name, + memberCount: group.members.count, + isCreator: group.creatorFingerprint == myFingerprint, + hasUnread: chatViewModel.hasUnreadMessages(for: group.peerID) + ) + } + } + private func buildGeohashPeople() -> [GeohashPersonRow] { let myHex = currentGeohashIdentityHex() let teleportedSet = Set(locationPresenceStore.teleportedGeo.map { $0.lowercased() }) diff --git a/bitchat/App/PrivateConversationModels.swift b/bitchat/App/PrivateConversationModels.swift index 2a465948..d9920646 100644 --- a/bitchat/App/PrivateConversationModels.swift +++ b/bitchat/App/PrivateConversationModels.swift @@ -108,7 +108,13 @@ struct PrivateConversationHeaderState: Equatable { let encryptionStatus: EncryptionStatus? var supportsFavoriteToggle: Bool { - !conversationPeerID.isGeoDM + !conversationPeerID.isGeoDM && !conversationPeerID.isGroup + } + + /// Group chats have no single peer identity behind the header: no + /// fingerprint screen, no per-peer encryption badge. + var isGroupConversation: Bool { + conversationPeerID.isGroup } } @@ -206,6 +212,13 @@ final class PrivateConversationModel: ObservableObject { } .store(in: &cancellables) + chatViewModel.groupStore.$groups + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.refreshSelectedConversation() + } + .store(in: &cancellables) + NotificationCenter.default.publisher(for: Notification.Name("peerStatusUpdated")) .receive(on: DispatchQueue.main) .sink { [weak self] _ in @@ -229,6 +242,26 @@ final class PrivateConversationModel: ObservableObject { } private func makeHeaderState(for conversationPeerID: PeerID) -> PrivateConversationHeaderState { + // Group chats: the "peer" is the whole crew. Name + member count in + // the header; availability reads as mesh since group traffic floods + // the local mesh, and the per-peer encryption badge does not apply. + if conversationPeerID.isGroup { + let displayName: String + if let group = chatViewModel.groupStore.group(for: conversationPeerID) { + displayName = "#\(group.name) (\(group.members.count))" + } else { + displayName = String(localized: "common.unknown", comment: "Fallback label for unknown peer") + } + return PrivateConversationHeaderState( + conversationPeerID: conversationPeerID, + headerPeerID: conversationPeerID, + displayName: displayName, + availability: .meshReachable, + isFavorite: false, + encryptionStatus: nil + ) + } + let headerPeerID = chatViewModel.getShortIDForNoiseKey(conversationPeerID) let peer = chatViewModel.getPeer(byID: headerPeerID) let displayName = resolveDisplayName(for: conversationPeerID, headerPeerID: headerPeerID, peer: peer) diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 7301e613..208c8d49 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -9348,6 +9348,17 @@ } } }, + "content.accessibility.group_chat" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Group chat" + } + } + } + }, "content.accessibility.jump_to_latest" : { "comment" : "Accessibility label for the jump to latest messages button", "extractionState" : "manual", @@ -15055,6 +15066,17 @@ } } }, + "content.commands.group" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "create or manage private groups" + } + } + } + }, "content.commands.help" : { "comment" : "Description of the /help command in the suggestions panel", "extractionState" : "manual", @@ -18230,6 +18252,17 @@ } } }, + "content.input.group_placeholder" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "create|invite|leave|list" + } + } + } + }, "content.input.placeholder.location" : { "comment" : "Composer placeholder for a public geohash channel, naming it", "extractionState" : "manual", @@ -19913,6 +19946,17 @@ } } }, + "content.private.caption_group" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "encrypted group · members only" + } + } + } + }, "encryption.accessibility.establishing" : { "extractionState" : "manual", "localizations" : { @@ -24424,6 +24468,50 @@ } } }, + "groups.accessibility.open_group_hint" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opens the group chat" + } + } + } + }, + "groups.member_count %@" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "(%@)" + } + } + } + }, + "groups.section.header" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups" + } + } + } + }, + "groups.state.creator" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Creator" + } + } + } + }, "location_channels.accessibility.add_bookmark" : { "comment" : "Accessibility action name for bookmarking a channel", "extractionState" : "manual", @@ -33893,6 +33981,303 @@ } } }, + "system.group.already_member" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a member" + } + } + } + }, + "system.group.cannot_remove_creator" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "the creator cannot be removed" + } + } + } + }, + "system.group.create_failed" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not create the group" + } + } + } + }, + "system.group.created" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "created group '%@' — use /group invite @name to add people" + } + } + } + }, + "system.group.creator_only" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "only the group creator can do that" + } + } + } + }, + "system.group.full" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "group is full (max %@ members)" + } + } + } + }, + "system.group.identity_unavailable" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "your identity keys are not ready yet" + } + } + } + }, + "system.group.invite_failed" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not build the group invite" + } + } + } + }, + "system.group.invited" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "invited %1$@ to '%2$@'" + } + } + } + }, + "system.group.joined" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you were added to group '%1$@' by %2$@ — it now appears in your people list" + } + } + } + }, + "system.group.left" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "left group '%@'" + } + } + } + }, + "system.group.list_header" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "your groups:" + } + } + } + }, + "system.group.member_not_found" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' is not a member of this group" + } + } + } + }, + "system.group.name_too_long" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "group names are limited to 40 characters" + } + } + } + }, + "system.group.none" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you are not in any groups — /group create to start one" + } + } + } + }, + "system.group.not_in_group" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "open a group chat first" + } + } + } + }, + "system.group.peer_identity_unknown" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot verify %@'s identity yet — wait for their announce" + } + } + } + }, + "system.group.peer_not_connected" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ must be connected over mesh to be invited" + } + } + } + }, + "system.group.peer_not_found" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + } + } + }, + "system.group.removed_from" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you were removed from group '%@'" + } + } + } + }, + "system.group.removed_member" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ and rotated the group key" + } + } + } + }, + "system.group.rotate_failed" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not rotate the group key" + } + } + } + }, + "system.group.send_failed" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not encrypt the message" + } + } + } + }, + "system.group.unknown" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you are no longer in this group" + } + } + } + }, + "system.group.usage_create" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create " + } + } + } + }, + "system.group.usage_invite" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group invite @name" + } + } + } + }, + "system.group.usage_remove" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group remove @name" + } + } + } + }, "system.location.not_in_channel" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Models/CommandInfo.swift b/bitchat/Models/CommandInfo.swift index 1f8245be..b75d3db0 100644 --- a/bitchat/Models/CommandInfo.swift +++ b/bitchat/Models/CommandInfo.swift @@ -16,6 +16,7 @@ enum CommandInfo: String, Identifiable { // suggesting a spelling the processor rejects teaches users dead ends. case block case clear + case group case help case hug case message = "msg" @@ -33,6 +34,8 @@ enum CommandInfo: String, Identifiable { switch self { case .block, .hug, .message, .slap, .unblock, .favorite, .unfavorite: return "<" + String(localized: "content.input.nickname_placeholder") + ">" + case .group: + return "<" + String(localized: "content.input.group_placeholder") + ">" case .clear, .help, .who: return nil } @@ -42,6 +45,7 @@ enum CommandInfo: String, Identifiable { switch self { case .block: String(localized: "content.commands.block") case .clear: String(localized: "content.commands.clear") + case .group: String(localized: "content.commands.group") case .help: String(localized: "content.commands.help") case .hug: String(localized: "content.commands.hug") case .message: String(localized: "content.commands.message") @@ -55,11 +59,11 @@ enum CommandInfo: String, Identifiable { static func all(isGeoPublic: Bool, isGeoDM: Bool) -> [CommandInfo] { let baseCommands: [CommandInfo] = [.block, .unblock, .clear, .help, .hug, .message, .slap, .who] - // The processor rejects favorites in geohash contexts, so only - // suggest them where they actually work: mesh. + // The processor rejects favorites and groups in geohash contexts, so + // only suggest them where they actually work: mesh. if isGeoPublic || isGeoDM { return baseCommands } - return baseCommands + [.favorite, .unfavorite] + return baseCommands + [.favorite, .unfavorite, .group] } } diff --git a/bitchat/Protocols/BitchatProtocol.swift b/bitchat/Protocols/BitchatProtocol.swift index 4ebe6509..65963af5 100644 --- a/bitchat/Protocols/BitchatProtocol.swift +++ b/bitchat/Protocols/BitchatProtocol.swift @@ -72,15 +72,20 @@ enum NoisePayloadType: UInt8 { case privateMessage = 0x01 // Private chat message case readReceipt = 0x02 // Message was read case delivered = 0x03 // Message was delivered + // Private groups (0x04/0x05 reserved by other features) + case groupInvite = 0x06 // Creator-signed group state (invite) + case groupKeyUpdate = 0x07 // Creator-signed group state (key rotation / roster update) // Verification (QR-based OOB binding) case verifyChallenge = 0x10 // Verification challenge case verifyResponse = 0x11 // Verification response - + var description: String { switch self { case .privateMessage: return "privateMessage" case .readReceipt: return "readReceipt" case .delivered: return "delivered" + case .groupInvite: return "groupInvite" + case .groupKeyUpdate: return "groupKeyUpdate" case .verifyChallenge: return "verifyChallenge" case .verifyResponse: return "verifyResponse" } @@ -114,6 +119,9 @@ protocol BitchatDelegate: AnyObject { // Low-level events for better separation of concerns func didReceiveNoisePayload(from peerID: PeerID, type: NoisePayloadType, payload: Data, timestamp: Date) + // Encrypted group broadcast (opaque envelope; decrypted by the group coordinator) + func didReceiveGroupMessage(payload: Data, timestamp: Date) + // Bluetooth state updates for user notifications func didUpdateBluetoothState(_ state: CBManagerState) func didReceivePublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) @@ -133,6 +141,10 @@ extension BitchatDelegate { // Default empty implementation } + func didReceiveGroupMessage(payload: Data, timestamp: Date) { + // Default empty implementation + } + func didReceivePublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) { // Default empty implementation } diff --git a/bitchat/Protocols/PeerCapabilities+Local.swift b/bitchat/Protocols/PeerCapabilities+Local.swift index 40f97b9f..3bfb0599 100644 --- a/bitchat/Protocols/PeerCapabilities+Local.swift +++ b/bitchat/Protocols/PeerCapabilities+Local.swift @@ -3,5 +3,5 @@ import BitFoundation extension PeerCapabilities { /// Capabilities this build advertises in its announce packets. /// Each feature adds its bit here when it ships. - static let localSupported: PeerCapabilities = [] + static let localSupported: PeerCapabilities = [.groups] } diff --git a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift index 18b144d2..cf9e9c9d 100644 --- a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift +++ b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift @@ -12,7 +12,7 @@ enum BLEOutboundPacketPolicy { switch MessageType(rawValue: packetType) { case .noiseEncrypted, .noiseHandshake: return true - case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope: + case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .groupMessage: return false } } diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index d1ed84f2..dbe5c1dc 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -1307,6 +1307,48 @@ final class BLEService: NSObject { // MARK: QR Verification over Noise + // MARK: Private Groups + + /// Sends creator-signed group state (invite) 1:1 over the Noise session, + /// queueing behind a handshake when none is established yet. + func sendGroupInvite(_ statePayload: Data, to peerID: PeerID) { + sendNoisePayload(NoisePayload(type: .groupInvite, data: statePayload).encode(), to: peerID) + } + + /// Sends creator-signed group state (key rotation / roster update) 1:1 + /// over the Noise session. + func sendGroupKeyUpdate(_ statePayload: Data, to peerID: PeerID) { + sendNoisePayload(NoisePayload(type: .groupKeyUpdate, data: statePayload).encode(), to: peerID) + } + + /// Broadcasts a sealed group message (MessageType 0x25) like a public + /// message: fire-and-flood with gossip-sync backfill. The outer packet is + /// intentionally unsigned — receivers authenticate the sender's Ed25519 + /// signature inside the ciphertext, which still verifies for backfilled + /// copies long after the sender's announce has expired. + func broadcastGroupMessage(_ envelope: Data) { + guard !envelope.isEmpty else { return } + messageQueue.async { [weak self] in + guard let self else { return } + let packet = BitchatPacket( + type: MessageType.groupMessage.rawValue, + senderID: Data(hexString: self.myPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: envelope, + signature: nil, + ttl: self.messageTTL + ) + // Pre-mark our own broadcast as processed to avoid handling a + // relayed self copy. + let dedupID = BLESelfBroadcastTracker.dedupID(for: packet) + self.messageDeduplicator.markProcessed(dedupID) + self.broadcastPacket(packet) + // Track our own broadcast for gossip sync + self.gossipSyncManager?.onPublicPacketSeen(packet) + } + } + func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) { let payload = VerificationService.shared.buildVerifyChallenge(noiseKeyHex: noiseKeyHex, nonceA: nonceA) sendNoisePayload(payload, to: peerID) @@ -3210,6 +3252,9 @@ extension BLEService { case .courierEnvelope: handleCourierEnvelope(packet, from: peerID) + case .groupMessage: + handleGroupMessage(packet, from: senderID) + case .leave: handleLeave(packet, from: senderID) @@ -3466,6 +3511,26 @@ extension BLEService { ) } + /// Group broadcasts are opaque ciphertext to this layer: track them for + /// gossip backfill and hand the payload to the UI layer, where the group + /// coordinator decrypts and authenticates against the roster. Non-members + /// still relay (generic broadcast relay path) but never decode. + private func handleGroupMessage(_ packet: BitchatPacket, from peerID: PeerID) { + let isBroadcastRecipient: Bool = { + guard let recipient = packet.recipientID else { return true } + return recipient.count == 8 && recipient.allSatisfy { $0 == 0xFF } + }() + guard isBroadcastRecipient, !packet.payload.isEmpty else { return } + + gossipSyncManager?.onPublicPacketSeen(packet) + + let payload = packet.payload + let timestamp = Date(timeIntervalSince1970: TimeInterval(packet.timestamp) / 1000) + notifyUI { [weak self] in + self?.deliverTransportEvent(.groupMessageReceived(payload: payload, timestamp: timestamp)) + } + } + private func handleNoiseHandshake(_ packet: BitchatPacket, from peerID: PeerID) { noisePacketHandler.handleHandshake(packet, from: peerID) } diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index 9f2f8e9b..683fed50 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -54,6 +54,15 @@ protocol CommandContextProvider: AnyObject { /// Toggles the favorite via the unified peer flow, which persists by the /// real noise key and notifies the peer over mesh or Nostr. func toggleFavorite(peerID: PeerID) + + // MARK: - Groups + // Group logic lives in `ChatGroupCoordinator`; these forward the parsed + // /group subcommands. + func groupCreate(named name: String) -> CommandResult + func groupInvite(nickname: String) -> CommandResult + func groupRemove(nickname: String) -> CommandResult + func groupLeave() -> CommandResult + func groupList() -> CommandResult } /// Processes chat commands in a focused, efficient way @@ -100,6 +109,9 @@ final class CommandProcessor { return handleBlock(args) case "/unblock": return handleUnblock(args) + case "/group": + if inGeoPublic || inGeoDM { return .error(message: "groups are only for mesh peers in #mesh") } + return handleGroup(args) case "/fav": if inGeoPublic || inGeoDM { return .error(message: "favorites are only for mesh peers in #mesh") } return handleFavorite(args, add: true) @@ -125,6 +137,9 @@ final class CommandProcessor { /slap @name — slap with a large trout /block @name · /unblock @name /fav @name · /unfav @name — favorites (mesh only) + /group create — start an encrypted group + /group invite @name · /group remove @name — manage members (creator) + /group leave · /group list — leave or list your groups /help — this list """ @@ -331,6 +346,32 @@ final class CommandProcessor { return .error(message: "cannot unblock \(nickname): not found") } + private static let groupUsage = "usage: /group create · invite @name · remove @name · leave · list" + + private func handleGroup(_ args: String) -> CommandResult { + let parts = args.split(separator: " ", maxSplits: 1, omittingEmptySubsequences: true) + guard let subcommand = parts.first else { + return .error(message: Self.groupUsage) + } + let rest = parts.count > 1 ? String(parts[1]) : "" + guard let provider = contextProvider else { return .handled } + + switch subcommand { + case "create": + return provider.groupCreate(named: rest) + case "invite": + return provider.groupInvite(nickname: rest) + case "remove": + return provider.groupRemove(nickname: rest) + case "leave": + return provider.groupLeave() + case "list": + return provider.groupList() + default: + return .error(message: Self.groupUsage) + } + } + private func handleFavorite(_ args: String, add: Bool) -> CommandResult { let targetName = args.trimmed guard !targetName.isEmpty else { diff --git a/bitchat/Services/Groups/GroupProtocol.swift b/bitchat/Services/Groups/GroupProtocol.swift new file mode 100644 index 00000000..14f3d7f3 --- /dev/null +++ b/bitchat/Services/Groups/GroupProtocol.swift @@ -0,0 +1,532 @@ +// +// GroupProtocol.swift +// bitchat +// +// Wire formats and crypto for private groups: creator-signed group state +// (invites and key updates over Noise) and ChaCha20-Poly1305 group messages +// broadcast as MessageType.groupMessage (0x25). +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import CryptoKit +import Foundation + +// MARK: - Models + +/// A member of a private group as pinned in the creator-signed roster. +struct GroupMember: Codable, Equatable { + /// SHA-256 fingerprint (64 hex chars) of the member's Noise static key. + let fingerprint: String + /// The member's Ed25519 signing public key (32 bytes, from their announce). + let signingKey: Data + /// Nickname at invite time; display fallback when the peer is offline. + var nickname: String +} + +/// Creator-managed encrypted group. Metadata only — the symmetric key lives +/// in the keychain (see `GroupStore`). +struct BitchatGroup: Codable, Equatable { + static let maxMembers = 16 + static let groupIDLength = 16 + static let keyLength = 32 + + /// 16 random bytes; travels in cleartext on group message packets so + /// relays can dedup/filter without membership. + let groupID: Data + var name: String + /// Bumps on every key rotation; messages are bound to the epoch they + /// were sealed under. + var epoch: UInt32 + var members: [GroupMember] + /// Fingerprint of the creator — the only identity allowed to sign group + /// state (invites, key updates) in v1. + let creatorFingerprint: String + + /// Virtual conversation ID this group's chat is keyed under. + var peerID: PeerID { PeerID(groupID: groupID) } + + var creator: GroupMember? { + members.first { $0.fingerprint == creatorFingerprint } + } + + func isMember(fingerprint: String) -> Bool { + members.contains { $0.fingerprint == fingerprint } + } + + func member(withSigningKey signingKey: Data) -> GroupMember? { + members.first { $0.signingKey == signingKey } + } +} + +// MARK: - TLV helpers + +private enum GroupTLV { + static func put(_ type: UInt8, _ value: Data, into out: inout Data) { + out.append(type) + let length = UInt16(clamping: value.count) + out.append(UInt8((length >> 8) & 0xFF)) + out.append(UInt8(length & 0xFF)) + out.append(value.prefix(Int(length))) + } + + /// Iterates (type, value) pairs; returns nil on malformed framing. + static func parse(_ data: Data) -> [(type: UInt8, value: Data)]? { + var fields: [(UInt8, Data)] = [] + var offset = data.startIndex + while offset < data.endIndex { + guard data.distance(from: offset, to: data.endIndex) >= 3 else { return nil } + let type = data[offset] + let high = Int(data[data.index(offset, offsetBy: 1)]) + let low = Int(data[data.index(offset, offsetBy: 2)]) + let length = (high << 8) | low + let valueStart = data.index(offset, offsetBy: 3) + guard data.distance(from: valueStart, to: data.endIndex) >= length else { return nil } + let valueEnd = data.index(valueStart, offsetBy: length) + fields.append((type, Data(data[valueStart.. Data { + var bigEndian = epoch.bigEndian + return withUnsafeBytes(of: &bigEndian) { Data($0) } + } + + static func epoch(from data: Data) -> UInt32? { + guard data.count == 4 else { return nil } + return data.reduce(UInt32(0)) { ($0 << 8) | UInt32($1) } + } + + static func timestampData(_ timestampMs: UInt64) -> Data { + var bigEndian = timestampMs.bigEndian + return withUnsafeBytes(of: &bigEndian) { Data($0) } + } + + static func timestamp(from data: Data) -> UInt64? { + guard data.count == 8 else { return nil } + return data.reduce(UInt64(0)) { ($0 << 8) | UInt64($1) } + } +} + +// MARK: - Roster wire form + +enum GroupRosterCoding { + private static let fingerprintLength = 32 + private static let signingKeyLength = 32 + private static let maxNicknameBytes = 64 + + /// Deterministic roster blob: count byte, then per member the raw 32-byte + /// fingerprint, 32-byte signing key, and length-prefixed UTF-8 nickname. + /// The creator signature covers the SHA-256 of these exact bytes. + static func encode(_ members: [GroupMember]) -> Data? { + guard members.count <= BitchatGroup.maxMembers else { return nil } + var out = Data([UInt8(members.count)]) + for member in members { + guard let fingerprintData = Data(hexString: member.fingerprint), + fingerprintData.count == fingerprintLength, + member.signingKey.count == signingKeyLength else { return nil } + out.append(fingerprintData) + out.append(member.signingKey) + let nickname = Data(member.nickname.utf8).prefix(maxNicknameBytes) + out.append(UInt8(nickname.count)) + out.append(nickname) + } + return out + } + + static func decode(_ data: Data) -> [GroupMember]? { + guard let count = data.first, count <= UInt8(BitchatGroup.maxMembers) else { return nil } + var members: [GroupMember] = [] + var offset = data.index(after: data.startIndex) + for _ in 0..= fixed else { return nil } + let fingerprintEnd = data.index(offset, offsetBy: fingerprintLength) + let fingerprint = Data(data[offset..= nickLength else { return nil } + let nickEnd = data.index(nickStart, offsetBy: nickLength) + guard let nickname = String(data: Data(data[nickStart.. Data { + var content = signingDomain + content.append(groupID) + content.append(GroupTLV.epochData(epoch)) + content.append(key.sha256Hash()) + content.append(rosterBlob.sha256Hash()) + return content + } + + /// Builds a signed state payload. Returns nil when the roster cannot be + /// encoded (over cap, malformed member) or signing fails. + static func makeSigned( + group: BitchatGroup, + key: Data, + sign: (Data) -> Data? + ) -> GroupStatePayload? { + guard let rosterBlob = GroupRosterCoding.encode(group.members) else { return nil } + let content = signingContent(groupID: group.groupID, epoch: group.epoch, key: key, rosterBlob: rosterBlob) + guard let signature = sign(content) else { return nil } + return GroupStatePayload( + groupID: group.groupID, + name: group.name, + key: key, + epoch: group.epoch, + members: group.members, + creatorFingerprint: group.creatorFingerprint, + signature: signature + ) + } + + func encode() -> Data? { + guard let rosterBlob = GroupRosterCoding.encode(members), + let fingerprintData = Data(hexString: creatorFingerprint), + fingerprintData.count == 32 else { return nil } + var out = Data() + GroupTLV.put(FieldType.groupID.rawValue, groupID, into: &out) + GroupTLV.put(FieldType.name.rawValue, Data(name.utf8), into: &out) + GroupTLV.put(FieldType.key.rawValue, key, into: &out) + GroupTLV.put(FieldType.epoch.rawValue, GroupTLV.epochData(epoch), into: &out) + GroupTLV.put(FieldType.roster.rawValue, rosterBlob, into: &out) + GroupTLV.put(FieldType.creatorFingerprint.rawValue, fingerprintData, into: &out) + GroupTLV.put(FieldType.signature.rawValue, signature, into: &out) + return out + } + + static func decode(_ data: Data) -> GroupStatePayload? { + guard let fields = GroupTLV.parse(data) else { return nil } + var groupID: Data? + var name: String? + var key: Data? + var epoch: UInt32? + var rosterBlob: Data? + var members: [GroupMember]? + var creatorFingerprint: String? + var signature: Data? + + for (type, value) in fields { + switch FieldType(rawValue: type) { + case .groupID where value.count == BitchatGroup.groupIDLength: + groupID = value + case .name: + name = String(data: value, encoding: .utf8) + case .key where value.count == BitchatGroup.keyLength: + key = value + case .epoch: + epoch = GroupTLV.epoch(from: value) + case .roster: + rosterBlob = value + members = GroupRosterCoding.decode(value) + case .creatorFingerprint where value.count == 32: + creatorFingerprint = value.hexEncodedString() + case .signature where value.count == 64: + signature = value + default: + break // forward compatible; ignore unknown TLVs + } + } + + guard let groupID, let name, let key, let epoch, + rosterBlob != nil, let members, !members.isEmpty, + let creatorFingerprint, let signature else { return nil } + return GroupStatePayload( + groupID: groupID, + name: name, + key: key, + epoch: epoch, + members: members, + creatorFingerprint: creatorFingerprint, + signature: signature + ) + } + + /// Verifies the creator signature against the creator's signing key + /// pinned in the roster, and that the creator is actually in the roster. + func verifyCreatorSignature() -> Bool { + guard members.count <= BitchatGroup.maxMembers, + let creator = members.first(where: { $0.fingerprint == creatorFingerprint }), + let rosterBlob = GroupRosterCoding.encode(members) else { return false } + let content = GroupStatePayload.signingContent(groupID: groupID, epoch: epoch, key: key, rosterBlob: rosterBlob) + return GroupCrypto.verify(signature: signature, for: content, publicKey: creator.signingKey) + } + + var asGroup: BitchatGroup { + BitchatGroup( + groupID: groupID, + name: name, + epoch: epoch, + members: members, + creatorFingerprint: creatorFingerprint + ) + } +} + +// MARK: - Group message envelope (MessageType 0x25 payload) + +/// Cleartext framing of a group message broadcast. Only the group ID, epoch, +/// and nonce are visible to relays; everything about the message — sender, +/// content, timestamps — is inside the ChaCha20-Poly1305 ciphertext. +struct GroupMessageEnvelope: Equatable { + let groupID: Data + let epoch: UInt32 + let nonce: Data + /// ChaChaPoly ciphertext || 16-byte tag. + let ciphertext: Data + + private enum FieldType: UInt8 { + case groupID = 0x01 + case epoch = 0x02 + case nonce = 0x03 + case ciphertext = 0x04 + } + + func encode() -> Data { + var out = Data() + GroupTLV.put(FieldType.groupID.rawValue, groupID, into: &out) + GroupTLV.put(FieldType.epoch.rawValue, GroupTLV.epochData(epoch), into: &out) + GroupTLV.put(FieldType.nonce.rawValue, nonce, into: &out) + GroupTLV.put(FieldType.ciphertext.rawValue, ciphertext, into: &out) + return out + } + + static func decode(_ data: Data) -> GroupMessageEnvelope? { + guard let fields = GroupTLV.parse(data) else { return nil } + var groupID: Data? + var epoch: UInt32? + var nonce: Data? + var ciphertext: Data? + for (type, value) in fields { + switch FieldType(rawValue: type) { + case .groupID where value.count == BitchatGroup.groupIDLength: + groupID = value + case .epoch: + epoch = GroupTLV.epoch(from: value) + case .nonce where value.count == 12: + nonce = value + case .ciphertext where !value.isEmpty: + ciphertext = value + default: + break + } + } + guard let groupID, let epoch, let nonce, let ciphertext else { return nil } + return GroupMessageEnvelope(groupID: groupID, epoch: epoch, nonce: nonce, ciphertext: ciphertext) + } +} + +/// Decrypted, signature-verified inner content of a group message. +struct GroupMessagePlaintext: Equatable { + let messageID: String + let senderSigningKey: Data + let senderNickname: String + let timestampMs: UInt64 + let content: String +} + +// MARK: - Crypto + +enum GroupCryptoError: Error, Equatable { + case malformedPayload + case signingFailed + case sealFailed + case wrongEpoch + case decryptionFailed + case badSenderSignature +} + +enum GroupCrypto { + static let messageSigningDomain = Data("bitchat-group-msg-v1".utf8) + + private enum InnerField: UInt8 { + case messageID = 0x01 + case senderSigningKey = 0x02 + case senderNickname = 0x03 + case timestamp = 0x04 + case content = 0x05 + case signature = 0x06 + } + + /// Bytes the sender signs: domain | groupID | messageID | timestamp | content. + static func messageSigningContent(groupID: Data, messageID: String, timestampMs: UInt64, content: String) -> Data { + var data = messageSigningDomain + data.append(groupID) + data.append(Data(messageID.utf8)) + data.append(GroupTLV.timestampData(timestampMs)) + data.append(Data(content.utf8)) + return data + } + + static func verify(signature: Data, for data: Data, publicKey: Data) -> Bool { + guard let key = try? Curve25519.Signing.PublicKey(rawRepresentation: publicKey) else { return false } + return key.isValidSignature(signature, for: data) + } + + /// Seals a group message: builds the signed inner TLV and encrypts it with + /// the epoch key. The cleartext group ID and epoch are bound into the AEAD + /// as additional data so ciphertext cannot be replayed across groups or + /// epochs. Returns the encoded 0x25 packet payload. + static func sealMessage( + content: String, + messageID: String, + senderNickname: String, + senderSigningKey: Data, + timestampMs: UInt64, + groupID: Data, + epoch: UInt32, + key: Data, + sign: (Data) -> Data? + ) throws -> Data { + let signingContent = messageSigningContent( + groupID: groupID, + messageID: messageID, + timestampMs: timestampMs, + content: content + ) + guard let signature = sign(signingContent), signature.count == 64 else { + throw GroupCryptoError.signingFailed + } + + var inner = Data() + GroupTLV.put(InnerField.messageID.rawValue, Data(messageID.utf8), into: &inner) + GroupTLV.put(InnerField.senderSigningKey.rawValue, senderSigningKey, into: &inner) + GroupTLV.put(InnerField.senderNickname.rawValue, Data(senderNickname.utf8), into: &inner) + GroupTLV.put(InnerField.timestamp.rawValue, GroupTLV.timestampData(timestampMs), into: &inner) + GroupTLV.put(InnerField.content.rawValue, Data(content.utf8), into: &inner) + GroupTLV.put(InnerField.signature.rawValue, signature, into: &inner) + + do { + let symmetricKey = SymmetricKey(data: key) + var aad = groupID + aad.append(GroupTLV.epochData(epoch)) + let sealed = try ChaChaPoly.seal(inner, using: symmetricKey, authenticating: aad) + var ciphertext = sealed.ciphertext + ciphertext.append(sealed.tag) + let envelope = GroupMessageEnvelope( + groupID: groupID, + epoch: epoch, + nonce: Data(sealed.nonce), + ciphertext: ciphertext + ) + return envelope.encode() + } catch { + throw GroupCryptoError.sealFailed + } + } + + /// Opens a group message envelope with the epoch key: decrypts, parses the + /// inner TLV, and verifies the sender's Ed25519 signature. Roster + /// membership of the sender is the CALLER's check — this function only + /// proves the payload was authored by `senderSigningKey`. + static func openMessage(_ envelope: GroupMessageEnvelope, key: Data) throws -> GroupMessagePlaintext { + let inner: Data + do { + let symmetricKey = SymmetricKey(data: key) + var aad = envelope.groupID + aad.append(GroupTLV.epochData(envelope.epoch)) + let nonce = try ChaChaPoly.Nonce(data: envelope.nonce) + guard envelope.ciphertext.count > 16 else { throw GroupCryptoError.decryptionFailed } + let tag = envelope.ciphertext.suffix(16) + let body = envelope.ciphertext.prefix(envelope.ciphertext.count - 16) + let sealedBox = try ChaChaPoly.SealedBox(nonce: nonce, ciphertext: body, tag: tag) + inner = try ChaChaPoly.open(sealedBox, using: symmetricKey, authenticating: aad) + } catch { + throw GroupCryptoError.decryptionFailed + } + + guard let fields = GroupTLV.parse(inner) else { throw GroupCryptoError.malformedPayload } + var messageID: String? + var senderSigningKey: Data? + var senderNickname: String? + var timestampMs: UInt64? + var content: String? + var signature: Data? + for (type, value) in fields { + switch InnerField(rawValue: type) { + case .messageID: + messageID = String(data: value, encoding: .utf8) + case .senderSigningKey where value.count == 32: + senderSigningKey = value + case .senderNickname: + senderNickname = String(data: value, encoding: .utf8) + case .timestamp: + timestampMs = GroupTLV.timestamp(from: value) + case .content: + content = String(data: value, encoding: .utf8) + case .signature where value.count == 64: + signature = value + default: + break + } + } + guard let messageID, !messageID.isEmpty, + let senderSigningKey, + let senderNickname, + let timestampMs, + let content, + let signature else { throw GroupCryptoError.malformedPayload } + + let signingContent = messageSigningContent( + groupID: envelope.groupID, + messageID: messageID, + timestampMs: timestampMs, + content: content + ) + guard verify(signature: signature, for: signingContent, publicKey: senderSigningKey) else { + throw GroupCryptoError.badSenderSignature + } + + return GroupMessagePlaintext( + messageID: messageID, + senderSigningKey: senderSigningKey, + senderNickname: senderNickname, + timestampMs: timestampMs, + content: content + ) + } +} diff --git a/bitchat/Services/Groups/GroupStore.swift b/bitchat/Services/Groups/GroupStore.swift new file mode 100644 index 00000000..3a45dcb7 --- /dev/null +++ b/bitchat/Services/Groups/GroupStore.swift @@ -0,0 +1,194 @@ +// +// GroupStore.swift +// bitchat +// +// Persistence for private groups: symmetric keys in the keychain, metadata +// (roster, name, epoch) as protected JSON in Application Support. Both are +// dropped by the panic wipe. +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import Combine +import Foundation +import Security + +@MainActor +final class GroupStore: ObservableObject { + /// All groups this device is a member of, in creation/join order. + @Published private(set) var groups: [BitchatGroup] = [] + + private let keychain: KeychainManagerProtocol + private let fileURL: URL? + + /// - Parameter fileURL: Overrides the on-disk location (tests). Ignored + /// when `persistsToDisk` is false. + init(keychain: KeychainManagerProtocol, persistsToDisk: Bool = true, fileURL: URL? = nil) { + self.keychain = keychain + self.fileURL = persistsToDisk ? (fileURL ?? Self.defaultFileURL()) : nil + loadFromDisk() + } + + // MARK: - Reads + + func group(withID groupID: Data) -> BitchatGroup? { + groups.first { $0.groupID == groupID } + } + + func group(for peerID: PeerID) -> BitchatGroup? { + guard let groupID = peerID.groupIDData else { return nil } + return group(withID: groupID) + } + + /// Current-epoch symmetric key for the group, from the keychain. + func key(forGroupID groupID: Data) -> Data? { + keychain.getIdentityKey(forKey: Self.keychainKey(for: groupID)) + } + + // MARK: - Mutations + + /// Creates a new group with a random 16-byte ID and 32-byte key at + /// epoch 1, with the creator as sole member. Returns nil when key + /// generation or persistence fails. + func createGroup(named name: String, creator: GroupMember) -> BitchatGroup? { + guard let groupID = Self.randomBytes(BitchatGroup.groupIDLength), + let key = Self.randomBytes(BitchatGroup.keyLength) else { return nil } + let group = BitchatGroup( + groupID: groupID, + name: name, + epoch: 1, + members: [creator], + creatorFingerprint: creator.fingerprint + ) + guard upsert(group, key: key) else { return nil } + return group + } + + /// Inserts or replaces a group and its current key. Rejects rosters over + /// the hard cap or groups whose creator is missing from the roster. + @discardableResult + func upsert(_ group: BitchatGroup, key: Data) -> Bool { + guard group.groupID.count == BitchatGroup.groupIDLength, + key.count == BitchatGroup.keyLength, + !group.members.isEmpty, + group.members.count <= BitchatGroup.maxMembers, + group.creator != nil else { return false } + guard keychain.saveIdentityKey(key, forKey: Self.keychainKey(for: group.groupID)) else { + SecureLogger.error("Failed to store group key in keychain", category: .security) + return false + } + if let index = groups.firstIndex(where: { $0.groupID == group.groupID }) { + groups[index] = group + } else { + groups.append(group) + } + persist() + return true + } + + /// Updates the roster of an existing group without changing key or epoch + /// (creator-side invite). Enforces the member cap. + @discardableResult + func updateRoster(groupID: Data, members: [GroupMember]) -> BitchatGroup? { + guard let index = groups.firstIndex(where: { $0.groupID == groupID }), + !members.isEmpty, + members.count <= BitchatGroup.maxMembers, + members.contains(where: { $0.fingerprint == groups[index].creatorFingerprint }) else { return nil } + groups[index].members = members + persist() + return groups[index] + } + + /// Rotates the group key (creator-side removal/rotation): new random key, + /// epoch + 1, and the given roster. Returns the updated group and new key. + func rotateKey(groupID: Data, members: [GroupMember]) -> (group: BitchatGroup, key: Data)? { + guard let existing = group(withID: groupID), + let newKey = Self.randomBytes(BitchatGroup.keyLength) else { return nil } + var rotated = existing + rotated.epoch = existing.epoch &+ 1 + rotated.members = members + guard upsert(rotated, key: newKey) else { return nil } + return (rotated, newKey) + } + + func removeGroup(withID groupID: Data) { + groups.removeAll { $0.groupID == groupID } + _ = keychain.deleteIdentityKey(forKey: Self.keychainKey(for: groupID)) + persist() + } + + /// Panic wipe: drop all group keys and metadata from memory and disk. + /// (The panic flow also nukes the whole keychain; deleting per-group keys + /// here keeps the store safe to wipe on its own.) + func wipe() { + for group in groups { + _ = keychain.deleteIdentityKey(forKey: Self.keychainKey(for: group.groupID)) + } + groups.removeAll() + if let fileURL { + try? FileManager.default.removeItem(at: fileURL) + } + } + + // MARK: - Internals + + private static func keychainKey(for groupID: Data) -> String { + "groupKey-\(groupID.hexEncodedString())" + } + + private static func randomBytes(_ count: Int) -> Data? { + var bytes = Data(count: count) + let status = bytes.withUnsafeMutableBytes { buffer -> OSStatus in + guard let baseAddress = buffer.baseAddress else { return errSecParam } + return SecRandomCopyBytes(kSecRandomDefault, count, baseAddress) + } + return status == errSecSuccess ? bytes : nil + } + + private func persist() { + guard let fileURL else { return } + do { + if groups.isEmpty { + try? FileManager.default.removeItem(at: fileURL) + return + } + try FileManager.default.createDirectory( + at: fileURL.deletingLastPathComponent(), + withIntermediateDirectories: true + ) + let data = try JSONEncoder().encode(groups) + var options: Data.WritingOptions = [.atomic] + #if os(iOS) + options.insert(.completeFileProtection) + #endif + try data.write(to: fileURL, options: options) + } catch { + SecureLogger.error("Failed to persist group store: \(error)", category: .session) + } + } + + private func loadFromDisk() { + guard let fileURL, + let data = try? Data(contentsOf: fileURL), + let stored = try? JSONDecoder().decode([BitchatGroup].self, from: data) else { + return + } + // Only groups whose key survived in the keychain are usable. + groups = stored.filter { key(forGroupID: $0.groupID) != nil } + } + + private static func defaultFileURL() -> URL? { + guard let base = try? FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) else { return nil } + return base + .appendingPathComponent("groups", isDirectory: true) + .appendingPathComponent("groups.json") + } +} diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 27c38700..67bba52e 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -35,6 +35,9 @@ enum TransportEvent: @unchecked Sendable { case messageReceived(BitchatMessage) case publicMessageReceived(peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) case noisePayloadReceived(peerID: PeerID, type: NoisePayloadType, payload: Data, timestamp: Date) + /// Encrypted group broadcast (MessageType 0x25). Opaque here — the group + /// coordinator decrypts and authenticates against the roster. + case groupMessageReceived(payload: Data, timestamp: Date) case peerConnected(PeerID) case peerDisconnected(PeerID) case peerListUpdated([PeerID]) @@ -124,6 +127,12 @@ protocol Transport: AnyObject { // transport cannot courier (no connected courier, or unsupported). func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool + // Private groups (mesh transports only): creator-signed state travels + // 1:1 over Noise sessions; group messages flood like public broadcasts. + func sendGroupInvite(_ statePayload: Data, to peerID: PeerID) + func sendGroupKeyUpdate(_ statePayload: Data, to peerID: PeerID) + func broadcastGroupMessage(_ envelope: Data) + // QR verification (optional for transports) func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) @@ -153,6 +162,9 @@ extension Transport { func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} + func sendGroupInvite(_ statePayload: Data, to peerID: PeerID) {} + func sendGroupKeyUpdate(_ statePayload: Data, to peerID: PeerID) {} + func broadcastGroupMessage(_ envelope: Data) {} func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { false } func sendFileBroadcast(_ packet: BitchatFilePacket, transferId: String) {} func sendFilePrivate(_ packet: BitchatFilePacket, to peerID: PeerID, transferId: String) {} @@ -186,6 +198,8 @@ extension BitchatDelegate { ) case let .noisePayloadReceived(peerID, type, payload, timestamp): didReceiveNoisePayload(from: peerID, type: type, payload: payload, timestamp: timestamp) + case let .groupMessageReceived(payload, timestamp): + didReceiveGroupMessage(payload: payload, timestamp: timestamp) case .peerConnected(let peerID): didConnectToPeer(peerID) case .peerDisconnected(let peerID): diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index c966a7ca..b5075906 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -73,6 +73,7 @@ final class GossipSyncManager { var stalePeerTimeoutSeconds: TimeInterval = 60.0 var fragmentCapacity: Int = 600 var fileTransferCapacity: Int = 200 + var groupMessageCapacity: Int = 200 var fragmentSyncIntervalSeconds: TimeInterval = 30.0 var fileTransferSyncIntervalSeconds: TimeInterval = 60.0 var messageSyncIntervalSeconds: TimeInterval = 15.0 @@ -90,6 +91,7 @@ final class GossipSyncManager { private var messages = PacketStore() private var fragments = PacketStore() private var fileTransfers = PacketStore() + private var groupMessages = PacketStore() private var latestAnnouncementByPeer: [PeerID: (id: String, packet: BitchatPacket)] = [:] private var archiveDirty = false @@ -111,7 +113,13 @@ final class GossipSyncManager { ) var schedules: [SyncSchedule] = [] if config.seenCapacity > 0 && config.messageSyncIntervalSeconds > 0 { - schedules.append(SyncSchedule(types: .publicMessages, interval: config.messageSyncIntervalSeconds, lastSent: .distantPast)) + // Group messages ride the public-message cadence; old clients + // ignore the extended bit and answer with announces/messages only. + var messageTypes: SyncTypeFlags = .publicMessages + if config.groupMessageCapacity > 0 { + messageTypes.formUnion(.groupMessage) + } + schedules.append(SyncSchedule(types: messageTypes, interval: config.messageSyncIntervalSeconds, lastSent: .distantPast)) } if config.fragmentCapacity > 0 && config.fragmentSyncIntervalSeconds > 0 { schedules.append(SyncSchedule(types: .fragment, interval: config.fragmentSyncIntervalSeconds, lastSent: .distantPast)) @@ -149,6 +157,9 @@ final class GossipSyncManager { guard let self = self else { return } var types: SyncTypeFlags = .publicMessages + if self.config.groupMessageCapacity > 0 { + types.formUnion(.groupMessage) + } if self.config.fragmentCapacity > 0 && self.config.fragmentSyncIntervalSeconds > 0 { types.formUnion(.fragment) } @@ -169,7 +180,11 @@ final class GossipSyncManager { // messages get the long town-crier window; fragments, file transfers and // announces keep the short one. private func isPacketFresh(_ packet: BitchatPacket) -> Bool { - let maxAgeSeconds = packet.type == MessageType.message.rawValue + // Group messages share the whole-message window: members off the mesh + // for a while should backfill their crew's history like public chat. + let usesLongWindow = packet.type == MessageType.message.rawValue + || packet.type == MessageType.groupMessage.rawValue + let maxAgeSeconds = usesLongWindow ? config.publicMessageMaxAgeSeconds : config.maxMessageAgeSeconds let nowMs = UInt64(Date().timeIntervalSince1970 * 1000) @@ -225,6 +240,13 @@ final class GossipSyncManager { guard isPacketFresh(packet) else { return } let idHex = PacketIdUtil.computeId(packet).hexEncodedString() fileTransfers.insert(idHex: idHex, packet: packet, capacity: max(1, config.fileTransferCapacity)) + case .groupMessage: + // Opaque ciphertext to non-members; carried and served like any + // other broadcast so members get backfill from any relay. + guard isBroadcastRecipient else { return } + guard isPacketFresh(packet) else { return } + let idHex = PacketIdUtil.computeId(packet).hexEncodedString() + groupMessages.insert(idHex: idHex, packet: packet, capacity: max(1, config.groupMessageCapacity)) default: break } @@ -366,6 +388,20 @@ final class GossipSyncManager { } } } + + if requestedTypes.contains(.groupMessage) { + let groupPkts = groupMessages.allPackets(isFresh: isPacketFresh) + for pkt in groupPkts { + if let since, pkt.timestamp < since { continue } + let idBytes = PacketIdUtil.computeId(pkt) + if !mightContain(idBytes) { + var toSend = pkt + toSend.ttl = 0 + toSend.isRSR = true // Mark as solicited response + delegate?.sendPacket(to: peerID, packet: toSend) + } + } + } } // Build REQUEST_SYNC payload using current candidates and GCS params @@ -385,6 +421,9 @@ final class GossipSyncManager { if types.contains(.fileTransfer) { candidates.append(contentsOf: fileTransfers.allPackets(isFresh: isPacketFresh)) } + if types.contains(.groupMessage) { + candidates.append(contentsOf: groupMessages.allPackets(isFresh: isPacketFresh)) + } if candidates.isEmpty { let p = GCSFilter.deriveP(targetFpr: config.gcsTargetFpr) let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types) @@ -442,6 +481,7 @@ final class GossipSyncManager { } fragments.removeExpired(isFresh: isPacketFresh) fileTransfers.removeExpired(isFresh: isPacketFresh) + groupMessages.removeExpired(isFresh: isPacketFresh) } // MARK: - Archive (public message persistence) @@ -537,6 +577,7 @@ final class GossipSyncManager { } fragments.remove { PeerID(hexData: $0.senderID) == peerID } fileTransfers.remove { PeerID(hexData: $0.senderID) == peerID } + groupMessages.remove { PeerID(hexData: $0.senderID) == peerID } } } diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index 430485a0..7f689396 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -20,6 +20,14 @@ struct SyncTypeFlags: OptionSet { case .fragment: return 5 case .requestSync: return 6 case .fileTransfer: return 7 + // Bits 8/9 are reserved by other in-flight features. + // Extended bits are compat-safe by construction: `toData()` encodes + // the bitfield little-endian with trailing zero bytes trimmed (bit 10 + // widens the wire form from 1 to 2 bytes inside the length-prefixed + // REQUEST_SYNC TLV 0x04), and `decode(_:)` accepts 1...8 bytes while + // `type(forBit:)` maps unknown bits to nil — so old clients simply + // ignore the group bit and answer with the types they know. + case .groupMessage: return 10 // Courier envelopes are directed deposits between trusted peers and // must never spread via gossip sync. case .courierEnvelope: return nil @@ -36,6 +44,7 @@ struct SyncTypeFlags: OptionSet { case 5: return .fragment case 6: return .requestSync case 7: return .fileTransfer + case 10: return .groupMessage default: return nil } @@ -45,6 +54,7 @@ struct SyncTypeFlags: OptionSet { static let message = SyncTypeFlags(messageTypes: [.message]) static let fragment = SyncTypeFlags(messageTypes: [.fragment]) static let fileTransfer = SyncTypeFlags(messageTypes: [.fileTransfer]) + static let groupMessage = SyncTypeFlags(messageTypes: [.groupMessage]) static let publicMessages = SyncTypeFlags(messageTypes: [.announce, .message]) diff --git a/bitchat/ViewModels/ChatGroupCoordinator.swift b/bitchat/ViewModels/ChatGroupCoordinator.swift new file mode 100644 index 00000000..fe576132 --- /dev/null +++ b/bitchat/ViewModels/ChatGroupCoordinator.swift @@ -0,0 +1,566 @@ +import BitFoundation +import BitLogger +import Foundation + +/// The narrow surface `ChatGroupCoordinator` needs from its owner. +/// +/// Follows the `ChatDeliveryContext` exemplar: the coordinator depends on the +/// minimal context it actually uses instead of holding an `unowned` back-ref +/// to the whole `ChatViewModel`. Group chats are keyed like direct chats +/// (virtual "group_" peer IDs), so the conversation intents below reuse the +/// private-chat store operations. +@MainActor +protocol ChatGroupContext: AnyObject { + // MARK: Identity & state + var nickname: String { get } + var myPeerID: PeerID { get } + var selectedPrivateChatPeer: PeerID? { get } + var groupStore: GroupStore { get } + + /// Fingerprint of our own Noise static identity key. + func myNoiseFingerprint() -> String + /// Our Ed25519 signing public key. + func mySigningPublicKey() -> Data + /// Signs `data` with our Noise signing key. + func signWithNoiseKey(_ data: Data) -> Data? + + // MARK: Peers + func getPeerIDForNickname(_ nickname: String) -> PeerID? + func isPeerConnected(_ peerID: PeerID) -> Bool + func peerNickname(for peerID: PeerID) -> String? + /// The peer's Noise fingerprint from the live session/registry. + func meshFingerprint(for peerID: PeerID) -> String? + /// The peer's persisted crypto identity (fingerprint + signing key), if + /// the identity store has a signature-verified announce for them. + func cryptoIdentity(for peerID: PeerID) -> (fingerprint: String, signingKey: Data)? + /// The connected short peer ID whose fingerprint matches, if any. + func connectedPeerID(forFingerprint fingerprint: String) -> PeerID? + + // MARK: Transport + func sendGroupInvitePayload(_ payload: Data, to peerID: PeerID) + func sendGroupKeyUpdatePayload(_ payload: Data, to peerID: PeerID) + func broadcastGroupMessagePayload(_ payload: Data) + + // MARK: Conversation intents (group chats are direct-keyed) + @discardableResult + func appendPrivateMessage(_ message: BitchatMessage, to peerID: PeerID) -> Bool + func markPrivateChatUnread(_ peerID: PeerID) + func removePrivateChat(_ peerID: PeerID) + func startPrivateChat(with peerID: PeerID) + func endPrivateChat() + func addSystemMessage(_ content: String) + func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) + func notifyUIChanged() + func notifyPrivateMessage(from senderName: String, message: String, peerID: PeerID) +} + +extension ChatViewModel: ChatGroupContext { + // `nickname`, `myPeerID`, `selectedPrivateChatPeer`, `groupStore`, + // `getPeerIDForNickname(_:)`, `isPeerConnected(_:)`, `peerNickname(for:)`, + // `appendPrivateMessage(_:to:)`, `markPrivateChatUnread(_:)`, + // `removePrivateChat(_:)`, `startPrivateChat(with:)`, + // `addSystemMessage(_:)`, `addLocalPrivateSystemMessage(_:to:)`, + // `notifyUIChanged()`, and `notifyPrivateMessage(from:message:peerID:)` + // are shared requirements with the other contexts or satisfied by + // existing `ChatViewModel` members. The members below flatten nested + // service accesses into intent-named calls. + + func myNoiseFingerprint() -> String { + meshService.noiseIdentityFingerprint() + } + + func mySigningPublicKey() -> Data { + meshService.noiseSigningPublicKeyData() + } + + func signWithNoiseKey(_ data: Data) -> Data? { + meshService.noiseSignData(data) + } + + func meshFingerprint(for peerID: PeerID) -> String? { + meshService.getFingerprint(for: peerID) + } + + /// The persisted, signature-verified identity behind a short mesh peer + /// ID. Cross-checked against the live session fingerprint so a roster + /// entry can never be pinned to a signing key from a different identity. + func cryptoIdentity(for peerID: PeerID) -> (fingerprint: String, signingKey: Data)? { + guard let fingerprint = meshService.getFingerprint(for: peerID) else { return nil } + let candidates = identityManager.getCryptoIdentitiesByPeerIDPrefix(peerID) + guard let identity = candidates.first(where: { $0.fingerprint == fingerprint }), + let signingKey = identity.signingPublicKey else { return nil } + return (fingerprint, signingKey) + } + + /// Short mesh peer IDs are the fingerprint's first 16 hex chars, so the + /// connected peer for a roster fingerprint is a direct derivation. + func connectedPeerID(forFingerprint fingerprint: String) -> PeerID? { + let shortID = PeerID(str: String(fingerprint.prefix(16))) + return meshService.isPeerConnected(shortID) ? shortID : nil + } + + func sendGroupInvitePayload(_ payload: Data, to peerID: PeerID) { + meshService.sendGroupInvite(payload, to: peerID) + } + + func sendGroupKeyUpdatePayload(_ payload: Data, to peerID: PeerID) { + meshService.sendGroupKeyUpdate(payload, to: peerID) + } + + func broadcastGroupMessagePayload(_ payload: Data) { + meshService.broadcastGroupMessage(payload) + } + + // MARK: CommandContextProvider group commands (parsed by CommandProcessor) + + func groupCreate(named name: String) -> CommandResult { + groupCoordinator.createGroup(named: name) + } + + func groupInvite(nickname: String) -> CommandResult { + groupCoordinator.inviteMember(nickname: nickname) + } + + func groupRemove(nickname: String) -> CommandResult { + groupCoordinator.removeMember(nickname: nickname) + } + + func groupLeave() -> CommandResult { + groupCoordinator.leaveGroup() + } + + func groupList() -> CommandResult { + groupCoordinator.listGroups() + } +} + +/// Owns the private-groups feature: creating groups, creator-managed invites +/// and key rotation over Noise, and sealing/opening group message broadcasts. +/// Delivery is fire-and-flood like public chat — no per-member acks in v1 — +/// with gossip-sync backfill as the only offline catch-up. +@MainActor +final class ChatGroupCoordinator { + private unowned let context: any ChatGroupContext + + private static let maxGroupNameLength = 40 + + init(context: any ChatGroupContext) { + self.context = context + } + + // MARK: - Commands + + func createGroup(named rawName: String) -> CommandResult { + let name = rawName.trimmed + guard !name.isEmpty else { + return .error(message: String(localized: "system.group.usage_create", comment: "Usage hint for /group create")) + } + guard name.count <= Self.maxGroupNameLength else { + return .error(message: String(localized: "system.group.name_too_long", comment: "Error when a group name exceeds the length cap")) + } + + let myFingerprint = context.myNoiseFingerprint() + let mySigningKey = context.mySigningPublicKey() + guard !myFingerprint.isEmpty, mySigningKey.count == 32 else { + return .error(message: String(localized: "system.group.identity_unavailable", comment: "Error when the local identity is not ready for group operations")) + } + + let creator = GroupMember(fingerprint: myFingerprint, signingKey: mySigningKey, nickname: context.nickname) + guard let group = context.groupStore.createGroup(named: name, creator: creator) else { + return .error(message: String(localized: "system.group.create_failed", comment: "Error when group creation fails")) + } + + context.startPrivateChat(with: group.peerID) + return .success(message: String( + format: String(localized: "system.group.created", comment: "System message after creating a group; placeholder is the group name"), + locale: .current, + name + )) + } + + func inviteMember(nickname rawNickname: String) -> CommandResult { + let nickname = normalizedNickname(rawNickname) + guard !nickname.isEmpty else { + return .error(message: String(localized: "system.group.usage_invite", comment: "Usage hint for /group invite")) + } + guard let group = selectedGroup() else { + return .error(message: String(localized: "system.group.not_in_group", comment: "Error when a group command requires an open group chat")) + } + guard group.creatorFingerprint == context.myNoiseFingerprint() else { + return .error(message: String(localized: "system.group.creator_only", comment: "Error when a non-creator attempts a creator-only group action")) + } + guard let peerID = context.getPeerIDForNickname(nickname) else { + return .error(message: String( + format: String(localized: "system.group.peer_not_found", comment: "Error when the invitee nickname is unknown; placeholder is the nickname"), + locale: .current, + nickname + )) + } + guard context.isPeerConnected(peerID) else { + return .error(message: String( + format: String(localized: "system.group.peer_not_connected", comment: "Error when the invitee is not connected over mesh; placeholder is the nickname"), + locale: .current, + nickname + )) + } + guard let identity = context.cryptoIdentity(for: peerID) else { + return .error(message: String( + format: String(localized: "system.group.peer_identity_unknown", comment: "Error when the invitee's verified identity is unavailable; placeholder is the nickname"), + locale: .current, + nickname + )) + } + guard !group.isMember(fingerprint: identity.fingerprint) else { + return .error(message: String( + format: String(localized: "system.group.already_member", comment: "Error when the invitee is already a member; placeholder is the nickname"), + locale: .current, + nickname + )) + } + guard group.members.count < BitchatGroup.maxMembers else { + return .error(message: String( + format: String(localized: "system.group.full", comment: "Error when the group is at the member cap; placeholder is the cap"), + locale: .current, + "\(BitchatGroup.maxMembers)" + )) + } + + let newMember = GroupMember( + fingerprint: identity.fingerprint, + signingKey: identity.signingKey, + nickname: context.peerNickname(for: peerID) ?? nickname + ) + let members = group.members + [newMember] + guard let updated = context.groupStore.updateRoster(groupID: group.groupID, members: members), + let key = context.groupStore.key(forGroupID: group.groupID), + let payload = signedStatePayload(for: updated, key: key) else { + return .error(message: String(localized: "system.group.invite_failed", comment: "Error when building or signing a group invite fails")) + } + + context.sendGroupInvitePayload(payload, to: peerID) + distributeState(payload, group: updated, excluding: [identity.fingerprint], type: .keyUpdate) + + return .success(message: String( + format: String(localized: "system.group.invited", comment: "System message after inviting someone; placeholders are the nickname and the group name"), + locale: .current, + nickname, + updated.name + )) + } + + /// Creator-side removal: rotates the group key (epoch + 1) and sends the + /// new state to every remaining member so the removed member's key stops + /// decrypting future traffic. + func removeMember(nickname rawNickname: String) -> CommandResult { + let nickname = normalizedNickname(rawNickname) + guard !nickname.isEmpty else { + return .error(message: String(localized: "system.group.usage_remove", comment: "Usage hint for /group remove")) + } + guard let group = selectedGroup() else { + return .error(message: String(localized: "system.group.not_in_group", comment: "Error when a group command requires an open group chat")) + } + guard group.creatorFingerprint == context.myNoiseFingerprint() else { + return .error(message: String(localized: "system.group.creator_only", comment: "Error when a non-creator attempts a creator-only group action")) + } + guard let member = group.members.first(where: { $0.nickname.caseInsensitiveCompare(nickname) == .orderedSame }) else { + return .error(message: String( + format: String(localized: "system.group.member_not_found", comment: "Error when the member to remove is not in the roster; placeholder is the nickname"), + locale: .current, + nickname + )) + } + guard member.fingerprint != group.creatorFingerprint else { + return .error(message: String(localized: "system.group.cannot_remove_creator", comment: "Error when the creator tries to remove themselves")) + } + + let remaining = group.members.filter { $0.fingerprint != member.fingerprint } + guard let (rotated, newKey) = context.groupStore.rotateKey(groupID: group.groupID, members: remaining), + let payload = signedStatePayload(for: rotated, key: newKey) else { + return .error(message: String(localized: "system.group.rotate_failed", comment: "Error when rotating the group key fails")) + } + + distributeState(payload, group: rotated, excluding: [], type: .keyUpdate) + + return .success(message: String( + format: String(localized: "system.group.removed_member", comment: "System message after removing a member and rotating the key; placeholder is the nickname"), + locale: .current, + member.nickname + )) + } + + func leaveGroup() -> CommandResult { + guard let group = selectedGroup() else { + return .error(message: String(localized: "system.group.not_in_group", comment: "Error when a group command requires an open group chat")) + } + // Close the chat window first so the confirmation message doesn't + // resurrect the conversation we're about to remove. + context.endPrivateChat() + context.removePrivateChat(group.peerID) + context.groupStore.removeGroup(withID: group.groupID) + context.notifyUIChanged() + return .success(message: String( + format: String(localized: "system.group.left", comment: "System message after leaving a group; placeholder is the group name"), + locale: .current, + group.name + )) + } + + func listGroups() -> CommandResult { + let groups = context.groupStore.groups + guard !groups.isEmpty else { + return .success(message: String(localized: "system.group.none", comment: "System message when the user is in no groups")) + } + let myFingerprint = context.myNoiseFingerprint() + let lines = groups.map { group -> String in + let role = group.creatorFingerprint == myFingerprint ? " (creator)" : "" + return "#\(group.name)\(role) — \(group.members.count)/\(BitchatGroup.maxMembers)" + } + return .success(message: String(localized: "system.group.list_header", comment: "Header line for the /group list output") + "\n" + lines.joined(separator: "\n")) + } + + // MARK: - Sending + + /// Fire-and-flood send: local echo goes straight to `.sent` because group + /// messages have no per-member acknowledgments in v1. + func sendGroupMessage(_ content: String, to groupPeerID: PeerID) { + guard !content.isEmpty, content.count <= InputValidator.Limits.maxMessageLength else { return } + guard let group = context.groupStore.group(for: groupPeerID), + let key = context.groupStore.key(forGroupID: group.groupID) else { + context.addSystemMessage(String(localized: "system.group.unknown", comment: "System message when sending into an unknown group")) + return + } + + let messageID = UUID().uuidString + let timestamp = Date() + let payload: Data + do { + payload = try GroupCrypto.sealMessage( + content: content, + messageID: messageID, + senderNickname: context.nickname, + senderSigningKey: context.mySigningPublicKey(), + timestampMs: UInt64(timestamp.timeIntervalSince1970 * 1000), + groupID: group.groupID, + epoch: group.epoch, + key: key, + sign: { [weak context] data in context?.signWithNoiseKey(data) } + ) + } catch { + SecureLogger.error("Failed to seal group message: \(error)", category: .encryption) + context.addLocalPrivateSystemMessage( + String(localized: "system.group.send_failed", comment: "System message when sealing a group message fails"), + to: groupPeerID + ) + return + } + + let message = BitchatMessage( + id: messageID, + sender: context.nickname, + content: content, + timestamp: timestamp, + isRelay: false, + originalSender: nil, + isPrivate: true, + recipientNickname: group.name, + senderPeerID: context.myPeerID, + mentions: nil, + deliveryStatus: .sent + ) + context.appendPrivateMessage(message, to: groupPeerID) + context.broadcastGroupMessagePayload(payload) + context.notifyUIChanged() + } + + // MARK: - Receiving + + /// Decrypt-verify path for an incoming 0x25 broadcast. Drops silently for + /// unknown groups (non-members relay but never read), wrong epochs, bad + /// sender signatures, and senders missing from the pinned roster. + func handleGroupMessagePayload(_ payload: Data, timestamp: Date) { + guard let envelope = GroupMessageEnvelope.decode(payload) else { return } + guard let group = context.groupStore.group(withID: envelope.groupID) else { return } + guard envelope.epoch == group.epoch else { + SecureLogger.debug("Dropping group message with epoch \(envelope.epoch) (current \(group.epoch))", category: .encryption) + return + } + guard let key = context.groupStore.key(forGroupID: group.groupID) else { return } + + let plaintext: GroupMessagePlaintext + do { + plaintext = try GroupCrypto.openMessage(envelope, key: key) + } catch { + SecureLogger.debug("Failed to open group message: \(error)", category: .encryption) + return + } + + // Sender must be pinned in the creator-signed roster; key possession + // alone is not authorship. + guard let member = group.member(withSigningKey: plaintext.senderSigningKey) else { + SecureLogger.warning("Dropping group message from non-roster sender", category: .security) + return + } + // Our own broadcast echoed back via relay or sync replay. + guard plaintext.senderSigningKey != context.mySigningPublicKey() else { return } + + let groupPeerID = group.peerID + // Trust the authenticated inner timestamp (clamped so a future-dated + // message cannot pin itself to the bottom of the timeline). + let messageDate = min(Date(timeIntervalSince1970: TimeInterval(plaintext.timestampMs) / 1000), Date()) + let senderName = member.nickname.isEmpty ? plaintext.senderNickname : member.nickname + let senderPeerID = PeerID(str: String(member.fingerprint.prefix(16))) + let message = BitchatMessage( + id: plaintext.messageID, + sender: senderName, + content: plaintext.content, + timestamp: messageDate, + isRelay: false, + originalSender: nil, + isPrivate: true, + recipientNickname: group.name, + senderPeerID: senderPeerID, + mentions: nil + ) + + guard context.appendPrivateMessage(message, to: groupPeerID) else { return } + + let isViewing = context.selectedPrivateChatPeer == groupPeerID + if !isViewing { + context.markPrivateChatUnread(groupPeerID) + let isRecent = Date().timeIntervalSince(messageDate) < 30 + if isRecent { + context.notifyPrivateMessage( + from: "\(senderName) @ \(group.name)", + message: plaintext.content, + peerID: groupPeerID + ) + } + } + context.notifyUIChanged() + } + + /// Accepts creator-signed group state arriving as an invite. The Noise + /// session peer must BE the creator, the signature must verify against + /// the creator key pinned in the roster, and we must be in the roster. + func handleGroupInvitePayload(from peerID: PeerID, payload: Data) { + applyGroupState(from: peerID, payload: payload, isInvite: true) + } + + /// Accepts creator-signed state updates (rotation/roster). A state whose + /// roster no longer includes us means we were removed: drop the group. + func handleGroupKeyUpdatePayload(from peerID: PeerID, payload: Data) { + applyGroupState(from: peerID, payload: payload, isInvite: false) + } +} + +private extension ChatGroupCoordinator { + enum StateSendType { + case invite + case keyUpdate + } + + func normalizedNickname(_ raw: String) -> String { + let trimmed = raw.trimmed + return trimmed.hasPrefix("@") ? String(trimmed.dropFirst()) : trimmed + } + + func selectedGroup() -> BitchatGroup? { + guard let selected = context.selectedPrivateChatPeer, selected.isGroup else { return nil } + return context.groupStore.group(for: selected) + } + + func signedStatePayload(for group: BitchatGroup, key: Data) -> Data? { + GroupStatePayload.makeSigned(group: group, key: key) { [weak context] data in + context?.signWithNoiseKey(data) + }?.encode() + } + + /// Sends the state payload to every connected roster member except us and + /// the excluded fingerprints. Offline members catch up the next time the + /// creator sends them state (v1 limitation, documented in the PR). + func distributeState(_ payload: Data, group: BitchatGroup, excluding excludedFingerprints: Set, type: StateSendType) { + let myFingerprint = context.myNoiseFingerprint() + for member in group.members { + guard member.fingerprint != myFingerprint, + !excludedFingerprints.contains(member.fingerprint), + let peerID = context.connectedPeerID(forFingerprint: member.fingerprint) else { continue } + switch type { + case .invite: + context.sendGroupInvitePayload(payload, to: peerID) + case .keyUpdate: + context.sendGroupKeyUpdatePayload(payload, to: peerID) + } + } + } + + func applyGroupState(from peerID: PeerID, payload: Data, isInvite: Bool) { + guard let state = GroupStatePayload.decode(payload) else { + SecureLogger.warning("Malformed group state payload from \(peerID.id.prefix(8))…", category: .security) + return + } + // The Noise session already authenticated `peerID`; require that the + // authenticated peer IS the creator whose key signed the state, so a + // member can't re-invite or rotate on the creator's behalf. + guard let senderFingerprint = context.meshFingerprint(for: peerID), + senderFingerprint == state.creatorFingerprint else { + SecureLogger.warning("Dropping group state from non-creator \(peerID.id.prefix(8))…", category: .security) + return + } + guard state.verifyCreatorSignature() else { + SecureLogger.warning("Dropping group state with invalid creator signature", category: .security) + return + } + + let myFingerprint = context.myNoiseFingerprint() + let existing = context.groupStore.group(withID: state.groupID) + + // A creator-signed roster that no longer includes us is a removal. + guard state.members.contains(where: { $0.fingerprint == myFingerprint }) else { + if let existing { + if context.selectedPrivateChatPeer == existing.peerID { + context.endPrivateChat() + } + context.removePrivateChat(existing.peerID) + context.groupStore.removeGroup(withID: existing.groupID) + context.addSystemMessage(String( + format: String(localized: "system.group.removed_from", comment: "System message when removed from a group; placeholder is the group name"), + locale: .current, + existing.name + )) + context.notifyUIChanged() + } + return + } + + // Never regress the epoch: state travels over live Noise sessions, + // so an older epoch here is a stale (or misbehaving) creator device. + if let existing, state.epoch < existing.epoch { + SecureLogger.warning("Dropping stale group state (epoch \(state.epoch) < \(existing.epoch))", category: .security) + return + } + + let isNewMembership = existing == nil + guard context.groupStore.upsert(state.asGroup, key: state.key) else { + SecureLogger.error("Failed to store group state for \(state.name)", category: .session) + return + } + + if isNewMembership { + let inviter = state.members.first { $0.fingerprint == state.creatorFingerprint }?.nickname + ?? context.peerNickname(for: peerID) + ?? "?" + let notice = String( + format: String(localized: "system.group.joined", comment: "System message when added to a group; placeholders are the group name and the inviter"), + locale: .current, + state.name, + inviter + ) + context.addSystemMessage(notice) + context.markPrivateChatUnread(state.asGroup.peerID) + context.notifyPrivateMessage(from: inviter, message: notice, peerID: state.asGroup.peerID) + } else if isInvite == false, let existing, state.epoch > existing.epoch { + SecureLogger.info("Group '\(state.name)' rotated to epoch \(state.epoch)", category: .session) + } + context.notifyUIChanged() + } +} diff --git a/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift b/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift index 46e0787a..30d566b8 100644 --- a/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift +++ b/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift @@ -323,6 +323,15 @@ final class ChatPeerIdentityCoordinator { func startPrivateChat(with peerID: PeerID) { guard peerID != context.myPeerID else { return } + // Group chats are virtual conversations: no peer identity, favorites, + // handshake, or message consolidation applies — just select the chat. + if peerID.isGroup { + context.selectedPrivateChatFingerprint = nil + context.beginPrivateChatSession(with: peerID) + context.markPrivateChatRead(peerID) + return + } + let peerNickname = context.peerNickname(for: peerID) ?? "unknown" if context.unifiedIsBlocked(peerID) { diff --git a/bitchat/ViewModels/ChatTransportEventCoordinator.swift b/bitchat/ViewModels/ChatTransportEventCoordinator.swift index 75571b2e..bdd696e9 100644 --- a/bitchat/ViewModels/ChatTransportEventCoordinator.swift +++ b/bitchat/ViewModels/ChatTransportEventCoordinator.swift @@ -71,6 +71,10 @@ protocol ChatTransportEventContext: AnyObject { // MARK: Verification payloads func handleVerifyChallengePayload(from peerID: PeerID, payload: Data) func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) + + // MARK: Group payloads (creator-signed state over Noise) + func handleGroupInvitePayload(from peerID: PeerID, payload: Data) + func handleGroupKeyUpdatePayload(from peerID: PeerID, payload: Data) } extension ChatViewModel: ChatTransportEventContext { @@ -129,6 +133,14 @@ extension ChatViewModel: ChatTransportEventContext { func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) { verificationCoordinator.handleVerifyResponsePayload(from: peerID, payload: payload) } + + func handleGroupInvitePayload(from peerID: PeerID, payload: Data) { + groupCoordinator.handleGroupInvitePayload(from: peerID, payload: payload) + } + + func handleGroupKeyUpdatePayload(from peerID: PeerID, payload: Data) { + groupCoordinator.handleGroupKeyUpdatePayload(from: peerID, payload: payload) + } } final class ChatTransportEventCoordinator { @@ -371,6 +383,12 @@ private extension ChatTransportEventCoordinator { case .verifyResponse: context.handleVerifyResponsePayload(from: peerID, payload: payload) + + case .groupInvite: + context.handleGroupInvitePayload(from: peerID, payload: payload) + + case .groupKeyUpdate: + context.handleGroupKeyUpdatePayload(from: peerID, payload: payload) } } diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 578b6509..646e04bc 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -177,6 +177,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele lazy var nostrCoordinator = ChatNostrCoordinator(context: self) lazy var mediaTransferCoordinator = ChatMediaTransferCoordinator(context: self) lazy var verificationCoordinator = ChatVerificationCoordinator(context: self) + lazy var groupCoordinator = ChatGroupCoordinator(context: self) // Computed properties for compatibility @MainActor @@ -305,6 +306,8 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele var nostrRelayManager: NostrRelayManager? private let userDefaults = UserDefaults.standard let keychain: KeychainManagerProtocol + /// Private group membership: keys in the keychain, metadata on disk. + let groupStore: GroupStore private let nicknameKey = "bitchat.nickname" // Location channel state (macOS supports manual geohash selection) var activeChannel: ChannelID { @@ -809,6 +812,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele ) self.keychain = keychain + self.groupStore = GroupStore(keychain: keychain) self.idBridge = idBridge self.identityManager = identityManager self.conversations = conversations @@ -1205,6 +1209,9 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele GossipMessageArchive.wipeDefault() StoreAndForwardMetrics.shared.reset() + // Drop private group keys and rosters (keychain + disk) + groupStore.wipe() + // Identity manager has cleared persisted identity data above // Clear autocomplete state @@ -1555,6 +1562,12 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele ) } + func didReceiveGroupMessage(payload: Data, timestamp: Date) { + Task { @MainActor [weak self] in + self?.groupCoordinator.handleGroupMessagePayload(payload, timestamp: timestamp) + } + } + // MARK: - QR Verification API @MainActor func beginQRVerification(with qr: VerificationService.VerificationQR) -> Bool { diff --git a/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift b/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift index af8d06aa..939adf6a 100644 --- a/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift +++ b/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift @@ -13,6 +13,12 @@ extension ChatViewModel { @MainActor func sendPrivateMessage(_ content: String, to peerID: PeerID) { + // Group chats reuse the private-chat surface but broadcast a sealed + // envelope instead of routing to a single peer. + if peerID.isGroup { + groupCoordinator.sendGroupMessage(content, to: peerID) + return + } privateConversationCoordinator.sendPrivateMessage(content, to: peerID) } diff --git a/bitchat/ViewModels/NostrInboundPipeline.swift b/bitchat/ViewModels/NostrInboundPipeline.swift index 337fa474..acb14b20 100644 --- a/bitchat/ViewModels/NostrInboundPipeline.swift +++ b/bitchat/ViewModels/NostrInboundPipeline.swift @@ -297,7 +297,9 @@ final class NostrInboundPipeline { context.handleDelivered(noisePayload, senderPubkey: senderPubkey, convKey: convKey) case .readReceipt: context.handleReadReceipt(noisePayload, senderPubkey: senderPubkey, convKey: convKey) - case .verifyChallenge, .verifyResponse: + // Group state travels only over mesh Noise sessions in v1; anything + // claiming to be group traffic over Nostr is ignored. + case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate: break } } @@ -349,7 +351,9 @@ final class NostrInboundPipeline { context.handleDelivered(payload, senderPubkey: senderPubkey, convKey: convKey) case .readReceipt: context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: convKey) - case .verifyChallenge, .verifyResponse: + // Group state travels only over mesh Noise sessions in v1; anything + // claiming to be group traffic over Nostr is ignored. + case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate: break } } @@ -428,7 +432,9 @@ final class NostrInboundPipeline { context.handleDelivered(payload, senderPubkey: senderPubkey, convKey: targetPeerID) case .readReceipt: context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: targetPeerID) - case .verifyChallenge, .verifyResponse: + // Group state travels only over mesh Noise sessions + // in v1; group traffic over Nostr is ignored. + case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate: break } } diff --git a/bitchat/Views/ContentSheetViews.swift b/bitchat/Views/ContentSheetViews.swift index dd72d8b6..4d9d5c5b 100644 --- a/bitchat/Views/ContentSheetViews.swift +++ b/bitchat/Views/ContentSheetViews.swift @@ -221,6 +221,13 @@ private struct ContentPeopleListView: View { } ) } else { + GroupChatList( + groups: peerListModel.groupRows, + onTapGroup: { peerID in + peerListModel.startConversation(with: peerID) + showSidebar = true + } + ) MeshPeerList( onTapPeer: { peerID in peerListModel.startConversation(with: peerID) @@ -455,6 +462,10 @@ private struct ContentPrivateChatSheetView: View { } private var privacyCaptionText: String { + // Group chats are ChaCha20-Poly1305 sealed to the roster's shared key. + if privateConversationModel.selectedPeerID?.isGroup == true { + return String(localized: "content.private.caption_group", comment: "Caption above the group chat composer noting messages are encrypted to group members") + } // Geohash DMs are NIP-17 gift-wrapped — always end-to-end encrypted, // even though they carry no Noise session status. Mesh DMs earn the // "encrypted" claim only once the Noise handshake has secured. @@ -503,30 +514,39 @@ private struct ContentPrivateHeaderInfoButton: View { var body: some View { Button(action: { + // A group has no single fingerprint to show. + guard !headerState.isGroupConversation else { return } appChromeModel.showFingerprint(for: headerState.headerPeerID) }) { HStack(spacing: 6) { - switch headerState.availability { - case .bluetoothConnected: - Image(systemName: "dot.radiowaves.left.and.right") + if headerState.isGroupConversation { + Image(systemName: "person.3.fill") .font(.bitchatSystem(size: 14)) .foregroundColor(palette.primary) - .accessibilityLabel(String(localized: "content.accessibility.connected_mesh", comment: "Accessibility label for mesh-connected peer indicator")) - case .meshReachable: - Image(systemName: "point.3.filled.connected.trianglepath.dotted") - .font(.bitchatSystem(size: 14)) - .foregroundColor(palette.primary) - .accessibilityLabel(String(localized: "content.accessibility.reachable_mesh", comment: "Accessibility label for mesh-reachable peer indicator")) - case .nostrAvailable: - Image(systemName: "globe") - .font(.bitchatSystem(size: 14)) - .foregroundColor(.purple) - .accessibilityLabel(String(localized: "content.accessibility.available_nostr", comment: "Accessibility label for Nostr-available peer indicator")) - case .offline: - // Absence of a glyph was the only offline signal; say it. - Text("mesh_peers.state.offline") - .bitchatFont(size: 11) - .foregroundColor(palette.secondary) + .accessibilityLabel(String(localized: "content.accessibility.group_chat", comment: "Accessibility label for the group chat indicator")) + } else { + switch headerState.availability { + case .bluetoothConnected: + Image(systemName: "dot.radiowaves.left.and.right") + .font(.bitchatSystem(size: 14)) + .foregroundColor(palette.primary) + .accessibilityLabel(String(localized: "content.accessibility.connected_mesh", comment: "Accessibility label for mesh-connected peer indicator")) + case .meshReachable: + Image(systemName: "point.3.filled.connected.trianglepath.dotted") + .font(.bitchatSystem(size: 14)) + .foregroundColor(palette.primary) + .accessibilityLabel(String(localized: "content.accessibility.reachable_mesh", comment: "Accessibility label for mesh-reachable peer indicator")) + case .nostrAvailable: + Image(systemName: "globe") + .font(.bitchatSystem(size: 14)) + .foregroundColor(.purple) + .accessibilityLabel(String(localized: "content.accessibility.available_nostr", comment: "Accessibility label for Nostr-available peer indicator")) + case .offline: + // Absence of a glyph was the only offline signal; say it. + Text("mesh_peers.state.offline") + .bitchatFont(size: 11) + .foregroundColor(palette.secondary) + } } Text(headerState.displayName) @@ -571,7 +591,9 @@ private struct ContentPrivateHeaderInfoButton: View { ) ) .accessibilityHint( - String(localized: "content.accessibility.view_fingerprint_hint", comment: "Accessibility hint for viewing encryption fingerprint") + headerState.isGroupConversation + ? "" + : String(localized: "content.accessibility.view_fingerprint_hint", comment: "Accessibility hint for viewing encryption fingerprint") ) .frame(minHeight: headerHeight) } diff --git a/bitchat/Views/GroupChatList.swift b/bitchat/Views/GroupChatList.swift new file mode 100644 index 00000000..8b62d8a2 --- /dev/null +++ b/bitchat/Views/GroupChatList.swift @@ -0,0 +1,86 @@ +import BitFoundation +import SwiftUI + +/// Compact "groups" section for the people sheet: one row per private group +/// this device belongs to, tappable to open the group chat window. +struct GroupChatList: View { + @ThemedPalette private var palette + + let groups: [GroupChatRow] + let onTapGroup: (PeerID) -> Void + + private enum Strings { + static let header = String(localized: "groups.section.header", comment: "Section header above the private groups list") + static let creator = String(localized: "groups.state.creator", comment: "State label for a group the user created") + static let unread = String(localized: "mesh_peers.state.unread", comment: "State label for a peer with unread private messages") + static let newMessagesTooltip = String(localized: "mesh_peers.tooltip.new_messages", comment: "Tooltip for the unread messages indicator") + static let openGroupHint = String(localized: "groups.accessibility.open_group_hint", comment: "Accessibility hint on a group row explaining activation opens the group chat") + static let memberCountFormat = String(localized: "groups.member_count %@", comment: "Member count shown next to a group name; placeholder is the count") + } + + var body: some View { + if !groups.isEmpty { + VStack(alignment: .leading, spacing: 0) { + Text(Strings.header) + .bitchatFont(size: 11, weight: .medium) + .foregroundColor(palette.secondary) + .padding(.horizontal) + .padding(.top, 10) + .padding(.bottom, 2) + .accessibilityAddTraits(.isHeader) + + ForEach(groups) { group in + HStack(spacing: 4) { + Image(systemName: "person.3.fill") + .font(.bitchatSystem(size: 10)) + .foregroundColor(palette.primary) + + Text("#\(group.name)") + .bitchatFont(size: 14) + .foregroundColor(palette.primary) + .lineLimit(1) + .truncationMode(.tail) + + Text(String(format: Strings.memberCountFormat, locale: .current, "\(group.memberCount)")) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + + if group.isCreator { + Image(systemName: "crown.fill") + .font(.bitchatSystem(size: 9)) + .foregroundColor(.yellow) + .help(Strings.creator) + } + + Spacer() + + if group.hasUnread { + Image(systemName: "envelope.fill") + .font(.bitchatSystem(size: 10)) + .foregroundColor(.orange) + .help(Strings.newMessagesTooltip) + } + } + .padding(.horizontal) + .padding(.vertical, 6) + .contentShape(Rectangle()) + .onTapGesture { onTapGroup(group.peerID) } + .accessibilityElement(children: .ignore) + .accessibilityLabel(accessibilityDescription(for: group)) + .accessibilityAddTraits(.isButton) + .accessibilityHint(Strings.openGroupHint) + } + } + } + } + + private func accessibilityDescription(for group: GroupChatRow) -> String { + var parts: [String] = [ + group.name, + String(format: Strings.memberCountFormat, locale: .current, "\(group.memberCount)") + ] + if group.isCreator { parts.append(Strings.creator) } + if group.hasUnread { parts.append(Strings.unread) } + return parts.joined(separator: ", ") + } +} diff --git a/bitchatTests/ChatTransportEventCoordinatorContextTests.swift b/bitchatTests/ChatTransportEventCoordinatorContextTests.swift index 1c1fc46f..2ba7fc2a 100644 --- a/bitchatTests/ChatTransportEventCoordinatorContextTests.swift +++ b/bitchatTests/ChatTransportEventCoordinatorContextTests.swift @@ -156,6 +156,18 @@ private final class MockChatTransportEventContext: ChatTransportEventContext { func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) { verifyResponsePayloads.append((peerID, payload)) } + + // Group payloads + private(set) var groupInvitePayloads: [(peerID: PeerID, payload: Data)] = [] + private(set) var groupKeyUpdatePayloads: [(peerID: PeerID, payload: Data)] = [] + + func handleGroupInvitePayload(from peerID: PeerID, payload: Data) { + groupInvitePayloads.append((peerID, payload)) + } + + func handleGroupKeyUpdatePayload(from peerID: PeerID, payload: Data) { + groupKeyUpdatePayloads.append((peerID, payload)) + } } // MARK: - Helpers diff --git a/bitchatTests/CommandProcessorTests.swift b/bitchatTests/CommandProcessorTests.swift index 99bed2b5..7ddede02 100644 --- a/bitchatTests/CommandProcessorTests.swift +++ b/bitchatTests/CommandProcessorTests.swift @@ -492,4 +492,32 @@ private final class MockCommandContextProvider: CommandContextProvider { func sendFavoriteNotification(to peerID: PeerID, isFavorite: Bool) { favoriteNotifications.append((peerID, isFavorite)) } + + // Groups: record the parsed subcommand + argument the processor forwarded. + private(set) var groupCommands: [(subcommand: String, argument: String)] = [] + + func groupCreate(named name: String) -> CommandResult { + groupCommands.append(("create", name)) + return .handled + } + + func groupInvite(nickname: String) -> CommandResult { + groupCommands.append(("invite", nickname)) + return .handled + } + + func groupRemove(nickname: String) -> CommandResult { + groupCommands.append(("remove", nickname)) + return .handled + } + + func groupLeave() -> CommandResult { + groupCommands.append(("leave", "")) + return .handled + } + + func groupList() -> CommandResult { + groupCommands.append(("list", "")) + return .handled + } } diff --git a/bitchatTests/GossipSyncManagerTests.swift b/bitchatTests/GossipSyncManagerTests.swift index c44de8f6..89054302 100644 --- a/bitchatTests/GossipSyncManagerTests.swift +++ b/bitchatTests/GossipSyncManagerTests.swift @@ -205,7 +205,9 @@ struct GossipSyncManagerTests { #expect(allTypes.contains(.message)) #expect(allTypes.contains(.fragment)) #expect(allTypes.contains(.fileTransfer)) - #expect(decoded.contains { $0.types == .publicMessages }) + // The message schedule also asks for group messages (bit 10); + // responders that don't know the bit just ignore it. + #expect(decoded.contains { $0.types == SyncTypeFlags.publicMessages.union(.groupMessage) }) #expect(decoded.contains { $0.types == .fragment }) #expect(decoded.contains { $0.types == .fileTransfer }) } diff --git a/bitchatTests/Services/GroupProtocolTests.swift b/bitchatTests/Services/GroupProtocolTests.swift new file mode 100644 index 00000000..a99c48a9 --- /dev/null +++ b/bitchatTests/Services/GroupProtocolTests.swift @@ -0,0 +1,302 @@ +// +// GroupProtocolTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import CryptoKit +import Foundation +import Testing +import BitFoundation +@testable import bitchat + +struct GroupProtocolTests { + + // MARK: - Fixtures + + /// Deterministic member identity: an Ed25519 keypair plus the 64-hex + /// fingerprint the roster pins. + private struct TestIdentity { + let signingKey: Curve25519.Signing.PrivateKey + let fingerprint: String + + init(seed: UInt8) { + signingKey = Curve25519.Signing.PrivateKey() + fingerprint = Data(repeating: seed, count: 32).hexEncodedString() + } + + var member: GroupMember { + GroupMember( + fingerprint: fingerprint, + signingKey: signingKey.publicKey.rawRepresentation, + nickname: "peer-\(fingerprint.prefix(4))" + ) + } + + func sign(_ data: Data) -> Data? { + try? signingKey.signature(for: data) + } + } + + private let creator = TestIdentity(seed: 0xC1) + private let member = TestIdentity(seed: 0xA2) + private let outsider = TestIdentity(seed: 0xE3) + + private let groupID = Data((0..<16).map { UInt8($0) }) + private let key = Data(repeating: 0x42, count: 32) + + private func makeGroup(extraMembers: [GroupMember] = [], epoch: UInt32 = 1) -> BitchatGroup { + BitchatGroup( + groupID: groupID, + name: "trail crew", + epoch: epoch, + members: [creator.member, member.member] + extraMembers, + creatorFingerprint: creator.fingerprint + ) + } + + // MARK: - State payload (invite / key update) + + @Test func statePayloadRoundTripAndSignatureVerify() throws { + let group = makeGroup() + let payload = try #require(GroupStatePayload.makeSigned(group: group, key: key, sign: creator.sign)) + let encoded = try #require(payload.encode()) + + let decoded = try #require(GroupStatePayload.decode(encoded)) + #expect(decoded == payload) + #expect(decoded.groupID == groupID) + #expect(decoded.name == "trail crew") + #expect(decoded.key == key) + #expect(decoded.epoch == 1) + #expect(decoded.members == group.members) + #expect(decoded.creatorFingerprint == creator.fingerprint) + #expect(decoded.verifyCreatorSignature()) + #expect(decoded.asGroup == group) + } + + @Test func forgedCreatorSignatureIsRejected() throws { + let group = makeGroup() + // Signed by a member who is in the roster but is NOT the creator. + let forged = try #require(GroupStatePayload.makeSigned(group: group, key: key, sign: member.sign)) + #expect(!forged.verifyCreatorSignature()) + + // An outsider signing is equally rejected. + let outsiderForged = try #require(GroupStatePayload.makeSigned(group: group, key: key, sign: outsider.sign)) + #expect(!outsiderForged.verifyCreatorSignature()) + } + + @Test func tamperedStateFailsSignature() throws { + let group = makeGroup() + let payload = try #require(GroupStatePayload.makeSigned(group: group, key: key, sign: creator.sign)) + + // Bumping the epoch invalidates the signature. + let epochTampered = GroupStatePayload( + groupID: payload.groupID, + name: payload.name, + key: payload.key, + epoch: payload.epoch + 1, + members: payload.members, + creatorFingerprint: payload.creatorFingerprint, + signature: payload.signature + ) + #expect(!epochTampered.verifyCreatorSignature()) + + // So does swapping the key. + let keyTampered = GroupStatePayload( + groupID: payload.groupID, + name: payload.name, + key: Data(repeating: 0x99, count: 32), + epoch: payload.epoch, + members: payload.members, + creatorFingerprint: payload.creatorFingerprint, + signature: payload.signature + ) + #expect(!keyTampered.verifyCreatorSignature()) + + // And so does adding a member to the roster. + let rosterTampered = GroupStatePayload( + groupID: payload.groupID, + name: payload.name, + key: payload.key, + epoch: payload.epoch, + members: payload.members + [outsider.member], + creatorFingerprint: payload.creatorFingerprint, + signature: payload.signature + ) + #expect(!rosterTampered.verifyCreatorSignature()) + } + + @Test func creatorMissingFromRosterIsRejected() throws { + // State claiming a creator whose fingerprint is not in the roster has + // no key to verify against and must fail closed. + let group = BitchatGroup( + groupID: groupID, + name: "orphan", + epoch: 1, + members: [member.member], + creatorFingerprint: creator.fingerprint + ) + guard let rosterBlob = GroupRosterCoding.encode(group.members) else { + Issue.record("roster should encode") + return + } + let content = GroupStatePayload.signingContent(groupID: groupID, epoch: 1, key: key, rosterBlob: rosterBlob) + let payload = GroupStatePayload( + groupID: groupID, + name: group.name, + key: key, + epoch: 1, + members: group.members, + creatorFingerprint: creator.fingerprint, + signature: creator.sign(content) ?? Data() + ) + #expect(!payload.verifyCreatorSignature()) + } + + @Test func rosterCapIsEnforcedOnTheWire() { + // 17 members cannot be encoded (hard cap is 16)… + let seventeen = (0..<17).map { TestIdentity(seed: UInt8($0 + 1)).member } + #expect(GroupRosterCoding.encode(seventeen) == nil) + + // …and a hand-built blob claiming 17 members fails to decode. + let sixteen = (0..<16).map { TestIdentity(seed: UInt8($0 + 1)).member } + guard var blob = GroupRosterCoding.encode(sixteen) else { + Issue.record("16-member roster should encode") + return + } + #expect(GroupRosterCoding.decode(blob)?.count == 16) + blob[blob.startIndex] = 17 + #expect(GroupRosterCoding.decode(blob) == nil) + } + + // MARK: - Message seal / open + + @Test func messageRoundTrip() throws { + let group = makeGroup() + let timestampMs: UInt64 = 1_750_000_000_000 + let sealed = try GroupCrypto.sealMessage( + content: "summit at noon", + messageID: "msg-1", + senderNickname: "alice", + senderSigningKey: member.member.signingKey, + timestampMs: timestampMs, + groupID: groupID, + epoch: group.epoch, + key: key, + sign: member.sign + ) + + let envelope = try #require(GroupMessageEnvelope.decode(sealed)) + #expect(envelope.groupID == groupID) + #expect(envelope.epoch == group.epoch) + + let plaintext = try GroupCrypto.openMessage(envelope, key: key) + #expect(plaintext.messageID == "msg-1") + #expect(plaintext.content == "summit at noon") + #expect(plaintext.senderNickname == "alice") + #expect(plaintext.timestampMs == timestampMs) + #expect(plaintext.senderSigningKey == member.member.signingKey) + + // The roster resolves the sender; an outsider's key would not. + #expect(group.member(withSigningKey: plaintext.senderSigningKey) != nil) + #expect(group.member(withSigningKey: outsider.member.signingKey) == nil) + } + + @Test func wrongKeyFailsToDecrypt() throws { + let sealed = try GroupCrypto.sealMessage( + content: "hi", + messageID: "msg-2", + senderNickname: "alice", + senderSigningKey: member.member.signingKey, + timestampMs: 1, + groupID: groupID, + epoch: 1, + key: key, + sign: member.sign + ) + let envelope = try #require(GroupMessageEnvelope.decode(sealed)) + #expect(throws: GroupCryptoError.decryptionFailed) { + _ = try GroupCrypto.openMessage(envelope, key: Data(repeating: 0x7F, count: 32)) + } + } + + @Test func epochIsBoundIntoTheCiphertext() throws { + // Re-labeling an epoch-1 envelope as epoch 2 must break the AEAD: + // a rotated-out member cannot replay old ciphertext into a new epoch. + let sealed = try GroupCrypto.sealMessage( + content: "hi", + messageID: "msg-3", + senderNickname: "alice", + senderSigningKey: member.member.signingKey, + timestampMs: 1, + groupID: groupID, + epoch: 1, + key: key, + sign: member.sign + ) + let envelope = try #require(GroupMessageEnvelope.decode(sealed)) + let relabeled = GroupMessageEnvelope( + groupID: envelope.groupID, + epoch: 2, + nonce: envelope.nonce, + ciphertext: envelope.ciphertext + ) + #expect(throws: GroupCryptoError.decryptionFailed) { + _ = try GroupCrypto.openMessage(relabeled, key: key) + } + } + + @Test func badSenderSignatureIsRejected() throws { + // A key-holder who signs with a key other than the one they claim + // (or garbage) is dropped even though decryption succeeds. + let sealed = try GroupCrypto.sealMessage( + content: "spoof", + messageID: "msg-4", + senderNickname: "mallory", + senderSigningKey: member.member.signingKey, // claims member's key… + timestampMs: 1, + groupID: groupID, + epoch: 1, + key: key, + sign: outsider.sign // …but signs with the outsider's + ) + let envelope = try #require(GroupMessageEnvelope.decode(sealed)) + #expect(throws: GroupCryptoError.badSenderSignature) { + _ = try GroupCrypto.openMessage(envelope, key: key) + } + } + + @Test func tamperedCiphertextFailsToOpen() throws { + let sealed = try GroupCrypto.sealMessage( + content: "hi", + messageID: "msg-5", + senderNickname: "alice", + senderSigningKey: member.member.signingKey, + timestampMs: 1, + groupID: groupID, + epoch: 1, + key: key, + sign: member.sign + ) + let envelope = try #require(GroupMessageEnvelope.decode(sealed)) + var flipped = envelope.ciphertext + flipped[flipped.startIndex] ^= 0x01 + let tampered = GroupMessageEnvelope( + groupID: envelope.groupID, + epoch: envelope.epoch, + nonce: envelope.nonce, + ciphertext: flipped + ) + #expect(throws: GroupCryptoError.decryptionFailed) { + _ = try GroupCrypto.openMessage(tampered, key: key) + } + } + + @Test func malformedEnvelopesAreRejected() { + #expect(GroupMessageEnvelope.decode(Data()) == nil) + #expect(GroupMessageEnvelope.decode(Data([0x01, 0x00])) == nil) + #expect(GroupStatePayload.decode(Data([0xFF, 0x00, 0x01])) == nil) + } +} diff --git a/bitchatTests/Services/GroupStoreTests.swift b/bitchatTests/Services/GroupStoreTests.swift new file mode 100644 index 00000000..adf04806 --- /dev/null +++ b/bitchatTests/Services/GroupStoreTests.swift @@ -0,0 +1,170 @@ +// +// GroupStoreTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +import BitFoundation +@testable import bitchat + +@MainActor +struct GroupStoreTests { + + private func makeMember(seed: UInt8, nickname: String = "peer") -> GroupMember { + GroupMember( + fingerprint: Data(repeating: seed, count: 32).hexEncodedString(), + signingKey: Data(repeating: seed &+ 1, count: 32), + nickname: nickname + ) + } + + private func tempFileURL() -> URL { + FileManager.default.temporaryDirectory + .appendingPathComponent("group-store-tests-\(UUID().uuidString)", isDirectory: true) + .appendingPathComponent("groups.json") + } + + // MARK: - Create / read + + @Test func createGroupStoresMetadataAndKey() throws { + let store = GroupStore(keychain: MockKeychain(), persistsToDisk: false) + let creator = makeMember(seed: 0xC1, nickname: "me") + + let group = try #require(store.createGroup(named: "ops", creator: creator)) + #expect(group.groupID.count == BitchatGroup.groupIDLength) + #expect(group.epoch == 1) + #expect(group.members == [creator]) + #expect(group.creatorFingerprint == creator.fingerprint) + + #expect(store.group(withID: group.groupID) == group) + #expect(store.group(for: group.peerID) == group) + let key = try #require(store.key(forGroupID: group.groupID)) + #expect(key.count == BitchatGroup.keyLength) + #expect(group.peerID.isGroup) + #expect(group.peerID.groupIDData == group.groupID) + } + + // MARK: - Roster cap + + @Test func rosterCapIsEnforced() throws { + let store = GroupStore(keychain: MockKeychain(), persistsToDisk: false) + let creator = makeMember(seed: 0xC1) + let group = try #require(store.createGroup(named: "big", creator: creator)) + + // Filling to the cap works… + let fifteen = (1...15).map { makeMember(seed: UInt8($0)) } + #expect(store.updateRoster(groupID: group.groupID, members: [creator] + fifteen) != nil) + #expect(store.group(withID: group.groupID)?.members.count == BitchatGroup.maxMembers) + + // …one more is rejected. + let overflow = [creator] + fifteen + [makeMember(seed: 0x99)] + #expect(store.updateRoster(groupID: group.groupID, members: overflow) == nil) + #expect(store.group(withID: group.groupID)?.members.count == BitchatGroup.maxMembers) + + // Direct upsert past the cap is rejected too. + var oversized = group + oversized.members = overflow + #expect(!store.upsert(oversized, key: Data(repeating: 1, count: 32))) + } + + @Test func rosterMustRetainCreator() throws { + let store = GroupStore(keychain: MockKeychain(), persistsToDisk: false) + let creator = makeMember(seed: 0xC1) + let other = makeMember(seed: 0xA1) + let group = try #require(store.createGroup(named: "crew", creator: creator)) + + #expect(store.updateRoster(groupID: group.groupID, members: [other]) == nil) + #expect(store.group(withID: group.groupID)?.members == [creator]) + } + + // MARK: - Rotation + + @Test func rotateKeyBumpsEpochAndReplacesKey() throws { + let store = GroupStore(keychain: MockKeychain(), persistsToDisk: false) + let creator = makeMember(seed: 0xC1) + let removed = makeMember(seed: 0xA1) + let group = try #require(store.createGroup(named: "crew", creator: creator)) + #expect(store.updateRoster(groupID: group.groupID, members: [creator, removed]) != nil) + let oldKey = try #require(store.key(forGroupID: group.groupID)) + + let rotation = try #require(store.rotateKey(groupID: group.groupID, members: [creator])) + #expect(rotation.group.epoch == 2) + #expect(rotation.group.members == [creator]) + #expect(rotation.key != oldKey) + #expect(store.key(forGroupID: group.groupID) == rotation.key) + #expect(store.group(withID: group.groupID)?.epoch == 2) + } + + // MARK: - Persistence + + @Test func persistsAcrossInstances() throws { + let keychain = MockKeychain() + let fileURL = tempFileURL() + defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) } + + let creator = makeMember(seed: 0xC1, nickname: "me") + let group: BitchatGroup + do { + let store = GroupStore(keychain: keychain, fileURL: fileURL) + group = try #require(store.createGroup(named: "hike", creator: creator)) + } + + let reloaded = GroupStore(keychain: keychain, fileURL: fileURL) + #expect(reloaded.groups == [group]) + #expect(reloaded.key(forGroupID: group.groupID) != nil) + } + + @Test func groupsWithoutKeysAreDroppedOnLoad() throws { + let keychain = MockKeychain() + let fileURL = tempFileURL() + defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) } + + let group: BitchatGroup + do { + let store = GroupStore(keychain: keychain, fileURL: fileURL) + group = try #require(store.createGroup(named: "stale", creator: makeMember(seed: 0xC1))) + } + // Simulate a keychain wipe without the metadata file being removed. + _ = keychain.deleteAllKeychainData() + + let reloaded = GroupStore(keychain: keychain, fileURL: fileURL) + #expect(reloaded.groups.isEmpty) + #expect(reloaded.group(withID: group.groupID) == nil) + } + + // MARK: - Panic wipe + + @Test func wipeRemovesMetadataAndKeys() throws { + let keychain = MockKeychain() + let fileURL = tempFileURL() + defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) } + + let store = GroupStore(keychain: keychain, fileURL: fileURL) + let group = try #require(store.createGroup(named: "gone", creator: makeMember(seed: 0xC1))) + #expect(FileManager.default.fileExists(atPath: fileURL.path)) + + store.wipe() + + #expect(store.groups.isEmpty) + #expect(store.key(forGroupID: group.groupID) == nil) + #expect(!FileManager.default.fileExists(atPath: fileURL.path)) + + // A fresh instance sees nothing either. + let reloaded = GroupStore(keychain: keychain, fileURL: fileURL) + #expect(reloaded.groups.isEmpty) + } + + @Test func removeGroupDeletesItsKey() throws { + let keychain = MockKeychain() + let store = GroupStore(keychain: keychain, persistsToDisk: false) + let group = try #require(store.createGroup(named: "bye", creator: makeMember(seed: 0xC1))) + + store.removeGroup(withID: group.groupID) + #expect(store.groups.isEmpty) + #expect(store.key(forGroupID: group.groupID) == nil) + } +} diff --git a/bitchatTests/Sync/SyncTypeFlagsGroupTests.swift b/bitchatTests/Sync/SyncTypeFlagsGroupTests.swift new file mode 100644 index 00000000..2bd9d53b --- /dev/null +++ b/bitchatTests/Sync/SyncTypeFlagsGroupTests.swift @@ -0,0 +1,62 @@ +// +// SyncTypeFlagsGroupTests.swift +// bitchat +// +// Wire-compat proof for the groupMessage sync bit (bit 10): the types +// bitfield widens from 1 to 2 bytes, and clients that don't know the bit +// simply ignore it. +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +import BitFoundation +@testable import bitchat + +struct SyncTypeFlagsGroupTests { + + @Test func groupMessageOccupiesBitTen() { + #expect(SyncTypeFlags.groupMessage.rawValue == 1 << 10) + #expect(SyncTypeFlags.groupMessage.contains(.groupMessage)) + #expect(!SyncTypeFlags.publicMessages.contains(.groupMessage)) + } + + @Test func extendedBitfieldWidensToTwoBytes() throws { + // Legacy flags fit one byte… + #expect(SyncTypeFlags.publicMessages.toData() == Data([0x03])) + + // …the group bit widens the little-endian encoding to two bytes. + let combined = SyncTypeFlags.publicMessages.union(.groupMessage) + let encoded = try #require(combined.toData()) + #expect(encoded == Data([0x03, 0x04])) + + let decoded = try #require(SyncTypeFlags.decode(encoded)) + #expect(decoded == combined) + #expect(Set(decoded.toMessageTypes()) == Set([.announce, .message, .groupMessage])) + } + + @Test func unknownBitsAreIgnoredNotRejected() throws { + // An "old client" reading a 2-byte field keeps the raw bits but maps + // unknown bit indices to no message type — it answers with the types + // it knows instead of dropping the request. + let futuristic = try #require(SyncTypeFlags.decode(Data([0x03, 0xFC]))) + #expect(Set(futuristic.toMessageTypes()) == Set([.announce, .message, .groupMessage])) + #expect(futuristic.contains(.announce)) + #expect(futuristic.contains(.message)) + } + + @Test func requestSyncPacketRoundTripsGroupFlag() throws { + let types = SyncTypeFlags.publicMessages.union(.groupMessage) + let packet = RequestSyncPacket(p: 8, m: 1024, data: Data([0xAB, 0xCD]), types: types) + let encoded = packet.encode() + + let decoded = try #require(RequestSyncPacket.decode(from: encoded)) + #expect(decoded.types == types) + #expect(decoded.types?.contains(.groupMessage) == true) + #expect(decoded.p == 8) + #expect(decoded.m == 1024) + #expect(decoded.data == Data([0xAB, 0xCD])) + } +} diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index ceac0cd0..fd2d3a79 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -24,7 +24,10 @@ public enum MessageType: UInt8 { // Fragmentation (simplified) case fragment = 0x20 // Single fragment type for large messages case fileTransfer = 0x22 // Binary file/audio/image payloads - + + // Private groups (0x23/0x24/0x26/0x27/0x28 reserved by other features) + case groupMessage = 0x25 // Group-encrypted broadcast (cleartext group ID, ChaChaPoly body) + public var description: String { switch self { case .announce: return "announce" @@ -36,6 +39,7 @@ public enum MessageType: UInt8 { case .noiseEncrypted: return "noiseEncrypted" case .fragment: return "fragment" case .fileTransfer: return "fileTransfer" + case .groupMessage: return "groupMessage" } } } diff --git a/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift b/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift index 0b2721c2..f22fac18 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift @@ -34,6 +34,9 @@ public struct PeerID: Equatable, Hashable, Sendable { case geoDM = "nostr_" /// `"nostr:"` (+ 8 characters hex) case geoChat = "nostr:" + /// `"group_"` (+ 32 characters hex) — virtual conversation ID for a + /// private group (16-byte group ID). Never routed to a single peer. + case group = "group_" } public let prefix: Prefix @@ -96,6 +99,22 @@ public extension PeerID { } } +// MARK: - Group Conversation Helpers + +public extension PeerID { + /// Convenience init to create a virtual group conversation PeerID from a + /// 16-byte group ID ("group_" + 32 hex characters). + init(groupID: Data) { + self.init(str: Prefix.group.rawValue + groupID.hexEncodedString()) + } + + /// The 16-byte group ID behind a "group_" PeerID, if this is one. + var groupIDData: Data? { + guard isGroup, bare.count == 32 else { return nil } + return Data(hexString: bare) + } +} + // MARK: - Noise Public Key Helpers public extension PeerID { @@ -143,6 +162,11 @@ public extension PeerID { prefix == .geoDM } + /// Returns true if `id` starts with "`group_`" + var isGroup: Bool { + prefix == .group + } + func toPercentEncoded() -> String { id.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? id } From fb80403cd4f4b978c85bbed0713613d5681c813f Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 20:31:09 +0200 Subject: [PATCH 011/158] =?UTF-8?q?Gateway=20mode:=20opt-in=20mesh?= =?UTF-8?q?=E2=86=94Nostr=20uplink=20for=20geohash=20channels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An opt-in "internet gateway" toggle lets one connected phone bridge the local geohash channel for mesh-only peers: signed kind-20000 events ride a new nostrCarrier (0x28) packet — directed to the gateway for uplink, broadcast with TTL for downlink — with Schnorr verification at every hop, CourierStore-style quotas, and explicit loop-prevention rules. - BitFoundation: MessageType.nostrCarrier = 0x28 - NostrCarrierPacket: 2-byte-length TLV codec (direction, geohash, signed event JSON), 16 KiB cap, tolerant decoder - GatewayService: closure-injected policy layer — verify gates (sig, kind, #g tag, age, size), uplink quotas (10/min/depositor rate limit, offline queue of 20 total / 5 per depositor, drop-oldest, flush on reconnect), downlink budget (30/min, bounded drop-oldest backlog), bounded loop-prevention ID sets - BLEService: runtime capability bits (advertise .gateway only while the toggle is on, re-announce on change), signed directed uplink sends, carrier ingress with depositor signature verification - Mesh-only senders uplink automatically from sendGeohash when no relay is connected and a reachable peer advertises .gateway; once-per- channel "sent via mesh gateway" notice - UI: gateway toggle beside the Tor toggle, globe header indicator, VoiceOver labels, xcstrings entries Co-Authored-By: Claude Fable 5 --- bitchat/App/LocationChannelsModel.swift | 16 +- bitchat/Localizable.xcstrings | 60 +++ bitchat/Protocols/NostrCarrierPacket.swift | 136 ++++++ .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEPeerRegistry.swift | 5 + bitchat/Services/BLE/BLEReceivePipeline.swift | 5 +- bitchat/Services/BLE/BLEService.swift | 120 ++++- bitchat/Services/Gateway/GatewayService.swift | 388 +++++++++++++++ bitchat/Sync/SyncTypeFlags.swift | 4 + .../ChatViewModelBootstrapper.swift | 63 +++ .../GeohashSubscriptionManager.swift | 26 + bitchat/Views/ContentHeaderView.swift | 13 + bitchat/Views/LocationChannelsSheet.swift | 30 ++ .../Protocols/NostrCarrierPacketTests.swift | 96 ++++ .../Services/GatewayServiceTests.swift | 453 ++++++++++++++++++ .../Sources/BitFoundation/MessageType.swift | 7 +- 16 files changed, 1416 insertions(+), 8 deletions(-) create mode 100644 bitchat/Protocols/NostrCarrierPacket.swift create mode 100644 bitchat/Services/Gateway/GatewayService.swift create mode 100644 bitchatTests/Protocols/NostrCarrierPacketTests.swift create mode 100644 bitchatTests/Services/GatewayServiceTests.swift diff --git a/bitchat/App/LocationChannelsModel.swift b/bitchat/App/LocationChannelsModel.swift index c820455a..d7431d6d 100644 --- a/bitchat/App/LocationChannelsModel.swift +++ b/bitchat/App/LocationChannelsModel.swift @@ -12,20 +12,26 @@ final class LocationChannelsModel: ObservableObject { @Published private(set) var bookmarkNames: [String: String] @Published private(set) var locationNames: [GeohashChannelLevel: String] @Published private(set) var userTorEnabled: Bool + @Published private(set) var gatewayEnabled: Bool private let manager: LocationChannelManager private let network: NetworkActivationService + private let gateway: GatewayService private var cancellables = Set() init( manager: LocationChannelManager? = nil, - network: NetworkActivationService? = nil + network: NetworkActivationService? = nil, + gateway: GatewayService? = nil ) { let manager = manager ?? .shared let network = network ?? .shared + let gateway = gateway ?? .shared self.manager = manager self.network = network + self.gateway = gateway + self.gatewayEnabled = gateway.isEnabled self.permissionState = manager.permissionState self.availableChannels = manager.availableChannels self.selectedChannel = manager.selectedChannel @@ -96,6 +102,10 @@ final class LocationChannelsModel: ObservableObject { network.setUserTorEnabled(enabled) } + func setGatewayEnabled(_ enabled: Bool) { + gateway.setEnabled(enabled) + } + func refreshMeshChannelsIfNeeded() { guard case .mesh = selectedChannel, permissionState == .authorized, @@ -160,6 +170,10 @@ final class LocationChannelsModel: ObservableObject { network.$userTorEnabled .receive(on: DispatchQueue.main) .assign(to: &$userTorEnabled) + + gateway.$isEnabled + .receive(on: DispatchQueue.main) + .assign(to: &$gatewayEnabled) } private func level(forLength length: Int) -> GeohashChannelLevel { diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 7301e613..c8f4517e 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -9348,6 +9348,18 @@ } } }, + "content.accessibility.gateway_active" : { + "comment" : "Accessibility label for the internet gateway indicator", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Internet gateway active, sharing your connection with the mesh" + } + } + } + }, "content.accessibility.jump_to_latest" : { "comment" : "Accessibility label for the jump to latest messages button", "extractionState" : "manual", @@ -17872,6 +17884,18 @@ } } }, + "content.header.gateway_active" : { + "comment" : "Tooltip for the internet gateway indicator", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sharing your internet connection with nearby mesh peers" + } + } + } + }, "content.header.people" : { "extractionState" : "manual", "localizations" : { @@ -25713,6 +25737,30 @@ } } }, + "location_channels.gateway.subtitle" : { + "comment" : "Explanation under the internet gateway toggle", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "share your internet with nearby mesh peers so their geohash messages reach the network" + } + } + } + }, + "location_channels.gateway.title" : { + "comment" : "Title for the internet gateway toggle in the location channels sheet", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "internet gateway" + } + } + } + }, "location_channels.loading_nearby" : { "extractionState" : "manual", "localizations" : { @@ -33535,6 +33583,18 @@ } } }, + "system.gateway.sent_via_mesh" : { + "comment" : "System message when a geohash message was handed to a mesh internet gateway because no relay is reachable", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent via mesh gateway" + } + } + } + }, "system.geohash.blocked" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Protocols/NostrCarrierPacket.swift b/bitchat/Protocols/NostrCarrierPacket.swift new file mode 100644 index 00000000..e65f2b66 --- /dev/null +++ b/bitchat/Protocols/NostrCarrierPacket.swift @@ -0,0 +1,136 @@ +// +// NostrCarrierPacket.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation + +/// Wire payload for `MessageType.nostrCarrier` (0x28): a complete, signed +/// Nostr event ferried over the mesh between a mesh-only peer and an +/// internet gateway peer. +/// +/// - `toGateway` rides a DIRECTED packet (recipientID = the gateway peer): +/// a mesh-only sender asks the gateway to publish its locally signed +/// geohash event to Nostr relays. +/// - `fromGateway` rides a BROADCAST packet (default TTL): the gateway +/// rebroadcasts inbound relay events so mesh-only peers see the channel. +/// +/// The carried event is public geohash chat — already plaintext on Nostr — +/// so the carrier adds no encryption. It IS signed by the originator's +/// per-geohash identity, so neither the gateway nor any mesh relay can forge +/// or alter it undetected: gateways and receivers verify the Schnorr +/// signature before acting on it. +/// +/// TLV encoding with 2-byte big-endian lengths (the event JSON exceeds the +/// 1-byte TLV range used by smaller packets). Unknown TLV types are skipped +/// for forward compatibility. +struct NostrCarrierPacket: Equatable { + enum Direction: UInt8 { + case toGateway = 0x01 + case fromGateway = 0x02 + } + + let direction: Direction + let geohash: String + /// Complete signed Nostr event JSON (id, pubkey, created_at, kind, tags, + /// content, sig). + let eventJSON: Data + + /// BLE airtime cap for a carried event. + static let maxEventJSONBytes = 16 * 1024 + static let maxGeohashLength = 12 + + private enum TLVType: UInt8 { + case direction = 0x01 + case geohash = 0x02 + case eventJSON = 0x03 + } + + init?(direction: Direction, geohash: String, eventJSON: Data) { + let geohashBytes = Data(geohash.utf8) + guard !geohashBytes.isEmpty, + geohashBytes.count <= Self.maxGeohashLength, + !eventJSON.isEmpty, + eventJSON.count <= Self.maxEventJSONBytes else { + return nil + } + self.direction = direction + self.geohash = geohash + self.eventJSON = eventJSON + } + + init?(direction: Direction, geohash: String, event: NostrEvent) { + guard let json = try? event.jsonString(), !json.isEmpty else { return nil } + self.init(direction: direction, geohash: geohash, eventJSON: Data(json.utf8)) + } + + /// Decodes the carried event. Callers MUST still verify + /// `event.isValidSignature()` before publishing or displaying it. + func event() -> NostrEvent? { + guard let dict = try? JSONSerialization.jsonObject(with: eventJSON) as? [String: Any] else { + return nil + } + return try? NostrEvent(from: dict) + } + + func encode() -> Data? { + var data = Data() + data.reserveCapacity(eventJSON.count + geohash.utf8.count + 12) + + func appendTLV(_ type: TLVType, _ value: Data) { + data.append(type.rawValue) + data.append(UInt8((value.count >> 8) & 0xFF)) + data.append(UInt8(value.count & 0xFF)) + data.append(value) + } + + appendTLV(.direction, Data([direction.rawValue])) + appendTLV(.geohash, Data(geohash.utf8)) + appendTLV(.eventJSON, eventJSON) + return data + } + + static func decode(_ data: Data) -> NostrCarrierPacket? { + // Defensive slice re-base (Data slices keep parent indices). + let data = Data(data) + var offset = 0 + var direction: Direction? + var geohash: String? + var eventJSON: Data? + + while offset + 3 <= data.count { + let typeRaw = data[offset] + let length = (Int(data[offset + 1]) << 8) | Int(data[offset + 2]) + offset += 3 + guard offset + length <= data.count else { return nil } + let value = data.subdata(in: offset.. [PeerID] { + peers.values.filter { $0.capabilities.contains(capability) }.map(\.peerID) + } + func displayNicknames(selfNickname: String) -> [PeerID: String] { let connected = peers.filter { $0.value.isConnected } let tuples = connected.map { ($0.key, $0.value.nickname, true) } diff --git a/bitchat/Services/BLE/BLEReceivePipeline.swift b/bitchat/Services/BLE/BLEReceivePipeline.swift index 71aacbaf..9bc30011 100644 --- a/bitchat/Services/BLE/BLEReceivePipeline.swift +++ b/bitchat/Services/BLE/BLEReceivePipeline.swift @@ -51,8 +51,11 @@ struct BLEReceivePipeline { // Courier envelopes are directed opaque ciphertext like DMs; a // remote handover toward a relayed announce rides this same // deterministic relay treatment instead of the broadcast clamp. + // Directed nostrCarrier uplinks (mesh-only peer -> gateway) need + // the same multi-hop treatment to reach a non-adjacent gateway. isDirectedEncrypted: (packet.type == MessageType.noiseEncrypted.rawValue - || packet.type == MessageType.courierEnvelope.rawValue) && packet.recipientID != nil, + || packet.type == MessageType.courierEnvelope.rawValue + || packet.type == MessageType.nostrCarrier.rawValue) && packet.recipientID != nil, isFragment: packet.type == MessageType.fragment.rawValue, isDirectedFragment: packet.type == MessageType.fragment.rawValue && packet.recipientID != nil, isHandshake: packet.type == MessageType.noiseHandshake.rawValue, diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index d1ed84f2..111eb780 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -60,6 +60,14 @@ final class BLEService: NSObject { // Local-only store-and-forward counters; nil in unit tests. var sfMetrics: StoreAndForwardMetrics? + // Gateway mode: sink for received nostrCarrier packets (set by app + // wiring, called on the main actor after transport-level checks) and the + // runtime-toggled capability bits ORed into `PeerCapabilities.localSupported` + // for every announce. `directedToUs` distinguishes an uplink deposit + // addressed to this device from a downlink broadcast. + var onNostrCarrierPacket: (@MainActor (_ payload: Data, _ from: PeerID, _ directedToUs: Bool) -> Void)? + private var runtimeCapabilities: PeerCapabilities = [] // collectionsQueue + #if DEBUG // Test-only tap on the outbound pipeline so multi-node tests can ferry // packets between in-process service instances. @@ -625,6 +633,32 @@ final class BLEService: NSObject { collectionsQueue.sync { peerRegistry.capabilities(for: peerID) } } + /// Enables or disables a runtime-advertised capability bit (e.g. the + /// internet-gateway toggle) and re-announces so peers learn promptly. + /// Build-time bits stay in `PeerCapabilities.localSupported`. + func setLocalCapability(_ capability: PeerCapabilities, enabled: Bool) { + let changed: Bool = collectionsQueue.sync(flags: .barrier) { + let before = runtimeCapabilities + if enabled { + runtimeCapabilities.insert(capability) + } else { + runtimeCapabilities.remove(capability) + } + return runtimeCapabilities != before + } + guard changed else { return } + sendAnnounce(forceSend: true) + } + + /// Reachable peers currently advertising the `.gateway` capability. + func reachableGatewayPeers() -> [PeerID] { + let now = Date() + return collectionsQueue.sync { + peerRegistry.peers(advertising: .gateway) + .filter { peerRegistry.isReachable($0, now: now) } + } + } + func getPeerNicknames() -> [PeerID: String] { return collectionsQueue.sync { peerRegistry.displayNicknames(selfNickname: myNickname) @@ -1259,16 +1293,16 @@ final class BLEService: NSObject { let noisePub = noiseService.getStaticPublicKeyData() // For noise handshakes and peer identification let signingPub = noiseService.getSigningPublicKeyData() // For signature verification - let connectedPeerIDs: [Data] = collectionsQueue.sync { - peerRegistry.connectedRoutingData + let (connectedPeerIDs, advertisedCapabilities): ([Data], PeerCapabilities) = collectionsQueue.sync { + (peerRegistry.connectedRoutingData, PeerCapabilities.localSupported.union(runtimeCapabilities)) } - + let announcement = AnnouncementPacket( nickname: myNickname, noisePublicKey: noisePub, signingPublicKey: signingPub, directNeighbors: connectedPeerIDs, - capabilities: PeerCapabilities.localSupported + capabilities: advertisedCapabilities ) guard let payload = announcement.encode() else { @@ -2716,6 +2750,81 @@ extension BLEService { } } + // MARK: Gateway carrier (nostrCarrier) + + /// Sign and send an encoded `toGateway` carrier payload directed at a + /// gateway peer. The packet is signed so the gateway can key its uplink + /// quotas to an authenticated depositor; the carried Nostr event has its + /// own Schnorr signature for content authenticity. Returns false when + /// the gateway is not reachable or signing fails. + func sendNostrCarrier(_ payload: Data, to gatewayPeer: PeerID) -> Bool { + guard isPeerReachable(gatewayPeer) else { return false } + let packet = BitchatPacket( + type: MessageType.nostrCarrier.rawValue, + senderID: myPeerIDData, + recipientID: Data(hexString: gatewayPeer.id), + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: messageTTL + ) + guard let signed = noiseService.signPacket(packet) else { return false } + messageQueue.async { [weak self] in + // broadcastPacket applies a known route when one exists and + // otherwise floods the directed packet like a DM, so a gateway + // that is reachable but multi-hop still gets the deposit. + self?.broadcastPacket(signed) + } + return true + } + + /// Broadcast an encoded `fromGateway` carrier payload on the mesh with + /// the default TTL. Unsigned at the packet layer — receivers verify the + /// carried event's own Schnorr signature. + func broadcastNostrCarrier(_ payload: Data) { + let packet = BitchatPacket( + type: MessageType.nostrCarrier.rawValue, + senderID: myPeerIDData, + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: messageTTL + ) + messageQueue.async { [weak self] in + self?.broadcastPacket(packet) + } + } + + /// Transport-level handling for a received nostrCarrier packet; policy + /// (verification of the carried event, quotas, loop prevention) lives in + /// `GatewayService` behind `onNostrCarrierPacket`. + private func handleNostrCarrier(_ packet: BitchatPacket, from peerID: PeerID) { + let senderID = PeerID(hexData: packet.senderID) + let directedToUs: Bool + if let recipientID = packet.recipientID { + // Carriers addressed elsewhere ride the generic relay path untouched. + guard recipientID == myPeerIDData else { return } + // Uplink deposit: quotas are keyed by the depositor, so the + // packet signature must verify against the sender's announced + // signing key. Unlike courier deposits the depositor may be + // multi-hop away, so ingress-link identity is not required. + let signingKey = collectionsQueue.sync { peerRegistry.info(for: senderID)?.signingPublicKey } + guard let signingKey, + noiseService.verifyPacketSignature(packet, publicKey: signingKey) else { + SecureLogger.debug("🌐 nostrCarrier uplink from \(senderID.id.prefix(8))… rejected (missing/invalid packet signature)", category: .security) + return + } + directedToUs = true + } else { + directedToUs = false + } + let payload = packet.payload + notifyUI { [weak self] in + self?.onNostrCarrierPacket?(payload, senderID, directedToUs) + } + } + // MARK: Link capability snapshots (thread-safe via bleQueue) private func readLinkState(_ body: (BLELinkStateStore) -> T) -> T { @@ -3210,6 +3319,9 @@ extension BLEService { case .courierEnvelope: handleCourierEnvelope(packet, from: peerID) + case .nostrCarrier: + handleNostrCarrier(packet, from: peerID) + case .leave: handleLeave(packet, from: senderID) diff --git a/bitchat/Services/Gateway/GatewayService.swift b/bitchat/Services/Gateway/GatewayService.swift new file mode 100644 index 00000000..20924589 --- /dev/null +++ b/bitchat/Services/Gateway/GatewayService.swift @@ -0,0 +1,388 @@ +// +// GatewayService.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import Combine +import Foundation + +/// Policy engine for gateway mode: an opt-in "share my internet with the +/// mesh" bridge. While the toggle is on, this device advertises the +/// `.gateway` capability bit, publishes signed geohash events deposited by +/// mesh-only peers to Nostr relays (uplink), and rebroadcasts inbound relay +/// events onto the mesh (downlink) so mesh-only peers can take part in the +/// local geohash channel. Mesh-only peers need no toggle: their uplink +/// engages automatically when relays are unreachable and a gateway peer +/// exists. +/// +/// Threat model: +/// - Keys never leave the originating device. Mesh-only senders sign events +/// locally with their per-geohash ephemeral identity; the gateway carries +/// only the finished, signed event. +/// - The gateway cannot forge or alter events: every carried event is +/// Schnorr-verified here before it is published or rebroadcast, and again +/// independently by relays and receivers. +/// - Carried contents are public geohash chat, already plaintext on Nostr, +/// so the mesh carrier adds no confidentiality loss. +/// +/// Loop-prevention rules (each enforced here and unit-tested): +/// 1. An event learned from a `fromGateway` mesh broadcast is never +/// re-published to relays, never re-uplinked, and never rebroadcast +/// (`meshBroadcastEventIDs`), so a second gateway on the same mesh cannot +/// echo mesh-carried traffic back out. Mesh-level propagation of the +/// original broadcast packet is the TTL relay's job, not ours. +/// 2. An uplink deposit is published at most once (`publishedEventIDs`) and +/// a relay event is rebroadcast at most once (`rebroadcastEventIDs`), so +/// repeat deposits and relay echoes are absorbed. +/// 3. Uplink is only attempted for locally composed events at the send site +/// (`GeohashSubscriptionManager.sendGeohash`); events received over the +/// carrier never re-enter the uplink path. +/// Rebroadcast storms at the mesh layer are additionally bounded by the BLE +/// `MessageDeduplicator` and packet TTL, and receivers dedup carried events +/// against their own relay subscriptions via the Nostr event-ID cache in +/// `NostrInboundPipeline`. +/// +/// All dependencies are closure-injected (repo convention) so the policy +/// layer is unit-testable without relays or radios. +@MainActor +final class GatewayService: ObservableObject { + enum Limits { + /// Uplink deposits held while relays are unreachable (CourierStore-style + /// bounded mailbag: bounded total, bounded per depositor). + static let maxQueuedUplinks = 20 + static let maxQueuedUplinksPerDepositor = 5 + /// Uplink deposits accepted per depositor per minute. + static let uplinkEventsPerMinutePerDepositor = 10 + /// Downlink mesh rebroadcasts per minute — BLE airtime is precious. + /// Beyond the budget events queue (bounded, drop-oldest) and drain as + /// the window frees; a busy channel triggers frequent drains, a quiet + /// one never queues. + static let downlinkEventsPerMinute = 30 + static let maxPendingDownlinks = 30 + /// Accepted clock skew for a carried ephemeral event; anything older + /// is stale replay the relays would drop anyway. + static let maxEventAgeSeconds: TimeInterval = 15 * 60 + /// Bounded loop-prevention ID caches (oldest evicted). + static let maxTrackedEventIDs = 512 + } + + struct QueuedUplink { + let depositor: PeerID + let geohash: String + let event: NostrEvent + let queuedAt: Date + } + + static let shared = GatewayService() + + /// The user toggle. While true this device advertises `.gateway` and + /// bridges mesh <-> Nostr for geohash channels. + @Published private(set) var isEnabled: Bool + + // MARK: Wiring (set once by the bootstrapper; fakes in tests) + + /// Publishes a verified event to the geo relays for a geohash. + var publishToRelays: (@MainActor (NostrEvent, String) -> Void)? + /// Broadcasts an encoded `fromGateway` carrier payload on the mesh. + var broadcastToMesh: (@MainActor (Data) -> Void)? + /// Sends an encoded `toGateway` carrier payload directed to a gateway + /// peer. Returns false when the transport could not accept it. + var sendToGatewayPeer: (@MainActor (Data, PeerID) -> Bool)? + /// Reachable mesh peers currently advertising the `.gateway` capability. + var availableGatewayPeers: (@MainActor () -> [PeerID])? + /// Whether any Nostr relay connection is currently working. + var relaysConnected: (@MainActor () -> Bool)? + /// The geohash channel the local user is viewing, if any. + var currentGeohash: (@MainActor () -> String?)? + /// Injects a verified carried event into the same inbound pipeline as + /// relay-received events (blocking, rate limits, dedup, rendering). + var injectInbound: (@MainActor (NostrEvent) -> Void)? + /// Fired on toggle changes (advertise/withdraw the capability bit and + /// force a re-announce). + var onEnabledChanged: (@MainActor (Bool) -> Void)? + + // MARK: State + + /// Loop rule 1: event IDs seen in `fromGateway` mesh broadcasts. + private var meshBroadcastEventIDs: BoundedIDSet + /// Loop rule 2 (uplink): event IDs this gateway already published. + private var publishedEventIDs: BoundedIDSet + /// Loop rule 2 (downlink): event IDs this gateway already rebroadcast. + private var rebroadcastEventIDs: BoundedIDSet + + private(set) var queuedUplinks: [QueuedUplink] = [] + private var uplinkDepositTimes: [PeerID: [Date]] = [:] + private var downlinkSendTimes: [Date] = [] + private var pendingDownlinks: [(event: NostrEvent, geohash: String)] = [] + + private let defaults: UserDefaults + private let now: () -> Date + private static let enabledKey = "gateway.userEnabled" + + init(defaults: UserDefaults = .standard, now: @escaping () -> Date = Date.init) { + self.defaults = defaults + self.now = now + self.isEnabled = defaults.bool(forKey: Self.enabledKey) + self.meshBroadcastEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + self.publishedEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + self.rebroadcastEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + } + + // MARK: - Toggle + + func setEnabled(_ enabled: Bool) { + guard enabled != isEnabled else { return } + isEnabled = enabled + defaults.set(enabled, forKey: Self.enabledKey) + if !enabled { + queuedUplinks.removeAll() + pendingDownlinks.removeAll() + uplinkDepositTimes.removeAll() + } + SecureLogger.info("🌐 Gateway mode \(enabled ? "enabled" : "disabled")", category: .session) + onEnabledChanged?(enabled) + } + + // MARK: - Mesh carrier ingress (both roles) + + /// Entry point for received `nostrCarrier` packets. `directedToUs` is + /// true for packets addressed to this device (uplink deposits); false + /// for broadcasts (downlink rebroadcasts from a gateway). + func handleMeshCarrier(_ payload: Data, from peerID: PeerID, directedToUs: Bool) { + guard let carrier = NostrCarrierPacket.decode(payload) else { + SecureLogger.debug("🌐 Gateway: dropping undecodable carrier from \(peerID.id.prefix(8))…", category: .session) + return + } + switch carrier.direction { + case .toGateway: + // Uplink deposits are directed; a broadcast toGateway is malformed. + guard directedToUs else { return } + handleUplinkDeposit(carrier, from: peerID) + case .fromGateway: + // Downlink rides broadcast only; a directed fromGateway is malformed. + guard !directedToUs else { return } + handleDownlinkBroadcast(carrier) + } + } + + // MARK: - Uplink (gateway role: mesh peer -> internet) + + private func handleUplinkDeposit(_ carrier: NostrCarrierPacket, from depositor: PeerID) { + guard isEnabled else { return } + guard let event = validatedEvent(from: carrier) else { + SecureLogger.debug("🌐 Gateway: rejected uplink deposit from \(depositor.id.prefix(8))… (failed validation)", category: .security) + return + } + // Loop rule 1: events learned from a fromGateway broadcast are + // mesh-carried; a gateway must never re-publish them. + guard !meshBroadcastEventIDs.contains(event.id) else { return } + // Loop rule 2: repeat deposits of an already handled event are absorbed. + guard !publishedEventIDs.contains(event.id), + !queuedUplinks.contains(where: { $0.event.id == event.id }) else { + return + } + guard allowUplinkDeposit(from: depositor) else { + SecureLogger.debug("🌐 Gateway: rate-limited uplink deposit from \(depositor.id.prefix(8))…", category: .session) + return + } + + if relaysConnected?() ?? false { + publish(event, geohash: carrier.geohash) + } else { + enqueueUplink(QueuedUplink(depositor: depositor, geohash: carrier.geohash, event: event, queuedAt: now())) + } + + // Show the carried message on our own timeline when we're viewing + // that geohash; the relay echo (if any) dedups in the pipeline. + if currentGeohash?() == carrier.geohash { + injectInbound?(event) + } + } + + /// Publish everything queued while relays were unreachable. Called when + /// relay connectivity comes back. + func flushQueuedUplinks() { + guard isEnabled, relaysConnected?() ?? false, !queuedUplinks.isEmpty else { return } + let queued = queuedUplinks + queuedUplinks.removeAll() + for item in queued where !publishedEventIDs.contains(item.event.id) { + publish(item.event, geohash: item.geohash) + } + } + + private func publish(_ event: NostrEvent, geohash: String) { + publishedEventIDs.insert(event.id) + publishToRelays?(event, geohash) + SecureLogger.info("🌐 Gateway: published carried event \(event.id.prefix(8))… to relays for #\(geohash)", category: .session) + } + + private func enqueueUplink(_ item: QueuedUplink) { + let fromDepositor = queuedUplinks.filter { $0.depositor == item.depositor }.count + guard fromDepositor < Limits.maxQueuedUplinksPerDepositor else { + SecureLogger.debug("🌐 Gateway: uplink queue quota reached for \(item.depositor.id.prefix(8))…", category: .session) + return + } + if queuedUplinks.count >= Limits.maxQueuedUplinks { + queuedUplinks.removeFirst(queuedUplinks.count - Limits.maxQueuedUplinks + 1) + } + queuedUplinks.append(item) + } + + private func allowUplinkDeposit(from depositor: PeerID) -> Bool { + let cutoff = now().addingTimeInterval(-60) + var times = uplinkDepositTimes[depositor, default: []] + times.removeAll { $0 < cutoff } + guard times.count < Limits.uplinkEventsPerMinutePerDepositor else { + uplinkDepositTimes[depositor] = times + return false + } + times.append(now()) + uplinkDepositTimes[depositor] = times + // Bound the tracker itself against a churn of spoofed depositors. + if uplinkDepositTimes.count > Limits.maxTrackedEventIDs { + uplinkDepositTimes = uplinkDepositTimes.filter { !$0.value.isEmpty && $0.value.contains { $0 >= cutoff } } + } + return true + } + + // MARK: - Downlink (gateway role: internet -> mesh) + + /// Called for every event the gateway's own geohash-channel subscription + /// delivers. Wraps it in a `fromGateway` carrier and broadcasts it on + /// the mesh, within the airtime budget. + func rebroadcastRelayEvent(_ event: NostrEvent, geohash: String) { + guard isEnabled, broadcastToMesh != nil else { return } + guard event.kind == NostrProtocol.EventKind.ephemeralEvent.rawValue else { return } + // Loop rule 1: never rebroadcast mesh-carried events back onto the + // mesh. Loop rule 2: rebroadcast each relay event at most once. + guard !meshBroadcastEventIDs.contains(event.id), + !rebroadcastEventIDs.contains(event.id) else { + return + } + // Verify before spending BLE airtime; receivers verify again. + guard event.isValidSignature() else { return } + rebroadcastEventIDs.insert(event.id) + + pendingDownlinks.append((event, geohash)) + if pendingDownlinks.count > Limits.maxPendingDownlinks { + // Bandwidth guard: drop-oldest — fresher chat is worth more. + pendingDownlinks.removeFirst(pendingDownlinks.count - Limits.maxPendingDownlinks) + } + drainPendingDownlinks() + } + + private func drainPendingDownlinks() { + let cutoff = now().addingTimeInterval(-60) + downlinkSendTimes.removeAll { $0 < cutoff } + while !pendingDownlinks.isEmpty, + downlinkSendTimes.count < Limits.downlinkEventsPerMinute { + let (event, geohash) = pendingDownlinks.removeFirst() + guard let carrier = NostrCarrierPacket(direction: .fromGateway, geohash: geohash, event: event), + let payload = carrier.encode() else { continue } + broadcastToMesh?(payload) + downlinkSendTimes.append(now()) + } + } + + // MARK: - Downlink (receiver role: carried event arrives over mesh) + + private func handleDownlinkBroadcast(_ carrier: NostrCarrierPacket) { + guard let event = validatedEvent(from: carrier) else { return } + // Mark only AFTER signature verification, so a forged copy carrying a + // real event's ID cannot poison the never-republish set, and use the + // marking as dedup: the same broadcast relayed along several mesh + // paths injects once (the pipeline's Nostr event-ID cache additionally + // dedups against our own relay subscription). + guard meshBroadcastEventIDs.insert(event.id) else { return } + // Only inject events for the channel we're viewing; the inbound + // pipeline files public messages under the current geohash. + guard currentGeohash?() == carrier.geohash else { return } + injectInbound?(event) + } + + // MARK: - Uplink (sender role: mesh-only peer with no relays) + + /// Hands a locally signed event to a mesh gateway peer when we have no + /// working relay connection. Returns true when the event was sent. + /// + /// v1 is deliberately fire-and-forget: no gateway ack. The event also + /// stays in `NostrRelayManager`'s own pending queue, so if our internet + /// comes back the relays dedup the duplicate publish by event ID. + /// + /// Loop rule 3: call sites only pass freshly composed events (see + /// `GeohashSubscriptionManager.sendGeohash`); received carrier events + /// never reach this path, and the mesh-carried guard below backstops it. + func uplinkViaMesh(event: NostrEvent, geohash: String) -> Bool { + if relaysConnected?() ?? true { return false } + guard !meshBroadcastEventIDs.contains(event.id), + !publishedEventIDs.contains(event.id) else { + return false + } + // A single gateway is enough — relays fan out from there, and BLE + // airtime is precious. + guard let gateway = availableGatewayPeers?().first else { return false } + guard let carrier = NostrCarrierPacket(direction: .toGateway, geohash: geohash, event: event), + let payload = carrier.encode() else { + return false + } + guard sendToGatewayPeer?(payload, gateway) ?? false else { return false } + SecureLogger.info("🌐 Gateway: uplinked event \(event.id.prefix(8))… for #\(geohash) via mesh gateway \(gateway.id.prefix(8))…", category: .session) + return true + } + + // MARK: - Validation + + /// Structural and cryptographic checks every carried event must pass + /// before a gateway publishes it or a receiver displays it. Ordered + /// cheap-first; Schnorr verification runs last. + private func validatedEvent(from carrier: NostrCarrierPacket) -> NostrEvent? { + guard carrier.eventJSON.count <= NostrCarrierPacket.maxEventJSONBytes, + Self.isValidGeohash(carrier.geohash), + let event = carrier.event(), + event.kind == NostrProtocol.EventKind.ephemeralEvent.rawValue, + event.tags.contains(where: { $0.count >= 2 && $0[0] == "g" && $0[1] == carrier.geohash }), + abs(now().timeIntervalSince1970 - TimeInterval(event.created_at)) <= Limits.maxEventAgeSeconds, + event.isValidSignature() else { + return nil + } + return event + } + + static func isValidGeohash(_ geohash: String) -> Bool { + let allowed = Set("0123456789bcdefghjkmnpqrstuvwxyz") + return (1...NostrCarrierPacket.maxGeohashLength).contains(geohash.count) + && geohash.allSatisfy { allowed.contains($0) } + } +} + +/// Insertion-ordered string set with a fixed capacity; the oldest entry is +/// evicted when full. +private struct BoundedIDSet { + private var members: Set = [] + private var order: [String] = [] + let capacity: Int + + init(capacity: Int) { + self.capacity = capacity + } + + func contains(_ id: String) -> Bool { + members.contains(id) + } + + /// Returns false when the ID was already present. + @discardableResult + mutating func insert(_ id: String) -> Bool { + guard members.insert(id).inserted else { return false } + order.append(id) + if order.count > capacity { + members.remove(order.removeFirst()) + } + return true + } +} diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index 430485a0..d4a51a6c 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -23,6 +23,10 @@ struct SyncTypeFlags: OptionSet { // Courier envelopes are directed deposits between trusted peers and // must never spread via gossip sync. case .courierEnvelope: return nil + // Gateway carriers are ephemeral live traffic (uplinks are directed, + // downlinks are rate-budgeted rebroadcasts); replaying them via sync + // would waste airtime and extend their lifetime. + case .nostrCarrier: return nil } } diff --git a/bitchat/ViewModels/ChatViewModelBootstrapper.swift b/bitchat/ViewModels/ChatViewModelBootstrapper.swift index 35bc0ef4..d1b73f0e 100644 --- a/bitchat/ViewModels/ChatViewModelBootstrapper.swift +++ b/bitchat/ViewModels/ChatViewModelBootstrapper.swift @@ -72,6 +72,7 @@ final class ChatViewModelBootstrapper { configureNoiseCallbacks() bindTransferProgress() configureGeoChannels() + configureGateway() bindTeleportState() requestNotifications() registerObservers() @@ -244,6 +245,68 @@ private extension ChatViewModelBootstrapper { ) } + /// Wires the gateway-mode policy layer (`GatewayService`) to the mesh + /// transport, the relay manager, and the inbound Nostr pipeline. All + /// dependencies are closures so the service stays unit-testable with + /// fakes. + func configureGateway() { + // Gateway mode bridges BLE mesh <-> Nostr; a mock transport (tests) + // has no carrier packets to bridge. + guard let bleService = viewModel.meshService as? BLEService else { return } + let gateway = GatewayService.shared + + gateway.publishToRelays = { event, geohash in + let relays = GeoRelayDirectory.shared.closestRelays( + toGeohash: geohash, + count: TransportConfig.nostrGeoRelayCount + ) + if relays.isEmpty { + NostrRelayManager.shared.sendEvent(event) + } else { + NostrRelayManager.shared.sendEvent(event, to: relays) + } + } + gateway.broadcastToMesh = { [weak bleService] payload in + bleService?.broadcastNostrCarrier(payload) + } + gateway.sendToGatewayPeer = { [weak bleService] payload, peer in + bleService?.sendNostrCarrier(payload, to: peer) ?? false + } + gateway.availableGatewayPeers = { [weak bleService] in + bleService?.reachableGatewayPeers() ?? [] + } + gateway.relaysConnected = { NostrRelayManager.shared.isConnected } + gateway.currentGeohash = { [weak viewModel] in viewModel?.currentGeohash } + // Carried events enter the same pipeline as relay-received events so + // blocking, rate limits, dedup, and rendering behave identically. + gateway.injectInbound = { [weak viewModel] event in + viewModel?.handleNostrEvent(event) + } + // The capability bit is advertised ONLY while the toggle is on; a + // change forces a re-announce so peers learn promptly. + gateway.onEnabledChanged = { [weak bleService] enabled in + bleService?.setLocalCapability(.gateway, enabled: enabled) + } + bleService.onNostrCarrierPacket = { payload, from, directedToUs in + GatewayService.shared.handleMeshCarrier(payload, from: from, directedToUs: directedToUs) + } + + // Uplinks deposited while relays were unreachable flush on reconnect. + NostrRelayManager.shared.$isConnected + .receive(on: DispatchQueue.main) + .sink { connected in + if connected { + GatewayService.shared.flushQueuedUplinks() + } + } + .store(in: &viewModel.cancellables) + + // Apply the persisted toggle at launch. + if gateway.isEnabled { + bleService.setLocalCapability(.gateway, enabled: true) + } + } + func bindTeleportState() { viewModel.locationManager.$teleported .receive(on: DispatchQueue.main) diff --git a/bitchat/ViewModels/GeohashSubscriptionManager.swift b/bitchat/ViewModels/GeohashSubscriptionManager.swift index 4e267c59..ce4c9448 100644 --- a/bitchat/ViewModels/GeohashSubscriptionManager.swift +++ b/bitchat/ViewModels/GeohashSubscriptionManager.swift @@ -115,6 +115,9 @@ final class GeohashSubscriptionManager { private weak var context: (any GeohashSubscriptionContext)? private let inbound: NostrInboundPipeline private let presence: GeoPresenceTracker + /// Geohashes already told "sent via mesh gateway" this session, so the + /// notice appears once per channel instead of once per message. + private var gatewayNoticeGeohashes = Set() init(context: any GeohashSubscriptionContext, inbound: NostrInboundPipeline, presence: GeoPresenceTracker) { self.context = context @@ -145,6 +148,9 @@ final class GeohashSubscriptionManager { NostrRelayManager.shared.subscribe(filter: filter, id: subID, relayUrls: subRelays) { [weak self] event in Task { @MainActor [weak self] in self?.inbound.subscribeNostrEvent(event) + // Gateway downlink: rebroadcast relay events for the viewed + // channel onto the mesh (no-op unless gateway mode is on). + GatewayService.shared.rebroadcastRelayEvent(event, geohash: channel.geohash) } } @@ -235,6 +241,9 @@ final class GeohashSubscriptionManager { NostrRelayManager.shared.subscribe(filter: filter, id: subID, relayUrls: subRelays) { [weak self] event in Task { @MainActor [weak self] in self?.inbound.handleNostrEvent(event) + // Gateway downlink: rebroadcast relay events for the viewed + // channel onto the mesh (no-op unless gateway mode is on). + GatewayService.shared.rebroadcastRelayEvent(event, geohash: channel.geohash) } } @@ -280,6 +289,23 @@ final class GeohashSubscriptionManager { NostrRelayManager.shared.sendEvent(event, to: targetRelays) } + // Mesh gateway uplink: with no working relay connection, hand the + // locally signed event to a mesh peer advertising the gateway + // capability (keys never leave this device — only the finished, + // signed event travels). Uplink is only ever attempted here, for a + // freshly composed event, never for received carrier events (loop + // rule 3 in GatewayService). + if GatewayService.shared.uplinkViaMesh(event: event, geohash: channel.geohash), + gatewayNoticeGeohashes.insert(channel.geohash).inserted { + context.addPublicSystemMessage( + String( + localized: "system.gateway.sent_via_mesh", + defaultValue: "sent via mesh gateway", + comment: "System message when a geohash message was handed to a mesh internet gateway because no relay is reachable" + ) + ) + } + context.recordGeoParticipant(pubkeyHex: identity.publicKeyHex) context.registerNostrKeyMapping(identity.publicKeyHex, for: PeerID(nostr: identity.publicKeyHex)) SecureLogger.debug( diff --git a/bitchat/Views/ContentHeaderView.swift b/bitchat/Views/ContentHeaderView.swift index eb188ed7..08403030 100644 --- a/bitchat/Views/ContentHeaderView.swift +++ b/bitchat/Views/ContentHeaderView.swift @@ -91,6 +91,19 @@ struct ContentHeaderView: View { }() HStack(spacing: 2) { + if locationChannelsModel.gatewayEnabled { + Image(systemName: "globe") + .font(.bitchatSystem(size: 12)) + .foregroundColor(palette.secondary.opacity(0.8)) + .headerTapTarget() + .accessibilityLabel( + String(localized: "content.accessibility.gateway_active", defaultValue: "Internet gateway active, sharing your connection with the mesh", comment: "Accessibility label for the internet gateway indicator") + ) + .help( + String(localized: "content.header.gateway_active", defaultValue: "Sharing your internet connection with nearby mesh peers", comment: "Tooltip for the internet gateway indicator") + ) + } + if carriedMailCount > 0 { Image(systemName: "figure.walk") .font(.bitchatSystem(size: 12)) diff --git a/bitchat/Views/LocationChannelsSheet.swift b/bitchat/Views/LocationChannelsSheet.swift index 77b45a21..0a6e077a 100644 --- a/bitchat/Views/LocationChannelsSheet.swift +++ b/bitchat/Views/LocationChannelsSheet.swift @@ -27,6 +27,8 @@ struct LocationChannelsSheet: View { static let removeAccess: LocalizedStringKey = "location_channels.action.remove_access" static let torTitle: LocalizedStringKey = "location_channels.tor.title" static let torSubtitle: LocalizedStringKey = "location_channels.tor.subtitle" + static let gatewayTitle: LocalizedStringKey = "location_channels.gateway.title" + static let gatewaySubtitle: LocalizedStringKey = "location_channels.gateway.subtitle" static let toggleOn: LocalizedStringKey = "common.toggle.on" static let toggleOff: LocalizedStringKey = "common.toggle.off" @@ -244,6 +246,8 @@ struct LocationChannelsSheet: View { sectionDivider torToggleSection .padding(.top, 12) + gatewayToggleSection + .padding(.top, 8) Button(action: SystemSettings.location.open) { Text(Strings.removeAccess) .bitchatFont(size: 12) @@ -508,6 +512,32 @@ extension LocationChannelsSheet { .cornerRadius(8) } + private var gatewayToggleBinding: Binding { + Binding( + get: { locationChannelsModel.gatewayEnabled }, + set: { locationChannelsModel.setGatewayEnabled($0) } + ) + } + + private var gatewayToggleSection: some View { + VStack(alignment: .leading, spacing: 8) { + Toggle(isOn: gatewayToggleBinding) { + VStack(alignment: .leading, spacing: 2) { + Text(Strings.gatewayTitle) + .bitchatFont(size: 12, weight: .semibold) + .foregroundColor(palette.primary) + Text(Strings.gatewaySubtitle) + .bitchatFont(size: 11) + .foregroundColor(palette.secondary) + } + } + .toggleStyle(IRCToggleStyle(accent: palette.accent, onLabel: Strings.toggleOn, offLabel: Strings.toggleOff)) + } + .padding(12) + .background(palette.secondary.opacity(0.12)) + .cornerRadius(8) + } + private var standardGreen: Color { palette.primary } private var standardBlue: Color { palette.accentBlue } } diff --git a/bitchatTests/Protocols/NostrCarrierPacketTests.swift b/bitchatTests/Protocols/NostrCarrierPacketTests.swift new file mode 100644 index 00000000..50ffb287 --- /dev/null +++ b/bitchatTests/Protocols/NostrCarrierPacketTests.swift @@ -0,0 +1,96 @@ +// +// NostrCarrierPacketTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +@testable import bitchat + +@Suite("Nostr carrier packet TLV") +struct NostrCarrierPacketTests { + private func makeEvent(geohash: String = "u4pruy", content: String = "hello mesh") throws -> NostrEvent { + let identity = try NostrIdentity.generate() + return try NostrProtocol.createEphemeralGeohashEvent( + content: content, + geohash: geohash, + senderIdentity: identity, + nickname: "tester" + ) + } + + @Test("round-trips both directions with the signed event intact") + func roundTrip() throws { + let event = try makeEvent() + for direction in [NostrCarrierPacket.Direction.toGateway, .fromGateway] { + let packet = try #require(NostrCarrierPacket(direction: direction, geohash: "u4pruy", event: event)) + let encoded = try #require(packet.encode()) + let decoded = try #require(NostrCarrierPacket.decode(encoded)) + + #expect(decoded == packet) + #expect(decoded.direction == direction) + #expect(decoded.geohash == "u4pruy") + + // The carried event survives byte-exact: same ID, and the + // signature still verifies after the mesh hop. + let carried = try #require(decoded.event()) + #expect(carried.id == event.id) + #expect(carried.sig == event.sig) + #expect(carried.isValidSignature()) + } + } + + @Test("rejects an oversized event at construction and at decode") + func oversizedRejected() throws { + let oversized = Data(repeating: 0x7B, count: NostrCarrierPacket.maxEventJSONBytes + 1) + #expect(NostrCarrierPacket(direction: .toGateway, geohash: "u4pruy", eventJSON: oversized) == nil) + + // Hand-build the TLV bytes to bypass the initializer's cap. + var data = Data([0x01, 0x00, 0x01, NostrCarrierPacket.Direction.toGateway.rawValue]) + let geohash = Data("u4pruy".utf8) + data.append(contentsOf: [0x02, 0x00, UInt8(geohash.count)]) + data.append(geohash) + data.append(contentsOf: [0x03, UInt8((oversized.count >> 8) & 0xFF), UInt8(oversized.count & 0xFF)]) + data.append(oversized) + #expect(NostrCarrierPacket.decode(data) == nil) + } + + @Test("rejects an over-length or empty geohash") + func geohashBoundsEnforced() throws { + let event = try makeEvent() + #expect(NostrCarrierPacket(direction: .toGateway, geohash: "", event: event) == nil) + #expect(NostrCarrierPacket(direction: .toGateway, geohash: String(repeating: "u", count: 13), event: event) == nil) + #expect(NostrCarrierPacket(direction: .toGateway, geohash: String(repeating: "u", count: 12), event: event) != nil) + } + + @Test("skips unknown TLVs for forward compatibility") + func unknownTLVSkipped() throws { + let event = try makeEvent() + let packet = try #require(NostrCarrierPacket(direction: .fromGateway, geohash: "u4pruy", event: event)) + var encoded = try #require(packet.encode()) + // Append an unknown TLV (type 0x7F, 2-byte value). + encoded.append(contentsOf: [0x7F, 0x00, 0x02, 0xDE, 0xAD]) + let decoded = try #require(NostrCarrierPacket.decode(encoded)) + #expect(decoded == packet) + } + + @Test("rejects truncated and missing-field payloads") + func malformedRejected() throws { + let event = try makeEvent() + let packet = try #require(NostrCarrierPacket(direction: .toGateway, geohash: "u4pruy", event: event)) + let encoded = try #require(packet.encode()) + + // Truncation anywhere inside the last TLV fails cleanly. + #expect(NostrCarrierPacket.decode(encoded.dropLast(1)) == nil) + #expect(NostrCarrierPacket.decode(encoded.prefix(4)) == nil) + #expect(NostrCarrierPacket.decode(Data()) == nil) + + // Direction TLV alone (missing geohash and event) fails. + #expect(NostrCarrierPacket.decode(Data([0x01, 0x00, 0x01, 0x01])) == nil) + // Unknown direction value fails. + #expect(NostrCarrierPacket.decode(Data([0x01, 0x00, 0x01, 0x77])) == nil) + } +} diff --git a/bitchatTests/Services/GatewayServiceTests.swift b/bitchatTests/Services/GatewayServiceTests.swift new file mode 100644 index 00000000..0372c410 --- /dev/null +++ b/bitchatTests/Services/GatewayServiceTests.swift @@ -0,0 +1,453 @@ +// +// GatewayServiceTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +@Suite("Gateway mode policy") +@MainActor +struct GatewayServiceTests { + private static let geohash = "u4pruy" + + /// Closure-injected harness around `GatewayService` recording every + /// side effect, with a controllable clock and relay connectivity. + @MainActor + private final class Fixture { + private final class ClockBox { + var now = Date() + } + + var relaysConnected = true + var currentGeohash: String? = GatewayServiceTests.geohash + var gatewayPeers: [PeerID] = [] + var sendToGatewaySucceeds = true + + private(set) var published: [(event: NostrEvent, geohash: String)] = [] + private(set) var broadcasts: [Data] = [] + private(set) var injected: [NostrEvent] = [] + private(set) var uplinkSends: [(payload: Data, peer: PeerID)] = [] + private(set) var enabledChanges: [Bool] = [] + + private let clock = ClockBox() + let defaults: UserDefaults + let service: GatewayService + + init(enabled: Bool = true, suite: String = "GatewayServiceTests-\(UUID().uuidString)") { + defaults = UserDefaults(suiteName: suite)! + defaults.removePersistentDomain(forName: suite) + let clock = clock + service = GatewayService(defaults: defaults) { clock.now } + service.publishToRelays = { [weak self] event, geohash in + self?.published.append((event, geohash)) + } + service.broadcastToMesh = { [weak self] payload in + self?.broadcasts.append(payload) + } + service.sendToGatewayPeer = { [weak self] payload, peer in + guard let self, self.sendToGatewaySucceeds else { return false } + self.uplinkSends.append((payload, peer)) + return true + } + service.availableGatewayPeers = { [weak self] in self?.gatewayPeers ?? [] } + service.relaysConnected = { [weak self] in self?.relaysConnected ?? false } + service.currentGeohash = { [weak self] in self?.currentGeohash } + service.injectInbound = { [weak self] event in self?.injected.append(event) } + service.onEnabledChanged = { [weak self] enabled in self?.enabledChanges.append(enabled) } + if enabled { + service.setEnabled(true) + } + } + + func advance(_ seconds: TimeInterval) { + clock.now = clock.now.addingTimeInterval(seconds) + } + } + + // MARK: Event helpers + + private func makeEvent( + geohash: String = GatewayServiceTests.geohash, + content: String = "hello \(UUID().uuidString.prefix(8))" + ) throws -> NostrEvent { + let identity = try NostrIdentity.generate() + return try NostrProtocol.createEphemeralGeohashEvent( + content: content, + geohash: geohash, + senderIdentity: identity, + nickname: "tester" + ) + } + + /// A copy of `event` with tampered content but the original ID and + /// signature — what a forging gateway or mesh peer would produce. + private func forge(_ event: NostrEvent) throws -> NostrEvent { + let dict: [String: Any] = [ + "id": event.id, + "pubkey": event.pubkey, + "created_at": event.created_at, + "kind": event.kind, + "tags": event.tags, + "content": event.content + " (tampered)", + "sig": event.sig ?? "" + ] + return try NostrEvent(from: dict) + } + + private func carrierPayload( + _ event: NostrEvent, + direction: NostrCarrierPacket.Direction = .toGateway, + geohash: String = GatewayServiceTests.geohash + ) throws -> Data { + let packet = try #require(NostrCarrierPacket(direction: direction, geohash: geohash, event: event)) + return try #require(packet.encode()) + } + + private func deposit( + _ event: NostrEvent, + into fixture: Fixture, + from depositor: PeerID = PeerID(str: "1122334455667788"), + geohash: String = GatewayServiceTests.geohash + ) throws { + let payload = try carrierPayload(event, direction: .toGateway, geohash: geohash) + fixture.service.handleMeshCarrier(payload, from: depositor, directedToUs: true) + } + + // MARK: - Uplink verification gates + + @Test("publishes a verified deposit to the geo relays") + func verifiedDepositPublished() throws { + let fixture = Fixture() + let event = try makeEvent() + try deposit(event, into: fixture) + + #expect(fixture.published.count == 1) + #expect(fixture.published.first?.event.id == event.id) + #expect(fixture.published.first?.geohash == Self.geohash) + // Viewing the same geohash: the carried message shows on our own timeline. + #expect(fixture.injected.map(\.id) == [event.id]) + } + + @Test("rejects a forged signature") + func forgedSignatureRejected() throws { + let fixture = Fixture() + let forged = try forge(try makeEvent()) + try deposit(forged, into: fixture) + + #expect(fixture.published.isEmpty) + #expect(fixture.injected.isEmpty) + } + + @Test("rejects wrong kind, geohash mismatch, and stale events") + func structuralGates() throws { + let fixture = Fixture() + + // Wrong kind (kind-1 text note instead of kind-20000 ephemeral). + let identity = try NostrIdentity.generate() + let note = try NostrProtocol.createGeohashTextNote( + content: "note", + geohash: Self.geohash, + senderIdentity: identity + ) + try deposit(note, into: fixture) + #expect(fixture.published.isEmpty) + + // Carrier geohash disagreeing with the event's #g tag. + let mismatched = try makeEvent(geohash: "9q8yyk") + try deposit(mismatched, into: fixture, geohash: Self.geohash) + #expect(fixture.published.isEmpty) + + // Stale event (beyond accepted clock skew). + let stale = try makeEvent() + fixture.advance(GatewayService.Limits.maxEventAgeSeconds + 60) + try deposit(stale, into: fixture) + #expect(fixture.published.isEmpty) + } + + @Test("does nothing while the toggle is off") + func disabledGatewayIgnoresDeposits() throws { + let fixture = Fixture(enabled: false) + try deposit(try makeEvent(), into: fixture) + #expect(fixture.published.isEmpty) + #expect(fixture.service.queuedUplinks.isEmpty) + + fixture.service.rebroadcastRelayEvent(try makeEvent(), geohash: Self.geohash) + #expect(fixture.broadcasts.isEmpty) + } + + // MARK: - Uplink quotas and rate limit + + @Test("rate-limits deposits per depositor per minute") + func uplinkRateLimit() throws { + let fixture = Fixture() + let depositor = PeerID(str: "aabbccddeeff0011") + + for _ in 0.. Date: Mon, 6 Jul 2026 20:35:40 +0200 Subject: [PATCH 012/158] Wi-Fi bulk transport: AWDL data plane for large media with BLE fallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BLE stays the control plane: a sender with a queued file > 64 KiB to a directly connected peer advertising the wifiBulk capability sends a bulkTransferOffer (0x04) inside the established Noise session — transferID, file size, payload SHA-256, a fresh 32-byte token, and a random per-transfer Bonjour instance name. The receiver answers bulkTransferResponse (0x05) with its own token half, then both sides meet on a per-transfer _bitchat-bulk._tcp channel over peer-to-peer Wi-Fi (AWDL). The TCP stream is secured independently of TLS: both tokens traveled inside Noise, so only the two peers can derive the ChaChaPoly channel key (HKDF-SHA256, domain "bitchat-bulk-v1", transferID as salt). Frames are length-prefixed sealed boxes with structured direction+counter nonces; the first frame must prove knowledge of the key or the client is disconnected, and the final hash is verified against the offer before delivery. Decline, timeout, or any mid-transfer error falls back to BLE fragmentation exactly once, driving the same TransferProgressManager stream so the UI is unchanged. Wi-Fi-negotiated transfers may carry up to 8 MiB (new FileTransferLimits.maxWifiBulkPayloadBytes, enforced by the receiver from the accepted offer); the BLE path keeps its existing caps. Co-Authored-By: Claude Fable 5 --- bitchat/Info.plist | 6 + bitchat/Protocols/BitchatFilePacket.swift | 18 +- bitchat/Protocols/BitchatProtocol.swift | 7 +- .../Protocols/PeerCapabilities+Local.swift | 2 +- .../Services/BLE/BLEFileTransferHandler.swift | 6 +- .../Services/BLE/BLEFileTransferPolicy.swift | 11 +- bitchat/Services/BLE/BLEService.swift | 128 ++++- bitchat/Services/TransportConfig.swift | 15 + .../Services/WifiBulk/WifiBulkChannel.swift | 463 +++++++++++++++++ .../Services/WifiBulk/WifiBulkCrypto.swift | 215 ++++++++ .../Services/WifiBulk/WifiBulkMessages.swift | 191 +++++++ .../Services/WifiBulk/WifiBulkPolicy.swift | 57 +++ .../WifiBulk/WifiBulkTransferService.swift | 477 ++++++++++++++++++ .../ChatTransportEventCoordinator.swift | 5 + bitchat/ViewModels/NostrInboundPipeline.swift | 13 +- .../WifiBulk/WifiBulkCryptoTests.swift | 264 ++++++++++ .../WifiBulk/WifiBulkLoopbackTests.swift | 246 +++++++++ .../WifiBulk/WifiBulkMessagesTests.swift | 107 ++++ .../WifiBulk/WifiBulkPolicyTests.swift | 150 ++++++ .../WifiBulkTransferServiceTests.swift | 246 +++++++++ .../BitFoundation/FileTransferLimits.swift | 8 +- 21 files changed, 2614 insertions(+), 21 deletions(-) create mode 100644 bitchat/Services/WifiBulk/WifiBulkChannel.swift create mode 100644 bitchat/Services/WifiBulk/WifiBulkCrypto.swift create mode 100644 bitchat/Services/WifiBulk/WifiBulkMessages.swift create mode 100644 bitchat/Services/WifiBulk/WifiBulkPolicy.swift create mode 100644 bitchat/Services/WifiBulk/WifiBulkTransferService.swift create mode 100644 bitchatTests/WifiBulk/WifiBulkCryptoTests.swift create mode 100644 bitchatTests/WifiBulk/WifiBulkLoopbackTests.swift create mode 100644 bitchatTests/WifiBulk/WifiBulkMessagesTests.swift create mode 100644 bitchatTests/WifiBulk/WifiBulkPolicyTests.swift create mode 100644 bitchatTests/WifiBulk/WifiBulkTransferServiceTests.swift diff --git a/bitchat/Info.plist b/bitchat/Info.plist index f949ecee..1a6d4fbb 100644 --- a/bitchat/Info.plist +++ b/bitchat/Info.plist @@ -33,12 +33,18 @@ $(CURRENT_PROJECT_VERSION) LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) + NSBonjourServices + + _bitchat-bulk._tcp + NSBluetoothAlwaysUsageDescription bitchat uses Bluetooth to create a secure mesh network for chatting with nearby users. NSBluetoothPeripheralUsageDescription bitchat uses Bluetooth to discover and connect with other bitchat users nearby. NSCameraUsageDescription bitchat uses the camera to scan QR codes to verify peers. + NSLocalNetworkUsageDescription + bitchat uses peer-to-peer Wi-Fi to transfer large photos and voice notes directly between nearby devices. NSLocationWhenInUseUsageDescription bitchat uses your approximate location to compute local geohash channels for optional public chats. Exact GPS is never shared. NSMicrophoneUsageDescription diff --git a/bitchat/Protocols/BitchatFilePacket.swift b/bitchat/Protocols/BitchatFilePacket.swift index 6002744d..0965bee5 100644 --- a/bitchat/Protocols/BitchatFilePacket.swift +++ b/bitchat/Protocols/BitchatFilePacket.swift @@ -28,12 +28,14 @@ struct BitchatFilePacket { /// Encodes the packet using v2 canonical TLVs (4-byte FILE_SIZE, 4-byte CONTENT length). /// Returns `nil` when fields exceed protocol limits (e.g., content > UInt32.max). - func encode() -> Data? { + /// `limit` defaults to the Bluetooth payload cap; Wi-Fi bulk transfers pass + /// `FileTransferLimits.maxWifiBulkPayloadBytes`. + func encode(limit: Int = FileTransferLimits.maxPayloadBytes) -> Data? { let resolvedSize = fileSize ?? UInt64(content.count) guard resolvedSize <= UInt64(UInt32.max) else { return nil } - guard resolvedSize <= UInt64(FileTransferLimits.maxPayloadBytes) else { return nil } + guard resolvedSize <= UInt64(limit) else { return nil } guard content.count <= Int(UInt32.max) else { return nil } - guard FileTransferLimits.isValidPayload(content.count) else { return nil } + guard FileTransferLimits.isValidPayload(content.count, limit: limit) else { return nil } func appendBE(_ value: T, into data: inout Data) { var big = value.bigEndian @@ -66,7 +68,9 @@ struct BitchatFilePacket { } /// Decodes TLV payloads, tolerating legacy encodings (FILE_SIZE len=8, CONTENT len=2) when possible. - static func decode(_ data: Data) -> BitchatFilePacket? { + /// `limit` defaults to the Bluetooth payload cap; Wi-Fi bulk transfers pass + /// the (smaller of the) accepted-offer size and the Wi-Fi bulk ceiling. + static func decode(_ data: Data, limit: Int = FileTransferLimits.maxPayloadBytes) -> BitchatFilePacket? { var cursor = data.startIndex let end = data.endIndex @@ -126,7 +130,7 @@ struct BitchatFilePacket { for byte in value { size = (size << 8) | UInt64(byte) } - if size > UInt64(FileTransferLimits.maxPayloadBytes) { + if size > UInt64(limit) { return nil } fileSize = size @@ -135,7 +139,7 @@ struct BitchatFilePacket { mimeType = String(data: Data(value), encoding: .utf8) case .content: let proposedSize = content.count + value.count - if proposedSize > FileTransferLimits.maxPayloadBytes { + if proposedSize > limit { return nil } content.append(contentsOf: value) @@ -145,7 +149,7 @@ struct BitchatFilePacket { } guard !content.isEmpty else { return nil } - guard FileTransferLimits.isValidPayload(content.count) else { return nil } + guard FileTransferLimits.isValidPayload(content.count, limit: limit) else { return nil } return BitchatFilePacket( fileName: fileName, fileSize: fileSize ?? UInt64(content.count), diff --git a/bitchat/Protocols/BitchatProtocol.swift b/bitchat/Protocols/BitchatProtocol.swift index 4ebe6509..37142bc6 100644 --- a/bitchat/Protocols/BitchatProtocol.swift +++ b/bitchat/Protocols/BitchatProtocol.swift @@ -72,15 +72,20 @@ enum NoisePayloadType: UInt8 { case privateMessage = 0x01 // Private chat message case readReceipt = 0x02 // Message was read case delivered = 0x03 // Message was delivered + // Wi-Fi bulk transport negotiation (AWDL data plane for large media) + case bulkTransferOffer = 0x04 // Offer to move a large file over peer-to-peer Wi-Fi + case bulkTransferResponse = 0x05 // Accept/decline reply to a bulk transfer offer // Verification (QR-based OOB binding) case verifyChallenge = 0x10 // Verification challenge case verifyResponse = 0x11 // Verification response - + var description: String { switch self { case .privateMessage: return "privateMessage" case .readReceipt: return "readReceipt" case .delivered: return "delivered" + case .bulkTransferOffer: return "bulkTransferOffer" + case .bulkTransferResponse: return "bulkTransferResponse" case .verifyChallenge: return "verifyChallenge" case .verifyResponse: return "verifyResponse" } diff --git a/bitchat/Protocols/PeerCapabilities+Local.swift b/bitchat/Protocols/PeerCapabilities+Local.swift index 40f97b9f..59145fc6 100644 --- a/bitchat/Protocols/PeerCapabilities+Local.swift +++ b/bitchat/Protocols/PeerCapabilities+Local.swift @@ -3,5 +3,5 @@ import BitFoundation extension PeerCapabilities { /// Capabilities this build advertises in its announce packets. /// Each feature adds its bit here when it ships. - static let localSupported: PeerCapabilities = [] + static let localSupported: PeerCapabilities = TransportConfig.wifiBulkEnabled ? [.wifiBulk] : [] } diff --git a/bitchat/Services/BLE/BLEFileTransferHandler.swift b/bitchat/Services/BLE/BLEFileTransferHandler.swift index 43d13aa9..ac2854a2 100644 --- a/bitchat/Services/BLE/BLEFileTransferHandler.swift +++ b/bitchat/Services/BLE/BLEFileTransferHandler.swift @@ -44,7 +44,9 @@ final class BLEFileTransferHandler { self.environment = environment } - func handle(_ packet: BitchatPacket, from peerID: PeerID) { + /// `payloadLimit` defaults to the Bluetooth cap; Wi-Fi bulk deliveries + /// pass the ceiling that was enforced against the accepted offer. + func handle(_ packet: BitchatPacket, from peerID: PeerID, payloadLimit: Int = FileTransferLimits.maxPayloadBytes) { let env = environment if BLEFileTransferPolicy.isSelfEcho(packet: packet, from: peerID, localPeerID: env.localPeerID()) { return } @@ -69,7 +71,7 @@ final class BLEFileTransferHandler { let filePacket: BitchatFilePacket let mime: MimeType - switch BLEIncomingFileValidator.validate(payload: packet.payload) { + switch BLEIncomingFileValidator.validate(payload: packet.payload, limit: payloadLimit) { case .success(let acceptance): filePacket = acceptance.filePacket mime = acceptance.mime diff --git a/bitchat/Services/BLE/BLEFileTransferPolicy.swift b/bitchat/Services/BLE/BLEFileTransferPolicy.swift index 0eedc429..981e80a9 100644 --- a/bitchat/Services/BLE/BLEFileTransferPolicy.swift +++ b/bitchat/Services/BLE/BLEFileTransferPolicy.swift @@ -42,12 +42,17 @@ enum BLEIncomingFileRejection: Error, Equatable { } enum BLEIncomingFileValidator { - static func validate(payload: Data) -> Result { - guard let filePacket = BitchatFilePacket.decode(payload) else { + /// `limit` defaults to the Bluetooth payload cap; Wi-Fi bulk deliveries + /// pass the ceiling enforced against the accepted offer. + static func validate( + payload: Data, + limit: Int = FileTransferLimits.maxPayloadBytes + ) -> Result { + guard let filePacket = BitchatFilePacket.decode(payload, limit: limit) else { return .failure(.malformedPayload) } - guard FileTransferLimits.isValidPayload(filePacket.content.count) else { + guard FileTransferLimits.isValidPayload(filePacket.content.count, limit: limit) else { return .failure(.payloadTooLarge(bytes: filePacket.content.count)) } diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index d1ed84f2..6201ce8c 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -145,6 +145,8 @@ final class BLEService: NSObject { private lazy var fragmentHandler = BLEFragmentHandler(environment: makeFragmentHandlerEnvironment()) // File-transfer orchestration (queue hops stay in the environment closures) private lazy var fileTransferHandler = BLEFileTransferHandler(environment: makeFileTransferHandlerEnvironment()) + // Wi-Fi bulk data plane: BLE/Noise negotiates, AWDL carries large media + private lazy var wifiBulkService = WifiBulkTransferService(environment: makeWifiBulkEnvironment()) // MARK: - Gossip Sync private var gossipSyncManager: GossipSyncManager? @@ -269,6 +271,12 @@ final class BLEService: NSObject { // Initialize gossip sync manager restartGossipManager() + + // Force single-threaded instantiation: unlike the packet handlers + // (touched only from messageQueue), the Wi-Fi bulk service is reached + // from the main actor too (cancelTransfer/stopServices), and lazy + // vars are not thread-safe. + _ = wifiBulkService } private func restartGossipManager() { @@ -504,6 +512,9 @@ final class BLEService: NSObject { } func stopServices() { + // Tear down any Wi-Fi bulk listeners/connections deterministically + wifiBulkService.stop() + // Send leave message synchronously to ensure delivery var leavePacket = BitchatPacket( type: MessageType.leave.rawValue, @@ -696,6 +707,9 @@ final class BLEService: NSObject { // MARK: Messaging func cancelTransfer(_ transferId: String) { + // A transfer may be riding the Wi-Fi bulk channel instead of the BLE + // fragment scheduler; cancelling both is safe (each no-ops on miss). + wifiBulkService.cancelTransfer(transferId: transferId) collectionsQueue.async(flags: .barrier) { [weak self] in guard let self = self else { return } @@ -771,10 +785,49 @@ final class BLEService: NSObject { func sendFilePrivate(_ filePacket: BitchatFilePacket, to peerID: PeerID, transferId: String) { messageQueue.async { [weak self] in guard let self = self else { return } - guard let payload = filePacket.encode() else { + // Encode with the Wi-Fi bulk ceiling; whether the payload also + // fits the BLE caps decides what a fallback may do. + guard let payload = filePacket.encode(limit: FileTransferLimits.maxWifiBulkPayloadBytes) else { SecureLogger.error("❌ Failed to encode file packet for private send", category: .session) return } + let fitsBLECaps = filePacket.encode() != nil + + let candidate = WifiBulkPolicy.SendCandidate( + payloadBytes: payload.count, + peerCapabilities: self.peerCapabilities(peerID), + isDirectlyConnected: self.isPeerConnected(peerID), + hasEstablishedNoiseSession: self.noiseService.hasEstablishedSession(with: peerID) + ) + if WifiBulkPolicy.shouldOffer(candidate) { + self.wifiBulkService.sendFile(payload: payload, to: peerID, transferId: transferId) { [weak self] in + self?.sendFilePrivateViaBLE(payload: payload, to: peerID, transferId: transferId, fitsBLECaps: fitsBLECaps) + } + return + } + guard fitsBLECaps else { + // Wi-Fi-only payload with no eligible Wi-Fi path. + SecureLogger.error("❌ File exceeds BLE caps and Wi-Fi bulk is unavailable", category: .session) + self.surfaceUndeliverableTransfer(transferId) + return + } + self.sendFilePrivateViaBLE(payload: payload, to: peerID, transferId: transferId, fitsBLECaps: true) + } + } + + /// BLE fragmentation path for private file transfers; also the fallback + /// target when a Wi-Fi bulk attempt declines, times out, or errors. + /// May be invoked from the Wi-Fi bulk queue. + private func sendFilePrivateViaBLE(payload: Data, to peerID: PeerID, transferId: String, fitsBLECaps: Bool) { + messageQueue.async { [weak self] in + guard let self = self else { return } + guard fitsBLECaps else { + // A >1 MiB payload was negotiated for Wi-Fi and the channel + // failed: BLE cannot carry it, surface the normal failure path. + SecureLogger.error("❌ Wi-Fi bulk failed and payload exceeds BLE caps (\(payload.count) bytes)", category: .session) + self.surfaceUndeliverableTransfer(transferId) + return + } // Normalize to short form (SHA256-derived 16-hex) for wire protocol compatibility // This ensures 64-hex Noise keys are converted to the canonical routing format let targetID = peerID.toShort() @@ -803,6 +856,13 @@ final class BLEService: NSObject { } } + /// Drives the progress bus through started→cancelled so the UI clears a + /// transfer that no transport can carry. + private func surfaceUndeliverableTransfer(_ transferId: String) { + TransferProgressManager.shared.start(id: transferId, totalFragments: 1) + TransferProgressManager.shared.cancel(id: transferId) + } + func sendReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) { let payload = BLENoisePayloadFactory.readReceipt(originalMessageID: receipt.originalMessageID) @@ -1188,6 +1248,57 @@ final class BLEService: NSObject { ) } + /// Builds the Wi-Fi bulk service environment. Noise encryption and packet + /// dispatch stay on the message queue; incoming payloads re-enter the + /// normal file-transfer pipeline as if a fully assembled packet arrived. + private func makeWifiBulkEnvironment() -> WifiBulkTransferServiceEnvironment { + WifiBulkTransferServiceEnvironment( + sendNoisePayload: { [weak self] typedPayload, peerID in + guard let self = self, self.noiseService.hasEstablishedSession(with: peerID) else { return false } + self.messageQueue.async { [weak self] in + guard let self = self else { return } + do { + self.broadcastPacket(try self.makeEncryptedNoisePacket(typedPayload, to: peerID)) + } catch { + SecureLogger.error("❌ Failed to send Wi-Fi bulk negotiation payload: \(error)", category: .session) + } + } + return true + }, + isPeerConnected: { [weak self] peerID in + self?.isPeerConnected(peerID) ?? false + }, + deliverReceivedFile: { [weak self] payload, peerID, payloadLimit in + self?.messageQueue.async { [weak self] in + guard let self = self else { return } + let packet = BitchatPacket( + type: MessageType.fileTransfer.rawValue, + senderID: Data(hexString: peerID.toShort().id) ?? Data(), + recipientID: self.myPeerIDData, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: 0, + version: 2 + ) + self.fileTransferHandler.handle(packet, from: peerID, payloadLimit: payloadLimit) + } + }, + progressStart: { transferId, totalChunks in + TransferProgressManager.shared.start(id: transferId, totalFragments: totalChunks) + }, + progressChunkSent: { transferId in + TransferProgressManager.shared.recordFragmentSent(id: transferId) + }, + progressReset: { transferId in + TransferProgressManager.shared.reset(id: transferId) + }, + progressCancel: { transferId in + TransferProgressManager.shared.cancel(id: transferId) + } + ) + } + func sendFavoriteNotification(to peerID: PeerID, isFavorite: Bool) { SecureLogger.debug("🔔 sendFavoriteNotification peer=\(peerID.id.prefix(8))… isFavorite=\(isFavorite)", category: .session) @@ -3510,8 +3621,21 @@ extension BLEService { self?.noiseService.clearSession(for: peerID) }, deliverNoisePayload: { [weak self] peerID, type, payload, timestamp in + guard let self = self else { return } + // Wi-Fi bulk negotiation is a transport concern; consume it + // here instead of surfacing it to the UI layer. + switch type { + case .bulkTransferOffer: + self.wifiBulkService.handleOfferPayload(payload, from: peerID) + return + case .bulkTransferResponse: + self.wifiBulkService.handleResponsePayload(payload, from: peerID) + return + default: + break + } // Single main-actor hop delivering `.noisePayloadReceived`. - self?.notifyUI { [weak self] in + self.notifyUI { [weak self] in self?.deliverTransportEvent(.noisePayloadReceived( peerID: peerID, type: type, diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 59d15c55..078f298d 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -281,6 +281,21 @@ enum TransportConfig { static let syncResponseRateLimitMaxResponses: Int = 8 static let syncResponseRateLimitWindowSeconds: TimeInterval = 30.0 + // Wi-Fi bulk transport (peer-to-peer AWDL data plane for large media). + // BLE stays the control plane: offers/responses ride the Noise session, + // only the sealed chunk stream moves to TCP over AWDL. + static let wifiBulkEnabled: Bool = true + // Below this size BLE fragmentation is fast enough that negotiation + // overhead isn't worth it. + static let wifiBulkMinPayloadBytes: Int = 64 * 1024 + static let wifiBulkChunkBytes: Int = 64 * 1024 + // Offer unanswered for this long → fall back to BLE fragmentation. + static let wifiBulkOfferTimeoutSeconds: TimeInterval = 10.0 + // Hard ceiling on how long the Bonjour listener/connection may live. + static let wifiBulkTransferWindowSeconds: TimeInterval = 60.0 + static let wifiBulkServiceType: String = "_bitchat-bulk._tcp" + static let wifiBulkMaxConcurrentIncoming: Int = 4 + // Courier store-and-forward // Initial spray-and-wait budget per deposited envelope: each courier may // hand half its remaining copies to another courier on encounter, so a diff --git a/bitchat/Services/WifiBulk/WifiBulkChannel.swift b/bitchat/Services/WifiBulk/WifiBulkChannel.swift new file mode 100644 index 00000000..af0b67c5 --- /dev/null +++ b/bitchat/Services/WifiBulk/WifiBulkChannel.swift @@ -0,0 +1,463 @@ +// +// WifiBulkChannel.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitLogger +import CryptoKit +import Foundation +import Network + +/// Shared frame-stream reading over an `NWConnection`. All callbacks fire on +/// the connection's dispatch queue. +enum WifiBulkStream { + /// Largest sealed frame body on the wire: one plaintext chunk plus AEAD overhead. + static func maxFrameBodyBytes(chunkBytes: Int) -> Int { + chunkBytes + WifiBulkCrypto.frameOverhead + } + + /// Reads frames until `onFrame` returns false (stop) or the stream + /// errors/closes. `onFrame` returning true keeps the loop alive. + static func readFrames( + on connection: NWConnection, + buffer: WifiBulkFrameBuffer, + maxFrameBodyBytes: Int, + onFrame: @escaping (Data) -> Bool, + onError: @escaping (String) -> Void + ) { + // Drain any frames already buffered before touching the socket. + do { + while let body = try buffer.nextFrameBody() { + guard onFrame(body) else { return } + } + } catch { + onError("frame decode failed: \(error)") + return + } + + connection.receive( + minimumIncompleteLength: 1, + maximumLength: maxFrameBodyBytes + WifiBulkCrypto.framePrefixLength + ) { data, _, isComplete, error in + if let data, !data.isEmpty { + buffer.append(data) + } + if let error { + onError("receive failed: \(error)") + return + } + if isComplete { + // Peer closed: hand over whatever complete frames remain, then + // report the close (sessions that already got what they need + // will have stopped the loop from inside onFrame). + do { + while let body = try buffer.nextFrameBody() { + guard onFrame(body) else { return } + } + } catch { + onError("frame decode failed: \(error)") + return + } + onError("connection closed by peer") + return + } + readFrames( + on: connection, + buffer: buffer, + maxFrameBodyBytes: maxFrameBodyBytes, + onFrame: onFrame, + onError: onError + ) + } + } +} + +/// Sender side of the bulk channel: publishes the per-transfer Bonjour +/// listener, requires the first inbound frame to prove knowledge of the +/// Noise-exchanged channel key, then streams sealed chunks and waits for the +/// receiver's verified receipt. +/// +/// The listener starts at offer time (Bonjour registration takes a moment) +/// but data can only flow after `activate(key:)` supplies the channel key +/// derived from the accepted response. +final class WifiBulkSenderSession { + private let queue: DispatchQueue + private let payload: Data + private let transferID: Data + private let payloadHash: Data + private let chunkBytes: Int + private let parameters: NWParameters + private let service: NWListener.Service? + private let maxCandidateConnections = 4 + + private var key: SymmetricKey? + private var listener: NWListener? + /// Connections that have not yet produced a valid auth frame. + private var candidates: [NWConnection] = [] + private var authenticated: NWConnection? + private var finished = false + + let totalChunks: Int + + /// Test hook: fires once the listener is ready, with its bound port. + var onListenerReady: ((UInt16) -> Void)? + var onChunkSent: ((_ sent: Int, _ total: Int) -> Void)? + var onCompleted: (() -> Void)? + var onFailed: ((String) -> Void)? + + init( + payload: Data, + transferID: Data, + chunkBytes: Int, + parameters: NWParameters, + service: NWListener.Service?, + queue: DispatchQueue + ) { + self.payload = payload + self.transferID = transferID + self.payloadHash = Data(SHA256.hash(data: payload)) + self.chunkBytes = chunkBytes + self.parameters = parameters + self.service = service + self.queue = queue + self.totalChunks = (payload.count + chunkBytes - 1) / chunkBytes + } + + deinit { + cancelNetworkResources() + } + + /// Starts the listener. Returns false when the listener cannot be created + /// (caller falls back to BLE immediately). + func start() -> Bool { + let listener: NWListener + do { + listener = try NWListener(using: parameters) + } catch { + SecureLogger.error("WifiBulk: listener creation failed: \(error)", category: .session) + return false + } + listener.service = service + listener.stateUpdateHandler = { [weak self] state in + guard let self else { return } + switch state { + case .ready: + if let port = listener.port?.rawValue { + self.onListenerReady?(port) + } + case .failed(let error): + self.fail("listener failed: \(error)") + default: + break + } + } + listener.newConnectionHandler = { [weak self] connection in + self?.acceptCandidate(connection) + } + self.listener = listener + listener.start(queue: queue) + return true + } + + /// Supplies the channel key once the receiver accepted the offer; begins + /// authenticating any connections that raced ahead of the response. + func activate(key: SymmetricKey) { + guard !finished, self.key == nil else { return } + self.key = key + for candidate in candidates { + beginAuthentication(on: candidate, key: key) + } + } + + func cancel() { + finished = true + cancelNetworkResources() + } + + // MARK: - Connection handling + + private func acceptCandidate(_ connection: NWConnection) { + guard !finished, authenticated == nil, candidates.count < maxCandidateConnections else { + connection.cancel() + return + } + candidates.append(connection) + connection.stateUpdateHandler = { [weak self, weak connection] state in + guard let self, let connection else { return } + if case .failed = state { + self.dropCandidate(connection) + } + } + connection.start(queue: queue) + if let key { + beginAuthentication(on: connection, key: key) + } + } + + private func dropCandidate(_ connection: NWConnection) { + if let index = candidates.firstIndex(where: { $0 === connection }) { + candidates.remove(at: index) + connection.cancel() + } + } + + private func beginAuthentication(on connection: NWConnection, key: SymmetricKey) { + let buffer = WifiBulkFrameBuffer(maxBodyBytes: WifiBulkStream.maxFrameBodyBytes(chunkBytes: chunkBytes)) + WifiBulkStream.readFrames( + on: connection, + buffer: buffer, + maxFrameBodyBytes: WifiBulkStream.maxFrameBodyBytes(chunkBytes: chunkBytes), + onFrame: { [weak self, weak connection] body in + guard let self, let connection, !self.finished, self.authenticated == nil else { return false } + guard WifiBulkCrypto.validateClientAuthFrameBody(body, transferID: self.transferID, key: key) else { + // Bonjour-level gatecrasher: no channel key, no service. + SecureLogger.warning("WifiBulk: disconnecting client with invalid auth frame", category: .security) + self.dropCandidate(connection) + return false + } + self.promoteAuthenticated(connection, key: key, residualBuffer: buffer) + return false + }, + onError: { [weak self, weak connection] _ in + guard let self, let connection, self.authenticated !== connection else { return } + self.dropCandidate(connection) + } + ) + } + + private func promoteAuthenticated(_ connection: NWConnection, key: SymmetricKey, residualBuffer: WifiBulkFrameBuffer) { + authenticated = connection + // One authenticated peer is all a transfer needs: stop advertising and + // shed the other candidates. + listener?.cancel() + listener = nil + for candidate in candidates where candidate !== connection { + candidate.cancel() + } + candidates.removeAll() + streamChunk(at: 0, over: connection, key: key, receiptBuffer: residualBuffer) + } + + // MARK: - Streaming + + private func streamChunk(at index: Int, over connection: NWConnection, key: SymmetricKey, receiptBuffer: WifiBulkFrameBuffer) { + guard !finished else { return } + guard index < totalChunks else { + awaitReceipt(on: connection, key: key, buffer: receiptBuffer) + return + } + + let start = payload.index(payload.startIndex, offsetBy: index * chunkBytes) + let end = payload.index(start, offsetBy: min(chunkBytes, payload.distance(from: start, to: payload.endIndex))) + let chunk = Data(payload[start.. Void)? + var onFailed: ((String) -> Void)? + + /// Fails (returns nil) when the offer exceeds `sizeCap` — the receiver + /// enforces the cap it advertised, not the sender's word. + init?( + endpoint: NWEndpoint, + parameters: NWParameters, + key: SymmetricKey, + transferID: Data, + expectedSize: UInt64, + expectedHash: Data, + sizeCap: Int, + chunkBytes: Int, + queue: DispatchQueue + ) { + guard let assembler = WifiBulkPayloadAssembler( + key: key, + expectedSize: expectedSize, + expectedHash: expectedHash, + sizeCap: sizeCap + ) else { + return nil + } + self.assembler = assembler + self.connection = NWConnection(to: endpoint, using: parameters) + self.key = key + self.transferID = transferID + self.payloadHash = expectedHash + self.chunkBytes = chunkBytes + self.queue = queue + } + + deinit { + connection.cancel() + } + + func start() { + connection.stateUpdateHandler = { [weak self] state in + guard let self else { return } + switch state { + case .ready: + self.sendAuthFrameAndReceive() + case .failed(let error): + self.fail("connect failed: \(error)") + case .waiting(let error): + // .waiting can resolve on its own, but a per-transfer channel + // has a peer actively listening; treat unreachable as fatal so + // the sender's fallback isn't left to the window timeout alone. + self.fail("connection waiting: \(error)") + default: + break + } + } + connection.start(queue: queue) + } + + func cancel() { + finished = true + connection.cancel() + } + + private func sendAuthFrameAndReceive() { + guard !finished else { return } + let authBody: Data + do { + authBody = try WifiBulkCrypto.makeClientAuthFrameBody(transferID: transferID, key: key) + } catch { + fail("auth frame seal failed: \(error)") + return + } + connection.send(content: WifiBulkCrypto.frameData(body: authBody), completion: .contentProcessed { [weak self] error in + guard let self, !self.finished else { return } + if let error { + self.fail("auth frame send failed: \(error)") + return + } + self.receiveChunks() + }) + } + + private func receiveChunks() { + let buffer = WifiBulkFrameBuffer(maxBodyBytes: WifiBulkStream.maxFrameBodyBytes(chunkBytes: chunkBytes)) + WifiBulkStream.readFrames( + on: connection, + buffer: buffer, + maxFrameBodyBytes: WifiBulkStream.maxFrameBodyBytes(chunkBytes: chunkBytes), + onFrame: { [weak self] body in + guard let self, !self.finished else { return false } + do { + guard let payload = try self.assembler.consume(frameBody: body) else { + return true // keep reading + } + self.sendReceiptAndComplete(payload) + return false + } catch { + self.fail("chunk rejected: \(error)") + return false + } + }, + onError: { [weak self] reason in + self?.fail(reason) + } + ) + } + + private func sendReceiptAndComplete(_ payload: Data) { + let receiptBody: Data + do { + receiptBody = try WifiBulkCrypto.makeReceiptFrameBody(payloadHash: payloadHash, key: key) + } catch { + fail("receipt seal failed: \(error)") + return + } + connection.send(content: WifiBulkCrypto.frameData(body: receiptBody), completion: .contentProcessed { [weak self] _ in + // Receipt is best-effort from the receiver's perspective: the + // payload is already verified. Close the channel either way. + guard let self, !self.finished else { return } + self.finished = true + self.connection.cancel() + self.onCompleted?(payload) + }) + } + + private func fail(_ reason: String) { + guard !finished else { return } + finished = true + connection.cancel() + onFailed?(reason) + } +} diff --git a/bitchat/Services/WifiBulk/WifiBulkCrypto.swift b/bitchat/Services/WifiBulk/WifiBulkCrypto.swift new file mode 100644 index 00000000..6db02f3b --- /dev/null +++ b/bitchat/Services/WifiBulk/WifiBulkCrypto.swift @@ -0,0 +1,215 @@ +// +// WifiBulkCrypto.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import CryptoKit +import Foundation + +/// Channel security for the Wi-Fi bulk data plane. +/// +/// The TCP stream is encrypted and authenticated independently of TLS: both +/// endpoints exchanged random 32-byte tokens inside the established Noise +/// session, so only they can derive the ChaChaPoly channel key via +/// HKDF-SHA256 (domain "bitchat-bulk-v1", transferID as salt). A Bonjour-level +/// gatecrasher that connects to the listener cannot produce a single valid +/// frame and is disconnected. +/// +/// Stream format: length-prefixed frames, each a ChaChaPoly sealed box in +/// combined form (12-byte nonce ‖ ciphertext ‖ 16-byte tag). Nonces are +/// structured, never random: [direction byte][3 zero bytes][8-byte BE counter], +/// and the reader requires the exact expected nonce for each frame, so frames +/// cannot be replayed, reordered, or reflected across directions. +enum WifiBulkCryptoError: Error, Equatable { + case invalidParameters + case frameTooLarge + case truncatedFrame + case nonceMismatch + case authenticationFailed + case emptyChunk + case payloadOverflow + case hashMismatch +} + +enum WifiBulkFrameDirection: UInt8 { + /// Data chunks: counters 0, 1, 2, … + case senderToReceiver = 0x00 + /// Counter 0 = client auth frame, counter 1 = final receipt. + case receiverToSender = 0x01 +} + +enum WifiBulkCrypto { + static let keyDomain = "bitchat-bulk-v1" + static let nonceLength = 12 + static let tagLength = 16 + /// AEAD overhead per frame body (nonce + tag). + static let frameOverhead = nonceLength + tagLength + /// 4-byte big-endian length prefix per frame. + static let framePrefixLength = 4 + + // MARK: Key derivation + + /// Derives the ChaChaPoly channel key from the two Noise-exchanged tokens. + /// Deterministic: same tokens + transferID always yield the same key. + static func deriveKey(senderToken: Data, receiverToken: Data, transferID: Data) -> SymmetricKey? { + guard senderToken.count == WifiBulkWire.tokenLength, + receiverToken.count == WifiBulkWire.tokenLength, + transferID.count == WifiBulkWire.transferIDLength else { + return nil + } + var inputKeyMaterial = Data() + inputKeyMaterial.append(senderToken) + inputKeyMaterial.append(receiverToken) + return HKDF.deriveKey( + inputKeyMaterial: SymmetricKey(data: inputKeyMaterial), + salt: transferID, + info: Data(keyDomain.utf8), + outputByteCount: 32 + ) + } + + // MARK: Frame sealing + + static func nonceData(direction: WifiBulkFrameDirection, counter: UInt64) -> Data { + var nonce = Data(count: nonceLength) + nonce[0] = direction.rawValue + var counterBE = counter.bigEndian + withUnsafeBytes(of: &counterBE) { nonce.replaceSubrange(4.. Data { + let nonce = try ChaChaPoly.Nonce(data: nonceData(direction: direction, counter: counter)) + return try ChaChaPoly.seal(plaintext, using: key, nonce: nonce).combined + } + + /// Opens one frame body, enforcing the exact expected nonce. + static func openFrameBody( + _ body: Data, + direction: WifiBulkFrameDirection, + counter: UInt64, + key: SymmetricKey + ) throws -> Data { + guard body.count >= frameOverhead else { throw WifiBulkCryptoError.truncatedFrame } + guard body.prefix(nonceLength) == nonceData(direction: direction, counter: counter) else { + throw WifiBulkCryptoError.nonceMismatch + } + do { + let box = try ChaChaPoly.SealedBox(combined: body) + return try ChaChaPoly.open(box, using: key) + } catch { + throw WifiBulkCryptoError.authenticationFailed + } + } + + /// Prefixes a frame body with its 4-byte big-endian length for the wire. + static func frameData(body: Data) -> Data { + var framed = Data(capacity: framePrefixLength + body.count) + var lengthBE = UInt32(body.count).bigEndian + withUnsafeBytes(of: &lengthBE) { framed.append(contentsOf: $0) } + framed.append(body) + return framed + } + + // MARK: Control frames + + /// First frame on the wire, receiver → sender: proves the connecting + /// client holds the Noise-exchanged secret before any data flows. + static func makeClientAuthFrameBody(transferID: Data, key: SymmetricKey) throws -> Data { + try sealFrameBody(transferID, direction: .receiverToSender, counter: 0, key: key) + } + + static func validateClientAuthFrameBody(_ body: Data, transferID: Data, key: SymmetricKey) -> Bool { + (try? openFrameBody(body, direction: .receiverToSender, counter: 0, key: key)) == transferID + } + + /// Final frame, receiver → sender: acknowledges the fully verified payload. + static func makeReceiptFrameBody(payloadHash: Data, key: SymmetricKey) throws -> Data { + try sealFrameBody(payloadHash, direction: .receiverToSender, counter: 1, key: key) + } + + static func validateReceiptFrameBody(_ body: Data, payloadHash: Data, key: SymmetricKey) -> Bool { + (try? openFrameBody(body, direction: .receiverToSender, counter: 1, key: key)) == payloadHash + } +} + +/// Incremental length-prefix parser for the frame stream. Bounded: bodies +/// larger than `maxBodyBytes` throw instead of buffering unboundedly. +final class WifiBulkFrameBuffer { + private var buffer = Data() + private let maxBodyBytes: Int + + init(maxBodyBytes: Int) { + self.maxBodyBytes = maxBodyBytes + } + + func append(_ data: Data) { + buffer.append(data) + } + + /// Extracts the next complete frame body, or nil when more bytes are needed. + func nextFrameBody() throws -> Data? { + guard buffer.count >= WifiBulkCrypto.framePrefixLength else { return nil } + let length = buffer.prefix(WifiBulkCrypto.framePrefixLength).reduce(Int(0)) { ($0 << 8) | Int($1) } + guard length <= maxBodyBytes else { throw WifiBulkCryptoError.frameTooLarge } + guard buffer.count >= WifiBulkCrypto.framePrefixLength + length else { return nil } + let body = Data(buffer.dropFirst(WifiBulkCrypto.framePrefixLength).prefix(length)) + buffer.removeFirst(WifiBulkCrypto.framePrefixLength + length) + return body + } +} + +/// Receiver-side reassembly: opens sequential data frames, enforces the size +/// negotiated in the accepted offer, and verifies the final SHA-256. +final class WifiBulkPayloadAssembler { + private let key: SymmetricKey + private let expectedSize: Int + private let expectedHash: Data + private var received = Data() + private var counter: UInt64 = 0 + + /// Fails when the offer exceeds the receiver-enforced cap. + init?(key: SymmetricKey, expectedSize: UInt64, expectedHash: Data, sizeCap: Int) { + guard expectedSize > 0, + expectedSize <= UInt64(sizeCap), + expectedHash.count == WifiBulkWire.hashLength else { + return nil + } + self.key = key + self.expectedSize = Int(expectedSize) + self.expectedHash = expectedHash + } + + var isComplete: Bool { received.count == expectedSize } + + /// Consumes one sealed data frame body. Returns the verified payload when + /// the final byte arrives; throws on tampering, overflow, or hash mismatch. + func consume(frameBody: Data) throws -> Data? { + let chunk = try WifiBulkCrypto.openFrameBody( + frameBody, + direction: .senderToReceiver, + counter: counter, + key: key + ) + guard !chunk.isEmpty else { throw WifiBulkCryptoError.emptyChunk } + counter += 1 + guard received.count + chunk.count <= expectedSize else { + throw WifiBulkCryptoError.payloadOverflow + } + received.append(chunk) + guard isComplete else { return nil } + guard Data(SHA256.hash(data: received)) == expectedHash else { + throw WifiBulkCryptoError.hashMismatch + } + return received + } +} diff --git a/bitchat/Services/WifiBulk/WifiBulkMessages.swift b/bitchat/Services/WifiBulk/WifiBulkMessages.swift new file mode 100644 index 00000000..8a718a8c --- /dev/null +++ b/bitchat/Services/WifiBulk/WifiBulkMessages.swift @@ -0,0 +1,191 @@ +// +// WifiBulkMessages.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation + +/// TLV payloads for negotiating a Wi-Fi bulk transfer inside an established +/// Noise session (`NoisePayloadType.bulkTransferOffer` / `.bulkTransferResponse`). +/// +/// Both messages ride the encrypted Noise channel, so every field — including +/// the session tokens and the random Bonjour instance name — is only visible +/// to the two endpoints. TLV format matches `BitchatFilePacket`: 1-byte type, +/// 2-byte big-endian length, value. Unknown TLVs are skipped for forward +/// compatibility. +enum WifiBulkWire { + static let transferIDLength = 16 + static let tokenLength = 32 + static let hashLength = 32 + /// Bonjour instance names are capped at 63 UTF-8 bytes. + static let maxServiceNameBytes = 63 + + static func appendTLV(_ type: UInt8, value: Data, into data: inout Data) { + data.append(type) + var length = UInt16(value.count).bigEndian + withUnsafeBytes(of: &length) { data.append(contentsOf: $0) } + data.append(value) + } + + /// Iterates well-formed TLVs, handing each (type, value) to `visit`. + /// Returns false when the buffer is structurally malformed. + static func parseTLVs(_ data: Data, visit: (UInt8, Data) -> Void) -> Bool { + var cursor = data.startIndex + let end = data.endIndex + while cursor < end { + let type = data[cursor] + cursor = data.index(after: cursor) + guard data.distance(from: cursor, to: end) >= 2 else { return false } + let length = Int(data[cursor]) << 8 | Int(data[data.index(after: cursor)]) + cursor = data.index(cursor, offsetBy: 2) + guard data.distance(from: cursor, to: end) >= length else { return false } + let valueEnd = data.index(cursor, offsetBy: length) + visit(type, Data(data[cursor.. Data? { + guard transferID.count == WifiBulkWire.transferIDLength, + payloadHash.count == WifiBulkWire.hashLength, + token.count == WifiBulkWire.tokenLength else { return nil } + let nameData = Data(serviceName.utf8) + guard !nameData.isEmpty, nameData.count <= WifiBulkWire.maxServiceNameBytes else { return nil } + + var encoded = Data() + WifiBulkWire.appendTLV(TLVType.transferID.rawValue, value: transferID, into: &encoded) + var sizeBE = fileSize.bigEndian + WifiBulkWire.appendTLV(TLVType.fileSize.rawValue, value: withUnsafeBytes(of: &sizeBE) { Data($0) }, into: &encoded) + WifiBulkWire.appendTLV(TLVType.payloadHash.rawValue, value: payloadHash, into: &encoded) + WifiBulkWire.appendTLV(TLVType.token.rawValue, value: token, into: &encoded) + WifiBulkWire.appendTLV(TLVType.serviceName.rawValue, value: nameData, into: &encoded) + return encoded + } + + static func decode(_ data: Data) -> WifiBulkOffer? { + var transferID: Data? + var fileSize: UInt64? + var payloadHash: Data? + var token: Data? + var serviceName: String? + + let wellFormed = WifiBulkWire.parseTLVs(data) { type, value in + switch TLVType(rawValue: type) { + case .transferID where value.count == WifiBulkWire.transferIDLength: + transferID = value + case .fileSize where value.count == 8: + fileSize = value.reduce(UInt64(0)) { ($0 << 8) | UInt64($1) } + case .payloadHash where value.count == WifiBulkWire.hashLength: + payloadHash = value + case .token where value.count == WifiBulkWire.tokenLength: + token = value + case .serviceName where !value.isEmpty && value.count <= WifiBulkWire.maxServiceNameBytes: + serviceName = String(data: value, encoding: .utf8) + default: + break // Unknown or malformed field: ignore; required checks below. + } + } + guard wellFormed, + let transferID, let fileSize, let payloadHash, let token, let serviceName else { + return nil + } + return WifiBulkOffer( + transferID: transferID, + fileSize: fileSize, + payloadHash: payloadHash, + token: token, + serviceName: serviceName + ) + } +} + +/// Receiver → sender: accept (with the receiver's token half) or decline. +struct WifiBulkResponse: Equatable { + let transferID: Data + let accepted: Bool + /// Receiver's random half of the channel secret; present iff accepted. + let token: Data? + + private enum TLVType: UInt8 { + case transferID = 0x01 + case accepted = 0x02 + case token = 0x03 + } + + static func accept(transferID: Data, token: Data) -> WifiBulkResponse { + WifiBulkResponse(transferID: transferID, accepted: true, token: token) + } + + static func decline(transferID: Data) -> WifiBulkResponse { + WifiBulkResponse(transferID: transferID, accepted: false, token: nil) + } + + func encode() -> Data? { + guard transferID.count == WifiBulkWire.transferIDLength else { return nil } + if accepted { + guard token?.count == WifiBulkWire.tokenLength else { return nil } + } + + var encoded = Data() + WifiBulkWire.appendTLV(TLVType.transferID.rawValue, value: transferID, into: &encoded) + WifiBulkWire.appendTLV(TLVType.accepted.rawValue, value: Data([accepted ? 1 : 0]), into: &encoded) + if accepted, let token { + WifiBulkWire.appendTLV(TLVType.token.rawValue, value: token, into: &encoded) + } + return encoded + } + + static func decode(_ data: Data) -> WifiBulkResponse? { + var transferID: Data? + var accepted: Bool? + var token: Data? + + let wellFormed = WifiBulkWire.parseTLVs(data) { type, value in + switch TLVType(rawValue: type) { + case .transferID where value.count == WifiBulkWire.transferIDLength: + transferID = value + case .accepted where value.count == 1: + accepted = value.first == 1 + case .token where value.count == WifiBulkWire.tokenLength: + token = value + default: + break + } + } + guard wellFormed, let transferID, let accepted else { return nil } + if accepted { + guard let token else { return nil } + return WifiBulkResponse(transferID: transferID, accepted: true, token: token) + } + return WifiBulkResponse(transferID: transferID, accepted: false, token: nil) + } +} diff --git a/bitchat/Services/WifiBulk/WifiBulkPolicy.swift b/bitchat/Services/WifiBulk/WifiBulkPolicy.swift new file mode 100644 index 00000000..8edddee3 --- /dev/null +++ b/bitchat/Services/WifiBulk/WifiBulkPolicy.swift @@ -0,0 +1,57 @@ +// +// WifiBulkPolicy.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation + +/// Pure eligibility decisions for the Wi-Fi bulk data plane. Anything that +/// fails these gates rides BLE fragmentation exactly as before — the BLE +/// fallback is the common case and must stay bulletproof. +enum WifiBulkPolicy { + struct SendCandidate { + let payloadBytes: Int + let peerCapabilities: PeerCapabilities + /// Direct BLE link (1 hop). Multi-hop recipients stay on BLE: AWDL + /// only reaches direct neighbors, and relays can't proxy the channel. + let isDirectlyConnected: Bool + /// The offer rides the Noise session, so one must already exist. + let hasEstablishedNoiseSession: Bool + } + + static func shouldOffer( + _ candidate: SendCandidate, + enabled: Bool = TransportConfig.wifiBulkEnabled, + minPayloadBytes: Int = TransportConfig.wifiBulkMinPayloadBytes, + maxPayloadBytes: Int = FileTransferLimits.maxWifiBulkPayloadBytes + ) -> Bool { + enabled + && candidate.payloadBytes > minPayloadBytes + && candidate.payloadBytes <= maxPayloadBytes + && candidate.peerCapabilities.contains(.wifiBulk) + && candidate.isDirectlyConnected + && candidate.hasEstablishedNoiseSession + } + + /// Receiver-side gate. Field lengths were validated at decode; this + /// enforces the size cap (from the local ceiling, not the sender's word) + /// and local enablement. + static func shouldAccept( + offer: WifiBulkOffer, + senderIsDirectlyConnected: Bool, + activeIncomingTransfers: Int, + enabled: Bool = TransportConfig.wifiBulkEnabled, + maxPayloadBytes: Int = FileTransferLimits.maxWifiBulkPayloadBytes, + maxConcurrentIncoming: Int = TransportConfig.wifiBulkMaxConcurrentIncoming + ) -> Bool { + enabled + && senderIsDirectlyConnected + && activeIncomingTransfers < maxConcurrentIncoming + && offer.fileSize > 0 + && offer.fileSize <= UInt64(maxPayloadBytes) + } +} diff --git a/bitchat/Services/WifiBulk/WifiBulkTransferService.swift b/bitchat/Services/WifiBulk/WifiBulkTransferService.swift new file mode 100644 index 00000000..f4ff408a --- /dev/null +++ b/bitchat/Services/WifiBulk/WifiBulkTransferService.swift @@ -0,0 +1,477 @@ +// +// WifiBulkTransferService.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import CryptoKit +import Foundation +import Network + +/// Narrow environment for `WifiBulkTransferService`. All BLE-service queue +/// hops live inside the closures supplied by `BLEService`, keeping this +/// service independently testable. +struct WifiBulkTransferServiceEnvironment { + /// Sends a typed payload inside the established Noise session with the + /// peer. Returns false when no established session exists (the caller + /// falls back to BLE). + let sendNoisePayload: (_ typedPayload: Data, _ peerID: PeerID) -> Bool + /// Whether the peer is on a direct BLE link right now. + let isPeerConnected: (PeerID) -> Bool + /// Delivers a fully received, hash-verified payload (encoded + /// `BitchatFilePacket` TLV) into the normal incoming-file pipeline. + let deliverReceivedFile: (_ payload: Data, _ peerID: PeerID, _ payloadLimit: Int) -> Void + /// Progress bus hooks mirroring the BLE fragmentation path so the UI is + /// unchanged (chunks report as "fragments"). + let progressStart: (_ transferId: String, _ totalChunks: Int) -> Void + let progressChunkSent: (_ transferId: String) -> Void + /// Silently forgets progress state ahead of a BLE fallback re-start. + let progressReset: (_ transferId: String) -> Void + /// Emits the cancelled event for user-cancelled transfers. + let progressCancel: (_ transferId: String) -> Void +} + +/// Knobs with test overrides; production values come from `TransportConfig`. +struct WifiBulkTransferServiceConfig { + var serviceType: String = TransportConfig.wifiBulkServiceType + var chunkBytes: Int = TransportConfig.wifiBulkChunkBytes + var offerTimeout: TimeInterval = TransportConfig.wifiBulkOfferTimeoutSeconds + var transferWindow: TimeInterval = TransportConfig.wifiBulkTransferWindowSeconds + var maxIncomingPayloadBytes: Int = FileTransferLimits.maxWifiBulkPayloadBytes + var maxConcurrentIncoming: Int = TransportConfig.wifiBulkMaxConcurrentIncoming + /// Tests disable peer-to-peer so loopback interfaces stay usable. + var usePeerToPeer: Bool = true + /// Tests disable Bonjour publication (unit-test hosts may lack mDNS access). + var publishBonjourService: Bool = true +} + +/// Orchestrates the Wi-Fi bulk data plane: BLE/Noise carries the offer and +/// response (control plane), then the payload crosses a per-transfer TCP +/// channel over AWDL, sealed with a key both sides derived from the +/// Noise-exchanged tokens. Any failure at any stage falls back to BLE +/// fragmentation exactly once; the receiver side fails silently and lets the +/// sender's timeout drive that fallback. +final class WifiBulkTransferService { + private let queue = DispatchQueue(label: "com.bitchat.wifi-bulk", qos: .userInitiated) + private let environment: WifiBulkTransferServiceEnvironment + private let config: WifiBulkTransferServiceConfig + + private final class OutgoingTransfer { + let transferID: Data + let transferId: String + let peerID: PeerID + let token: Data + let fallback: () -> Void + var session: WifiBulkSenderSession? + var offerTimeout: DispatchWorkItem? + var windowTimeout: DispatchWorkItem? + var accepted = false + var finished = false + + init(transferID: Data, transferId: String, peerID: PeerID, token: Data, fallback: @escaping () -> Void) { + self.transferID = transferID + self.transferId = transferId + self.peerID = peerID + self.token = token + self.fallback = fallback + } + } + + private final class IncomingTransfer { + let offer: WifiBulkOffer + let peerID: PeerID + let key: SymmetricKey + var browser: NWBrowser? + var session: WifiBulkReceiverSession? + var windowTimeout: DispatchWorkItem? + + init(offer: WifiBulkOffer, peerID: PeerID, key: SymmetricKey) { + self.offer = offer + self.peerID = peerID + self.key = key + } + } + + private var outgoing: [Data: OutgoingTransfer] = [:] + private var incoming: [Data: IncomingTransfer] = [:] + + init( + environment: WifiBulkTransferServiceEnvironment, + config: WifiBulkTransferServiceConfig = WifiBulkTransferServiceConfig() + ) { + self.environment = environment + self.config = config + } + + // MARK: - Sender + + /// Offers `payload` over the Wi-Fi bulk channel. `fallbackToBLE` runs at + /// most once, on decline, timeout, or any mid-transfer error. + func sendFile(payload: Data, to peerID: PeerID, transferId: String, fallbackToBLE: @escaping () -> Void) { + queue.async { [weak self] in + self?.beginOutgoing(payload: payload, peerID: peerID, transferId: transferId, fallbackToBLE: fallbackToBLE) + } + } + + /// Handles a decrypted `bulkTransferResponse` Noise payload. + func handleResponsePayload(_ payload: Data, from peerID: PeerID) { + queue.async { [weak self] in + self?.processResponse(payload, from: peerID) + } + } + + /// User-initiated cancel from the UI (mirrors BLE `cancelTransfer`). + func cancelTransfer(transferId: String) { + queue.async { [weak self] in + guard let self, + let transfer = self.outgoing.values.first(where: { $0.transferId == transferId }) else { return } + self.finishOutgoing(transfer, outcome: .cancelled, reason: "cancelled by user") + } + } + + /// Tears down every transfer (service shutdown / emergency disconnect). + /// In-flight outgoing transfers do NOT fall back — the transport is going away. + func stop() { + queue.async { [weak self] in + guard let self else { return } + for transfer in self.outgoing.values { + transfer.finished = true + transfer.offerTimeout?.cancel() + transfer.windowTimeout?.cancel() + transfer.session?.cancel() + } + self.outgoing.removeAll() + for transfer in self.incoming.values { + self.tearDownIncomingResources(transfer) + } + self.incoming.removeAll() + } + } + + private enum OutgoingOutcome { + case completed + case fallback + case cancelled + } + + private func beginOutgoing(payload: Data, peerID: PeerID, transferId: String, fallbackToBLE: @escaping () -> Void) { + let transferID = Self.randomData(WifiBulkWire.transferIDLength) + let token = Self.randomData(WifiBulkWire.tokenLength) + // Random per-transfer instance name — never the nickname or peer ID. + let serviceName = Self.randomData(16).hexEncodedString() + + let offer = WifiBulkOffer( + transferID: transferID, + fileSize: UInt64(payload.count), + payloadHash: Data(SHA256.hash(data: payload)), + token: token, + serviceName: serviceName + ) + guard let offerData = offer.encode() else { + fallbackToBLE() + return + } + + let transfer = OutgoingTransfer( + transferID: transferID, + transferId: transferId, + peerID: peerID, + token: token, + fallback: fallbackToBLE + ) + + let session = WifiBulkSenderSession( + payload: payload, + transferID: transferID, + chunkBytes: config.chunkBytes, + parameters: makeParameters(), + service: config.publishBonjourService + ? NWListener.Service(name: serviceName, type: config.serviceType) + : nil, + queue: queue + ) + if let onListenerReady = _test_onListenerReady { + session.onListenerReady = { port in onListenerReady(transferID, port) } + } + session.onChunkSent = { [weak self, weak transfer] sent, total in + guard let self, let transfer, !transfer.finished else { return } + // Hold the final tick until the receipt confirms delivery, so the + // progress bus only emits .completed for verified transfers. + if sent < total { + self.environment.progressChunkSent(transfer.transferId) + } + } + session.onCompleted = { [weak self, weak transfer] in + guard let self, let transfer, !transfer.finished else { return } + self.environment.progressChunkSent(transfer.transferId) + self.finishOutgoing(transfer, outcome: .completed, reason: "receipt verified") + } + session.onFailed = { [weak self, weak transfer] reason in + guard let self, let transfer else { return } + self.finishOutgoing(transfer, outcome: .fallback, reason: reason) + } + transfer.session = session + outgoing[transferID] = transfer + + guard session.start() else { + finishOutgoing(transfer, outcome: .fallback, reason: "listener unavailable") + return + } + guard environment.sendNoisePayload( + BLENoisePayloadFactory.typedPayload(.bulkTransferOffer, payload: offerData), + peerID + ) else { + finishOutgoing(transfer, outcome: .fallback, reason: "no established noise session") + return + } + + SecureLogger.debug("WifiBulk: offered \(payload.count) bytes to \(peerID.id.prefix(8))… over \(serviceName.prefix(8))…", category: .session) + environment.progressStart(transferId, session.totalChunks) + + let offerTimeout = DispatchWorkItem { [weak self, weak transfer] in + guard let self, let transfer, !transfer.accepted else { return } + self.finishOutgoing(transfer, outcome: .fallback, reason: "offer timed out") + } + transfer.offerTimeout = offerTimeout + queue.asyncAfter(deadline: .now() + config.offerTimeout, execute: offerTimeout) + + let windowTimeout = DispatchWorkItem { [weak self, weak transfer] in + guard let self, let transfer else { return } + self.finishOutgoing(transfer, outcome: .fallback, reason: "transfer window expired") + } + transfer.windowTimeout = windowTimeout + queue.asyncAfter(deadline: .now() + config.transferWindow, execute: windowTimeout) + } + + private func processResponse(_ payload: Data, from peerID: PeerID) { + guard let response = WifiBulkResponse.decode(payload), + let transfer = outgoing[response.transferID], + transfer.peerID.toShort() == peerID.toShort(), + !transfer.accepted, !transfer.finished else { + return + } + + guard response.accepted, let receiverToken = response.token else { + finishOutgoing(transfer, outcome: .fallback, reason: "offer declined") + return + } + guard let key = WifiBulkCrypto.deriveKey( + senderToken: transfer.token, + receiverToken: receiverToken, + transferID: transfer.transferID + ) else { + finishOutgoing(transfer, outcome: .fallback, reason: "key derivation failed") + return + } + + transfer.accepted = true + transfer.offerTimeout?.cancel() + transfer.offerTimeout = nil + transfer.session?.activate(key: key) + } + + private func finishOutgoing(_ transfer: OutgoingTransfer, outcome: OutgoingOutcome, reason: String) { + guard !transfer.finished else { return } + transfer.finished = true + transfer.offerTimeout?.cancel() + transfer.windowTimeout?.cancel() + transfer.session?.cancel() + outgoing.removeValue(forKey: transfer.transferID) + + switch outcome { + case .completed: + SecureLogger.debug("WifiBulk: transfer \(transfer.transferId.prefix(8))… completed (\(reason))", category: .session) + case .fallback: + SecureLogger.info("WifiBulk: transfer \(transfer.transferId.prefix(8))… falling back to BLE (\(reason))", category: .session) + environment.progressReset(transfer.transferId) + transfer.fallback() + case .cancelled: + SecureLogger.debug("WifiBulk: transfer \(transfer.transferId.prefix(8))… cancelled", category: .session) + environment.progressCancel(transfer.transferId) + } + } + + // MARK: - Receiver + + /// Handles a decrypted `bulkTransferOffer` Noise payload. + func handleOfferPayload(_ payload: Data, from peerID: PeerID) { + queue.async { [weak self] in + self?.processOffer(payload, from: peerID) + } + } + + private func processOffer(_ payload: Data, from peerID: PeerID) { + guard let offer = WifiBulkOffer.decode(payload) else { return } + guard incoming[offer.transferID] == nil else { return } + + guard WifiBulkPolicy.shouldAccept( + offer: offer, + senderIsDirectlyConnected: environment.isPeerConnected(peerID), + activeIncomingTransfers: incoming.count, + maxPayloadBytes: config.maxIncomingPayloadBytes, + maxConcurrentIncoming: config.maxConcurrentIncoming + ) else { + decline(offer: offer, peerID: peerID) + return + } + + let token = Self.randomData(WifiBulkWire.tokenLength) + guard let key = WifiBulkCrypto.deriveKey( + senderToken: offer.token, + receiverToken: token, + transferID: offer.transferID + ), + let responseData = WifiBulkResponse.accept(transferID: offer.transferID, token: token).encode() else { + decline(offer: offer, peerID: peerID) + return + } + guard environment.sendNoisePayload( + BLENoisePayloadFactory.typedPayload(.bulkTransferResponse, payload: responseData), + peerID + ) else { + return // No session to answer on; the sender's timeout handles fallback. + } + + let transfer = IncomingTransfer(offer: offer, peerID: peerID, key: key) + incoming[offer.transferID] = transfer + SecureLogger.debug("WifiBulk: accepted offer of \(offer.fileSize) bytes from \(peerID.id.prefix(8))…", category: .session) + + startBrowsing(for: transfer) + + let windowTimeout = DispatchWorkItem { [weak self, weak transfer] in + guard let self, let transfer else { return } + SecureLogger.info("WifiBulk: incoming transfer window expired", category: .session) + self.tearDownIncoming(transfer) + } + transfer.windowTimeout = windowTimeout + queue.asyncAfter(deadline: .now() + config.transferWindow, execute: windowTimeout) + } + + private func decline(offer: WifiBulkOffer, peerID: PeerID) { + SecureLogger.debug("WifiBulk: declining offer of \(offer.fileSize) bytes from \(peerID.id.prefix(8))…", category: .session) + guard let responseData = WifiBulkResponse.decline(transferID: offer.transferID).encode() else { return } + _ = environment.sendNoisePayload( + BLENoisePayloadFactory.typedPayload(.bulkTransferResponse, payload: responseData), + peerID + ) + } + + private func startBrowsing(for transfer: IncomingTransfer) { + let browser = NWBrowser( + for: .bonjour(type: config.serviceType, domain: nil), + using: makeParameters() + ) + transfer.browser = browser + browser.browseResultsChangedHandler = { [weak self, weak transfer] results, _ in + guard let self, let transfer, transfer.session == nil else { return } + let match = results.first { result in + if case .service(let name, _, _, _) = result.endpoint { + return name == transfer.offer.serviceName + } + return false + } + guard let match else { return } + self.connect(transfer, to: match.endpoint) + } + browser.stateUpdateHandler = { [weak self, weak transfer] state in + guard let self, let transfer else { return } + if case .failed(let error) = state { + SecureLogger.warning("WifiBulk: browser failed: \(error)", category: .session) + self.tearDownIncoming(transfer) + } + } + browser.start(queue: queue) + } + + /// Test hook: connects an accepted incoming transfer straight to an + /// endpoint, standing in for Bonjour discovery on hosts without mDNS. + func _test_connectIncoming(transferID: Data, to endpoint: NWEndpoint) { + queue.async { [weak self] in + guard let self, let transfer = self.incoming[transferID], transfer.session == nil else { return } + self.connect(transfer, to: endpoint) + } + } + + private func connect(_ transfer: IncomingTransfer, to endpoint: NWEndpoint) { + transfer.browser?.cancel() + transfer.browser = nil + + guard let session = WifiBulkReceiverSession( + endpoint: endpoint, + parameters: makeParameters(), + key: transfer.key, + transferID: transfer.offer.transferID, + expectedSize: transfer.offer.fileSize, + expectedHash: transfer.offer.payloadHash, + sizeCap: config.maxIncomingPayloadBytes, + chunkBytes: config.chunkBytes, + queue: queue + ) else { + tearDownIncoming(transfer) + return + } + session.onCompleted = { [weak self, weak transfer] payload in + guard let self, let transfer else { return } + SecureLogger.debug("WifiBulk: received \(payload.count) bytes from \(transfer.peerID.id.prefix(8))…", category: .session) + self.environment.deliverReceivedFile(payload, transfer.peerID, self.config.maxIncomingPayloadBytes) + self.tearDownIncoming(transfer) + } + session.onFailed = { [weak self, weak transfer] reason in + guard let self, let transfer else { return } + SecureLogger.info("WifiBulk: incoming transfer failed (\(reason)); sender falls back to BLE", category: .session) + self.tearDownIncoming(transfer) + } + transfer.session = session + session.start() + } + + private func tearDownIncoming(_ transfer: IncomingTransfer) { + tearDownIncomingResources(transfer) + incoming.removeValue(forKey: transfer.offer.transferID) + } + + private func tearDownIncomingResources(_ transfer: IncomingTransfer) { + transfer.windowTimeout?.cancel() + transfer.windowTimeout = nil + transfer.browser?.cancel() + transfer.browser = nil + transfer.session?.cancel() + transfer.session = nil + } + + // MARK: - Helpers + + private func makeParameters() -> NWParameters { + let parameters = NWParameters.tcp + if config.usePeerToPeer { + parameters.includePeerToPeer = true + // Keep the channel off infrastructure-independent radios we never + // want (cellular/wired); AWDL rides on the peer-to-peer flag. + parameters.prohibitedInterfaceTypes = [.cellular, .wiredEthernet, .loopback] + } + return parameters + } + + /// Cryptographically secure random bytes (Swift's default RNG is CSPRNG-backed). + private static func randomData(_ count: Int) -> Data { + Data((0.. Void)? + + var _test_activeOutgoingCount: Int { + queue.sync { outgoing.count } + } + + var _test_activeIncomingCount: Int { + queue.sync { incoming.count } + } +} diff --git a/bitchat/ViewModels/ChatTransportEventCoordinator.swift b/bitchat/ViewModels/ChatTransportEventCoordinator.swift index 75571b2e..c4ba6371 100644 --- a/bitchat/ViewModels/ChatTransportEventCoordinator.swift +++ b/bitchat/ViewModels/ChatTransportEventCoordinator.swift @@ -371,6 +371,11 @@ private extension ChatTransportEventCoordinator { case .verifyResponse: context.handleVerifyResponsePayload(from: peerID, payload: payload) + + case .bulkTransferOffer, .bulkTransferResponse: + // Wi-Fi bulk negotiation is consumed inside the mesh transport + // (BLEService); it never reaches the UI layer. + break } } diff --git a/bitchat/ViewModels/NostrInboundPipeline.swift b/bitchat/ViewModels/NostrInboundPipeline.swift index 337fa474..caceb932 100644 --- a/bitchat/ViewModels/NostrInboundPipeline.swift +++ b/bitchat/ViewModels/NostrInboundPipeline.swift @@ -297,7 +297,9 @@ final class NostrInboundPipeline { context.handleDelivered(noisePayload, senderPubkey: senderPubkey, convKey: convKey) case .readReceipt: context.handleReadReceipt(noisePayload, senderPubkey: senderPubkey, convKey: convKey) - case .verifyChallenge, .verifyResponse: + case .verifyChallenge, .verifyResponse, + .bulkTransferOffer, .bulkTransferResponse: + // Wi-Fi bulk negotiation is mesh-proximity only; it never rides Nostr. break } } @@ -349,7 +351,9 @@ final class NostrInboundPipeline { context.handleDelivered(payload, senderPubkey: senderPubkey, convKey: convKey) case .readReceipt: context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: convKey) - case .verifyChallenge, .verifyResponse: + case .verifyChallenge, .verifyResponse, + .bulkTransferOffer, .bulkTransferResponse: + // Wi-Fi bulk negotiation is mesh-proximity only; it never rides Nostr. break } } @@ -428,7 +432,10 @@ final class NostrInboundPipeline { context.handleDelivered(payload, senderPubkey: senderPubkey, convKey: targetPeerID) case .readReceipt: context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: targetPeerID) - case .verifyChallenge, .verifyResponse: + case .verifyChallenge, .verifyResponse, + .bulkTransferOffer, .bulkTransferResponse: + // Wi-Fi bulk negotiation is mesh-proximity only; + // it never rides Nostr. break } } diff --git a/bitchatTests/WifiBulk/WifiBulkCryptoTests.swift b/bitchatTests/WifiBulk/WifiBulkCryptoTests.swift new file mode 100644 index 00000000..adc93142 --- /dev/null +++ b/bitchatTests/WifiBulk/WifiBulkCryptoTests.swift @@ -0,0 +1,264 @@ +// +// WifiBulkCryptoTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import CryptoKit +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +@Suite("WifiBulk channel crypto") +struct WifiBulkCryptoTests { + private static func keyHex(_ key: SymmetricKey) -> String { + key.withUnsafeBytes { Data($0).map { String(format: "%02x", $0) }.joined() } + } + + private func makeKey() throws -> SymmetricKey { + try #require(WifiBulkCrypto.deriveKey( + senderToken: Data(repeating: 0x11, count: 32), + receiverToken: Data(repeating: 0x22, count: 32), + transferID: Data(repeating: 0x33, count: 16) + )) + } + + // MARK: HKDF derivation + + @Test("HKDF derivation matches fixed vectors") + func hkdfVectors() throws { + // Vectors computed independently with CryptoKit HKDF, + // ikm = senderToken ‖ receiverToken, salt = transferID, + // info = "bitchat-bulk-v1", 32 bytes out. + let key1 = try makeKey() + #expect(Self.keyHex(key1) == "9ee6f4bf7753a8a9564d6760b7064e31657f1a6bcca2b3ff266bb975cc4f66eb") + + let key2 = try #require(WifiBulkCrypto.deriveKey( + senderToken: Data((0..<32).map { UInt8($0) }), + receiverToken: Data((0..<32).map { UInt8(255 - $0) }), + transferID: Data((0..<16).map { UInt8($0 * 3) }) + )) + #expect(Self.keyHex(key2) == "432ebb559f2f546d632a91d53b5c25af36f15d1ba53917910a0041329dc0efd4") + } + + @Test("HKDF derivation is order- and role-sensitive") + func hkdfRoleSensitivity() throws { + let a = Data(repeating: 0x11, count: 32) + let b = Data(repeating: 0x22, count: 32) + let tid = Data(repeating: 0x33, count: 16) + let forward = try #require(WifiBulkCrypto.deriveKey(senderToken: a, receiverToken: b, transferID: tid)) + let reversed = try #require(WifiBulkCrypto.deriveKey(senderToken: b, receiverToken: a, transferID: tid)) + #expect(Self.keyHex(forward) != Self.keyHex(reversed)) + } + + @Test("HKDF derivation rejects wrong-length inputs") + func hkdfRejectsBadLengths() { + let token = Data(repeating: 1, count: 32) + let tid = Data(repeating: 2, count: 16) + #expect(WifiBulkCrypto.deriveKey(senderToken: Data(count: 31), receiverToken: token, transferID: tid) == nil) + #expect(WifiBulkCrypto.deriveKey(senderToken: token, receiverToken: Data(count: 33), transferID: tid) == nil) + #expect(WifiBulkCrypto.deriveKey(senderToken: token, receiverToken: token, transferID: Data(count: 15)) == nil) + } + + // MARK: Frame sealing + + @Test("Frame seal/open round-trips") + func frameRoundTrip() throws { + let key = try makeKey() + let plaintext = Data((0..<1000).map { UInt8($0 % 251) }) + let body = try WifiBulkCrypto.sealFrameBody(plaintext, direction: .senderToReceiver, counter: 7, key: key) + let opened = try WifiBulkCrypto.openFrameBody(body, direction: .senderToReceiver, counter: 7, key: key) + #expect(opened == plaintext) + } + + @Test("Tampered frames are rejected") + func tamperRejection() throws { + let key = try makeKey() + var body = try WifiBulkCrypto.sealFrameBody(Data(repeating: 9, count: 64), direction: .senderToReceiver, counter: 0, key: key) + body[body.count - 1] ^= 0x01 // flip a tag bit + #expect(throws: WifiBulkCryptoError.authenticationFailed) { + try WifiBulkCrypto.openFrameBody(body, direction: .senderToReceiver, counter: 0, key: key) + } + } + + @Test("Frames cannot be replayed at another counter or reflected across directions") + func nonceBinding() throws { + let key = try makeKey() + let body = try WifiBulkCrypto.sealFrameBody(Data(repeating: 9, count: 64), direction: .senderToReceiver, counter: 3, key: key) + #expect(throws: WifiBulkCryptoError.nonceMismatch) { + try WifiBulkCrypto.openFrameBody(body, direction: .senderToReceiver, counter: 4, key: key) + } + #expect(throws: WifiBulkCryptoError.nonceMismatch) { + try WifiBulkCrypto.openFrameBody(body, direction: .receiverToSender, counter: 3, key: key) + } + } + + @Test("Frames sealed under a different key are rejected") + func wrongKeyRejection() throws { + let key = try makeKey() + let otherKey = try #require(WifiBulkCrypto.deriveKey( + senderToken: Data(repeating: 0x44, count: 32), + receiverToken: Data(repeating: 0x22, count: 32), + transferID: Data(repeating: 0x33, count: 16) + )) + let body = try WifiBulkCrypto.sealFrameBody(Data(repeating: 9, count: 64), direction: .senderToReceiver, counter: 0, key: otherKey) + #expect(throws: WifiBulkCryptoError.authenticationFailed) { + try WifiBulkCrypto.openFrameBody(body, direction: .senderToReceiver, counter: 0, key: key) + } + } + + @Test("Auth and receipt control frames validate and reject forgeries") + func controlFrames() throws { + let key = try makeKey() + let transferID = Data(repeating: 0x33, count: 16) + let hash = Data(repeating: 0x55, count: 32) + + let auth = try WifiBulkCrypto.makeClientAuthFrameBody(transferID: transferID, key: key) + #expect(WifiBulkCrypto.validateClientAuthFrameBody(auth, transferID: transferID, key: key)) + #expect(!WifiBulkCrypto.validateClientAuthFrameBody(auth, transferID: Data(repeating: 0x34, count: 16), key: key)) + var forgedAuth = auth + forgedAuth[forgedAuth.count - 1] ^= 0x01 + #expect(!WifiBulkCrypto.validateClientAuthFrameBody(forgedAuth, transferID: transferID, key: key)) + + let receipt = try WifiBulkCrypto.makeReceiptFrameBody(payloadHash: hash, key: key) + #expect(WifiBulkCrypto.validateReceiptFrameBody(receipt, payloadHash: hash, key: key)) + #expect(!WifiBulkCrypto.validateReceiptFrameBody(receipt, payloadHash: Data(repeating: 0x56, count: 32), key: key)) + // An auth frame is not a receipt (distinct counter). + #expect(!WifiBulkCrypto.validateReceiptFrameBody(auth, payloadHash: hash, key: key)) + } + + // MARK: Frame buffer + + @Test("Frame buffer reassembles frames from arbitrary byte boundaries") + func frameBufferReassembly() throws { + let bodyA = Data(repeating: 0xAA, count: 100) + let bodyB = Data(repeating: 0xBB, count: 5) + var stream = WifiBulkCrypto.frameData(body: bodyA) + stream.append(WifiBulkCrypto.frameData(body: bodyB)) + + let buffer = WifiBulkFrameBuffer(maxBodyBytes: 1024) + // Drip-feed 3 bytes at a time. + var extracted: [Data] = [] + var index = stream.startIndex + while index < stream.endIndex { + let next = stream.index(index, offsetBy: 3, limitedBy: stream.endIndex) ?? stream.endIndex + buffer.append(Data(stream[index.. [Data] { + try stride(from: 0, to: payload.count, by: chunkSize).enumerated().map { index, offset in + try WifiBulkCrypto.sealFrameBody( + Data(payload[offset.. +// + +import CryptoKit +import BitFoundation +import Foundation +import Network +import Testing +@testable import bitchat + +/// End-to-end integration over real Network.framework sockets on localhost: +/// two `WifiBulkTransferService` instances negotiate through an in-process +/// "Noise" pipe, then move the payload over a genuine TCP connection using +/// the production listener/browser-free test hooks (peer-to-peer and Bonjour +/// are disabled — unit-test hosts have no AWDL or mDNS access). +@Suite("WifiBulk loopback integration", .serialized) +struct WifiBulkLoopbackTests { + private static let senderPeer = PeerID(str: "00112233aabbccdd") + private static let receiverPeer = PeerID(str: "ddccbbaa33221100") + + private func makeConfig() -> WifiBulkTransferServiceConfig { + var config = WifiBulkTransferServiceConfig() + config.usePeerToPeer = false + config.publishBonjourService = false + config.offerTimeout = 5.0 + config.transferWindow = 10.0 + return config + } + + @Test("Payload crosses a real TCP loopback channel and lands verified") + func loopbackTransferSucceeds() async throws { + let payload = Data((0..<300_000).map { UInt8($0 % 249) }) + + let delivered = WifiBulkTestBox() + let progress = WifiBulkTestBox() + let fallbacks = WifiBulkTestBox() + let ports = WifiBulkTestBox<(Data, UInt16)>() + let offers = WifiBulkTestBox() + + var senderService: WifiBulkTransferService? + var receiverService: WifiBulkTransferService? + + // Once the receiver has accepted AND the listener port is known, + // connect the receiver straight to 127.0.0.1 (Bonjour stand-in). + let accepted = WifiBulkTestBox() + let connectIfReady: () -> Void = { + guard let (transferID, port) = ports.values.first, + accepted.values.contains(transferID), + let nwPort = NWEndpoint.Port(rawValue: port) else { return } + receiverService?._test_connectIncoming( + transferID: transferID, + to: NWEndpoint.hostPort(host: "127.0.0.1", port: nwPort) + ) + } + + let senderEnv = WifiBulkTransferServiceEnvironment( + sendNoisePayload: { typed, _ in + // Sender → receiver control plane (offer). + guard typed.first == NoisePayloadType.bulkTransferOffer.rawValue else { return true } + offers.append(Data(typed.dropFirst())) + receiverService?.handleOfferPayload(Data(typed.dropFirst()), from: Self.senderPeer) + return true + }, + isPeerConnected: { _ in true }, + deliverReceivedFile: { _, _, _ in }, + progressStart: { id, total in progress.append("start:\(id):\(total)") }, + progressChunkSent: { id in progress.append("chunk:\(id)") }, + progressReset: { id in progress.append("reset:\(id)") }, + progressCancel: { id in progress.append("cancel:\(id)") } + ) + let receiverEnv = WifiBulkTransferServiceEnvironment( + sendNoisePayload: { typed, _ in + // Receiver → sender control plane (response). + guard typed.first == NoisePayloadType.bulkTransferResponse.rawValue else { return true } + let body = Data(typed.dropFirst()) + if let response = WifiBulkResponse.decode(body), response.accepted { + accepted.append(response.transferID) + } + senderService?.handleResponsePayload(body, from: Self.receiverPeer) + connectIfReady() + return true + }, + isPeerConnected: { _ in true }, + deliverReceivedFile: { data, peer, limit in + #expect(peer == Self.senderPeer) + #expect(limit == FileTransferLimits.maxWifiBulkPayloadBytes) + delivered.append(data) + }, + progressStart: { _, _ in }, + progressChunkSent: { _ in }, + progressReset: { _ in }, + progressCancel: { _ in } + ) + + let sender = WifiBulkTransferService(environment: senderEnv, config: makeConfig()) + sender._test_onListenerReady = { transferID, port in + ports.append((transferID, port)) + connectIfReady() + } + let receiver = WifiBulkTransferService(environment: receiverEnv, config: makeConfig()) + senderService = sender + receiverService = receiver + + sender.sendFile(payload: payload, to: Self.receiverPeer, transferId: "t-loopback") { + fallbacks.append(true) + } + + #expect(await wifiBulkWait(timeout: 10.0) { delivered.count == 1 }) + #expect(delivered.values.first == payload) + #expect(fallbacks.count == 0) + + // Deterministic teardown: both sides drop all transfer state. + #expect(await wifiBulkWait { sender._test_activeOutgoingCount == 0 }) + #expect(await wifiBulkWait { receiver._test_activeIncomingCount == 0 }) + + // Progress mirrored the BLE contract: start with the chunk total, + // then exactly `total` chunk ticks (the last one gated on the receipt). + let totalChunks = (payload.count + TransportConfig.wifiBulkChunkBytes - 1) / TransportConfig.wifiBulkChunkBytes + #expect(await wifiBulkWait { progress.values.filter { $0 == "chunk:t-loopback" }.count == totalChunks }) + #expect(progress.values.first == "start:t-loopback:\(totalChunks)") + #expect(!progress.values.contains("reset:t-loopback")) + } + + @Test("A gatecrasher without the channel key is disconnected and the real peer still succeeds") + func gatecrasherIsRejected() async throws { + let payload = Data((0..<150_000).map { UInt8($0 % 241) }) + + let delivered = WifiBulkTestBox() + let fallbacks = WifiBulkTestBox() + let ports = WifiBulkTestBox<(Data, UInt16)>() + let accepted = WifiBulkTestBox() + + var senderService: WifiBulkTransferService? + var receiverService: WifiBulkTransferService? + + let gatecrashed = WifiBulkTestBox() + let connectIfReady: () -> Void = { + guard let (transferID, port) = ports.values.first, + accepted.values.contains(transferID), + gatecrashed.count > 0, + let nwPort = NWEndpoint.Port(rawValue: port) else { return } + receiverService?._test_connectIncoming( + transferID: transferID, + to: NWEndpoint.hostPort(host: "127.0.0.1", port: nwPort) + ) + } + + let senderEnv = WifiBulkTransferServiceEnvironment( + sendNoisePayload: { typed, _ in + guard typed.first == NoisePayloadType.bulkTransferOffer.rawValue else { return true } + receiverService?.handleOfferPayload(Data(typed.dropFirst()), from: Self.senderPeer) + return true + }, + isPeerConnected: { _ in true }, + deliverReceivedFile: { _, _, _ in }, + progressStart: { _, _ in }, + progressChunkSent: { _ in }, + progressReset: { _ in }, + progressCancel: { _ in } + ) + let receiverEnv = WifiBulkTransferServiceEnvironment( + sendNoisePayload: { typed, _ in + guard typed.first == NoisePayloadType.bulkTransferResponse.rawValue else { return true } + let body = Data(typed.dropFirst()) + if let response = WifiBulkResponse.decode(body), response.accepted { + accepted.append(response.transferID) + } + senderService?.handleResponsePayload(body, from: Self.receiverPeer) + connectIfReady() + return true + }, + isPeerConnected: { _ in true }, + deliverReceivedFile: { data, _, _ in delivered.append(data) }, + progressStart: { _, _ in }, + progressChunkSent: { _ in }, + progressReset: { _ in }, + progressCancel: { _ in } + ) + + let sender = WifiBulkTransferService(environment: senderEnv, config: makeConfig()) + let gateQueue = DispatchQueue(label: "test.gatecrasher") + sender._test_onListenerReady = { transferID, port in + ports.append((transferID, port)) + guard let nwPort = NWEndpoint.Port(rawValue: port) else { return } + // A stranger who saw the Bonjour advertisement connects first and + // sends garbage that cannot carry a valid MAC. + let crasher = NWConnection( + to: NWEndpoint.hostPort(host: "127.0.0.1", port: nwPort), + using: .tcp + ) + crasher.stateUpdateHandler = { state in + if case .ready = state { + let junkBody = Data(repeating: 0xAA, count: 60) + crasher.send( + content: WifiBulkCrypto.frameData(body: junkBody), + completion: .contentProcessed { _ in + gatecrashed.append(true) + connectIfReady() + } + ) + } + } + crasher.start(queue: gateQueue) + } + let receiver = WifiBulkTransferService(environment: receiverEnv, config: makeConfig()) + senderService = sender + receiverService = receiver + + sender.sendFile(payload: payload, to: Self.receiverPeer, transferId: "t-gatecrash") { + fallbacks.append(true) + } + + #expect(await wifiBulkWait(timeout: 10.0) { delivered.count == 1 }) + #expect(delivered.values.first == payload) + #expect(fallbacks.count == 0) + #expect(await wifiBulkWait { sender._test_activeOutgoingCount == 0 }) + } + + @Test("Receiver vanishing mid-negotiation leaves the sender to time out into BLE") + func vanishedReceiverFallsBack() async { + var config = makeConfig() + config.offerTimeout = 0.3 + + let fallbacks = WifiBulkTestBox() + let environment = WifiBulkTransferServiceEnvironment( + sendNoisePayload: { _, _ in true }, // offer sent, receiver never answers + isPeerConnected: { _ in true }, + deliverReceivedFile: { _, _, _ in }, + progressStart: { _, _ in }, + progressChunkSent: { _ in }, + progressReset: { _ in }, + progressCancel: { _ in } + ) + let sender = WifiBulkTransferService(environment: environment, config: config) + sender.sendFile(payload: Data(repeating: 1, count: 100_000), to: Self.receiverPeer, transferId: "t-vanish") { + fallbacks.append(true) + } + #expect(await wifiBulkWait { fallbacks.count == 1 }) + #expect(sender._test_activeOutgoingCount == 0) + } +} diff --git a/bitchatTests/WifiBulk/WifiBulkMessagesTests.swift b/bitchatTests/WifiBulk/WifiBulkMessagesTests.swift new file mode 100644 index 00000000..1cc92657 --- /dev/null +++ b/bitchatTests/WifiBulk/WifiBulkMessagesTests.swift @@ -0,0 +1,107 @@ +// +// WifiBulkMessagesTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +@Suite("WifiBulk offer/response TLV") +struct WifiBulkMessagesTests { + private func makeOffer( + fileSize: UInt64 = 300_000, + serviceName: String = "a1b2c3d4e5f60718a1b2c3d4e5f60718" + ) -> WifiBulkOffer { + WifiBulkOffer( + transferID: Data(repeating: 0xAB, count: WifiBulkWire.transferIDLength), + fileSize: fileSize, + payloadHash: Data(repeating: 0xCD, count: WifiBulkWire.hashLength), + token: Data(repeating: 0xEF, count: WifiBulkWire.tokenLength), + serviceName: serviceName + ) + } + + @Test("Offer round-trips through TLV encoding") + func offerRoundTrip() throws { + let offer = makeOffer() + let encoded = try #require(offer.encode()) + let decoded = try #require(WifiBulkOffer.decode(encoded)) + #expect(decoded == offer) + } + + @Test("Offer encode rejects malformed field lengths") + func offerEncodeRejectsBadFields() { + #expect(WifiBulkOffer( + transferID: Data(repeating: 1, count: 15), // short transferID + fileSize: 1, + payloadHash: Data(repeating: 2, count: 32), + token: Data(repeating: 3, count: 32), + serviceName: "x" + ).encode() == nil) + + #expect(makeOffer(serviceName: "").encode() == nil) + #expect(makeOffer(serviceName: String(repeating: "a", count: 64)).encode() == nil) + } + + @Test("Offer decode rejects missing or wrong-length fields") + func offerDecodeRejectsMalformed() throws { + let encoded = try #require(makeOffer().encode()) + + // Truncation anywhere breaks a TLV boundary or drops a required field. + #expect(WifiBulkOffer.decode(encoded.dropLast(1)) == nil) + #expect(WifiBulkOffer.decode(encoded.prefix(3)) == nil) + #expect(WifiBulkOffer.decode(Data()) == nil) + + // A wrong-length transferID TLV is ignored, leaving the field missing. + var mangled = Data([0x01, 0x00, 0x02, 0xAA, 0xBB]) // transferID of 2 bytes + mangled.append(encoded.dropFirst(3 + WifiBulkWire.transferIDLength)) + #expect(WifiBulkOffer.decode(mangled) == nil) + } + + @Test("Offer decode skips unknown TLVs for forward compatibility") + func offerDecodeSkipsUnknownTLVs() throws { + var encoded = try #require(makeOffer().encode()) + encoded.append(contentsOf: [0x7F, 0x00, 0x03, 0x01, 0x02, 0x03]) // unknown type 0x7F + let decoded = try #require(WifiBulkOffer.decode(encoded)) + #expect(decoded == makeOffer()) + } + + @Test("Accept response round-trips with token") + func acceptResponseRoundTrip() throws { + let response = WifiBulkResponse.accept( + transferID: Data(repeating: 0x11, count: WifiBulkWire.transferIDLength), + token: Data(repeating: 0x22, count: WifiBulkWire.tokenLength) + ) + let encoded = try #require(response.encode()) + let decoded = try #require(WifiBulkResponse.decode(encoded)) + #expect(decoded == response) + #expect(decoded.accepted) + #expect(decoded.token?.count == WifiBulkWire.tokenLength) + } + + @Test("Decline response round-trips without token") + func declineResponseRoundTrip() throws { + let response = WifiBulkResponse.decline( + transferID: Data(repeating: 0x11, count: WifiBulkWire.transferIDLength) + ) + let encoded = try #require(response.encode()) + let decoded = try #require(WifiBulkResponse.decode(encoded)) + #expect(decoded == response) + #expect(!decoded.accepted) + #expect(decoded.token == nil) + } + + @Test("Accept response without a token is rejected") + func acceptWithoutTokenRejected() throws { + // Hand-build: transferID + accepted=1, no token TLV. + var data = Data() + WifiBulkWire.appendTLV(0x01, value: Data(repeating: 0x11, count: 16), into: &data) + WifiBulkWire.appendTLV(0x02, value: Data([1]), into: &data) + #expect(WifiBulkResponse.decode(data) == nil) + } +} diff --git a/bitchatTests/WifiBulk/WifiBulkPolicyTests.swift b/bitchatTests/WifiBulk/WifiBulkPolicyTests.swift new file mode 100644 index 00000000..82a6c512 --- /dev/null +++ b/bitchatTests/WifiBulk/WifiBulkPolicyTests.swift @@ -0,0 +1,150 @@ +// +// WifiBulkPolicyTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +@Suite("WifiBulk policy") +struct WifiBulkPolicyTests { + private func candidate( + payloadBytes: Int = 300_000, + capabilities: PeerCapabilities = [.wifiBulk], + direct: Bool = true, + session: Bool = true + ) -> WifiBulkPolicy.SendCandidate { + WifiBulkPolicy.SendCandidate( + payloadBytes: payloadBytes, + peerCapabilities: capabilities, + isDirectlyConnected: direct, + hasEstablishedNoiseSession: session + ) + } + + @Test("Eligible large transfer to a direct wifiBulk peer is offered") + func eligibleTransferOffered() { + #expect(WifiBulkPolicy.shouldOffer(candidate(), enabled: true)) + } + + @Test("Fallback matrix: every failed gate keeps the transfer on BLE") + func fallbackMatrix() { + // Feature disabled. + #expect(!WifiBulkPolicy.shouldOffer(candidate(), enabled: false)) + // Small file: negotiation overhead not worth it. + #expect(!WifiBulkPolicy.shouldOffer(candidate(payloadBytes: 64 * 1024), enabled: true)) + // Peer doesn't advertise the capability. + #expect(!WifiBulkPolicy.shouldOffer(candidate(capabilities: []), enabled: true)) + #expect(!WifiBulkPolicy.shouldOffer(candidate(capabilities: [.prekeys, .gateway]), enabled: true)) + // Multi-hop recipient (reachable but not directly connected). + #expect(!WifiBulkPolicy.shouldOffer(candidate(direct: false), enabled: true)) + // No established Noise session to carry the offer. + #expect(!WifiBulkPolicy.shouldOffer(candidate(session: false), enabled: true)) + // Payload beyond even the Wi-Fi ceiling. + #expect(!WifiBulkPolicy.shouldOffer( + candidate(payloadBytes: FileTransferLimits.maxWifiBulkPayloadBytes + 1), + enabled: true + )) + } + + @Test("Offer threshold is strictly greater than the minimum") + func offerThresholdBoundary() { + #expect(!WifiBulkPolicy.shouldOffer( + candidate(payloadBytes: TransportConfig.wifiBulkMinPayloadBytes), + enabled: true + )) + #expect(WifiBulkPolicy.shouldOffer( + candidate(payloadBytes: TransportConfig.wifiBulkMinPayloadBytes + 1), + enabled: true + )) + } + + private func offer(fileSize: UInt64) -> WifiBulkOffer { + WifiBulkOffer( + transferID: Data(repeating: 1, count: WifiBulkWire.transferIDLength), + fileSize: fileSize, + payloadHash: Data(repeating: 2, count: WifiBulkWire.hashLength), + token: Data(repeating: 3, count: WifiBulkWire.tokenLength), + serviceName: "0011223344556677" + ) + } + + @Test("Receiver accepts an in-cap offer from a direct peer") + func receiverAccepts() { + #expect(WifiBulkPolicy.shouldAccept( + offer: offer(fileSize: 1_000_000), + senderIsDirectlyConnected: true, + activeIncomingTransfers: 0, + enabled: true + )) + } + + @Test("Receiver enforces its own size cap, not the sender's word") + func receiverSizeCap() { + #expect(!WifiBulkPolicy.shouldAccept( + offer: offer(fileSize: UInt64(FileTransferLimits.maxWifiBulkPayloadBytes) + 1), + senderIsDirectlyConnected: true, + activeIncomingTransfers: 0, + enabled: true + )) + #expect(WifiBulkPolicy.shouldAccept( + offer: offer(fileSize: UInt64(FileTransferLimits.maxWifiBulkPayloadBytes)), + senderIsDirectlyConnected: true, + activeIncomingTransfers: 0, + enabled: true + )) + #expect(!WifiBulkPolicy.shouldAccept( + offer: offer(fileSize: 0), + senderIsDirectlyConnected: true, + activeIncomingTransfers: 0, + enabled: true + )) + } + + @Test("Receiver declines when disabled, indirect, or saturated") + func receiverDeclines() { + #expect(!WifiBulkPolicy.shouldAccept( + offer: offer(fileSize: 1000), + senderIsDirectlyConnected: true, + activeIncomingTransfers: 0, + enabled: false + )) + #expect(!WifiBulkPolicy.shouldAccept( + offer: offer(fileSize: 1000), + senderIsDirectlyConnected: false, + activeIncomingTransfers: 0, + enabled: true + )) + #expect(!WifiBulkPolicy.shouldAccept( + offer: offer(fileSize: 1000), + senderIsDirectlyConnected: true, + activeIncomingTransfers: TransportConfig.wifiBulkMaxConcurrentIncoming, + enabled: true + )) + } + + @Test("This build advertises the wifiBulk capability when enabled") + func localCapabilityAdvertised() { + #expect(PeerCapabilities.localSupported.contains(.wifiBulk) == TransportConfig.wifiBulkEnabled) + } + + @Test("File packets above the BLE cap encode/decode only with the Wi-Fi limit") + func filePacketWifiLimit() throws { + let content = Data(repeating: 0x5A, count: 2 * 1024 * 1024) // 2 MiB + let packet = BitchatFilePacket(fileName: "big.jpg", fileSize: UInt64(content.count), mimeType: "image/jpeg", content: content) + + // BLE cap unchanged. + #expect(packet.encode() == nil) + + let encoded = try #require(packet.encode(limit: FileTransferLimits.maxWifiBulkPayloadBytes)) + #expect(BitchatFilePacket.decode(encoded) == nil) // BLE-cap decode still rejects + let decoded = try #require(BitchatFilePacket.decode(encoded, limit: FileTransferLimits.maxWifiBulkPayloadBytes)) + #expect(decoded.content == content) + #expect(decoded.fileName == "big.jpg") + } +} diff --git a/bitchatTests/WifiBulk/WifiBulkTransferServiceTests.swift b/bitchatTests/WifiBulk/WifiBulkTransferServiceTests.swift new file mode 100644 index 00000000..d14f5dd9 --- /dev/null +++ b/bitchatTests/WifiBulk/WifiBulkTransferServiceTests.swift @@ -0,0 +1,246 @@ +// +// WifiBulkTransferServiceTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation +import Network +import Testing +@testable import bitchat + +/// Thread-safe capture box for closures invoked on service queues. +final class WifiBulkTestBox: @unchecked Sendable { + private let lock = NSLock() + private var storage: [Value] = [] + + func append(_ value: Value) { + lock.lock() + storage.append(value) + lock.unlock() + } + + var values: [Value] { + lock.lock() + defer { lock.unlock() } + return storage + } + + var count: Int { values.count } +} + +func wifiBulkWait( + timeout: TimeInterval = 5.0, + _ condition: @escaping () -> Bool +) async -> Bool { + let deadline = Date().addingTimeInterval(timeout) + while Date() < deadline { + if condition() { return true } + try? await Task.sleep(nanoseconds: 20_000_000) + } + return condition() +} + +/// Negotiation/fallback decisions exercised through the real service with the +/// network kept on loopback and Bonjour publication disabled. +@Suite("WifiBulk transfer service negotiation", .serialized) +struct WifiBulkTransferServiceTests { + private static let peer = PeerID(str: "aabbccddeeff0011") + + private func makeConfig() -> WifiBulkTransferServiceConfig { + var config = WifiBulkTransferServiceConfig() + config.usePeerToPeer = false + config.publishBonjourService = false + config.offerTimeout = 0.25 + config.transferWindow = 2.0 + return config + } + + private func makeEnvironment( + sendNoisePayload: @escaping (Data, PeerID) -> Bool, + deliver: @escaping (Data, PeerID, Int) -> Void = { _, _, _ in }, + progressEvents: WifiBulkTestBox? = nil + ) -> WifiBulkTransferServiceEnvironment { + WifiBulkTransferServiceEnvironment( + sendNoisePayload: sendNoisePayload, + isPeerConnected: { _ in true }, + deliverReceivedFile: deliver, + progressStart: { id, total in progressEvents?.append("start:\(id):\(total)") }, + progressChunkSent: { id in progressEvents?.append("chunk:\(id)") }, + progressReset: { id in progressEvents?.append("reset:\(id)") }, + progressCancel: { id in progressEvents?.append("cancel:\(id)") } + ) + } + + private var payload: Data { Data(repeating: 0x42, count: 100_000) } + + @Test("No established Noise session falls straight back to BLE") + func noSessionFallsBack() async { + let fallbacks = WifiBulkTestBox() + let service = WifiBulkTransferService( + environment: makeEnvironment(sendNoisePayload: { _, _ in false }), + config: makeConfig() + ) + service.sendFile(payload: payload, to: Self.peer, transferId: "t-nosession") { + fallbacks.append(true) + } + #expect(await wifiBulkWait { fallbacks.count == 1 }) + #expect(service._test_activeOutgoingCount == 0) + } + + @Test("Unanswered offer times out and falls back exactly once") + func offerTimeoutFallsBackOnce() async { + let fallbacks = WifiBulkTestBox() + let progress = WifiBulkTestBox() + let service = WifiBulkTransferService( + environment: makeEnvironment(sendNoisePayload: { _, _ in true }, progressEvents: progress), + config: makeConfig() + ) + service.sendFile(payload: payload, to: Self.peer, transferId: "t-timeout") { + fallbacks.append(true) + } + #expect(await wifiBulkWait { fallbacks.count == 1 }) + // Wait past the transfer window: the expiry must not double-fire. + try? await Task.sleep(nanoseconds: 2_300_000_000) + #expect(fallbacks.count == 1) + #expect(service._test_activeOutgoingCount == 0) + // Progress state was silently reset ahead of the BLE re-start. + #expect(progress.values.contains("reset:t-timeout")) + #expect(!progress.values.contains("cancel:t-timeout")) + } + + @Test("Declined offer falls back exactly once, even on duplicate declines") + func declineFallsBackOnce() async { + let fallbacks = WifiBulkTestBox() + let offers = WifiBulkTestBox() + var service: WifiBulkTransferService? + let environment = makeEnvironment(sendNoisePayload: { typed, peer in + guard typed.first == NoisePayloadType.bulkTransferOffer.rawValue, + let offer = WifiBulkOffer.decode(typed.dropFirst()) else { return true } + offers.append(offer.transferID) + guard let decline = WifiBulkResponse.decline(transferID: offer.transferID).encode() else { return true } + // Deliver the decline twice; the fallback must still fire once. + service?.handleResponsePayload(decline, from: peer) + service?.handleResponsePayload(decline, from: peer) + return true + }) + let sut = WifiBulkTransferService(environment: environment, config: makeConfig()) + service = sut + sut.sendFile(payload: payload, to: Self.peer, transferId: "t-decline") { + fallbacks.append(true) + } + #expect(await wifiBulkWait { fallbacks.count == 1 }) + try? await Task.sleep(nanoseconds: 300_000_000) + #expect(fallbacks.count == 1) + #expect(sut._test_activeOutgoingCount == 0) + } + + @Test("Responses from the wrong peer are ignored") + func wrongPeerResponseIgnored() async { + let fallbacks = WifiBulkTestBox() + var service: WifiBulkTransferService? + let environment = makeEnvironment(sendNoisePayload: { typed, _ in + guard typed.first == NoisePayloadType.bulkTransferOffer.rawValue, + let offer = WifiBulkOffer.decode(typed.dropFirst()), + let decline = WifiBulkResponse.decline(transferID: offer.transferID).encode() else { return true } + // Decline arrives from an unrelated peer: must be ignored, so the + // transfer ends via offer timeout instead. + service?.handleResponsePayload(decline, from: PeerID(str: "1122334455667788")) + return true + }) + let sut = WifiBulkTransferService(environment: environment, config: makeConfig()) + service = sut + sut.sendFile(payload: payload, to: Self.peer, transferId: "t-wrongpeer") { + fallbacks.append(true) + } + // Not fallen back before the offer timeout window… + try? await Task.sleep(nanoseconds: 100_000_000) + #expect(fallbacks.count == 0) + // …but the timeout still cleans up. + #expect(await wifiBulkWait { fallbacks.count == 1 }) + } + + @Test("User cancel tears down without BLE fallback") + func userCancelDoesNotFallBack() async { + let fallbacks = WifiBulkTestBox() + let progress = WifiBulkTestBox() + let service = WifiBulkTransferService( + environment: makeEnvironment(sendNoisePayload: { _, _ in true }, progressEvents: progress), + config: makeConfig() + ) + service.sendFile(payload: payload, to: Self.peer, transferId: "t-cancel") { + fallbacks.append(true) + } + #expect(await wifiBulkWait { service._test_activeOutgoingCount == 1 }) + service.cancelTransfer(transferId: "t-cancel") + #expect(await wifiBulkWait { service._test_activeOutgoingCount == 0 }) + try? await Task.sleep(nanoseconds: 400_000_000) // past the offer timeout + #expect(fallbacks.count == 0) + #expect(progress.values.contains("cancel:t-cancel")) + } + + @Test("Receiver declines an offer that exceeds its size cap") + func receiverDeclinesOversizedOffer() async { + let responses = WifiBulkTestBox() + let service = WifiBulkTransferService( + environment: makeEnvironment(sendNoisePayload: { typed, _ in + if typed.first == NoisePayloadType.bulkTransferResponse.rawValue { + responses.append(Data(typed.dropFirst())) + } + return true + }), + config: makeConfig() + ) + let offer = WifiBulkOffer( + transferID: Data(repeating: 7, count: WifiBulkWire.transferIDLength), + fileSize: UInt64(FileTransferLimits.maxWifiBulkPayloadBytes) + 1, + payloadHash: Data(repeating: 8, count: WifiBulkWire.hashLength), + token: Data(repeating: 9, count: WifiBulkWire.tokenLength), + serviceName: "0011223344556677" + ) + if let encoded = offer.encode() { + service.handleOfferPayload(encoded, from: Self.peer) + } + #expect(await wifiBulkWait { responses.count == 1 }) + let response = WifiBulkResponse.decode(responses.values[0]) + #expect(response?.accepted == false) + #expect(response?.transferID == offer.transferID) + #expect(service._test_activeIncomingCount == 0) + } + + @Test("Malformed offers are dropped without a response") + func malformedOfferDropped() async { + let responses = WifiBulkTestBox() + let service = WifiBulkTransferService( + environment: makeEnvironment(sendNoisePayload: { typed, _ in + responses.append(typed) + return true + }), + config: makeConfig() + ) + service.handleOfferPayload(Data([0x01, 0x02, 0x03]), from: Self.peer) + try? await Task.sleep(nanoseconds: 200_000_000) + #expect(responses.count == 0) + #expect(service._test_activeIncomingCount == 0) + } + + @Test("stop() tears down active transfers without falling back") + func stopTearsDownWithoutFallback() async { + let fallbacks = WifiBulkTestBox() + let service = WifiBulkTransferService( + environment: makeEnvironment(sendNoisePayload: { _, _ in true }), + config: makeConfig() + ) + service.sendFile(payload: payload, to: Self.peer, transferId: "t-stop") { + fallbacks.append(true) + } + #expect(await wifiBulkWait { service._test_activeOutgoingCount == 1 }) + service.stop() + #expect(await wifiBulkWait { service._test_activeOutgoingCount == 0 }) + try? await Task.sleep(nanoseconds: 400_000_000) + #expect(fallbacks.count == 0) + } +} diff --git a/localPackages/BitFoundation/Sources/BitFoundation/FileTransferLimits.swift b/localPackages/BitFoundation/Sources/BitFoundation/FileTransferLimits.swift index 4c54f79c..ec89c4b6 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/FileTransferLimits.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/FileTransferLimits.swift @@ -2,6 +2,10 @@ public enum FileTransferLimits { /// Absolute ceiling enforced for any file payload (voice, image, other). public static let maxPayloadBytes: Int = 1 * 1024 * 1024 // 1 MiB + /// Ceiling for transfers negotiated onto the peer-to-peer Wi-Fi bulk + /// channel. The receiver enforces it against the size in the accepted + /// offer; the Bluetooth path keeps `maxPayloadBytes`. + public static let maxWifiBulkPayloadBytes: Int = 8 * 1024 * 1024 // 8 MiB /// Voice notes stay small for low-latency relays. public static let maxVoiceNoteBytes: Int = 512 * 1024 // 512 KiB /// Compressed images after downscaling should comfortably fit under this budget. @@ -17,7 +21,7 @@ public enum FileTransferLimits { return maxPayloadBytes + tlvEnvelopeOverhead + binaryEnvelopeOverhead }() - public static func isValidPayload(_ size: Int) -> Bool { - size <= maxPayloadBytes + public static func isValidPayload(_ size: Int, limit: Int = maxPayloadBytes) -> Bool { + size <= limit } } From 85112d809b0821522472f561a4253451a91a577c Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 20:58:42 +0200 Subject: [PATCH 013/158] Fix stall-clock refresh on duplicates and overflow suppression in fragment resync Two fixes to stalledBroadcastFragmentIDs bookkeeping in BLEFragmentAssemblyBuffer: - Duplicate fragments no longer reset the stall clock. Fragment packets bypass the packet deduplicator, so relayed duplicates of an already-held index arriving every few seconds kept lastFragmentAt fresh and suppressed the targeted REQUEST_SYNC indefinitely. Now lastFragmentAt only updates when the index is new (actual progress). - Only the streams that will actually be encoded on the wire are rate-limited. Previously every stalled candidate got lastResyncRequestAt set, but encodeFragmentIdFilter serializes at most RequestSyncPacket.maxFragmentIdFilterCount (60) IDs, so overflow streams were suppressed for retryAfter without ever being requested. Selection now caps at that shared constant, oldest stall first, so overflow stays eligible and rotates fairly on the next pass. Tests: duplicates arriving periodically still trigger the stall report; 70 stalled streams yield the 60 oldest on the first pass and the remaining 10 on the next. Co-Authored-By: Claude Fable 5 --- .../BLE/BLEFragmentAssemblyBuffer.swift | 39 ++++++++++--- .../BLEFragmentAssemblyBufferTests.swift | 58 +++++++++++++++++++ 2 files changed, 90 insertions(+), 7 deletions(-) diff --git a/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift b/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift index ad6e007c..83311584 100644 --- a/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift +++ b/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift @@ -108,8 +108,15 @@ struct BLEFragmentAssemblyBuffer { return .oversized(header: header, projectedSize: projectedSize, limit: limit, started: started) } + // Only actual progress resets the stall clock: fragment packets + // bypass the packet deduplicator, so relayed duplicates of an + // already-held index must not keep suppressing the targeted + // REQUEST_SYNC for a stalled stream. + let isNewIndex = fragmentsByKey[header.key]?[header.index] == nil fragmentsByKey[header.key]?[header.index] = header.fragmentData - metadataByKey[header.key]?.lastFragmentAt = now + if isNewIndex { + metadataByKey[header.key]?.lastFragmentAt = now + } guard let fragments = fragmentsByKey[header.key], fragments.count == header.total else { @@ -156,14 +163,18 @@ struct BLEFragmentAssemblyBuffer { /// reassemblies that have not seen a new fragment for `stalledAfter` /// seconds — candidates for a targeted REQUEST_SYNC. Each returned /// stream is marked so it is not re-requested within `retryAfter`. - /// Directed reassemblies are excluded: peers only archive broadcast - /// fragments for gossip sync, so a targeted request cannot recover them. + /// At most `RequestSyncPacket.maxFragmentIdFilterCount` streams are + /// returned per pass — the wire filter cannot carry more — selected + /// oldest-stall first; overflow streams stay unmarked and eligible for + /// the next pass. Directed reassemblies are excluded: peers only archive + /// broadcast fragments for gossip sync, so a targeted request cannot + /// recover them. mutating func stalledBroadcastFragmentIDs( stalledAfter: TimeInterval, retryAfter: TimeInterval, now: Date = Date() ) -> [Data] { - var stalled: [Data] = [] + var candidates: [(key: BLEFragmentKey, lastFragmentAt: Date)] = [] for (key, metadata) in metadataByKey { guard metadata.isBroadcast, let fragments = fragmentsByKey[key], @@ -171,10 +182,24 @@ struct BLEFragmentAssemblyBuffer { now.timeIntervalSince(metadata.lastFragmentAt) >= stalledAfter else { continue } if let lastRequest = metadata.lastResyncRequestAt, now.timeIntervalSince(lastRequest) < retryAfter { continue } - metadataByKey[key]?.lastResyncRequestAt = now - stalled.append(withUnsafeBytes(of: key.id.bigEndian) { Data($0) }) + candidates.append((key: key, lastFragmentAt: metadata.lastFragmentAt)) + } + + // Mark only the streams that will actually go on the wire, so the + // overflow is not silently suppressed for `retryAfter`. + let selected = candidates + .sorted { + if $0.lastFragmentAt != $1.lastFragmentAt { + return $0.lastFragmentAt < $1.lastFragmentAt + } + return ($0.key.sender, $0.key.id) < ($1.key.sender, $1.key.id) + } + .prefix(RequestSyncPacket.maxFragmentIdFilterCount) + + return selected.map { candidate in + metadataByKey[candidate.key]?.lastResyncRequestAt = now + return withUnsafeBytes(of: candidate.key.id.bigEndian) { Data($0) } } - return stalled } private static func assemblyLimit(for originalType: UInt8) -> Int { diff --git a/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift b/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift index ace2cfbe..a4423ec9 100644 --- a/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift +++ b/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift @@ -192,6 +192,64 @@ struct BLEFragmentAssemblyBufferTests { #expect(afterCompletion.isEmpty) } + @Test + func duplicateFragmentsDoNotResetStallClock() throws { + var buffer = BLEFragmentAssemblyBuffer() + let fragmentID = Data((20...27).map { UInt8($0) }) + let packet = makePacket(payload: makePayload(count: 256)) + let fragments = try makeFragments(for: packet, chunkSize: 128, fragmentID: fragmentID) + let first = try #require(BLEFragmentHeader(packet: fragments[0])) + + let t0 = Date(timeIntervalSince1970: 100) + _ = buffer.append(first, maxInFlightAssemblies: 8, now: t0) + + // Relay duplicates of the same index arrive every few seconds; they + // bring no new data, so they must not keep the stream "fresh". + _ = buffer.append(first, maxInFlightAssemblies: 8, now: t0.addingTimeInterval(3)) + _ = buffer.append(first, maxInFlightAssemblies: 8, now: t0.addingTimeInterval(5)) + + let stalled = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(6)) + #expect(stalled == [fragmentID]) + } + + @Test + func overflowStalledStreamsRotateAcrossPasses() throws { + var buffer = BLEFragmentAssemblyBuffer() + let cap = RequestSyncPacket.maxFragmentIdFilterCount + let streamCount = cap + 10 + let t0 = Date(timeIntervalSince1970: 100) + + // Incomplete broadcast assemblies with staggered last-fragment times + // (stream 0 is the oldest stall). + var ids: [Data] = [] + for i in 0..> 8), UInt8(i & 0xFF)]) + ids.append(fragmentID) + let header = try #require(BLEFragmentHeader(packet: makeFragmentPacket( + fragmentID: fragmentID, + index: 0, + total: 2, + originalType: MessageType.message.rawValue, + fragmentData: Data([0x01]) + ))) + _ = buffer.append(header, maxInFlightAssemblies: streamCount, now: t0.addingTimeInterval(Double(i))) + } + + // All streams are stalled; only the cap's worth (oldest first) is + // requested and rate-limited, the overflow stays eligible. + let firstPassAt = t0.addingTimeInterval(Double(streamCount) + 5) + let firstPass = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 60, now: firstPassAt) + #expect(firstPass == Array(ids.prefix(cap))) + + // Next pass picks up exactly the overflow streams. + let secondPass = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 60, now: firstPassAt.addingTimeInterval(1)) + #expect(secondPass == Array(ids.suffix(streamCount - cap))) + + // Nothing left until a retry window lapses. + let thirdPass = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 60, now: firstPassAt.addingTimeInterval(2)) + #expect(thirdPass.isEmpty) + } + @Test func directedAssembliesAreNeverReportedAsStalled() throws { var buffer = BLEFragmentAssemblyBuffer() From 6dd8dd055af5945a88a64dfac29fbe4a50e70f6b Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 21:01:02 +0200 Subject: [PATCH 014/158] Board: bound orphan tombstones and reject future-dated posts at ingest Two hardening fixes from Codex review of the geohash bulletin board: - Orphan tombstones (P1): retention was derived solely from the sender-chosen deletedAt, so self-signed tombstones for unseen post IDs with far-future deletedAt persisted and re-entered sync unboundedly. Retention is now also clamped to receive time (now + 7d + 1h skew -- no post can outlive that), and orphans are capped at 100 globally and 5 per author key with oldest-received evicted first. Matched tombstones and disk restores keep their existing behavior. - Future-dated posts (P2): ingest only checked expiresAt > now, letting posts dated years ahead sort above honest posts and squat the 200 global slots without ever pruning. The single ingest chokepoint (radio, sync, and disk restore all funnel through it) now rejects createdAt > now + 1h skew and expiresAt > now + 7d + 1h skew; the decoder's span rule is unchanged. Adds tests for the skew boundary, far-future expiry, receive-time tombstone clamping, orphan caps/eviction, and matched-tombstone exemption. Co-Authored-By: Claude Fable 5 --- bitchat/Services/Board/BoardStore.swift | 59 ++++++++++- bitchatTests/Services/BoardStoreTests.swift | 108 ++++++++++++++++++++ 2 files changed, 164 insertions(+), 3 deletions(-) diff --git a/bitchat/Services/Board/BoardStore.swift b/bitchat/Services/Board/BoardStore.swift index c08a12e4..8ffdf7f3 100644 --- a/bitchat/Services/Board/BoardStore.swift +++ b/bitchat/Services/Board/BoardStore.swift @@ -40,6 +40,13 @@ final class BoardStore { /// Retention for a tombstone whose post we never saw: we cannot know /// the original expiry, so cap at the max post lifetime. static let orphanTombstoneLifetimeMs = BoardWireConstants.maxLifetimeMs + /// Orphan tombstones name posts nobody here has seen, so their volume + /// is entirely sender-controlled; cap them like posts. + static let maxOrphanTombstones = 100 + static let maxOrphanTombstonesPerAuthor = 5 + /// Allowance for clock skew between peers when judging received + /// timestamps against local time. + static let clockSkewMs: UInt64 = 60 * 60 * 1000 } private struct StoredPost { @@ -53,6 +60,9 @@ final class BoardStore { let packet: BitchatPacket let rawPacket: Data let retainUntil: UInt64 + /// True when no matching post was known at ingest time; only these + /// count against the orphan caps. + let isOrphan: Bool } /// On-disk entry: the raw signed packet, plus the retention deadline for @@ -161,6 +171,14 @@ final class BoardStore { private func ingestPostLocked(_ post: BoardPostPacket, packet: BitchatPacket, rawPacket: Data, nowMs: UInt64) -> BoardIngestResult { guard post.expiresAt > nowMs else { return .rejected } + // Receive-time sanity (this is the single chokepoint for radio, sync, + // and disk restores): the decoder only enforces the createdAt to + // expiresAt span, so a forged future createdAt would sort ahead of + // honest posts and hold a store slot without ever pruning. + guard post.createdAt <= nowMs &+ Limits.clockSkewMs, + post.expiresAt <= nowMs &+ BoardWireConstants.maxLifetimeMs &+ Limits.clockSkewMs else { + return .rejected + } if tombstones.contains(where: { $0.tombstone.postID == post.postID && $0.tombstone.authorSigningKey == post.authorSigningKey }) { return .rejected } @@ -191,9 +209,16 @@ final class BoardStore { ) -> BoardIngestResult { guard !tombstones.contains(where: { $0.tombstone.postID == tombstone.postID }) else { return .duplicate } - // Cap so a doctored file cannot pin a tombstone past any legal expiry. - let maxRetain = tombstone.deletedAt &+ Limits.orphanTombstoneLifetimeMs + // Cap retention by both the claimed deletion time (so a doctored file + // cannot pin a tombstone past any legal expiry) and the receive time: + // deletedAt is sender-chosen, so a far-future value must not retain + // the tombstone longer than any post still able to arrive could live. + let maxRetain = min( + tombstone.deletedAt &+ Limits.orphanTombstoneLifetimeMs, + nowMs &+ Limits.orphanTombstoneLifetimeMs &+ Limits.clockSkewMs + ) let retainUntil: UInt64 + let isOrphan: Bool if let index = posts.firstIndex(where: { $0.post.postID == tombstone.postID }) { let target = posts[index].post // Only the author's key can delete: the tombstone signature was @@ -201,22 +226,50 @@ final class BoardStore { // require that key to be the post's author key. guard target.authorSigningKey == tombstone.authorSigningKey else { return .rejected } retainUntil = target.expiresAt + isOrphan = false posts.remove(at: index) publishSnapshotLocked() } else if let retainUntilOverride { // Restored from disk: the post is long gone, so trust the // retention deadline recorded when the delete was first applied. + // Orphans were already capped when first ingested off the air. retainUntil = min(retainUntilOverride, maxRetain) + isOrphan = false } else { // Post unknown (tombstone raced ahead); keep it around so the // post is suppressed if it arrives later. retainUntil = maxRetain + isOrphan = true } guard retainUntil > nowMs else { return .rejected } - tombstones.append(StoredTombstone(tombstone: tombstone, packet: packet, rawPacket: rawPacket, retainUntil: retainUntil)) + tombstones.append(StoredTombstone(tombstone: tombstone, packet: packet, rawPacket: rawPacket, retainUntil: retainUntil, isOrphan: isOrphan)) + if isOrphan { + enforceOrphanTombstoneCapsLocked(author: tombstone.authorSigningKey) + } + // Like posts, a locally evicted tombstone stays valid mesh-wide. return .accepted } + /// Orphan tombstones reference posts we never saw, so a peer can mint + /// unlimited valid ones for random IDs; bound them per author and + /// globally, evicting the oldest received first (array order). + private func enforceOrphanTombstoneCapsLocked(author: Data) { + let authorOrphans = tombstones.filter { $0.isOrphan && $0.tombstone.authorSigningKey == author } + if authorOrphans.count > Limits.maxOrphanTombstonesPerAuthor { + removeTombstonesLocked(authorOrphans.prefix(authorOrphans.count - Limits.maxOrphanTombstonesPerAuthor)) + } + let orphans = tombstones.filter(\.isOrphan) + if orphans.count > Limits.maxOrphanTombstones { + removeTombstonesLocked(orphans.prefix(orphans.count - Limits.maxOrphanTombstones)) + } + } + + private func removeTombstonesLocked(_ victims: ArraySlice) { + guard !victims.isEmpty else { return } + let victimIDs = Set(victims.map { $0.tombstone.postID }) + tombstones.removeAll { victimIDs.contains($0.tombstone.postID) } + } + private func evictOldestLocked(from candidates: [StoredPost], keep: Int) { let victims = candidates .sorted { $0.post.createdAt < $1.post.createdAt } diff --git a/bitchatTests/Services/BoardStoreTests.swift b/bitchatTests/Services/BoardStoreTests.swift index 5712084c..d501de39 100644 --- a/bitchatTests/Services/BoardStoreTests.swift +++ b/bitchatTests/Services/BoardStoreTests.swift @@ -119,6 +119,40 @@ struct BoardStoreTests { #expect(store.posts(forGeohash: "9q8yy").isEmpty) } + // MARK: - Receive-time timestamp policy + + @Test func rejectsPostCreatedBeyondClockSkew() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs + BoardStore.Limits.clockSkewMs + 60 * 1000) + + #expect(store.ingest(entry.wire, packet: entry.packet) == .rejected) + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + } + + @Test func acceptsPostCreatedWithinClockSkew() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs + BoardStore.Limits.clockSkewMs - 60 * 1000) + + #expect(store.ingest(entry.wire, packet: entry.packet) == .accepted) + #expect(store.posts(forGeohash: "9q8yy").count == 1) + } + + @Test func rejectsPostExpiringTooFarInTheFuture() throws { + // Builds the wire directly, bypassing the decoder's span check, to + // exercise the ingest-level expiresAt bound on its own. + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs, lifetimeMs: 30 * 24 * 60 * 60 * 1000) + + #expect(store.ingest(entry.wire, packet: entry.packet) == .rejected) + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + } + // MARK: - Caps and eviction @Test func perAuthorCapEvictsOldest() throws { @@ -228,6 +262,80 @@ struct BoardStoreTests { #expect(store.posts(forGeohash: "9q8yy").isEmpty) } + @Test func orphanTombstoneRetentionIsBoundedByReceiveTime() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs) // never ingested + + // Attacker-chosen far-future deletedAt must not extend retention. + let farFuture = baseMs + 365 * 24 * 60 * 60 * 1000 + let tombstone = try makeTombstone(for: entry.post, author: author, deletedAt: farFuture) + #expect(store.ingest(tombstone.wire, packet: tombstone.packet) == .accepted) + #expect(store.syncCandidates().count == 1) + + // No post can outlive 7 days from receipt, so neither may an orphan + // tombstone (plus skew allowance). + clock.now = baseDate.addingTimeInterval(8 * 24 * 60 * 60) + #expect(store.syncCandidates().isEmpty) + } + + @Test func orphanTombstonePerAuthorCapEvictsOldest() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + + var unseenPosts: [(wire: BoardWire, packet: BitchatPacket, post: BoardPostPacket)] = [] + for index in 0..<(BoardStore.Limits.maxOrphanTombstonesPerAuthor + 1) { + let entry = try makePost(author: author, createdAt: baseMs + UInt64(index)) + unseenPosts.append(entry) + let tombstone = try makeTombstone(for: entry.post, author: author, deletedAt: baseMs + 1000) + #expect(store.ingest(tombstone.wire, packet: tombstone.packet) == .accepted) + } + + #expect(store.syncCandidates().count == BoardStore.Limits.maxOrphanTombstonesPerAuthor) + // The oldest orphan was evicted, so its post is no longer suppressed… + #expect(store.ingest(unseenPosts[0].wire, packet: unseenPosts[0].packet) == .accepted) + // …while the surviving orphans still suppress theirs. + #expect(store.ingest(unseenPosts[1].wire, packet: unseenPosts[1].packet) == .rejected) + } + + @Test func orphanTombstoneGlobalCapEvictsOldest() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + + var author = Curve25519.Signing.PrivateKey() + for index in 0..<(BoardStore.Limits.maxOrphanTombstones + 1) { + if index % BoardStore.Limits.maxOrphanTombstonesPerAuthor == 0 { + author = Curve25519.Signing.PrivateKey() + } + let entry = try makePost(author: author, createdAt: baseMs + UInt64(index)) + let tombstone = try makeTombstone(for: entry.post, author: author, deletedAt: baseMs + 1000) + #expect(store.ingest(tombstone.wire, packet: tombstone.packet) == .accepted) + } + + #expect(store.syncCandidates().count == BoardStore.Limits.maxOrphanTombstones) + } + + @Test func matchedTombstonesAreExemptFromOrphanCaps() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + + // Post-then-delete more times than the per-author orphan cap; every + // tombstone matched a live post, so none may be evicted. + let cycles = BoardStore.Limits.maxOrphanTombstonesPerAuthor + 2 + for index in 0.. Date: Mon, 6 Jul 2026 21:07:59 +0200 Subject: [PATCH 015/158] Cashu: strict decode on the /pay SEND path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The permissive decoder turned any non-empty cashuB… base64 that failed CBOR parsing into a generic TokenInfo, so the /pay guard accepted base64 junk and truncated V4 tokens and relayed them with a success message. Add a `strict` flag to CashuTokenDecoder.decode: in strict mode there is no permissive V4 fallback and the token must resolve to a known version with a positive amount, else it returns nil. Rendering keeps the permissive path (an unknown chip is fine for display). /pay now decodes with strict:true and surfaces "invalid cashu token" instead of sending. Tests: /pay with truncated cashuB / base64 junk is rejected; valid V3 and valid definite-length V4 still send; decoder strict-mode unit tests. Co-Authored-By: Claude Fable 5 --- bitchat/Services/CashuTokenDecoder.swift | 34 +++++++++-- bitchat/Services/CommandProcessor.swift | 4 +- bitchatTests/CashuTokenDecoderTests.swift | 44 +++++++++++++++ bitchatTests/CommandProcessorTests.swift | 69 +++++++++++++++++++++++ 4 files changed, 143 insertions(+), 8 deletions(-) diff --git a/bitchat/Services/CashuTokenDecoder.swift b/bitchat/Services/CashuTokenDecoder.swift index 78c3b3c2..87dfee02 100644 --- a/bitchat/Services/CashuTokenDecoder.swift +++ b/bitchat/Services/CashuTokenDecoder.swift @@ -67,23 +67,45 @@ enum CashuTokenDecoder { } /// Decodes a token (raw or `cashu:` URI form) into a display summary. - /// V3 tokens must parse as JSON; V4 tokens whose CBOR we cannot walk - /// still return a generic `TokenInfo` (version "B", no amount) because - /// the payload may use encodings this minimal reader doesn't support. - static func decode(_ raw: String) -> TokenInfo? { + /// + /// In the default (permissive) mode this is for *rendering*: V3 tokens + /// must parse as JSON, but a V4 token whose CBOR we cannot walk still + /// returns a generic `TokenInfo` (version "B", no amount) because the + /// payload may use encodings this minimal reader doesn't support — an + /// unknown chip is fine for display. + /// + /// In `strict` mode (used by the `/pay` SEND path) there is no permissive + /// fallback: the token must cleanly decode to a known version *and* carry + /// a positive amount, otherwise this returns nil. This stops base64 junk + /// and truncated V4 tokens from being relayed as if they were valid money. + static func decode(_ raw: String, strict: Bool = false) -> TokenInfo? { guard let token = bareToken(from: raw) else { return nil } let version = String(token[token.index(token.startIndex, offsetBy: 5)]) guard let payload = base64URLDecode(String(token.dropFirst(6))), !payload.isEmpty else { return nil } + let info: TokenInfo? switch version { case "A": - return decodeV3(payload) + info = decodeV3(payload) case "B": - return decodeV4(payload) ?? TokenInfo(version: "B", amount: nil, unit: nil, mintHost: nil, memo: nil) + if let walked = decodeV4(payload) { + info = walked + } else if strict { + // Couldn't cleanly walk the CBOR — refuse to send it. + return nil + } else { + info = TokenInfo(version: "B", amount: nil, unit: nil, mintHost: nil, memo: nil) + } default: return nil } + guard let info else { return nil } + if strict { + // A sendable token must resolve to a positive, sane amount. + guard let amount = info.amount, amount > 0 else { return nil } + } + return info } // MARK: - Base64url diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index 81337fc4..220e66ef 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -353,8 +353,8 @@ final class CommandProcessor { guard parts.count == 1, let token = CashuTokenDecoder.bareToken(from: parts[0]) else { return .error(message: "that doesn't look like a cashu token — expected cashuA… or cashuB…") } - guard let info = CashuTokenDecoder.decode(token) else { - return .error(message: "couldn't decode that cashu token — not sending it") + guard let info = CashuTokenDecoder.decode(token, strict: true) else { + return .error(message: "invalid cashu token — it doesn't decode to a known token with an amount, not sending it") } let summary = info.displayAmount ?? "a cashu token" diff --git a/bitchatTests/CashuTokenDecoderTests.swift b/bitchatTests/CashuTokenDecoderTests.swift index 6fa0aefa..890a7eeb 100644 --- a/bitchatTests/CashuTokenDecoderTests.swift +++ b/bitchatTests/CashuTokenDecoderTests.swift @@ -188,6 +188,50 @@ struct CashuTokenDecoderTests { #expect(info?.mintHost == nil) } + // MARK: - Strict Mode (used by the /pay SEND path) + + @Test func strictAcceptsValidV3WithPositiveAmount() { + let token = makeV3Token(entries: [("https://mint.example.com", [2, 8])]) + let info = CashuTokenDecoder.decode(token, strict: true) + #expect(info?.version == "A") + #expect(info?.amount == 10) + } + + @Test func strictAcceptsValidDefiniteLengthV4() { + let token = makeV4Token(amounts: [1, 4, 16]) + let info = CashuTokenDecoder.decode(token, strict: true) + #expect(info?.version == "B") + #expect(info?.amount == 21) + } + + @Test func strictRejectsUnwalkableV4() { + // Valid base64, but not CBOR we can walk: permissive mode returns a + // generic chip, strict mode refuses it. + let token = "cashuB" + base64URL(Data([0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02])) + #expect(CashuTokenDecoder.decode(token)?.version == "B") + #expect(CashuTokenDecoder.decode(token, strict: true) == nil) + } + + @Test func strictRejectsTruncatedV4() { + let token = makeV4Token(amounts: [1, 4, 16]) + // Lop off the tail of the base64 payload — CBOR can no longer be walked. + let truncated = String(token.prefix(token.count - 12)) + #expect(CashuTokenDecoder.decode(truncated, strict: true) == nil) + } + + @Test func strictRejectsAmountlessToken() { + // A well-formed V3 token that carries no positive proof amount. + let json: [String: Any] = [ + "token": [[ + "mint": "https://mint.example.com", + "proofs": [["amount": 0, "id": "x", "secret": "s", "C": "c"] as [String: Any]] + ] as [String: Any]] + ] + let token = "cashuA" + base64URL(try! JSONSerialization.data(withJSONObject: json)) + #expect(CashuTokenDecoder.decode(token)?.amount == nil) + #expect(CashuTokenDecoder.decode(token, strict: true) == nil) + } + // MARK: - URI Form and Normalization @Test func uriFormsDecode() { diff --git a/bitchatTests/CommandProcessorTests.swift b/bitchatTests/CommandProcessorTests.swift index 030c1d8f..1937174e 100644 --- a/bitchatTests/CommandProcessorTests.swift +++ b/bitchatTests/CommandProcessorTests.swift @@ -442,6 +442,45 @@ struct CommandProcessorTests { #expect(context.sentPrivateMessages.isEmpty) } + @MainActor + @Test func payRejectsTruncatedOrJunkV4Token() { + let context = MockCommandContextProvider() + context.selectedPrivateChatPeer = PeerID(str: "abcd1234abcd1234") + let processor = makePayProcessor(context: context) + + // Truncated V4 (definite-length CBOR can no longer be walked) and + // pure base64 junk under the cashuB prefix must both be refused. + let truncatedV4 = String(Self.validV4Token.prefix(Self.validV4Token.count - 12)) + let junkV4 = "cashuB" + String(repeating: "Q", count: 40) + for bad in ["/pay \(truncatedV4)", "/pay \(junkV4)"] { + switch processor.process(bad) { + case .error(let message): + #expect(message.contains("invalid cashu token") == true) + default: + Issue.record("Expected error for \(bad)") + } + } + #expect(context.sentPrivateMessages.isEmpty) + #expect(context.sentPublicMessages.isEmpty) + } + + @MainActor + @Test func paySendsValidDefiniteLengthV4Token() { + let context = MockCommandContextProvider() + let peerID = PeerID(str: "abcd1234abcd1234") + context.selectedPrivateChatPeer = peerID + let processor = makePayProcessor(context: context) + + switch processor.process("/pay \(Self.validV4Token)") { + case .success(let message): + #expect(message?.contains("21 sat") == true) + default: + Issue.record("Expected success result for valid V4 token") + } + #expect(context.sentPrivateMessages.count == 1) + #expect(context.sentPrivateMessages.first?.content == Self.validV4Token) + } + /// 21-sat single-mint V3 token (proofs of 1+4+16). private static let validV3Token: String = { let json: [String: Any] = [ @@ -459,6 +498,36 @@ struct CommandProcessorTests { return "cashuA" + b64 }() + /// 21-sat single-mint definite-length V4 (CBOR) token (proofs of 1+4+16). + private static let validV4Token: String = { + func head(_ major: UInt8, _ value: UInt64) -> [UInt8] { + switch value { + case 0...23: return [(major << 5) | UInt8(value)] + case 24...0xFF: return [(major << 5) | 24, UInt8(value)] + default: return [(major << 5) | 25, UInt8(value >> 8), UInt8(value & 0xFF)] + } + } + func text(_ s: String) -> [UInt8] { head(3, UInt64(s.utf8.count)) + Array(s.utf8) } + func bytes(_ b: [UInt8]) -> [UInt8] { head(2, UInt64(b.count)) + b } + func uint(_ v: UInt64) -> [UInt8] { head(0, v) } + func array(_ items: [[UInt8]]) -> [UInt8] { head(4, UInt64(items.count)) + items.flatMap { $0 } } + func map(_ pairs: [(String, [UInt8])]) -> [UInt8] { head(5, UInt64(pairs.count)) + pairs.flatMap { text($0.0) + $0.1 } } + + let proofs = [UInt64(1), 4, 16].map { amount in + map([("a", uint(amount)), ("s", text("secret")), ("c", bytes([0x02, 0xAB, 0xCD]))]) + } + let cbor = map([ + ("m", text("https://mint.example.com")), + ("u", text("sat")), + ("t", array([map([("i", bytes([0x00, 0xAD, 0x26, 0x8C])), ("p", array(proofs))])])) + ]) + let b64 = Data(cbor).base64EncodedString() + .replacingOccurrences(of: "+", with: "-") + .replacingOccurrences(of: "/", with: "_") + .replacingOccurrences(of: "=", with: "") + return "cashuB" + b64 + }() + @MainActor private func makePayProcessor(context: MockCommandContextProvider) -> CommandProcessor { CommandProcessor( From fd2dffdda7800510199d14c670256799a25b4e96 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 21:12:18 +0200 Subject: [PATCH 016/158] Fix CI media-wipe race, per-link ping rate limiting, and /ping output routing Three fixes for PR #1377 review: 1. CI flake (sendImage_privateChatProcessesAndTransfersImage): the panicClearAllData / clearCurrentPublicTimeline detached utility-priority tasks delete the real ~/Library/Application Support/files tree, which the test process shares. The wipe fires at a nondeterministic time and raced the sendImage test's JPEG in files/images/outgoing (write then re-read), so prepareImagePacket threw and the test timed out. Both wipes are now skipped under tests (existing TestEnvironment.isRunningTests pattern); this also stops test runs from deleting the developer's real media. 2. Codex P1: ping packets are unsigned, so keying the pong rate limiter on packet.senderID let one connected peer rotate forged sender IDs to bypass the 5-per-10s budget. The limiter now keys on the ingress link (the directly connected peer that delivered the packet); the pong still goes to the claimed sender. Regression test proves rotating senders over one link exhaust one budget (fails 10 vs 5 pongs on the old code). 3. Codex P2: /ping output arrived up to 10s later and was routed from selectedPrivateChatPeer at callback time, misrouting the result after a chat switch. The origin conversation is now captured when the command is issued (CommandOutputDestination) and deferred output is routed there: a DM result lands in the origin chat's history even if deselected, and a mesh-timeline result pins to #mesh instead of the active channel. Co-Authored-By: Claude Fable 5 --- bitchat/Services/BLE/BLEService.swift | 32 +++++++--- bitchat/Services/CommandProcessor.swift | 27 ++++++-- bitchat/Services/TransportConfig.swift | 2 +- .../ChatPublicConversationCoordinator.swift | 5 ++ bitchat/ViewModels/ChatViewModel.swift | 40 ++++++++++-- bitchatTests/BLEServiceCoreTests.swift | 63 +++++++++++++++++++ bitchatTests/CommandProcessorTests.swift | 11 +++- .../Services/MeshDiagnosticsTests.swift | 49 ++++++++++++++- 8 files changed, 208 insertions(+), 21 deletions(-) diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index c3e39764..f21bc871 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -69,9 +69,11 @@ final class BLEService: NSObject { private let meshTopology = MeshTopologyTracker() // Mesh diagnostics: outstanding /ping probes keyed by nonce, plus the - // inbound per-peer ping budget so a directed unencrypted probe cannot be - // turned into an amplification primitive. Both are owned by - // collectionsQueue barriers like the other mutable collections. + // inbound ping budget — keyed by the ingress link (the directly connected + // peer that delivered the packet), since the unsigned claimed sender is + // spoofable — so a directed unencrypted probe cannot be turned into an + // amplification primitive. Both are owned by collectionsQueue barriers + // like the other mutable collections. private struct PendingMeshPing { let peerID: PeerID let sentAt: Date @@ -80,7 +82,7 @@ final class BLEService: NSObject { } private var pendingMeshPings: [Data: PendingMeshPing] = [:] private var meshPingResponseLimiter = SyncResponseRateLimiter( - maxResponses: TransportConfig.meshPingInboundMaxPerPeer, + maxResponses: TransportConfig.meshPingInboundMaxPerLink, window: TransportConfig.meshPingInboundWindowSeconds ) @@ -2474,18 +2476,25 @@ extension BLEService { /// Answers a ping addressed to us with a pong echoing its nonce; pings /// addressed elsewhere are left to the generic directed-relay path. - private func handleMeshPing(_ packet: BitchatPacket, from peerID: PeerID) { + /// + /// `linkPeerID` is the directly connected peer that delivered the packet + /// (the ingress link), NOT the packet's claimed sender: pings are + /// unsigned, so `packet.senderID` is attacker-controlled, and keying the + /// response budget on it would let one connected peer rotate forged + /// sender IDs to emit unbounded pongs. The budget is per physical link; + /// the pong still goes to the claimed sender (that's the protocol). + private func handleMeshPing(_ packet: BitchatPacket, fromLink linkPeerID: PeerID) { guard packet.recipientID == myPeerIDData else { return } guard let ping = MeshPingPayload.decode(packet.payload) else { - SecureLogger.debug("⚠️ Malformed ping from \(peerID.id.prefix(8))…", category: .session) + SecureLogger.debug("⚠️ Malformed ping via \(linkPeerID.id.prefix(8))…", category: .session) return } let allowed = collectionsQueue.sync(flags: .barrier) { - meshPingResponseLimiter.shouldRespond(to: peerID, now: Date()) + meshPingResponseLimiter.shouldRespond(to: linkPeerID, now: Date()) } guard allowed else { - if logRateLimiter.shouldLog(key: "ping-limit:\(peerID.id)") { - SecureLogger.warning("🚫 Rate-limiting pings from \(peerID.id.prefix(8))…", category: .security) + if logRateLimiter.shouldLog(key: "ping-limit:\(linkPeerID.id)") { + SecureLogger.warning("🚫 Rate-limiting pings via link \(linkPeerID.id.prefix(8))…", category: .security) } return } @@ -3357,7 +3366,10 @@ extension BLEService { handleCourierEnvelope(packet, from: peerID) case .ping: - handleMeshPing(packet, from: senderID) + // Rate limiting must key on the ingress link (`peerID`), not the + // packet-claimed sender: pings are unsigned, so `senderID` is + // attacker-controlled and rotating it would reset the budget. + handleMeshPing(packet, fromLink: peerID) case .pong: handleMeshPong(packet, from: senderID) diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index db9b07dd..9c007b41 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -22,6 +22,17 @@ struct CommandGeoParticipant { let displayName: String } +/// The conversation a command was typed into, captured when the command is +/// issued so deferred output (e.g. an async /ping result, which can arrive +/// many seconds later) lands there even if the user switches chats first. +enum CommandOutputDestination: Equatable { + /// The #mesh public timeline. Commands that defer output (/ping) are + /// mesh-only, so a non-DM origin is always the mesh timeline. + case meshTimeline + /// The private chat that was open when the command was typed. + case privateChat(PeerID) +} + /// Protocol defining what CommandProcessor needs from its context. /// This breaks the circular dependency between CommandProcessor and ChatViewModel. @MainActor @@ -49,9 +60,13 @@ protocol CommandContextProvider: AnyObject { // MARK: - System Messages func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) func addPublicSystemMessage(_ content: String) + /// The conversation the user is typing into right now. Commands that + /// finish asynchronously capture this BEFORE starting async work, so a + /// chat switch cannot misroute their deferred output. + func currentCommandDestination() -> CommandOutputDestination /// Routes deferred command output (e.g. an async /ping result) into the - /// conversation where the user typed the command. - func addCommandOutput(_ content: String) + /// conversation captured when the command was issued. + func addCommandOutput(_ content: String, to destination: CommandOutputDestination) // MARK: - Favorites /// Toggles the favorite via the unified peer flow, which persists by the @@ -373,16 +388,20 @@ final class CommandProcessor { let nickname = target.nickname let currentProvider = contextProvider + // Capture the origin conversation now: the pong can arrive up to + // meshPingTimeoutSeconds later, and reading the selected chat at + // callback time would misroute the result after a chat switch. + let destination = contextProvider?.currentCommandDestination() ?? .meshTimeline meshService?.sendMeshPing(to: target.peerID) { [weak currentProvider] result in let provider = currentProvider guard let result else { - provider?.addCommandOutput("no reply from \(nickname)") + provider?.addCommandOutput("no reply from \(nickname)", to: destination) return } let hopText: String = result.hops.map { hops in hops == 1 ? " · direct (1 hop)" : " · \(hops) hops" } ?? "" - provider?.addCommandOutput("pong from \(nickname): \(result.rttMs) ms\(hopText)") + provider?.addCommandOutput("pong from \(nickname): \(result.rttMs) ms\(hopText)", to: destination) } return .success(message: "pinging \(nickname)…") } diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 04cc0c21..da95c34e 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -18,7 +18,7 @@ enum TransportConfig { // Mesh diagnostics (/ping) static let meshPingTimeoutSeconds: TimeInterval = 10 // Give up on a probe after this window - static let meshPingInboundMaxPerPeer: Int = 5 // Inbound ping budget per peer... + static let meshPingInboundMaxPerLink: Int = 5 // Inbound ping budget per ingress link (claimed sender is spoofable)... static let meshPingInboundWindowSeconds: TimeInterval = 10 // ...per sliding window (anti-amplification) // UI / Storage Caps diff --git a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift index d6777a71..e279c454 100644 --- a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift @@ -291,6 +291,11 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { context.clearPublicConversation(ConversationID(channelID: context.activeChannel)) Task.detached(priority: .utility) { + // Skipped under tests: the test process shares the user's real + // ~/Library/Application Support/files tree, and this detached + // wipe fires at a nondeterministic time — racing tests that + // write media there (see the same guard in panicClearAllData). + guard !TestEnvironment.isRunningTests else { return } do { let base = try FileManager.default.url( for: .applicationSupportDirectory, diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index bea1e619..c09d5a6d 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1273,6 +1273,13 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele // Delete ALL media files (incoming and outgoing) in background Task.detached(priority: .utility) { + // Skipped under tests: the test process shares the user's real + // ~/Library/Application Support/files tree, and this detached + // utility-priority wipe fires at a nondeterministic time — + // deleting media that concurrently running tests (e.g. the + // sendImage flow) just wrote there, and the developer's real + // app data with it. + guard !TestEnvironment.isRunningTests else { return } do { let base = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let filesDir = base.appendingPathComponent("files", isDirectory: true) @@ -1514,11 +1521,9 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele /// Command output belongs in the conversation where the user typed the /// command; the public timeline is invisible while a DM is open. The DM /// selection is read *after* processing so commands that switch chats - /// (`/msg`) print into the conversation they just opened. Internal (not - /// private) because CommandProcessor routes deferred output (async /ping - /// results) through it via CommandContextProvider. + /// (`/msg`) print into the conversation they just opened. @MainActor - func addCommandOutput(_ content: String) { + private func addCommandOutput(_ content: String) { if let peerID = selectedPrivateChatPeer { addLocalPrivateSystemMessage(content, to: peerID) } else { @@ -1526,6 +1531,33 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele } } + /// Origin conversation for deferred command output, captured when the + /// command is issued (before any async work starts). + @MainActor + func currentCommandDestination() -> CommandOutputDestination { + if let peerID = selectedPrivateChatPeer { + return .privateChat(peerID) + } + // Deferring commands (/ping) are rejected in geohash channels, so a + // non-DM origin is always the #mesh timeline. + return .meshTimeline + } + + /// Routes deferred command output (async /ping results) into the + /// conversation captured at issue time, immune to chat switches in the + /// meantime. A DM result lands in the origin chat's history even if that + /// chat is no longer selected (or was cleared — it then reappears as the + /// first message when the chat is reopened). + @MainActor + func addCommandOutput(_ content: String, to destination: CommandOutputDestination) { + switch destination { + case .privateChat(let peerID): + addLocalPrivateSystemMessage(content, to: peerID) + case .meshTimeline: + publicConversationCoordinator.addMeshOnlySystemMessage(content) + } + } + // MARK: - Message Reception @MainActor diff --git a/bitchatTests/BLEServiceCoreTests.swift b/bitchatTests/BLEServiceCoreTests.swift index fe7624ec..6a9cdfc1 100644 --- a/bitchatTests/BLEServiceCoreTests.swift +++ b/bitchatTests/BLEServiceCoreTests.swift @@ -216,6 +216,69 @@ struct BLEServiceCoreTests { cachedServiceUUIDs: [BLEService.serviceUUID, otherService] )) } + + /// Pings are unsigned, so their claimed sender is attacker-controlled. + /// The pong budget must be keyed on the ingress link (the directly + /// connected peer that delivered the packet): rotating forged sender IDs + /// over one link exhausts one budget instead of resetting it, so a single + /// malicious link cannot turn /ping into an amplification primitive. + @Test + func meshPingResponseBudget_isPerIngressLinkNotClaimedSender() async throws { + let ble = makeService() + let outbound = OutboundPacketTap() + ble._test_onOutboundPacket = outbound.record + + let link = PeerID(str: "1122334455667788") + let budget = TransportConfig.meshPingInboundMaxPerLink + let myRecipientData = try #require(Data(hexString: ble.myPeerID.id)) + + for i in 0..<(budget * 2) { + // A fresh forged sender for every ping, all arriving on one link. + let forgedSender = PeerID(str: String(format: "%016x", 0xA0_0000 + i)) + var nonce = Data(repeating: 0, count: MeshPingPayload.nonceLength) + nonce[0] = UInt8(i) + let payload = try #require(MeshPingPayload(nonce: nonce, originTTL: 7)) + let packet = BitchatPacket( + type: MessageType.ping.rawValue, + senderID: Data(hexString: forgedSender.id) ?? Data(), + recipientID: myRecipientData, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload.encode(), + signature: nil, + ttl: 7 + ) + ble._test_handlePacket(packet, fromPeerID: link, preseedPeer: false) + } + + let reachedBudget = await TestHelpers.waitUntil( + { outbound.count(ofType: .pong) >= budget }, + timeout: TestConstants.defaultTimeout + ) + #expect(reachedBudget) + // Give any over-budget pong a chance to surface, then confirm the + // rotated sender IDs never bought a sixth response. + let exceededBudget = await TestHelpers.waitUntil( + { outbound.count(ofType: .pong) > budget }, + timeout: TestConstants.shortTimeout + ) + #expect(!exceededBudget) + #expect(outbound.count(ofType: .pong) == budget) + } +} + +/// Thread-safe capture of packets leaving the service under test. +private final class OutboundPacketTap { + private let lock = NSLock() + private var packets: [BitchatPacket] = [] + + func record(_ packet: BitchatPacket) { + lock.lock(); packets.append(packet); lock.unlock() + } + + func count(ofType type: MessageType) -> Int { + lock.lock(); defer { lock.unlock() } + return packets.filter { $0.type == type.rawValue }.count + } } private func makeService() -> BLEService { diff --git a/bitchatTests/CommandProcessorTests.swift b/bitchatTests/CommandProcessorTests.swift index f5eab5f4..62899d3a 100644 --- a/bitchatTests/CommandProcessorTests.swift +++ b/bitchatTests/CommandProcessorTests.swift @@ -436,6 +436,7 @@ private final class MockCommandContextProvider: CommandContextProvider { private(set) var localPrivateSystemMessages: [(content: String, peerID: PeerID)] = [] private(set) var publicSystemMessages: [String] = [] private(set) var commandOutputs: [String] = [] + private(set) var commandOutputDestinations: [CommandOutputDestination] = [] private(set) var toggledFavorites: [PeerID] = [] private(set) var favoriteNotifications: [(peerID: PeerID, isFavorite: Bool)] = [] @@ -486,8 +487,16 @@ private final class MockCommandContextProvider: CommandContextProvider { publicSystemMessages.append(content) } - func addCommandOutput(_ content: String) { + func currentCommandDestination() -> CommandOutputDestination { + if let peerID = selectedPrivateChatPeer { + return .privateChat(peerID) + } + return .meshTimeline + } + + func addCommandOutput(_ content: String, to destination: CommandOutputDestination) { commandOutputs.append(content) + commandOutputDestinations.append(destination) } func toggleFavorite(peerID: PeerID) { diff --git a/bitchatTests/Services/MeshDiagnosticsTests.swift b/bitchatTests/Services/MeshDiagnosticsTests.swift index 142474f4..af22d393 100644 --- a/bitchatTests/Services/MeshDiagnosticsTests.swift +++ b/bitchatTests/Services/MeshDiagnosticsTests.swift @@ -129,6 +129,44 @@ struct MeshDiagnosticsTests { #expect(context.commandOutputs == ["no reply from alice"]) } + @MainActor + @Test func pingOutputRoutesToConversationWhereCommandWasIssued() async { + let context = DiagnosticsMockContext() + let alice = PeerID(str: "abcd1234abcd1234") + let bob = PeerID(str: "b0b0b0b0b0b0b0b0") + context.nicknameToPeerID["alice"] = alice + let transport = MockTransport() + transport.meshPingResult = MeshPingResult(rttMs: 42, hops: 2) + let processor = makeProcessor(context: context, transport: transport) + + // Issue the ping from bob's DM, then switch chats before the async + // result lands. The output must follow the origin conversation, not + // whatever is selected at callback time. + context.selectedPrivateChatPeer = bob + _ = processor.process("/ping @alice") + context.selectedPrivateChatPeer = nil + + await waitForCommandOutput(context) + #expect(context.commandOutputDestinations == [.privateChat(bob)]) + } + + @MainActor + @Test func pingIssuedFromPublicTimelineRoutesToMeshTimeline() async { + let context = DiagnosticsMockContext() + let alice = PeerID(str: "abcd1234abcd1234") + context.nicknameToPeerID["alice"] = alice + let transport = MockTransport() + transport.meshPingResult = MeshPingResult(rttMs: 7, hops: 1) + let processor = makeProcessor(context: context, transport: transport) + + _ = processor.process("/ping @alice") + // Opening a DM afterwards must not swallow the public-timeline result. + context.selectedPrivateChatPeer = alice + + await waitForCommandOutput(context) + #expect(context.commandOutputDestinations == [.meshTimeline]) + } + // MARK: - /trace @MainActor @@ -225,6 +263,7 @@ private final class DiagnosticsMockContext: CommandContextProvider { var nicknameToPeerID: [String: PeerID] = [:] private(set) var commandOutputs: [String] = [] + private(set) var commandOutputDestinations: [CommandOutputDestination] = [] func getPeerIDForNickname(_ nickname: String) -> PeerID? { nicknameToPeerID[nickname] @@ -241,7 +280,15 @@ private final class DiagnosticsMockContext: CommandContextProvider { func addPublicSystemMessage(_ content: String) {} func toggleFavorite(peerID: PeerID) {} - func addCommandOutput(_ content: String) { + func currentCommandDestination() -> CommandOutputDestination { + if let peerID = selectedPrivateChatPeer { + return .privateChat(peerID) + } + return .meshTimeline + } + + func addCommandOutput(_ content: String, to destination: CommandOutputDestination) { commandOutputs.append(content) + commandOutputDestinations.append(destination) } } From 9ae440be6afbad1d8dc57b83c95d3f57ce93b235 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 21:12:52 +0200 Subject: [PATCH 017/158] Geohash: serialize PoW sends so order matches send order Two location-channel sends back-to-back only cancelled the previous mining task and started a new one. Cancellation merely *expedites* NIP-13 mining (the target is polled and steps down; it never aborts the send), so the cancelled task still appended + relayed once mining returned. Both tasks ran concurrently and the second (shorter to mine) could finish first, reordering messages in the timeline and on relays. Chain the mining tasks: each geohash send captures the previous send's task, cancels it (to expedite, so delays never stack), and awaits its completion before it echoes and relays. Order is now always send order. The >2s mining cap is preserved: cancellation expedites the awaited task, so a send is never blocked beyond NostrPoW.miningTimeCap. Test: two rapid sends where the first mines longer (larger content) still land in send order for both the local echo and the relayed events. Co-Authored-By: Claude Fable 5 --- .../ViewModels/ChatOutgoingCoordinator.swift | 14 +++++++-- .../ChatOutgoingCoordinatorContextTests.swift | 31 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/bitchat/ViewModels/ChatOutgoingCoordinator.swift b/bitchat/ViewModels/ChatOutgoingCoordinator.swift index b53de6c9..8d8b6a9e 100644 --- a/bitchat/ViewModels/ChatOutgoingCoordinator.swift +++ b/bitchat/ViewModels/ChatOutgoingCoordinator.swift @@ -157,10 +157,18 @@ private extension ChatOutgoingCoordinator { let teleported = context.isTeleported let nickname = context.nickname - // A newer send expedites the previous one's mining so sends keep - // their order and mining delays never stack. - geohashMiningTask?.cancel() + // Serialize geohash sends: each send awaits the previous send's task + // before it appends + relays, so user-visible order always matches + // send order even when an earlier message mines longer than a later + // one. Cancelling the previous task only *expedites* its mining (the + // NIP-13 target is polled, not aborted), so it still finishes and + // sends — and it finishes fast, so awaiting it never stacks mining + // delays or blocks a send beyond `NostrPoW.miningTimeCap`. + let previousSend = geohashMiningTask + previousSend?.cancel() geohashMiningTask = Task { @MainActor [weak context = self.context] in + await previousSend?.value + let event: NostrEvent do { event = try await NostrProtocol.createMinedEphemeralGeohashEvent( diff --git a/bitchatTests/ChatOutgoingCoordinatorContextTests.swift b/bitchatTests/ChatOutgoingCoordinatorContextTests.swift index e8d11baa..25aa8300 100644 --- a/bitchatTests/ChatOutgoingCoordinatorContextTests.swift +++ b/bitchatTests/ChatOutgoingCoordinatorContextTests.swift @@ -218,4 +218,35 @@ struct ChatOutgoingCoordinatorContextTests { #expect(context.appendedPublicMessages.count == 1) #expect(context.sentGeohashContexts.count == 1) } + + @Test @MainActor + func sendMessage_onLocationChannel_serializesRapidSendsInSendOrder() async { + let context = MockChatOutgoingContext() + let coordinator = ChatOutgoingCoordinator(context: context) + let channel = GeohashChannel(level: .city, geohash: "u4pruydq") + context.activeChannel = .location(channel) + + // Two back-to-back sends. The first carries much larger content, so + // its NIP-13 mining hashes a bigger event per attempt and runs longer + // than the second's. Without serialization the second (faster) task + // could finish first and reorder both the local timeline and the + // relayed events. The coordinator chains the mining tasks — each send + // awaits the previous send's task before it echoes and relays — so the + // visible order must always match the send order. + let first = "first " + String(repeating: "x", count: 4000) + let second = "second" + coordinator.sendMessage(first) + coordinator.sendMessage(second) + + // The stored task is the second send, which awaits the first. + await coordinator.geohashMiningTask?.value + await drainMainActorTasks() + + // Local echoes land in send order… + #expect(context.appendedPublicMessages.map(\.message.content) == [first, second]) + // …and so do the relayed events (IDs match the echoes 1:1, in order). + #expect(context.sentGeohashContexts.count == 2) + #expect(context.sentGeohashContexts.map(\.event.id) + == context.appendedPublicMessages.map(\.message.id)) + } } From d4594b95040d048cde3bffe4d716373e5fbea427 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 21:13:10 +0200 Subject: [PATCH 018/158] Gateway: harden downlink freshness, uplink verify ordering, and drain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes the confirmed downlink/uplink defects from the PR #1384 review + Codex findings: - Downlink age + #g gate (Codex P2 / review #1): rebroadcastRelayEvent now drops events outside the same freshness window receivers enforce and whose #g tag mismatches the carrier geohash, BEFORE spending any budget — so a 1h/200-event channel-resubscribe backfill no longer burns the 30/min BLE budget on events every receiver drops. - Rate-limit + dedup before Schnorr (review #2): handleUplinkDeposit now runs cheap structural checks + carried-ID dedup + rate-token consume before isValidSignature(), so a replay flood is bounded by cheap work instead of unbounded main-actor verifies. - Quota-dropped deposits not rendered (review #3): enqueueUplink reports acceptance and injectInbound only fires for events actually published/queued, ending the local-timeline divergence. - Drain timer + mark-after-send (Codex P2 / review #4): a burst beyond budget now arms a timer to drain when the window frees; rebroadcast IDs are marked only after an event is actually sent, so overflow- dropped events stay retryable. - Symmetric publish path (review #5): the gateway publish closure now refuses when no geo relay is known, matching the local send path instead of publishing dead traffic to default relays. - Loop-rule doc (review #7): softened to reflect that rule 3 is a call-site convention with unit-tested backstops; added tests for the publishedEventIDs backstop, downlink freshness/mismatch, drain timer, and quota-drop non-injection. Co-Authored-By: Claude Fable 5 --- bitchat/Services/Gateway/GatewayService.swift | 149 ++++++++++++++---- .../ChatViewModelBootstrapper.swift | 12 +- .../Services/GatewayServiceTests.swift | 95 +++++++++++ 3 files changed, 225 insertions(+), 31 deletions(-) diff --git a/bitchat/Services/Gateway/GatewayService.swift b/bitchat/Services/Gateway/GatewayService.swift index 20924589..e325cb39 100644 --- a/bitchat/Services/Gateway/GatewayService.swift +++ b/bitchat/Services/Gateway/GatewayService.swift @@ -30,7 +30,7 @@ import Foundation /// - Carried contents are public geohash chat, already plaintext on Nostr, /// so the mesh carrier adds no confidentiality loss. /// -/// Loop-prevention rules (each enforced here and unit-tested): +/// Loop-prevention rules: /// 1. An event learned from a `fromGateway` mesh broadcast is never /// re-published to relays, never re-uplinked, and never rebroadcast /// (`meshBroadcastEventIDs`), so a second gateway on the same mesh cannot @@ -41,7 +41,10 @@ import Foundation /// repeat deposits and relay echoes are absorbed. /// 3. Uplink is only attempted for locally composed events at the send site /// (`GeohashSubscriptionManager.sendGeohash`); events received over the -/// carrier never re-enter the uplink path. +/// carrier never re-enter the uplink path. This is a call-site convention; +/// the `meshBroadcastEventIDs`/`publishedEventIDs` backstops in +/// `uplinkViaMesh` enforce it defensively and are unit-tested. +/// Rules 1 and 2 are enforced here and unit-tested. /// Rebroadcast storms at the mesh layer are additionally bounded by the BLE /// `MessageDeduplicator` and packet TTL, and receivers dedup carried events /// against their own relay subscriptions via the Nostr event-ID cache in @@ -59,9 +62,9 @@ final class GatewayService: ObservableObject { /// Uplink deposits accepted per depositor per minute. static let uplinkEventsPerMinutePerDepositor = 10 /// Downlink mesh rebroadcasts per minute — BLE airtime is precious. - /// Beyond the budget events queue (bounded, drop-oldest) and drain as - /// the window frees; a busy channel triggers frequent drains, a quiet - /// one never queues. + /// Beyond the budget events queue (bounded, drop-oldest) and drain on + /// a scheduled timer once the window frees (also re-driven by the next + /// inbound relay event); a quiet channel does not strand its backlog. static let downlinkEventsPerMinute = 30 static let maxPendingDownlinks = 30 /// Accepted clock skew for a carried ephemeral event; anything older @@ -105,6 +108,9 @@ final class GatewayService: ObservableObject { /// Fired on toggle changes (advertise/withdraw the capability bit and /// force a re-announce). var onEnabledChanged: (@MainActor (Bool) -> Void)? + /// Schedules a downlink-drain closure to run after a delay. Injected so + /// the drain timer is deterministic in tests; nil arms a real `Task`. + var scheduleDrainTimer: (@MainActor (TimeInterval, @escaping @MainActor () -> Void) -> Void)? // MARK: State @@ -119,6 +125,8 @@ final class GatewayService: ObservableObject { private var uplinkDepositTimes: [PeerID: [Date]] = [:] private var downlinkSendTimes: [Date] = [] private var pendingDownlinks: [(event: NostrEvent, geohash: String)] = [] + /// True while a drain timer is armed, so a burst schedules at most one. + private var downlinkDrainScheduled = false private let defaults: UserDefaults private let now: () -> Date @@ -174,32 +182,49 @@ final class GatewayService: ObservableObject { private func handleUplinkDeposit(_ carrier: NostrCarrierPacket, from depositor: PeerID) { guard isEnabled else { return } - guard let event = validatedEvent(from: carrier) else { + // Cheap structural checks first (parse, size, geohash, kind, #g tag, + // age) — no crypto — so junk and stale replays are dropped before we + // ever pay for a MainActor Schnorr verify. + guard let event = structurallyValidEvent(from: carrier) else { SecureLogger.debug("🌐 Gateway: rejected uplink deposit from \(depositor.id.prefix(8))… (failed validation)", category: .security) return } - // Loop rule 1: events learned from a fromGateway broadcast are - // mesh-carried; a gateway must never re-publish them. - guard !meshBroadcastEventIDs.contains(event.id) else { return } - // Loop rule 2: repeat deposits of an already handled event are absorbed. - guard !publishedEventIDs.contains(event.id), + // Dedup by the carried event ID BEFORE verification. Loop rule 1: a + // fromGateway-learned event is mesh-carried and must never be + // re-published. Loop rule 2: repeat deposits of an already handled + // event are absorbed. A replay of one valid deposit is short-circuited + // here without a per-packet signature verify. + guard !meshBroadcastEventIDs.contains(event.id), + !publishedEventIDs.contains(event.id), !queuedUplinks.contains(where: { $0.event.id == event.id }) else { return } + // Consume the per-depositor rate token BEFORE the expensive verify so + // a flood of distinct forged/junk deposits is bounded by cheap work, + // not by main-actor Schnorr verifications. guard allowUplinkDeposit(from: depositor) else { SecureLogger.debug("🌐 Gateway: rate-limited uplink deposit from \(depositor.id.prefix(8))…", category: .session) return } - - if relaysConnected?() ?? false { - publish(event, geohash: carrier.geohash) - } else { - enqueueUplink(QueuedUplink(depositor: depositor, geohash: carrier.geohash, event: event, queuedAt: now())) + // Only now pay for cryptographic verification; receivers verify again. + guard event.isValidSignature() else { + SecureLogger.debug("🌐 Gateway: rejected uplink deposit from \(depositor.id.prefix(8))… (bad signature)", category: .security) + return } - // Show the carried message on our own timeline when we're viewing - // that geohash; the relay echo (if any) dedups in the pipeline. - if currentGeohash?() == carrier.geohash { + let accepted: Bool + if relaysConnected?() ?? false { + publish(event, geohash: carrier.geohash) + accepted = true + } else { + accepted = enqueueUplink(QueuedUplink(depositor: depositor, geohash: carrier.geohash, event: event, queuedAt: now())) + } + + // Only render on our own timeline what we actually accepted for + // publish or queue: a quota-dropped deposit is never published and, + // being directed, no other peer will ever see it, so showing it would + // diverge our timeline permanently from what reached the channel. + if accepted, currentGeohash?() == carrier.geohash { injectInbound?(event) } } @@ -221,16 +246,19 @@ final class GatewayService: ObservableObject { SecureLogger.info("🌐 Gateway: published carried event \(event.id.prefix(8))… to relays for #\(geohash)", category: .session) } - private func enqueueUplink(_ item: QueuedUplink) { + /// Returns true when the item was actually stored for later publish. + @discardableResult + private func enqueueUplink(_ item: QueuedUplink) -> Bool { let fromDepositor = queuedUplinks.filter { $0.depositor == item.depositor }.count guard fromDepositor < Limits.maxQueuedUplinksPerDepositor else { SecureLogger.debug("🌐 Gateway: uplink queue quota reached for \(item.depositor.id.prefix(8))…", category: .session) - return + return false } if queuedUplinks.count >= Limits.maxQueuedUplinks { queuedUplinks.removeFirst(queuedUplinks.count - Limits.maxQueuedUplinks + 1) } queuedUplinks.append(item) + return true } private func allowUplinkDeposit(from depositor: PeerID) -> Bool { @@ -258,19 +286,35 @@ final class GatewayService: ObservableObject { func rebroadcastRelayEvent(_ event: NostrEvent, geohash: String) { guard isEnabled, broadcastToMesh != nil else { return } guard event.kind == NostrProtocol.EventKind.ephemeralEvent.rawValue else { return } + // Freshness + geohash gate BEFORE spending any budget. A channel + // (re)subscribe backfills up to an hour of history (limit 200), but + // every receiver's `validatedEvent` drops anything older than the + // same window — so rebroadcasting backfill would burn the whole + // per-minute budget on events no mesh peer accepts. Also require the + // event's own `#g` tag to match the carrier geohash. + guard isFresh(event), + event.tags.contains(where: { $0.count >= 2 && $0[0] == "g" && $0[1] == geohash }) else { + return + } // Loop rule 1: never rebroadcast mesh-carried events back onto the - // mesh. Loop rule 2: rebroadcast each relay event at most once. + // mesh. Loop rule 2: rebroadcast each relay event at most once — but + // mark only AFTER it is actually sent (in `drainPendingDownlinks`), so + // an event dropped by the queue overflow stays retryable on relay + // redelivery. Guard against a redelivery re-queueing an event that is + // still waiting to be sent. guard !meshBroadcastEventIDs.contains(event.id), - !rebroadcastEventIDs.contains(event.id) else { + !rebroadcastEventIDs.contains(event.id), + !pendingDownlinks.contains(where: { $0.event.id == event.id }) else { return } // Verify before spending BLE airtime; receivers verify again. guard event.isValidSignature() else { return } - rebroadcastEventIDs.insert(event.id) pendingDownlinks.append((event, geohash)) if pendingDownlinks.count > Limits.maxPendingDownlinks { - // Bandwidth guard: drop-oldest — fresher chat is worth more. + // Bandwidth guard: drop-oldest — fresher chat is worth more. The + // dropped event is not yet in `rebroadcastEventIDs`, so a later + // relay redelivery can still carry it. pendingDownlinks.removeFirst(pendingDownlinks.count - Limits.maxPendingDownlinks) } drainPendingDownlinks() @@ -282,11 +326,44 @@ final class GatewayService: ObservableObject { while !pendingDownlinks.isEmpty, downlinkSendTimes.count < Limits.downlinkEventsPerMinute { let (event, geohash) = pendingDownlinks.removeFirst() + // A queued event may have aged past the window while it waited; + // don't burn airtime on what receivers would now drop. + guard isFresh(event) else { continue } guard let carrier = NostrCarrierPacket(direction: .fromGateway, geohash: geohash, event: event), let payload = carrier.encode() else { continue } broadcastToMesh?(payload) + // Mark-after-send: only now is the relay event definitively + // rebroadcast (loop rule 2). + rebroadcastEventIDs.insert(event.id) downlinkSendTimes.append(now()) } + // Budget exhausted with events still queued: arm a timer to drain when + // the window frees, instead of stranding them until the next inbound + // relay event (which may never come on a channel that went quiet). + scheduleDownlinkDrainIfNeeded() + } + + /// Arms a single timer to drain the backlog once the per-minute window + /// frees. No-op when nothing is pending or a drain is already scheduled. + private func scheduleDownlinkDrainIfNeeded() { + guard !pendingDownlinks.isEmpty, !downlinkDrainScheduled else { return } + // The window frees when the oldest recorded send ages out of 60s. + let oldest = downlinkSendTimes.min() ?? now() + let delay = max(0.05, 60 - now().timeIntervalSince(oldest)) + downlinkDrainScheduled = true + let fire: @MainActor () -> Void = { [weak self] in + guard let self else { return } + self.downlinkDrainScheduled = false + self.drainPendingDownlinks() + } + if let scheduleDrainTimer { + scheduleDrainTimer(delay, fire) + } else { + Task { @MainActor in + try? await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000)) + fire() + } + } } // MARK: - Downlink (receiver role: carried event arrives over mesh) @@ -341,18 +418,36 @@ final class GatewayService: ObservableObject { /// before a gateway publishes it or a receiver displays it. Ordered /// cheap-first; Schnorr verification runs last. private func validatedEvent(from carrier: NostrCarrierPacket) -> NostrEvent? { + guard let event = structurallyValidEvent(from: carrier), + event.isValidSignature() else { + return nil + } + return event + } + + /// The cheap half of `validatedEvent`: parse + size + geohash + kind + + /// `#g` tag + freshness, with NO signature verification. Callers that can + /// dedup or rate-limit on the carried ID run this first so the expensive + /// Schnorr verify is reached only for events that survive the cheap gates. + private func structurallyValidEvent(from carrier: NostrCarrierPacket) -> NostrEvent? { guard carrier.eventJSON.count <= NostrCarrierPacket.maxEventJSONBytes, Self.isValidGeohash(carrier.geohash), let event = carrier.event(), event.kind == NostrProtocol.EventKind.ephemeralEvent.rawValue, event.tags.contains(where: { $0.count >= 2 && $0[0] == "g" && $0[1] == carrier.geohash }), - abs(now().timeIntervalSince1970 - TimeInterval(event.created_at)) <= Limits.maxEventAgeSeconds, - event.isValidSignature() else { + isFresh(event) else { return nil } return event } + /// True when `event.created_at` is within the accepted clock skew — the + /// SAME freshness window receivers enforce, so a gateway never spends + /// airtime on events every receiver would drop as stale. + private func isFresh(_ event: NostrEvent) -> Bool { + abs(now().timeIntervalSince1970 - TimeInterval(event.created_at)) <= Limits.maxEventAgeSeconds + } + static func isValidGeohash(_ geohash: String) -> Bool { let allowed = Set("0123456789bcdefghjkmnpqrstuvwxyz") return (1...NostrCarrierPacket.maxGeohashLength).contains(geohash.count) diff --git a/bitchat/ViewModels/ChatViewModelBootstrapper.swift b/bitchat/ViewModels/ChatViewModelBootstrapper.swift index d1b73f0e..caca90ec 100644 --- a/bitchat/ViewModels/ChatViewModelBootstrapper.swift +++ b/bitchat/ViewModels/ChatViewModelBootstrapper.swift @@ -260,11 +260,15 @@ private extension ChatViewModelBootstrapper { toGeohash: geohash, count: TransportConfig.nostrGeoRelayCount ) - if relays.isEmpty { - NostrRelayManager.shared.sendEvent(event) - } else { - NostrRelayManager.shared.sendEvent(event, to: relays) + // Symmetric with the local send path (GeohashSubscriptionManager + // .sendGeohash): with no known geo relay, refuse rather than + // publish to default relays no geo subscriber reads — that would + // be silent dead traffic, not delivery. + guard !relays.isEmpty else { + SecureLogger.warning("🌐 Gateway: no geo relays for #\(geohash); not publishing carried event", category: .session) + return } + NostrRelayManager.shared.sendEvent(event, to: relays) } gateway.broadcastToMesh = { [weak bleService] payload in bleService?.broadcastNostrCarrier(payload) diff --git a/bitchatTests/Services/GatewayServiceTests.swift b/bitchatTests/Services/GatewayServiceTests.swift index 0372c410..8cecc6ec 100644 --- a/bitchatTests/Services/GatewayServiceTests.swift +++ b/bitchatTests/Services/GatewayServiceTests.swift @@ -34,6 +34,7 @@ struct GatewayServiceTests { private(set) var injected: [NostrEvent] = [] private(set) var uplinkSends: [(payload: Data, peer: PeerID)] = [] private(set) var enabledChanges: [Bool] = [] + private(set) var scheduledDrains: [(delay: TimeInterval, work: @MainActor () -> Void)] = [] private let clock = ClockBox() let defaults: UserDefaults @@ -60,6 +61,11 @@ struct GatewayServiceTests { service.currentGeohash = { [weak self] in self?.currentGeohash } service.injectInbound = { [weak self] event in self?.injected.append(event) } service.onEnabledChanged = { [weak self] enabled in self?.enabledChanges.append(enabled) } + // Capture drain timers instead of arming a real Task so the drain + // is deterministic under the fake clock. + service.scheduleDrainTimer = { [weak self] delay, work in + self?.scheduledDrains.append((delay, work)) + } if enabled { service.setEnabled(true) } @@ -68,6 +74,14 @@ struct GatewayServiceTests { func advance(_ seconds: TimeInterval) { clock.now = clock.now.addingTimeInterval(seconds) } + + /// Fires every currently-scheduled drain timer (simulating the window + /// freeing), as the real Task would after its delay. + func fireScheduledDrains() { + let due = scheduledDrains + scheduledDrains.removeAll() + for item in due { item.work() } + } } // MARK: Event helpers @@ -258,6 +272,27 @@ struct GatewayServiceTests { #expect(fixture.published.count == 1) } + @Test("a quota-dropped deposit is not rendered on the local timeline") + func quotaDroppedDepositNotInjected() throws { + let fixture = Fixture() + fixture.relaysConnected = false + let depositor = PeerID(str: "1111111111111111") + + // Fill this depositor's offline queue to its per-depositor cap; each + // accepted deposit is rendered locally (we view that geohash). + for _ in 0.. Date: Mon, 6 Jul 2026 21:13:29 +0200 Subject: [PATCH 019/158] Fix CI deadlock in vouch tests and live-refresh the fingerprint sheet on vouch acceptance Two fixes for PR #1380 review findings: 1. CI "Run Swift Tests (app)" hang (exit 137): the new SecureIdentityStateManagerVouchTests suite was nonisolated, so Swift Testing ran its tests in parallel on the Swift Concurrency cooperative pool. Each test enqueues a queue.async(.barrier) write (setVerified) and immediately blocks in queue.sync / queue.sync(.barrier) (recordVouch / effectiveTrustLevel). On CI's few-core runners every cooperative-pool thread ended up parked behind a pending barrier that never got a dispatch worker, deadlocking the whole test process until the watchdog SIGKILLed it. The suite is now @MainActor, matching the production isolation of the vouch API (ChatVouchCoordinator is @MainActor) and keeping blocking syncs off the cooperative pool. 2. Codex P2: an open fingerprint sheet did not refresh its vouched badge when a vouch batch was accepted - VerificationModel.bind() never observed the trust-change signal. It now subscribes to the "peerStatusUpdated" notification that ChatVouchCoordinator.notifyPeerTrustChanged() posts (same source PeerListModel uses) and forwards it to objectWillChange. Added a regression test that pins VerificationModel's own subscription (verified to fail without the fix). Co-Authored-By: Claude Fable 5 --- bitchat/App/VerificationModel.swift | 11 ++++++ bitchatTests/AppArchitectureTests.swift | 39 +++++++++++++++++++ ...SecureIdentityStateManagerVouchTests.swift | 9 +++++ 3 files changed, 59 insertions(+) diff --git a/bitchat/App/VerificationModel.swift b/bitchat/App/VerificationModel.swift index a1c7cd1c..5916a958 100644 --- a/bitchat/App/VerificationModel.swift +++ b/bitchat/App/VerificationModel.swift @@ -150,6 +150,17 @@ final class VerificationModel: ObservableObject { self?.objectWillChange.send() } .store(in: &cancellables) + + // Vouch state changes (ChatVouchCoordinator.notifyPeerTrustChanged) + // are signalled via this notification rather than a published + // property, so an open fingerprint sheet refreshes its vouched badge + // live when a vouch batch is accepted. + NotificationCenter.default.publisher(for: Notification.Name("peerStatusUpdated")) + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.objectWillChange.send() + } + .store(in: &cancellables) } private func resolveDisplayName(for peerID: PeerID, statusPeerID: PeerID) -> String { diff --git a/bitchatTests/AppArchitectureTests.swift b/bitchatTests/AppArchitectureTests.swift index 0b70f0e4..69b7fc89 100644 --- a/bitchatTests/AppArchitectureTests.swift +++ b/bitchatTests/AppArchitectureTests.swift @@ -591,6 +591,45 @@ struct AppArchitectureTests { #expect(!verificationModel.isVerified(peerID: peerID)) } + @Test("VerificationModel refreshes when peer trust changes (vouch accepted)") + @MainActor + func verificationModelRefreshesOnPeerTrustChange() async { + let viewModel = makeArchitectureViewModel() + var privateConversationModel: PrivateConversationModel? = PrivateConversationModel( + chatViewModel: viewModel, + conversations: viewModel.conversations, + locationChannelsModel: LocationChannelsModel(manager: makeArchitectureLocationManager()) + ) + let verificationModel = VerificationModel( + chatViewModel: viewModel, + privateConversationModel: privateConversationModel! + ) + + // PrivateConversationModel happens to observe the same notification + // and re-assign its published selection, which would ripple into + // VerificationModel; release it so this test pins VerificationModel's + // own subscription rather than that incidental chain. + privateConversationModel = nil + + // The bound @Published sources replay their current values on + // subscription; let those initial main-queue emissions settle so the + // sink below observes only the trust-change signal. + try? await Task.sleep(nanoseconds: 100_000_000) + + // ChatVouchCoordinator.notifyPeerTrustChanged() signals accepted + // vouches via "peerStatusUpdated"; an open fingerprint sheet must + // re-render its vouched badge from that signal alone. + var refreshed = false + let cancellable = verificationModel.objectWillChange.sink { _ in + refreshed = true + } + defer { cancellable.cancel() } + + NotificationCenter.default.post(name: Notification.Name("peerStatusUpdated"), object: nil) + await waitUntil { refreshed } + #expect(refreshed) + } + @Test("PeerListModel publishes mesh and geohash directory state") @MainActor func peerListModelPublishesDirectoryState() async { diff --git a/bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift b/bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift index 9984e09f..6ab46490 100644 --- a/bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift +++ b/bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift @@ -9,6 +9,15 @@ import Testing /// Ordering note: mutations use barrier blocks on the manager's concurrent /// queue and reads use `queue.sync`, so a read submitted after a mutation /// always observes it — no polling needed. +/// +/// `@MainActor` matches production (the manager's vouch API is driven by the +/// main-actor `ChatVouchCoordinator`) and keeps the blocking `queue.sync` +/// reads off the Swift Concurrency cooperative pool. Left nonisolated, Swift +/// Testing runs these tests in parallel on that pool, and on CI's few-core +/// runners every pool thread ended up parked in `queue.sync` behind a pending +/// `queue.async(.barrier)` write that never got a dispatch worker — a +/// process-wide deadlock (watchdog SIGKILL, exit 137). +@MainActor struct SecureIdentityStateManagerVouchTests { private let voucher = String(repeating: "0a", count: 32) private let vouchee = String(repeating: "0b", count: 32) From 385e9e2aab7fbd99abd944d1dec39ab3987d344a Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 21:16:11 +0200 Subject: [PATCH 020/158] Skip media-wipe detached tasks under tests (shared-filesystem race) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit panicClearAllData and clearCurrentPublicTimeline delete the real ~/Library/Application Support/files tree in detached utility-priority tasks. The SPM test process shares that tree and ChatViewModelTests invoke both methods, so under parallel scheduling the wipe lands at a nondeterministic time — deleting media a concurrently running test just wrote (and the developer's real app data with it). Guard both with the existing TestEnvironment.isRunningTests pattern, mirroring the same fix on feat/mesh-diagnostics (#1377). Co-Authored-By: Claude Fable 5 --- bitchat/ViewModels/ChatPublicConversationCoordinator.swift | 5 +++++ bitchat/ViewModels/ChatViewModel.swift | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift index d6777a71..e279c454 100644 --- a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift @@ -291,6 +291,11 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { context.clearPublicConversation(ConversationID(channelID: context.activeChannel)) Task.detached(priority: .utility) { + // Skipped under tests: the test process shares the user's real + // ~/Library/Application Support/files tree, and this detached + // wipe fires at a nondeterministic time — racing tests that + // write media there (see the same guard in panicClearAllData). + guard !TestEnvironment.isRunningTests else { return } do { let base = try FileManager.default.url( for: .applicationSupportDirectory, diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index cedfc816..51f55d8c 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1274,6 +1274,13 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele // Delete ALL media files (incoming and outgoing) in background Task.detached(priority: .utility) { + // Skipped under tests: the test process shares the user's real + // ~/Library/Application Support/files tree, and this detached + // utility-priority wipe fires at a nondeterministic time — + // deleting media that concurrently running tests (e.g. the + // sendImage flow) just wrote there, and the developer's real + // app data with it. + guard !TestEnvironment.isRunningTests else { return } do { let base = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let filesDir = base.appendingPathComponent("files", isDirectory: true) From ccccb2dd8c167e3ce4e99aac369b225f71d6eb27 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 21:17:15 +0200 Subject: [PATCH 021/158] Private groups: fix TLV truncation, roster downgrade, removal notice, block, media, signable bytes Addresses the Codex review and adversarial-review findings on #1383: - TLV encoding now throws GroupTLVError.valueTooLong instead of clamping to 65535 and truncating, so an oversize group message fails to seal and surfaces send_failed rather than shipping ciphertext recipients drop. - Roster nicknames truncate on a Character boundary (never mid-scalar), so a multi-byte nickname can no longer make the whole signed roster undecodable. - Invites now bump the epoch (rotate the key) like removals, giving every roster change a strictly-increasing epoch so out-of-order invite states no longer last-writer-wins a just-added member back out. - Removing a member now sends them a creator-signed roster-without-them under a throwaway all-zero key (never the rotated key), so their client deactivates the group and surfaces "removed" instead of going silently dark. - /block is enforced in the group receive path: a blocked member's messages are dropped from display and notifications, consistent with every other inbound path. - Media affordances are disabled in group chats (both computed sites) so the composer can't strand a media placeholder that never sends; media-in-groups is a documented v2 item. - Creator signature now covers the group name and the sender signature covers the epoch (wire-format-affecting; needs Android parity before ship). - Explicit isGroup guard in markPrivateMessagesAsRead so read/delivered receipts can never leak into group conversations under a future refactor. Co-Authored-By: Claude Fable 5 --- bitchat/App/ConversationUIModel.swift | 4 +- bitchat/Services/Groups/GroupProtocol.swift | 97 +++++++++++++------ bitchat/ViewModels/ChatGroupCoordinator.swift | 40 +++++++- .../ViewModels/ChatLifecycleCoordinator.swift | 7 ++ bitchat/ViewModels/ChatViewModel.swift | 4 +- .../Services/GroupProtocolTests.swift | 74 +++++++++++++- 6 files changed, 191 insertions(+), 35 deletions(-) diff --git a/bitchat/App/ConversationUIModel.swift b/bitchat/App/ConversationUIModel.swift index 461449cc..f8633e0d 100644 --- a/bitchat/App/ConversationUIModel.swift +++ b/bitchat/App/ConversationUIModel.swift @@ -193,7 +193,9 @@ final class ConversationUIModel: ObservableObject { private func refreshComputedState() { if let selectedPeerID = privateConversationModel.selectedPeerID { - canSendMediaInCurrentContext = !(selectedPeerID.isGeoDM || selectedPeerID.isGeoChat) + // Media transfer is not wired for groups in v1; keep it off so the + // composer can't strand a media placeholder that never sends. + canSendMediaInCurrentContext = !(selectedPeerID.isGeoDM || selectedPeerID.isGeoChat || selectedPeerID.isGroup) return } diff --git a/bitchat/Services/Groups/GroupProtocol.swift b/bitchat/Services/Groups/GroupProtocol.swift index 14f3d7f3..dc4a0abf 100644 --- a/bitchat/Services/Groups/GroupProtocol.swift +++ b/bitchat/Services/Groups/GroupProtocol.swift @@ -63,13 +63,24 @@ struct BitchatGroup: Codable, Equatable { // MARK: - TLV helpers +enum GroupTLVError: Error, Equatable { + /// A TLV value exceeded the 16-bit length field. Encoding fails instead + /// of silently truncating (which would ship a value the receiver drops). + case valueTooLong +} + private enum GroupTLV { - static func put(_ type: UInt8, _ value: Data, into out: inout Data) { + /// Appends a (type, 16-bit length, value) triple. Throws rather than + /// truncating when `value` does not fit the 16-bit length field, so an + /// oversize field surfaces a send failure instead of a silently truncated + /// blob the recipient rejects during decrypt/verify. + static func put(_ type: UInt8, _ value: Data, into out: inout Data) throws { + guard value.count <= Int(UInt16.max) else { throw GroupTLVError.valueTooLong } out.append(type) - let length = UInt16(clamping: value.count) + let length = UInt16(value.count) out.append(UInt8((length >> 8) & 0xFF)) out.append(UInt8(length & 0xFF)) - out.append(value.prefix(Int(length))) + out.append(value) } /// Iterates (type, value) pairs; returns nil on malformed framing. @@ -131,7 +142,10 @@ enum GroupRosterCoding { member.signingKey.count == signingKeyLength else { return nil } out.append(fingerprintData) out.append(member.signingKey) - let nickname = Data(member.nickname.utf8).prefix(maxNicknameBytes) + // Truncate on a Character boundary so the byte prefix is always + // valid UTF-8; a raw byte-prefix could split a multi-byte scalar + // and make the whole signed roster undecodable on the recipient. + let nickname = truncatedNicknameBytes(member.nickname) out.append(UInt8(nickname.count)) out.append(nickname) } @@ -160,6 +174,16 @@ enum GroupRosterCoding { guard offset == data.endIndex else { return nil } return members } + + /// UTF-8 bytes of `nickname` trimmed to at most `maxNicknameBytes`, + /// dropping whole Characters so the result is never split mid-scalar. + private static func truncatedNicknameBytes(_ nickname: String) -> Data { + var candidate = nickname + while Data(candidate.utf8).count > maxNicknameBytes { + candidate.removeLast() + } + return Data(candidate.utf8) + } } // MARK: - Group state payload (groupInvite / groupKeyUpdate over Noise) @@ -192,14 +216,17 @@ struct GroupStatePayload: Equatable { static let signingDomain = Data("bitchat-group-v1".utf8) - /// The bytes the creator signs. Binding the key and roster by hash keeps - /// the signed content fixed-size. - static func signingContent(groupID: Data, epoch: UInt32, key: Data, rosterBlob: Data) -> Data { + /// The bytes the creator signs. Binding the key, roster, and name by hash + /// keeps the signed content fixed-size. The name is covered so a relay + /// that caches/replays a signed state (e.g. store-and-forward) cannot swap + /// the display name while keeping a valid creator signature. + static func signingContent(groupID: Data, epoch: UInt32, key: Data, rosterBlob: Data, name: String) -> Data { var content = signingDomain content.append(groupID) content.append(GroupTLV.epochData(epoch)) content.append(key.sha256Hash()) content.append(rosterBlob.sha256Hash()) + content.append(Data(name.utf8).sha256Hash()) return content } @@ -211,7 +238,7 @@ struct GroupStatePayload: Equatable { sign: (Data) -> Data? ) -> GroupStatePayload? { guard let rosterBlob = GroupRosterCoding.encode(group.members) else { return nil } - let content = signingContent(groupID: group.groupID, epoch: group.epoch, key: key, rosterBlob: rosterBlob) + let content = signingContent(groupID: group.groupID, epoch: group.epoch, key: key, rosterBlob: rosterBlob, name: group.name) guard let signature = sign(content) else { return nil } return GroupStatePayload( groupID: group.groupID, @@ -229,13 +256,17 @@ struct GroupStatePayload: Equatable { let fingerprintData = Data(hexString: creatorFingerprint), fingerprintData.count == 32 else { return nil } var out = Data() - GroupTLV.put(FieldType.groupID.rawValue, groupID, into: &out) - GroupTLV.put(FieldType.name.rawValue, Data(name.utf8), into: &out) - GroupTLV.put(FieldType.key.rawValue, key, into: &out) - GroupTLV.put(FieldType.epoch.rawValue, GroupTLV.epochData(epoch), into: &out) - GroupTLV.put(FieldType.roster.rawValue, rosterBlob, into: &out) - GroupTLV.put(FieldType.creatorFingerprint.rawValue, fingerprintData, into: &out) - GroupTLV.put(FieldType.signature.rawValue, signature, into: &out) + do { + try GroupTLV.put(FieldType.groupID.rawValue, groupID, into: &out) + try GroupTLV.put(FieldType.name.rawValue, Data(name.utf8), into: &out) + try GroupTLV.put(FieldType.key.rawValue, key, into: &out) + try GroupTLV.put(FieldType.epoch.rawValue, GroupTLV.epochData(epoch), into: &out) + try GroupTLV.put(FieldType.roster.rawValue, rosterBlob, into: &out) + try GroupTLV.put(FieldType.creatorFingerprint.rawValue, fingerprintData, into: &out) + try GroupTLV.put(FieldType.signature.rawValue, signature, into: &out) + } catch { + return nil + } return out } @@ -292,7 +323,7 @@ struct GroupStatePayload: Equatable { guard members.count <= BitchatGroup.maxMembers, let creator = members.first(where: { $0.fingerprint == creatorFingerprint }), let rosterBlob = GroupRosterCoding.encode(members) else { return false } - let content = GroupStatePayload.signingContent(groupID: groupID, epoch: epoch, key: key, rosterBlob: rosterBlob) + let content = GroupStatePayload.signingContent(groupID: groupID, epoch: epoch, key: key, rosterBlob: rosterBlob, name: name) return GroupCrypto.verify(signature: signature, for: content, publicKey: creator.signingKey) } @@ -326,12 +357,12 @@ struct GroupMessageEnvelope: Equatable { case ciphertext = 0x04 } - func encode() -> Data { + func encode() throws -> Data { var out = Data() - GroupTLV.put(FieldType.groupID.rawValue, groupID, into: &out) - GroupTLV.put(FieldType.epoch.rawValue, GroupTLV.epochData(epoch), into: &out) - GroupTLV.put(FieldType.nonce.rawValue, nonce, into: &out) - GroupTLV.put(FieldType.ciphertext.rawValue, ciphertext, into: &out) + try GroupTLV.put(FieldType.groupID.rawValue, groupID, into: &out) + try GroupTLV.put(FieldType.epoch.rawValue, GroupTLV.epochData(epoch), into: &out) + try GroupTLV.put(FieldType.nonce.rawValue, nonce, into: &out) + try GroupTLV.put(FieldType.ciphertext.rawValue, ciphertext, into: &out) return out } @@ -392,10 +423,14 @@ enum GroupCrypto { case signature = 0x06 } - /// Bytes the sender signs: domain | groupID | messageID | timestamp | content. - static func messageSigningContent(groupID: Data, messageID: String, timestampMs: UInt64, content: String) -> Data { + /// Bytes the sender signs: domain | groupID | epoch | messageID | timestamp | content. + /// Covering the epoch stops a current member from re-sealing another + /// member's decrypted inner bytes under a later epoch key (the signature + /// would no longer verify at the new epoch). + static func messageSigningContent(groupID: Data, epoch: UInt32, messageID: String, timestampMs: UInt64, content: String) -> Data { var data = messageSigningDomain data.append(groupID) + data.append(GroupTLV.epochData(epoch)) data.append(Data(messageID.utf8)) data.append(GroupTLV.timestampData(timestampMs)) data.append(Data(content.utf8)) @@ -424,6 +459,7 @@ enum GroupCrypto { ) throws -> Data { let signingContent = messageSigningContent( groupID: groupID, + epoch: epoch, messageID: messageID, timestampMs: timestampMs, content: content @@ -433,12 +469,12 @@ enum GroupCrypto { } var inner = Data() - GroupTLV.put(InnerField.messageID.rawValue, Data(messageID.utf8), into: &inner) - GroupTLV.put(InnerField.senderSigningKey.rawValue, senderSigningKey, into: &inner) - GroupTLV.put(InnerField.senderNickname.rawValue, Data(senderNickname.utf8), into: &inner) - GroupTLV.put(InnerField.timestamp.rawValue, GroupTLV.timestampData(timestampMs), into: &inner) - GroupTLV.put(InnerField.content.rawValue, Data(content.utf8), into: &inner) - GroupTLV.put(InnerField.signature.rawValue, signature, into: &inner) + try GroupTLV.put(InnerField.messageID.rawValue, Data(messageID.utf8), into: &inner) + try GroupTLV.put(InnerField.senderSigningKey.rawValue, senderSigningKey, into: &inner) + try GroupTLV.put(InnerField.senderNickname.rawValue, Data(senderNickname.utf8), into: &inner) + try GroupTLV.put(InnerField.timestamp.rawValue, GroupTLV.timestampData(timestampMs), into: &inner) + try GroupTLV.put(InnerField.content.rawValue, Data(content.utf8), into: &inner) + try GroupTLV.put(InnerField.signature.rawValue, signature, into: &inner) do { let symmetricKey = SymmetricKey(data: key) @@ -453,7 +489,7 @@ enum GroupCrypto { nonce: Data(sealed.nonce), ciphertext: ciphertext ) - return envelope.encode() + return try envelope.encode() } catch { throw GroupCryptoError.sealFailed } @@ -513,6 +549,7 @@ enum GroupCrypto { let signingContent = messageSigningContent( groupID: envelope.groupID, + epoch: envelope.epoch, messageID: messageID, timestampMs: timestampMs, content: content diff --git a/bitchat/ViewModels/ChatGroupCoordinator.swift b/bitchat/ViewModels/ChatGroupCoordinator.swift index fe576132..a83cb024 100644 --- a/bitchat/ViewModels/ChatGroupCoordinator.swift +++ b/bitchat/ViewModels/ChatGroupCoordinator.swift @@ -35,6 +35,8 @@ protocol ChatGroupContext: AnyObject { func cryptoIdentity(for peerID: PeerID) -> (fingerprint: String, signingKey: Data)? /// The connected short peer ID whose fingerprint matches, if any. func connectedPeerID(forFingerprint fingerprint: String) -> PeerID? + /// Whether the user has blocked the identity with this Noise fingerprint. + func isFingerprintBlocked(_ fingerprint: String) -> Bool // MARK: Transport func sendGroupInvitePayload(_ payload: Data, to peerID: PeerID) @@ -99,6 +101,10 @@ extension ChatViewModel: ChatGroupContext { return meshService.isPeerConnected(shortID) ? shortID : nil } + func isFingerprintBlocked(_ fingerprint: String) -> Bool { + identityManager.isBlocked(fingerprint: fingerprint) + } + func sendGroupInvitePayload(_ payload: Data, to peerID: PeerID) { meshService.sendGroupInvite(payload, to: peerID) } @@ -230,9 +236,12 @@ final class ChatGroupCoordinator { signingKey: identity.signingKey, nickname: context.peerNickname(for: peerID) ?? nickname ) + // Rotate the key (epoch + 1) on every roster change, not just removals. + // A monotonically increasing epoch per roster gives the receiver a + // strict ordering: two out-of-order invite states can no longer share + // an epoch and last-writer-wins a just-added member back out. let members = group.members + [newMember] - guard let updated = context.groupStore.updateRoster(groupID: group.groupID, members: members), - let key = context.groupStore.key(forGroupID: group.groupID), + guard let (updated, key) = context.groupStore.rotateKey(groupID: group.groupID, members: members), let payload = signedStatePayload(for: updated, key: key) else { return .error(message: String(localized: "system.group.invite_failed", comment: "Error when building or signing a group invite fails")) } @@ -280,6 +289,7 @@ final class ChatGroupCoordinator { } distributeState(payload, group: rotated, excluding: [], type: .keyUpdate) + notifyRemovedMember(member, rotated: rotated) return .success(message: String( format: String(localized: "system.group.removed_member", comment: "System message after removing a member and rotating the key; placeholder is the nickname"), @@ -402,6 +412,12 @@ final class ChatGroupCoordinator { } // Our own broadcast echoed back via relay or sync replay. guard plaintext.senderSigningKey != context.mySigningPublicKey() else { return } + // Honor /block inside groups too: drop display + notification for a + // blocked member, consistent with every other inbound path. + guard !context.isFingerprintBlocked(member.fingerprint) else { + SecureLogger.debug("Dropping group message from blocked member", category: .security) + return + } let groupPeerID = group.peerID // Trust the authenticated inner timestamp (clamped so a future-dated @@ -493,6 +509,26 @@ private extension ChatGroupCoordinator { } } + /// Tells a just-removed member they're out so their client can deactivate + /// the group instead of silently going dark (dropping every message under + /// the epoch it no longer has the key for). The notice is a creator-signed + /// state whose roster excludes the removee — their `applyGroupState` + /// removal branch fires on the missing-self roster and surfaces the + /// "removed from group" system message. + /// + /// It carries a throwaway all-zero key, never the rotated key, so the + /// removee cannot decrypt post-removal traffic. State is sent 1:1 over + /// authenticated Noise, so no remaining member ever receives this blob + /// (and even if one did, its own missing-self check would not match). + /// If the removee is offline the notice can't be delivered — same v1 + /// limitation as any other missed key update, documented in the PR. + func notifyRemovedMember(_ removed: GroupMember, rotated: BitchatGroup) { + guard let peerID = context.connectedPeerID(forFingerprint: removed.fingerprint) else { return } + let throwawayKey = Data(count: BitchatGroup.keyLength) + guard let payload = signedStatePayload(for: rotated, key: throwawayKey) else { return } + context.sendGroupKeyUpdatePayload(payload, to: peerID) + } + func applyGroupState(from peerID: PeerID, payload: Data, isInvite: Bool) { guard let state = GroupStatePayload.decode(payload) else { SecureLogger.warning("Malformed group state payload from \(peerID.id.prefix(8))…", category: .security) diff --git a/bitchat/ViewModels/ChatLifecycleCoordinator.swift b/bitchat/ViewModels/ChatLifecycleCoordinator.swift index bea1b5b2..0ccdd39c 100644 --- a/bitchat/ViewModels/ChatLifecycleCoordinator.swift +++ b/bitchat/ViewModels/ChatLifecycleCoordinator.swift @@ -185,6 +185,13 @@ final class ChatLifecycleCoordinator { func markPrivateMessagesAsRead(from peerID: PeerID) { context.markChatAsRead(from: peerID) + // Group chats are keyed under a virtual group_ peerID; no member IS the + // conversation peer, so the receipt loops below (which gate on + // senderPeerID == peerID) must never emit a read/delivered receipt for + // one. This guard makes that explicit so a future refactor of the + // receipt matching can't silently start leaking receipts into groups. + guard !peerID.isGroup else { return } + if peerID.isGeoDM, let recipientHex = context.nostrKeyMapping[peerID], case .location(let channel) = context.activeChannel, diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 646e04bc..0475ce17 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -102,7 +102,9 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele @MainActor var canSendMediaInCurrentContext: Bool { if let peer = selectedPrivateChatPeer { - return !(peer.isGeoDM || peer.isGeoChat) + // Media transfer is not wired for groups in v1 (sendFilePrivate + // rejects the virtual group_ recipient), so keep the affordance off. + return !(peer.isGeoDM || peer.isGeoChat || peer.isGroup) } switch activeChannel { case .mesh: return true diff --git a/bitchatTests/Services/GroupProtocolTests.swift b/bitchatTests/Services/GroupProtocolTests.swift index a99c48a9..f9f19e7f 100644 --- a/bitchatTests/Services/GroupProtocolTests.swift +++ b/bitchatTests/Services/GroupProtocolTests.swift @@ -142,7 +142,7 @@ struct GroupProtocolTests { Issue.record("roster should encode") return } - let content = GroupStatePayload.signingContent(groupID: groupID, epoch: 1, key: key, rosterBlob: rosterBlob) + let content = GroupStatePayload.signingContent(groupID: groupID, epoch: 1, key: key, rosterBlob: rosterBlob, name: group.name) let payload = GroupStatePayload( groupID: groupID, name: group.name, @@ -299,4 +299,76 @@ struct GroupProtocolTests { #expect(GroupMessageEnvelope.decode(Data([0x01, 0x00])) == nil) #expect(GroupStatePayload.decode(Data([0xFF, 0x00, 0x01])) == nil) } + + // MARK: - Oversize / UTF-8 safety (Codex findings) + + @Test func oversizeMessageContentFailsToSealInsteadOfTruncating() { + // A content whose UTF-8 exceeds the 16-bit TLV length must fail to + // seal (surfacing send_failed) rather than silently truncate into a + // ciphertext recipients would drop. + let oversize = String(repeating: "a", count: 70_000) + #expect(throws: (any Error).self) { + _ = try GroupCrypto.sealMessage( + content: oversize, + messageID: "big", + senderNickname: "alice", + senderSigningKey: member.member.signingKey, + timestampMs: 1, + groupID: groupID, + epoch: 1, + key: key, + sign: member.sign + ) + } + } + + @Test func multiByteNicknameTruncatesOnScalarBoundary() throws { + // 40 euro signs = 120 UTF-8 bytes; a raw 64-byte prefix would split + // the 21st scalar and make the roster undecodable. Truncation must + // land on a Character boundary so the blob round-trips. + let euros = String(repeating: "€", count: 40) + let wide = GroupMember( + fingerprint: creator.fingerprint, + signingKey: creator.member.signingKey, + nickname: euros + ) + let blob = try #require(GroupRosterCoding.encode([wide])) + let decoded = try #require(GroupRosterCoding.decode(blob)) + #expect(decoded.count == 1) + #expect(Data(decoded[0].nickname.utf8).count <= 64) + #expect(decoded[0].nickname.allSatisfy { $0 == "€" }) + #expect(!decoded[0].nickname.isEmpty) + } + + // MARK: - Signable-bytes forward-proofing + + @Test func creatorSignatureCoversName() throws { + let group = makeGroup() + let payload = try #require(GroupStatePayload.makeSigned(group: group, key: key, sign: creator.sign)) + #expect(payload.verifyCreatorSignature()) + + // Swapping only the display name must invalidate the creator signature. + let renamed = GroupStatePayload( + groupID: payload.groupID, + name: "totally different name", + key: payload.key, + epoch: payload.epoch, + members: payload.members, + creatorFingerprint: payload.creatorFingerprint, + signature: payload.signature + ) + #expect(!renamed.verifyCreatorSignature()) + } + + @Test func messageSignatureCoversEpoch() { + // The signed bytes differ by epoch, so a signature captured at one + // epoch cannot verify when re-sealed under a later epoch key. + let atEpoch1 = GroupCrypto.messageSigningContent( + groupID: groupID, epoch: 1, messageID: "m", timestampMs: 1, content: "x" + ) + let atEpoch2 = GroupCrypto.messageSigningContent( + groupID: groupID, epoch: 2, messageID: "m", timestampMs: 1, content: "x" + ) + #expect(atEpoch1 != atEpoch2) + } } From 2b7fd2002b8d4455687eb1a31b4bf5e52f7776cb Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 21:21:37 +0200 Subject: [PATCH 022/158] Wi-Fi bulk: normalize peer ID before eligibility checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stable/verified private chats address a peer by its full 64-hex Noise key, but the Noise session, advertised capabilities, and connection state are keyed by the short (SHA256-derived 16-hex) routing ID. sendFilePrivate resolved the Wi-Fi bulk SendCandidate with the raw peerID, so a 64-hex key made hasEstablishedSession return false; shouldOffer never selected Wi-Fi and a >BLE-cap payload cancelled as "Wi-Fi unavailable" even when the direct peer advertised .wifiBulk. Normalize with peerID.toShort() once before the session/capability checks (extracted into wifiBulkSendCandidate) and use the normalized ID for the negotiation packet and the BLE fallback too. Test: eligibility + offer path resolves when addressed by a 64-hex Noise key — the session is established under the short ID, the raw-key lookup misses it, and the normalized send path still offers Wi-Fi. Co-Authored-By: Claude Fable 5 --- bitchat/Services/BLE/BLEService.swift | 69 ++++++++++++++++++++++---- bitchatTests/BLEServiceCoreTests.swift | 45 +++++++++++++++++ 2 files changed, 105 insertions(+), 9 deletions(-) diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 6201ce8c..ff5d6ff4 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -793,15 +793,19 @@ final class BLEService: NSObject { } let fitsBLECaps = filePacket.encode() != nil - let candidate = WifiBulkPolicy.SendCandidate( - payloadBytes: payload.count, - peerCapabilities: self.peerCapabilities(peerID), - isDirectlyConnected: self.isPeerConnected(peerID), - hasEstablishedNoiseSession: self.noiseService.hasEstablishedSession(with: peerID) - ) + // Normalize to the short routing ID (SHA256-derived 16-hex) once. + // Stable/verified private chats address the peer by its full + // 64-hex Noise key, but the Noise session and the negotiation + // packet are keyed by the short ID — so the capability/session + // eligibility checks (and the Wi-Fi offer) must all use it, or a + // 64-hex key makes `hasEstablishedSession` return false and Wi-Fi + // is never selected even when the peer advertises `.wifiBulk`. + let routingID = peerID.toShort() + + let candidate = self.wifiBulkSendCandidate(payloadBytes: payload.count, to: routingID) if WifiBulkPolicy.shouldOffer(candidate) { - self.wifiBulkService.sendFile(payload: payload, to: peerID, transferId: transferId) { [weak self] in - self?.sendFilePrivateViaBLE(payload: payload, to: peerID, transferId: transferId, fitsBLECaps: fitsBLECaps) + self.wifiBulkService.sendFile(payload: payload, to: routingID, transferId: transferId) { [weak self] in + self?.sendFilePrivateViaBLE(payload: payload, to: routingID, transferId: transferId, fitsBLECaps: fitsBLECaps) } return } @@ -811,10 +815,29 @@ final class BLEService: NSObject { self.surfaceUndeliverableTransfer(transferId) return } - self.sendFilePrivateViaBLE(payload: payload, to: peerID, transferId: transferId, fitsBLECaps: true) + self.sendFilePrivateViaBLE(payload: payload, to: routingID, transferId: transferId, fitsBLECaps: true) } } + /// Builds the Wi-Fi bulk eligibility candidate for a private send. + /// + /// Normalizes `peerID` to its short routing ID first: stable/verified + /// private chats address the peer by its full 64-hex Noise key, but the + /// Noise session, advertised capabilities, and connection state are all + /// keyed by the short (SHA256-derived 16-hex) ID. Resolving them with the + /// 64-hex key would miss the session (`hasEstablishedSession` returns + /// false), so Wi-Fi would never be offered even to a directly-connected + /// `.wifiBulk` peer. + private func wifiBulkSendCandidate(payloadBytes: Int, to peerID: PeerID) -> WifiBulkPolicy.SendCandidate { + let routingID = peerID.toShort() + return WifiBulkPolicy.SendCandidate( + payloadBytes: payloadBytes, + peerCapabilities: peerCapabilities(routingID), + isDirectlyConnected: isPeerConnected(routingID), + hasEstablishedNoiseSession: noiseService.hasEstablishedSession(with: routingID) + ) + } + /// BLE fragmentation path for private file transfers; also the fallback /// target when a Wi-Fi bulk attempt declines, times out, or errors. /// May be invoked from the Wi-Fi bulk queue. @@ -1833,6 +1856,34 @@ extension BLEService { cachedServiceUUIDs: cachedServiceUUIDs ) } + + /// The internal Noise service, so tests can drive a real handshake and + /// establish a session keyed by a chosen (short) routing ID. + var _test_noiseService: NoiseEncryptionService { noiseService } + + /// Registers a directly-connected peer with the given advertised + /// capabilities, keyed by its short routing ID (as production does). + func _test_registerConnectedPeer(_ peerID: PeerID, capabilities: PeerCapabilities) { + let shortID = peerID.toShort() + collectionsQueue.sync(flags: .barrier) { + peerRegistry.upsert(BLEPeerInfo( + peerID: shortID, + nickname: "TestPeer_\(shortID.id.prefix(4))", + isConnected: true, + noisePublicKey: peerID.noiseKey, + signingPublicKey: nil, + isVerifiedNickname: true, + lastSeen: Date(), + capabilities: capabilities + )) + } + } + + /// Runs the production Wi-Fi bulk eligibility resolution (including peer-ID + /// normalization) for the given payload size and recipient. + func _test_wifiBulkSendCandidate(payloadBytes: Int, to peerID: PeerID) -> WifiBulkPolicy.SendCandidate { + wifiBulkSendCandidate(payloadBytes: payloadBytes, to: peerID) + } } #endif diff --git a/bitchatTests/BLEServiceCoreTests.swift b/bitchatTests/BLEServiceCoreTests.swift index fe7624ec..19ddfb42 100644 --- a/bitchatTests/BLEServiceCoreTests.swift +++ b/bitchatTests/BLEServiceCoreTests.swift @@ -216,6 +216,51 @@ struct BLEServiceCoreTests { cachedServiceUUIDs: [BLEService.serviceUUID, otherService] )) } + + // Regression: a stable/verified private chat addresses the peer by its + // full 64-hex Noise key, but the Noise session (and capabilities/ + // connection) are keyed by the short routing ID. The Wi-Fi bulk send path + // must normalize the ID first, or `hasEstablishedSession` misses and + // Wi-Fi is never offered for a large payload to a direct `.wifiBulk` peer. + @Test + func wifiBulkEligibility_resolvesWhenAddressedBy64HexNoiseKey() throws { + let ble = makeService() + + let noiseKey = Data((0..<32).map { UInt8(($0 &* 7) &+ 3) }) + let fullKey = PeerID(str: noiseKey.hexEncodedString()) // 64-hex Noise key + #expect(fullKey.noiseKey != nil) + let shortID = fullKey.toShort() // 16-hex routing ID + #expect(shortID != fullKey) + + // Establish a real Noise session in the service's noise engine, keyed + // by the short routing ID (exactly as a completed handshake would). + let peer = NoiseEncryptionService(keychain: MockKeychain()) + let noise = ble._test_noiseService + let m1 = try noise.initiateHandshake(with: shortID) + let m2 = try #require(try peer.processHandshakeMessage(from: shortID, message: m1)) + let m3 = try #require(try noise.processHandshakeMessage(from: shortID, message: m2)) + _ = try peer.processHandshakeMessage(from: shortID, message: m3) + + #expect(noise.hasEstablishedSession(with: shortID)) + // The bug in raw form: querying by the 64-hex key misses the session. + #expect(!noise.hasEstablishedSession(with: fullKey)) + + // Register the peer as a directly-connected `.wifiBulk` neighbor. + ble._test_registerConnectedPeer(fullKey, capabilities: [.wifiBulk]) + + let bigPayload = FileTransferLimits.maxWifiBulkPayloadBytes + + // The send path normalizes first, so eligibility + offer resolve for + // both the short ID and the full 64-hex Noise key. + let viaShort = ble._test_wifiBulkSendCandidate(payloadBytes: bigPayload, to: shortID) + let viaFull = ble._test_wifiBulkSendCandidate(payloadBytes: bigPayload, to: fullKey) + #expect(viaShort.hasEstablishedNoiseSession) + #expect(viaFull.hasEstablishedNoiseSession) + #expect(viaFull.isDirectlyConnected) + #expect(viaFull.peerCapabilities.contains(.wifiBulk)) + #expect(WifiBulkPolicy.shouldOffer(viaShort, enabled: true)) + #expect(WifiBulkPolicy.shouldOffer(viaFull, enabled: true)) + } } private func makeService() -> BLEService { From b481a7045816339e6e60921d6df8d2a44401f349 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 21:27:41 +0200 Subject: [PATCH 023/158] Prekeys: authenticate bundle packets, fix consume-republish, deflake CI Fixes the prekey-bundle PR review + CI failure: - CI root cause: the receive queue (mesh.message) is concurrent, so a gossiped prekey bundle can be processed before the announce that binds its owner's signing key. The old handler dropped such bundles outright, so under CI parallel load the bundle was permanently lost and the cache/gossip tests flaked (verifiedBundleEntersGossipStore, prekeySealedMailTravelsViaCourierAndOpens). Bundles that arrive before their binding are now retained per-owner (bounded) and re-attempted when the verified announce lands, atomically to avoid a check-then-act race. - Authenticate the OUTER prekey-bundle packet (Codex P2 / review MEDIUM): require senderID == PeerID(bundle.noiseStaticPublicKey) and verify the packet's Ed25519 signature (covers senderID + timestamp) against the owner's bound signing key, in addition to the inner bundle signature. Stops replay under a fresh timestamp / fake senderID. - Key the gossip prekey-bundle store/dedup by the bundle's authenticated identity (noiseStaticPublicKey), not the unauthenticated packet senderID, so one valid bundle sprayed under many fabricated sender IDs can't multiply entries and exhaust the 200-owner cap. - Bump published-bundle generatedAt strictly on consume (Codex P1): consuming a prekey shrinks the published bundle, so it now republishes with a strictly newer generatedAt and re-gossips, so peers replace the cached copy and stop assigning the consumed ID before its 48h grace. - Guard the panic/clear detached Application Support tree-deletes behind TestEnvironment.isRunningTests: the SPM test process shares that tree, so the wipe could land mid-test and flake file-dependent tests. Co-Authored-By: Claude Fable 5 --- bitchat/Services/BLE/BLEService.swift | 107 +++++++++++++++--- bitchat/Services/NoiseEncryptionService.swift | 12 +- .../Services/Prekeys/LocalPrekeyStore.swift | 26 ++++- bitchat/Sync/GossipSyncManager.swift | 16 ++- .../ChatPublicConversationCoordinator.swift | 5 + bitchat/ViewModels/ChatViewModel.swift | 5 + .../EndToEnd/PrekeyEndToEndTests.swift | 67 +++++++++++ bitchatTests/GossipSyncManagerTests.swift | 50 +++++++- bitchatTests/Prekeys/NoisePrekeyTests.swift | 51 ++++++++- 9 files changed, 309 insertions(+), 30 deletions(-) diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 1e76b0a3..d4bb2693 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -66,6 +66,13 @@ final class BLEService: NSObject { // Throttle for re-broadcasting our own (unchanged) bundle; guarded by // collectionsQueue barriers. private var lastPrekeyBundleSentAt: Date? + // Prekey bundles that arrived before their owner's verified announce bound + // a signing key. The receive queue is concurrent, so a bundle can race + // ahead of the announce it depends on; we retain the latest such bundle per + // owner (bounded) and re-attempt attribution when the announce lands. + // Guarded by collectionsQueue barriers. + private var pendingPrekeyBundles: [PeerID: BitchatPacket] = [:] + private static let pendingPrekeyBundleCap = 64 #if DEBUG // Test-only tap on the outbound pipeline so multi-node tests can ferry @@ -2637,11 +2644,17 @@ extension BLEService { let senderStaticKey: Data if let prekeyID = envelope.prekeyID { // Envelope v2: sealed to one of our one-time prekeys. Opening - // consumes the prekey (48h redelivery grace); regenerate and - // re-gossip a fresh bundle when the batch runs low. - (typedPayload, senderStaticKey) = try noiseService.openPrekeyPayload(envelope.ciphertext, prekeyID: prekeyID) - if noiseService.replenishPrekeysIfNeeded() { - sendPrekeyBundle(force: true) + // consumes the prekey (48h redelivery grace), which shrinks our + // published bundle under a strictly newer generatedAt. Re-gossip + // so peers replace their cached copy and stop assigning the + // consumed ID before the grace lapses; force the broadcast when + // the batch also topped back up (low-water), otherwise let the + // rebroadcast throttle coalesce bursts. + let opened = try noiseService.openPrekeyPayload(envelope.ciphertext, prekeyID: prekeyID) + (typedPayload, senderStaticKey) = (opened.payload, opened.senderStaticKey) + if opened.consumedPrekey { + let replenished = noiseService.replenishPrekeysIfNeeded() + sendPrekeyBundle(force: replenished) } } else { (typedPayload, senderStaticKey) = try noiseService.openCourierPayload(envelope.ciphertext) @@ -2822,10 +2835,16 @@ extension BLEService { gossipSyncManager?.onPublicPacketSeen(signedPacket) } - /// Ingests a gossiped prekey bundle: verify the inner Ed25519 signature - /// against the owner's announce-bound signing key, cache the latest copy - /// per owner, and only then let the packet enter our own gossip store so - /// we never help spread a bundle we couldn't attribute. + /// Ingests a gossiped prekey bundle. Attribution is layered: the outer + /// packet must originate from the bundle owner (fabricated sender IDs, used + /// to multiply cache/gossip entries, are rejected), and BOTH the inner + /// bundle signature and the outer packet signature must verify against the + /// owner's announce-bound signing key. Verifying the outer packet — whose + /// signed bytes cover senderID and timestamp — stops a valid bundle from + /// being replayed under a fresh timestamp or spoofed sender to pass + /// freshness or poison attribution. Only after that does the packet enter + /// our own gossip store, so we never help spread a bundle we couldn't + /// attribute. private func handlePrekeyBundle(_ packet: BitchatPacket, from peerID: PeerID) { guard let bundle = PrekeyBundle.decode(packet.payload) else { SecureLogger.debug("🔑 Ignoring malformed prekey bundle from \(peerID.id.prefix(8))…", category: .security) @@ -2833,17 +2852,73 @@ extension BLEService { } // Our own bundle is tracked at send time; a copy echoing back adds nothing. guard bundle.noiseStaticPublicKey != noiseService.getStaticPublicKeyData() else { return } - guard let signingKey = announceBoundSigningKey(forNoiseKey: bundle.noiseStaticPublicKey), - noiseService.verifyPrekeyBundleSignature(bundle, signingPublicKey: signingKey) else { - SecureLogger.debug("🔑 Ignoring prekey bundle without verifiable signature (owner \(PeerID(publicKey: bundle.noiseStaticPublicKey).id.prefix(8))…)", category: .security) + let owner = PeerID(publicKey: bundle.noiseStaticPublicKey) + // The owner's genuine bundle (direct or relayed) always carries the + // owner's senderID + outer signature; gossip resends preserve both. A + // packet whose senderID isn't the owner can't be authenticated here. + guard PeerID(hexData: packet.senderID) == owner else { + SecureLogger.debug("🔑 Ignoring prekey bundle whose sender ≠ owner \(owner.id.prefix(8))…", category: .security) + return + } + // Look up the announce-bound signing key and stash-if-unbound in ONE + // barrier: the receive queue is concurrent, so this bundle can race + // ahead of the announce that binds the key. Reading the live registry + // and stashing atomically closes the check-then-act gap against + // handleAnnounce's drain (see drainPendingPrekeyBundles). + let signingKey: Data? = collectionsQueue.sync(flags: .barrier) { + if let info = peerRegistry.info(for: owner), + info.noisePublicKey == bundle.noiseStaticPublicKey, + let key = info.signingPublicKey { + return key + } + // Offline-verified identities are stable across this race. + for candidate in identityManager.getCryptoIdentitiesByPeerIDPrefix(owner) + where candidate.publicKey == bundle.noiseStaticPublicKey { + if let key = candidate.signingPublicKey { return key } + } + // No binding yet: retain the latest bundle per owner, bounded, and + // retry once the verified announce lands. + if pendingPrekeyBundles[owner] != nil + || pendingPrekeyBundles.count < Self.pendingPrekeyBundleCap { + pendingPrekeyBundles[owner] = packet + } + return nil + } + guard let signingKey else { + SecureLogger.debug("🔑 Deferring prekey bundle without a bound signing key (owner \(owner.id.prefix(8))…)", category: .security) + return + } + ingestVerifiedPrekeyBundle(bundle, packet: packet, owner: owner, signingKey: signingKey) + } + + /// Verify a bundle's inner + outer signatures against the owner's bound + /// signing key and, on success, cache it and let it enter our gossip store. + private func ingestVerifiedPrekeyBundle(_ bundle: PrekeyBundle, packet: BitchatPacket, owner: PeerID, signingKey: Data) { + guard noiseService.verifyPrekeyBundleSignature(bundle, signingPublicKey: signingKey), + noiseService.verifyPacketSignature(packet, publicKey: signingKey) else { + SecureLogger.debug("🔑 Ignoring prekey bundle without verifiable signature (owner \(owner.id.prefix(8))…)", category: .security) return } if prekeyBundleStore.ingest(bundle) { - SecureLogger.debug("🔑 Cached prekey bundle for \(PeerID(publicKey: bundle.noiseStaticPublicKey).id.prefix(8))… (\(bundle.prekeys.count) prekeys)", category: .security) + SecureLogger.debug("🔑 Cached prekey bundle for \(owner.id.prefix(8))… (\(bundle.prekeys.count) prekeys)", category: .security) } gossipSyncManager?.onPublicPacketSeen(packet) } + /// Re-attempt any prekey bundle that arrived before this owner's announce + /// bound a signing key. Called from handleAnnounce after a verified + /// announce, in a barrier ordered after the registry write, so a bundle + /// stashed before the write is always observed here. + private func drainPendingPrekeyBundles(for owner: PeerID) { + let pending: BitchatPacket? = collectionsQueue.sync(flags: .barrier) { + pendingPrekeyBundles.removeValue(forKey: owner) + } + guard let packet = pending, + let bundle = PrekeyBundle.decode(packet.payload), + let signingKey = announceBoundSigningKey(forNoiseKey: bundle.noiseStaticPublicKey) else { return } + ingestVerifiedPrekeyBundle(bundle, packet: packet, owner: owner, signingKey: signingKey) + } + /// Ed25519 signing key bound to a Noise static key by a verified /// announce: from the live registry when the owner is on the mesh, else /// from identities persisted for offline verification. @@ -3423,6 +3498,12 @@ extension BLEService { private func handleAnnounce(_ packet: BitchatPacket, from peerID: PeerID) { let result = announceHandler.handle(packet, from: peerID) + // A verified announce is the moment a signing key becomes bound to this + // owner's noise key: retry any prekey bundle that raced ahead of it. + if let result, result.isVerified { + drainPendingPrekeyBundles(for: result.peerID) + } + // Courier work: an announce is the moment we learn a peer's Noise // static key, so check whether we're carrying mail addressed to them // (or spray-able mail they could carry). Verified announces only. diff --git a/bitchat/Services/NoiseEncryptionService.swift b/bitchat/Services/NoiseEncryptionService.swift index 5e244efb..9e7e6eae 100644 --- a/bitchat/Services/NoiseEncryptionService.swift +++ b/bitchat/Services/NoiseEncryptionService.swift @@ -457,9 +457,11 @@ final class NoiseEncryptionService { /// Decrypt an envelope sealed to one of our one-time prekeys. On success /// the prekey is marked consumed (its private key survives a 48h grace /// window for spray-and-wait redeliveries, then is deleted for good). - /// Returns the payload and the sender's authenticated static key, same - /// contract as `openCourierPayload`. - func openPrekeyPayload(_ envelopeCiphertext: Data, prekeyID: UInt32) throws -> (payload: Data, senderStaticKey: Data) { + /// Returns the payload, the sender's authenticated static key (same + /// contract as `openCourierPayload`), and whether this open actually + /// retired the prekey — false for a redelivery of already-consumed mail — + /// so the caller can re-gossip the shrunken bundle only when it changed. + func openPrekeyPayload(_ envelopeCiphertext: Data, prekeyID: UInt32) throws -> (payload: Data, senderStaticKey: Data, consumedPrekey: Bool) { guard let prekeyPrivate = localPrekeys.privateKey(for: prekeyID) else { throw NoiseEncryptionError.unknownPrekey } @@ -474,8 +476,8 @@ final class NoiseEncryptionService { guard let senderKey = handshake.getRemoteStaticPublicKey() else { throw NoiseError.missingKeys } - localPrekeys.markConsumed(prekeyID) - return (payload: payload, senderStaticKey: senderKey.rawRepresentation) + let consumedPrekey = localPrekeys.markConsumed(prekeyID) + return (payload: payload, senderStaticKey: senderKey.rawRepresentation, consumedPrekey: consumedPrekey) } /// Current signed prekey bundle for gossip, minting the initial batch on diff --git a/bitchat/Services/Prekeys/LocalPrekeyStore.swift b/bitchat/Services/Prekeys/LocalPrekeyStore.swift index 83dfa4ae..26f9ec67 100644 --- a/bitchat/Services/Prekeys/LocalPrekeyStore.swift +++ b/bitchat/Services/Prekeys/LocalPrekeyStore.swift @@ -109,13 +109,24 @@ final class LocalPrekeyStore { /// Marks a prekey consumed (starts its grace clock). Idempotent: a /// redelivery within the grace window does not restart the clock. - func markConsumed(_ id: UInt32) { + /// + /// Returns true when this call actually retired a prekey, i.e. the + /// published bundle shrank. Consuming a prekey drops it from + /// `currentBundlePrekeys()`, so `generatedAt` must advance strictly too: + /// otherwise peers that cached the old bundle reject the same-`generatedAt` + /// replacement in `PrekeyBundleStore.ingest`, keep assigning the consumed + /// ID, and their mail starts failing `unknownPrekey` once the 48h grace + /// lapses. The caller re-gossips on a true result. + @discardableResult + func markConsumed(_ id: UInt32) -> Bool { queue.sync { loadLocked() guard let index = records.firstIndex(where: { $0.id == id }), - records[index].consumedAt == nil else { return } + records[index].consumedAt == nil else { return false } records[index].consumedAt = now() + advanceGeneratedAtLocked() persistLocked() + return true } } @@ -174,7 +185,7 @@ final class LocalPrekeyStore { records.append(Record(id: nextID, privateKey: key.rawRepresentation, createdAt: date, consumedAt: nil)) nextID &+= 1 } - generatedAt = UInt64(max(0, date.timeIntervalSince1970 * 1000)) + advanceGeneratedAtLocked() bundleChanged = true SecureLogger.debug("🔑 Replenished one-time prekeys (unconsumed was \(unconsumed))", category: .security) } @@ -183,6 +194,15 @@ final class LocalPrekeyStore { return bundleChanged } + /// Advance `generatedAt` strictly monotonically. Uses wall-clock millis but + /// never repeats or regresses, so two changes within the same millisecond + /// still produce distinct, increasing stamps that peers' monotonic ingest + /// accepts. + private func advanceGeneratedAtLocked() { + let nowMillis = UInt64(max(0, now().timeIntervalSince1970 * 1000)) + generatedAt = max(nowMillis, generatedAt &+ 1) + } + private func loadLocked() { guard !loaded else { return } loaded = true diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index e0cdd2ab..aad4b71b 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -252,17 +252,23 @@ final class GossipSyncManager { // spreads a bundle this node couldn't attribute. guard isBroadcastRecipient else { return } guard isPacketFresh(packet) else { return } - let sender = PeerID(hexData: packet.senderID) - if let existing = latestPrekeyBundleByPeer[sender], + // Key by the bundle's authenticated identity (its noise static key), + // NOT the unauthenticated packet senderID. Otherwise one valid + // bundle re-broadcast under many fabricated sender IDs would create + // one cache entry each and exhaust the per-owner cap, starving + // legitimate bundles. One owner ⇒ at most one entry. + guard let bundle = PrekeyBundle.decode(packet.payload) else { return } + let owner = PeerID(publicKey: bundle.noiseStaticPublicKey) + if let existing = latestPrekeyBundleByPeer[owner], existing.packet.timestamp >= packet.timestamp { return } - // Bounded peer count; replacing a known owner's bundle is always + // Bounded owner count; replacing a known owner's bundle is always // allowed so the cap can't block refreshes. - guard latestPrekeyBundleByPeer[sender] != nil + guard latestPrekeyBundleByPeer[owner] != nil || latestPrekeyBundleByPeer.count < max(1, config.prekeyBundleCapacity) else { return } let idHex = PacketIdUtil.computeId(packet).hexEncodedString() - latestPrekeyBundleByPeer[sender] = (id: idHex, packet: packet) + latestPrekeyBundleByPeer[owner] = (id: idHex, packet: packet) default: break } diff --git a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift index d6777a71..39c8aaae 100644 --- a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift @@ -290,6 +290,11 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { func clearCurrentPublicTimeline() { context.clearPublicConversation(ConversationID(channelID: context.activeChannel)) + // The SPM test process shares the real Application Support tree, so this + // detached deletion can land mid-test under parallel scheduling and flake + // a file-dependent test. Tests never need the on-disk media cleared. + guard !TestEnvironment.isRunningTests else { return } + Task.detached(priority: .utility) { do { let base = try FileManager.default.url( diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index e4ab59d4..be78e5a3 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1278,6 +1278,11 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele // Delete ALL media files (incoming and outgoing) in background Task.detached(priority: .utility) { + // The SPM test process shares the real Application Support tree, so + // this detached tree-delete can land mid-test under parallel + // scheduling and flake a file-dependent test; tests never need the + // on-disk media wiped. + guard !TestEnvironment.isRunningTests else { return } do { let base = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let filesDir = base.appendingPathComponent("files", isDirectory: true) diff --git a/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift b/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift index f7c61f3f..456932a7 100644 --- a/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift +++ b/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift @@ -329,4 +329,71 @@ struct PrekeyEndToEndTests { // The verified bundle now participates in Alice's sync rounds. #expect(alice._test_hasGossipPrekeyBundle(for: bob.myPeerID)) } + + @Test func spoofedSenderPrekeyBundleIsRejected() async throws { + let alice = makeService() + let bob = makeService() + + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + let (announce, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(announce, fromPeerID: bob.myPeerID, preseedPeer: false) + + // A relay re-broadcasts Bob's genuine bundle under a fabricated sender + // ID (the DoS that would multiply cache/gossip entries and exhaust the + // per-owner cap). Attribution is by the bundle's own key and the outer + // signature is bound to Bob's sender ID, so the spoof is dropped — no + // cache entry, and no gossip entry under either the fake or real ID. + let fakeSender = Data((0..<8).map { _ in UInt8.random(in: 0...255) }) + let spoofed = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: fakeSender, + recipientID: nil, + timestamp: bundlePacket.timestamp + 5_000, + payload: bundlePacket.payload, + signature: bundlePacket.signature, + ttl: bundlePacket.ttl + ) + alice._test_handlePacket(spoofed, fromPeerID: PeerID(hexData: fakeSender), preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.shortTimeout + ) + #expect(!cached) + #expect(!alice._test_hasGossipPrekeyBundle(for: bob.myPeerID)) + #expect(!alice._test_hasGossipPrekeyBundle(for: PeerID(hexData: fakeSender))) + } + + @Test func replayedPrekeyBundleWithFreshTimestampIsRejected() async throws { + let alice = makeService() + let bob = makeService() + + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + let (announce, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(announce, fromPeerID: bob.myPeerID, preseedPeer: false) + + // Rewriting the outer timestamp (to defeat the freshness window) + // invalidates the packet signature, which covers senderID + timestamp. + let replay = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: bundlePacket.senderID, + recipientID: nil, + timestamp: bundlePacket.timestamp + 5_000, + payload: bundlePacket.payload, + signature: bundlePacket.signature, + ttl: bundlePacket.ttl + ) + alice._test_handlePacket(replay, fromPeerID: bob.myPeerID, preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.shortTimeout + ) + #expect(!cached) + #expect(!alice._test_hasGossipPrekeyBundle(for: bob.myPeerID)) + } } diff --git a/bitchatTests/GossipSyncManagerTests.swift b/bitchatTests/GossipSyncManagerTests.swift index 82c5c87d..f5866857 100644 --- a/bitchatTests/GossipSyncManagerTests.swift +++ b/bitchatTests/GossipSyncManagerTests.swift @@ -489,14 +489,23 @@ struct GossipSyncManagerTests { let delegate = RecordingDelegate() manager.delegate = delegate - let sender = try #require(Data(hexString: "aabbccddeeff0011")) - let senderPeer = PeerID(hexData: sender) + // Bundles are keyed by their authenticated identity (the noise static + // key), not the packet senderID, so the payload must be a real bundle. + let noiseKey = Data(repeating: 0xAB, count: 32) + let senderPeer = PeerID(publicKey: noiseKey) + let sender = try #require(Data(hexString: senderPeer.id)) + let bundle = PrekeyBundle( + noiseStaticPublicKey: noiseKey, + prekeys: [PrekeyBundle.Prekey(id: 0, publicKey: Data(repeating: 0x11, count: 32))], + generatedAt: UInt64(Date().timeIntervalSince1970 * 1000), + signature: Data(count: PrekeyBundle.signatureLength) + ) let bundlePacket = BitchatPacket( type: MessageType.prekeyBundle.rawValue, senderID: sender, recipientID: nil, timestamp: UInt64(Date().timeIntervalSince1970 * 1000), - payload: Data([0x01]), + payload: try #require(bundle.encode()), signature: nil, ttl: 1 ) @@ -519,6 +528,41 @@ struct GossipSyncManagerTests { #expect(served.isRSR) } + @Test func prekeyBundleGossipIsKeyedByOwnerNotSenderID() { + // One valid bundle re-broadcast under many fabricated sender IDs must + // collapse to a single entry keyed by the bundle's own identity — the + // spray-to-exhaust-the-cap DoS produces one entry, not N. + let manager = GossipSyncManager(myPeerID: myPeerID, requestSyncManager: RequestSyncManager()) + let noiseKey = Data(repeating: 0xCD, count: 32) + let ownerPeer = PeerID(publicKey: noiseKey) + let bundle = PrekeyBundle( + noiseStaticPublicKey: noiseKey, + prekeys: [PrekeyBundle.Prekey(id: 0, publicKey: Data(repeating: 0x22, count: 32))], + generatedAt: UInt64(Date().timeIntervalSince1970 * 1000), + signature: Data(count: PrekeyBundle.signatureLength) + ) + guard let payload = bundle.encode() else { return } + + for i in 0..<5 { + let fakeSender = Data((0..<8).map { j in UInt8(truncatingIfNeeded: i * 31 + j) }) + let packet = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: fakeSender, + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000) + UInt64(i), + payload: payload, + signature: nil, + ttl: 1 + ) + manager.onPublicPacketSeen(packet) + manager._performMaintenanceSynchronously(now: Date()) + // No fabricated sender ID ever creates its own entry. + #expect(!manager._hasPrekeyBundle(for: PeerID(hexData: fakeSender))) + } + // Exactly the owner-keyed entry exists. + #expect(manager._hasPrekeyBundle(for: ownerPeer)) + } + // MARK: - Archive persistence @Test func publicMessagesRestoreFromArchiveAcrossRestart() async throws { diff --git a/bitchatTests/Prekeys/NoisePrekeyTests.swift b/bitchatTests/Prekeys/NoisePrekeyTests.swift index 7e58f04b..44a39d11 100644 --- a/bitchatTests/Prekeys/NoisePrekeyTests.swift +++ b/bitchatTests/Prekeys/NoisePrekeyTests.swift @@ -156,6 +156,15 @@ struct LocalPrekeyStoreTests { LocalPrekeyStore(keychain: keychain, now: { clock.now }) } + private func bundle(noiseKey: Data, prekeys: [PrekeyBundle.Prekey], generatedAt: UInt64) -> PrekeyBundle { + PrekeyBundle( + noiseStaticPublicKey: noiseKey, + prekeys: prekeys, + generatedAt: generatedAt, + signature: Data(count: PrekeyBundle.signatureLength) + ) + } + @Test func mintsFullBatchOnFirstUse() { let store = makeStore(clock: Clock()) let (prekeys, generatedAt) = store.currentBundlePrekeys() @@ -190,6 +199,42 @@ struct LocalPrekeyStoreTests { #expect(survivorIDs.isSubset(of: Set(replenished.map(\.id)))) } + @Test func consumingAPrekeyRepublishesANewerBundlePeersAccept() { + // Codex P1: consuming a prekey (even above the replenish threshold) + // must republish a strictly newer bundle so a peer that cached the old + // one replaces it and stops assigning the consumed ID before its 48h + // grace lapses. + let clock = Clock() + let store = makeStore(clock: clock) + let noiseKey = Data(repeating: 0xC0, count: 32) + + // Owner publishes; a peer caches it and would assign the first prekey. + let (initial, firstGeneratedAt) = store.currentBundlePrekeys() + let peerCache = PrekeyBundleStore(persistsToDisk: false) + #expect(peerCache.ingest(bundle(noiseKey: noiseKey, prekeys: initial, generatedAt: firstGeneratedAt))) + let consumedID = initial[0].id + #expect(peerCache.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey)?.id == consumedID) + + // The owner opens mail sealed to that prekey: it's retired and the + // republished bundle is strictly newer and no longer offers the ID. + #expect(store.markConsumed(consumedID)) + let (afterConsume, secondGeneratedAt) = store.currentBundlePrekeys() + #expect(secondGeneratedAt > firstGeneratedAt) + #expect(!afterConsume.contains { $0.id == consumedID }) + + // The peer accepts the replacement (a same-generatedAt copy would be + // rejected) and stops assigning the consumed ID for new mail. + #expect(peerCache.ingest(bundle(noiseKey: noiseKey, prekeys: afterConsume, generatedAt: secondGeneratedAt))) + #expect(peerCache.assignPrekey(messageID: "m2", recipientNoiseKey: noiseKey)?.id != consumedID) + + // 48h grace: the owner can still open a redelivery of the in-flight + // ciphertext sealed to the consumed ID until the window lapses. + clock.now = clock.now.addingTimeInterval(LocalPrekeyStore.Policy.consumedGraceSeconds - 60) + #expect(store.privateKey(for: consumedID) != nil) + clock.now = clock.now.addingTimeInterval(120) + #expect(store.privateKey(for: consumedID) == nil) + } + @Test func consumedPrivateSurvivesGraceWindowThenDies() { let clock = Clock() let store = makeStore(clock: clock) @@ -217,7 +262,11 @@ struct LocalPrekeyStoreTests { let second = LocalPrekeyStore(keychain: keychain, now: { clock.now }) let (reloaded, reloadedGeneratedAt) = second.currentBundlePrekeys() - #expect(reloadedGeneratedAt == generatedAt) + // Consuming a prekey shrinks the published bundle, so its generation + // stamp advances strictly (even without the clock moving) — peers must + // see a newer bundle to replace the one that still offered the + // consumed ID. + #expect(reloadedGeneratedAt > generatedAt) #expect(Set(reloaded.map(\.id)) == Set(prekeys.dropFirst().map(\.id))) // The consumed key is still openable within grace after a relaunch. #expect(second.privateKey(for: prekeys[0].id) != nil) From e0e90af9fdb383ee2ee740bbf310bbc5f15e20b9 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 22:38:45 +0200 Subject: [PATCH 024/158] Integration test fixes: reconcile SyncTypeFlags phantom-bit assertions and sync-round counts - SyncTypeFlags phantom-bit tests used bits 8/9/10 as unmapped examples; board/prekey/group now map those, so use bits 11+ (still unmapped). - rawValueInitNormalizesPhantomBits: highest known bit is now 10, so the flags serialize to 2 bytes, not 1. - Board/fragment/announce sync tests silence the prekey round (added by the prekeys feature; default 60s schedule fires at the maintenance barrier). - DiagnosticsMockContext: conform to the CommandContextProvider members added by private-groups (group*) and cashu-chips (sendPublicMessage). Co-Authored-By: Claude Fable 5 --- bitchatTests/GossipSyncManagerTests.swift | 4 ++++ .../Services/MeshDiagnosticsTests.swift | 6 ++++++ bitchatTests/Sync/GossipSyncBoardTests.swift | 3 +++ bitchatTests/Sync/SyncTypeFlagsBoardTests.swift | 9 +++++---- bitchatTests/Sync/SyncTypeFlagsTests.swift | 17 ++++++++++------- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/bitchatTests/GossipSyncManagerTests.swift b/bitchatTests/GossipSyncManagerTests.swift index ef9be2b9..76ffdb77 100644 --- a/bitchatTests/GossipSyncManagerTests.swift +++ b/bitchatTests/GossipSyncManagerTests.swift @@ -370,6 +370,8 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 0 config.fragmentSyncIntervalSeconds = 0 config.fileTransferSyncIntervalSeconds = 0 + // Silence the prekey round so the maintenance barrier below emits nothing. + config.prekeyBundleSyncIntervalSeconds = 0 let requestSyncManager = RequestSyncManager() let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) @@ -543,6 +545,8 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 0 config.fragmentSyncIntervalSeconds = 0 config.fileTransferSyncIntervalSeconds = 0 + // Silence the prekey round so the maintenance barrier isolates fragments. + config.prekeyBundleSyncIntervalSeconds = 0 let requestSyncManager = RequestSyncManager() let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) diff --git a/bitchatTests/Services/MeshDiagnosticsTests.swift b/bitchatTests/Services/MeshDiagnosticsTests.swift index af22d393..d716791f 100644 --- a/bitchatTests/Services/MeshDiagnosticsTests.swift +++ b/bitchatTests/Services/MeshDiagnosticsTests.swift @@ -276,9 +276,15 @@ private final class DiagnosticsMockContext: CommandContextProvider { func clearCurrentPublicTimeline() {} func clearPrivateChat(_ peerID: PeerID) {} func sendPublicRaw(_ content: String) {} + func sendPublicMessage(_ content: String) {} func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) {} func addPublicSystemMessage(_ content: String) {} func toggleFavorite(peerID: PeerID) {} + func groupCreate(named name: String) -> CommandResult { .handled } + func groupInvite(nickname: String) -> CommandResult { .handled } + func groupRemove(nickname: String) -> CommandResult { .handled } + func groupLeave() -> CommandResult { .handled } + func groupList() -> CommandResult { .handled } func currentCommandDestination() -> CommandOutputDestination { if let peerID = selectedPrivateChatPeer { diff --git a/bitchatTests/Sync/GossipSyncBoardTests.swift b/bitchatTests/Sync/GossipSyncBoardTests.swift index acfbf127..8676531a 100644 --- a/bitchatTests/Sync/GossipSyncBoardTests.swift +++ b/bitchatTests/Sync/GossipSyncBoardTests.swift @@ -34,6 +34,9 @@ struct GossipSyncBoardTests { config.messageSyncIntervalSeconds = 0 config.fragmentSyncIntervalSeconds = 0 config.fileTransferSyncIntervalSeconds = 0 + // Silence the prekey round (added by the prekeys feature; groupMessage + // rides the message schedule, already off) so board is isolated. + config.prekeyBundleSyncIntervalSeconds = 0 return config } diff --git a/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift b/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift index 49fd553b..47623f8f 100644 --- a/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift +++ b/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift @@ -38,9 +38,10 @@ struct SyncTypeFlagsBoardTests { /// decode path accepts the bytes and simply maps unknown bits to no /// message type, so a board-only request reads as "nothing I can serve". @Test func unknownBitsDecodeToNoTypes() throws { - // Bits 9-15 are unassigned; a future (or unknown) two-byte bitfield + // Bits 11-15 are unassigned after the feature integration (bit 8 is + // board, 9 prekey, 10 group); a future (or unknown) two-byte bitfield // must decode without error and yield no known types. - let decoded = try #require(SyncTypeFlags.decode(Data([0x00, 0xFE]))) + let decoded = try #require(SyncTypeFlags.decode(Data([0x00, 0xF8]))) #expect(decoded.toMessageTypes().isEmpty) for type in [MessageType.announce, .message, .fragment, .fileTransfer, .boardPost] { #expect(!decoded.contains(type)) @@ -48,8 +49,8 @@ struct SyncTypeFlagsBoardTests { } @Test func mixedKnownAndUnknownBitsKeepKnownTypes() throws { - // Known low-byte flags survive alongside unknown high bits. - let decoded = try #require(SyncTypeFlags.decode(Data([0x03, 0xFE]))) + // Known low-byte flags survive alongside unknown high bits (11-15). + let decoded = try #require(SyncTypeFlags.decode(Data([0x03, 0xF8]))) #expect(decoded.contains(.announce)) #expect(decoded.contains(.message)) #expect(Set(decoded.toMessageTypes()) == Set([.announce, .message])) diff --git a/bitchatTests/Sync/SyncTypeFlagsTests.swift b/bitchatTests/Sync/SyncTypeFlagsTests.swift index a3ab3cc4..15e33f4b 100644 --- a/bitchatTests/Sync/SyncTypeFlagsTests.swift +++ b/bitchatTests/Sync/SyncTypeFlagsTests.swift @@ -13,17 +13,19 @@ struct SyncTypeFlagsTests { } @Test func decodeDropsPhantomBits() { - // Bits 8+ map to no message type. They must not survive decode as + // Bits 11+ map to no message type (bits 8/9/10 are board/prekey/group + // after the feature integration). They must not survive decode as // phantom membership. - let phantom = Data([0x00, 0xFF]) // bits 8..15 set, no known type + let phantom = Data([0x00, 0xF8]) // bits 11..15 set, no known type let decoded = SyncTypeFlags.decode(phantom) #expect(decoded?.rawValue == 0) #expect(decoded?.toMessageTypes().isEmpty == true) } @Test func phantomBitsAreStrippedButKnownBitsSurvive() { - // Low byte = announce(0) + message(1); high byte = phantom. - let mixed = Data([0b0000_0011, 0xFF]) + // Low byte = announce(0) + message(1); high byte = phantom (bits 11+, + // which map to no known type). + let mixed = Data([0b0000_0011, 0xF8]) let decoded = SyncTypeFlags.decode(mixed) #expect(decoded?.contains(.announce) == true) #expect(decoded?.contains(.message) == true) @@ -33,11 +35,12 @@ struct SyncTypeFlagsTests { @Test func rawValueInitNormalizesPhantomBits() { let flags = SyncTypeFlags(rawValue: 0xFFFF_FFFF_FFFF_FFFF) - // Every known type bit is set; nothing above them survives, so the - // field serializes to a single byte. + // Every known type bit is set; nothing above them survives. The + // highest known bit is 10 (groupMessage), so the field serializes to + // two bytes. #expect(flags.contains(.announce)) #expect(flags.contains(.fileTransfer)) let data = flags.toData() - #expect(data?.count == 1) + #expect(data?.count == 2) } } From 02aa1d67db98f6013dafd29f210c5870dcf04a2c Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 23:04:33 +0200 Subject: [PATCH 025/158] Observability: DEBUG debug-level default, greppable decision tags, log export + UDP LAN sink Debugging the integration build on real iOS 26.5 devices over the air. - BitLogger DEBUG default minimumLevel now .debug (was .info) so a tap-launched sideload surfaces .debug decision logs without the BITCHAT_LOG_LEVEL env var; env still wins; release unchanged (.info, emits nothing). Extracted defaultMinimumLevel + a test asserting it. - Greppable bracket decision tags at .info (visible even at .info) via SecureLogger, ID-prefixes only, sanitized: [ROUTE] source-route vs flood origination (+reason) + fragment targeted-resync; [GW] uplink accept/reject, downlink rebroadcast/drop, loop skips, drain-timer; [WIFI] offer/accept/decline, AWDL connect, transfer start/complete+bytes, fallback+reason; [PREKEY] seal choice, consume, unknown-prekey open fail, bundle ingest, re-gossip; [SYNC] one concise summary per cycle + per-request served counts (no per-packet spam); [PING]/[TRACE] RTT + computed path. - New OSLog categories: mesh, gateway, transport. - Refactored BLESourceRouteOriginationPolicy.route -> decide returning a Decision enum (flood(reason)/route(hops)) so the flood reason is greppable and unit-tested. - DEBUG-only in-memory ring buffer (LogExportBuffer, ~2000 lines/512KB, thread-safe, off main thread) + App Info "Export Logs" share sheet (iOS UIActivityViewController / macOS NSSavePanel), VoiceOver labels. - DEBUG-only UDP LAN log sink (LogNetworkSink): opt-in, off by default, fire-and-forget, never blocks/throws; each line prefixed with the device nickname for demux; configured via App Info host:port fields. Same sanitized formatted line feeds buffer, sink, and export. All new code is #if DEBUG; release emits nothing and ships no export/sink UI. Co-Authored-By: Claude Fable 5 --- bitchat/BitchatApp.swift | 8 ++ bitchat/Services/BLE/BLEService.swift | 40 ++++-- .../BLE/BLESourceRouteOriginationPolicy.swift | 41 ++++-- bitchat/Services/Gateway/GatewayService.swift | 31 +++-- bitchat/Services/NoiseEncryptionService.swift | 1 + .../Services/WifiBulk/WifiBulkChannel.swift | 7 +- .../WifiBulk/WifiBulkTransferService.swift | 22 +-- bitchat/Sync/GossipSyncManager.swift | 26 +++- bitchat/Sync/SyncTypeFlags.swift | 15 +++ bitchat/Views/AppInfoView.swift | 127 ++++++++++++++++++ ...BLESourceRouteOriginationPolicyTests.swift | 28 ++-- .../BitLogger/Sources/LogExportBuffer.swift | 64 +++++++++ .../BitLogger/Sources/LogNetworkSink.swift | 104 ++++++++++++++ .../BitLogger/Sources/OSLog+Categories.swift | 7 + .../BitLogger/Sources/SecureLogger.swift | 51 ++++++- .../Tests/LogLevelFilteringTests.swift | 21 +++ 16 files changed, 530 insertions(+), 63 deletions(-) create mode 100644 localPackages/BitLogger/Sources/LogExportBuffer.swift create mode 100644 localPackages/BitLogger/Sources/LogNetworkSink.swift diff --git a/bitchat/BitchatApp.swift b/bitchat/BitchatApp.swift index e606506f..1e81e87d 100644 --- a/bitchat/BitchatApp.swift +++ b/bitchat/BitchatApp.swift @@ -8,6 +8,9 @@ import SwiftUI import UserNotifications +#if DEBUG +import BitLogger +#endif @main struct BitchatApp: App { @@ -43,6 +46,11 @@ struct BitchatApp: App { .onAppear { appDelegate.runtime = runtime runtime.start() + #if DEBUG + // Arm the opt-in UDP log sink from persisted config (no-op + // until a collector host is set in the App Info sheet). + LogNetworkSink.shared.reloadConfiguration() + #endif } .onOpenURL { url in runtime.handleOpenURL(url) diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 3f03c2b6..cc342856 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -2703,7 +2703,7 @@ extension BLEService { private func applyRouteIfAvailable(_ packet: BitchatPacket, to recipient: PeerID) -> BitchatPacket { let now = Date() - let route = BLESourceRouteOriginationPolicy.route( + let decision = BLESourceRouteOriginationPolicy.decide( for: packet, to: recipient, localPeerIDData: myPeerIDData, @@ -2715,7 +2715,19 @@ extension BLEService { }, computeRoute: { self.computeRoute(to: $0) } ) - guard let route else { return packet } + let route: [Data] + switch decision { + case .flood(let reason): + // Only log the interesting directed cases; a plain broadcast keeps + // flood by design and would spam the origination path. + if reason != .broadcast { + SecureLogger.info("[ROUTE] flood to \(recipient.id.prefix(8))… (\(reason.rawValue))", category: .mesh) + } + return packet + case .route(let hops): + SecureLogger.info("[ROUTE] source-route to \(recipient.id.prefix(8))… via \(hops.count) hop(s)", category: .mesh) + route = hops + } // Create new packet with route applied and version upgraded to 2 let routedPacket = BitchatPacket( type: packet.type, @@ -2805,7 +2817,7 @@ extension BLEService { private func handleMeshPing(_ packet: BitchatPacket, fromLink linkPeerID: PeerID) { guard packet.recipientID == myPeerIDData else { return } guard let ping = MeshPingPayload.decode(packet.payload) else { - SecureLogger.debug("⚠️ Malformed ping via \(linkPeerID.id.prefix(8))…", category: .session) + SecureLogger.debug("[PING] malformed ping via \(linkPeerID.id.prefix(8))…", category: .mesh) return } let allowed = collectionsQueue.sync(flags: .barrier) { @@ -2813,7 +2825,7 @@ extension BLEService { } guard allowed else { if logRateLimiter.shouldLog(key: "ping-limit:\(linkPeerID.id)") { - SecureLogger.warning("🚫 Rate-limiting pings via link \(linkPeerID.id.prefix(8))…", category: .security) + SecureLogger.warning("[PING] rate-limiting pings via link \(linkPeerID.id.prefix(8))…", category: .mesh) } return } @@ -2847,6 +2859,7 @@ extension BLEService { rttMs: max(0, rttMs), hops: MeshPingPayload.hopCount(originTTL: pong.originTTL, receivedTTL: packet.ttl) ) + SecureLogger.info("[PING] pong from \(peerID.id.prefix(8))… rtt=\(result.rttMs)ms hops=\(result.hops)", category: .mesh) Task { @MainActor in pending.completion(result) } } @@ -2855,11 +2868,15 @@ extension BLEService { func computeMeshPath(to peerID: PeerID) -> [PeerID]? { refreshLocalTopology() if let route = computeRoute(to: peerID) { - return route.compactMap { PeerID(routingData: $0) } + let path = route.compactMap { PeerID(routingData: $0) } + SecureLogger.info("[TRACE] path to \(peerID.id.prefix(8))… via \(path.count) hop(s)", category: .mesh) + return path } // Confirmed claims can lag a brand-new link (the peer's next announce // hasn't arrived yet); a live direct connection is still a known path. - return isPeerConnected(peerID) ? [] : nil + let direct = isPeerConnected(peerID) + SecureLogger.info("[TRACE] path to \(peerID.id.prefix(8))… \(direct ? "direct (0 hops)" : "no known path")", category: .mesh) + return direct ? [] : nil } /// Mesh graph for the topology map. Edges are advisory: announces cap @@ -3005,9 +3022,11 @@ extension BLEService { if let prekey = assignRecipientPrekey(messageID: messageID, recipientNoiseKey: recipientNoiseKey) { sealed = try noiseService.sealPrekeyPayload(typedPayload, recipientPrekey: prekey) prekeyID = prekey.id + SecureLogger.info("[PREKEY] seal prekey (id=\(prekey.id)) id=\(messageID.prefix(8))…", category: .session) } else { sealed = try noiseService.sealCourierPayload(typedPayload, recipientStaticKey: recipientNoiseKey) prekeyID = nil + SecureLogger.info("[PREKEY] seal static (no bundle) id=\(messageID.prefix(8))…", category: .session) } let envelope = CourierEnvelope( recipientTag: CourierEnvelope.recipientTag( @@ -3101,6 +3120,7 @@ extension BLEService { (typedPayload, senderStaticKey) = (opened.payload, opened.senderStaticKey) if opened.consumedPrekey { let replenished = noiseService.replenishPrekeysIfNeeded() + SecureLogger.info("[PREKEY] consume id=\(prekeyID), re-gossip bundle (replenished=\(replenished))", category: .session) sendPrekeyBundle(force: replenished) } } else { @@ -3332,7 +3352,7 @@ extension BLEService { return nil } guard let signingKey else { - SecureLogger.debug("🔑 Deferring prekey bundle without a bound signing key (owner \(owner.id.prefix(8))…)", category: .security) + SecureLogger.debug("[PREKEY] bundle defer (no bound signing key) owner \(owner.id.prefix(8))…", category: .session) return } ingestVerifiedPrekeyBundle(bundle, packet: packet, owner: owner, signingKey: signingKey) @@ -3343,11 +3363,13 @@ extension BLEService { private func ingestVerifiedPrekeyBundle(_ bundle: PrekeyBundle, packet: BitchatPacket, owner: PeerID, signingKey: Data) { guard noiseService.verifyPrekeyBundleSignature(bundle, signingPublicKey: signingKey), noiseService.verifyPacketSignature(packet, publicKey: signingKey) else { - SecureLogger.debug("🔑 Ignoring prekey bundle without verifiable signature (owner \(owner.id.prefix(8))…)", category: .security) + SecureLogger.info("[PREKEY] bundle reject (bad signature) owner \(owner.id.prefix(8))…", category: .session) return } if prekeyBundleStore.ingest(bundle) { - SecureLogger.debug("🔑 Cached prekey bundle for \(owner.id.prefix(8))… (\(bundle.prekeys.count) prekeys)", category: .security) + SecureLogger.info("[PREKEY] bundle accept owner \(owner.id.prefix(8))… (\(bundle.prekeys.count) prekeys)", category: .session) + } else { + SecureLogger.debug("[PREKEY] bundle reject (not newer/invalid) owner \(owner.id.prefix(8))…", category: .session) } gossipSyncManager?.onPublicPacketSeen(packet) } diff --git a/bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift b/bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift index 5cc8bf9c..48d3d173 100644 --- a/bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift +++ b/bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift @@ -4,8 +4,27 @@ import Foundation /// Decides whether an outbound directed packet should carry a v2 source /// route. Pure gating logic so BLEService's hot send path stays a thin wire. enum BLESourceRouteOriginationPolicy { - /// Returns the intermediate-hop route to attach, or nil to keep the - /// current flood/direct-write behavior unchanged. + /// Why a packet kept flood/direct-write behavior instead of routing. + /// The `rawValue` doubles as the greppable `[ROUTE]` log reason. + enum FloodReason: String { + case relayedNotOriginator = "not originator" + case broadcast = "broadcast recipient" + case noTTLHeadroom = "link-local ttl" + case recipientDirect = "recipient direct" + case routeSuppressed = "route suppressed→flood" + case noPath = "no v2 path" + } + + /// The routing decision for an originated packet. + enum Decision: Equatable { + /// Keep flood/direct-write behavior unchanged; carries the reason. + case flood(FloodReason) + /// Originate a v2 source route over these intermediate hops. + case route([Data]) + } + + /// Returns whether to originate a v2 source route (with its hops) or keep + /// flood/direct-write, with the reason for the latter. /// /// Routes are only originated when every gate passes: /// - we authored the packet (relays must not rewrite and re-sign someone @@ -19,22 +38,22 @@ enum BLESourceRouteOriginationPolicy { /// - routing to the recipient is not suppressed by a recent unconfirmed /// routed send, and /// - the topology yields a complete path. - static func route( + static func decide( for packet: BitchatPacket, to recipient: PeerID, localPeerIDData: Data, isRecipientConnected: (PeerID) -> Bool, shouldAttemptRoute: (PeerID) -> Bool, computeRoute: (PeerID) -> [Data]? - ) -> [Data]? { - guard packet.senderID == localPeerIDData else { return nil } + ) -> Decision { + guard packet.senderID == localPeerIDData else { return .flood(.relayedNotOriginator) } guard let recipientData = packet.recipientID, recipientData.count == 8, - !recipientData.allSatisfy({ $0 == 0xFF }) else { return nil } - guard packet.ttl > 1 else { return nil } - guard !isRecipientConnected(recipient) else { return nil } - guard shouldAttemptRoute(recipient) else { return nil } - guard let route = computeRoute(recipient), !route.isEmpty else { return nil } - return route + !recipientData.allSatisfy({ $0 == 0xFF }) else { return .flood(.broadcast) } + guard packet.ttl > 1 else { return .flood(.noTTLHeadroom) } + guard !isRecipientConnected(recipient) else { return .flood(.recipientDirect) } + guard shouldAttemptRoute(recipient) else { return .flood(.routeSuppressed) } + guard let route = computeRoute(recipient), !route.isEmpty else { return .flood(.noPath) } + return .route(route) } } diff --git a/bitchat/Services/Gateway/GatewayService.swift b/bitchat/Services/Gateway/GatewayService.swift index e325cb39..c7bbb1ba 100644 --- a/bitchat/Services/Gateway/GatewayService.swift +++ b/bitchat/Services/Gateway/GatewayService.swift @@ -152,7 +152,7 @@ final class GatewayService: ObservableObject { pendingDownlinks.removeAll() uplinkDepositTimes.removeAll() } - SecureLogger.info("🌐 Gateway mode \(enabled ? "enabled" : "disabled")", category: .session) + SecureLogger.info("[GW] mode \(enabled ? "enabled" : "disabled")", category: .gateway) onEnabledChanged?(enabled) } @@ -163,7 +163,7 @@ final class GatewayService: ObservableObject { /// for broadcasts (downlink rebroadcasts from a gateway). func handleMeshCarrier(_ payload: Data, from peerID: PeerID, directedToUs: Bool) { guard let carrier = NostrCarrierPacket.decode(payload) else { - SecureLogger.debug("🌐 Gateway: dropping undecodable carrier from \(peerID.id.prefix(8))…", category: .session) + SecureLogger.debug("[GW] carrier drop (undecodable) from \(peerID.id.prefix(8))…", category: .gateway) return } switch carrier.direction { @@ -186,7 +186,7 @@ final class GatewayService: ObservableObject { // age) — no crypto — so junk and stale replays are dropped before we // ever pay for a MainActor Schnorr verify. guard let event = structurallyValidEvent(from: carrier) else { - SecureLogger.debug("🌐 Gateway: rejected uplink deposit from \(depositor.id.prefix(8))… (failed validation)", category: .security) + SecureLogger.info("[GW] uplink reject (validation) from \(depositor.id.prefix(8))…", category: .gateway) return } // Dedup by the carried event ID BEFORE verification. Loop rule 1: a @@ -197,18 +197,19 @@ final class GatewayService: ObservableObject { guard !meshBroadcastEventIDs.contains(event.id), !publishedEventIDs.contains(event.id), !queuedUplinks.contains(where: { $0.event.id == event.id }) else { + SecureLogger.debug("[GW] uplink skip (loop/dup) \(event.id.prefix(8))…", category: .gateway) return } // Consume the per-depositor rate token BEFORE the expensive verify so // a flood of distinct forged/junk deposits is bounded by cheap work, // not by main-actor Schnorr verifications. guard allowUplinkDeposit(from: depositor) else { - SecureLogger.debug("🌐 Gateway: rate-limited uplink deposit from \(depositor.id.prefix(8))…", category: .session) + SecureLogger.info("[GW] uplink reject (rate-limit) from \(depositor.id.prefix(8))…", category: .gateway) return } // Only now pay for cryptographic verification; receivers verify again. guard event.isValidSignature() else { - SecureLogger.debug("🌐 Gateway: rejected uplink deposit from \(depositor.id.prefix(8))… (bad signature)", category: .security) + SecureLogger.info("[GW] uplink reject (sig-fail) from \(depositor.id.prefix(8))…", category: .gateway) return } @@ -218,6 +219,9 @@ final class GatewayService: ObservableObject { accepted = true } else { accepted = enqueueUplink(QueuedUplink(depositor: depositor, geohash: carrier.geohash, event: event, queuedAt: now())) + if accepted { + SecureLogger.info("[GW] uplink accept→queue \(event.id.prefix(8))… (relays down)", category: .gateway) + } } // Only render on our own timeline what we actually accepted for @@ -243,7 +247,7 @@ final class GatewayService: ObservableObject { private func publish(_ event: NostrEvent, geohash: String) { publishedEventIDs.insert(event.id) publishToRelays?(event, geohash) - SecureLogger.info("🌐 Gateway: published carried event \(event.id.prefix(8))… to relays for #\(geohash)", category: .session) + SecureLogger.info("[GW] uplink accept→publish \(event.id.prefix(8))… to relays for #\(geohash)", category: .gateway) } /// Returns true when the item was actually stored for later publish. @@ -251,7 +255,7 @@ final class GatewayService: ObservableObject { private func enqueueUplink(_ item: QueuedUplink) -> Bool { let fromDepositor = queuedUplinks.filter { $0.depositor == item.depositor }.count guard fromDepositor < Limits.maxQueuedUplinksPerDepositor else { - SecureLogger.debug("🌐 Gateway: uplink queue quota reached for \(item.depositor.id.prefix(8))…", category: .session) + SecureLogger.info("[GW] uplink reject (quota) for \(item.depositor.id.prefix(8))…", category: .gateway) return false } if queuedUplinks.count >= Limits.maxQueuedUplinks { @@ -294,6 +298,7 @@ final class GatewayService: ObservableObject { // event's own `#g` tag to match the carrier geohash. guard isFresh(event), event.tags.contains(where: { $0.count >= 2 && $0[0] == "g" && $0[1] == geohash }) else { + SecureLogger.debug("[GW] downlink drop (stale/mismatch) \(event.id.prefix(8))…", category: .gateway) return } // Loop rule 1: never rebroadcast mesh-carried events back onto the @@ -305,10 +310,14 @@ final class GatewayService: ObservableObject { guard !meshBroadcastEventIDs.contains(event.id), !rebroadcastEventIDs.contains(event.id), !pendingDownlinks.contains(where: { $0.event.id == event.id }) else { + SecureLogger.debug("[GW] downlink skip (loop/dup) \(event.id.prefix(8))…", category: .gateway) return } // Verify before spending BLE airtime; receivers verify again. - guard event.isValidSignature() else { return } + guard event.isValidSignature() else { + SecureLogger.debug("[GW] downlink drop (sig-fail) \(event.id.prefix(8))…", category: .gateway) + return + } pendingDownlinks.append((event, geohash)) if pendingDownlinks.count > Limits.maxPendingDownlinks { @@ -316,6 +325,7 @@ final class GatewayService: ObservableObject { // dropped event is not yet in `rebroadcastEventIDs`, so a later // relay redelivery can still carry it. pendingDownlinks.removeFirst(pendingDownlinks.count - Limits.maxPendingDownlinks) + SecureLogger.info("[GW] downlink drop-oldest (budget), \(pendingDownlinks.count) pending", category: .gateway) } drainPendingDownlinks() } @@ -332,6 +342,7 @@ final class GatewayService: ObservableObject { guard let carrier = NostrCarrierPacket(direction: .fromGateway, geohash: geohash, event: event), let payload = carrier.encode() else { continue } broadcastToMesh?(payload) + SecureLogger.info("[GW] downlink rebroadcast \(event.id.prefix(8))… to mesh for #\(geohash)", category: .gateway) // Mark-after-send: only now is the relay event definitively // rebroadcast (loop rule 2). rebroadcastEventIDs.insert(event.id) @@ -351,9 +362,11 @@ final class GatewayService: ObservableObject { let oldest = downlinkSendTimes.min() ?? now() let delay = max(0.05, 60 - now().timeIntervalSince(oldest)) downlinkDrainScheduled = true + SecureLogger.info("[GW] drain-timer armed (\(String(format: "%.1f", delay))s, \(pendingDownlinks.count) pending)", category: .gateway) let fire: @MainActor () -> Void = { [weak self] in guard let self else { return } self.downlinkDrainScheduled = false + SecureLogger.info("[GW] drain-timer fired", category: .gateway) self.drainPendingDownlinks() } if let scheduleDrainTimer { @@ -408,7 +421,7 @@ final class GatewayService: ObservableObject { return false } guard sendToGatewayPeer?(payload, gateway) ?? false else { return false } - SecureLogger.info("🌐 Gateway: uplinked event \(event.id.prefix(8))… for #\(geohash) via mesh gateway \(gateway.id.prefix(8))…", category: .session) + SecureLogger.info("[GW] uplink send \(event.id.prefix(8))… for #\(geohash) via gateway \(gateway.id.prefix(8))…", category: .gateway) return true } diff --git a/bitchat/Services/NoiseEncryptionService.swift b/bitchat/Services/NoiseEncryptionService.swift index 9e7e6eae..1642f618 100644 --- a/bitchat/Services/NoiseEncryptionService.swift +++ b/bitchat/Services/NoiseEncryptionService.swift @@ -463,6 +463,7 @@ final class NoiseEncryptionService { /// so the caller can re-gossip the shrunken bundle only when it changed. func openPrekeyPayload(_ envelopeCiphertext: Data, prekeyID: UInt32) throws -> (payload: Data, senderStaticKey: Data, consumedPrekey: Bool) { guard let prekeyPrivate = localPrekeys.privateKey(for: prekeyID) else { + SecureLogger.info("[PREKEY] open failed (unknown prekey id=\(prekeyID))", category: .session) throw NoiseEncryptionError.unknownPrekey } let handshake = NoiseHandshakeState( diff --git a/bitchat/Services/WifiBulk/WifiBulkChannel.swift b/bitchat/Services/WifiBulk/WifiBulkChannel.swift index af0b67c5..76327538 100644 --- a/bitchat/Services/WifiBulk/WifiBulkChannel.swift +++ b/bitchat/Services/WifiBulk/WifiBulkChannel.swift @@ -137,7 +137,7 @@ final class WifiBulkSenderSession { do { listener = try NWListener(using: parameters) } catch { - SecureLogger.error("WifiBulk: listener creation failed: \(error)", category: .session) + SecureLogger.error("[WIFI] listener creation failed: \(error)", category: .transport) return false } listener.service = service @@ -214,7 +214,7 @@ final class WifiBulkSenderSession { guard let self, let connection, !self.finished, self.authenticated == nil else { return false } guard WifiBulkCrypto.validateClientAuthFrameBody(body, transferID: self.transferID, key: key) else { // Bonjour-level gatecrasher: no channel key, no service. - SecureLogger.warning("WifiBulk: disconnecting client with invalid auth frame", category: .security) + SecureLogger.warning("[WIFI] AWDL connect rejected (invalid auth frame)", category: .security) self.dropCandidate(connection) return false } @@ -238,6 +238,7 @@ final class WifiBulkSenderSession { candidate.cancel() } candidates.removeAll() + SecureLogger.info("[WIFI] AWDL connected (sender), streaming \(totalChunks) chunk(s)", category: .transport) streamChunk(at: 0, over: connection, key: key, receiptBuffer: residualBuffer) } @@ -372,8 +373,10 @@ final class WifiBulkReceiverSession { guard let self else { return } switch state { case .ready: + SecureLogger.info("[WIFI] AWDL connect established (receiver)", category: .transport) self.sendAuthFrameAndReceive() case .failed(let error): + SecureLogger.info("[WIFI] AWDL connect failed: \(error)", category: .transport) self.fail("connect failed: \(error)") case .waiting(let error): // .waiting can resolve on its own, but a per-transfer channel diff --git a/bitchat/Services/WifiBulk/WifiBulkTransferService.swift b/bitchat/Services/WifiBulk/WifiBulkTransferService.swift index f4ff408a..d71bad60 100644 --- a/bitchat/Services/WifiBulk/WifiBulkTransferService.swift +++ b/bitchat/Services/WifiBulk/WifiBulkTransferService.swift @@ -172,6 +172,7 @@ final class WifiBulkTransferService { serviceName: serviceName ) guard let offerData = offer.encode() else { + SecureLogger.info("[WIFI] fallback→BLE to \(peerID.id.prefix(8))… (offer encode failed)", category: .transport) fallbackToBLE() return } @@ -229,7 +230,7 @@ final class WifiBulkTransferService { return } - SecureLogger.debug("WifiBulk: offered \(payload.count) bytes to \(peerID.id.prefix(8))… over \(serviceName.prefix(8))…", category: .session) + SecureLogger.info("[WIFI] offer sent \(payload.count) bytes to \(peerID.id.prefix(8))… over \(serviceName.prefix(8))…", category: .transport) environment.progressStart(transferId, session.totalChunks) let offerTimeout = DispatchWorkItem { [weak self, weak transfer] in @@ -271,6 +272,7 @@ final class WifiBulkTransferService { transfer.accepted = true transfer.offerTimeout?.cancel() transfer.offerTimeout = nil + SecureLogger.info("[WIFI] offer accepted by \(peerID.id.prefix(8))…, activating channel", category: .transport) transfer.session?.activate(key: key) } @@ -284,13 +286,13 @@ final class WifiBulkTransferService { switch outcome { case .completed: - SecureLogger.debug("WifiBulk: transfer \(transfer.transferId.prefix(8))… completed (\(reason))", category: .session) + SecureLogger.info("[WIFI] transfer \(transfer.transferId.prefix(8))… complete (\(reason))", category: .transport) case .fallback: - SecureLogger.info("WifiBulk: transfer \(transfer.transferId.prefix(8))… falling back to BLE (\(reason))", category: .session) + SecureLogger.info("[WIFI] fallback→BLE \(transfer.transferId.prefix(8))… (\(reason))", category: .transport) environment.progressReset(transfer.transferId) transfer.fallback() case .cancelled: - SecureLogger.debug("WifiBulk: transfer \(transfer.transferId.prefix(8))… cancelled", category: .session) + SecureLogger.info("[WIFI] transfer \(transfer.transferId.prefix(8))… cancelled", category: .transport) environment.progressCancel(transfer.transferId) } } @@ -338,13 +340,13 @@ final class WifiBulkTransferService { let transfer = IncomingTransfer(offer: offer, peerID: peerID, key: key) incoming[offer.transferID] = transfer - SecureLogger.debug("WifiBulk: accepted offer of \(offer.fileSize) bytes from \(peerID.id.prefix(8))…", category: .session) + SecureLogger.info("[WIFI] offer accept \(offer.fileSize) bytes from \(peerID.id.prefix(8))…", category: .transport) startBrowsing(for: transfer) let windowTimeout = DispatchWorkItem { [weak self, weak transfer] in guard let self, let transfer else { return } - SecureLogger.info("WifiBulk: incoming transfer window expired", category: .session) + SecureLogger.info("[WIFI] incoming window expired", category: .transport) self.tearDownIncoming(transfer) } transfer.windowTimeout = windowTimeout @@ -352,7 +354,7 @@ final class WifiBulkTransferService { } private func decline(offer: WifiBulkOffer, peerID: PeerID) { - SecureLogger.debug("WifiBulk: declining offer of \(offer.fileSize) bytes from \(peerID.id.prefix(8))…", category: .session) + SecureLogger.info("[WIFI] offer decline \(offer.fileSize) bytes from \(peerID.id.prefix(8))…", category: .transport) guard let responseData = WifiBulkResponse.decline(transferID: offer.transferID).encode() else { return } _ = environment.sendNoisePayload( BLENoisePayloadFactory.typedPayload(.bulkTransferResponse, payload: responseData), @@ -380,7 +382,7 @@ final class WifiBulkTransferService { browser.stateUpdateHandler = { [weak self, weak transfer] state in guard let self, let transfer else { return } if case .failed(let error) = state { - SecureLogger.warning("WifiBulk: browser failed: \(error)", category: .session) + SecureLogger.warning("[WIFI] browser failed: \(error)", category: .transport) self.tearDownIncoming(transfer) } } @@ -416,13 +418,13 @@ final class WifiBulkTransferService { } session.onCompleted = { [weak self, weak transfer] payload in guard let self, let transfer else { return } - SecureLogger.debug("WifiBulk: received \(payload.count) bytes from \(transfer.peerID.id.prefix(8))…", category: .session) + SecureLogger.info("[WIFI] transfer complete, received \(payload.count) bytes from \(transfer.peerID.id.prefix(8))…", category: .transport) self.environment.deliverReceivedFile(payload, transfer.peerID, self.config.maxIncomingPayloadBytes) self.tearDownIncoming(transfer) } session.onFailed = { [weak self, weak transfer] reason in guard let self, let transfer else { return } - SecureLogger.info("WifiBulk: incoming transfer failed (\(reason)); sender falls back to BLE", category: .session) + SecureLogger.info("[WIFI] incoming failed (\(reason)); sender falls back to BLE", category: .transport) self.tearDownIncoming(transfer) } transfer.session = session diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index af12bc5c..78c0ac21 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -313,7 +313,6 @@ final class GossipSyncManager { private func sendPeriodicSync(for types: SyncTypeFlags) { // Unicast sync to connected peers to allow RSR attribution if let connectedPeers = delegate?.getConnectedPeers(), !connectedPeers.isEmpty { - SecureLogger.debug("Sending periodic sync to \(connectedPeers.count) connected peers", category: .sync) for peerID in connectedPeers { sendRequestSync(to: peerID, types: types) } @@ -350,7 +349,7 @@ final class GossipSyncManager { private func _requestMissingFragments(_ fragmentIDs: [Data]) { guard let filter = RequestSyncPacket.encodeFragmentIdFilter(fragmentIDs) else { return } guard let connectedPeers = delegate?.getConnectedPeers(), !connectedPeers.isEmpty else { return } - SecureLogger.debug("Requesting \(fragmentIDs.count) stalled fragment stream(s) from \(connectedPeers.count) peer(s)", category: .sync) + SecureLogger.info("[ROUTE] targeted-resync \(fragmentIDs.count) stalled fragment stream(s) from \(connectedPeers.count) peer(s)", category: .mesh) for peerID in connectedPeers { sendRequestSync(to: peerID, types: .fragment, fragmentIdFilter: filter) } @@ -391,7 +390,7 @@ final class GossipSyncManager { // A response can replay the whole store, so bound how often one peer // can trigger a diff pass regardless of how fast it asks. guard responseRateLimiter.shouldRespond(to: peerID, now: Date()) else { - SecureLogger.warning("Rate-limited REQUEST_SYNC from \(peerID.id.prefix(8))…", category: .sync) + SecureLogger.warning("[SYNC] rate-limited REQUEST_SYNC from \(peerID.id.prefix(8))…", category: .sync) return } let requestedTypes = (request.types ?? .publicMessages) @@ -399,6 +398,9 @@ final class GossipSyncManager { // older packets are outside the filter but not missing, and without // the cursor they would be re-sent every round. let since = request.sinceTimestamp + // One concise per-request summary (RSR is already rate-limited per + // peer), never per-packet spam. + var servedCount = 0 // Decode GCS into sorted set and prepare membership checker let sorted = GCSFilter.decodeToSortedSet(p: request.p, m: request.m, data: request.data) func mightContain(_ id: Data) -> Bool { @@ -418,6 +420,7 @@ final class GossipSyncManager { toSend.ttl = 0 toSend.isRSR = true // Mark as solicited response delegate?.sendPacket(to: peerID, packet: toSend) + servedCount += 1 } } } @@ -432,6 +435,7 @@ final class GossipSyncManager { toSend.ttl = 0 toSend.isRSR = true // Mark as solicited response delegate?.sendPacket(to: peerID, packet: toSend) + servedCount += 1 } } } @@ -456,6 +460,7 @@ final class GossipSyncManager { toSend.ttl = 0 toSend.isRSR = true // Mark as solicited response delegate?.sendPacket(to: peerID, packet: toSend) + servedCount += 1 } } } @@ -470,6 +475,7 @@ final class GossipSyncManager { toSend.ttl = 0 toSend.isRSR = true // Mark as solicited response delegate?.sendPacket(to: peerID, packet: toSend) + servedCount += 1 } } } @@ -488,6 +494,7 @@ final class GossipSyncManager { toSend.ttl = 0 toSend.isRSR = true // Mark as solicited response delegate?.sendPacket(to: peerID, packet: toSend) + servedCount += 1 } } } @@ -502,6 +509,7 @@ final class GossipSyncManager { toSend.ttl = 0 toSend.isRSR = true // Mark as solicited response delegate?.sendPacket(to: peerID, packet: toSend) + servedCount += 1 } } } @@ -518,9 +526,14 @@ final class GossipSyncManager { toSend.ttl = 0 toSend.isRSR = true // Mark as solicited response delegate?.sendPacket(to: peerID, packet: toSend) + servedCount += 1 } } } + + if servedCount > 0 { + SecureLogger.info("[SYNC] served \(servedCount) packet(s) [\(requestedTypes.debugShortLabel)] to \(peerID.id.prefix(8))…", category: .sync) + } } // Build REQUEST_SYNC payload using current candidates and GCS params @@ -664,6 +677,7 @@ final class GossipSyncManager { // One request per due schedule rather than a union filter: each type // group gets the full GCS capacity and its own since-cursor, so heavy // fragment traffic can't crowd messages out of the filter. + var dueLabels: [String] = [] for index in syncSchedules.indices { guard syncSchedules[index].interval > 0 else { continue } // No board source wired up means nothing to offer or store; @@ -672,8 +686,14 @@ final class GossipSyncManager { if syncSchedules[index].lastSent == .distantPast || now.timeIntervalSince(syncSchedules[index].lastSent) >= syncSchedules[index].interval { syncSchedules[index].lastSent = now sendPeriodicSync(for: syncSchedules[index].types) + dueLabels.append(syncSchedules[index].types.debugShortLabel) } } + // One concise summary per maintenance cycle, not per packet. + if !dueLabels.isEmpty { + let peerCount = delegate?.getConnectedPeers().count ?? 0 + SecureLogger.info("[SYNC] cycle: request [\(dueLabels.joined(separator: " "))] to \(peerCount) peer(s)", category: .sync) + } } private func cleanupStaleAnnouncementsIfNeeded(now: Date) { diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index 2eea6efc..356c31c7 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -150,4 +150,19 @@ struct SyncTypeFlags: OptionSet { } return SyncTypeFlags(rawValue: raw) } + + /// Compact human label for the `[SYNC]` observability logs, e.g. "msg,frag,pre". + /// (Referenced only from DEBUG log lines, but kept unconditional so the + /// log-call arguments compile in release too, where the log itself no-ops.) + var debugShortLabel: String { + var parts: [String] = [] + if contains(.announce) { parts.append("ann") } + if contains(.message) { parts.append("msg") } + if contains(.fragment) { parts.append("frag") } + if contains(.fileTransfer) { parts.append("file") } + if contains(.prekeyBundle) { parts.append("pre") } + if contains(.groupMessage) { parts.append("grp") } + if contains(.boardPost) { parts.append("board") } + return parts.isEmpty ? "none" : parts.joined(separator: ",") + } } diff --git a/bitchat/Views/AppInfoView.swift b/bitchat/Views/AppInfoView.swift index 008e8e4f..7adc3905 100644 --- a/bitchat/Views/AppInfoView.swift +++ b/bitchat/Views/AppInfoView.swift @@ -1,4 +1,12 @@ import SwiftUI +#if DEBUG +import BitLogger +#if os(iOS) +import UIKit +#elseif os(macOS) +import AppKit +#endif +#endif struct AppInfoView: View { @Environment(\.dismiss) var dismiss @@ -10,6 +18,14 @@ struct AppInfoView: View { var topologyProvider: (@MainActor () -> MeshTopologyDisplayModel)? @State private var showTopology = false + #if DEBUG + // Opt-in LAN log streaming + in-app export. DEBUG-only; empty host = off. + @AppStorage(LogNetworkSink.hostDefaultsKey) private var logSinkHost = "" + @AppStorage(LogNetworkSink.portDefaultsKey) private var logSinkPort = LogNetworkSink.defaultPort + @State private var exportedLogURL: URL? + @State private var isPresentingLogShare = false + #endif + private var selectedTheme: AppTheme { AppTheme(rawValue: appThemeRawValue) ?? .matrix } @@ -293,11 +309,122 @@ struct AppInfoView: View { FeatureRow(info: Strings.Privacy.panic) } + + #if DEBUG + debugSection + #endif } .padding() } + + #if DEBUG + // Tester-only observability panel: live LAN log streaming + a logs export. + // Never compiled into release (privacy-first: release ships no such UI). + @ViewBuilder + private var debugSection: some View { + VStack(alignment: .leading, spacing: 12) { + SectionHeader("debug & logs") + + Text("Stream sanitized logs over the LAN to a collector (nc -lu \(logSinkPort)). Empty host = off.") + .bitchatFont(size: 12) + .foregroundColor(secondaryTextColor) + .fixedSize(horizontal: false, vertical: true) + + HStack(spacing: 8) { + TextField("collector host (e.g. 192.168.1.5)", text: $logSinkHost) + .textFieldStyle(.roundedBorder) + .bitchatFont(size: 13) + #if os(iOS) + .keyboardType(.numbersAndPunctuation) + .autocapitalization(.none) + .disableAutocorrection(true) + #endif + .accessibilityLabel(Text("log collector host")) + + TextField("port", value: $logSinkPort, format: .number.grouping(.never)) + .textFieldStyle(.roundedBorder) + .bitchatFont(size: 13) + .frame(width: 70) + #if os(iOS) + .keyboardType(.numberPad) + #endif + .accessibilityLabel(Text("log collector port")) + } + .onChange(of: logSinkHost) { _ in LogNetworkSink.shared.reloadConfiguration() } + .onChange(of: logSinkPort) { _ in LogNetworkSink.shared.reloadConfiguration() } + + Button(action: exportLogs) { + HStack(alignment: .top, spacing: 12) { + Image(systemName: "square.and.arrow.up") + .font(.bitchatSystem(size: 20)) + .foregroundColor(textColor) + .frame(width: 30) + VStack(alignment: .leading, spacing: 4) { + Text("Export Logs") + .bitchatFont(size: 14, weight: .semibold) + .foregroundColor(textColor) + Text("Share the recent in-memory log buffer as a .txt file.") + .bitchatFont(size: 12) + .foregroundColor(secondaryTextColor) + .fixedSize(horizontal: false, vertical: true) + } + Spacer() + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityLabel(Text("Export logs")) + .accessibilityHint(Text("Shares the recent log buffer as a text file")) + } + #if os(iOS) + .sheet(isPresented: $isPresentingLogShare) { + if let exportedLogURL { + LogShareSheet(activityItems: [exportedLogURL]) + } + } + #endif + } + + /// Write the buffered log to a temp `.txt` and present the platform share. + private func exportLogs() { + let text = LogExportBuffer.shared.snapshot() + let stamp = ISO8601DateFormatter().string(from: Date()) + .replacingOccurrences(of: ":", with: "-") + let url = FileManager.default.temporaryDirectory + .appendingPathComponent("bitchat-logs-\(stamp).txt") + do { + try text.data(using: .utf8)?.write(to: url) + } catch { + return + } + #if os(iOS) + exportedLogURL = url + isPresentingLogShare = true + #elseif os(macOS) + let panel = NSSavePanel() + panel.nameFieldStringValue = url.lastPathComponent + panel.allowedContentTypes = [.plainText] + if panel.runModal() == .OK, let dest = panel.url { + try? text.data(using: .utf8)?.write(to: dest) + } + #endif + } + #endif } +#if DEBUG && os(iOS) +/// Minimal UIActivityViewController bridge for the Export Logs share sheet. +private struct LogShareSheet: UIViewControllerRepresentable { + let activityItems: [Any] + + func makeUIViewController(context: Context) -> UIActivityViewController { + UIActivityViewController(activityItems: activityItems, applicationActivities: nil) + } + + func updateUIViewController(_ controller: UIActivityViewController, context: Context) {} +} +#endif + struct AppInfoFeatureInfo { let icon: String let title: LocalizedStringKey diff --git a/bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift b/bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift index c762a0c7..96b8d434 100644 --- a/bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift +++ b/bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift @@ -32,13 +32,13 @@ struct BLESourceRouteOriginationPolicyTests { ) } - private func route( + private func decide( packet: BitchatPacket, isRecipientConnected: Bool = false, shouldAttemptRoute: Bool = true, computedRoute: [Data]? = nil - ) -> [Data]? { - BLESourceRouteOriginationPolicy.route( + ) -> BLESourceRouteOriginationPolicy.Decision { + BLESourceRouteOriginationPolicy.decide( for: packet, to: recipient, localPeerIDData: localPeerIDData, @@ -49,38 +49,38 @@ struct BLESourceRouteOriginationPolicyTests { } @Test func routesWhenAllGatesPass() { - #expect(route(packet: makePacket()) == [hop]) + #expect(decide(packet: makePacket()) == .route([hop])) } @Test func relayedPacketNeverGetsRoute() { let relayed = makePacket(senderID: Data(hexString: "aabbccddeeff0011")) - #expect(route(packet: relayed) == nil) + #expect(decide(packet: relayed) == .flood(.relayedNotOriginator)) } @Test func broadcastRecipientNeverGetsRoute() { let broadcast = makePacket(recipientID: Data(repeating: 0xFF, count: 8)) - #expect(route(packet: broadcast) == nil) + #expect(decide(packet: broadcast) == .flood(.broadcast)) let noRecipient = makePacket(recipientID: nil) - #expect(route(packet: noRecipient) == nil) + #expect(decide(packet: noRecipient) == .flood(.broadcast)) } @Test func linkLocalTTLNeverGetsRoute() { // TTL 0/1 packets (e.g. REQUEST_SYNC) cannot traverse hops. - #expect(route(packet: makePacket(ttl: 0)) == nil) - #expect(route(packet: makePacket(ttl: 1)) == nil) + #expect(decide(packet: makePacket(ttl: 0)) == .flood(.noTTLHeadroom)) + #expect(decide(packet: makePacket(ttl: 1)) == .flood(.noTTLHeadroom)) } @Test func directlyConnectedRecipientNeverGetsRoute() { - #expect(route(packet: makePacket(), isRecipientConnected: true) == nil) + #expect(decide(packet: makePacket(), isRecipientConnected: true) == .flood(.recipientDirect)) } @Test func suppressedRecipientFallsBackToFlood() { - #expect(route(packet: makePacket(), shouldAttemptRoute: false) == nil) + #expect(decide(packet: makePacket(), shouldAttemptRoute: false) == .flood(.routeSuppressed)) } @Test func missingOrEmptyRouteFallsBackToFlood() { var sawComputeRoute = false - let result = BLESourceRouteOriginationPolicy.route( + let result = BLESourceRouteOriginationPolicy.decide( for: makePacket(), to: recipient, localPeerIDData: localPeerIDData, @@ -91,8 +91,8 @@ struct BLESourceRouteOriginationPolicyTests { return nil } ) - #expect(result == nil) + #expect(result == .flood(.noPath)) #expect(sawComputeRoute) - #expect(route(packet: makePacket(), computedRoute: []) == nil) + #expect(decide(packet: makePacket(), computedRoute: []) == .flood(.noPath)) } } diff --git a/localPackages/BitLogger/Sources/LogExportBuffer.swift b/localPackages/BitLogger/Sources/LogExportBuffer.swift new file mode 100644 index 00000000..0f740256 --- /dev/null +++ b/localPackages/BitLogger/Sources/LogExportBuffer.swift @@ -0,0 +1,64 @@ +// +// LogExportBuffer.swift +// BitLogger +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +#if DEBUG +import Foundation + +/// In-memory ring buffer of the most recent sanitized log lines, so a tester +/// can export logs untethered when live streaming isn't available. +/// +/// DEBUG-only: never compiled into release builds, matching the rest of the +/// logging stack. Bounded by both a line count and a byte budget (oldest +/// evicted first). Appends run on a private serial queue so a hot logging path +/// never blocks on buffer maintenance and the main thread is never touched. +/// +/// It stores exactly the SecureLogger-sanitized text (fingerprints truncated, +/// base64 redacted, peer IDs shortened), so the export carries no secrets. +public final class LogExportBuffer { + public static let shared = LogExportBuffer() + + private let queue = DispatchQueue(label: "chat.bitchat.securelogger.export", qos: .utility) + private var lines: [String] = [] + private var byteCount = 0 + + private let maxLines: Int + private let maxBytes: Int + + init(maxLines: Int = 2000, maxBytes: Int = 512 * 1024) { + self.maxLines = maxLines + self.maxBytes = maxBytes + } + + /// Append one already-formatted, already-sanitized log line. Non-blocking + /// (async on the private queue). + func append(_ line: String) { + queue.async { + self.lines.append(line) + self.byteCount += line.utf8.count + 1 // + newline + while self.lines.count > self.maxLines || self.byteCount > self.maxBytes { + guard !self.lines.isEmpty else { break } + let removed = self.lines.removeFirst() + self.byteCount -= (removed.utf8.count + 1) + } + } + } + + /// A newline-joined snapshot of the buffered lines, oldest first. Safe to + /// call from the main thread (brief synchronous read). + public func snapshot() -> String { + queue.sync { lines.joined(separator: "\n") } + } + + public func clear() { + queue.async { + self.lines.removeAll(keepingCapacity: true) + self.byteCount = 0 + } + } +} +#endif diff --git a/localPackages/BitLogger/Sources/LogNetworkSink.swift b/localPackages/BitLogger/Sources/LogNetworkSink.swift new file mode 100644 index 00000000..84ea6e87 --- /dev/null +++ b/localPackages/BitLogger/Sources/LogNetworkSink.swift @@ -0,0 +1,104 @@ +// +// LogNetworkSink.swift +// BitLogger +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +#if DEBUG +import Foundation +#if canImport(Network) +import Network +#endif + +/// Best-effort, fire-and-forget UDP forwarder for sanitized log lines, so a +/// sideloaded device on iOS 17+ (where `idevicesyslog` Wi-Fi streaming no +/// longer works) can stream its logs to a LAN collector with no cable. +/// +/// Design constraints: +/// - DEBUG-only: never compiled into release. A privacy-first release build +/// carries zero network-log code. +/// - Opt-in and off by default: nothing is ever sent until a collector host +/// is configured. An empty host means no egress. +/// - Never blocks the caller and never throws into the app: every send runs +/// on a private queue and failures are silently dropped. A dead or absent +/// collector cannot affect app behavior (UDP is connectionless — datagrams +/// to nowhere are simply lost). +/// - Forwards the exact same sanitized text the ring buffer captures, so no +/// secrets leave the device. Each line is prefixed with the device's label +/// (`[nickname] …`) so one Mac-side `nc -lu ` can demux all devices. +public final class LogNetworkSink { + public static let shared = LogNetworkSink() + + /// UserDefaults keys shared with the in-app config UI (App Info sheet). + public static let hostDefaultsKey = "debug.logSink.host" + public static let portDefaultsKey = "debug.logSink.port" + public static let defaultPort = 9999 + /// Where the device label is read from (the app's chosen nickname). + public static let nicknameDefaultsKey = "bitchat.nickname" + + private let queue = DispatchQueue(label: "chat.bitchat.securelogger.netsink", qos: .utility) + private let defaults: UserDefaults + private var label = "" + private var enabled = false + #if canImport(Network) + private var connection: NWConnection? + #endif + + init(defaults: UserDefaults = .standard) { + self.defaults = defaults + } + + /// Re-read collector host/port and the device label from UserDefaults and + /// (re)build the UDP connection. Call on launch and whenever the config UI + /// changes. An empty host tears the sink down (no egress). + public func reloadConfiguration() { + let host = (defaults.string(forKey: Self.hostDefaultsKey) ?? "") + .trimmingCharacters(in: .whitespacesAndNewlines) + let storedPort = defaults.integer(forKey: Self.portDefaultsKey) + let port = storedPort > 0 ? storedPort : Self.defaultPort + let label = (defaults.string(forKey: Self.nicknameDefaultsKey) ?? "") + .trimmingCharacters(in: .whitespacesAndNewlines) + configure(host: host, port: port, label: label) + } + + /// Point the sink at `host:port` with a device `label`. Empty host or an + /// invalid port disables egress. + public func configure(host: String, port: Int, label: String) { + queue.async { + self.label = label + #if canImport(Network) + self.connection?.cancel() + self.connection = nil + guard !host.isEmpty, + (1...65535).contains(port), + let nwPort = NWEndpoint.Port(rawValue: UInt16(port)) else { + self.enabled = false + return + } + let connection = NWConnection(host: NWEndpoint.Host(host), port: nwPort, using: .udp) + connection.start(queue: self.queue) + self.connection = connection + self.enabled = true + #else + self.enabled = false + #endif + } + } + + /// Forward one already-formatted, already-sanitized line. Non-blocking; + /// drops silently when disabled or on any send failure. + func send(_ line: String) { + queue.async { + guard self.enabled else { return } + #if canImport(Network) + guard let connection = self.connection else { return } + let prefixed = self.label.isEmpty ? line : "[\(self.label)] \(line)" + guard let data = (prefixed + "\n").data(using: .utf8) else { return } + connection.send(content: data, completion: .idempotent) + #endif + } + } +} +#endif diff --git a/localPackages/BitLogger/Sources/OSLog+Categories.swift b/localPackages/BitLogger/Sources/OSLog+Categories.swift index 1d74e27e..7fe19ed7 100644 --- a/localPackages/BitLogger/Sources/OSLog+Categories.swift +++ b/localPackages/BitLogger/Sources/OSLog+Categories.swift @@ -20,4 +20,11 @@ public extension OSLog { static let security = OSLog(subsystem: subsystem, category: "security") static let handshake = OSLog(subsystem: subsystem, category: "handshake") static let sync = OSLog(subsystem: subsystem, category: "sync") + // Added for the observability pass: coarse filtering buckets for the mesh + // routing layer, the internet gateway bridge, and the Wi-Fi bulk transport. + // The bracket tags in the messages ([ROUTE]/[GW]/[WIFI]/…) remain the + // primary filter; these just let `log stream --category` narrow further. + static let mesh = OSLog(subsystem: subsystem, category: "mesh") + static let gateway = OSLog(subsystem: subsystem, category: "gateway") + static let transport = OSLog(subsystem: subsystem, category: "transport") } diff --git a/localPackages/BitLogger/Sources/SecureLogger.swift b/localPackages/BitLogger/Sources/SecureLogger.swift index 5aaffd53..4377eb4a 100644 --- a/localPackages/BitLogger/Sources/SecureLogger.swift +++ b/localPackages/BitLogger/Sources/SecureLogger.swift @@ -86,6 +86,17 @@ public final class SecureLogger { case .fault: return 4 } } + + /// Short uppercase label for the in-memory export buffer line prefix. + var label: String { + switch self { + case .debug: return "DEBUG" + case .info: return "INFO" + case .warning: return "WARN" + case .error: return "ERROR" + case .fault: return "FAULT" + } + } var osLogType: OSLogType { switch self { @@ -100,18 +111,34 @@ public final class SecureLogger { // MARK: - Global Threshold - /// Minimum level that will be logged. Defaults to .info. Override via env BITCHAT_LOG_LEVEL. + /// Minimum level that will be logged. Override via env BITCHAT_LOG_LEVEL + /// (env always wins). The default is `.debug` in DEBUG builds and `.info` + /// otherwise: a sideloaded, tap-launched build can't receive the env var, + /// so DEBUG must surface the `.debug` decision logs out of the box. Release + /// emits nothing regardless (all log paths are `#if DEBUG`). /// Internal-settable so tests can verify level filtering; app code should not mutate it. - internal static var minimumLevel: LogLevel = { + internal static var minimumLevel: LogLevel = defaultMinimumLevel + + /// The level used when nothing mutates `minimumLevel`. Honors the + /// BITCHAT_LOG_LEVEL env override; otherwise `.debug` in DEBUG builds (so a + /// tap-launched sideload surfaces decision logs) and `.info` elsewhere. + /// Exposed for tests. + internal static var defaultMinimumLevel: LogLevel { let env = ProcessInfo.processInfo.environment["BITCHAT_LOG_LEVEL"]?.lowercased() switch env { case "debug": return .debug + case "info": return .info case "warning": return .warning case "error": return .error case "fault": return .fault - default: return .info + default: + #if DEBUG + return .debug + #else + return .info + #endif } - }() + } private static func shouldLog(_ level: LogLevel) -> Bool { return level.order >= minimumLevel.order @@ -168,6 +195,7 @@ public extension SecureLogger { #if DEBUG os_log("%{public}@ Error in %{public}@: %{public}@", log: category, type: .error, location, sanitized, errorDesc) + record(level: .error, message: "\(location) Error in \(sanitized): \(errorDesc)") #else os_log("%{private}@ Error in %{private}@: %{private}@", log: category, type: .error, location, sanitized, errorDesc) #endif @@ -258,9 +286,10 @@ private extension SecureLogger { let location = formatLocation(file: file, line: line, function: function) let sanitized = "\(location) \(message())".sanitized() os_log("%{public}@", log: category, type: level.osLogType, sanitized) + record(level: level, message: sanitized) #endif } - + /// Log a security event static func logSecurityEvent(_ event: SecurityEvent, level: LogLevel = .info, file: String, line: Int, function: String) { @@ -269,6 +298,18 @@ private extension SecureLogger { let location = formatLocation(file: file, line: line, function: function) let message = "\(location) \(event.message)" os_log("%{public}@", log: .security, type: level.osLogType, message) + record(level: level, message: message) + #endif + } + + /// Fan a sanitized line out to the in-memory export buffer and the + /// (opt-in, off by default) UDP network sink. DEBUG-only; both consumers + /// are non-blocking. Same formatted text everywhere. + static func record(level: LogLevel, message: String) { + #if DEBUG + let line = "[\(level.label)] \(message)" + LogExportBuffer.shared.append(line) + LogNetworkSink.shared.send(line) #endif } diff --git a/localPackages/BitLogger/Tests/LogLevelFilteringTests.swift b/localPackages/BitLogger/Tests/LogLevelFilteringTests.swift index db04759f..47b28dea 100644 --- a/localPackages/BitLogger/Tests/LogLevelFilteringTests.swift +++ b/localPackages/BitLogger/Tests/LogLevelFilteringTests.swift @@ -51,4 +51,25 @@ final class LogLevelFilteringTests: XCTestCase { XCTAssertEqual(counter.count, 1, "Enabled levels must still log") } + + /// A sideloaded, tap-launched build can't receive BITCHAT_LOG_LEVEL, so the + /// DEBUG default must be `.debug` (not `.info`) or the `.debug` decision + /// logs stay invisible on device. Release still defaults to `.info` and + /// emits nothing regardless (all log paths are `#if DEBUG`). + func testDebugBuildDefaultsToDebugLevelUnlessOverridden() throws { + // Only meaningful when the env override isn't set (CI sometimes sets it). + try XCTSkipUnless( + ProcessInfo.processInfo.environment["BITCHAT_LOG_LEVEL"] == nil, + "BITCHAT_LOG_LEVEL is set; default-level assertion doesn't apply" + ) + #if DEBUG + XCTAssertEqual( + SecureLogger.defaultMinimumLevel, + .debug, + "DEBUG builds must default to .debug so tap-launched sideloads surface decision logs" + ) + #else + XCTAssertEqual(SecureLogger.defaultMinimumLevel, .info) + #endif + } } From b62f98cc62212cb831c5a048d5b00f20d96f49c8 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 23:45:29 +0200 Subject: [PATCH 026/158] App Info: uppercase SYMBOLS/NETWORK headers, move network under HOW TO USE Co-Authored-By: Claude Fable 5 --- bitchat/Localizable.xcstrings | 4 ++-- bitchat/Views/AppInfoView.swift | 42 ++++++++++++++++----------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 4e3184ac..f7979b8d 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -5142,7 +5142,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "symbols" + "value" : "SYMBOLS" } } } @@ -5178,7 +5178,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "network" + "value" : "NETWORK" } } } diff --git a/bitchat/Views/AppInfoView.swift b/bitchat/Views/AppInfoView.swift index 7adc3905..a4b82104 100644 --- a/bitchat/Views/AppInfoView.swift +++ b/bitchat/Views/AppInfoView.swift @@ -239,6 +239,27 @@ struct AppInfoView: View { .foregroundColor(textColor) } + // Network diagnostics + if topologyProvider != nil { + VStack(alignment: .leading, spacing: 16) { + SectionHeader(Strings.Network.title) + + Button { + showTopology = true + } label: { + HStack(spacing: 0) { + FeatureRow(info: Strings.Network.topology) + Image(systemName: "chevron.right") + .font(.bitchatSystem(size: 12)) + .foregroundColor(secondaryTextColor) + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityHint(Text("app_info.network.topology.hint")) + } + } + // Features VStack(alignment: .leading, spacing: 16) { SectionHeader(Strings.Features.title) @@ -278,27 +299,6 @@ struct AppInfoView: View { } } - // Network diagnostics - if topologyProvider != nil { - VStack(alignment: .leading, spacing: 16) { - SectionHeader(Strings.Network.title) - - Button { - showTopology = true - } label: { - HStack(spacing: 0) { - FeatureRow(info: Strings.Network.topology) - Image(systemName: "chevron.right") - .font(.bitchatSystem(size: 12)) - .foregroundColor(secondaryTextColor) - } - .contentShape(Rectangle()) - } - .buttonStyle(.plain) - .accessibilityHint(Text("app_info.network.topology.hint")) - } - } - // Privacy VStack(alignment: .leading, spacing: 16) { SectionHeader(Strings.Privacy.title) From 9cbfd131da4b1729eb77e351a6e70437eb3f1470 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2026 23:58:29 +0200 Subject: [PATCH 027/158] i18n: add English defaultValue fallback to key-only localized strings so no language shows raw keys Non-en languages are each missing ~138 of 336 catalog keys, so a key absent from that language's table renders as the raw dot-key on device (no English fallback). This adds English defaultValues so every miss resolves to English instead of a raw key. - Class (a): 217 String(localized: "dot.key") calls missing defaultValue now carry defaultValue: "" pulled verbatim from the catalog (format specifiers preserved). - Class (b): 41 SwiftUI LocalizedStringKey literals (Text/Button/alert/ confirmationDialog/TextField) wrapped as Text(String(localized: "key", defaultValue: "en")) so they resolve to English too. Existing comments folded into the resolved String. No catalog or en values changed; Swift source only. Both schemes build. Co-Authored-By: Claude Fable 5 --- bitchat/App/AppRuntime.swift | 4 +- bitchat/App/PrivateConversationModels.swift | 4 +- bitchat/App/VerificationModel.swift | 2 +- bitchat/Models/CommandInfo.swift | 34 +++++------ bitchat/Protocols/LocationChannel.swift | 12 ++-- bitchat/Services/BLE/BLEService.swift | 2 +- bitchat/Services/LocationNotesManager.swift | 4 +- bitchat/Services/NoiseEncryptionService.swift | 20 +++---- .../ViewModels/ChatBluetoothAlertPolicy.swift | 6 +- bitchat/ViewModels/ChatGroupCoordinator.swift | 60 +++++++++---------- .../ViewModels/ChatLifecycleCoordinator.swift | 2 +- .../ChatMediaTransferCoordinator.swift | 4 +- .../ViewModels/ChatOutgoingCoordinator.swift | 4 +- .../ChatPrivateConversationCoordinator.swift | 18 +++--- .../ChatViewModelBootstrapper.swift | 2 +- .../Extensions/ChatViewModel+Tor.swift | 8 +-- bitchat/Views/AppInfoView.swift | 4 +- .../Views/Components/DeliveryStatusView.swift | 12 ++-- .../Views/Components/PaymentChipView.swift | 10 ++-- .../Views/Components/SheetCloseButton.swift | 2 +- .../Views/Components/TextMessageView.swift | 2 +- bitchat/Views/ContentComposerView.swift | 26 ++++---- bitchat/Views/ContentHeaderView.swift | 30 +++++----- bitchat/Views/ContentSheetViews.swift | 34 +++++------ bitchat/Views/ContentView.swift | 10 ++-- bitchat/Views/FingerprintView.swift | 6 +- bitchat/Views/GeohashPeopleList.swift | 16 ++--- bitchat/Views/GroupChatList.swift | 12 ++-- bitchat/Views/LocationChannelsSheet.swift | 16 ++--- bitchat/Views/LocationNotesView.swift | 2 +- .../Views/Media/BlockRevealImageView.swift | 30 +++++----- bitchat/Views/Media/MediaMessageView.swift | 2 +- bitchat/Views/Media/VoiceNoteView.swift | 6 +- bitchat/Views/MeshPeerList.swift | 36 +++++------ bitchat/Views/MeshTopologyView.swift | 12 ++-- bitchat/Views/MessageListView.swift | 50 ++++++++-------- bitchat/Views/VerificationViews.swift | 12 ++-- 37 files changed, 258 insertions(+), 258 deletions(-) diff --git a/bitchat/App/AppRuntime.swift b/bitchat/App/AppRuntime.swift index a706cfac..fd8f0077 100644 --- a/bitchat/App/AppRuntime.swift +++ b/bitchat/App/AppRuntime.swift @@ -349,12 +349,12 @@ private extension AppRuntime { TorManager.shared.isAutoStartAllowed() { chatViewModel.torStatusAnnounced = true chatViewModel.addGeohashOnlySystemMessage( - String(localized: "system.tor.starting", comment: "System message when Tor is starting") + String(localized: "system.tor.starting", defaultValue: "starting tor...", comment: "System message when Tor is starting") ) } else if !TorManager.shared.torEnforced && !chatViewModel.torStatusAnnounced { chatViewModel.torStatusAnnounced = true chatViewModel.addGeohashOnlySystemMessage( - String(localized: "system.tor.dev_bypass", comment: "System message when Tor bypass is enabled in development") + String(localized: "system.tor.dev_bypass", defaultValue: "development build: Tor bypass enabled.", comment: "System message when Tor bypass is enabled in development") ) } } diff --git a/bitchat/App/PrivateConversationModels.swift b/bitchat/App/PrivateConversationModels.swift index d9920646..e8232b32 100644 --- a/bitchat/App/PrivateConversationModels.swift +++ b/bitchat/App/PrivateConversationModels.swift @@ -250,7 +250,7 @@ final class PrivateConversationModel: ObservableObject { if let group = chatViewModel.groupStore.group(for: conversationPeerID) { displayName = "#\(group.name) (\(group.members.count))" } else { - displayName = String(localized: "common.unknown", comment: "Fallback label for unknown peer") + displayName = String(localized: "common.unknown", defaultValue: "unknown", comment: "Fallback label for unknown peer") } return PrivateConversationHeaderState( conversationPeerID: conversationPeerID, @@ -328,7 +328,7 @@ final class PrivateConversationModel: ObservableObject { } } - return String(localized: "common.unknown", comment: "Fallback label for unknown peer") + return String(localized: "common.unknown", defaultValue: "unknown", comment: "Fallback label for unknown peer") } private func resolveAvailability(for headerPeerID: PeerID, peer: BitchatPeer?) -> PrivateConversationAvailability { diff --git a/bitchat/App/VerificationModel.swift b/bitchat/App/VerificationModel.swift index 5916a958..a265d709 100644 --- a/bitchat/App/VerificationModel.swift +++ b/bitchat/App/VerificationModel.swift @@ -186,6 +186,6 @@ final class VerificationModel: ObservableObject { } } - return String(localized: "common.unknown", comment: "Label for an unknown peer") + return String(localized: "common.unknown", defaultValue: "unknown", comment: "Label for an unknown peer") } } diff --git a/bitchat/Models/CommandInfo.swift b/bitchat/Models/CommandInfo.swift index bbe5b82b..b656bad3 100644 --- a/bitchat/Models/CommandInfo.swift +++ b/bitchat/Models/CommandInfo.swift @@ -36,11 +36,11 @@ enum CommandInfo: String, Identifiable { var placeholder: String? { switch self { case .block, .hug, .message, .slap, .unblock, .favorite, .unfavorite, .ping, .trace: - return "<" + String(localized: "content.input.nickname_placeholder") + ">" + return "<" + String(localized: "content.input.nickname_placeholder", defaultValue: "nickname") + ">" case .group: - return "<" + String(localized: "content.input.group_placeholder") + ">" + return "<" + String(localized: "content.input.group_placeholder", defaultValue: "create|invite|leave|list") + ">" case .pay: - return "<" + String(localized: "content.input.token_placeholder") + ">" + return "<" + String(localized: "content.input.token_placeholder", defaultValue: "token") + ">" case .clear, .help, .who: return nil } @@ -48,20 +48,20 @@ enum CommandInfo: String, Identifiable { var description: String { switch self { - case .block: String(localized: "content.commands.block") - case .clear: String(localized: "content.commands.clear") - case .group: String(localized: "content.commands.group") - case .help: String(localized: "content.commands.help") - case .hug: String(localized: "content.commands.hug") - case .message: String(localized: "content.commands.message") - case .pay: String(localized: "content.commands.pay") - case .slap: String(localized: "content.commands.slap") - case .unblock: String(localized: "content.commands.unblock") - case .who: String(localized: "content.commands.who") - case .favorite: String(localized: "content.commands.favorite") - case .unfavorite: String(localized: "content.commands.unfavorite") - case .ping: String(localized: "content.commands.ping") - case .trace: String(localized: "content.commands.trace") + case .block: String(localized: "content.commands.block", defaultValue: "block or list blocked peers") + case .clear: String(localized: "content.commands.clear", defaultValue: "clear chat messages") + case .group: String(localized: "content.commands.group", defaultValue: "create or manage private groups") + case .help: String(localized: "content.commands.help", defaultValue: "show available commands") + case .hug: String(localized: "content.commands.hug", defaultValue: "send someone a warm hug") + case .message: String(localized: "content.commands.message", defaultValue: "send private message") + case .pay: String(localized: "content.commands.pay", defaultValue: "send a cashu ecash token in this chat") + case .slap: String(localized: "content.commands.slap", defaultValue: "slap someone with a trout") + case .unblock: String(localized: "content.commands.unblock", defaultValue: "unblock a peer") + case .who: String(localized: "content.commands.who", defaultValue: "see who's online") + case .favorite: String(localized: "content.commands.favorite", defaultValue: "add to favorites") + case .unfavorite: String(localized: "content.commands.unfavorite", defaultValue: "remove from favorites") + case .ping: String(localized: "content.commands.ping", defaultValue: "measure round-trip time to a mesh peer") + case .trace: String(localized: "content.commands.trace", defaultValue: "estimate the mesh path to a peer") } } diff --git a/bitchat/Protocols/LocationChannel.swift b/bitchat/Protocols/LocationChannel.swift index cbe1c55f..e2864b0d 100644 --- a/bitchat/Protocols/LocationChannel.swift +++ b/bitchat/Protocols/LocationChannel.swift @@ -24,17 +24,17 @@ enum GeohashChannelLevel: CaseIterable, Codable, Equatable { var displayName: String { switch self { case .building: - return String(localized: "location_levels.building", comment: "Name for building-level location channel") + return String(localized: "location_levels.building", defaultValue: "building", comment: "Name for building-level location channel") case .block: - return String(localized: "location_levels.block", comment: "Name for block-level location channel") + return String(localized: "location_levels.block", defaultValue: "block", comment: "Name for block-level location channel") case .neighborhood: - return String(localized: "location_levels.neighborhood", comment: "Name for neighborhood-level location channel") + return String(localized: "location_levels.neighborhood", defaultValue: "neighborhood", comment: "Name for neighborhood-level location channel") case .city: - return String(localized: "location_levels.city", comment: "Name for city-level location channel") + return String(localized: "location_levels.city", defaultValue: "city", comment: "Name for city-level location channel") case .province: - return String(localized: "location_levels.province", comment: "Name for province-level location channel") + return String(localized: "location_levels.province", defaultValue: "province", comment: "Name for province-level location channel") case .region: - return String(localized: "location_levels.region", comment: "Name for region-level location channel") + return String(localized: "location_levels.region", defaultValue: "region", comment: "Name for region-level location channel") } } } diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index cc342856..da46238c 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -3719,7 +3719,7 @@ extension BLEService { // Notify delegate of failure notifyUI { [weak self] in - self?.deliverTransportEvent(.messageDeliveryStatusUpdated(messageID: message.messageID, status: .failed(reason: String(localized: "content.delivery.reason.encryption_failed", comment: "Failure reason shown when a message could not be encrypted for the peer")))) + self?.deliverTransportEvent(.messageDeliveryStatusUpdated(messageID: message.messageID, status: .failed(reason: String(localized: "content.delivery.reason.encryption_failed", defaultValue: "encryption failed", comment: "Failure reason shown when a message could not be encrypted for the peer")))) } } } diff --git a/bitchat/Services/LocationNotesManager.swift b/bitchat/Services/LocationNotesManager.swift index 910ecced..a3437fb5 100644 --- a/bitchat/Services/LocationNotesManager.swift +++ b/bitchat/Services/LocationNotesManager.swift @@ -89,11 +89,11 @@ final class LocationNotesManager: ObservableObject { private let maxNotesInMemory = 500 // Defensive cap (relay limit is 200) private enum Strings { - static let noRelays = String(localized: "location_notes.error.no_relays", comment: "Shown when no geo relays are available near the selected location") + static let noRelays = String(localized: "location_notes.error.no_relays", defaultValue: "no geo relays available near this location. try again soon.", comment: "Shown when no geo relays are available near the selected location") static func failedToSend(_ detail: String) -> String { String( - format: String(localized: "location_notes.error.failed_to_send", comment: "Shown when a location note fails to send"), + format: String(localized: "location_notes.error.failed_to_send", defaultValue: "failed to send note. %@", comment: "Shown when a location note fails to send"), locale: .current, detail ) diff --git a/bitchat/Services/NoiseEncryptionService.swift b/bitchat/Services/NoiseEncryptionService.swift index 1642f618..3cbd1520 100644 --- a/bitchat/Services/NoiseEncryptionService.swift +++ b/bitchat/Services/NoiseEncryptionService.swift @@ -116,30 +116,30 @@ enum EncryptionStatus: Equatable { var description: String { switch self { case .none: - return String(localized: "encryption.status.failed", comment: "Status text when encryption failed") + return String(localized: "encryption.status.failed", defaultValue: "encryption failed", comment: "Status text when encryption failed") case .noHandshake: - return String(localized: "encryption.status.not_encrypted", comment: "Status text when no encryption handshake happened") + return String(localized: "encryption.status.not_encrypted", defaultValue: "not encrypted", comment: "Status text when no encryption handshake happened") case .noiseHandshaking: - return String(localized: "encryption.status.establishing", comment: "Status text when encryption is being established") + return String(localized: "encryption.status.establishing", defaultValue: "establishing encryption...", comment: "Status text when encryption is being established") case .noiseSecured: - return String(localized: "encryption.status.secured", comment: "Status text when encryption is secured but not verified") + return String(localized: "encryption.status.secured", defaultValue: "encrypted", comment: "Status text when encryption is secured but not verified") case .noiseVerified: - return String(localized: "encryption.status.verified", comment: "Status text when encryption is verified") + return String(localized: "encryption.status.verified", defaultValue: "encrypted & verified", comment: "Status text when encryption is verified") } } var accessibilityDescription: String { switch self { case .none: - return String(localized: "encryption.accessibility.failed", comment: "Accessibility text when encryption failed") + return String(localized: "encryption.accessibility.failed", defaultValue: "encryption failed", comment: "Accessibility text when encryption failed") case .noHandshake: - return String(localized: "encryption.accessibility.not_encrypted", comment: "Accessibility text when encryption is not established") + return String(localized: "encryption.accessibility.not_encrypted", defaultValue: "not encrypted", comment: "Accessibility text when encryption is not established") case .noiseHandshaking: - return String(localized: "encryption.accessibility.establishing", comment: "Accessibility text when encryption is being established") + return String(localized: "encryption.accessibility.establishing", defaultValue: "establishing encryption", comment: "Accessibility text when encryption is being established") case .noiseSecured: - return String(localized: "encryption.accessibility.secured", comment: "Accessibility text when encryption is secured") + return String(localized: "encryption.accessibility.secured", defaultValue: "encrypted", comment: "Accessibility text when encryption is secured") case .noiseVerified: - return String(localized: "encryption.accessibility.verified", comment: "Accessibility text when encryption is verified") + return String(localized: "encryption.accessibility.verified", defaultValue: "encrypted and verified", comment: "Accessibility text when encryption is verified") } } } diff --git a/bitchat/ViewModels/ChatBluetoothAlertPolicy.swift b/bitchat/ViewModels/ChatBluetoothAlertPolicy.swift index 0e7168e4..14e8bad0 100644 --- a/bitchat/ViewModels/ChatBluetoothAlertPolicy.swift +++ b/bitchat/ViewModels/ChatBluetoothAlertPolicy.swift @@ -12,17 +12,17 @@ enum ChatBluetoothAlertPolicy { case .poweredOff: ChatBluetoothAlertUpdate( isPresented: true, - message: String(localized: "content.alert.bluetooth_required.off", comment: "Message shown when Bluetooth is turned off") + message: String(localized: "content.alert.bluetooth_required.off", defaultValue: "bluetooth is turned off. please turn on bluetooth in settings to use bitchat.", comment: "Message shown when Bluetooth is turned off") ) case .unauthorized: ChatBluetoothAlertUpdate( isPresented: true, - message: String(localized: "content.alert.bluetooth_required.permission", comment: "Message shown when Bluetooth permission is missing") + message: String(localized: "content.alert.bluetooth_required.permission", defaultValue: "bitchat needs bluetooth permission to connect with nearby devices. please enable bluetooth access in settings.", comment: "Message shown when Bluetooth permission is missing") ) case .unsupported: ChatBluetoothAlertUpdate( isPresented: true, - message: String(localized: "content.alert.bluetooth_required.unsupported", comment: "Message shown when the device lacks Bluetooth support") + message: String(localized: "content.alert.bluetooth_required.unsupported", defaultValue: "this device does not support bluetooth. bitchat requires bluetooth to function.", comment: "Message shown when the device lacks Bluetooth support") ) case .poweredOn: ChatBluetoothAlertUpdate(isPresented: false, message: "") diff --git a/bitchat/ViewModels/ChatGroupCoordinator.swift b/bitchat/ViewModels/ChatGroupCoordinator.swift index a83cb024..eb50b577 100644 --- a/bitchat/ViewModels/ChatGroupCoordinator.swift +++ b/bitchat/ViewModels/ChatGroupCoordinator.swift @@ -159,26 +159,26 @@ final class ChatGroupCoordinator { func createGroup(named rawName: String) -> CommandResult { let name = rawName.trimmed guard !name.isEmpty else { - return .error(message: String(localized: "system.group.usage_create", comment: "Usage hint for /group create")) + return .error(message: String(localized: "system.group.usage_create", defaultValue: "usage: /group create ", comment: "Usage hint for /group create")) } guard name.count <= Self.maxGroupNameLength else { - return .error(message: String(localized: "system.group.name_too_long", comment: "Error when a group name exceeds the length cap")) + return .error(message: String(localized: "system.group.name_too_long", defaultValue: "group names are limited to 40 characters", comment: "Error when a group name exceeds the length cap")) } let myFingerprint = context.myNoiseFingerprint() let mySigningKey = context.mySigningPublicKey() guard !myFingerprint.isEmpty, mySigningKey.count == 32 else { - return .error(message: String(localized: "system.group.identity_unavailable", comment: "Error when the local identity is not ready for group operations")) + return .error(message: String(localized: "system.group.identity_unavailable", defaultValue: "your identity keys are not ready yet", comment: "Error when the local identity is not ready for group operations")) } let creator = GroupMember(fingerprint: myFingerprint, signingKey: mySigningKey, nickname: context.nickname) guard let group = context.groupStore.createGroup(named: name, creator: creator) else { - return .error(message: String(localized: "system.group.create_failed", comment: "Error when group creation fails")) + return .error(message: String(localized: "system.group.create_failed", defaultValue: "could not create the group", comment: "Error when group creation fails")) } context.startPrivateChat(with: group.peerID) return .success(message: String( - format: String(localized: "system.group.created", comment: "System message after creating a group; placeholder is the group name"), + format: String(localized: "system.group.created", defaultValue: "created group '%@' — use /group invite @name to add people", comment: "System message after creating a group; placeholder is the group name"), locale: .current, name )) @@ -187,45 +187,45 @@ final class ChatGroupCoordinator { func inviteMember(nickname rawNickname: String) -> CommandResult { let nickname = normalizedNickname(rawNickname) guard !nickname.isEmpty else { - return .error(message: String(localized: "system.group.usage_invite", comment: "Usage hint for /group invite")) + return .error(message: String(localized: "system.group.usage_invite", defaultValue: "usage: /group invite @name", comment: "Usage hint for /group invite")) } guard let group = selectedGroup() else { - return .error(message: String(localized: "system.group.not_in_group", comment: "Error when a group command requires an open group chat")) + return .error(message: String(localized: "system.group.not_in_group", defaultValue: "open a group chat first", comment: "Error when a group command requires an open group chat")) } guard group.creatorFingerprint == context.myNoiseFingerprint() else { - return .error(message: String(localized: "system.group.creator_only", comment: "Error when a non-creator attempts a creator-only group action")) + return .error(message: String(localized: "system.group.creator_only", defaultValue: "only the group creator can do that", comment: "Error when a non-creator attempts a creator-only group action")) } guard let peerID = context.getPeerIDForNickname(nickname) else { return .error(message: String( - format: String(localized: "system.group.peer_not_found", comment: "Error when the invitee nickname is unknown; placeholder is the nickname"), + format: String(localized: "system.group.peer_not_found", defaultValue: "'%@' not found", comment: "Error when the invitee nickname is unknown; placeholder is the nickname"), locale: .current, nickname )) } guard context.isPeerConnected(peerID) else { return .error(message: String( - format: String(localized: "system.group.peer_not_connected", comment: "Error when the invitee is not connected over mesh; placeholder is the nickname"), + format: String(localized: "system.group.peer_not_connected", defaultValue: "%@ must be connected over mesh to be invited", comment: "Error when the invitee is not connected over mesh; placeholder is the nickname"), locale: .current, nickname )) } guard let identity = context.cryptoIdentity(for: peerID) else { return .error(message: String( - format: String(localized: "system.group.peer_identity_unknown", comment: "Error when the invitee's verified identity is unavailable; placeholder is the nickname"), + format: String(localized: "system.group.peer_identity_unknown", defaultValue: "cannot verify %@'s identity yet — wait for their announce", comment: "Error when the invitee's verified identity is unavailable; placeholder is the nickname"), locale: .current, nickname )) } guard !group.isMember(fingerprint: identity.fingerprint) else { return .error(message: String( - format: String(localized: "system.group.already_member", comment: "Error when the invitee is already a member; placeholder is the nickname"), + format: String(localized: "system.group.already_member", defaultValue: "%@ is already a member", comment: "Error when the invitee is already a member; placeholder is the nickname"), locale: .current, nickname )) } guard group.members.count < BitchatGroup.maxMembers else { return .error(message: String( - format: String(localized: "system.group.full", comment: "Error when the group is at the member cap; placeholder is the cap"), + format: String(localized: "system.group.full", defaultValue: "group is full (max %@ members)", comment: "Error when the group is at the member cap; placeholder is the cap"), locale: .current, "\(BitchatGroup.maxMembers)" )) @@ -243,14 +243,14 @@ final class ChatGroupCoordinator { let members = group.members + [newMember] guard let (updated, key) = context.groupStore.rotateKey(groupID: group.groupID, members: members), let payload = signedStatePayload(for: updated, key: key) else { - return .error(message: String(localized: "system.group.invite_failed", comment: "Error when building or signing a group invite fails")) + return .error(message: String(localized: "system.group.invite_failed", defaultValue: "could not build the group invite", comment: "Error when building or signing a group invite fails")) } context.sendGroupInvitePayload(payload, to: peerID) distributeState(payload, group: updated, excluding: [identity.fingerprint], type: .keyUpdate) return .success(message: String( - format: String(localized: "system.group.invited", comment: "System message after inviting someone; placeholders are the nickname and the group name"), + format: String(localized: "system.group.invited", defaultValue: "invited %1$@ to '%2$@'", comment: "System message after inviting someone; placeholders are the nickname and the group name"), locale: .current, nickname, updated.name @@ -263,36 +263,36 @@ final class ChatGroupCoordinator { func removeMember(nickname rawNickname: String) -> CommandResult { let nickname = normalizedNickname(rawNickname) guard !nickname.isEmpty else { - return .error(message: String(localized: "system.group.usage_remove", comment: "Usage hint for /group remove")) + return .error(message: String(localized: "system.group.usage_remove", defaultValue: "usage: /group remove @name", comment: "Usage hint for /group remove")) } guard let group = selectedGroup() else { - return .error(message: String(localized: "system.group.not_in_group", comment: "Error when a group command requires an open group chat")) + return .error(message: String(localized: "system.group.not_in_group", defaultValue: "open a group chat first", comment: "Error when a group command requires an open group chat")) } guard group.creatorFingerprint == context.myNoiseFingerprint() else { - return .error(message: String(localized: "system.group.creator_only", comment: "Error when a non-creator attempts a creator-only group action")) + return .error(message: String(localized: "system.group.creator_only", defaultValue: "only the group creator can do that", comment: "Error when a non-creator attempts a creator-only group action")) } guard let member = group.members.first(where: { $0.nickname.caseInsensitiveCompare(nickname) == .orderedSame }) else { return .error(message: String( - format: String(localized: "system.group.member_not_found", comment: "Error when the member to remove is not in the roster; placeholder is the nickname"), + format: String(localized: "system.group.member_not_found", defaultValue: "'%@' is not a member of this group", comment: "Error when the member to remove is not in the roster; placeholder is the nickname"), locale: .current, nickname )) } guard member.fingerprint != group.creatorFingerprint else { - return .error(message: String(localized: "system.group.cannot_remove_creator", comment: "Error when the creator tries to remove themselves")) + return .error(message: String(localized: "system.group.cannot_remove_creator", defaultValue: "the creator cannot be removed", comment: "Error when the creator tries to remove themselves")) } let remaining = group.members.filter { $0.fingerprint != member.fingerprint } guard let (rotated, newKey) = context.groupStore.rotateKey(groupID: group.groupID, members: remaining), let payload = signedStatePayload(for: rotated, key: newKey) else { - return .error(message: String(localized: "system.group.rotate_failed", comment: "Error when rotating the group key fails")) + return .error(message: String(localized: "system.group.rotate_failed", defaultValue: "could not rotate the group key", comment: "Error when rotating the group key fails")) } distributeState(payload, group: rotated, excluding: [], type: .keyUpdate) notifyRemovedMember(member, rotated: rotated) return .success(message: String( - format: String(localized: "system.group.removed_member", comment: "System message after removing a member and rotating the key; placeholder is the nickname"), + format: String(localized: "system.group.removed_member", defaultValue: "removed %@ and rotated the group key", comment: "System message after removing a member and rotating the key; placeholder is the nickname"), locale: .current, member.nickname )) @@ -300,7 +300,7 @@ final class ChatGroupCoordinator { func leaveGroup() -> CommandResult { guard let group = selectedGroup() else { - return .error(message: String(localized: "system.group.not_in_group", comment: "Error when a group command requires an open group chat")) + return .error(message: String(localized: "system.group.not_in_group", defaultValue: "open a group chat first", comment: "Error when a group command requires an open group chat")) } // Close the chat window first so the confirmation message doesn't // resurrect the conversation we're about to remove. @@ -309,7 +309,7 @@ final class ChatGroupCoordinator { context.groupStore.removeGroup(withID: group.groupID) context.notifyUIChanged() return .success(message: String( - format: String(localized: "system.group.left", comment: "System message after leaving a group; placeholder is the group name"), + format: String(localized: "system.group.left", defaultValue: "left group '%@'", comment: "System message after leaving a group; placeholder is the group name"), locale: .current, group.name )) @@ -318,14 +318,14 @@ final class ChatGroupCoordinator { func listGroups() -> CommandResult { let groups = context.groupStore.groups guard !groups.isEmpty else { - return .success(message: String(localized: "system.group.none", comment: "System message when the user is in no groups")) + return .success(message: String(localized: "system.group.none", defaultValue: "you are not in any groups — /group create to start one", comment: "System message when the user is in no groups")) } let myFingerprint = context.myNoiseFingerprint() let lines = groups.map { group -> String in let role = group.creatorFingerprint == myFingerprint ? " (creator)" : "" return "#\(group.name)\(role) — \(group.members.count)/\(BitchatGroup.maxMembers)" } - return .success(message: String(localized: "system.group.list_header", comment: "Header line for the /group list output") + "\n" + lines.joined(separator: "\n")) + return .success(message: String(localized: "system.group.list_header", defaultValue: "your groups:", comment: "Header line for the /group list output") + "\n" + lines.joined(separator: "\n")) } // MARK: - Sending @@ -336,7 +336,7 @@ final class ChatGroupCoordinator { guard !content.isEmpty, content.count <= InputValidator.Limits.maxMessageLength else { return } guard let group = context.groupStore.group(for: groupPeerID), let key = context.groupStore.key(forGroupID: group.groupID) else { - context.addSystemMessage(String(localized: "system.group.unknown", comment: "System message when sending into an unknown group")) + context.addSystemMessage(String(localized: "system.group.unknown", defaultValue: "you are no longer in this group", comment: "System message when sending into an unknown group")) return } @@ -358,7 +358,7 @@ final class ChatGroupCoordinator { } catch { SecureLogger.error("Failed to seal group message: \(error)", category: .encryption) context.addLocalPrivateSystemMessage( - String(localized: "system.group.send_failed", comment: "System message when sealing a group message fails"), + String(localized: "system.group.send_failed", defaultValue: "could not encrypt the message", comment: "System message when sealing a group message fails"), to: groupPeerID ) return @@ -559,7 +559,7 @@ private extension ChatGroupCoordinator { context.removePrivateChat(existing.peerID) context.groupStore.removeGroup(withID: existing.groupID) context.addSystemMessage(String( - format: String(localized: "system.group.removed_from", comment: "System message when removed from a group; placeholder is the group name"), + format: String(localized: "system.group.removed_from", defaultValue: "you were removed from group '%@'", comment: "System message when removed from a group; placeholder is the group name"), locale: .current, existing.name )) @@ -586,7 +586,7 @@ private extension ChatGroupCoordinator { ?? context.peerNickname(for: peerID) ?? "?" let notice = String( - format: String(localized: "system.group.joined", comment: "System message when added to a group; placeholders are the group name and the inviter"), + format: String(localized: "system.group.joined", defaultValue: "you were added to group '%1$@' by %2$@ — it now appears in your people list", comment: "System message when added to a group; placeholders are the group name and the inviter"), locale: .current, state.name, inviter diff --git a/bitchat/ViewModels/ChatLifecycleCoordinator.swift b/bitchat/ViewModels/ChatLifecycleCoordinator.swift index 1241f71b..0117bf60 100644 --- a/bitchat/ViewModels/ChatLifecycleCoordinator.swift +++ b/bitchat/ViewModels/ChatLifecycleCoordinator.swift @@ -350,7 +350,7 @@ private extension ChatLifecycleCoordinator { } catch { SecureLogger.error("❌ Failed to send geohash screenshot message: \(error)", category: .session) context.addSystemMessage( - String(localized: "system.location.send_failed", comment: "System message when a location channel send fails") + String(localized: "system.location.send_failed", defaultValue: "failed to send to location channel", comment: "System message when a location channel send fails") ) } } diff --git a/bitchat/ViewModels/ChatMediaTransferCoordinator.swift b/bitchat/ViewModels/ChatMediaTransferCoordinator.swift index bf0009da..43e90291 100644 --- a/bitchat/ViewModels/ChatMediaTransferCoordinator.swift +++ b/bitchat/ViewModels/ChatMediaTransferCoordinator.swift @@ -117,13 +117,13 @@ final class ChatMediaTransferCoordinator { try? FileManager.default.removeItem(at: url) await MainActor.run { [weak self] in guard let self else { return } - self.handleMediaSendFailure(messageID: messageID, reason: String(localized: "content.delivery.reason.voice_too_large", comment: "Failure reason shown when a voice note exceeds the size limit")) + self.handleMediaSendFailure(messageID: messageID, reason: String(localized: "content.delivery.reason.voice_too_large", defaultValue: "voice note too large", comment: "Failure reason shown when a voice note exceeds the size limit")) } } catch { SecureLogger.error("Voice note send failed: \(error)", category: .session) await MainActor.run { [weak self] in guard let self else { return } - self.handleMediaSendFailure(messageID: messageID, reason: String(localized: "content.delivery.reason.voice_send_failed", comment: "Failure reason shown when a voice note could not be sent")) + self.handleMediaSendFailure(messageID: messageID, reason: String(localized: "content.delivery.reason.voice_send_failed", defaultValue: "voice note failed to send", comment: "Failure reason shown when a voice note could not be sent")) } } } diff --git a/bitchat/ViewModels/ChatOutgoingCoordinator.swift b/bitchat/ViewModels/ChatOutgoingCoordinator.swift index 8d8b6a9e..4d1b4c56 100644 --- a/bitchat/ViewModels/ChatOutgoingCoordinator.swift +++ b/bitchat/ViewModels/ChatOutgoingCoordinator.swift @@ -147,7 +147,7 @@ private extension ChatOutgoingCoordinator { } catch { SecureLogger.error("❌ Failed to prepare geohash message: \(error)", category: .session) context.addSystemMessage( - String(localized: "system.location.send_failed", comment: "System message when a location channel send fails") + String(localized: "system.location.send_failed", defaultValue: "failed to send to location channel", comment: "System message when a location channel send fails") ) return } @@ -181,7 +181,7 @@ private extension ChatOutgoingCoordinator { } catch { SecureLogger.error("❌ Failed to prepare geohash message: \(error)", category: .session) context?.addSystemMessage( - String(localized: "system.location.send_failed", comment: "System message when a location channel send fails") + String(localized: "system.location.send_failed", defaultValue: "failed to send to location channel", comment: "System message when a location channel send fails") ) return } diff --git a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift index e577e406..0347f32e 100644 --- a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift @@ -238,7 +238,7 @@ final class ChatPrivateConversationCoordinator { let nickname = context.peerNickname(for: peerID) ?? "user" context.addSystemMessage( String( - format: String(localized: "system.dm.blocked_recipient", comment: "System message when attempting to message a blocked user"), + format: String(localized: "system.dm.blocked_recipient", defaultValue: "cannot send message to %@: person is blocked.", comment: "System message when attempting to message a blocked user"), locale: .current, nickname ) @@ -298,7 +298,7 @@ final class ChatPrivateConversationCoordinator { } else { context.setPrivateDeliveryStatus( .failed( - reason: String(localized: "content.delivery.reason.unreachable", comment: "Failure reason when a peer is unreachable") + reason: String(localized: "content.delivery.reason.unreachable", defaultValue: "peer not reachable", comment: "Failure reason when a peer is unreachable") ), forMessageID: messageID, peerID: peerID @@ -306,7 +306,7 @@ final class ChatPrivateConversationCoordinator { let name = recipientNickname ?? "user" context.addSystemMessage( String( - format: String(localized: "system.dm.unreachable", comment: "System message when a recipient is unreachable"), + format: String(localized: "system.dm.unreachable", defaultValue: "cannot send message to %@ - peer is not reachable via mesh or nostr.", comment: "System message when a recipient is unreachable"), locale: .current, name ) @@ -317,7 +317,7 @@ final class ChatPrivateConversationCoordinator { func sendGeohashDM(_ content: String, to peerID: PeerID) { guard case .location(let channel) = context.activeChannel else { context.addSystemMessage( - String(localized: "system.location.not_in_channel", comment: "System message when attempting to send without being in a location channel") + String(localized: "system.location.not_in_channel", defaultValue: "cannot send: not in a location channel", comment: "System message when attempting to send without being in a location channel") ) return } @@ -341,7 +341,7 @@ final class ChatPrivateConversationCoordinator { guard let recipientHex = context.nostrKeyMapping[peerID] else { context.setPrivateDeliveryStatus( .failed( - reason: String(localized: "content.delivery.reason.unknown_recipient", comment: "Failure reason when the recipient is unknown") + reason: String(localized: "content.delivery.reason.unknown_recipient", defaultValue: "unknown recipient", comment: "Failure reason when the recipient is unknown") ), forMessageID: messageID, peerID: peerID @@ -352,13 +352,13 @@ final class ChatPrivateConversationCoordinator { if context.isNostrBlocked(pubkeyHexLowercased: recipientHex) { context.setPrivateDeliveryStatus( .failed( - reason: String(localized: "content.delivery.reason.blocked", comment: "Failure reason when the user is blocked") + reason: String(localized: "content.delivery.reason.blocked", defaultValue: "user is blocked", comment: "Failure reason when the user is blocked") ), forMessageID: messageID, peerID: peerID ) context.addSystemMessage( - String(localized: "system.dm.blocked_generic", comment: "System message when sending fails because user is blocked") + String(localized: "system.dm.blocked_generic", defaultValue: "cannot send message: person is blocked.", comment: "System message when sending fails because user is blocked") ) return } @@ -368,7 +368,7 @@ final class ChatPrivateConversationCoordinator { if recipientHex.lowercased() == identity.publicKeyHex.lowercased() { context.setPrivateDeliveryStatus( .failed( - reason: String(localized: "content.delivery.reason.self", comment: "Failure reason when attempting to message yourself") + reason: String(localized: "content.delivery.reason.self", defaultValue: "cannot message yourself", comment: "Failure reason when attempting to message yourself") ), forMessageID: messageID, peerID: peerID @@ -390,7 +390,7 @@ final class ChatPrivateConversationCoordinator { } catch { context.setPrivateDeliveryStatus( .failed( - reason: String(localized: "content.delivery.reason.send_error", comment: "Failure reason for a generic send error") + reason: String(localized: "content.delivery.reason.send_error", defaultValue: "send error", comment: "Failure reason for a generic send error") ), forMessageID: messageID, peerID: peerID diff --git a/bitchat/ViewModels/ChatViewModelBootstrapper.swift b/bitchat/ViewModels/ChatViewModelBootstrapper.swift index caca90ec..722cd177 100644 --- a/bitchat/ViewModels/ChatViewModelBootstrapper.swift +++ b/bitchat/ViewModels/ChatViewModelBootstrapper.swift @@ -107,7 +107,7 @@ private extension ChatViewModelBootstrapper { category: .session ) viewModel.conversations.setDeliveryStatus( - .failed(reason: String(localized: "content.delivery.reason.not_delivered", comment: "Failure reason shown when the router gave up delivering a message")), + .failed(reason: String(localized: "content.delivery.reason.not_delivered", defaultValue: "not delivered", comment: "Failure reason shown when the router gave up delivering a message")), forMessageID: messageID ) } diff --git a/bitchat/ViewModels/Extensions/ChatViewModel+Tor.swift b/bitchat/ViewModels/Extensions/ChatViewModel+Tor.swift index 443849db..3221445f 100644 --- a/bitchat/ViewModels/Extensions/ChatViewModel+Tor.swift +++ b/bitchat/ViewModels/Extensions/ChatViewModel+Tor.swift @@ -19,7 +19,7 @@ extension ChatViewModel { self.torStatusAnnounced = true // Post only in geohash channels (queue if not active) self.addGeohashOnlySystemMessage( - String(localized: "system.tor.starting", comment: "System message when Tor is starting") + String(localized: "system.tor.starting", defaultValue: "starting tor...", comment: "System message when Tor is starting") ) } } @@ -30,7 +30,7 @@ extension ChatViewModel { self.torRestartPending = true // Post only in geohash channels (queue if not active) self.addGeohashOnlySystemMessage( - String(localized: "system.tor.restarting", comment: "System message when Tor is restarting") + String(localized: "system.tor.restarting", defaultValue: "tor restarting to recover connectivity...", comment: "System message when Tor is restarting") ) } } @@ -41,13 +41,13 @@ extension ChatViewModel { if self.torRestartPending { // Post only in geohash channels (queue if not active) self.addGeohashOnlySystemMessage( - String(localized: "system.tor.restarted", comment: "System message when Tor has restarted") + String(localized: "system.tor.restarted", defaultValue: "tor restarted. network routing restored.", comment: "System message when Tor has restarted") ) self.torRestartPending = false } else if TorManager.shared.torEnforced && !self.torInitialReadyAnnounced { // Initial start completed self.addGeohashOnlySystemMessage( - String(localized: "system.tor.started", comment: "System message when Tor has started") + String(localized: "system.tor.started", defaultValue: "tor started. routing all chats via tor for IP privacy.", comment: "System message when Tor has started") ) self.torInitialReadyAnnounced = true } diff --git a/bitchat/Views/AppInfoView.swift b/bitchat/Views/AppInfoView.swift index a4b82104..496f0230 100644 --- a/bitchat/Views/AppInfoView.swift +++ b/bitchat/Views/AppInfoView.swift @@ -144,7 +144,7 @@ struct AppInfoView: View { // Custom header for macOS HStack { Spacer() - Button("app_info.done") { + Button(String(localized: "app_info.done", defaultValue: "DONE")) { dismiss() } .buttonStyle(.plain) @@ -256,7 +256,7 @@ struct AppInfoView: View { .contentShape(Rectangle()) } .buttonStyle(.plain) - .accessibilityHint(Text("app_info.network.topology.hint")) + .accessibilityHint(Text(String(localized: "app_info.network.topology.hint", defaultValue: "opens the mesh topology map"))) } } diff --git a/bitchat/Views/Components/DeliveryStatusView.swift b/bitchat/Views/Components/DeliveryStatusView.swift index e106d2c1..f54ee88b 100644 --- a/bitchat/Views/Components/DeliveryStatusView.swift +++ b/bitchat/Views/Components/DeliveryStatusView.swift @@ -16,32 +16,32 @@ extension DeliveryStatus { var bitchatDescription: String { switch self { case .sending: - return String(localized: "content.delivery.sending", comment: "Delivery status description while a private message is being sent") + return String(localized: "content.delivery.sending", defaultValue: "sending...", comment: "Delivery status description while a private message is being sent") case .sent: - return String(localized: "content.delivery.sent", comment: "Delivery status description for a sent but not yet confirmed private message") + return String(localized: "content.delivery.sent", defaultValue: "sent — no delivery confirmation yet", comment: "Delivery status description for a sent but not yet confirmed private message") case .carried: return String(localized: "content.delivery.carried", defaultValue: "Carried by a friend who may meet them", comment: "Delivery status description for messages handed to a courier for physical delivery") case .delivered(let nickname, _): return String( - format: String(localized: "content.delivery.delivered_to", comment: "Tooltip for delivered private messages"), + format: String(localized: "content.delivery.delivered_to", defaultValue: "delivered to %@", comment: "Tooltip for delivered private messages"), locale: .current, nickname ) case .read(let nickname, _): return String( - format: String(localized: "content.delivery.read_by", comment: "Tooltip for read private messages"), + format: String(localized: "content.delivery.read_by", defaultValue: "read by %@", comment: "Tooltip for read private messages"), locale: .current, nickname ) case .failed(let reason): return String( - format: String(localized: "content.delivery.failed", comment: "Tooltip for failed message delivery"), + format: String(localized: "content.delivery.failed", defaultValue: "failed: %@", comment: "Tooltip for failed message delivery"), locale: .current, reason ) case .partiallyDelivered(let reached, let total): return String( - format: String(localized: "content.delivery.delivered_members", comment: "Tooltip for partially delivered messages"), + format: String(localized: "content.delivery.delivered_members", defaultValue: "delivered to %1$d of %2$d members", comment: "Tooltip for partially delivered messages"), locale: .current, reached, total diff --git a/bitchat/Views/Components/PaymentChipView.swift b/bitchat/Views/Components/PaymentChipView.swift index bdda8772..5e09e0b3 100644 --- a/bitchat/Views/Components/PaymentChipView.swift +++ b/bitchat/Views/Components/PaymentChipView.swift @@ -70,9 +70,9 @@ struct PaymentChipView: View { var label: String { switch self { case .cashu: - String(localized: "content.payment.cashu", comment: "Label for Cashu payment chip") + String(localized: "content.payment.cashu", defaultValue: "pay via cashu", comment: "Label for Cashu payment chip") case .lightning: - String(localized: "content.payment.lightning", comment: "Label for Lightning payment chip") + String(localized: "content.payment.lightning", defaultValue: "pay via lightning", comment: "Label for Lightning payment chip") } } } @@ -145,18 +145,18 @@ struct PaymentChipView: View { Button { copyToPasteboard(token) } label: { - Label(String(localized: "content.payment.copy_token", comment: "Context menu action copying a Cashu token to the pasteboard"), systemImage: "doc.on.doc") + Label(String(localized: "content.payment.copy_token", defaultValue: "copy token", comment: "Context menu action copying a Cashu token to the pasteboard"), systemImage: "doc.on.doc") } Button { redeemCashu() } label: { - Label(String(localized: "content.payment.redeem_wallet", comment: "Context menu action opening a Cashu token in an ecash wallet app"), systemImage: "wallet.pass") + Label(String(localized: "content.payment.redeem_wallet", defaultValue: "redeem in wallet", comment: "Context menu action opening a Cashu token in an ecash wallet app"), systemImage: "wallet.pass") } if let webURL = paymentType.cashuWebRedeemURL { Button { openExternalURL(webURL) } label: { - Label(String(localized: "content.payment.redeem_web", comment: "Context menu action opening a Cashu token in the web redemption page"), systemImage: "safari") + Label(String(localized: "content.payment.redeem_web", defaultValue: "redeem on web", comment: "Context menu action opening a Cashu token in the web redemption page"), systemImage: "safari") } } } diff --git a/bitchat/Views/Components/SheetCloseButton.swift b/bitchat/Views/Components/SheetCloseButton.swift index e2891e35..a1dee0bc 100644 --- a/bitchat/Views/Components/SheetCloseButton.swift +++ b/bitchat/Views/Components/SheetCloseButton.swift @@ -24,6 +24,6 @@ struct SheetCloseButton: View { .contentShape(Rectangle().inset(by: -6)) } .buttonStyle(.plain) - .accessibilityLabel(String(localized: "common.close", comment: "Accessibility label for close buttons")) + .accessibilityLabel(String(localized: "common.close", defaultValue: "close", comment: "Accessibility label for close buttons")) } } diff --git a/bitchat/Views/Components/TextMessageView.swift b/bitchat/Views/Components/TextMessageView.swift index 4c96b201..36f5ab81 100644 --- a/bitchat/Views/Components/TextMessageView.swift +++ b/bitchat/Views/Components/TextMessageView.swift @@ -69,7 +69,7 @@ struct TextMessageView: View { } .buttonStyle(.plain) .accessibilityHint( - String(localized: "content.accessibility.delivery_detail_hint", comment: "Accessibility hint for the delivery status glyph explaining a tap reveals details") + String(localized: "content.accessibility.delivery_detail_hint", defaultValue: "tap to show delivery details", comment: "Accessibility hint for the delivery status glyph explaining a tap reveals details") ) } } diff --git a/bitchat/Views/ContentComposerView.swift b/bitchat/Views/ContentComposerView.swift index a3ec8d0f..bc154792 100644 --- a/bitchat/Views/ContentComposerView.swift +++ b/bitchat/Views/ContentComposerView.swift @@ -118,17 +118,17 @@ private extension ContentComposerView { let isGeoDM = privateConversationModel.selectedPeerID?.isGeoDM == true let target = isGeoDM ? header.displayName : "@\(header.displayName)" return String( - format: String(localized: "content.input.placeholder.private", comment: "Composer placeholder inside a private chat, naming the conversation partner"), + format: String(localized: "content.input.placeholder.private", defaultValue: "message %@ — private", comment: "Composer placeholder inside a private chat, naming the conversation partner"), locale: .current, target ) } switch locationChannelsModel.selectedChannel { case .mesh: - return String(localized: "content.input.placeholder.mesh", comment: "Composer placeholder for the public mesh channel") + return String(localized: "content.input.placeholder.mesh", defaultValue: "message #mesh — public, nearby", comment: "Composer placeholder for the public mesh channel") case .location(let channel): return String( - format: String(localized: "content.input.placeholder.location", comment: "Composer placeholder for a public geohash channel, naming it"), + format: String(localized: "content.input.placeholder.location", defaultValue: "message #%@ — public", comment: "Composer placeholder for a public geohash channel, naming it"), locale: .current, channel.geohash ) @@ -184,15 +184,15 @@ private extension ContentComposerView { showImagePicker = true } .accessibilityLabel( - String(localized: "content.accessibility.attach_photo", comment: "Accessibility label for the photo attachment button") + String(localized: "content.accessibility.attach_photo", defaultValue: "attach photo", comment: "Accessibility label for the photo attachment button") ) .accessibilityHint( - String(localized: "content.accessibility.attach_photo_hint", comment: "Accessibility hint explaining the attachment button opens the photo library") + String(localized: "content.accessibility.attach_photo_hint", defaultValue: "opens the photo library; use the take photo action for the camera", comment: "Accessibility hint explaining the attachment button opens the photo library") ) .accessibilityAddTraits(.isButton) // The long-press → camera path is unreachable for VoiceOver users; // mirror it as a named action. - .accessibilityAction(named: Text("content.accessibility.take_photo", comment: "Accessibility action name for taking a photo with the camera")) { + .accessibilityAction(named: Text(String(localized: "content.accessibility.take_photo", defaultValue: "take photo with camera", comment: "Accessibility action name for taking a photo with the camera"))) { imagePickerSourceType = .camera showImagePicker = true } @@ -205,7 +205,7 @@ private extension ContentComposerView { } .buttonStyle(.plain) .accessibilityLabel( - String(localized: "content.accessibility.choose_photo", comment: "Accessibility label for the macOS photo picker button") + String(localized: "content.accessibility.choose_photo", defaultValue: "choose photo", comment: "Accessibility label for the macOS photo picker button") ) #endif } @@ -249,15 +249,15 @@ private extension ContentComposerView { ) ) .accessibilityLabel( - String(localized: "content.accessibility.record_voice_note", comment: "Accessibility label for the voice note button") + String(localized: "content.accessibility.record_voice_note", defaultValue: "record voice note", comment: "Accessibility label for the voice note button") ) .accessibilityValue( voiceRecordingVM.state.isActive - ? String(localized: "content.accessibility.recording", comment: "Accessibility value announced while a voice note is recording") + ? String(localized: "content.accessibility.recording", defaultValue: "recording", comment: "Accessibility value announced while a voice note is recording") : "" ) .accessibilityHint( - String(localized: "content.accessibility.record_voice_hint", comment: "Accessibility hint explaining double-tap toggles voice recording") + String(localized: "content.accessibility.record_voice_hint", defaultValue: "double-tap to start recording, double-tap again to send", comment: "Accessibility hint explaining double-tap toggles voice recording") ) .accessibilityAddTraits(.isButton) // Press-and-hold drag gestures can't be activated by VoiceOver; @@ -282,12 +282,12 @@ private extension ContentComposerView { .buttonStyle(.plain) .disabled(!enabled) .accessibilityLabel( - String(localized: "content.accessibility.send_message", comment: "Accessibility label for the send message button") + String(localized: "content.accessibility.send_message", defaultValue: "send message", comment: "Accessibility label for the send message button") ) .accessibilityHint( enabled - ? String(localized: "content.accessibility.send_hint_ready", comment: "Hint prompting the user to send the message") - : String(localized: "content.accessibility.send_hint_empty", comment: "Hint prompting the user to enter a message") + ? String(localized: "content.accessibility.send_hint_ready", defaultValue: "double tap to send", comment: "Hint prompting the user to send the message") + : String(localized: "content.accessibility.send_hint_empty", defaultValue: "enter a message to send", comment: "Hint prompting the user to enter a message") ) } } diff --git a/bitchat/Views/ContentHeaderView.swift b/bitchat/Views/ContentHeaderView.swift index 6a260b07..e61f06af 100644 --- a/bitchat/Views/ContentHeaderView.swift +++ b/bitchat/Views/ContentHeaderView.swift @@ -44,7 +44,7 @@ struct ContentHeaderView: View { // stays undiscoverable on purpose — it's destructive.) .accessibilityAddTraits(.isButton) .accessibilityHint( - String(localized: "content.accessibility.app_info_hint", comment: "Accessibility hint on the bitchat/ logo explaining a tap opens app info") + String(localized: "content.accessibility.app_info_hint", defaultValue: "shows app info", comment: "Accessibility hint on the bitchat/ logo explaining a tap opens app info") ) .accessibilityAction { appChromeModel.presentAppInfo() @@ -56,7 +56,7 @@ struct ContentHeaderView: View { .foregroundColor(palette.secondary) TextField( - "content.input.nickname_placeholder", + String(localized: "content.input.nickname_placeholder", defaultValue: "nickname"), text: Binding( get: { appChromeModel.nickname }, set: { appChromeModel.setNickname($0) } @@ -133,7 +133,7 @@ struct ContentHeaderView: View { } .buttonStyle(.plain) .accessibilityLabel( - String(localized: "content.accessibility.open_unread_private_chat", comment: "Accessibility label for the unread private chat button") + String(localized: "content.accessibility.open_unread_private_chat", defaultValue: "open unread private chat", comment: "Accessibility label for the unread private chat button") ) } @@ -151,7 +151,7 @@ struct ContentHeaderView: View { } .buttonStyle(.plain) .accessibilityLabel( - String(localized: "content.accessibility.location_notes", comment: "Accessibility label for location notes button") + String(localized: "content.accessibility.location_notes", defaultValue: "location notes for this place", comment: "Accessibility label for location notes button") ) } @@ -178,7 +178,7 @@ struct ContentHeaderView: View { .buttonStyle(.plain) .accessibilityLabel( String( - format: String(localized: "content.accessibility.toggle_bookmark", comment: "Accessibility label for toggling a geohash bookmark"), + format: String(localized: "content.accessibility.toggle_bookmark", defaultValue: "toggle bookmark for #%@", comment: "Accessibility label for toggling a geohash bookmark"), locale: .current, channel.geohash ) @@ -211,7 +211,7 @@ struct ContentHeaderView: View { .frame(maxHeight: .infinity) .contentShape(Rectangle()) .accessibilityLabel( - String(localized: "content.accessibility.location_channels", comment: "Accessibility label for the location channels button") + String(localized: "content.accessibility.location_channels", defaultValue: "location channels", comment: "Accessibility label for the location channels button") ) } .buttonStyle(.plain) @@ -238,7 +238,7 @@ struct ContentHeaderView: View { .buttonStyle(.plain) .accessibilityLabel( String( - format: String(localized: "content.accessibility.people_count", comment: "Accessibility label announcing number of people in header"), + format: String(localized: "content.accessibility.people_count", defaultValue: "%#@people@", comment: "Accessibility label announcing number of people in header"), locale: .current, headerOtherPeersCount ) @@ -247,8 +247,8 @@ struct ContentHeaderView: View { // color; say it. .accessibilityValue( headerPeersReachable - ? String(localized: "content.accessibility.peers_connected", comment: "Accessibility value when peers are reachable") - : String(localized: "content.accessibility.peers_none", comment: "Accessibility value when no peers are reachable") + ? String(localized: "content.accessibility.peers_connected", defaultValue: "connected", comment: "Accessibility value when peers are reachable") + : String(localized: "content.accessibility.peers_none", defaultValue: "no one reachable", comment: "Accessibility value when no peers are reachable") ) } .layoutPriority(3) @@ -325,10 +325,10 @@ struct ContentHeaderView: View { .onChange(of: locationChannelsModel.permissionState) { _ in locationChannelsModel.refreshMeshChannelsIfNeeded() } - .alert("content.alert.screenshot.title", isPresented: $appChromeModel.showScreenshotPrivacyWarning) { - Button("common.ok", role: .cancel) {} + .alert(String(localized: "content.alert.screenshot.title", defaultValue: "heads up"), isPresented: $appChromeModel.showScreenshotPrivacyWarning) { + Button(String(localized: "common.ok", defaultValue: "OK"), role: .cancel) {} } message: { - Text("content.alert.screenshot.message") + Text(String(localized: "content.alert.screenshot.message", defaultValue: "screenshots of location channels will reveal your location. think before sharing publicly.")) } .themedChromePanel(edge: .top) } @@ -392,7 +392,7 @@ private struct ContentLocationNotesUnavailableView: View { var body: some View { VStack(spacing: 12) { HStack { - Text("content.notes.title") + Text(String(localized: "content.notes.title", defaultValue: "notes")) .bitchatFont(size: 16, weight: .bold) Spacer() SheetCloseButton { showLocationNotes = false } @@ -401,10 +401,10 @@ private struct ContentLocationNotesUnavailableView: View { .frame(minHeight: headerHeight) .padding(.horizontal, 12) .themedChromePanel(edge: .top) - Text("content.notes.location_unavailable") + Text(String(localized: "content.notes.location_unavailable", defaultValue: "location unavailable")) .bitchatFont(size: 14) .foregroundColor(palette.secondary) - Button("content.location.enable") { + Button(String(localized: "content.location.enable", defaultValue: "enable location")) { locationChannelsModel.enableAndRefresh() } .buttonStyle(.bordered) diff --git a/bitchat/Views/ContentSheetViews.swift b/bitchat/Views/ContentSheetViews.swift index 4d9d5c5b..62a4c0ec 100644 --- a/bitchat/Views/ContentSheetViews.swift +++ b/bitchat/Views/ContentSheetViews.swift @@ -163,10 +163,10 @@ private struct ContentPeopleListView: View { // .help maps to the accessibility *hint* on iOS, so the // button still needs a spoken name. .accessibilityLabel( - String(localized: "content.accessibility.verification", comment: "Accessibility label for the verification QR button") + String(localized: "content.accessibility.verification", defaultValue: "verify encryption", comment: "Accessibility label for the verification QR button") ) .help( - String(localized: "content.help.verification", comment: "Help text for verification button") + String(localized: "content.help.verification", defaultValue: "verification: show my QR or scan a friend", comment: "Help text for verification button") ) } SheetCloseButton { @@ -262,7 +262,7 @@ private struct ContentPeopleListView: View { private extension ContentPeopleListView { var peopleSheetTitle: String { - String(localized: "content.header.people", comment: "Title for the people list sheet").lowercased() + String(localized: "content.header.people", defaultValue: "PEOPLE", comment: "Title for the people list sheet").lowercased() } var peopleSheetSubtitle: String? { @@ -329,7 +329,7 @@ private struct ContentPrivateChatSheetView: View { } .buttonStyle(.plain) .accessibilityLabel( - String(localized: "content.accessibility.back_to_main_chat", comment: "Accessibility label for returning to main chat") + String(localized: "content.accessibility.back_to_main_chat", defaultValue: "back to main chat", comment: "Accessibility label for returning to main chat") ) Spacer(minLength: 0) @@ -354,8 +354,8 @@ private struct ContentPrivateChatSheetView: View { .buttonStyle(.plain) .accessibilityLabel( headerState.isFavorite - ? String(localized: "content.accessibility.remove_favorite", comment: "Accessibility label to remove a favorite") - : String(localized: "content.accessibility.add_favorite", comment: "Accessibility label to add a favorite") + ? String(localized: "content.accessibility.remove_favorite", defaultValue: "remove from favorites", comment: "Accessibility label to remove a favorite") + : String(localized: "content.accessibility.add_favorite", defaultValue: "add to favorites", comment: "Accessibility label to add a favorite") ) } } @@ -464,7 +464,7 @@ private struct ContentPrivateChatSheetView: View { private var privacyCaptionText: String { // Group chats are ChaCha20-Poly1305 sealed to the roster's shared key. if privateConversationModel.selectedPeerID?.isGroup == true { - return String(localized: "content.private.caption_group", comment: "Caption above the group chat composer noting messages are encrypted to group members") + return String(localized: "content.private.caption_group", defaultValue: "encrypted group · members only", comment: "Caption above the group chat composer noting messages are encrypted to group members") } // Geohash DMs are NIP-17 gift-wrapped — always end-to-end encrypted, // even though they carry no Noise session status. Mesh DMs earn the @@ -477,9 +477,9 @@ private struct ContentPrivateChatSheetView: View { } }() if isGeoDM || noiseSecured { - return String(localized: "content.private.caption_encrypted", comment: "Caption above the private chat composer once the session is end-to-end encrypted") + return String(localized: "content.private.caption_encrypted", defaultValue: "private · end-to-end encrypted", comment: "Caption above the private chat composer once the session is end-to-end encrypted") } - return String(localized: "content.private.caption", comment: "Caption above the private chat composer before encryption is established") + return String(localized: "content.private.caption", defaultValue: "private conversation", comment: "Caption above the private chat composer before encryption is established") } } @@ -523,27 +523,27 @@ private struct ContentPrivateHeaderInfoButton: View { Image(systemName: "person.3.fill") .font(.bitchatSystem(size: 14)) .foregroundColor(palette.primary) - .accessibilityLabel(String(localized: "content.accessibility.group_chat", comment: "Accessibility label for the group chat indicator")) + .accessibilityLabel(String(localized: "content.accessibility.group_chat", defaultValue: "Group chat", comment: "Accessibility label for the group chat indicator")) } else { switch headerState.availability { case .bluetoothConnected: Image(systemName: "dot.radiowaves.left.and.right") .font(.bitchatSystem(size: 14)) .foregroundColor(palette.primary) - .accessibilityLabel(String(localized: "content.accessibility.connected_mesh", comment: "Accessibility label for mesh-connected peer indicator")) + .accessibilityLabel(String(localized: "content.accessibility.connected_mesh", defaultValue: "connected via mesh", comment: "Accessibility label for mesh-connected peer indicator")) case .meshReachable: Image(systemName: "point.3.filled.connected.trianglepath.dotted") .font(.bitchatSystem(size: 14)) .foregroundColor(palette.primary) - .accessibilityLabel(String(localized: "content.accessibility.reachable_mesh", comment: "Accessibility label for mesh-reachable peer indicator")) + .accessibilityLabel(String(localized: "content.accessibility.reachable_mesh", defaultValue: "reachable via mesh", comment: "Accessibility label for mesh-reachable peer indicator")) case .nostrAvailable: Image(systemName: "globe") .font(.bitchatSystem(size: 14)) .foregroundColor(.purple) - .accessibilityLabel(String(localized: "content.accessibility.available_nostr", comment: "Accessibility label for Nostr-available peer indicator")) + .accessibilityLabel(String(localized: "content.accessibility.available_nostr", defaultValue: "available via Nostr", comment: "Accessibility label for Nostr-available peer indicator")) case .offline: // Absence of a glyph was the only offline signal; say it. - Text("mesh_peers.state.offline") + Text(String(localized: "mesh_peers.state.offline", defaultValue: "offline")) .bitchatFont(size: 11) .foregroundColor(palette.secondary) } @@ -574,7 +574,7 @@ private struct ContentPrivateHeaderInfoButton: View { ) .accessibilityLabel( String( - format: String(localized: "content.accessibility.encryption_status", comment: "Accessibility label announcing encryption status"), + format: String(localized: "content.accessibility.encryption_status", defaultValue: "encryption status: %@", comment: "Accessibility label announcing encryption status"), locale: .current, encryptionStatus.accessibilityDescription ) @@ -585,7 +585,7 @@ private struct ContentPrivateHeaderInfoButton: View { .buttonStyle(.plain) .accessibilityLabel( String( - format: String(localized: "content.accessibility.private_chat_header", comment: "Accessibility label describing the private chat header"), + format: String(localized: "content.accessibility.private_chat_header", defaultValue: "private chat with %@", comment: "Accessibility label describing the private chat header"), locale: .current, headerState.displayName ) @@ -593,7 +593,7 @@ private struct ContentPrivateHeaderInfoButton: View { .accessibilityHint( headerState.isGroupConversation ? "" - : String(localized: "content.accessibility.view_fingerprint_hint", comment: "Accessibility hint for viewing encryption fingerprint") + : String(localized: "content.accessibility.view_fingerprint_hint", defaultValue: "tap to view encryption fingerprint", comment: "Accessibility hint for viewing encryption fingerprint") ) .frame(minHeight: headerHeight) } diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index bd434ad1..ce0819de 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -204,20 +204,20 @@ struct ContentView: View { } } .alert("Recording Error", isPresented: $voiceRecordingVM.showAlert, actions: { - Button("common.ok", role: .cancel) {} + Button(String(localized: "common.ok", defaultValue: "OK"), role: .cancel) {} if voiceRecordingVM.state == .permissionDenied { - Button("location_channels.action.open_settings") { + Button(String(localized: "location_channels.action.open_settings", defaultValue: "open settings")) { SystemSettings.microphone.open() } } }, message: { Text(voiceRecordingVM.state.alertMessage) }) - .alert("content.alert.bluetooth_required.title", isPresented: $appChromeModel.showBluetoothAlert) { - Button("content.alert.bluetooth_required.settings") { + .alert(String(localized: "content.alert.bluetooth_required.title", defaultValue: "bluetooth required"), isPresented: $appChromeModel.showBluetoothAlert) { + Button(String(localized: "content.alert.bluetooth_required.settings", defaultValue: "settings")) { SystemSettings.bluetooth.open() } - Button("common.ok", role: .cancel) {} + Button(String(localized: "common.ok", defaultValue: "OK"), role: .cancel) {} } message: { Text(appChromeModel.bluetoothAlertMessage) } diff --git a/bitchat/Views/FingerprintView.swift b/bitchat/Views/FingerprintView.swift index fb4541f5..aff63985 100644 --- a/bitchat/Views/FingerprintView.swift +++ b/bitchat/Views/FingerprintView.swift @@ -30,7 +30,7 @@ struct FingerprintView: View { static let verifiedMessage: LocalizedStringKey = "fingerprint.message.verified" static func verifyHint(_ nickname: String) -> String { String( - format: String(localized: "fingerprint.message.verify_hint", comment: "Instruction to compare fingerprints with a named peer"), + format: String(localized: "fingerprint.message.verify_hint", defaultValue: "compare these fingerprints with %@ using a secure channel.", comment: "Instruction to compare fingerprints with a named peer"), locale: .current, nickname ) @@ -40,13 +40,13 @@ struct FingerprintView: View { static let vouchedBadge: LocalizedStringKey = "fingerprint.badge.vouched" static func vouchedBy(_ count: Int) -> String { String( - format: String(localized: "fingerprint.message.vouched_by", comment: "How many people the user verified have vouched for this peer"), + format: String(localized: "fingerprint.message.vouched_by", defaultValue: "vouched for by %#@people@ you verified", comment: "How many people the user verified have vouched for this peer"), locale: .current, count ) } static func unknownPeer() -> String { - String(localized: "common.unknown", comment: "Label for an unknown peer") + String(localized: "common.unknown", defaultValue: "unknown", comment: "Label for an unknown peer") } } diff --git a/bitchat/Views/GeohashPeopleList.swift b/bitchat/Views/GeohashPeopleList.swift index 9613f227..42034944 100644 --- a/bitchat/Views/GeohashPeopleList.swift +++ b/bitchat/Views/GeohashPeopleList.swift @@ -10,16 +10,16 @@ struct GeohashPeopleList: View { private enum Strings { static let noneNearby: LocalizedStringKey = "geohash_people.none_nearby" static let youSuffix: LocalizedStringKey = "geohash_people.you_suffix" - static let blockedTooltip = String(localized: "geohash_people.tooltip.blocked", comment: "Tooltip shown next to users blocked in geohash channels") + static let blockedTooltip = String(localized: "geohash_people.tooltip.blocked", defaultValue: "blocked in geohash", comment: "Tooltip shown next to users blocked in geohash channels") static let unblock: LocalizedStringKey = "geohash_people.action.unblock" static let block: LocalizedStringKey = "geohash_people.action.block" - static let unblockText = String(localized: "geohash_people.action.unblock", comment: "Context menu action to unblock a person") - static let blockText = String(localized: "geohash_people.action.block", comment: "Context menu action to block a person") - static let teleported = String(localized: "geohash_people.state.teleported", comment: "State label for someone who joined the location channel from elsewhere") - static let nearby = String(localized: "geohash_people.state.nearby", comment: "State label for someone physically in the location channel's area") - static let blockedState = String(localized: "mesh_peers.state.blocked", comment: "State label for a blocked peer") - static let youState = String(localized: "geohash_people.state.you", comment: "State label marking your own row in the people list") - static let openDMHint = String(localized: "mesh_peers.accessibility.open_dm_hint", comment: "Accessibility hint on a peer row explaining activation opens a private chat") + static let unblockText = String(localized: "geohash_people.action.unblock", defaultValue: "unblock", comment: "Context menu action to unblock a person") + static let blockText = String(localized: "geohash_people.action.block", defaultValue: "block", comment: "Context menu action to block a person") + static let teleported = String(localized: "geohash_people.state.teleported", defaultValue: "teleported from elsewhere", comment: "State label for someone who joined the location channel from elsewhere") + static let nearby = String(localized: "geohash_people.state.nearby", defaultValue: "in this area", comment: "State label for someone physically in the location channel's area") + static let blockedState = String(localized: "mesh_peers.state.blocked", defaultValue: "blocked", comment: "State label for a blocked peer") + static let youState = String(localized: "geohash_people.state.you", defaultValue: "you", comment: "State label marking your own row in the people list") + static let openDMHint = String(localized: "mesh_peers.accessibility.open_dm_hint", defaultValue: "opens a private chat", comment: "Accessibility hint on a peer row explaining activation opens a private chat") } var body: some View { diff --git a/bitchat/Views/GroupChatList.swift b/bitchat/Views/GroupChatList.swift index 8b62d8a2..c4aef7a1 100644 --- a/bitchat/Views/GroupChatList.swift +++ b/bitchat/Views/GroupChatList.swift @@ -10,12 +10,12 @@ struct GroupChatList: View { let onTapGroup: (PeerID) -> Void private enum Strings { - static let header = String(localized: "groups.section.header", comment: "Section header above the private groups list") - static let creator = String(localized: "groups.state.creator", comment: "State label for a group the user created") - static let unread = String(localized: "mesh_peers.state.unread", comment: "State label for a peer with unread private messages") - static let newMessagesTooltip = String(localized: "mesh_peers.tooltip.new_messages", comment: "Tooltip for the unread messages indicator") - static let openGroupHint = String(localized: "groups.accessibility.open_group_hint", comment: "Accessibility hint on a group row explaining activation opens the group chat") - static let memberCountFormat = String(localized: "groups.member_count %@", comment: "Member count shown next to a group name; placeholder is the count") + static let header = String(localized: "groups.section.header", defaultValue: "groups", comment: "Section header above the private groups list") + static let creator = String(localized: "groups.state.creator", defaultValue: "Creator", comment: "State label for a group the user created") + static let unread = String(localized: "mesh_peers.state.unread", defaultValue: "new messages", comment: "State label for a peer with unread private messages") + static let newMessagesTooltip = String(localized: "mesh_peers.tooltip.new_messages", defaultValue: "new messages", comment: "Tooltip for the unread messages indicator") + static let openGroupHint = String(localized: "groups.accessibility.open_group_hint", defaultValue: "Opens the group chat", comment: "Accessibility hint on a group row explaining activation opens the group chat") + static let memberCountFormat = String(localized: "groups.member_count %@", defaultValue: "(%@)", comment: "Member count shown next to a group name; placeholder is the count") } var body: some View { diff --git a/bitchat/Views/LocationChannelsSheet.swift b/bitchat/Views/LocationChannelsSheet.swift index 0a6e077a..6e9e5b95 100644 --- a/bitchat/Views/LocationChannelsSheet.swift +++ b/bitchat/Views/LocationChannelsSheet.swift @@ -32,13 +32,13 @@ struct LocationChannelsSheet: View { static let toggleOn: LocalizedStringKey = "common.toggle.on" static let toggleOff: LocalizedStringKey = "common.toggle.off" - static let invalidGeohash = String(localized: "location_channels.error.invalid_geohash", comment: "Error shown when a custom geohash is invalid") - static let switchChannelHint = String(localized: "location_channels.accessibility.switch_hint", comment: "Accessibility hint on a channel row explaining activation switches to it") - static let addBookmark = String(localized: "location_channels.accessibility.add_bookmark", comment: "Accessibility action name for bookmarking a channel") - static let removeBookmark = String(localized: "location_channels.accessibility.remove_bookmark", comment: "Accessibility action name for removing a channel bookmark") + static let invalidGeohash = String(localized: "location_channels.error.invalid_geohash", defaultValue: "invalid geohash", comment: "Error shown when a custom geohash is invalid") + static let switchChannelHint = String(localized: "location_channels.accessibility.switch_hint", defaultValue: "switches to this channel", comment: "Accessibility hint on a channel row explaining activation switches to it") + static let addBookmark = String(localized: "location_channels.accessibility.add_bookmark", defaultValue: "bookmark channel", comment: "Accessibility action name for bookmarking a channel") + static let removeBookmark = String(localized: "location_channels.accessibility.remove_bookmark", defaultValue: "remove bookmark", comment: "Accessibility action name for removing a channel bookmark") static func meshTitle(_ count: Int) -> String { - let label = String(localized: "location_channels.mesh_label", comment: "Label for the mesh channel row") + let label = String(localized: "location_channels.mesh_label", defaultValue: "mesh", comment: "Label for the mesh channel row") return rowTitle(label: label, count: count) } @@ -73,7 +73,7 @@ struct LocationChannelsSheet: View { static func subtitlePrefix(geohash: String, coverage: String) -> String { String( - format: String(localized: "location_channels.subtitle_prefix", comment: "Subtitle prefix showing geohash and coverage"), + format: String(localized: "location_channels.subtitle_prefix", defaultValue: "#%1$@ • %2$@", comment: "Subtitle prefix showing geohash and coverage"), locale: .current, geohash, coverage ) @@ -82,7 +82,7 @@ struct LocationChannelsSheet: View { static func subtitle(prefix: String, name: String?) -> String { guard let name, !name.isEmpty else { return prefix } return String( - format: String(localized: "location_channels.subtitle_with_name", comment: "Subtitle combining prefix and resolved location name"), + format: String(localized: "location_channels.subtitle_with_name", defaultValue: "%1$@ • %2$@", comment: "Subtitle combining prefix and resolved location name"), locale: .current, prefix, name ) @@ -90,7 +90,7 @@ struct LocationChannelsSheet: View { private static func rowTitle(label: String, count: Int) -> String { String( - format: String(localized: "location_channels.row_title", comment: "List row title with participant count"), + format: String(localized: "location_channels.row_title", defaultValue: "%1$@ [%2$#@people_count@]", comment: "List row title with participant count"), locale: .current, label, count ) diff --git a/bitchat/Views/LocationNotesView.swift b/bitchat/Views/LocationNotesView.swift index d2cd3f16..581cec8f 100644 --- a/bitchat/Views/LocationNotesView.swift +++ b/bitchat/Views/LocationNotesView.swift @@ -135,7 +135,7 @@ struct LocationNotesView: View { private func headerTitle(for count: Int) -> String { String( - format: String(localized: "location_notes.header", comment: "Header displaying the geohash and localized note count"), + format: String(localized: "location_notes.header", defaultValue: "#%1$@ • %2$#@note_count@", comment: "Header displaying the geohash and localized note count"), locale: .current, "\(geohash) ± 1", count ) diff --git a/bitchat/Views/Media/BlockRevealImageView.swift b/bitchat/Views/Media/BlockRevealImageView.swift index 8e5d8bd2..0da74568 100644 --- a/bitchat/Views/Media/BlockRevealImageView.swift +++ b/bitchat/Views/Media/BlockRevealImageView.swift @@ -25,20 +25,20 @@ struct BlockRevealImageView: View { @State private var loadFailed = false private enum Strings { - static let tapToReveal = String(localized: "media.image.tap_to_reveal", comment: "Caption on a blurred incoming image inviting a tap to reveal it") - static let open = String(localized: "media.image.action.open", comment: "Context menu action that opens an image full screen") - static let reveal = String(localized: "media.image.action.reveal", comment: "Context menu action that reveals a blurred image") - static let hide = String(localized: "media.image.action.hide", comment: "Context menu action that re-blurs a revealed image") - static let delete = String(localized: "media.image.action.delete", comment: "Context menu action that deletes a received image") - static let deleteConfirmTitle = String(localized: "media.image.delete_confirm_title", comment: "Title of the confirmation dialog before deleting a received image") - static let deleteConfirmMessage = String(localized: "media.image.delete_confirm_message", comment: "Body of the confirmation dialog before deleting a received image") - static let hiddenImage = String(localized: "media.image.accessibility.hidden", comment: "Accessibility label for a blurred incoming image") - static let revealedImage = String(localized: "media.image.accessibility.revealed", comment: "Accessibility label for a revealed image") - static let revealHint = String(localized: "media.image.accessibility.hint.reveal", comment: "Accessibility hint for a blurred image; activating it reveals the image") - static let openHint = String(localized: "media.image.accessibility.hint.open", comment: "Accessibility hint for a revealed image; activating it opens the image full screen") - static let sendingImage = String(localized: "media.image.accessibility.sending", comment: "Accessibility label for an image that is still sending") - static let unavailableImage = String(localized: "media.image.accessibility.unavailable", comment: "Accessibility label for an image whose file could not be loaded") - static let cancelSend = String(localized: "media.accessibility.cancel_send", comment: "Accessibility label for the cancel button on an in-flight media send") + static let tapToReveal = String(localized: "media.image.tap_to_reveal", defaultValue: "tap to reveal", comment: "Caption on a blurred incoming image inviting a tap to reveal it") + static let open = String(localized: "media.image.action.open", defaultValue: "open image", comment: "Context menu action that opens an image full screen") + static let reveal = String(localized: "media.image.action.reveal", defaultValue: "reveal image", comment: "Context menu action that reveals a blurred image") + static let hide = String(localized: "media.image.action.hide", defaultValue: "hide image", comment: "Context menu action that re-blurs a revealed image") + static let delete = String(localized: "media.image.action.delete", defaultValue: "delete image", comment: "Context menu action that deletes a received image") + static let deleteConfirmTitle = String(localized: "media.image.delete_confirm_title", defaultValue: "delete this image?", comment: "Title of the confirmation dialog before deleting a received image") + static let deleteConfirmMessage = String(localized: "media.image.delete_confirm_message", defaultValue: "this cannot be undone — the sender may not be in range to send it again.", comment: "Body of the confirmation dialog before deleting a received image") + static let hiddenImage = String(localized: "media.image.accessibility.hidden", defaultValue: "hidden image", comment: "Accessibility label for a blurred incoming image") + static let revealedImage = String(localized: "media.image.accessibility.revealed", defaultValue: "image", comment: "Accessibility label for a revealed image") + static let revealHint = String(localized: "media.image.accessibility.hint.reveal", defaultValue: "reveals the image", comment: "Accessibility hint for a blurred image; activating it reveals the image") + static let openHint = String(localized: "media.image.accessibility.hint.open", defaultValue: "opens the image full screen", comment: "Accessibility hint for a revealed image; activating it opens the image full screen") + static let sendingImage = String(localized: "media.image.accessibility.sending", defaultValue: "sending image", comment: "Accessibility label for an image that is still sending") + static let unavailableImage = String(localized: "media.image.accessibility.unavailable", defaultValue: "image unavailable", comment: "Accessibility label for an image whose file could not be loaded") + static let cancelSend = String(localized: "media.accessibility.cancel_send", defaultValue: "cancel sending", comment: "Accessibility label for the cancel button on an in-flight media send") } init( @@ -154,7 +154,7 @@ struct BlockRevealImageView: View { Button(Strings.delete, role: .destructive) { onDelete?() } - Button("common.cancel", role: .cancel) {} + Button(String(localized: "common.cancel", defaultValue: "cancel"), role: .cancel) {} } message: { Text(verbatim: Strings.deleteConfirmMessage) } diff --git a/bitchat/Views/Media/MediaMessageView.swift b/bitchat/Views/Media/MediaMessageView.swift index 90fd13c4..116826be 100644 --- a/bitchat/Views/Media/MediaMessageView.swift +++ b/bitchat/Views/Media/MediaMessageView.swift @@ -67,7 +67,7 @@ struct MediaMessageView: View { } .buttonStyle(.plain) .accessibilityHint( - String(localized: "content.accessibility.delivery_detail_hint", comment: "Accessibility hint for the delivery status glyph explaining a tap reveals details") + String(localized: "content.accessibility.delivery_detail_hint", defaultValue: "tap to show delivery details", comment: "Accessibility hint for the delivery status glyph explaining a tap reveals details") ) } } diff --git a/bitchat/Views/Media/VoiceNoteView.swift b/bitchat/Views/Media/VoiceNoteView.swift index d2a63e6e..2687ac07 100644 --- a/bitchat/Views/Media/VoiceNoteView.swift +++ b/bitchat/Views/Media/VoiceNoteView.swift @@ -54,8 +54,8 @@ struct VoiceNoteView: View { .buttonStyle(.plain) .accessibilityLabel( playback.isPlaying - ? String(localized: "media.voice.accessibility.pause", comment: "Accessibility label for pausing voice note playback") - : String(localized: "media.voice.accessibility.play", comment: "Accessibility label for playing a voice note") + ? String(localized: "media.voice.accessibility.pause", defaultValue: "pause voice note", comment: "Accessibility label for pausing voice note playback") + : String(localized: "media.voice.accessibility.play", defaultValue: "play voice note", comment: "Accessibility label for playing a voice note") ) .accessibilityValue(playbackLabel) @@ -83,7 +83,7 @@ struct VoiceNoteView: View { } .buttonStyle(.plain) .accessibilityLabel( - String(localized: "media.accessibility.cancel_send", comment: "Accessibility label for the cancel button on an in-flight media send") + String(localized: "media.accessibility.cancel_send", defaultValue: "cancel sending", comment: "Accessibility label for the cancel button on an in-flight media send") ) } } diff --git a/bitchat/Views/MeshPeerList.swift b/bitchat/Views/MeshPeerList.swift index b09ef476..de29474b 100644 --- a/bitchat/Views/MeshPeerList.swift +++ b/bitchat/Views/MeshPeerList.swift @@ -16,24 +16,24 @@ struct MeshPeerList: View { private enum Strings { static let noneNearby: LocalizedStringKey = "geohash_people.none_nearby" - static let blockedTooltip = String(localized: "geohash_people.tooltip.blocked", comment: "Tooltip shown next to a blocked peer indicator") - static let newMessagesTooltip = String(localized: "mesh_peers.tooltip.new_messages", comment: "Tooltip for the unread messages indicator") - static let connected = String(localized: "content.accessibility.connected_mesh", comment: "Accessibility label for mesh-connected peer indicator") - static let reachable = String(localized: "content.accessibility.reachable_mesh", comment: "Accessibility label for mesh-reachable peer indicator") - static let nostr = String(localized: "content.accessibility.available_nostr", comment: "Accessibility label for Nostr-available peer indicator") - static let offline = String(localized: "mesh_peers.state.offline", comment: "State label for a peer that is not currently reachable") - static let favorite = String(localized: "mesh_peers.state.favorite", comment: "State label for a favorited peer") - static let unread = String(localized: "mesh_peers.state.unread", comment: "State label for a peer with unread private messages") - static let blocked = String(localized: "mesh_peers.state.blocked", comment: "State label for a blocked peer") - static let vouched = String(localized: "mesh_peers.state.vouched", comment: "State label for a peer vouched for by someone the user verified") - static let vouchedTooltip = String(localized: "mesh_peers.tooltip.vouched", comment: "Tooltip for the vouched (unfilled seal) badge next to a peer") - static let addFavorite = String(localized: "content.accessibility.add_favorite", comment: "Accessibility label to add a favorite") - static let removeFavorite = String(localized: "content.accessibility.remove_favorite", comment: "Accessibility label to remove a favorite") - static let showFingerprint = String(localized: "mesh_peers.action.fingerprint", comment: "Context menu action that shows a peer's fingerprint/verification screen") - static let openDMHint = String(localized: "mesh_peers.accessibility.open_dm_hint", comment: "Accessibility hint on a peer row explaining activation opens a private chat") - static let directMessage = String(localized: "content.actions.direct_message", comment: "Action that opens a private chat with the person") - static let block = String(localized: "geohash_people.action.block", comment: "Context menu action to block a person") - static let unblock = String(localized: "geohash_people.action.unblock", comment: "Context menu action to unblock a person") + static let blockedTooltip = String(localized: "geohash_people.tooltip.blocked", defaultValue: "blocked in geohash", comment: "Tooltip shown next to a blocked peer indicator") + static let newMessagesTooltip = String(localized: "mesh_peers.tooltip.new_messages", defaultValue: "new messages", comment: "Tooltip for the unread messages indicator") + static let connected = String(localized: "content.accessibility.connected_mesh", defaultValue: "connected via mesh", comment: "Accessibility label for mesh-connected peer indicator") + static let reachable = String(localized: "content.accessibility.reachable_mesh", defaultValue: "reachable via mesh", comment: "Accessibility label for mesh-reachable peer indicator") + static let nostr = String(localized: "content.accessibility.available_nostr", defaultValue: "available via Nostr", comment: "Accessibility label for Nostr-available peer indicator") + static let offline = String(localized: "mesh_peers.state.offline", defaultValue: "offline", comment: "State label for a peer that is not currently reachable") + static let favorite = String(localized: "mesh_peers.state.favorite", defaultValue: "favorite", comment: "State label for a favorited peer") + static let unread = String(localized: "mesh_peers.state.unread", defaultValue: "new messages", comment: "State label for a peer with unread private messages") + static let blocked = String(localized: "mesh_peers.state.blocked", defaultValue: "blocked", comment: "State label for a blocked peer") + static let vouched = String(localized: "mesh_peers.state.vouched", defaultValue: "vouched", comment: "State label for a peer vouched for by someone the user verified") + static let vouchedTooltip = String(localized: "mesh_peers.tooltip.vouched", defaultValue: "vouched for by someone you verified", comment: "Tooltip for the vouched (unfilled seal) badge next to a peer") + static let addFavorite = String(localized: "content.accessibility.add_favorite", defaultValue: "add to favorites", comment: "Accessibility label to add a favorite") + static let removeFavorite = String(localized: "content.accessibility.remove_favorite", defaultValue: "remove from favorites", comment: "Accessibility label to remove a favorite") + static let showFingerprint = String(localized: "mesh_peers.action.fingerprint", defaultValue: "show fingerprint", comment: "Context menu action that shows a peer's fingerprint/verification screen") + static let openDMHint = String(localized: "mesh_peers.accessibility.open_dm_hint", defaultValue: "opens a private chat", comment: "Accessibility hint on a peer row explaining activation opens a private chat") + static let directMessage = String(localized: "content.actions.direct_message", defaultValue: "direct message", comment: "Action that opens a private chat with the person") + static let block = String(localized: "geohash_people.action.block", defaultValue: "block", comment: "Context menu action to block a person") + static let unblock = String(localized: "geohash_people.action.unblock", defaultValue: "unblock", comment: "Context menu action to unblock a person") } var body: some View { diff --git a/bitchat/Views/MeshTopologyView.swift b/bitchat/Views/MeshTopologyView.swift index a8bc4e3e..148efde2 100644 --- a/bitchat/Views/MeshTopologyView.swift +++ b/bitchat/Views/MeshTopologyView.swift @@ -40,12 +40,12 @@ struct MeshTopologyView: View { #if os(macOS) VStack(spacing: 0) { HStack { - Text("topology.title") + Text(String(localized: "topology.title", defaultValue: "mesh topology")) .bitchatFont(size: 16, weight: .bold) .foregroundColor(palette.primary) Spacer() refreshButton - Button("app_info.done") { + Button(String(localized: "app_info.done", defaultValue: "DONE")) { dismiss() } .buttonStyle(.plain) @@ -62,7 +62,7 @@ struct MeshTopologyView: View { NavigationView { content .themedSheetBackground() - .navigationTitle(Text("topology.title")) + .navigationTitle(Text(String(localized: "topology.title", defaultValue: "mesh topology"))) .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarLeading) { @@ -86,7 +86,7 @@ struct MeshTopologyView: View { .foregroundColor(palette.primary) } .buttonStyle(.plain) - .accessibilityLabel(Text("topology.refresh")) + .accessibilityLabel(Text(String(localized: "topology.refresh", defaultValue: "refresh topology"))) } @ViewBuilder @@ -94,7 +94,7 @@ struct MeshTopologyView: View { VStack(spacing: 12) { if model.nodes.count <= 1 { Spacer() - Text("topology.empty") + Text(String(localized: "topology.empty", defaultValue: "no mesh links yet — the map fills in as peer announces arrive")) .bitchatFont(size: 14) .foregroundColor(palette.secondary) .multilineTextAlignment(.center) @@ -109,7 +109,7 @@ struct MeshTopologyView: View { Text(summaryText) .bitchatFont(size: 13, weight: .semibold) .foregroundColor(palette.primary) - Text("topology.caption") + Text(String(localized: "topology.caption", defaultValue: "estimated from gossiped neighbor lists (up to 10 per peer) — your device is highlighted")) .bitchatFont(size: 11) .foregroundColor(palette.secondary) .multilineTextAlignment(.center) diff --git a/bitchat/Views/MessageListView.swift b/bitchat/Views/MessageListView.swift index 1506c1da..b8a8cde4 100644 --- a/bitchat/Views/MessageListView.swift +++ b/bitchat/Views/MessageListView.swift @@ -109,11 +109,11 @@ struct MessageListView: View { // mentioning the only other participant is noise, and "DM" // would just reopen the conversation that is already open. if privatePeer == nil { - Button("content.actions.mention") { + Button(String(localized: "content.actions.mention", defaultValue: "mention")) { insertMention(message.sender) } if let peerID = message.senderPeerID { - Button("content.actions.direct_message") { + Button(String(localized: "content.actions.direct_message", defaultValue: "direct message")) { privateConversationModel.openConversation(for: peerID) withAnimation(.easeInOut(duration: TransportConfig.uiAnimationMediumSeconds)) { showSidebar = true @@ -121,14 +121,14 @@ struct MessageListView: View { } } } - Button("content.actions.hug") { + Button(String(localized: "content.actions.hug", defaultValue: "hug")) { conversationUIModel.sendHug(to: message.sender) } - Button("content.actions.slap") { + Button(String(localized: "content.actions.slap", defaultValue: "slap")) { conversationUIModel.sendSlap(to: message.sender) } } - Button("content.message.copy") { + Button(String(localized: "content.message.copy", defaultValue: "copy message")) { #if os(iOS) UIPasteboard.general.string = message.content #else @@ -138,12 +138,12 @@ struct MessageListView: View { #endif } if isResendableFailedMessage(message) { - Button("content.actions.resend") { + Button(String(localized: "content.actions.resend", defaultValue: "resend")) { conversationUIModel.resendFailedPrivateMessage(message) } } if showsUserActions { - Button("content.actions.block", role: .destructive) { + Button(String(localized: "content.actions.block", defaultValue: "block"), role: .destructive) { conversationUIModel.block(peerID: message.senderPeerID, displayName: message.sender) } } @@ -165,14 +165,14 @@ struct MessageListView: View { showClearConfirmation = true } .confirmationDialog( - "content.clear.confirm_title", + String(localized: "content.clear.confirm_title", defaultValue: "clear this chat?"), isPresented: $showClearConfirmation, titleVisibility: .visible ) { - Button("content.clear.confirm_action", role: .destructive) { + Button(String(localized: "content.clear.confirm_action", defaultValue: "clear chat"), role: .destructive) { conversationUIModel.clearCurrentConversation() } - Button("common.cancel", role: .cancel) {} + Button(String(localized: "common.cancel", defaultValue: "cancel"), role: .cancel) {} } .onAppear { scrollToBottom(on: proxy) @@ -190,17 +190,17 @@ struct MessageListView: View { onSelectedChannelChange(newChannel, proxy: proxy) } .confirmationDialog( - selectedMessageSender.map { "@\($0)" } ?? String(localized: "content.actions.title", comment: "Fallback title for the message action sheet"), + selectedMessageSender.map { "@\($0)" } ?? String(localized: "content.actions.title", defaultValue: "actions", comment: "Fallback title for the message action sheet"), isPresented: $showMessageActions, titleVisibility: .visible ) { - Button("content.actions.mention") { + Button(String(localized: "content.actions.mention", defaultValue: "mention")) { if let sender = selectedMessageSender { insertMention(sender) } } - Button("content.actions.direct_message") { + Button(String(localized: "content.actions.direct_message", defaultValue: "direct message")) { if let peerID = selectedMessageSenderID { privateConversationModel.openConversation(for: peerID) withAnimation(.easeInOut(duration: TransportConfig.uiAnimationMediumSeconds)) { @@ -209,23 +209,23 @@ struct MessageListView: View { } } - Button("content.actions.hug") { + Button(String(localized: "content.actions.hug", defaultValue: "hug")) { if let sender = selectedMessageSender { conversationUIModel.sendHug(to: sender) } } - Button("content.actions.slap") { + Button(String(localized: "content.actions.slap", defaultValue: "slap")) { if let sender = selectedMessageSender { conversationUIModel.sendSlap(to: sender) } } - Button("content.actions.block", role: .destructive) { + Button(String(localized: "content.actions.block", defaultValue: "block"), role: .destructive) { conversationUIModel.block(peerID: selectedMessageSenderID, displayName: selectedMessageSender) } - Button("common.cancel", role: .cancel) {} + Button(String(localized: "common.cancel", defaultValue: "cancel"), role: .cancel) {} } .onAppear { // Also check when view appears @@ -277,18 +277,18 @@ private extension MessageListView { VStack(alignment: .leading, spacing: 6) { switch locationChannelsModel.selectedChannel { case .mesh: - emptyStateLine(String(localized: "content.empty.mesh_intro", comment: "First line of the empty mesh timeline explaining what the mesh channel is")) - emptyStateLine(String(localized: "content.empty.mesh_waiting", comment: "Second line of the empty mesh timeline saying no peers are in range yet")) - emptyStateLine(String(localized: "content.empty.switch_hint", comment: "Empty timeline hint pointing at the channel switcher and the help screen")) + emptyStateLine(String(localized: "content.empty.mesh_intro", defaultValue: "you're on #mesh — reaches people within bluetooth range", comment: "First line of the empty mesh timeline explaining what the mesh channel is")) + emptyStateLine(String(localized: "content.empty.mesh_waiting", defaultValue: "nobody in range yet... messages appear here", comment: "Second line of the empty mesh timeline saying no peers are in range yet")) + emptyStateLine(String(localized: "content.empty.switch_hint", defaultValue: "tap the channel name above to switch · tap bitchat/ for help", comment: "Empty timeline hint pointing at the channel switcher and the help screen")) case .location(let channel): emptyStateLine( String( - format: String(localized: "content.empty.location_intro", comment: "First line of an empty geohash timeline naming the channel"), + format: String(localized: "content.empty.location_intro", defaultValue: "you're in #%@ — a public location channel over the internet", comment: "First line of an empty geohash timeline naming the channel"), locale: .current, channel.geohash ) ) - emptyStateLine(String(localized: "content.empty.switch_hint", comment: "Empty timeline hint pointing at the channel switcher and the help screen")) + emptyStateLine(String(localized: "content.empty.switch_hint", defaultValue: "tap the channel name above to switch · tap bitchat/ for help", comment: "Empty timeline hint pointing at the channel switcher and the help screen")) } } .padding(.horizontal, 12) @@ -368,7 +368,7 @@ private extension MessageListView { if unseenCount > 0 { Text( String( - format: String(localized: "content.jump.new_count", comment: "Count of messages that arrived while scrolled up, shown in the jump-to-latest pill"), + format: String(localized: "content.jump.new_count", defaultValue: "%lld new", comment: "Count of messages that arrived while scrolled up, shown in the jump-to-latest pill"), locale: .current, unseenCount ) @@ -389,10 +389,10 @@ private extension MessageListView { } var jumpToLatestAccessibilityLabel: String { - let base = String(localized: "content.accessibility.jump_to_latest", comment: "Accessibility label for the jump to latest messages button") + let base = String(localized: "content.accessibility.jump_to_latest", defaultValue: "jump to latest messages", comment: "Accessibility label for the jump to latest messages button") guard unseenCount > 0 else { return base } let count = String( - format: String(localized: "content.jump.new_count", comment: "Count of messages that arrived while scrolled up, shown in the jump-to-latest pill"), + format: String(localized: "content.jump.new_count", defaultValue: "%lld new", comment: "Count of messages that arrived while scrolled up, shown in the jump-to-latest pill"), locale: .current, unseenCount ) diff --git a/bitchat/Views/VerificationViews.swift b/bitchat/Views/VerificationViews.swift index 1fba4f2d..87288122 100644 --- a/bitchat/Views/VerificationViews.swift +++ b/bitchat/Views/VerificationViews.swift @@ -18,7 +18,7 @@ struct MyQRView: View { private enum Strings { static let title: LocalizedStringKey = "verification.my_qr.title" - static let accessibilityLabel = String(localized: "verification.my_qr.accessibility_label", comment: "Accessibility label describing the verification QR code") + static let accessibilityLabel = String(localized: "verification.my_qr.accessibility_label", defaultValue: "verification QR code", comment: "Accessibility label describing the verification QR code") } var body: some View { @@ -124,13 +124,13 @@ struct QRScanView: View { static let validate: LocalizedStringKey = "verification.scan.validate" static func requested(_ nickname: String) -> String { String( - format: String(localized: "verification.scan.status.requested", comment: "Status text when verification is requested for a nickname"), + format: String(localized: "verification.scan.status.requested", defaultValue: "verification requested for %@", comment: "Status text when verification is requested for a nickname"), locale: .current, nickname ) } - static let notFound = String(localized: "verification.scan.status.no_peer", comment: "Status when no matching peer is found for a verification request") - static let invalid = String(localized: "verification.scan.status.invalid", comment: "Status when a scanned QR payload is invalid") + static let notFound = String(localized: "verification.scan.status.no_peer", defaultValue: "could not find matching peer", comment: "Status when no matching peer is found for a verification request") + static let invalid = String(localized: "verification.scan.status.invalid", defaultValue: "invalid or expired QR payload", comment: "Status when a scanned QR payload is invalid") } var body: some View { @@ -296,7 +296,7 @@ struct VerificationSheetView: View { VStack(spacing: 0) { // Top header (always at top) HStack { - Text("verification.sheet.title") + Text(String(localized: "verification.sheet.title", defaultValue: "VERIFY")) .bitchatFont(size: 14, weight: .bold) .foregroundColor(accentColor) Spacer() @@ -316,7 +316,7 @@ struct VerificationSheetView: View { Group { if showingScanner { VStack(alignment: .leading, spacing: 12) { - Text("verification.scan.prompt_friend") + Text(String(localized: "verification.scan.prompt_friend", defaultValue: "scan a friend's QR")) .bitchatFont(size: 16, weight: .bold) .frame(maxWidth: .infinity) .multilineTextAlignment(.center) From 5fdc15d5af53f9243fc1c6f5036997054e198dae Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:07:52 +0200 Subject: [PATCH 028/158] Add capability bits to announce TLV (#1375) Announces now carry an optional capabilities TLV (0x05): a little-endian bitfield with named bits for upcoming features (prekeys, wifiBulk, gateway, groups, board, vouch, meshDiagnostics). Old clients skip the unknown TLV; peers without it decode as nil so features can distinguish "legacy peer" from "advertises nothing". PeerCapabilities lives in BitFoundation with a minimal-length encoding that preserves unknown bits for forward compatibility. Peer capabilities are stored in the BLE peer registry on verified announce and exposed via BLEService.peerCapabilities(_:). The local advertisement set is empty until each feature ships its bit. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Protocols/Packets.swift | 32 ++++++++++++- .../Protocols/PeerCapabilities+Local.swift | 7 +++ bitchat/Services/BLE/BLEPeerRegistry.swift | 11 ++++- bitchat/Services/BLE/BLEService.swift | 12 ++++- bitchatTests/Protocols/PacketsTests.swift | 37 +++++++++++++++ .../BitFoundation/PeerCapabilities.swift | 45 +++++++++++++++++++ .../PeerCapabilitiesTests.swift | 43 ++++++++++++++++++ 7 files changed, 182 insertions(+), 5 deletions(-) create mode 100644 bitchat/Protocols/PeerCapabilities+Local.swift create mode 100644 localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift create mode 100644 localPackages/BitFoundation/Tests/BitFoundationTests/PeerCapabilitiesTests.swift diff --git a/bitchat/Protocols/Packets.swift b/bitchat/Protocols/Packets.swift index 8914d4b7..309860aa 100644 --- a/bitchat/Protocols/Packets.swift +++ b/bitchat/Protocols/Packets.swift @@ -1,3 +1,4 @@ +import BitFoundation import Foundation // MARK: - Protocol TLV Packets @@ -7,12 +8,28 @@ struct AnnouncementPacket { let noisePublicKey: Data // Noise static public key (Curve25519.KeyAgreement) let signingPublicKey: Data // Ed25519 public key for signing let directNeighbors: [Data]? // 8-byte peer IDs + let capabilities: PeerCapabilities? // advertised feature bits; nil when absent (old clients) + + init( + nickname: String, + noisePublicKey: Data, + signingPublicKey: Data, + directNeighbors: [Data]?, + capabilities: PeerCapabilities? = nil + ) { + self.nickname = nickname + self.noisePublicKey = noisePublicKey + self.signingPublicKey = signingPublicKey + self.directNeighbors = directNeighbors + self.capabilities = capabilities + } private enum TLVType: UInt8 { case nickname = 0x01 case noisePublicKey = 0x02 case signingPublicKey = 0x03 case directNeighbors = 0x04 + case capabilities = 0x05 } func encode() -> Data? { @@ -48,6 +65,15 @@ struct AnnouncementPacket { } } + // TLV for capabilities (optional) + if let capabilities = capabilities { + let capabilityBytes = capabilities.encoded() + guard capabilityBytes.count <= 255 else { return nil } + data.append(TLVType.capabilities.rawValue) + data.append(UInt8(capabilityBytes.count)) + data.append(capabilityBytes) + } + return data } @@ -57,6 +83,7 @@ struct AnnouncementPacket { var noisePublicKey: Data? var signingPublicKey: Data? var directNeighbors: [Data]? + var capabilities: PeerCapabilities? while offset + 2 <= data.count { let typeRaw = data[offset] @@ -87,6 +114,8 @@ struct AnnouncementPacket { } directNeighbors = neighbors } + case .capabilities: + capabilities = PeerCapabilities(encoded: Data(value)) } } else { // Unknown TLV; skip (tolerant decoder for forward compatibility) @@ -99,7 +128,8 @@ struct AnnouncementPacket { nickname: nickname, noisePublicKey: noisePublicKey, signingPublicKey: signingPublicKey, - directNeighbors: directNeighbors + directNeighbors: directNeighbors, + capabilities: capabilities ) } } diff --git a/bitchat/Protocols/PeerCapabilities+Local.swift b/bitchat/Protocols/PeerCapabilities+Local.swift new file mode 100644 index 00000000..40f97b9f --- /dev/null +++ b/bitchat/Protocols/PeerCapabilities+Local.swift @@ -0,0 +1,7 @@ +import BitFoundation + +extension PeerCapabilities { + /// Capabilities this build advertises in its announce packets. + /// Each feature adds its bit here when it ships. + static let localSupported: PeerCapabilities = [] +} diff --git a/bitchat/Services/BLE/BLEPeerRegistry.swift b/bitchat/Services/BLE/BLEPeerRegistry.swift index 29776748..4db3e931 100644 --- a/bitchat/Services/BLE/BLEPeerRegistry.swift +++ b/bitchat/Services/BLE/BLEPeerRegistry.swift @@ -9,6 +9,7 @@ struct BLEPeerInfo: Equatable { var signingPublicKey: Data? var isVerifiedNickname: Bool var lastSeen: Date + var capabilities: PeerCapabilities = [] } struct BLEPeerAnnounceUpdate: Equatable { @@ -107,6 +108,10 @@ struct BLEPeerRegistry { peers[peerID]?.noisePublicKey?.sha256Fingerprint() } + func capabilities(for peerID: PeerID) -> PeerCapabilities { + peers[peerID.toShort()]?.capabilities ?? [] + } + func displayNicknames(selfNickname: String) -> [PeerID: String] { let connected = peers.filter { $0.value.isConnected } let tuples = connected.map { ($0.key, $0.value.nickname, true) } @@ -157,7 +162,8 @@ struct BLEPeerRegistry { noisePublicKey: Data, signingPublicKey: Data?, isConnected: Bool, - now: Date + now: Date, + capabilities: PeerCapabilities = [] ) -> BLEPeerAnnounceUpdate { let existing = peers[peerID] let update = BLEPeerAnnounceUpdate( @@ -173,7 +179,8 @@ struct BLEPeerRegistry { noisePublicKey: noisePublicKey, signingPublicKey: signingPublicKey, isVerifiedNickname: true, - lastSeen: now + lastSeen: now, + capabilities: capabilities ) return update diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 865a89be..d1ed84f2 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -619,6 +619,12 @@ final class BLEService: NSObject { } } + /// Capabilities the peer advertised in its last verified announce. + /// Empty for peers that predate the capabilities TLV. + func peerCapabilities(_ peerID: PeerID) -> PeerCapabilities { + collectionsQueue.sync { peerRegistry.capabilities(for: peerID) } + } + func getPeerNicknames() -> [PeerID: String] { return collectionsQueue.sync { peerRegistry.displayNicknames(selfNickname: myNickname) @@ -1261,7 +1267,8 @@ final class BLEService: NSObject { nickname: myNickname, noisePublicKey: noisePub, signingPublicKey: signingPub, - directNeighbors: connectedPeerIDs + directNeighbors: connectedPeerIDs, + capabilities: PeerCapabilities.localSupported ) guard let payload = announcement.encode() else { @@ -3315,7 +3322,8 @@ extension BLEService { noisePublicKey: announcement.noisePublicKey, signingPublicKey: announcement.signingPublicKey, isConnected: isConnected, - now: now + now: now, + capabilities: announcement.capabilities ?? [] ) ?? BLEPeerAnnounceUpdate(isNewPeer: false, wasDisconnected: false, previousNickname: nil) }, shouldEmitReconnectLog: { [weak self] peerID, now in diff --git a/bitchatTests/Protocols/PacketsTests.swift b/bitchatTests/Protocols/PacketsTests.swift index 78c244de..2368925a 100644 --- a/bitchatTests/Protocols/PacketsTests.swift +++ b/bitchatTests/Protocols/PacketsTests.swift @@ -1,3 +1,4 @@ +import BitFoundation import Foundation import Testing @@ -108,6 +109,42 @@ struct PacketsTests { #expect(decoded.directNeighbors == nil) } + @Test + func announcementPacketRoundTripsCapabilities() throws { + let capabilities: PeerCapabilities = [.prekeys, .board, .meshDiagnostics] + let packet = AnnouncementPacket( + nickname: "alice", + noisePublicKey: Data(repeating: 0x11, count: 32), + signingPublicKey: Data(repeating: 0x22, count: 32), + directNeighbors: nil, + capabilities: capabilities + ) + + let encoded = try #require(packet.encode()) + let decoded = try #require(AnnouncementPacket.decode(from: encoded)) + #expect(decoded.capabilities == capabilities) + } + + @Test + func announcementPacketWithoutCapabilitiesDecodesNilAndUnknownBitsSurvive() throws { + let legacy = try #require( + AnnouncementPacket( + nickname: "alice", + noisePublicKey: Data(repeating: 0x11, count: 32), + signingPublicKey: Data(repeating: 0x22, count: 32), + directNeighbors: nil + ).encode() + ) + // The TLV is emitted only when capabilities are set, so legacy peers + // (and this packet) decode as nil rather than empty. + #expect(try #require(AnnouncementPacket.decode(from: legacy)).capabilities == nil) + + var withFutureBits = legacy + withFutureBits.append(makeTLV(type: 0x05, value: Data([0x80, 0x01]))) + let decoded = try #require(AnnouncementPacket.decode(from: withFutureBits)) + #expect(decoded.capabilities?.rawValue == 0x0180) + } + @Test func privateMessagePacketRejectsUnknownTypeAndTruncation() { let unknownTLV = Data([0x7F, 0x01, 0x41]) diff --git a/localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift b/localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift new file mode 100644 index 00000000..94858d9b --- /dev/null +++ b/localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift @@ -0,0 +1,45 @@ +import Foundation + +/// Feature capabilities a peer advertises in its announce packet. +/// +/// Encoded as a little-endian bitfield with trailing zero bytes dropped, so the +/// wire form grows only when high bits are assigned. Decoders keep the low 64 +/// bits and ignore any longer field, and unknown bits are preserved verbatim — +/// old clients skip the TLV entirely, new clients degrade per-feature. +public struct PeerCapabilities: OptionSet, Equatable, Hashable, Sendable { + public let rawValue: UInt64 + + public init(rawValue: UInt64) { + self.rawValue = rawValue + } + + public static let prekeys = PeerCapabilities(rawValue: 1 << 0) + public static let wifiBulk = PeerCapabilities(rawValue: 1 << 1) + public static let gateway = PeerCapabilities(rawValue: 1 << 2) + public static let groups = PeerCapabilities(rawValue: 1 << 3) + public static let board = PeerCapabilities(rawValue: 1 << 4) + public static let vouch = PeerCapabilities(rawValue: 1 << 5) + public static let meshDiagnostics = PeerCapabilities(rawValue: 1 << 6) + + /// Minimal little-endian byte encoding; always at least one byte so an + /// empty set is distinguishable from an absent TLV. + public func encoded() -> Data { + var value = rawValue + var bytes = Data() + repeat { + bytes.append(UInt8(truncatingIfNeeded: value)) + value >>= 8 + } while value != 0 + return bytes + } + + /// Accepts any length; bytes beyond the low 64 bits are ignored for + /// forward compatibility. + public init(encoded data: Data) { + var value: UInt64 = 0 + for (index, byte) in data.prefix(8).enumerated() { + value |= UInt64(byte) << (8 * index) + } + self.init(rawValue: value) + } +} diff --git a/localPackages/BitFoundation/Tests/BitFoundationTests/PeerCapabilitiesTests.swift b/localPackages/BitFoundation/Tests/BitFoundationTests/PeerCapabilitiesTests.swift new file mode 100644 index 00000000..1c83530f --- /dev/null +++ b/localPackages/BitFoundation/Tests/BitFoundationTests/PeerCapabilitiesTests.swift @@ -0,0 +1,43 @@ +// +// PeerCapabilitiesTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +@testable import BitFoundation + +struct PeerCapabilitiesTests { + @Test + func encodingIsMinimalAndRoundTrips() { + #expect(PeerCapabilities([]).encoded() == Data([0x00])) + #expect(PeerCapabilities.prekeys.encoded() == Data([0x01])) + #expect(PeerCapabilities.meshDiagnostics.encoded() == Data([0x40])) + + let high = PeerCapabilities(rawValue: 1 << 9) + #expect(high.encoded() == Data([0x00, 0x02])) + + let all: PeerCapabilities = [.prekeys, .wifiBulk, .gateway, .groups, .board, .vouch, .meshDiagnostics] + #expect(PeerCapabilities(encoded: all.encoded()) == all) + #expect(PeerCapabilities(encoded: high.encoded()) == high) + #expect(PeerCapabilities(encoded: PeerCapabilities([]).encoded()) == []) + } + + @Test + func decodingToleratesUnknownBitsAndOversizedFields() { + // Unknown bits survive a round-trip untouched. + let unknown = PeerCapabilities(encoded: Data([0xFF, 0xFF])) + #expect(unknown.rawValue == 0xFFFF) + #expect(unknown.contains(.gateway)) + + // Fields longer than 8 bytes keep the low 64 bits and ignore the rest. + let oversized = Data([0x01] + [UInt8](repeating: 0x00, count: 7) + [0xAA, 0xBB]) + #expect(PeerCapabilities(encoded: oversized) == .prekeys) + + // Empty value decodes to no capabilities. + #expect(PeerCapabilities(encoded: Data()) == []) + } +} From 201dbac49a1bdce81594165212f42c80a1d37dbb Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:10:58 +0200 Subject: [PATCH 029/158] docs: reconcile protocol docstrings with implementation (#1374) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BitchatProtocol.swift: stop advertising "timing obfuscation prevents traffic analysis" — what exists is randomized relay jitter (RelayController, 10-220 ms) and PKCS#7-style padding to 256/512/1024/2048-byte blocks (MessagePadding); there is no cover traffic or per-message timing obfuscation. Also update the stale Message Types list (Delivery/Read are Noise payloads, no Version negotiation type; add CourierEnvelope/RequestSync/FileTransfer). - MessageType.swift: header said "6 essential" types; the enum has 9 cases. WHITEPAPER.md needed no changes: the #1372 rewrite already replaced the old Bloom-filter and MessageRetryService claims, and its numbers (dedup 1000/5min, jitter, outbox 100/peer 24h 8 attempts, courier 16 KiB/24h/40-20-5-2 quotas, spray 4/8, gossip 1000/15s/6h) all match the code. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Protocols/BitchatProtocol.swift | 16 +++++++++------- .../Sources/BitFoundation/MessageType.swift | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/bitchat/Protocols/BitchatProtocol.swift b/bitchat/Protocols/BitchatProtocol.swift index 4ebe6509..267d8cc5 100644 --- a/bitchat/Protocols/BitchatProtocol.swift +++ b/bitchat/Protocols/BitchatProtocol.swift @@ -18,7 +18,7 @@ /// - Efficient binary message encoding /// - Message fragmentation for large payloads /// - TTL-based routing for mesh networks -/// - Privacy features like padding and timing obfuscation +/// - Privacy features: message padding and randomized relay jitter /// - Integration points for end-to-end encryption /// /// ## Protocol Design @@ -38,18 +38,20 @@ /// 7. **Decoding**: Binary data parsed back to message objects /// /// ## Security Considerations -/// - Message padding obscures actual content length -/// - Timing obfuscation prevents traffic analysis +/// - Message padding (to 256/512/1024/2048-byte blocks) obscures actual content length +/// - Randomized relay jitter reduces the traffic-analysis signal; there is no +/// cover traffic or per-message timing obfuscation /// - Integration with Noise Protocol for E2E encryption /// - No persistent identifiers in protocol headers /// /// ## Message Types /// - **Announce/Leave**: Peer presence notifications -/// - **Message**: User chat messages (broadcast or directed) +/// - **Message**: Public chat messages /// - **Fragment**: Multi-part message handling -/// - **Delivery/Read**: Message acknowledgments -/// - **Noise**: Encrypted channel establishment -/// - **Version**: Protocol version negotiation +/// - **NoiseHandshake/NoiseEncrypted**: Encrypted channel establishment and +/// all private payloads (messages, delivery acks, read receipts) +/// - **CourierEnvelope**: Sealed store-and-forward mail +/// - **RequestSync/FileTransfer**: Gossip history sync and media transfer /// /// ## Future Extensions /// The protocol is designed to be extensible: diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index ceac0cd0..23f391b9 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -7,7 +7,7 @@ // /// Simplified BitChat protocol message types. -/// Reduced from 24 types to just 6 essential ones. +/// Consolidated from the original 24 wire types down to the 9 cases below. /// All private communication metadata (receipts, status) is embedded in noiseEncrypted payloads. public enum MessageType: UInt8 { // Public messages (unencrypted) From 276cde44e780776b11d1c1022505d45f9c4229fa Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:11:49 +0200 Subject: [PATCH 030/158] Gate Tor/relay startup on network reachability (#1389) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On a mesh-only/offline device the app used to bootstrap Tor and spin Nostr relay reconnects forever ("connecting to Tor…"), wasting battery even when there was provably no network path at all. Add an NWPathMonitor-backed reachability signal (NetworkReachabilityMonitor) and fold it into NetworkActivationService's activation gate: - Tor bootstrap and relay connect/reconnect are now gated on the network path being usable. When the path is fully unsatisfied (no interface at all) we set autoStart off, shut Tor down, and disconnect relays instead of looping. When a usable path returns we resume. - Conservative policy: only NWPath.Status.unsatisfied counts as offline. A flaky-but-present link stays "reachable" (Tor tolerates intermittent connectivity); we never tear down on the first hiccup. - Transitions are debounced (ReachabilityDebounce, ~2.5s) so path flapping cannot thrash Tor/relay startup. The debounce is a pure value type, unit-tested without the Network framework or real timers. - Starts optimistic (reachable) so nothing is suppressed before the first path evaluation arrives. - BLE mesh never consults this gate and works fully offline. - NWPathMonitor's background callback hops to the main actor before touching any state. Surfaces NetworkActivationService.isNetworkReachable for UI to distinguish "offline" from "connecting to Tor". Tests: pure debounce (satisfied → allowed, unsatisfied → suppressed after interval, flap debounced, recover-after-outage) plus service wiring (unreachable suppresses Tor+relays, recovery resumes, loss disconnects). Co-authored-by: jack Co-authored-by: Claude Fable 5 --- .../Services/NetworkActivationService.swift | 45 +++- .../Services/NetworkReachabilityMonitor.swift | 167 ++++++++++++++ .../NetworkActivationServiceTests.swift | 1 + .../NetworkReachabilityGateTests.swift | 207 ++++++++++++++++++ 4 files changed, 416 insertions(+), 4 deletions(-) create mode 100644 bitchat/Services/NetworkReachabilityMonitor.swift create mode 100644 bitchatTests/Services/NetworkReachabilityGateTests.swift diff --git a/bitchat/Services/NetworkActivationService.swift b/bitchat/Services/NetworkActivationService.swift index 1f68af8d..b8f5a7ba 100644 --- a/bitchat/Services/NetworkActivationService.swift +++ b/bitchat/Services/NetworkActivationService.swift @@ -25,14 +25,20 @@ extension NostrRelayManager: NetworkActivationRelayControlling {} extension TorURLSession: NetworkActivationProxyControlling {} /// Coordinates when the app is allowed to start Tor and connect to Nostr relays. -/// Policy: permit start when either location permissions are authorized OR -/// there exists at least one mutual favorite. Otherwise, do not start. +/// Policy: permit start when (location permissions are authorized OR there +/// exists at least one mutual favorite) AND the device has a usable network +/// path. When there is provably no network at all we do not bootstrap Tor or +/// spin relay reconnects — that only wastes battery on a mesh-only/offline +/// device. BLE mesh is entirely independent of this gate. @MainActor final class NetworkActivationService: ObservableObject { static let shared = NetworkActivationService() @Published private(set) var activationAllowed: Bool = false @Published private(set) var userTorEnabled: Bool = true + /// Coarse, debounced network reachability. `false` only when the OS reports + /// no usable interface at all. Surfaced for UI ("offline" vs "connecting"). + @Published private(set) var isNetworkReachable: Bool = true private var cancellables = Set() private var started = false @@ -43,6 +49,7 @@ final class NetworkActivationService: ObservableObject { private let mutualFavoritesPublisher: AnyPublisher, Never> private let permissionProvider: () -> LocationChannelManager.PermissionState private let mutualFavoritesProvider: () -> Set + private let reachabilityMonitor: NetworkReachabilityMonitoring private let torController: NetworkActivationTorControlling // Resolved lazily: NostrRelayManager.init() reads NetworkActivationService.shared // (via its live dependencies), so capturing NostrRelayManager.shared here would @@ -58,6 +65,7 @@ final class NetworkActivationService: ObservableObject { mutualFavoritesPublisher = FavoritesPersistenceService.shared.$mutualFavorites.eraseToAnyPublisher() permissionProvider = { LocationChannelManager.shared.permissionState } mutualFavoritesProvider = { FavoritesPersistenceService.shared.mutualFavorites } + reachabilityMonitor = NWPathReachabilityMonitor() torController = TorManager.shared relayControllerProvider = { NostrRelayManager.shared } proxyController = TorURLSession.shared @@ -70,6 +78,7 @@ final class NetworkActivationService: ObservableObject { mutualFavoritesPublisher: AnyPublisher, Never>, permissionProvider: @escaping () -> LocationChannelManager.PermissionState, mutualFavoritesProvider: @escaping () -> Set, + reachabilityMonitor: NetworkReachabilityMonitoring, torController: NetworkActivationTorControlling, relayController: NetworkActivationRelayControlling, proxyController: NetworkActivationProxyControlling, @@ -80,6 +89,7 @@ final class NetworkActivationService: ObservableObject { self.mutualFavoritesPublisher = mutualFavoritesPublisher self.permissionProvider = permissionProvider self.mutualFavoritesProvider = mutualFavoritesProvider + self.reachabilityMonitor = reachabilityMonitor self.torController = torController self.relayControllerProvider = { relayController } self.proxyController = proxyController @@ -96,8 +106,12 @@ final class NetworkActivationService: ObservableObject { userTorEnabled = true } + // Begin (idempotent) reachability monitoring and seed initial state. + reachabilityMonitor.start() + isNetworkReachable = reachabilityMonitor.isReachable + // Initial compute - let allowed = basePolicyAllowed() + let allowed = effectiveAllowed() activationAllowed = allowed torAutoStartDesired = allowed && userTorEnabled torController.setAutoStartAllowed(torAutoStartDesired) @@ -123,6 +137,21 @@ final class NetworkActivationService: ObservableObject { self?.reevaluate() } .store(in: &cancellables) + + // React to network reachability changes (debounced, unsatisfied-only). + reachabilityMonitor.reachabilityPublisher + .receive(on: DispatchQueue.main) + .sink { [weak self] reachable in + guard let self else { return } + guard reachable != self.isNetworkReachable else { return } + self.isNetworkReachable = reachable + SecureLogger.info( + "NetworkActivationService: isNetworkReachable -> \(reachable)", + category: .session + ) + self.reevaluate() + } + .store(in: &cancellables) } func setUserTorEnabled(_ enabled: Bool) { @@ -138,7 +167,7 @@ final class NetworkActivationService: ObservableObject { } private func reevaluate() { - let allowed = basePolicyAllowed() + let allowed = effectiveAllowed() let torDesired = allowed && userTorEnabled let statusChanged = allowed != activationAllowed let torChanged = torDesired != torAutoStartDesired @@ -163,12 +192,20 @@ final class NetworkActivationService: ObservableObject { } } + /// Base policy: who is allowed to use the network at all (permission or a + /// mutual favorite), ignoring current link state. private func basePolicyAllowed() -> Bool { let permOK = permissionProvider() == .authorized let hasMutual = !mutualFavoritesProvider().isEmpty return permOK || hasMutual } + /// Effective gate: base policy AND a usable network path. When there is + /// provably no network, Tor bootstrap and relay reconnects are suppressed. + private func effectiveAllowed() -> Bool { + basePolicyAllowed() && reachabilityMonitor.isReachable + } + private func applyTorState(torDesired: Bool) { proxyController.setProxyMode(useTor: torDesired) if torDesired { diff --git a/bitchat/Services/NetworkReachabilityMonitor.swift b/bitchat/Services/NetworkReachabilityMonitor.swift new file mode 100644 index 00000000..bc2b77cf --- /dev/null +++ b/bitchat/Services/NetworkReachabilityMonitor.swift @@ -0,0 +1,167 @@ +import Foundation +import Combine +import BitLogger +#if canImport(Network) +import Network +#endif + +/// Coarse, conservative network-reachability signal used to gate Tor bootstrap +/// and Nostr relay connections. +/// +/// Policy (deliberately conservative): +/// - Reports `false` only when the OS says there is *no* usable interface at +/// all (`NWPath.Status.unsatisfied`). A flaky-but-present link stays +/// `true` because Tor tolerates intermittent connectivity, and tearing down +/// on the first hiccup would cost more battery/latency than it saves. +/// - Transitions are debounced (see `ReachabilityDebounce`) so path flapping +/// does not thrash Tor/relay startup. +/// - Starts optimistic (`true`) so nothing is ever suppressed before the first +/// path evaluation arrives. +/// +/// BLE mesh must never consult this monitor — the mesh works fully offline. +@MainActor +protocol NetworkReachabilityMonitoring: AnyObject { + /// Current debounced coarse reachability. + var isReachable: Bool { get } + /// Emits the debounced reachability whenever it changes (main-actor). + var reachabilityPublisher: AnyPublisher { get } + /// Begin monitoring. Idempotent. + func start() +} + +/// Pure debounce/decision logic for reachability, split out so it can be +/// unit-tested without the Network framework or real timers. +/// +/// A candidate state only becomes the committed state once it has been stable +/// (uninterrupted) for `interval`. Any observation matching the committed state +/// cancels a pending opposite change, which is what makes flapping a no-op. +struct ReachabilityDebounce { + let interval: TimeInterval + private(set) var committed: Bool + private var pending: (value: Bool, since: Date)? + + init(interval: TimeInterval, initial: Bool) { + self.interval = interval + self.committed = initial + } + + /// Whether a change is currently waiting out the debounce window. + var hasPendingChange: Bool { pending != nil } + + /// Feed a raw observation. Returns the new committed value if it changed, + /// otherwise `nil`. + mutating func observe(reachable: Bool, at now: Date) -> Bool? { + if reachable == committed { + // Already in this state — cancel any pending opposite change. + pending = nil + return nil + } + // Differs from committed: (re)arm the pending change, preserving the + // timestamp if we're already waiting on this same target value. + if pending?.value != reachable { + pending = (reachable, now) + } + return commitIfAged(at: now) + } + + /// Called from a timer to commit a pending change once it has aged past + /// `interval`. Returns the new committed value if it changed, else `nil`. + mutating func flush(at now: Date) -> Bool? { + commitIfAged(at: now) + } + + private mutating func commitIfAged(at now: Date) -> Bool? { + guard let pending else { return nil } + guard now.timeIntervalSince(pending.since) >= interval else { return nil } + committed = pending.value + self.pending = nil + return committed + } +} + +/// Always-reachable stub. Used as the default in tests and as the fallback on +/// platforms without the Network framework, so reachability never suppresses +/// startup by itself. +@MainActor +final class AlwaysReachableMonitor: NetworkReachabilityMonitoring { + var isReachable: Bool { true } + var reachabilityPublisher: AnyPublisher { + Empty(completeImmediately: false).eraseToAnyPublisher() + } + func start() {} +} + +/// `NWPathMonitor`-backed reachability. All state lives on the main actor; the +/// background path callback hops here before touching the debounce. +@MainActor +final class NWPathReachabilityMonitor: NetworkReachabilityMonitoring { + private let subject: CurrentValueSubject + private var debounce: ReachabilityDebounce + private var flushWorkItem: DispatchWorkItem? + private var started = false + private let now: () -> Date + + #if canImport(Network) + private var monitor: NWPathMonitor? + private let monitorQueue = DispatchQueue(label: "chat.bitchat.reachability") + #endif + + init(debounceInterval: TimeInterval = 2.5, now: @escaping () -> Date = Date.init) { + self.now = now + self.debounce = ReachabilityDebounce(interval: debounceInterval, initial: true) + self.subject = CurrentValueSubject(true) + } + + var isReachable: Bool { subject.value } + + var reachabilityPublisher: AnyPublisher { + subject.removeDuplicates().dropFirst().eraseToAnyPublisher() + } + + func start() { + guard !started else { return } + started = true + #if canImport(Network) + let monitor = NWPathMonitor() + self.monitor = monitor + monitor.pathUpdateHandler = { [weak self] path in + // Conservative: only "no interface at all" counts as unreachable. + let reachable = path.status != .unsatisfied + Task { @MainActor in + self?.ingest(reachable: reachable) + } + } + monitor.start(queue: monitorQueue) + #else + // No Network framework: never suppress startup. + #endif + } + + /// Feed an observation into the debounce and publish committed changes. + /// Exposed internally so higher layers/tests could drive it if needed. + func ingest(reachable: Bool) { + flushWorkItem?.cancel() + flushWorkItem = nil + if let committed = debounce.observe(reachable: reachable, at: now()) { + publish(committed) + } else if debounce.hasPendingChange { + scheduleFlush() + } + } + + private func scheduleFlush() { + let work = DispatchWorkItem { [weak self] in + guard let self else { return } + if let committed = self.debounce.flush(at: self.now()) { + self.publish(committed) + } + } + flushWorkItem = work + DispatchQueue.main.asyncAfter(deadline: .now() + debounce.interval, execute: work) + } + + private func publish(_ reachable: Bool) { + SecureLogger.info("NWPathReachabilityMonitor: network reachable -> \(reachable)", category: .session) + subject.send(reachable) + } +} diff --git a/bitchatTests/Services/NetworkActivationServiceTests.swift b/bitchatTests/Services/NetworkActivationServiceTests.swift index 5523ccdc..01d8fdca 100644 --- a/bitchatTests/Services/NetworkActivationServiceTests.swift +++ b/bitchatTests/Services/NetworkActivationServiceTests.swift @@ -111,6 +111,7 @@ final class NetworkActivationServiceTests: XCTestCase { mutualFavoritesPublisher: favoritesSubject.eraseToAnyPublisher(), permissionProvider: { permissionSubject.value }, mutualFavoritesProvider: { favoritesSubject.value }, + reachabilityMonitor: AlwaysReachableMonitor(), torController: torController, relayController: relayController, proxyController: proxyController, diff --git a/bitchatTests/Services/NetworkReachabilityGateTests.swift b/bitchatTests/Services/NetworkReachabilityGateTests.swift new file mode 100644 index 00000000..420a54db --- /dev/null +++ b/bitchatTests/Services/NetworkReachabilityGateTests.swift @@ -0,0 +1,207 @@ +import Combine +import XCTest +@testable import bitchat + +/// Covers the reachability-gate decision logic (pure debounce) and the +/// `NetworkActivationService` wiring that suppresses Tor/relay startup when +/// there is provably no network. +@MainActor +final class NetworkReachabilityGateTests: XCTestCase { + + // MARK: - Pure debounce logic + + func test_debounce_satisfiedStaysReachable() { + var d = ReachabilityDebounce(interval: 2.5, initial: true) + let t0 = Date() + // An interface remains present: no change, no pending. + XCTAssertNil(d.observe(reachable: true, at: t0)) + XCTAssertTrue(d.committed) + XCTAssertFalse(d.hasPendingChange) + } + + func test_debounce_unsatisfiedSuppressesAfterInterval() { + var d = ReachabilityDebounce(interval: 2.5, initial: true) + let t0 = Date() + // Path drops: not committed immediately (within debounce window). + XCTAssertNil(d.observe(reachable: false, at: t0)) + XCTAssertTrue(d.committed) + XCTAssertTrue(d.hasPendingChange) + // Still within window. + XCTAssertNil(d.flush(at: t0.addingTimeInterval(1.0))) + XCTAssertTrue(d.committed) + // Past the window: commit unreachable. + XCTAssertEqual(d.flush(at: t0.addingTimeInterval(2.5)), false) + XCTAssertFalse(d.committed) + XCTAssertFalse(d.hasPendingChange) + } + + func test_debounce_flapIsIgnored() { + var d = ReachabilityDebounce(interval: 2.5, initial: true) + let t0 = Date() + // Drop then recover well within the window — must never commit a change. + XCTAssertNil(d.observe(reachable: false, at: t0)) + XCTAssertTrue(d.hasPendingChange) + XCTAssertNil(d.observe(reachable: true, at: t0.addingTimeInterval(0.5))) + XCTAssertFalse(d.hasPendingChange, "recovery should cancel the pending drop") + // A late flush after the original deadline is a no-op (nothing pending). + XCTAssertNil(d.flush(at: t0.addingTimeInterval(3.0))) + XCTAssertTrue(d.committed) + } + + func test_debounce_recoverAfterOutageCommitsAfterInterval() { + var d = ReachabilityDebounce(interval: 2.5, initial: false) + let t0 = Date() + XCTAssertNil(d.observe(reachable: true, at: t0)) + XCTAssertTrue(d.hasPendingChange) + XCTAssertEqual(d.flush(at: t0.addingTimeInterval(2.5)), true) + XCTAssertTrue(d.committed) + } + + // MARK: - Service gating + + func test_start_whenUnreachable_suppressesTorAndRelays() { + let ctx = makeService(permission: .authorized, reachable: false) + ctx.service.start() + + XCTAssertFalse(ctx.service.activationAllowed) + XCTAssertFalse(ctx.service.isNetworkReachable) + XCTAssertTrue(ctx.reachability.startCalled) + XCTAssertEqual(ctx.torController.startIfNeededCallCount, 0) + XCTAssertEqual(ctx.torController.autoStartAllowedValues, [false]) + XCTAssertEqual(ctx.relayController.connectCallCount, 0) + XCTAssertEqual(ctx.relayController.disconnectCallCount, 1) + } + + func test_start_whenReachable_allowsTorAndRelays() { + let ctx = makeService(permission: .authorized, reachable: true) + ctx.service.start() + + XCTAssertTrue(ctx.service.activationAllowed) + XCTAssertEqual(ctx.torController.startIfNeededCallCount, 1) + XCTAssertEqual(ctx.relayController.connectCallCount, 1) + } + + func test_reachabilityRecovery_resumesTorAndRelays() async { + let ctx = makeService(permission: .authorized, reachable: false) + ctx.service.start() + XCTAssertFalse(ctx.service.activationAllowed) + + ctx.reachability.set(true) + let resumed = await waitUntil { ctx.service.activationAllowed } + XCTAssertTrue(resumed) + XCTAssertTrue(ctx.service.isNetworkReachable) + XCTAssertGreaterThanOrEqual(ctx.torController.startIfNeededCallCount, 1) + XCTAssertGreaterThanOrEqual(ctx.relayController.connectCallCount, 1) + } + + func test_reachabilityLoss_disconnectsRelaysAndStopsTor() async { + let ctx = makeService(permission: .authorized, reachable: true) + ctx.service.start() + XCTAssertTrue(ctx.service.activationAllowed) + let disconnectsBefore = ctx.relayController.disconnectCallCount + + ctx.reachability.set(false) + let suppressed = await waitUntil { !ctx.service.activationAllowed } + XCTAssertTrue(suppressed) + XCTAssertFalse(ctx.service.isNetworkReachable) + XCTAssertGreaterThan(ctx.relayController.disconnectCallCount, disconnectsBefore) + XCTAssertTrue(ctx.torController.autoStartAllowedValues.contains(false)) + XCTAssertGreaterThanOrEqual(ctx.torController.shutdownCompletelyCallCount, 1) + } + + // MARK: - Harness + + private func makeService( + permission: LocationChannelManager.PermissionState, + reachable: Bool + ) -> Context { + let suiteName = "NetworkReachabilityGateTests-\(UUID().uuidString)" + let storage = UserDefaults(suiteName: suiteName)! + storage.removePersistentDomain(forName: suiteName) + + let permissionSubject = CurrentValueSubject(permission) + let favoritesSubject = CurrentValueSubject, Never>([]) + let reachability = ControllableReachabilityMonitor(initial: reachable) + let torController = GateMockTorController() + let relayController = GateMockRelayController() + let proxyController = GateMockProxyController() + let service = NetworkActivationService( + storage: storage, + locationPermissionPublisher: permissionSubject.eraseToAnyPublisher(), + mutualFavoritesPublisher: favoritesSubject.eraseToAnyPublisher(), + permissionProvider: { permissionSubject.value }, + mutualFavoritesProvider: { favoritesSubject.value }, + reachabilityMonitor: reachability, + torController: torController, + relayController: relayController, + proxyController: proxyController, + notificationCenter: NotificationCenter() + ) + return Context( + service: service, + reachability: reachability, + torController: torController, + relayController: relayController + ) + } + + private func waitUntil( + timeout: TimeInterval = 1.0, + condition: @escaping @MainActor () -> Bool + ) async -> Bool { + let deadline = Date().addingTimeInterval(timeout) + while Date() < deadline { + if condition() { return true } + try? await Task.sleep(nanoseconds: 10_000_000) + } + return condition() + } +} + +@MainActor +private struct Context { + let service: NetworkActivationService + let reachability: ControllableReachabilityMonitor + let torController: GateMockTorController + let relayController: GateMockRelayController +} + +@MainActor +private final class ControllableReachabilityMonitor: NetworkReachabilityMonitoring { + private let subject: CurrentValueSubject + private(set) var startCalled = false + + init(initial: Bool) { + subject = CurrentValueSubject(initial) + } + + var isReachable: Bool { subject.value } + var reachabilityPublisher: AnyPublisher { + subject.removeDuplicates().dropFirst().eraseToAnyPublisher() + } + func start() { startCalled = true } + func set(_ reachable: Bool) { subject.send(reachable) } +} + +@MainActor +private final class GateMockTorController: NetworkActivationTorControlling { + private(set) var autoStartAllowedValues: [Bool] = [] + private(set) var startIfNeededCallCount = 0 + private(set) var shutdownCompletelyCallCount = 0 + func setAutoStartAllowed(_ allowed: Bool) { autoStartAllowedValues.append(allowed) } + func startIfNeeded() { startIfNeededCallCount += 1 } + func shutdownCompletely() { shutdownCompletelyCallCount += 1 } +} + +@MainActor +private final class GateMockRelayController: NetworkActivationRelayControlling { + private(set) var connectCallCount = 0 + private(set) var disconnectCallCount = 0 + func connect() { connectCallCount += 1 } + func disconnect() { disconnectCallCount += 1 } +} + +private final class GateMockProxyController: NetworkActivationProxyControlling { + private(set) var proxyModes: [Bool] = [] + func setProxyMode(useTor: Bool) { proxyModes.append(useTor) } +} From ede6368296d20e9dbec6266c1c72ef424282c28e Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:12:37 +0200 Subject: [PATCH 031/158] NIP-13 proof-of-work for geohash channels: mine on send, relax rate limits for PoW senders (#1382) * NIP-13 proof-of-work for geohash channels: mine on send, relax rate limits for PoW senders Outgoing kind-20000 geohash messages mine a NIP-13 nonce tag (8 leading zero bits, ~256 hashes, typically <1 ms) off the main actor before signing. Mining is hard-capped at 2 s and cancellable (newer send or channel switch): on cap/cancel the committed target steps down so the message still ships promptly with an honest commitment - sending is never blocked and nothing is dropped. The hot loop serializes the canonical event once and rewrites only the fixed-width nonce bytes. Inbound kind-20000 events are scored per NIP-13 commitment semantics (committed target counts; the ID must actually meet it, extra work earns nothing) and never hard-rejected: validated PoW >= 8 bits skips the per-sender rate-limit bucket while the per-content flood bucket still applies, so old non-mining clients keep working under today's strict limits while bulk spam gets expensive. Presence heartbeats (kind 20001), kind-1 notes, and DMs are unchanged; no UI beyond a pow= field in an existing sampled debug log. Reimplemented from scratch rather than cherry-picking the stale feature/pow-geohash-mining-ui branch (unbounded loop, hard receive filtering, mining UI, XCTest, force unwraps). Co-Authored-By: Claude Fable 5 * Geohash: serialize PoW sends so order matches send order Two location-channel sends back-to-back only cancelled the previous mining task and started a new one. Cancellation merely *expedites* NIP-13 mining (the target is polled and steps down; it never aborts the send), so the cancelled task still appended + relayed once mining returned. Both tasks ran concurrently and the second (shorter to mine) could finish first, reordering messages in the timeline and on relays. Chain the mining tasks: each geohash send captures the previous send's task, cancels it (to expedite, so delays never stack), and awaits its completion before it echoes and relays. Order is now always send order. The >2s mining cap is preserved: cancellation expedites the awaited task, so a send is never blocked beyond NostrPoW.miningTimeCap. Test: two rapid sends where the first mines longer (larger content) still land in send order for both the local echo and the relayed events. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Nostr/NostrPoW.swift | 215 +++++++++++++++++ bitchat/Nostr/NostrProtocol.swift | 67 +++++- .../ViewModels/ChatLifecycleCoordinator.swift | 2 +- .../ViewModels/ChatOutgoingCoordinator.swift | 197 ++++++++-------- .../ChatPublicConversationCoordinator.swift | 18 +- bitchat/ViewModels/ChatViewModel.swift | 10 + bitchat/ViewModels/MessageRateLimiter.swift | 28 ++- bitchat/ViewModels/NostrInboundPipeline.swift | 14 +- .../ChatNostrCoordinatorContextTests.swift | 1 + .../ChatOutgoingCoordinatorContextTests.swift | 34 +++ ...cConversationCoordinatorContextTests.swift | 6 +- bitchatTests/MessageRateLimiterTests.swift | 119 ++++++++++ bitchatTests/Nostr/NostrPoWTests.swift | 222 ++++++++++++++++++ .../PerformanceBaselineTests.swift | 1 + 14 files changed, 808 insertions(+), 126 deletions(-) create mode 100644 bitchat/Nostr/NostrPoW.swift create mode 100644 bitchatTests/MessageRateLimiterTests.swift create mode 100644 bitchatTests/Nostr/NostrPoWTests.swift diff --git a/bitchat/Nostr/NostrPoW.swift b/bitchat/Nostr/NostrPoW.swift new file mode 100644 index 00000000..006bba6d --- /dev/null +++ b/bitchat/Nostr/NostrPoW.swift @@ -0,0 +1,215 @@ +import BitFoundation +import CryptoKit +import Foundation + +/// NIP-13 proof-of-work for Nostr events. +/// +/// Outgoing kind-20000 geohash messages mine a `["nonce", "", ""]` +/// tag so the event ID carries at least `target` leading zero bits. Inbound +/// events are scored (never hard-rejected — the network has clients that do +/// not mine): validated PoW at or above `rateLimitBypassBits` relaxes the +/// per-sender public rate limit, everything else keeps the strict limits. +enum NostrPoW { + + // MARK: - Tuning + + /// Difficulty (leading zero bits of the event ID) mined onto outgoing + /// geohash messages. 8 bits is ~256 hash attempts — typically well under + /// 100 ms on any supported device. + static let targetBits = 8 + + /// Inbound events whose validated NIP-13 difficulty is at least this many + /// bits skip the per-sender rate-limit bucket (the content-flood bucket + /// still applies). See `MessageRateLimiter.allow`. + static let rateLimitBypassBits = 8 + + /// Hard cap on mining wall-clock time. When it hits, the committed target + /// steps down until a difficulty reachable in a small extra budget is + /// found and the message is sent anyway — mining never blocks sending. + static let miningTimeCap: TimeInterval = 2.0 + + /// Budget for each stepped-down attempt after the main cap (or a task + /// cancellation) hits. + private static let fallbackTimeCap: TimeInterval = 0.15 + + /// The hot loop checks the deadline and task cancellation every this many + /// hash attempts. + private static let checkInterval: UInt64 = 1024 + + /// The nonce value is a fixed-width hex counter so the serialized event + /// template can be mutated in place without reallocation. + private static let nonceLength = 16 + + // MARK: - Scoring + + /// Number of leading zero bits in a byte sequence (NIP-13 difficulty of + /// an event-ID hash). + static func leadingZeroBits>(_ bytes: Bytes) -> Int { + var total = 0 + for byte in bytes { + if byte == 0 { + total += 8 + } else { + total += byte.leadingZeroBitCount + break + } + } + return total + } + + /// Validated NIP-13 difficulty of an inbound event. + /// + /// The committed target in the nonce tag is what counts: the actual + /// leading zero bits of the ID must meet it (otherwise the claim is void + /// and the event scores 0), and work beyond the commitment earns no extra + /// credit — this stops spammers who mine a low target from getting lucky + /// high scores. Events without a well-formed commitment score 0. + static func validatedDifficulty(idHex: String, tags: [[String]]) -> Int { + guard let nonceTag = tags.last(where: { $0.first == "nonce" }), + nonceTag.count >= 3, + let committed = Int(nonceTag[2]), + committed > 0, committed <= 256, + let idData = Data(hexString: idHex) + else { + return 0 + } + return leadingZeroBits(idData) >= committed ? committed : 0 + } + + // MARK: - Mining + + /// Mine a `["nonce", value, target]` tag for the given unsigned-event + /// fields. Nonisolated async: runs off the calling actor. + /// + /// Bounded by `miningTimeCap`: when the cap hits — or the surrounding + /// task is cancelled — the committed target steps down (halving to 0, + /// which any hash satisfies) so the event still ships promptly with an + /// honest commitment at the difficulty actually reached. Returns nil only + /// if canonical serialization fails; the caller then sends unmined. + static func mineNonceTag( + pubkey: String, + createdAt: Int, + kind: Int, + tags: [[String]], + content: String, + targetBits: Int = NostrPoW.targetBits + ) async -> [String]? { + var target = min(max(targetBits, 0), 256) + var budget = miningTimeCap + while true { + if let tag = mineAttempt( + pubkey: pubkey, + createdAt: createdAt, + kind: kind, + baseTags: tags, + content: content, + targetBits: target, + budget: budget + ) { + return tag + } + // Target 0 succeeds on the first hash, so reaching it with nil + // means serialization itself failed — give up on mining. + if target == 0 { return nil } + target /= 2 + budget = fallbackTimeCap + } + } + + /// One bounded mining pass at a fixed committed target. Allocation-light: + /// the canonical serialization is built once and only the fixed-width + /// nonce bytes are rewritten per attempt (the event ID is recomputed for + /// every attempt, per NIP-13). Returns nil on timeout/cancellation or if + /// the template could not be built. + private static func mineAttempt( + pubkey: String, + createdAt: Int, + kind: Int, + baseTags: [[String]], + content: String, + targetBits: Int, + budget: TimeInterval + ) -> [String]? { + let targetString = String(targetBits) + guard let template = serializedTemplate( + pubkey: pubkey, + createdAt: createdAt, + kind: kind, + baseTags: baseTags, + content: content, + targetString: targetString + ) else { + return nil + } + var buffer = template.buffer + let nonceRange = template.nonceRange + + let deadline = DispatchTime.now().uptimeNanoseconds &+ UInt64(budget * 1_000_000_000) + let hexDigits = [UInt8]("0123456789abcdef".utf8) + var nonce = UInt64.random(in: .min ... .max) + var attempts: UInt64 = 0 + + while true { + // Write the nonce as 16 lowercase hex chars, in place. + var value = nonce + var index = nonceRange.upperBound + while index > nonceRange.lowerBound { + index -= 1 + buffer[index] = hexDigits[Int(value & 0xF)] + value >>= 4 + } + + if leadingZeroBits(SHA256.hash(data: buffer)) >= targetBits { + // Identical to the bytes just written into the buffer. + return ["nonce", String(format: "%016llx", nonce), targetString] + } + + nonce &+= 1 + attempts &+= 1 + if attempts % checkInterval == 0, + Task.isCancelled || DispatchTime.now().uptimeNanoseconds >= deadline { + return nil + } + } + } + + /// Canonical NIP-01 serialization of the event with a placeholder nonce, + /// plus the byte range of the nonce value inside it. + /// + /// The range is located by serializing twice with two same-length + /// placeholders and diffing the buffers — the only differing bytes are + /// the nonce value, so this stays correct however `JSONSerialization` + /// escapes the surrounding fields (and even if the content contains the + /// placeholder text itself). + private static func serializedTemplate( + pubkey: String, + createdAt: Int, + kind: Int, + baseTags: [[String]], + content: String, + targetString: String + ) -> (buffer: Data, nonceRange: Range)? { + func serialize(noncePlaceholder: String) -> Data? { + var tags = baseTags + tags.append(["nonce", noncePlaceholder, targetString]) + let serialized: [Any] = [0, pubkey, createdAt, kind, tags, content] + return try? JSONSerialization.data(withJSONObject: serialized, options: [.withoutEscapingSlashes]) + } + + guard let zeros = serialize(noncePlaceholder: String(repeating: "0", count: nonceLength)), + let effs = serialize(noncePlaceholder: String(repeating: "f", count: nonceLength)), + zeros.count == effs.count + else { + return nil + } + + var firstDiff = -1 + var lastDiff = -1 + for index in 0..= 0, lastDiff - firstDiff + 1 == nonceLength else { return nil } + return (zeros, firstDiff..<(firstDiff + nonceLength)) + } +} diff --git a/bitchat/Nostr/NostrProtocol.swift b/bitchat/Nostr/NostrProtocol.swift index d59a5200..83578e2b 100644 --- a/bitchat/Nostr/NostrProtocol.swift +++ b/bitchat/Nostr/NostrProtocol.swift @@ -170,6 +170,63 @@ struct NostrProtocol { nickname: String? = nil, teleported: Bool = false ) throws -> NostrEvent { + let event = NostrEvent( + pubkey: senderIdentity.publicKeyHex, + createdAt: Date(), + kind: .ephemeralEvent, + tags: ephemeralGeohashTags(geohash: geohash, nickname: nickname, teleported: teleported), + content: content + ) + let schnorrKey = try senderIdentity.schnorrSigningKey() + return try event.sign(with: schnorrKey) + } + + /// Create a kind-20000 geohash message carrying a NIP-13 proof-of-work + /// nonce tag (see `NostrPoW`). Mining runs off the calling actor and is + /// bounded by `NostrPoW.miningTimeCap`; when the cap hits (or the + /// surrounding task is cancelled) the event ships at the highest + /// committed difficulty still met, and if mining is impossible it ships + /// unmined — sending is never blocked. + static func createMinedEphemeralGeohashEvent( + content: String, + geohash: String, + senderIdentity: NostrIdentity, + nickname: String? = nil, + teleported: Bool = false, + powTargetBits: Int = NostrPoW.targetBits + ) async throws -> NostrEvent { + var tags = ephemeralGeohashTags(geohash: geohash, nickname: nickname, teleported: teleported) + // Fix created_at up front: the mined nonce commits to the full + // serialized event, so the signed event must reuse the exact value. + let createdAt = Int(Date().timeIntervalSince1970) + if let nonceTag = await NostrPoW.mineNonceTag( + pubkey: senderIdentity.publicKeyHex, + createdAt: createdAt, + kind: EventKind.ephemeralEvent.rawValue, + tags: tags, + content: content, + targetBits: powTargetBits + ) { + tags.append(nonceTag) + } + let event = NostrEvent( + pubkey: senderIdentity.publicKeyHex, + createdAt: Date(timeIntervalSince1970: TimeInterval(createdAt)), + kind: .ephemeralEvent, + tags: tags, + content: content + ) + let schnorrKey = try senderIdentity.schnorrSigningKey() + return try event.sign(with: schnorrKey) + } + + /// Tags for a kind-20000 geohash message (shared by the plain and mined + /// variants). + private static func ephemeralGeohashTags( + geohash: String, + nickname: String?, + teleported: Bool + ) -> [[String]] { var tags = [["g", geohash]] if let nickname = nickname?.trimmedOrNilIfEmpty { tags.append(["n", nickname]) @@ -177,15 +234,7 @@ struct NostrProtocol { if teleported { tags.append(["t", "teleport"]) } - let event = NostrEvent( - pubkey: senderIdentity.publicKeyHex, - createdAt: Date(), - kind: .ephemeralEvent, - tags: tags, - content: content - ) - let schnorrKey = try senderIdentity.schnorrSigningKey() - return try event.sign(with: schnorrKey) + return tags } /// Create a geohash presence heartbeat (kind 20001) diff --git a/bitchat/ViewModels/ChatLifecycleCoordinator.swift b/bitchat/ViewModels/ChatLifecycleCoordinator.swift index bea1b5b2..60c199f6 100644 --- a/bitchat/ViewModels/ChatLifecycleCoordinator.swift +++ b/bitchat/ViewModels/ChatLifecycleCoordinator.swift @@ -324,7 +324,7 @@ private extension ChatLifecycleCoordinator { do { let identity = try context.deriveNostrIdentity(forGeohash: channel.geohash) - let event = try NostrProtocol.createEphemeralGeohashEvent( + let event = try await NostrProtocol.createMinedEphemeralGeohashEvent( content: message, geohash: channel.geohash, senderIdentity: identity, diff --git a/bitchat/ViewModels/ChatOutgoingCoordinator.swift b/bitchat/ViewModels/ChatOutgoingCoordinator.swift index 915ea7fa..8d8b6a9e 100644 --- a/bitchat/ViewModels/ChatOutgoingCoordinator.swift +++ b/bitchat/ViewModels/ChatOutgoingCoordinator.swift @@ -68,10 +68,22 @@ extension ChatViewModel: ChatOutgoingContext { final class ChatOutgoingCoordinator { private unowned let context: any ChatOutgoingContext + /// In-flight NIP-13 mining for the most recent geohash send. A newer send + /// (or leaving the channel) cancels it, which only expedites the mining — + /// the message still goes out at the difficulty already reached. + /// (Read access is internal so tests can await the send's completion.) + private(set) var geohashMiningTask: Task? + init(context: any ChatOutgoingContext) { self.context = context } + /// Finish any in-flight geohash PoW mining early (the pending message + /// still sends, at whatever committed difficulty it reached). + func expeditePendingGeohashMining() { + geohashMiningTask?.cancel() + } + func sendMessage(_ content: String) { guard let trimmed = content.trimmedOrNilIfEmpty else { return } @@ -92,120 +104,117 @@ final class ChatOutgoingCoordinator { } let mentions = context.parseMentions(from: content) - let preparedMessage = preparePublicMessage(content: content, trimmed: trimmed, mentions: mentions) - guard let preparedMessage else { return } - appendLocalEcho(preparedMessage.message) - routePublicMessage( - originalContent: content, - mentions: mentions, - geoContext: preparedMessage.geoContext, - messageID: preparedMessage.message.id, - timestamp: preparedMessage.message.timestamp - ) + switch context.activeChannel { + case .mesh: + sendMeshPublicMessage(originalContent: content, trimmed: trimmed, mentions: mentions) + case .location(let channel): + sendGeohashPublicMessage(trimmed, mentions: mentions, channel: channel) + } } } private extension ChatOutgoingCoordinator { - func preparePublicMessage( - content: String, - trimmed: String, - mentions: [String] - ) -> (message: BitchatMessage, geoContext: ChatViewModel.GeoOutgoingContext?)? { - var geoContext: ChatViewModel.GeoOutgoingContext? - var displaySender = context.nickname - var localSenderPeerID = context.myPeerID - var messageID: String? - var messageTimestamp = Date() + func sendMeshPublicMessage(originalContent: String, trimmed: String, mentions: [String]) { + let message = BitchatMessage( + sender: context.nickname, + content: trimmed, + timestamp: Date(), + isRelay: false, + senderPeerID: context.myPeerID, + mentions: mentions.isEmpty ? nil : mentions + ) - switch context.activeChannel { - case .mesh: - break + appendLocalEcho(message, to: .mesh) + context.recordPublicActivity(forChannelKey: "mesh") + context.sendMeshMessage( + originalContent, + mentions: mentions, + messageID: message.id, + timestamp: message.timestamp + ) + } - case .location(let channel): + /// Geohash sends mine a NIP-13 nonce tag first (off the main actor, see + /// `NostrPoW`), so the whole echo-and-send runs in a task once the signed + /// event — whose ID is also the local message ID — exists. Typical mining + /// at the default target is well under 100 ms and hard-capped at + /// `NostrPoW.miningTimeCap`, so sending is never meaningfully delayed. + func sendGeohashPublicMessage(_ trimmed: String, mentions: [String], channel: GeohashChannel) { + let identity: NostrIdentity + do { + identity = try context.deriveNostrIdentity(forGeohash: channel.geohash) + } catch { + SecureLogger.error("❌ Failed to prepare geohash message: \(error)", category: .session) + context.addSystemMessage( + String(localized: "system.location.send_failed", comment: "System message when a location channel send fails") + ) + return + } + + let displaySender = context.nickname + "#" + String(identity.publicKeyHex.suffix(4)) + let senderPeerID = PeerID(nostr: identity.publicKeyHex) + let teleported = context.isTeleported + let nickname = context.nickname + + // Serialize geohash sends: each send awaits the previous send's task + // before it appends + relays, so user-visible order always matches + // send order even when an earlier message mines longer than a later + // one. Cancelling the previous task only *expedites* its mining (the + // NIP-13 target is polled, not aborted), so it still finishes and + // sends — and it finishes fast, so awaiting it never stacks mining + // delays or blocks a send beyond `NostrPoW.miningTimeCap`. + let previousSend = geohashMiningTask + previousSend?.cancel() + geohashMiningTask = Task { @MainActor [weak context = self.context] in + await previousSend?.value + + let event: NostrEvent do { - let identity = try context.deriveNostrIdentity(forGeohash: channel.geohash) - let suffix = String(identity.publicKeyHex.suffix(4)) - displaySender = context.nickname + "#" + suffix - localSenderPeerID = PeerID(nostr: identity.publicKeyHex) - - let teleported = context.isTeleported - let event = try NostrProtocol.createEphemeralGeohashEvent( + event = try await NostrProtocol.createMinedEphemeralGeohashEvent( content: trimmed, geohash: channel.geohash, senderIdentity: identity, - nickname: context.nickname, - teleported: teleported - ) - - messageID = event.id - messageTimestamp = Date(timeIntervalSince1970: TimeInterval(event.created_at)) - geoContext = ( - channel: channel, - event: event, - identity: identity, + nickname: nickname, teleported: teleported ) } catch { SecureLogger.error("❌ Failed to prepare geohash message: \(error)", category: .session) - context.addSystemMessage( - String(localized: "system.location.send_failed", comment: "System message when a location channel send fails") - ) - return nil - } - } - - let message = BitchatMessage( - id: messageID, - sender: displaySender, - content: trimmed, - timestamp: messageTimestamp, - isRelay: false, - senderPeerID: localSenderPeerID, - mentions: mentions.isEmpty ? nil : mentions - ) - - return (message, geoContext) - } - - func appendLocalEcho(_ message: BitchatMessage) { - context.appendPublicMessage(message, to: ConversationID(channelID: context.activeChannel)) - - let contentKey = context.normalizedContentKey(message.content) - context.recordContentKey(contentKey, timestamp: message.timestamp) - } - - func routePublicMessage( - originalContent: String, - mentions: [String], - geoContext: ChatViewModel.GeoOutgoingContext?, - messageID: String, - timestamp: Date - ) { - switch context.activeChannel { - case .mesh: - context.recordPublicActivity(forChannelKey: "mesh") - context.sendMeshMessage( - originalContent, - mentions: mentions, - messageID: messageID, - timestamp: timestamp - ) - - case .location(let channel): - context.recordPublicActivity(forChannelKey: "geo:\(channel.geohash)") - - guard let geoContext, geoContext.channel.geohash == channel.geohash else { - SecureLogger.error("Geo: missing send context for \(channel.geohash)", category: .session) - context.addSystemMessage( + context?.addSystemMessage( String(localized: "system.location.send_failed", comment: "System message when a location channel send fails") ) return } + guard let context else { return } - Task { @MainActor [weak context = self.context] in - context?.sendGeohash(context: geoContext) - } + let message = BitchatMessage( + id: event.id, + sender: displaySender, + content: trimmed, + timestamp: Date(timeIntervalSince1970: TimeInterval(event.created_at)), + isRelay: false, + senderPeerID: senderPeerID, + mentions: mentions.isEmpty ? nil : mentions + ) + + context.appendPublicMessage(message, to: ConversationID(channelID: .location(channel))) + let contentKey = context.normalizedContentKey(message.content) + context.recordContentKey(contentKey, timestamp: message.timestamp) + + context.recordPublicActivity(forChannelKey: "geo:\(channel.geohash)") + context.sendGeohash(context: ( + channel: channel, + event: event, + identity: identity, + teleported: teleported + )) } } + + func appendLocalEcho(_ message: BitchatMessage, to conversationID: ConversationID) { + context.appendPublicMessage(message, to: conversationID) + + let contentKey = context.normalizedContentKey(message.content) + context.recordContentKey(contentKey, timestamp: message.timestamp) + } } diff --git a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift index d6777a71..5a9ad6db 100644 --- a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift @@ -82,7 +82,9 @@ protocol ChatPublicConversationContext: AnyObject { // MARK: Inbound public message processing func processActionMessage(_ message: BitchatMessage) -> BitchatMessage func isMessageBlocked(_ message: BitchatMessage) -> Bool - func allowPublicMessage(senderKey: String, contentKey: String) -> Bool + /// `powBits` is the validated NIP-13 difficulty of the source Nostr event + /// (0 for mesh messages); sufficient PoW relaxes the per-sender bucket. + func allowPublicMessage(senderKey: String, contentKey: String, powBits: Int) -> Bool /// Buffers a visible-channel message for the batched (~80 ms) pipeline /// flush, which commits it to `conversationID` in the store. func enqueuePublicMessage(_ message: BitchatMessage, to conversationID: ConversationID) @@ -137,8 +139,8 @@ extension ChatViewModel: ChatPublicConversationContext { meshService.sendMessage(content, mentions: mentions, messageID: messageID, timestamp: timestamp) } - func allowPublicMessage(senderKey: String, contentKey: String) -> Bool { - publicRateLimiter.allow(senderKey: senderKey, contentKey: contentKey) + func allowPublicMessage(senderKey: String, contentKey: String, powBits: Int) -> Bool { + publicRateLimiter.allow(senderKey: senderKey, contentKey: contentKey, powBits: powBits) } func enqueuePublicMessage(_ message: BitchatMessage, to conversationID: ConversationID) { @@ -367,7 +369,7 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { guard let context else { return } do { let identity = try context.deriveNostrIdentity(forGeohash: channel.geohash) - let event = try NostrProtocol.createEphemeralGeohashEvent( + let event = try await NostrProtocol.createMinedEphemeralGeohashEvent( content: content, geohash: channel.geohash, senderIdentity: identity, @@ -395,7 +397,11 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { ) } - func handlePublicMessage(_ message: BitchatMessage) { + /// - Parameter powBits: validated NIP-13 difficulty of the source Nostr + /// event (0 for mesh messages). Sufficient PoW relaxes the per-sender + /// rate limit; low/no-PoW events keep the strict limits so old clients + /// still get through at normal rates. + func handlePublicMessage(_ message: BitchatMessage, powBits: Int = 0) { let finalMessage = context.processActionMessage(message) if context.isMessageBlocked(finalMessage) { return } @@ -405,7 +411,7 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { if shouldRateLimit { let senderKey = normalizedSenderKey(for: finalMessage) let contentKey = context.normalizedContentKey(finalMessage.content) - if !context.allowPublicMessage(senderKey: senderKey, contentKey: contentKey) { + if !context.allowPublicMessage(senderKey: senderKey, contentKey: contentKey, powBits: powBits) { return } } diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 578b6509..d995ecff 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -311,6 +311,9 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele get { conversations.activeChannel } set { guard conversations.activeChannel != newValue else { return } + // Leaving a channel expedites any in-flight NIP-13 mining: the + // pending message still sends, at the difficulty already reached. + outgoingCoordinator.expeditePendingGeohashMining() conversations.setActiveChannel(newValue) visibleMessagesCache = nil objectWillChange.send() @@ -1683,6 +1686,13 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele publicConversationCoordinator.handlePublicMessage(message) } + /// Handle an incoming public Nostr message with its validated NIP-13 + /// difficulty; sufficient PoW relaxes the per-sender rate limit. + @MainActor + func handlePublicMessage(_ message: BitchatMessage, powBits: Int) { + publicConversationCoordinator.handlePublicMessage(message, powBits: powBits) + } + /// Check for mentions and send notifications func checkForMentions(_ message: BitchatMessage) { publicConversationCoordinator.checkForMentions(message) diff --git a/bitchat/ViewModels/MessageRateLimiter.swift b/bitchat/ViewModels/MessageRateLimiter.swift index 5bca9a6d..a0309447 100644 --- a/bitchat/ViewModels/MessageRateLimiter.swift +++ b/bitchat/ViewModels/MessageRateLimiter.swift @@ -48,15 +48,25 @@ struct MessageRateLimiter { self.contentRefill = contentRefillPerSec } - mutating func allow(senderKey: String, contentKey: String, now: Date = Date()) -> Bool { - var senderBucket = senderBuckets[senderKey] ?? TokenBucket( - capacity: senderCapacity, - tokens: senderCapacity, - refillPerSec: senderRefill, - lastRefill: now - ) - let senderAllowed = senderBucket.allow(now: now) - senderBuckets[senderKey] = senderBucket + /// - Parameter powBits: validated NIP-13 difficulty of the event + /// (`NostrPoW.validatedDifficulty`; 0 for mesh or no-PoW events). + /// At or above `NostrPoW.rateLimitBypassBits` the per-sender bucket is + /// skipped entirely — each such message paid for itself with work — but + /// the per-content flood bucket still applies. + mutating func allow(senderKey: String, contentKey: String, powBits: Int = 0, now: Date = Date()) -> Bool { + let senderAllowed: Bool + if powBits >= NostrPoW.rateLimitBypassBits { + senderAllowed = true + } else { + var senderBucket = senderBuckets[senderKey] ?? TokenBucket( + capacity: senderCapacity, + tokens: senderCapacity, + refillPerSec: senderRefill, + lastRefill: now + ) + senderAllowed = senderBucket.allow(now: now) + senderBuckets[senderKey] = senderBucket + } var contentBucket = contentBuckets[contentKey] ?? TokenBucket( capacity: contentCapacity, diff --git a/bitchat/ViewModels/NostrInboundPipeline.swift b/bitchat/ViewModels/NostrInboundPipeline.swift index 337fa474..2d2e6825 100644 --- a/bitchat/ViewModels/NostrInboundPipeline.swift +++ b/bitchat/ViewModels/NostrInboundPipeline.swift @@ -32,7 +32,10 @@ protocol NostrInboundPipelineContext: AnyObject { func recordGeoParticipant(pubkeyHex: String) // MARK: Inbound public messages - func handlePublicMessage(_ message: BitchatMessage) + /// `powBits` is the validated NIP-13 difficulty of the source event + /// (`NostrPoW.validatedDifficulty`); it relaxes the per-sender rate limit + /// downstream. + func handlePublicMessage(_ message: BitchatMessage, powBits: Int) func checkForMentions(_ message: BitchatMessage) func sendHapticFeedback(for message: BitchatMessage) func parseMentions(from content: String) -> [String] @@ -152,6 +155,7 @@ final class NostrInboundPipeline { let rawTs = Date(timeIntervalSince1970: TimeInterval(event.created_at)) let timestamp = min(rawTs, Date()) let mentions = context.parseMentions(from: content) + let powBits = NostrPoW.validatedDifficulty(idHex: event.id, tags: event.tags) let message = BitchatMessage( id: event.id, sender: senderName, @@ -165,7 +169,7 @@ final class NostrInboundPipeline { Task { @MainActor [weak context] in guard let context else { return } let isBlocked = context.isNostrBlocked(pubkeyHexLowercased: event.pubkey.lowercased()) - context.handlePublicMessage(message) + context.handlePublicMessage(message, powBits: powBits) if !isBlocked { context.checkForMentions(message) context.sendHapticFeedback(for: message) @@ -187,10 +191,12 @@ final class NostrInboundPipeline { guard event.isValidSignature() else { return } context.recordProcessedNostrEvent(event.id) + let powBits = NostrPoW.validatedDifficulty(idHex: event.id, tags: event.tags) + // Sampled: fires for every geo event and floods dev logs in busy geohashes. geoEventLogCount += 1 if geoEventLogCount == 1 || geoEventLogCount.isMultiple(of: TransportConfig.nostrInboundEventLogInterval) { - SecureLogger.debug("GeoTeleport: recv #\(geoEventLogCount) pub=\(event.pubkey.prefix(8))… tags=\(event.tags.map { "[" + $0.joined(separator: ",") + "]" }.joined(separator: ","))", category: .session) + SecureLogger.debug("GeoTeleport: recv #\(geoEventLogCount) pub=\(event.pubkey.prefix(8))… pow=\(powBits) tags=\(event.tags.map { "[" + $0.joined(separator: ",") + "]" }.joined(separator: ","))", category: .session) } if context.isNostrBlocked(pubkeyHexLowercased: event.pubkey) { @@ -255,7 +261,7 @@ final class NostrInboundPipeline { Task { @MainActor [weak context] in guard let context else { return } - context.handlePublicMessage(message) + context.handlePublicMessage(message, powBits: powBits) context.checkForMentions(message) context.sendHapticFeedback(for: message) } diff --git a/bitchatTests/ChatNostrCoordinatorContextTests.swift b/bitchatTests/ChatNostrCoordinatorContextTests.swift index 7777310e..5cbd0c7d 100644 --- a/bitchatTests/ChatNostrCoordinatorContextTests.swift +++ b/bitchatTests/ChatNostrCoordinatorContextTests.swift @@ -71,6 +71,7 @@ private final class MockChatNostrContext: ChatNostrContext { private(set) var hapticMessageIDs: [String] = [] func handlePublicMessage(_ message: BitchatMessage) { handledPublicMessages.append(message) } + func handlePublicMessage(_ message: BitchatMessage, powBits: Int) { handledPublicMessages.append(message) } func checkForMentions(_ message: BitchatMessage) { mentionCheckedMessageIDs.append(message.id) } func sendHapticFeedback(for message: BitchatMessage) { hapticMessageIDs.append(message.id) } func parseMentions(from content: String) -> [String] { [] } diff --git a/bitchatTests/ChatOutgoingCoordinatorContextTests.swift b/bitchatTests/ChatOutgoingCoordinatorContextTests.swift index 6ed7c6da..25aa8300 100644 --- a/bitchatTests/ChatOutgoingCoordinatorContextTests.swift +++ b/bitchatTests/ChatOutgoingCoordinatorContextTests.swift @@ -192,6 +192,9 @@ struct ChatOutgoingCoordinatorContextTests { context.isTeleported = true coordinator.sendMessage("hello geo") + // Geohash sends mine a NIP-13 nonce tag off-main before echoing and + // sending; await the send task, then drain the main queue. + await coordinator.geohashMiningTask?.value await drainMainActorTasks() // Local echo carries the geohash sender suffix (#last-4-of-pubkey) and @@ -215,4 +218,35 @@ struct ChatOutgoingCoordinatorContextTests { #expect(context.appendedPublicMessages.count == 1) #expect(context.sentGeohashContexts.count == 1) } + + @Test @MainActor + func sendMessage_onLocationChannel_serializesRapidSendsInSendOrder() async { + let context = MockChatOutgoingContext() + let coordinator = ChatOutgoingCoordinator(context: context) + let channel = GeohashChannel(level: .city, geohash: "u4pruydq") + context.activeChannel = .location(channel) + + // Two back-to-back sends. The first carries much larger content, so + // its NIP-13 mining hashes a bigger event per attempt and runs longer + // than the second's. Without serialization the second (faster) task + // could finish first and reorder both the local timeline and the + // relayed events. The coordinator chains the mining tasks — each send + // awaits the previous send's task before it echoes and relays — so the + // visible order must always match the send order. + let first = "first " + String(repeating: "x", count: 4000) + let second = "second" + coordinator.sendMessage(first) + coordinator.sendMessage(second) + + // The stored task is the second send, which awaits the first. + await coordinator.geohashMiningTask?.value + await drainMainActorTasks() + + // Local echoes land in send order… + #expect(context.appendedPublicMessages.map(\.message.content) == [first, second]) + // …and so do the relayed events (IDs match the echoes 1:1, in order). + #expect(context.sentGeohashContexts.count == 2) + #expect(context.sentGeohashContexts.map(\.event.id) + == context.appendedPublicMessages.map(\.message.id)) + } } diff --git a/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift b/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift index 9bcd2b93..be76fe82 100644 --- a/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift +++ b/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift @@ -186,7 +186,7 @@ private final class MockChatPublicConversationContext: ChatPublicConversationCon // Inbound public message processing var blockedMessageIDs: Set = [] var rateLimitAllowed = true - private(set) var rateLimitChecks: [(senderKey: String, contentKey: String)] = [] + private(set) var rateLimitChecks: [(senderKey: String, contentKey: String, powBits: Int)] = [] private(set) var enqueuedMessages: [(messageID: String, conversationID: ConversationID)] = [] var enqueuedMessageIDs: [String] { enqueuedMessages.map(\.messageID) } var stablePeerIDs: [PeerID: PeerID] = [:] @@ -199,8 +199,8 @@ private final class MockChatPublicConversationContext: ChatPublicConversationCon blockedMessageIDs.contains(message.id) } - func allowPublicMessage(senderKey: String, contentKey: String) -> Bool { - rateLimitChecks.append((senderKey, contentKey)) + func allowPublicMessage(senderKey: String, contentKey: String, powBits: Int) -> Bool { + rateLimitChecks.append((senderKey, contentKey, powBits)) return rateLimitAllowed } diff --git a/bitchatTests/MessageRateLimiterTests.swift b/bitchatTests/MessageRateLimiterTests.swift new file mode 100644 index 00000000..c9959761 --- /dev/null +++ b/bitchatTests/MessageRateLimiterTests.swift @@ -0,0 +1,119 @@ +// +// MessageRateLimiterTests.swift +// bitchatTests +// +// Tests for the public-intake token buckets, including the NIP-13 +// proof-of-work relaxation of the per-sender bucket. +// + +import Foundation +import Testing +@testable import bitchat + +struct MessageRateLimiterTests { + + private func makeLimiter( + senderCapacity: Double = 2, + contentCapacity: Double = 100 + ) -> MessageRateLimiter { + MessageRateLimiter( + senderCapacity: senderCapacity, + senderRefillPerSec: 0.0001, + contentCapacity: contentCapacity, + contentRefillPerSec: 0.0001 + ) + } + + @Test func senderBucketBlocksAfterCapacity() { + var limiter = makeLimiter() + let now = Date() + + let first = limiter.allow(senderKey: "s", contentKey: "c1", now: now) + let second = limiter.allow(senderKey: "s", contentKey: "c2", now: now) + let third = limiter.allow(senderKey: "s", contentKey: "c3", now: now) + let otherSender = limiter.allow(senderKey: "other", contentKey: "c4", now: now) + + #expect(first) + #expect(second) + #expect(!third) + #expect(otherSender) + } + + @Test func validPoWBypassesExhaustedSenderBucket() { + var limiter = makeLimiter() + let now = Date() + + // Exhaust the sender bucket with plain (no-PoW) messages. + let first = limiter.allow(senderKey: "s", contentKey: "c1", now: now) + let second = limiter.allow(senderKey: "s", contentKey: "c2", now: now) + let exhausted = limiter.allow(senderKey: "s", contentKey: "c3", now: now) + + // A message carrying sufficient validated PoW still passes, and so + // does more-than-sufficient PoW; plain messages stay blocked. + let powExact = limiter.allow( + senderKey: "s", + contentKey: "c4", + powBits: NostrPoW.rateLimitBypassBits, + now: now + ) + let powHigh = limiter.allow(senderKey: "s", contentKey: "c5", powBits: 20, now: now) + let plainAgain = limiter.allow(senderKey: "s", contentKey: "c6", now: now) + + #expect(first) + #expect(second) + #expect(!exhausted) + #expect(powExact) + #expect(powHigh) + #expect(!plainAgain) + } + + @Test func lowPoWDoesNotBypassSenderBucket() { + var limiter = makeLimiter(senderCapacity: 1) + let now = Date() + + let first = limiter.allow(senderKey: "s", contentKey: "c1", now: now) + let lowPow = limiter.allow( + senderKey: "s", + contentKey: "c2", + powBits: NostrPoW.rateLimitBypassBits - 1, + now: now + ) + let zeroPow = limiter.allow(senderKey: "s", contentKey: "c3", powBits: 0, now: now) + + #expect(first) + #expect(!lowPow) + #expect(!zeroPow) + } + + @Test func powDoesNotBypassContentFloodBucket() { + var limiter = makeLimiter(senderCapacity: 100, contentCapacity: 1) + let now = Date() + + let first = limiter.allow(senderKey: "a", contentKey: "same", now: now) + // Identical content spammed with PoW is still throttled by the + // content bucket: PoW only relaxes the per-sender limit. + let powSameContent = limiter.allow(senderKey: "b", contentKey: "same", powBits: 20, now: now) + let powNewContent = limiter.allow(senderKey: "b", contentKey: "different", powBits: 20, now: now) + + #expect(first) + #expect(!powSameContent) + #expect(powNewContent) + } + + @Test func powBypassDoesNotDrainSenderBucket() { + var limiter = makeLimiter(senderCapacity: 1) + let now = Date() + + // PoW messages don't consume sender tokens, so a subsequent plain + // message still has its full budget. + let powFirst = limiter.allow(senderKey: "s", contentKey: "c1", powBits: 20, now: now) + let powSecond = limiter.allow(senderKey: "s", contentKey: "c2", powBits: 20, now: now) + let plain = limiter.allow(senderKey: "s", contentKey: "c3", now: now) + let plainExhausted = limiter.allow(senderKey: "s", contentKey: "c4", now: now) + + #expect(powFirst) + #expect(powSecond) + #expect(plain) + #expect(!plainExhausted) + } +} diff --git a/bitchatTests/Nostr/NostrPoWTests.swift b/bitchatTests/Nostr/NostrPoWTests.swift new file mode 100644 index 00000000..1905e0f0 --- /dev/null +++ b/bitchatTests/Nostr/NostrPoWTests.swift @@ -0,0 +1,222 @@ +// +// NostrPoWTests.swift +// bitchatTests +// +// Tests for NIP-13 proof-of-work: leading-zero-bit counting, commitment +// semantics, and nonce-tag mining for geohash (kind 20000) events. +// + +import CryptoKit +import Foundation +import Testing +import BitFoundation +@testable import bitchat + +struct NostrPoWTests { + + // MARK: - Leading zero bits + + @Test func leadingZeroBitsVectors() { + #expect(NostrPoW.leadingZeroBits(Data()) == 0) + #expect(NostrPoW.leadingZeroBits(Data([0x80])) == 0) + #expect(NostrPoW.leadingZeroBits(Data([0xFF, 0x00])) == 0) + #expect(NostrPoW.leadingZeroBits(Data([0x40])) == 1) + #expect(NostrPoW.leadingZeroBits(Data([0x01])) == 7) + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0x00, 0xF0])) == 16) + #expect(NostrPoW.leadingZeroBits(Data(repeating: 0x00, count: 32)) == 256) + } + + @Test func leadingZeroBitsExactByteBoundaries() { + // Zero byte contributes exactly 8, then the next byte decides. + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0xFF])) == 8) + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0x80])) == 8) + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0x7F])) == 9) + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0x01])) == 15) + #expect(NostrPoW.leadingZeroBits(Data([0x00, 0x00, 0x01])) == 23) + } + + @Test func leadingZeroBitsMatchesNIP13ExampleVector() throws { + // Worked example from the NIP-13 spec: this event ID has 36 leading + // zero bits. + let idHex = "000000000e9d97a1ab09fc381030b346cdd7a142ad57e6df0b46dc9bef6c7e2d" + let idData = try #require(Data(hexString: idHex)) + #expect(NostrPoW.leadingZeroBits(idData) == 36) + } + + // MARK: - Commitment semantics + + /// An ID with exactly 16 leading zero bits. + private let id16 = "0000f000" + String(repeating: "ab", count: 28) + + @Test func committedTargetCountsNotActualDifficulty() { + // Claimed < actual: only the committed target is credited, so lucky + // extra zeroes earn nothing beyond the commitment. + let tags = [["g", "u4pruy"], ["nonce", "12345", "8"]] + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: tags) == 8) + } + + @Test func unmetCommitmentScoresZero() { + // Actual < claimed: the commitment is not met, so the claim is void. + let tags = [["nonce", "12345", "24"]] + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: tags) == 0) + } + + @Test func exactCommitmentIsCredited() { + let tags = [["nonce", "12345", "16"]] + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: tags) == 16) + } + + @Test func missingOrMalformedNonceTagScoresZero() { + // No nonce tag at all: leading zeroes without a commitment earn no + // credit (old clients simply keep the strict rate limits). + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["g", "u4pruy"]]) == 0) + // Nonce tag without a committed target. + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["nonce", "12345"]]) == 0) + // Non-numeric or nonsensical targets. + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["nonce", "1", "high"]]) == 0) + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["nonce", "1", "0"]]) == 0) + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["nonce", "1", "-4"]]) == 0) + #expect(NostrPoW.validatedDifficulty(idHex: id16, tags: [["nonce", "1", "400"]]) == 0) + // Malformed event ID. + #expect(NostrPoW.validatedDifficulty(idHex: "not-hex", tags: [["nonce", "1", "8"]]) == 0) + } + + // MARK: - Mining + + @Test func minedNonceTagMeetsCommittedDifficulty() async throws { + let pubkey = String(repeating: "a", count: 64) + let createdAt = 1_700_000_000 + let baseTags = [["g", "u4pruydq"], ["n", "tester"]] + let content = "hello pow" + + let nonceTag = try #require(await NostrPoW.mineNonceTag( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags, + content: content, + targetBits: 8 + )) + + #expect(nonceTag.count == 3) + #expect(nonceTag.first == "nonce") + #expect(nonceTag[2] == "8") + + // Recompute the canonical NIP-01 event ID with the mined tag appended + // and verify the committed difficulty is genuinely met. + let idData = try Self.eventIDHash( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags + [nonceTag], + content: content + ) + #expect(NostrPoW.leadingZeroBits(idData) >= 8) + let idHex = idData.map { String(format: "%02x", $0) }.joined() + #expect(NostrPoW.validatedDifficulty(idHex: idHex, tags: baseTags + [nonceTag]) == 8) + } + + @Test func miningSurvivesContentThatNeedsEscaping() async throws { + // The in-place template mutation must stay correct when the content + // gets JSON-escaped — including content that contains hex runs that + // look exactly like the internal nonce placeholder. + let pubkey = String(repeating: "b", count: 64) + let createdAt = 1_700_000_123 + let content = "she said \"hi\"\n0000000000000000 / ffffffffffffffff 😀\\" + let baseTags = [["g", "9q8yy"]] + + let nonceTag = try #require(await NostrPoW.mineNonceTag( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags, + content: content, + targetBits: 4 + )) + + let idData = try Self.eventIDHash( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags + [nonceTag], + content: content + ) + #expect(NostrPoW.leadingZeroBits(idData) >= 4) + } + + @Test func minedGeohashEventValidatesEndToEnd() async throws { + let identity = try NostrIdentity.generate() + let event = try await NostrProtocol.createMinedEphemeralGeohashEvent( + content: "hello from a mined event", + geohash: "u4pruydq", + senderIdentity: identity, + nickname: "miner", + teleported: false + ) + + // The signed event's own ID (recomputed by sign()) carries the work. + #expect(event.isValidSignature()) + let idData = try #require(Data(hexString: event.id)) + #expect(NostrPoW.leadingZeroBits(idData) >= NostrPoW.targetBits) + #expect(NostrPoW.validatedDifficulty(idHex: event.id, tags: event.tags) == NostrPoW.targetBits) + + // Mining must not disturb the regular geohash tags. + #expect(event.tags.contains(["g", "u4pruydq"])) + #expect(event.tags.contains(["n", "miner"])) + #expect(event.kind == NostrProtocol.EventKind.ephemeralEvent.rawValue) + } + + @Test func cancelledMiningStillProducesHonestCommitment() async throws { + // Cancelling the surrounding task expedites mining: it steps the + // committed target down and still returns a tag whose commitment the + // hash actually meets — the message is never dropped or dishonest. + let pubkey = String(repeating: "c", count: 64) + let createdAt = 1_700_000_456 + let baseTags = [["g", "gbsuv"]] + let content = "expedited" + + let miningTask = Task { + await NostrPoW.mineNonceTag( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags, + content: content, + targetBits: 240 // unreachable: forces the cap/cancel path + ) + } + miningTask.cancel() + + let nonceTag = try #require(await miningTask.value) + let committed = try #require(Int(nonceTag[2])) + #expect(committed >= 0) + #expect(committed < 240) + + if committed > 0 { + let idData = try Self.eventIDHash( + pubkey: pubkey, + createdAt: createdAt, + kind: 20000, + tags: baseTags + [nonceTag], + content: content + ) + #expect(NostrPoW.leadingZeroBits(idData) >= committed) + } + } + + // MARK: - Helpers + + /// Canonical NIP-01 event ID hash, computed independently of the + /// production code path. + private static func eventIDHash( + pubkey: String, + createdAt: Int, + kind: Int, + tags: [[String]], + content: String + ) throws -> Data { + let serialized: [Any] = [0, pubkey, createdAt, kind, tags, content] + let json = try JSONSerialization.data(withJSONObject: serialized, options: [.withoutEscapingSlashes]) + return Data(SHA256.hash(data: json)) + } +} diff --git a/bitchatTests/Performance/PerformanceBaselineTests.swift b/bitchatTests/Performance/PerformanceBaselineTests.swift index 39ed95bf..d496529c 100644 --- a/bitchatTests/Performance/PerformanceBaselineTests.swift +++ b/bitchatTests/Performance/PerformanceBaselineTests.swift @@ -611,6 +611,7 @@ private final class PerfNostrContext: ChatNostrContext { private(set) var handledPublicMessageCount = 0 func handlePublicMessage(_ message: BitchatMessage) { handledPublicMessageCount += 1 } + func handlePublicMessage(_ message: BitchatMessage, powBits: Int) { handledPublicMessageCount += 1 } func checkForMentions(_ message: BitchatMessage) {} func sendHapticFeedback(for message: BitchatMessage) {} func parseMentions(from content: String) -> [String] { From 60be88a4f5e530855c572754eb32ca185afd554c Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:13:25 +0200 Subject: [PATCH 032/158] Geohash bulletin board: persistent signed notices over mesh sync (#1379) * Add geohash bulletin board: persistent signed notices over mesh sync New MessageType 0x23 carries TLV-encoded board posts and tombstones, self-signed with the author's Ed25519 key ("bitchat-board-v1" / "bitchat-board-del-v1" domains) so notices verify without the author present. BoardStore persists raw signed packets under Application Support/board/ (200 posts, 5 per author, oldest evicted; expiry sweep; tombstones retained until the deleted post's original expiry) and is wiped on panic. Board packets join gossip sync as bit 8 of the existing variable-length types bitfield (a second byte old decoders already accept and ignore), with a 60s round and its own capacity, served straight from the board store so retention has one owner. Posts relay like broadcasts; urgent posts get the announce-class TTL cap. UI: a pin button in the header opens the board for the current channel (geohash board, or mesh-local board), with urgent-pinned newest-first listing, compose with urgent toggle and 1/3/7-day expiry, and swipe-delete on own posts. Geohash posts also publish one-way as Nostr kind-1 location notes when relays are reachable. Co-Authored-By: Claude Fable 5 * Board: bound orphan tombstones and reject future-dated posts at ingest Two hardening fixes from Codex review of the geohash bulletin board: - Orphan tombstones (P1): retention was derived solely from the sender-chosen deletedAt, so self-signed tombstones for unseen post IDs with far-future deletedAt persisted and re-entered sync unboundedly. Retention is now also clamped to receive time (now + 7d + 1h skew -- no post can outlive that), and orphans are capped at 100 globally and 5 per author key with oldest-received evicted first. Matched tombstones and disk restores keep their existing behavior. - Future-dated posts (P2): ingest only checked expiresAt > now, letting posts dated years ahead sort above honest posts and squat the 200 global slots without ever pruning. The single ingest chokepoint (radio, sync, and disk restore all funnel through it) now rejects createdAt > now + 1h skew and expiresAt > now + 7d + 1h skew; the decoder's span rule is unchanged. Adds tests for the skew boundary, far-future expiry, receive-time tombstone clamping, orphan caps/eviction, and matched-tombstone exemption. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/AppChromeModel.swift | 3 + bitchat/Protocols/BoardPackets.swift | 348 ++++++++++++++++ .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEReceivePipeline.swift | 4 + bitchat/Services/BLE/BLEService.swift | 71 ++++ bitchat/Services/Board/BoardManager.swift | 165 ++++++++ bitchat/Services/Board/BoardStore.swift | 358 ++++++++++++++++ bitchat/Services/RelayController.swift | 5 +- bitchat/Services/Transport.swift | 5 + bitchat/Sync/GossipSyncManager.swift | 41 ++ bitchat/Sync/SyncTypeFlags.swift | 6 + bitchat/ViewModels/ChatViewModel.swift | 4 + bitchat/Views/BoardView.swift | 270 ++++++++++++ bitchat/Views/ContentHeaderView.swift | 33 ++ .../Protocols/BoardPacketsTests.swift | 211 ++++++++++ bitchatTests/Services/BoardStoreTests.swift | 385 ++++++++++++++++++ bitchatTests/Sync/GossipSyncBoardTests.swift | 130 ++++++ .../Sync/SyncTypeFlagsBoardTests.swift | 78 ++++ .../Sources/BitFoundation/MessageType.swift | 4 +- 19 files changed, 2119 insertions(+), 4 deletions(-) create mode 100644 bitchat/Protocols/BoardPackets.swift create mode 100644 bitchat/Services/Board/BoardManager.swift create mode 100644 bitchat/Services/Board/BoardStore.swift create mode 100644 bitchat/Views/BoardView.swift create mode 100644 bitchatTests/Protocols/BoardPacketsTests.swift create mode 100644 bitchatTests/Services/BoardStoreTests.swift create mode 100644 bitchatTests/Sync/GossipSyncBoardTests.swift create mode 100644 bitchatTests/Sync/SyncTypeFlagsBoardTests.swift diff --git a/bitchat/App/AppChromeModel.swift b/bitchat/App/AppChromeModel.swift index 3f9cacd7..d90df814 100644 --- a/bitchat/App/AppChromeModel.swift +++ b/bitchat/App/AppChromeModel.swift @@ -18,6 +18,9 @@ final class AppChromeModel: ObservableObject { private let chatViewModel: ChatViewModel private var cancellables = Set() + /// Bulletin-board coordinator, created on first use of the board sheet. + private(set) lazy var boardManager = BoardManager(transport: chatViewModel.meshService) + init(chatViewModel: ChatViewModel, privateInboxModel: PrivateInboxModel) { self.chatViewModel = chatViewModel self.nickname = chatViewModel.nickname diff --git a/bitchat/Protocols/BoardPackets.swift b/bitchat/Protocols/BoardPackets.swift new file mode 100644 index 00000000..d265a1c1 --- /dev/null +++ b/bitchat/Protocols/BoardPackets.swift @@ -0,0 +1,348 @@ +// +// BoardPackets.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import CryptoKit +import Foundation + +// MARK: - Board wire format (MessageType.boardPost payloads) +// +// TLV layout (type u8, length u16 big-endian, value), matching REQUEST_SYNC: +// - 0x01: kind (u8) — 0x01 post, 0x02 tombstone +// - 0x02: postID (16B random) +// - 0x03: geohash (UTF-8, empty = mesh-local board, max 12 chars) +// - 0x04: content (UTF-8, 1...512 bytes) [post] +// - 0x05: authorSigningKey (32B Ed25519 public key) +// - 0x06: authorNickname (UTF-8, max 64 bytes) +// - 0x07: createdAt (u64 big-endian, ms) [post] +// - 0x08: expiresAt (u64 big-endian, ms, max 7 days after createdAt) [post] +// - 0x09: flags (u8, bit0 = urgent) [post] +// - 0x0A: signature (64B Ed25519) +// - 0x0B: deletedAt (u64 big-endian, ms) [tombstone] +// Unknown TLVs are skipped for forward compatibility. + +enum BoardWireConstants { + static let postIDLength = 16 + static let signingKeyLength = 32 + static let signatureLength = 64 + static let contentMaxBytes = 512 + static let nicknameMaxBytes = 64 + static let geohashMaxLength = 12 + /// Posts may live at most 7 days past their creation timestamp. + static let maxLifetimeMs: UInt64 = 7 * 24 * 60 * 60 * 1000 + static let postSigningContext = "bitchat-board-v1" + static let tombstoneSigningContext = "bitchat-board-del-v1" + static let geohashAlphabet = Set("0123456789bcdefghjkmnpqrstuvwxyz") +} + +private enum BoardTLVType: UInt8 { + case kind = 0x01 + case postID = 0x02 + case geohash = 0x03 + case content = 0x04 + case authorSigningKey = 0x05 + case authorNickname = 0x06 + case createdAt = 0x07 + case expiresAt = 0x08 + case flags = 0x09 + case signature = 0x0A + case deletedAt = 0x0B +} + +private enum BoardWireKind: UInt8 { + case post = 0x01 + case tombstone = 0x02 +} + +/// A signed, persistent bulletin-board notice. +struct BoardPostPacket: Equatable { + let postID: Data + /// Empty string scopes the post to the mesh-local board. + let geohash: String + let content: String + let authorSigningKey: Data + let authorNickname: String + let createdAt: UInt64 + let expiresAt: UInt64 + let flags: UInt8 + let signature: Data + + static let urgentFlag: UInt8 = 0x01 + + var isUrgent: Bool { flags & Self.urgentFlag != 0 } + + /// Canonical bytes covered by the Ed25519 signature. Variable-length + /// fields are length-prefixed so no two field combinations can collide. + static func signingBytes( + postID: Data, + geohash: String, + content: String, + authorSigningKey: Data, + authorNickname: String, + createdAt: UInt64, + expiresAt: UInt64, + flags: UInt8 + ) -> Data { + var out = Data() + BoardWireEncoding.appendContext(BoardWireConstants.postSigningContext, to: &out) + out.append(postID) + BoardWireEncoding.appendLengthPrefixed(Data(geohash.utf8), to: &out) + BoardWireEncoding.appendLengthPrefixed(Data(content.utf8), to: &out) + out.append(authorSigningKey) + BoardWireEncoding.appendLengthPrefixed(Data(authorNickname.utf8), to: &out) + BoardWireEncoding.appendUInt64(createdAt, to: &out) + BoardWireEncoding.appendUInt64(expiresAt, to: &out) + out.append(flags) + return out + } + + var signingBytes: Data { + Self.signingBytes( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: authorSigningKey, + authorNickname: authorNickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags + ) + } + + func verifySignature() -> Bool { + BoardWireEncoding.verify(signature: signature, over: signingBytes, publicKey: authorSigningKey) + } +} + +/// A signed deletion marker. Only the author's key can produce one; receivers +/// keep it until the post's original expiry so the delete outruns the post. +struct BoardTombstonePacket: Equatable { + let postID: Data + let authorSigningKey: Data + let deletedAt: UInt64 + let signature: Data + + static func signingBytes(postID: Data, deletedAt: UInt64) -> Data { + var out = Data() + BoardWireEncoding.appendContext(BoardWireConstants.tombstoneSigningContext, to: &out) + out.append(postID) + BoardWireEncoding.appendUInt64(deletedAt, to: &out) + return out + } + + var signingBytes: Data { + Self.signingBytes(postID: postID, deletedAt: deletedAt) + } + + func verifySignature() -> Bool { + BoardWireEncoding.verify(signature: signature, over: signingBytes, publicKey: authorSigningKey) + } +} + +/// Decoded board payload: either a live post or a tombstone. +enum BoardWire: Equatable { + case post(BoardPostPacket) + case tombstone(BoardTombstonePacket) + + func encode() -> Data { + var out = Data() + func putTLV(_ t: BoardTLVType, _ v: Data) { + out.append(t.rawValue) + let len = UInt16(v.count) + out.append(UInt8((len >> 8) & 0xFF)) + out.append(UInt8(len & 0xFF)) + out.append(v) + } + switch self { + case .post(let post): + putTLV(.kind, Data([BoardWireKind.post.rawValue])) + putTLV(.postID, post.postID) + putTLV(.geohash, Data(post.geohash.utf8)) + putTLV(.content, Data(post.content.utf8)) + putTLV(.authorSigningKey, post.authorSigningKey) + putTLV(.authorNickname, Data(post.authorNickname.utf8)) + putTLV(.createdAt, BoardWireEncoding.uint64Data(post.createdAt)) + putTLV(.expiresAt, BoardWireEncoding.uint64Data(post.expiresAt)) + putTLV(.flags, Data([post.flags])) + putTLV(.signature, post.signature) + case .tombstone(let tombstone): + putTLV(.kind, Data([BoardWireKind.tombstone.rawValue])) + putTLV(.postID, tombstone.postID) + putTLV(.authorSigningKey, tombstone.authorSigningKey) + putTLV(.deletedAt, BoardWireEncoding.uint64Data(tombstone.deletedAt)) + putTLV(.signature, tombstone.signature) + } + return out + } + + /// Structural decode; the caller must still verify the signature before + /// ingesting (`verifySignature()`). + static func decode(from data: Data) -> BoardWire? { + var off = data.startIndex + var kind: BoardWireKind? + var postID: Data? + var geohash: String? + var content: String? + var contentBytes = 0 + var authorSigningKey: Data? + var authorNickname: String? + var nicknameBytes = 0 + var createdAt: UInt64? + var expiresAt: UInt64? + var flags: UInt8? + var signature: Data? + var deletedAt: UInt64? + + while off + 3 <= data.endIndex { + let t = data[off]; off += 1 + let len = (Int(data[off]) << 8) | Int(data[off + 1]); off += 2 + guard off + len <= data.endIndex else { return nil } + let v = data.subdata(in: off..<(off + len)); off += len + switch BoardTLVType(rawValue: t) { + case .kind: + guard v.count == 1 else { return nil } + kind = BoardWireKind(rawValue: v[v.startIndex]) + case .postID: + guard v.count == BoardWireConstants.postIDLength else { return nil } + postID = v + case .geohash: + guard v.count <= BoardWireConstants.geohashMaxLength else { return nil } + geohash = String(data: v, encoding: .utf8) + case .content: + guard v.count <= BoardWireConstants.contentMaxBytes else { return nil } + contentBytes = v.count + content = String(data: v, encoding: .utf8) + case .authorSigningKey: + guard v.count == BoardWireConstants.signingKeyLength else { return nil } + authorSigningKey = v + case .authorNickname: + guard v.count <= BoardWireConstants.nicknameMaxBytes else { return nil } + nicknameBytes = v.count + authorNickname = String(data: v, encoding: .utf8) + case .createdAt: + createdAt = BoardWireEncoding.uint64(from: v) + case .expiresAt: + expiresAt = BoardWireEncoding.uint64(from: v) + case .flags: + guard v.count == 1 else { return nil } + flags = v[v.startIndex] + case .signature: + guard v.count == BoardWireConstants.signatureLength else { return nil } + signature = v + case .deletedAt: + deletedAt = BoardWireEncoding.uint64(from: v) + case nil: + continue // forward compatible; ignore unknown TLVs + } + } + + guard let postID, let authorSigningKey, let signature else { return nil } + + switch kind { + case .post: + guard let geohash, let content, let authorNickname, + let createdAt, let expiresAt, let flags, + contentBytes >= 1, + nicknameBytes <= BoardWireConstants.nicknameMaxBytes, + isValidGeohashField(geohash), + expiresAt > createdAt, + expiresAt - createdAt <= BoardWireConstants.maxLifetimeMs else { + return nil + } + return .post(BoardPostPacket( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: authorSigningKey, + authorNickname: authorNickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags, + signature: signature + )) + case .tombstone: + guard let deletedAt else { return nil } + return .tombstone(BoardTombstonePacket( + postID: postID, + authorSigningKey: authorSigningKey, + deletedAt: deletedAt, + signature: signature + )) + case nil: + return nil + } + } + + func verifySignature() -> Bool { + switch self { + case .post(let post): return post.verifySignature() + case .tombstone(let tombstone): return tombstone.verifySignature() + } + } + + /// Cheap TLV peek for relay policy: is this payload an urgent post? + /// Avoids a full decode on the hot relay path. + static func urgentFlag(in data: Data) -> Bool { + var off = data.startIndex + while off + 3 <= data.endIndex { + let t = data[off]; off += 1 + let len = (Int(data[off]) << 8) | Int(data[off + 1]); off += 2 + guard off + len <= data.endIndex else { return false } + if t == BoardTLVType.flags.rawValue, len == 1 { + return data[off] & BoardPostPacket.urgentFlag != 0 + } + off += len + } + return false + } + + /// Empty geohash = mesh-local board; otherwise 1-12 chars of the geohash + /// base32 alphabet. + private static func isValidGeohashField(_ geohash: String) -> Bool { + geohash.isEmpty || geohash.allSatisfy { BoardWireConstants.geohashAlphabet.contains($0) } + } +} + +enum BoardWireEncoding { + static func appendContext(_ context: String, to out: inout Data) { + let bytes = Data(context.utf8) + out.append(UInt8(min(bytes.count, 255))) + out.append(bytes.prefix(255)) + } + + static func appendLengthPrefixed(_ value: Data, to out: inout Data) { + let len = UInt16(min(value.count, Int(UInt16.max))) + out.append(UInt8((len >> 8) & 0xFF)) + out.append(UInt8(len & 0xFF)) + out.append(value.prefix(Int(UInt16.max))) + } + + static func appendUInt64(_ value: UInt64, to out: inout Data) { + var be = value.bigEndian + withUnsafeBytes(of: &be) { out.append(contentsOf: $0) } + } + + static func uint64Data(_ value: UInt64) -> Data { + var out = Data() + appendUInt64(value, to: &out) + return out + } + + static func uint64(from data: Data) -> UInt64? { + guard data.count == 8 else { return nil } + var value: UInt64 = 0 + for byte in data { value = (value << 8) | UInt64(byte) } + return value + } + + static func verify(signature: Data, over message: Data, publicKey: Data) -> Bool { + guard let key = try? Curve25519.Signing.PublicKey(rawRepresentation: publicKey) else { + return false + } + return key.isValidSignature(signature, for: message) + } +} diff --git a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift index 18b144d2..7c23725f 100644 --- a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift +++ b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift @@ -12,7 +12,7 @@ enum BLEOutboundPacketPolicy { switch MessageType(rawValue: packetType) { case .noiseEncrypted, .noiseHandshake: return true - case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope: + case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .boardPost: return false } } diff --git a/bitchat/Services/BLE/BLEReceivePipeline.swift b/bitchat/Services/BLE/BLEReceivePipeline.swift index 71aacbaf..02fe152a 100644 --- a/bitchat/Services/BLE/BLEReceivePipeline.swift +++ b/bitchat/Services/BLE/BLEReceivePipeline.swift @@ -58,6 +58,10 @@ struct BLEReceivePipeline { isHandshake: packet.type == MessageType.noiseHandshake.rawValue, isAnnounce: packet.type == MessageType.announce.rawValue, isRequestSync: packet.type == MessageType.requestSync.rawValue, + // Board posts relay like broadcast messages; urgent ones get the + // announce-class TTL headroom so alerts travel the extra hop. + isUrgentBoardPost: packet.type == MessageType.boardPost.rawValue + && BoardWire.urgentFlag(in: packet.payload), degree: degree, highDegreeThreshold: highDegreeThreshold ) diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index d1ed84f2..598f9821 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -53,6 +53,8 @@ final class BLEService: NSObject { // reject. Injectable for tests; main-actor policy because favorites live // on the main actor. var courierStore: CourierStore = .shared + // Bulletin-board posts this device carries; injectable for tests. + var boardStore: BoardStore = .shared var courierDepositPolicy: @MainActor (Data, Bool) -> CourierDepositTier? = { depositorNoiseKey, isVerifiedPeer in if FavoritesPersistenceService.shared.isMutualFavorite(depositorNoiseKey) { return .favorite } return isVerifiedPeer ? .verified : nil @@ -297,6 +299,14 @@ final class BLEService: NSObject { let archive = meshBackgroundEnabled ? GossipMessageArchive() : nil let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager, archive: archive) manager.delegate = self + // Board posts sync from the board store (their retention owner) so + // deleted/expired posts drop out of rounds immediately. Real sessions + // only, matching the archive: unit tests stay hermetic. + if meshBackgroundEnabled { + manager.boardPacketsProvider = { [weak self] in + self?.boardStore.syncCandidates() ?? [] + } + } // Only start the periodic sync timers when real Bluetooth exists. In unit // tests there is no mesh to sync with, and the periodic sign/broadcast // churn just keeps the process busy and aggravates flaky exit hangs. @@ -3210,6 +3220,10 @@ extension BLEService { case .courierEnvelope: handleCourierEnvelope(packet, from: peerID) + case .boardPost: + // Invalid or deleted posts must not spread; skip the relay step. + guard handleBoardPost(packet, from: senderID) else { return } + case .leave: handleLeave(packet, from: senderID) @@ -3382,6 +3396,63 @@ extension BLEService { ) } + // MARK: - Board (geohash bulletin board) + + /// Validates and stores an incoming board post or tombstone. Returns + /// whether the packet is worth relaying onward. + private func handleBoardPost(_ packet: BitchatPacket, from peerID: PeerID) -> Bool { + guard let wire = BoardWire.decode(from: packet.payload) else { + SecureLogger.warning("⚠️ Malformed board packet from \(peerID.id.prefix(8))…", category: .session) + return false + } + // Posts are self-authenticating: the payload embeds the author's + // Ed25519 key and signature, so verification does not depend on the + // author still being around to announce. + guard wire.verifySignature() else { + if logRateLimiter.shouldLog(key: "board-sig:\(peerID.id)") { + SecureLogger.warning("🚫 Dropping board packet with invalid signature from \(peerID.id.prefix(8))…", category: .security) + } + return false + } + switch boardStore.ingest(wire, packet: packet) { + case .accepted, .duplicate: + return true + case .rejected: + return false + } + } + + /// Broadcasts a pre-signed board payload (post or tombstone) built by the + /// board manager, and ingests it locally so it shows up on our own board + /// and joins gossip sync immediately. + func sendBoardPayload(_ payload: Data) { + guard let wire = BoardWire.decode(from: payload), wire.verifySignature() else { + SecureLogger.error("❌ Refusing to send invalid board payload", category: .session) + return + } + messageQueue.async { [weak self] in + guard let self = self else { return } + let basePacket = BitchatPacket( + type: MessageType.boardPost.rawValue, + senderID: Data(hexString: self.myPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: self.messageTTL + ) + guard let signedPacket = self.noiseService.signPacket(basePacket) else { + SecureLogger.error("❌ Failed to sign board packet", category: .security) + return + } + // Pre-mark our own broadcast as processed to avoid handling a relayed self copy + let dedupID = BLESelfBroadcastTracker.dedupID(for: signedPacket) + self.messageDeduplicator.markProcessed(dedupID) + self.boardStore.ingest(wire, packet: signedPacket) + self.broadcastPacket(signedPacket) + } + } + // Handle REQUEST_SYNC: decode payload and respond with missing packets via sync manager private func handleRequestSync(_ packet: BitchatPacket, from peerID: PeerID) { // REQUEST_SYNC is link-local by design (always sent with ttl 0): a diff --git a/bitchat/Services/Board/BoardManager.swift b/bitchat/Services/Board/BoardManager.swift new file mode 100644 index 00000000..989fda34 --- /dev/null +++ b/bitchat/Services/Board/BoardManager.swift @@ -0,0 +1,165 @@ +// +// BoardManager.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitLogger +import Combine +import Foundation + +/// UI-facing coordinator for the bulletin board: builds and signs posts and +/// tombstones with the device's Noise signing key, hands them to the mesh +/// transport, and mirrors the store's live posts for SwiftUI. +@MainActor +final class BoardManager: ObservableObject { + /// Live posts across all boards, newest state from the store. + @Published private(set) var posts: [BoardPostPacket] = [] + + private let transport: Transport + private let store: BoardStore + private let publishToNostr: (_ content: String, _ geohash: String, _ nickname: String) -> Void + private var cancellable: AnyCancellable? + + init( + transport: Transport, + store: BoardStore = .shared, + publishToNostr: ((String, String, String) -> Void)? = nil + ) { + self.transport = transport + self.store = store + self.publishToNostr = publishToNostr ?? Self.livePublishToNostr + cancellable = store.$postsSnapshot + .receive(on: DispatchQueue.main) + .sink { [weak self] snapshot in + self?.posts = snapshot + } + } + + /// Posts for one board context, urgent first, then newest first. + func posts(forGeohash geohash: String) -> [BoardPostPacket] { + posts + .filter { $0.geohash == geohash } + .sorted { + if $0.isUrgent != $1.isUrgent { return $0.isUrgent } + return $0.createdAt > $1.createdAt + } + } + + func isOwnPost(_ post: BoardPostPacket) -> Bool { + let key = transport.noiseSigningPublicKeyData() + return !key.isEmpty && key == post.authorSigningKey + } + + /// Creates, signs, and broadcasts a board post. Returns false when the + /// content is empty/oversized or signing fails. + @discardableResult + func createPost( + content: String, + geohash: String, + urgent: Bool, + expiryDays: Int, + nickname: String + ) -> Bool { + guard let trimmed = content.trimmedOrNilIfEmpty, + trimmed.utf8.count <= BoardWireConstants.contentMaxBytes else { + return false + } + let signingKey = transport.noiseSigningPublicKeyData() + guard signingKey.count == BoardWireConstants.signingKeyLength else { return false } + + var cleanNickname = nickname + while cleanNickname.utf8.count > BoardWireConstants.nicknameMaxBytes { + cleanNickname.removeLast() + } + let createdAt = UInt64(Date().timeIntervalSince1970 * 1000) + let lifetimeMs = min( + UInt64(max(1, expiryDays)) * 24 * 60 * 60 * 1000, + BoardWireConstants.maxLifetimeMs + ) + let expiresAt = createdAt + lifetimeMs + let flags: UInt8 = urgent ? BoardPostPacket.urgentFlag : 0 + var postID = Data(count: BoardWireConstants.postIDLength) + let status = postID.withUnsafeMutableBytes { buffer -> Int32 in + guard let base = buffer.baseAddress else { return -1 } + return SecRandomCopyBytes(kSecRandomDefault, buffer.count, base) + } + guard status == errSecSuccess else { return false } + + let signingBytes = BoardPostPacket.signingBytes( + postID: postID, + geohash: geohash, + content: trimmed, + authorSigningKey: signingKey, + authorNickname: cleanNickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags + ) + guard let signature = transport.noiseSignData(signingBytes) else { + SecureLogger.error("Board: failed to sign post", category: .session) + return false + } + let post = BoardPostPacket( + postID: postID, + geohash: geohash, + content: trimmed, + authorSigningKey: signingKey, + authorNickname: cleanNickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags, + signature: signature + ) + transport.sendBoardPayload(BoardWire.post(post).encode()) + + // One-way Nostr bridge (v1): geohash posts also go out as kind-1 + // location notes so online users see them. No inbound merge yet. + if !geohash.isEmpty { + publishToNostr(trimmed, geohash, cleanNickname) + } + return true + } + + /// Signs and broadcasts a tombstone for one of our own posts. + @discardableResult + func deletePost(_ post: BoardPostPacket) -> Bool { + guard isOwnPost(post) else { return false } + let deletedAt = UInt64(Date().timeIntervalSince1970 * 1000) + let signingBytes = BoardTombstonePacket.signingBytes(postID: post.postID, deletedAt: deletedAt) + guard let signature = transport.noiseSignData(signingBytes) else { + SecureLogger.error("Board: failed to sign tombstone", category: .session) + return false + } + let tombstone = BoardTombstonePacket( + postID: post.postID, + authorSigningKey: post.authorSigningKey, + deletedAt: deletedAt, + signature: signature + ) + transport.sendBoardPayload(BoardWire.tombstone(tombstone).encode()) + return true + } + + private static func livePublishToNostr(content: String, geohash: String, nickname: String) { + let relays = GeoRelayDirectory.shared.closestRelays(toGeohash: geohash, count: TransportConfig.nostrGeoRelayCount) + guard !relays.isEmpty else { + SecureLogger.debug("Board: no geo relays for \(geohash); skipping Nostr bridge", category: .session) + return + } + do { + let identity = try NostrIdentityBridge().deriveIdentity(forGeohash: geohash) + let event = try NostrProtocol.createGeohashTextNote( + content: content, + geohash: geohash, + senderIdentity: identity, + nickname: nickname + ) + NostrRelayManager.shared.sendEvent(event, to: relays) + } catch { + SecureLogger.error("Board: failed to bridge post to Nostr: \(error)", category: .session) + } + } +} diff --git a/bitchat/Services/Board/BoardStore.swift b/bitchat/Services/Board/BoardStore.swift new file mode 100644 index 00000000..8ffdf7f3 --- /dev/null +++ b/bitchat/Services/Board/BoardStore.swift @@ -0,0 +1,358 @@ +// +// BoardStore.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import Combine +import Foundation + +/// Outcome of feeding a board packet into the store, so the transport can +/// decide whether the packet is still worth relaying. +enum BoardIngestResult { + /// New post or tombstone accepted (or a quota rejected it locally while + /// it remains valid for other devices). + case accepted + /// Already known; nothing changed. + case duplicate + /// Invalid, expired, or deleted; do not relay. + case rejected +} + +/// Persistent storage for bulletin-board posts and their tombstones. +/// +/// Posts are signed public notices designed to outlive chat: they stay on +/// disk until their author-chosen expiry (max 7 days) and re-enter gossip +/// sync after a restart. Tombstones are retained until the deleted post's +/// original expiry so the delete keeps outrunning stale copies of the post. +/// +/// The on-disk format is the raw signed packets themselves (like +/// `GossipMessageArchive`); state is rebuilt by re-verifying and re-ingesting +/// them on launch. Wiped on panic. +final class BoardStore { + enum Limits { + static let maxPosts = 200 + static let maxPostsPerAuthor = 5 + /// Retention for a tombstone whose post we never saw: we cannot know + /// the original expiry, so cap at the max post lifetime. + static let orphanTombstoneLifetimeMs = BoardWireConstants.maxLifetimeMs + /// Orphan tombstones name posts nobody here has seen, so their volume + /// is entirely sender-controlled; cap them like posts. + static let maxOrphanTombstones = 100 + static let maxOrphanTombstonesPerAuthor = 5 + /// Allowance for clock skew between peers when judging received + /// timestamps against local time. + static let clockSkewMs: UInt64 = 60 * 60 * 1000 + } + + private struct StoredPost { + let post: BoardPostPacket + let packet: BitchatPacket + let rawPacket: Data + } + + private struct StoredTombstone { + let tombstone: BoardTombstonePacket + let packet: BitchatPacket + let rawPacket: Data + let retainUntil: UInt64 + /// True when no matching post was known at ingest time; only these + /// count against the orphan caps. + let isOrphan: Bool + } + + /// On-disk entry: the raw signed packet, plus the retention deadline for + /// tombstones (derived from the deleted post's original expiry, which is + /// no longer recoverable once the post is gone). + private struct PersistedEntry: Codable { + let packet: Data + let retainUntil: UInt64? + } + + static let shared = BoardStore() + + /// Live posts, published on the main thread for the board UI. + @Published private(set) var postsSnapshot: [BoardPostPacket] = [] + + private var posts: [StoredPost] = [] + private var tombstones: [StoredTombstone] = [] + private let queue = DispatchQueue(label: "chat.bitchat.board.store") + private let fileURL: URL? + private let now: () -> Date + + /// - Parameter fileURL: Overrides the on-disk location (tests). Ignored + /// when `persistsToDisk` is false. + init(persistsToDisk: Bool = true, fileURL: URL? = nil, now: @escaping () -> Date = Date.init) { + self.now = now + self.fileURL = persistsToDisk ? (fileURL ?? Self.defaultFileURL()) : nil + loadFromDisk() + } + + // MARK: - Ingest + + /// Ingest a board packet whose payload decodes to `wire`. The caller must + /// have verified the wire signature already (`BoardWire.verifySignature`). + @discardableResult + func ingest(_ wire: BoardWire, packet: BitchatPacket) -> BoardIngestResult { + guard let rawPacket = packet.toBinaryData(padding: false) else { return .rejected } + let nowMs = currentMs() + return queue.sync { + let result = ingestLocked(wire, packet: packet, rawPacket: rawPacket, nowMs: nowMs) + if result == .accepted { + persistLocked() + } + return result + } + } + + // MARK: - Reads + + /// Live posts scoped to one board (geohash, or "" for the mesh board). + func posts(forGeohash geohash: String) -> [BoardPostPacket] { + let nowMs = currentMs() + return queue.sync { + pruneExpiredLocked(nowMs: nowMs) + return posts.map(\.post).filter { $0.geohash == geohash } + } + } + + /// Raw signed packets (posts and live tombstones) for gossip sync rounds. + func syncCandidates() -> [BitchatPacket] { + let nowMs = currentMs() + return queue.sync { + pruneExpiredLocked(nowMs: nowMs) + return posts.map(\.packet) + tombstones.map(\.packet) + } + } + + // MARK: - Maintenance + + func pruneExpired() { + let nowMs = currentMs() + queue.sync { + pruneExpiredLocked(nowMs: nowMs) + persistLocked() + } + } + + /// Panic wipe: drop all board data from memory and disk. + func wipe() { + queue.sync { + posts.removeAll() + tombstones.removeAll() + if let fileURL { + try? FileManager.default.removeItem(at: fileURL) + } + publishSnapshotLocked() + } + } + + // MARK: - Internals (call only on `queue`) + + private func ingestLocked( + _ wire: BoardWire, + packet: BitchatPacket, + rawPacket: Data, + nowMs: UInt64, + retainUntilOverride: UInt64? = nil + ) -> BoardIngestResult { + pruneExpiredLocked(nowMs: nowMs) + switch wire { + case .post(let post): + return ingestPostLocked(post, packet: packet, rawPacket: rawPacket, nowMs: nowMs) + case .tombstone(let tombstone): + return ingestTombstoneLocked(tombstone, packet: packet, rawPacket: rawPacket, nowMs: nowMs, retainUntilOverride: retainUntilOverride) + } + } + + private func ingestPostLocked(_ post: BoardPostPacket, packet: BitchatPacket, rawPacket: Data, nowMs: UInt64) -> BoardIngestResult { + guard post.expiresAt > nowMs else { return .rejected } + // Receive-time sanity (this is the single chokepoint for radio, sync, + // and disk restores): the decoder only enforces the createdAt to + // expiresAt span, so a forged future createdAt would sort ahead of + // honest posts and hold a store slot without ever pruning. + guard post.createdAt <= nowMs &+ Limits.clockSkewMs, + post.expiresAt <= nowMs &+ BoardWireConstants.maxLifetimeMs &+ Limits.clockSkewMs else { + return .rejected + } + if tombstones.contains(where: { $0.tombstone.postID == post.postID && $0.tombstone.authorSigningKey == post.authorSigningKey }) { + return .rejected + } + guard !posts.contains(where: { $0.post.postID == post.postID }) else { return .duplicate } + + posts.append(StoredPost(post: post, packet: packet, rawPacket: rawPacket)) + + // Per-author cap, then global cap; oldest posts are evicted first. + let authorPosts = posts.filter { $0.post.authorSigningKey == post.authorSigningKey } + if authorPosts.count > Limits.maxPostsPerAuthor { + evictOldestLocked(from: authorPosts, keep: Limits.maxPostsPerAuthor) + } + if posts.count > Limits.maxPosts { + evictOldestLocked(from: posts, keep: Limits.maxPosts) + } + publishSnapshotLocked() + // Even when the new post itself was the eviction victim it stays + // valid mesh-wide; peers with room should still receive it. + return .accepted + } + + private func ingestTombstoneLocked( + _ tombstone: BoardTombstonePacket, + packet: BitchatPacket, + rawPacket: Data, + nowMs: UInt64, + retainUntilOverride: UInt64? = nil + ) -> BoardIngestResult { + guard !tombstones.contains(where: { $0.tombstone.postID == tombstone.postID }) else { return .duplicate } + + // Cap retention by both the claimed deletion time (so a doctored file + // cannot pin a tombstone past any legal expiry) and the receive time: + // deletedAt is sender-chosen, so a far-future value must not retain + // the tombstone longer than any post still able to arrive could live. + let maxRetain = min( + tombstone.deletedAt &+ Limits.orphanTombstoneLifetimeMs, + nowMs &+ Limits.orphanTombstoneLifetimeMs &+ Limits.clockSkewMs + ) + let retainUntil: UInt64 + let isOrphan: Bool + if let index = posts.firstIndex(where: { $0.post.postID == tombstone.postID }) { + let target = posts[index].post + // Only the author's key can delete: the tombstone signature was + // already verified against its embedded key, so it suffices to + // require that key to be the post's author key. + guard target.authorSigningKey == tombstone.authorSigningKey else { return .rejected } + retainUntil = target.expiresAt + isOrphan = false + posts.remove(at: index) + publishSnapshotLocked() + } else if let retainUntilOverride { + // Restored from disk: the post is long gone, so trust the + // retention deadline recorded when the delete was first applied. + // Orphans were already capped when first ingested off the air. + retainUntil = min(retainUntilOverride, maxRetain) + isOrphan = false + } else { + // Post unknown (tombstone raced ahead); keep it around so the + // post is suppressed if it arrives later. + retainUntil = maxRetain + isOrphan = true + } + guard retainUntil > nowMs else { return .rejected } + tombstones.append(StoredTombstone(tombstone: tombstone, packet: packet, rawPacket: rawPacket, retainUntil: retainUntil, isOrphan: isOrphan)) + if isOrphan { + enforceOrphanTombstoneCapsLocked(author: tombstone.authorSigningKey) + } + // Like posts, a locally evicted tombstone stays valid mesh-wide. + return .accepted + } + + /// Orphan tombstones reference posts we never saw, so a peer can mint + /// unlimited valid ones for random IDs; bound them per author and + /// globally, evicting the oldest received first (array order). + private func enforceOrphanTombstoneCapsLocked(author: Data) { + let authorOrphans = tombstones.filter { $0.isOrphan && $0.tombstone.authorSigningKey == author } + if authorOrphans.count > Limits.maxOrphanTombstonesPerAuthor { + removeTombstonesLocked(authorOrphans.prefix(authorOrphans.count - Limits.maxOrphanTombstonesPerAuthor)) + } + let orphans = tombstones.filter(\.isOrphan) + if orphans.count > Limits.maxOrphanTombstones { + removeTombstonesLocked(orphans.prefix(orphans.count - Limits.maxOrphanTombstones)) + } + } + + private func removeTombstonesLocked(_ victims: ArraySlice) { + guard !victims.isEmpty else { return } + let victimIDs = Set(victims.map { $0.tombstone.postID }) + tombstones.removeAll { victimIDs.contains($0.tombstone.postID) } + } + + private func evictOldestLocked(from candidates: [StoredPost], keep: Int) { + let victims = candidates + .sorted { $0.post.createdAt < $1.post.createdAt } + .prefix(max(0, candidates.count - keep)) + guard !victims.isEmpty else { return } + let victimIDs = Set(victims.map { $0.post.postID }) + posts.removeAll { victimIDs.contains($0.post.postID) } + } + + private func pruneExpiredLocked(nowMs: UInt64) { + let postsBefore = posts.count + posts.removeAll { $0.post.expiresAt <= nowMs } + tombstones.removeAll { $0.retainUntil <= nowMs } + if posts.count != postsBefore { + publishSnapshotLocked() + } + } + + private func publishSnapshotLocked() { + let snapshot = posts.map(\.post) + DispatchQueue.main.async { [weak self] in + self?.postsSnapshot = snapshot + } + } + + private func currentMs() -> UInt64 { + UInt64(max(0, now().timeIntervalSince1970) * 1000) + } + + // MARK: - Persistence + + private func persistLocked() { + guard let fileURL else { return } + let payloads = posts.map { PersistedEntry(packet: $0.rawPacket, retainUntil: nil) } + + tombstones.map { PersistedEntry(packet: $0.rawPacket, retainUntil: $0.retainUntil) } + do { + if payloads.isEmpty { + try? FileManager.default.removeItem(at: fileURL) + return + } + try FileManager.default.createDirectory( + at: fileURL.deletingLastPathComponent(), + withIntermediateDirectories: true + ) + let data = try JSONEncoder().encode(payloads) + var options: Data.WritingOptions = [.atomic] + #if os(iOS) + options.insert(.completeFileProtection) + #endif + try data.write(to: fileURL, options: options) + } catch { + SecureLogger.error("Failed to persist board store: \(error)", category: .session) + } + } + + private func loadFromDisk() { + guard let fileURL, + let data = try? Data(contentsOf: fileURL), + let payloads = try? JSONDecoder().decode([PersistedEntry].self, from: data) else { + return + } + let nowMs = currentMs() + queue.sync { + for entry in payloads { + guard let packet = BitchatPacket.from(entry.packet), + packet.type == MessageType.boardPost.rawValue, + let wire = BoardWire.decode(from: packet.payload), + wire.verifySignature() else { continue } + _ = ingestLocked(wire, packet: packet, rawPacket: entry.packet, nowMs: nowMs, retainUntilOverride: entry.retainUntil) + } + publishSnapshotLocked() + } + } + + private static func defaultFileURL() -> URL? { + guard let base = try? FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) else { return nil } + return base + .appendingPathComponent("board", isDirectory: true) + .appendingPathComponent("posts.json") + } +} diff --git a/bitchat/Services/RelayController.swift b/bitchat/Services/RelayController.swift index fae850ea..10b4f2c6 100644 --- a/bitchat/Services/RelayController.swift +++ b/bitchat/Services/RelayController.swift @@ -19,6 +19,7 @@ struct RelayController { isHandshake: Bool, isAnnounce: Bool, isRequestSync: Bool = false, + isUrgentBoardPost: Bool = false, degree: Int, highDegreeThreshold: Int) -> RelayDecision { let ttlCap = min(ttl, TransportConfig.messageTTLDefault) @@ -64,7 +65,7 @@ struct RelayController { // - Dense graphs: keep lower but still allow multi-hop bridging // - Thin chains (degree <= 2): every hop counts and flood cost is // minimal, so relay at full incoming depth - // - Announces get a bit more headroom + // - Announces (and urgent board posts) get a bit more headroom let ttlLimit: UInt8 = { if degree >= highDegreeThreshold { return max(UInt8(2), min(ttlCap, UInt8(5))) @@ -72,7 +73,7 @@ struct RelayController { if degree <= 2 { return ttlCap } - let preferred = UInt8(isAnnounce ? 7 : 6) + let preferred = UInt8((isAnnounce || isUrgentBoardPost) ? 7 : 6) return max(UInt8(2), min(ttlCap, preferred)) }() let newTTL = ttlLimit &- 1 diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 27c38700..b02bfdf8 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -124,6 +124,10 @@ protocol Transport: AnyObject { // transport cannot courier (no connected courier, or unsupported). func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool + // Bulletin board (mesh transports only): broadcast a pre-signed board + // payload (post or tombstone) so it spreads over relay and gossip sync. + func sendBoardPayload(_ payload: Data) + // QR verification (optional for transports) func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) @@ -154,6 +158,7 @@ extension Transport { func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { false } + func sendBoardPayload(_ payload: Data) {} func sendFileBroadcast(_ packet: BitchatFilePacket, transferId: String) {} func sendFilePrivate(_ packet: BitchatFilePacket, to peerID: PeerID, transferId: String) {} func cancelTransfer(_ transferId: String) {} diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index f848be7b..2d7118ab 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -76,6 +76,11 @@ final class GossipSyncManager { var fragmentSyncIntervalSeconds: TimeInterval = 30.0 var fileTransferSyncIntervalSeconds: TimeInterval = 60.0 var messageSyncIntervalSeconds: TimeInterval = 15.0 + // Board posts are few but long-lived (days, until each post's own + // expiry), so they get a slow round with their own capacity instead + // of competing with the 15-minute message window. + var boardCapacity: Int = 200 + var boardSyncIntervalSeconds: TimeInterval = 60.0 var responseRateLimitMaxResponses: Int = 8 var responseRateLimitWindowSeconds: TimeInterval = 30.0 } @@ -86,6 +91,12 @@ final class GossipSyncManager { private let archive: GossipMessageArchive? weak var delegate: Delegate? + /// Source of raw signed board packets (posts + tombstones). The board + /// store is the single owner of board retention (expiry, tombstones, + /// caps, persistence), so sync rounds query it instead of keeping a + /// second copy here. Must be thread-safe; set before `start()`. + var boardPacketsProvider: (() -> [BitchatPacket])? + // Storage: broadcast packets by type, and latest announce per sender private var messages = PacketStore() private var fragments = PacketStore() @@ -119,6 +130,9 @@ final class GossipSyncManager { if config.fileTransferCapacity > 0 && config.fileTransferSyncIntervalSeconds > 0 { schedules.append(SyncSchedule(types: .fileTransfer, interval: config.fileTransferSyncIntervalSeconds, lastSent: .distantPast)) } + if config.boardCapacity > 0 && config.boardSyncIntervalSeconds > 0 { + schedules.append(SyncSchedule(types: .board, interval: config.boardSyncIntervalSeconds, lastSent: .distantPast)) + } syncSchedules = schedules if archive != nil { @@ -155,6 +169,9 @@ final class GossipSyncManager { if self.config.fileTransferCapacity > 0 && self.config.fileTransferSyncIntervalSeconds > 0 { types.formUnion(.fileTransfer) } + if self.config.boardCapacity > 0 && self.config.boardSyncIntervalSeconds > 0 && self.boardPacketsProvider != nil { + types.formUnion(.board) + } self.sendRequestSync(to: peerID, types: types) } } @@ -364,6 +381,22 @@ final class GossipSyncManager { } } } + + if requestedTypes.contains(.boardPost) { + // The board store already filters to live posts and tombstones; + // no freshness window applies (posts sync until their own expiry). + let boardPackets = boardPacketsProvider?() ?? [] + for pkt in boardPackets { + if let since, pkt.timestamp < since { continue } + let idBytes = PacketIdUtil.computeId(pkt) + if !mightContain(idBytes) { + var toSend = pkt + toSend.ttl = 0 + toSend.isRSR = true // Mark as solicited response + delegate?.sendPacket(to: peerID, packet: toSend) + } + } + } } // Build REQUEST_SYNC payload using current candidates and GCS params @@ -383,6 +416,9 @@ final class GossipSyncManager { if types.contains(.fileTransfer) { candidates.append(contentsOf: fileTransfers.allPackets(isFresh: isPacketFresh)) } + if types.contains(.boardPost) { + candidates.append(contentsOf: boardPacketsProvider?() ?? []) + } if candidates.isEmpty { let p = GCSFilter.deriveP(targetFpr: config.gcsTargetFpr) let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types) @@ -399,6 +435,8 @@ final class GossipSyncManager { cap = max(1, config.fragmentCapacity) } else if types == .fileTransfer { cap = max(1, config.fileTransferCapacity) + } else if types == .board { + cap = max(1, config.boardCapacity) } else { cap = max(1, config.seenCapacity) } @@ -490,6 +528,9 @@ final class GossipSyncManager { // fragment traffic can't crowd messages out of the filter. for index in syncSchedules.indices { guard syncSchedules[index].interval > 0 else { continue } + // No board source wired up means nothing to offer or store; + // skip the round entirely. + if syncSchedules[index].types == .board && boardPacketsProvider == nil { continue } if syncSchedules[index].lastSent == .distantPast || now.timeIntervalSince(syncSchedules[index].lastSent) >= syncSchedules[index].interval { syncSchedules[index].lastSent = now sendPeriodicSync(for: syncSchedules[index].types) diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index fe796809..f8796e4b 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -36,6 +36,7 @@ struct SyncTypeFlags: OptionSet { case .fragment: return 5 case .requestSync: return 6 case .fileTransfer: return 7 + case .boardPost: return 8 // Courier envelopes are directed deposits between trusted peers and // must never spread via gossip sync. case .courierEnvelope: return nil @@ -52,6 +53,10 @@ struct SyncTypeFlags: OptionSet { case 5: return .fragment case 6: return .requestSync case 7: return .fileTransfer + // Bit 8 spills the encoded bitfield into a second byte. Decoders since + // type-aware sync (#853) accept 1-8 bytes and map unknown bits to no + // known type, so old clients ignore board rounds instead of choking. + case 8: return .boardPost default: return nil } @@ -61,6 +66,7 @@ struct SyncTypeFlags: OptionSet { static let message = SyncTypeFlags(messageTypes: [.message]) static let fragment = SyncTypeFlags(messageTypes: [.fragment]) static let fileTransfer = SyncTypeFlags(messageTypes: [.fileTransfer]) + static let board = SyncTypeFlags(messageTypes: [.boardPost]) static let publicMessages = SyncTypeFlags(messageTypes: [.announce, .message]) diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index d995ecff..ae9ac224 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1208,6 +1208,10 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele GossipMessageArchive.wipeDefault() StoreAndForwardMetrics.shared.reset() + // Drop bulletin-board posts and tombstones (memory and disk); board + // posts are signed with our identity key and persist for days. + BoardStore.shared.wipe() + // Identity manager has cleared persisted identity data above // Clear autocomplete state diff --git a/bitchat/Views/BoardView.swift b/bitchat/Views/BoardView.swift new file mode 100644 index 00000000..8c443847 --- /dev/null +++ b/bitchat/Views/BoardView.swift @@ -0,0 +1,270 @@ +// +// BoardView.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import SwiftUI + +/// The bulletin board for one context: a geohash channel, or the mesh-local +/// board when `geohash` is empty. Urgent posts pin to the top; own posts can +/// be swipe-deleted, which broadcasts a signed tombstone. +struct BoardView: View { + /// Empty string = mesh-local board. + let geohash: String + let senderNickname: String + @ObservedObject var board: BoardManager + + @ThemedPalette private var palette + @Environment(\.dynamicTypeSize) private var dynamicTypeSize + @Environment(\.dismiss) private var dismiss + @State private var draft: String = "" + @State private var urgent = false + @State private var expiryDays = 7 + + private var maxDraftLines: Int { dynamicTypeSize.isAccessibilitySize ? 5 : 3 } + private var posts: [BoardPostPacket] { board.posts(forGeohash: geohash) } + + private enum Strings { + static let boardName = String(localized: "board.title", defaultValue: "board", comment: "Title prefix of the bulletin board sheet") + static let description = String(localized: "board.description", defaultValue: "persistent notices carried by the mesh. posts are signed, spread device-to-device, and expire on their own.", comment: "Explainer under the board sheet title") + static let emptyTitle = String(localized: "board.empty_title", defaultValue: "no notices yet", comment: "Title shown when the board has no posts") + static let emptySubtitle = String(localized: "board.empty_subtitle", defaultValue: "pin the first notice for people around here.", comment: "Subtitle shown when the board has no posts") + static let urgentBadge = String(localized: "board.urgent_badge", defaultValue: "urgent", comment: "Badge shown on urgent board posts") + static let urgentToggle = String(localized: "board.compose.urgent", defaultValue: "urgent", comment: "Label for the urgent toggle in the board composer") + static let placeholder = String(localized: "board.compose.placeholder", defaultValue: "post a notice…", comment: "Placeholder for the board composer text field") + static let send = String(localized: "board.accessibility.post", defaultValue: "Post notice", comment: "Accessibility label for the board post button") + static let deleteAction = String(localized: "board.action.delete", defaultValue: "delete", comment: "Delete action for own board posts") + static let expiryLabel = String(localized: "board.compose.expiry", defaultValue: "expires in", comment: "Label for the board post expiry picker") + static let closeHint = String(localized: "board.accessibility.close", defaultValue: "Close board", comment: "Accessibility label for the board close button") + + static func expiryDaysOption(_ days: Int) -> String { + String( + format: String(localized: "board.compose.expiry_days", defaultValue: "%lldd", comment: "Expiry picker option, number of days abbreviated"), + locale: .current, + days + ) + } + + static func postAccessibilityLabel(author: String, content: String, urgent: Bool) -> String { + let base = String( + format: String(localized: "board.accessibility.post_row", defaultValue: "Notice from %@: %@", comment: "Accessibility label for a board post row"), + locale: .current, + author, content + ) + return urgent ? "\(urgentBadge), \(base)" : base + } + } + + var body: some View { + VStack(spacing: 0) { + headerSection + postList + composer + } + .themedSurface() + #if os(macOS) + .frame(minWidth: 420, idealWidth: 440, minHeight: 620, idealHeight: 680) + #endif + .themedSheetBackground() + } + + private var headerSection: some View { + VStack(alignment: .leading, spacing: 8) { + HStack(spacing: 12) { + Text(verbatim: geohash.isEmpty ? "\(Strings.boardName) @ #mesh" : "\(Strings.boardName) @ #\(geohash)") + .bitchatFont(size: 18) + Spacer() + SheetCloseButton { dismiss() } + .accessibilityLabel(Strings.closeHint) + } + Text(Strings.description) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.horizontal, 16) + .padding(.top, 16) + .padding(.bottom, 12) + .themedSurface() + } + + private var postList: some View { + Group { + if posts.isEmpty { + ScrollView { + VStack(alignment: .leading, spacing: 4) { + Text(Strings.emptyTitle) + .bitchatFont(size: 13, weight: .semibold) + Text(Strings.emptySubtitle) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 16) + .padding(.vertical, 12) + } + } else { + List { + ForEach(posts, id: \.postID) { post in + postRow(post) + .listRowBackground(palette.background) + .listRowSeparatorTint(palette.divider) + } + } + .listStyle(.plain) + .scrollContentBackground(.hidden) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .themedSurface() + } + + private func postRow(_ post: BoardPostPacket) -> some View { + let isOwn = board.isOwnPost(post) + let author = post.authorNickname.trimmedOrNilIfEmpty ?? "anon" + return VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 6) { + if post.isUrgent { + Image(systemName: "exclamationmark.triangle.fill") + .font(.bitchatSystem(size: 11)) + .foregroundColor(palette.alertRed) + Text(Strings.urgentBadge) + .bitchatFont(size: 11, weight: .semibold) + .foregroundColor(palette.alertRed) + } + Text(verbatim: "@\(author)") + .bitchatFont(size: 12, weight: .semibold) + Text(timestampText(forMs: post.createdAt)) + .bitchatFont(size: 11) + .foregroundColor(palette.secondary) + Spacer() + if isOwn { + Button { + board.deletePost(post) + } label: { + Image(systemName: "trash") + .font(.bitchatSystem(size: 12)) + .foregroundColor(palette.secondary) + } + .buttonStyle(.plain) + .accessibilityLabel(Strings.deleteAction) + } + } + Text(post.content) + .bitchatFont(size: 14) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.vertical, 4) + .accessibilityElement(children: .ignore) + .accessibilityLabel(Strings.postAccessibilityLabel(author: author, content: post.content, urgent: post.isUrgent)) + .accessibilityActions { + if isOwn { + Button(Strings.deleteAction) { board.deletePost(post) } + } + } + .swipeActions(edge: .trailing, allowsFullSwipe: false) { + if isOwn { + Button(role: .destructive) { + board.deletePost(post) + } label: { + Label(Strings.deleteAction, systemImage: "trash") + } + } + } + } + + private var composer: some View { + VStack(alignment: .leading, spacing: 8) { + HStack(alignment: .top, spacing: 10) { + TextField(Strings.placeholder, text: $draft, axis: .vertical) + .textFieldStyle(.plain) + .bitchatFont(size: 14) + .lineLimit(maxDraftLines, reservesSpace: true) + .padding(.vertical, 6) + Button(action: send) { + Image(systemName: "arrow.up.circle.fill") + .font(.bitchatSystem(size: 20)) + .foregroundColor(sendEnabled ? palette.accent : .secondary) + } + .padding(.top, 2) + .buttonStyle(.plain) + .disabled(!sendEnabled) + .accessibilityLabel(Strings.send) + } + HStack(spacing: 12) { + Toggle(isOn: $urgent) { + Text(Strings.urgentToggle) + .bitchatFont(size: 12) + .foregroundColor(urgent ? palette.alertRed : palette.secondary) + } + .toggleStyle(.switch) + .fixedSize() + .accessibilityLabel(Strings.urgentToggle) + Spacer() + Text(Strings.expiryLabel) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + Picker(Strings.expiryLabel, selection: $expiryDays) { + ForEach([1, 3, 7], id: \.self) { days in + Text(Strings.expiryDaysOption(days)).tag(days) + } + } + .pickerStyle(.segmented) + .fixedSize() + .accessibilityLabel(Strings.expiryLabel) + } + } + .padding(.horizontal, 16) + .padding(.vertical, 14) + .themedSurface() + .overlay(Divider(), alignment: .top) + } + + private var sendEnabled: Bool { + let trimmed = draft.trimmed + return !trimmed.isEmpty && trimmed.utf8.count <= BoardWireConstants.contentMaxBytes + } + + private func send() { + guard let content = draft.trimmedOrNilIfEmpty else { return } + let sent = board.createPost( + content: content, + geohash: geohash, + urgent: urgent, + expiryDays: expiryDays, + nickname: senderNickname + ) + if sent { + draft = "" + urgent = false + } + } + + private func timestampText(forMs ms: UInt64) -> String { + let date = Date(timeIntervalSince1970: TimeInterval(ms) / 1000) + let now = Date() + if let days = Calendar.current.dateComponents([.day], from: date, to: now).day, days < 7 { + let rel = Self.relativeFormatter.string(from: date, to: now) ?? "" + return rel.isEmpty ? "" : "\(rel) ago" + } + return Self.absDateFormatter.string(from: date) + } + + private static let relativeFormatter: DateComponentsFormatter = { + let f = DateComponentsFormatter() + f.allowedUnits = [.day, .hour, .minute] + f.maximumUnitCount = 1 + f.unitsStyle = .abbreviated + f.collapsesLargestUnit = true + return f + }() + + private static let absDateFormatter: DateFormatter = { + let f = DateFormatter() + f.setLocalizedDateFormatFromTemplate("MMM d") + return f + }() +} diff --git a/bitchat/Views/ContentHeaderView.swift b/bitchat/Views/ContentHeaderView.swift index eb188ed7..3fc2bd82 100644 --- a/bitchat/Views/ContentHeaderView.swift +++ b/bitchat/Views/ContentHeaderView.swift @@ -25,6 +25,9 @@ struct ContentHeaderView: View { /// Courier envelopes this device is carrying for offline third parties. @State private var carriedMailCount = 0 + /// Bulletin board sheet for the current channel context. + @State private var showBoard = false + var body: some View { HStack(spacing: 0) { Text(verbatim: "bitchat/") @@ -139,6 +142,20 @@ struct ContentHeaderView: View { ) } + Button(action: { showBoard = true }) { + Image(systemName: "pin") + .font(.bitchatSystem(size: 12)) + .foregroundColor(palette.secondary.opacity(0.9)) + .headerTapTarget() + } + .buttonStyle(.plain) + .accessibilityLabel( + String(localized: "content.accessibility.board", defaultValue: "Bulletin board", comment: "Accessibility label for the bulletin board button") + ) + .help( + String(localized: "content.header.board", defaultValue: "Bulletin board: persistent notices for this channel", comment: "Tooltip for the bulletin board button") + ) + if case .location(let channel) = locationChannelsModel.selectedChannel { Button(action: { locationChannelsModel.toggleBookmark(channel.geohash) }) { Image(systemName: locationChannelsModel.isBookmarked(channel.geohash) ? "bookmark.fill" : "bookmark") @@ -242,6 +259,13 @@ struct ContentHeaderView: View { .environmentObject(locationChannelsModel) .environmentObject(peerListModel) } + .sheet(isPresented: $showBoard) { + BoardView( + geohash: boardGeohash, + senderNickname: appChromeModel.nickname, + board: appChromeModel.boardManager + ) + } .sheet(isPresented: $showLocationNotes, onDismiss: { notesGeohash = nil }) { @@ -311,6 +335,15 @@ private extension ContentHeaderView { dynamicTypeSize.isAccessibilitySize ? 2 : 1 } + /// The board scope for the current channel: the geohash channel's board, + /// or the mesh-local board ("") in mesh chat. + var boardGeohash: String { + if case .location(let channel) = locationChannelsModel.selectedChannel { + return channel.geohash + } + return "" + } + /// Whether anyone is actually reachable on the current channel — the /// state the count icon's color encodes visually. var headerPeersReachable: Bool { diff --git a/bitchatTests/Protocols/BoardPacketsTests.swift b/bitchatTests/Protocols/BoardPacketsTests.swift new file mode 100644 index 00000000..9e1ff450 --- /dev/null +++ b/bitchatTests/Protocols/BoardPacketsTests.swift @@ -0,0 +1,211 @@ +// +// BoardPacketsTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import CryptoKit +import Foundation +import Testing +@testable import bitchat + +struct BoardPacketsTests { + + private let authorKey = Curve25519.Signing.PrivateKey() + + private func makeSignedPost( + geohash: String = "9q8yy", + content: String = "water point at the north gate", + nickname: String = "ranger", + createdAt: UInt64 = 1_700_000_000_000, + lifetimeMs: UInt64 = 24 * 60 * 60 * 1000, + flags: UInt8 = 0, + signWith key: Curve25519.Signing.PrivateKey? = nil, + claimKey: Data? = nil + ) throws -> BoardPostPacket { + let signer = key ?? authorKey + let publicKey = claimKey ?? signer.publicKey.rawRepresentation + let postID = Data((0..<16).map { _ in UInt8.random(in: 0...255) }) + let expiresAt = createdAt + lifetimeMs + let signingBytes = BoardPostPacket.signingBytes( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: publicKey, + authorNickname: nickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags + ) + let signature = try signer.signature(for: signingBytes) + return BoardPostPacket( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: publicKey, + authorNickname: nickname, + createdAt: createdAt, + expiresAt: expiresAt, + flags: flags, + signature: signature + ) + } + + private func makeSignedTombstone( + postID: Data, + deletedAt: UInt64 = 1_700_000_100_000, + signWith key: Curve25519.Signing.PrivateKey? = nil, + claimKey: Data? = nil + ) throws -> BoardTombstonePacket { + let signer = key ?? authorKey + let publicKey = claimKey ?? signer.publicKey.rawRepresentation + let signature = try signer.signature(for: BoardTombstonePacket.signingBytes(postID: postID, deletedAt: deletedAt)) + return BoardTombstonePacket( + postID: postID, + authorSigningKey: publicKey, + deletedAt: deletedAt, + signature: signature + ) + } + + // MARK: - Round trips + + @Test func postRoundTrip() throws { + let post = try makeSignedPost(flags: BoardPostPacket.urgentFlag) + let encoded = BoardWire.post(post).encode() + let decoded = try #require(BoardWire.decode(from: encoded)) + #expect(decoded == .post(post)) + #expect(decoded.verifySignature()) + guard case .post(let roundTripped) = decoded else { + Issue.record("expected a post") + return + } + #expect(roundTripped.isUrgent) + #expect(roundTripped.geohash == "9q8yy") + } + + @Test func meshLocalPostRoundTrip() throws { + let post = try makeSignedPost(geohash: "") + let decoded = try #require(BoardWire.decode(from: BoardWire.post(post).encode())) + #expect(decoded == .post(post)) + #expect(decoded.verifySignature()) + } + + @Test func tombstoneRoundTrip() throws { + let post = try makeSignedPost() + let tombstone = try makeSignedTombstone(postID: post.postID) + let encoded = BoardWire.tombstone(tombstone).encode() + let decoded = try #require(BoardWire.decode(from: encoded)) + #expect(decoded == .tombstone(tombstone)) + #expect(decoded.verifySignature()) + } + + // MARK: - Signature verification + + @Test func forgedPostSignatureFailsVerification() throws { + // Signed by an attacker's key but claiming the victim's key as author. + let attacker = Curve25519.Signing.PrivateKey() + let victim = Curve25519.Signing.PrivateKey() + let forged = try makeSignedPost(signWith: attacker, claimKey: victim.publicKey.rawRepresentation) + let decoded = try #require(BoardWire.decode(from: BoardWire.post(forged).encode())) + #expect(!decoded.verifySignature()) + } + + @Test func tamperedContentFailsVerification() throws { + let post = try makeSignedPost(content: "meet at noon") + let tampered = BoardPostPacket( + postID: post.postID, + geohash: post.geohash, + content: "meet at midnight", + authorSigningKey: post.authorSigningKey, + authorNickname: post.authorNickname, + createdAt: post.createdAt, + expiresAt: post.expiresAt, + flags: post.flags, + signature: post.signature + ) + let decoded = try #require(BoardWire.decode(from: BoardWire.post(tampered).encode())) + #expect(!decoded.verifySignature()) + } + + @Test func forgedTombstoneSignatureFailsVerification() throws { + let post = try makeSignedPost() + let attacker = Curve25519.Signing.PrivateKey() + let forged = try makeSignedTombstone( + postID: post.postID, + signWith: attacker, + claimKey: post.authorSigningKey + ) + let decoded = try #require(BoardWire.decode(from: BoardWire.tombstone(forged).encode())) + #expect(!decoded.verifySignature()) + } + + // MARK: - Decode validation + + @Test func rejectsExpiryBeyondSevenDays() throws { + let tooLong = try makeSignedPost(lifetimeMs: BoardWireConstants.maxLifetimeMs + 1) + #expect(BoardWire.decode(from: BoardWire.post(tooLong).encode()) == nil) + + let exactlySevenDays = try makeSignedPost(lifetimeMs: BoardWireConstants.maxLifetimeMs) + #expect(BoardWire.decode(from: BoardWire.post(exactlySevenDays).encode()) != nil) + } + + @Test func rejectsExpiryBeforeCreation() throws { + let post = try makeSignedPost() + let inverted = BoardPostPacket( + postID: post.postID, + geohash: post.geohash, + content: post.content, + authorSigningKey: post.authorSigningKey, + authorNickname: post.authorNickname, + createdAt: post.expiresAt, + expiresAt: post.createdAt, + flags: post.flags, + signature: post.signature + ) + #expect(BoardWire.decode(from: BoardWire.post(inverted).encode()) == nil) + } + + @Test func rejectsOversizedContent() throws { + let oversized = try makeSignedPost(content: String(repeating: "x", count: BoardWireConstants.contentMaxBytes + 1)) + #expect(BoardWire.decode(from: BoardWire.post(oversized).encode()) == nil) + + let maxed = try makeSignedPost(content: String(repeating: "x", count: BoardWireConstants.contentMaxBytes)) + #expect(BoardWire.decode(from: BoardWire.post(maxed).encode()) != nil) + } + + @Test func rejectsInvalidGeohashCharacters() throws { + let invalid = try makeSignedPost(geohash: "9q8yA") // "A" is outside base32 + #expect(BoardWire.decode(from: BoardWire.post(invalid).encode()) == nil) + } + + @Test func toleratesUnknownTLVs() throws { + let post = try makeSignedPost() + var encoded = BoardWire.post(post).encode() + // Append an unknown TLV; decoders must skip it. + encoded.append(contentsOf: [0x7F, 0x00, 0x02, 0xDE, 0xAD]) + let decoded = try #require(BoardWire.decode(from: encoded)) + #expect(decoded == .post(post)) + #expect(decoded.verifySignature()) + } + + @Test func rejectsTruncatedPayload() throws { + let post = try makeSignedPost() + let encoded = BoardWire.post(post).encode() + #expect(BoardWire.decode(from: encoded.prefix(encoded.count - 1)) == nil) + } + + // MARK: - Urgent flag peek + + @Test func urgentFlagPeekMatchesFullDecode() throws { + let urgent = try makeSignedPost(flags: BoardPostPacket.urgentFlag) + let calm = try makeSignedPost() + let tombstone = try makeSignedTombstone(postID: calm.postID) + #expect(BoardWire.urgentFlag(in: BoardWire.post(urgent).encode())) + #expect(!BoardWire.urgentFlag(in: BoardWire.post(calm).encode())) + #expect(!BoardWire.urgentFlag(in: BoardWire.tombstone(tombstone).encode())) + #expect(!BoardWire.urgentFlag(in: Data())) + } +} diff --git a/bitchatTests/Services/BoardStoreTests.swift b/bitchatTests/Services/BoardStoreTests.swift new file mode 100644 index 00000000..d501de39 --- /dev/null +++ b/bitchatTests/Services/BoardStoreTests.swift @@ -0,0 +1,385 @@ +// +// BoardStoreTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import CryptoKit +import Foundation +import Testing +@testable import bitchat + +struct BoardStoreTests { + + private final class MutableClock: @unchecked Sendable { + var now: Date + init(now: Date) { self.now = now } + } + + private let baseDate = Date(timeIntervalSince1970: 1_700_000_000) + private var baseMs: UInt64 { UInt64(baseDate.timeIntervalSince1970 * 1000) } + + private func makeStore(clock: MutableClock, fileURL: URL? = nil) -> BoardStore { + BoardStore(persistsToDisk: fileURL != nil, fileURL: fileURL, now: { clock.now }) + } + + private func tempFileURL() -> URL { + FileManager.default.temporaryDirectory + .appendingPathComponent("board-store-\(UUID().uuidString).json") + } + + private func makePost( + author: Curve25519.Signing.PrivateKey, + geohash: String = "9q8yy", + content: String = "note", + createdAt: UInt64, + lifetimeMs: UInt64 = 24 * 60 * 60 * 1000 + ) throws -> (wire: BoardWire, packet: BitchatPacket, post: BoardPostPacket) { + let postID = Data((0..<16).map { _ in UInt8.random(in: 0...255) }) + let key = author.publicKey.rawRepresentation + let expiresAt = createdAt + lifetimeMs + let signingBytes = BoardPostPacket.signingBytes( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: key, + authorNickname: "tester", + createdAt: createdAt, + expiresAt: expiresAt, + flags: 0 + ) + let post = BoardPostPacket( + postID: postID, + geohash: geohash, + content: content, + authorSigningKey: key, + authorNickname: "tester", + createdAt: createdAt, + expiresAt: expiresAt, + flags: 0, + signature: try author.signature(for: signingBytes) + ) + let wire = BoardWire.post(post) + return (wire, makePacket(payload: wire.encode(), timestamp: createdAt), post) + } + + private func makeTombstone( + for post: BoardPostPacket, + author: Curve25519.Signing.PrivateKey, + deletedAt: UInt64, + claimKey: Data? = nil + ) throws -> (wire: BoardWire, packet: BitchatPacket) { + let tombstone = BoardTombstonePacket( + postID: post.postID, + authorSigningKey: claimKey ?? author.publicKey.rawRepresentation, + deletedAt: deletedAt, + signature: try author.signature(for: BoardTombstonePacket.signingBytes(postID: post.postID, deletedAt: deletedAt)) + ) + let wire = BoardWire.tombstone(tombstone) + return (wire, makePacket(payload: wire.encode(), timestamp: deletedAt)) + } + + private func makePacket(payload: Data, timestamp: UInt64) -> BitchatPacket { + BitchatPacket( + type: MessageType.boardPost.rawValue, + senderID: Data((0..<8).map { _ in UInt8.random(in: 0...255) }), + recipientID: nil, + timestamp: timestamp, + payload: payload, + signature: nil, + ttl: 7 + ) + } + + // MARK: - Ingest basics + + @Test func ingestStoresAndDeduplicates() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs) + + #expect(store.ingest(entry.wire, packet: entry.packet) == .accepted) + #expect(store.ingest(entry.wire, packet: entry.packet) == .duplicate) + #expect(store.posts(forGeohash: "9q8yy").count == 1) + #expect(store.posts(forGeohash: "").isEmpty) + #expect(store.syncCandidates().count == 1) + } + + @Test func rejectsAlreadyExpiredPost() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs - 2 * 60 * 60 * 1000, lifetimeMs: 60 * 60 * 1000) + + #expect(store.ingest(entry.wire, packet: entry.packet) == .rejected) + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + } + + // MARK: - Receive-time timestamp policy + + @Test func rejectsPostCreatedBeyondClockSkew() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs + BoardStore.Limits.clockSkewMs + 60 * 1000) + + #expect(store.ingest(entry.wire, packet: entry.packet) == .rejected) + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + } + + @Test func acceptsPostCreatedWithinClockSkew() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs + BoardStore.Limits.clockSkewMs - 60 * 1000) + + #expect(store.ingest(entry.wire, packet: entry.packet) == .accepted) + #expect(store.posts(forGeohash: "9q8yy").count == 1) + } + + @Test func rejectsPostExpiringTooFarInTheFuture() throws { + // Builds the wire directly, bypassing the decoder's span check, to + // exercise the ingest-level expiresAt bound on its own. + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs, lifetimeMs: 30 * 24 * 60 * 60 * 1000) + + #expect(store.ingest(entry.wire, packet: entry.packet) == .rejected) + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + } + + // MARK: - Caps and eviction + + @Test func perAuthorCapEvictsOldest() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + + var oldestID: Data? + for index in 0..<(BoardStore.Limits.maxPostsPerAuthor + 1) { + let entry = try makePost(author: author, createdAt: baseMs + UInt64(index) * 1000) + if index == 0 { oldestID = entry.post.postID } + #expect(store.ingest(entry.wire, packet: entry.packet) == .accepted) + } + + let posts = store.posts(forGeohash: "9q8yy") + #expect(posts.count == BoardStore.Limits.maxPostsPerAuthor) + #expect(!posts.contains { $0.postID == oldestID }) + } + + @Test func globalCapEvictsOldest() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + + var oldestID: Data? + var author = Curve25519.Signing.PrivateKey() + for index in 0..<(BoardStore.Limits.maxPosts + 1) { + if index % BoardStore.Limits.maxPostsPerAuthor == 0 { + author = Curve25519.Signing.PrivateKey() + } + let entry = try makePost(author: author, createdAt: baseMs + UInt64(index) * 1000) + if index == 0 { oldestID = entry.post.postID } + #expect(store.ingest(entry.wire, packet: entry.packet) == .accepted) + } + + let posts = store.posts(forGeohash: "9q8yy") + #expect(posts.count == BoardStore.Limits.maxPosts) + #expect(!posts.contains { $0.postID == oldestID }) + } + + // MARK: - Expiry sweep + + @Test func expiredPostsAreSwept() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let shortLived = try makePost(author: author, createdAt: baseMs, lifetimeMs: 60 * 60 * 1000) + let longLived = try makePost(author: author, createdAt: baseMs, lifetimeMs: 48 * 60 * 60 * 1000) + store.ingest(shortLived.wire, packet: shortLived.packet) + store.ingest(longLived.wire, packet: longLived.packet) + #expect(store.posts(forGeohash: "9q8yy").count == 2) + + clock.now = baseDate.addingTimeInterval(2 * 60 * 60) // 2h later + let remaining = store.posts(forGeohash: "9q8yy") + #expect(remaining.count == 1) + #expect(remaining.first?.postID == longLived.post.postID) + #expect(store.syncCandidates().count == 1) + } + + // MARK: - Tombstones + + @Test func tombstoneDeletesPostAndPropagatesUntilOriginalExpiry() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs, lifetimeMs: 24 * 60 * 60 * 1000) + store.ingest(entry.wire, packet: entry.packet) + + let tombstone = try makeTombstone(for: entry.post, author: author, deletedAt: baseMs + 1000) + #expect(store.ingest(tombstone.wire, packet: tombstone.packet) == .accepted) + + // Post is gone, tombstone still syncs so the delete propagates. + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + #expect(store.syncCandidates().count == 1) + + // Replayed copy of the deleted post is refused. + #expect(store.ingest(entry.wire, packet: entry.packet) == .rejected) + + // After the post's original expiry the tombstone is dropped too. + clock.now = baseDate.addingTimeInterval(25 * 60 * 60) + #expect(store.syncCandidates().isEmpty) + } + + @Test func tombstoneFromWrongKeyIsRejected() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let attacker = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs) + store.ingest(entry.wire, packet: entry.packet) + + // Attacker signs with their own key (self-consistent wire, so it + // passes signature verification) but targets the victim's post. + let forged = try makeTombstone(for: entry.post, author: attacker, deletedAt: baseMs + 1000) + #expect(store.ingest(forged.wire, packet: forged.packet) == .rejected) + #expect(store.posts(forGeohash: "9q8yy").count == 1) + } + + @Test func tombstoneArrivingBeforePostSuppressesIt() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs) + + let tombstone = try makeTombstone(for: entry.post, author: author, deletedAt: baseMs + 1000) + #expect(store.ingest(tombstone.wire, packet: tombstone.packet) == .accepted) + #expect(store.ingest(entry.wire, packet: entry.packet) == .rejected) + #expect(store.posts(forGeohash: "9q8yy").isEmpty) + } + + @Test func orphanTombstoneRetentionIsBoundedByReceiveTime() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + let entry = try makePost(author: author, createdAt: baseMs) // never ingested + + // Attacker-chosen far-future deletedAt must not extend retention. + let farFuture = baseMs + 365 * 24 * 60 * 60 * 1000 + let tombstone = try makeTombstone(for: entry.post, author: author, deletedAt: farFuture) + #expect(store.ingest(tombstone.wire, packet: tombstone.packet) == .accepted) + #expect(store.syncCandidates().count == 1) + + // No post can outlive 7 days from receipt, so neither may an orphan + // tombstone (plus skew allowance). + clock.now = baseDate.addingTimeInterval(8 * 24 * 60 * 60) + #expect(store.syncCandidates().isEmpty) + } + + @Test func orphanTombstonePerAuthorCapEvictsOldest() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + + var unseenPosts: [(wire: BoardWire, packet: BitchatPacket, post: BoardPostPacket)] = [] + for index in 0..<(BoardStore.Limits.maxOrphanTombstonesPerAuthor + 1) { + let entry = try makePost(author: author, createdAt: baseMs + UInt64(index)) + unseenPosts.append(entry) + let tombstone = try makeTombstone(for: entry.post, author: author, deletedAt: baseMs + 1000) + #expect(store.ingest(tombstone.wire, packet: tombstone.packet) == .accepted) + } + + #expect(store.syncCandidates().count == BoardStore.Limits.maxOrphanTombstonesPerAuthor) + // The oldest orphan was evicted, so its post is no longer suppressed… + #expect(store.ingest(unseenPosts[0].wire, packet: unseenPosts[0].packet) == .accepted) + // …while the surviving orphans still suppress theirs. + #expect(store.ingest(unseenPosts[1].wire, packet: unseenPosts[1].packet) == .rejected) + } + + @Test func orphanTombstoneGlobalCapEvictsOldest() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + + var author = Curve25519.Signing.PrivateKey() + for index in 0..<(BoardStore.Limits.maxOrphanTombstones + 1) { + if index % BoardStore.Limits.maxOrphanTombstonesPerAuthor == 0 { + author = Curve25519.Signing.PrivateKey() + } + let entry = try makePost(author: author, createdAt: baseMs + UInt64(index)) + let tombstone = try makeTombstone(for: entry.post, author: author, deletedAt: baseMs + 1000) + #expect(store.ingest(tombstone.wire, packet: tombstone.packet) == .accepted) + } + + #expect(store.syncCandidates().count == BoardStore.Limits.maxOrphanTombstones) + } + + @Test func matchedTombstonesAreExemptFromOrphanCaps() throws { + let clock = MutableClock(now: baseDate) + let store = makeStore(clock: clock) + let author = Curve25519.Signing.PrivateKey() + + // Post-then-delete more times than the per-author orphan cap; every + // tombstone matched a live post, so none may be evicted. + let cycles = BoardStore.Limits.maxOrphanTombstonesPerAuthor + 2 + for index in 0.. +// + +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +/// Board posts ride gossip sync through a provider that queries the board +/// store, so retention (expiry, tombstones, caps) has a single owner. +struct GossipSyncBoardTests { + + private let myPeerID = PeerID(str: "0102030405060708") + + private func makeBoardPacket(timestamp: UInt64) throws -> BitchatPacket { + BitchatPacket( + type: MessageType.boardPost.rawValue, + senderID: try #require(Data(hexString: "aabbccddeeff0011")), + recipientID: nil, + timestamp: timestamp, + payload: Data([0x42]), + signature: nil, + ttl: 7 + ) + } + + private func quietConfig() -> GossipSyncManager.Config { + var config = GossipSyncManager.Config() + config.messageSyncIntervalSeconds = 0 + config.fragmentSyncIntervalSeconds = 0 + config.fileTransferSyncIntervalSeconds = 0 + return config + } + + @Test func boardRequestIsServedFromProvider() async throws { + let manager = GossipSyncManager(myPeerID: myPeerID, config: quietConfig(), requestSyncManager: RequestSyncManager()) + let delegate = RecordingBoardDelegate() + manager.delegate = delegate + let boardPacket = try makeBoardPacket(timestamp: UInt64(Date().timeIntervalSince1970 * 1000)) + manager.boardPacketsProvider = { return [boardPacket] } + + let request = RequestSyncPacket(p: 4, m: 1, data: Data(), types: .board) + manager.handleRequestSync(from: PeerID(str: "FFFFFFFFFFFFFFFF"), request: request) + + try await TestHelpers.waitFor({ delegate.packets.count == 1 }, timeout: TestConstants.shortTimeout) + let sent = try #require(delegate.packets.first) + #expect(sent.type == MessageType.boardPost.rawValue) + #expect(sent.isRSR) + } + + @Test func nonBoardRequestDoesNotServeBoardPackets() async throws { + let manager = GossipSyncManager(myPeerID: myPeerID, config: quietConfig(), requestSyncManager: RequestSyncManager()) + let delegate = RecordingBoardDelegate() + manager.delegate = delegate + let boardPacket = try makeBoardPacket(timestamp: UInt64(Date().timeIntervalSince1970 * 1000)) + manager.boardPacketsProvider = { return [boardPacket] } + + let request = RequestSyncPacket(p: 4, m: 1, data: Data(), types: .publicMessages) + manager.handleRequestSync(from: PeerID(str: "FFFFFFFFFFFFFFFF"), request: request) + + // Follow with a board request; only its response should arrive, which + // also proves the first request produced nothing. + let boardRequest = RequestSyncPacket(p: 4, m: 1, data: Data(), types: .board) + manager.handleRequestSync(from: PeerID(str: "FFFFFFFFFFFFFFFF"), request: boardRequest) + + try await TestHelpers.waitFor({ delegate.packets.count == 1 }, timeout: TestConstants.shortTimeout) + #expect(delegate.packets.count == 1) + #expect(delegate.packets.first?.type == MessageType.boardPost.rawValue) + } + + @Test func maintenanceEmitsBoardRoundOnlyWithProvider() throws { + var config = quietConfig() + config.boardSyncIntervalSeconds = 1 + + // Without a provider the board schedule stays silent. + let unwired = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: RequestSyncManager()) + let unwiredDelegate = RecordingBoardDelegate() + unwired.delegate = unwiredDelegate + unwired._performMaintenanceSynchronously(now: Date()) + #expect(unwiredDelegate.packets.isEmpty) + + // With a provider, maintenance sends a board-typed request. + let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: RequestSyncManager()) + let delegate = RecordingBoardDelegate() + manager.delegate = delegate + manager.boardPacketsProvider = { return [] } + manager._performMaintenanceSynchronously(now: Date()) + + #expect(delegate.packets.count == 1) + let payload = try #require(delegate.packets.first?.payload) + let request = try #require(RequestSyncPacket.decode(from: payload)) + #expect(request.types == .board) + } +} + +private final class RecordingBoardDelegate: GossipSyncManager.Delegate { + private let lock = NSLock() + private var _packets: [BitchatPacket] = [] + + var packets: [BitchatPacket] { + lock.lock() + defer { lock.unlock() } + return _packets + } + + func sendPacket(_ packet: BitchatPacket) { + lock.lock() + _packets.append(packet) + lock.unlock() + } + + func sendPacket(to peerID: PeerID, packet: BitchatPacket) { + lock.lock() + _packets.append(packet) + lock.unlock() + } + + func signPacketForBroadcast(_ packet: BitchatPacket) -> BitchatPacket { + packet + } + + func getConnectedPeers() -> [PeerID] { + [] + } +} diff --git a/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift b/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift new file mode 100644 index 00000000..49fd553b --- /dev/null +++ b/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift @@ -0,0 +1,78 @@ +// +// SyncTypeFlagsBoardTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +/// The board sync flag is the first bit outside the original single byte of +/// type flags. These tests pin down the wire compatibility contract: the +/// types TLV has been a variable-length (1-8 byte) little-endian bitfield +/// since type-aware sync, so widening to two bytes must decode everywhere +/// and unknown bits must be ignored, not rejected. +struct SyncTypeFlagsBoardTests { + + @Test func boardFlagEncodesIntoSecondByte() throws { + let data = try #require(SyncTypeFlags.board.toData()) + // Little-endian: low byte first, board bit (bit 8) in byte 2. + #expect(data == Data([0x00, 0x01])) + } + + @Test func boardFlagRoundTrips() throws { + let flags = SyncTypeFlags(messageTypes: [.message, .boardPost]) + let data = try #require(flags.toData()) + let decoded = try #require(SyncTypeFlags.decode(data)) + #expect(decoded.contains(.message)) + #expect(decoded.contains(.boardPost)) + #expect(!decoded.contains(.fragment)) + #expect(Set(decoded.toMessageTypes()) == Set([.message, .boardPost])) + } + + /// An old decoder is modeled by bits it has no mapping for: the shared + /// decode path accepts the bytes and simply maps unknown bits to no + /// message type, so a board-only request reads as "nothing I can serve". + @Test func unknownBitsDecodeToNoTypes() throws { + // Bits 9-15 are unassigned; a future (or unknown) two-byte bitfield + // must decode without error and yield no known types. + let decoded = try #require(SyncTypeFlags.decode(Data([0x00, 0xFE]))) + #expect(decoded.toMessageTypes().isEmpty) + for type in [MessageType.announce, .message, .fragment, .fileTransfer, .boardPost] { + #expect(!decoded.contains(type)) + } + } + + @Test func mixedKnownAndUnknownBitsKeepKnownTypes() throws { + // Known low-byte flags survive alongside unknown high bits. + let decoded = try #require(SyncTypeFlags.decode(Data([0x03, 0xFE]))) + #expect(decoded.contains(.announce)) + #expect(decoded.contains(.message)) + #expect(Set(decoded.toMessageTypes()) == Set([.announce, .message])) + } + + @Test func requestSyncPacketRoundTripsBoardFlag() throws { + let request = RequestSyncPacket( + p: 4, + m: 128, + data: Data([0xAB, 0xCD]), + types: SyncTypeFlags(messageTypes: [.boardPost]) + ) + let decoded = try #require(RequestSyncPacket.decode(from: request.encode())) + let types = try #require(decoded.types) + #expect(types.contains(.boardPost)) + #expect(!types.contains(.message)) + } + + @Test func singleByteLegacyEncodingStillDecodes() throws { + // Requests from old clients keep the one-byte bitfield. + let decoded = try #require(SyncTypeFlags.decode(Data([0x03]))) + #expect(decoded.contains(.announce)) + #expect(decoded.contains(.message)) + #expect(!decoded.contains(.boardPost)) + } +} diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index 23f391b9..36db977d 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -24,7 +24,8 @@ public enum MessageType: UInt8 { // Fragmentation (simplified) case fragment = 0x20 // Single fragment type for large messages case fileTransfer = 0x22 // Binary file/audio/image payloads - + case boardPost = 0x23 // Signed geohash bulletin-board post or tombstone + public var description: String { switch self { case .announce: return "announce" @@ -36,6 +37,7 @@ public enum MessageType: UInt8 { case .noiseEncrypted: return "noiseEncrypted" case .fragment: return "fragment" case .fileTransfer: return "fileTransfer" + case .boardPost: return "boardPost" } } } From 3c610a83cd98c8cf4ccb529722df3ef9bf115b63 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:14:08 +0200 Subject: [PATCH 033/158] Cashu ecash chips: detect, render, and redeem tokens + /pay command (#1376) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Cashu ecash chips: detect, render, and redeem tokens + /pay command Content-level Cashu support, no wire-protocol changes: - CashuTokenDecoder: summarizes V3 (cashuA base64url-JSON) tokens — amount summed across proofs, unit, mint host, memo — and V4 (cashuB) via a minimal bounded CBOR reader. All input is treated as adversarial: size caps, depth/item budgets, overflow guards, display sanitization; malformed payloads fail closed to a generic chip. - PaymentChipView: cashu chips now show "500 sat · mint.example.com" (+ memo) instead of a generic label; tap opens a cashu: wallet URL and falls back to https://redeem.cashu.me when no wallet handles it; context menu adds copy token / redeem in wallet / redeem on web. - extractCashuLinks now returns bare deduplicated bearer strings so the chip can decode them (cashu: URIs still detected via the embedded token). - /pay : validates the token decodes, sends it as the message body; DMs send directly, public channels require an explicit "/pay public" confirm since tokens are bearer instruments. Suggested everywhere except public geohash channels. - Tests: decoder (V3/V4 decode, summation, URI forms, truncation/ garbage/huge fuzzing, CBOR depth bounds) and /pay command flows. Co-Authored-By: Claude Fable 5 * Cashu: strict decode on the /pay SEND path The permissive decoder turned any non-empty cashuB… base64 that failed CBOR parsing into a generic TokenInfo, so the /pay guard accepted base64 junk and truncated V4 tokens and relayed them with a success message. Add a `strict` flag to CashuTokenDecoder.decode: in strict mode there is no permissive V4 fallback and the token must resolve to a known version with a positive amount, else it returns nil. Rendering keeps the permissive path (an unknown chip is fine for display). /pay now decodes with strict:true and surfaces "invalid cashu token" instead of sending. Tests: /pay with truncated cashuB / base64 junk is rejected; valid V3 and valid definite-length V4 still send; decoder strict-mode unit tests. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Localizable.xcstrings | 60 +++ bitchat/Models/CommandInfo.swift | 17 +- bitchat/Services/CashuTokenDecoder.swift | 339 +++++++++++++++++ bitchat/Services/CommandProcessor.swift | 41 ++ bitchat/ViewModels/ChatViewModel.swift | 8 + .../Views/Components/PaymentChipView.swift | 170 ++++++++- bitchat/Views/MessageTextHelpers.swift | 15 +- bitchatTests/CashuTokenDecoderTests.swift | 350 ++++++++++++++++++ bitchatTests/CommandProcessorTests.swift | 172 +++++++++ 9 files changed, 1149 insertions(+), 23 deletions(-) create mode 100644 bitchat/Services/CashuTokenDecoder.swift create mode 100644 bitchatTests/CashuTokenDecoderTests.swift diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 7301e613..66fd04b4 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -15425,6 +15425,18 @@ } } }, + "content.commands.pay" : { + "comment" : "Autocomplete description for the /pay command that sends a Cashu ecash token", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "send a cashu ecash token in this chat" + } + } + } + }, "content.commands.slap" : { "extractionState" : "manual", "localizations" : { @@ -18469,6 +18481,18 @@ } } }, + "content.input.token_placeholder" : { + "comment" : "Placeholder shown after /pay in the command suggestion panel", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "token" + } + } + } + }, "content.jump.new_count" : { "comment" : "Count of messages that arrived while scrolled up, shown in the jump-to-latest pill", "extractionState" : "manual", @@ -19734,6 +19758,18 @@ } } }, + "content.payment.copy_token" : { + "comment" : "Context menu action copying a Cashu token to the pasteboard", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "copy token" + } + } + } + }, "content.payment.lightning" : { "extractionState" : "manual", "localizations" : { @@ -19913,6 +19949,30 @@ } } }, + "content.payment.redeem_wallet" : { + "comment" : "Context menu action opening a Cashu token in an ecash wallet app", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "redeem in wallet" + } + } + } + }, + "content.payment.redeem_web" : { + "comment" : "Context menu action opening a Cashu token in the web redemption page", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "redeem on web" + } + } + } + }, "encryption.accessibility.establishing" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Models/CommandInfo.swift b/bitchat/Models/CommandInfo.swift index 1f8245be..0ad3d554 100644 --- a/bitchat/Models/CommandInfo.swift +++ b/bitchat/Models/CommandInfo.swift @@ -20,6 +20,7 @@ enum CommandInfo: String, Identifiable { case hug case message = "msg" case slap + case pay case unblock case who case favorite = "fav" @@ -33,6 +34,8 @@ enum CommandInfo: String, Identifiable { switch self { case .block, .hug, .message, .slap, .unblock, .favorite, .unfavorite: return "<" + String(localized: "content.input.nickname_placeholder") + ">" + case .pay: + return "<" + String(localized: "content.input.token_placeholder") + ">" case .clear, .help, .who: return nil } @@ -45,6 +48,7 @@ enum CommandInfo: String, Identifiable { case .help: String(localized: "content.commands.help") case .hug: String(localized: "content.commands.hug") case .message: String(localized: "content.commands.message") + case .pay: String(localized: "content.commands.pay") case .slap: String(localized: "content.commands.slap") case .unblock: String(localized: "content.commands.unblock") case .who: String(localized: "content.commands.who") @@ -54,12 +58,19 @@ enum CommandInfo: String, Identifiable { } static func all(isGeoPublic: Bool, isGeoDM: Bool) -> [CommandInfo] { - let baseCommands: [CommandInfo] = [.block, .unblock, .clear, .help, .hug, .message, .slap, .who] + var commands: [CommandInfo] = [.block, .unblock, .clear, .help, .hug, .message, .slap, .who] + // Cashu tokens are bearer instruments: in a public geohash any nearby + // stranger can redeem one, so don't *suggest* /pay there (the + // processor still allows it behind an explicit "public" confirm). + // Payments make sense in every DM and in mesh public. + if !isGeoPublic { + commands.append(.pay) + } // The processor rejects favorites in geohash contexts, so only // suggest them where they actually work: mesh. if isGeoPublic || isGeoDM { - return baseCommands + return commands } - return baseCommands + [.favorite, .unfavorite] + return commands + [.favorite, .unfavorite] } } diff --git a/bitchat/Services/CashuTokenDecoder.swift b/bitchat/Services/CashuTokenDecoder.swift new file mode 100644 index 00000000..87dfee02 --- /dev/null +++ b/bitchat/Services/CashuTokenDecoder.swift @@ -0,0 +1,339 @@ +// +// CashuTokenDecoder.swift +// bitchat +// +// Decodes Cashu ecash tokens (V3 `cashuA` = base64url JSON, V4 `cashuB` = +// base64url CBOR) just far enough to summarize them for the UI: total +// amount, unit, mint host, and memo. The app never contacts a mint — tokens +// are bearer strings and redemption is delegated to an external wallet. +// +// This parses attacker-controlled message content, so every path is +// bounds-checked, size-capped, and returns nil instead of trapping. +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation + +enum CashuTokenDecoder { + + struct TokenInfo: Equatable { + /// Token serialization version: "A" (JSON) or "B" (CBOR). + let version: String + /// Sum of all proof amounts; nil when no valid amounts were found. + let amount: Int? + /// Currency unit as declared by the token (commonly "sat"), if any. + let unit: String? + /// Host of the (first) mint URL, for display. + let mintHost: String? + /// Optional sender memo, sanitized for display. + let memo: String? + + /// "500 sat" style summary, defaulting the unit to sats per NUT-00. + var displayAmount: String? { + amount.map { "\($0) \(unit ?? "sat")" } + } + } + + /// Upper bound on accepted token length in characters. Real tokens are a + /// few KB; anything much bigger is abuse we shouldn't spend CPU on. + static let maxTokenLength = 60_000 + /// Per-proof and total amount sanity caps (order of total sats in existence). + private static let maxAmount: Int64 = 2_100_000_000_000_000 + + // MARK: - Public API + + /// Extracts the bare `cashuA…`/`cashuB…` token from raw text that may be + /// a `cashu:`/`cashu://` URI and/or percent-encoded. Returns nil when the + /// input doesn't look like a Cashu token at all. + static func bareToken(from raw: String) -> String? { + var token = raw.trimmingCharacters(in: .whitespacesAndNewlines) + let lower = token.lowercased() + if lower.hasPrefix("cashu://") { + token = String(token.dropFirst(8)) + } else if lower.hasPrefix("cashu:") { + token = String(token.dropFirst(6)) + } + if token.contains("%"), let decoded = token.removingPercentEncoding { + token = decoded + } + guard token.count >= 12, token.count <= maxTokenLength else { return nil } + guard token.hasPrefix("cashuA") || token.hasPrefix("cashuB") else { return nil } + // Base64 / base64url payload charset ('.' appears in some legacy multi-part tokens) + let allowed = CharacterSet.alphanumerics.union(CharacterSet(charactersIn: "-_+/=.")) + guard token.unicodeScalars.allSatisfy({ allowed.contains($0) }) else { return nil } + return token + } + + /// Decodes a token (raw or `cashu:` URI form) into a display summary. + /// + /// In the default (permissive) mode this is for *rendering*: V3 tokens + /// must parse as JSON, but a V4 token whose CBOR we cannot walk still + /// returns a generic `TokenInfo` (version "B", no amount) because the + /// payload may use encodings this minimal reader doesn't support — an + /// unknown chip is fine for display. + /// + /// In `strict` mode (used by the `/pay` SEND path) there is no permissive + /// fallback: the token must cleanly decode to a known version *and* carry + /// a positive amount, otherwise this returns nil. This stops base64 junk + /// and truncated V4 tokens from being relayed as if they were valid money. + static func decode(_ raw: String, strict: Bool = false) -> TokenInfo? { + guard let token = bareToken(from: raw) else { return nil } + let version = String(token[token.index(token.startIndex, offsetBy: 5)]) + guard let payload = base64URLDecode(String(token.dropFirst(6))), !payload.isEmpty else { + return nil + } + let info: TokenInfo? + switch version { + case "A": + info = decodeV3(payload) + case "B": + if let walked = decodeV4(payload) { + info = walked + } else if strict { + // Couldn't cleanly walk the CBOR — refuse to send it. + return nil + } else { + info = TokenInfo(version: "B", amount: nil, unit: nil, mintHost: nil, memo: nil) + } + default: + return nil + } + guard let info else { return nil } + if strict { + // A sendable token must resolve to a positive, sane amount. + guard let amount = info.amount, amount > 0 else { return nil } + } + return info + } + + // MARK: - Base64url + + private static func base64URLDecode(_ input: String) -> Data? { + var s = input + .replacingOccurrences(of: "-", with: "+") + .replacingOccurrences(of: "_", with: "/") + // Normalize padding (wallets emit both padded and unpadded forms) + s = s.replacingOccurrences(of: "=", with: "") + let remainder = s.count % 4 + if remainder == 1 { return nil } + if remainder > 0 { s += String(repeating: "=", count: 4 - remainder) } + return Data(base64Encoded: s) + } + + // MARK: - V3 (JSON) + + private static func decodeV3(_ payload: Data) -> TokenInfo? { + guard let obj = (try? JSONSerialization.jsonObject(with: payload)) as? [String: Any], + let entries = obj["token"] as? [[String: Any]], + !entries.isEmpty else { + return nil + } + var total: Int64 = 0 + var sawAmount = false + var mintHost: String? + for entry in entries { + if mintHost == nil, let mint = entry["mint"] as? String { + mintHost = sanitizedHost(from: mint) + } + for proof in (entry["proofs"] as? [[String: Any]]) ?? [] { + guard let number = proof["amount"] as? NSNumber else { continue } + let value = number.int64Value + guard value > 0, value <= maxAmount else { continue } + total += value + guard total <= maxAmount else { return nil } + sawAmount = true + } + } + return TokenInfo( + version: "A", + amount: sawAmount ? Int(total) : nil, + unit: sanitizedUnit(obj["unit"] as? String), + mintHost: mintHost, + memo: sanitizedMemo(obj["memo"] as? String) + ) + } + + // MARK: - V4 (CBOR) + + /// Minimal walk of the NUT-00 TokenV4 CBOR map: + /// { "m": mint, "u": unit, "d": memo, "t": [ { "i": bytes, "p": [ { "a": amount, … } ] } ] } + private static func decodeV4(_ payload: Data) -> TokenInfo? { + var reader = CBORReader(data: payload) + guard case .map(let pairs)? = reader.parseValue(depth: 0) else { return nil } + var mintHost: String? + var unit: String? + var memo: String? + var total: Int64 = 0 + var sawAmount = false + for (key, value) in pairs { + guard case .text(let name) = key else { continue } + switch (name, value) { + case ("m", .text(let mint)): + mintHost = sanitizedHost(from: mint) + case ("u", .text(let u)): + unit = sanitizedUnit(u) + case ("d", .text(let d)): + memo = sanitizedMemo(d) + case ("t", .array(let groups)): + for case .map(let group) in groups { + for case (.text("p"), .array(let proofs)) in group { + for case .map(let proof) in proofs { + for case (.text("a"), .unsigned(let amount)) in proof { + guard amount > 0, amount <= UInt64(maxAmount) else { continue } + total += Int64(amount) + guard total <= maxAmount else { return nil } + sawAmount = true + } + } + } + } + default: + break + } + } + return TokenInfo( + version: "B", + amount: sawAmount ? Int(total) : nil, + unit: unit, + mintHost: mintHost, + memo: memo + ) + } + + // MARK: - Display Sanitization (values are attacker-controlled) + + private static func sanitizedHost(from mint: String) -> String? { + guard mint.count <= 512, let host = URL(string: mint)?.host, !host.isEmpty else { return nil } + return String(host.lowercased().prefix(48)) + } + + private static func sanitizedUnit(_ unit: String?) -> String? { + guard let unit, !unit.isEmpty, unit.count <= 12, + unit.unicodeScalars.allSatisfy({ CharacterSet.alphanumerics.contains($0) }) else { + return nil + } + return unit + } + + private static func sanitizedMemo(_ memo: String?) -> String? { + guard let memo, memo.count <= 512 else { return nil } + let stripped = CharacterSet.controlCharacters.union(.newlines) + var cleaned = "" + cleaned.unicodeScalars.append(contentsOf: memo.unicodeScalars.filter { !stripped.contains($0) }) + cleaned = cleaned.trimmingCharacters(in: .whitespaces) + guard !cleaned.isEmpty else { return nil } + return String(cleaned.prefix(80)) + } +} + +// MARK: - Minimal CBOR Reader + +/// Just enough definite-length CBOR to traverse a TokenV4 map. Bounded in +/// depth, item count, and byte length; indefinite-length items and anything +/// else exotic make the parse fail (the caller degrades to a generic chip). +private struct CBORReader { + indirect enum Value { + case unsigned(UInt64) + case text(String) + case array([Value]) + case map([(Value, Value)]) + /// Parsed-and-skipped content we don't need (byte strings, negatives, floats…) + case opaque + } + + private let bytes: [UInt8] + private var index = 0 + /// Total item budget so hostile nesting can't run away. + private var itemBudget = 50_000 + private static let maxDepth = 16 + private static let maxContainerCount: UInt64 = 10_000 + + init(data: Data) { + bytes = [UInt8](data) + } + + mutating func parseValue(depth: Int) -> Value? { + guard depth < Self.maxDepth, itemBudget > 0 else { return nil } + itemBudget -= 1 + guard let (major, argument) = readHead() else { return nil } + switch major { + case 0: // unsigned int + return .unsigned(argument) + case 1: // negative int (argument already consumed) + return .opaque + case 2: // byte string + return readBytes(count: argument) != nil ? .opaque : nil + case 3: // text string + guard let raw = readBytes(count: argument) else { return nil } + return String(bytes: raw, encoding: .utf8).map(Value.text) ?? .opaque + case 4: // array + guard argument <= Self.maxContainerCount else { return nil } + var items: [Value] = [] + items.reserveCapacity(Int(min(argument, 64))) + for _ in 0.. (major: UInt8, argument: UInt64)? { + guard index < bytes.count else { return nil } + let head = bytes[index] + index += 1 + let major = head >> 5 + let info = head & 0x1F + switch info { + case 0...23: + return (major, UInt64(info)) + case 24: + return readUInt(width: 1).map { (major, $0) } + case 25: + return readUInt(width: 2).map { (major, $0) } + case 26: + return readUInt(width: 4).map { (major, $0) } + case 27: + return readUInt(width: 8).map { (major, $0) } + default: // 28-30 reserved, 31 indefinite + return nil + } + } + + private mutating func readUInt(width: Int) -> UInt64? { + guard bytes.count - index >= width else { return nil } + var value: UInt64 = 0 + for _ in 0.. [UInt8]? { + guard count <= UInt64(bytes.count - index) else { return nil } + let length = Int(count) + let slice = Array(bytes[index..<(index + length)]) + index += length + return slice + } +} diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index 9f2f8e9b..220e66ef 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -45,6 +45,8 @@ protocol CommandContextProvider: AnyObject { /// Empties the peer's chat (single-writer store intent for `/clear`). func clearPrivateChat(_ peerID: PeerID) func sendPublicRaw(_ content: String) + /// Sends a normal public message (with local echo) to the active channel. + func sendPublicMessage(_ content: String) // MARK: - System Messages func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) @@ -106,6 +108,8 @@ final class CommandProcessor { case "/unfav": if inGeoPublic || inGeoDM { return .error(message: "favorites are only for mesh peers in #mesh") } return handleFavorite(args, add: false) + case "/pay": + return handlePay(args) case "/help": return .success(message: Self.helpText) default: @@ -125,6 +129,7 @@ final class CommandProcessor { /slap @name — slap with a large trout /block @name · /unblock @name /fav @name · /unfav @name — favorites (mesh only) + /pay — send a cashu ecash token in this chat /help — this list """ @@ -331,6 +336,42 @@ final class CommandProcessor { return .error(message: "cannot unblock \(nickname): not found") } + /// `/pay ` — validates the token decodes, then sends it as + /// the message body in the current chat. Cashu tokens are bearer + /// instruments (whoever redeems first gets the funds), so posting one to + /// a public channel requires an explicit `/pay public` confirm. + /// The app never contacts a mint; it only relays the string. + private func handlePay(_ args: String) -> CommandResult { + var parts = args.trimmed.split(separator: " ").map(String.init) + guard !parts.isEmpty else { + return .success(message: "usage: /pay — paste a cashu token: /pay cashuA…") + } + + let confirmedPublic = parts.count > 1 && parts.last?.lowercased() == "public" + if confirmedPublic { parts.removeLast() } + + guard parts.count == 1, let token = CashuTokenDecoder.bareToken(from: parts[0]) else { + return .error(message: "that doesn't look like a cashu token — expected cashuA… or cashuB…") + } + guard let info = CashuTokenDecoder.decode(token, strict: true) else { + return .error(message: "invalid cashu token — it doesn't decode to a known token with an amount, not sending it") + } + + let summary = info.displayAmount ?? "a cashu token" + + if let peerID = contextProvider?.selectedPrivateChatPeer { + contextProvider?.sendPrivateMessage(token, to: peerID) + return .success(message: "sent \(summary) — cashu is a bearer token; whoever redeems it first gets the funds") + } + + guard confirmedPublic else { + return .error(message: "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public") + } + + contextProvider?.sendPublicMessage(token) + return .success(message: "sent \(summary) to the public channel — anyone here can redeem it") + } + private func handleFavorite(_ args: String, add: Bool) -> CommandResult { let targetName = args.trimmed guard !targetName.isEmpty else { diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index ae9ac224..2f5fd729 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1684,6 +1684,14 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele publicConversationCoordinator.sendPublicRaw(content) } + // Send a normal public message (with local echo) to the active channel. + // CommandContextProvider hook for commands that post real messages + // (`/pay`); only called when no private chat is selected. + @MainActor + func sendPublicMessage(_ content: String) { + sendMessage(content) + } + /// Handle incoming public message @MainActor func handlePublicMessage(_ message: BitchatMessage) { diff --git a/bitchat/Views/Components/PaymentChipView.swift b/bitchat/Views/Components/PaymentChipView.swift index e01887d0..bdda8772 100644 --- a/bitchat/Views/Components/PaymentChipView.swift +++ b/bitchat/Views/Components/PaymentChipView.swift @@ -7,12 +7,17 @@ // import SwiftUI +#if os(iOS) +import UIKit +#else +import AppKit +#endif struct PaymentChipView: View { @Environment(\.colorScheme) private var colorScheme @Environment(\.openURL) private var openURL @ThemedPalette private var palette - + enum PaymentType { case cashu(String) case lightning(String) @@ -35,14 +40,33 @@ struct PaymentChipView: View { return URL(string: link) } } - + + /// The bare `cashuA…`/`cashuB…` bearer string, when this is a Cashu chip. + var cashuToken: String? { + if case .cashu(let link) = self { + return CashuTokenDecoder.bareToken(from: link) + } + return nil + } + + /// Web fallback for redemption when no wallet handles `cashu:` URLs. + /// The token only reaches the site the user's browser loads; the app + /// itself never contacts a mint. + var cashuWebRedeemURL: URL? { + guard let token = cashuToken, + let enc = token.addingPercentEncoding(withAllowedCharacters: Self.cashuAllowedCharacters) else { + return nil + } + return URL(string: "https://redeem.cashu.me/?token=\(enc)") + } + var emoji: String { switch self { case .cashu: "🥜" case .lightning: "⚡" } } - + var label: String { switch self { case .cashu: @@ -52,27 +76,56 @@ struct PaymentChipView: View { } } } - + let paymentType: PaymentType - + /// Decoded once at construction; tokens are capped in size so this is + /// cheap, and rows re-render often enough that lazy decode in `body` + /// would just repeat the work. + private let cashuInfo: CashuTokenDecoder.TokenInfo? + + init(paymentType: PaymentType) { + self.paymentType = paymentType + if case .cashu(let link) = paymentType { + self.cashuInfo = CashuTokenDecoder.decode(link) + } else { + self.cashuInfo = nil + } + } + private var fgColor: Color { palette.primary } private var bgColor: Color { palette.secondary.opacity(colorScheme == .dark ? 0.18 : 0.12) } private var border: Color { fgColor.opacity(0.25) } - + + /// "500 sat · mint.example.com", degrading to the generic label when the + /// token didn't decode (V4 payloads we can't walk, malformed input…). + private var primaryLabel: String { + guard let info = cashuInfo else { return paymentType.label } + var parts: [String] = [] + if let amount = info.displayAmount { parts.append(amount) } + if let host = info.mintHost { parts.append(host) } + return parts.isEmpty ? paymentType.label : parts.joined(separator: " · ") + } + + private var memoLabel: String? { cashuInfo?.memo } + var body: some View { Button { - #if os(iOS) - if let url = paymentType.url { openURL(url) } - #else - if let url = paymentType.url { NSWorkspace.shared.open(url) } - #endif + primaryAction() } label: { HStack(spacing: 6) { Text(paymentType.emoji) - Text(paymentType.label) - .bitchatFont(size: 12, weight: .semibold) + VStack(alignment: .leading, spacing: 1) { + Text(primaryLabel) + .bitchatFont(size: 12, weight: .semibold) + if let memoLabel { + Text(memoLabel) + .bitchatFont(size: 10) + .opacity(0.7) + .lineLimit(1) + } + } } .padding(.vertical, 6) .padding(.horizontal, 12) @@ -87,13 +140,102 @@ struct PaymentChipView: View { .foregroundColor(fgColor) } .buttonStyle(.plain) + .contextMenu { + if let token = paymentType.cashuToken { + Button { + copyToPasteboard(token) + } label: { + Label(String(localized: "content.payment.copy_token", comment: "Context menu action copying a Cashu token to the pasteboard"), systemImage: "doc.on.doc") + } + Button { + redeemCashu() + } label: { + Label(String(localized: "content.payment.redeem_wallet", comment: "Context menu action opening a Cashu token in an ecash wallet app"), systemImage: "wallet.pass") + } + if let webURL = paymentType.cashuWebRedeemURL { + Button { + openExternalURL(webURL) + } label: { + Label(String(localized: "content.payment.redeem_web", comment: "Context menu action opening a Cashu token in the web redemption page"), systemImage: "safari") + } + } + } + } + .accessibilityLabel(Text(verbatim: accessibilityText)) + } + + private var accessibilityText: String { + var text = "\(paymentType.label): \(primaryLabel)" + if let memoLabel { text += ", \(memoLabel)" } + return text + } + + // MARK: - Actions + + private func primaryAction() { + switch paymentType { + case .cashu: + redeemCashu() + case .lightning: + #if os(iOS) + if let url = paymentType.url { openURL(url) } + #else + if let url = paymentType.url { NSWorkspace.shared.open(url) } + #endif + } + } + + /// Redemption is delegated: try a wallet registered for `cashu:` URLs + /// first, then fall back to the web redemption page. Uses the platform + /// opener directly (not the `openURL` environment) because the message + /// list overrides that action for cashu/lightning schemes without a + /// fallback path. + private func redeemCashu() { + let walletURL = paymentType.url + let webURL = paymentType.cashuWebRedeemURL + #if os(iOS) + if let walletURL { + UIApplication.shared.open(walletURL, options: [:]) { accepted in + if !accepted, let webURL { + UIApplication.shared.open(webURL) + } + } + } else if let webURL { + UIApplication.shared.open(webURL) + } + #else + if let walletURL, NSWorkspace.shared.urlForApplication(toOpen: walletURL) != nil { + NSWorkspace.shared.open(walletURL) + } else if let webURL { + NSWorkspace.shared.open(webURL) + } else if let walletURL { + NSWorkspace.shared.open(walletURL) + } + #endif + } + + private func openExternalURL(_ url: URL) { + #if os(iOS) + UIApplication.shared.open(url) + #else + NSWorkspace.shared.open(url) + #endif + } + + private func copyToPasteboard(_ string: String) { + #if os(iOS) + UIPasteboard.general.string = string + #else + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(string, forType: .string) + #endif } } #Preview { let cashuLink = "https://example.com/cashu" let lightningLink = "https://example.com/lightning" - + List { HStack { PaymentChipView(paymentType: .cashu(cashuLink)) diff --git a/bitchat/Views/MessageTextHelpers.swift b/bitchat/Views/MessageTextHelpers.swift index bd653ec9..c684d3f1 100644 --- a/bitchat/Views/MessageTextHelpers.swift +++ b/bitchat/Views/MessageTextHelpers.swift @@ -21,17 +21,20 @@ extension String { return current >= threshold } - // Extract up to `max` Cashu tokens (cashuA/cashuB). Allow dot '.' and shorter lengths. + // Extract up to `max` distinct Cashu tokens (cashuA/cashuB), as the bare + // bearer strings. Allow dot '.' and shorter lengths. The `cashu:` URI + // form matches too — the token embedded after the scheme is the match. func extractCashuLinks(max: Int = 3) -> [String] { let regex = MessageFormattingEngine.Patterns.cashu let ns = self as NSString let range = NSRange(location: 0, length: ns.length) var found: [String] = [] - for m in regex.matches(in: self, range: range) { - if m.numberOfRanges > 0 { - let token = ns.substring(with: m.range(at: 0)) - let enc = token.addingPercentEncoding(withAllowedCharacters: .alphanumerics.union(CharacterSet(charactersIn: "-_"))) ?? token - found.append("cashu:\(enc)") + for m in regex.matches(in: self, range: range) where m.numberOfRanges > 0 { + let token = ns.substring(with: m.range(at: 0)) + // Dedup: repeated tokens are one bearer instrument (and duplicate + // ForEach IDs) — one chip is enough. + if !found.contains(token) { + found.append(token) if found.count >= max { break } } } diff --git a/bitchatTests/CashuTokenDecoderTests.swift b/bitchatTests/CashuTokenDecoderTests.swift new file mode 100644 index 00000000..890a7eeb --- /dev/null +++ b/bitchatTests/CashuTokenDecoderTests.swift @@ -0,0 +1,350 @@ +// +// CashuTokenDecoderTests.swift +// bitchatTests +// +// Tests for the Cashu token summary decoder: V3 JSON decode, minimal V4 +// CBOR traversal, URI normalization, detection ranges, and adversarial +// (truncated / garbage / huge) input. The decoder renders attacker-controlled +// message content, so "never crash" matters as much as "decode correctly". +// This is free and unencumbered software released into the public domain. +// + +import Foundation +import Testing +@testable import bitchat + +struct CashuTokenDecoderTests { + + // MARK: - Token Builders + + private func base64URL(_ data: Data) -> String { + data.base64EncodedString() + .replacingOccurrences(of: "+", with: "-") + .replacingOccurrences(of: "/", with: "_") + .replacingOccurrences(of: "=", with: "") + } + + private func makeV3Token( + entries: [(mint: String, amounts: [Int])], + unit: String? = "sat", + memo: String? = nil + ) -> String { + var json: [String: Any] = [ + "token": entries.map { entry in + [ + "mint": entry.mint, + "proofs": entry.amounts.map { + ["amount": $0, "id": "009a1f293253e41e", "secret": "s", "C": "02c"] as [String: Any] + } + ] as [String: Any] + } + ] + if let unit { json["unit"] = unit } + if let memo { json["memo"] = memo } + let data = try! JSONSerialization.data(withJSONObject: json) + return "cashuA" + base64URL(data) + } + + /// Tiny deterministic CBOR encoder (definite lengths only) for building + /// V4 test tokens without depending on the decoder under test. + private enum CBOREncode { + static func head(_ major: UInt8, _ value: UInt64) -> [UInt8] { + switch value { + case 0...23: + return [(major << 5) | UInt8(value)] + case 24...0xFF: + return [(major << 5) | 24, UInt8(value)] + case 0x100...0xFFFF: + return [(major << 5) | 25, UInt8(value >> 8), UInt8(value & 0xFF)] + default: + return [(major << 5) | 26, + UInt8((value >> 24) & 0xFF), UInt8((value >> 16) & 0xFF), + UInt8((value >> 8) & 0xFF), UInt8(value & 0xFF)] + } + } + static func uint(_ v: UInt64) -> [UInt8] { head(0, v) } + static func bytes(_ b: [UInt8]) -> [UInt8] { head(2, UInt64(b.count)) + b } + static func text(_ s: String) -> [UInt8] { + let utf8 = Array(s.utf8) + return head(3, UInt64(utf8.count)) + utf8 + } + static func array(_ items: [[UInt8]]) -> [UInt8] { + head(4, UInt64(items.count)) + items.flatMap { $0 } + } + static func map(_ pairs: [(String, [UInt8])]) -> [UInt8] { + head(5, UInt64(pairs.count)) + pairs.flatMap { text($0.0) + $0.1 } + } + } + + private func makeV4Token( + mint: String = "https://mint.example.com", + unit: String = "sat", + memo: String? = nil, + amounts: [UInt64] = [1, 4] + ) -> String { + var pairs: [(String, [UInt8])] = [ + ("m", CBOREncode.text(mint)), + ("u", CBOREncode.text(unit)) + ] + if let memo { pairs.append(("d", CBOREncode.text(memo))) } + let proofs = amounts.map { amount in + CBOREncode.map([ + ("a", CBOREncode.uint(amount)), + ("s", CBOREncode.text("secret")), + ("c", CBOREncode.bytes([0x02, 0xAB, 0xCD])) + ]) + } + pairs.append(("t", CBOREncode.array([ + CBOREncode.map([ + ("i", CBOREncode.bytes([0x00, 0xAD, 0x26, 0x8C])), + ("p", CBOREncode.array(proofs)) + ]) + ]))) + return "cashuB" + base64URL(Data(CBOREncode.map(pairs))) + } + + // MARK: - V3 Decode + + @Test func v3DecodeValidToken() { + let token = makeV3Token( + entries: [("https://mint.example.com", [2, 8])], + unit: "sat", + memo: "thanks!" + ) + let info = CashuTokenDecoder.decode(token) + #expect(info != nil) + #expect(info?.version == "A") + #expect(info?.amount == 10) + #expect(info?.unit == "sat") + #expect(info?.mintHost == "mint.example.com") + #expect(info?.memo == "thanks!") + #expect(info?.displayAmount == "10 sat") + } + + @Test func v3AmountSumsAcrossEntriesAndProofs() { + let token = makeV3Token(entries: [ + ("https://a.mint.example", [1, 2, 4]), + ("https://b.mint.example", [8, 16]) + ]) + let info = CashuTokenDecoder.decode(token) + #expect(info?.amount == 31) + // First mint wins for the display host + #expect(info?.mintHost == "a.mint.example") + } + + @Test func v3MissingUnitDefaultsToSatForDisplay() { + let token = makeV3Token(entries: [("https://mint.example.com", [5])], unit: nil) + let info = CashuTokenDecoder.decode(token) + #expect(info?.unit == nil) + #expect(info?.displayAmount == "5 sat") + } + + @Test func v3RejectsNonsenseAmounts() { + // Negative and absurd amounts must not poison the sum + let json: [String: Any] = [ + "token": [[ + "mint": "https://mint.example.com", + "proofs": [ + ["amount": -5, "id": "x", "secret": "s", "C": "c"], + ["amount": 3, "id": "x", "secret": "s", "C": "c"] + ] + ] as [String: Any]] + ] + let token = "cashuA" + base64URL(try! JSONSerialization.data(withJSONObject: json)) + #expect(CashuTokenDecoder.decode(token)?.amount == 3) + } + + @Test func v3MemoIsSanitizedForDisplay() { + let token = makeV3Token( + entries: [("https://mint.example.com", [1])], + memo: "line1\nline2\u{0007}" + String(repeating: "x", count: 300) + ) + let memo = CashuTokenDecoder.decode(token)?.memo + #expect(memo != nil) + #expect(memo?.contains("\n") == false) + #expect(memo?.contains("\u{0007}") == false) + #expect((memo?.count ?? 0) <= 80) + } + + // MARK: - V4 (CBOR) Decode + + @Test func v4DecodeValidToken() { + let token = makeV4Token(memo: "Thank you", amounts: [1, 4, 16]) + let info = CashuTokenDecoder.decode(token) + #expect(info?.version == "B") + #expect(info?.amount == 21) + #expect(info?.unit == "sat") + #expect(info?.mintHost == "mint.example.com") + #expect(info?.memo == "Thank you") + } + + @Test func v4UnparseableCBORDegradesToGenericToken() { + // Valid base64 payload, but not CBOR we can walk: still a token, + // rendered as a generic chip with no amount. + let token = "cashuB" + base64URL(Data([0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02])) + let info = CashuTokenDecoder.decode(token) + #expect(info?.version == "B") + #expect(info?.amount == nil) + #expect(info?.mintHost == nil) + } + + // MARK: - Strict Mode (used by the /pay SEND path) + + @Test func strictAcceptsValidV3WithPositiveAmount() { + let token = makeV3Token(entries: [("https://mint.example.com", [2, 8])]) + let info = CashuTokenDecoder.decode(token, strict: true) + #expect(info?.version == "A") + #expect(info?.amount == 10) + } + + @Test func strictAcceptsValidDefiniteLengthV4() { + let token = makeV4Token(amounts: [1, 4, 16]) + let info = CashuTokenDecoder.decode(token, strict: true) + #expect(info?.version == "B") + #expect(info?.amount == 21) + } + + @Test func strictRejectsUnwalkableV4() { + // Valid base64, but not CBOR we can walk: permissive mode returns a + // generic chip, strict mode refuses it. + let token = "cashuB" + base64URL(Data([0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02])) + #expect(CashuTokenDecoder.decode(token)?.version == "B") + #expect(CashuTokenDecoder.decode(token, strict: true) == nil) + } + + @Test func strictRejectsTruncatedV4() { + let token = makeV4Token(amounts: [1, 4, 16]) + // Lop off the tail of the base64 payload — CBOR can no longer be walked. + let truncated = String(token.prefix(token.count - 12)) + #expect(CashuTokenDecoder.decode(truncated, strict: true) == nil) + } + + @Test func strictRejectsAmountlessToken() { + // A well-formed V3 token that carries no positive proof amount. + let json: [String: Any] = [ + "token": [[ + "mint": "https://mint.example.com", + "proofs": [["amount": 0, "id": "x", "secret": "s", "C": "c"] as [String: Any]] + ] as [String: Any]] + ] + let token = "cashuA" + base64URL(try! JSONSerialization.data(withJSONObject: json)) + #expect(CashuTokenDecoder.decode(token)?.amount == nil) + #expect(CashuTokenDecoder.decode(token, strict: true) == nil) + } + + // MARK: - URI Form and Normalization + + @Test func uriFormsDecode() { + let token = makeV3Token(entries: [("https://mint.example.com", [7])]) + for wrapped in ["cashu:\(token)", "cashu://\(token)", "CASHU:\(token)"] { + #expect(CashuTokenDecoder.bareToken(from: wrapped) == token, "failed for \(wrapped)") + #expect(CashuTokenDecoder.decode(wrapped)?.amount == 7) + } + } + + @Test func percentEncodedURIDecodes() { + let token = makeV3Token(entries: [("https://mint.example.com", [7])]) + let encoded = token.addingPercentEncoding(withAllowedCharacters: .alphanumerics)! + #expect(CashuTokenDecoder.decode("cashu:\(encoded)")?.amount == 7) + } + + @Test func bareTokenRejectsNonTokens() { + #expect(CashuTokenDecoder.bareToken(from: "hello world") == nil) + #expect(CashuTokenDecoder.bareToken(from: "cashuC" + String(repeating: "a", count: 50)) == nil) + #expect(CashuTokenDecoder.bareToken(from: "cashuA{not-base64!}") == nil) + #expect(CashuTokenDecoder.bareToken(from: "cashuA") == nil) // too short + } + + // MARK: - Adversarial Input (never crash, fail closed) + + @Test func truncatedTokensNeverCrash() { + let v3 = makeV3Token(entries: [("https://mint.example.com", [1, 2, 4, 8])], memo: "memo") + let v4 = makeV4Token(memo: "memo", amounts: [1, 2, 4, 8]) + for token in [v3, v4] { + for length in stride(from: 0, to: token.count, by: 3) { + _ = CashuTokenDecoder.decode(String(token.prefix(length))) + } + } + // Truncating the payload must not produce a phantom V3 summary + #expect(CashuTokenDecoder.decode(String(v3.prefix(v3.count - 10))) == nil) + } + + @Test func garbagePayloadsNeverCrash() { + var rng = SystemRandomNumberGenerator() + for _ in 0..<200 { + let length = Int.random(in: 0..<600, using: &rng) + let junk = Data((0.. [UInt8] { + switch value { + case 0...23: return [(major << 5) | UInt8(value)] + case 24...0xFF: return [(major << 5) | 24, UInt8(value)] + default: return [(major << 5) | 25, UInt8(value >> 8), UInt8(value & 0xFF)] + } + } + func text(_ s: String) -> [UInt8] { head(3, UInt64(s.utf8.count)) + Array(s.utf8) } + func bytes(_ b: [UInt8]) -> [UInt8] { head(2, UInt64(b.count)) + b } + func uint(_ v: UInt64) -> [UInt8] { head(0, v) } + func array(_ items: [[UInt8]]) -> [UInt8] { head(4, UInt64(items.count)) + items.flatMap { $0 } } + func map(_ pairs: [(String, [UInt8])]) -> [UInt8] { head(5, UInt64(pairs.count)) + pairs.flatMap { text($0.0) + $0.1 } } + + let proofs = [UInt64(1), 4, 16].map { amount in + map([("a", uint(amount)), ("s", text("secret")), ("c", bytes([0x02, 0xAB, 0xCD]))]) + } + let cbor = map([ + ("m", text("https://mint.example.com")), + ("u", text("sat")), + ("t", array([map([("i", bytes([0x00, 0xAD, 0x26, 0x8C])), ("p", array(proofs))])])) + ]) + let b64 = Data(cbor).base64EncodedString() + .replacingOccurrences(of: "+", with: "-") + .replacingOccurrences(of: "/", with: "_") + .replacingOccurrences(of: "=", with: "") + return "cashuB" + b64 + }() + + @MainActor + private func makePayProcessor(context: MockCommandContextProvider) -> CommandProcessor { + CommandProcessor( + contextProvider: context, + meshService: MockTransport(), + identityManager: MockIdentityManager(MockKeychain()) + ) + } + @MainActor private func withSelectedChannel( _ channel: ChannelID, @@ -477,6 +644,11 @@ private final class MockCommandContextProvider: CommandContextProvider { sentPublicRawMessages.append(content) } + private(set) var sentPublicMessages: [String] = [] + func sendPublicMessage(_ content: String) { + sentPublicMessages.append(content) + } + func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) { localPrivateSystemMessages.append((content, peerID)) } From cee2bcd535657a4ec7d9ee7af8dfa805623c2737 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:35:51 +0200 Subject: [PATCH 034/158] Fix SyncTypeFlags tests: bit 8 (boardPost) is a known type (#1390) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #1379 (board) mapped bit 8 -> .boardPost in SyncTypeFlags, making it a known bit that spills the encoded bitfield into a second byte. But the phantom-bit tests (added by #1373) predate that change and still assert bit 8 is unknown, so main went red once both landed. Neither PR's CI caught it — each was green against a main without the other. The impl is correct (board is a real sync type); the tests were stale. Update them to treat bits 9+ as phantom, expect the all-known field to serialize to 2 bytes, and add a regression test that the board bit survives decode while the phantom high bits are stripped. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchatTests/Sync/SyncTypeFlagsTests.swift | 28 +++++++++++++++------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/bitchatTests/Sync/SyncTypeFlagsTests.swift b/bitchatTests/Sync/SyncTypeFlagsTests.swift index a3ab3cc4..d4684afc 100644 --- a/bitchatTests/Sync/SyncTypeFlagsTests.swift +++ b/bitchatTests/Sync/SyncTypeFlagsTests.swift @@ -13,31 +13,41 @@ struct SyncTypeFlagsTests { } @Test func decodeDropsPhantomBits() { - // Bits 8+ map to no message type. They must not survive decode as - // phantom membership. - let phantom = Data([0x00, 0xFF]) // bits 8..15 set, no known type + // Bits 9+ map to no message type (bit 8 is boardPost). They must not + // survive decode as phantom membership. + let phantom = Data([0x00, 0xFE]) // bits 9..15 set, no known type let decoded = SyncTypeFlags.decode(phantom) #expect(decoded?.rawValue == 0) #expect(decoded?.toMessageTypes().isEmpty == true) } + @Test func boardBitSurvivesDecode() { + // Bit 8 maps to boardPost and spills the field into a second byte; + // it must survive decode while the phantom high bits are stripped. + let mixed = Data([0x00, 0xFF]) // bit 8 (board) known, bits 9..15 phantom + let decoded = SyncTypeFlags.decode(mixed) + #expect(decoded?.contains(.board) == true) + #expect(decoded?.rawValue == 0b1_0000_0000) + } + @Test func phantomBitsAreStrippedButKnownBitsSurvive() { - // Low byte = announce(0) + message(1); high byte = phantom. - let mixed = Data([0b0000_0011, 0xFF]) + // Low byte = announce(0) + message(1); high byte bits 9+ are phantom. + let mixed = Data([0b0000_0011, 0xFE]) let decoded = SyncTypeFlags.decode(mixed) #expect(decoded?.contains(.announce) == true) #expect(decoded?.contains(.message) == true) - // Only the two known bits remain; phantom high byte is gone. + // Only the two known bits remain; phantom high bits are gone. #expect(decoded?.rawValue == 0b0000_0011) } @Test func rawValueInitNormalizesPhantomBits() { let flags = SyncTypeFlags(rawValue: 0xFFFF_FFFF_FFFF_FFFF) - // Every known type bit is set; nothing above them survives, so the - // field serializes to a single byte. + // Every known type bit is set; nothing above them survives. boardPost + // occupies bit 8, so the known set spills into a second byte. #expect(flags.contains(.announce)) #expect(flags.contains(.fileTransfer)) + #expect(flags.contains(.board)) let data = flags.toData() - #expect(data?.count == 1) + #expect(data?.count == 2) } } From 70229f0be1b53600f7eb0da209b2a6e2b8a4a49e Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:42:53 +0200 Subject: [PATCH 035/158] Originate v2 source routes and wire fragmentIdFilter targeted resync (#1378) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Originate v2 source routes and wire fragmentIdFilter targeted resync Part A — source-route origination policy: - Gate route application (BLESourceRouteOriginationPolicy): only packets we author, directed at a single peer, with TTL headroom, whose recipient is not directly connected. Relays no longer attach routes to (and re-sign) packets they merely forward. - Version-gate paths: MeshTopologyTracker records the highest protocol version observed per peer; BFS routes require every intermediate hop and the recipient to be v2-observed, capped at 4 intermediate hops. - Degrade on failure: BLESourceRouteFailureCache marks a routed send that sees no inbound traffic from the recipient within 10s as failed and floods for 60s before retrying routes. Part B — REQUEST_SYNC fragmentIdFilter (TLV 0x06): - Requester: BLEFragmentAssemblyBuffer reports stalled broadcast reassemblies (no new fragment for 5s, retried at most every 10s); the maintenance pass sends a types=fragment REQUEST_SYNC naming the stalled 8-byte fragment stream IDs to each connected peer. - Responder: GossipSyncManager restricts the fragment diff to exactly the named streams, bypassing the since-cursor while the GCS filter still excludes pieces the requester holds; RSR/TTL-0/rate-limit semantics unchanged and REQUEST_SYNC stays link-local. - Bounds: at most 60 IDs per request (60*17-1 = 1019 bytes <= the 1024-byte decoder cap); oversized 0x06 values are ignored, not fatal. Docs: SOURCE_ROUTING.md gains the iOS origination policy (§8); REQUEST_SYNC_MANAGER.md documents 0x05/0x06 as implemented. Co-Authored-By: Claude Fable 5 * Fix stall-clock refresh on duplicates and overflow suppression in fragment resync Two fixes to stalledBroadcastFragmentIDs bookkeeping in BLEFragmentAssemblyBuffer: - Duplicate fragments no longer reset the stall clock. Fragment packets bypass the packet deduplicator, so relayed duplicates of an already-held index arriving every few seconds kept lastFragmentAt fresh and suppressed the targeted REQUEST_SYNC indefinitely. Now lastFragmentAt only updates when the index is new (actual progress). - Only the streams that will actually be encoded on the wire are rate-limited. Previously every stalled candidate got lastResyncRequestAt set, but encodeFragmentIdFilter serializes at most RequestSyncPacket.maxFragmentIdFilterCount (60) IDs, so overflow streams were suppressed for retryAfter without ever being requested. Selection now caps at that shared constant, oldest stall first, so overflow stays eligible and rotates fairly on the next pass. Tests: duplicates arriving periodically still trigger the stall report; 70 stalled streams yield the 60 oldest on the first pass and the remaining 10 on the next. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Models/RequestSyncPacket.swift | 47 ++++-- .../BLE/BLEFragmentAssemblyBuffer.swift | 62 +++++++- bitchat/Services/BLE/BLEService.swift | 63 ++++++-- .../BLE/BLESourceRouteFailureCache.swift | 95 +++++++++++++ .../BLE/BLESourceRouteOriginationPolicy.swift | 40 ++++++ bitchat/Services/MeshTopologyTracker.swift | 44 ++++-- bitchat/Services/TransportConfig.swift | 19 +++ bitchat/Sync/GossipSyncManager.swift | 44 ++++-- bitchatTests/GossipSyncManagerTests.swift | 95 ++++++++++++- .../BLEFragmentAssemblyBufferTests.swift | 134 ++++++++++++++++++ .../BLESourceRouteFailureCacheTests.swift | 98 +++++++++++++ ...BLESourceRouteOriginationPolicyTests.swift | 98 +++++++++++++ .../Services/MeshTopologyTrackerTests.swift | 124 +++++++++++++++- ...RequestSyncPacketFragmentFilterTests.swift | 76 ++++++++++ docs/REQUEST_SYNC_MANAGER.md | 8 +- docs/SOURCE_ROUTING.md | 43 +++++- .../Sources/BitFoundation/BitchatPacket.swift | 2 +- 17 files changed, 1049 insertions(+), 43 deletions(-) create mode 100644 bitchat/Services/BLE/BLESourceRouteFailureCache.swift create mode 100644 bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift create mode 100644 bitchatTests/Services/BLESourceRouteFailureCacheTests.swift create mode 100644 bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift create mode 100644 bitchatTests/Sync/RequestSyncPacketFragmentFilterTests.swift diff --git a/bitchat/Models/RequestSyncPacket.swift b/bitchat/Models/RequestSyncPacket.swift index b34dd925..0c6cb3cd 100644 --- a/bitchat/Models/RequestSyncPacket.swift +++ b/bitchat/Models/RequestSyncPacket.swift @@ -1,19 +1,21 @@ +import BitFoundation import Foundation // REQUEST_SYNC payload TLV (type, length16, value) // - 0x01: P (uint8) — Golomb-Rice parameter // - 0x02: M (uint32, big-endian) — hash range (N * 2^P) // - 0x03: data (opaque) — GR bitstream bytes (MSB-first) -// - 0x04: types (bitfield) — SyncTypeFlags of covered message types -// - 0x05: sinceTimestamp (uint64, big-endian) — oldest ts the filter covers -// - 0x06: fragmentIdFilter (utf8) — reserved -// -// TODO(v2): fragmentIdFilter (0x06) is parsed and re-serialized but never -// populated or honored — it's the reserved surface for incremental fragment -// sync (request the missing fragments of one file by ID instead of diffing the -// whole fragment set). Either wire it into buildGcsPayload/_handleRequestSync -// or drop the field; don't leave it as silent dead protocol surface. +// - 0x04: types (SyncTypeFlags) — packet types the filter covers +// - 0x05: sinceTimestamp (uint64, big-endian) — filter coverage cursor +// - 0x06: fragmentIdFilter (UTF-8) — comma-separated 16-hex-char (8-byte) +// fragment stream IDs; restricts the fragment diff to exactly those +// streams (targeted resync for stalled reassemblies) struct RequestSyncPacket { + /// Maximum fragment IDs one 0x06 filter may carry. Each ID encodes as + /// 16 hex chars plus a comma separator, so the largest encoded value is + /// 60 * 17 - 1 = 1019 bytes, which fits the 1024-byte decoder cap. + static let maxFragmentIdFilterCount = 60 + let p: Int let m: UInt32 let data: Data @@ -21,6 +23,29 @@ struct RequestSyncPacket { let sinceTimestamp: UInt64? let fragmentIdFilter: String? + /// Encodes 8-byte fragment stream IDs as the 0x06 filter string, + /// dropping malformed IDs and capping at `maxFragmentIdFilterCount`. + static func encodeFragmentIdFilter(_ fragmentIDs: [Data]) -> String? { + let tokens = fragmentIDs + .filter { $0.count == 8 } + .prefix(maxFragmentIdFilterCount) + .map { $0.hexEncodedString() } + guard !tokens.isEmpty else { return nil } + return tokens.joined(separator: ",") + } + + /// Decodes a 0x06 filter string back into 8-byte fragment stream IDs, + /// ignoring malformed tokens and capping at `maxFragmentIdFilterCount`. + static func decodeFragmentIdFilter(_ filter: String?) -> Set? { + guard let filter else { return nil } + var ids: Set = [] + for token in filter.split(separator: ",").prefix(maxFragmentIdFilterCount) { + guard token.count == 16, let id = Data(hexString: String(token)) else { continue } + ids.insert(id) + } + return ids.isEmpty ? nil : ids + } + init(p: Int, m: UInt32, data: Data, types: SyncTypeFlags? = nil, sinceTimestamp: UInt64? = nil, fragmentIdFilter: String? = nil) { self.p = p self.m = m @@ -97,7 +122,9 @@ struct RequestSyncPacket { sinceTimestamp = ts } case 0x06: - if let fid = String(data: v, encoding: .utf8) { + // Same acceptance cap as the GCS payload; an oversized filter + // is ignored rather than failing the whole request. + if v.count <= maxAcceptBytes, let fid = String(data: v, encoding: .utf8) { fragmentIdFilter = fid } default: diff --git a/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift b/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift index 4d41b2d3..83311584 100644 --- a/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift +++ b/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift @@ -64,6 +64,9 @@ struct BLEFragmentAssemblyBuffer { let type: UInt8 let total: Int let timestamp: Date + let isBroadcast: Bool + var lastFragmentAt: Date + var lastResyncRequestAt: Date? } private var fragmentsByKey: [BLEFragmentKey: [Int: Data]] = [:] @@ -105,7 +108,15 @@ struct BLEFragmentAssemblyBuffer { return .oversized(header: header, projectedSize: projectedSize, limit: limit, started: started) } + // Only actual progress resets the stall clock: fragment packets + // bypass the packet deduplicator, so relayed duplicates of an + // already-held index must not keep suppressing the targeted + // REQUEST_SYNC for a stalled stream. + let isNewIndex = fragmentsByKey[header.key]?[header.index] == nil fragmentsByKey[header.key]?[header.index] = header.fragmentData + if isNewIndex { + metadataByKey[header.key]?.lastFragmentAt = now + } guard let fragments = fragmentsByKey[header.key], fragments.count == header.total else { @@ -138,10 +149,59 @@ struct BLEFragmentAssemblyBuffer { } fragmentsByKey[header.key] = [:] - metadataByKey[header.key] = Metadata(type: header.originalType, total: header.total, timestamp: now) + metadataByKey[header.key] = Metadata( + type: header.originalType, + total: header.total, + timestamp: now, + isBroadcast: header.isBroadcastFragment, + lastFragmentAt: now + ) return true } + /// Fragment stream IDs (8-byte, big-endian) of incomplete broadcast + /// reassemblies that have not seen a new fragment for `stalledAfter` + /// seconds — candidates for a targeted REQUEST_SYNC. Each returned + /// stream is marked so it is not re-requested within `retryAfter`. + /// At most `RequestSyncPacket.maxFragmentIdFilterCount` streams are + /// returned per pass — the wire filter cannot carry more — selected + /// oldest-stall first; overflow streams stay unmarked and eligible for + /// the next pass. Directed reassemblies are excluded: peers only archive + /// broadcast fragments for gossip sync, so a targeted request cannot + /// recover them. + mutating func stalledBroadcastFragmentIDs( + stalledAfter: TimeInterval, + retryAfter: TimeInterval, + now: Date = Date() + ) -> [Data] { + var candidates: [(key: BLEFragmentKey, lastFragmentAt: Date)] = [] + for (key, metadata) in metadataByKey { + guard metadata.isBroadcast, + let fragments = fragmentsByKey[key], + fragments.count < metadata.total, + now.timeIntervalSince(metadata.lastFragmentAt) >= stalledAfter else { continue } + if let lastRequest = metadata.lastResyncRequestAt, + now.timeIntervalSince(lastRequest) < retryAfter { continue } + candidates.append((key: key, lastFragmentAt: metadata.lastFragmentAt)) + } + + // Mark only the streams that will actually go on the wire, so the + // overflow is not silently suppressed for `retryAfter`. + let selected = candidates + .sorted { + if $0.lastFragmentAt != $1.lastFragmentAt { + return $0.lastFragmentAt < $1.lastFragmentAt + } + return ($0.key.sender, $0.key.id) < ($1.key.sender, $1.key.id) + } + .prefix(RequestSyncPacket.maxFragmentIdFilterCount) + + return selected.map { candidate in + metadataByKey[candidate.key]?.lastResyncRequestAt = now + return withUnsafeBytes(of: candidate.key.id.bigEndian) { Data($0) } + } + } + private static func assemblyLimit(for originalType: UInt8) -> Int { if originalType == MessageType.fileTransfer.rawValue { // Allow headroom for TLV metadata and binary framing overhead. diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 598f9821..db134e41 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -69,7 +69,9 @@ final class BLEService: NSObject { #endif private var selfBroadcastTracker = BLESelfBroadcastTracker() private let meshTopology = MeshTopologyTracker() - + // Route health for originated source routes; guarded by collectionsQueue. + private var sourceRouteFailures = BLESourceRouteFailureCache() + // 5. Fragment Reassembly (necessary for messages > MTU) private var fragmentAssemblyBuffer = BLEFragmentAssemblyBuffer() private var outboundFragmentTransfers = BLEOutboundFragmentTransferScheduler() @@ -586,6 +588,7 @@ final class BLEService: NSObject { let entries = outboundFragmentTransfers.removeAll().map { ($0.id, $0.workItems) } peerRegistry.removeAll() fragmentAssemblyBuffer.removeAll() + sourceRouteFailures = BLESourceRouteFailureCache() // Also clear pending message queues to avoid stale state across sessions pendingNoiseSessionQueues.removeAll() pendingDirectedRelays.removeAll() @@ -2392,13 +2395,31 @@ extension BLEService { } private func computeRoute(to peerID: PeerID) -> [Data]? { - meshTopology.computeRoute(from: myPeerIDData, to: routingData(for: peerID)) + // Version-gated: every hop and the recipient must have been observed + // speaking v2, since a v1-only node drops v2 frames on decode. + meshTopology.computeRoute( + from: myPeerIDData, + to: routingData(for: peerID), + maxHops: TransportConfig.bleSourceRouteMaxIntermediateHops, + requiringVersion: 2 + ) } private func applyRouteIfAvailable(_ packet: BitchatPacket, to recipient: PeerID) -> BitchatPacket { - guard let route = computeRoute(to: recipient), route.count >= 1 else { - return packet - } + let now = Date() + let route = BLESourceRouteOriginationPolicy.route( + for: packet, + to: recipient, + localPeerIDData: myPeerIDData, + isRecipientConnected: { self.isPeerConnected($0) }, + shouldAttemptRoute: { peer in + self.collectionsQueue.sync(flags: .barrier) { + self.sourceRouteFailures.shouldAttemptRoute(to: peer, now: now) + } + }, + computeRoute: { self.computeRoute(to: $0) } + ) + guard let route else { return packet } // Create new packet with route applied and version upgraded to 2 let routedPacket = BitchatPacket( type: packet.type, @@ -2416,6 +2437,9 @@ extension BLEService { SecureLogger.error("❌ Failed to re-sign packet with route", category: .security) return packet // Return original packet if signing fails } + collectionsQueue.sync(flags: .barrier) { + sourceRouteFailures.noteRoutedSend(to: recipient, now: now) + } return signedPacket } @@ -3187,13 +3211,23 @@ extension BLEService { // Update peer info without verbose logging - update the peer we received from, not the original sender updatePeerLastSeen(peerID) - // Track recent traffic timestamps for adaptive behavior + // Track recent traffic timestamps for adaptive behavior; the same + // barrier hop confirms route health for the packet's originator. collectionsQueue.async(flags: .barrier) { [weak self] in guard let self = self else { return } self.recentTrafficTracker.recordPacket(at: Date()) + self.sourceRouteFailures.noteInboundActivity(from: senderID) + } + + // Per-peer protocol version: originated source routes only use hops + // observed speaking v2 (a v1-only node cannot decode v2 frames). + if packet.version >= 2 { + meshTopology.recordObservedVersion(packet.version, for: packet.senderID) + if peerID != senderID { + meshTopology.recordObservedVersion(packet.version, for: routingData(for: peerID)) + } } - // Process by type switch context.messageType { case .announce: @@ -3760,10 +3794,21 @@ extension BLEService { // Clean old processed messages efficiently messageDeduplicator.cleanup() - // Clean old fragments (> configured seconds old) - collectionsQueue.sync(flags: .barrier) { + // Clean old fragments (> configured seconds old), then ask peers for + // the specific fragment streams whose reassembly has stalled instead + // of waiting for the next periodic GCS fragment round. + let stalledFragmentIDs = collectionsQueue.sync(flags: .barrier) { () -> [Data] in let cutoff = now.addingTimeInterval(-TransportConfig.bleFragmentLifetimeSeconds) fragmentAssemblyBuffer.removeExpired(before: cutoff) + sourceRouteFailures.prune(now: now) + return fragmentAssemblyBuffer.stalledBroadcastFragmentIDs( + stalledAfter: TransportConfig.bleFragmentResyncStallSeconds, + retryAfter: TransportConfig.bleFragmentResyncRetrySeconds, + now: now + ) + } + if !stalledFragmentIDs.isEmpty { + gossipSyncManager?.requestMissingFragments(fragmentIDs: stalledFragmentIDs) } // Clean old connection timeout backoff entries (> window) diff --git a/bitchat/Services/BLE/BLESourceRouteFailureCache.swift b/bitchat/Services/BLE/BLESourceRouteFailureCache.swift new file mode 100644 index 00000000..fcf23d2c --- /dev/null +++ b/bitchat/Services/BLE/BLESourceRouteFailureCache.swift @@ -0,0 +1,95 @@ +import BitFoundation +import Foundation + +/// Tracks whether source-routed sends to a recipient appear to be working. +/// +/// A routed unicast rides exactly one path, so a broken hop silently loses the +/// packet where a flood would have healed around it. Rather than building a +/// retransmission machine (MessageRouter already retries at a higher layer), +/// this cache degrades: a routed send that sees no inbound traffic from the +/// recipient within the confirmation window marks the route as failed, and +/// subsequent sends fall back to flooding until the suppression TTL lapses. +struct BLESourceRouteFailureCache { + struct Config { + /// How long a routed send may go unconfirmed before it counts as a + /// route failure. + var confirmationWindowSeconds: TimeInterval = TransportConfig.bleSourceRouteConfirmationWindowSeconds + /// How long to flood instead of routing after a failure. + var suppressionSeconds: TimeInterval = TransportConfig.bleSourceRouteSuppressionSeconds + } + + private struct State { + var pendingSince: Date? + var suppressedUntil: Date? + } + + private let config: Config + private var states: [PeerID: State] = [:] + + init(config: Config = Config()) { + self.config = config + } + + /// Whether the next directed send to `recipient` may carry a source + /// route. Flips the recipient into suppression when the last routed send + /// went unconfirmed past the confirmation window. + mutating func shouldAttemptRoute(to recipient: PeerID, now: Date = Date()) -> Bool { + guard var state = states[recipient] else { return true } + + if let until = state.suppressedUntil { + guard now >= until else { return false } + state.suppressedUntil = nil + } + + if let pending = state.pendingSince, + now.timeIntervalSince(pending) > config.confirmationWindowSeconds { + // The routed send was never confirmed: treat the route as broken + // and flood until the suppression window lapses. + state.pendingSince = nil + state.suppressedUntil = now.addingTimeInterval(config.suppressionSeconds) + states[recipient] = state + return false + } + + states[recipient] = state + return true + } + + /// Records that a source-routed packet was sent to `recipient`. Keeps the + /// earliest unconfirmed send so back-to-back packets share one deadline. + mutating func noteRoutedSend(to recipient: PeerID, now: Date = Date()) { + var state = states[recipient] ?? State() + if state.pendingSince == nil { + state.pendingSince = now + } + states[recipient] = state + } + + /// Any inbound packet authored by `peer` confirms the pending routed send + /// (delivery acks and replies arrive this way). Deliberately does not + /// lift an active suppression: that traffic may have arrived via flood. + mutating func noteInboundActivity(from peer: PeerID) { + guard var state = states[peer] else { return } + state.pendingSince = nil + if state.suppressedUntil == nil { + states.removeValue(forKey: peer) + } else { + states[peer] = state + } + } + + /// Drops entries that can no longer influence a routing decision. An + /// expired-but-unconverted pending entry is kept for as long as the + /// suppression it would trigger could still be active. + mutating func prune(now: Date = Date()) { + let pendingRetention = config.confirmationWindowSeconds + config.suppressionSeconds + states = states.filter { _, state in + if let until = state.suppressedUntil, now < until { return true } + if let pending = state.pendingSince, + now.timeIntervalSince(pending) <= pendingRetention { + return true + } + return false + } + } +} diff --git a/bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift b/bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift new file mode 100644 index 00000000..5cc8bf9c --- /dev/null +++ b/bitchat/Services/BLE/BLESourceRouteOriginationPolicy.swift @@ -0,0 +1,40 @@ +import BitFoundation +import Foundation + +/// Decides whether an outbound directed packet should carry a v2 source +/// route. Pure gating logic so BLEService's hot send path stays a thin wire. +enum BLESourceRouteOriginationPolicy { + /// Returns the intermediate-hop route to attach, or nil to keep the + /// current flood/direct-write behavior unchanged. + /// + /// Routes are only originated when every gate passes: + /// - we authored the packet (relays must not rewrite and re-sign someone + /// else's packet; route-following for in-flight routed packets lives in + /// `BLERouteForwardingPolicy`), + /// - the packet is directed at a single peer (not broadcast), + /// - the packet has TTL headroom to traverse hops (link-local TTL-0 + /// packets like REQUEST_SYNC never route), + /// - the recipient is not directly connected (a direct write already + /// delivers in one hop), + /// - routing to the recipient is not suppressed by a recent unconfirmed + /// routed send, and + /// - the topology yields a complete path. + static func route( + for packet: BitchatPacket, + to recipient: PeerID, + localPeerIDData: Data, + isRecipientConnected: (PeerID) -> Bool, + shouldAttemptRoute: (PeerID) -> Bool, + computeRoute: (PeerID) -> [Data]? + ) -> [Data]? { + guard packet.senderID == localPeerIDData else { return nil } + guard let recipientData = packet.recipientID, + recipientData.count == 8, + !recipientData.allSatisfy({ $0 == 0xFF }) else { return nil } + guard packet.ttl > 1 else { return nil } + guard !isRecipientConnected(recipient) else { return nil } + guard shouldAttemptRoute(recipient) else { return nil } + guard let route = computeRoute(recipient), !route.isEmpty else { return nil } + return route + } +} diff --git a/bitchat/Services/MeshTopologyTracker.swift b/bitchat/Services/MeshTopologyTracker.swift index fdd8749f..eb4e0c3c 100644 --- a/bitchat/Services/MeshTopologyTracker.swift +++ b/bitchat/Services/MeshTopologyTracker.swift @@ -10,6 +10,10 @@ final class MeshTopologyTracker { private var claims: [RoutingID: Set] = [:] // Last time we received an update from a node private var lastSeen: [RoutingID: Date] = [:] + // Highest protocol version observed from each node's decoded packets. + // Nodes absent from this map are assumed v1-only and are never used as + // hops (or targets) for version-gated routes. + private var observedVersions: [RoutingID: (version: UInt8, seenAt: Date)] = [:] // Maximum age for topology claims to be considered fresh for routing // Routes computed using stale topology can fail when the network has changed @@ -19,18 +23,29 @@ final class MeshTopologyTracker { queue.sync(flags: .barrier) { self.claims.removeAll() self.lastSeen.removeAll() + self.observedVersions.removeAll() } } /// Update the topology with a node's self-reported neighbor list - func updateNeighbors(for sourceData: Data?, neighbors: [Data]) { + func updateNeighbors(for sourceData: Data?, neighbors: [Data], at now: Date = Date()) { guard let source = sanitize(sourceData) else { return } // Sanitize neighbors and exclude self-loops let validNeighbors = Set(neighbors.compactMap { sanitize($0) }).subtracting([source]) - + queue.sync(flags: .barrier) { self.claims[source] = validNeighbors - self.lastSeen[source] = Date() + self.lastSeen[source] = now + } + } + + /// Record the protocol version observed on a decoded packet from a node. + /// Only versions above the v1 baseline are stored; the highest wins. + func recordObservedVersion(_ version: UInt8, for peerData: Data?, at now: Date = Date()) { + guard version > 1, let peer = sanitize(peerData) else { return } + queue.sync(flags: .barrier) { + let current = self.observedVersions[peer]?.version ?? 1 + self.observedVersions[peer] = (version: max(version, current), seenAt: now) } } @@ -39,28 +54,37 @@ final class MeshTopologyTracker { queue.sync(flags: .barrier) { self.claims.removeValue(forKey: peer) self.lastSeen.removeValue(forKey: peer) + self.observedVersions.removeValue(forKey: peer) } } - + /// Prune nodes that haven't updated their topology in `age` seconds - func prune(olderThan age: TimeInterval) { - let deadline = Date().addingTimeInterval(-age) + func prune(olderThan age: TimeInterval, now: Date = Date()) { + let deadline = now.addingTimeInterval(-age) queue.sync(flags: .barrier) { let stale = self.lastSeen.filter { $0.value < deadline } for (peer, _) in stale { self.claims.removeValue(forKey: peer) self.lastSeen.removeValue(forKey: peer) } + self.observedVersions = self.observedVersions.filter { $0.value.seenAt >= deadline } } } - func computeRoute(from start: Data?, to goal: Data?, maxHops: Int = 10) -> [Data]? { + /// BFS over confirmed, fresh edges. When `requiringVersion` is set, every + /// node on the path except the source (i.e. all intermediate hops and the + /// target) must have been observed speaking at least that protocol + /// version — a v1-only hop cannot decode a v2 routed packet. + func computeRoute(from start: Data?, to goal: Data?, maxHops: Int = 10, requiringVersion: UInt8? = nil, now: Date = Date()) -> [Data]? { guard let source = sanitize(start), let target = sanitize(goal) else { return nil } if source == target { return [] } // Direct connection, no intermediate hops return queue.sync { - let now = Date() let freshnessDeadline = now.addingTimeInterval(-Self.routeFreshnessThreshold) + func meetsRequiredVersion(_ peer: RoutingID) -> Bool { + guard let requiringVersion else { return true } + return (observedVersions[peer]?.version ?? 1) >= requiringVersion + } // BFS var visited: Set = [source] @@ -86,6 +110,10 @@ final class MeshTopologyTracker { for neighbor in neighbors { if visited.contains(neighbor) { continue } + // Version gate: skip nodes not known to speak the + // required protocol version. + guard meetsRequiredVersion(neighbor) else { continue } + // CONFIRMED EDGE CHECK: // 'last' claims 'neighbor' (checked above) // Does 'neighbor' claim 'last'? diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 59d15c55..649a8be9 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -208,6 +208,25 @@ enum TransportConfig { static let bleSubscriptionRateLimitWindowSeconds: TimeInterval = 60.0 // Window for tracking subscription attempts static let bleSubscriptionRateLimitMaxAttempts: Int = 5 // Max attempts before extended cooldown + // Source routing (v2 directed packets) + // Longest path we will originate, in intermediate hops between us and the + // recipient. Keep small: every hop must be a fresh, confirmed, v2-capable + // node, and long stale paths fail more often than floods. + static let bleSourceRouteMaxIntermediateHops: Int = 4 + // A routed send with no inbound traffic from the recipient within this + // window counts as a route failure. + static let bleSourceRouteConfirmationWindowSeconds: TimeInterval = 10.0 + // After a route failure, directed sends to that recipient flood instead + // of routing until this lapses. + static let bleSourceRouteSuppressionSeconds: TimeInterval = 60.0 + + // Targeted fragment resync (REQUEST_SYNC fragmentIdFilter) + // A broadcast reassembly with no new fragment for this long is stalled + // and triggers a targeted REQUEST_SYNC naming its fragment stream. + static let bleFragmentResyncStallSeconds: TimeInterval = 5.0 + // Minimum spacing between targeted resync requests for the same stream. + static let bleFragmentResyncRetrySeconds: TimeInterval = 10.0 + // Store-and-forward for directed packets at relays. Spooled packets retry // on each maintenance flush until the window lapses; a longer window lets // brief link gaps (walking between rooms, reconnect churn) heal themselves. diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index 2d7118ab..5edf1c4c 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -274,11 +274,29 @@ final class GossipSyncManager { delegate?.sendPacket(signed) } - private func sendRequestSync(to peerID: PeerID, types: SyncTypeFlags) { + /// Targeted fragment recovery: ask connected peers for the specific + /// fragment streams whose reassembly has stalled, instead of waiting on + /// the next periodic GCS fragment round to cover them. + func requestMissingFragments(fragmentIDs: [Data]) { + queue.async { [weak self] in + self?._requestMissingFragments(fragmentIDs) + } + } + + private func _requestMissingFragments(_ fragmentIDs: [Data]) { + guard let filter = RequestSyncPacket.encodeFragmentIdFilter(fragmentIDs) else { return } + guard let connectedPeers = delegate?.getConnectedPeers(), !connectedPeers.isEmpty else { return } + SecureLogger.debug("Requesting \(fragmentIDs.count) stalled fragment stream(s) from \(connectedPeers.count) peer(s)", category: .sync) + for peerID in connectedPeers { + sendRequestSync(to: peerID, types: .fragment, fragmentIdFilter: filter) + } + } + + private func sendRequestSync(to peerID: PeerID, types: SyncTypeFlags, fragmentIdFilter: String? = nil) { // Register the request for RSR validation requestSyncManager.registerRequest(to: peerID) - - let payload = buildGcsPayload(for: types) + + let payload = buildGcsPayload(for: types, fragmentIdFilter: fragmentIdFilter) var recipient = Data() var temp = peerID.id while temp.count >= 2 && recipient.count < 8 { @@ -355,9 +373,19 @@ final class GossipSyncManager { } if requestedTypes.contains(.fragment) { + // A fragment-ID filter narrows the diff to exactly the named + // fragment streams (targeted resync for stalled reassemblies) + // and bypasses the since-cursor for them; the GCS filter still + // excludes the pieces the requester already holds. Fragment + // payloads start with the 8-byte stream ID. + let fragmentIdFilter = RequestSyncPacket.decodeFragmentIdFilter(request.fragmentIdFilter) let frags = fragments.allPackets(isFresh: isPacketFresh) for pkt in frags { - if let since, pkt.timestamp < since { continue } + if let fragmentIdFilter { + guard fragmentIdFilter.contains(Data(pkt.payload.prefix(8))) else { continue } + } else if let since, pkt.timestamp < since { + continue + } let idBytes = PacketIdUtil.computeId(pkt) if !mightContain(idBytes) { var toSend = pkt @@ -400,7 +428,7 @@ final class GossipSyncManager { } // Build REQUEST_SYNC payload using current candidates and GCS params - private func buildGcsPayload(for types: SyncTypeFlags) -> Data { + private func buildGcsPayload(for types: SyncTypeFlags, fragmentIdFilter: String? = nil) -> Data { var candidates: [BitchatPacket] = [] if types.contains(.announce) { for (_, pkt) in latestAnnouncementByPeer where isPacketFresh(pkt) { @@ -421,7 +449,7 @@ final class GossipSyncManager { } if candidates.isEmpty { let p = GCSFilter.deriveP(targetFpr: config.gcsTargetFpr) - let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types) + let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types, fragmentIdFilter: fragmentIdFilter) return req.encode() } @@ -442,7 +470,7 @@ final class GossipSyncManager { } let takeN = min(candidates.count, min(nMax, cap)) if takeN <= 0 { - let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types) + let req = RequestSyncPacket(p: p, m: 1, data: Data(), types: types, fragmentIdFilter: fragmentIdFilter) return req.encode() } let included = Array(candidates.prefix(takeN)) @@ -460,7 +488,7 @@ final class GossipSyncManager { let sinceTimestamp: UInt64? = (covered < candidates.count && covered > 0) ? included[covered - 1].timestamp : nil - let req = RequestSyncPacket(p: params.p, m: params.m, data: params.data, types: types, sinceTimestamp: sinceTimestamp) + let req = RequestSyncPacket(p: params.p, m: params.m, data: params.data, types: types, sinceTimestamp: sinceTimestamp, fragmentIdFilter: fragmentIdFilter) return req.encode() } diff --git a/bitchatTests/GossipSyncManagerTests.swift b/bitchatTests/GossipSyncManagerTests.swift index 0e7b35eb..81516543 100644 --- a/bitchatTests/GossipSyncManagerTests.swift +++ b/bitchatTests/GossipSyncManagerTests.swift @@ -507,6 +507,98 @@ struct GossipSyncManagerTests { #expect(sentPackets[0].type == MessageType.fragment.rawValue) } + // MARK: - Fragment-ID filter (targeted resync) + + private func makeFragmentPacket(sender: Data, fragmentID: Data, index: UInt16, timestamp: UInt64) -> BitchatPacket { + // Fragment payload: 8-byte stream ID + index + total + original type. + var payload = fragmentID + payload.append(contentsOf: withUnsafeBytes(of: index.bigEndian) { Data($0) }) + payload.append(contentsOf: withUnsafeBytes(of: UInt16(4).bigEndian) { Data($0) }) + payload.append(MessageType.fileTransfer.rawValue) + payload.append(Data([0xEE])) + return BitchatPacket( + type: MessageType.fragment.rawValue, + senderID: sender, + recipientID: nil, + timestamp: timestamp, + payload: payload, + signature: nil, + ttl: 1 + ) + } + + @Test func handleRequestSyncHonorsFragmentIdFilter() async throws { + var config = GossipSyncManager.Config() + config.fragmentCapacity = 10 + config.messageSyncIntervalSeconds = 0 + config.fragmentSyncIntervalSeconds = 0 + config.fileTransferSyncIntervalSeconds = 0 + + let requestSyncManager = RequestSyncManager() + let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) + let delegate = RecordingDelegate() + manager.delegate = delegate + + let sender = try #require(Data(hexString: "aabbccddeeff0011")) + let wantedID = try #require(Data(hexString: "0102030405060708")) + let otherID = try #require(Data(hexString: "1112131415161718")) + let nowMs = UInt64(Date().timeIntervalSince1970 * 1000) + + let wanted = makeFragmentPacket(sender: sender, fragmentID: wantedID, index: 1, timestamp: nowMs - 60_000) + let other = makeFragmentPacket(sender: sender, fragmentID: otherID, index: 2, timestamp: nowMs) + manager.onPublicPacketSeen(wanted) + manager.onPublicPacketSeen(other) + + // The since-cursor sits after both fragments; without the filter the + // responder would send nothing for `wanted`. The filter both bypasses + // the cursor and restricts the diff to exactly the named stream. + let request = RequestSyncPacket( + p: 7, + m: 1, + data: Data(), + types: .fragment, + sinceTimestamp: nowMs + 1, + fragmentIdFilter: RequestSyncPacket.encodeFragmentIdFilter([wantedID]) + ) + manager.handleRequestSync(from: PeerID(str: "FFFFFFFFFFFFFFFF"), request: request) + + try await TestHelpers.waitFor({ delegate.packets.count == 1 }, timeout: TestConstants.shortTimeout) + // Barrier: flush the sync queue so a late second packet would be visible. + manager._performMaintenanceSynchronously(now: Date()) + let sentPackets = delegate.packets + #expect(sentPackets.count == 1) + let sent = try #require(sentPackets.first) + #expect(sent.type == MessageType.fragment.rawValue) + #expect(sent.payload.prefix(8) == wantedID) + #expect(sent.ttl == 0) + #expect(sent.isRSR) + } + + @Test func requestMissingFragmentsSendsFilteredRequestToConnectedPeers() async throws { + var config = GossipSyncManager.Config() + config.messageSyncIntervalSeconds = 0 + config.fragmentSyncIntervalSeconds = 0 + config.fileTransferSyncIntervalSeconds = 0 + + let requestSyncManager = RequestSyncManager() + let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) + let delegate = RecordingDelegate() + delegate.connectedPeers = [PeerID(str: "FFFFFFFFFFFFFFFF")] + manager.delegate = delegate + + let stalledID = try #require(Data(hexString: "0102030405060708")) + manager.requestMissingFragments(fragmentIDs: [stalledID]) + + try await TestHelpers.waitFor({ delegate.packets.count == 1 }, timeout: TestConstants.shortTimeout) + let sent = try #require(delegate.packets.first) + #expect(sent.type == MessageType.requestSync.rawValue) + #expect(sent.ttl == 0) + let request = try #require(RequestSyncPacket.decode(from: sent.payload)) + #expect(request.types == .fragment) + let ids = try #require(RequestSyncPacket.decodeFragmentIdFilter(request.fragmentIdFilter)) + #expect(ids == Set([stalledID])) + } + // MARK: - Archive persistence @Test func publicMessagesRestoreFromArchiveAcrossRestart() async throws { @@ -583,6 +675,7 @@ struct GossipSyncManagerTests { private final class RecordingDelegate: GossipSyncManager.Delegate { var onSend: (() -> Void)? + var connectedPeers: [PeerID] = [] private(set) var lastPacket: BitchatPacket? private(set) var packets: [BitchatPacket] = [] private let lock = NSLock() @@ -604,6 +697,6 @@ private final class RecordingDelegate: GossipSyncManager.Delegate { } func getConnectedPeers() -> [PeerID] { - return [] + return connectedPeers } } diff --git a/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift b/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift index ed7c66a1..a4423ec9 100644 --- a/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift +++ b/bitchatTests/Services/BLEFragmentAssemblyBufferTests.swift @@ -135,6 +135,140 @@ struct BLEFragmentAssemblyBufferTests { } } + @Test + func stalledBroadcastAssemblyReportsFragmentIDOnceUntilRetryLapses() throws { + var buffer = BLEFragmentAssemblyBuffer() + let fragmentID = Data((1...8).map { UInt8($0) }) + let packet = makePacket(payload: makePayload(count: 256)) + let fragments = try makeFragments(for: packet, chunkSize: 128, fragmentID: fragmentID) + let first = try #require(BLEFragmentHeader(packet: fragments[0])) + + let t0 = Date(timeIntervalSince1970: 100) + _ = buffer.append(first, maxInFlightAssemblies: 8, now: t0) + + // Not yet stalled. + let early = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(4)) + #expect(early.isEmpty) + + // Stalled: reported once, big-endian stream ID. + let stalled = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(6)) + #expect(stalled == [fragmentID]) + + // Within the retry window: not re-reported. + let repeated = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(8)) + #expect(repeated.isEmpty) + + // After the retry window it is requested again. + let retried = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(17)) + #expect(retried == [fragmentID]) + } + + @Test + func newFragmentResetsStallClockAndCompletionStopsRequests() throws { + var buffer = BLEFragmentAssemblyBuffer() + let fragmentID = Data((10...17).map { UInt8($0) }) + let packet = makePacket(payload: makePayload(count: 384)) + let fragments = try makeFragments(for: packet, chunkSize: 128, fragmentID: fragmentID) + let headers = try fragments.map { try #require(BLEFragmentHeader(packet: $0)) } + #expect(headers.count >= 3) + + let t0 = Date(timeIntervalSince1970: 100) + _ = buffer.append(headers[0], maxInFlightAssemblies: 8, now: t0) + // A fragment arriving at t0+4 resets the stall clock. + _ = buffer.append(headers[1], maxInFlightAssemblies: 8, now: t0.addingTimeInterval(4)) + let afterProgress = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(6)) + #expect(afterProgress.isEmpty) + + // Completion removes the assembly entirely. + var result: BLEFragmentAssemblyBuffer.AppendResult? + for header in headers.dropFirst(2) { + result = buffer.append(header, maxInFlightAssemblies: 8, now: t0.addingTimeInterval(5)) + } + guard case .complete = result else { + Issue.record("Expected assembly to complete") + return + } + let afterCompletion = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(60)) + #expect(afterCompletion.isEmpty) + } + + @Test + func duplicateFragmentsDoNotResetStallClock() throws { + var buffer = BLEFragmentAssemblyBuffer() + let fragmentID = Data((20...27).map { UInt8($0) }) + let packet = makePacket(payload: makePayload(count: 256)) + let fragments = try makeFragments(for: packet, chunkSize: 128, fragmentID: fragmentID) + let first = try #require(BLEFragmentHeader(packet: fragments[0])) + + let t0 = Date(timeIntervalSince1970: 100) + _ = buffer.append(first, maxInFlightAssemblies: 8, now: t0) + + // Relay duplicates of the same index arrive every few seconds; they + // bring no new data, so they must not keep the stream "fresh". + _ = buffer.append(first, maxInFlightAssemblies: 8, now: t0.addingTimeInterval(3)) + _ = buffer.append(first, maxInFlightAssemblies: 8, now: t0.addingTimeInterval(5)) + + let stalled = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(6)) + #expect(stalled == [fragmentID]) + } + + @Test + func overflowStalledStreamsRotateAcrossPasses() throws { + var buffer = BLEFragmentAssemblyBuffer() + let cap = RequestSyncPacket.maxFragmentIdFilterCount + let streamCount = cap + 10 + let t0 = Date(timeIntervalSince1970: 100) + + // Incomplete broadcast assemblies with staggered last-fragment times + // (stream 0 is the oldest stall). + var ids: [Data] = [] + for i in 0..> 8), UInt8(i & 0xFF)]) + ids.append(fragmentID) + let header = try #require(BLEFragmentHeader(packet: makeFragmentPacket( + fragmentID: fragmentID, + index: 0, + total: 2, + originalType: MessageType.message.rawValue, + fragmentData: Data([0x01]) + ))) + _ = buffer.append(header, maxInFlightAssemblies: streamCount, now: t0.addingTimeInterval(Double(i))) + } + + // All streams are stalled; only the cap's worth (oldest first) is + // requested and rate-limited, the overflow stays eligible. + let firstPassAt = t0.addingTimeInterval(Double(streamCount) + 5) + let firstPass = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 60, now: firstPassAt) + #expect(firstPass == Array(ids.prefix(cap))) + + // Next pass picks up exactly the overflow streams. + let secondPass = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 60, now: firstPassAt.addingTimeInterval(1)) + #expect(secondPass == Array(ids.suffix(streamCount - cap))) + + // Nothing left until a retry window lapses. + let thirdPass = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 60, now: firstPassAt.addingTimeInterval(2)) + #expect(thirdPass.isEmpty) + } + + @Test + func directedAssembliesAreNeverReportedAsStalled() throws { + var buffer = BLEFragmentAssemblyBuffer() + let fragment = makeFragmentPacket( + fragmentID: Data(repeating: 0x0A, count: 8), + index: 0, + total: 2, + originalType: MessageType.message.rawValue, + fragmentData: Data([0x01]), + recipientID: Data(hexString: "0102030405060708") + ) + let header = try #require(BLEFragmentHeader(packet: fragment)) + + let t0 = Date(timeIntervalSince1970: 100) + _ = buffer.append(header, maxInFlightAssemblies: 8, now: t0) + let stalled = buffer.stalledBroadcastFragmentIDs(stalledAfter: 5, retryAfter: 10, now: t0.addingTimeInterval(60)) + #expect(stalled.isEmpty) + } + private func makePacket(payload: Data, timestamp: UInt64 = 0x0102030405) -> BitchatPacket { BitchatPacket( type: MessageType.message.rawValue, diff --git a/bitchatTests/Services/BLESourceRouteFailureCacheTests.swift b/bitchatTests/Services/BLESourceRouteFailureCacheTests.swift new file mode 100644 index 00000000..5d3315f6 --- /dev/null +++ b/bitchatTests/Services/BLESourceRouteFailureCacheTests.swift @@ -0,0 +1,98 @@ +// +// BLESourceRouteFailureCacheTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import BitFoundation +@testable import bitchat + +struct BLESourceRouteFailureCacheTests { + private let recipient = PeerID(str: "0102030405060708") + private let config = BLESourceRouteFailureCache.Config( + confirmationWindowSeconds: 10, + suppressionSeconds: 60 + ) + + private func attempts(_ cache: inout BLESourceRouteFailureCache, at date: Date) -> Bool { + cache.shouldAttemptRoute(to: recipient, now: date) + } + + @Test func allowsRoutingByDefault() { + var cache = BLESourceRouteFailureCache(config: config) + #expect(attempts(&cache, at: Date())) + } + + @Test func unconfirmedRoutedSendSuppressesRouting() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + // Inside the confirmation window: keep routing. + #expect(attempts(&cache, at: t0.addingTimeInterval(5))) + // Past the window with no inbound traffic: route failed, flood. + #expect(!attempts(&cache, at: t0.addingTimeInterval(11))) + // Still suppressed for the suppression TTL. + #expect(!attempts(&cache, at: t0.addingTimeInterval(40))) + // Suppression lapses: routing may be attempted again. + #expect(attempts(&cache, at: t0.addingTimeInterval(11 + 61))) + } + + @Test func inboundActivityConfirmsPendingSend() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + cache.noteInboundActivity(from: recipient) + // Confirmed: no suppression even long after the window. + #expect(attempts(&cache, at: t0.addingTimeInterval(30))) + } + + @Test func inboundActivityDoesNotLiftActiveSuppression() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + // Trip the failure → suppression starts at t0+15. + #expect(!attempts(&cache, at: t0.addingTimeInterval(15))) + // Inbound traffic may have arrived via flood; suppression holds. + cache.noteInboundActivity(from: recipient) + #expect(!attempts(&cache, at: t0.addingTimeInterval(20))) + #expect(attempts(&cache, at: t0.addingTimeInterval(15 + 61))) + } + + @Test func backToBackSendsShareOneDeadline() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + cache.noteRoutedSend(to: recipient, now: t0.addingTimeInterval(8)) + // Deadline runs from the first unconfirmed send. + #expect(!attempts(&cache, at: t0.addingTimeInterval(11))) + } + + @Test func pruneDropsExpiredEntries() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + // Past confirmation + suppression: the entry can no longer matter. + cache.prune(now: t0.addingTimeInterval(75)) + #expect(attempts(&cache, at: t0.addingTimeInterval(76))) + } + + @Test func pruneKeepsEntriesThatStillMatter() { + var cache = BLESourceRouteFailureCache(config: config) + let t0 = Date() + + cache.noteRoutedSend(to: recipient, now: t0) + cache.prune(now: t0.addingTimeInterval(30)) + // The unconverted pending entry survives pruning and still converts + // into a suppression on the next routing decision. + #expect(!attempts(&cache, at: t0.addingTimeInterval(31))) + } +} diff --git a/bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift b/bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift new file mode 100644 index 00000000..c762a0c7 --- /dev/null +++ b/bitchatTests/Services/BLESourceRouteOriginationPolicyTests.swift @@ -0,0 +1,98 @@ +// +// BLESourceRouteOriginationPolicyTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import BitFoundation +@testable import bitchat + +struct BLESourceRouteOriginationPolicyTests { + private let localPeerIDData = Data(hexString: "0102030405060708")! + private let recipient = PeerID(str: "1112131415161718") + private let hop = Data(hexString: "2122232425262728")! + + private func makePacket( + senderID: Data? = nil, + recipientID: Data? = Data(hexString: "1112131415161718"), + ttl: UInt8 = 7 + ) -> BitchatPacket { + BitchatPacket( + type: MessageType.noiseEncrypted.rawValue, + senderID: senderID ?? localPeerIDData, + recipientID: recipientID, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: Data([0x01]), + signature: nil, + ttl: ttl + ) + } + + private func route( + packet: BitchatPacket, + isRecipientConnected: Bool = false, + shouldAttemptRoute: Bool = true, + computedRoute: [Data]? = nil + ) -> [Data]? { + BLESourceRouteOriginationPolicy.route( + for: packet, + to: recipient, + localPeerIDData: localPeerIDData, + isRecipientConnected: { _ in isRecipientConnected }, + shouldAttemptRoute: { _ in shouldAttemptRoute }, + computeRoute: { _ in computedRoute ?? [self.hop] } + ) + } + + @Test func routesWhenAllGatesPass() { + #expect(route(packet: makePacket()) == [hop]) + } + + @Test func relayedPacketNeverGetsRoute() { + let relayed = makePacket(senderID: Data(hexString: "aabbccddeeff0011")) + #expect(route(packet: relayed) == nil) + } + + @Test func broadcastRecipientNeverGetsRoute() { + let broadcast = makePacket(recipientID: Data(repeating: 0xFF, count: 8)) + #expect(route(packet: broadcast) == nil) + let noRecipient = makePacket(recipientID: nil) + #expect(route(packet: noRecipient) == nil) + } + + @Test func linkLocalTTLNeverGetsRoute() { + // TTL 0/1 packets (e.g. REQUEST_SYNC) cannot traverse hops. + #expect(route(packet: makePacket(ttl: 0)) == nil) + #expect(route(packet: makePacket(ttl: 1)) == nil) + } + + @Test func directlyConnectedRecipientNeverGetsRoute() { + #expect(route(packet: makePacket(), isRecipientConnected: true) == nil) + } + + @Test func suppressedRecipientFallsBackToFlood() { + #expect(route(packet: makePacket(), shouldAttemptRoute: false) == nil) + } + + @Test func missingOrEmptyRouteFallsBackToFlood() { + var sawComputeRoute = false + let result = BLESourceRouteOriginationPolicy.route( + for: makePacket(), + to: recipient, + localPeerIDData: localPeerIDData, + isRecipientConnected: { _ in false }, + shouldAttemptRoute: { _ in true }, + computeRoute: { _ in + sawComputeRoute = true + return nil + } + ) + #expect(result == nil) + #expect(sawComputeRoute) + #expect(route(packet: makePacket(), computedRoute: []) == nil) + } +} diff --git a/bitchatTests/Services/MeshTopologyTrackerTests.swift b/bitchatTests/Services/MeshTopologyTrackerTests.swift index 1ae0f5f5..fa5d2a4d 100644 --- a/bitchatTests/Services/MeshTopologyTrackerTests.swift +++ b/bitchatTests/Services/MeshTopologyTrackerTests.swift @@ -94,10 +94,132 @@ struct MeshTopologyTrackerTests { tracker.updateNeighbors(for: a, neighbors: [b]) tracker.updateNeighbors(for: b, neighbors: [a]) - + // When start == end, route should be empty (no intermediate hops needed) let route = try #require(tracker.computeRoute(from: a, to: a)) #expect(route == []) } + @Test func noPathReturnsNil() throws { + let tracker = MeshTopologyTracker() + let a = try hex("0101010101010101") + let b = try hex("0202020202020202") + let c = try hex("0303030303030303") + let d = try hex("0404040404040404") + + // Two disconnected islands: A-B and C-D + tracker.updateNeighbors(for: a, neighbors: [b]) + tracker.updateNeighbors(for: b, neighbors: [a]) + tracker.updateNeighbors(for: c, neighbors: [d]) + tracker.updateNeighbors(for: d, neighbors: [c]) + + #expect(tracker.computeRoute(from: a, to: d) == nil) + } + + /// Build a confirmed line topology n0 - n1 - ... - n(count-1). + private func makeLine(_ tracker: MeshTopologyTracker, count: Int) throws -> [Data] { + let nodes = try (0.. 0 { neighbors.append(nodes[i - 1]) } + if i < count - 1 { neighbors.append(nodes[i + 1]) } + tracker.updateNeighbors(for: nodes[i], neighbors: neighbors) + } + return nodes + } + + @Test func maxHopsCapsIntermediateHopCount() throws { + let tracker = MeshTopologyTracker() + // 7 nodes: source + 5 intermediates + target + let nodes = try makeLine(tracker, count: 7) + + // 5 intermediates exceed a 4-hop cap + #expect(tracker.computeRoute(from: nodes[0], to: nodes[6], maxHops: 4) == nil) + // 4 intermediates fit exactly + let route = try #require(tracker.computeRoute(from: nodes[0], to: nodes[5], maxHops: 4)) + #expect(route == Array(nodes[1...4])) + } + + @Test func staleNeighborBlocksRoute() throws { + let tracker = MeshTopologyTracker() + let a = try hex("0101010101010101") + let b = try hex("0202020202020202") + let c = try hex("0303030303030303") + + let staleDate = Date().addingTimeInterval(-120) // past 60s freshness + tracker.updateNeighbors(for: a, neighbors: [b]) + tracker.updateNeighbors(for: b, neighbors: [a, c], at: staleDate) + tracker.updateNeighbors(for: c, neighbors: [b]) + + #expect(tracker.computeRoute(from: a, to: c) == nil) + + // Refreshing B restores the route. + tracker.updateNeighbors(for: b, neighbors: [a, c]) + let route = try #require(tracker.computeRoute(from: a, to: c)) + #expect(route == [b]) + } + + @Test func versionGateBlocksV1AndUnknownHops() throws { + let tracker = MeshTopologyTracker() + let a = try hex("0101010101010101") + let b = try hex("0202020202020202") + let c = try hex("0303030303030303") + + tracker.updateNeighbors(for: a, neighbors: [b]) + tracker.updateNeighbors(for: b, neighbors: [a, c]) + tracker.updateNeighbors(for: c, neighbors: [b]) + + // Without the gate the route exists. + #expect(tracker.computeRoute(from: a, to: c) == [b]) + // Version-unknown hops are assumed v1-only and block gated routes. + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == nil) + + // A v1 observation does not unlock the gate. + tracker.recordObservedVersion(1, for: b) + tracker.recordObservedVersion(2, for: c) + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == nil) + + // Once the hop is observed speaking v2 the route opens. + tracker.recordObservedVersion(2, for: b) + let route = try #require(tracker.computeRoute(from: a, to: c, requiringVersion: 2)) + #expect(route == [b]) + } + + @Test func versionGateRequiresV2Target() throws { + let tracker = MeshTopologyTracker() + let a = try hex("0101010101010101") + let b = try hex("0202020202020202") + let c = try hex("0303030303030303") + + tracker.updateNeighbors(for: a, neighbors: [b]) + tracker.updateNeighbors(for: b, neighbors: [a, c]) + tracker.updateNeighbors(for: c, neighbors: [b]) + tracker.recordObservedVersion(2, for: b) + + // The recipient must decode the v2 frame too. + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == nil) + + tracker.recordObservedVersion(2, for: c) + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == [b]) + } + + @Test func pruneDropsStaleObservedVersions() throws { + let tracker = MeshTopologyTracker() + let a = try hex("0101010101010101") + let b = try hex("0202020202020202") + let c = try hex("0303030303030303") + + tracker.updateNeighbors(for: a, neighbors: [b]) + tracker.updateNeighbors(for: b, neighbors: [a, c]) + tracker.updateNeighbors(for: c, neighbors: [b]) + let old = Date().addingTimeInterval(-120) + tracker.recordObservedVersion(2, for: b, at: old) + tracker.recordObservedVersion(2, for: c, at: old) + + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == [b]) + tracker.prune(olderThan: 60) + // Claims are fresh but the version observations aged out. + #expect(tracker.computeRoute(from: a, to: c, requiringVersion: 2) == nil) + } + } diff --git a/bitchatTests/Sync/RequestSyncPacketFragmentFilterTests.swift b/bitchatTests/Sync/RequestSyncPacketFragmentFilterTests.swift new file mode 100644 index 00000000..d055bde6 --- /dev/null +++ b/bitchatTests/Sync/RequestSyncPacketFragmentFilterTests.swift @@ -0,0 +1,76 @@ +// +// RequestSyncPacketFragmentFilterTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import BitFoundation +@testable import bitchat + +struct RequestSyncPacketFragmentFilterTests { + + @Test func fragmentIdFilterRoundTripsThroughWireEncoding() throws { + let id1 = try #require(Data(hexString: "00112233445566aa")) + let id2 = try #require(Data(hexString: "ffeeddccbbaa9988")) + let filter = try #require(RequestSyncPacket.encodeFragmentIdFilter([id1, id2])) + + let packet = RequestSyncPacket(p: 7, m: 128, data: Data([0x01]), types: .fragment, fragmentIdFilter: filter) + let decoded = try #require(RequestSyncPacket.decode(from: packet.encode())) + + #expect(decoded.fragmentIdFilter == filter) + let ids = try #require(RequestSyncPacket.decodeFragmentIdFilter(decoded.fragmentIdFilter)) + #expect(ids == Set([id1, id2])) + } + + @Test func encodeCapsFilterAtMaxCountWithinDecoderBudget() throws { + let ids = (0..<100).map { i -> Data in + var id = Data(repeating: 0, count: 8) + id[7] = UInt8(i) + return id + } + let filter = try #require(RequestSyncPacket.encodeFragmentIdFilter(ids)) + + let tokens = filter.split(separator: ",") + #expect(tokens.count == RequestSyncPacket.maxFragmentIdFilterCount) + // 60 IDs * 17 bytes ("<16 hex>,") - 1 = 1019 ≤ the 1024-byte cap. + #expect(filter.utf8.count == 1019) + #expect(filter.utf8.count <= 1024) + } + + @Test func encodeDropsMalformedIDs() throws { + let good = try #require(Data(hexString: "0011223344556677")) + let short = Data([0x01, 0x02]) + let filter = try #require(RequestSyncPacket.encodeFragmentIdFilter([short, good])) + #expect(filter == good.hexEncodedString()) + #expect(RequestSyncPacket.encodeFragmentIdFilter([short]) == nil) + #expect(RequestSyncPacket.encodeFragmentIdFilter([]) == nil) + } + + @Test func decodeIgnoresMalformedTokens() throws { + let good = try #require(Data(hexString: "0011223344556677")) + let ids = try #require( + RequestSyncPacket.decodeFragmentIdFilter("zzzz,0011,0011223344556677,") + ) + #expect(ids == Set([good])) + #expect(RequestSyncPacket.decodeFragmentIdFilter(nil) == nil) + #expect(RequestSyncPacket.decodeFragmentIdFilter("not-hex") == nil) + } + + @Test func decoderIgnoresOversizedFilterValue() throws { + // Hand-roll a payload whose 0x06 TLV exceeds the acceptance cap; the + // request must still decode, with the filter dropped. + var payload = RequestSyncPacket(p: 7, m: 128, data: Data([0x01])).encode() + let oversized = Data(repeating: UInt8(ascii: "a"), count: 1025) + payload.append(0x06) + payload.append(UInt8((oversized.count >> 8) & 0xFF)) + payload.append(UInt8(oversized.count & 0xFF)) + payload.append(oversized) + + let decoded = try #require(RequestSyncPacket.decode(from: payload)) + #expect(decoded.fragmentIdFilter == nil) + } +} diff --git a/docs/REQUEST_SYNC_MANAGER.md b/docs/REQUEST_SYNC_MANAGER.md index b304508e..a885f159 100644 --- a/docs/REQUEST_SYNC_MANAGER.md +++ b/docs/REQUEST_SYNC_MANAGER.md @@ -20,9 +20,11 @@ The new implementation introduces a **RequestSyncManager** to track outgoing syn ### Request Sync Payload The `REQUEST_SYNC` packet payload (TLV encoded) has been updated to include: -* **Future Filters**: - * `sinceTimestamp` (Type 0x05): To request packets since a certain time (UInt64 big-endian). - * `fragmentIdFilter` (Type 0x06): To request specific fragments (UTF-8 string). +* `sinceTimestamp` (Type 0x05): filter-coverage cursor (UInt64 big-endian). The requester's GCS filter only covers packets at or after this timestamp; the responder skips older packets instead of re-sending them every round. +* `fragmentIdFilter` (Type 0x06): targeted fragment resync (UTF-8 string). Comma-separated 16-hex-char (8-byte) fragment **stream IDs** — the ID that prefixes every fragment payload. + * **Requester**: when a broadcast reassembly stalls (no new fragment for 5 s), the fragment assembler reports the stream ID and a `REQUEST_SYNC` with `types = fragment` and this filter goes to each connected peer (re-requested at most every 10 s per stream). Directed reassemblies are excluded — peers only archive broadcast fragments for sync. + * **Responder**: when the filter is present, the fragment diff is restricted to exactly the named streams and the `sinceTimestamp` cursor is bypassed for them; the GCS filter still excludes pieces the requester already holds. Responses keep RSR marking, TTL 0, per-peer response rate limiting (8/30 s), and `REQUEST_SYNC` itself remains link-local (TTL 0, never relayed). + * **Bounds**: at most 60 IDs per request. Each ID encodes as 16 hex chars plus a comma separator, so the largest value is 60 × 17 − 1 = 1019 bytes, within the decoder's 1024-byte acceptance cap; oversized filter values are ignored (the rest of the request still decodes). ## Architecture diff --git a/docs/SOURCE_ROUTING.md b/docs/SOURCE_ROUTING.md index 6832a16e..55d00232 100644 --- a/docs/SOURCE_ROUTING.md +++ b/docs/SOURCE_ROUTING.md @@ -2,7 +2,7 @@ This document specifies the Source-Based Routing extension (v2) for the BitChat protocol. This upgrade enables efficient unicast routing across the mesh by allowing senders to specify an explicit path of intermediate relays. -**Status:** Implemented in Android and iOS. Backward compatible (v1 clients ignore routing data). +**Status:** Implemented in Android and iOS: both decode routed packets, forward along routes, and originate routes. iOS origination is policy-gated (see §8). Backward compatible (v1 clients never receive routed frames from iOS: routes are only originated when every node on the path has been observed speaking v2). --- @@ -144,3 +144,44 @@ When a node receives a packet **not** addressed to itself: * **Fallback:** If the Next Hop is unreachable, **fall back to broadcast/flood** to ensure delivery. 3. **If NO (Standard):** * Flood the packet to all connected neighbors (subject to TTL and probability rules). + +--- + +## 8. iOS Origination Policy + +iOS attaches a route (upgrading the packet to v2 and re-signing it) only when +**all** of the following hold at send time (`BLESourceRouteOriginationPolicy`): + +1. **Authored locally.** The packet's `SenderID` is our own peer ID. Relays + never rewrite someone else's packet — adding a route would force a + re-sign under the wrong key. Relays only *follow* existing routes + (`BLERouteForwardingPolicy`). +2. **Directed.** The packet has a single-peer `RecipientID` (not the + broadcast ID). In practice this covers Noise-encrypted private traffic, + private file transfers, and their fragments (fragments inherit the + parent's route and version, per §5). +3. **TTL headroom.** `TTL > 1`. Link-local packets (e.g. `REQUEST_SYNC`, + always TTL 0) never carry routes. +4. **Recipient not directly connected.** A direct write already delivers in + one hop; a route would only add bytes. +5. **Complete v2 path exists.** BFS over the confirmed-edge mesh graph + (`MeshTopologyTracker`, built from verified announce `directNeighbors` + claims, entries expiring after 60 s) finds a path with **at most 4 + intermediate hops** where every intermediate hop **and the recipient** + has been observed originating or relaying a v2 packet. Nodes never seen + speaking v2 are assumed v1-only and are excluded — a v1 client cannot + decode a v2 frame, so routing through it would silently drop the packet. +6. **No recent route failure.** See below. + +If any gate fails, behavior is exactly the pre-routing flood/direct-write +path — v1 peers observe no change. + +### Failure Fallback + +A routed unicast rides one path; a broken hop loses the packet where a flood +would heal around it. iOS keeps a small per-recipient health cache +(`BLESourceRouteFailureCache`): a routed send that sees no inbound packet +authored by the recipient within 10 s counts as a route failure, and directed +sends to that recipient fall back to flooding for the next 60 s before +routing is attempted again. Retransmission of the payload itself stays where +it always was (MessageRouter and higher layers). diff --git a/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift b/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift index b46a552d..ca29a2b2 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift @@ -14,7 +14,7 @@ import struct Foundation.Date /// including TTL for hop limiting and optional encryption. /// - Note: Packets larger than BLE MTU (512 bytes) are automatically fragmented public struct BitchatPacket: Codable { - let version: UInt8 + public let version: UInt8 public let type: UInt8 public let senderID: Data public let recipientID: Data? From 23601407609808d1074e33aafe607230b8d0d462 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:48:37 +0200 Subject: [PATCH 036/158] Transitive verification: vouch for verified peers over Noise (#1380) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add capability bits to announce TLV Announces now carry an optional capabilities TLV (0x05): a little-endian bitfield with named bits for upcoming features (prekeys, wifiBulk, gateway, groups, board, vouch, meshDiagnostics). Old clients skip the unknown TLV; peers without it decode as nil so features can distinguish "legacy peer" from "advertises nothing". PeerCapabilities lives in BitFoundation with a minimal-length encoding that preserves unknown bits for forward compatibility. Peer capabilities are stored in the BLE peer registry on verified announce and exposed via BLEService.peerCapabilities(_:). The local advertisement set is empty until each feature ships its bit. Co-Authored-By: Claude Fable 5 * Transitive verification: vouch for verified peers over Noise When a Noise session establishes with a peer I verified and that peer advertises the .vouch capability, send signed attestations (up to 16, most recently verified first, at most once per peer per 24h) for the OTHER fingerprints I verified. Receivers accept vouches only from senders they verified themselves, verify the Ed25519 signature against the sender's announce-bound signing key, and surface the result as a new derived trust tier: vouched (unfilled seal) between casual and trusted. Protocol: - NoisePayloadType.vouch = 0x12 carries a batch of TLV attestations: voucheeFingerprint (32B), voucheeSigningKey (32B), timestamp (uint64 ms BE), Ed25519 signature over "bitchat-vouch-v1" | fingerprint | signingKey | timestamp. The voucher is implicit in the authenticated session. - PeerCapabilities.localSupported now advertises .vouch. Storage (SecureIdentityStateManager / IdentityCache): - vouches keyed by vouchee, capped at 8 vouchers each; validity is recomputed on read (voucher still verified-by-me, < 30 days old), so unverifying a voucher retires their vouches without cascade deletes. - New IdentityCache fields are Optional so pre-existing encrypted caches decode cleanly; TrustLevel.vouched is inserted mid-ladder but raw values are strings, so persisted values are unaffected (and vouched itself is never persisted). - Panic wipe clears vouch state with the rest of the identity cache. UI: unfilled checkmark.seal badge in the mesh peer list (filled seal stays exclusive to verified) and a "vouched for by N people you verified" section with voucher names in FingerprintView; VoiceOver labels and xcstrings entries included. Tests: attestation encode/decode + signature (forged/tampered/expired), accept-policy gates, batch cap, trust-level derivation incl. voucher invalidation, persistence compat, and coordinator exchange/accept policies. Full macOS suite: 1088 tests passing. Co-Authored-By: Claude Fable 5 * Fix CI deadlock in vouch tests and live-refresh the fingerprint sheet on vouch acceptance Two fixes for PR #1380 review findings: 1. CI "Run Swift Tests (app)" hang (exit 137): the new SecureIdentityStateManagerVouchTests suite was nonisolated, so Swift Testing ran its tests in parallel on the Swift Concurrency cooperative pool. Each test enqueues a queue.async(.barrier) write (setVerified) and immediately blocks in queue.sync / queue.sync(.barrier) (recordVouch / effectiveTrustLevel). On CI's few-core runners every cooperative-pool thread ended up parked behind a pending barrier that never got a dispatch worker, deadlocking the whole test process until the watchdog SIGKILLed it. The suite is now @MainActor, matching the production isolation of the vouch API (ChatVouchCoordinator is @MainActor) and keeping blocking syncs off the cooperative pool. 2. Codex P2: an open fingerprint sheet did not refresh its vouched badge when a vouch batch was accepted - VerificationModel.bind() never observed the trust-change signal. It now subscribes to the "peerStatusUpdated" notification that ChatVouchCoordinator.notifyPeerTrustChanged() posts (same source PeerListModel uses) and forwards it to objectWillChange. Added a regression test that pins VerificationModel's own subscription (verified to fail without the fix). Co-Authored-By: Claude Fable 5 * Skip media-wipe detached tasks under tests (shared-filesystem race) panicClearAllData and clearCurrentPublicTimeline delete the real ~/Library/Application Support/files tree in detached utility-priority tasks. The SPM test process shares that tree and ChatViewModelTests invoke both methods, so under parallel scheduling the wipe lands at a nondeterministic time — deleting media a concurrently running test just wrote (and the developer's real app data with it). Guard both with the existing TestEnvironment.isRunningTests pattern, mirroring the same fix on feat/mesh-diagnostics (#1377). Co-Authored-By: Claude Fable 5 * Port vouch capability-race fix to feat/vouching (ports b8adcbe9) Ports the on-device-confirmed fix from the integration test branch (commit b8adcbe9) onto feat/vouching so PR #1380 is actually correct. On-device testing confirmed the transitive vouch propagated once the send was triggered on verify / announce arrival rather than auth alone. Vouch attestations only ever sent from peerAuthenticated, gated on the peer's .vouch capability. That capability arrives via the peer's announce, processed independently of the Noise handshake, so at auth time the set was usually empty -> gate failed -> vouch silently skipped and never retried. - Refactor the send path into a reusable attemptVouch(to:fingerprint:now:). - Trigger on peer-list updates (peersUpdated): fired after every verified announce, so the batch goes out once the .vouch bit actually arrives. - Trigger on local verification (vouchToConnectedVerifiedPeers): verifying a peer runs a vouch pass over connected verified peers, covering the verify-while-connected case and propagating the new identity onward. - Relax the capability gate: treat an empty/unknown set as eligible (the Noise 0x12 payload is ignored by non-supporting peers); only skip when a non-empty set explicitly lacks .vouch. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/PeerListModel.swift | 19 +- bitchat/App/VerificationModel.swift | 41 +- bitchat/Identity/IdentityModels.swift | 41 +- .../Identity/SecureIdentityStateManager.swift | 172 ++++++++- bitchat/Localizable.xcstrings | 70 ++++ bitchat/Protocols/BitchatProtocol.swift | 5 +- .../Protocols/PeerCapabilities+Local.swift | 2 +- bitchat/Protocols/VouchAttestation.swift | 225 +++++++++++ bitchat/Services/BLE/BLEService.swift | 12 + bitchat/Services/Transport.swift | 15 + .../ChatPublicConversationCoordinator.swift | 5 + .../ChatTransportEventCoordinator.swift | 8 + .../ChatVerificationCoordinator.swift | 13 + bitchat/ViewModels/ChatViewModel.swift | 22 ++ bitchat/ViewModels/ChatVouchCoordinator.swift | 272 ++++++++++++++ bitchat/ViewModels/NostrInboundPipeline.swift | 6 +- bitchat/Views/FingerprintView.swift | 43 +++ bitchat/Views/MeshPeerList.swift | 13 + bitchatTests/AppArchitectureTests.swift | 39 ++ ...ransportEventCoordinatorContextTests.swift | 6 + ...tVerificationCoordinatorContextTests.swift | 3 + .../ChatVouchCoordinatorContextTests.swift | 353 ++++++++++++++++++ bitchatTests/Mocks/MockIdentityManager.swift | 47 ++- .../Protocols/VouchAttestationTests.swift | 176 +++++++++ ...SecureIdentityStateManagerVouchTests.swift | 335 +++++++++++++++++ .../Services/UnifiedPeerServiceTests.swift | 33 ++ 26 files changed, 1957 insertions(+), 19 deletions(-) create mode 100644 bitchat/Protocols/VouchAttestation.swift create mode 100644 bitchat/ViewModels/ChatVouchCoordinator.swift create mode 100644 bitchatTests/ChatVouchCoordinatorContextTests.swift create mode 100644 bitchatTests/Protocols/VouchAttestationTests.swift create mode 100644 bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift diff --git a/bitchat/App/PeerListModel.swift b/bitchat/App/PeerListModel.swift index 38f20a1c..1846b487 100644 --- a/bitchat/App/PeerListModel.swift +++ b/bitchat/App/PeerListModel.swift @@ -14,6 +14,9 @@ struct MeshPeerRow: Identifiable, Equatable { let isMutualFavorite: Bool let encryptionStatus: EncryptionStatus let showsVerifiedBadgeWhenOffline: Bool + /// Vouched-for by someone I verified, without an explicit verification of + /// mine — rendered as the unfilled seal (verified gets the filled one). + let showsVouchedBadge: Bool var id: String { peerID.id } } @@ -183,13 +186,12 @@ final class PeerListModel: ObservableObject { let myPeerID = chatViewModel.meshService.myPeerID let meshRows = allPeers.map { peer in let isMe = peer.peerID == myPeerID - let verifiedBadge: Bool - if !isMe && !peer.isConnected, - let fingerprint = chatViewModel.getFingerprint(for: peer.peerID) { - verifiedBadge = peerIdentityStore.isVerified(fingerprint) - } else { - verifiedBadge = false - } + let fingerprint = isMe ? nil : chatViewModel.getFingerprint(for: peer.peerID) + let isVerifiedFingerprint = fingerprint.map { peerIdentityStore.isVerified($0) } ?? false + let verifiedBadge = !peer.isConnected && isVerifiedFingerprint + // Vouched is subordinate to verified: never show both seals. + let vouchedBadge = !isVerifiedFingerprint + && (fingerprint.map { chatViewModel.isVouchedFingerprint($0) } ?? false) return MeshPeerRow( peerID: peer.peerID, @@ -202,7 +204,8 @@ final class PeerListModel: ObservableObject { isReachable: peer.isReachable, isMutualFavorite: peer.isMutualFavorite, encryptionStatus: chatViewModel.getEncryptionStatus(for: peer.peerID), - showsVerifiedBadgeWhenOffline: verifiedBadge + showsVerifiedBadgeWhenOffline: verifiedBadge, + showsVouchedBadge: vouchedBadge ) } diff --git a/bitchat/App/VerificationModel.swift b/bitchat/App/VerificationModel.swift index bf31f05f..5916a958 100644 --- a/bitchat/App/VerificationModel.swift +++ b/bitchat/App/VerificationModel.swift @@ -9,6 +9,14 @@ struct FingerprintPresentationState: Equatable { let theirFingerprint: String? let myFingerprint: String let isVerified: Bool + /// Number of currently-valid vouches from peers the user verified + /// (0 when the peer is explicitly verified — the stronger badge wins). + let voucherCount: Int + /// Display names of the (verified) vouchers, where known. + let voucherNames: [String] + + /// Vouched for by ≥1 peer the user verified (and not explicitly verified). + var isVouched: Bool { voucherCount > 0 } var canToggleVerification: Bool { encryptionStatus == .noiseSecured || encryptionStatus == .noiseVerified @@ -82,6 +90,24 @@ final class VerificationModel: ObservableObject { let encryptionStatus = chatViewModel.getEncryptionStatus(for: statusPeerID) let theirFingerprint = chatViewModel.getFingerprint(for: statusPeerID) let peerNickname = resolveDisplayName(for: peerID, statusPeerID: statusPeerID) + let isVerified = theirFingerprint.map { peerIdentityStore.isVerified($0) } ?? false + + // Vouch state is recomputed on read: only vouchers still in the + // verified set count, so removing a verification silently retires the + // vouches that peer gave. + let vouchers: [VouchRecord] + if !isVerified, let theirFingerprint { + vouchers = chatViewModel.identityManager.validVouchers(for: theirFingerprint) + } else { + vouchers = [] + } + let voucherNames = vouchers.compactMap { record -> String? in + guard let social = chatViewModel.identityManager.getSocialIdentity(for: record.voucherFingerprint) else { + return nil + } + if let petname = social.localPetname, !petname.isEmpty { return petname } + return social.claimedNickname.isEmpty ? nil : social.claimedNickname + } return FingerprintPresentationState( statusPeerID: statusPeerID, @@ -89,7 +115,9 @@ final class VerificationModel: ObservableObject { encryptionStatus: encryptionStatus, theirFingerprint: theirFingerprint, myFingerprint: chatViewModel.getMyFingerprint(), - isVerified: theirFingerprint.map { peerIdentityStore.isVerified($0) } ?? false + isVerified: isVerified, + voucherCount: vouchers.count, + voucherNames: voucherNames ) } @@ -122,6 +150,17 @@ final class VerificationModel: ObservableObject { self?.objectWillChange.send() } .store(in: &cancellables) + + // Vouch state changes (ChatVouchCoordinator.notifyPeerTrustChanged) + // are signalled via this notification rather than a published + // property, so an open fingerprint sheet refreshes its vouched badge + // live when a vouch batch is accepted. + NotificationCenter.default.publisher(for: Notification.Name("peerStatusUpdated")) + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.objectWillChange.send() + } + .store(in: &cancellables) } private func resolveDisplayName(for peerID: PeerID, statusPeerID: PeerID) -> String { diff --git a/bitchat/Identity/IdentityModels.swift b/bitchat/Identity/IdentityModels.swift index ad83962f..921a071a 100644 --- a/bitchat/Identity/IdentityModels.swift +++ b/bitchat/Identity/IdentityModels.swift @@ -126,13 +126,37 @@ struct SocialIdentity: Codable { var notes: String? } +/// Trust ladder: unknown → casual → vouched → trusted → verified. +/// +/// Persistence compatibility: `TrustLevel` is stored by its *String* raw +/// value ("unknown", "casual", …), not by ordinal position, so inserting +/// `vouched` mid-ladder cannot corrupt previously persisted values — every +/// pre-existing case keeps the exact raw value it was written with. The +/// `vouched` tier is additionally never persisted into `SocialIdentity` +/// (it's recomputed on read from stored vouches), so downgraded builds never +/// encounter the unfamiliar raw value. enum TrustLevel: String, Codable { case unknown case casual + /// Transitively trusted: vouched for by at least one peer *I* verified. + /// Derived at read time — never written to persistent storage. + case vouched case trusted case verified } +// MARK: - Vouching (transitive verification) + +/// One accepted vouch: a peer I verified (the voucher) attested that they +/// verified the vouchee. Validity is recomputed on read — a record only +/// counts while its voucher remains in `verifiedFingerprints` and its +/// timestamp is within `VouchAttestation.maxAge` — so unverifying a voucher +/// silently invalidates the vouches they gave without a cascade delete. +struct VouchRecord: Codable, Equatable { + let voucherFingerprint: String + let timestamp: Date +} + // MARK: - Identity Cache /// Persistent storage for identity mappings and relationships. @@ -154,7 +178,22 @@ struct IdentityCache: Codable { // Blocked Nostr pubkeys (lowercased hex) for geohash chats var blockedNostrPubkeys: Set = [] - + + // Vouching (transitive verification). All three fields are Optional so + // caches persisted before this feature decode cleanly — the synthesized + // decoder uses decodeIfPresent for optionals, and a missing key must not + // trip the "unreadable cache" recovery path that discards everything. + + // Vouchee fingerprint -> accepted vouches (capped per vouchee) + var vouchesByVouchee: [String: [VouchRecord]]? = nil + + // Peer fingerprint -> when we last sent them a vouch batch (rate limit) + var vouchBatchSentAt: [String: Date]? = nil + + // Fingerprint -> when we verified it (orders outgoing vouch batches; + // entries verified before this field exists sort as oldest) + var verifiedAt: [String: Date]? = nil + // Schema version for future migrations var version: Int = 1 } diff --git a/bitchat/Identity/SecureIdentityStateManager.swift b/bitchat/Identity/SecureIdentityStateManager.swift index fe63f871..021ea776 100644 --- a/bitchat/Identity/SecureIdentityStateManager.swift +++ b/bitchat/Identity/SecureIdentityStateManager.swift @@ -133,6 +133,17 @@ protocol SecureIdentityStateManagerProtocol { func setVerified(fingerprint: String, verified: Bool) func isVerified(fingerprint: String) -> Bool func getVerifiedFingerprints() -> Set + + // MARK: Vouching (transitive verification) + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool + func validVouchers(for fingerprint: String) -> [VouchRecord] + func isVouched(fingerprint: String) -> Bool + func effectiveTrustLevel(for fingerprint: String) -> TrustLevel + func lastVouchBatchSent(to fingerprint: String) -> Date? + func markVouchBatchSent(to fingerprint: String, at date: Date) + func signingPublicKey(forFingerprint fingerprint: String) -> Data? + func mostRecentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] } /// Singleton manager for secure identity state persistence and retrieval. @@ -550,16 +561,20 @@ final class SecureIdentityStateManager: SecureIdentityStateManagerProtocol { queue.async(flags: .barrier) { if verified { self.cache.verifiedFingerprints.insert(fingerprint) + var verifiedAt = self.cache.verifiedAt ?? [:] + verifiedAt[fingerprint] = Date() + self.cache.verifiedAt = verifiedAt } else { self.cache.verifiedFingerprints.remove(fingerprint) + self.cache.verifiedAt?.removeValue(forKey: fingerprint) } - + // Update trust level if social identity exists if var identity = self.cache.socialIdentities[fingerprint] { identity.trustLevel = verified ? .verified : .casual self.cache.socialIdentities[fingerprint] = identity } - + self.saveIdentityCache() } } @@ -576,6 +591,159 @@ final class SecureIdentityStateManager: SecureIdentityStateManagerProtocol { } } + // MARK: - Vouching (transitive verification) + + /// Maximum vouchers retained per vouchee (most recent kept). + static let maxVouchersPerVouchee = 8 + + /// Records an accepted vouch, enforcing every accept-policy gate that can + /// be evaluated against stored state (signature verification is the + /// caller's job — it needs the sender's announce-bound signing key): + /// - the voucher must be a fingerprint *I* verified + /// - self-vouches are ignored + /// - vouches for peers I already verified are ignored (nothing to add) + /// - attestations outside the validity window are ignored + /// - at most `maxVouchersPerVouchee` vouchers are kept per vouchee + /// + /// Returns true when the vouch was stored (or refreshed). + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool { + recordVouch( + voucheeFingerprint: voucheeFingerprint, + voucherFingerprint: voucherFingerprint, + timestamp: timestamp, + now: Date() + ) + } + + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date, now: Date) -> Bool { + queue.sync(flags: .barrier) { + guard voucheeFingerprint != voucherFingerprint, + self.cache.verifiedFingerprints.contains(voucherFingerprint), + !self.cache.verifiedFingerprints.contains(voucheeFingerprint) else { + return false + } + let age = now.timeIntervalSince(timestamp) + guard age <= VouchAttestation.maxAge, age >= -VouchAttestation.maxClockSkew else { + return false + } + + var records = self.cache.vouchesByVouchee?[voucheeFingerprint] ?? [] + if let index = records.firstIndex(where: { $0.voucherFingerprint == voucherFingerprint }) { + let newest = max(records[index].timestamp, timestamp) + records[index] = VouchRecord(voucherFingerprint: voucherFingerprint, timestamp: newest) + } else { + records.append(VouchRecord(voucherFingerprint: voucherFingerprint, timestamp: timestamp)) + } + // Keep the most recent vouchers up to the cap. + records.sort { $0.timestamp > $1.timestamp } + let capped = Array(records.prefix(Self.maxVouchersPerVouchee)) + guard capped.contains(where: { $0.voucherFingerprint == voucherFingerprint }) else { + return false // Full of fresher vouches; nothing changed. + } + + var vouches = self.cache.vouchesByVouchee ?? [:] + vouches[voucheeFingerprint] = capped + self.cache.vouchesByVouchee = vouches + self.saveIdentityCache() + return true + } + } + + /// The vouches that currently count for `fingerprint`. Validity is + /// recomputed here rather than maintained by cascade deletes: a record + /// only counts while its voucher is still verified-by-me and its + /// timestamp is within the expiry window. + func validVouchers(for fingerprint: String) -> [VouchRecord] { + validVouchers(for: fingerprint, now: Date()) + } + + func validVouchers(for fingerprint: String, now: Date) -> [VouchRecord] { + queue.sync { + self.validVouchersLocked(for: fingerprint, now: now) + } + } + + /// Requires `queue`. + private func validVouchersLocked(for fingerprint: String, now: Date) -> [VouchRecord] { + guard let records = cache.vouchesByVouchee?[fingerprint] else { return [] } + return records.filter { record in + record.voucherFingerprint != fingerprint + && cache.verifiedFingerprints.contains(record.voucherFingerprint) + && now.timeIntervalSince(record.timestamp) <= VouchAttestation.maxAge + } + } + + /// True when the peer has at least one valid vouch and no explicit + /// verification of ours. + func isVouched(fingerprint: String) -> Bool { + isVouched(fingerprint: fingerprint, now: Date()) + } + + func isVouched(fingerprint: String, now: Date) -> Bool { + queue.sync { + guard !self.cache.verifiedFingerprints.contains(fingerprint) else { return false } + return !self.validVouchersLocked(for: fingerprint, now: now).isEmpty + } + } + + /// The trust level to display: explicit verification wins, then the + /// persisted level, with `vouched` layered in (derived, never persisted) + /// between `casual` and `trusted`. + func effectiveTrustLevel(for fingerprint: String) -> TrustLevel { + effectiveTrustLevel(for: fingerprint, now: Date()) + } + + func effectiveTrustLevel(for fingerprint: String, now: Date) -> TrustLevel { + queue.sync { + if self.cache.verifiedFingerprints.contains(fingerprint) { return .verified } + let stored = self.cache.socialIdentities[fingerprint]?.trustLevel ?? .unknown + let vouched = !self.validVouchersLocked(for: fingerprint, now: now).isEmpty + switch stored { + case .verified, .trusted: + return stored + case .vouched, .casual, .unknown: + if vouched { return .vouched } + // `.vouched` should never be persisted; degrade defensively. + return stored == .vouched ? .casual : stored + } + } + } + + func lastVouchBatchSent(to fingerprint: String) -> Date? { + queue.sync { cache.vouchBatchSentAt?[fingerprint] } + } + + func markVouchBatchSent(to fingerprint: String, at date: Date) { + queue.async(flags: .barrier) { + var sentAt = self.cache.vouchBatchSentAt ?? [:] + sentAt[fingerprint] = date + self.cache.vouchBatchSentAt = sentAt + self.saveIdentityCache() + } + } + + /// The peer's announce-bound Ed25519 signing key, if seen this session. + func signingPublicKey(forFingerprint fingerprint: String) -> Data? { + queue.sync { cryptographicIdentities[fingerprint]?.signingPublicKey } + } + + /// Verified fingerprints ordered most recently verified first (entries + /// without a recorded verification time sort last), excluding the given + /// fingerprint. Feeds the outgoing vouch batch. + func mostRecentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] { + queue.sync { + let verifiedAt = cache.verifiedAt ?? [:] + let ordered = cache.verifiedFingerprints + .filter { $0 != fingerprint } + .sorted { + (verifiedAt[$0] ?? .distantPast, $0) > (verifiedAt[$1] ?? .distantPast, $1) + } + return Array(ordered.prefix(limit)) + } + } + var debugNicknameIndex: [String: Set] { queue.sync { cache.nicknameIndex } } diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 66fd04b4..5b91da12 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -22479,6 +22479,18 @@ } } }, + "fingerprint.badge.vouched" : { + "comment" : "Badge shown when a peer is vouched for by people the user verified but not directly verified", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ VOUCHED" + } + } + } + }, "fingerprint.handshake_pending" : { "extractionState" : "manual", "localizations" : { @@ -23016,6 +23028,40 @@ } } }, + "fingerprint.message.vouched_by" : { + "comment" : "How many people the user verified have vouched for this peer", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "vouched for by %#@people@ you verified" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d person" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d people" + } + } + } + } + } + } + } + } + }, "fingerprint.their_label" : { "extractionState" : "manual", "localizations" : { @@ -31984,6 +32030,18 @@ } } }, + "mesh_peers.state.vouched" : { + "comment" : "State label for a peer vouched for by someone the user verified", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "vouched" + } + } + } + }, "mesh_peers.tooltip.new_messages" : { "extractionState" : "manual", "localizations" : { @@ -32163,6 +32221,18 @@ } } }, + "mesh_peers.tooltip.vouched" : { + "comment" : "Tooltip for the vouched (unfilled seal) badge next to a peer", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "vouched for by someone you verified" + } + } + } + }, "recording %@" : { "comment" : "Voice note recording duration indicator", "localizations" : { diff --git a/bitchat/Protocols/BitchatProtocol.swift b/bitchat/Protocols/BitchatProtocol.swift index 267d8cc5..c7497051 100644 --- a/bitchat/Protocols/BitchatProtocol.swift +++ b/bitchat/Protocols/BitchatProtocol.swift @@ -77,7 +77,9 @@ enum NoisePayloadType: UInt8 { // Verification (QR-based OOB binding) case verifyChallenge = 0x10 // Verification challenge case verifyResponse = 0x11 // Verification response - + // Transitive verification (web of trust) + case vouch = 0x12 // Batch of vouch attestations + var description: String { switch self { case .privateMessage: return "privateMessage" @@ -85,6 +87,7 @@ enum NoisePayloadType: UInt8 { case .delivered: return "delivered" case .verifyChallenge: return "verifyChallenge" case .verifyResponse: return "verifyResponse" + case .vouch: return "vouch" } } } diff --git a/bitchat/Protocols/PeerCapabilities+Local.swift b/bitchat/Protocols/PeerCapabilities+Local.swift index 40f97b9f..29b94b4c 100644 --- a/bitchat/Protocols/PeerCapabilities+Local.swift +++ b/bitchat/Protocols/PeerCapabilities+Local.swift @@ -3,5 +3,5 @@ import BitFoundation extension PeerCapabilities { /// Capabilities this build advertises in its announce packets. /// Each feature adds its bit here when it ships. - static let localSupported: PeerCapabilities = [] + static let localSupported: PeerCapabilities = [.vouch] } diff --git a/bitchat/Protocols/VouchAttestation.swift b/bitchat/Protocols/VouchAttestation.swift new file mode 100644 index 00000000..a765a11b --- /dev/null +++ b/bitchat/Protocols/VouchAttestation.swift @@ -0,0 +1,225 @@ +// +// VouchAttestation.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import CryptoKit +import Foundation + +/// A signed statement that the *sender of the enclosing Noise payload* has +/// verified the identity described here ("transitive verification"). +/// +/// The voucher's identity is deliberately implicit: attestations only travel +/// inside an authenticated Noise session (`NoisePayloadType.vouch`), so the +/// receiver verifies the Ed25519 signature against the session peer's +/// announce-bound signing key and stores the vouch keyed by that peer's +/// fingerprint. Nothing in the attestation names the voucher, so a captured +/// attestation cannot be replayed by a third party whose signing key doesn't +/// match. +/// +/// Wire format — single attestation (TLV, 1-byte type + 1-byte length): +/// - `0x01` voucheeFingerprint: 32 bytes, SHA-256 of the vouchee's Noise static key +/// - `0x02` voucheeSigningKey: 32 bytes, Ed25519; anchors the vouch to a concrete identity +/// - `0x03` timestamp: 8 bytes big-endian, milliseconds since 1970 +/// - `0x04` signature: 64 bytes, Ed25519 by the VOUCHER's signing key over +/// `"bitchat-vouch-v1" | voucheeFingerprint | voucheeSigningKey | timestamp` +/// +/// Unknown TLV types are skipped for forward compatibility. +/// +/// Batch format (the `vouch` Noise payload body): +/// `[count: UInt8]` then per attestation `[length: UInt16 BE][attestation TLV]`. +struct VouchAttestation: Equatable { + static let signingContext = "bitchat-vouch-v1" + /// Receiver-side expiry for attestations. + static let maxAge: TimeInterval = 30 * 24 * 60 * 60 + /// Tolerated clock skew for attestations timestamped in the future. + static let maxClockSkew: TimeInterval = 60 * 60 + /// Upper bound of attestations carried/accepted in one batch payload. + static let maxBatchCount = 16 + + static let fingerprintSize = 32 + static let signingKeySize = 32 + static let signatureSize = 64 + + let voucheeFingerprint: Data // 32 bytes + let voucheeSigningKey: Data // 32 bytes + let timestampMs: UInt64 + let signature: Data // 64 bytes + + private enum TLVType: UInt8 { + case voucheeFingerprint = 0x01 + case voucheeSigningKey = 0x02 + case timestamp = 0x03 + case signature = 0x04 + } + + var voucheeFingerprintHex: String { voucheeFingerprint.hexEncodedString() } + + var timestamp: Date { Date(timeIntervalSince1970: TimeInterval(timestampMs) / 1000) } + + /// The exact bytes the voucher signs. + static func signableBytes( + voucheeFingerprint: Data, + voucheeSigningKey: Data, + timestampMs: UInt64 + ) -> Data { + var message = Data(signingContext.utf8) + message.append(voucheeFingerprint) + message.append(voucheeSigningKey) + var timestampBE = timestampMs.bigEndian + withUnsafeBytes(of: ×tampBE) { message.append(contentsOf: $0) } + return message + } + + var signableBytes: Data { + Self.signableBytes( + voucheeFingerprint: voucheeFingerprint, + voucheeSigningKey: voucheeSigningKey, + timestampMs: timestampMs + ) + } + + /// Builds and signs an attestation. `sign` is the voucher's Ed25519 + /// signing primitive (e.g. `Transport.noiseSignData`). + static func build( + voucheeFingerprint: Data, + voucheeSigningKey: Data, + timestampMs: UInt64 = UInt64(Date().timeIntervalSince1970 * 1000), + sign: (Data) -> Data? + ) -> VouchAttestation? { + guard voucheeFingerprint.count == fingerprintSize, + voucheeSigningKey.count == signingKeySize else { return nil } + let message = signableBytes( + voucheeFingerprint: voucheeFingerprint, + voucheeSigningKey: voucheeSigningKey, + timestampMs: timestampMs + ) + guard let signature = sign(message), signature.count == signatureSize else { return nil } + return VouchAttestation( + voucheeFingerprint: voucheeFingerprint, + voucheeSigningKey: voucheeSigningKey, + timestampMs: timestampMs, + signature: signature + ) + } + + /// Verifies the Ed25519 signature against the voucher's announce-bound + /// signing key. + func verifySignature(voucherSigningKey: Data) -> Bool { + guard let publicKey = try? Curve25519.Signing.PublicKey(rawRepresentation: voucherSigningKey) else { + return false + } + return publicKey.isValidSignature(signature, for: signableBytes) + } + + /// Whether the attestation is outside its validity window (older than + /// `maxAge`, or timestamped implausibly far in the future). + func isExpired(now: Date = Date()) -> Bool { + let age = now.timeIntervalSince(timestamp) + return age > Self.maxAge || age < -Self.maxClockSkew + } + + // MARK: - Encoding + + func encode() -> Data? { + guard voucheeFingerprint.count == Self.fingerprintSize, + voucheeSigningKey.count == Self.signingKeySize, + signature.count == Self.signatureSize else { return nil } + var data = Data() + func appendTLV(_ type: TLVType, _ value: Data) { + data.append(type.rawValue) + data.append(UInt8(value.count)) + data.append(value) + } + appendTLV(.voucheeFingerprint, voucheeFingerprint) + appendTLV(.voucheeSigningKey, voucheeSigningKey) + var timestampBE = timestampMs.bigEndian + appendTLV(.timestamp, withUnsafeBytes(of: ×tampBE) { Data($0) }) + appendTLV(.signature, signature) + return data + } + + static func decode(from data: Data) -> VouchAttestation? { + var fingerprint: Data? + var signingKey: Data? + var timestampMs: UInt64? + var signature: Data? + + var offset = data.startIndex + while offset < data.endIndex { + guard data.index(offset, offsetBy: 2, limitedBy: data.endIndex) != nil, + offset + 1 < data.endIndex else { return nil } + let type = data[offset] + let length = Int(data[offset + 1]) + let valueStart = offset + 2 + guard let valueEnd = data.index(valueStart, offsetBy: length, limitedBy: data.endIndex) else { + return nil + } + let value = Data(data[valueStart.. Data? { + guard !attestations.isEmpty, attestations.count <= maxBatchCount else { return nil } + var data = Data() + data.append(UInt8(attestations.count)) + for attestation in attestations { + guard let encoded = attestation.encode(), encoded.count <= Int(UInt16.max) else { return nil } + var lengthBE = UInt16(encoded.count).bigEndian + withUnsafeBytes(of: &lengthBE) { data.append(contentsOf: $0) } + data.append(encoded) + } + return data + } + + /// Decodes a batch payload, dropping malformed entries and ignoring + /// anything beyond `maxBatchCount` (sender-declared count is not trusted). + static func decodeList(from data: Data) -> [VouchAttestation] { + guard data.count > 1 else { return [] } + let declaredCount = Int(data[data.startIndex]) + let limit = min(declaredCount, maxBatchCount) + var attestations: [VouchAttestation] = [] + var offset = data.startIndex + 1 + while attestations.count < limit, offset < data.endIndex { + guard let lengthEnd = data.index(offset, offsetBy: 2, limitedBy: data.endIndex) else { break } + let length = Int(data[offset]) << 8 | Int(data[offset + 1]) + guard let entryEnd = data.index(lengthEnd, offsetBy: length, limitedBy: data.endIndex) else { break } + if let attestation = decode(from: Data(data[lengthEnd.. Void) { + // Appends to the encryption service's handler array, so this never + // displaces the callbacks installed by installNoiseSessionCallbacks. + noiseService.addOnPeerAuthenticatedHandler(handler) + } } // MARK: - GossipSyncManager Delegate diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index b02bfdf8..00a17a87 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -132,6 +132,18 @@ protocol Transport: AnyObject { func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) + // Vouching / transitive verification (optional for transports) + /// Capabilities the peer advertised in its last verified announce; + /// empty for peers that predate the capabilities TLV. + func peerCapabilities(_ peerID: PeerID) -> PeerCapabilities + /// Sends an encoded vouch-attestation batch inside the Noise session. + func sendVouchAttestations(_ payload: Data, to peerID: PeerID) + /// Appends a peer-authenticated observer. Unlike + /// `installNoiseSessionCallbacks` this never touches the (single-slot) + /// handshake-required callback, so secondary features can observe + /// session establishment without disturbing the primary registration. + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) + // Pending file management (BCH-01-002: files held in memory until user accepts) func acceptPendingFile(id: String) -> URL? func declinePendingFile(id: String) @@ -157,6 +169,9 @@ extension Transport { func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} + func peerCapabilities(_ peerID: PeerID) -> PeerCapabilities { [] } + func sendVouchAttestations(_ payload: Data, to peerID: PeerID) {} + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) {} func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { false } func sendBoardPayload(_ payload: Data) {} func sendFileBroadcast(_ packet: BitchatFilePacket, transferId: String) {} diff --git a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift index 5a9ad6db..281117f5 100644 --- a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift @@ -293,6 +293,11 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { context.clearPublicConversation(ConversationID(channelID: context.activeChannel)) Task.detached(priority: .utility) { + // Skipped under tests: the test process shares the user's real + // ~/Library/Application Support/files tree, and this detached + // wipe fires at a nondeterministic time — racing tests that + // write media there (see the same guard in panicClearAllData). + guard !TestEnvironment.isRunningTests else { return } do { let base = try FileManager.default.url( for: .applicationSupportDirectory, diff --git a/bitchat/ViewModels/ChatTransportEventCoordinator.swift b/bitchat/ViewModels/ChatTransportEventCoordinator.swift index 75571b2e..a24273d7 100644 --- a/bitchat/ViewModels/ChatTransportEventCoordinator.swift +++ b/bitchat/ViewModels/ChatTransportEventCoordinator.swift @@ -71,6 +71,7 @@ protocol ChatTransportEventContext: AnyObject { // MARK: Verification payloads func handleVerifyChallengePayload(from peerID: PeerID, payload: Data) func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) + func handleVouchPayload(from peerID: PeerID, payload: Data) } extension ChatViewModel: ChatTransportEventContext { @@ -129,6 +130,10 @@ extension ChatViewModel: ChatTransportEventContext { func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) { verificationCoordinator.handleVerifyResponsePayload(from: peerID, payload: payload) } + + func handleVouchPayload(from peerID: PeerID, payload: Data) { + vouchCoordinator.handleVouchPayload(from: peerID, payload: payload) + } } final class ChatTransportEventCoordinator { @@ -371,6 +376,9 @@ private extension ChatTransportEventCoordinator { case .verifyResponse: context.handleVerifyResponsePayload(from: peerID, payload: payload) + + case .vouch: + context.handleVouchPayload(from: peerID, payload: payload) } } diff --git a/bitchat/ViewModels/ChatVerificationCoordinator.swift b/bitchat/ViewModels/ChatVerificationCoordinator.swift index e82ebd35..8f7d484a 100644 --- a/bitchat/ViewModels/ChatVerificationCoordinator.swift +++ b/bitchat/ViewModels/ChatVerificationCoordinator.swift @@ -24,6 +24,10 @@ protocol ChatVerificationContext: AnyObject { func setStoredVerified(_ fingerprint: String, verified: Bool) func isVerifiedFingerprint(_ fingerprint: String) -> Bool func saveIdentityState() + /// After a fingerprint becomes verified, run a transitive-vouch pass over + /// currently connected peers (so verifying a peer you're already connected + /// to sends vouches immediately, and the new identity propagates onward). + func vouchToConnectedVerifiedPeers() // MARK: Encryption status func setEncryptionStatus(_ status: EncryptionStatus?, for peerID: PeerID) @@ -86,6 +90,10 @@ extension ChatViewModel: ChatVerificationContext { peerIdentityStore.setVerified(fingerprint, verified: verified) } + func vouchToConnectedVerifiedPeers() { + vouchCoordinator.vouchToConnectedVerifiedPeers() + } + var unifiedPeers: [BitchatPeer] { unifiedPeerService.peers } @@ -148,6 +156,9 @@ final class ChatVerificationCoordinator { context.saveIdentityState() context.setStoredVerified(fingerprint, verified: true) context.updateEncryptionStatus(for: peerID) + // Verifying a peer is a vouch trigger: push attestations to my other + // connected verified peers (and to this one if already connected). + context.vouchToConnectedVerifiedPeers() } func unverifyFingerprint(for peerID: PeerID) { @@ -340,6 +351,8 @@ final class ChatVerificationCoordinator { } context.updateEncryptionStatus(for: peerID) + // QR verification just completed — same vouch trigger as manual verify. + context.vouchToConnectedVerifiedPeers() } } diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 2f5fd729..a6606549 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -177,6 +177,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele lazy var nostrCoordinator = ChatNostrCoordinator(context: self) lazy var mediaTransferCoordinator = ChatMediaTransferCoordinator(context: self) lazy var verificationCoordinator = ChatVerificationCoordinator(context: self) + lazy var vouchCoordinator = ChatVouchCoordinator(context: self) // Computed properties for compatibility @MainActor @@ -1280,6 +1281,13 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele // Delete ALL media files (incoming and outgoing) in background Task.detached(priority: .utility) { + // Skipped under tests: the test process shares the user's real + // ~/Library/Application Support/files tree, and this detached + // utility-priority wipe fires at a nondeterministic time — + // deleting media that concurrently running tests (e.g. the + // sendImage flow) just wrote there, and the developer's real + // app data with it. + guard !TestEnvironment.isRunningTests else { return } do { let base = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let filesDir = base.appendingPathComponent("files", isDirectory: true) @@ -1492,6 +1500,14 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele func setupNoiseCallbacks() { verificationCoordinator.setupNoiseCallbacks() + vouchCoordinator.setupNoiseCallbacks() + } + + /// Whether the fingerprint currently counts as vouched (≥1 valid vouch + /// from a voucher I verified, and no explicit verification of mine). + @MainActor + func isVouchedFingerprint(_ fingerprint: String) -> Bool { + identityManager.isVouched(fingerprint: fingerprint) } // MARK: - BitchatDelegate Methods @@ -1589,6 +1605,12 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele func didUpdatePeerList(_ peers: [PeerID]) { peerListCoordinator.didUpdatePeerList(peers) + // A peer-list update follows every verified announce, which is where a + // peer's `.vouch` capability actually arrives — retry vouching now that + // capabilities may finally be known (closes the auth-time capability race). + Task { @MainActor [weak self] in + self?.vouchCoordinator.peersUpdated(peers) + } } @MainActor diff --git a/bitchat/ViewModels/ChatVouchCoordinator.swift b/bitchat/ViewModels/ChatVouchCoordinator.swift new file mode 100644 index 00000000..26cb8158 --- /dev/null +++ b/bitchat/ViewModels/ChatVouchCoordinator.swift @@ -0,0 +1,272 @@ +import BitFoundation +import BitLogger +import Foundation + +/// The narrow surface `ChatVouchCoordinator` needs from its owner. +/// +/// Follows the `ChatDeliveryContext` exemplar: the coordinator depends on the +/// minimal context it actually uses instead of holding an `unowned` back-ref +/// to the whole `ChatViewModel`. This keeps the coordinator independently +/// testable (see `ChatVouchCoordinatorContextTests`) and makes its true +/// dependencies explicit. +@MainActor +protocol ChatVouchContext: AnyObject { + // MARK: Identity & trust state + func getFingerprint(for peerID: PeerID) -> String? + func isVerifiedFingerprint(_ fingerprint: String) -> Bool + /// The peer's announce-bound Ed25519 signing key, if known this session. + func signingKey(forFingerprint fingerprint: String) -> Data? + /// Verified fingerprints ordered most recently verified first. + func recentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] + /// Stores an accepted vouch (identity manager enforces the storage gates). + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool + func lastVouchBatchSent(to fingerprint: String) -> Date? + func markVouchBatchSent(to fingerprint: String, at date: Date) + + // MARK: Transport + func peerCapabilities(for peerID: PeerID) -> PeerCapabilities + /// PeerIDs with a currently established mesh session (used to run a vouch + /// pass over peers we are already connected to when we verify someone). + func connectedPeerIDs() -> [PeerID] + /// Appends a session-established observer (additive; never displaces the + /// verification coordinator's callbacks). + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) + /// Signs `data` with our Noise (Ed25519) signing key. + func noiseSignData(_ data: Data) -> Data? + func sendVouchAttestations(_ payload: Data, to peerID: PeerID) + + // MARK: UI refresh + /// Signals that derived trust state changed so peer list / fingerprint + /// views recompute badges. + func notifyPeerTrustChanged() +} + +extension ChatViewModel: ChatVouchContext { + // `getFingerprint(for:)` and `isVerifiedFingerprint(_:)` are shared + // requirements with the verification context and satisfied by existing + // `ChatViewModel` members. The members below flatten nested service + // accesses into intent-named calls. + + func signingKey(forFingerprint fingerprint: String) -> Data? { + identityManager.signingPublicKey(forFingerprint: fingerprint) + } + + func recentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] { + identityManager.mostRecentlyVerifiedFingerprints(limit: limit, excluding: fingerprint) + } + + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool { + identityManager.recordVouch( + voucheeFingerprint: voucheeFingerprint, + voucherFingerprint: voucherFingerprint, + timestamp: timestamp + ) + } + + func lastVouchBatchSent(to fingerprint: String) -> Date? { + identityManager.lastVouchBatchSent(to: fingerprint) + } + + func markVouchBatchSent(to fingerprint: String, at date: Date) { + identityManager.markVouchBatchSent(to: fingerprint, at: date) + } + + func peerCapabilities(for peerID: PeerID) -> PeerCapabilities { + meshService.peerCapabilities(peerID) + } + + func connectedPeerIDs() -> [PeerID] { + Array(connectedPeers) + } + + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) { + meshService.addPeerAuthenticatedObserver(handler) + } + + func noiseSignData(_ data: Data) -> Data? { + meshService.noiseSignData(data) + } + + func sendVouchAttestations(_ payload: Data, to peerID: PeerID) { + meshService.sendVouchAttestations(payload, to: peerID) + } + + func notifyPeerTrustChanged() { + // PeerListModel refreshes on this notification; the view-model change + // covers FingerprintView / VerificationModel consumers. + NotificationCenter.default.post(name: Notification.Name("peerStatusUpdated"), object: nil) + notifyUIChanged() + } +} + +/// Transitive verification ("vouching"): when a Noise session comes up with a +/// peer I verified, I attest — over that authenticated, encrypted session — +/// to the other identities I have verified. Receivers accept such vouches +/// only from peers *they* verified, giving a serverless +/// verified-by-people-you-verified tier (`TrustLevel.vouched`). +@MainActor +final class ChatVouchCoordinator { + /// Minimum spacing between vouch batches to the same peer (persisted). + static let batchInterval: TimeInterval = 24 * 60 * 60 + + private unowned let context: any ChatVouchContext + + init(context: any ChatVouchContext) { + self.context = context + } + + /// Registers the session-established hook. Additive alongside the + /// verification coordinator's callbacks; call once at bootstrap. + func setupNoiseCallbacks() { + context.addPeerAuthenticatedObserver { [weak self] peerID, fingerprint in + DispatchQueue.main.async { [weak self] in + self?.peerAuthenticated(peerID, fingerprint: fingerprint) + } + } + } + + /// Trigger — session established: on a Noise session coming up with a peer + /// I verified, attempt to send a vouch batch. Kept as the historical entry + /// point; the real work lives in `attemptVouch`. + func peerAuthenticated(_ peerID: PeerID, fingerprint: String, now: Date = Date()) { + attemptVouch(to: peerID, fingerprint: fingerprint, now: now) + } + + /// Trigger — verified announce processed: a peer's `.vouch` capability + /// arrives on its *announce*, which is handled independently of the Noise + /// handshake. This is invoked on every peer-list update (fired after each + /// verified announce), so it closes the capability race — the batch that + /// `peerAuthenticated` couldn't send (capabilities not yet known) goes out + /// once the capability-bearing announce lands. Throttled per peer. + func peersUpdated(_ peerIDs: [PeerID], now: Date = Date()) { + for peerID in peerIDs { + guard let fingerprint = context.getFingerprint(for: peerID) else { continue } + attemptVouch(to: peerID, fingerprint: fingerprint, now: now) + } + } + + /// Trigger — local verification completed: the user just verified a peer. + /// Run a vouch pass over every currently connected peer I verified. This + /// makes vouching fire when verifying someone already connected (whose + /// session is authenticated, so `peerAuthenticated` never re-fires), and it + /// propagates the newly-verified identity to my other verified peers. + /// Throttled per peer by `batchInterval`, so it can't spam. + func vouchToConnectedVerifiedPeers(now: Date = Date()) { + var sentCount = 0 + for peerID in context.connectedPeerIDs() { + guard let fingerprint = context.getFingerprint(for: peerID) else { continue } + if attemptVouch(to: peerID, fingerprint: fingerprint, now: now) { + sentCount += 1 + } + } + if sentCount > 0 { + SecureLogger.info( + "🪪 verify-triggered vouch pass sent to \(sentCount) connected peer(s)", + category: .security + ) + } + } + + /// Exchange policy shared by every trigger: to a peer I verified, send + /// attestations for up to `VouchAttestation.maxBatchCount` *other* verified + /// fingerprints (most recently verified first), at most once per peer per + /// `batchInterval`. Returns whether a batch was actually sent. + @discardableResult + func attemptVouch(to peerID: PeerID, fingerprint: String, now: Date = Date()) -> Bool { + guard context.isVerifiedFingerprint(fingerprint) else { return false } + + // Capability gate, race-tolerant: a peer's `.vouch` bit is carried on + // its announce, processed independently of the Noise handshake, so at + // authentication time the capability set is frequently still empty. + // Treat an empty/unknown set as eligible — the payload is a Noise + // `0x12` (`NoisePayloadType.vouch`) that non-supporting peers harmlessly + // ignore, so sending on an unknown set is safe and avoids the race + // dropping the batch. Only skip when the peer advertised a non-empty + // capability set that explicitly lacks `.vouch`. + let capabilities = context.peerCapabilities(for: peerID) + if !capabilities.isEmpty, !capabilities.contains(.vouch) { return false } + + if let lastSent = context.lastVouchBatchSent(to: fingerprint), + now.timeIntervalSince(lastSent) < Self.batchInterval { + return false + } + + let candidates = context.recentlyVerifiedFingerprints( + limit: VouchAttestation.maxBatchCount, + excluding: fingerprint + ) + var attestations: [VouchAttestation] = [] + for candidate in candidates { + // Only fingerprints whose announce-bound signing key we know can + // be anchored to a concrete identity; skip the rest. + guard let fingerprintData = Data(hexString: candidate), + fingerprintData.count == VouchAttestation.fingerprintSize, + let signingKey = context.signingKey(forFingerprint: candidate), + signingKey.count == VouchAttestation.signingKeySize, + let attestation = VouchAttestation.build( + voucheeFingerprint: fingerprintData, + voucheeSigningKey: signingKey, + timestampMs: UInt64(now.timeIntervalSince1970 * 1000), + sign: context.noiseSignData + ) else { + continue + } + attestations.append(attestation) + } + + guard !attestations.isEmpty, + let payload = VouchAttestation.encodeList(attestations) else { return false } + context.sendVouchAttestations(payload, to: peerID) + context.markVouchBatchSent(to: fingerprint, at: now) + SecureLogger.debug( + "🪪 Sent \(attestations.count) vouch attestation(s) to \(peerID.id.prefix(8))…", + category: .security + ) + return true + } + + /// Accept policy: process inbound vouches only from a sender I verified, + /// only with a valid Ed25519 signature under the sender's announce-bound + /// signing key, and only within the validity window. Self-vouches and + /// vouches for already-verified peers are dropped by the identity + /// manager's storage gates. + func handleVouchPayload(from peerID: PeerID, payload: Data, now: Date = Date()) { + guard let senderFingerprint = context.getFingerprint(for: peerID), + context.isVerifiedFingerprint(senderFingerprint) else { + SecureLogger.debug( + "🪪 Ignoring vouch payload from unverified peer \(peerID.id.prefix(8))…", + category: .security + ) + return + } + guard let senderSigningKey = context.signingKey(forFingerprint: senderFingerprint) else { + SecureLogger.debug( + "🪪 No signing key for vouching peer \(peerID.id.prefix(8))…; dropping batch", + category: .security + ) + return + } + + var acceptedCount = 0 + for attestation in VouchAttestation.decodeList(from: payload) { + guard attestation.verifySignature(voucherSigningKey: senderSigningKey), + !attestation.isExpired(now: now) else { continue } + let stored = context.recordVouch( + voucheeFingerprint: attestation.voucheeFingerprintHex, + voucherFingerprint: senderFingerprint, + timestamp: attestation.timestamp + ) + if stored { acceptedCount += 1 } + } + + if acceptedCount > 0 { + SecureLogger.info( + "🪪 Accepted \(acceptedCount) vouch(es) from \(senderFingerprint.prefix(8))…", + category: .security + ) + context.notifyPeerTrustChanged() + } + } +} diff --git a/bitchat/ViewModels/NostrInboundPipeline.swift b/bitchat/ViewModels/NostrInboundPipeline.swift index 2d2e6825..c5bd6525 100644 --- a/bitchat/ViewModels/NostrInboundPipeline.swift +++ b/bitchat/ViewModels/NostrInboundPipeline.swift @@ -303,7 +303,7 @@ final class NostrInboundPipeline { context.handleDelivered(noisePayload, senderPubkey: senderPubkey, convKey: convKey) case .readReceipt: context.handleReadReceipt(noisePayload, senderPubkey: senderPubkey, convKey: convKey) - case .verifyChallenge, .verifyResponse: + case .verifyChallenge, .verifyResponse, .vouch: break } } @@ -355,7 +355,7 @@ final class NostrInboundPipeline { context.handleDelivered(payload, senderPubkey: senderPubkey, convKey: convKey) case .readReceipt: context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: convKey) - case .verifyChallenge, .verifyResponse: + case .verifyChallenge, .verifyResponse, .vouch: break } } @@ -434,7 +434,7 @@ final class NostrInboundPipeline { context.handleDelivered(payload, senderPubkey: senderPubkey, convKey: targetPeerID) case .readReceipt: context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: targetPeerID) - case .verifyChallenge, .verifyResponse: + case .verifyChallenge, .verifyResponse, .vouch: break } } diff --git a/bitchat/Views/FingerprintView.swift b/bitchat/Views/FingerprintView.swift index 06fc865f..fb4541f5 100644 --- a/bitchat/Views/FingerprintView.swift +++ b/bitchat/Views/FingerprintView.swift @@ -37,6 +37,14 @@ struct FingerprintView: View { } static let markVerified: LocalizedStringKey = "fingerprint.action.mark_verified" static let removeVerification: LocalizedStringKey = "fingerprint.action.remove_verification" + static let vouchedBadge: LocalizedStringKey = "fingerprint.badge.vouched" + static func vouchedBy(_ count: Int) -> String { + String( + format: String(localized: "fingerprint.message.vouched_by", comment: "How many people the user verified have vouched for this peer"), + locale: .current, + count + ) + } static func unknownPeer() -> String { String(localized: "common.unknown", comment: "Label for an unknown peer") } @@ -146,6 +154,41 @@ struct FingerprintView: View { } } + // Vouched (transitively verified) status: shown whenever the + // peer isn't explicitly verified but people I verified vouch + // for them, independent of the current session state. + if fingerprintState.isVouched && !fingerprintState.isVerified { + VStack(spacing: 8) { + HStack(spacing: 6) { + Image(systemName: "checkmark.seal") + .font(.bitchatSystem(size: 14)) + .foregroundColor(.teal) + Text(Strings.vouchedBadge) + .bitchatFont(size: 14, weight: .bold) + .foregroundColor(.teal) + } + .frame(maxWidth: .infinity) + + Text(Strings.vouchedBy(fingerprintState.voucherCount)) + .bitchatFont(size: 12) + .foregroundColor(textColor.opacity(0.7)) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity) + + if !fingerprintState.voucherNames.isEmpty { + Text(fingerprintState.voucherNames.joined(separator: ", ")) + .bitchatFont(size: 12) + .foregroundColor(textColor.opacity(0.7)) + .multilineTextAlignment(.center) + .lineLimit(nil) + .fixedSize(horizontal: false, vertical: true) + .frame(maxWidth: .infinity) + } + } + .padding(.top, 8) + .accessibilityElement(children: .combine) + } + // Verification status if fingerprintState.canToggleVerification { VStack(spacing: 12) { diff --git a/bitchat/Views/MeshPeerList.swift b/bitchat/Views/MeshPeerList.swift index 244cd6dc..b09ef476 100644 --- a/bitchat/Views/MeshPeerList.swift +++ b/bitchat/Views/MeshPeerList.swift @@ -25,6 +25,8 @@ struct MeshPeerList: View { static let favorite = String(localized: "mesh_peers.state.favorite", comment: "State label for a favorited peer") static let unread = String(localized: "mesh_peers.state.unread", comment: "State label for a peer with unread private messages") static let blocked = String(localized: "mesh_peers.state.blocked", comment: "State label for a blocked peer") + static let vouched = String(localized: "mesh_peers.state.vouched", comment: "State label for a peer vouched for by someone the user verified") + static let vouchedTooltip = String(localized: "mesh_peers.tooltip.vouched", comment: "Tooltip for the vouched (unfilled seal) badge next to a peer") static let addFavorite = String(localized: "content.accessibility.add_favorite", comment: "Accessibility label to add a favorite") static let removeFavorite = String(localized: "content.accessibility.remove_favorite", comment: "Accessibility label to remove a favorite") static let showFingerprint = String(localized: "mesh_peers.action.fingerprint", comment: "Context menu action that shows a peer's fingerprint/verification screen") @@ -134,6 +136,16 @@ struct MeshPeerList: View { .foregroundColor(baseColor) } } + + // Vouched (transitively verified): unfilled seal, + // deliberately distinct from verified's filled one. + // Never shown alongside a verified badge. + if peer.showsVouchedBadge { + Image(systemName: "checkmark.seal") + .font(.bitchatSystem(size: 10)) + .foregroundColor(baseColor) + .help(Strings.vouchedTooltip) + } } Spacer() @@ -241,6 +253,7 @@ struct MeshPeerList: View { parts.append(Strings.offline) } } + if peer.showsVouchedBadge { parts.append(Strings.vouched) } if peer.isFavorite { parts.append(Strings.favorite) } if peer.hasUnread { parts.append(Strings.unread) } if peer.isBlocked { parts.append(Strings.blocked) } diff --git a/bitchatTests/AppArchitectureTests.swift b/bitchatTests/AppArchitectureTests.swift index 0b70f0e4..69b7fc89 100644 --- a/bitchatTests/AppArchitectureTests.swift +++ b/bitchatTests/AppArchitectureTests.swift @@ -591,6 +591,45 @@ struct AppArchitectureTests { #expect(!verificationModel.isVerified(peerID: peerID)) } + @Test("VerificationModel refreshes when peer trust changes (vouch accepted)") + @MainActor + func verificationModelRefreshesOnPeerTrustChange() async { + let viewModel = makeArchitectureViewModel() + var privateConversationModel: PrivateConversationModel? = PrivateConversationModel( + chatViewModel: viewModel, + conversations: viewModel.conversations, + locationChannelsModel: LocationChannelsModel(manager: makeArchitectureLocationManager()) + ) + let verificationModel = VerificationModel( + chatViewModel: viewModel, + privateConversationModel: privateConversationModel! + ) + + // PrivateConversationModel happens to observe the same notification + // and re-assign its published selection, which would ripple into + // VerificationModel; release it so this test pins VerificationModel's + // own subscription rather than that incidental chain. + privateConversationModel = nil + + // The bound @Published sources replay their current values on + // subscription; let those initial main-queue emissions settle so the + // sink below observes only the trust-change signal. + try? await Task.sleep(nanoseconds: 100_000_000) + + // ChatVouchCoordinator.notifyPeerTrustChanged() signals accepted + // vouches via "peerStatusUpdated"; an open fingerprint sheet must + // re-render its vouched badge from that signal alone. + var refreshed = false + let cancellable = verificationModel.objectWillChange.sink { _ in + refreshed = true + } + defer { cancellable.cancel() } + + NotificationCenter.default.post(name: Notification.Name("peerStatusUpdated"), object: nil) + await waitUntil { refreshed } + #expect(refreshed) + } + @Test("PeerListModel publishes mesh and geohash directory state") @MainActor func peerListModelPublishesDirectoryState() async { diff --git a/bitchatTests/ChatTransportEventCoordinatorContextTests.swift b/bitchatTests/ChatTransportEventCoordinatorContextTests.swift index 1c1fc46f..bd112e9b 100644 --- a/bitchatTests/ChatTransportEventCoordinatorContextTests.swift +++ b/bitchatTests/ChatTransportEventCoordinatorContextTests.swift @@ -156,6 +156,12 @@ private final class MockChatTransportEventContext: ChatTransportEventContext { func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) { verifyResponsePayloads.append((peerID, payload)) } + + private(set) var vouchPayloads: [(peerID: PeerID, payload: Data)] = [] + + func handleVouchPayload(from peerID: PeerID, payload: Data) { + vouchPayloads.append((peerID, payload)) + } } // MARK: - Helpers diff --git a/bitchatTests/ChatVerificationCoordinatorContextTests.swift b/bitchatTests/ChatVerificationCoordinatorContextTests.swift index 4ef7f9f7..6034c890 100644 --- a/bitchatTests/ChatVerificationCoordinatorContextTests.swift +++ b/bitchatTests/ChatVerificationCoordinatorContextTests.swift @@ -51,6 +51,9 @@ private final class MockChatVerificationContext: ChatVerificationContext { func saveIdentityState() { saveIdentityStateCount += 1 } + private(set) var vouchToConnectedVerifiedPeersCount = 0 + func vouchToConnectedVerifiedPeers() { vouchToConnectedVerifiedPeersCount += 1 } + // Encryption status private(set) var encryptionStatuses: [PeerID: EncryptionStatus?] = [:] private(set) var updatedEncryptionStatusPeers: [PeerID] = [] diff --git a/bitchatTests/ChatVouchCoordinatorContextTests.swift b/bitchatTests/ChatVouchCoordinatorContextTests.swift new file mode 100644 index 00000000..18175576 --- /dev/null +++ b/bitchatTests/ChatVouchCoordinatorContextTests.swift @@ -0,0 +1,353 @@ +// +// ChatVouchCoordinatorContextTests.swift +// bitchatTests +// +// Exercises `ChatVouchCoordinator` against a mock `ChatVouchContext` — +// proving the exchange policy (verified + capable peers only, batch cap, +// 24h rate limit) and the accept policy (verified senders only, real +// Ed25519 signature verification, expiry) without a `ChatViewModel`. +// Storage-level gates (self-vouch, already-verified vouchee, per-vouchee +// cap) are covered by `SecureIdentityStateManagerVouchTests`. +// + +import CryptoKit +import Foundation +import BitFoundation +import Testing + +@testable import bitchat + +// MARK: - Mock Context + +@MainActor +private final class MockChatVouchContext: ChatVouchContext { + // Identity & trust state + var fingerprintsByPeerID: [PeerID: String] = [:] + var verifiedFingerprints: Set = [] + var signingKeysByFingerprint: [String: Data] = [:] + var recentVerified: [String] = [] + private(set) var recentVerifiedRequests: [(limit: Int, excluding: String)] = [] + private(set) var recordedVouches: [(vouchee: String, voucher: String, timestamp: Date)] = [] + var recordVouchResult = true + var lastBatchSentAt: [String: Date] = [:] + private(set) var markedBatchSent: [(fingerprint: String, date: Date)] = [] + + func getFingerprint(for peerID: PeerID) -> String? { fingerprintsByPeerID[peerID] } + func isVerifiedFingerprint(_ fingerprint: String) -> Bool { verifiedFingerprints.contains(fingerprint) } + func signingKey(forFingerprint fingerprint: String) -> Data? { signingKeysByFingerprint[fingerprint] } + + func recentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] { + recentVerifiedRequests.append((limit, fingerprint)) + return Array(recentVerified.filter { $0 != fingerprint }.prefix(limit)) + } + + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool { + recordedVouches.append((voucheeFingerprint, voucherFingerprint, timestamp)) + return recordVouchResult + } + + func lastVouchBatchSent(to fingerprint: String) -> Date? { lastBatchSentAt[fingerprint] } + + func markVouchBatchSent(to fingerprint: String, at date: Date) { + markedBatchSent.append((fingerprint, date)) + lastBatchSentAt[fingerprint] = date + } + + // Transport + var capabilitiesByPeerID: [PeerID: PeerCapabilities] = [:] + var mySigningKey = Curve25519.Signing.PrivateKey() + private(set) var installedObservers: [(PeerID, String) -> Void] = [] + private(set) var sentVouchPayloads: [(payload: Data, peerID: PeerID)] = [] + + var connectedPeerIDList: [PeerID] = [] + + func peerCapabilities(for peerID: PeerID) -> PeerCapabilities { capabilitiesByPeerID[peerID] ?? [] } + + func connectedPeerIDs() -> [PeerID] { connectedPeerIDList } + + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) { + installedObservers.append(handler) + } + + func noiseSignData(_ data: Data) -> Data? { try? mySigningKey.signature(for: data) } + + func sendVouchAttestations(_ payload: Data, to peerID: PeerID) { + sentVouchPayloads.append((payload, peerID)) + } + + // UI refresh + private(set) var trustChangedCount = 0 + + func notifyPeerTrustChanged() { trustChangedCount += 1 } +} + +// MARK: - Tests + +struct ChatVouchCoordinatorContextTests { + private let peerID = PeerID(str: "1122334455667788") + private let peerFingerprint = String(repeating: "0f", count: 32) + + @MainActor + private func makeVerifiedCapablePeer() -> (MockChatVouchContext, ChatVouchCoordinator) { + let context = MockChatVouchContext() + let coordinator = ChatVouchCoordinator(context: context) + context.fingerprintsByPeerID[peerID] = peerFingerprint + context.verifiedFingerprints.insert(peerFingerprint) + context.capabilitiesByPeerID[peerID] = [.vouch] + return (context, coordinator) + } + + // MARK: Exchange policy + + @Test @MainActor + func peerAuthenticated_sendsBatchForVerifiedCapablePeer() throws { + let (context, coordinator) = makeVerifiedCapablePeer() + let vouchees = [String(repeating: "01", count: 32), String(repeating: "02", count: 32)] + context.recentVerified = vouchees + for vouchee in vouchees { + context.signingKeysByFingerprint[vouchee] = Data(repeating: 0x33, count: 32) + } + + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint) + + // Candidates are requested most-recent-first, excluding the target. + #expect(context.recentVerifiedRequests.count == 1) + #expect(context.recentVerifiedRequests.first?.limit == VouchAttestation.maxBatchCount) + #expect(context.recentVerifiedRequests.first?.excluding == peerFingerprint) + + let sent = try #require(context.sentVouchPayloads.first) + #expect(sent.peerID == peerID) + let attestations = VouchAttestation.decodeList(from: sent.payload) + #expect(attestations.map(\.voucheeFingerprintHex) == vouchees) + // Every attestation carries a valid signature under our signing key. + let myPublicKey = context.mySigningKey.publicKey.rawRepresentation + #expect(attestations.allSatisfy { $0.verifySignature(voucherSigningKey: myPublicKey) }) + + // The rate limit is stamped only after an actual send. + #expect(context.markedBatchSent.map(\.fingerprint) == [peerFingerprint]) + } + + @Test @MainActor + func peerAuthenticated_requiresVerificationAndCapability() { + let (context, coordinator) = makeVerifiedCapablePeer() + context.recentVerified = [String(repeating: "01", count: 32)] + context.signingKeysByFingerprint[context.recentVerified[0]] = Data(repeating: 0x33, count: 32) + + // Not verified by me: nothing. + context.verifiedFingerprints.remove(peerFingerprint) + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint) + #expect(context.sentVouchPayloads.isEmpty) + + // Verified but advertises a non-empty capability set lacking .vouch: + // nothing. (An *empty*/unknown set is race-tolerant and still sends — + // see `attemptVouch_sendsWhenCapabilitiesUnknown`.) + context.verifiedFingerprints.insert(peerFingerprint) + context.capabilitiesByPeerID[peerID] = [.prekeys] + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint) + #expect(context.sentVouchPayloads.isEmpty) + #expect(context.markedBatchSent.isEmpty) + } + + // MARK: Capability race tolerance & new triggers + + @Test @MainActor + func attemptVouch_sendsWhenCapabilitiesUnknown() { + // Capability set still empty at attempt time (the peer's .vouch bit + // arrives on a later announce): the batch must still go out. + let (context, coordinator) = makeVerifiedCapablePeer() + context.capabilitiesByPeerID[peerID] = [] + context.recentVerified = [String(repeating: "01", count: 32)] + context.signingKeysByFingerprint[context.recentVerified[0]] = Data(repeating: 0x33, count: 32) + + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint) + #expect(context.sentVouchPayloads.count == 1) + #expect(context.markedBatchSent.map(\.fingerprint) == [peerFingerprint]) + } + + @Test @MainActor + func vouchToConnectedVerifiedPeers_sendsToConnectedVerifiedCapablePeer() { + let (context, coordinator) = makeVerifiedCapablePeer() + context.connectedPeerIDList = [peerID] + context.recentVerified = [String(repeating: "01", count: 32)] + context.signingKeysByFingerprint[context.recentVerified[0]] = Data(repeating: 0x33, count: 32) + + // Session is already up (no peerAuthenticated re-fire); the verify pass + // is what makes the batch go out. + coordinator.vouchToConnectedVerifiedPeers() + let sent = context.sentVouchPayloads + #expect(sent.count == 1) + #expect(sent.first?.peerID == peerID) + #expect(context.markedBatchSent.map(\.fingerprint) == [peerFingerprint]) + } + + @Test @MainActor + func vouchToConnectedVerifiedPeers_skipsUnverifiedConnectedPeers() { + let (context, coordinator) = makeVerifiedCapablePeer() + context.connectedPeerIDList = [peerID] + context.verifiedFingerprints.remove(peerFingerprint) + context.recentVerified = [String(repeating: "01", count: 32)] + context.signingKeysByFingerprint[context.recentVerified[0]] = Data(repeating: 0x33, count: 32) + + coordinator.vouchToConnectedVerifiedPeers() + #expect(context.sentVouchPayloads.isEmpty) + } + + @Test @MainActor + func peersUpdated_sendsOnceCapabilityBearingAnnounceArrives() { + let (context, coordinator) = makeVerifiedCapablePeer() + context.recentVerified = [String(repeating: "01", count: 32)] + context.signingKeysByFingerprint[context.recentVerified[0]] = Data(repeating: 0x33, count: 32) + + // First announce before the .vouch bit is known: empty set is + // race-tolerant, so it already sends and stamps the throttle. + context.capabilitiesByPeerID[peerID] = [] + coordinator.peersUpdated([peerID]) + #expect(context.sentVouchPayloads.count == 1) + + // A later announce carrying .vouch must not double-send (throttled). + context.capabilitiesByPeerID[peerID] = [.vouch] + coordinator.peersUpdated([peerID]) + #expect(context.sentVouchPayloads.count == 1) + } + + @Test @MainActor + func peerAuthenticated_rateLimitsPerPeerPer24Hours() { + let (context, coordinator) = makeVerifiedCapablePeer() + context.recentVerified = [String(repeating: "01", count: 32)] + context.signingKeysByFingerprint[context.recentVerified[0]] = Data(repeating: 0x33, count: 32) + + let now = Date() + context.lastBatchSentAt[peerFingerprint] = now.addingTimeInterval(-60 * 60) + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint, now: now) + #expect(context.sentVouchPayloads.isEmpty) + + // Once the interval has elapsed the batch goes out again. + context.lastBatchSentAt[peerFingerprint] = now.addingTimeInterval(-ChatVouchCoordinator.batchInterval - 1) + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint, now: now) + #expect(context.sentVouchPayloads.count == 1) + } + + @Test @MainActor + func peerAuthenticated_skipsCandidatesWithoutSigningKeysAndEmptyBatches() { + let (context, coordinator) = makeVerifiedCapablePeer() + let withKey = String(repeating: "01", count: 32) + let withoutKey = String(repeating: "02", count: 32) + context.recentVerified = [withoutKey, withKey] + context.signingKeysByFingerprint[withKey] = Data(repeating: 0x33, count: 32) + + coordinator.peerAuthenticated(peerID, fingerprint: peerFingerprint) + let attestations = VouchAttestation.decodeList(from: context.sentVouchPayloads[0].payload) + #expect(attestations.map(\.voucheeFingerprintHex) == [withKey]) + + // No signable candidates at all: nothing is sent or rate-stamped. + let freshPeer = PeerID(str: "aabbccddeeff0011") + let freshFingerprint = String(repeating: "0e", count: 32) + context.fingerprintsByPeerID[freshPeer] = freshFingerprint + context.verifiedFingerprints.insert(freshFingerprint) + context.capabilitiesByPeerID[freshPeer] = [.vouch] + context.recentVerified = [withoutKey] + coordinator.peerAuthenticated(freshPeer, fingerprint: freshFingerprint) + #expect(context.sentVouchPayloads.count == 1) + #expect(!context.markedBatchSent.contains { $0.fingerprint == freshFingerprint }) + } + + // MARK: Accept policy + + @MainActor + private func makeInboundBatch( + signedBy key: Curve25519.Signing.PrivateKey, + vouchee: String = String(repeating: "07", count: 32), + timestampMs: UInt64 = UInt64(Date().timeIntervalSince1970 * 1000) + ) throws -> Data { + let voucheeData = try #require(Data(hexString: vouchee)) + let attestation = try #require(VouchAttestation.build( + voucheeFingerprint: voucheeData, + voucheeSigningKey: Data(repeating: 0x44, count: 32), + timestampMs: timestampMs, + sign: { try? key.signature(for: $0) } + )) + return try #require(VouchAttestation.encodeList([attestation])) + } + + @Test @MainActor + func handleVouchPayload_acceptsValidVouchFromVerifiedSender() throws { + let (context, coordinator) = makeVerifiedCapablePeer() + let senderKey = Curve25519.Signing.PrivateKey() + context.signingKeysByFingerprint[peerFingerprint] = senderKey.publicKey.rawRepresentation + + let vouchee = String(repeating: "07", count: 32) + let payload = try makeInboundBatch(signedBy: senderKey, vouchee: vouchee) + coordinator.handleVouchPayload(from: peerID, payload: payload) + + #expect(context.recordedVouches.count == 1) + #expect(context.recordedVouches.first?.vouchee == vouchee) + #expect(context.recordedVouches.first?.voucher == peerFingerprint) + #expect(context.trustChangedCount == 1) + } + + @Test @MainActor + func handleVouchPayload_rejectsUnverifiedOrUnknownSender() throws { + let (context, coordinator) = makeVerifiedCapablePeer() + let senderKey = Curve25519.Signing.PrivateKey() + context.signingKeysByFingerprint[peerFingerprint] = senderKey.publicKey.rawRepresentation + let payload = try makeInboundBatch(signedBy: senderKey) + + // Sender's fingerprint is not in my verified set. + context.verifiedFingerprints.remove(peerFingerprint) + coordinator.handleVouchPayload(from: peerID, payload: payload) + #expect(context.recordedVouches.isEmpty) + + // Unknown peer entirely. + coordinator.handleVouchPayload(from: PeerID(str: "ffeeddccbbaa9988"), payload: payload) + #expect(context.recordedVouches.isEmpty) + #expect(context.trustChangedCount == 0) + } + + @Test @MainActor + func handleVouchPayload_rejectsForgedSignaturesAndExpiredAttestations() throws { + let (context, coordinator) = makeVerifiedCapablePeer() + let senderKey = Curve25519.Signing.PrivateKey() + context.signingKeysByFingerprint[peerFingerprint] = senderKey.publicKey.rawRepresentation + + // Signed by an imposter key: signature check against the sender's + // announce-bound key fails. + let imposter = Curve25519.Signing.PrivateKey() + let forged = try makeInboundBatch(signedBy: imposter) + coordinator.handleVouchPayload(from: peerID, payload: forged) + #expect(context.recordedVouches.isEmpty) + + // Correctly signed but expired. + let staleMs = UInt64(Date().addingTimeInterval(-31 * 24 * 60 * 60).timeIntervalSince1970 * 1000) + let expired = try makeInboundBatch(signedBy: senderKey, timestampMs: staleMs) + coordinator.handleVouchPayload(from: peerID, payload: expired) + #expect(context.recordedVouches.isEmpty) + #expect(context.trustChangedCount == 0) + + // No signing key known for the sender: batch dropped. + context.signingKeysByFingerprint.removeValue(forKey: peerFingerprint) + let valid = try makeInboundBatch(signedBy: senderKey) + coordinator.handleVouchPayload(from: peerID, payload: valid) + #expect(context.recordedVouches.isEmpty) + } + + @Test @MainActor + func handleVouchPayload_skipsUIRefreshWhenNothingStored() throws { + let (context, coordinator) = makeVerifiedCapablePeer() + let senderKey = Curve25519.Signing.PrivateKey() + context.signingKeysByFingerprint[peerFingerprint] = senderKey.publicKey.rawRepresentation + context.recordVouchResult = false // e.g. self-vouch dropped by the store + + let payload = try makeInboundBatch(signedBy: senderKey) + coordinator.handleVouchPayload(from: peerID, payload: payload) + #expect(context.recordedVouches.count == 1) + #expect(context.trustChangedCount == 0) + } + + @Test @MainActor + func setupNoiseCallbacks_installsAdditiveObserver() { + let (context, coordinator) = makeVerifiedCapablePeer() + coordinator.setupNoiseCallbacks() + #expect(context.installedObservers.count == 1) + } +} diff --git a/bitchatTests/Mocks/MockIdentityManager.swift b/bitchatTests/Mocks/MockIdentityManager.swift index 633c388b..1ff1926a 100644 --- a/bitchatTests/Mocks/MockIdentityManager.swift +++ b/bitchatTests/Mocks/MockIdentityManager.swift @@ -107,12 +107,55 @@ final class MockIdentityManager: SecureIdentityStateManagerProtocol { func removeEphemeralSession(peerID: PeerID) {} func setVerified(fingerprint: String, verified: Bool) {} - + func isVerified(fingerprint: String) -> Bool { true } - + func getVerifiedFingerprints() -> Set { Set() } + + // MARK: Vouching (transitive verification) + + private var vouchesByVouchee: [String: [VouchRecord]] = [:] + private var vouchBatchSentAt: [String: Date] = [:] + + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool { + guard voucheeFingerprint != voucherFingerprint else { return false } + var records = vouchesByVouchee[voucheeFingerprint] ?? [] + records.removeAll { $0.voucherFingerprint == voucherFingerprint } + records.append(VouchRecord(voucherFingerprint: voucherFingerprint, timestamp: timestamp)) + vouchesByVouchee[voucheeFingerprint] = records + return true + } + + func validVouchers(for fingerprint: String) -> [VouchRecord] { + vouchesByVouchee[fingerprint] ?? [] + } + + func isVouched(fingerprint: String) -> Bool { + !(vouchesByVouchee[fingerprint] ?? []).isEmpty + } + + func effectiveTrustLevel(for fingerprint: String) -> TrustLevel { + socialIdentities[fingerprint]?.trustLevel ?? .unknown + } + + func lastVouchBatchSent(to fingerprint: String) -> Date? { + vouchBatchSentAt[fingerprint] + } + + func markVouchBatchSent(to fingerprint: String, at date: Date) { + vouchBatchSentAt[fingerprint] = date + } + + func signingPublicKey(forFingerprint fingerprint: String) -> Data? { + nil + } + + func mostRecentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] { + [] + } } diff --git a/bitchatTests/Protocols/VouchAttestationTests.swift b/bitchatTests/Protocols/VouchAttestationTests.swift new file mode 100644 index 00000000..064cf4d8 --- /dev/null +++ b/bitchatTests/Protocols/VouchAttestationTests.swift @@ -0,0 +1,176 @@ +import CryptoKit +import Foundation +import Testing + +@testable import bitchat + +struct VouchAttestationTests { + private let voucherKey = Curve25519.Signing.PrivateKey() + + private func makeAttestation( + fingerprint: Data = Data(repeating: 0xAA, count: 32), + signingKey: Data = Data(repeating: 0xBB, count: 32), + timestampMs: UInt64 = UInt64(Date().timeIntervalSince1970 * 1000), + signedBy key: Curve25519.Signing.PrivateKey? = nil + ) throws -> VouchAttestation { + let signer = key ?? voucherKey + return try #require( + VouchAttestation.build( + voucheeFingerprint: fingerprint, + voucheeSigningKey: signingKey, + timestampMs: timestampMs, + sign: { try? signer.signature(for: $0) } + ) + ) + } + + @Test + func roundTripsAndVerifiesSignature() throws { + let attestation = try makeAttestation() + let encoded = try #require(attestation.encode()) + let decoded = try #require(VouchAttestation.decode(from: encoded)) + + #expect(decoded == attestation) + #expect(decoded.voucheeFingerprintHex == String(repeating: "aa", count: 32)) + #expect(decoded.verifySignature(voucherSigningKey: voucherKey.publicKey.rawRepresentation)) + } + + @Test + func decodeSkipsUnknownTLVsAndRejectsMalformedInput() throws { + let attestation = try makeAttestation() + var encoded = try #require(attestation.encode()) + + // Unknown TLV appended: skipped for forward compatibility. + encoded.append(contentsOf: [0x7F, 0x02, 0x01, 0x02]) + #expect(VouchAttestation.decode(from: encoded) == attestation) + + // Truncation and missing fields are rejected. + #expect(VouchAttestation.decode(from: encoded.dropLast()) == nil) + #expect(VouchAttestation.decode(from: Data([0x01, 0x20])) == nil) + #expect(VouchAttestation.decode(from: Data()) == nil) + + // Wrong field sizes are rejected. + var wrongSize = Data([0x01, 0x10]) + wrongSize.append(Data(repeating: 0xAA, count: 16)) + #expect(VouchAttestation.decode(from: wrongSize) == nil) + } + + @Test + func buildRejectsWrongKeyAndFingerprintSizes() { + let sign: (Data) -> Data? = { try? self.voucherKey.signature(for: $0) } + #expect(VouchAttestation.build( + voucheeFingerprint: Data(repeating: 0xAA, count: 16), + voucheeSigningKey: Data(repeating: 0xBB, count: 32), + sign: sign + ) == nil) + #expect(VouchAttestation.build( + voucheeFingerprint: Data(repeating: 0xAA, count: 32), + voucheeSigningKey: Data(repeating: 0xBB, count: 16), + sign: sign + ) == nil) + } + + @Test + func forgedSignatureFailsVerification() throws { + let attestation = try makeAttestation() + let otherKey = Curve25519.Signing.PrivateKey() + + // Verifying against a key that didn't sign fails. + #expect(!attestation.verifySignature(voucherSigningKey: otherKey.publicKey.rawRepresentation)) + + // An attestation signed by an imposter fails against the real key. + let forged = try makeAttestation(signedBy: otherKey) + #expect(!forged.verifySignature(voucherSigningKey: voucherKey.publicKey.rawRepresentation)) + #expect(!attestation.verifySignature(voucherSigningKey: Data(repeating: 0x01, count: 3))) + } + + @Test + func tamperedFieldsFailVerification() throws { + let attestation = try makeAttestation() + let publicKey = voucherKey.publicKey.rawRepresentation + + var tamperedFingerprint = attestation.voucheeFingerprint + tamperedFingerprint[0] ^= 0xFF + let tampered = VouchAttestation( + voucheeFingerprint: tamperedFingerprint, + voucheeSigningKey: attestation.voucheeSigningKey, + timestampMs: attestation.timestampMs, + signature: attestation.signature + ) + #expect(!tampered.verifySignature(voucherSigningKey: publicKey)) + + let backdated = VouchAttestation( + voucheeFingerprint: attestation.voucheeFingerprint, + voucheeSigningKey: attestation.voucheeSigningKey, + timestampMs: attestation.timestampMs - 1, + signature: attestation.signature + ) + #expect(!backdated.verifySignature(voucherSigningKey: publicKey)) + } + + @Test + func expiryWindowIsEnforced() throws { + let now = Date() + let fresh = try makeAttestation(timestampMs: UInt64(now.timeIntervalSince1970 * 1000)) + #expect(!fresh.isExpired(now: now)) + + let thirtyOneDaysAgo = now.addingTimeInterval(-31 * 24 * 60 * 60) + let expired = try makeAttestation(timestampMs: UInt64(thirtyOneDaysAgo.timeIntervalSince1970 * 1000)) + #expect(expired.isExpired(now: now)) + + let farFuture = now.addingTimeInterval(2 * 60 * 60) + let fromTheFuture = try makeAttestation(timestampMs: UInt64(farFuture.timeIntervalSince1970 * 1000)) + #expect(fromTheFuture.isExpired(now: now)) + + // A verified-but-expired attestation still has a valid signature; the + // two checks are independent gates. + #expect(expired.verifySignature(voucherSigningKey: voucherKey.publicKey.rawRepresentation)) + } + + @Test + func batchRoundTripsAndEnforcesCap() throws { + let attestations = try (0..<3).map { index in + try makeAttestation(fingerprint: Data(repeating: UInt8(index + 1), count: 32)) + } + let payload = try #require(VouchAttestation.encodeList(attestations)) + #expect(VouchAttestation.decodeList(from: payload) == attestations) + + #expect(VouchAttestation.encodeList([]) == nil) + + let tooMany = try (0..<17).map { index in + try makeAttestation(fingerprint: Data(repeating: UInt8(index + 1), count: 32)) + } + #expect(VouchAttestation.encodeList(tooMany) == nil) + } + + @Test + func decodeListIgnoresEntriesBeyondCapAndMalformedEntries() throws { + let attestations = try (0..<17).map { index in + try makeAttestation(fingerprint: Data(repeating: UInt8(index + 1), count: 32)) + } + // Hand-build an oversized batch that lies about its count. + var payload = Data([UInt8(attestations.count)]) + for attestation in attestations { + let encoded = try #require(attestation.encode()) + payload.append(UInt8(encoded.count >> 8)) + payload.append(UInt8(encoded.count & 0xFF)) + payload.append(encoded) + } + let decoded = VouchAttestation.decodeList(from: payload) + #expect(decoded.count == VouchAttestation.maxBatchCount) + #expect(decoded == Array(attestations.prefix(VouchAttestation.maxBatchCount))) + + // A malformed middle entry is dropped without killing the batch. + let good = try makeAttestation() + let goodEncoded = try #require(good.encode()) + var mixed = Data([2]) + mixed.append(contentsOf: [0x00, 0x03, 0xDE, 0xAD, 0xBE]) + mixed.append(UInt8(goodEncoded.count >> 8)) + mixed.append(UInt8(goodEncoded.count & 0xFF)) + mixed.append(goodEncoded) + #expect(VouchAttestation.decodeList(from: mixed) == [good]) + + #expect(VouchAttestation.decodeList(from: Data()) == []) + #expect(VouchAttestation.decodeList(from: Data([5])) == []) + } +} diff --git a/bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift b/bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift new file mode 100644 index 00000000..6ab46490 --- /dev/null +++ b/bitchatTests/Services/SecureIdentityStateManagerVouchTests.swift @@ -0,0 +1,335 @@ +import Foundation +import Testing + +@testable import bitchat + +/// Vouch storage, accept-policy gates, derived trust levels, and persistence +/// compatibility for `SecureIdentityStateManager`. +/// +/// Ordering note: mutations use barrier blocks on the manager's concurrent +/// queue and reads use `queue.sync`, so a read submitted after a mutation +/// always observes it — no polling needed. +/// +/// `@MainActor` matches production (the manager's vouch API is driven by the +/// main-actor `ChatVouchCoordinator`) and keeps the blocking `queue.sync` +/// reads off the Swift Concurrency cooperative pool. Left nonisolated, Swift +/// Testing runs these tests in parallel on that pool, and on CI's few-core +/// runners every pool thread ended up parked in `queue.sync` behind a pending +/// `queue.async(.barrier)` write that never got a dispatch worker — a +/// process-wide deadlock (watchdog SIGKILL, exit 137). +@MainActor +struct SecureIdentityStateManagerVouchTests { + private let voucher = String(repeating: "0a", count: 32) + private let vouchee = String(repeating: "0b", count: 32) + + private func makeManager() -> SecureIdentityStateManager { + SecureIdentityStateManager(MockKeychain()) + } + + // MARK: - Accept-policy gates + + @Test + func recordVouch_rejectsUnverifiedVoucher() { + let manager = makeManager() + + #expect(!manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date())) + #expect(manager.validVouchers(for: vouchee).isEmpty) + + manager.setVerified(fingerprint: voucher, verified: true) + #expect(manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date())) + #expect(manager.validVouchers(for: vouchee).count == 1) + } + + @Test + func recordVouch_ignoresSelfVouch() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + + #expect(!manager.recordVouch(voucheeFingerprint: voucher, voucherFingerprint: voucher, timestamp: Date())) + #expect(manager.validVouchers(for: voucher).isEmpty) + } + + @Test + func recordVouch_ignoresAlreadyVerifiedVouchee() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + manager.setVerified(fingerprint: vouchee, verified: true) + + #expect(!manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date())) + #expect(!manager.isVouched(fingerprint: vouchee)) + } + + @Test + func recordVouch_rejectsStaleAndFarFutureTimestamps() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + + let stale = Date().addingTimeInterval(-31 * 24 * 60 * 60) + #expect(!manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: stale)) + + let farFuture = Date().addingTimeInterval(2 * 60 * 60) + #expect(!manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: farFuture)) + + #expect(manager.validVouchers(for: vouchee).isEmpty) + } + + @Test + func recordVouch_capsVouchersPerVoucheeKeepingMostRecent() { + let manager = makeManager() + let base = Date() + + // 9 verified vouchers vouch with strictly increasing timestamps. + let vouchers = (0..<9).map { String(format: "%02x", $0 + 0x10) + String(repeating: "00", count: 31) } + for (index, voucherFingerprint) in vouchers.enumerated() { + manager.setVerified(fingerprint: voucherFingerprint, verified: true) + let stored = manager.recordVouch( + voucheeFingerprint: vouchee, + voucherFingerprint: voucherFingerprint, + timestamp: base.addingTimeInterval(TimeInterval(index)), + now: base.addingTimeInterval(TimeInterval(index)) + ) + #expect(stored) + } + + let records = manager.validVouchers(for: vouchee) + #expect(records.count == SecureIdentityStateManager.maxVouchersPerVouchee) + // The oldest voucher fell off the end. + #expect(!records.contains { $0.voucherFingerprint == vouchers[0] }) + #expect(records.contains { $0.voucherFingerprint == vouchers[8] }) + + // An attestation older than everything retained is not stored. + let older = String(repeating: "0c", count: 32) + manager.setVerified(fingerprint: older, verified: true) + #expect(!manager.recordVouch( + voucheeFingerprint: vouchee, + voucherFingerprint: older, + timestamp: base.addingTimeInterval(-1), + now: base + )) + + // A repeat vouch from a retained voucher refreshes, not duplicates. + #expect(manager.recordVouch( + voucheeFingerprint: vouchee, + voucherFingerprint: vouchers[8], + timestamp: base.addingTimeInterval(100), + now: base.addingTimeInterval(100) + )) + #expect(manager.validVouchers(for: vouchee).count == SecureIdentityStateManager.maxVouchersPerVouchee) + } + + // MARK: - Derived trust & invalidation + + @Test + func unverifyingVoucher_invalidatesTheirVouchesWithoutDeletingThem() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date()) + #expect(manager.isVouched(fingerprint: vouchee)) + + // Removing my verification of the voucher retires their vouches… + manager.setVerified(fingerprint: voucher, verified: false) + #expect(!manager.isVouched(fingerprint: vouchee)) + #expect(manager.validVouchers(for: vouchee).isEmpty) + + // …but the records survive: re-verifying the voucher restores them + // (recompute on read, no cascade delete). + manager.setVerified(fingerprint: voucher, verified: true) + #expect(manager.isVouched(fingerprint: vouchee)) + } + + @Test + func validVouchers_expireAtReadTime() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + + let now = Date() + let timestamp = now.addingTimeInterval(-29 * 24 * 60 * 60) + #expect(manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: timestamp, now: now)) + #expect(manager.isVouched(fingerprint: vouchee, now: now)) + + let twoDaysLater = now.addingTimeInterval(2 * 24 * 60 * 60) + #expect(manager.validVouchers(for: vouchee, now: twoDaysLater).isEmpty) + #expect(!manager.isVouched(fingerprint: vouchee, now: twoDaysLater)) + } + + @Test + func effectiveTrustLevel_slotsVouchedBetweenCasualAndTrusted() { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + + // Unknown peer with a valid vouch reads as vouched. + #expect(manager.effectiveTrustLevel(for: vouchee) == .unknown) + manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date()) + #expect(manager.effectiveTrustLevel(for: vouchee) == .vouched) + + // Explicit trust outranks a vouch. + manager.updateSocialIdentity(SocialIdentity( + fingerprint: vouchee, + localPetname: nil, + claimedNickname: "bob", + trustLevel: .trusted, + isFavorite: false, + isBlocked: false, + notes: nil + )) + #expect(manager.effectiveTrustLevel(for: vouchee) == .trusted) + + // Explicit verification outranks everything. + manager.setVerified(fingerprint: vouchee, verified: true) + #expect(manager.effectiveTrustLevel(for: vouchee) == .verified) + #expect(!manager.isVouched(fingerprint: vouchee)) + + // Losing the voucher downgrades vouched back to the stored level. + manager.setVerified(fingerprint: vouchee, verified: false) + manager.setVerified(fingerprint: voucher, verified: false) + #expect(manager.effectiveTrustLevel(for: vouchee) == .casual) + } + + // MARK: - Exchange-policy state + + @Test + func mostRecentlyVerifiedFingerprints_ordersAndExcludes() { + let manager = makeManager() + let first = String(repeating: "01", count: 32) + let second = String(repeating: "02", count: 32) + let third = String(repeating: "03", count: 32) + manager.setVerified(fingerprint: first, verified: true) + manager.setVerified(fingerprint: second, verified: true) + manager.setVerified(fingerprint: third, verified: true) + + let ordered = manager.mostRecentlyVerifiedFingerprints(limit: 16, excluding: third) + #expect(ordered == [second, first]) + + let limited = manager.mostRecentlyVerifiedFingerprints(limit: 1, excluding: third) + #expect(limited == [second]) + } + + @Test + func vouchBatchSentAt_roundTrips() { + let manager = makeManager() + #expect(manager.lastVouchBatchSent(to: voucher) == nil) + + let sentAt = Date(timeIntervalSince1970: 1_700_000_000) + manager.markVouchBatchSent(to: voucher, at: sentAt) + #expect(manager.lastVouchBatchSent(to: voucher) == sentAt) + } + + @Test + func signingPublicKey_returnsAnnounceBoundKeyByFingerprint() async { + let manager = makeManager() + let signingKey = Data(repeating: 0x22, count: 32) + manager.upsertCryptographicIdentity( + fingerprint: voucher, + noisePublicKey: Data(repeating: 0x11, count: 32), + signingPublicKey: signingKey, + claimedNickname: nil + ) + + let stored = await waitUntil { manager.signingPublicKey(forFingerprint: voucher) == signingKey } + #expect(stored) + #expect(manager.signingPublicKey(forFingerprint: vouchee) == nil) + } + + // MARK: - Panic wipe + + @Test + func clearAllIdentityData_wipesVouchState() async { + let manager = makeManager() + manager.setVerified(fingerprint: voucher, verified: true) + manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date()) + manager.markVouchBatchSent(to: voucher, at: Date()) + #expect(manager.isVouched(fingerprint: vouchee)) + + manager.clearAllIdentityData() + + let wiped = await waitUntil { !manager.isVouched(fingerprint: vouchee) } + #expect(wiped) + #expect(manager.validVouchers(for: vouchee).isEmpty) + #expect(manager.lastVouchBatchSent(to: voucher) == nil) + #expect(manager.mostRecentlyVerifiedFingerprints(limit: 16, excluding: "").isEmpty) + } + + // MARK: - Persistence compatibility + + @Test + func trustLevelRawValuesAreStable() throws { + // Raw values are what's persisted; they must never change when cases + // are added mid-ladder. + #expect(TrustLevel.unknown.rawValue == "unknown") + #expect(TrustLevel.casual.rawValue == "casual") + #expect(TrustLevel.vouched.rawValue == "vouched") + #expect(TrustLevel.trusted.rawValue == "trusted") + #expect(TrustLevel.verified.rawValue == "verified") + + let legacy = Data(#"["unknown","casual","trusted","verified"]"#.utf8) + let decoded = try JSONDecoder().decode([TrustLevel].self, from: legacy) + #expect(decoded == [.unknown, .casual, .trusted, .verified]) + } + + @Test + func identityCachePersistedBeforeVouchingDecodesCleanly() throws { + // A cache captured before the vouch fields existed must decode without + // tripping the "unreadable cache" recovery path. + let legacyJSON = Data(""" + { + "socialIdentities": {}, + "nicknameIndex": {}, + "verifiedFingerprints": ["\(voucher)"], + "lastInteractions": {}, + "blockedNostrPubkeys": [], + "version": 1 + } + """.utf8) + + let decoded = try JSONDecoder().decode(IdentityCache.self, from: legacyJSON) + #expect(decoded.vouchesByVouchee == nil) + #expect(decoded.vouchBatchSentAt == nil) + #expect(decoded.verifiedAt == nil) + #expect(decoded.verifiedFingerprints == [voucher]) + } + + @Test + func identityCacheRoundTripsVouchState() throws { + var cache = IdentityCache() + cache.verifiedFingerprints = [voucher] + cache.vouchesByVouchee = [vouchee: [VouchRecord(voucherFingerprint: voucher, timestamp: Date(timeIntervalSince1970: 1_700_000_000))]] + cache.vouchBatchSentAt = [voucher: Date(timeIntervalSince1970: 1_700_000_001)] + cache.verifiedAt = [voucher: Date(timeIntervalSince1970: 1_700_000_002)] + + let decoded = try JSONDecoder().decode(IdentityCache.self, from: JSONEncoder().encode(cache)) + #expect(decoded.vouchesByVouchee == cache.vouchesByVouchee) + #expect(decoded.vouchBatchSentAt == cache.vouchBatchSentAt) + #expect(decoded.verifiedAt == cache.verifiedAt) + } + + @Test + func vouchStateSurvivesReload() async { + let keychain = MockKeychain() + let manager = SecureIdentityStateManager(keychain) + manager.setVerified(fingerprint: voucher, verified: true) + manager.recordVouch(voucheeFingerprint: vouchee, voucherFingerprint: voucher, timestamp: Date()) + let saved = await waitUntil { manager.isVouched(fingerprint: self.vouchee) } + #expect(saved) + manager.forceSave() + + let reloaded = SecureIdentityStateManager(keychain) + #expect(reloaded.isVouched(fingerprint: vouchee)) + #expect(reloaded.validVouchers(for: vouchee).count == 1) + } + + // MARK: - Helpers + + private func waitUntil( + timeout: TimeInterval = 1.0, + condition: @escaping () -> Bool + ) async -> Bool { + let deadline = Date().addingTimeInterval(timeout) + while Date() < deadline { + if condition() { + return true + } + try? await Task.sleep(nanoseconds: 10_000_000) + } + return condition() + } +} diff --git a/bitchatTests/Services/UnifiedPeerServiceTests.swift b/bitchatTests/Services/UnifiedPeerServiceTests.swift index f5a5fd6c..172bf5b1 100644 --- a/bitchatTests/Services/UnifiedPeerServiceTests.swift +++ b/bitchatTests/Services/UnifiedPeerServiceTests.swift @@ -292,4 +292,37 @@ private final class TestIdentityManager: SecureIdentityStateManagerProtocol { func getVerifiedFingerprints() -> Set { verified } + + // MARK: Vouching (unused by these tests) + + @discardableResult + func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool { + false + } + + func validVouchers(for fingerprint: String) -> [VouchRecord] { + [] + } + + func isVouched(fingerprint: String) -> Bool { + false + } + + func effectiveTrustLevel(for fingerprint: String) -> TrustLevel { + verified.contains(fingerprint) ? .verified : .unknown + } + + func lastVouchBatchSent(to fingerprint: String) -> Date? { + nil + } + + func markVouchBatchSent(to fingerprint: String, at date: Date) {} + + func signingPublicKey(forFingerprint fingerprint: String) -> Data? { + nil + } + + func mostRecentlyVerifiedFingerprints(limit: Int, excluding fingerprint: String) -> [String] { + [] + } } From d4f0c49787d274fc66744da57e11b78dbc3edc38 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:55:17 +0200 Subject: [PATCH 037/158] =?UTF-8?q?Gateway=20mode:=20opt-in=20mesh?= =?UTF-8?q?=E2=86=94Nostr=20uplink=20for=20geohash=20channels=20(#1384)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add capability bits to announce TLV Announces now carry an optional capabilities TLV (0x05): a little-endian bitfield with named bits for upcoming features (prekeys, wifiBulk, gateway, groups, board, vouch, meshDiagnostics). Old clients skip the unknown TLV; peers without it decode as nil so features can distinguish "legacy peer" from "advertises nothing". PeerCapabilities lives in BitFoundation with a minimal-length encoding that preserves unknown bits for forward compatibility. Peer capabilities are stored in the BLE peer registry on verified announce and exposed via BLEService.peerCapabilities(_:). The local advertisement set is empty until each feature ships its bit. Co-Authored-By: Claude Fable 5 * Gateway mode: opt-in mesh↔Nostr uplink for geohash channels An opt-in "internet gateway" toggle lets one connected phone bridge the local geohash channel for mesh-only peers: signed kind-20000 events ride a new nostrCarrier (0x28) packet — directed to the gateway for uplink, broadcast with TTL for downlink — with Schnorr verification at every hop, CourierStore-style quotas, and explicit loop-prevention rules. - BitFoundation: MessageType.nostrCarrier = 0x28 - NostrCarrierPacket: 2-byte-length TLV codec (direction, geohash, signed event JSON), 16 KiB cap, tolerant decoder - GatewayService: closure-injected policy layer — verify gates (sig, kind, #g tag, age, size), uplink quotas (10/min/depositor rate limit, offline queue of 20 total / 5 per depositor, drop-oldest, flush on reconnect), downlink budget (30/min, bounded drop-oldest backlog), bounded loop-prevention ID sets - BLEService: runtime capability bits (advertise .gateway only while the toggle is on, re-announce on change), signed directed uplink sends, carrier ingress with depositor signature verification - Mesh-only senders uplink automatically from sendGeohash when no relay is connected and a reachable peer advertises .gateway; once-per- channel "sent via mesh gateway" notice - UI: gateway toggle beside the Tor toggle, globe header indicator, VoiceOver labels, xcstrings entries Co-Authored-By: Claude Fable 5 * Gateway: harden downlink freshness, uplink verify ordering, and drain Fixes the confirmed downlink/uplink defects from the PR #1384 review + Codex findings: - Downlink age + #g gate (Codex P2 / review #1): rebroadcastRelayEvent now drops events outside the same freshness window receivers enforce and whose #g tag mismatches the carrier geohash, BEFORE spending any budget — so a 1h/200-event channel-resubscribe backfill no longer burns the 30/min BLE budget on events every receiver drops. - Rate-limit + dedup before Schnorr (review #2): handleUplinkDeposit now runs cheap structural checks + carried-ID dedup + rate-token consume before isValidSignature(), so a replay flood is bounded by cheap work instead of unbounded main-actor verifies. - Quota-dropped deposits not rendered (review #3): enqueueUplink reports acceptance and injectInbound only fires for events actually published/queued, ending the local-timeline divergence. - Drain timer + mark-after-send (Codex P2 / review #4): a burst beyond budget now arms a timer to drain when the window frees; rebroadcast IDs are marked only after an event is actually sent, so overflow- dropped events stay retryable. - Symmetric publish path (review #5): the gateway publish closure now refuses when no geo relay is known, matching the local send path instead of publishing dead traffic to default relays. - Loop-rule doc (review #7): softened to reflect that rule 3 is a call-site convention with unit-tested backstops; added tests for the publishedEventIDs backstop, downlink freshness/mismatch, drain timer, and quota-drop non-injection. Co-Authored-By: Claude Fable 5 * Gateway: stop self-echo of uplinked events onto the mesh Every event a gateway uplinks to the relays comes back through its own geohash subscription. `rebroadcastRelayEvent` deduped against `meshBroadcastEventIDs`, `rebroadcastEventIDs`, and `pendingDownlinks`, but not `publishedEventIDs` — so an event this gateway just published was downlink-rebroadcast onto the same mesh it originated from, doubling BLE airtime per uplinked message and able to starve the 30/min downlink budget on a busy channel (device-confirmed, filed on #1384). Fix: also skip the downlink rebroadcast when the event id is in `publishedEventIDs`. That set is already the bounded (drop-oldest, capacity maxTrackedEventIDs) loop-rule-2 uplink cache, populated only by `publish()`, so genuine inbound-from-internet events (never published here) still rebroadcast normally. Reconciles cleanly with the existing loop-prevention sets — no new state. Adds a GatewayServiceTests case asserting an uplinked event that echoes back via the subscription is not rebroadcast, while a genuine inbound event still is. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/LocationChannelsModel.swift | 16 +- bitchat/Localizable.xcstrings | 60 ++ bitchat/Protocols/NostrCarrierPacket.swift | 136 +++++ .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEPeerRegistry.swift | 5 + bitchat/Services/BLE/BLEReceivePipeline.swift | 5 +- bitchat/Services/BLE/BLEService.swift | 119 +++- bitchat/Services/Gateway/GatewayService.swift | 492 +++++++++++++++ bitchat/Sync/SyncTypeFlags.swift | 4 + .../ChatViewModelBootstrapper.swift | 67 ++ .../GeohashSubscriptionManager.swift | 26 + bitchat/Views/ContentHeaderView.swift | 13 + bitchat/Views/LocationChannelsSheet.swift | 30 + .../Protocols/NostrCarrierPacketTests.swift | 96 +++ .../Services/GatewayServiceTests.swift | 575 ++++++++++++++++++ .../Sources/BitFoundation/MessageType.swift | 5 + 16 files changed, 1644 insertions(+), 7 deletions(-) create mode 100644 bitchat/Protocols/NostrCarrierPacket.swift create mode 100644 bitchat/Services/Gateway/GatewayService.swift create mode 100644 bitchatTests/Protocols/NostrCarrierPacketTests.swift create mode 100644 bitchatTests/Services/GatewayServiceTests.swift diff --git a/bitchat/App/LocationChannelsModel.swift b/bitchat/App/LocationChannelsModel.swift index c820455a..d7431d6d 100644 --- a/bitchat/App/LocationChannelsModel.swift +++ b/bitchat/App/LocationChannelsModel.swift @@ -12,20 +12,26 @@ final class LocationChannelsModel: ObservableObject { @Published private(set) var bookmarkNames: [String: String] @Published private(set) var locationNames: [GeohashChannelLevel: String] @Published private(set) var userTorEnabled: Bool + @Published private(set) var gatewayEnabled: Bool private let manager: LocationChannelManager private let network: NetworkActivationService + private let gateway: GatewayService private var cancellables = Set() init( manager: LocationChannelManager? = nil, - network: NetworkActivationService? = nil + network: NetworkActivationService? = nil, + gateway: GatewayService? = nil ) { let manager = manager ?? .shared let network = network ?? .shared + let gateway = gateway ?? .shared self.manager = manager self.network = network + self.gateway = gateway + self.gatewayEnabled = gateway.isEnabled self.permissionState = manager.permissionState self.availableChannels = manager.availableChannels self.selectedChannel = manager.selectedChannel @@ -96,6 +102,10 @@ final class LocationChannelsModel: ObservableObject { network.setUserTorEnabled(enabled) } + func setGatewayEnabled(_ enabled: Bool) { + gateway.setEnabled(enabled) + } + func refreshMeshChannelsIfNeeded() { guard case .mesh = selectedChannel, permissionState == .authorized, @@ -160,6 +170,10 @@ final class LocationChannelsModel: ObservableObject { network.$userTorEnabled .receive(on: DispatchQueue.main) .assign(to: &$userTorEnabled) + + gateway.$isEnabled + .receive(on: DispatchQueue.main) + .assign(to: &$gatewayEnabled) } private func level(forLength length: Int) -> GeohashChannelLevel { diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 5b91da12..bed148dd 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -9348,6 +9348,18 @@ } } }, + "content.accessibility.gateway_active" : { + "comment" : "Accessibility label for the internet gateway indicator", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Internet gateway active, sharing your connection with the mesh" + } + } + } + }, "content.accessibility.jump_to_latest" : { "comment" : "Accessibility label for the jump to latest messages button", "extractionState" : "manual", @@ -17884,6 +17896,18 @@ } } }, + "content.header.gateway_active" : { + "comment" : "Tooltip for the internet gateway indicator", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sharing your internet connection with nearby mesh peers" + } + } + } + }, "content.header.people" : { "extractionState" : "manual", "localizations" : { @@ -25819,6 +25843,30 @@ } } }, + "location_channels.gateway.subtitle" : { + "comment" : "Explanation under the internet gateway toggle", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "share your internet with nearby mesh peers so their geohash messages reach the network" + } + } + } + }, + "location_channels.gateway.title" : { + "comment" : "Title for the internet gateway toggle in the location channels sheet", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "internet gateway" + } + } + } + }, "location_channels.loading_nearby" : { "extractionState" : "manual", "localizations" : { @@ -33665,6 +33713,18 @@ } } }, + "system.gateway.sent_via_mesh" : { + "comment" : "System message when a geohash message was handed to a mesh internet gateway because no relay is reachable", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent via mesh gateway" + } + } + } + }, "system.geohash.blocked" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Protocols/NostrCarrierPacket.swift b/bitchat/Protocols/NostrCarrierPacket.swift new file mode 100644 index 00000000..e65f2b66 --- /dev/null +++ b/bitchat/Protocols/NostrCarrierPacket.swift @@ -0,0 +1,136 @@ +// +// NostrCarrierPacket.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation + +/// Wire payload for `MessageType.nostrCarrier` (0x28): a complete, signed +/// Nostr event ferried over the mesh between a mesh-only peer and an +/// internet gateway peer. +/// +/// - `toGateway` rides a DIRECTED packet (recipientID = the gateway peer): +/// a mesh-only sender asks the gateway to publish its locally signed +/// geohash event to Nostr relays. +/// - `fromGateway` rides a BROADCAST packet (default TTL): the gateway +/// rebroadcasts inbound relay events so mesh-only peers see the channel. +/// +/// The carried event is public geohash chat — already plaintext on Nostr — +/// so the carrier adds no encryption. It IS signed by the originator's +/// per-geohash identity, so neither the gateway nor any mesh relay can forge +/// or alter it undetected: gateways and receivers verify the Schnorr +/// signature before acting on it. +/// +/// TLV encoding with 2-byte big-endian lengths (the event JSON exceeds the +/// 1-byte TLV range used by smaller packets). Unknown TLV types are skipped +/// for forward compatibility. +struct NostrCarrierPacket: Equatable { + enum Direction: UInt8 { + case toGateway = 0x01 + case fromGateway = 0x02 + } + + let direction: Direction + let geohash: String + /// Complete signed Nostr event JSON (id, pubkey, created_at, kind, tags, + /// content, sig). + let eventJSON: Data + + /// BLE airtime cap for a carried event. + static let maxEventJSONBytes = 16 * 1024 + static let maxGeohashLength = 12 + + private enum TLVType: UInt8 { + case direction = 0x01 + case geohash = 0x02 + case eventJSON = 0x03 + } + + init?(direction: Direction, geohash: String, eventJSON: Data) { + let geohashBytes = Data(geohash.utf8) + guard !geohashBytes.isEmpty, + geohashBytes.count <= Self.maxGeohashLength, + !eventJSON.isEmpty, + eventJSON.count <= Self.maxEventJSONBytes else { + return nil + } + self.direction = direction + self.geohash = geohash + self.eventJSON = eventJSON + } + + init?(direction: Direction, geohash: String, event: NostrEvent) { + guard let json = try? event.jsonString(), !json.isEmpty else { return nil } + self.init(direction: direction, geohash: geohash, eventJSON: Data(json.utf8)) + } + + /// Decodes the carried event. Callers MUST still verify + /// `event.isValidSignature()` before publishing or displaying it. + func event() -> NostrEvent? { + guard let dict = try? JSONSerialization.jsonObject(with: eventJSON) as? [String: Any] else { + return nil + } + return try? NostrEvent(from: dict) + } + + func encode() -> Data? { + var data = Data() + data.reserveCapacity(eventJSON.count + geohash.utf8.count + 12) + + func appendTLV(_ type: TLVType, _ value: Data) { + data.append(type.rawValue) + data.append(UInt8((value.count >> 8) & 0xFF)) + data.append(UInt8(value.count & 0xFF)) + data.append(value) + } + + appendTLV(.direction, Data([direction.rawValue])) + appendTLV(.geohash, Data(geohash.utf8)) + appendTLV(.eventJSON, eventJSON) + return data + } + + static func decode(_ data: Data) -> NostrCarrierPacket? { + // Defensive slice re-base (Data slices keep parent indices). + let data = Data(data) + var offset = 0 + var direction: Direction? + var geohash: String? + var eventJSON: Data? + + while offset + 3 <= data.count { + let typeRaw = data[offset] + let length = (Int(data[offset + 1]) << 8) | Int(data[offset + 2]) + offset += 3 + guard offset + length <= data.count else { return nil } + let value = data.subdata(in: offset.. [PeerID] { + peers.values.filter { $0.capabilities.contains(capability) }.map(\.peerID) + } + func displayNicknames(selfNickname: String) -> [PeerID: String] { let connected = peers.filter { $0.value.isConnected } let tuples = connected.map { ($0.key, $0.value.nickname, true) } diff --git a/bitchat/Services/BLE/BLEReceivePipeline.swift b/bitchat/Services/BLE/BLEReceivePipeline.swift index 02fe152a..691bb3e2 100644 --- a/bitchat/Services/BLE/BLEReceivePipeline.swift +++ b/bitchat/Services/BLE/BLEReceivePipeline.swift @@ -51,8 +51,11 @@ struct BLEReceivePipeline { // Courier envelopes are directed opaque ciphertext like DMs; a // remote handover toward a relayed announce rides this same // deterministic relay treatment instead of the broadcast clamp. + // Directed nostrCarrier uplinks (mesh-only peer -> gateway) need + // the same multi-hop treatment to reach a non-adjacent gateway. isDirectedEncrypted: (packet.type == MessageType.noiseEncrypted.rawValue - || packet.type == MessageType.courierEnvelope.rawValue) && packet.recipientID != nil, + || packet.type == MessageType.courierEnvelope.rawValue + || packet.type == MessageType.nostrCarrier.rawValue) && packet.recipientID != nil, isFragment: packet.type == MessageType.fragment.rawValue, isDirectedFragment: packet.type == MessageType.fragment.rawValue && packet.recipientID != nil, isHandshake: packet.type == MessageType.noiseHandshake.rawValue, diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index d4109199..3c1538d3 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -62,6 +62,14 @@ final class BLEService: NSObject { // Local-only store-and-forward counters; nil in unit tests. var sfMetrics: StoreAndForwardMetrics? + // Gateway mode: sink for received nostrCarrier packets (set by app + // wiring, called on the main actor after transport-level checks) and the + // runtime-toggled capability bits ORed into `PeerCapabilities.localSupported` + // for every announce. `directedToUs` distinguishes an uplink deposit + // addressed to this device from a downlink broadcast. + var onNostrCarrierPacket: (@MainActor (_ payload: Data, _ from: PeerID, _ directedToUs: Bool) -> Void)? + private var runtimeCapabilities: PeerCapabilities = [] // collectionsQueue + #if DEBUG // Test-only tap on the outbound pipeline so multi-node tests can ferry // packets between in-process service instances. @@ -638,6 +646,32 @@ final class BLEService: NSObject { collectionsQueue.sync { peerRegistry.capabilities(for: peerID) } } + /// Enables or disables a runtime-advertised capability bit (e.g. the + /// internet-gateway toggle) and re-announces so peers learn promptly. + /// Build-time bits stay in `PeerCapabilities.localSupported`. + func setLocalCapability(_ capability: PeerCapabilities, enabled: Bool) { + let changed: Bool = collectionsQueue.sync(flags: .barrier) { + let before = runtimeCapabilities + if enabled { + runtimeCapabilities.insert(capability) + } else { + runtimeCapabilities.remove(capability) + } + return runtimeCapabilities != before + } + guard changed else { return } + sendAnnounce(forceSend: true) + } + + /// Reachable peers currently advertising the `.gateway` capability. + func reachableGatewayPeers() -> [PeerID] { + let now = Date() + return collectionsQueue.sync { + peerRegistry.peers(advertising: .gateway) + .filter { peerRegistry.isReachable($0, now: now) } + } + } + func getPeerNicknames() -> [PeerID: String] { return collectionsQueue.sync { peerRegistry.displayNicknames(selfNickname: myNickname) @@ -1272,16 +1306,16 @@ final class BLEService: NSObject { let noisePub = noiseService.getStaticPublicKeyData() // For noise handshakes and peer identification let signingPub = noiseService.getSigningPublicKeyData() // For signature verification - let connectedPeerIDs: [Data] = collectionsQueue.sync { - peerRegistry.connectedRoutingData + let (connectedPeerIDs, advertisedCapabilities): ([Data], PeerCapabilities) = collectionsQueue.sync { + (peerRegistry.connectedRoutingData, PeerCapabilities.localSupported.union(runtimeCapabilities)) } - + let announcement = AnnouncementPacket( nickname: myNickname, noisePublicKey: noisePub, signingPublicKey: signingPub, directNeighbors: connectedPeerIDs, - capabilities: PeerCapabilities.localSupported + capabilities: advertisedCapabilities ) guard let payload = announcement.encode() else { @@ -2762,6 +2796,81 @@ extension BLEService { } } + // MARK: Gateway carrier (nostrCarrier) + + /// Sign and send an encoded `toGateway` carrier payload directed at a + /// gateway peer. The packet is signed so the gateway can key its uplink + /// quotas to an authenticated depositor; the carried Nostr event has its + /// own Schnorr signature for content authenticity. Returns false when + /// the gateway is not reachable or signing fails. + func sendNostrCarrier(_ payload: Data, to gatewayPeer: PeerID) -> Bool { + guard isPeerReachable(gatewayPeer) else { return false } + let packet = BitchatPacket( + type: MessageType.nostrCarrier.rawValue, + senderID: myPeerIDData, + recipientID: Data(hexString: gatewayPeer.id), + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: messageTTL + ) + guard let signed = noiseService.signPacket(packet) else { return false } + messageQueue.async { [weak self] in + // broadcastPacket applies a known route when one exists and + // otherwise floods the directed packet like a DM, so a gateway + // that is reachable but multi-hop still gets the deposit. + self?.broadcastPacket(signed) + } + return true + } + + /// Broadcast an encoded `fromGateway` carrier payload on the mesh with + /// the default TTL. Unsigned at the packet layer — receivers verify the + /// carried event's own Schnorr signature. + func broadcastNostrCarrier(_ payload: Data) { + let packet = BitchatPacket( + type: MessageType.nostrCarrier.rawValue, + senderID: myPeerIDData, + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: messageTTL + ) + messageQueue.async { [weak self] in + self?.broadcastPacket(packet) + } + } + + /// Transport-level handling for a received nostrCarrier packet; policy + /// (verification of the carried event, quotas, loop prevention) lives in + /// `GatewayService` behind `onNostrCarrierPacket`. + private func handleNostrCarrier(_ packet: BitchatPacket, from peerID: PeerID) { + let senderID = PeerID(hexData: packet.senderID) + let directedToUs: Bool + if let recipientID = packet.recipientID { + // Carriers addressed elsewhere ride the generic relay path untouched. + guard recipientID == myPeerIDData else { return } + // Uplink deposit: quotas are keyed by the depositor, so the + // packet signature must verify against the sender's announced + // signing key. Unlike courier deposits the depositor may be + // multi-hop away, so ingress-link identity is not required. + let signingKey = collectionsQueue.sync { peerRegistry.info(for: senderID)?.signingPublicKey } + guard let signingKey, + noiseService.verifyPacketSignature(packet, publicKey: signingKey) else { + SecureLogger.debug("🌐 nostrCarrier uplink from \(senderID.id.prefix(8))… rejected (missing/invalid packet signature)", category: .security) + return + } + directedToUs = true + } else { + directedToUs = false + } + let payload = packet.payload + notifyUI { [weak self] in + self?.onNostrCarrierPacket?(payload, senderID, directedToUs) + } + } + // MARK: Link capability snapshots (thread-safe via bleQueue) private func readLinkState(_ body: (BLELinkStateStore) -> T) -> T { @@ -3269,6 +3378,8 @@ extension BLEService { case .boardPost: // Invalid or deleted posts must not spread; skip the relay step. guard handleBoardPost(packet, from: senderID) else { return } + case .nostrCarrier: + handleNostrCarrier(packet, from: peerID) case .leave: handleLeave(packet, from: senderID) diff --git a/bitchat/Services/Gateway/GatewayService.swift b/bitchat/Services/Gateway/GatewayService.swift new file mode 100644 index 00000000..c8d13756 --- /dev/null +++ b/bitchat/Services/Gateway/GatewayService.swift @@ -0,0 +1,492 @@ +// +// GatewayService.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import Combine +import Foundation + +/// Policy engine for gateway mode: an opt-in "share my internet with the +/// mesh" bridge. While the toggle is on, this device advertises the +/// `.gateway` capability bit, publishes signed geohash events deposited by +/// mesh-only peers to Nostr relays (uplink), and rebroadcasts inbound relay +/// events onto the mesh (downlink) so mesh-only peers can take part in the +/// local geohash channel. Mesh-only peers need no toggle: their uplink +/// engages automatically when relays are unreachable and a gateway peer +/// exists. +/// +/// Threat model: +/// - Keys never leave the originating device. Mesh-only senders sign events +/// locally with their per-geohash ephemeral identity; the gateway carries +/// only the finished, signed event. +/// - The gateway cannot forge or alter events: every carried event is +/// Schnorr-verified here before it is published or rebroadcast, and again +/// independently by relays and receivers. +/// - Carried contents are public geohash chat, already plaintext on Nostr, +/// so the mesh carrier adds no confidentiality loss. +/// +/// Loop-prevention rules: +/// 1. An event learned from a `fromGateway` mesh broadcast is never +/// re-published to relays, never re-uplinked, and never rebroadcast +/// (`meshBroadcastEventIDs`), so a second gateway on the same mesh cannot +/// echo mesh-carried traffic back out. Mesh-level propagation of the +/// original broadcast packet is the TTL relay's job, not ours. +/// 2. An uplink deposit is published at most once (`publishedEventIDs`) and +/// a relay event is rebroadcast at most once (`rebroadcastEventIDs`), so +/// repeat deposits and relay echoes are absorbed. An event this gateway +/// itself uplinked (`publishedEventIDs`) is additionally never +/// downlink-rebroadcast: it originated on this mesh, so echoing it back +/// when our own relay subscription redelivers it would double BLE airtime +/// (the device-confirmed self-echo bug). +/// 3. Uplink is only attempted for locally composed events at the send site +/// (`GeohashSubscriptionManager.sendGeohash`); events received over the +/// carrier never re-enter the uplink path. This is a call-site convention; +/// the `meshBroadcastEventIDs`/`publishedEventIDs` backstops in +/// `uplinkViaMesh` enforce it defensively and are unit-tested. +/// Rules 1 and 2 are enforced here and unit-tested. +/// Rebroadcast storms at the mesh layer are additionally bounded by the BLE +/// `MessageDeduplicator` and packet TTL, and receivers dedup carried events +/// against their own relay subscriptions via the Nostr event-ID cache in +/// `NostrInboundPipeline`. +/// +/// All dependencies are closure-injected (repo convention) so the policy +/// layer is unit-testable without relays or radios. +@MainActor +final class GatewayService: ObservableObject { + enum Limits { + /// Uplink deposits held while relays are unreachable (CourierStore-style + /// bounded mailbag: bounded total, bounded per depositor). + static let maxQueuedUplinks = 20 + static let maxQueuedUplinksPerDepositor = 5 + /// Uplink deposits accepted per depositor per minute. + static let uplinkEventsPerMinutePerDepositor = 10 + /// Downlink mesh rebroadcasts per minute — BLE airtime is precious. + /// Beyond the budget events queue (bounded, drop-oldest) and drain on + /// a scheduled timer once the window frees (also re-driven by the next + /// inbound relay event); a quiet channel does not strand its backlog. + static let downlinkEventsPerMinute = 30 + static let maxPendingDownlinks = 30 + /// Accepted clock skew for a carried ephemeral event; anything older + /// is stale replay the relays would drop anyway. + static let maxEventAgeSeconds: TimeInterval = 15 * 60 + /// Bounded loop-prevention ID caches (oldest evicted). + static let maxTrackedEventIDs = 512 + } + + struct QueuedUplink { + let depositor: PeerID + let geohash: String + let event: NostrEvent + let queuedAt: Date + } + + static let shared = GatewayService() + + /// The user toggle. While true this device advertises `.gateway` and + /// bridges mesh <-> Nostr for geohash channels. + @Published private(set) var isEnabled: Bool + + // MARK: Wiring (set once by the bootstrapper; fakes in tests) + + /// Publishes a verified event to the geo relays for a geohash. + var publishToRelays: (@MainActor (NostrEvent, String) -> Void)? + /// Broadcasts an encoded `fromGateway` carrier payload on the mesh. + var broadcastToMesh: (@MainActor (Data) -> Void)? + /// Sends an encoded `toGateway` carrier payload directed to a gateway + /// peer. Returns false when the transport could not accept it. + var sendToGatewayPeer: (@MainActor (Data, PeerID) -> Bool)? + /// Reachable mesh peers currently advertising the `.gateway` capability. + var availableGatewayPeers: (@MainActor () -> [PeerID])? + /// Whether any Nostr relay connection is currently working. + var relaysConnected: (@MainActor () -> Bool)? + /// The geohash channel the local user is viewing, if any. + var currentGeohash: (@MainActor () -> String?)? + /// Injects a verified carried event into the same inbound pipeline as + /// relay-received events (blocking, rate limits, dedup, rendering). + var injectInbound: (@MainActor (NostrEvent) -> Void)? + /// Fired on toggle changes (advertise/withdraw the capability bit and + /// force a re-announce). + var onEnabledChanged: (@MainActor (Bool) -> Void)? + /// Schedules a downlink-drain closure to run after a delay. Injected so + /// the drain timer is deterministic in tests; nil arms a real `Task`. + var scheduleDrainTimer: (@MainActor (TimeInterval, @escaping @MainActor () -> Void) -> Void)? + + // MARK: State + + /// Loop rule 1: event IDs seen in `fromGateway` mesh broadcasts. + private var meshBroadcastEventIDs: BoundedIDSet + /// Loop rule 2 (uplink): event IDs this gateway already published. + private var publishedEventIDs: BoundedIDSet + /// Loop rule 2 (downlink): event IDs this gateway already rebroadcast. + private var rebroadcastEventIDs: BoundedIDSet + + private(set) var queuedUplinks: [QueuedUplink] = [] + private var uplinkDepositTimes: [PeerID: [Date]] = [:] + private var downlinkSendTimes: [Date] = [] + private var pendingDownlinks: [(event: NostrEvent, geohash: String)] = [] + /// True while a drain timer is armed, so a burst schedules at most one. + private var downlinkDrainScheduled = false + + private let defaults: UserDefaults + private let now: () -> Date + private static let enabledKey = "gateway.userEnabled" + + init(defaults: UserDefaults = .standard, now: @escaping () -> Date = Date.init) { + self.defaults = defaults + self.now = now + self.isEnabled = defaults.bool(forKey: Self.enabledKey) + self.meshBroadcastEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + self.publishedEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + self.rebroadcastEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + } + + // MARK: - Toggle + + func setEnabled(_ enabled: Bool) { + guard enabled != isEnabled else { return } + isEnabled = enabled + defaults.set(enabled, forKey: Self.enabledKey) + if !enabled { + queuedUplinks.removeAll() + pendingDownlinks.removeAll() + uplinkDepositTimes.removeAll() + } + SecureLogger.info("🌐 Gateway mode \(enabled ? "enabled" : "disabled")", category: .session) + onEnabledChanged?(enabled) + } + + // MARK: - Mesh carrier ingress (both roles) + + /// Entry point for received `nostrCarrier` packets. `directedToUs` is + /// true for packets addressed to this device (uplink deposits); false + /// for broadcasts (downlink rebroadcasts from a gateway). + func handleMeshCarrier(_ payload: Data, from peerID: PeerID, directedToUs: Bool) { + guard let carrier = NostrCarrierPacket.decode(payload) else { + SecureLogger.debug("🌐 Gateway: dropping undecodable carrier from \(peerID.id.prefix(8))…", category: .session) + return + } + switch carrier.direction { + case .toGateway: + // Uplink deposits are directed; a broadcast toGateway is malformed. + guard directedToUs else { return } + handleUplinkDeposit(carrier, from: peerID) + case .fromGateway: + // Downlink rides broadcast only; a directed fromGateway is malformed. + guard !directedToUs else { return } + handleDownlinkBroadcast(carrier) + } + } + + // MARK: - Uplink (gateway role: mesh peer -> internet) + + private func handleUplinkDeposit(_ carrier: NostrCarrierPacket, from depositor: PeerID) { + guard isEnabled else { return } + // Cheap structural checks first (parse, size, geohash, kind, #g tag, + // age) — no crypto — so junk and stale replays are dropped before we + // ever pay for a MainActor Schnorr verify. + guard let event = structurallyValidEvent(from: carrier) else { + SecureLogger.debug("🌐 Gateway: rejected uplink deposit from \(depositor.id.prefix(8))… (failed validation)", category: .security) + return + } + // Dedup by the carried event ID BEFORE verification. Loop rule 1: a + // fromGateway-learned event is mesh-carried and must never be + // re-published. Loop rule 2: repeat deposits of an already handled + // event are absorbed. A replay of one valid deposit is short-circuited + // here without a per-packet signature verify. + guard !meshBroadcastEventIDs.contains(event.id), + !publishedEventIDs.contains(event.id), + !queuedUplinks.contains(where: { $0.event.id == event.id }) else { + return + } + // Consume the per-depositor rate token BEFORE the expensive verify so + // a flood of distinct forged/junk deposits is bounded by cheap work, + // not by main-actor Schnorr verifications. + guard allowUplinkDeposit(from: depositor) else { + SecureLogger.debug("🌐 Gateway: rate-limited uplink deposit from \(depositor.id.prefix(8))…", category: .session) + return + } + // Only now pay for cryptographic verification; receivers verify again. + guard event.isValidSignature() else { + SecureLogger.debug("🌐 Gateway: rejected uplink deposit from \(depositor.id.prefix(8))… (bad signature)", category: .security) + return + } + + let accepted: Bool + if relaysConnected?() ?? false { + publish(event, geohash: carrier.geohash) + accepted = true + } else { + accepted = enqueueUplink(QueuedUplink(depositor: depositor, geohash: carrier.geohash, event: event, queuedAt: now())) + } + + // Only render on our own timeline what we actually accepted for + // publish or queue: a quota-dropped deposit is never published and, + // being directed, no other peer will ever see it, so showing it would + // diverge our timeline permanently from what reached the channel. + if accepted, currentGeohash?() == carrier.geohash { + injectInbound?(event) + } + } + + /// Publish everything queued while relays were unreachable. Called when + /// relay connectivity comes back. + func flushQueuedUplinks() { + guard isEnabled, relaysConnected?() ?? false, !queuedUplinks.isEmpty else { return } + let queued = queuedUplinks + queuedUplinks.removeAll() + for item in queued where !publishedEventIDs.contains(item.event.id) { + publish(item.event, geohash: item.geohash) + } + } + + private func publish(_ event: NostrEvent, geohash: String) { + publishedEventIDs.insert(event.id) + publishToRelays?(event, geohash) + SecureLogger.info("🌐 Gateway: published carried event \(event.id.prefix(8))… to relays for #\(geohash)", category: .session) + } + + /// Returns true when the item was actually stored for later publish. + @discardableResult + private func enqueueUplink(_ item: QueuedUplink) -> Bool { + let fromDepositor = queuedUplinks.filter { $0.depositor == item.depositor }.count + guard fromDepositor < Limits.maxQueuedUplinksPerDepositor else { + SecureLogger.debug("🌐 Gateway: uplink queue quota reached for \(item.depositor.id.prefix(8))…", category: .session) + return false + } + if queuedUplinks.count >= Limits.maxQueuedUplinks { + queuedUplinks.removeFirst(queuedUplinks.count - Limits.maxQueuedUplinks + 1) + } + queuedUplinks.append(item) + return true + } + + private func allowUplinkDeposit(from depositor: PeerID) -> Bool { + let cutoff = now().addingTimeInterval(-60) + var times = uplinkDepositTimes[depositor, default: []] + times.removeAll { $0 < cutoff } + guard times.count < Limits.uplinkEventsPerMinutePerDepositor else { + uplinkDepositTimes[depositor] = times + return false + } + times.append(now()) + uplinkDepositTimes[depositor] = times + // Bound the tracker itself against a churn of spoofed depositors. + if uplinkDepositTimes.count > Limits.maxTrackedEventIDs { + uplinkDepositTimes = uplinkDepositTimes.filter { !$0.value.isEmpty && $0.value.contains { $0 >= cutoff } } + } + return true + } + + // MARK: - Downlink (gateway role: internet -> mesh) + + /// Called for every event the gateway's own geohash-channel subscription + /// delivers. Wraps it in a `fromGateway` carrier and broadcasts it on + /// the mesh, within the airtime budget. + func rebroadcastRelayEvent(_ event: NostrEvent, geohash: String) { + guard isEnabled, broadcastToMesh != nil else { return } + guard event.kind == NostrProtocol.EventKind.ephemeralEvent.rawValue else { return } + // Freshness + geohash gate BEFORE spending any budget. A channel + // (re)subscribe backfills up to an hour of history (limit 200), but + // every receiver's `validatedEvent` drops anything older than the + // same window — so rebroadcasting backfill would burn the whole + // per-minute budget on events no mesh peer accepts. Also require the + // event's own `#g` tag to match the carrier geohash. + guard isFresh(event), + event.tags.contains(where: { $0.count >= 2 && $0[0] == "g" && $0[1] == geohash }) else { + return + } + // Loop rule 1: never rebroadcast mesh-carried events back onto the + // mesh. Loop rule 2 (self-echo): never rebroadcast an event this + // gateway itself uplinked (`publishedEventIDs`) — it originated on this + // very mesh, so our own relay subscription echoing it back must not + // double the BLE airtime by pushing it out again. Loop rule 2 + // (downlink): rebroadcast each genuine inbound relay event at most once + // — but mark only AFTER it is actually sent (in `drainPendingDownlinks`), + // so an event dropped by the queue overflow stays retryable on relay + // redelivery. Guard against a redelivery re-queueing an event that is + // still waiting to be sent. + guard !meshBroadcastEventIDs.contains(event.id), + !publishedEventIDs.contains(event.id), + !rebroadcastEventIDs.contains(event.id), + !pendingDownlinks.contains(where: { $0.event.id == event.id }) else { + return + } + // Verify before spending BLE airtime; receivers verify again. + guard event.isValidSignature() else { return } + + pendingDownlinks.append((event, geohash)) + if pendingDownlinks.count > Limits.maxPendingDownlinks { + // Bandwidth guard: drop-oldest — fresher chat is worth more. The + // dropped event is not yet in `rebroadcastEventIDs`, so a later + // relay redelivery can still carry it. + pendingDownlinks.removeFirst(pendingDownlinks.count - Limits.maxPendingDownlinks) + } + drainPendingDownlinks() + } + + private func drainPendingDownlinks() { + let cutoff = now().addingTimeInterval(-60) + downlinkSendTimes.removeAll { $0 < cutoff } + while !pendingDownlinks.isEmpty, + downlinkSendTimes.count < Limits.downlinkEventsPerMinute { + let (event, geohash) = pendingDownlinks.removeFirst() + // A queued event may have aged past the window while it waited; + // don't burn airtime on what receivers would now drop. + guard isFresh(event) else { continue } + guard let carrier = NostrCarrierPacket(direction: .fromGateway, geohash: geohash, event: event), + let payload = carrier.encode() else { continue } + broadcastToMesh?(payload) + // Mark-after-send: only now is the relay event definitively + // rebroadcast (loop rule 2). + rebroadcastEventIDs.insert(event.id) + downlinkSendTimes.append(now()) + } + // Budget exhausted with events still queued: arm a timer to drain when + // the window frees, instead of stranding them until the next inbound + // relay event (which may never come on a channel that went quiet). + scheduleDownlinkDrainIfNeeded() + } + + /// Arms a single timer to drain the backlog once the per-minute window + /// frees. No-op when nothing is pending or a drain is already scheduled. + private func scheduleDownlinkDrainIfNeeded() { + guard !pendingDownlinks.isEmpty, !downlinkDrainScheduled else { return } + // The window frees when the oldest recorded send ages out of 60s. + let oldest = downlinkSendTimes.min() ?? now() + let delay = max(0.05, 60 - now().timeIntervalSince(oldest)) + downlinkDrainScheduled = true + let fire: @MainActor () -> Void = { [weak self] in + guard let self else { return } + self.downlinkDrainScheduled = false + self.drainPendingDownlinks() + } + if let scheduleDrainTimer { + scheduleDrainTimer(delay, fire) + } else { + Task { @MainActor in + try? await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000)) + fire() + } + } + } + + // MARK: - Downlink (receiver role: carried event arrives over mesh) + + private func handleDownlinkBroadcast(_ carrier: NostrCarrierPacket) { + guard let event = validatedEvent(from: carrier) else { return } + // Mark only AFTER signature verification, so a forged copy carrying a + // real event's ID cannot poison the never-republish set, and use the + // marking as dedup: the same broadcast relayed along several mesh + // paths injects once (the pipeline's Nostr event-ID cache additionally + // dedups against our own relay subscription). + guard meshBroadcastEventIDs.insert(event.id) else { return } + // Only inject events for the channel we're viewing; the inbound + // pipeline files public messages under the current geohash. + guard currentGeohash?() == carrier.geohash else { return } + injectInbound?(event) + } + + // MARK: - Uplink (sender role: mesh-only peer with no relays) + + /// Hands a locally signed event to a mesh gateway peer when we have no + /// working relay connection. Returns true when the event was sent. + /// + /// v1 is deliberately fire-and-forget: no gateway ack. The event also + /// stays in `NostrRelayManager`'s own pending queue, so if our internet + /// comes back the relays dedup the duplicate publish by event ID. + /// + /// Loop rule 3: call sites only pass freshly composed events (see + /// `GeohashSubscriptionManager.sendGeohash`); received carrier events + /// never reach this path, and the mesh-carried guard below backstops it. + func uplinkViaMesh(event: NostrEvent, geohash: String) -> Bool { + if relaysConnected?() ?? true { return false } + guard !meshBroadcastEventIDs.contains(event.id), + !publishedEventIDs.contains(event.id) else { + return false + } + // A single gateway is enough — relays fan out from there, and BLE + // airtime is precious. + guard let gateway = availableGatewayPeers?().first else { return false } + guard let carrier = NostrCarrierPacket(direction: .toGateway, geohash: geohash, event: event), + let payload = carrier.encode() else { + return false + } + guard sendToGatewayPeer?(payload, gateway) ?? false else { return false } + SecureLogger.info("🌐 Gateway: uplinked event \(event.id.prefix(8))… for #\(geohash) via mesh gateway \(gateway.id.prefix(8))…", category: .session) + return true + } + + // MARK: - Validation + + /// Structural and cryptographic checks every carried event must pass + /// before a gateway publishes it or a receiver displays it. Ordered + /// cheap-first; Schnorr verification runs last. + private func validatedEvent(from carrier: NostrCarrierPacket) -> NostrEvent? { + guard let event = structurallyValidEvent(from: carrier), + event.isValidSignature() else { + return nil + } + return event + } + + /// The cheap half of `validatedEvent`: parse + size + geohash + kind + + /// `#g` tag + freshness, with NO signature verification. Callers that can + /// dedup or rate-limit on the carried ID run this first so the expensive + /// Schnorr verify is reached only for events that survive the cheap gates. + private func structurallyValidEvent(from carrier: NostrCarrierPacket) -> NostrEvent? { + guard carrier.eventJSON.count <= NostrCarrierPacket.maxEventJSONBytes, + Self.isValidGeohash(carrier.geohash), + let event = carrier.event(), + event.kind == NostrProtocol.EventKind.ephemeralEvent.rawValue, + event.tags.contains(where: { $0.count >= 2 && $0[0] == "g" && $0[1] == carrier.geohash }), + isFresh(event) else { + return nil + } + return event + } + + /// True when `event.created_at` is within the accepted clock skew — the + /// SAME freshness window receivers enforce, so a gateway never spends + /// airtime on events every receiver would drop as stale. + private func isFresh(_ event: NostrEvent) -> Bool { + abs(now().timeIntervalSince1970 - TimeInterval(event.created_at)) <= Limits.maxEventAgeSeconds + } + + static func isValidGeohash(_ geohash: String) -> Bool { + let allowed = Set("0123456789bcdefghjkmnpqrstuvwxyz") + return (1...NostrCarrierPacket.maxGeohashLength).contains(geohash.count) + && geohash.allSatisfy { allowed.contains($0) } + } +} + +/// Insertion-ordered string set with a fixed capacity; the oldest entry is +/// evicted when full. +private struct BoundedIDSet { + private var members: Set = [] + private var order: [String] = [] + let capacity: Int + + init(capacity: Int) { + self.capacity = capacity + } + + func contains(_ id: String) -> Bool { + members.contains(id) + } + + /// Returns false when the ID was already present. + @discardableResult + mutating func insert(_ id: String) -> Bool { + guard members.insert(id).inserted else { return false } + order.append(id) + if order.count > capacity { + members.remove(order.removeFirst()) + } + return true + } +} diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index f8796e4b..eb082c31 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -40,6 +40,10 @@ struct SyncTypeFlags: OptionSet { // Courier envelopes are directed deposits between trusted peers and // must never spread via gossip sync. case .courierEnvelope: return nil + // Gateway carriers are ephemeral live traffic (uplinks are directed, + // downlinks are rate-budgeted rebroadcasts); replaying them via sync + // would waste airtime and extend their lifetime. + case .nostrCarrier: return nil } } diff --git a/bitchat/ViewModels/ChatViewModelBootstrapper.swift b/bitchat/ViewModels/ChatViewModelBootstrapper.swift index 35bc0ef4..caca90ec 100644 --- a/bitchat/ViewModels/ChatViewModelBootstrapper.swift +++ b/bitchat/ViewModels/ChatViewModelBootstrapper.swift @@ -72,6 +72,7 @@ final class ChatViewModelBootstrapper { configureNoiseCallbacks() bindTransferProgress() configureGeoChannels() + configureGateway() bindTeleportState() requestNotifications() registerObservers() @@ -244,6 +245,72 @@ private extension ChatViewModelBootstrapper { ) } + /// Wires the gateway-mode policy layer (`GatewayService`) to the mesh + /// transport, the relay manager, and the inbound Nostr pipeline. All + /// dependencies are closures so the service stays unit-testable with + /// fakes. + func configureGateway() { + // Gateway mode bridges BLE mesh <-> Nostr; a mock transport (tests) + // has no carrier packets to bridge. + guard let bleService = viewModel.meshService as? BLEService else { return } + let gateway = GatewayService.shared + + gateway.publishToRelays = { event, geohash in + let relays = GeoRelayDirectory.shared.closestRelays( + toGeohash: geohash, + count: TransportConfig.nostrGeoRelayCount + ) + // Symmetric with the local send path (GeohashSubscriptionManager + // .sendGeohash): with no known geo relay, refuse rather than + // publish to default relays no geo subscriber reads — that would + // be silent dead traffic, not delivery. + guard !relays.isEmpty else { + SecureLogger.warning("🌐 Gateway: no geo relays for #\(geohash); not publishing carried event", category: .session) + return + } + NostrRelayManager.shared.sendEvent(event, to: relays) + } + gateway.broadcastToMesh = { [weak bleService] payload in + bleService?.broadcastNostrCarrier(payload) + } + gateway.sendToGatewayPeer = { [weak bleService] payload, peer in + bleService?.sendNostrCarrier(payload, to: peer) ?? false + } + gateway.availableGatewayPeers = { [weak bleService] in + bleService?.reachableGatewayPeers() ?? [] + } + gateway.relaysConnected = { NostrRelayManager.shared.isConnected } + gateway.currentGeohash = { [weak viewModel] in viewModel?.currentGeohash } + // Carried events enter the same pipeline as relay-received events so + // blocking, rate limits, dedup, and rendering behave identically. + gateway.injectInbound = { [weak viewModel] event in + viewModel?.handleNostrEvent(event) + } + // The capability bit is advertised ONLY while the toggle is on; a + // change forces a re-announce so peers learn promptly. + gateway.onEnabledChanged = { [weak bleService] enabled in + bleService?.setLocalCapability(.gateway, enabled: enabled) + } + bleService.onNostrCarrierPacket = { payload, from, directedToUs in + GatewayService.shared.handleMeshCarrier(payload, from: from, directedToUs: directedToUs) + } + + // Uplinks deposited while relays were unreachable flush on reconnect. + NostrRelayManager.shared.$isConnected + .receive(on: DispatchQueue.main) + .sink { connected in + if connected { + GatewayService.shared.flushQueuedUplinks() + } + } + .store(in: &viewModel.cancellables) + + // Apply the persisted toggle at launch. + if gateway.isEnabled { + bleService.setLocalCapability(.gateway, enabled: true) + } + } + func bindTeleportState() { viewModel.locationManager.$teleported .receive(on: DispatchQueue.main) diff --git a/bitchat/ViewModels/GeohashSubscriptionManager.swift b/bitchat/ViewModels/GeohashSubscriptionManager.swift index 4e267c59..ce4c9448 100644 --- a/bitchat/ViewModels/GeohashSubscriptionManager.swift +++ b/bitchat/ViewModels/GeohashSubscriptionManager.swift @@ -115,6 +115,9 @@ final class GeohashSubscriptionManager { private weak var context: (any GeohashSubscriptionContext)? private let inbound: NostrInboundPipeline private let presence: GeoPresenceTracker + /// Geohashes already told "sent via mesh gateway" this session, so the + /// notice appears once per channel instead of once per message. + private var gatewayNoticeGeohashes = Set() init(context: any GeohashSubscriptionContext, inbound: NostrInboundPipeline, presence: GeoPresenceTracker) { self.context = context @@ -145,6 +148,9 @@ final class GeohashSubscriptionManager { NostrRelayManager.shared.subscribe(filter: filter, id: subID, relayUrls: subRelays) { [weak self] event in Task { @MainActor [weak self] in self?.inbound.subscribeNostrEvent(event) + // Gateway downlink: rebroadcast relay events for the viewed + // channel onto the mesh (no-op unless gateway mode is on). + GatewayService.shared.rebroadcastRelayEvent(event, geohash: channel.geohash) } } @@ -235,6 +241,9 @@ final class GeohashSubscriptionManager { NostrRelayManager.shared.subscribe(filter: filter, id: subID, relayUrls: subRelays) { [weak self] event in Task { @MainActor [weak self] in self?.inbound.handleNostrEvent(event) + // Gateway downlink: rebroadcast relay events for the viewed + // channel onto the mesh (no-op unless gateway mode is on). + GatewayService.shared.rebroadcastRelayEvent(event, geohash: channel.geohash) } } @@ -280,6 +289,23 @@ final class GeohashSubscriptionManager { NostrRelayManager.shared.sendEvent(event, to: targetRelays) } + // Mesh gateway uplink: with no working relay connection, hand the + // locally signed event to a mesh peer advertising the gateway + // capability (keys never leave this device — only the finished, + // signed event travels). Uplink is only ever attempted here, for a + // freshly composed event, never for received carrier events (loop + // rule 3 in GatewayService). + if GatewayService.shared.uplinkViaMesh(event: event, geohash: channel.geohash), + gatewayNoticeGeohashes.insert(channel.geohash).inserted { + context.addPublicSystemMessage( + String( + localized: "system.gateway.sent_via_mesh", + defaultValue: "sent via mesh gateway", + comment: "System message when a geohash message was handed to a mesh internet gateway because no relay is reachable" + ) + ) + } + context.recordGeoParticipant(pubkeyHex: identity.publicKeyHex) context.registerNostrKeyMapping(identity.publicKeyHex, for: PeerID(nostr: identity.publicKeyHex)) SecureLogger.debug( diff --git a/bitchat/Views/ContentHeaderView.swift b/bitchat/Views/ContentHeaderView.swift index 3fc2bd82..6a260b07 100644 --- a/bitchat/Views/ContentHeaderView.swift +++ b/bitchat/Views/ContentHeaderView.swift @@ -94,6 +94,19 @@ struct ContentHeaderView: View { }() HStack(spacing: 2) { + if locationChannelsModel.gatewayEnabled { + Image(systemName: "globe") + .font(.bitchatSystem(size: 12)) + .foregroundColor(palette.secondary.opacity(0.8)) + .headerTapTarget() + .accessibilityLabel( + String(localized: "content.accessibility.gateway_active", defaultValue: "Internet gateway active, sharing your connection with the mesh", comment: "Accessibility label for the internet gateway indicator") + ) + .help( + String(localized: "content.header.gateway_active", defaultValue: "Sharing your internet connection with nearby mesh peers", comment: "Tooltip for the internet gateway indicator") + ) + } + if carriedMailCount > 0 { Image(systemName: "figure.walk") .font(.bitchatSystem(size: 12)) diff --git a/bitchat/Views/LocationChannelsSheet.swift b/bitchat/Views/LocationChannelsSheet.swift index 77b45a21..0a6e077a 100644 --- a/bitchat/Views/LocationChannelsSheet.swift +++ b/bitchat/Views/LocationChannelsSheet.swift @@ -27,6 +27,8 @@ struct LocationChannelsSheet: View { static let removeAccess: LocalizedStringKey = "location_channels.action.remove_access" static let torTitle: LocalizedStringKey = "location_channels.tor.title" static let torSubtitle: LocalizedStringKey = "location_channels.tor.subtitle" + static let gatewayTitle: LocalizedStringKey = "location_channels.gateway.title" + static let gatewaySubtitle: LocalizedStringKey = "location_channels.gateway.subtitle" static let toggleOn: LocalizedStringKey = "common.toggle.on" static let toggleOff: LocalizedStringKey = "common.toggle.off" @@ -244,6 +246,8 @@ struct LocationChannelsSheet: View { sectionDivider torToggleSection .padding(.top, 12) + gatewayToggleSection + .padding(.top, 8) Button(action: SystemSettings.location.open) { Text(Strings.removeAccess) .bitchatFont(size: 12) @@ -508,6 +512,32 @@ extension LocationChannelsSheet { .cornerRadius(8) } + private var gatewayToggleBinding: Binding { + Binding( + get: { locationChannelsModel.gatewayEnabled }, + set: { locationChannelsModel.setGatewayEnabled($0) } + ) + } + + private var gatewayToggleSection: some View { + VStack(alignment: .leading, spacing: 8) { + Toggle(isOn: gatewayToggleBinding) { + VStack(alignment: .leading, spacing: 2) { + Text(Strings.gatewayTitle) + .bitchatFont(size: 12, weight: .semibold) + .foregroundColor(palette.primary) + Text(Strings.gatewaySubtitle) + .bitchatFont(size: 11) + .foregroundColor(palette.secondary) + } + } + .toggleStyle(IRCToggleStyle(accent: palette.accent, onLabel: Strings.toggleOn, offLabel: Strings.toggleOff)) + } + .padding(12) + .background(palette.secondary.opacity(0.12)) + .cornerRadius(8) + } + private var standardGreen: Color { palette.primary } private var standardBlue: Color { palette.accentBlue } } diff --git a/bitchatTests/Protocols/NostrCarrierPacketTests.swift b/bitchatTests/Protocols/NostrCarrierPacketTests.swift new file mode 100644 index 00000000..50ffb287 --- /dev/null +++ b/bitchatTests/Protocols/NostrCarrierPacketTests.swift @@ -0,0 +1,96 @@ +// +// NostrCarrierPacketTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +@testable import bitchat + +@Suite("Nostr carrier packet TLV") +struct NostrCarrierPacketTests { + private func makeEvent(geohash: String = "u4pruy", content: String = "hello mesh") throws -> NostrEvent { + let identity = try NostrIdentity.generate() + return try NostrProtocol.createEphemeralGeohashEvent( + content: content, + geohash: geohash, + senderIdentity: identity, + nickname: "tester" + ) + } + + @Test("round-trips both directions with the signed event intact") + func roundTrip() throws { + let event = try makeEvent() + for direction in [NostrCarrierPacket.Direction.toGateway, .fromGateway] { + let packet = try #require(NostrCarrierPacket(direction: direction, geohash: "u4pruy", event: event)) + let encoded = try #require(packet.encode()) + let decoded = try #require(NostrCarrierPacket.decode(encoded)) + + #expect(decoded == packet) + #expect(decoded.direction == direction) + #expect(decoded.geohash == "u4pruy") + + // The carried event survives byte-exact: same ID, and the + // signature still verifies after the mesh hop. + let carried = try #require(decoded.event()) + #expect(carried.id == event.id) + #expect(carried.sig == event.sig) + #expect(carried.isValidSignature()) + } + } + + @Test("rejects an oversized event at construction and at decode") + func oversizedRejected() throws { + let oversized = Data(repeating: 0x7B, count: NostrCarrierPacket.maxEventJSONBytes + 1) + #expect(NostrCarrierPacket(direction: .toGateway, geohash: "u4pruy", eventJSON: oversized) == nil) + + // Hand-build the TLV bytes to bypass the initializer's cap. + var data = Data([0x01, 0x00, 0x01, NostrCarrierPacket.Direction.toGateway.rawValue]) + let geohash = Data("u4pruy".utf8) + data.append(contentsOf: [0x02, 0x00, UInt8(geohash.count)]) + data.append(geohash) + data.append(contentsOf: [0x03, UInt8((oversized.count >> 8) & 0xFF), UInt8(oversized.count & 0xFF)]) + data.append(oversized) + #expect(NostrCarrierPacket.decode(data) == nil) + } + + @Test("rejects an over-length or empty geohash") + func geohashBoundsEnforced() throws { + let event = try makeEvent() + #expect(NostrCarrierPacket(direction: .toGateway, geohash: "", event: event) == nil) + #expect(NostrCarrierPacket(direction: .toGateway, geohash: String(repeating: "u", count: 13), event: event) == nil) + #expect(NostrCarrierPacket(direction: .toGateway, geohash: String(repeating: "u", count: 12), event: event) != nil) + } + + @Test("skips unknown TLVs for forward compatibility") + func unknownTLVSkipped() throws { + let event = try makeEvent() + let packet = try #require(NostrCarrierPacket(direction: .fromGateway, geohash: "u4pruy", event: event)) + var encoded = try #require(packet.encode()) + // Append an unknown TLV (type 0x7F, 2-byte value). + encoded.append(contentsOf: [0x7F, 0x00, 0x02, 0xDE, 0xAD]) + let decoded = try #require(NostrCarrierPacket.decode(encoded)) + #expect(decoded == packet) + } + + @Test("rejects truncated and missing-field payloads") + func malformedRejected() throws { + let event = try makeEvent() + let packet = try #require(NostrCarrierPacket(direction: .toGateway, geohash: "u4pruy", event: event)) + let encoded = try #require(packet.encode()) + + // Truncation anywhere inside the last TLV fails cleanly. + #expect(NostrCarrierPacket.decode(encoded.dropLast(1)) == nil) + #expect(NostrCarrierPacket.decode(encoded.prefix(4)) == nil) + #expect(NostrCarrierPacket.decode(Data()) == nil) + + // Direction TLV alone (missing geohash and event) fails. + #expect(NostrCarrierPacket.decode(Data([0x01, 0x00, 0x01, 0x01])) == nil) + // Unknown direction value fails. + #expect(NostrCarrierPacket.decode(Data([0x01, 0x00, 0x01, 0x77])) == nil) + } +} diff --git a/bitchatTests/Services/GatewayServiceTests.swift b/bitchatTests/Services/GatewayServiceTests.swift new file mode 100644 index 00000000..30dbf108 --- /dev/null +++ b/bitchatTests/Services/GatewayServiceTests.swift @@ -0,0 +1,575 @@ +// +// GatewayServiceTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +@Suite("Gateway mode policy") +@MainActor +struct GatewayServiceTests { + private static let geohash = "u4pruy" + + /// Closure-injected harness around `GatewayService` recording every + /// side effect, with a controllable clock and relay connectivity. + @MainActor + private final class Fixture { + private final class ClockBox { + var now = Date() + } + + var relaysConnected = true + var currentGeohash: String? = GatewayServiceTests.geohash + var gatewayPeers: [PeerID] = [] + var sendToGatewaySucceeds = true + + private(set) var published: [(event: NostrEvent, geohash: String)] = [] + private(set) var broadcasts: [Data] = [] + private(set) var injected: [NostrEvent] = [] + private(set) var uplinkSends: [(payload: Data, peer: PeerID)] = [] + private(set) var enabledChanges: [Bool] = [] + private(set) var scheduledDrains: [(delay: TimeInterval, work: @MainActor () -> Void)] = [] + + private let clock = ClockBox() + let defaults: UserDefaults + let service: GatewayService + + init(enabled: Bool = true, suite: String = "GatewayServiceTests-\(UUID().uuidString)") { + defaults = UserDefaults(suiteName: suite)! + defaults.removePersistentDomain(forName: suite) + let clock = clock + service = GatewayService(defaults: defaults) { clock.now } + service.publishToRelays = { [weak self] event, geohash in + self?.published.append((event, geohash)) + } + service.broadcastToMesh = { [weak self] payload in + self?.broadcasts.append(payload) + } + service.sendToGatewayPeer = { [weak self] payload, peer in + guard let self, self.sendToGatewaySucceeds else { return false } + self.uplinkSends.append((payload, peer)) + return true + } + service.availableGatewayPeers = { [weak self] in self?.gatewayPeers ?? [] } + service.relaysConnected = { [weak self] in self?.relaysConnected ?? false } + service.currentGeohash = { [weak self] in self?.currentGeohash } + service.injectInbound = { [weak self] event in self?.injected.append(event) } + service.onEnabledChanged = { [weak self] enabled in self?.enabledChanges.append(enabled) } + // Capture drain timers instead of arming a real Task so the drain + // is deterministic under the fake clock. + service.scheduleDrainTimer = { [weak self] delay, work in + self?.scheduledDrains.append((delay, work)) + } + if enabled { + service.setEnabled(true) + } + } + + func advance(_ seconds: TimeInterval) { + clock.now = clock.now.addingTimeInterval(seconds) + } + + /// Fires every currently-scheduled drain timer (simulating the window + /// freeing), as the real Task would after its delay. + func fireScheduledDrains() { + let due = scheduledDrains + scheduledDrains.removeAll() + for item in due { item.work() } + } + } + + // MARK: Event helpers + + private func makeEvent( + geohash: String = GatewayServiceTests.geohash, + content: String = "hello \(UUID().uuidString.prefix(8))" + ) throws -> NostrEvent { + let identity = try NostrIdentity.generate() + return try NostrProtocol.createEphemeralGeohashEvent( + content: content, + geohash: geohash, + senderIdentity: identity, + nickname: "tester" + ) + } + + /// A copy of `event` with tampered content but the original ID and + /// signature — what a forging gateway or mesh peer would produce. + private func forge(_ event: NostrEvent) throws -> NostrEvent { + let dict: [String: Any] = [ + "id": event.id, + "pubkey": event.pubkey, + "created_at": event.created_at, + "kind": event.kind, + "tags": event.tags, + "content": event.content + " (tampered)", + "sig": event.sig ?? "" + ] + return try NostrEvent(from: dict) + } + + private func carrierPayload( + _ event: NostrEvent, + direction: NostrCarrierPacket.Direction = .toGateway, + geohash: String = GatewayServiceTests.geohash + ) throws -> Data { + let packet = try #require(NostrCarrierPacket(direction: direction, geohash: geohash, event: event)) + return try #require(packet.encode()) + } + + private func deposit( + _ event: NostrEvent, + into fixture: Fixture, + from depositor: PeerID = PeerID(str: "1122334455667788"), + geohash: String = GatewayServiceTests.geohash + ) throws { + let payload = try carrierPayload(event, direction: .toGateway, geohash: geohash) + fixture.service.handleMeshCarrier(payload, from: depositor, directedToUs: true) + } + + // MARK: - Uplink verification gates + + @Test("publishes a verified deposit to the geo relays") + func verifiedDepositPublished() throws { + let fixture = Fixture() + let event = try makeEvent() + try deposit(event, into: fixture) + + #expect(fixture.published.count == 1) + #expect(fixture.published.first?.event.id == event.id) + #expect(fixture.published.first?.geohash == Self.geohash) + // Viewing the same geohash: the carried message shows on our own timeline. + #expect(fixture.injected.map(\.id) == [event.id]) + } + + @Test("rejects a forged signature") + func forgedSignatureRejected() throws { + let fixture = Fixture() + let forged = try forge(try makeEvent()) + try deposit(forged, into: fixture) + + #expect(fixture.published.isEmpty) + #expect(fixture.injected.isEmpty) + } + + @Test("rejects wrong kind, geohash mismatch, and stale events") + func structuralGates() throws { + let fixture = Fixture() + + // Wrong kind (kind-1 text note instead of kind-20000 ephemeral). + let identity = try NostrIdentity.generate() + let note = try NostrProtocol.createGeohashTextNote( + content: "note", + geohash: Self.geohash, + senderIdentity: identity + ) + try deposit(note, into: fixture) + #expect(fixture.published.isEmpty) + + // Carrier geohash disagreeing with the event's #g tag. + let mismatched = try makeEvent(geohash: "9q8yyk") + try deposit(mismatched, into: fixture, geohash: Self.geohash) + #expect(fixture.published.isEmpty) + + // Stale event (beyond accepted clock skew). + let stale = try makeEvent() + fixture.advance(GatewayService.Limits.maxEventAgeSeconds + 60) + try deposit(stale, into: fixture) + #expect(fixture.published.isEmpty) + } + + @Test("does nothing while the toggle is off") + func disabledGatewayIgnoresDeposits() throws { + let fixture = Fixture(enabled: false) + try deposit(try makeEvent(), into: fixture) + #expect(fixture.published.isEmpty) + #expect(fixture.service.queuedUplinks.isEmpty) + + fixture.service.rebroadcastRelayEvent(try makeEvent(), geohash: Self.geohash) + #expect(fixture.broadcasts.isEmpty) + } + + // MARK: - Uplink quotas and rate limit + + @Test("rate-limits deposits per depositor per minute") + func uplinkRateLimit() throws { + let fixture = Fixture() + let depositor = PeerID(str: "aabbccddeeff0011") + + for _ in 0.. Date: Tue, 7 Jul 2026 15:08:22 +0200 Subject: [PATCH 038/158] Add mesh diagnostics: /ping, /trace, and topology map (#1377) * Add mesh diagnostics: /ping, /trace, and topology map - New protocol types ping=0x26 / pong=0x27 (9-byte payload: 8-byte nonce + origin TTL) with per-peer inbound rate limiting (5 per 10s) - /ping @name reports RTT and hop count, 10s timeout - /trace @name prints the estimated path from gossiped directNeighbors - Topology map sheet (circular Canvas layout) reachable from App Info - Ping/pong ride the deterministic directed-relay path like DMs - Tests: payload round-trip, hop-count math, command output, edge normalization, layout Co-Authored-By: Claude Fable 5 * Fix CI media-wipe race, per-link ping rate limiting, and /ping output routing Three fixes for PR #1377 review: 1. CI flake (sendImage_privateChatProcessesAndTransfersImage): the panicClearAllData / clearCurrentPublicTimeline detached utility-priority tasks delete the real ~/Library/Application Support/files tree, which the test process shares. The wipe fires at a nondeterministic time and raced the sendImage test's JPEG in files/images/outgoing (write then re-read), so prepareImagePacket threw and the test timed out. Both wipes are now skipped under tests (existing TestEnvironment.isRunningTests pattern); this also stops test runs from deleting the developer's real media. 2. Codex P1: ping packets are unsigned, so keying the pong rate limiter on packet.senderID let one connected peer rotate forged sender IDs to bypass the 5-per-10s budget. The limiter now keys on the ingress link (the directly connected peer that delivered the packet); the pong still goes to the claimed sender. Regression test proves rotating senders over one link exhaust one budget (fails 10 vs 5 pongs on the old code). 3. Codex P2: /ping output arrived up to 10s later and was routed from selectedPrivateChatPeer at callback time, misrouting the result after a chat switch. The origin conversation is now captured when the command is issued (CommandOutputDestination) and deferred output is routed there: a DM result lands in the origin chat's history even if deselected, and a mesh-timeline result pins to #mesh instead of the active channel. Co-Authored-By: Claude Fable 5 * App Info: move NETWORK section under HOW TO USE and uppercase NETWORK/SYMBOLS headers Co-Authored-By: Claude Fable 5 * Conform DiagnosticsMockContext to sendPublicMessage CommandContextProvider gained sendPublicMessage (Cashu /pay, #1376) after this branch forked, so the diagnostics test mock no longer conformed once main was merged in. Add the no-op stub. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/AppChromeModel.swift | 22 ++ bitchat/Localizable.xcstrings | 134 +++++++- bitchat/Models/CommandInfo.swift | 12 +- .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEReceivePipeline.swift | 5 + bitchat/Services/BLE/BLEService.swift | 171 ++++++++++ bitchat/Services/CommandProcessor.swift | 96 ++++++ bitchat/Services/MeshTopologyTracker.swift | 7 + bitchat/Services/Transport.swift | 53 ++++ bitchat/Services/TransportConfig.swift | 5 + bitchat/Sync/SyncTypeFlags.swift | 3 + bitchat/ViewModels/ChatViewModel.swift | 27 ++ bitchat/Views/AppInfoView.swift | 45 +++ bitchat/Views/ContentView.swift | 2 +- bitchat/Views/MeshTopologyView.swift | 217 +++++++++++++ bitchatTests/BLEServiceCoreTests.swift | 63 ++++ bitchatTests/CommandProcessorTests.swift | 14 + bitchatTests/Mocks/MockTransport.swift | 21 ++ .../Services/MeshDiagnosticsTests.swift | 295 ++++++++++++++++++ .../BitFoundation/MeshPingPayload.swift | 57 ++++ .../Sources/BitFoundation/MessageType.swift | 6 + .../MeshPingPayloadTests.swift | 70 +++++ 22 files changed, 1320 insertions(+), 7 deletions(-) create mode 100644 bitchat/Views/MeshTopologyView.swift create mode 100644 bitchatTests/Services/MeshDiagnosticsTests.swift create mode 100644 localPackages/BitFoundation/Sources/BitFoundation/MeshPingPayload.swift create mode 100644 localPackages/BitFoundation/Tests/BitFoundationTests/MeshPingPayloadTests.swift diff --git a/bitchat/App/AppChromeModel.swift b/bitchat/App/AppChromeModel.swift index d90df814..a920c128 100644 --- a/bitchat/App/AppChromeModel.swift +++ b/bitchat/App/AppChromeModel.swift @@ -62,6 +62,28 @@ final class AppChromeModel: ObservableObject { isAppInfoPresented = true } + /// Builds the mesh topology map model from the transport's gossiped + /// graph plus the live nickname table. Unknown nodes (heard about via a + /// neighbor claim but never announced to us) fall back to a short ID. + func meshTopologyDisplayModel() -> MeshTopologyDisplayModel { + let mesh = chatViewModel.meshService + guard let snapshot = mesh.currentMeshTopology() else { return .empty } + let nicknames = mesh.getPeerNicknames() + + let nodes = snapshot.nodes.map { peerID -> MeshTopologyDisplayModel.Node in + let isSelf = peerID == snapshot.localPeerID + let label: String + if isSelf { + label = chatViewModel.nickname + } else { + label = nicknames[peerID] ?? "\(peerID.id.prefix(8))…" + } + return MeshTopologyDisplayModel.Node(id: peerID.id, label: label, isSelf: isSelf) + } + let edges = snapshot.edges.map { ($0.a.id, $0.b.id) } + return MeshTopologyDisplayModel(nodes: nodes, edges: edges) + } + func triggerScreenshotPrivacyWarning() { showScreenshotPrivacyWarning = true } diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index bed148dd..49e5487e 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -5142,7 +5142,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "symbols" + "value" : "SYMBOLS" } } } @@ -5171,6 +5171,54 @@ } } }, + "app_info.network.title" : { + "comment" : "Section header for network diagnostics in the app info sheet", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "NETWORK" + } + } + } + }, + "app_info.network.topology.description" : { + "comment" : "Row description for the mesh topology map", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "map of peers and links learned from mesh announces" + } + } + } + }, + "app_info.network.topology.hint" : { + "comment" : "Accessibility hint for the mesh topology row", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "opens the mesh topology map" + } + } + } + }, + "app_info.network.topology.title" : { + "comment" : "Row title opening the mesh topology map", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh topology" + } + } + } + }, "app_info.privacy.ephemeral.description" : { "extractionState" : "manual", "localizations" : { @@ -15449,6 +15497,18 @@ } } }, + "content.commands.ping" : { + "comment" : "Description of the /ping command in the suggestions panel", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "measure round-trip time to a mesh peer" + } + } + } + }, "content.commands.slap" : { "extractionState" : "manual", "localizations" : { @@ -15628,6 +15688,18 @@ } } }, + "content.commands.trace" : { + "comment" : "Description of the /trace command in the suggestions panel", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimate the mesh path to a peer" + } + } + } + }, "content.commands.unblock" : { "extractionState" : "manual", "localizations" : { @@ -35384,6 +35456,66 @@ } } }, + "topology.caption" : { + "comment" : "Caption under the mesh topology map", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated from gossiped neighbor lists (up to 10 per peer) — your device is highlighted" + } + } + } + }, + "topology.empty" : { + "comment" : "Empty state of the mesh topology map", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "no mesh links yet — the map fills in as peer announces arrive" + } + } + } + }, + "topology.refresh" : { + "comment" : "Accessibility label of the topology refresh button", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "refresh topology" + } + } + } + }, + "topology.summary" : { + "comment" : "Topology map summary: number of peers and links", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$ld peers · %2$ld links" + } + } + } + }, + "topology.title" : { + "comment" : "Title of the mesh topology map sheet", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh topology" + } + } + } + }, "verification.my_qr.accessibility_label" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Models/CommandInfo.swift b/bitchat/Models/CommandInfo.swift index 0ad3d554..bb0a0a65 100644 --- a/bitchat/Models/CommandInfo.swift +++ b/bitchat/Models/CommandInfo.swift @@ -25,6 +25,8 @@ enum CommandInfo: String, Identifiable { case who case favorite = "fav" case unfavorite = "unfav" + case ping + case trace var id: String { rawValue } @@ -32,7 +34,7 @@ enum CommandInfo: String, Identifiable { var placeholder: String? { switch self { - case .block, .hug, .message, .slap, .unblock, .favorite, .unfavorite: + case .block, .hug, .message, .slap, .unblock, .favorite, .unfavorite, .ping, .trace: return "<" + String(localized: "content.input.nickname_placeholder") + ">" case .pay: return "<" + String(localized: "content.input.token_placeholder") + ">" @@ -54,6 +56,8 @@ enum CommandInfo: String, Identifiable { case .who: String(localized: "content.commands.who") case .favorite: String(localized: "content.commands.favorite") case .unfavorite: String(localized: "content.commands.unfavorite") + case .ping: String(localized: "content.commands.ping") + case .trace: String(localized: "content.commands.trace") } } @@ -66,11 +70,11 @@ enum CommandInfo: String, Identifiable { if !isGeoPublic { commands.append(.pay) } - // The processor rejects favorites in geohash contexts, so only - // suggest them where they actually work: mesh. + // The processor rejects favorites and mesh diagnostics in geohash + // contexts, so only suggest them where they actually work: mesh. if isGeoPublic || isGeoDM { return commands } - return commands + [.favorite, .unfavorite] + return commands + [.favorite, .unfavorite, .ping, .trace] } } diff --git a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift index a6a8c149..10837d9b 100644 --- a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift +++ b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift @@ -12,7 +12,7 @@ enum BLEOutboundPacketPolicy { switch MessageType(rawValue: packetType) { case .noiseEncrypted, .noiseHandshake: return true - case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .boardPost, .nostrCarrier: + case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .boardPost, .ping, .pong, .nostrCarrier: return false } } diff --git a/bitchat/Services/BLE/BLEReceivePipeline.swift b/bitchat/Services/BLE/BLEReceivePipeline.swift index 691bb3e2..92e3bec8 100644 --- a/bitchat/Services/BLE/BLEReceivePipeline.swift +++ b/bitchat/Services/BLE/BLEReceivePipeline.swift @@ -51,10 +51,15 @@ struct BLEReceivePipeline { // Courier envelopes are directed opaque ciphertext like DMs; a // remote handover toward a relayed announce rides this same // deterministic relay treatment instead of the broadcast clamp. + // Ping/pong diagnostics ride it too: probes need the same + // deterministic multi-hop relay as DMs (always relay, jitter, + // no TTL cap) so RTT and hop counts reflect the real path. // Directed nostrCarrier uplinks (mesh-only peer -> gateway) need // the same multi-hop treatment to reach a non-adjacent gateway. isDirectedEncrypted: (packet.type == MessageType.noiseEncrypted.rawValue || packet.type == MessageType.courierEnvelope.rawValue + || packet.type == MessageType.ping.rawValue + || packet.type == MessageType.pong.rawValue || packet.type == MessageType.nostrCarrier.rawValue) && packet.recipientID != nil, isFragment: packet.type == MessageType.fragment.rawValue, isDirectedFragment: packet.type == MessageType.fragment.rawValue && packet.recipientID != nil, diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 3c1538d3..c7a8570a 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -80,6 +80,24 @@ final class BLEService: NSObject { // Route health for originated source routes; guarded by collectionsQueue. private var sourceRouteFailures = BLESourceRouteFailureCache() + // Mesh diagnostics: outstanding /ping probes keyed by nonce, plus the + // inbound ping budget — keyed by the ingress link (the directly connected + // peer that delivered the packet), since the unsigned claimed sender is + // spoofable — so a directed unencrypted probe cannot be turned into an + // amplification primitive. Both are owned by collectionsQueue barriers + // like the other mutable collections. + private struct PendingMeshPing { + let peerID: PeerID + let sentAt: Date + let completion: @MainActor (MeshPingResult?) -> Void + let timeout: DispatchWorkItem + } + private var pendingMeshPings: [Data: PendingMeshPing] = [:] + private var meshPingResponseLimiter = SyncResponseRateLimiter( + maxResponses: TransportConfig.meshPingInboundMaxPerLink, + window: TransportConfig.meshPingInboundWindowSeconds + ) + // 5. Fragment Reassembly (necessary for messages > MTU) private var fragmentAssemblyBuffer = BLEFragmentAssemblyBuffer() private var outboundFragmentTransfers = BLEOutboundFragmentTransferScheduler() @@ -2493,6 +2511,150 @@ extension BLEService { PeerID(routingData: data) } + // MARK: - Mesh Diagnostics (/ping, /trace, topology map) + + /// Sends a directed unencrypted ping probe (8-byte nonce + origin TTL). + /// The completion fires exactly once on the main actor: with RTT/hops + /// when the matching pong returns, or nil after the timeout window. + func sendMeshPing(to peerID: PeerID, completion: @escaping @MainActor (MeshPingResult?) -> Void) { + messageQueue.async { [weak self] in + guard let self, + let recipientData = peerID.toShort().routingData, + let payload = MeshPingPayload( + nonce: Data((0.. PendingMeshPing? in + guard pendingMeshPings[pong.nonce]?.peerID == peerID else { return nil } + return pendingMeshPings.removeValue(forKey: pong.nonce) + } + guard let pending else { return } + pending.timeout.cancel() + let rttMs = Int((Date().timeIntervalSince(pending.sentAt) * 1000).rounded()) + let result = MeshPingResult( + rttMs: max(0, rttMs), + hops: MeshPingPayload.hopCount(originTTL: pong.originTTL, receivedTTL: packet.ttl) + ) + Task { @MainActor in pending.completion(result) } + } + + /// Estimated intermediate hops toward `peerID`, BFS over gossiped + /// bidirectionally-confirmed neighbor claims ([] = direct, nil = none). + func computeMeshPath(to peerID: PeerID) -> [PeerID]? { + refreshLocalTopology() + if let route = computeRoute(to: peerID) { + return route.compactMap { PeerID(routingData: $0) } + } + // Confirmed claims can lag a brand-new link (the peer's next announce + // hasn't arrived yet); a live direct connection is still a known path. + return isPeerConnected(peerID) ? [] : nil + } + + /// Mesh graph for the topology map. Edges are advisory: announces cap + /// neighbor lists at 10, so an edge claimed by either endpoint counts. + func currentMeshTopology() -> MeshTopologySnapshot? { + refreshLocalTopology() + let claims = meshTopology.adjacencySnapshot() + var nodes = Set() + var edges = Set() + for (source, neighbors) in claims { + guard let sourcePeer = PeerID(routingData: source) else { continue } + nodes.insert(sourcePeer) + for neighborData in neighbors { + guard let neighborPeer = PeerID(routingData: neighborData), + neighborPeer != sourcePeer else { continue } + nodes.insert(neighborPeer) + edges.insert(MeshTopologyEdge(sourcePeer, neighborPeer)) + } + } + nodes.insert(myPeerID) + return MeshTopologySnapshot( + localPeerID: myPeerID, + nodes: nodes.sorted(), + edges: edges.sorted { ($0.a, $0.b) < ($1.a, $1.b) } + ) + } + private func forwardAlongRouteIfNeeded(_ packet: BitchatPacket) -> Bool { let myRoutingData = routingData(for: myPeerID) ?? (myPeerIDData.isEmpty ? nil : myPeerIDData) let plan = BLERouteForwardingPolicy.plan( @@ -3381,6 +3543,15 @@ extension BLEService { case .nostrCarrier: handleNostrCarrier(packet, from: peerID) + case .ping: + // Rate limiting must key on the ingress link (`peerID`), not the + // packet-claimed sender: pings are unsigned, so `senderID` is + // attacker-controlled and rotating it would reset the budget. + handleMeshPing(packet, fromLink: peerID) + + case .pong: + handleMeshPong(packet, from: senderID) + case .leave: handleLeave(packet, from: senderID) diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index 220e66ef..9555609a 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -22,6 +22,17 @@ struct CommandGeoParticipant { let displayName: String } +/// The conversation a command was typed into, captured when the command is +/// issued so deferred output (e.g. an async /ping result, which can arrive +/// many seconds later) lands there even if the user switches chats first. +enum CommandOutputDestination: Equatable { + /// The #mesh public timeline. Commands that defer output (/ping) are + /// mesh-only, so a non-DM origin is always the mesh timeline. + case meshTimeline + /// The private chat that was open when the command was typed. + case privateChat(PeerID) +} + /// Protocol defining what CommandProcessor needs from its context. /// This breaks the circular dependency between CommandProcessor and ChatViewModel. @MainActor @@ -51,6 +62,13 @@ protocol CommandContextProvider: AnyObject { // MARK: - System Messages func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) func addPublicSystemMessage(_ content: String) + /// The conversation the user is typing into right now. Commands that + /// finish asynchronously capture this BEFORE starting async work, so a + /// chat switch cannot misroute their deferred output. + func currentCommandDestination() -> CommandOutputDestination + /// Routes deferred command output (e.g. an async /ping result) into the + /// conversation captured when the command was issued. + func addCommandOutput(_ content: String, to destination: CommandOutputDestination) // MARK: - Favorites /// Toggles the favorite via the unified peer flow, which persists by the @@ -108,6 +126,12 @@ final class CommandProcessor { case "/unfav": if inGeoPublic || inGeoDM { return .error(message: "favorites are only for mesh peers in #mesh") } return handleFavorite(args, add: false) + case "/ping": + if inGeoPublic || inGeoDM { return .error(message: "ping only works for mesh peers in #mesh") } + return handlePing(args) + case "/trace": + if inGeoPublic || inGeoDM { return .error(message: "trace only works for mesh peers in #mesh") } + return handleTrace(args) case "/pay": return handlePay(args) case "/help": @@ -129,6 +153,8 @@ final class CommandProcessor { /slap @name — slap with a large trout /block @name · /unblock @name /fav @name · /unfav @name — favorites (mesh only) + /ping @name — measure round-trip time (mesh only) + /trace @name — estimated mesh path (mesh only) /pay — send a cashu ecash token in this chat /help — this list """ @@ -336,6 +362,76 @@ final class CommandProcessor { return .error(message: "cannot unblock \(nickname): not found") } + // MARK: - Mesh Diagnostics + + private enum MeshPeerResolution { + case resolved(peerID: PeerID, nickname: String) + case failed(CommandResult) + } + + /// Resolves a mesh peer for /ping and /trace. Geohash identities are + /// rejected — diagnostics measure the BLE mesh, not Nostr. + private func resolveMeshPeer(_ args: String, command: String) -> MeshPeerResolution { + let targetName = args.trimmed + guard !targetName.isEmpty else { + return .failed(.error(message: "usage: /\(command) ")) + } + let nickname = targetName.hasPrefix("@") ? String(targetName.dropFirst()) : targetName + guard let peerID = contextProvider?.getPeerIDForNickname(nickname), + !peerID.isGeoDM, !peerID.isGeoChat else { + return .failed(.error(message: "cannot \(command) \(nickname): not found on mesh")) + } + return .resolved(peerID: peerID, nickname: nickname) + } + + private func handlePing(_ args: String) -> CommandResult { + let target: (peerID: PeerID, nickname: String) + switch resolveMeshPeer(args, command: "ping") { + case .resolved(let peerID, let nickname): target = (peerID, nickname) + case .failed(let result): return result + } + + let nickname = target.nickname + let currentProvider = contextProvider + // Capture the origin conversation now: the pong can arrive up to + // meshPingTimeoutSeconds later, and reading the selected chat at + // callback time would misroute the result after a chat switch. + let destination = contextProvider?.currentCommandDestination() ?? .meshTimeline + meshService?.sendMeshPing(to: target.peerID) { [weak currentProvider] result in + let provider = currentProvider + guard let result else { + provider?.addCommandOutput("no reply from \(nickname)", to: destination) + return + } + let hopText: String = result.hops.map { hops in + hops == 1 ? " · direct (1 hop)" : " · \(hops) hops" + } ?? "" + provider?.addCommandOutput("pong from \(nickname): \(result.rttMs) ms\(hopText)", to: destination) + } + return .success(message: "pinging \(nickname)…") + } + + private func handleTrace(_ args: String) -> CommandResult { + let target: (peerID: PeerID, nickname: String) + switch resolveMeshPeer(args, command: "trace") { + case .resolved(let peerID, let nickname): target = (peerID, nickname) + case .failed(let result): return result + } + + guard let mesh = meshService, + let intermediates = mesh.computeMeshPath(to: target.peerID) else { + return .success(message: "no known path to \(target.nickname)") + } + // Graph-derived from gossiped neighbor claims, not route-recorded — + // present it as an estimate. + let hopNames = intermediates.map { hop in + mesh.peerNickname(peerID: hop) ?? "\(hop.id.prefix(8))…" + } + let chain = (["you"] + hopNames + [target.nickname]).joined(separator: " → ") + let hops = intermediates.count + 1 + return .success(message: "estimated path: \(chain) (\(hops) hop\(hops == 1 ? "" : "s"))") + } + /// `/pay ` — validates the token decodes, then sends it as /// the message body in the current chat. Cashu tokens are bearer /// instruments (whoever redeems first gets the funds), so posting one to diff --git a/bitchat/Services/MeshTopologyTracker.swift b/bitchat/Services/MeshTopologyTracker.swift index eb4e0c3c..5596b5b1 100644 --- a/bitchat/Services/MeshTopologyTracker.swift +++ b/bitchat/Services/MeshTopologyTracker.swift @@ -49,6 +49,13 @@ final class MeshTopologyTracker { } } + /// Raw directed neighbor claims, for diagnostics (topology map, /trace). + /// Callers treat the claims as advisory: announces cap `directNeighbors` + /// at 10, so an edge may be claimed by only one of its endpoints. + func adjacencySnapshot() -> [Data: Set] { + queue.sync { claims } + } + func removePeer(_ data: Data?) { guard let peer = sanitize(data) else { return } queue.sync(flags: .barrier) { diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 00a17a87..45aed91e 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -31,6 +31,40 @@ struct TransportPeerSnapshot: Equatable, Hashable { } } +/// Outcome of a `/ping` probe over the mesh. +struct MeshPingResult: Equatable { + /// Round-trip time in milliseconds. + let rttMs: Int + /// Total hops to the peer (1 = directly connected), derived from the + /// pong's TTL decrements; nil when the reply carried inconsistent TTLs. + let hops: Int? +} + +/// Undirected mesh link between two peers, normalized so `(a, b)` and +/// `(b, a)` collapse to one edge. +struct MeshTopologyEdge: Hashable { + let a: PeerID + let b: PeerID + + init(_ first: PeerID, _ second: PeerID) { + if first < second { + a = first + b = second + } else { + a = second + b = first + } + } +} + +/// Point-in-time view of the mesh graph learned from gossiped announces +/// (each announce carries up to 10 `directNeighbors`). +struct MeshTopologySnapshot: Equatable { + let localPeerID: PeerID + let nodes: [PeerID] + let edges: [MeshTopologyEdge] +} + enum TransportEvent: @unchecked Sendable { case messageReceived(BitchatMessage) case publicMessageReceived(peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) @@ -128,6 +162,17 @@ protocol Transport: AnyObject { // payload (post or tombstone) so it spreads over relay and gossip sync. func sendBoardPayload(_ payload: Data) + // Mesh diagnostics (optional for transports). Defaults are inert so + // queue-backed transports (e.g. NostrTransport) stay untouched. + /// Sends a directed ping probe; the completion fires exactly once on the + /// main actor with the measured result, or nil on timeout/unsupported. + func sendMeshPing(to peerID: PeerID, completion: @escaping @MainActor (MeshPingResult?) -> Void) + /// Estimated intermediate hops toward `peerID` from gossiped topology + /// ([] = direct link, nil = no known path). + func computeMeshPath(to peerID: PeerID) -> [PeerID]? + /// Current mesh graph for the topology map; nil when unsupported. + func currentMeshTopology() -> MeshTopologySnapshot? + // QR verification (optional for transports) func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) @@ -174,6 +219,14 @@ extension Transport { func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) {} func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { false } func sendBoardPayload(_ payload: Data) {} + + // Mesh diagnostics are mesh-transport-only; other transports report + // "no reply"/"no path" rather than pretending to measure anything. + func sendMeshPing(to peerID: PeerID, completion: @escaping @MainActor (MeshPingResult?) -> Void) { + Task { @MainActor in completion(nil) } + } + func computeMeshPath(to peerID: PeerID) -> [PeerID]? { nil } + func currentMeshTopology() -> MeshTopologySnapshot? { nil } func sendFileBroadcast(_ packet: BitchatFilePacket, transferId: String) {} func sendFilePrivate(_ packet: BitchatFilePacket, to peerID: PeerID, transferId: String) {} func cancelTransfer(_ transferId: String) {} diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 649a8be9..31659710 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -16,6 +16,11 @@ enum TransportConfig { static let bleFragmentRelayTtlCap: UInt8 = 7 static let bleFragmentRelayTtlCapDense: UInt8 = 5 // Contain fragment floods in dense graphs + // Mesh diagnostics (/ping) + static let meshPingTimeoutSeconds: TimeInterval = 10 // Give up on a probe after this window + static let meshPingInboundMaxPerLink: Int = 5 // Inbound ping budget per ingress link (claimed sender is spoofable)... + static let meshPingInboundWindowSeconds: TimeInterval = 10 // ...per sliding window (anti-amplification) + // UI / Storage Caps static let privateChatCap: Int = 1337 static let meshTimelineCap: Int = 1337 diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index eb082c31..3f455497 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -40,6 +40,9 @@ struct SyncTypeFlags: OptionSet { // Courier envelopes are directed deposits between trusted peers and // must never spread via gossip sync. case .courierEnvelope: return nil + // Ping/pong are ephemeral directed probes; replaying them via gossip + // sync would only produce stale, unanswerable echoes. + case .ping, .pong: return nil // Gateway carriers are ephemeral live traffic (uplinks are directed, // downlinks are rate-budgeted rebroadcasts); replaying them via sync // would waste airtime and extend their lifetime. diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index a6606549..62b49da5 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1547,6 +1547,33 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele } } + /// Origin conversation for deferred command output, captured when the + /// command is issued (before any async work starts). + @MainActor + func currentCommandDestination() -> CommandOutputDestination { + if let peerID = selectedPrivateChatPeer { + return .privateChat(peerID) + } + // Deferring commands (/ping) are rejected in geohash channels, so a + // non-DM origin is always the #mesh timeline. + return .meshTimeline + } + + /// Routes deferred command output (async /ping results) into the + /// conversation captured at issue time, immune to chat switches in the + /// meantime. A DM result lands in the origin chat's history even if that + /// chat is no longer selected (or was cleared — it then reappears as the + /// first message when the chat is reopened). + @MainActor + func addCommandOutput(_ content: String, to destination: CommandOutputDestination) { + switch destination { + case .privateChat(let peerID): + addLocalPrivateSystemMessage(content, to: peerID) + case .meshTimeline: + publicConversationCoordinator.addMeshOnlySystemMessage(content) + } + } + // MARK: - Message Reception @MainActor diff --git a/bitchat/Views/AppInfoView.swift b/bitchat/Views/AppInfoView.swift index 152c09df..3f74a354 100644 --- a/bitchat/Views/AppInfoView.swift +++ b/bitchat/Views/AppInfoView.swift @@ -5,6 +5,11 @@ struct AppInfoView: View { @ThemedPalette private var palette @AppStorage(AppTheme.storageKey) private var appThemeRawValue = AppTheme.matrix.rawValue + /// Supplies the mesh topology map data. Nil (previews, missing wiring) + /// hides the topology row entirely. + var topologyProvider: (@MainActor () -> MeshTopologyDisplayModel)? + @State private var showTopology = false + private var selectedTheme: AppTheme { AppTheme(rawValue: appThemeRawValue) ?? .matrix } @@ -75,6 +80,15 @@ struct AppInfoView: View { ] } + enum Network { + static let title: LocalizedStringKey = "app_info.network.title" + static let topology = AppInfoFeatureInfo( + icon: "point.3.connected.trianglepath.dotted", + title: "app_info.network.topology.title", + description: "app_info.network.topology.description" + ) + } + enum Privacy { static let title: LocalizedStringKey = "app_info.privacy.title" static let noTracking = AppInfoFeatureInfo( @@ -129,6 +143,11 @@ struct AppInfoView: View { .themedSheetBackground() } .frame(width: 600, height: 700) + .sheet(isPresented: $showTopology) { + if let topologyProvider { + MeshTopologyView(provider: topologyProvider) + } + } #else NavigationView { ScrollView { @@ -143,6 +162,11 @@ struct AppInfoView: View { } } } + .sheet(isPresented: $showTopology) { + if let topologyProvider { + MeshTopologyView(provider: topologyProvider) + } + } #endif } @@ -199,6 +223,27 @@ struct AppInfoView: View { .foregroundColor(textColor) } + // Network diagnostics + if topologyProvider != nil { + VStack(alignment: .leading, spacing: 16) { + SectionHeader(Strings.Network.title) + + Button { + showTopology = true + } label: { + HStack(spacing: 0) { + FeatureRow(info: Strings.Network.topology) + Image(systemName: "chevron.right") + .font(.bitchatSystem(size: 12)) + .foregroundColor(secondaryTextColor) + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityHint(Text("app_info.network.topology.hint")) + } + } + // Features VStack(alignment: .leading, spacing: 16) { SectionHeader(Strings.Features.title) diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index 86bb31ad..bd434ad1 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -149,7 +149,7 @@ struct ContentView: View { #endif } .sheet(isPresented: $appChromeModel.isAppInfoPresented) { - AppInfoView() + AppInfoView(topologyProvider: { appChromeModel.meshTopologyDisplayModel() }) } .sheet(isPresented: Binding( get: { appChromeModel.showingFingerprintFor != nil && !showSidebar && selectedPrivatePeerID == nil }, diff --git a/bitchat/Views/MeshTopologyView.swift b/bitchat/Views/MeshTopologyView.swift new file mode 100644 index 00000000..a8bc4e3e --- /dev/null +++ b/bitchat/Views/MeshTopologyView.swift @@ -0,0 +1,217 @@ +// +// MeshTopologyView.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import SwiftUI + +/// Display model for the mesh topology map: nodes are known mesh peers, +/// edges are gossiped `directNeighbors` claims. Built on the main actor from +/// a `MeshTopologySnapshot` plus the current nickname table. +struct MeshTopologyDisplayModel { + struct Node: Identifiable, Equatable { + let id: String + let label: String + let isSelf: Bool + } + + let nodes: [Node] + /// Pairs of `Node.id`; every id is present in `nodes`. + let edges: [(String, String)] + + static let empty = MeshTopologyDisplayModel(nodes: [], edges: []) +} + +/// Minimal diagnostics sheet: the mesh graph on a circular layout (self in +/// the center), drawn with Canvas so it stays cheap at any peer count. +struct MeshTopologyView: View { + @Environment(\.dismiss) private var dismiss + @Environment(\.appTheme) private var appTheme + @ThemedPalette private var palette + + /// Fetches a fresh model; called on appear and on manual refresh. + let provider: @MainActor () -> MeshTopologyDisplayModel + @State private var model: MeshTopologyDisplayModel = .empty + + var body: some View { + #if os(macOS) + VStack(spacing: 0) { + HStack { + Text("topology.title") + .bitchatFont(size: 16, weight: .bold) + .foregroundColor(palette.primary) + Spacer() + refreshButton + Button("app_info.done") { + dismiss() + } + .buttonStyle(.plain) + .foregroundColor(palette.primary) + } + .padding() + .themedSurface(opacity: 0.95) + + content + } + .frame(width: 500, height: 520) + .themedSheetBackground() + #else + NavigationView { + content + .themedSheetBackground() + .navigationTitle(Text("topology.title")) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + refreshButton + } + ToolbarItem(placement: .navigationBarTrailing) { + SheetCloseButton { dismiss() } + .foregroundColor(palette.primary) + } + } + } + #endif + } + + private var refreshButton: some View { + Button { + model = provider() + } label: { + Image(systemName: "arrow.clockwise") + .font(.bitchatSystem(size: 14)) + .foregroundColor(palette.primary) + } + .buttonStyle(.plain) + .accessibilityLabel(Text("topology.refresh")) + } + + @ViewBuilder + private var content: some View { + VStack(spacing: 12) { + if model.nodes.count <= 1 { + Spacer() + Text("topology.empty") + .bitchatFont(size: 14) + .foregroundColor(palette.secondary) + .multilineTextAlignment(.center) + .padding(.horizontal, 32) + Spacer() + } else { + graphCanvas + .padding(.horizontal, 8) + } + + VStack(spacing: 4) { + Text(summaryText) + .bitchatFont(size: 13, weight: .semibold) + .foregroundColor(palette.primary) + Text("topology.caption") + .bitchatFont(size: 11) + .foregroundColor(palette.secondary) + .multilineTextAlignment(.center) + } + .padding(.horizontal) + .padding(.bottom, 16) + } + .onAppear { model = provider() } + .accessibilityElement(children: .combine) + .accessibilityLabel(Text(summaryText)) + } + + private var summaryText: String { + String( + format: String( + localized: "topology.summary", + comment: "Topology map summary: number of peers and links" + ), + locale: .current, + model.nodes.count, + model.edges.count + ) + } + + private var graphCanvas: some View { + Canvas { context, size in + let positions = Self.layout(nodes: model.nodes, in: size) + let fontDesign = appTheme.bodyFontDesign + + // Edges first so nodes draw on top. + for (fromID, toID) in model.edges { + guard let from = positions[fromID], let to = positions[toID] else { continue } + var path = Path() + path.move(to: from) + path.addLine(to: to) + context.stroke(path, with: .color(palette.secondary.opacity(0.45)), lineWidth: 1) + } + + for node in model.nodes { + guard let center = positions[node.id] else { continue } + let radius: CGFloat = node.isSelf ? 7 : 5 + let dot = Path(ellipseIn: CGRect( + x: center.x - radius, + y: center.y - radius, + width: radius * 2, + height: radius * 2 + )) + context.fill(dot, with: .color(node.isSelf ? palette.accent : palette.primary)) + if node.isSelf { + let ring = Path(ellipseIn: CGRect( + x: center.x - radius - 3, + y: center.y - radius - 3, + width: (radius + 3) * 2, + height: (radius + 3) * 2 + )) + context.stroke(ring, with: .color(palette.accent.opacity(0.6)), lineWidth: 1) + } + context.draw( + Text(node.label) + .font(.system(size: 10, design: fontDesign)) + .foregroundColor(node.isSelf ? palette.accent : palette.secondary), + at: CGPoint(x: center.x, y: center.y + radius + 4), + anchor: .top + ) + } + } + .accessibilityHidden(true) // The combined summary label narrates the graph. + } + + /// Circular layout: self in the center, everyone else evenly spaced on a + /// ring. Deterministic (nodes arrive sorted), so refreshes don't shuffle. + static func layout(nodes: [MeshTopologyDisplayModel.Node], in size: CGSize) -> [String: CGPoint] { + let center = CGPoint(x: size.width / 2, y: size.height / 2) + // Leave room for the label row under each ring node. + let radius = max(20, min(size.width, size.height) / 2 - 36) + var positions: [String: CGPoint] = [:] + + let ringNodes = nodes.filter { !$0.isSelf } + for node in nodes where node.isSelf { + positions[node.id] = center + } + for (index, node) in ringNodes.enumerated() { + let angle = (2 * CGFloat.pi * CGFloat(index)) / CGFloat(max(1, ringNodes.count)) - CGFloat.pi / 2 + positions[node.id] = CGPoint( + x: center.x + radius * cos(angle), + y: center.y + radius * sin(angle) + ) + } + return positions + } +} + +#Preview("Topology") { + MeshTopologyView(provider: { + MeshTopologyDisplayModel( + nodes: [ + .init(id: "self", label: "me", isSelf: true), + .init(id: "a", label: "alice", isSelf: false), + .init(id: "b", label: "bob", isSelf: false), + .init(id: "c", label: "carol", isSelf: false) + ], + edges: [("self", "a"), ("a", "b"), ("self", "c")] + ) + }) +} diff --git a/bitchatTests/BLEServiceCoreTests.swift b/bitchatTests/BLEServiceCoreTests.swift index fe7624ec..6a9cdfc1 100644 --- a/bitchatTests/BLEServiceCoreTests.swift +++ b/bitchatTests/BLEServiceCoreTests.swift @@ -216,6 +216,69 @@ struct BLEServiceCoreTests { cachedServiceUUIDs: [BLEService.serviceUUID, otherService] )) } + + /// Pings are unsigned, so their claimed sender is attacker-controlled. + /// The pong budget must be keyed on the ingress link (the directly + /// connected peer that delivered the packet): rotating forged sender IDs + /// over one link exhausts one budget instead of resetting it, so a single + /// malicious link cannot turn /ping into an amplification primitive. + @Test + func meshPingResponseBudget_isPerIngressLinkNotClaimedSender() async throws { + let ble = makeService() + let outbound = OutboundPacketTap() + ble._test_onOutboundPacket = outbound.record + + let link = PeerID(str: "1122334455667788") + let budget = TransportConfig.meshPingInboundMaxPerLink + let myRecipientData = try #require(Data(hexString: ble.myPeerID.id)) + + for i in 0..<(budget * 2) { + // A fresh forged sender for every ping, all arriving on one link. + let forgedSender = PeerID(str: String(format: "%016x", 0xA0_0000 + i)) + var nonce = Data(repeating: 0, count: MeshPingPayload.nonceLength) + nonce[0] = UInt8(i) + let payload = try #require(MeshPingPayload(nonce: nonce, originTTL: 7)) + let packet = BitchatPacket( + type: MessageType.ping.rawValue, + senderID: Data(hexString: forgedSender.id) ?? Data(), + recipientID: myRecipientData, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload.encode(), + signature: nil, + ttl: 7 + ) + ble._test_handlePacket(packet, fromPeerID: link, preseedPeer: false) + } + + let reachedBudget = await TestHelpers.waitUntil( + { outbound.count(ofType: .pong) >= budget }, + timeout: TestConstants.defaultTimeout + ) + #expect(reachedBudget) + // Give any over-budget pong a chance to surface, then confirm the + // rotated sender IDs never bought a sixth response. + let exceededBudget = await TestHelpers.waitUntil( + { outbound.count(ofType: .pong) > budget }, + timeout: TestConstants.shortTimeout + ) + #expect(!exceededBudget) + #expect(outbound.count(ofType: .pong) == budget) + } +} + +/// Thread-safe capture of packets leaving the service under test. +private final class OutboundPacketTap { + private let lock = NSLock() + private var packets: [BitchatPacket] = [] + + func record(_ packet: BitchatPacket) { + lock.lock(); packets.append(packet); lock.unlock() + } + + func count(ofType type: MessageType) -> Int { + lock.lock(); defer { lock.unlock() } + return packets.filter { $0.type == type.rawValue }.count + } } private func makeService() -> BLEService { diff --git a/bitchatTests/CommandProcessorTests.swift b/bitchatTests/CommandProcessorTests.swift index 1937174e..718df1c8 100644 --- a/bitchatTests/CommandProcessorTests.swift +++ b/bitchatTests/CommandProcessorTests.swift @@ -602,6 +602,8 @@ private final class MockCommandContextProvider: CommandContextProvider { private(set) var sentPublicRawMessages: [String] = [] private(set) var localPrivateSystemMessages: [(content: String, peerID: PeerID)] = [] private(set) var publicSystemMessages: [String] = [] + private(set) var commandOutputs: [String] = [] + private(set) var commandOutputDestinations: [CommandOutputDestination] = [] private(set) var toggledFavorites: [PeerID] = [] private(set) var favoriteNotifications: [(peerID: PeerID, isFavorite: Bool)] = [] @@ -657,6 +659,18 @@ private final class MockCommandContextProvider: CommandContextProvider { publicSystemMessages.append(content) } + func currentCommandDestination() -> CommandOutputDestination { + if let peerID = selectedPrivateChatPeer { + return .privateChat(peerID) + } + return .meshTimeline + } + + func addCommandOutput(_ content: String, to destination: CommandOutputDestination) { + commandOutputs.append(content) + commandOutputDestinations.append(destination) + } + func toggleFavorite(peerID: PeerID) { toggledFavorites.append(peerID) } diff --git a/bitchatTests/Mocks/MockTransport.swift b/bitchatTests/Mocks/MockTransport.swift index e4cf08de..5f1243e8 100644 --- a/bitchatTests/Mocks/MockTransport.swift +++ b/bitchatTests/Mocks/MockTransport.swift @@ -196,6 +196,27 @@ final class MockTransport: Transport { return courierSendResult } + // MARK: - Mesh Diagnostics + + private(set) var sentMeshPings: [PeerID] = [] + var meshPingResult: MeshPingResult? + var meshPaths: [PeerID: [PeerID]] = [:] + var meshTopologySnapshot: MeshTopologySnapshot? + + func sendMeshPing(to peerID: PeerID, completion: @escaping @MainActor (MeshPingResult?) -> Void) { + sentMeshPings.append(peerID) + let result = meshPingResult + Task { @MainActor in completion(result) } + } + + func computeMeshPath(to peerID: PeerID) -> [PeerID]? { + meshPaths[peerID] + } + + func currentMeshTopology() -> MeshTopologySnapshot? { + meshTopologySnapshot + } + // MARK: - Test Helpers /// Clears all recorded method calls for fresh assertions diff --git a/bitchatTests/Services/MeshDiagnosticsTests.swift b/bitchatTests/Services/MeshDiagnosticsTests.swift new file mode 100644 index 00000000..ced8a92e --- /dev/null +++ b/bitchatTests/Services/MeshDiagnosticsTests.swift @@ -0,0 +1,295 @@ +// +// MeshDiagnosticsTests.swift +// bitchatTests +// +// Tests for /ping and /trace command handling and the topology snapshot +// types backing the mesh topology map. +// This is free and unencumbered software released into the public domain. +// + +import Foundation +import Testing +import BitFoundation +@testable import bitchat + +@Suite(.serialized) +struct MeshDiagnosticsTests { + + // MARK: - Helpers + + @MainActor + private func makeProcessor( + context: DiagnosticsMockContext, + transport: MockTransport + ) -> CommandProcessor { + CommandProcessor( + contextProvider: context, + meshService: transport, + identityManager: MockIdentityManager(MockKeychain()) + ) + } + + /// Waits for the async ping completion (MainActor hop) to land. + @MainActor + private func waitForCommandOutput(_ context: DiagnosticsMockContext) async { + for _ in 0..<100 { + if !context.commandOutputs.isEmpty { return } + await Task.yield() + try? await Task.sleep(nanoseconds: 5_000_000) + } + } + + // MARK: - /ping + + @MainActor + @Test func pingWithoutArgumentShowsUsage() { + let context = DiagnosticsMockContext() + let processor = makeProcessor(context: context, transport: MockTransport()) + let result = processor.process("/ping") + switch result { + case .error(let message): + #expect(message == "usage: /ping ") + default: + Issue.record("Expected usage error") + } + } + + @MainActor + @Test func pingUnknownPeerFails() { + let context = DiagnosticsMockContext() + let processor = makeProcessor(context: context, transport: MockTransport()) + let result = processor.process("/ping @ghost") + switch result { + case .error(let message): + #expect(message == "cannot ping ghost: not found on mesh") + default: + Issue.record("Expected error result") + } + } + + @MainActor + @Test func pingGeoDMPeerIsRejected() { + let context = DiagnosticsMockContext() + context.nicknameToPeerID["alice"] = PeerID(nostr_: "aabbccddeeff00112233445566778899") + let processor = makeProcessor(context: context, transport: MockTransport()) + let result = processor.process("/ping @alice") + switch result { + case .error(let message): + #expect(message == "cannot ping alice: not found on mesh") + default: + Issue.record("Expected error for geo peer") + } + } + + @MainActor + @Test func pingSuccessReportsRttAndHops() async { + let context = DiagnosticsMockContext() + let peerID = PeerID(str: "abcd1234abcd1234") + context.nicknameToPeerID["alice"] = peerID + let transport = MockTransport() + transport.meshPingResult = MeshPingResult(rttMs: 42, hops: 2) + let processor = makeProcessor(context: context, transport: transport) + + let result = processor.process("/ping @alice") + switch result { + case .success(let message): + #expect(message == "pinging alice…") + default: + Issue.record("Expected immediate 'pinging' feedback") + } + #expect(transport.sentMeshPings == [peerID]) + + await waitForCommandOutput(context) + #expect(context.commandOutputs == ["pong from alice: 42 ms · 2 hops"]) + } + + @MainActor + @Test func pingDirectPeerReportsSingleHop() async { + let context = DiagnosticsMockContext() + context.nicknameToPeerID["alice"] = PeerID(str: "abcd1234abcd1234") + let transport = MockTransport() + transport.meshPingResult = MeshPingResult(rttMs: 8, hops: 1) + let processor = makeProcessor(context: context, transport: transport) + + _ = processor.process("/ping alice") + await waitForCommandOutput(context) + #expect(context.commandOutputs == ["pong from alice: 8 ms · direct (1 hop)"]) + } + + @MainActor + @Test func pingTimeoutReportsNoReply() async { + let context = DiagnosticsMockContext() + context.nicknameToPeerID["alice"] = PeerID(str: "abcd1234abcd1234") + let transport = MockTransport() + transport.meshPingResult = nil + let processor = makeProcessor(context: context, transport: transport) + + _ = processor.process("/ping @alice") + await waitForCommandOutput(context) + #expect(context.commandOutputs == ["no reply from alice"]) + } + + @MainActor + @Test func pingOutputRoutesToConversationWhereCommandWasIssued() async { + let context = DiagnosticsMockContext() + let alice = PeerID(str: "abcd1234abcd1234") + let bob = PeerID(str: "b0b0b0b0b0b0b0b0") + context.nicknameToPeerID["alice"] = alice + let transport = MockTransport() + transport.meshPingResult = MeshPingResult(rttMs: 42, hops: 2) + let processor = makeProcessor(context: context, transport: transport) + + // Issue the ping from bob's DM, then switch chats before the async + // result lands. The output must follow the origin conversation, not + // whatever is selected at callback time. + context.selectedPrivateChatPeer = bob + _ = processor.process("/ping @alice") + context.selectedPrivateChatPeer = nil + + await waitForCommandOutput(context) + #expect(context.commandOutputDestinations == [.privateChat(bob)]) + } + + @MainActor + @Test func pingIssuedFromPublicTimelineRoutesToMeshTimeline() async { + let context = DiagnosticsMockContext() + let alice = PeerID(str: "abcd1234abcd1234") + context.nicknameToPeerID["alice"] = alice + let transport = MockTransport() + transport.meshPingResult = MeshPingResult(rttMs: 7, hops: 1) + let processor = makeProcessor(context: context, transport: transport) + + _ = processor.process("/ping @alice") + // Opening a DM afterwards must not swallow the public-timeline result. + context.selectedPrivateChatPeer = alice + + await waitForCommandOutput(context) + #expect(context.commandOutputDestinations == [.meshTimeline]) + } + + // MARK: - /trace + + @MainActor + @Test func traceDirectPeerShowsOneHop() { + let context = DiagnosticsMockContext() + let bob = PeerID(str: "b0b0b0b0b0b0b0b0") + context.nicknameToPeerID["bob"] = bob + let transport = MockTransport() + transport.meshPaths[bob] = [] + let processor = makeProcessor(context: context, transport: transport) + + let result = processor.process("/trace @bob") + switch result { + case .success(let message): + #expect(message == "estimated path: you → bob (1 hop)") + default: + Issue.record("Expected success result") + } + } + + @MainActor + @Test func traceMultiHopUsesNicknamesWithShortIDFallback() { + let context = DiagnosticsMockContext() + let bob = PeerID(str: "b0b0b0b0b0b0b0b0") + let alice = PeerID(str: "a11cea11cea11cea") + let unknown = PeerID(str: "dead00beef001234") + context.nicknameToPeerID["bob"] = bob + let transport = MockTransport() + transport.peerNicknames = [alice: "alice"] + transport.meshPaths[bob] = [alice, unknown] + let processor = makeProcessor(context: context, transport: transport) + + let result = processor.process("/trace bob") + switch result { + case .success(let message): + #expect(message == "estimated path: you → alice → dead00be… → bob (3 hops)") + default: + Issue.record("Expected success result") + } + } + + @MainActor + @Test func traceWithoutPathReportsNoKnownPath() { + let context = DiagnosticsMockContext() + context.nicknameToPeerID["bob"] = PeerID(str: "b0b0b0b0b0b0b0b0") + let processor = makeProcessor(context: context, transport: MockTransport()) + + let result = processor.process("/trace @bob") + switch result { + case .success(let message): + #expect(message == "no known path to bob") + default: + Issue.record("Expected success result") + } + } + + // MARK: - Topology snapshot types + + @Test func topologyEdgeNormalizesEndpointOrder() { + let a = PeerID(str: "aaaa000000000000") + let b = PeerID(str: "bbbb000000000000") + #expect(MeshTopologyEdge(a, b) == MeshTopologyEdge(b, a)) + #expect(Set([MeshTopologyEdge(a, b), MeshTopologyEdge(b, a)]).count == 1) + } + + @Test func topologyLayoutPlacesSelfInCenter() { + let nodes: [MeshTopologyDisplayModel.Node] = [ + .init(id: "self", label: "me", isSelf: true), + .init(id: "a", label: "alice", isSelf: false), + .init(id: "b", label: "bob", isSelf: false) + ] + let size = CGSize(width: 200, height: 200) + let positions = MeshTopologyView.layout(nodes: nodes, in: size) + + #expect(positions["self"] == CGPoint(x: 100, y: 100)) + #expect(positions.count == 3) + // Ring nodes sit on the same radius around the center. + let radiusA = hypot((positions["a"]?.x ?? 0) - 100, (positions["a"]?.y ?? 0) - 100) + let radiusB = hypot((positions["b"]?.x ?? 0) - 100, (positions["b"]?.y ?? 0) - 100) + #expect(abs(radiusA - radiusB) < 0.001) + #expect(radiusA > 0) + } +} + +/// Minimal CommandContextProvider for diagnostics tests; records deferred +/// command output so async /ping results can be asserted. +@MainActor +private final class DiagnosticsMockContext: CommandContextProvider { + var nickname: String = "tester" + var activeChannel: ChannelID = .mesh + var selectedPrivateChatPeer: PeerID? + var blockedUsers: Set = [] + let idBridge = NostrIdentityBridge(keychain: MockKeychain()) + + var nicknameToPeerID: [String: PeerID] = [:] + private(set) var commandOutputs: [String] = [] + private(set) var commandOutputDestinations: [CommandOutputDestination] = [] + + func getPeerIDForNickname(_ nickname: String) -> PeerID? { + nicknameToPeerID[nickname] + } + + func getVisibleGeoParticipants() -> [CommandGeoParticipant] { [] } + func nostrPubkeyForDisplayName(_ displayName: String) -> String? { nil } + func startPrivateChat(with peerID: PeerID) {} + func sendPrivateMessage(_ content: String, to peerID: PeerID) {} + func clearCurrentPublicTimeline() {} + func clearPrivateChat(_ peerID: PeerID) {} + func sendPublicRaw(_ content: String) {} + func sendPublicMessage(_ content: String) {} + func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) {} + func addPublicSystemMessage(_ content: String) {} + func toggleFavorite(peerID: PeerID) {} + + func currentCommandDestination() -> CommandOutputDestination { + if let peerID = selectedPrivateChatPeer { + return .privateChat(peerID) + } + return .meshTimeline + } + + func addCommandOutput(_ content: String, to destination: CommandOutputDestination) { + commandOutputs.append(content) + commandOutputDestinations.append(destination) + } +} diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MeshPingPayload.swift b/localPackages/BitFoundation/Sources/BitFoundation/MeshPingPayload.swift new file mode 100644 index 00000000..54265b8c --- /dev/null +++ b/localPackages/BitFoundation/Sources/BitFoundation/MeshPingPayload.swift @@ -0,0 +1,57 @@ +// +// MeshPingPayload.swift +// BitFoundation +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import struct Foundation.Data + +/// Wire payload shared by the `ping` (0x26) and `pong` (0x27) message types. +/// +/// Layout (9 bytes): +/// - 8 bytes: random nonce (a pong echoes the nonce of the ping it answers) +/// - 1 byte: origin TTL — the TTL the packet was launched with, so the +/// receiver can compute the hop count as `originTTL - receivedTTL`. +/// +/// Both directions are unencrypted and unsigned: the payload carries no +/// private data, and the unguessable nonce already binds a pong to a probe +/// the local device actually sent. +public struct MeshPingPayload: Equatable { + public static let nonceLength = 8 + private static let encodedLength = nonceLength + 1 + + public let nonce: Data + public let originTTL: UInt8 + + public init?(nonce: Data, originTTL: UInt8) { + guard nonce.count == Self.nonceLength else { return nil } + self.nonce = nonce + self.originTTL = originTTL + } + + public func encode() -> Data { + var data = Data(capacity: Self.encodedLength) + data.append(nonce) + data.append(originTTL) + return data + } + + /// Accepts payloads with trailing bytes so future revisions can extend + /// the format without breaking older clients. + public static func decode(_ data: Data) -> MeshPingPayload? { + guard data.count >= encodedLength else { return nil } + let nonce = Data(data.prefix(nonceLength)) + let originTTL = data[data.index(data.startIndex, offsetBy: nonceLength)] + return MeshPingPayload(nonce: nonce, originTTL: originTTL) + } + + /// Number of links a packet crossed, derived from TTL decrements plus the + /// final delivery link (a directly connected peer is 1 hop away). + /// Returns nil when the TTLs are inconsistent (received above origin). + public static func hopCount(originTTL: UInt8, receivedTTL: UInt8) -> Int? { + guard originTTL >= receivedTTL else { return nil } + return Int(originTTL - receivedTTL) + 1 + } +} diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index d1e2ea0d..763abaa7 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -26,6 +26,10 @@ public enum MessageType: UInt8 { case fileTransfer = 0x22 // Binary file/audio/image payloads case boardPost = 0x23 // Signed geohash bulletin-board post or tombstone + // Mesh diagnostics + case ping = 0x26 // Directed echo request (nonce + origin TTL) + case pong = 0x27 // Directed echo reply (echoed nonce + origin TTL) + // Gateway mode: signed Nostr event ferried between a mesh-only peer and // an internet gateway peer. case nostrCarrier = 0x28 @@ -42,6 +46,8 @@ public enum MessageType: UInt8 { case .fragment: return "fragment" case .fileTransfer: return "fileTransfer" case .boardPost: return "boardPost" + case .ping: return "ping" + case .pong: return "pong" case .nostrCarrier: return "nostrCarrier" } } diff --git a/localPackages/BitFoundation/Tests/BitFoundationTests/MeshPingPayloadTests.swift b/localPackages/BitFoundation/Tests/BitFoundationTests/MeshPingPayloadTests.swift new file mode 100644 index 00000000..8032bd9c --- /dev/null +++ b/localPackages/BitFoundation/Tests/BitFoundationTests/MeshPingPayloadTests.swift @@ -0,0 +1,70 @@ +// +// MeshPingPayloadTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +@testable import BitFoundation + +struct MeshPingPayloadTests { + + @Test func encodeDecodeRoundTrip() throws { + let nonce = Data([0x01, 0x02, 0x03, 0x04, 0xAA, 0xBB, 0xCC, 0xFF]) + let payload = try #require(MeshPingPayload(nonce: nonce, originTTL: 7)) + + let encoded = payload.encode() + #expect(encoded.count == 9) + #expect(encoded.prefix(8) == nonce) + #expect(encoded.last == 7) + + let decoded = try #require(MeshPingPayload.decode(encoded)) + #expect(decoded == payload) + } + + @Test func decodeToleratesTrailingBytes() throws { + let nonce = Data(repeating: 0x42, count: 8) + let payload = try #require(MeshPingPayload(nonce: nonce, originTTL: 3)) + var extended = payload.encode() + extended.append(contentsOf: [0xDE, 0xAD]) + + let decoded = try #require(MeshPingPayload.decode(extended)) + #expect(decoded == payload) + } + + @Test func decodeRespectsSliceIndices() throws { + // Data slices keep their parent's indices; decoding must not assume + // startIndex == 0. + let nonce = Data(repeating: 0x11, count: 8) + let payload = try #require(MeshPingPayload(nonce: nonce, originTTL: 5)) + let framed = Data([0x00, 0x00]) + payload.encode() + let slice = framed.dropFirst(2) + + let decoded = try #require(MeshPingPayload.decode(slice)) + #expect(decoded == payload) + } + + @Test func rejectsTruncatedPayload() { + #expect(MeshPingPayload.decode(Data(repeating: 0x01, count: 8)) == nil) + #expect(MeshPingPayload.decode(Data()) == nil) + } + + @Test func rejectsWrongNonceLength() { + #expect(MeshPingPayload(nonce: Data(repeating: 0, count: 7), originTTL: 7) == nil) + #expect(MeshPingPayload(nonce: Data(repeating: 0, count: 9), originTTL: 7) == nil) + } + + @Test func hopCountMath() { + // Direct link: no TTL decrement, one hop. + #expect(MeshPingPayload.hopCount(originTTL: 7, receivedTTL: 7) == 1) + // One relay in between: two hops. + #expect(MeshPingPayload.hopCount(originTTL: 7, receivedTTL: 6) == 2) + // Full TTL consumed. + #expect(MeshPingPayload.hopCount(originTTL: 7, receivedTTL: 1) == 7) + // Inconsistent TTLs (received above origin) are rejected. + #expect(MeshPingPayload.hopCount(originTTL: 3, receivedTTL: 7) == nil) + } +} From 87910541ef10a711244562284afeb45f49dba853 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:38:33 +0200 Subject: [PATCH 039/158] Prekey bundles: forward-secret async first contact for courier mail (#1381) * Add capability bits to announce TLV Announces now carry an optional capabilities TLV (0x05): a little-endian bitfield with named bits for upcoming features (prekeys, wifiBulk, gateway, groups, board, vouch, meshDiagnostics). Old clients skip the unknown TLV; peers without it decode as nil so features can distinguish "legacy peer" from "advertises nothing". PeerCapabilities lives in BitFoundation with a minimal-length encoding that preserves unknown bits for forward compatibility. Peer capabilities are stored in the BLE peer registry on verified announce and exposed via BLEService.peerCapabilities(_:). The local advertisement set is empty until each feature ships its bit. Co-Authored-By: Claude Fable 5 * Prekey bundles: forward-secret async first contact for courier mail Courier envelopes were sealed with one-way Noise X to the recipient's long-lived static key, so a later compromise of that key exposed every envelope captured in transit. This adds one-time prekey bundles: - PrekeyBundle (MessageType 0x24): 8 one-time Curve25519 public prekeys bound to the owner's Noise static key by an Ed25519 signature over "bitchat-prekey-bundle-v1" canonical bytes; gossiped mesh-wide on its own 60s sync round (SyncTypeFlags bit 9, 200-peer cap, 24h freshness) and verified against the announce-bound signing key before caching. - Sealed envelope v2: Noise X where the responder static is the one-time prekey, prologue "bitchat-prekey-v1" || prekeyID. Sender identity rides encrypted inside and is authenticated exactly like v1 (blocked-sender check included). CourierEnvelope gains an optional prekeyID TLV that v1 decoders skip as unknown. - Local prekeys live in the Keychain; consumed privates survive a 48h grace window for spray-and-wait redeliveries, then are deleted (the forward-secrecy clock starts at deletion). The batch tops back up and re-gossips when unconsumed count drops below 3, and everything is wiped in panic mode. - Routing: courier sealing picks a cached verified bundle when one exists (one prekey per message, reused across deposit retries), with the advertised .prekeys capability as a veto for on-mesh peers, and falls back to static sealing otherwise. Co-Authored-By: Claude Fable 5 * Prekeys: authenticate bundle packets, fix consume-republish, deflake CI Fixes the prekey-bundle PR review + CI failure: - CI root cause: the receive queue (mesh.message) is concurrent, so a gossiped prekey bundle can be processed before the announce that binds its owner's signing key. The old handler dropped such bundles outright, so under CI parallel load the bundle was permanently lost and the cache/gossip tests flaked (verifiedBundleEntersGossipStore, prekeySealedMailTravelsViaCourierAndOpens). Bundles that arrive before their binding are now retained per-owner (bounded) and re-attempted when the verified announce lands, atomically to avoid a check-then-act race. - Authenticate the OUTER prekey-bundle packet (Codex P2 / review MEDIUM): require senderID == PeerID(bundle.noiseStaticPublicKey) and verify the packet's Ed25519 signature (covers senderID + timestamp) against the owner's bound signing key, in addition to the inner bundle signature. Stops replay under a fresh timestamp / fake senderID. - Key the gossip prekey-bundle store/dedup by the bundle's authenticated identity (noiseStaticPublicKey), not the unauthenticated packet senderID, so one valid bundle sprayed under many fabricated sender IDs can't multiply entries and exhaust the 200-owner cap. - Bump published-bundle generatedAt strictly on consume (Codex P1): consuming a prekey shrinks the published bundle, so it now republishes with a strictly newer generatedAt and re-gossips, so peers replace the cached copy and stop assigning the consumed ID before its 48h grace. - Guard the panic/clear detached Application Support tree-deletes behind TestEnvironment.isRunningTests: the SPM test process shares that tree, so the wipe could land mid-test and flake file-dependent tests. Co-Authored-By: Claude Fable 5 * Update sync tests for prekeyBundle as bit 9 / default sync round Prekeys makes bit 9 (prekeyBundle) a known SyncTypeFlags bit and enables a prekey sync round by default. That broke tests authored by other PRs that assumed bit 9 was phantom or that only their own sync round fires: - SyncTypeFlags(Board)Tests: move the "unknown bits" probes to bits 10+ (0xFE -> 0xFC / 0xFD), since bit 9 is now assigned. - GossipSync(Board)Tests + GossipSyncManagerTests: disable the prekey sync round in configs that run maintenance (as they already do for message/ fragment/fileTransfer), so they isolate the behavior under test. Full app suite (1301 tests) green locally via SPM. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- .../Protocols/PeerCapabilities+Local.swift | 2 +- .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEService.swift | 246 ++++++++++- bitchat/Services/Courier/CourierStore.swift | 12 +- bitchat/Services/NoiseEncryptionService.swift | 108 ++++- .../Services/Prekeys/LocalPrekeyStore.swift | 228 ++++++++++ .../Services/Prekeys/PrekeyBundleStore.swift | 210 +++++++++ bitchat/Services/TransportConfig.swift | 12 + bitchat/Sync/GossipSyncManager.swift | 85 +++- bitchat/Sync/SyncTypeFlags.swift | 7 + .../ChatPublicConversationCoordinator.swift | 5 + bitchat/ViewModels/ChatViewModel.swift | 4 + .../EndToEnd/PrekeyEndToEndTests.swift | 399 ++++++++++++++++++ bitchatTests/GossipSyncManagerTests.swift | 103 ++++- bitchatTests/Prekeys/NoisePrekeyTests.swift | 283 +++++++++++++ .../Prekeys/PrekeyBundleStoreTests.swift | 197 +++++++++ bitchatTests/Prekeys/PrekeyBundleTests.swift | 133 ++++++ bitchatTests/Sync/GossipSyncBoardTests.swift | 1 + .../Sync/SyncTypeFlagsBoardTests.swift | 13 +- bitchatTests/Sync/SyncTypeFlagsTests.swift | 15 +- .../BitFoundation/CourierEnvelope.swift | 27 +- .../Sources/BitFoundation/MessageType.swift | 6 +- .../Sources/BitFoundation/PrekeyBundle.swift | 195 +++++++++ 23 files changed, 2254 insertions(+), 39 deletions(-) create mode 100644 bitchat/Services/Prekeys/LocalPrekeyStore.swift create mode 100644 bitchat/Services/Prekeys/PrekeyBundleStore.swift create mode 100644 bitchatTests/EndToEnd/PrekeyEndToEndTests.swift create mode 100644 bitchatTests/Prekeys/NoisePrekeyTests.swift create mode 100644 bitchatTests/Prekeys/PrekeyBundleStoreTests.swift create mode 100644 bitchatTests/Prekeys/PrekeyBundleTests.swift create mode 100644 localPackages/BitFoundation/Sources/BitFoundation/PrekeyBundle.swift diff --git a/bitchat/Protocols/PeerCapabilities+Local.swift b/bitchat/Protocols/PeerCapabilities+Local.swift index 29b94b4c..b5c36f1a 100644 --- a/bitchat/Protocols/PeerCapabilities+Local.swift +++ b/bitchat/Protocols/PeerCapabilities+Local.swift @@ -3,5 +3,5 @@ import BitFoundation extension PeerCapabilities { /// Capabilities this build advertises in its announce packets. /// Each feature adds its bit here when it ships. - static let localSupported: PeerCapabilities = [.vouch] + static let localSupported: PeerCapabilities = [.vouch, .prekeys] } diff --git a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift index 10837d9b..2bec6292 100644 --- a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift +++ b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift @@ -12,7 +12,7 @@ enum BLEOutboundPacketPolicy { switch MessageType(rawValue: packetType) { case .noiseEncrypted, .noiseHandshake: return true - case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .boardPost, .ping, .pong, .nostrCarrier: + case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .boardPost, .ping, .pong, .nostrCarrier, .prekeyBundle: return false } } diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index c7a8570a..3e6c5da7 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -62,6 +62,19 @@ final class BLEService: NSObject { // Local-only store-and-forward counters; nil in unit tests. var sfMetrics: StoreAndForwardMetrics? + // Verified one-time prekey bundles gossiped by other peers, used to seal + // courier mail forward-secretly. Injectable for tests. + var prekeyBundleStore: PrekeyBundleStore = .shared + // Throttle for re-broadcasting our own (unchanged) bundle; guarded by + // collectionsQueue barriers. + private var lastPrekeyBundleSentAt: Date? + // Prekey bundles that arrived before their owner's verified announce bound + // a signing key. The receive queue is concurrent, so a bundle can race + // ahead of the announce it depends on; we retain the latest such bundle per + // owner (bounded) and re-attempt attribution when the announce lands. + // Guarded by collectionsQueue barriers. + private var pendingPrekeyBundles: [PeerID: BitchatPacket] = [:] + private static let pendingPrekeyBundleCap = 64 // Gateway mode: sink for received nostrCarrier packets (set by app // wiring, called on the main actor after transport-level checks) and the // runtime-toggled capability bits ORed into `PeerCapabilities.localSupported` @@ -320,7 +333,10 @@ final class BLEService: NSObject { fileTransferSyncIntervalSeconds: TransportConfig.syncFileTransferIntervalSeconds, messageSyncIntervalSeconds: TransportConfig.syncMessageIntervalSeconds, responseRateLimitMaxResponses: TransportConfig.syncResponseRateLimitMaxResponses, - responseRateLimitWindowSeconds: TransportConfig.syncResponseRateLimitWindowSeconds + responseRateLimitWindowSeconds: TransportConfig.syncResponseRateLimitWindowSeconds, + prekeyBundleCapacity: TransportConfig.syncPrekeyBundleCapacity, + prekeyBundleSyncIntervalSeconds: TransportConfig.syncPrekeyBundleIntervalSeconds, + prekeyBundleMaxAgeSeconds: TransportConfig.syncPrekeyBundleMaxAgeSeconds ) // Only real Bluetooth sessions archive to disk; unit tests stay hermetic. @@ -371,6 +387,8 @@ final class BLEService: NSObject { ingressLinks.removeAll() recentTrafficTracker.removeAll() scheduledRelays.cancelAll() + // Let the post-panic identity publish its fresh bundle promptly. + lastPrekeyBundleSentAt = nil return transfers } @@ -1368,6 +1386,10 @@ final class BLEService: NSObject { } // Ensure our own announce is included in sync state gossipSyncManager?.onPublicPacketSeen(signedPacket) + + // Keep our prekey bundle riding alongside presence (throttled; the + // send is a no-op when the bundle was refreshed recently). + sendPrekeyBundle() } // MARK: QR Verification over Noise @@ -1772,6 +1794,10 @@ extension BLEService { handleReceivedPacket(packet, from: fromPeerID) } + func _test_hasGossipPrekeyBundle(for peerID: PeerID) -> Bool { + gossipSyncManager?._hasPrekeyBundle(for: peerID) ?? false + } + func _test_acceptsIngress(packet: BitchatPacket, boundPeerID: PeerID?) -> Bool { let claimedSenderID = PeerID(hexData: packet.senderID) guard case .success = BLEIngressLinkRegistry.packetContext( @@ -2751,10 +2777,13 @@ extension BLEService { // MARK: Courier Store-and-Forward - /// Seal `content` to the recipient's static key (one-way Noise X) and hand - /// the envelope to the given couriers for physical delivery. Returns false - /// when no courier is connected, the payload cannot be built, or sealing - /// fails; link writes are queued asynchronously after the envelope is ready. + /// Seal `content` for the recipient and hand the envelope to the given + /// couriers for physical delivery. When a verified one-time prekey bundle + /// is cached for the recipient, sealing targets one of its prekeys + /// (forward secret, envelope v2); otherwise it falls back to their static + /// key (one-way Noise X, v1) exactly as before. Returns false when no + /// courier is connected, the payload cannot be built, or sealing fails; + /// link writes are queued asynchronously after the envelope is ready. func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { let connected = couriers.filter { isPeerConnected($0) } guard !connected.isEmpty, @@ -2765,7 +2794,15 @@ extension BLEService { let payload: Data do { let now = Date() - let sealed = try noiseService.sealCourierPayload(typedPayload, recipientStaticKey: recipientNoiseKey) + let sealed: Data + let prekeyID: UInt32? + if let prekey = assignRecipientPrekey(messageID: messageID, recipientNoiseKey: recipientNoiseKey) { + sealed = try noiseService.sealPrekeyPayload(typedPayload, recipientPrekey: prekey) + prekeyID = prekey.id + } else { + sealed = try noiseService.sealCourierPayload(typedPayload, recipientStaticKey: recipientNoiseKey) + prekeyID = nil + } let envelope = CourierEnvelope( recipientTag: CourierEnvelope.recipientTag( noiseStaticKey: recipientNoiseKey, @@ -2773,7 +2810,8 @@ extension BLEService { ), expiry: UInt64((now.timeIntervalSince1970 + CourierEnvelope.maxLifetimeSeconds) * 1000), ciphertext: sealed, - copies: TransportConfig.courierInitialCopies + copies: TransportConfig.courierInitialCopies, + prekeyID: prekeyID ) guard let encoded = envelope.encode() else { return false } payload = encoded @@ -2792,6 +2830,22 @@ extension BLEService { return true } + /// The prekey to seal a courier message with, or nil to fall back to + /// static sealing. The real signal is a verified, unexpired bundle with a + /// spare prekey; the advertised `.prekeys` capability only acts as a veto + /// for peers we currently see on the mesh (a cached bundle can outlive a + /// peer's downgrade to a build that no longer holds the privates). + /// Re-deposits of the same message reuse its assigned prekey, so one + /// message consumes exactly one prekey ID regardless of courier count. + private func assignRecipientPrekey(messageID: String, recipientNoiseKey: Data) -> PrekeyBundle.Prekey? { + let shortID = PeerID(publicKey: recipientNoiseKey) + let knownOnMesh = collectionsQueue.sync { peerRegistry.info(for: shortID) != nil } + if knownOnMesh, !peerCapabilities(shortID).contains(.prekeys) { + return nil + } + return prekeyBundleStore.assignPrekey(messageID: messageID, recipientNoiseKey: recipientNoiseKey) + } + private func makeCourierPacket(_ payload: Data, to peerID: PeerID) -> BitchatPacket { let packet = BitchatPacket( type: MessageType.courierEnvelope.rawValue, @@ -2827,7 +2881,25 @@ extension BLEService { private func openCourierEnvelope(_ envelope: CourierEnvelope) { do { - let (typedPayload, senderStaticKey) = try noiseService.openCourierPayload(envelope.ciphertext) + let typedPayload: Data + let senderStaticKey: Data + if let prekeyID = envelope.prekeyID { + // Envelope v2: sealed to one of our one-time prekeys. Opening + // consumes the prekey (48h redelivery grace), which shrinks our + // published bundle under a strictly newer generatedAt. Re-gossip + // so peers replace their cached copy and stop assigning the + // consumed ID before the grace lapses; force the broadcast when + // the batch also topped back up (low-water), otherwise let the + // rebroadcast throttle coalesce bursts. + let opened = try noiseService.openPrekeyPayload(envelope.ciphertext, prekeyID: prekeyID) + (typedPayload, senderStaticKey) = (opened.payload, opened.senderStaticKey) + if opened.consumedPrekey { + let replenished = noiseService.replenishPrekeysIfNeeded() + sendPrekeyBundle(force: replenished) + } + } else { + (typedPayload, senderStaticKey) = try noiseService.openCourierPayload(envelope.ciphertext) + } guard let typeRaw = typedPayload.first, let payloadType = NoisePayloadType(rawValue: typeRaw), payloadType == .privateMessage else { @@ -2958,6 +3030,155 @@ extension BLEService { } } + // MARK: One-Time Prekey Bundles + + /// Broadcasts our signed prekey bundle and tracks it for gossip sync. + /// Unforced sends (piggybacked on announces) are throttled — gossip does + /// the spreading, the broadcast just keeps our own gossip entry fresh. + /// Forced sends (bundle changed after consumption) go immediately. + private func sendPrekeyBundle(force: Bool = false) { + let now = Date() + let shouldSend: Bool = collectionsQueue.sync(flags: .barrier) { + if !force, + let last = lastPrekeyBundleSentAt, + now.timeIntervalSince(last) < TransportConfig.prekeyBundleRebroadcastSeconds { + return false + } + lastPrekeyBundleSentAt = now + return true + } + guard shouldSend else { return } + guard let bundle = noiseService.currentPrekeyBundle(), + let payload = bundle.encode() else { + SecureLogger.error("❌ Failed to build prekey bundle", category: .security) + return + } + let packet = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: myPeerIDData, + recipientID: nil, + timestamp: UInt64(now.timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: messageTTL + ) + guard let signedPacket = noiseService.signPacket(packet) else { + SecureLogger.error("❌ Failed to sign prekey bundle packet", category: .security) + return + } + if DispatchQueue.getSpecific(key: messageQueueKey) != nil { + broadcastPacket(signedPacket) + } else { + messageQueue.async { [weak self] in + self?.broadcastPacket(signedPacket) + } + } + gossipSyncManager?.onPublicPacketSeen(signedPacket) + } + + /// Ingests a gossiped prekey bundle. Attribution is layered: the outer + /// packet must originate from the bundle owner (fabricated sender IDs, used + /// to multiply cache/gossip entries, are rejected), and BOTH the inner + /// bundle signature and the outer packet signature must verify against the + /// owner's announce-bound signing key. Verifying the outer packet — whose + /// signed bytes cover senderID and timestamp — stops a valid bundle from + /// being replayed under a fresh timestamp or spoofed sender to pass + /// freshness or poison attribution. Only after that does the packet enter + /// our own gossip store, so we never help spread a bundle we couldn't + /// attribute. + private func handlePrekeyBundle(_ packet: BitchatPacket, from peerID: PeerID) { + guard let bundle = PrekeyBundle.decode(packet.payload) else { + SecureLogger.debug("🔑 Ignoring malformed prekey bundle from \(peerID.id.prefix(8))…", category: .security) + return + } + // Our own bundle is tracked at send time; a copy echoing back adds nothing. + guard bundle.noiseStaticPublicKey != noiseService.getStaticPublicKeyData() else { return } + let owner = PeerID(publicKey: bundle.noiseStaticPublicKey) + // The owner's genuine bundle (direct or relayed) always carries the + // owner's senderID + outer signature; gossip resends preserve both. A + // packet whose senderID isn't the owner can't be authenticated here. + guard PeerID(hexData: packet.senderID) == owner else { + SecureLogger.debug("🔑 Ignoring prekey bundle whose sender ≠ owner \(owner.id.prefix(8))…", category: .security) + return + } + // Look up the announce-bound signing key and stash-if-unbound in ONE + // barrier: the receive queue is concurrent, so this bundle can race + // ahead of the announce that binds the key. Reading the live registry + // and stashing atomically closes the check-then-act gap against + // handleAnnounce's drain (see drainPendingPrekeyBundles). + let signingKey: Data? = collectionsQueue.sync(flags: .barrier) { + if let info = peerRegistry.info(for: owner), + info.noisePublicKey == bundle.noiseStaticPublicKey, + let key = info.signingPublicKey { + return key + } + // Offline-verified identities are stable across this race. + for candidate in identityManager.getCryptoIdentitiesByPeerIDPrefix(owner) + where candidate.publicKey == bundle.noiseStaticPublicKey { + if let key = candidate.signingPublicKey { return key } + } + // No binding yet: retain the latest bundle per owner, bounded, and + // retry once the verified announce lands. + if pendingPrekeyBundles[owner] != nil + || pendingPrekeyBundles.count < Self.pendingPrekeyBundleCap { + pendingPrekeyBundles[owner] = packet + } + return nil + } + guard let signingKey else { + SecureLogger.debug("🔑 Deferring prekey bundle without a bound signing key (owner \(owner.id.prefix(8))…)", category: .security) + return + } + ingestVerifiedPrekeyBundle(bundle, packet: packet, owner: owner, signingKey: signingKey) + } + + /// Verify a bundle's inner + outer signatures against the owner's bound + /// signing key and, on success, cache it and let it enter our gossip store. + private func ingestVerifiedPrekeyBundle(_ bundle: PrekeyBundle, packet: BitchatPacket, owner: PeerID, signingKey: Data) { + guard noiseService.verifyPrekeyBundleSignature(bundle, signingPublicKey: signingKey), + noiseService.verifyPacketSignature(packet, publicKey: signingKey) else { + SecureLogger.debug("🔑 Ignoring prekey bundle without verifiable signature (owner \(owner.id.prefix(8))…)", category: .security) + return + } + if prekeyBundleStore.ingest(bundle) { + SecureLogger.debug("🔑 Cached prekey bundle for \(owner.id.prefix(8))… (\(bundle.prekeys.count) prekeys)", category: .security) + } + gossipSyncManager?.onPublicPacketSeen(packet) + } + + /// Re-attempt any prekey bundle that arrived before this owner's announce + /// bound a signing key. Called from handleAnnounce after a verified + /// announce, in a barrier ordered after the registry write, so a bundle + /// stashed before the write is always observed here. + private func drainPendingPrekeyBundles(for owner: PeerID) { + let pending: BitchatPacket? = collectionsQueue.sync(flags: .barrier) { + pendingPrekeyBundles.removeValue(forKey: owner) + } + guard let packet = pending, + let bundle = PrekeyBundle.decode(packet.payload), + let signingKey = announceBoundSigningKey(forNoiseKey: bundle.noiseStaticPublicKey) else { return } + ingestVerifiedPrekeyBundle(bundle, packet: packet, owner: owner, signingKey: signingKey) + } + + /// Ed25519 signing key bound to a Noise static key by a verified + /// announce: from the live registry when the owner is on the mesh, else + /// from identities persisted for offline verification. + private func announceBoundSigningKey(forNoiseKey noiseKey: Data) -> Data? { + let shortID = PeerID(publicKey: noiseKey) + if let info = collectionsQueue.sync(execute: { peerRegistry.info(for: shortID) }), + info.noisePublicKey == noiseKey, + let signingKey = info.signingPublicKey { + return signingKey + } + for candidate in identityManager.getCryptoIdentitiesByPeerIDPrefix(shortID) + where candidate.publicKey == noiseKey { + if let signingKey = candidate.signingPublicKey { + return signingKey + } + } + return nil + } + // MARK: Gateway carrier (nostrCarrier) /// Sign and send an encoded `toGateway` carrier payload directed at a @@ -3537,6 +3758,9 @@ extension BLEService { case .courierEnvelope: handleCourierEnvelope(packet, from: peerID) + case .prekeyBundle: + handlePrekeyBundle(packet, from: senderID) + case .boardPost: // Invalid or deleted posts must not spread; skip the relay step. guard handleBoardPost(packet, from: senderID) else { return } @@ -3615,6 +3839,12 @@ extension BLEService { private func handleAnnounce(_ packet: BitchatPacket, from peerID: PeerID) { let result = announceHandler.handle(packet, from: peerID) + // A verified announce is the moment a signing key becomes bound to this + // owner's noise key: retry any prekey bundle that raced ahead of it. + if let result, result.isVerified { + drainPendingPrekeyBundles(for: result.peerID) + } + // Courier work: an announce is the moment we learn a peer's Noise // static key, so check whether we're carrying mail addressed to them // (or spray-able mail they could carry). Verified announces only. diff --git a/bitchat/Services/Courier/CourierStore.swift b/bitchat/Services/Courier/CourierStore.swift index 063c94d5..a24eb371 100644 --- a/bitchat/Services/Courier/CourierStore.swift +++ b/bitchat/Services/Courier/CourierStore.swift @@ -42,9 +42,11 @@ final class CourierStore { var sprayedTo: Set /// Last speculative multi-hop handover toward a relayed announce. var lastRemoteHandoverAt: Date? + /// Prekey-sealed (envelope v2) discriminator; nil for static-sealed v1. + let prekeyID: UInt32? var envelope: CourierEnvelope { - CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies) + CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies, prekeyID: prekeyID) } init( @@ -56,7 +58,8 @@ final class CourierStore { tier: CourierDepositTier, copies: UInt8, sprayedTo: Set = [], - lastRemoteHandoverAt: Date? = nil + lastRemoteHandoverAt: Date? = nil, + prekeyID: UInt32? = nil ) { self.recipientTag = recipientTag self.expiry = expiry @@ -67,6 +70,7 @@ final class CourierStore { self.copies = copies self.sprayedTo = sprayedTo self.lastRemoteHandoverAt = lastRemoteHandoverAt + self.prekeyID = prekeyID } // Files written before tiers/spray lack the newer fields; treat that @@ -82,6 +86,7 @@ final class CourierStore { copies = try container.decodeIfPresent(UInt8.self, forKey: .copies) ?? 1 sprayedTo = try container.decodeIfPresent(Set.self, forKey: .sprayedTo) ?? [] lastRemoteHandoverAt = try container.decodeIfPresent(Date.self, forKey: .lastRemoteHandoverAt) + prekeyID = try container.decodeIfPresent(UInt32.self, forKey: .prekeyID) } } @@ -186,7 +191,8 @@ final class CourierStore { depositorNoiseKey: depositorNoiseKey, storedAt: date, tier: tier, - copies: envelope.copies + copies: envelope.copies, + prekeyID: envelope.prekeyID )) persistLocked() return true diff --git a/bitchat/Services/NoiseEncryptionService.swift b/bitchat/Services/NoiseEncryptionService.swift index 8a99d9ec..9e7e6eae 100644 --- a/bitchat/Services/NoiseEncryptionService.swift +++ b/bitchat/Services/NoiseEncryptionService.swift @@ -172,6 +172,10 @@ final class NoiseEncryptionService { // Security components private let rateLimiter = NoiseRateLimiter() private let keychain: KeychainManagerProtocol + + // One-time prekeys for forward-secret courier sealing (lazy generation + // inside the store; the batch is minted on first bundle build). + private let localPrekeys: LocalPrekeyStore // Session maintenance private var rekeyTimer: Timer? @@ -200,6 +204,7 @@ final class NoiseEncryptionService { init(keychain: KeychainManagerProtocol) { self.keychain = keychain + self.localPrekeys = LocalPrekeyStore(keychain: keychain) // BCH-01-009: Load or create static identity key with proper error handling let loadedKey: Curve25519.KeyAgreement.PrivateKey @@ -412,13 +417,111 @@ final class NoiseEncryptionService { } return (payload: payload, senderStaticKey: senderKey.rawRepresentation) } - + + // MARK: - One-Time Prekey Envelopes (forward-secret Noise X) + + /// Domain separation for prekey-sealed envelopes: distinct from both the + /// interactive XX transcripts and static-sealed courier envelopes, and + /// bound to the specific prekey ID so a ciphertext cannot be replayed + /// against a different prekey. + private static let prekeyProloguePrefix = Data("bitchat-prekey-v1".utf8) + + private static func prekeyPrologue(for prekeyID: UInt32) -> Data { + var prologue = prekeyProloguePrefix + var big = prekeyID.bigEndian + withUnsafeBytes(of: &big) { prologue.append(contentsOf: $0) } + return prologue + } + + /// Encrypt a payload to one of the recipient's gossiped one-time prekeys + /// (Noise X where the responder static is the prekey, not the identity + /// key). Unlike `sealCourierPayload`, this is forward secret: once the + /// recipient consumes the prekey and its grace window lapses, the private + /// key is deleted and captured ciphertext becomes undecryptable even if + /// the recipient's identity key is later compromised. The initiator's + /// static still rides inside (encrypted), so the recipient authenticates + /// the sender exactly as with static-sealed envelopes. + func sealPrekeyPayload(_ payload: Data, recipientPrekey: PrekeyBundle.Prekey) throws -> Data { + let remoteKey = try NoiseHandshakeState.validatePublicKey(recipientPrekey.publicKey) + let handshake = NoiseHandshakeState( + role: .initiator, + pattern: .X, + keychain: keychain, + localStaticKey: staticIdentityKey, + remoteStaticKey: remoteKey, + prologue: Self.prekeyPrologue(for: recipientPrekey.id) + ) + return try handshake.writeMessage(payload: payload) + } + + /// Decrypt an envelope sealed to one of our one-time prekeys. On success + /// the prekey is marked consumed (its private key survives a 48h grace + /// window for spray-and-wait redeliveries, then is deleted for good). + /// Returns the payload, the sender's authenticated static key (same + /// contract as `openCourierPayload`), and whether this open actually + /// retired the prekey — false for a redelivery of already-consumed mail — + /// so the caller can re-gossip the shrunken bundle only when it changed. + func openPrekeyPayload(_ envelopeCiphertext: Data, prekeyID: UInt32) throws -> (payload: Data, senderStaticKey: Data, consumedPrekey: Bool) { + guard let prekeyPrivate = localPrekeys.privateKey(for: prekeyID) else { + throw NoiseEncryptionError.unknownPrekey + } + let handshake = NoiseHandshakeState( + role: .responder, + pattern: .X, + keychain: keychain, + localStaticKey: prekeyPrivate, + prologue: Self.prekeyPrologue(for: prekeyID) + ) + let payload = try handshake.readMessage(envelopeCiphertext) + guard let senderKey = handshake.getRemoteStaticPublicKey() else { + throw NoiseError.missingKeys + } + let consumedPrekey = localPrekeys.markConsumed(prekeyID) + return (payload: payload, senderStaticKey: senderKey.rawRepresentation, consumedPrekey: consumedPrekey) + } + + /// Current signed prekey bundle for gossip, minting the initial batch on + /// first use. Nil only when signing fails. + func currentPrekeyBundle() -> PrekeyBundle? { + let (prekeys, generatedAt) = localPrekeys.currentBundlePrekeys() + guard !prekeys.isEmpty else { return nil } + let unsigned = PrekeyBundle( + noiseStaticPublicKey: getStaticPublicKeyData(), + prekeys: prekeys, + generatedAt: generatedAt, + signature: Data(count: PrekeyBundle.signatureLength) + ) + guard let signature = signData(unsigned.signableBytes()) else { return nil } + return PrekeyBundle( + noiseStaticPublicKey: unsigned.noiseStaticPublicKey, + prekeys: prekeys, + generatedAt: generatedAt, + signature: signature + ) + } + + /// Verify a peer's bundle signature against their announce-bound Ed25519 + /// signing key. + func verifyPrekeyBundleSignature(_ bundle: PrekeyBundle, signingPublicKey: Data) -> Bool { + verifySignature(bundle.signature, for: bundle.signableBytes(), publicKey: signingPublicKey) + } + + /// Prune dead prekeys and top the batch back up when consumption runs it + /// low. Returns true when the published bundle changed and should be + /// re-gossiped. + @discardableResult + func replenishPrekeysIfNeeded() -> Bool { + localPrekeys.replenishIfNeeded() + } + /// Clear persistent identity (for panic mode) func clearPersistentIdentity() { // Clear from keychain let deletedStatic = keychain.deleteIdentityKey(forKey: "noiseStaticKey") let deletedSigning = keychain.deleteIdentityKey(forKey: "ed25519SigningKey") SecureLogger.logKeyOperation(.delete, keyType: "identity keys", success: deletedStatic && deletedSigning) + // One-time prekey privates go with the identity they were bound to. + localPrekeys.wipe() SecureLogger.warning("Panic mode activated - identity cleared", category: .security) // Stop rekey timer stopRekeyTimer() @@ -812,4 +915,7 @@ struct NoiseMessage: Codable { enum NoiseEncryptionError: Error { case handshakeRequired case sessionNotEstablished + /// Envelope references a prekey ID we don't hold (never ours, already + /// deleted after its grace window, or wiped in a panic). + case unknownPrekey } diff --git a/bitchat/Services/Prekeys/LocalPrekeyStore.swift b/bitchat/Services/Prekeys/LocalPrekeyStore.swift new file mode 100644 index 00000000..26f9ec67 --- /dev/null +++ b/bitchat/Services/Prekeys/LocalPrekeyStore.swift @@ -0,0 +1,228 @@ +// +// LocalPrekeyStore.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import CryptoKit +import Foundation + +/// Owns this device's one-time Curve25519 prekey private keys. +/// +/// Privates persist in the Keychain (single blob, same protection class as +/// the identity keys). A batch of `batchSize` unconsumed prekeys backs the +/// gossiped bundle; when consumption drops the unconsumed count below +/// `replenishThreshold`, the batch tops back up and the bundle's +/// `generatedAt` bumps so peers replace their cached copy. +/// +/// Redelivery grace: spray-and-wait means the same prekey-sealed ciphertext +/// (or a re-seal of the same message to the same prekey ID) can arrive via +/// several couriers days apart. A consumed prekey's private key is therefore +/// retained for `consumedGraceSeconds` after first use and only then deleted. +/// Tradeoff: during the grace window a compromise of the device still exposes +/// mail sealed to that prekey — the forward-secrecy clock starts at deletion, +/// not at first open. Refusing new ciphertexts while accepting redeliveries +/// is not possible (the recipient cannot distinguish them), so the window is +/// kept short and fixed. +final class LocalPrekeyStore { + struct Record: Codable { + let id: UInt32 + let privateKey: Data + let createdAt: Date + var consumedAt: Date? + } + + private struct Persisted: Codable { + var records: [Record] + var nextID: UInt32 + var generatedAt: UInt64 + } + + enum Policy { + static let batchSize = PrekeyBundle.maxPrekeys + static let replenishThreshold = 3 + /// How long a consumed prekey private survives for duplicate courier + /// deliveries of mail sealed to it. + static let consumedGraceSeconds: TimeInterval = 48 * 60 * 60 + /// Unconsumed prekeys older than this are rotated out: no honest + /// sender seals to a bundle that stale (see + /// `PrekeyBundleStore.Limits.maxBundleAgeForSealingSeconds`). + static let unconsumedRetentionSeconds: TimeInterval = 30 * 24 * 60 * 60 + } + + private static let keychainKey = "prekeysV1" + + private let keychain: KeychainManagerProtocol + private let now: () -> Date + private let queue = DispatchQueue(label: "chat.bitchat.prekeys.local") + + // Guarded by `queue`. + private var records: [Record] = [] + private var nextID: UInt32 = 0 + private var generatedAt: UInt64 = 0 + private var loaded = false + + init(keychain: KeychainManagerProtocol, now: @escaping () -> Date = Date.init) { + self.keychain = keychain + self.now = now + } + + // MARK: - Bundle contents (public prekeys) + + /// Unconsumed public prekeys for the gossiped bundle, generating the + /// initial batch on first use. Sorted by ID for canonical signing bytes. + func currentBundlePrekeys() -> (prekeys: [PrekeyBundle.Prekey], generatedAt: UInt64) { + queue.sync { + loadLocked() + _ = replenishLocked() + let prekeys = records + .filter { $0.consumedAt == nil } + .sorted { $0.id < $1.id } + .compactMap { record -> PrekeyBundle.Prekey? in + guard let key = try? Curve25519.KeyAgreement.PrivateKey(rawRepresentation: record.privateKey) else { return nil } + return PrekeyBundle.Prekey(id: record.id, publicKey: key.publicKey.rawRepresentation) + } + return (prekeys, generatedAt) + } + } + + // MARK: - Opening (private prekeys) + + /// Private key for a prekey ID: unconsumed, or consumed within the + /// redelivery grace window. + func privateKey(for id: UInt32) -> Curve25519.KeyAgreement.PrivateKey? { + queue.sync { + loadLocked() + let date = now() + guard let record = records.first(where: { $0.id == id }) else { return nil } + if let consumedAt = record.consumedAt, + date.timeIntervalSince(consumedAt) > Policy.consumedGraceSeconds { + return nil + } + return try? Curve25519.KeyAgreement.PrivateKey(rawRepresentation: record.privateKey) + } + } + + /// Marks a prekey consumed (starts its grace clock). Idempotent: a + /// redelivery within the grace window does not restart the clock. + /// + /// Returns true when this call actually retired a prekey, i.e. the + /// published bundle shrank. Consuming a prekey drops it from + /// `currentBundlePrekeys()`, so `generatedAt` must advance strictly too: + /// otherwise peers that cached the old bundle reject the same-`generatedAt` + /// replacement in `PrekeyBundleStore.ingest`, keep assigning the consumed + /// ID, and their mail starts failing `unknownPrekey` once the 48h grace + /// lapses. The caller re-gossips on a true result. + @discardableResult + func markConsumed(_ id: UInt32) -> Bool { + queue.sync { + loadLocked() + guard let index = records.firstIndex(where: { $0.id == id }), + records[index].consumedAt == nil else { return false } + records[index].consumedAt = now() + advanceGeneratedAtLocked() + persistLocked() + return true + } + } + + /// Prunes dead prekeys and tops the unconsumed batch back up when it runs + /// low. Returns true when the published bundle changed (caller should + /// re-gossip). + @discardableResult + func replenishIfNeeded() -> Bool { + queue.sync { + loadLocked() + return replenishLocked() + } + } + + var unconsumedCount: Int { + queue.sync { + loadLocked() + return records.filter { $0.consumedAt == nil }.count + } + } + + /// Panic wipe: drop all prekey privates from memory and the Keychain. + func wipe() { + queue.sync { + records.removeAll() + nextID = 0 + generatedAt = 0 + loaded = true + _ = keychain.deleteIdentityKey(forKey: Self.keychainKey) + } + } + + // MARK: - Internals (call only on `queue`) + + private func replenishLocked() -> Bool { + let date = now() + + // Consumed prekeys past the grace window are gone for good; stale + // unconsumed ones rotate out (their bundle is too old to seal to). + let recordsBefore = records.count + let unconsumedBefore = records.filter { $0.consumedAt == nil }.count + records.removeAll { record in + if let consumedAt = record.consumedAt { + return date.timeIntervalSince(consumedAt) > Policy.consumedGraceSeconds + } + return date.timeIntervalSince(record.createdAt) > Policy.unconsumedRetentionSeconds + } + // Only a change to the *unconsumed* set alters the published bundle; + // grace-expired consumed keys were never in it. + let unconsumed = records.filter { $0.consumedAt == nil }.count + var bundleChanged = unconsumed != unconsumedBefore + + if unconsumed < Policy.replenishThreshold { + for _ in unconsumed.. +// + +import BitFoundation +import BitLogger +import Foundation + +/// Signature-verified one-time prekey bundles received from other peers. +/// +/// One bundle per Noise static key: a newer `generatedAt` replaces the cached +/// copy, keeping the IDs we already sealed with marked used so a prekey is +/// never reused across messages. Assignments are remembered per message ID so +/// deposit retries of the same message re-use its prekey (and its budget) +/// instead of burning a fresh one per courier. +/// +/// Only public key material lives here; it persists to disk so a sender can +/// prekey-seal for recipients met long ago. Included in the panic wipe. +final class PrekeyBundleStore { + struct StoredBundle: Codable { + let noiseKey: Data + var generatedAt: UInt64 + var prekeyIDs: [UInt32] + var prekeyPublicKeys: [Data] + /// IDs this device already sealed with (never reused). + var usedIDs: Set + /// messageID → prekey ID, so re-deposits of one message share one prekey. + var assignments: [String: UInt32] + var updatedAt: Date + } + + enum Limits { + static let maxPeers = 200 + /// Don't seal to bundles older than this: the owner may have rotated + /// the unconsumed keys out (see `LocalPrekeyStore.Policy`). + static let maxBundleAgeForSealingSeconds: TimeInterval = 7 * 24 * 60 * 60 + } + + static let shared = PrekeyBundleStore() + + private var bundles: [Data: StoredBundle] = [:] + private let queue = DispatchQueue(label: "chat.bitchat.prekeys.bundles") + private let fileURL: URL? + private let maxPeers: Int + private let now: () -> Date + + /// - Parameter fileURL: Overrides the on-disk location (tests). Ignored + /// when `persistsToDisk` is false. + init( + persistsToDisk: Bool = true, + fileURL: URL? = nil, + maxPeers: Int = Limits.maxPeers, + now: @escaping () -> Date = Date.init + ) { + self.now = now + self.maxPeers = maxPeers + self.fileURL = persistsToDisk ? (fileURL ?? Self.defaultFileURL()) : nil + loadFromDisk() + } + + // MARK: - Ingest + + /// Stores a bundle whose signature the caller has already verified + /// against the owner's announce-bound signing key. Returns false when an + /// equal-or-newer bundle is already cached (nothing changed). + @discardableResult + func ingest(_ bundle: PrekeyBundle) -> Bool { + guard bundle.noiseStaticPublicKey.count == PrekeyBundle.keyLength, + !bundle.prekeys.isEmpty else { return false } + return queue.sync { + if let existing = bundles[bundle.noiseStaticPublicKey], + existing.generatedAt >= bundle.generatedAt { + return false + } + let previous = bundles[bundle.noiseStaticPublicKey] + let newIDs = Set(bundle.prekeys.map(\.id)) + // Keep consumption state for IDs the fresh bundle still offers + // (a top-up keeps the owner's unconsumed keys); drop the rest. + let carriedUsed = (previous?.usedIDs ?? []).intersection(newIDs) + let carriedAssignments = (previous?.assignments ?? [:]).filter { newIDs.contains($0.value) } + bundles[bundle.noiseStaticPublicKey] = StoredBundle( + noiseKey: bundle.noiseStaticPublicKey, + generatedAt: bundle.generatedAt, + prekeyIDs: bundle.prekeys.map(\.id), + prekeyPublicKeys: bundle.prekeys.map(\.publicKey), + usedIDs: carriedUsed, + assignments: carriedAssignments, + updatedAt: now() + ) + enforceCapLocked() + persistLocked() + return true + } + } + + // MARK: - Sealing support + + /// Whether an unexpired bundle with sealable prekeys is cached for a peer. + func hasUsableBundle(for noiseKey: Data) -> Bool { + queue.sync { + guard let bundle = bundles[noiseKey], isFreshLocked(bundle) else { return false } + return bundle.usedIDs.count < bundle.prekeyIDs.count + } + } + + /// The prekey to seal a message with: the message's existing assignment if + /// any (re-deposits reuse it), else the lowest unused ID, which is then + /// marked used. Nil when no fresh bundle is cached or all its prekeys are + /// spent — callers fall back to static sealing. + func assignPrekey(messageID: String, recipientNoiseKey: Data) -> PrekeyBundle.Prekey? { + queue.sync { + guard var bundle = bundles[recipientNoiseKey], isFreshLocked(bundle) else { return nil } + + if let assigned = bundle.assignments[messageID], + let index = bundle.prekeyIDs.firstIndex(of: assigned) { + return PrekeyBundle.Prekey(id: assigned, publicKey: bundle.prekeyPublicKeys[index]) + } + + guard let index = bundle.prekeyIDs.indices + .filter({ !bundle.usedIDs.contains(bundle.prekeyIDs[$0]) }) + .min(by: { bundle.prekeyIDs[$0] < bundle.prekeyIDs[$1] }) else { + return nil + } + let id = bundle.prekeyIDs[index] + bundle.usedIDs.insert(id) + bundle.assignments[messageID] = id + bundle.updatedAt = now() + bundles[recipientNoiseKey] = bundle + persistLocked() + return PrekeyBundle.Prekey(id: id, publicKey: bundle.prekeyPublicKeys[index]) + } + } + + // MARK: - Maintenance + + /// Panic wipe: drop all cached bundles from memory and disk. + func wipe() { + queue.sync { + bundles.removeAll() + if let fileURL { + try? FileManager.default.removeItem(at: fileURL) + } + } + } + + // MARK: - Internals (call only on `queue`) + + private func isFreshLocked(_ bundle: StoredBundle) -> Bool { + let ageSeconds = now().timeIntervalSince1970 - Double(bundle.generatedAt) / 1000 + return ageSeconds <= Limits.maxBundleAgeForSealingSeconds + } + + private func enforceCapLocked() { + while bundles.count > maxPeers { + guard let victim = bundles.min(by: { $0.value.updatedAt < $1.value.updatedAt }) else { return } + bundles.removeValue(forKey: victim.key) + } + } + + private func persistLocked() { + guard let fileURL else { return } + do { + if bundles.isEmpty { + try? FileManager.default.removeItem(at: fileURL) + return + } + try FileManager.default.createDirectory( + at: fileURL.deletingLastPathComponent(), + withIntermediateDirectories: true + ) + let data = try JSONEncoder().encode(Array(bundles.values)) + var options: Data.WritingOptions = [.atomic] + #if os(iOS) + options.insert(.completeFileProtection) + #endif + try data.write(to: fileURL, options: options) + } catch { + SecureLogger.error("Failed to persist prekey bundle store: \(error)", category: .security) + } + } + + private func loadFromDisk() { + guard let fileURL else { return } + queue.sync { + guard let data = try? Data(contentsOf: fileURL), + let stored = try? JSONDecoder().decode([StoredBundle].self, from: data) else { + return + } + for bundle in stored where bundle.prekeyIDs.count == bundle.prekeyPublicKeys.count { + bundles[bundle.noiseKey] = bundle + } + } + } + + private static func defaultFileURL() -> URL? { + guard let base = try? FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) else { return nil } + return base + .appendingPathComponent("prekeys", isDirectory: true) + .appendingPathComponent("bundles.json") + } +} diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 31659710..07e11666 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -313,4 +313,16 @@ enum TransportConfig { // Cooldown between speculative multi-hop handovers of the same envelope // toward a recipient heard only via relayed announces. static let courierRemoteHandoverCooldownSeconds: TimeInterval = 10 * 60 + + // One-time prekey bundles (forward-secret courier sealing) + // Own gossip-sync round for bundles: modest cadence, bounded peer count, + // and a long freshness window so bundles persist mesh-wide while their + // owners are away. + static let syncPrekeyBundleCapacity: Int = 200 + static let syncPrekeyBundleIntervalSeconds: TimeInterval = 60.0 + static let syncPrekeyBundleMaxAgeSeconds: TimeInterval = 24 * 60 * 60 + // Unforced re-broadcasts of our own (unchanged) bundle, piggybacked on + // announces, keep it alive in peers' gossip stores; changed bundles are + // sent immediately. + static let prekeyBundleRebroadcastSeconds: TimeInterval = 60 * 60 } diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index 5edf1c4c..b0d72e47 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -83,6 +83,11 @@ final class GossipSyncManager { var boardSyncIntervalSeconds: TimeInterval = 60.0 var responseRateLimitMaxResponses: Int = 8 var responseRateLimitWindowSeconds: TimeInterval = 30.0 + // Prekey bundles: one per peer, own sync round, long freshness so + // bundles persist mesh-wide while their owners are offline. + var prekeyBundleCapacity: Int = 200 + var prekeyBundleSyncIntervalSeconds: TimeInterval = 60.0 + var prekeyBundleMaxAgeSeconds: TimeInterval = 24 * 60 * 60 } private let myPeerID: PeerID @@ -102,6 +107,10 @@ final class GossipSyncManager { private var fragments = PacketStore() private var fileTransfers = PacketStore() private var latestAnnouncementByPeer: [PeerID: BitchatPacket] = [:] + // Latest verified prekey bundle per owner. Unlike announces, bundles are + // NOT dropped on leave/stale peer: their whole purpose is reaching a + // sender while the owner is away. + private var latestPrekeyBundleByPeer: [PeerID: (id: String, packet: BitchatPacket)] = [:] private var archiveDirty = false // Timer @@ -130,6 +139,9 @@ final class GossipSyncManager { if config.fileTransferCapacity > 0 && config.fileTransferSyncIntervalSeconds > 0 { schedules.append(SyncSchedule(types: .fileTransfer, interval: config.fileTransferSyncIntervalSeconds, lastSent: .distantPast)) } + if config.prekeyBundleCapacity > 0 && config.prekeyBundleSyncIntervalSeconds > 0 { + schedules.append(SyncSchedule(types: .prekeyBundle, interval: config.prekeyBundleSyncIntervalSeconds, lastSent: .distantPast)) + } if config.boardCapacity > 0 && config.boardSyncIntervalSeconds > 0 { schedules.append(SyncSchedule(types: .board, interval: config.boardSyncIntervalSeconds, lastSent: .distantPast)) } @@ -169,6 +181,9 @@ final class GossipSyncManager { if self.config.fileTransferCapacity > 0 && self.config.fileTransferSyncIntervalSeconds > 0 { types.formUnion(.fileTransfer) } + if self.config.prekeyBundleCapacity > 0 && self.config.prekeyBundleSyncIntervalSeconds > 0 { + types.formUnion(.prekeyBundle) + } if self.config.boardCapacity > 0 && self.config.boardSyncIntervalSeconds > 0 && self.boardPacketsProvider != nil { types.formUnion(.board) } @@ -186,9 +201,15 @@ final class GossipSyncManager { // messages get the long town-crier window; fragments, file transfers and // announces keep the short one. private func isPacketFresh(_ packet: BitchatPacket) -> Bool { - let maxAgeSeconds = packet.type == MessageType.message.rawValue - ? config.publicMessageMaxAgeSeconds - : config.maxMessageAgeSeconds + let maxAgeSeconds: TimeInterval + switch packet.type { + case MessageType.message.rawValue: + maxAgeSeconds = config.publicMessageMaxAgeSeconds + case MessageType.prekeyBundle.rawValue: + maxAgeSeconds = config.prekeyBundleMaxAgeSeconds + default: + maxAgeSeconds = config.maxMessageAgeSeconds + } let nowMs = UInt64(Date().timeIntervalSince1970 * 1000) let ageThresholdMs = UInt64(maxAgeSeconds * 1000) @@ -241,6 +262,29 @@ final class GossipSyncManager { guard isPacketFresh(packet) else { return } let idHex = PacketIdUtil.computeId(packet).hexEncodedString() fileTransfers.insert(idHex: idHex, packet: packet, capacity: max(1, config.fileTransferCapacity)) + case .prekeyBundle: + // Callers only feed verified bundles here (own bundles at send + // time, peers' after signature verification), so gossip never + // spreads a bundle this node couldn't attribute. + guard isBroadcastRecipient else { return } + guard isPacketFresh(packet) else { return } + // Key by the bundle's authenticated identity (its noise static key), + // NOT the unauthenticated packet senderID. Otherwise one valid + // bundle re-broadcast under many fabricated sender IDs would create + // one cache entry each and exhaust the per-owner cap, starving + // legitimate bundles. One owner ⇒ at most one entry. + guard let bundle = PrekeyBundle.decode(packet.payload) else { return } + let owner = PeerID(publicKey: bundle.noiseStaticPublicKey) + if let existing = latestPrekeyBundleByPeer[owner], + existing.packet.timestamp >= packet.timestamp { + return + } + // Bounded owner count; replacing a known owner's bundle is always + // allowed so the cap can't block refreshes. + guard latestPrekeyBundleByPeer[owner] != nil + || latestPrekeyBundleByPeer.count < max(1, config.prekeyBundleCapacity) else { return } + let idHex = PacketIdUtil.computeId(packet).hexEncodedString() + latestPrekeyBundleByPeer[owner] = (id: idHex, packet: packet) default: break } @@ -410,6 +454,23 @@ final class GossipSyncManager { } } + // Like announces, prekey bundles are exempt from the since-cursor: + // there is at most one per owner (newer replaces older), so the + // resend cost is bounded and a joining peer must be able to learn + // bundles generated long before it arrived. + if requestedTypes.contains(.prekeyBundle) { + for (_, pair) in latestPrekeyBundleByPeer { + let (idHex, pkt) = pair + guard isPacketFresh(pkt) else { continue } + let idBytes = Data(hexString: idHex) ?? Data() + if !mightContain(idBytes) { + var toSend = pkt + toSend.ttl = 0 + toSend.isRSR = true // Mark as solicited response + delegate?.sendPacket(to: peerID, packet: toSend) + } + } + } if requestedTypes.contains(.boardPost) { // The board store already filters to live posts and tombstones; // no freshness window applies (posts sync until their own expiry). @@ -444,6 +505,11 @@ final class GossipSyncManager { if types.contains(.fileTransfer) { candidates.append(contentsOf: fileTransfers.allPackets(isFresh: isPacketFresh)) } + if types.contains(.prekeyBundle) { + for (_, pair) in latestPrekeyBundleByPeer where isPacketFresh(pair.packet) { + candidates.append(pair.packet) + } + } if types.contains(.boardPost) { candidates.append(contentsOf: boardPacketsProvider?() ?? []) } @@ -463,6 +529,8 @@ final class GossipSyncManager { cap = max(1, config.fragmentCapacity) } else if types == .fileTransfer { cap = max(1, config.fileTransferCapacity) + } else if types == .prekeyBundle { + cap = max(1, config.prekeyBundleCapacity) } else if types == .board { cap = max(1, config.boardCapacity) } else { @@ -506,6 +574,9 @@ final class GossipSyncManager { } fragments.removeExpired(isFresh: isPacketFresh) fileTransfers.removeExpired(isFresh: isPacketFresh) + latestPrekeyBundleByPeer = latestPrekeyBundleByPeer.filter { _, pair in + isPacketFresh(pair.packet) + } } // MARK: - Archive (public message persistence) @@ -596,6 +667,8 @@ final class GossipSyncManager { } private func removeState(for peerID: PeerID) { + // Deliberately keeps the peer's prekey bundle: bundles exist to reach + // owners who left the mesh, and they age out on their own schedule. _ = latestAnnouncementByPeer.removeValue(forKey: peerID) let messageCountBefore = messages.packets.count messages.remove { PeerID(hexData: $0.senderID) == peerID } @@ -621,6 +694,12 @@ extension GossipSyncManager { } } + func _hasPrekeyBundle(for peerID: PeerID) -> Bool { + queue.sync { + latestPrekeyBundleByPeer[peerID] != nil + } + } + func _messageCount(for peerID: PeerID) -> Int { queue.sync { messages.allPackets { _ in true }.filter { PeerID(hexData: $0.senderID) == peerID }.count diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index 3f455497..cb743ce1 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -47,6 +47,11 @@ struct SyncTypeFlags: OptionSet { // downlinks are rate-budgeted rebroadcasts); replaying them via sync // would waste airtime and extend their lifetime. case .nostrCarrier: return nil + // Prekey bundles gossip like board posts. The bitfield is a + // wire-tolerant little-endian UInt64 (1-8 bytes, unknown high bits + // ignored by `type(forBit:)`), so bits 8+ need no format change: old + // clients decode the wider flags and simply never match the new bits. + case .prekeyBundle: return 9 } } @@ -64,6 +69,7 @@ struct SyncTypeFlags: OptionSet { // type-aware sync (#853) accept 1-8 bytes and map unknown bits to no // known type, so old clients ignore board rounds instead of choking. case 8: return .boardPost + case 9: return .prekeyBundle default: return nil } @@ -74,6 +80,7 @@ struct SyncTypeFlags: OptionSet { static let fragment = SyncTypeFlags(messageTypes: [.fragment]) static let fileTransfer = SyncTypeFlags(messageTypes: [.fileTransfer]) static let board = SyncTypeFlags(messageTypes: [.boardPost]) + static let prekeyBundle = SyncTypeFlags(messageTypes: [.prekeyBundle]) static let publicMessages = SyncTypeFlags(messageTypes: [.announce, .message]) diff --git a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift index 281117f5..c5f19c44 100644 --- a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift @@ -292,6 +292,11 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { func clearCurrentPublicTimeline() { context.clearPublicConversation(ConversationID(channelID: context.activeChannel)) + // The SPM test process shares the real Application Support tree, so this + // detached deletion can land mid-test under parallel scheduling and flake + // a file-dependent test. Tests never need the on-disk media cleared. + guard !TestEnvironment.isRunningTests else { return } + Task.detached(priority: .utility) { // Skipped under tests: the test process shares the user's real // ~/Library/Application Support/files tree, and this detached diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 62b49da5..21e250f2 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1209,6 +1209,10 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele GossipMessageArchive.wipeDefault() StoreAndForwardMetrics.shared.reset() + // Drop cached peers' prekey bundles (who we could write to is + // metadata too). Our own prekey privates are keychain-backed and go + // with deleteAllKeychainData above plus the identity reset below. + PrekeyBundleStore.shared.wipe() // Drop bulletin-board posts and tombstones (memory and disk); board // posts are signed with our identity key and persist for days. BoardStore.shared.wipe() diff --git a/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift b/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift new file mode 100644 index 00000000..456932a7 --- /dev/null +++ b/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift @@ -0,0 +1,399 @@ +// +// PrekeyEndToEndTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import CoreBluetooth +import BitFoundation +@testable import bitchat + +/// Forward-secret courier flow through real BLEService instances: Bob gossips +/// a signed prekey bundle, Alice verifies and caches it, seals to a one-time +/// prekey instead of Bob's static key, Carol carries the opaque envelope, and +/// Bob opens it with the matching prekey private. +struct PrekeyEndToEndTests { + + // MARK: - Helpers + + private final class PacketTap { + private let lock = NSLock() + private var packets: [BitchatPacket] = [] + + func record(_ packet: BitchatPacket) { + lock.lock(); packets.append(packet); lock.unlock() + } + + func first(ofType type: MessageType) -> BitchatPacket? { + lock.lock(); defer { lock.unlock() } + return packets.first { $0.type == type.rawValue } + } + } + + private final class NoiseCaptureDelegate: BitchatDelegate { + private let lock = NSLock() + private var payloads: [(peerID: PeerID, type: NoisePayloadType, payload: Data)] = [] + + func didReceiveNoisePayload(from peerID: PeerID, type: NoisePayloadType, payload: Data, timestamp: Date) { + lock.lock(); payloads.append((peerID, type, payload)); lock.unlock() + } + + func snapshot() -> [(peerID: PeerID, type: NoisePayloadType, payload: Data)] { + lock.lock(); defer { lock.unlock() } + return payloads + } + + // Unused BitchatDelegate requirements. + func didReceiveMessage(_ message: BitchatMessage) {} + func didConnectToPeer(_ peerID: PeerID) {} + func didDisconnectFromPeer(_ peerID: PeerID) {} + func didUpdatePeerList(_ peers: [PeerID]) {} + func didUpdateBluetoothState(_ state: CBManagerState) {} + func didReceivePublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) {} + } + + private func makeService() -> BLEService { + let keychain = MockKeychain() + let service = BLEService( + keychain: keychain, + idBridge: NostrIdentityBridge(keychain: MockKeychainHelper()), + identityManager: MockIdentityManager(keychain), + initializeBluetoothManagers: false + ) + service.courierStore = CourierStore(persistsToDisk: false) + service.prekeyBundleStore = PrekeyBundleStore(persistsToDisk: false) + return service + } + + private func preseedConnectedPeer(_ peer: BLEService, in service: BLEService) { + let packet = BitchatPacket( + type: MessageType.message.rawValue, + senderID: Data(hexString: peer.myPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: Data("ping".utf8), + signature: nil, + ttl: 1 + ) + service._test_handlePacket(packet, fromPeerID: peer.myPeerID) + } + + /// Broadcast announce + prekey bundle from `peer` and return both packets. + private func captureAnnounceAndBundle(from peer: BLEService, tap: PacketTap) async throws -> (announce: BitchatPacket, bundle: BitchatPacket) { + peer.sendBroadcastAnnounce() + let published = await TestHelpers.waitUntil( + { tap.first(ofType: .announce) != nil && tap.first(ofType: .prekeyBundle) != nil }, + timeout: TestConstants.defaultTimeout + ) + #expect(published) + return ( + announce: try #require(tap.first(ofType: .announce)), + bundle: try #require(tap.first(ofType: .prekeyBundle)) + ) + } + + // MARK: - Tests + + @Test func prekeySealedMailTravelsViaCourierAndOpens() async throws { + let alice = makeService() + let carol = makeService() + let bob = makeService() + carol.courierDepositPolicy = { _, _ in .favorite } + + let bobDelegate = NoiseCaptureDelegate() + bob.delegate = bobDelegate + + let aliceOut = PacketTap() + alice._test_onOutboundPacket = aliceOut.record + let carolOut = PacketTap() + carol._test_onOutboundPacket = carolOut.record + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + preseedConnectedPeer(carol, in: alice) + + // 1. While Bob is still around, Alice hears his verified announce + // (binding his signing key) and his gossiped prekey bundle. + let (announce, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(announce, fromPeerID: bob.myPeerID, preseedPeer: false) + alice._test_handlePacket(bundlePacket, fromPeerID: bob.myPeerID, preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.defaultTimeout + ) + #expect(cached) + + // 2. Bob goes dark; Alice seals for him and deposits with Carol. + // The envelope must be v2: sealed to a one-time prekey. + #expect(alice.sendCourierMessage( + "burn after reading", + messageID: "prekey-msg-1", + recipientNoiseKey: bob.noiseStaticPublicKeyData(), + via: [carol.myPeerID] + )) + let deposited = await TestHelpers.waitUntil( + { aliceOut.first(ofType: .courierEnvelope) != nil }, + timeout: TestConstants.defaultTimeout + ) + #expect(deposited) + let depositPacket = try #require(aliceOut.first(ofType: .courierEnvelope)) + let sealedEnvelope = try #require(CourierEnvelope.decode(depositPacket.payload)) + #expect(sealedEnvelope.prekeyID != nil) + + // 3. Carol carries it (opaque, prekey or not). + carol._test_handlePacket(depositPacket, fromPeerID: alice.myPeerID, signingPublicKey: alice.noiseSigningPublicKeyData()) + let carried = await TestHelpers.waitUntil( + { !carol.courierStore.isEmpty }, + timeout: TestConstants.defaultTimeout + ) + #expect(carried) + + // 4. Bob resurfaces near Carol → handover, and the v2 discriminator + // survives the store round-trip. + bob.sendBroadcastAnnounce() + let reannounced = await TestHelpers.waitUntil( + { bobOut.first(ofType: .announce) != nil }, + timeout: TestConstants.defaultTimeout + ) + #expect(reannounced) + let handoverTrigger = try #require(bobOut.first(ofType: .announce)) + carol._test_handlePacket(handoverTrigger, fromPeerID: bob.myPeerID, preseedPeer: false) + + let handedOver = await TestHelpers.waitUntil( + { carolOut.first(ofType: .courierEnvelope) != nil }, + timeout: TestConstants.defaultTimeout + ) + #expect(handedOver) + let handoverPacket = try #require(carolOut.first(ofType: .courierEnvelope)) + let handedEnvelope = try #require(CourierEnvelope.decode(handoverPacket.payload)) + #expect(handedEnvelope.prekeyID == sealedEnvelope.prekeyID) + + // 5. Bob opens it with the matching one-time prekey private and sees + // Alice as the authenticated sender. + bob._test_handlePacket(handoverPacket, fromPeerID: carol.myPeerID) + let received = await TestHelpers.waitUntil( + { !bobDelegate.snapshot().isEmpty }, + timeout: TestConstants.defaultTimeout + ) + #expect(received) + + let delivered = try #require(bobDelegate.snapshot().first) + #expect(delivered.type == .privateMessage) + #expect(delivered.peerID == PeerID(hexData: alice.noiseStaticPublicKeyData())) + let message = try #require(PrivateMessagePacket.decode(from: delivered.payload)) + #expect(message.messageID == "prekey-msg-1") + #expect(message.content == "burn after reading") + + // 6. Redelivery tolerance: the same envelope arriving via another + // packet (spray-and-wait) still opens inside the grace window. + let redelivery = BitchatPacket( + type: MessageType.courierEnvelope.rawValue, + senderID: Data(hexString: carol.myPeerID.id) ?? Data(), + recipientID: handoverPacket.recipientID, + timestamp: handoverPacket.timestamp + 1, + payload: handoverPacket.payload, + signature: nil, + ttl: 1 + ) + bob._test_handlePacket(redelivery, fromPeerID: carol.myPeerID) + let redelivered = await TestHelpers.waitUntil( + { bobDelegate.snapshot().count == 2 }, + timeout: TestConstants.defaultTimeout + ) + #expect(redelivered) + } + + @Test func withoutBundleSealingFallsBackToStatic() async throws { + let alice = makeService() + let bob = makeService() + + let bobDelegate = NoiseCaptureDelegate() + bob.delegate = bobDelegate + let aliceOut = PacketTap() + alice._test_onOutboundPacket = aliceOut.record + + // Bob is a connected "courier" who happens to be the recipient: the + // envelope reaches him directly and the recipient tag matches. + preseedConnectedPeer(bob, in: alice) + + // Alice never saw a bundle for Bob → v1 static-sealed envelope. + #expect(alice.sendCourierMessage( + "plain static seal", + messageID: "static-msg-1", + recipientNoiseKey: bob.noiseStaticPublicKeyData(), + via: [bob.myPeerID] + )) + let deposited = await TestHelpers.waitUntil( + { aliceOut.first(ofType: .courierEnvelope) != nil }, + timeout: TestConstants.defaultTimeout + ) + #expect(deposited) + let depositPacket = try #require(aliceOut.first(ofType: .courierEnvelope)) + let envelope = try #require(CourierEnvelope.decode(depositPacket.payload)) + #expect(envelope.prekeyID == nil) + + // Bob opens the v1 envelope exactly as before the prekey change. + // (No preseed: Alice is absent from Bob's mesh, so the sender should + // resolve to her full noise-key ID like the courier case.) + bob._test_handlePacket(depositPacket, fromPeerID: alice.myPeerID, preseedPeer: false) + let received = await TestHelpers.waitUntil( + { !bobDelegate.snapshot().isEmpty }, + timeout: TestConstants.defaultTimeout + ) + #expect(received) + let delivered = try #require(bobDelegate.snapshot().first) + #expect(delivered.peerID == PeerID(hexData: alice.noiseStaticPublicKeyData())) + let message = try #require(PrivateMessagePacket.decode(from: delivered.payload)) + #expect(message.content == "plain static seal") + } + + @Test func unverifiableBundleIsIgnored() async throws { + let alice = makeService() + let bob = makeService() + + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + // Alice receives Bob's bundle but never saw a verified announce, so + // no signing key is bound to his noise key: the bundle must not be + // cached or enter Alice's gossip store. + let (_, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(bundlePacket, fromPeerID: bob.myPeerID, preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.shortTimeout + ) + #expect(!cached) + } + + @Test func forgedBundleSignatureIsRejected() async throws { + let alice = makeService() + let bob = makeService() + + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + let (announce, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(announce, fromPeerID: bob.myPeerID, preseedPeer: false) + + // Mallory tampers with the gossiped bundle in flight. + let bundle = try #require(PrekeyBundle.decode(bundlePacket.payload)) + var forgedSignature = bundle.signature + forgedSignature[0] ^= 0x01 + let forged = PrekeyBundle( + noiseStaticPublicKey: bundle.noiseStaticPublicKey, + prekeys: bundle.prekeys, + generatedAt: bundle.generatedAt, + signature: forgedSignature + ) + let forgedPacket = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: bundlePacket.senderID, + recipientID: nil, + timestamp: bundlePacket.timestamp, + payload: try #require(forged.encode()), + signature: bundlePacket.signature, + ttl: bundlePacket.ttl + ) + alice._test_handlePacket(forgedPacket, fromPeerID: bob.myPeerID, preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.shortTimeout + ) + #expect(!cached) + } + + @Test func verifiedBundleEntersGossipStore() async throws { + let alice = makeService() + let bob = makeService() + + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + let (announce, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(announce, fromPeerID: bob.myPeerID, preseedPeer: false) + alice._test_handlePacket(bundlePacket, fromPeerID: bob.myPeerID, preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.defaultTimeout + ) + #expect(cached) + // The verified bundle now participates in Alice's sync rounds. + #expect(alice._test_hasGossipPrekeyBundle(for: bob.myPeerID)) + } + + @Test func spoofedSenderPrekeyBundleIsRejected() async throws { + let alice = makeService() + let bob = makeService() + + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + let (announce, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(announce, fromPeerID: bob.myPeerID, preseedPeer: false) + + // A relay re-broadcasts Bob's genuine bundle under a fabricated sender + // ID (the DoS that would multiply cache/gossip entries and exhaust the + // per-owner cap). Attribution is by the bundle's own key and the outer + // signature is bound to Bob's sender ID, so the spoof is dropped — no + // cache entry, and no gossip entry under either the fake or real ID. + let fakeSender = Data((0..<8).map { _ in UInt8.random(in: 0...255) }) + let spoofed = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: fakeSender, + recipientID: nil, + timestamp: bundlePacket.timestamp + 5_000, + payload: bundlePacket.payload, + signature: bundlePacket.signature, + ttl: bundlePacket.ttl + ) + alice._test_handlePacket(spoofed, fromPeerID: PeerID(hexData: fakeSender), preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.shortTimeout + ) + #expect(!cached) + #expect(!alice._test_hasGossipPrekeyBundle(for: bob.myPeerID)) + #expect(!alice._test_hasGossipPrekeyBundle(for: PeerID(hexData: fakeSender))) + } + + @Test func replayedPrekeyBundleWithFreshTimestampIsRejected() async throws { + let alice = makeService() + let bob = makeService() + + let bobOut = PacketTap() + bob._test_onOutboundPacket = bobOut.record + + let (announce, bundlePacket) = try await captureAnnounceAndBundle(from: bob, tap: bobOut) + alice._test_handlePacket(announce, fromPeerID: bob.myPeerID, preseedPeer: false) + + // Rewriting the outer timestamp (to defeat the freshness window) + // invalidates the packet signature, which covers senderID + timestamp. + let replay = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: bundlePacket.senderID, + recipientID: nil, + timestamp: bundlePacket.timestamp + 5_000, + payload: bundlePacket.payload, + signature: bundlePacket.signature, + ttl: bundlePacket.ttl + ) + alice._test_handlePacket(replay, fromPeerID: bob.myPeerID, preseedPeer: false) + + let cached = await TestHelpers.waitUntil( + { alice.prekeyBundleStore.hasUsableBundle(for: bob.noiseStaticPublicKeyData()) }, + timeout: TestConstants.shortTimeout + ) + #expect(!cached) + #expect(!alice._test_hasGossipPrekeyBundle(for: bob.myPeerID)) + } +} diff --git a/bitchatTests/GossipSyncManagerTests.swift b/bitchatTests/GossipSyncManagerTests.swift index 81516543..5f15e377 100644 --- a/bitchatTests/GossipSyncManagerTests.swift +++ b/bitchatTests/GossipSyncManagerTests.swift @@ -139,6 +139,7 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 1 config.fragmentSyncIntervalSeconds = 1 config.fileTransferSyncIntervalSeconds = 1 + config.prekeyBundleSyncIntervalSeconds = 1 config.maintenanceIntervalSeconds = 0 let requestSyncManager = RequestSyncManager() @@ -195,19 +196,22 @@ struct GossipSyncManagerTests { manager._performMaintenanceSynchronously(now: Date()) // One request per due schedule so each type group gets the full - // filter capacity: publicMessages, fragment, and fileTransfer. + // filter capacity: publicMessages, fragment, fileTransfer, and + // prekeyBundle. let sentPackets = delegate.packets - #expect(sentPackets.count == 3) + #expect(sentPackets.count == 4) let decoded = sentPackets.compactMap { RequestSyncPacket.decode(from: $0.payload) } - #expect(decoded.count == 3) + #expect(decoded.count == 4) let allTypes = decoded.compactMap(\.types).reduce(SyncTypeFlags(rawValue: 0)) { $0.union($1) } #expect(allTypes.contains(.announce)) #expect(allTypes.contains(.message)) #expect(allTypes.contains(.fragment)) #expect(allTypes.contains(.fileTransfer)) + #expect(allTypes.contains(.prekeyBundle)) #expect(decoded.contains { $0.types == .publicMessages }) #expect(decoded.contains { $0.types == .fragment }) #expect(decoded.contains { $0.types == .fileTransfer }) + #expect(decoded.contains { $0.types == .prekeyBundle }) } @Test func truncatedFilterCarriesSinceCursor() throws { @@ -292,6 +296,7 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 0 config.fragmentSyncIntervalSeconds = 0 config.fileTransferSyncIntervalSeconds = 0 + config.prekeyBundleSyncIntervalSeconds = 0 let requestSyncManager = RequestSyncManager() let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) @@ -362,6 +367,7 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 0 config.fragmentSyncIntervalSeconds = 0 config.fileTransferSyncIntervalSeconds = 0 + config.prekeyBundleSyncIntervalSeconds = 0 let requestSyncManager = RequestSyncManager() let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) @@ -401,6 +407,7 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 0 config.fragmentSyncIntervalSeconds = 0 config.fileTransferSyncIntervalSeconds = 0 + config.prekeyBundleSyncIntervalSeconds = 0 config.responseRateLimitMaxResponses = 1 config.responseRateLimitWindowSeconds = 60 @@ -455,6 +462,7 @@ struct GossipSyncManagerTests { #expect(types.contains(.message)) #expect(types.contains(.fragment)) #expect(types.contains(.fileTransfer)) + #expect(types.contains(.prekeyBundle)) } @Test func handleRequestSyncHonorsTypeFilter() async throws { @@ -533,6 +541,7 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 0 config.fragmentSyncIntervalSeconds = 0 config.fileTransferSyncIntervalSeconds = 0 + config.prekeyBundleSyncIntervalSeconds = 0 let requestSyncManager = RequestSyncManager() let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) @@ -579,7 +588,6 @@ struct GossipSyncManagerTests { config.messageSyncIntervalSeconds = 0 config.fragmentSyncIntervalSeconds = 0 config.fileTransferSyncIntervalSeconds = 0 - let requestSyncManager = RequestSyncManager() let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: requestSyncManager) let delegate = RecordingDelegate() @@ -599,6 +607,93 @@ struct GossipSyncManagerTests { #expect(ids == Set([stalledID])) } + @Test func prekeyBundlesServeSyncAndSurviveStalePeerCleanup() async throws { + var config = GossipSyncManager.Config() + config.messageSyncIntervalSeconds = 0 + config.fragmentSyncIntervalSeconds = 0 + config.fileTransferSyncIntervalSeconds = 0 + config.prekeyBundleSyncIntervalSeconds = 0 + config.stalePeerCleanupIntervalSeconds = 0 + config.stalePeerTimeoutSeconds = 5 + + let manager = GossipSyncManager(myPeerID: myPeerID, config: config, requestSyncManager: RequestSyncManager()) + let delegate = RecordingDelegate() + manager.delegate = delegate + + // Bundles are keyed by their authenticated identity (the noise static + // key), not the packet senderID, so the payload must be a real bundle. + let noiseKey = Data(repeating: 0xAB, count: 32) + let senderPeer = PeerID(publicKey: noiseKey) + let sender = try #require(Data(hexString: senderPeer.id)) + let bundle = PrekeyBundle( + noiseStaticPublicKey: noiseKey, + prekeys: [PrekeyBundle.Prekey(id: 0, publicKey: Data(repeating: 0x11, count: 32))], + generatedAt: UInt64(Date().timeIntervalSince1970 * 1000), + signature: Data(count: PrekeyBundle.signatureLength) + ) + let bundlePacket = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: sender, + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: try #require(bundle.encode()), + signature: nil, + ttl: 1 + ) + manager.onPublicPacketSeen(bundlePacket) + manager._performMaintenanceSynchronously(now: Date()) + #expect(manager._hasPrekeyBundle(for: senderPeer)) + + // Bundles outlive the owner's announce: a leave plus stale cleanup + // must not drop them (they exist to reach offline owners). + manager.removeAnnouncementForPeer(senderPeer) + manager._performMaintenanceSynchronously(now: Date().addingTimeInterval(config.stalePeerTimeoutSeconds + 1)) + #expect(manager._hasPrekeyBundle(for: senderPeer)) + + // And a .prekeyBundle sync request is answered with the stored packet. + let request = RequestSyncPacket(p: 7, m: 1, data: Data(), types: .prekeyBundle) + manager.handleRequestSync(from: PeerID(str: "FFFFFFFFFFFFFFFF"), request: request) + try await TestHelpers.waitFor({ delegate.packets.count == 1 }, timeout: TestConstants.shortTimeout) + let served = try #require(delegate.packets.first) + #expect(served.type == MessageType.prekeyBundle.rawValue) + #expect(served.isRSR) + } + + @Test func prekeyBundleGossipIsKeyedByOwnerNotSenderID() { + // One valid bundle re-broadcast under many fabricated sender IDs must + // collapse to a single entry keyed by the bundle's own identity — the + // spray-to-exhaust-the-cap DoS produces one entry, not N. + let manager = GossipSyncManager(myPeerID: myPeerID, requestSyncManager: RequestSyncManager()) + let noiseKey = Data(repeating: 0xCD, count: 32) + let ownerPeer = PeerID(publicKey: noiseKey) + let bundle = PrekeyBundle( + noiseStaticPublicKey: noiseKey, + prekeys: [PrekeyBundle.Prekey(id: 0, publicKey: Data(repeating: 0x22, count: 32))], + generatedAt: UInt64(Date().timeIntervalSince1970 * 1000), + signature: Data(count: PrekeyBundle.signatureLength) + ) + guard let payload = bundle.encode() else { return } + + for i in 0..<5 { + let fakeSender = Data((0..<8).map { j in UInt8(truncatingIfNeeded: i * 31 + j) }) + let packet = BitchatPacket( + type: MessageType.prekeyBundle.rawValue, + senderID: fakeSender, + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000) + UInt64(i), + payload: payload, + signature: nil, + ttl: 1 + ) + manager.onPublicPacketSeen(packet) + manager._performMaintenanceSynchronously(now: Date()) + // No fabricated sender ID ever creates its own entry. + #expect(!manager._hasPrekeyBundle(for: PeerID(hexData: fakeSender))) + } + // Exactly the owner-keyed entry exists. + #expect(manager._hasPrekeyBundle(for: ownerPeer)) + } + // MARK: - Archive persistence @Test func publicMessagesRestoreFromArchiveAcrossRestart() async throws { diff --git a/bitchatTests/Prekeys/NoisePrekeyTests.swift b/bitchatTests/Prekeys/NoisePrekeyTests.swift new file mode 100644 index 00000000..44a39d11 --- /dev/null +++ b/bitchatTests/Prekeys/NoisePrekeyTests.swift @@ -0,0 +1,283 @@ +// +// NoisePrekeyTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import CryptoKit +import BitFoundation +@testable import bitchat + +/// Forward-secret one-way Noise X envelopes sealed to one-time prekeys +/// instead of the recipient's identity static key. +struct NoisePrekeyTests { + + @Test func sealAndOpenRoundTrip() throws { + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + + let payload = Data("meet at the north gate".utf8) + let sealed = try alice.sealPrekeyPayload(payload, recipientPrekey: prekey) + + let opened = try bob.openPrekeyPayload(sealed, prekeyID: prekey.id) + #expect(opened.payload == payload) + // The X pattern authenticates the sender: Bob learns Alice's real static key. + #expect(opened.senderStaticKey == alice.getStaticPublicKeyData()) + } + + @Test func wrongPrekeyIDCannotOpen() throws { + // The prologue binds the ciphertext to a specific prekey ID; opening + // with a different (existing) prekey must fail. + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + #expect(bundle.prekeys.count >= 2) + + let sealed = try alice.sealPrekeyPayload(Data("secret".utf8), recipientPrekey: bundle.prekeys[0]) + #expect(throws: (any Error).self) { + _ = try bob.openPrekeyPayload(sealed, prekeyID: bundle.prekeys[1].id) + } + } + + @Test func unknownPrekeyIDThrows() throws { + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + + let sealed = try alice.sealPrekeyPayload(Data("secret".utf8), recipientPrekey: prekey) + #expect(throws: NoiseEncryptionError.unknownPrekey) { + _ = try bob.openPrekeyPayload(sealed, prekeyID: 0xDEAD_BEEF) + } + } + + @Test func wrongRecipientCannotOpen() throws { + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let carol = NoiseEncryptionService(keychain: MockKeychain()) + let bobBundle = try #require(bob.currentPrekeyBundle()) + // Ensure Carol holds a prekey under the same ID as Bob's. + _ = try #require(carol.currentPrekeyBundle()) + let prekey = try #require(bobBundle.prekeys.first) + + let sealed = try alice.sealPrekeyPayload(Data("secret".utf8), recipientPrekey: prekey) + #expect(throws: (any Error).self) { + _ = try carol.openPrekeyPayload(sealed, prekeyID: prekey.id) + } + } + + @Test func tamperedCiphertextFailsToOpen() throws { + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + + var sealed = try alice.sealPrekeyPayload(Data("secret".utf8), recipientPrekey: prekey) + sealed[sealed.count - 1] ^= 0x01 + #expect(throws: (any Error).self) { + _ = try bob.openPrekeyPayload(sealed, prekeyID: prekey.id) + } + } + + @Test func consumedPrekeyStillOpensRedeliveredCiphertext() throws { + // Spray-and-wait can deliver the same ciphertext via several couriers + // days apart; the consumed private survives a grace window for that. + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + + let sealed = try alice.sealPrekeyPayload(Data("hello".utf8), recipientPrekey: prekey) + let first = try bob.openPrekeyPayload(sealed, prekeyID: prekey.id) + let second = try bob.openPrekeyPayload(sealed, prekeyID: prekey.id) + #expect(first.payload == second.payload) + } + + @Test func prekeyAndStaticSealsAreNotInterchangeable() throws { + // Domain-separated prologues: a static-sealed envelope must not open + // via the prekey path and vice versa, even with matching key material. + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + + let staticSealed = try alice.sealCourierPayload(Data("x".utf8), recipientStaticKey: bob.getStaticPublicKeyData()) + #expect(throws: (any Error).self) { + _ = try bob.openPrekeyPayload(staticSealed, prekeyID: prekey.id) + } + + let prekeySealed = try alice.sealPrekeyPayload(Data("x".utf8), recipientPrekey: prekey) + #expect(throws: (any Error).self) { + _ = try bob.openCourierPayload(prekeySealed) + } + } + + @Test func sealRejectsInvalidPrekeyPublicKey() { + let alice = NoiseEncryptionService(keychain: MockKeychain()) + #expect(throws: (any Error).self) { + _ = try alice.sealPrekeyPayload(Data("x".utf8), recipientPrekey: PrekeyBundle.Prekey(id: 1, publicKey: Data(repeating: 0, count: 32))) + } + #expect(throws: (any Error).self) { + _ = try alice.sealPrekeyPayload(Data("x".utf8), recipientPrekey: PrekeyBundle.Prekey(id: 1, publicKey: Data(repeating: 1, count: 8))) + } + } + + @Test func sealsAreNotLinkableAcrossSends() throws { + // Fresh ephemeral per seal even to the same prekey. + let alice = NoiseEncryptionService(keychain: MockKeychain()) + let bob = NoiseEncryptionService(keychain: MockKeychain()) + let bundle = try #require(bob.currentPrekeyBundle()) + let prekey = try #require(bundle.prekeys.first) + let payload = Data("same message".utf8) + + let a = try alice.sealPrekeyPayload(payload, recipientPrekey: prekey) + let b = try alice.sealPrekeyPayload(payload, recipientPrekey: prekey) + #expect(a != b) + #expect(a.prefix(32) != b.prefix(32)) + } +} + +/// Local one-time prekey lifecycle: batch generation, consumption, the 48h +/// redelivery grace window, replenishment, and the panic wipe. +struct LocalPrekeyStoreTests { + + private final class Clock { + var now: Date + init(_ now: Date = Date()) { self.now = now } + } + + private func makeStore(clock: Clock, keychain: MockKeychain = MockKeychain()) -> LocalPrekeyStore { + LocalPrekeyStore(keychain: keychain, now: { clock.now }) + } + + private func bundle(noiseKey: Data, prekeys: [PrekeyBundle.Prekey], generatedAt: UInt64) -> PrekeyBundle { + PrekeyBundle( + noiseStaticPublicKey: noiseKey, + prekeys: prekeys, + generatedAt: generatedAt, + signature: Data(count: PrekeyBundle.signatureLength) + ) + } + + @Test func mintsFullBatchOnFirstUse() { + let store = makeStore(clock: Clock()) + let (prekeys, generatedAt) = store.currentBundlePrekeys() + #expect(prekeys.count == LocalPrekeyStore.Policy.batchSize) + #expect(generatedAt > 0) + #expect(Set(prekeys.map(\.id)).count == prekeys.count) + } + + @Test func consumptionBelowThresholdTriggersReplenishAndBumpsGeneration() { + let clock = Clock() + let store = makeStore(clock: clock) + let (initial, firstGeneratedAt) = store.currentBundlePrekeys() + + // Consuming down to the threshold does not regenerate... + let keepUnconsumed = LocalPrekeyStore.Policy.replenishThreshold + for prekey in initial.dropLast(keepUnconsumed) { + store.markConsumed(prekey.id) + } + #expect(!store.replenishIfNeeded()) + #expect(store.unconsumedCount == keepUnconsumed) + + // ...one more consumption does, topping back up to a full batch with + // a newer generation stamp. + clock.now = clock.now.addingTimeInterval(60) + store.markConsumed(initial[initial.count - keepUnconsumed].id) + #expect(store.replenishIfNeeded()) + let (replenished, secondGeneratedAt) = store.currentBundlePrekeys() + #expect(replenished.count == LocalPrekeyStore.Policy.batchSize) + #expect(secondGeneratedAt > firstGeneratedAt) + // Surviving unconsumed prekeys stay in the fresh bundle. + let survivorIDs = Set(initial.suffix(keepUnconsumed - 1).map(\.id)) + #expect(survivorIDs.isSubset(of: Set(replenished.map(\.id)))) + } + + @Test func consumingAPrekeyRepublishesANewerBundlePeersAccept() { + // Codex P1: consuming a prekey (even above the replenish threshold) + // must republish a strictly newer bundle so a peer that cached the old + // one replaces it and stops assigning the consumed ID before its 48h + // grace lapses. + let clock = Clock() + let store = makeStore(clock: clock) + let noiseKey = Data(repeating: 0xC0, count: 32) + + // Owner publishes; a peer caches it and would assign the first prekey. + let (initial, firstGeneratedAt) = store.currentBundlePrekeys() + let peerCache = PrekeyBundleStore(persistsToDisk: false) + #expect(peerCache.ingest(bundle(noiseKey: noiseKey, prekeys: initial, generatedAt: firstGeneratedAt))) + let consumedID = initial[0].id + #expect(peerCache.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey)?.id == consumedID) + + // The owner opens mail sealed to that prekey: it's retired and the + // republished bundle is strictly newer and no longer offers the ID. + #expect(store.markConsumed(consumedID)) + let (afterConsume, secondGeneratedAt) = store.currentBundlePrekeys() + #expect(secondGeneratedAt > firstGeneratedAt) + #expect(!afterConsume.contains { $0.id == consumedID }) + + // The peer accepts the replacement (a same-generatedAt copy would be + // rejected) and stops assigning the consumed ID for new mail. + #expect(peerCache.ingest(bundle(noiseKey: noiseKey, prekeys: afterConsume, generatedAt: secondGeneratedAt))) + #expect(peerCache.assignPrekey(messageID: "m2", recipientNoiseKey: noiseKey)?.id != consumedID) + + // 48h grace: the owner can still open a redelivery of the in-flight + // ciphertext sealed to the consumed ID until the window lapses. + clock.now = clock.now.addingTimeInterval(LocalPrekeyStore.Policy.consumedGraceSeconds - 60) + #expect(store.privateKey(for: consumedID) != nil) + clock.now = clock.now.addingTimeInterval(120) + #expect(store.privateKey(for: consumedID) == nil) + } + + @Test func consumedPrivateSurvivesGraceWindowThenDies() { + let clock = Clock() + let store = makeStore(clock: clock) + let (prekeys, _) = store.currentBundlePrekeys() + let id = prekeys[0].id + + store.markConsumed(id) + // Within the grace window: still retrievable for redeliveries. + clock.now = clock.now.addingTimeInterval(LocalPrekeyStore.Policy.consumedGraceSeconds - 60) + #expect(store.privateKey(for: id) != nil) + + // Past the grace window: gone (even before replenish prunes it). + clock.now = clock.now.addingTimeInterval(120) + #expect(store.privateKey(for: id) == nil) + store.replenishIfNeeded() + #expect(store.privateKey(for: id) == nil) + } + + @Test func persistsAcrossInstances() { + let keychain = MockKeychain() + let clock = Clock() + let first = LocalPrekeyStore(keychain: keychain, now: { clock.now }) + let (prekeys, generatedAt) = first.currentBundlePrekeys() + first.markConsumed(prekeys[0].id) + + let second = LocalPrekeyStore(keychain: keychain, now: { clock.now }) + let (reloaded, reloadedGeneratedAt) = second.currentBundlePrekeys() + // Consuming a prekey shrinks the published bundle, so its generation + // stamp advances strictly (even without the clock moving) — peers must + // see a newer bundle to replace the one that still offered the + // consumed ID. + #expect(reloadedGeneratedAt > generatedAt) + #expect(Set(reloaded.map(\.id)) == Set(prekeys.dropFirst().map(\.id))) + // The consumed key is still openable within grace after a relaunch. + #expect(second.privateKey(for: prekeys[0].id) != nil) + } + + @Test func wipeRemovesEverything() { + let keychain = MockKeychain() + let store = LocalPrekeyStore(keychain: keychain) + let (prekeys, _) = store.currentBundlePrekeys() + store.wipe() + #expect(store.privateKey(for: prekeys[0].id) == nil) + #expect(keychain.getIdentityKey(forKey: "prekeysV1") == nil) + } +} diff --git a/bitchatTests/Prekeys/PrekeyBundleStoreTests.swift b/bitchatTests/Prekeys/PrekeyBundleStoreTests.swift new file mode 100644 index 00000000..319757f0 --- /dev/null +++ b/bitchatTests/Prekeys/PrekeyBundleStoreTests.swift @@ -0,0 +1,197 @@ +// +// PrekeyBundleStoreTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import CryptoKit +import BitFoundation +@testable import bitchat + +/// Sender-side cache of peers' verified prekey bundles: latest-wins ingest, +/// per-message prekey assignment (never reused across messages), expiry, and +/// the peer cap. +struct PrekeyBundleStoreTests { + + private func makeBundle( + noiseKey: Data = Curve25519.KeyAgreement.PrivateKey().publicKey.rawRepresentation, + ids: [UInt32] = [0, 1, 2], + generatedAt: UInt64 = UInt64(Date().timeIntervalSince1970 * 1000) + ) -> PrekeyBundle { + PrekeyBundle( + noiseStaticPublicKey: noiseKey, + prekeys: ids.map { PrekeyBundle.Prekey(id: $0, publicKey: Curve25519.KeyAgreement.PrivateKey().publicKey.rawRepresentation) }, + generatedAt: generatedAt, + signature: Data(count: PrekeyBundle.signatureLength) + ) + } + + @Test func ingestKeepsLatestByGeneratedAt() { + let store = PrekeyBundleStore(persistsToDisk: false) + let noiseKey = Data(repeating: 0xB0, count: 32) + let nowMs = UInt64(Date().timeIntervalSince1970 * 1000) + + let old = makeBundle(noiseKey: noiseKey, ids: [0, 1], generatedAt: nowMs - 1000) + let new = makeBundle(noiseKey: noiseKey, ids: [2, 3], generatedAt: nowMs) + + #expect(store.ingest(new)) + // Older (and equal) bundles never displace a newer one. + #expect(!store.ingest(old)) + #expect(!store.ingest(new)) + + let assigned = store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey) + #expect(assigned?.id == 2) + } + + @Test func assignmentsConsumeDistinctPrekeysPerMessage() { + let store = PrekeyBundleStore(persistsToDisk: false) + let noiseKey = Data(repeating: 0xB1, count: 32) + #expect(store.ingest(makeBundle(noiseKey: noiseKey, ids: [10, 11]))) + + let first = store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey) + let second = store.assignPrekey(messageID: "m2", recipientNoiseKey: noiseKey) + #expect(first?.id == 10) + #expect(second?.id == 11) + // Exhausted: fall back to static sealing. + #expect(store.assignPrekey(messageID: "m3", recipientNoiseKey: noiseKey) == nil) + #expect(!store.hasUsableBundle(for: noiseKey)) + } + + @Test func redepositOfSameMessageReusesItsPrekey() { + let store = PrekeyBundleStore(persistsToDisk: false) + let noiseKey = Data(repeating: 0xB2, count: 32) + #expect(store.ingest(makeBundle(noiseKey: noiseKey, ids: [5, 6, 7]))) + + let first = store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey) + let retry = store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey) + #expect(first?.id == retry?.id) + #expect(first?.publicKey == retry?.publicKey) + // Only one prekey was burned. + let next = store.assignPrekey(messageID: "m2", recipientNoiseKey: noiseKey) + #expect(next?.id == 6) + } + + @Test func topUpBundleKeepsConsumptionStateForSurvivingIDs() { + let store = PrekeyBundleStore(persistsToDisk: false) + let noiseKey = Data(repeating: 0xB3, count: 32) + let nowMs = UInt64(Date().timeIntervalSince1970 * 1000) + #expect(store.ingest(makeBundle(noiseKey: noiseKey, ids: [0, 1], generatedAt: nowMs - 1000))) + #expect(store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey)?.id == 0) + + // The owner topped up: ID 1 survives (still unconsumed on their side), + // ID 0 rotated out, new IDs appear. + #expect(store.ingest(makeBundle(noiseKey: noiseKey, ids: [1, 8, 9], generatedAt: nowMs))) + // m1's assignment referenced a rotated-out ID; a re-deposit picks a + // fresh one rather than sealing to a dead key. + #expect(store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey)?.id == 1) + #expect(store.assignPrekey(messageID: "m2", recipientNoiseKey: noiseKey)?.id == 8) + } + + @Test func expiredBundleIsNeverUsed() { + var current = Date() + let store = PrekeyBundleStore(persistsToDisk: false, now: { current }) + let noiseKey = Data(repeating: 0xB4, count: 32) + #expect(store.ingest(makeBundle(noiseKey: noiseKey, generatedAt: UInt64(current.timeIntervalSince1970 * 1000)))) + #expect(store.hasUsableBundle(for: noiseKey)) + + current = current.addingTimeInterval(PrekeyBundleStore.Limits.maxBundleAgeForSealingSeconds + 60) + #expect(!store.hasUsableBundle(for: noiseKey)) + #expect(store.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey) == nil) + } + + @Test func peerCapEvictsLeastRecentlyUpdated() { + var current = Date() + let store = PrekeyBundleStore(persistsToDisk: false, maxPeers: 2, now: { current }) + let keys = (0..<3).map { Data(repeating: UInt8(0xC0 + $0), count: 32) } + + for key in keys { + #expect(store.ingest(makeBundle(noiseKey: key, generatedAt: UInt64(current.timeIntervalSince1970 * 1000)))) + current = current.addingTimeInterval(1) + } + // Oldest entry evicted; the two most recent survive. + #expect(!store.hasUsableBundle(for: keys[0])) + #expect(store.hasUsableBundle(for: keys[1])) + #expect(store.hasUsableBundle(for: keys[2])) + } + + @Test func persistsAcrossInstancesAndWipes() throws { + let dir = FileManager.default.temporaryDirectory + .appendingPathComponent("prekey-bundle-store-tests-\(UUID().uuidString)", isDirectory: true) + let fileURL = dir.appendingPathComponent("bundles.json") + defer { try? FileManager.default.removeItem(at: dir) } + + let noiseKey = Data(repeating: 0xB5, count: 32) + let first = PrekeyBundleStore(fileURL: fileURL) + #expect(first.ingest(makeBundle(noiseKey: noiseKey, ids: [1, 2]))) + #expect(first.assignPrekey(messageID: "m1", recipientNoiseKey: noiseKey)?.id == 1) + + // Consumption state survives a relaunch, so a restart can't reuse a prekey. + let second = PrekeyBundleStore(fileURL: fileURL) + #expect(second.assignPrekey(messageID: "m2", recipientNoiseKey: noiseKey)?.id == 2) + + second.wipe() + #expect(!FileManager.default.fileExists(atPath: fileURL.path)) + let third = PrekeyBundleStore(fileURL: fileURL) + #expect(!third.hasUsableBundle(for: noiseKey)) + } +} + +/// Envelope v2 wire compatibility: the prekey ID rides an optional TLV that +/// v1 decoders skip as unknown. +struct CourierEnvelopeV2Tests { + + @Test func prekeyIDRoundTrips() throws { + let envelope = CourierEnvelope( + recipientTag: Data(repeating: 0x11, count: CourierEnvelope.tagLength), + expiry: UInt64(Date().timeIntervalSince1970 * 1000) + 60_000, + ciphertext: Data("ciphertext".utf8), + copies: 4, + prekeyID: 0xAABB_CCDD + ) + let encoded = try #require(envelope.encode()) + let decoded = try #require(CourierEnvelope.decode(encoded)) + #expect(decoded == envelope) + #expect(decoded.prekeyID == 0xAABB_CCDD) + } + + @Test func v1EnvelopeDecodesWithNilPrekeyID() throws { + let envelope = CourierEnvelope( + recipientTag: Data(repeating: 0x22, count: CourierEnvelope.tagLength), + expiry: UInt64(Date().timeIntervalSince1970 * 1000) + 60_000, + ciphertext: Data("legacy".utf8) + ) + let encoded = try #require(envelope.encode()) + let decoded = try #require(CourierEnvelope.decode(encoded)) + #expect(decoded.prekeyID == nil) + } + + @Test func v1EncodingIsByteIdenticalWithoutPrekeyID() throws { + // Static-sealed envelopes must stay on the pre-prekey wire format. + let tag = Data(repeating: 0x33, count: CourierEnvelope.tagLength) + let expiry: UInt64 = 1_800_000_000_000 + let ciphertext = Data("same".utf8) + let v1 = try #require(CourierEnvelope(recipientTag: tag, expiry: expiry, ciphertext: ciphertext).encode()) + let v1Explicit = try #require(CourierEnvelope(recipientTag: tag, expiry: expiry, ciphertext: ciphertext, prekeyID: nil).encode()) + #expect(v1 == v1Explicit) + // And a v2 envelope is the v1 bytes plus one trailing TLV a v1 + // decoder skips as unknown. + let v2 = try #require(CourierEnvelope(recipientTag: tag, expiry: expiry, ciphertext: ciphertext, prekeyID: 7).encode()) + #expect(v2.prefix(v1.count) == v1) + #expect(v2.count == v1.count + 3 + 4) + } + + @Test func withCopiesPreservesPrekeyID() { + let envelope = CourierEnvelope( + recipientTag: Data(repeating: 0x44, count: CourierEnvelope.tagLength), + expiry: 1, + ciphertext: Data([0x01]), + copies: 4, + prekeyID: 9 + ) + #expect(envelope.withCopies(2).prekeyID == 9) + } +} diff --git a/bitchatTests/Prekeys/PrekeyBundleTests.swift b/bitchatTests/Prekeys/PrekeyBundleTests.swift new file mode 100644 index 00000000..8d9b212b --- /dev/null +++ b/bitchatTests/Prekeys/PrekeyBundleTests.swift @@ -0,0 +1,133 @@ +// +// PrekeyBundleTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import CryptoKit +import BitFoundation +@testable import bitchat + +/// Wire format and signature binding for gossiped one-time prekey bundles. +struct PrekeyBundleTests { + + private func makePrekeys(_ count: Int) -> [PrekeyBundle.Prekey] { + (0.. CourierEnvelope { - CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies) + CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies, prekeyID: prekeyID) } public var isExpired: Bool { @@ -97,6 +106,14 @@ public struct CourierEnvelope: Equatable { encoded.append(copies) } + // Omitted for v1 static-sealed envelopes so they stay byte-identical + // to the pre-prekey wire format. + if let prekeyID { + encoded.append(TLVType.prekeyID.rawValue) + appendBE(UInt16(4), into: &encoded) + appendBE(prekeyID, into: &encoded) + } + return encoded } @@ -108,6 +125,7 @@ public struct CourierEnvelope: Equatable { var expiry: UInt64? var ciphertext: Data? var copies: UInt8 = 1 + var prekeyID: UInt32? while cursor < end { let typeRaw = data[cursor] @@ -133,6 +151,9 @@ public struct CourierEnvelope: Equatable { case .copies: guard length == 1 else { return nil } copies = value.first ?? 1 + case .prekeyID: + guard length == 4 else { return nil } + prekeyID = value.reduce(UInt32(0)) { ($0 << 8) | UInt32($1) } case nil: // Unknown TLV: skip for forward compatibility. continue @@ -140,7 +161,7 @@ public struct CourierEnvelope: Equatable { } guard let recipientTag, let expiry, let ciphertext else { return nil } - return CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies) + return CourierEnvelope(recipientTag: recipientTag, expiry: expiry, ciphertext: ciphertext, copies: copies, prekeyID: prekeyID) } // MARK: - Recipient Tags diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index 763abaa7..47f46b85 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -16,15 +16,16 @@ public enum MessageType: UInt8 { case leave = 0x03 // "I'm leaving" case courierEnvelope = 0x04 // Store-and-forward envelope carried by a trusted peer case requestSync = 0x21 // GCS filter-based sync request (local-only) - + // Noise encryption case noiseHandshake = 0x10 // Handshake (init or response determined by payload) case noiseEncrypted = 0x11 // All encrypted payloads (messages, receipts, etc.) - + // Fragmentation (simplified) case fragment = 0x20 // Single fragment type for large messages case fileTransfer = 0x22 // Binary file/audio/image payloads case boardPost = 0x23 // Signed geohash bulletin-board post or tombstone + case prekeyBundle = 0x24 // Signed batch of one-time prekeys (gossiped) // Mesh diagnostics case ping = 0x26 // Directed echo request (nonce + origin TTL) @@ -46,6 +47,7 @@ public enum MessageType: UInt8 { case .fragment: return "fragment" case .fileTransfer: return "fileTransfer" case .boardPost: return "boardPost" + case .prekeyBundle: return "prekeyBundle" case .ping: return "ping" case .pong: return "pong" case .nostrCarrier: return "nostrCarrier" diff --git a/localPackages/BitFoundation/Sources/BitFoundation/PrekeyBundle.swift b/localPackages/BitFoundation/Sources/BitFoundation/PrekeyBundle.swift new file mode 100644 index 00000000..0e73a2c0 --- /dev/null +++ b/localPackages/BitFoundation/Sources/BitFoundation/PrekeyBundle.swift @@ -0,0 +1,195 @@ +// +// PrekeyBundle.swift +// BitFoundation +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation + +/// TLV payload for gossiped one-time prekey bundles (MessageType 0x24). +/// +/// A bundle publishes a batch of one-time Curve25519 public prekeys bound to +/// the owner's Noise static key by an Ed25519 signature over domain-prefixed +/// canonical bytes. Anyone holding the owner's announce-verified signing key +/// can verify a bundle offline, which is what lets bundles spread and persist +/// mesh-wide via gossip sync while the owner is away. Senders seal courier +/// mail to one of these prekeys (one-way Noise X) instead of the owner's +/// long-lived static key, restoring forward secrecy for async first contact. +public struct PrekeyBundle: Equatable { + public struct Prekey: Equatable { + public let id: UInt32 + /// Curve25519.KeyAgreement public key (32 bytes). + public let publicKey: Data + + public init(id: UInt32, publicKey: Data) { + self.id = id + self.publicKey = publicKey + } + } + + /// Noise static public key identifying whose prekeys these are (32 bytes). + public let noiseStaticPublicKey: Data + /// One-time prekeys, at most `maxPrekeys` per bundle. + public let prekeys: [Prekey] + /// Milliseconds since epoch when this bundle was generated; newer bundles + /// replace older ones for the same noise key. + public let generatedAt: UInt64 + /// Ed25519 signature over `signableBytes()` by the owner's announce-bound + /// signing key. + public let signature: Data + + public static let keyLength = 32 + public static let signatureLength = 64 + public static let maxPrekeys = 8 + private static let prekeyEntryLength = 4 + keyLength + + /// Domain separation for the bundle signature so it can never be confused + /// with announce or packet signatures. + private static let signingContext = Data("bitchat-prekey-bundle-v1".utf8) + + private enum TLVType: UInt8 { + case noiseStaticPublicKey = 0x01 + case prekeys = 0x02 + case generatedAt = 0x03 + case signature = 0x04 + } + + public init(noiseStaticPublicKey: Data, prekeys: [Prekey], generatedAt: UInt64, signature: Data) { + self.noiseStaticPublicKey = noiseStaticPublicKey + self.prekeys = prekeys + self.generatedAt = generatedAt + self.signature = signature + } + + /// Canonical bytes covered by the Ed25519 signature: domain context, + /// owner key, prekey count, each (id, key) pair, and the generation time. + /// Encoders and verifiers must derive these identically. + public func signableBytes() -> Data { + var out = Data() + out.reserveCapacity(1 + Self.signingContext.count + Self.keyLength + 1 + + prekeys.count * Self.prekeyEntryLength + 8) + out.append(UInt8(min(Self.signingContext.count, 255))) + out.append(Self.signingContext.prefix(255)) + out.append(paddedKey(noiseStaticPublicKey)) + out.append(UInt8(min(prekeys.count, 255))) + for prekey in prekeys.prefix(255) { + appendBE(prekey.id, into: &out) + out.append(paddedKey(prekey.publicKey)) + } + appendBE(generatedAt, into: &out) + return out + } + + public func encode() -> Data? { + guard noiseStaticPublicKey.count == Self.keyLength, + signature.count == Self.signatureLength, + !prekeys.isEmpty, prekeys.count <= Self.maxPrekeys, + prekeys.allSatisfy({ $0.publicKey.count == Self.keyLength }) else { + return nil + } + + var entries = Data() + entries.reserveCapacity(prekeys.count * Self.prekeyEntryLength) + for prekey in prekeys { + appendBE(prekey.id, into: &entries) + entries.append(prekey.publicKey) + } + + var encoded = Data() + encoded.reserveCapacity(4 * 3 + Self.keyLength + entries.count + 8 + Self.signatureLength) + + encoded.append(TLVType.noiseStaticPublicKey.rawValue) + appendBE(UInt16(noiseStaticPublicKey.count), into: &encoded) + encoded.append(noiseStaticPublicKey) + + encoded.append(TLVType.prekeys.rawValue) + appendBE(UInt16(entries.count), into: &encoded) + encoded.append(entries) + + encoded.append(TLVType.generatedAt.rawValue) + appendBE(UInt16(8), into: &encoded) + appendBE(generatedAt, into: &encoded) + + encoded.append(TLVType.signature.rawValue) + appendBE(UInt16(signature.count), into: &encoded) + encoded.append(signature) + + return encoded + } + + public static func decode(_ data: Data) -> PrekeyBundle? { + var cursor = data.startIndex + let end = data.endIndex + + var noiseStaticPublicKey: Data? + var prekeys: [Prekey]? + var generatedAt: UInt64? + var signature: Data? + + while cursor < end { + let typeRaw = data[cursor] + cursor = data.index(after: cursor) + + guard data.distance(from: cursor, to: end) >= 2 else { return nil } + let length = Int(data[cursor]) << 8 | Int(data[data.index(after: cursor)]) + cursor = data.index(cursor, offsetBy: 2) + guard data.distance(from: cursor, to: end) >= length else { return nil } + let value = data[cursor.. 0, length % prekeyEntryLength == 0, + length / prekeyEntryLength <= maxPrekeys else { return nil } + var parsed: [Prekey] = [] + var entryStart = value.startIndex + while entryStart < value.endIndex { + let idEnd = value.index(entryStart, offsetBy: 4) + let id = value[entryStart.. Data { + let fixed = key.prefix(Self.keyLength) + guard fixed.count < Self.keyLength else { return Data(fixed) } + return Data(fixed) + Data(repeating: 0, count: Self.keyLength - fixed.count) + } +} + +private func appendBE(_ value: T, into data: inout Data) { + var big = value.bigEndian + withUnsafeBytes(of: &big) { data.append(contentsOf: $0) } +} From 81a10f73f099e4c131992d4b4afde5dc0a2f8804 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:59:55 +0200 Subject: [PATCH 040/158] Private groups: creator-managed encrypted group chat over the mesh (#1383) * Add capability bits to announce TLV Announces now carry an optional capabilities TLV (0x05): a little-endian bitfield with named bits for upcoming features (prekeys, wifiBulk, gateway, groups, board, vouch, meshDiagnostics). Old clients skip the unknown TLV; peers without it decode as nil so features can distinguish "legacy peer" from "advertises nothing". PeerCapabilities lives in BitFoundation with a minimal-length encoding that preserves unknown bits for forward compatibility. Peer capabilities are stored in the BLE peer registry on verified announce and exposed via BLEService.peerCapabilities(_:). The local advertisement set is empty until each feature ships its bit. Co-Authored-By: Claude Fable 5 * Private groups: creator-managed encrypted group chat over the mesh Small encrypted crews (hard cap 16) between public broadcast and 1:1 DMs: Protocol - MessageType.groupMessage = 0x25: broadcast packets with a cleartext 16-byte group ID + epoch, ChaCha20-Poly1305 ciphertext (epoch bound as AEAD AAD), inner Ed25519 sender signature over "bitchat-group-msg-v1"|groupID|messageID|timestamp|content - NoisePayloadType.groupInvite = 0x06 / .groupKeyUpdate = 0x07: creator-signed group state (key, epoch, roster) 1:1 over Noise; signature over "bitchat-group-v1"|groupID|epoch|key-hash|roster-hash and the Noise session peer must BE the creator - SyncTypeFlags bit 10 (groupMessage): variable-length LE bitfield widens 1 -> 2 bytes inside the length-prefixed REQUEST_SYNC TLV; old clients ignore unknown bits and answer with types they know - PeerCapabilities.localSupported now advertises .groups Storage - GroupStore: symmetric keys in the keychain, roster/name/epoch as protected JSON in Application Support; wiped in panicClearAllData() Behavior - Non-members relay 0x25 like any broadcast but cannot read it; group messages join gossip-sync backfill with the public-message window - Receivers drop wrong-epoch envelopes, bad sender signatures, and senders missing from the creator-signed roster - Fire-and-flood delivery (no per-member acks in v1) UI - Groups open as chat windows through the private-chat sheet (virtual "group_" peer IDs); groups section in the people sheet; /group create/invite/remove/leave/list commands; invitees get a system message + notification and the group appears in their people sheet Co-Authored-By: Claude Fable 5 * Private groups: fix TLV truncation, roster downgrade, removal notice, block, media, signable bytes Addresses the Codex review and adversarial-review findings on #1383: - TLV encoding now throws GroupTLVError.valueTooLong instead of clamping to 65535 and truncating, so an oversize group message fails to seal and surfaces send_failed rather than shipping ciphertext recipients drop. - Roster nicknames truncate on a Character boundary (never mid-scalar), so a multi-byte nickname can no longer make the whole signed roster undecodable. - Invites now bump the epoch (rotate the key) like removals, giving every roster change a strictly-increasing epoch so out-of-order invite states no longer last-writer-wins a just-added member back out. - Removing a member now sends them a creator-signed roster-without-them under a throwaway all-zero key (never the rotated key), so their client deactivates the group and surfaces "removed" instead of going silently dark. - /block is enforced in the group receive path: a blocked member's messages are dropped from display and notifications, consistent with every other inbound path. - Media affordances are disabled in group chats (both computed sites) so the composer can't strand a media placeholder that never sends; media-in-groups is a documented v2 item. - Creator signature now covers the group name and the sender signature covers the epoch (wire-format-affecting; needs Android parity before ship). - Explicit isGroup guard in markPrivateMessagesAsRead so read/delivered receipts can never leak into group conversations under a future refactor. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/ConversationUIModel.swift | 4 +- bitchat/App/PeerListModel.swift | 36 ++ bitchat/App/PrivateConversationModels.swift | 35 +- bitchat/Localizable.xcstrings | 385 +++++++++++ bitchat/Models/CommandInfo.swift | 10 +- bitchat/Protocols/BitchatProtocol.swift | 12 + .../Protocols/PeerCapabilities+Local.swift | 2 +- .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEService.swift | 65 ++ bitchat/Services/CommandProcessor.swift | 41 ++ bitchat/Services/Groups/GroupProtocol.swift | 569 +++++++++++++++++ bitchat/Services/Groups/GroupStore.swift | 194 ++++++ bitchat/Services/Transport.swift | 14 + bitchat/Sync/GossipSyncManager.swift | 42 +- bitchat/Sync/SyncTypeFlags.swift | 9 + bitchat/ViewModels/ChatGroupCoordinator.swift | 602 ++++++++++++++++++ .../ViewModels/ChatLifecycleCoordinator.swift | 7 + .../ChatPeerIdentityCoordinator.swift | 9 + .../ChatTransportEventCoordinator.swift | 18 + bitchat/ViewModels/ChatViewModel.swift | 16 +- .../ChatViewModel+PrivateChat.swift | 6 + bitchat/ViewModels/NostrInboundPipeline.swift | 12 +- bitchat/Views/ContentSheetViews.swift | 62 +- bitchat/Views/GroupChatList.swift | 86 +++ ...ransportEventCoordinatorContextTests.swift | 12 + bitchatTests/CommandProcessorTests.swift | 28 + bitchatTests/GossipSyncManagerTests.swift | 5 +- .../Services/GroupProtocolTests.swift | 374 +++++++++++ bitchatTests/Services/GroupStoreTests.swift | 170 +++++ .../Services/MeshDiagnosticsTests.swift | 5 + .../Sync/SyncTypeFlagsBoardTests.swift | 14 +- .../Sync/SyncTypeFlagsGroupTests.swift | 62 ++ bitchatTests/Sync/SyncTypeFlagsTests.swift | 18 +- .../Sources/BitFoundation/MessageType.swift | 2 + .../Sources/BitFoundation/PeerID.swift | 24 + 35 files changed, 2903 insertions(+), 49 deletions(-) create mode 100644 bitchat/Services/Groups/GroupProtocol.swift create mode 100644 bitchat/Services/Groups/GroupStore.swift create mode 100644 bitchat/ViewModels/ChatGroupCoordinator.swift create mode 100644 bitchat/Views/GroupChatList.swift create mode 100644 bitchatTests/Services/GroupProtocolTests.swift create mode 100644 bitchatTests/Services/GroupStoreTests.swift create mode 100644 bitchatTests/Sync/SyncTypeFlagsGroupTests.swift diff --git a/bitchat/App/ConversationUIModel.swift b/bitchat/App/ConversationUIModel.swift index 461449cc..f8633e0d 100644 --- a/bitchat/App/ConversationUIModel.swift +++ b/bitchat/App/ConversationUIModel.swift @@ -193,7 +193,9 @@ final class ConversationUIModel: ObservableObject { private func refreshComputedState() { if let selectedPeerID = privateConversationModel.selectedPeerID { - canSendMediaInCurrentContext = !(selectedPeerID.isGeoDM || selectedPeerID.isGeoChat) + // Media transfer is not wired for groups in v1; keep it off so the + // composer can't strand a media placeholder that never sends. + canSendMediaInCurrentContext = !(selectedPeerID.isGeoDM || selectedPeerID.isGeoChat || selectedPeerID.isGroup) return } diff --git a/bitchat/App/PeerListModel.swift b/bitchat/App/PeerListModel.swift index 1846b487..b96c2e72 100644 --- a/bitchat/App/PeerListModel.swift +++ b/bitchat/App/PeerListModel.swift @@ -29,11 +29,22 @@ struct GeohashPersonRow: Identifiable, Equatable { let isBlocked: Bool } +struct GroupChatRow: Identifiable, Equatable { + let peerID: PeerID + let name: String + let memberCount: Int + let isCreator: Bool + let hasUnread: Bool + + var id: String { peerID.id } +} + @MainActor final class PeerListModel: ObservableObject { @Published private(set) var allPeers: [BitchatPeer] = [] @Published private(set) var meshRows: [MeshPeerRow] = [] @Published private(set) var geohashPeople: [GeohashPersonRow] = [] + @Published private(set) var groupRows: [GroupChatRow] = [] @Published private(set) var reachableMeshPeerCount = 0 @Published private(set) var connectedMeshPeerCount = 0 @Published private(set) var visibleGeohashPeerCount = 0 @@ -132,6 +143,13 @@ final class PeerListModel: ObservableObject { } .store(in: &cancellables) + chatViewModel.groupStore.$groups + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.refresh() + } + .store(in: &cancellables) + peerIdentityStore.$encryptionStatuses .receive(on: DispatchQueue.main) .sink { [weak self] _ in @@ -220,22 +238,40 @@ final class PeerListModel: ObservableObject { } let geohashPeople = buildGeohashPeople() + let groupRows = buildGroupRows() self.meshRows = meshRows reachableMeshPeerCount = meshCounts.reachable connectedMeshPeerCount = meshCounts.connected self.geohashPeople = geohashPeople visibleGeohashPeerCount = geohashPeople.count + self.groupRows = groupRows renderID = ( meshRows.map { "\($0.id)-\($0.isConnected)-\($0.isReachable)-\($0.hasUnread)-\($0.isFavorite)-\($0.isBlocked)" } + geohashPeople.map { "geo:\($0.id)-\($0.isTeleported)-\($0.isBlocked)-\($0.displayName)" + } + + groupRows.map { + "group:\($0.id)-\($0.name)-\($0.memberCount)-\($0.hasUnread)" } ).joined(separator: "|") } + private func buildGroupRows() -> [GroupChatRow] { + let myFingerprint = chatViewModel.meshService.noiseIdentityFingerprint() + return chatViewModel.groupStore.groups.map { group in + GroupChatRow( + peerID: group.peerID, + name: group.name, + memberCount: group.members.count, + isCreator: group.creatorFingerprint == myFingerprint, + hasUnread: chatViewModel.hasUnreadMessages(for: group.peerID) + ) + } + } + private func buildGeohashPeople() -> [GeohashPersonRow] { let myHex = currentGeohashIdentityHex() let teleportedSet = Set(locationPresenceStore.teleportedGeo.map { $0.lowercased() }) diff --git a/bitchat/App/PrivateConversationModels.swift b/bitchat/App/PrivateConversationModels.swift index 2a465948..d9920646 100644 --- a/bitchat/App/PrivateConversationModels.swift +++ b/bitchat/App/PrivateConversationModels.swift @@ -108,7 +108,13 @@ struct PrivateConversationHeaderState: Equatable { let encryptionStatus: EncryptionStatus? var supportsFavoriteToggle: Bool { - !conversationPeerID.isGeoDM + !conversationPeerID.isGeoDM && !conversationPeerID.isGroup + } + + /// Group chats have no single peer identity behind the header: no + /// fingerprint screen, no per-peer encryption badge. + var isGroupConversation: Bool { + conversationPeerID.isGroup } } @@ -206,6 +212,13 @@ final class PrivateConversationModel: ObservableObject { } .store(in: &cancellables) + chatViewModel.groupStore.$groups + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + self?.refreshSelectedConversation() + } + .store(in: &cancellables) + NotificationCenter.default.publisher(for: Notification.Name("peerStatusUpdated")) .receive(on: DispatchQueue.main) .sink { [weak self] _ in @@ -229,6 +242,26 @@ final class PrivateConversationModel: ObservableObject { } private func makeHeaderState(for conversationPeerID: PeerID) -> PrivateConversationHeaderState { + // Group chats: the "peer" is the whole crew. Name + member count in + // the header; availability reads as mesh since group traffic floods + // the local mesh, and the per-peer encryption badge does not apply. + if conversationPeerID.isGroup { + let displayName: String + if let group = chatViewModel.groupStore.group(for: conversationPeerID) { + displayName = "#\(group.name) (\(group.members.count))" + } else { + displayName = String(localized: "common.unknown", comment: "Fallback label for unknown peer") + } + return PrivateConversationHeaderState( + conversationPeerID: conversationPeerID, + headerPeerID: conversationPeerID, + displayName: displayName, + availability: .meshReachable, + isFavorite: false, + encryptionStatus: nil + ) + } + let headerPeerID = chatViewModel.getShortIDForNoiseKey(conversationPeerID) let peer = chatViewModel.getPeer(byID: headerPeerID) let displayName = resolveDisplayName(for: conversationPeerID, headerPeerID: headerPeerID, peer: peer) diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 49e5487e..f7979b8d 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -9408,6 +9408,17 @@ } } }, + "content.accessibility.group_chat" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Group chat" + } + } + } + }, "content.accessibility.jump_to_latest" : { "comment" : "Accessibility label for the jump to latest messages button", "extractionState" : "manual", @@ -15115,6 +15126,17 @@ } } }, + "content.commands.group" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "create or manage private groups" + } + } + } + }, "content.commands.help" : { "comment" : "Description of the /help command in the suggestions panel", "extractionState" : "manual", @@ -18338,6 +18360,17 @@ } } }, + "content.input.group_placeholder" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "create|invite|leave|list" + } + } + } + }, "content.input.placeholder.location" : { "comment" : "Composer placeholder for a public geohash channel, naming it", "extractionState" : "manual", @@ -20069,6 +20102,17 @@ } } }, + "content.private.caption_group" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "encrypted group · members only" + } + } + } + }, "encryption.accessibility.establishing" : { "extractionState" : "manual", "localizations" : { @@ -24626,6 +24670,50 @@ } } }, + "groups.accessibility.open_group_hint" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opens the group chat" + } + } + } + }, + "groups.member_count %@" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "(%@)" + } + } + } + }, + "groups.section.header" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups" + } + } + } + }, + "groups.state.creator" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Creator" + } + } + } + }, "location_channels.accessibility.add_bookmark" : { "comment" : "Accessibility action name for bookmarking a channel", "extractionState" : "manual", @@ -34155,6 +34243,303 @@ } } }, + "system.group.already_member" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a member" + } + } + } + }, + "system.group.cannot_remove_creator" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "the creator cannot be removed" + } + } + } + }, + "system.group.create_failed" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not create the group" + } + } + } + }, + "system.group.created" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "created group '%@' — use /group invite @name to add people" + } + } + } + }, + "system.group.creator_only" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "only the group creator can do that" + } + } + } + }, + "system.group.full" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "group is full (max %@ members)" + } + } + } + }, + "system.group.identity_unavailable" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "your identity keys are not ready yet" + } + } + } + }, + "system.group.invite_failed" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not build the group invite" + } + } + } + }, + "system.group.invited" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "invited %1$@ to '%2$@'" + } + } + } + }, + "system.group.joined" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you were added to group '%1$@' by %2$@ — it now appears in your people list" + } + } + } + }, + "system.group.left" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "left group '%@'" + } + } + } + }, + "system.group.list_header" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "your groups:" + } + } + } + }, + "system.group.member_not_found" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' is not a member of this group" + } + } + } + }, + "system.group.name_too_long" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "group names are limited to 40 characters" + } + } + } + }, + "system.group.none" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you are not in any groups — /group create to start one" + } + } + } + }, + "system.group.not_in_group" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "open a group chat first" + } + } + } + }, + "system.group.peer_identity_unknown" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot verify %@'s identity yet — wait for their announce" + } + } + } + }, + "system.group.peer_not_connected" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ must be connected over mesh to be invited" + } + } + } + }, + "system.group.peer_not_found" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + } + } + }, + "system.group.removed_from" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you were removed from group '%@'" + } + } + } + }, + "system.group.removed_member" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ and rotated the group key" + } + } + } + }, + "system.group.rotate_failed" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not rotate the group key" + } + } + } + }, + "system.group.send_failed" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not encrypt the message" + } + } + } + }, + "system.group.unknown" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you are no longer in this group" + } + } + } + }, + "system.group.usage_create" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create " + } + } + } + }, + "system.group.usage_invite" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group invite @name" + } + } + } + }, + "system.group.usage_remove" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group remove @name" + } + } + } + }, "system.location.not_in_channel" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Models/CommandInfo.swift b/bitchat/Models/CommandInfo.swift index bb0a0a65..b4f309d9 100644 --- a/bitchat/Models/CommandInfo.swift +++ b/bitchat/Models/CommandInfo.swift @@ -16,6 +16,7 @@ enum CommandInfo: String, Identifiable { // suggesting a spelling the processor rejects teaches users dead ends. case block case clear + case group case help case hug case message = "msg" @@ -36,6 +37,8 @@ enum CommandInfo: String, Identifiable { switch self { case .block, .hug, .message, .slap, .unblock, .favorite, .unfavorite, .ping, .trace: return "<" + String(localized: "content.input.nickname_placeholder") + ">" + case .group: + return "<" + String(localized: "content.input.group_placeholder") + ">" case .pay: return "<" + String(localized: "content.input.token_placeholder") + ">" case .clear, .help, .who: @@ -47,6 +50,7 @@ enum CommandInfo: String, Identifiable { switch self { case .block: String(localized: "content.commands.block") case .clear: String(localized: "content.commands.clear") + case .group: String(localized: "content.commands.group") case .help: String(localized: "content.commands.help") case .hug: String(localized: "content.commands.hug") case .message: String(localized: "content.commands.message") @@ -70,11 +74,11 @@ enum CommandInfo: String, Identifiable { if !isGeoPublic { commands.append(.pay) } - // The processor rejects favorites and mesh diagnostics in geohash - // contexts, so only suggest them where they actually work: mesh. + // The processor rejects favorites, groups, and mesh diagnostics in + // geohash contexts, so only suggest them where they work: mesh. if isGeoPublic || isGeoDM { return commands } - return commands + [.favorite, .unfavorite, .ping, .trace] + return commands + [.favorite, .unfavorite, .ping, .trace, .group] } } diff --git a/bitchat/Protocols/BitchatProtocol.swift b/bitchat/Protocols/BitchatProtocol.swift index c7497051..476ae876 100644 --- a/bitchat/Protocols/BitchatProtocol.swift +++ b/bitchat/Protocols/BitchatProtocol.swift @@ -74,6 +74,9 @@ enum NoisePayloadType: UInt8 { case privateMessage = 0x01 // Private chat message case readReceipt = 0x02 // Message was read case delivered = 0x03 // Message was delivered + // Private groups (0x04/0x05 reserved by other features) + case groupInvite = 0x06 // Creator-signed group state (invite) + case groupKeyUpdate = 0x07 // Creator-signed group state (key rotation / roster update) // Verification (QR-based OOB binding) case verifyChallenge = 0x10 // Verification challenge case verifyResponse = 0x11 // Verification response @@ -85,6 +88,8 @@ enum NoisePayloadType: UInt8 { case .privateMessage: return "privateMessage" case .readReceipt: return "readReceipt" case .delivered: return "delivered" + case .groupInvite: return "groupInvite" + case .groupKeyUpdate: return "groupKeyUpdate" case .verifyChallenge: return "verifyChallenge" case .verifyResponse: return "verifyResponse" case .vouch: return "vouch" @@ -119,6 +124,9 @@ protocol BitchatDelegate: AnyObject { // Low-level events for better separation of concerns func didReceiveNoisePayload(from peerID: PeerID, type: NoisePayloadType, payload: Data, timestamp: Date) + // Encrypted group broadcast (opaque envelope; decrypted by the group coordinator) + func didReceiveGroupMessage(payload: Data, timestamp: Date) + // Bluetooth state updates for user notifications func didUpdateBluetoothState(_ state: CBManagerState) func didReceivePublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) @@ -138,6 +146,10 @@ extension BitchatDelegate { // Default empty implementation } + func didReceiveGroupMessage(payload: Data, timestamp: Date) { + // Default empty implementation + } + func didReceivePublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) { // Default empty implementation } diff --git a/bitchat/Protocols/PeerCapabilities+Local.swift b/bitchat/Protocols/PeerCapabilities+Local.swift index b5c36f1a..819464b9 100644 --- a/bitchat/Protocols/PeerCapabilities+Local.swift +++ b/bitchat/Protocols/PeerCapabilities+Local.swift @@ -3,5 +3,5 @@ import BitFoundation extension PeerCapabilities { /// Capabilities this build advertises in its announce packets. /// Each feature adds its bit here when it ships. - static let localSupported: PeerCapabilities = [.vouch, .prekeys] + static let localSupported: PeerCapabilities = [.vouch, .prekeys, .groups] } diff --git a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift index 2bec6292..64cfa73e 100644 --- a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift +++ b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift @@ -12,7 +12,7 @@ enum BLEOutboundPacketPolicy { switch MessageType(rawValue: packetType) { case .noiseEncrypted, .noiseHandshake: return true - case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .boardPost, .ping, .pong, .nostrCarrier, .prekeyBundle: + case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .boardPost, .ping, .pong, .nostrCarrier, .prekeyBundle, .groupMessage: return false } } diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 3e6c5da7..8d9234af 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -1394,6 +1394,48 @@ final class BLEService: NSObject { // MARK: QR Verification over Noise + // MARK: Private Groups + + /// Sends creator-signed group state (invite) 1:1 over the Noise session, + /// queueing behind a handshake when none is established yet. + func sendGroupInvite(_ statePayload: Data, to peerID: PeerID) { + sendNoisePayload(NoisePayload(type: .groupInvite, data: statePayload).encode(), to: peerID) + } + + /// Sends creator-signed group state (key rotation / roster update) 1:1 + /// over the Noise session. + func sendGroupKeyUpdate(_ statePayload: Data, to peerID: PeerID) { + sendNoisePayload(NoisePayload(type: .groupKeyUpdate, data: statePayload).encode(), to: peerID) + } + + /// Broadcasts a sealed group message (MessageType 0x25) like a public + /// message: fire-and-flood with gossip-sync backfill. The outer packet is + /// intentionally unsigned — receivers authenticate the sender's Ed25519 + /// signature inside the ciphertext, which still verifies for backfilled + /// copies long after the sender's announce has expired. + func broadcastGroupMessage(_ envelope: Data) { + guard !envelope.isEmpty else { return } + messageQueue.async { [weak self] in + guard let self else { return } + let packet = BitchatPacket( + type: MessageType.groupMessage.rawValue, + senderID: Data(hexString: self.myPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: envelope, + signature: nil, + ttl: self.messageTTL + ) + // Pre-mark our own broadcast as processed to avoid handling a + // relayed self copy. + let dedupID = BLESelfBroadcastTracker.dedupID(for: packet) + self.messageDeduplicator.markProcessed(dedupID) + self.broadcastPacket(packet) + // Track our own broadcast for gossip sync + self.gossipSyncManager?.onPublicPacketSeen(packet) + } + } + func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) { let payload = VerificationService.shared.buildVerifyChallenge(noiseKeyHex: noiseKeyHex, nonceA: nonceA) sendNoisePayload(payload, to: peerID) @@ -3758,6 +3800,9 @@ extension BLEService { case .courierEnvelope: handleCourierEnvelope(packet, from: peerID) + case .groupMessage: + handleGroupMessage(packet, from: senderID) + case .prekeyBundle: handlePrekeyBundle(packet, from: senderID) @@ -4095,6 +4140,26 @@ extension BLEService { ) } + /// Group broadcasts are opaque ciphertext to this layer: track them for + /// gossip backfill and hand the payload to the UI layer, where the group + /// coordinator decrypts and authenticates against the roster. Non-members + /// still relay (generic broadcast relay path) but never decode. + private func handleGroupMessage(_ packet: BitchatPacket, from peerID: PeerID) { + let isBroadcastRecipient: Bool = { + guard let recipient = packet.recipientID else { return true } + return recipient.count == 8 && recipient.allSatisfy { $0 == 0xFF } + }() + guard isBroadcastRecipient, !packet.payload.isEmpty else { return } + + gossipSyncManager?.onPublicPacketSeen(packet) + + let payload = packet.payload + let timestamp = Date(timeIntervalSince1970: TimeInterval(packet.timestamp) / 1000) + notifyUI { [weak self] in + self?.deliverTransportEvent(.groupMessageReceived(payload: payload, timestamp: timestamp)) + } + } + private func handleNoiseHandshake(_ packet: BitchatPacket, from peerID: PeerID) { noisePacketHandler.handleHandshake(packet, from: peerID) } diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index 9555609a..b8a4785e 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -74,6 +74,15 @@ protocol CommandContextProvider: AnyObject { /// Toggles the favorite via the unified peer flow, which persists by the /// real noise key and notifies the peer over mesh or Nostr. func toggleFavorite(peerID: PeerID) + + // MARK: - Groups + // Group logic lives in `ChatGroupCoordinator`; these forward the parsed + // /group subcommands. + func groupCreate(named name: String) -> CommandResult + func groupInvite(nickname: String) -> CommandResult + func groupRemove(nickname: String) -> CommandResult + func groupLeave() -> CommandResult + func groupList() -> CommandResult } /// Processes chat commands in a focused, efficient way @@ -120,6 +129,9 @@ final class CommandProcessor { return handleBlock(args) case "/unblock": return handleUnblock(args) + case "/group": + if inGeoPublic || inGeoDM { return .error(message: "groups are only for mesh peers in #mesh") } + return handleGroup(args) case "/fav": if inGeoPublic || inGeoDM { return .error(message: "favorites are only for mesh peers in #mesh") } return handleFavorite(args, add: true) @@ -153,6 +165,9 @@ final class CommandProcessor { /slap @name — slap with a large trout /block @name · /unblock @name /fav @name · /unfav @name — favorites (mesh only) + /group create — start an encrypted group + /group invite @name · /group remove @name — manage members (creator) + /group leave · /group list — leave or list your groups /ping @name — measure round-trip time (mesh only) /trace @name — estimated mesh path (mesh only) /pay — send a cashu ecash token in this chat @@ -362,6 +377,32 @@ final class CommandProcessor { return .error(message: "cannot unblock \(nickname): not found") } + private static let groupUsage = "usage: /group create · invite @name · remove @name · leave · list" + + private func handleGroup(_ args: String) -> CommandResult { + let parts = args.split(separator: " ", maxSplits: 1, omittingEmptySubsequences: true) + guard let subcommand = parts.first else { + return .error(message: Self.groupUsage) + } + let rest = parts.count > 1 ? String(parts[1]) : "" + guard let provider = contextProvider else { return .handled } + + switch subcommand { + case "create": + return provider.groupCreate(named: rest) + case "invite": + return provider.groupInvite(nickname: rest) + case "remove": + return provider.groupRemove(nickname: rest) + case "leave": + return provider.groupLeave() + case "list": + return provider.groupList() + default: + return .error(message: Self.groupUsage) + } + } + // MARK: - Mesh Diagnostics private enum MeshPeerResolution { diff --git a/bitchat/Services/Groups/GroupProtocol.swift b/bitchat/Services/Groups/GroupProtocol.swift new file mode 100644 index 00000000..dc4a0abf --- /dev/null +++ b/bitchat/Services/Groups/GroupProtocol.swift @@ -0,0 +1,569 @@ +// +// GroupProtocol.swift +// bitchat +// +// Wire formats and crypto for private groups: creator-signed group state +// (invites and key updates over Noise) and ChaCha20-Poly1305 group messages +// broadcast as MessageType.groupMessage (0x25). +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import CryptoKit +import Foundation + +// MARK: - Models + +/// A member of a private group as pinned in the creator-signed roster. +struct GroupMember: Codable, Equatable { + /// SHA-256 fingerprint (64 hex chars) of the member's Noise static key. + let fingerprint: String + /// The member's Ed25519 signing public key (32 bytes, from their announce). + let signingKey: Data + /// Nickname at invite time; display fallback when the peer is offline. + var nickname: String +} + +/// Creator-managed encrypted group. Metadata only — the symmetric key lives +/// in the keychain (see `GroupStore`). +struct BitchatGroup: Codable, Equatable { + static let maxMembers = 16 + static let groupIDLength = 16 + static let keyLength = 32 + + /// 16 random bytes; travels in cleartext on group message packets so + /// relays can dedup/filter without membership. + let groupID: Data + var name: String + /// Bumps on every key rotation; messages are bound to the epoch they + /// were sealed under. + var epoch: UInt32 + var members: [GroupMember] + /// Fingerprint of the creator — the only identity allowed to sign group + /// state (invites, key updates) in v1. + let creatorFingerprint: String + + /// Virtual conversation ID this group's chat is keyed under. + var peerID: PeerID { PeerID(groupID: groupID) } + + var creator: GroupMember? { + members.first { $0.fingerprint == creatorFingerprint } + } + + func isMember(fingerprint: String) -> Bool { + members.contains { $0.fingerprint == fingerprint } + } + + func member(withSigningKey signingKey: Data) -> GroupMember? { + members.first { $0.signingKey == signingKey } + } +} + +// MARK: - TLV helpers + +enum GroupTLVError: Error, Equatable { + /// A TLV value exceeded the 16-bit length field. Encoding fails instead + /// of silently truncating (which would ship a value the receiver drops). + case valueTooLong +} + +private enum GroupTLV { + /// Appends a (type, 16-bit length, value) triple. Throws rather than + /// truncating when `value` does not fit the 16-bit length field, so an + /// oversize field surfaces a send failure instead of a silently truncated + /// blob the recipient rejects during decrypt/verify. + static func put(_ type: UInt8, _ value: Data, into out: inout Data) throws { + guard value.count <= Int(UInt16.max) else { throw GroupTLVError.valueTooLong } + out.append(type) + let length = UInt16(value.count) + out.append(UInt8((length >> 8) & 0xFF)) + out.append(UInt8(length & 0xFF)) + out.append(value) + } + + /// Iterates (type, value) pairs; returns nil on malformed framing. + static func parse(_ data: Data) -> [(type: UInt8, value: Data)]? { + var fields: [(UInt8, Data)] = [] + var offset = data.startIndex + while offset < data.endIndex { + guard data.distance(from: offset, to: data.endIndex) >= 3 else { return nil } + let type = data[offset] + let high = Int(data[data.index(offset, offsetBy: 1)]) + let low = Int(data[data.index(offset, offsetBy: 2)]) + let length = (high << 8) | low + let valueStart = data.index(offset, offsetBy: 3) + guard data.distance(from: valueStart, to: data.endIndex) >= length else { return nil } + let valueEnd = data.index(valueStart, offsetBy: length) + fields.append((type, Data(data[valueStart.. Data { + var bigEndian = epoch.bigEndian + return withUnsafeBytes(of: &bigEndian) { Data($0) } + } + + static func epoch(from data: Data) -> UInt32? { + guard data.count == 4 else { return nil } + return data.reduce(UInt32(0)) { ($0 << 8) | UInt32($1) } + } + + static func timestampData(_ timestampMs: UInt64) -> Data { + var bigEndian = timestampMs.bigEndian + return withUnsafeBytes(of: &bigEndian) { Data($0) } + } + + static func timestamp(from data: Data) -> UInt64? { + guard data.count == 8 else { return nil } + return data.reduce(UInt64(0)) { ($0 << 8) | UInt64($1) } + } +} + +// MARK: - Roster wire form + +enum GroupRosterCoding { + private static let fingerprintLength = 32 + private static let signingKeyLength = 32 + private static let maxNicknameBytes = 64 + + /// Deterministic roster blob: count byte, then per member the raw 32-byte + /// fingerprint, 32-byte signing key, and length-prefixed UTF-8 nickname. + /// The creator signature covers the SHA-256 of these exact bytes. + static func encode(_ members: [GroupMember]) -> Data? { + guard members.count <= BitchatGroup.maxMembers else { return nil } + var out = Data([UInt8(members.count)]) + for member in members { + guard let fingerprintData = Data(hexString: member.fingerprint), + fingerprintData.count == fingerprintLength, + member.signingKey.count == signingKeyLength else { return nil } + out.append(fingerprintData) + out.append(member.signingKey) + // Truncate on a Character boundary so the byte prefix is always + // valid UTF-8; a raw byte-prefix could split a multi-byte scalar + // and make the whole signed roster undecodable on the recipient. + let nickname = truncatedNicknameBytes(member.nickname) + out.append(UInt8(nickname.count)) + out.append(nickname) + } + return out + } + + static func decode(_ data: Data) -> [GroupMember]? { + guard let count = data.first, count <= UInt8(BitchatGroup.maxMembers) else { return nil } + var members: [GroupMember] = [] + var offset = data.index(after: data.startIndex) + for _ in 0..= fixed else { return nil } + let fingerprintEnd = data.index(offset, offsetBy: fingerprintLength) + let fingerprint = Data(data[offset..= nickLength else { return nil } + let nickEnd = data.index(nickStart, offsetBy: nickLength) + guard let nickname = String(data: Data(data[nickStart.. Data { + var candidate = nickname + while Data(candidate.utf8).count > maxNicknameBytes { + candidate.removeLast() + } + return Data(candidate.utf8) + } +} + +// MARK: - Group state payload (groupInvite / groupKeyUpdate over Noise) + +/// Creator-signed group state. The same wire form serves invites (0x06) and +/// key updates (0x07); receivers verify the creator signature — computed over +/// "bitchat-group-v1" | groupID | epoch | SHA256(key) | SHA256(roster) — +/// against the creator's signing key pinned in the roster, and require the +/// Noise session peer to BE the creator before accepting any state. +struct GroupStatePayload: Equatable { + let groupID: Data + let name: String + /// Symmetric ChaCha20-Poly1305 group key (32 bytes) for `epoch`. + let key: Data + let epoch: UInt32 + let members: [GroupMember] + let creatorFingerprint: String + /// Ed25519 signature by the creator. + let signature: Data + + private enum FieldType: UInt8 { + case groupID = 0x01 + case name = 0x02 + case key = 0x03 + case epoch = 0x04 + case roster = 0x05 + case creatorFingerprint = 0x06 + case signature = 0x07 + } + + static let signingDomain = Data("bitchat-group-v1".utf8) + + /// The bytes the creator signs. Binding the key, roster, and name by hash + /// keeps the signed content fixed-size. The name is covered so a relay + /// that caches/replays a signed state (e.g. store-and-forward) cannot swap + /// the display name while keeping a valid creator signature. + static func signingContent(groupID: Data, epoch: UInt32, key: Data, rosterBlob: Data, name: String) -> Data { + var content = signingDomain + content.append(groupID) + content.append(GroupTLV.epochData(epoch)) + content.append(key.sha256Hash()) + content.append(rosterBlob.sha256Hash()) + content.append(Data(name.utf8).sha256Hash()) + return content + } + + /// Builds a signed state payload. Returns nil when the roster cannot be + /// encoded (over cap, malformed member) or signing fails. + static func makeSigned( + group: BitchatGroup, + key: Data, + sign: (Data) -> Data? + ) -> GroupStatePayload? { + guard let rosterBlob = GroupRosterCoding.encode(group.members) else { return nil } + let content = signingContent(groupID: group.groupID, epoch: group.epoch, key: key, rosterBlob: rosterBlob, name: group.name) + guard let signature = sign(content) else { return nil } + return GroupStatePayload( + groupID: group.groupID, + name: group.name, + key: key, + epoch: group.epoch, + members: group.members, + creatorFingerprint: group.creatorFingerprint, + signature: signature + ) + } + + func encode() -> Data? { + guard let rosterBlob = GroupRosterCoding.encode(members), + let fingerprintData = Data(hexString: creatorFingerprint), + fingerprintData.count == 32 else { return nil } + var out = Data() + do { + try GroupTLV.put(FieldType.groupID.rawValue, groupID, into: &out) + try GroupTLV.put(FieldType.name.rawValue, Data(name.utf8), into: &out) + try GroupTLV.put(FieldType.key.rawValue, key, into: &out) + try GroupTLV.put(FieldType.epoch.rawValue, GroupTLV.epochData(epoch), into: &out) + try GroupTLV.put(FieldType.roster.rawValue, rosterBlob, into: &out) + try GroupTLV.put(FieldType.creatorFingerprint.rawValue, fingerprintData, into: &out) + try GroupTLV.put(FieldType.signature.rawValue, signature, into: &out) + } catch { + return nil + } + return out + } + + static func decode(_ data: Data) -> GroupStatePayload? { + guard let fields = GroupTLV.parse(data) else { return nil } + var groupID: Data? + var name: String? + var key: Data? + var epoch: UInt32? + var rosterBlob: Data? + var members: [GroupMember]? + var creatorFingerprint: String? + var signature: Data? + + for (type, value) in fields { + switch FieldType(rawValue: type) { + case .groupID where value.count == BitchatGroup.groupIDLength: + groupID = value + case .name: + name = String(data: value, encoding: .utf8) + case .key where value.count == BitchatGroup.keyLength: + key = value + case .epoch: + epoch = GroupTLV.epoch(from: value) + case .roster: + rosterBlob = value + members = GroupRosterCoding.decode(value) + case .creatorFingerprint where value.count == 32: + creatorFingerprint = value.hexEncodedString() + case .signature where value.count == 64: + signature = value + default: + break // forward compatible; ignore unknown TLVs + } + } + + guard let groupID, let name, let key, let epoch, + rosterBlob != nil, let members, !members.isEmpty, + let creatorFingerprint, let signature else { return nil } + return GroupStatePayload( + groupID: groupID, + name: name, + key: key, + epoch: epoch, + members: members, + creatorFingerprint: creatorFingerprint, + signature: signature + ) + } + + /// Verifies the creator signature against the creator's signing key + /// pinned in the roster, and that the creator is actually in the roster. + func verifyCreatorSignature() -> Bool { + guard members.count <= BitchatGroup.maxMembers, + let creator = members.first(where: { $0.fingerprint == creatorFingerprint }), + let rosterBlob = GroupRosterCoding.encode(members) else { return false } + let content = GroupStatePayload.signingContent(groupID: groupID, epoch: epoch, key: key, rosterBlob: rosterBlob, name: name) + return GroupCrypto.verify(signature: signature, for: content, publicKey: creator.signingKey) + } + + var asGroup: BitchatGroup { + BitchatGroup( + groupID: groupID, + name: name, + epoch: epoch, + members: members, + creatorFingerprint: creatorFingerprint + ) + } +} + +// MARK: - Group message envelope (MessageType 0x25 payload) + +/// Cleartext framing of a group message broadcast. Only the group ID, epoch, +/// and nonce are visible to relays; everything about the message — sender, +/// content, timestamps — is inside the ChaCha20-Poly1305 ciphertext. +struct GroupMessageEnvelope: Equatable { + let groupID: Data + let epoch: UInt32 + let nonce: Data + /// ChaChaPoly ciphertext || 16-byte tag. + let ciphertext: Data + + private enum FieldType: UInt8 { + case groupID = 0x01 + case epoch = 0x02 + case nonce = 0x03 + case ciphertext = 0x04 + } + + func encode() throws -> Data { + var out = Data() + try GroupTLV.put(FieldType.groupID.rawValue, groupID, into: &out) + try GroupTLV.put(FieldType.epoch.rawValue, GroupTLV.epochData(epoch), into: &out) + try GroupTLV.put(FieldType.nonce.rawValue, nonce, into: &out) + try GroupTLV.put(FieldType.ciphertext.rawValue, ciphertext, into: &out) + return out + } + + static func decode(_ data: Data) -> GroupMessageEnvelope? { + guard let fields = GroupTLV.parse(data) else { return nil } + var groupID: Data? + var epoch: UInt32? + var nonce: Data? + var ciphertext: Data? + for (type, value) in fields { + switch FieldType(rawValue: type) { + case .groupID where value.count == BitchatGroup.groupIDLength: + groupID = value + case .epoch: + epoch = GroupTLV.epoch(from: value) + case .nonce where value.count == 12: + nonce = value + case .ciphertext where !value.isEmpty: + ciphertext = value + default: + break + } + } + guard let groupID, let epoch, let nonce, let ciphertext else { return nil } + return GroupMessageEnvelope(groupID: groupID, epoch: epoch, nonce: nonce, ciphertext: ciphertext) + } +} + +/// Decrypted, signature-verified inner content of a group message. +struct GroupMessagePlaintext: Equatable { + let messageID: String + let senderSigningKey: Data + let senderNickname: String + let timestampMs: UInt64 + let content: String +} + +// MARK: - Crypto + +enum GroupCryptoError: Error, Equatable { + case malformedPayload + case signingFailed + case sealFailed + case wrongEpoch + case decryptionFailed + case badSenderSignature +} + +enum GroupCrypto { + static let messageSigningDomain = Data("bitchat-group-msg-v1".utf8) + + private enum InnerField: UInt8 { + case messageID = 0x01 + case senderSigningKey = 0x02 + case senderNickname = 0x03 + case timestamp = 0x04 + case content = 0x05 + case signature = 0x06 + } + + /// Bytes the sender signs: domain | groupID | epoch | messageID | timestamp | content. + /// Covering the epoch stops a current member from re-sealing another + /// member's decrypted inner bytes under a later epoch key (the signature + /// would no longer verify at the new epoch). + static func messageSigningContent(groupID: Data, epoch: UInt32, messageID: String, timestampMs: UInt64, content: String) -> Data { + var data = messageSigningDomain + data.append(groupID) + data.append(GroupTLV.epochData(epoch)) + data.append(Data(messageID.utf8)) + data.append(GroupTLV.timestampData(timestampMs)) + data.append(Data(content.utf8)) + return data + } + + static func verify(signature: Data, for data: Data, publicKey: Data) -> Bool { + guard let key = try? Curve25519.Signing.PublicKey(rawRepresentation: publicKey) else { return false } + return key.isValidSignature(signature, for: data) + } + + /// Seals a group message: builds the signed inner TLV and encrypts it with + /// the epoch key. The cleartext group ID and epoch are bound into the AEAD + /// as additional data so ciphertext cannot be replayed across groups or + /// epochs. Returns the encoded 0x25 packet payload. + static func sealMessage( + content: String, + messageID: String, + senderNickname: String, + senderSigningKey: Data, + timestampMs: UInt64, + groupID: Data, + epoch: UInt32, + key: Data, + sign: (Data) -> Data? + ) throws -> Data { + let signingContent = messageSigningContent( + groupID: groupID, + epoch: epoch, + messageID: messageID, + timestampMs: timestampMs, + content: content + ) + guard let signature = sign(signingContent), signature.count == 64 else { + throw GroupCryptoError.signingFailed + } + + var inner = Data() + try GroupTLV.put(InnerField.messageID.rawValue, Data(messageID.utf8), into: &inner) + try GroupTLV.put(InnerField.senderSigningKey.rawValue, senderSigningKey, into: &inner) + try GroupTLV.put(InnerField.senderNickname.rawValue, Data(senderNickname.utf8), into: &inner) + try GroupTLV.put(InnerField.timestamp.rawValue, GroupTLV.timestampData(timestampMs), into: &inner) + try GroupTLV.put(InnerField.content.rawValue, Data(content.utf8), into: &inner) + try GroupTLV.put(InnerField.signature.rawValue, signature, into: &inner) + + do { + let symmetricKey = SymmetricKey(data: key) + var aad = groupID + aad.append(GroupTLV.epochData(epoch)) + let sealed = try ChaChaPoly.seal(inner, using: symmetricKey, authenticating: aad) + var ciphertext = sealed.ciphertext + ciphertext.append(sealed.tag) + let envelope = GroupMessageEnvelope( + groupID: groupID, + epoch: epoch, + nonce: Data(sealed.nonce), + ciphertext: ciphertext + ) + return try envelope.encode() + } catch { + throw GroupCryptoError.sealFailed + } + } + + /// Opens a group message envelope with the epoch key: decrypts, parses the + /// inner TLV, and verifies the sender's Ed25519 signature. Roster + /// membership of the sender is the CALLER's check — this function only + /// proves the payload was authored by `senderSigningKey`. + static func openMessage(_ envelope: GroupMessageEnvelope, key: Data) throws -> GroupMessagePlaintext { + let inner: Data + do { + let symmetricKey = SymmetricKey(data: key) + var aad = envelope.groupID + aad.append(GroupTLV.epochData(envelope.epoch)) + let nonce = try ChaChaPoly.Nonce(data: envelope.nonce) + guard envelope.ciphertext.count > 16 else { throw GroupCryptoError.decryptionFailed } + let tag = envelope.ciphertext.suffix(16) + let body = envelope.ciphertext.prefix(envelope.ciphertext.count - 16) + let sealedBox = try ChaChaPoly.SealedBox(nonce: nonce, ciphertext: body, tag: tag) + inner = try ChaChaPoly.open(sealedBox, using: symmetricKey, authenticating: aad) + } catch { + throw GroupCryptoError.decryptionFailed + } + + guard let fields = GroupTLV.parse(inner) else { throw GroupCryptoError.malformedPayload } + var messageID: String? + var senderSigningKey: Data? + var senderNickname: String? + var timestampMs: UInt64? + var content: String? + var signature: Data? + for (type, value) in fields { + switch InnerField(rawValue: type) { + case .messageID: + messageID = String(data: value, encoding: .utf8) + case .senderSigningKey where value.count == 32: + senderSigningKey = value + case .senderNickname: + senderNickname = String(data: value, encoding: .utf8) + case .timestamp: + timestampMs = GroupTLV.timestamp(from: value) + case .content: + content = String(data: value, encoding: .utf8) + case .signature where value.count == 64: + signature = value + default: + break + } + } + guard let messageID, !messageID.isEmpty, + let senderSigningKey, + let senderNickname, + let timestampMs, + let content, + let signature else { throw GroupCryptoError.malformedPayload } + + let signingContent = messageSigningContent( + groupID: envelope.groupID, + epoch: envelope.epoch, + messageID: messageID, + timestampMs: timestampMs, + content: content + ) + guard verify(signature: signature, for: signingContent, publicKey: senderSigningKey) else { + throw GroupCryptoError.badSenderSignature + } + + return GroupMessagePlaintext( + messageID: messageID, + senderSigningKey: senderSigningKey, + senderNickname: senderNickname, + timestampMs: timestampMs, + content: content + ) + } +} diff --git a/bitchat/Services/Groups/GroupStore.swift b/bitchat/Services/Groups/GroupStore.swift new file mode 100644 index 00000000..3a45dcb7 --- /dev/null +++ b/bitchat/Services/Groups/GroupStore.swift @@ -0,0 +1,194 @@ +// +// GroupStore.swift +// bitchat +// +// Persistence for private groups: symmetric keys in the keychain, metadata +// (roster, name, epoch) as protected JSON in Application Support. Both are +// dropped by the panic wipe. +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import Combine +import Foundation +import Security + +@MainActor +final class GroupStore: ObservableObject { + /// All groups this device is a member of, in creation/join order. + @Published private(set) var groups: [BitchatGroup] = [] + + private let keychain: KeychainManagerProtocol + private let fileURL: URL? + + /// - Parameter fileURL: Overrides the on-disk location (tests). Ignored + /// when `persistsToDisk` is false. + init(keychain: KeychainManagerProtocol, persistsToDisk: Bool = true, fileURL: URL? = nil) { + self.keychain = keychain + self.fileURL = persistsToDisk ? (fileURL ?? Self.defaultFileURL()) : nil + loadFromDisk() + } + + // MARK: - Reads + + func group(withID groupID: Data) -> BitchatGroup? { + groups.first { $0.groupID == groupID } + } + + func group(for peerID: PeerID) -> BitchatGroup? { + guard let groupID = peerID.groupIDData else { return nil } + return group(withID: groupID) + } + + /// Current-epoch symmetric key for the group, from the keychain. + func key(forGroupID groupID: Data) -> Data? { + keychain.getIdentityKey(forKey: Self.keychainKey(for: groupID)) + } + + // MARK: - Mutations + + /// Creates a new group with a random 16-byte ID and 32-byte key at + /// epoch 1, with the creator as sole member. Returns nil when key + /// generation or persistence fails. + func createGroup(named name: String, creator: GroupMember) -> BitchatGroup? { + guard let groupID = Self.randomBytes(BitchatGroup.groupIDLength), + let key = Self.randomBytes(BitchatGroup.keyLength) else { return nil } + let group = BitchatGroup( + groupID: groupID, + name: name, + epoch: 1, + members: [creator], + creatorFingerprint: creator.fingerprint + ) + guard upsert(group, key: key) else { return nil } + return group + } + + /// Inserts or replaces a group and its current key. Rejects rosters over + /// the hard cap or groups whose creator is missing from the roster. + @discardableResult + func upsert(_ group: BitchatGroup, key: Data) -> Bool { + guard group.groupID.count == BitchatGroup.groupIDLength, + key.count == BitchatGroup.keyLength, + !group.members.isEmpty, + group.members.count <= BitchatGroup.maxMembers, + group.creator != nil else { return false } + guard keychain.saveIdentityKey(key, forKey: Self.keychainKey(for: group.groupID)) else { + SecureLogger.error("Failed to store group key in keychain", category: .security) + return false + } + if let index = groups.firstIndex(where: { $0.groupID == group.groupID }) { + groups[index] = group + } else { + groups.append(group) + } + persist() + return true + } + + /// Updates the roster of an existing group without changing key or epoch + /// (creator-side invite). Enforces the member cap. + @discardableResult + func updateRoster(groupID: Data, members: [GroupMember]) -> BitchatGroup? { + guard let index = groups.firstIndex(where: { $0.groupID == groupID }), + !members.isEmpty, + members.count <= BitchatGroup.maxMembers, + members.contains(where: { $0.fingerprint == groups[index].creatorFingerprint }) else { return nil } + groups[index].members = members + persist() + return groups[index] + } + + /// Rotates the group key (creator-side removal/rotation): new random key, + /// epoch + 1, and the given roster. Returns the updated group and new key. + func rotateKey(groupID: Data, members: [GroupMember]) -> (group: BitchatGroup, key: Data)? { + guard let existing = group(withID: groupID), + let newKey = Self.randomBytes(BitchatGroup.keyLength) else { return nil } + var rotated = existing + rotated.epoch = existing.epoch &+ 1 + rotated.members = members + guard upsert(rotated, key: newKey) else { return nil } + return (rotated, newKey) + } + + func removeGroup(withID groupID: Data) { + groups.removeAll { $0.groupID == groupID } + _ = keychain.deleteIdentityKey(forKey: Self.keychainKey(for: groupID)) + persist() + } + + /// Panic wipe: drop all group keys and metadata from memory and disk. + /// (The panic flow also nukes the whole keychain; deleting per-group keys + /// here keeps the store safe to wipe on its own.) + func wipe() { + for group in groups { + _ = keychain.deleteIdentityKey(forKey: Self.keychainKey(for: group.groupID)) + } + groups.removeAll() + if let fileURL { + try? FileManager.default.removeItem(at: fileURL) + } + } + + // MARK: - Internals + + private static func keychainKey(for groupID: Data) -> String { + "groupKey-\(groupID.hexEncodedString())" + } + + private static func randomBytes(_ count: Int) -> Data? { + var bytes = Data(count: count) + let status = bytes.withUnsafeMutableBytes { buffer -> OSStatus in + guard let baseAddress = buffer.baseAddress else { return errSecParam } + return SecRandomCopyBytes(kSecRandomDefault, count, baseAddress) + } + return status == errSecSuccess ? bytes : nil + } + + private func persist() { + guard let fileURL else { return } + do { + if groups.isEmpty { + try? FileManager.default.removeItem(at: fileURL) + return + } + try FileManager.default.createDirectory( + at: fileURL.deletingLastPathComponent(), + withIntermediateDirectories: true + ) + let data = try JSONEncoder().encode(groups) + var options: Data.WritingOptions = [.atomic] + #if os(iOS) + options.insert(.completeFileProtection) + #endif + try data.write(to: fileURL, options: options) + } catch { + SecureLogger.error("Failed to persist group store: \(error)", category: .session) + } + } + + private func loadFromDisk() { + guard let fileURL, + let data = try? Data(contentsOf: fileURL), + let stored = try? JSONDecoder().decode([BitchatGroup].self, from: data) else { + return + } + // Only groups whose key survived in the keychain are usable. + groups = stored.filter { key(forGroupID: $0.groupID) != nil } + } + + private static func defaultFileURL() -> URL? { + guard let base = try? FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) else { return nil } + return base + .appendingPathComponent("groups", isDirectory: true) + .appendingPathComponent("groups.json") + } +} diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 45aed91e..d6bdef33 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -69,6 +69,9 @@ enum TransportEvent: @unchecked Sendable { case messageReceived(BitchatMessage) case publicMessageReceived(peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) case noisePayloadReceived(peerID: PeerID, type: NoisePayloadType, payload: Data, timestamp: Date) + /// Encrypted group broadcast (MessageType 0x25). Opaque here — the group + /// coordinator decrypts and authenticates against the roster. + case groupMessageReceived(payload: Data, timestamp: Date) case peerConnected(PeerID) case peerDisconnected(PeerID) case peerListUpdated([PeerID]) @@ -158,6 +161,12 @@ protocol Transport: AnyObject { // transport cannot courier (no connected courier, or unsupported). func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool + // Private groups (mesh transports only): creator-signed state travels + // 1:1 over Noise sessions; group messages flood like public broadcasts. + func sendGroupInvite(_ statePayload: Data, to peerID: PeerID) + func sendGroupKeyUpdate(_ statePayload: Data, to peerID: PeerID) + func broadcastGroupMessage(_ envelope: Data) + // Bulletin board (mesh transports only): broadcast a pre-signed board // payload (post or tombstone) so it spreads over relay and gossip sync. func sendBoardPayload(_ payload: Data) @@ -214,6 +223,9 @@ extension Transport { func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} func sendVerifyResponse(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {} + func sendGroupInvite(_ statePayload: Data, to peerID: PeerID) {} + func sendGroupKeyUpdate(_ statePayload: Data, to peerID: PeerID) {} + func broadcastGroupMessage(_ envelope: Data) {} func peerCapabilities(_ peerID: PeerID) -> PeerCapabilities { [] } func sendVouchAttestations(_ payload: Data, to peerID: PeerID) {} func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) {} @@ -259,6 +271,8 @@ extension BitchatDelegate { ) case let .noisePayloadReceived(peerID, type, payload, timestamp): didReceiveNoisePayload(from: peerID, type: type, payload: payload, timestamp: timestamp) + case let .groupMessageReceived(payload, timestamp): + didReceiveGroupMessage(payload: payload, timestamp: timestamp) case .peerConnected(let peerID): didConnectToPeer(peerID) case .peerDisconnected(let peerID): diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index b0d72e47..3dee21e0 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -73,6 +73,7 @@ final class GossipSyncManager { var stalePeerTimeoutSeconds: TimeInterval = 60.0 var fragmentCapacity: Int = 600 var fileTransferCapacity: Int = 200 + var groupMessageCapacity: Int = 200 var fragmentSyncIntervalSeconds: TimeInterval = 30.0 var fileTransferSyncIntervalSeconds: TimeInterval = 60.0 var messageSyncIntervalSeconds: TimeInterval = 15.0 @@ -106,6 +107,7 @@ final class GossipSyncManager { private var messages = PacketStore() private var fragments = PacketStore() private var fileTransfers = PacketStore() + private var groupMessages = PacketStore() private var latestAnnouncementByPeer: [PeerID: BitchatPacket] = [:] // Latest verified prekey bundle per owner. Unlike announces, bundles are // NOT dropped on leave/stale peer: their whole purpose is reaching a @@ -131,7 +133,13 @@ final class GossipSyncManager { ) var schedules: [SyncSchedule] = [] if config.seenCapacity > 0 && config.messageSyncIntervalSeconds > 0 { - schedules.append(SyncSchedule(types: .publicMessages, interval: config.messageSyncIntervalSeconds, lastSent: .distantPast)) + // Group messages ride the public-message cadence; old clients + // ignore the extended bit and answer with announces/messages only. + var messageTypes: SyncTypeFlags = .publicMessages + if config.groupMessageCapacity > 0 { + messageTypes.formUnion(.groupMessage) + } + schedules.append(SyncSchedule(types: messageTypes, interval: config.messageSyncIntervalSeconds, lastSent: .distantPast)) } if config.fragmentCapacity > 0 && config.fragmentSyncIntervalSeconds > 0 { schedules.append(SyncSchedule(types: .fragment, interval: config.fragmentSyncIntervalSeconds, lastSent: .distantPast)) @@ -175,6 +183,9 @@ final class GossipSyncManager { guard let self = self else { return } var types: SyncTypeFlags = .publicMessages + if self.config.groupMessageCapacity > 0 { + types.formUnion(.groupMessage) + } if self.config.fragmentCapacity > 0 && self.config.fragmentSyncIntervalSeconds > 0 { types.formUnion(.fragment) } @@ -201,9 +212,11 @@ final class GossipSyncManager { // messages get the long town-crier window; fragments, file transfers and // announces keep the short one. private func isPacketFresh(_ packet: BitchatPacket) -> Bool { + // Group messages share the whole-message window: members off the mesh + // for a while should backfill their crew's history like public chat. let maxAgeSeconds: TimeInterval switch packet.type { - case MessageType.message.rawValue: + case MessageType.message.rawValue, MessageType.groupMessage.rawValue: maxAgeSeconds = config.publicMessageMaxAgeSeconds case MessageType.prekeyBundle.rawValue: maxAgeSeconds = config.prekeyBundleMaxAgeSeconds @@ -262,6 +275,13 @@ final class GossipSyncManager { guard isPacketFresh(packet) else { return } let idHex = PacketIdUtil.computeId(packet).hexEncodedString() fileTransfers.insert(idHex: idHex, packet: packet, capacity: max(1, config.fileTransferCapacity)) + case .groupMessage: + // Opaque ciphertext to non-members; carried and served like any + // other broadcast so members get backfill from any relay. + guard isBroadcastRecipient else { return } + guard isPacketFresh(packet) else { return } + let idHex = PacketIdUtil.computeId(packet).hexEncodedString() + groupMessages.insert(idHex: idHex, packet: packet, capacity: max(1, config.groupMessageCapacity)) case .prekeyBundle: // Callers only feed verified bundles here (own bundles at send // time, peers' after signature verification), so gossip never @@ -454,6 +474,19 @@ final class GossipSyncManager { } } + if requestedTypes.contains(.groupMessage) { + let groupPkts = groupMessages.allPackets(isFresh: isPacketFresh) + for pkt in groupPkts { + if let since, pkt.timestamp < since { continue } + let idBytes = PacketIdUtil.computeId(pkt) + if !mightContain(idBytes) { + var toSend = pkt + toSend.ttl = 0 + toSend.isRSR = true // Mark as solicited response + delegate?.sendPacket(to: peerID, packet: toSend) + } + } + } // Like announces, prekey bundles are exempt from the since-cursor: // there is at most one per owner (newer replaces older), so the // resend cost is bounded and a joining peer must be able to learn @@ -505,6 +538,9 @@ final class GossipSyncManager { if types.contains(.fileTransfer) { candidates.append(contentsOf: fileTransfers.allPackets(isFresh: isPacketFresh)) } + if types.contains(.groupMessage) { + candidates.append(contentsOf: groupMessages.allPackets(isFresh: isPacketFresh)) + } if types.contains(.prekeyBundle) { for (_, pair) in latestPrekeyBundleByPeer where isPacketFresh(pair.packet) { candidates.append(pair.packet) @@ -574,6 +610,7 @@ final class GossipSyncManager { } fragments.removeExpired(isFresh: isPacketFresh) fileTransfers.removeExpired(isFresh: isPacketFresh) + groupMessages.removeExpired(isFresh: isPacketFresh) latestPrekeyBundleByPeer = latestPrekeyBundleByPeer.filter { _, pair in isPacketFresh(pair.packet) } @@ -677,6 +714,7 @@ final class GossipSyncManager { } fragments.remove { PeerID(hexData: $0.senderID) == peerID } fileTransfers.remove { PeerID(hexData: $0.senderID) == peerID } + groupMessages.remove { PeerID(hexData: $0.senderID) == peerID } } } diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index cb743ce1..3b4b0c82 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -37,6 +37,13 @@ struct SyncTypeFlags: OptionSet { case .requestSync: return 6 case .fileTransfer: return 7 case .boardPost: return 8 + // Extended bits are compat-safe by construction: `toData()` encodes + // the bitfield little-endian with trailing zero bytes trimmed (bit 10 + // widens the wire form from 1 to 2 bytes inside the length-prefixed + // REQUEST_SYNC TLV 0x04), and `decode(_:)` accepts 1...8 bytes while + // `type(forBit:)` maps unknown bits to nil — so old clients simply + // ignore the group bit and answer with the types they know. + case .groupMessage: return 10 // Courier envelopes are directed deposits between trusted peers and // must never spread via gossip sync. case .courierEnvelope: return nil @@ -70,6 +77,7 @@ struct SyncTypeFlags: OptionSet { // known type, so old clients ignore board rounds instead of choking. case 8: return .boardPost case 9: return .prekeyBundle + case 10: return .groupMessage default: return nil } @@ -81,6 +89,7 @@ struct SyncTypeFlags: OptionSet { static let fileTransfer = SyncTypeFlags(messageTypes: [.fileTransfer]) static let board = SyncTypeFlags(messageTypes: [.boardPost]) static let prekeyBundle = SyncTypeFlags(messageTypes: [.prekeyBundle]) + static let groupMessage = SyncTypeFlags(messageTypes: [.groupMessage]) static let publicMessages = SyncTypeFlags(messageTypes: [.announce, .message]) diff --git a/bitchat/ViewModels/ChatGroupCoordinator.swift b/bitchat/ViewModels/ChatGroupCoordinator.swift new file mode 100644 index 00000000..a83cb024 --- /dev/null +++ b/bitchat/ViewModels/ChatGroupCoordinator.swift @@ -0,0 +1,602 @@ +import BitFoundation +import BitLogger +import Foundation + +/// The narrow surface `ChatGroupCoordinator` needs from its owner. +/// +/// Follows the `ChatDeliveryContext` exemplar: the coordinator depends on the +/// minimal context it actually uses instead of holding an `unowned` back-ref +/// to the whole `ChatViewModel`. Group chats are keyed like direct chats +/// (virtual "group_" peer IDs), so the conversation intents below reuse the +/// private-chat store operations. +@MainActor +protocol ChatGroupContext: AnyObject { + // MARK: Identity & state + var nickname: String { get } + var myPeerID: PeerID { get } + var selectedPrivateChatPeer: PeerID? { get } + var groupStore: GroupStore { get } + + /// Fingerprint of our own Noise static identity key. + func myNoiseFingerprint() -> String + /// Our Ed25519 signing public key. + func mySigningPublicKey() -> Data + /// Signs `data` with our Noise signing key. + func signWithNoiseKey(_ data: Data) -> Data? + + // MARK: Peers + func getPeerIDForNickname(_ nickname: String) -> PeerID? + func isPeerConnected(_ peerID: PeerID) -> Bool + func peerNickname(for peerID: PeerID) -> String? + /// The peer's Noise fingerprint from the live session/registry. + func meshFingerprint(for peerID: PeerID) -> String? + /// The peer's persisted crypto identity (fingerprint + signing key), if + /// the identity store has a signature-verified announce for them. + func cryptoIdentity(for peerID: PeerID) -> (fingerprint: String, signingKey: Data)? + /// The connected short peer ID whose fingerprint matches, if any. + func connectedPeerID(forFingerprint fingerprint: String) -> PeerID? + /// Whether the user has blocked the identity with this Noise fingerprint. + func isFingerprintBlocked(_ fingerprint: String) -> Bool + + // MARK: Transport + func sendGroupInvitePayload(_ payload: Data, to peerID: PeerID) + func sendGroupKeyUpdatePayload(_ payload: Data, to peerID: PeerID) + func broadcastGroupMessagePayload(_ payload: Data) + + // MARK: Conversation intents (group chats are direct-keyed) + @discardableResult + func appendPrivateMessage(_ message: BitchatMessage, to peerID: PeerID) -> Bool + func markPrivateChatUnread(_ peerID: PeerID) + func removePrivateChat(_ peerID: PeerID) + func startPrivateChat(with peerID: PeerID) + func endPrivateChat() + func addSystemMessage(_ content: String) + func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) + func notifyUIChanged() + func notifyPrivateMessage(from senderName: String, message: String, peerID: PeerID) +} + +extension ChatViewModel: ChatGroupContext { + // `nickname`, `myPeerID`, `selectedPrivateChatPeer`, `groupStore`, + // `getPeerIDForNickname(_:)`, `isPeerConnected(_:)`, `peerNickname(for:)`, + // `appendPrivateMessage(_:to:)`, `markPrivateChatUnread(_:)`, + // `removePrivateChat(_:)`, `startPrivateChat(with:)`, + // `addSystemMessage(_:)`, `addLocalPrivateSystemMessage(_:to:)`, + // `notifyUIChanged()`, and `notifyPrivateMessage(from:message:peerID:)` + // are shared requirements with the other contexts or satisfied by + // existing `ChatViewModel` members. The members below flatten nested + // service accesses into intent-named calls. + + func myNoiseFingerprint() -> String { + meshService.noiseIdentityFingerprint() + } + + func mySigningPublicKey() -> Data { + meshService.noiseSigningPublicKeyData() + } + + func signWithNoiseKey(_ data: Data) -> Data? { + meshService.noiseSignData(data) + } + + func meshFingerprint(for peerID: PeerID) -> String? { + meshService.getFingerprint(for: peerID) + } + + /// The persisted, signature-verified identity behind a short mesh peer + /// ID. Cross-checked against the live session fingerprint so a roster + /// entry can never be pinned to a signing key from a different identity. + func cryptoIdentity(for peerID: PeerID) -> (fingerprint: String, signingKey: Data)? { + guard let fingerprint = meshService.getFingerprint(for: peerID) else { return nil } + let candidates = identityManager.getCryptoIdentitiesByPeerIDPrefix(peerID) + guard let identity = candidates.first(where: { $0.fingerprint == fingerprint }), + let signingKey = identity.signingPublicKey else { return nil } + return (fingerprint, signingKey) + } + + /// Short mesh peer IDs are the fingerprint's first 16 hex chars, so the + /// connected peer for a roster fingerprint is a direct derivation. + func connectedPeerID(forFingerprint fingerprint: String) -> PeerID? { + let shortID = PeerID(str: String(fingerprint.prefix(16))) + return meshService.isPeerConnected(shortID) ? shortID : nil + } + + func isFingerprintBlocked(_ fingerprint: String) -> Bool { + identityManager.isBlocked(fingerprint: fingerprint) + } + + func sendGroupInvitePayload(_ payload: Data, to peerID: PeerID) { + meshService.sendGroupInvite(payload, to: peerID) + } + + func sendGroupKeyUpdatePayload(_ payload: Data, to peerID: PeerID) { + meshService.sendGroupKeyUpdate(payload, to: peerID) + } + + func broadcastGroupMessagePayload(_ payload: Data) { + meshService.broadcastGroupMessage(payload) + } + + // MARK: CommandContextProvider group commands (parsed by CommandProcessor) + + func groupCreate(named name: String) -> CommandResult { + groupCoordinator.createGroup(named: name) + } + + func groupInvite(nickname: String) -> CommandResult { + groupCoordinator.inviteMember(nickname: nickname) + } + + func groupRemove(nickname: String) -> CommandResult { + groupCoordinator.removeMember(nickname: nickname) + } + + func groupLeave() -> CommandResult { + groupCoordinator.leaveGroup() + } + + func groupList() -> CommandResult { + groupCoordinator.listGroups() + } +} + +/// Owns the private-groups feature: creating groups, creator-managed invites +/// and key rotation over Noise, and sealing/opening group message broadcasts. +/// Delivery is fire-and-flood like public chat — no per-member acks in v1 — +/// with gossip-sync backfill as the only offline catch-up. +@MainActor +final class ChatGroupCoordinator { + private unowned let context: any ChatGroupContext + + private static let maxGroupNameLength = 40 + + init(context: any ChatGroupContext) { + self.context = context + } + + // MARK: - Commands + + func createGroup(named rawName: String) -> CommandResult { + let name = rawName.trimmed + guard !name.isEmpty else { + return .error(message: String(localized: "system.group.usage_create", comment: "Usage hint for /group create")) + } + guard name.count <= Self.maxGroupNameLength else { + return .error(message: String(localized: "system.group.name_too_long", comment: "Error when a group name exceeds the length cap")) + } + + let myFingerprint = context.myNoiseFingerprint() + let mySigningKey = context.mySigningPublicKey() + guard !myFingerprint.isEmpty, mySigningKey.count == 32 else { + return .error(message: String(localized: "system.group.identity_unavailable", comment: "Error when the local identity is not ready for group operations")) + } + + let creator = GroupMember(fingerprint: myFingerprint, signingKey: mySigningKey, nickname: context.nickname) + guard let group = context.groupStore.createGroup(named: name, creator: creator) else { + return .error(message: String(localized: "system.group.create_failed", comment: "Error when group creation fails")) + } + + context.startPrivateChat(with: group.peerID) + return .success(message: String( + format: String(localized: "system.group.created", comment: "System message after creating a group; placeholder is the group name"), + locale: .current, + name + )) + } + + func inviteMember(nickname rawNickname: String) -> CommandResult { + let nickname = normalizedNickname(rawNickname) + guard !nickname.isEmpty else { + return .error(message: String(localized: "system.group.usage_invite", comment: "Usage hint for /group invite")) + } + guard let group = selectedGroup() else { + return .error(message: String(localized: "system.group.not_in_group", comment: "Error when a group command requires an open group chat")) + } + guard group.creatorFingerprint == context.myNoiseFingerprint() else { + return .error(message: String(localized: "system.group.creator_only", comment: "Error when a non-creator attempts a creator-only group action")) + } + guard let peerID = context.getPeerIDForNickname(nickname) else { + return .error(message: String( + format: String(localized: "system.group.peer_not_found", comment: "Error when the invitee nickname is unknown; placeholder is the nickname"), + locale: .current, + nickname + )) + } + guard context.isPeerConnected(peerID) else { + return .error(message: String( + format: String(localized: "system.group.peer_not_connected", comment: "Error when the invitee is not connected over mesh; placeholder is the nickname"), + locale: .current, + nickname + )) + } + guard let identity = context.cryptoIdentity(for: peerID) else { + return .error(message: String( + format: String(localized: "system.group.peer_identity_unknown", comment: "Error when the invitee's verified identity is unavailable; placeholder is the nickname"), + locale: .current, + nickname + )) + } + guard !group.isMember(fingerprint: identity.fingerprint) else { + return .error(message: String( + format: String(localized: "system.group.already_member", comment: "Error when the invitee is already a member; placeholder is the nickname"), + locale: .current, + nickname + )) + } + guard group.members.count < BitchatGroup.maxMembers else { + return .error(message: String( + format: String(localized: "system.group.full", comment: "Error when the group is at the member cap; placeholder is the cap"), + locale: .current, + "\(BitchatGroup.maxMembers)" + )) + } + + let newMember = GroupMember( + fingerprint: identity.fingerprint, + signingKey: identity.signingKey, + nickname: context.peerNickname(for: peerID) ?? nickname + ) + // Rotate the key (epoch + 1) on every roster change, not just removals. + // A monotonically increasing epoch per roster gives the receiver a + // strict ordering: two out-of-order invite states can no longer share + // an epoch and last-writer-wins a just-added member back out. + let members = group.members + [newMember] + guard let (updated, key) = context.groupStore.rotateKey(groupID: group.groupID, members: members), + let payload = signedStatePayload(for: updated, key: key) else { + return .error(message: String(localized: "system.group.invite_failed", comment: "Error when building or signing a group invite fails")) + } + + context.sendGroupInvitePayload(payload, to: peerID) + distributeState(payload, group: updated, excluding: [identity.fingerprint], type: .keyUpdate) + + return .success(message: String( + format: String(localized: "system.group.invited", comment: "System message after inviting someone; placeholders are the nickname and the group name"), + locale: .current, + nickname, + updated.name + )) + } + + /// Creator-side removal: rotates the group key (epoch + 1) and sends the + /// new state to every remaining member so the removed member's key stops + /// decrypting future traffic. + func removeMember(nickname rawNickname: String) -> CommandResult { + let nickname = normalizedNickname(rawNickname) + guard !nickname.isEmpty else { + return .error(message: String(localized: "system.group.usage_remove", comment: "Usage hint for /group remove")) + } + guard let group = selectedGroup() else { + return .error(message: String(localized: "system.group.not_in_group", comment: "Error when a group command requires an open group chat")) + } + guard group.creatorFingerprint == context.myNoiseFingerprint() else { + return .error(message: String(localized: "system.group.creator_only", comment: "Error when a non-creator attempts a creator-only group action")) + } + guard let member = group.members.first(where: { $0.nickname.caseInsensitiveCompare(nickname) == .orderedSame }) else { + return .error(message: String( + format: String(localized: "system.group.member_not_found", comment: "Error when the member to remove is not in the roster; placeholder is the nickname"), + locale: .current, + nickname + )) + } + guard member.fingerprint != group.creatorFingerprint else { + return .error(message: String(localized: "system.group.cannot_remove_creator", comment: "Error when the creator tries to remove themselves")) + } + + let remaining = group.members.filter { $0.fingerprint != member.fingerprint } + guard let (rotated, newKey) = context.groupStore.rotateKey(groupID: group.groupID, members: remaining), + let payload = signedStatePayload(for: rotated, key: newKey) else { + return .error(message: String(localized: "system.group.rotate_failed", comment: "Error when rotating the group key fails")) + } + + distributeState(payload, group: rotated, excluding: [], type: .keyUpdate) + notifyRemovedMember(member, rotated: rotated) + + return .success(message: String( + format: String(localized: "system.group.removed_member", comment: "System message after removing a member and rotating the key; placeholder is the nickname"), + locale: .current, + member.nickname + )) + } + + func leaveGroup() -> CommandResult { + guard let group = selectedGroup() else { + return .error(message: String(localized: "system.group.not_in_group", comment: "Error when a group command requires an open group chat")) + } + // Close the chat window first so the confirmation message doesn't + // resurrect the conversation we're about to remove. + context.endPrivateChat() + context.removePrivateChat(group.peerID) + context.groupStore.removeGroup(withID: group.groupID) + context.notifyUIChanged() + return .success(message: String( + format: String(localized: "system.group.left", comment: "System message after leaving a group; placeholder is the group name"), + locale: .current, + group.name + )) + } + + func listGroups() -> CommandResult { + let groups = context.groupStore.groups + guard !groups.isEmpty else { + return .success(message: String(localized: "system.group.none", comment: "System message when the user is in no groups")) + } + let myFingerprint = context.myNoiseFingerprint() + let lines = groups.map { group -> String in + let role = group.creatorFingerprint == myFingerprint ? " (creator)" : "" + return "#\(group.name)\(role) — \(group.members.count)/\(BitchatGroup.maxMembers)" + } + return .success(message: String(localized: "system.group.list_header", comment: "Header line for the /group list output") + "\n" + lines.joined(separator: "\n")) + } + + // MARK: - Sending + + /// Fire-and-flood send: local echo goes straight to `.sent` because group + /// messages have no per-member acknowledgments in v1. + func sendGroupMessage(_ content: String, to groupPeerID: PeerID) { + guard !content.isEmpty, content.count <= InputValidator.Limits.maxMessageLength else { return } + guard let group = context.groupStore.group(for: groupPeerID), + let key = context.groupStore.key(forGroupID: group.groupID) else { + context.addSystemMessage(String(localized: "system.group.unknown", comment: "System message when sending into an unknown group")) + return + } + + let messageID = UUID().uuidString + let timestamp = Date() + let payload: Data + do { + payload = try GroupCrypto.sealMessage( + content: content, + messageID: messageID, + senderNickname: context.nickname, + senderSigningKey: context.mySigningPublicKey(), + timestampMs: UInt64(timestamp.timeIntervalSince1970 * 1000), + groupID: group.groupID, + epoch: group.epoch, + key: key, + sign: { [weak context] data in context?.signWithNoiseKey(data) } + ) + } catch { + SecureLogger.error("Failed to seal group message: \(error)", category: .encryption) + context.addLocalPrivateSystemMessage( + String(localized: "system.group.send_failed", comment: "System message when sealing a group message fails"), + to: groupPeerID + ) + return + } + + let message = BitchatMessage( + id: messageID, + sender: context.nickname, + content: content, + timestamp: timestamp, + isRelay: false, + originalSender: nil, + isPrivate: true, + recipientNickname: group.name, + senderPeerID: context.myPeerID, + mentions: nil, + deliveryStatus: .sent + ) + context.appendPrivateMessage(message, to: groupPeerID) + context.broadcastGroupMessagePayload(payload) + context.notifyUIChanged() + } + + // MARK: - Receiving + + /// Decrypt-verify path for an incoming 0x25 broadcast. Drops silently for + /// unknown groups (non-members relay but never read), wrong epochs, bad + /// sender signatures, and senders missing from the pinned roster. + func handleGroupMessagePayload(_ payload: Data, timestamp: Date) { + guard let envelope = GroupMessageEnvelope.decode(payload) else { return } + guard let group = context.groupStore.group(withID: envelope.groupID) else { return } + guard envelope.epoch == group.epoch else { + SecureLogger.debug("Dropping group message with epoch \(envelope.epoch) (current \(group.epoch))", category: .encryption) + return + } + guard let key = context.groupStore.key(forGroupID: group.groupID) else { return } + + let plaintext: GroupMessagePlaintext + do { + plaintext = try GroupCrypto.openMessage(envelope, key: key) + } catch { + SecureLogger.debug("Failed to open group message: \(error)", category: .encryption) + return + } + + // Sender must be pinned in the creator-signed roster; key possession + // alone is not authorship. + guard let member = group.member(withSigningKey: plaintext.senderSigningKey) else { + SecureLogger.warning("Dropping group message from non-roster sender", category: .security) + return + } + // Our own broadcast echoed back via relay or sync replay. + guard plaintext.senderSigningKey != context.mySigningPublicKey() else { return } + // Honor /block inside groups too: drop display + notification for a + // blocked member, consistent with every other inbound path. + guard !context.isFingerprintBlocked(member.fingerprint) else { + SecureLogger.debug("Dropping group message from blocked member", category: .security) + return + } + + let groupPeerID = group.peerID + // Trust the authenticated inner timestamp (clamped so a future-dated + // message cannot pin itself to the bottom of the timeline). + let messageDate = min(Date(timeIntervalSince1970: TimeInterval(plaintext.timestampMs) / 1000), Date()) + let senderName = member.nickname.isEmpty ? plaintext.senderNickname : member.nickname + let senderPeerID = PeerID(str: String(member.fingerprint.prefix(16))) + let message = BitchatMessage( + id: plaintext.messageID, + sender: senderName, + content: plaintext.content, + timestamp: messageDate, + isRelay: false, + originalSender: nil, + isPrivate: true, + recipientNickname: group.name, + senderPeerID: senderPeerID, + mentions: nil + ) + + guard context.appendPrivateMessage(message, to: groupPeerID) else { return } + + let isViewing = context.selectedPrivateChatPeer == groupPeerID + if !isViewing { + context.markPrivateChatUnread(groupPeerID) + let isRecent = Date().timeIntervalSince(messageDate) < 30 + if isRecent { + context.notifyPrivateMessage( + from: "\(senderName) @ \(group.name)", + message: plaintext.content, + peerID: groupPeerID + ) + } + } + context.notifyUIChanged() + } + + /// Accepts creator-signed group state arriving as an invite. The Noise + /// session peer must BE the creator, the signature must verify against + /// the creator key pinned in the roster, and we must be in the roster. + func handleGroupInvitePayload(from peerID: PeerID, payload: Data) { + applyGroupState(from: peerID, payload: payload, isInvite: true) + } + + /// Accepts creator-signed state updates (rotation/roster). A state whose + /// roster no longer includes us means we were removed: drop the group. + func handleGroupKeyUpdatePayload(from peerID: PeerID, payload: Data) { + applyGroupState(from: peerID, payload: payload, isInvite: false) + } +} + +private extension ChatGroupCoordinator { + enum StateSendType { + case invite + case keyUpdate + } + + func normalizedNickname(_ raw: String) -> String { + let trimmed = raw.trimmed + return trimmed.hasPrefix("@") ? String(trimmed.dropFirst()) : trimmed + } + + func selectedGroup() -> BitchatGroup? { + guard let selected = context.selectedPrivateChatPeer, selected.isGroup else { return nil } + return context.groupStore.group(for: selected) + } + + func signedStatePayload(for group: BitchatGroup, key: Data) -> Data? { + GroupStatePayload.makeSigned(group: group, key: key) { [weak context] data in + context?.signWithNoiseKey(data) + }?.encode() + } + + /// Sends the state payload to every connected roster member except us and + /// the excluded fingerprints. Offline members catch up the next time the + /// creator sends them state (v1 limitation, documented in the PR). + func distributeState(_ payload: Data, group: BitchatGroup, excluding excludedFingerprints: Set, type: StateSendType) { + let myFingerprint = context.myNoiseFingerprint() + for member in group.members { + guard member.fingerprint != myFingerprint, + !excludedFingerprints.contains(member.fingerprint), + let peerID = context.connectedPeerID(forFingerprint: member.fingerprint) else { continue } + switch type { + case .invite: + context.sendGroupInvitePayload(payload, to: peerID) + case .keyUpdate: + context.sendGroupKeyUpdatePayload(payload, to: peerID) + } + } + } + + /// Tells a just-removed member they're out so their client can deactivate + /// the group instead of silently going dark (dropping every message under + /// the epoch it no longer has the key for). The notice is a creator-signed + /// state whose roster excludes the removee — their `applyGroupState` + /// removal branch fires on the missing-self roster and surfaces the + /// "removed from group" system message. + /// + /// It carries a throwaway all-zero key, never the rotated key, so the + /// removee cannot decrypt post-removal traffic. State is sent 1:1 over + /// authenticated Noise, so no remaining member ever receives this blob + /// (and even if one did, its own missing-self check would not match). + /// If the removee is offline the notice can't be delivered — same v1 + /// limitation as any other missed key update, documented in the PR. + func notifyRemovedMember(_ removed: GroupMember, rotated: BitchatGroup) { + guard let peerID = context.connectedPeerID(forFingerprint: removed.fingerprint) else { return } + let throwawayKey = Data(count: BitchatGroup.keyLength) + guard let payload = signedStatePayload(for: rotated, key: throwawayKey) else { return } + context.sendGroupKeyUpdatePayload(payload, to: peerID) + } + + func applyGroupState(from peerID: PeerID, payload: Data, isInvite: Bool) { + guard let state = GroupStatePayload.decode(payload) else { + SecureLogger.warning("Malformed group state payload from \(peerID.id.prefix(8))…", category: .security) + return + } + // The Noise session already authenticated `peerID`; require that the + // authenticated peer IS the creator whose key signed the state, so a + // member can't re-invite or rotate on the creator's behalf. + guard let senderFingerprint = context.meshFingerprint(for: peerID), + senderFingerprint == state.creatorFingerprint else { + SecureLogger.warning("Dropping group state from non-creator \(peerID.id.prefix(8))…", category: .security) + return + } + guard state.verifyCreatorSignature() else { + SecureLogger.warning("Dropping group state with invalid creator signature", category: .security) + return + } + + let myFingerprint = context.myNoiseFingerprint() + let existing = context.groupStore.group(withID: state.groupID) + + // A creator-signed roster that no longer includes us is a removal. + guard state.members.contains(where: { $0.fingerprint == myFingerprint }) else { + if let existing { + if context.selectedPrivateChatPeer == existing.peerID { + context.endPrivateChat() + } + context.removePrivateChat(existing.peerID) + context.groupStore.removeGroup(withID: existing.groupID) + context.addSystemMessage(String( + format: String(localized: "system.group.removed_from", comment: "System message when removed from a group; placeholder is the group name"), + locale: .current, + existing.name + )) + context.notifyUIChanged() + } + return + } + + // Never regress the epoch: state travels over live Noise sessions, + // so an older epoch here is a stale (or misbehaving) creator device. + if let existing, state.epoch < existing.epoch { + SecureLogger.warning("Dropping stale group state (epoch \(state.epoch) < \(existing.epoch))", category: .security) + return + } + + let isNewMembership = existing == nil + guard context.groupStore.upsert(state.asGroup, key: state.key) else { + SecureLogger.error("Failed to store group state for \(state.name)", category: .session) + return + } + + if isNewMembership { + let inviter = state.members.first { $0.fingerprint == state.creatorFingerprint }?.nickname + ?? context.peerNickname(for: peerID) + ?? "?" + let notice = String( + format: String(localized: "system.group.joined", comment: "System message when added to a group; placeholders are the group name and the inviter"), + locale: .current, + state.name, + inviter + ) + context.addSystemMessage(notice) + context.markPrivateChatUnread(state.asGroup.peerID) + context.notifyPrivateMessage(from: inviter, message: notice, peerID: state.asGroup.peerID) + } else if isInvite == false, let existing, state.epoch > existing.epoch { + SecureLogger.info("Group '\(state.name)' rotated to epoch \(state.epoch)", category: .session) + } + context.notifyUIChanged() + } +} diff --git a/bitchat/ViewModels/ChatLifecycleCoordinator.swift b/bitchat/ViewModels/ChatLifecycleCoordinator.swift index 60c199f6..1241f71b 100644 --- a/bitchat/ViewModels/ChatLifecycleCoordinator.swift +++ b/bitchat/ViewModels/ChatLifecycleCoordinator.swift @@ -185,6 +185,13 @@ final class ChatLifecycleCoordinator { func markPrivateMessagesAsRead(from peerID: PeerID) { context.markChatAsRead(from: peerID) + // Group chats are keyed under a virtual group_ peerID; no member IS the + // conversation peer, so the receipt loops below (which gate on + // senderPeerID == peerID) must never emit a read/delivered receipt for + // one. This guard makes that explicit so a future refactor of the + // receipt matching can't silently start leaking receipts into groups. + guard !peerID.isGroup else { return } + if peerID.isGeoDM, let recipientHex = context.nostrKeyMapping[peerID], case .location(let channel) = context.activeChannel, diff --git a/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift b/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift index 46e0787a..30d566b8 100644 --- a/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift +++ b/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift @@ -323,6 +323,15 @@ final class ChatPeerIdentityCoordinator { func startPrivateChat(with peerID: PeerID) { guard peerID != context.myPeerID else { return } + // Group chats are virtual conversations: no peer identity, favorites, + // handshake, or message consolidation applies — just select the chat. + if peerID.isGroup { + context.selectedPrivateChatFingerprint = nil + context.beginPrivateChatSession(with: peerID) + context.markPrivateChatRead(peerID) + return + } + let peerNickname = context.peerNickname(for: peerID) ?? "unknown" if context.unifiedIsBlocked(peerID) { diff --git a/bitchat/ViewModels/ChatTransportEventCoordinator.swift b/bitchat/ViewModels/ChatTransportEventCoordinator.swift index a24273d7..34b1653c 100644 --- a/bitchat/ViewModels/ChatTransportEventCoordinator.swift +++ b/bitchat/ViewModels/ChatTransportEventCoordinator.swift @@ -71,6 +71,10 @@ protocol ChatTransportEventContext: AnyObject { // MARK: Verification payloads func handleVerifyChallengePayload(from peerID: PeerID, payload: Data) func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) + + // MARK: Group payloads (creator-signed state over Noise) + func handleGroupInvitePayload(from peerID: PeerID, payload: Data) + func handleGroupKeyUpdatePayload(from peerID: PeerID, payload: Data) func handleVouchPayload(from peerID: PeerID, payload: Data) } @@ -131,6 +135,14 @@ extension ChatViewModel: ChatTransportEventContext { verificationCoordinator.handleVerifyResponsePayload(from: peerID, payload: payload) } + func handleGroupInvitePayload(from peerID: PeerID, payload: Data) { + groupCoordinator.handleGroupInvitePayload(from: peerID, payload: payload) + } + + func handleGroupKeyUpdatePayload(from peerID: PeerID, payload: Data) { + groupCoordinator.handleGroupKeyUpdatePayload(from: peerID, payload: payload) + } + func handleVouchPayload(from peerID: PeerID, payload: Data) { vouchCoordinator.handleVouchPayload(from: peerID, payload: payload) } @@ -377,6 +389,12 @@ private extension ChatTransportEventCoordinator { case .verifyResponse: context.handleVerifyResponsePayload(from: peerID, payload: payload) + case .groupInvite: + context.handleGroupInvitePayload(from: peerID, payload: payload) + + case .groupKeyUpdate: + context.handleGroupKeyUpdatePayload(from: peerID, payload: payload) + case .vouch: context.handleVouchPayload(from: peerID, payload: payload) } diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 21e250f2..c0c0d8b1 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -102,7 +102,9 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele @MainActor var canSendMediaInCurrentContext: Bool { if let peer = selectedPrivateChatPeer { - return !(peer.isGeoDM || peer.isGeoChat) + // Media transfer is not wired for groups in v1 (sendFilePrivate + // rejects the virtual group_ recipient), so keep the affordance off. + return !(peer.isGeoDM || peer.isGeoChat || peer.isGroup) } switch activeChannel { case .mesh: return true @@ -177,6 +179,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele lazy var nostrCoordinator = ChatNostrCoordinator(context: self) lazy var mediaTransferCoordinator = ChatMediaTransferCoordinator(context: self) lazy var verificationCoordinator = ChatVerificationCoordinator(context: self) + lazy var groupCoordinator = ChatGroupCoordinator(context: self) lazy var vouchCoordinator = ChatVouchCoordinator(context: self) // Computed properties for compatibility @@ -306,6 +309,8 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele var nostrRelayManager: NostrRelayManager? private let userDefaults = UserDefaults.standard let keychain: KeychainManagerProtocol + /// Private group membership: keys in the keychain, metadata on disk. + let groupStore: GroupStore private let nicknameKey = "bitchat.nickname" // Location channel state (macOS supports manual geohash selection) var activeChannel: ChannelID { @@ -813,6 +818,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele ) self.keychain = keychain + self.groupStore = GroupStore(keychain: keychain) self.idBridge = idBridge self.identityManager = identityManager self.conversations = conversations @@ -1209,6 +1215,8 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele GossipMessageArchive.wipeDefault() StoreAndForwardMetrics.shared.reset() + // Drop private group keys and rosters (keychain + disk) + groupStore.wipe() // Drop cached peers' prekey bundles (who we could write to is // metadata too). Our own prekey privates are keychain-backed and go // with deleteAllKeychainData above plus the identity reset below. @@ -1609,6 +1617,12 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele ) } + func didReceiveGroupMessage(payload: Data, timestamp: Date) { + Task { @MainActor [weak self] in + self?.groupCoordinator.handleGroupMessagePayload(payload, timestamp: timestamp) + } + } + // MARK: - QR Verification API @MainActor func beginQRVerification(with qr: VerificationService.VerificationQR) -> Bool { diff --git a/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift b/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift index af8d06aa..939adf6a 100644 --- a/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift +++ b/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift @@ -13,6 +13,12 @@ extension ChatViewModel { @MainActor func sendPrivateMessage(_ content: String, to peerID: PeerID) { + // Group chats reuse the private-chat surface but broadcast a sealed + // envelope instead of routing to a single peer. + if peerID.isGroup { + groupCoordinator.sendGroupMessage(content, to: peerID) + return + } privateConversationCoordinator.sendPrivateMessage(content, to: peerID) } diff --git a/bitchat/ViewModels/NostrInboundPipeline.swift b/bitchat/ViewModels/NostrInboundPipeline.swift index c5bd6525..be50a687 100644 --- a/bitchat/ViewModels/NostrInboundPipeline.swift +++ b/bitchat/ViewModels/NostrInboundPipeline.swift @@ -303,7 +303,9 @@ final class NostrInboundPipeline { context.handleDelivered(noisePayload, senderPubkey: senderPubkey, convKey: convKey) case .readReceipt: context.handleReadReceipt(noisePayload, senderPubkey: senderPubkey, convKey: convKey) - case .verifyChallenge, .verifyResponse, .vouch: + // Group state travels only over mesh Noise sessions in v1; anything + // claiming to be group traffic over Nostr is ignored. + case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate, .vouch: break } } @@ -355,7 +357,9 @@ final class NostrInboundPipeline { context.handleDelivered(payload, senderPubkey: senderPubkey, convKey: convKey) case .readReceipt: context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: convKey) - case .verifyChallenge, .verifyResponse, .vouch: + // Group state travels only over mesh Noise sessions in v1; anything + // claiming to be group traffic over Nostr is ignored. + case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate, .vouch: break } } @@ -434,7 +438,9 @@ final class NostrInboundPipeline { context.handleDelivered(payload, senderPubkey: senderPubkey, convKey: targetPeerID) case .readReceipt: context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: targetPeerID) - case .verifyChallenge, .verifyResponse, .vouch: + // Group state travels only over mesh Noise sessions + // in v1; group traffic over Nostr is ignored. + case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate, .vouch: break } } diff --git a/bitchat/Views/ContentSheetViews.swift b/bitchat/Views/ContentSheetViews.swift index dd72d8b6..4d9d5c5b 100644 --- a/bitchat/Views/ContentSheetViews.swift +++ b/bitchat/Views/ContentSheetViews.swift @@ -221,6 +221,13 @@ private struct ContentPeopleListView: View { } ) } else { + GroupChatList( + groups: peerListModel.groupRows, + onTapGroup: { peerID in + peerListModel.startConversation(with: peerID) + showSidebar = true + } + ) MeshPeerList( onTapPeer: { peerID in peerListModel.startConversation(with: peerID) @@ -455,6 +462,10 @@ private struct ContentPrivateChatSheetView: View { } private var privacyCaptionText: String { + // Group chats are ChaCha20-Poly1305 sealed to the roster's shared key. + if privateConversationModel.selectedPeerID?.isGroup == true { + return String(localized: "content.private.caption_group", comment: "Caption above the group chat composer noting messages are encrypted to group members") + } // Geohash DMs are NIP-17 gift-wrapped — always end-to-end encrypted, // even though they carry no Noise session status. Mesh DMs earn the // "encrypted" claim only once the Noise handshake has secured. @@ -503,30 +514,39 @@ private struct ContentPrivateHeaderInfoButton: View { var body: some View { Button(action: { + // A group has no single fingerprint to show. + guard !headerState.isGroupConversation else { return } appChromeModel.showFingerprint(for: headerState.headerPeerID) }) { HStack(spacing: 6) { - switch headerState.availability { - case .bluetoothConnected: - Image(systemName: "dot.radiowaves.left.and.right") + if headerState.isGroupConversation { + Image(systemName: "person.3.fill") .font(.bitchatSystem(size: 14)) .foregroundColor(palette.primary) - .accessibilityLabel(String(localized: "content.accessibility.connected_mesh", comment: "Accessibility label for mesh-connected peer indicator")) - case .meshReachable: - Image(systemName: "point.3.filled.connected.trianglepath.dotted") - .font(.bitchatSystem(size: 14)) - .foregroundColor(palette.primary) - .accessibilityLabel(String(localized: "content.accessibility.reachable_mesh", comment: "Accessibility label for mesh-reachable peer indicator")) - case .nostrAvailable: - Image(systemName: "globe") - .font(.bitchatSystem(size: 14)) - .foregroundColor(.purple) - .accessibilityLabel(String(localized: "content.accessibility.available_nostr", comment: "Accessibility label for Nostr-available peer indicator")) - case .offline: - // Absence of a glyph was the only offline signal; say it. - Text("mesh_peers.state.offline") - .bitchatFont(size: 11) - .foregroundColor(palette.secondary) + .accessibilityLabel(String(localized: "content.accessibility.group_chat", comment: "Accessibility label for the group chat indicator")) + } else { + switch headerState.availability { + case .bluetoothConnected: + Image(systemName: "dot.radiowaves.left.and.right") + .font(.bitchatSystem(size: 14)) + .foregroundColor(palette.primary) + .accessibilityLabel(String(localized: "content.accessibility.connected_mesh", comment: "Accessibility label for mesh-connected peer indicator")) + case .meshReachable: + Image(systemName: "point.3.filled.connected.trianglepath.dotted") + .font(.bitchatSystem(size: 14)) + .foregroundColor(palette.primary) + .accessibilityLabel(String(localized: "content.accessibility.reachable_mesh", comment: "Accessibility label for mesh-reachable peer indicator")) + case .nostrAvailable: + Image(systemName: "globe") + .font(.bitchatSystem(size: 14)) + .foregroundColor(.purple) + .accessibilityLabel(String(localized: "content.accessibility.available_nostr", comment: "Accessibility label for Nostr-available peer indicator")) + case .offline: + // Absence of a glyph was the only offline signal; say it. + Text("mesh_peers.state.offline") + .bitchatFont(size: 11) + .foregroundColor(palette.secondary) + } } Text(headerState.displayName) @@ -571,7 +591,9 @@ private struct ContentPrivateHeaderInfoButton: View { ) ) .accessibilityHint( - String(localized: "content.accessibility.view_fingerprint_hint", comment: "Accessibility hint for viewing encryption fingerprint") + headerState.isGroupConversation + ? "" + : String(localized: "content.accessibility.view_fingerprint_hint", comment: "Accessibility hint for viewing encryption fingerprint") ) .frame(minHeight: headerHeight) } diff --git a/bitchat/Views/GroupChatList.swift b/bitchat/Views/GroupChatList.swift new file mode 100644 index 00000000..8b62d8a2 --- /dev/null +++ b/bitchat/Views/GroupChatList.swift @@ -0,0 +1,86 @@ +import BitFoundation +import SwiftUI + +/// Compact "groups" section for the people sheet: one row per private group +/// this device belongs to, tappable to open the group chat window. +struct GroupChatList: View { + @ThemedPalette private var palette + + let groups: [GroupChatRow] + let onTapGroup: (PeerID) -> Void + + private enum Strings { + static let header = String(localized: "groups.section.header", comment: "Section header above the private groups list") + static let creator = String(localized: "groups.state.creator", comment: "State label for a group the user created") + static let unread = String(localized: "mesh_peers.state.unread", comment: "State label for a peer with unread private messages") + static let newMessagesTooltip = String(localized: "mesh_peers.tooltip.new_messages", comment: "Tooltip for the unread messages indicator") + static let openGroupHint = String(localized: "groups.accessibility.open_group_hint", comment: "Accessibility hint on a group row explaining activation opens the group chat") + static let memberCountFormat = String(localized: "groups.member_count %@", comment: "Member count shown next to a group name; placeholder is the count") + } + + var body: some View { + if !groups.isEmpty { + VStack(alignment: .leading, spacing: 0) { + Text(Strings.header) + .bitchatFont(size: 11, weight: .medium) + .foregroundColor(palette.secondary) + .padding(.horizontal) + .padding(.top, 10) + .padding(.bottom, 2) + .accessibilityAddTraits(.isHeader) + + ForEach(groups) { group in + HStack(spacing: 4) { + Image(systemName: "person.3.fill") + .font(.bitchatSystem(size: 10)) + .foregroundColor(palette.primary) + + Text("#\(group.name)") + .bitchatFont(size: 14) + .foregroundColor(palette.primary) + .lineLimit(1) + .truncationMode(.tail) + + Text(String(format: Strings.memberCountFormat, locale: .current, "\(group.memberCount)")) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + + if group.isCreator { + Image(systemName: "crown.fill") + .font(.bitchatSystem(size: 9)) + .foregroundColor(.yellow) + .help(Strings.creator) + } + + Spacer() + + if group.hasUnread { + Image(systemName: "envelope.fill") + .font(.bitchatSystem(size: 10)) + .foregroundColor(.orange) + .help(Strings.newMessagesTooltip) + } + } + .padding(.horizontal) + .padding(.vertical, 6) + .contentShape(Rectangle()) + .onTapGesture { onTapGroup(group.peerID) } + .accessibilityElement(children: .ignore) + .accessibilityLabel(accessibilityDescription(for: group)) + .accessibilityAddTraits(.isButton) + .accessibilityHint(Strings.openGroupHint) + } + } + } + } + + private func accessibilityDescription(for group: GroupChatRow) -> String { + var parts: [String] = [ + group.name, + String(format: Strings.memberCountFormat, locale: .current, "\(group.memberCount)") + ] + if group.isCreator { parts.append(Strings.creator) } + if group.hasUnread { parts.append(Strings.unread) } + return parts.joined(separator: ", ") + } +} diff --git a/bitchatTests/ChatTransportEventCoordinatorContextTests.swift b/bitchatTests/ChatTransportEventCoordinatorContextTests.swift index bd112e9b..b0d39782 100644 --- a/bitchatTests/ChatTransportEventCoordinatorContextTests.swift +++ b/bitchatTests/ChatTransportEventCoordinatorContextTests.swift @@ -157,6 +157,18 @@ private final class MockChatTransportEventContext: ChatTransportEventContext { verifyResponsePayloads.append((peerID, payload)) } + // Group payloads + private(set) var groupInvitePayloads: [(peerID: PeerID, payload: Data)] = [] + private(set) var groupKeyUpdatePayloads: [(peerID: PeerID, payload: Data)] = [] + + func handleGroupInvitePayload(from peerID: PeerID, payload: Data) { + groupInvitePayloads.append((peerID, payload)) + } + + func handleGroupKeyUpdatePayload(from peerID: PeerID, payload: Data) { + groupKeyUpdatePayloads.append((peerID, payload)) + } + private(set) var vouchPayloads: [(peerID: PeerID, payload: Data)] = [] func handleVouchPayload(from peerID: PeerID, payload: Data) { diff --git a/bitchatTests/CommandProcessorTests.swift b/bitchatTests/CommandProcessorTests.swift index 718df1c8..3da82140 100644 --- a/bitchatTests/CommandProcessorTests.swift +++ b/bitchatTests/CommandProcessorTests.swift @@ -678,4 +678,32 @@ private final class MockCommandContextProvider: CommandContextProvider { func sendFavoriteNotification(to peerID: PeerID, isFavorite: Bool) { favoriteNotifications.append((peerID, isFavorite)) } + + // Groups: record the parsed subcommand + argument the processor forwarded. + private(set) var groupCommands: [(subcommand: String, argument: String)] = [] + + func groupCreate(named name: String) -> CommandResult { + groupCommands.append(("create", name)) + return .handled + } + + func groupInvite(nickname: String) -> CommandResult { + groupCommands.append(("invite", nickname)) + return .handled + } + + func groupRemove(nickname: String) -> CommandResult { + groupCommands.append(("remove", nickname)) + return .handled + } + + func groupLeave() -> CommandResult { + groupCommands.append(("leave", "")) + return .handled + } + + func groupList() -> CommandResult { + groupCommands.append(("list", "")) + return .handled + } } diff --git a/bitchatTests/GossipSyncManagerTests.swift b/bitchatTests/GossipSyncManagerTests.swift index 5f15e377..de1fa209 100644 --- a/bitchatTests/GossipSyncManagerTests.swift +++ b/bitchatTests/GossipSyncManagerTests.swift @@ -208,7 +208,10 @@ struct GossipSyncManagerTests { #expect(allTypes.contains(.fragment)) #expect(allTypes.contains(.fileTransfer)) #expect(allTypes.contains(.prekeyBundle)) - #expect(decoded.contains { $0.types == .publicMessages }) + #expect(allTypes.contains(.groupMessage)) + // The message schedule also asks for group messages (bit 10); + // responders that don't know the bit just ignore it. + #expect(decoded.contains { $0.types == SyncTypeFlags.publicMessages.union(.groupMessage) }) #expect(decoded.contains { $0.types == .fragment }) #expect(decoded.contains { $0.types == .fileTransfer }) #expect(decoded.contains { $0.types == .prekeyBundle }) diff --git a/bitchatTests/Services/GroupProtocolTests.swift b/bitchatTests/Services/GroupProtocolTests.swift new file mode 100644 index 00000000..f9f19e7f --- /dev/null +++ b/bitchatTests/Services/GroupProtocolTests.swift @@ -0,0 +1,374 @@ +// +// GroupProtocolTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import CryptoKit +import Foundation +import Testing +import BitFoundation +@testable import bitchat + +struct GroupProtocolTests { + + // MARK: - Fixtures + + /// Deterministic member identity: an Ed25519 keypair plus the 64-hex + /// fingerprint the roster pins. + private struct TestIdentity { + let signingKey: Curve25519.Signing.PrivateKey + let fingerprint: String + + init(seed: UInt8) { + signingKey = Curve25519.Signing.PrivateKey() + fingerprint = Data(repeating: seed, count: 32).hexEncodedString() + } + + var member: GroupMember { + GroupMember( + fingerprint: fingerprint, + signingKey: signingKey.publicKey.rawRepresentation, + nickname: "peer-\(fingerprint.prefix(4))" + ) + } + + func sign(_ data: Data) -> Data? { + try? signingKey.signature(for: data) + } + } + + private let creator = TestIdentity(seed: 0xC1) + private let member = TestIdentity(seed: 0xA2) + private let outsider = TestIdentity(seed: 0xE3) + + private let groupID = Data((0..<16).map { UInt8($0) }) + private let key = Data(repeating: 0x42, count: 32) + + private func makeGroup(extraMembers: [GroupMember] = [], epoch: UInt32 = 1) -> BitchatGroup { + BitchatGroup( + groupID: groupID, + name: "trail crew", + epoch: epoch, + members: [creator.member, member.member] + extraMembers, + creatorFingerprint: creator.fingerprint + ) + } + + // MARK: - State payload (invite / key update) + + @Test func statePayloadRoundTripAndSignatureVerify() throws { + let group = makeGroup() + let payload = try #require(GroupStatePayload.makeSigned(group: group, key: key, sign: creator.sign)) + let encoded = try #require(payload.encode()) + + let decoded = try #require(GroupStatePayload.decode(encoded)) + #expect(decoded == payload) + #expect(decoded.groupID == groupID) + #expect(decoded.name == "trail crew") + #expect(decoded.key == key) + #expect(decoded.epoch == 1) + #expect(decoded.members == group.members) + #expect(decoded.creatorFingerprint == creator.fingerprint) + #expect(decoded.verifyCreatorSignature()) + #expect(decoded.asGroup == group) + } + + @Test func forgedCreatorSignatureIsRejected() throws { + let group = makeGroup() + // Signed by a member who is in the roster but is NOT the creator. + let forged = try #require(GroupStatePayload.makeSigned(group: group, key: key, sign: member.sign)) + #expect(!forged.verifyCreatorSignature()) + + // An outsider signing is equally rejected. + let outsiderForged = try #require(GroupStatePayload.makeSigned(group: group, key: key, sign: outsider.sign)) + #expect(!outsiderForged.verifyCreatorSignature()) + } + + @Test func tamperedStateFailsSignature() throws { + let group = makeGroup() + let payload = try #require(GroupStatePayload.makeSigned(group: group, key: key, sign: creator.sign)) + + // Bumping the epoch invalidates the signature. + let epochTampered = GroupStatePayload( + groupID: payload.groupID, + name: payload.name, + key: payload.key, + epoch: payload.epoch + 1, + members: payload.members, + creatorFingerprint: payload.creatorFingerprint, + signature: payload.signature + ) + #expect(!epochTampered.verifyCreatorSignature()) + + // So does swapping the key. + let keyTampered = GroupStatePayload( + groupID: payload.groupID, + name: payload.name, + key: Data(repeating: 0x99, count: 32), + epoch: payload.epoch, + members: payload.members, + creatorFingerprint: payload.creatorFingerprint, + signature: payload.signature + ) + #expect(!keyTampered.verifyCreatorSignature()) + + // And so does adding a member to the roster. + let rosterTampered = GroupStatePayload( + groupID: payload.groupID, + name: payload.name, + key: payload.key, + epoch: payload.epoch, + members: payload.members + [outsider.member], + creatorFingerprint: payload.creatorFingerprint, + signature: payload.signature + ) + #expect(!rosterTampered.verifyCreatorSignature()) + } + + @Test func creatorMissingFromRosterIsRejected() throws { + // State claiming a creator whose fingerprint is not in the roster has + // no key to verify against and must fail closed. + let group = BitchatGroup( + groupID: groupID, + name: "orphan", + epoch: 1, + members: [member.member], + creatorFingerprint: creator.fingerprint + ) + guard let rosterBlob = GroupRosterCoding.encode(group.members) else { + Issue.record("roster should encode") + return + } + let content = GroupStatePayload.signingContent(groupID: groupID, epoch: 1, key: key, rosterBlob: rosterBlob, name: group.name) + let payload = GroupStatePayload( + groupID: groupID, + name: group.name, + key: key, + epoch: 1, + members: group.members, + creatorFingerprint: creator.fingerprint, + signature: creator.sign(content) ?? Data() + ) + #expect(!payload.verifyCreatorSignature()) + } + + @Test func rosterCapIsEnforcedOnTheWire() { + // 17 members cannot be encoded (hard cap is 16)… + let seventeen = (0..<17).map { TestIdentity(seed: UInt8($0 + 1)).member } + #expect(GroupRosterCoding.encode(seventeen) == nil) + + // …and a hand-built blob claiming 17 members fails to decode. + let sixteen = (0..<16).map { TestIdentity(seed: UInt8($0 + 1)).member } + guard var blob = GroupRosterCoding.encode(sixteen) else { + Issue.record("16-member roster should encode") + return + } + #expect(GroupRosterCoding.decode(blob)?.count == 16) + blob[blob.startIndex] = 17 + #expect(GroupRosterCoding.decode(blob) == nil) + } + + // MARK: - Message seal / open + + @Test func messageRoundTrip() throws { + let group = makeGroup() + let timestampMs: UInt64 = 1_750_000_000_000 + let sealed = try GroupCrypto.sealMessage( + content: "summit at noon", + messageID: "msg-1", + senderNickname: "alice", + senderSigningKey: member.member.signingKey, + timestampMs: timestampMs, + groupID: groupID, + epoch: group.epoch, + key: key, + sign: member.sign + ) + + let envelope = try #require(GroupMessageEnvelope.decode(sealed)) + #expect(envelope.groupID == groupID) + #expect(envelope.epoch == group.epoch) + + let plaintext = try GroupCrypto.openMessage(envelope, key: key) + #expect(plaintext.messageID == "msg-1") + #expect(plaintext.content == "summit at noon") + #expect(plaintext.senderNickname == "alice") + #expect(plaintext.timestampMs == timestampMs) + #expect(plaintext.senderSigningKey == member.member.signingKey) + + // The roster resolves the sender; an outsider's key would not. + #expect(group.member(withSigningKey: plaintext.senderSigningKey) != nil) + #expect(group.member(withSigningKey: outsider.member.signingKey) == nil) + } + + @Test func wrongKeyFailsToDecrypt() throws { + let sealed = try GroupCrypto.sealMessage( + content: "hi", + messageID: "msg-2", + senderNickname: "alice", + senderSigningKey: member.member.signingKey, + timestampMs: 1, + groupID: groupID, + epoch: 1, + key: key, + sign: member.sign + ) + let envelope = try #require(GroupMessageEnvelope.decode(sealed)) + #expect(throws: GroupCryptoError.decryptionFailed) { + _ = try GroupCrypto.openMessage(envelope, key: Data(repeating: 0x7F, count: 32)) + } + } + + @Test func epochIsBoundIntoTheCiphertext() throws { + // Re-labeling an epoch-1 envelope as epoch 2 must break the AEAD: + // a rotated-out member cannot replay old ciphertext into a new epoch. + let sealed = try GroupCrypto.sealMessage( + content: "hi", + messageID: "msg-3", + senderNickname: "alice", + senderSigningKey: member.member.signingKey, + timestampMs: 1, + groupID: groupID, + epoch: 1, + key: key, + sign: member.sign + ) + let envelope = try #require(GroupMessageEnvelope.decode(sealed)) + let relabeled = GroupMessageEnvelope( + groupID: envelope.groupID, + epoch: 2, + nonce: envelope.nonce, + ciphertext: envelope.ciphertext + ) + #expect(throws: GroupCryptoError.decryptionFailed) { + _ = try GroupCrypto.openMessage(relabeled, key: key) + } + } + + @Test func badSenderSignatureIsRejected() throws { + // A key-holder who signs with a key other than the one they claim + // (or garbage) is dropped even though decryption succeeds. + let sealed = try GroupCrypto.sealMessage( + content: "spoof", + messageID: "msg-4", + senderNickname: "mallory", + senderSigningKey: member.member.signingKey, // claims member's key… + timestampMs: 1, + groupID: groupID, + epoch: 1, + key: key, + sign: outsider.sign // …but signs with the outsider's + ) + let envelope = try #require(GroupMessageEnvelope.decode(sealed)) + #expect(throws: GroupCryptoError.badSenderSignature) { + _ = try GroupCrypto.openMessage(envelope, key: key) + } + } + + @Test func tamperedCiphertextFailsToOpen() throws { + let sealed = try GroupCrypto.sealMessage( + content: "hi", + messageID: "msg-5", + senderNickname: "alice", + senderSigningKey: member.member.signingKey, + timestampMs: 1, + groupID: groupID, + epoch: 1, + key: key, + sign: member.sign + ) + let envelope = try #require(GroupMessageEnvelope.decode(sealed)) + var flipped = envelope.ciphertext + flipped[flipped.startIndex] ^= 0x01 + let tampered = GroupMessageEnvelope( + groupID: envelope.groupID, + epoch: envelope.epoch, + nonce: envelope.nonce, + ciphertext: flipped + ) + #expect(throws: GroupCryptoError.decryptionFailed) { + _ = try GroupCrypto.openMessage(tampered, key: key) + } + } + + @Test func malformedEnvelopesAreRejected() { + #expect(GroupMessageEnvelope.decode(Data()) == nil) + #expect(GroupMessageEnvelope.decode(Data([0x01, 0x00])) == nil) + #expect(GroupStatePayload.decode(Data([0xFF, 0x00, 0x01])) == nil) + } + + // MARK: - Oversize / UTF-8 safety (Codex findings) + + @Test func oversizeMessageContentFailsToSealInsteadOfTruncating() { + // A content whose UTF-8 exceeds the 16-bit TLV length must fail to + // seal (surfacing send_failed) rather than silently truncate into a + // ciphertext recipients would drop. + let oversize = String(repeating: "a", count: 70_000) + #expect(throws: (any Error).self) { + _ = try GroupCrypto.sealMessage( + content: oversize, + messageID: "big", + senderNickname: "alice", + senderSigningKey: member.member.signingKey, + timestampMs: 1, + groupID: groupID, + epoch: 1, + key: key, + sign: member.sign + ) + } + } + + @Test func multiByteNicknameTruncatesOnScalarBoundary() throws { + // 40 euro signs = 120 UTF-8 bytes; a raw 64-byte prefix would split + // the 21st scalar and make the roster undecodable. Truncation must + // land on a Character boundary so the blob round-trips. + let euros = String(repeating: "€", count: 40) + let wide = GroupMember( + fingerprint: creator.fingerprint, + signingKey: creator.member.signingKey, + nickname: euros + ) + let blob = try #require(GroupRosterCoding.encode([wide])) + let decoded = try #require(GroupRosterCoding.decode(blob)) + #expect(decoded.count == 1) + #expect(Data(decoded[0].nickname.utf8).count <= 64) + #expect(decoded[0].nickname.allSatisfy { $0 == "€" }) + #expect(!decoded[0].nickname.isEmpty) + } + + // MARK: - Signable-bytes forward-proofing + + @Test func creatorSignatureCoversName() throws { + let group = makeGroup() + let payload = try #require(GroupStatePayload.makeSigned(group: group, key: key, sign: creator.sign)) + #expect(payload.verifyCreatorSignature()) + + // Swapping only the display name must invalidate the creator signature. + let renamed = GroupStatePayload( + groupID: payload.groupID, + name: "totally different name", + key: payload.key, + epoch: payload.epoch, + members: payload.members, + creatorFingerprint: payload.creatorFingerprint, + signature: payload.signature + ) + #expect(!renamed.verifyCreatorSignature()) + } + + @Test func messageSignatureCoversEpoch() { + // The signed bytes differ by epoch, so a signature captured at one + // epoch cannot verify when re-sealed under a later epoch key. + let atEpoch1 = GroupCrypto.messageSigningContent( + groupID: groupID, epoch: 1, messageID: "m", timestampMs: 1, content: "x" + ) + let atEpoch2 = GroupCrypto.messageSigningContent( + groupID: groupID, epoch: 2, messageID: "m", timestampMs: 1, content: "x" + ) + #expect(atEpoch1 != atEpoch2) + } +} diff --git a/bitchatTests/Services/GroupStoreTests.swift b/bitchatTests/Services/GroupStoreTests.swift new file mode 100644 index 00000000..adf04806 --- /dev/null +++ b/bitchatTests/Services/GroupStoreTests.swift @@ -0,0 +1,170 @@ +// +// GroupStoreTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +import BitFoundation +@testable import bitchat + +@MainActor +struct GroupStoreTests { + + private func makeMember(seed: UInt8, nickname: String = "peer") -> GroupMember { + GroupMember( + fingerprint: Data(repeating: seed, count: 32).hexEncodedString(), + signingKey: Data(repeating: seed &+ 1, count: 32), + nickname: nickname + ) + } + + private func tempFileURL() -> URL { + FileManager.default.temporaryDirectory + .appendingPathComponent("group-store-tests-\(UUID().uuidString)", isDirectory: true) + .appendingPathComponent("groups.json") + } + + // MARK: - Create / read + + @Test func createGroupStoresMetadataAndKey() throws { + let store = GroupStore(keychain: MockKeychain(), persistsToDisk: false) + let creator = makeMember(seed: 0xC1, nickname: "me") + + let group = try #require(store.createGroup(named: "ops", creator: creator)) + #expect(group.groupID.count == BitchatGroup.groupIDLength) + #expect(group.epoch == 1) + #expect(group.members == [creator]) + #expect(group.creatorFingerprint == creator.fingerprint) + + #expect(store.group(withID: group.groupID) == group) + #expect(store.group(for: group.peerID) == group) + let key = try #require(store.key(forGroupID: group.groupID)) + #expect(key.count == BitchatGroup.keyLength) + #expect(group.peerID.isGroup) + #expect(group.peerID.groupIDData == group.groupID) + } + + // MARK: - Roster cap + + @Test func rosterCapIsEnforced() throws { + let store = GroupStore(keychain: MockKeychain(), persistsToDisk: false) + let creator = makeMember(seed: 0xC1) + let group = try #require(store.createGroup(named: "big", creator: creator)) + + // Filling to the cap works… + let fifteen = (1...15).map { makeMember(seed: UInt8($0)) } + #expect(store.updateRoster(groupID: group.groupID, members: [creator] + fifteen) != nil) + #expect(store.group(withID: group.groupID)?.members.count == BitchatGroup.maxMembers) + + // …one more is rejected. + let overflow = [creator] + fifteen + [makeMember(seed: 0x99)] + #expect(store.updateRoster(groupID: group.groupID, members: overflow) == nil) + #expect(store.group(withID: group.groupID)?.members.count == BitchatGroup.maxMembers) + + // Direct upsert past the cap is rejected too. + var oversized = group + oversized.members = overflow + #expect(!store.upsert(oversized, key: Data(repeating: 1, count: 32))) + } + + @Test func rosterMustRetainCreator() throws { + let store = GroupStore(keychain: MockKeychain(), persistsToDisk: false) + let creator = makeMember(seed: 0xC1) + let other = makeMember(seed: 0xA1) + let group = try #require(store.createGroup(named: "crew", creator: creator)) + + #expect(store.updateRoster(groupID: group.groupID, members: [other]) == nil) + #expect(store.group(withID: group.groupID)?.members == [creator]) + } + + // MARK: - Rotation + + @Test func rotateKeyBumpsEpochAndReplacesKey() throws { + let store = GroupStore(keychain: MockKeychain(), persistsToDisk: false) + let creator = makeMember(seed: 0xC1) + let removed = makeMember(seed: 0xA1) + let group = try #require(store.createGroup(named: "crew", creator: creator)) + #expect(store.updateRoster(groupID: group.groupID, members: [creator, removed]) != nil) + let oldKey = try #require(store.key(forGroupID: group.groupID)) + + let rotation = try #require(store.rotateKey(groupID: group.groupID, members: [creator])) + #expect(rotation.group.epoch == 2) + #expect(rotation.group.members == [creator]) + #expect(rotation.key != oldKey) + #expect(store.key(forGroupID: group.groupID) == rotation.key) + #expect(store.group(withID: group.groupID)?.epoch == 2) + } + + // MARK: - Persistence + + @Test func persistsAcrossInstances() throws { + let keychain = MockKeychain() + let fileURL = tempFileURL() + defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) } + + let creator = makeMember(seed: 0xC1, nickname: "me") + let group: BitchatGroup + do { + let store = GroupStore(keychain: keychain, fileURL: fileURL) + group = try #require(store.createGroup(named: "hike", creator: creator)) + } + + let reloaded = GroupStore(keychain: keychain, fileURL: fileURL) + #expect(reloaded.groups == [group]) + #expect(reloaded.key(forGroupID: group.groupID) != nil) + } + + @Test func groupsWithoutKeysAreDroppedOnLoad() throws { + let keychain = MockKeychain() + let fileURL = tempFileURL() + defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) } + + let group: BitchatGroup + do { + let store = GroupStore(keychain: keychain, fileURL: fileURL) + group = try #require(store.createGroup(named: "stale", creator: makeMember(seed: 0xC1))) + } + // Simulate a keychain wipe without the metadata file being removed. + _ = keychain.deleteAllKeychainData() + + let reloaded = GroupStore(keychain: keychain, fileURL: fileURL) + #expect(reloaded.groups.isEmpty) + #expect(reloaded.group(withID: group.groupID) == nil) + } + + // MARK: - Panic wipe + + @Test func wipeRemovesMetadataAndKeys() throws { + let keychain = MockKeychain() + let fileURL = tempFileURL() + defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) } + + let store = GroupStore(keychain: keychain, fileURL: fileURL) + let group = try #require(store.createGroup(named: "gone", creator: makeMember(seed: 0xC1))) + #expect(FileManager.default.fileExists(atPath: fileURL.path)) + + store.wipe() + + #expect(store.groups.isEmpty) + #expect(store.key(forGroupID: group.groupID) == nil) + #expect(!FileManager.default.fileExists(atPath: fileURL.path)) + + // A fresh instance sees nothing either. + let reloaded = GroupStore(keychain: keychain, fileURL: fileURL) + #expect(reloaded.groups.isEmpty) + } + + @Test func removeGroupDeletesItsKey() throws { + let keychain = MockKeychain() + let store = GroupStore(keychain: keychain, persistsToDisk: false) + let group = try #require(store.createGroup(named: "bye", creator: makeMember(seed: 0xC1))) + + store.removeGroup(withID: group.groupID) + #expect(store.groups.isEmpty) + #expect(store.key(forGroupID: group.groupID) == nil) + } +} diff --git a/bitchatTests/Services/MeshDiagnosticsTests.swift b/bitchatTests/Services/MeshDiagnosticsTests.swift index ced8a92e..b565840d 100644 --- a/bitchatTests/Services/MeshDiagnosticsTests.swift +++ b/bitchatTests/Services/MeshDiagnosticsTests.swift @@ -277,6 +277,11 @@ private final class DiagnosticsMockContext: CommandContextProvider { func clearPrivateChat(_ peerID: PeerID) {} func sendPublicRaw(_ content: String) {} func sendPublicMessage(_ content: String) {} + func groupCreate(named name: String) -> CommandResult { .handled } + func groupInvite(nickname: String) -> CommandResult { .handled } + func groupRemove(nickname: String) -> CommandResult { .handled } + func groupLeave() -> CommandResult { .handled } + func groupList() -> CommandResult { .handled } func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) {} func addPublicSystemMessage(_ content: String) {} func toggleFavorite(peerID: PeerID) {} diff --git a/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift b/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift index 75cbbd54..829bfd4d 100644 --- a/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift +++ b/bitchatTests/Sync/SyncTypeFlagsBoardTests.swift @@ -38,19 +38,19 @@ struct SyncTypeFlagsBoardTests { /// decode path accepts the bytes and simply maps unknown bits to no /// message type, so a board-only request reads as "nothing I can serve". @Test func unknownBitsDecodeToNoTypes() throws { - // Bits 10-15 are unassigned (bit 8 = board, bit 9 = prekeyBundle); a - // future (or unknown) two-byte bitfield must decode without error and - // yield no known types. - let decoded = try #require(SyncTypeFlags.decode(Data([0x00, 0xFC]))) + // Bits 11-15 are unassigned (bit 8 = board, bit 9 = prekeyBundle, + // bit 10 = groupMessage); a future (or unknown) two-byte bitfield must + // decode without error and yield no known types. + let decoded = try #require(SyncTypeFlags.decode(Data([0x00, 0xF8]))) #expect(decoded.toMessageTypes().isEmpty) - for type in [MessageType.announce, .message, .fragment, .fileTransfer, .boardPost, .prekeyBundle] { + for type in [MessageType.announce, .message, .fragment, .fileTransfer, .boardPost, .prekeyBundle, .groupMessage] { #expect(!decoded.contains(type)) } } @Test func mixedKnownAndUnknownBitsKeepKnownTypes() throws { - // Known low-byte flags survive alongside unknown high bits (10-15). - let decoded = try #require(SyncTypeFlags.decode(Data([0x03, 0xFC]))) + // Known low-byte flags survive alongside unknown high bits (11-15). + let decoded = try #require(SyncTypeFlags.decode(Data([0x03, 0xF8]))) #expect(decoded.contains(.announce)) #expect(decoded.contains(.message)) #expect(Set(decoded.toMessageTypes()) == Set([.announce, .message])) diff --git a/bitchatTests/Sync/SyncTypeFlagsGroupTests.swift b/bitchatTests/Sync/SyncTypeFlagsGroupTests.swift new file mode 100644 index 00000000..2bd9d53b --- /dev/null +++ b/bitchatTests/Sync/SyncTypeFlagsGroupTests.swift @@ -0,0 +1,62 @@ +// +// SyncTypeFlagsGroupTests.swift +// bitchat +// +// Wire-compat proof for the groupMessage sync bit (bit 10): the types +// bitfield widens from 1 to 2 bytes, and clients that don't know the bit +// simply ignore it. +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +import BitFoundation +@testable import bitchat + +struct SyncTypeFlagsGroupTests { + + @Test func groupMessageOccupiesBitTen() { + #expect(SyncTypeFlags.groupMessage.rawValue == 1 << 10) + #expect(SyncTypeFlags.groupMessage.contains(.groupMessage)) + #expect(!SyncTypeFlags.publicMessages.contains(.groupMessage)) + } + + @Test func extendedBitfieldWidensToTwoBytes() throws { + // Legacy flags fit one byte… + #expect(SyncTypeFlags.publicMessages.toData() == Data([0x03])) + + // …the group bit widens the little-endian encoding to two bytes. + let combined = SyncTypeFlags.publicMessages.union(.groupMessage) + let encoded = try #require(combined.toData()) + #expect(encoded == Data([0x03, 0x04])) + + let decoded = try #require(SyncTypeFlags.decode(encoded)) + #expect(decoded == combined) + #expect(Set(decoded.toMessageTypes()) == Set([.announce, .message, .groupMessage])) + } + + @Test func unknownBitsAreIgnoredNotRejected() throws { + // An "old client" reading a 2-byte field keeps the raw bits but maps + // unknown bit indices to no message type — it answers with the types + // it knows instead of dropping the request. + let futuristic = try #require(SyncTypeFlags.decode(Data([0x03, 0xFC]))) + #expect(Set(futuristic.toMessageTypes()) == Set([.announce, .message, .groupMessage])) + #expect(futuristic.contains(.announce)) + #expect(futuristic.contains(.message)) + } + + @Test func requestSyncPacketRoundTripsGroupFlag() throws { + let types = SyncTypeFlags.publicMessages.union(.groupMessage) + let packet = RequestSyncPacket(p: 8, m: 1024, data: Data([0xAB, 0xCD]), types: types) + let encoded = packet.encode() + + let decoded = try #require(RequestSyncPacket.decode(from: encoded)) + #expect(decoded.types == types) + #expect(decoded.types?.contains(.groupMessage) == true) + #expect(decoded.p == 8) + #expect(decoded.m == 1024) + #expect(decoded.data == Data([0xAB, 0xCD])) + } +} diff --git a/bitchatTests/Sync/SyncTypeFlagsTests.swift b/bitchatTests/Sync/SyncTypeFlagsTests.swift index 45dee06a..8c400119 100644 --- a/bitchatTests/Sync/SyncTypeFlagsTests.swift +++ b/bitchatTests/Sync/SyncTypeFlagsTests.swift @@ -13,9 +13,10 @@ struct SyncTypeFlagsTests { } @Test func decodeDropsPhantomBits() { - // Bits 10+ map to no message type (bit 8 = boardPost, bit 9 = - // prekeyBundle). They must not survive decode as phantom membership. - let phantom = Data([0x00, 0xFC]) // bits 10..15 set, no known type + // Bits 11+ map to no message type (bit 8 = boardPost, bit 9 = + // prekeyBundle, bit 10 = groupMessage). They must not survive decode + // as phantom membership. + let phantom = Data([0x00, 0xF8]) // bits 11..15 set, no known type let decoded = SyncTypeFlags.decode(phantom) #expect(decoded?.rawValue == 0) #expect(decoded?.toMessageTypes().isEmpty == true) @@ -23,17 +24,18 @@ struct SyncTypeFlagsTests { @Test func boardBitSurvivesDecode() { // Bit 8 maps to boardPost and spills the field into a second byte; - // it must survive decode while the phantom high bits (10+) are - // stripped. Bit 9 (prekeyBundle) is cleared to isolate the board bit. - let mixed = Data([0x00, 0xFD]) // bit 8 (board) known, bits 10..15 phantom + // it must survive decode while the phantom high bits (11+) are + // stripped. Bits 9 (prekeyBundle) and 10 (groupMessage) are cleared + // to isolate the board bit. + let mixed = Data([0x00, 0xF9]) // bit 8 (board) known, bits 11..15 phantom let decoded = SyncTypeFlags.decode(mixed) #expect(decoded?.contains(.board) == true) #expect(decoded?.rawValue == 0b1_0000_0000) } @Test func phantomBitsAreStrippedButKnownBitsSurvive() { - // Low byte = announce(0) + message(1); high byte bits 10+ are phantom. - let mixed = Data([0b0000_0011, 0xFC]) + // Low byte = announce(0) + message(1); high byte bits 11+ are phantom. + let mixed = Data([0b0000_0011, 0xF8]) let decoded = SyncTypeFlags.decode(mixed) #expect(decoded?.contains(.announce) == true) #expect(decoded?.contains(.message) == true) diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index 47f46b85..4ddf5ab1 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -26,6 +26,7 @@ public enum MessageType: UInt8 { case fileTransfer = 0x22 // Binary file/audio/image payloads case boardPost = 0x23 // Signed geohash bulletin-board post or tombstone case prekeyBundle = 0x24 // Signed batch of one-time prekeys (gossiped) + case groupMessage = 0x25 // Group-encrypted broadcast (cleartext group ID, ChaChaPoly body) // Mesh diagnostics case ping = 0x26 // Directed echo request (nonce + origin TTL) @@ -48,6 +49,7 @@ public enum MessageType: UInt8 { case .fileTransfer: return "fileTransfer" case .boardPost: return "boardPost" case .prekeyBundle: return "prekeyBundle" + case .groupMessage: return "groupMessage" case .ping: return "ping" case .pong: return "pong" case .nostrCarrier: return "nostrCarrier" diff --git a/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift b/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift index 0b2721c2..f22fac18 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift @@ -34,6 +34,9 @@ public struct PeerID: Equatable, Hashable, Sendable { case geoDM = "nostr_" /// `"nostr:"` (+ 8 characters hex) case geoChat = "nostr:" + /// `"group_"` (+ 32 characters hex) — virtual conversation ID for a + /// private group (16-byte group ID). Never routed to a single peer. + case group = "group_" } public let prefix: Prefix @@ -96,6 +99,22 @@ public extension PeerID { } } +// MARK: - Group Conversation Helpers + +public extension PeerID { + /// Convenience init to create a virtual group conversation PeerID from a + /// 16-byte group ID ("group_" + 32 hex characters). + init(groupID: Data) { + self.init(str: Prefix.group.rawValue + groupID.hexEncodedString()) + } + + /// The 16-byte group ID behind a "group_" PeerID, if this is one. + var groupIDData: Data? { + guard isGroup, bare.count == 32 else { return nil } + return Data(hexString: bare) + } +} + // MARK: - Noise Public Key Helpers public extension PeerID { @@ -143,6 +162,11 @@ public extension PeerID { prefix == .geoDM } + /// Returns true if `id` starts with "`group_`" + var isGroup: Bool { + prefix == .group + } + func toPercentEncoded() -> String { id.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? id } From a0c517c018d1d33b330c090b6b2886caf5e14fe4 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 16:16:35 +0200 Subject: [PATCH 041/158] i18n: machine-translate feature strings into all 28 non-English locales (#1391) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fills the translation gaps for the strings the feature program added (capability UI, /ping /trace, board, vouch, prekeys, gateway, groups, Cashu, Wi-Fi bulk, Tor-offline). 3300 (key,language) pairs added across 28 locales; Spanish was already fully translated, the rest land as `needs_review` for native-speaker review before shipping. Purely additive: main's key set (336) and existing translations are authoritative and untouched. Verified programmatically — 0 removed, 0 changed, exactly 3300 added. (The git diff-stat shows large deletion counts, but that's line-alignment churn from inserting into a 38k-line JSON; no content is removed.) Machine translation only — every `needs_review` entry needs a native speaker before it can be trusted. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Localizable.xcstrings | 20012 ++++++++++++++++++++++++++++++++ 1 file changed, 20012 insertions(+) diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index f7979b8d..fdabb822 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -5024,6 +5024,150 @@ "state" : "translated", "value" : "blocked" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "محظور" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ব্লক করা" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "blockiert" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "bloqueado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bloqué" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "חסום" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ब्लॉक किया गया" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "diblokir" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bloccato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ブロック中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "차단됨" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "diblokir" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ब्लक" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "geblokkeerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zablokowany" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bloqueado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "заблокирован" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "blockerad" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "தடுக்கப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ถูกบล็อก" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "engellendi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "заблоковано" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بلاک شدہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã chặn" + } } } }, @@ -5036,6 +5180,150 @@ "state" : "translated", "value" : "end-to-end encrypted session" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "جلسة مشفرة من طرف إلى طرف" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এন্ড-টু-এন্ড এনক্রিপ্টেড সেশন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "end-to-end-verschlüsselte sitzung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "sesión cifrada de extremo a extremo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "session chiffrée de bout en bout" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "חיבור מוצפן מקצה לקצה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "एंड-टू-एंड एन्क्रिप्टेड सत्र" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesi terenkripsi ujung ke ujung" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sessione cifrata end-to-end" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "エンドツーエンド暗号化されたセッション" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "종단간 암호화된 세션" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesi terenkripsi ujung ke ujung" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "एन्ड-टु-एन्ड सङ्केत सत्र" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "end-to-end-versleutelde sessie" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesja szyfrowana end-to-end" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sessão encriptada ponta a ponta" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "сессия со сквозным шифрованием" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "end-to-end-krypterad session" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "முனை-முதல்-முனை குறியாக்கம் செய்யப்பட்ட அமர்வு" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เซสชันที่เข้ารหัสแบบครบวงจร" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uçtan uca şifreli oturum" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "наскрізно зашифрована сесія" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اینڈ ٹو اینڈ خفیہ کردہ سیشن" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "phiên mã hóa đầu cuối" + } } } }, @@ -5048,6 +5336,150 @@ "state" : "translated", "value" : "encryption failed — messages not secured" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "فشل التشفير — الرسائل غير مؤمَّنة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এনক্রিপশন ব্যর্থ — বার্তা সুরক্ষিত নয়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verschlüsselung fehlgeschlagen — nachrichten nicht gesichert" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "cifrado fallido — mensajes no protegidos" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "échec du chiffrement — messages non sécurisés" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ההצפנה נכשלה — ההודעות אינן מאובטחות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "एन्क्रिप्शन विफल — संदेश सुरक्षित नहीं" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enkripsi gagal — pesan tidak aman" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cifratura fallita — messaggi non protetti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "暗号化に失敗 — メッセージは保護されていません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "암호화 실패 — 메시지가 보호되지 않음" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enkripsi gagal — pesan tidak selamat" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "सङ्केत असफल — सन्देश सुरक्षित छैनन्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "versleuteling mislukt — berichten niet beveiligd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "szyfrowanie nie powiodło się — wiadomości nie są zabezpieczone" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "falha na encriptação — mensagens não protegidas" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "шифрование не удалось — сообщения не защищены" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kryptering misslyckades — meddelanden inte skyddade" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குறியாக்கம் தோல்வியடைந்தது — செய்திகள் பாதுகாக்கப்படவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เข้ารหัสไม่สำเร็จ — ข้อความไม่ปลอดภัย" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "şifreleme başarısız — mesajlar güvende değil" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "шифрування не вдалося — повідомлення не захищені" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "انکرپشن ناکام — پیغامات محفوظ نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mã hóa thất bại — tin nhắn không được bảo mật" + } } } }, @@ -5060,6 +5492,150 @@ "state" : "translated", "value" : "favorite — enables offline messages via nostr when mutual" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "مفضّل — يتيح الرسائل بدون اتصال عبر nostr عند التفضيل المتبادل" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "প্রিয় — পারস্পরিক হলে nostr দিয়ে অফলাইন বার্তা সক্রিয় করে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorit — ermöglicht offline-nachrichten über nostr, wenn beidseitig" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorito — habilita mensajes sin conexión vía Nostr cuando es mutuo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favori — active les messages hors ligne via nostr quand c'est mutuel" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מועדף — מאפשר הודעות לא מקוונות דרך nostr כשההעדפה הדדית" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पसंदीदा — आपसी होने पर नोस्ट्र के ज़रिए ऑफ़लाइन संदेश सक्षम करता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorit — mengaktifkan pesan offline via nostr saat saling favorit" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "preferito — abilita i messaggi offline via nostr quando reciproco" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "お気に入り — 相互になるとnostr経由でオフラインメッセージが可能に" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "즐겨찾기 — 상호 등록 시 nostr를 통해 오프라인 메시지 가능" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorit — membolehkan pesan offline melalui nostr apabila saling favorit" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "मनपर्ने — दुवैतर्फ भएमा nostr मार्फत अफलाइन सन्देश सक्षम गर्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favoriet — schakelt offline berichten via nostr in bij wederzijds" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ulubiony — umożliwia wiadomości offline przez Nostr, gdy wzajemny" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorito — ativa mensagens offline via nostr quando for mútuo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "избранное — включает офлайн-сообщения через nostr при взаимности" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorit — möjliggör offline-meddelanden via Nostr när ömsesidig" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "சிறப்பு — பரஸ்பரமாக இருக்கும்போது nostr வழியாக ஆஃப்லைன் செய்திகளை இயக்கும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "คนโปรด — เปิดใช้ข้อความออฟไลน์ผ่าน nostr เมื่อเป็นคนโปรดของกันและกัน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favori — karşılıklı olduğunda Nostr üzerinden çevrimdışı mesajları etkinleştirir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "улюблений — вмикає офлайн-повідомлення через nostr, коли взаємний" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پسندیدہ — باہمی ہونے پر nostr کے ذریعے آف لائن پیغامات فعال کرتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "yêu thích — bật tin nhắn ngoại tuyến qua nostr khi cả hai cùng thích" + } } } }, @@ -5072,6 +5648,150 @@ "state" : "translated", "value" : "physically in this location channel's area" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "موجود فعليًا في منطقة قناة الموقع هذه" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "সশরীরে এই লোকেশন চ্যানেলের এলাকায়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "physisch im gebiet dieses standortkanals" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "físicamente en el área de este canal de ubicación" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "physiquement dans la zone de ce canal de localisation" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "נמצא פיזית באזור של ערוץ המיקום הזה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इस लोकेशन चैनल के क्षेत्र में मौजूद" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "secara fisik berada di area kanal lokasi ini" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fisicamente nell'area di questo canale di posizione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "この位置チャンネルのエリア内にいます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이 위치 채널 영역 안에 있음" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "secara fizikal berada di kawasan kanal lokasi ini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "यो स्थान च्यानलको क्षेत्रमा भौतिक रूपमा" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fysiek in het gebied van dit locatiekanaal" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fizycznie w obszarze tego kanału lokalizacji" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fisicamente na área deste canal de localização" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "физически в зоне этого локального канала" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fysiskt i den här platskanalens område" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இந்த இருப்பிட சேனலின் பகுதியில் நேரடியாக உள்ளார்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "อยู่ในพื้นที่ของช่องตามตำแหน่งนี้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fiziksel olarak bu konum kanalının bölgesinde" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "фізично в зоні цього каналу локації" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اس لوکیشن چینل کے علاقے میں جسمانی طور پر موجود" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hiện đang ở trong khu vực của kênh vị trí này" + } } } }, @@ -5084,6 +5804,150 @@ "state" : "translated", "value" : "connected directly over bluetooth" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "متصل مباشرة عبر bluetooth" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "সরাসরি ব্লুটুথে সংযুক্ত" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "direkt über bluetooth verbunden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "conectado directamente por Bluetooth" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "connecté directement en bluetooth" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מחובר ישירות דרך bluetooth" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ब्लूटूथ से सीधे जुड़ा" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "terhubung langsung lewat bluetooth" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "connesso direttamente via bluetooth" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bluetoothで直接接続中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bluetooth로 직접 연결됨" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bersambung terus melalui bluetooth" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bluetooth मार्फत सिधै जडान" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "rechtstreeks verbonden via bluetooth" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "połączono bezpośrednio przez Bluetooth" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ligado diretamente por bluetooth" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "подключён напрямую через bluetooth" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ansluten direkt via Bluetooth" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bluetooth மூலம் நேரடியாக இணைக்கப்பட்டுள்ளது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เชื่อมต่อโดยตรงผ่าน bluetooth" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "doğrudan Bluetooth üzerinden bağlı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "з'єднано напряму через bluetooth" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "براہ راست Bluetooth کے ذریعے جڑا ہوا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kết nối trực tiếp qua Bluetooth" + } } } }, @@ -5096,6 +5960,150 @@ "state" : "translated", "value" : "reachable through the mesh, relayed by others" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يمكن الوصول إليه عبر mesh، بإعادة تمرير من الآخرين" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "মেশের মাধ্যমে পৌঁছানো যায়, অন্যরা রিলে করে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "über das mesh erreichbar, von anderen weitergeleitet" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "alcanzable a través del mesh, retransmitido por otros" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "joignable via le mesh, relayé par d'autres" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "נגיש דרך ה-mesh, בשידור חוזר על ידי אחרים" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "मेश के ज़रिए पहुँच योग्य, दूसरों द्वारा रिले किया गया" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bisa dijangkau lewat mesh, diteruskan oleh yang lain" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "raggiungibile tramite la mesh, inoltrato da altri" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh経由で到達可能、他のピアがリレー" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh를 통해 도달 가능, 다른 피어가 중계" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "boleh dicapai melalui mesh, diteruskan oleh orang lain" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh मार्फत पुग्न सकिने, अरूले रिले गरेको" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bereikbaar via de mesh, doorgestuurd door anderen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "osiągalny przez mesh, przekazywany przez innych" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "acessível através da mesh, retransmitido por outros" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "доступен через mesh, ретранслируется другими" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nåbar via mesh, vidarebefordrad av andra" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh வழியாக அணுகக்கூடியது, மற்றவர்களால் ரிலே செய்யப்படுகிறது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เข้าถึงได้ผ่าน mesh โดยมีผู้อื่นส่งต่อ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh üzerinden ulaşılabilir, başkaları tarafından aktarılır" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "досяжно через mesh, ретрансльовано іншими" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh کے ذریعے قابل رسائی، دوسروں کے ذریعے ریلے شدہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "có thể tiếp cận qua mesh, được người khác chuyển tiếp" + } } } }, @@ -5108,6 +6116,150 @@ "state" : "translated", "value" : "reachable over the internet (nostr) — mutual favorites only" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يمكن الوصول إليه عبر الإنترنت (nostr) — المفضّلون المتبادلون فقط" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ইন্টারনেটে পৌঁছানো যায় (nostr) — শুধু পারস্পরিক প্রিয়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "über das internet erreichbar (nostr) — nur bei beidseitigen favoriten" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "alcanzable por internet (Nostr) — solo favoritos mutuos" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "joignable via internet (nostr) — favoris mutuels uniquement" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "נגיש דרך האינטרנט (nostr) — מועדפים הדדיים בלבד" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इंटरनेट (नोस्ट्र) पर पहुँच योग्य — केवल आपसी पसंदीदा" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bisa dijangkau lewat internet (nostr) — hanya untuk saling favorit" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "raggiungibile via internet (nostr) — solo preferiti reciproci" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "インターネット(nostr)経由で到達可能 — 相互お気に入りのみ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "인터넷(nostr)을 통해 도달 가능 — 상호 즐겨찾기만" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "boleh dicapai melalui internet (nostr) — hanya untuk saling favorit" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इन्टरनेट (nostr) मार्फत पुग्न सकिने — दुवैतर्फका मनपर्ने मात्र" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bereikbaar via internet (nostr) — alleen wederzijdse favorieten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "osiągalny przez internet (Nostr) — tylko wzajemni ulubieni" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "acessível pela internet (nostr) — apenas favoritos mútuos" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "доступен через интернет (nostr) — только для взаимного избранного" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nåbar via internet (Nostr) — endast ömsesidiga favoriter" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இணையம் வழியாக அணுகக்கூடியது (nostr) — பரஸ்பர சிறப்பினர் மட்டுமே" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เข้าถึงได้ผ่านอินเทอร์เน็ต (nostr) — เฉพาะคนโปรดของกันและกัน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "internet üzerinden ulaşılabilir (Nostr) — yalnızca karşılıklı favoriler" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "досяжно через інтернет (nostr) — лише взаємні улюблені" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "انٹرنیٹ (nostr) کے ذریعے قابل رسائی — صرف باہمی پسندیدہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "có thể tiếp cận qua internet (nostr) — chỉ khi cả hai cùng thích" + } } } }, @@ -5120,6 +6272,150 @@ "state" : "translated", "value" : "offline — not currently reachable" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "غير متصل — لا يمكن الوصول إليه حاليًا" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "অফলাইন — এখন পৌঁছানো যাচ্ছে না" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline — derzeit nicht erreichbar" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "sin conexión — no alcanzable ahora" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hors ligne — actuellement injoignable" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא מקוון — לא נגיש כרגע" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ऑफ़लाइन — फ़िलहाल पहुँच योग्य नहीं" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline — saat ini tidak bisa dijangkau" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline — attualmente non raggiungibile" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "オフライン — 現在到達できません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "오프라인 — 현재 도달할 수 없음" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline — kini tidak boleh dicapai" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "अफलाइन — अहिले पुग्न सकिँदैन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline — momenteel niet bereikbaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline — obecnie nieosiągalny" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline — atualmente inacessível" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "офлайн — сейчас недоступен" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline — inte nåbar just nu" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ஆஃப்லைன் — தற்போது அணுக முடியாது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ออฟไลน์ — ไม่สามารถเข้าถึงได้ในขณะนี้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "çevrimdışı — şu anda ulaşılamıyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "офлайн — зараз недосяжно" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آف لائن — فی الحال قابل رسائی نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ngoại tuyến — hiện không thể tiếp cận" + } } } }, @@ -5132,6 +6428,150 @@ "state" : "translated", "value" : "teleported — joined the channel from somewhere else" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "منتقل فوريًا — انضم إلى القناة من مكان آخر" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "টেলিপোর্টেড — অন্য কোথাও থেকে চ্যানেলে যোগ দিয়েছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teleportiert — dem kanal von woanders beigetreten" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "teletransportado — se unió al canal desde otro lugar" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "téléporté — a rejoint le canal depuis un autre endroit" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "טלפורט — הצטרף לערוץ ממקום אחר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "टेलीपोर्टेड — कहीं और से चैनल में शामिल हुआ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teleport — bergabung ke kanal dari tempat lain" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teletrasportato — è entrato nel canale da un altro luogo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "テレポート — 別の場所からチャンネルに参加" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "텔레포트 — 다른 곳에서 채널에 참여함" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teleport — menyertai kanal dari tempat lain" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "टेलिपोर्ट भएको — अन्त कतैबाट च्यानलमा जोडिएको" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "geteleporteerd — het kanaal van elders binnengekomen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teleportowany — dołączył do kanału skądinąd" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teletransportado — entrou no canal a partir de outro sítio" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "телепортирован — присоединился к каналу из другого места" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teleporterad — gick med i kanalen från en annan plats" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "டெலிபோர்ட் செய்யப்பட்டது — வேறு இடத்திலிருந்து சேனலில் சேர்ந்தார்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เทเลพอร์ต — เข้าร่วมช่องจากที่อื่น" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ışınlandı — kanala başka bir yerden katıldı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "телепортований — приєднався до каналу з іншого місця" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ٹیلی پورٹ شدہ — کسی اور جگہ سے چینل میں شامل ہوا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã dịch chuyển — tham gia kênh từ nơi khác" + } } } }, @@ -5144,6 +6584,150 @@ "state" : "translated", "value" : "SYMBOLS" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الرموز" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "প্রতীকসমূহ" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SYMBOLE" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "SÍMBOLOS" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SYMBOLES" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "סמלים" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "प्रतीक" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SIMBOL" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SIMBOLI" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "記号" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "기호" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SIMBOL" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चिन्हहरू" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SYMBOLEN" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SYMBOLE" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SÍMBOLOS" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "СИМВОЛЫ" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SYMBOLER" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "சின்னங்கள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "สัญลักษณ์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SEMBOLLER" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "СИМВОЛИ" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "علامات" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "KÝ HIỆU" + } } } }, @@ -5156,6 +6740,150 @@ "state" : "translated", "value" : "unread private messages" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "رسائل خاصة غير مقروءة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "অপঠিত ব্যক্তিগত বার্তা" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ungelesene private nachrichten" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensajes privados sin leer" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "messages privés non lus" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הודעות פרטיות שלא נקראו" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "अपठित निजी संदेश" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan pribadi belum dibaca" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "messaggi privati non letti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "未読のプライベートメッセージ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "읽지 않은 개인 메시지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan peribadi belum dibaca" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "नपढेका व्यक्तिगत सन्देश" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ongelezen privéberichten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nieprzeczytane wiadomości prywatne" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagens privadas não lidas" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "непрочитанные личные сообщения" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "olästa privata meddelanden" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படிக்காத தனிப்பட்ட செய்திகள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ข้อความส่วนตัวที่ยังไม่ได้อ่าน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "okunmamış özel mesajlar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "непрочитані приватні повідомлення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نہ پڑھے گئے نجی پیغامات" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tin nhắn riêng tư chưa đọc" + } } } }, @@ -5168,6 +6896,150 @@ "state" : "translated", "value" : "identity verified" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تم التحقق من الهوية" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "পরিচয় যাচাই করা হয়েছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "identität verifiziert" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "identidad verificada" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "identité vérifiée" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הזהות אומתה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पहचान सत्यापित" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "identitas terverifikasi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "identità verificata" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "本人確認済み" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "신원 확인됨" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "identiti disahkan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पहिचान प्रमाणित" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "identiteit geverifieerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tożsamość zweryfikowana" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "identidade verificada" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "личность подтверждена" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "identitet verifierad" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "அடையாளம் சரிபார்க்கப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ยืนยันตัวตนแล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kimlik doğrulandı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "особу підтверджено" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "شناخت کی تصدیق ہو گئی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "danh tính đã xác minh" + } } } }, @@ -5180,6 +7052,150 @@ "state" : "translated", "value" : "NETWORK" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الشبكة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "নেটওয়ার্ক" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "NETZWERK" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "RED" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "RÉSEAU" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "רשת" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "नेटवर्क" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "JARINGAN" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "RETE" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ネットワーク" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "네트워크" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "RANGKAIAN" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "नेटवर्क" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "NETWERK" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SIEĆ" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "REDE" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "СЕТЬ" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "NÄTVERK" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "நெட்வொர்க்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เครือข่าย" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "AĞ" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "МЕРЕЖА" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نیٹ ورک" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "MẠNG" + } } } }, @@ -5192,6 +7208,150 @@ "state" : "translated", "value" : "map of peers and links learned from mesh announces" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "خريطة الأقران والروابط المُستنتَجة من إعلانات mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "মেশ অ্যানাউন্স থেকে জানা পিয়ার ও লিঙ্কের মানচিত্র" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "karte der peers und verbindungen, aus mesh-announces gelernt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mapa de peers y enlaces obtenidos de los anuncios del mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "carte des pairs et des liens issue des annonces mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מפה של עמיתים וקישורים שנלמדו מהכרזות mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "मेश अनाउंस से सीखे गए पीयरों और लिंकों का नक्शा" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "peta peer dan tautan yang dipelajari dari announce mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mappa dei peer e dei collegamenti appresa dagli announce mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh announceから学習したピアとリンクのマップ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh announce에서 학습한 피어와 링크의 지도" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "peta peer dan pautan yang dipelajari daripada announce mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh घोषणाबाट थाहा भएका सहकर्मी र लिंकहरूको नक्सा" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kaart van peers en verbindingen, geleerd uit mesh-announces" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mapa peerów i połączeń poznanych z ogłoszeń mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mapa de pares e ligações obtido dos announces mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "карта пиров и связей, полученная из mesh-анонсов" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "karta över peers och länkar från mesh-announces" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh அறிவிப்புகளிலிருந்து அறியப்பட்ட peer-கள் மற்றும் இணைப்புகளின் வரைபடம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แผนที่ของเพียร์และการเชื่อมต่อที่เรียนรู้จาก mesh announce" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh duyurularından öğrenilen eşlerin ve bağlantıların haritası" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "карта пірів і зв'язків, отриманих з оголошень mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh اعلانات سے سیکھے گئے ہم منصبوں اور روابط کا نقشہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bản đồ các nút ngang hàng và liên kết học được từ các announce mesh" + } } } }, @@ -5204,6 +7364,150 @@ "state" : "translated", "value" : "opens the mesh topology map" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يفتح خريطة طوبولوجيا mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "মেশ টপোলজি মানচিত্র খোলে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öffnet die mesh-topologie-karte" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "abre el mapa de topología del mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ouvre la carte de topologie mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "פותח את מפת טופולוגיית ה-mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "मेश टोपोलॉजी नक्शा खोलता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka peta topologi mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "apre la mappa della topologia mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh トポロジーマップを開きます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh 토폴로지 지도를 엽니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka peta topologi mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh टोपोलोजी नक्सा खोल्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "opent de mesh-topologiekaart" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "otwiera mapę topologii mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abre o mapa de topologia mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "открывает карту топологии mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öppnar mesh-topologikartan" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh டோபாலஜி வரைபடத்தைத் திறக்கும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เปิดแผนที่โทโพโลยี mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh topolojisi haritasını açar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "відкриває карту топології mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh ٹوپولوجی نقشہ کھولتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mở bản đồ cấu trúc mesh" + } } } }, @@ -5216,6 +7520,150 @@ "state" : "translated", "value" : "mesh topology" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "طوبولوجيا mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "মেশ টপোলজি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh-topologie" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "topología del mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologie mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "טופולוגיית mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "मेश टोपोलॉजी" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologi mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologia mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh トポロジー" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh 토폴로지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologi mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh टोपोलोजी" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh-topologie" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologia mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologia mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "топология mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh-topologi" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh டோபாலஜி" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "โทโพโลยี mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh topolojisi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "топологія mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh ٹوپولوجی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cấu trúc mesh" + } } } }, @@ -8629,6 +11077,150 @@ "state" : "translated", "value" : "shows app info" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يعرض معلومات التطبيق" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "অ্যাপের তথ্য দেখায়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zeigt app-infos" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "muestra la información de la app" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "affiche les infos de l'app" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מציג את פרטי האפליקציה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ऐप जानकारी दिखाता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "menampilkan info aplikasi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mostra le info dell'app" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "アプリ情報を表示します" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "앱 정보를 표시합니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "menunjukkan maklumat aplikasi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "एप जानकारी देखाउँछ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toont app-info" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pokazuje informacje o aplikacji" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mostra as informações da app" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "показывает информацию о приложении" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "visar appinfo" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "செயலி தகவலைக் காட்டும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แสดงข้อมูลแอป" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uygulama bilgisini gösterir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "показує інформацію про застосунок" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ایپ کی معلومات دکھاتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hiển thị thông tin ứng dụng" + } } } }, @@ -8641,6 +11233,150 @@ "state" : "translated", "value" : "attach photo" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "إرفاق صورة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবি যুক্ত করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "foto anhängen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "adjuntar foto" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "joindre une photo" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "צירוף תמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "फ़ोटो संलग्न करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lampirkan foto" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "allega foto" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "写真を添付" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "사진 첨부" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lampirkan foto" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर संलग्न गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "foto bijvoegen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dołącz zdjęcie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anexar foto" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "прикрепить фото" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bifoga foto" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "புகைப்படத்தை இணைக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แนบรูปภาพ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fotoğraf ekle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "додати фото" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر منسلک کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đính kèm ảnh" + } } } }, @@ -8653,6 +11389,150 @@ "state" : "translated", "value" : "opens the photo library; use the take photo action for the camera" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يفتح مكتبة الصور؛ استخدم إجراء التقاط صورة للكاميرا" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবির লাইব্রেরি খোলে; ক্যামেরার জন্য ছবি তোলার অ্যাকশন ব্যবহার করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öffnet die fotobibliothek; nutze die aktion foto aufnehmen für die kamera" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "abre la fototeca; usa la acción tomar foto para la cámara" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ouvre la photothèque ; utilise l'action prendre une photo pour l'appareil photo" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "פותח את ספריית התמונות; לשימוש במצלמה השתמש בפעולת צילום תמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "फ़ोटो लाइब्रेरी खोलता है; कैमरे के लिए फ़ोटो लें क्रिया का उपयोग करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka galeri foto; gunakan aksi ambil foto untuk kamera" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "apre la libreria foto; usa l'azione scatta foto per la fotocamera" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "写真ライブラリを開きます。カメラには写真を撮るを使用してください" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "사진 보관함을 엽니다. 카메라는 사진 촬영 동작을 사용하세요" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka galeri foto; guna tindakan ambil foto untuk kamera" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर लाइब्रेरी खोल्छ; क्यामेराका लागि तस्बिर खिच्ने कार्य प्रयोग गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "opent de fotobibliotheek; gebruik de actie foto maken voor de camera" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "otwiera bibliotekę zdjęć; użyj akcji zrób zdjęcie, aby użyć aparatu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abre a biblioteca de fotos; usa a ação tirar foto para a câmara" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "открывает библиотеку фото; для камеры используй действие «сделать фото»" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öppnar fotobiblioteket; använd ta foto för kameran" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "புகைப்படத் தொகுப்பைத் திறக்கும்; கேமராவுக்கு புகைப்படம் எடுக்கும் செயலைப் பயன்படுத்தவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เปิดคลังรูปภาพ ใช้การถ่ายรูปสำหรับกล้อง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fotoğraf kitaplığını açar; kamera için fotoğraf çek eylemini kullanın" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "відкриває бібліотеку фото; для камери скористайся дією зробити фото" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویری لائبریری کھولتا ہے؛ کیمرے کیلئے تصویر لینے کا عمل استعمال کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mở thư viện ảnh; dùng thao tác chụp ảnh cho máy ảnh" + } } } }, @@ -9023,6 +11903,150 @@ "state" : "translated", "value" : "choose photo" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اختيار صورة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবি বেছে নিন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "foto auswählen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "elegir foto" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "choisir une photo" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "בחירת תמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "फ़ोटो चुनें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pilih foto" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "scegli foto" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "写真を選択" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "사진 선택" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pilih foto" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर छान" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "foto kiezen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wybierz zdjęcie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "escolher foto" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "выбрать фото" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "välj foto" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "புகைப்படத்தைத் தேர்ந்தெடுக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เลือกรูปภาพ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fotoğraf seç" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "вибрати фото" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر منتخب کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chọn ảnh" + } } } }, @@ -9214,6 +12238,150 @@ "state" : "translated", "value" : "tap to show delivery details" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اضغط لعرض تفاصيل التسليم" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ডেলিভারির বিবরণ দেখতে ট্যাপ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tippe, um zustelldetails anzuzeigen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "toca para ver los detalles de entrega" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "touche pour afficher les détails de livraison" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הקש להצגת פרטי מסירה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "डिलीवरी विवरण दिखाने के लिए टैप करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ketuk untuk menampilkan detail pengiriman" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tocca per mostrare i dettagli di consegna" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "タップして配信の詳細を表示" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "탭하여 전송 세부정보 표시" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ketuk untuk menunjukkan butiran penghantaran" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "डेलिभरी विवरण देखाउन ट्याप गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tik om bezorgdetails te tonen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "stuknij, aby pokazać szczegóły dostarczenia" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toca para mostrar os detalhes de entrega" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "нажми, чтобы показать детали доставки" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tryck för att visa leveransdetaljer" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "வழங்கல் விவரங்களைக் காண தட்டவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แตะเพื่อแสดงรายละเอียดการส่ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teslimat ayrıntılarını göstermek için dokunun" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "торкнися, щоб показати деталі доставки" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ترسیل کی تفصیلات دیکھنے کیلئے ٹیپ کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chạm để xem chi tiết gửi" + } } } }, @@ -9405,6 +12573,150 @@ "state" : "translated", "value" : "Internet gateway active, sharing your connection with the mesh" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بوابة الإنترنت نشطة، تشارك اتصالك مع mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ইন্টারনেট গেটওয়ে সক্রিয়, মেশের সঙ্গে আপনার সংযোগ ভাগ করছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Internet-gateway aktiv, teilt deine verbindung mit dem mesh" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Puerta de enlace a internet activa, compartiendo tu conexión con el mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "passerelle internet active, partage ta connexion avec le mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שער אינטרנט פעיל, משתף את החיבור שלך עם ה-mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इंटरनेट गेटवे सक्रिय, आपका कनेक्शन मेश के साथ साझा किया जा रहा है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gateway internet aktif, membagikan koneksimu dengan mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gateway internet attivo, condivide la tua connessione con la mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "インターネットゲートウェイが有効、接続をmeshと共有中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "인터넷 게이트웨이 활성화됨, 연결을 mesh와 공유 중" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gateway internet aktif, berkongsi sambunganmu dengan mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इन्टरनेट गेटवे सक्रिय, तिम्रो जडान mesh सँग साझेदारी गरिँदै" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "internetgateway actief, deelt je verbinding met de mesh" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "brama internetowa aktywna, udostępniasz swoje połączenie sieci mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gateway de internet ativo, a partilhar a tua ligação com a mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "интернет-шлюз активен, соединение раздаётся в mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "internetgateway aktiv, delar din anslutning med mesh" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இணைய நுழைவாயில் செயலில் உள்ளது, உங்கள் இணைப்பை mesh உடன் பகிர்கிறது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เกตเวย์อินเทอร์เน็ตทำงานอยู่ กำลังแชร์การเชื่อมต่อของคุณกับ mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "internet ağ geçidi etkin, bağlantınız mesh ile paylaşılıyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "інтернет-шлюз активний, ділишся своїм з'єднанням з mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "انٹرنیٹ گیٹ وے فعال، آپ کا کنکشن mesh کے ساتھ شیئر کر رہا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cổng internet đang hoạt động, chia sẻ kết nối của bạn với mesh" + } } } }, @@ -9416,6 +12728,150 @@ "state" : "translated", "value" : "Group chat" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "دردشة جماعية" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "গ্রুপ চ্যাট" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Gruppenchat" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chat de grupo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Discussion de groupe" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "צ'אט קבוצתי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह चैट" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "obrolan grup" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Chat di gruppo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループチャット" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹 채팅" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sembang kumpulan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह च्याट" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Groepschat" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "czat grupowy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Conversa de grupo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "групповой чат" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppchatt" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குழு உரையாடல்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แชทกลุ่ม" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grup sohbeti" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "груповий чат" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گروپ چیٹ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "trò chuyện nhóm" + } } } }, @@ -9428,6 +12884,150 @@ "state" : "translated", "value" : "jump to latest messages" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الانتقال إلى أحدث الرسائل" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "সর্বশেষ বার্তায় যান" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zu den neuesten nachrichten springen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "ir a los mensajes más recientes" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "aller aux derniers messages" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "קפיצה להודעות האחרונות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "नवीनतम संदेशों पर जाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lompat ke pesan terbaru" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "vai ai messaggi più recenti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "最新のメッセージへ移動" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "최신 메시지로 이동" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lompat ke pesan terbaru" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पछिल्ला सन्देशमा जाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "naar de nieuwste berichten springen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "przejdź do najnowszych wiadomości" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ir para as mensagens mais recentes" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "перейти к последним сообщениям" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hoppa till senaste meddelanden" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "சமீபத்திய செய்திகளுக்குச் செல்லவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไปยังข้อความล่าสุด" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "en son mesajlara atla" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "перейти до останніх повідомлень" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تازہ ترین پیغامات پر جائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhảy đến tin nhắn mới nhất" + } } } }, @@ -9977,6 +13577,150 @@ "state" : "translated", "value" : "connected" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "متصل" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "সংযুক্ত" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verbunden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "conectado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "connecté" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מחובר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "जुड़ा हुआ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "terhubung" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "connesso" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "接続中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "연결됨" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bersambung" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "जडान भयो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verbonden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "połączono" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ligado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "подключено" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ansluten" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இணைக்கப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เชื่อมต่อแล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bağlı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "з'єднано" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "جڑا ہوا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã kết nối" + } } } }, @@ -9989,6 +13733,150 @@ "state" : "translated", "value" : "no one reachable" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "لا أحد يمكن الوصول إليه" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "কেউ পৌঁছানোর মতো নেই" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "niemand erreichbar" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "nadie alcanzable" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "personne n'est joignable" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אף אחד לא נגיש" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "कोई पहुँच योग्य नहीं" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak ada yang bisa dijangkau" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nessuno raggiungibile" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "到達可能な相手がいません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "도달 가능한 사람 없음" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tiada siapa boleh dicapai" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "कोही पुग्न सकिँदैन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "niemand bereikbaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nikt nieosiągalny" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ninguém acessível" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "никого не достать" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ingen nåbar" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "யாரையும் அணுக முடியாது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่มีใครที่เข้าถึงได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kimseye ulaşılamıyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "нікого не досяжно" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "کوئی قابل رسائی نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không ai có thể tiếp cận" + } } } }, @@ -10922,6 +14810,150 @@ "state" : "translated", "value" : "double-tap to start recording, double-tap again to send" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اضغط ضغطة مزدوجة لبدء التسجيل، واضغط مرة أخرى للإرسال" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "রেকর্ডিং শুরু করতে দুইবার ট্যাপ করুন, পাঠাতে আবার দুইবার ট্যাপ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "doppeltippen zum aufnehmen, erneut doppeltippen zum senden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "toca dos veces para empezar a grabar, toca dos veces de nuevo para enviar" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "double-touche pour démarrer l'enregistrement, double-touche à nouveau pour envoyer" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הקש הקשה כפולה כדי להתחיל הקלטה, הקש שוב כדי לשלוח" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "रिकॉर्डिंग शुरू करने के लिए दो बार टैप करें, भेजने के लिए फिर दो बार टैप करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ketuk dua kali untuk mulai merekam, ketuk dua kali lagi untuk mengirim" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tocca due volte per iniziare a registrare, tocca di nuovo due volte per inviare" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ダブルタップで録音開始、もう一度ダブルタップで送信" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "두 번 탭하여 녹음 시작, 다시 두 번 탭하여 전송" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ketuk dua kali untuk mula merakam, ketuk dua kali lagi untuk menghantar" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "रेकर्ड सुरु गर्न दुई पटक ट्याप गर, पठाउन फेरि दुई पटक ट्याप गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dubbeltik om op te nemen, dubbeltik opnieuw om te verzenden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "stuknij dwukrotnie, aby rozpocząć nagrywanie, stuknij ponownie, aby wysłać" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toca duas vezes para começar a gravar, toca duas vezes de novo para enviar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "двойной тап — начать запись, ещё один двойной тап — отправить" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dubbeltryck för att börja spela in, dubbeltryck igen för att skicka" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "பதிவைத் தொடங்க இரட்டைத் தட்டவும், அனுப்ப மீண்டும் இரட்டைத் தட்டவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แตะสองครั้งเพื่อเริ่มบันทึก แตะสองครั้งอีกครั้งเพื่อส่ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kaydı başlatmak için çift dokunun, göndermek için tekrar çift dokunun" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "двічі торкнися, щоб почати запис, торкнися ще раз, щоб надіслати" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ریکارڈنگ شروع کرنے کیلئے ڈبل ٹیپ کریں، بھیجنے کیلئے دوبارہ ڈبل ٹیپ کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chạm hai lần để bắt đầu ghi, chạm hai lần nữa để gửi" + } } } }, @@ -10934,6 +14966,150 @@ "state" : "translated", "value" : "record voice note" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تسجيل ملاحظة صوتية" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ভয়েস নোট রেকর্ড করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sprachnachricht aufnehmen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "grabar nota de voz" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enregistrer une note vocale" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הקלטת הערה קולית" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वॉइस नोट रिकॉर्ड करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "rekam catatan suara" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "registra nota vocale" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ボイスメモを録音" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "음성 메모 녹음" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "rakam nota suara" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "भ्वाइस नोट रेकर्ड गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "spraakbericht opnemen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nagraj notatkę głosową" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gravar nota de voz" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "записать голосовое сообщение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "spela in röstmeddelande" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குரல் குறிப்பைப் பதிவு செய்யவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "บันทึกข้อความเสียง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesli not kaydet" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "записати голосову нотатку" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "وائس نوٹ ریکارڈ کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ghi chú giọng nói" + } } } }, @@ -10946,6 +15122,150 @@ "state" : "translated", "value" : "recording" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "جارٍ التسجيل" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "রেকর্ড হচ্ছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "aufnahme" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "grabando" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enregistrement" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מקליט" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "रिकॉर्डिंग हो रही है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "merekam" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "registrazione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "録音中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "녹음 중" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "merakam" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "रेकर्ड हुँदै" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "opnemen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nagrywanie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "a gravar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "запись" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "spelar in" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "பதிவு செய்கிறது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "กำลังบันทึก" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kaydediliyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "запис" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ریکارڈنگ جاری" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đang ghi" + } } } }, @@ -11674,6 +15994,150 @@ "state" : "translated", "value" : "take photo with camera" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "التقاط صورة بالكاميرا" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ক্যামেরা দিয়ে ছবি তুলুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "foto mit kamera aufnehmen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "tomar foto con la cámara" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "prendre une photo avec l'appareil" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "צילום תמונה במצלמה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "कैमरे से फ़ोटो लें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ambil foto dengan kamera" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "scatta foto con la fotocamera" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "カメラで写真を撮る" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "카메라로 사진 촬영" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ambil foto dengan kamera" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "क्यामेराले तस्बिर खिच" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "foto maken met camera" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zrób zdjęcie aparatem" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tirar foto com a câmara" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "сделать фото камерой" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ta foto med kameran" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "கேமராவால் புகைப்படம் எடுக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ถ่ายรูปด้วยกล้อง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kamerayla fotoğraf çek" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "зробити фото камерою" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "کیمرے سے تصویر لیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chụp ảnh bằng máy ảnh" + } } } }, @@ -12044,6 +16508,150 @@ "state" : "translated", "value" : "verify encryption" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "التحقق من التشفير" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এনক্রিপশন যাচাই করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verschlüsselung verifizieren" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "verificar cifrado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "vérifier le chiffrement" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אימות הצפנה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "एन्क्रिप्शन सत्यापित करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verifikasi enkripsi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verifica la cifratura" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "暗号化を確認" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "암호화 확인" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sahkan enkripsi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "सङ्केत प्रमाणित गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "versleuteling verifiëren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zweryfikuj szyfrowanie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verificar a encriptação" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "проверить шифрование" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verifiera kryptering" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குறியாக்கத்தைச் சரிபார்க்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ยืนยันการเข้ารหัส" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "şifrelemeyi doğrula" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "перевірити шифрування" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "انکرپشن کی توثیق کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "xác minh mã hóa" + } } } }, @@ -12951,6 +17559,150 @@ "state" : "translated", "value" : "resend" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "إعادة الإرسال" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আবার পাঠান" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "erneut senden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "reenviar" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "renvoyer" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שלח שוב" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "फिर भेजें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kirim ulang" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "reinvia" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "再送信" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "다시 전송" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hantar semula" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पुनः पठाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "opnieuw verzenden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wyślij ponownie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "reenviar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "отправить снова" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "skicka igen" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "மீண்டும் அனுப்பு" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งอีกครั้ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "yeniden gönder" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "надіслати знову" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "دوبارہ بھیجیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gửi lại" + } } } }, @@ -14574,6 +19326,150 @@ "state" : "translated", "value" : "clear chat" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "مسح الدردشة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "চ্যাট মুছুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chat leeren" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "limpiar chat" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "effacer la discussion" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "נקה צ'אט" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चैट साफ़ करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hapus obrolan" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "svuota chat" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "チャットをクリア" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "채팅 지우기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kosongkan sembang" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "च्याट खाली गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chat wissen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wyczyść czat" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "limpar conversa" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "очистить чат" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "rensa chatt" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "உரையாடலை அழி" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ล้างแชท" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sohbeti temizle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "очистити чат" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "چیٹ صاف کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "xóa cuộc trò chuyện" + } } } }, @@ -14586,6 +19482,150 @@ "state" : "translated", "value" : "clear this chat?" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "مسح هذه الدردشة؟" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এই চ্যাট মুছবেন?" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "diesen chat leeren?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿limpiar este chat?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "effacer cette discussion ?" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לנקות את הצ'אט הזה?" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "यह चैट साफ़ करें?" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hapus obrolan ini?" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "svuotare questa chat?" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "このチャットをクリアしますか?" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이 채팅을 지울까요?" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kosongkan sembang ini?" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "यो च्याट खाली गर्ने?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "deze chat wissen?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wyczyścić ten czat?" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "limpar esta conversa?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "очистить этот чат?" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "rensa den här chatten?" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இந்த உரையாடலை அழிக்கவா?" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ล้างแชทนี้หรือไม่?" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bu sohbet temizlensin mi?" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "очистити цей чат?" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "یہ چیٹ صاف کریں؟" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "xóa cuộc trò chuyện này?" + } } } }, @@ -15134,6 +20174,150 @@ "state" : "translated", "value" : "create or manage private groups" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "إنشاء أو إدارة المجموعات الخاصة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ব্যক্তিগত গ্রুপ তৈরি বা পরিচালনা করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "private gruppen erstellen oder verwalten" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "crear o gestionar grupos privados" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "créer ou gérer des groupes privés" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "יצירה או ניהול של קבוצות פרטיות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी समूह बनाएँ या प्रबंधित करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "buat atau kelola grup pribadi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "crea o gestisci gruppi privati" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "プライベートグループを作成または管理" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "비공개 그룹 생성 또는 관리" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cipta atau urus kumpulan peribadi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी समूह सिर्जना वा व्यवस्थापन गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privégroepen maken of beheren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "twórz lub zarządzaj prywatnymi grupami" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "criar ou gerir grupos privados" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "создать частные группы или управлять ими" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "skapa eller hantera privata grupper" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "தனிப்பட்ட குழுக்களை உருவாக்கவும் அல்லது நிர்வகிக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "สร้างหรือจัดการกลุ่มส่วนตัว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "özel gruplar oluştur veya yönet" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "створюй або керуй приватними групами" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نجی گروپ بنائیں یا ان کا نظم کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tạo hoặc quản lý nhóm riêng tư" + } } } }, @@ -15146,6 +20330,150 @@ "state" : "translated", "value" : "show available commands" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "عرض الأوامر المتاحة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "উপলব্ধ কমান্ড দেখান" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verfügbare befehle anzeigen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mostrar los comandos disponibles" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "afficher les commandes disponibles" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הצג פקודות זמינות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "उपलब्ध कमांड दिखाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tampilkan perintah yang tersedia" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mostra i comandi disponibili" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "利用可能なコマンドを表示" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "사용 가능한 명령어 표시" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tunjukkan perintah yang tersedia" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "उपलब्ध आदेशहरू देखाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "beschikbare commando's tonen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pokaż dostępne komendy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mostrar os comandos disponíveis" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "показать доступные команды" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "visa tillgängliga kommandon" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "கிடைக்கும் கட்டளைகளைக் காட்டவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แสดงคำสั่งที่ใช้ได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kullanılabilir komutları göster" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "показати доступні команди" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "دستیاب کمانڈز دکھائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hiển thị các lệnh khả dụng" + } } } }, @@ -15516,6 +20844,150 @@ "state" : "translated", "value" : "send a cashu ecash token in this chat" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "إرسال رمز cashu ecash في هذه الدردشة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এই চ্যাটে একটি ক্যাশু ইক্যাশ টোকেন পাঠান" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "einen cashu-ecash-token in diesem chat senden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "enviar un token de ecash Cashu en este chat" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "envoyer un token ecash cashu dans cette discussion" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שליחת אסימון cashu ecash בצ'אט הזה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इस चैट में कैशु ईकैश टोकन भेजें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kirim token cashu ecash di obrolan ini" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "invia un token ecash cashu in questa chat" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "このチャットでcashuのecashトークンを送る" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이 채팅에서 cashu ecash 토큰 보내기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hantar token cashu ecash dalam sembang ini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "यो च्याटमा cashu इ-क्यास टोकन पठाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "een cashu-ecash-token in deze chat sturen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wyślij token ecash Cashu na tym czacie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enviar um token ecash cashu nesta conversa" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "отправить токен cashu ecash в этот чат" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "skicka en Cashu ecash-token i den här chatten" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இந்த உரையாடலில் Cashu ecash டோக்கனை அனுப்பவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งโทเคน ecash ของ cashu ในแชทนี้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bu sohbette cashu ecash tokenı gönder" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "надіслати токен cashu ecash у цьому чаті" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اس چیٹ میں Cashu ecash ٹوکن بھیجیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gửi token cashu ecash trong cuộc trò chuyện này" + } } } }, @@ -15528,6 +21000,150 @@ "state" : "translated", "value" : "measure round-trip time to a mesh peer" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "قياس زمن الذهاب والإياب إلى قرين mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "কোনো মেশ পিয়ারে রাউন্ড-ট্রিপ সময় মাপুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "die roundtrip-zeit zu einem mesh-peer messen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "medir el tiempo de ida y vuelta a un peer del mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesurer le temps d'aller-retour vers un pair mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מדידת זמן הלוך ושוב לעמית mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "किसी मेश पीयर तक राउंड-ट्रिप समय मापें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ukur waktu bolak-balik ke peer mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "misura il tempo di andata e ritorno verso un peer mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "meshピアへの往復時間を測定" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh 피어까지의 왕복 시간 측정" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ukur masa pergi-balik ke peer mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh सहकर्मीसम्मको राउन्ड-ट्रिप समय नाप" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "de retourtijd naar een mesh-peer meten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zmierz czas do peera mesh i z powrotem" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "medir o tempo de ida e volta até um par mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "измерить время отклика до mesh-пира" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mät tur-och-retur-tid till en mesh-peer" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh peer க்கு செல்லவந்த நேரத்தை அளவிடவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "วัดเวลาไป-กลับไปยังเพียร์ mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bir mesh eşine gidiş-dönüş süresini ölç" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "виміряти час туди-назад до піра mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh ہم منصب تک راؤنڈ ٹرپ وقت ناپیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đo thời gian khứ hồi đến một nút mesh" + } } } }, @@ -15719,6 +21335,150 @@ "state" : "translated", "value" : "estimate the mesh path to a peer" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تقدير مسار mesh إلى قرين" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "কোনো পিয়ার পর্যন্ত মেশ পথ অনুমান করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "den mesh-pfad zu einem peer schätzen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimar la ruta del mesh hasta un peer" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "estimer le chemin mesh vers un pair" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הערכת נתיב ה-mesh לעמית" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "किसी पीयर तक मेश पथ का अनुमान लगाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "perkirakan jalur mesh ke peer" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "stima il percorso mesh verso un peer" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ピアへのmeshの経路を推定" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "피어까지의 mesh 경로 추정" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anggarkan laluan mesh ke peer" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "सहकर्मीसम्मको mesh मार्ग अनुमान गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "het mesh-pad naar een peer schatten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "oszacuj ścieżkę mesh do peera" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "estimar o caminho mesh até um par" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "оценить mesh-путь до пира" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uppskatta mesh-vägen till en peer" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "peer க்கான mesh பாதையை மதிப்பிடவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ประมาณเส้นทาง mesh ไปยังเพียร์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bir eşe giden mesh yolunu tahmin et" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "оцінити шлях mesh до піра" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "کسی ہم منصب تک mesh راستے کا تخمینہ لگائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ước tính đường đi mesh đến một nút" + } } } }, @@ -17163,6 +22923,150 @@ "state" : "translated", "value" : "not delivered" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "لم يُسلَّم" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "পৌঁছায়নি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nicht zugestellt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no entregado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "non livré" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא נמסר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "डिलीवर नहीं हुआ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak terkirim" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "non consegnato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "未配信" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "전송되지 않음" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak dihantar" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "डेलिभर भएन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "niet bezorgd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie dostarczono" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não entregue" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не доставлено" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inte levererat" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "வழங்கப்படவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ยังไม่ได้ส่ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teslim edilmedi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не доставлено" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نہیں پہنچا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chưa gửi được" + } } } }, @@ -17175,6 +23079,150 @@ "state" : "translated", "value" : "encryption failed" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "فشل التشفير" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এনক্রিপশন ব্যর্থ" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verschlüsselung fehlgeschlagen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "cifrado fallido" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "échec du chiffrement" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ההצפנה נכשלה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "एन्क्रिप्शन विफल" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enkripsi gagal" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cifratura fallita" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "暗号化に失敗" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "암호화 실패" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enkripsi gagal" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "सङ्केत असफल" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "versleuteling mislukt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "szyfrowanie nie powiodło się" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "falha na encriptação" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "шифрование не удалось" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kryptering misslyckades" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குறியாக்கம் தோல்வியடைந்தது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เข้ารหัสไม่สำเร็จ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "şifreleme başarısız" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "шифрування не вдалося" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "انکرپشن ناکام" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mã hóa thất bại" + } } } }, @@ -17187,6 +23235,150 @@ "state" : "translated", "value" : "voice note too large" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الملاحظة الصوتية كبيرة جدًا" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ভয়েস নোট খুব বড়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sprachnachricht zu groß" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "nota de voz demasiado grande" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "note vocale trop volumineuse" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ההערה הקולית גדולה מדי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वॉइस नोट बहुत बड़ा" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "catatan suara terlalu besar" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nota vocale troppo grande" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ボイスメモが大きすぎます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "음성 메모가 너무 큼" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nota suara terlalu besar" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "भ्वाइस नोट धेरै ठूलो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "spraakbericht te groot" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "notatka głosowa zbyt duża" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nota de voz demasiado grande" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "голосовое сообщение слишком большое" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "röstmeddelandet är för stort" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குரல் குறிப்பு மிகப் பெரியது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ข้อความเสียงใหญ่เกินไป" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesli not çok büyük" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "голосова нотатка завелика" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "وائس نوٹ بہت بڑا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ghi chú giọng nói quá lớn" + } } } }, @@ -17199,6 +23391,150 @@ "state" : "translated", "value" : "voice note failed to send" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "فشل إرسال الملاحظة الصوتية" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ভয়েস নোট পাঠানো যায়নি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sprachnachricht konnte nicht gesendet werden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no se pudo enviar la nota de voz" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "échec de l'envoi de la note vocale" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שליחת ההערה הקולית נכשלה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वॉइस नोट भेजने में विफल" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "catatan suara gagal dikirim" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "invio della nota vocale non riuscito" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ボイスメモの送信に失敗" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "음성 메모 전송 실패" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nota suara gagal dihantar" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "भ्वाइस नोट पठाउन असफल" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "spraakbericht kon niet worden verzonden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie udało się wysłać notatki głosowej" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "falha ao enviar a nota de voz" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не удалось отправить голосовое сообщение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "röstmeddelandet kunde inte skickas" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குரல் குறிப்பு அனுப்ப முடியவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งข้อความเสียงไม่สำเร็จ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesli not gönderilemedi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не вдалося надіслати голосову нотатку" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "وائس نوٹ بھیجنے میں ناکام" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gửi ghi chú giọng nói thất bại" + } } } }, @@ -17927,6 +24263,150 @@ "state" : "translated", "value" : "sending..." } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "جارٍ الإرسال..." + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "পাঠানো হচ্ছে..." + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wird gesendet ..." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "enviando..." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "envoi..." + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שולח..." + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "भेजा जा रहा है..." + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mengirim..." + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "invio in corso..." + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "送信中..." + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "전송 중..." + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "menghantar..." + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पठाइँदै..." + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verzenden..." + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wysyłanie..." + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "a enviar..." + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "отправка..." + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "skickar..." + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "அனுப்புகிறது..." + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "กำลังส่ง..." + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gönderiliyor..." + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "надсилання..." + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بھیجا جا رہا ہے..." + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đang gửi..." + } } } }, @@ -17939,6 +24419,150 @@ "state" : "translated", "value" : "sent — no delivery confirmation yet" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "أُرسِل — لا يوجد تأكيد تسليم بعد" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "পাঠানো হয়েছে — এখনো ডেলিভারি নিশ্চিতকরণ নেই" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gesendet — noch keine zustellbestätigung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "enviado — aún sin confirmación de entrega" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "envoyé — aucune confirmation de livraison pour l'instant" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "נשלח — אין עדיין אישור מסירה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "भेजा गया — अभी तक डिलीवरी की पुष्टि नहीं" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "terkirim — belum ada konfirmasi pengiriman" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inviato — ancora nessuna conferma di consegna" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "送信済み — まだ配信確認がありません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "전송됨 — 아직 전송 확인 없음" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dihantar — belum ada pengesahan penghantaran" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पठाइयो — अझै डेलिभरी पुष्टि छैन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verzonden — nog geen bezorgbevestiging" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wysłano — brak potwierdzenia dostarczenia" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enviado — ainda sem confirmação de entrega" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "отправлено — подтверждения доставки пока нет" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "skickat — ingen leveransbekräftelse än" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "அனுப்பப்பட்டது — இன்னும் வழங்கல் உறுதிப்படுத்தல் இல்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งแล้ว — ยังไม่มีการยืนยันการส่ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gönderildi — henüz teslim onayı yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "надіслано — ще немає підтвердження доставки" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بھیج دیا گیا — ابھی ترسیل کی تصدیق نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã gửi — chưa có xác nhận nhận được" + } } } }, @@ -17951,6 +24575,150 @@ "state" : "translated", "value" : "you're in #%@ — a public location channel over the internet" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "أنت في #%@ — قناة موقع عامة عبر الإنترنت" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনি #%@-এ আছেন — ইন্টারনেটের ওপর একটি পাবলিক লোকেশন চ্যানেল" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du bist in #%@ — ein öffentlicher standortkanal über das internet" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "estás en #%@ — un canal de ubicación público por internet" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tu es dans #%@ — un canal de localisation public sur internet" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אתה ב-#%@ — ערוץ מיקום ציבורי דרך האינטרנט" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आप #%@ में हैं — इंटरनेट पर एक सार्वजनिक लोकेशन चैनल" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kamu di #%@ — kanal lokasi publik lewat internet" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sei in #%@ — un canale di posizione pubblico su internet" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ にいます — インターネット経由の公開位置チャンネルです" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ 에 있습니다 — 인터넷을 통한 공개 위치 채널입니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anda di #%@ — kanal lokasi awam melalui internet" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिमी #%@ मा छौ — इन्टरनेटमाथिको सार्वजनिक स्थान च्यानल" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "je bent in #%@ — een openbaar locatiekanaal via internet" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "jesteś w #%@ — publiczny kanał lokalizacji przez internet" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "estás em #%@ — um canal de localização público pela internet" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ты в #%@ — публичном локальном канале через интернет" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du är i #%@ — en publik platskanal över internet" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "நீங்கள் #%@ இல் இருக்கிறீர்கள் — இணையம் வழியாக ஒரு பொது இருப்பிட சேனல்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "คุณอยู่ใน #%@ — ช่องตามตำแหน่งสาธารณะผ่านอินเทอร์เน็ต" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ kanalındasın — internet üzerinden herkese açık bir konum kanalı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ти в #%@ — публічний канал локації через інтернет" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آپ #%@ میں ہیں — انٹرنیٹ پر ایک عوامی لوکیشن چینل" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bạn đang ở #%@ — một kênh vị trí công khai qua internet" + } } } }, @@ -17963,6 +24731,150 @@ "state" : "translated", "value" : "you're on #mesh — reaches people within bluetooth range" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "أنت في #mesh — تصل إلى الأشخاص ضمن نطاق bluetooth" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনি #mesh-এ আছেন — ব্লুটুথ পরিসরের মধ্যে মানুষের কাছে পৌঁছায়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du bist auf #mesh — erreicht menschen in bluetooth-reichweite" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "estás en #mesh — llega a personas dentro del alcance de Bluetooth" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tu es sur #mesh — atteint les personnes à portée bluetooth" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אתה ב-#mesh — מגיע לאנשים בטווח bluetooth" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आप #mesh पर हैं — ब्लूटूथ रेंज के भीतर लोगों तक पहुँचता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kamu di #mesh — menjangkau orang dalam jangkauan bluetooth" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sei su #mesh — raggiunge le persone a portata bluetooth" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh にいます — bluetooth圏内の人に届きます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh 에 있습니다 — bluetooth 범위 내의 사람에게 도달합니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anda di #mesh — mencapai orang dalam jangkauan bluetooth" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिमी #mesh मा छौ — bluetooth दायराभित्रका मानिससम्म पुग्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "je bent op #mesh — bereikt mensen binnen bluetoothbereik" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "jesteś na #mesh — dociera do osób w zasięgu Bluetooth" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "estás em #mesh — alcança pessoas dentro do alcance bluetooth" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ты в #mesh — достаёт людей в радиусе bluetooth" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du är på #mesh — når personer inom Bluetooth-räckvidd" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "நீங்கள் #mesh இல் இருக்கிறீர்கள் — bluetooth வரம்பிற்குள் உள்ளவர்களை அடையும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "คุณอยู่ใน #mesh — เข้าถึงคนในระยะ bluetooth" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh kanalındasın — Bluetooth menzilindeki kişilere ulaşır" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ти на #mesh — досягає людей у радіусі bluetooth" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آپ #mesh پر ہیں — Bluetooth رینج میں لوگوں تک پہنچتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bạn đang ở #mesh — tiếp cận mọi người trong phạm vi Bluetooth" + } } } }, @@ -17975,6 +24887,150 @@ "state" : "translated", "value" : "nobody in range yet... messages appear here" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "لا أحد في النطاق بعد... ستظهر الرسائل هنا" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এখনো কেউ পরিসরে নেই... বার্তা এখানে দেখা যাবে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "noch niemand in reichweite ... nachrichten erscheinen hier" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "nadie a tu alcance todavía... los mensajes aparecerán aquí" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "personne à portée pour l'instant... les messages apparaîtront ici" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אף אחד לא בטווח עדיין... הודעות יופיעו כאן" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "अभी तक कोई रेंज में नहीं... संदेश यहाँ दिखाई देंगे" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "belum ada siapa pun dalam jangkauan... pesan akan muncul di sini" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ancora nessuno a portata... i messaggi appariranno qui" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "まだ圏内に誰もいません... メッセージはここに表示されます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "아직 범위 내에 아무도 없습니다... 메시지가 여기에 표시됩니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "belum ada sesiapa dalam jangkauan... pesan akan muncul di sini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "अझै दायरामा कोही छैन... सन्देश यहाँ देखिन्छन्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nog niemand in bereik... berichten verschijnen hier" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nikogo w zasięgu... wiadomości pojawią się tutaj" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ainda ninguém ao alcance... as mensagens aparecem aqui" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "пока никого рядом... сообщения появятся здесь" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ingen inom räckvidd än... meddelanden visas här" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இன்னும் வரம்பில் யாரும் இல்லை... செய்திகள் இங்கே தோன்றும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ยังไม่มีใครอยู่ในระยะ... ข้อความจะปรากฏที่นี่" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "menzilde henüz kimse yok... mesajlar burada görünür" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "поки нікого в радіусі... повідомлення з'являться тут" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ابھی رینج میں کوئی نہیں... پیغامات یہاں ظاہر ہوں گے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chưa có ai trong phạm vi... tin nhắn sẽ xuất hiện ở đây" + } } } }, @@ -17987,6 +25043,150 @@ "state" : "translated", "value" : "tap the channel name above to switch · tap bitchat/ for help" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اضغط اسم القناة بالأعلى للتبديل · اضغط bitchat/ للمساعدة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "বদলাতে উপরের চ্যানেলের নাম ট্যাপ করুন · সাহায্যের জন্য bitchat/ ট্যাপ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tippe oben auf den kanalnamen zum wechseln · tippe bitchat/ für hilfe" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "toca el nombre del canal de arriba para cambiar · toca bitchat/ para ayuda" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "touche le nom du canal ci-dessus pour changer · touche bitchat/ pour l'aide" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הקש על שם הערוץ למעלה כדי להחליף · הקש על bitchat/ לעזרה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "स्विच करने के लिए ऊपर चैनल का नाम टैप करें · मदद के लिए bitchat/ टैप करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ketuk nama kanal di atas untuk beralih · ketuk bitchat/ untuk bantuan" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tocca il nome del canale in alto per cambiare · tocca bitchat/ per l'aiuto" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "上のチャンネル名をタップして切り替え · bitchat/ をタップしてヘルプ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "위의 채널 이름을 탭하여 전환 · bitchat/ 를 탭하여 도움말" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ketuk nama kanal di atas untuk beralih · ketuk bitchat/ untuk bantuan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "बदल्न माथिको च्यानल नाम ट्याप गर · मद्दतका लागि bitchat/ ट्याप गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tik op de kanaalnaam hierboven om te wisselen · tik op bitchat/ voor hulp" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "stuknij nazwę kanału powyżej, aby przełączyć · stuknij bitchat/ po pomoc" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toca no nome do canal acima para trocar · toca em bitchat/ para ajuda" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "нажми на имя канала выше, чтобы переключиться · нажми bitchat/ для справки" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tryck på kanalnamnet ovan för att byta · tryck på bitchat/ för hjälp" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "மாற்ற மேலே உள்ள சேனல் பெயரைத் தட்டவும் · உதவிக்கு bitchat/ ஐத் தட்டவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แตะชื่อช่องด้านบนเพื่อสลับ · แตะ bitchat/ เพื่อดูวิธีใช้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "değiştirmek için yukarıdaki kanal adına dokunun · yardım için bitchat/ dokunun" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "торкнися назви каналу вгорі, щоб перемкнути · торкнися bitchat/ для довідки" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تبدیل کرنے کیلئے اوپر چینل کے نام پر ٹیپ کریں · مدد کیلئے bitchat/ پر ٹیپ کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chạm tên kênh phía trên để chuyển · chạm bitchat/ để được trợ giúp" + } } } }, @@ -17999,6 +25199,150 @@ "state" : "translated", "value" : "Sharing your internet connection with nearby mesh peers" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "مشاركة اتصال الإنترنت مع أقران mesh القريبين" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "কাছাকাছি মেশ পিয়ারদের সঙ্গে আপনার ইন্টারনেট সংযোগ ভাগ করছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teilt deine internetverbindung mit nahen mesh-peers" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compartiendo tu conexión a internet con peers cercanos del mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "partage ta connexion internet avec les pairs mesh à proximité" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "משתף את חיבור האינטרנט שלך עם עמיתי mesh קרובים" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आपका इंटरनेट कनेक्शन आसपास के मेश पीयरों के साथ साझा किया जा रहा है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membagikan koneksi internetmu dengan peer mesh terdekat" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "condivide la tua connessione internet con i peer mesh vicini" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "近くのmeshピアとインターネット接続を共有中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "근처 mesh 피어와 인터넷 연결을 공유 중" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "berkongsi sambungan internetmu dengan peer mesh berdekatan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिम्रो इन्टरनेट जडान नजिकका mesh सहकर्मीसँग साझेदारी गरिँदै" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "deelt je internetverbinding met mesh-peers in de buurt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Udostępniasz swoje połączenie internetowe pobliskim peerom mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "a partilhar a tua ligação à internet com pares mesh próximos" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "раздаёт твоё интернет-соединение ближайшим mesh-пирам" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Delar din internetanslutning med mesh-peers i närheten" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "உங்கள் இணைய இணைப்பை அருகிலுள்ள mesh peer-களுடன் பகிர்கிறது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "กำลังแชร์การเชื่อมต่ออินเทอร์เน็ตของคุณกับเพียร์ mesh ที่อยู่ใกล้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "İnternet bağlantınızı yakındaki mesh eşleriyle paylaşıyorsunuz" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ділишся своїм інтернет-з'єднанням з ближніми пірами mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "قریبی mesh ہم منصبوں کے ساتھ اپنا انٹرنیٹ کنکشن شیئر کر رہا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chia sẻ kết nối internet của bạn với các nút mesh gần đó" + } } } }, @@ -18368,6 +25712,150 @@ "state" : "translated", "value" : "create|invite|leave|list" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "create|invite|leave|list" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } } } }, @@ -18380,6 +25868,150 @@ "state" : "translated", "value" : "message #%@ — public" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "رسالة #%@ — عام" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@-এ বার্তা — পাবলিক" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nachricht an #%@ — öffentlich" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensaje #%@ — público" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "message vers #%@ — public" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הודעה ל-#%@ — ציבורי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "संदेश #%@ — सार्वजनिक" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan #%@ — publik" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "messaggio a #%@ — pubblico" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ にメッセージ — 公開" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ 에 메시지 — 공개" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan #%@ — awam" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ मा सन्देश — सार्वजनिक" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bericht naar #%@ — openbaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wiadomość #%@ — publiczna" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagem para #%@ — público" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "сообщение в #%@ — публичное" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "meddelande #%@ — publikt" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ க்கு செய்தி — பொது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งข้อความถึง #%@ — สาธารณะ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesaj #%@ — herkese açık" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "повідомлення #%@ — публічне" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پیغام #%@ — عوامی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhắn #%@ — công khai" + } } } }, @@ -18392,6 +26024,150 @@ "state" : "translated", "value" : "message #mesh — public, nearby" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "رسالة #mesh — عام، قريب" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh-এ বার্তা — পাবলিক, কাছাকাছি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nachricht an #mesh — öffentlich, in der nähe" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensaje #mesh — público, cerca" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "message vers #mesh — public, à proximité" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הודעה ל-#mesh — ציבורי, קרוב" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "संदेश #mesh — सार्वजनिक, आसपास" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan #mesh — publik, terdekat" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "messaggio a #mesh — pubblico, nelle vicinanze" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh にメッセージ — 公開、近くの人へ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh 에 메시지 — 공개, 근처" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan #mesh — awam, berdekatan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh मा सन्देश — सार्वजनिक, नजिकको" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bericht naar #mesh — openbaar, in de buurt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wiadomość #mesh — publiczna, w pobliżu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagem para #mesh — público, próximo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "сообщение в #mesh — публичное, рядом" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "meddelande #mesh — publikt, i närheten" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh க்கு செய்தி — பொது, அருகில்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งข้อความถึง #mesh — สาธารณะ, ใกล้เคียง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesaj #mesh — herkese açık, yakında" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "повідомлення #mesh — публічне, поблизу" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پیغام #mesh — عوامی، قریبی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhắn #mesh — công khai, gần đây" + } } } }, @@ -18404,6 +26180,150 @@ "state" : "translated", "value" : "message %@ — private" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "رسالة %@ — خاص" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@-কে বার্তা — ব্যক্তিগত" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nachricht an %@ — privat" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensaje %@ — privado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "message à %@ — privé" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הודעה ל-%@ — פרטי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "संदेश %@ — निजी" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan %@ — pribadi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "messaggio a %@ — privato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ にメッセージ — プライベート" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 에게 메시지 — 비공개" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan %@ — peribadi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ लाई सन्देश — निजी" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bericht naar %@ — privé" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wiadomość do %@ — prywatna" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagem para %@ — privado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "сообщение для %@ — личное" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "meddelande %@ — privat" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ க்கு செய்தி — தனிப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งข้อความถึง %@ — ส่วนตัว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesaj %@ — özel" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "повідомлення %@ — приватне" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پیغام %@ — نجی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhắn %@ — riêng tư" + } } } }, @@ -18416,6 +26336,150 @@ "state" : "translated", "value" : "private conversation" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "محادثة خاصة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ব্যক্তিগত কথোপকথন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privates gespräch" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "conversación privada" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "conversation privée" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שיחה פרטית" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी बातचीत" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "percakapan pribadi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "conversazione privata" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "プライベートな会話" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "비공개 대화" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "perbualan peribadi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी कुराकानी" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privégesprek" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "rozmowa prywatna" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "conversa privada" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "личный разговор" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privat konversation" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "தனிப்பட்ட உரையாடல்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "การสนทนาส่วนตัว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "özel konuşma" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "приватна розмова" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نجی گفتگو" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cuộc trò chuyện riêng tư" + } } } }, @@ -18428,6 +26492,150 @@ "state" : "translated", "value" : "private · end-to-end encrypted" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "خاص · مشفّر من طرف إلى طرف" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ব্যক্তিগত · এন্ড-টু-এন্ড এনক্রিপ্টেড" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privat · end-to-end-verschlüsselt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "privado · cifrado de extremo a extremo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privé · chiffré de bout en bout" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "פרטי · מוצפן מקצה לקצה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी · एंड-टू-एंड एन्क्रिप्टेड" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pribadi · terenkripsi ujung ke ujung" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privato · cifrato end-to-end" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "プライベート · エンドツーエンド暗号化" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "비공개 · 종단간 암호화" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "peribadi · terenkripsi ujung ke ujung" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी · एन्ड-टु-एन्ड सङ्केत" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privé · end-to-end-versleuteld" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "prywatna · szyfrowana end-to-end" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privado · encriptado ponta a ponta" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "лично · сквозное шифрование" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privat · end-to-end-krypterad" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "தனிப்பட்டது · முனை-முதல்-முனை குறியாக்கம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่วนตัว · เข้ารหัสแบบครบวงจร" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "özel · uçtan uca şifreli" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "приватна · наскрізно зашифрована" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نجی · اینڈ ٹو اینڈ خفیہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "riêng tư · mã hóa đầu cuối" + } } } }, @@ -18619,6 +26827,150 @@ "state" : "translated", "value" : "token" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "رمز" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "টোকেন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "token" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "טוקן" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "टोकन" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "トークン" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "토큰" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "टोकन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "токен" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "டோக்கன்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "โทเคน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "токен" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ٹوکن" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } } } }, @@ -18631,6 +26983,150 @@ "state" : "translated", "value" : "%lld new" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld جديدة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld নতুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld neu" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld nuevos" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld nouveaux" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld חדשות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld नए" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld baru" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld nuovi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld 件の新着" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "새 메시지 %lld개" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld baru" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld नयाँ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld nieuw" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld nowych" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld novas" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld новых" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld nya" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld புதியது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ใหม่ %lld รายการ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld yeni" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld нових" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld نئی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld mới" + } } } }, @@ -19896,6 +28392,150 @@ "state" : "translated", "value" : "copy token" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نسخ الرمز" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "টোকেন কপি করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token kopieren" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "copiar token" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "copier le token" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "העתק טוקן" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "टोकन कॉपी करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "salin token" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "copia token" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "トークンをコピー" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "토큰 복사" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "salin token" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "टोकन कपी गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token kopiëren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kopiuj token" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "copiar token" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "скопировать токен" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kopiera token" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "டோக்கனை நகலெடு" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "คัดลอกโทเคน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tokenı kopyala" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "скопіювати токен" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ٹوکن کاپی کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sao chép token" + } } } }, @@ -20087,6 +28727,150 @@ "state" : "translated", "value" : "redeem in wallet" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الاسترداد في المحفظة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ওয়ালেটে রিডিম করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "in wallet einlösen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "canjear en la cartera" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "utiliser dans le wallet" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מימוש בארנק" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वॉलेट में रिडीम करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tukarkan di dompet" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "riscatta nel wallet" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ウォレットで受け取る" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "지갑에서 받기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tebus dalam dompet" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वालेटमा भजाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inwisselen in wallet" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zrealizuj w portfelu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "resgatar na wallet" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "обменять в кошельке" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lös in i plånbok" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "வாலெட்டில் மீட்டெடு" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แลกในกระเป๋าเงิน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cüzdanda kullan" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "погасити в гаманці" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "والیٹ میں ریڈیم کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đổi trong ví" + } } } }, @@ -20099,6 +28883,150 @@ "state" : "translated", "value" : "redeem on web" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الاسترداد على الويب" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ওয়েবে রিডিম করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "im web einlösen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "canjear en la web" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "utiliser sur le web" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מימוש באינטרנט" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वेब पर रिडीम करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tukarkan di web" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "riscatta sul web" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ウェブで受け取る" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "웹에서 받기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tebus di web" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वेबमा भजाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inwisselen op web" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zrealizuj w sieci" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "resgatar na web" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "обменять в вебе" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lös in på webben" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "வெப்பில் மீட்டெடு" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แลกบนเว็บ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "webde kullan" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "погасити у вебі" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ویب پر ریڈیم کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đổi trên web" + } } } }, @@ -20110,6 +29038,150 @@ "state" : "translated", "value" : "encrypted group · members only" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "مجموعة مشفّرة · للأعضاء فقط" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এনক্রিপ্টেড গ্রুপ · শুধু সদস্য" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verschlüsselte gruppe · nur mitglieder" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "grupo cifrado · solo miembros" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "groupe chiffré · membres uniquement" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "קבוצה מוצפנת · לחברים בלבד" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "एन्क्रिप्टेड समूह · केवल सदस्य" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grup terenkripsi · hanya anggota" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppo cifrato · solo membri" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "暗号化グループ · メンバー限定" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "암호화된 그룹 · 멤버 전용" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kumpulan terenkripsi · ahli sahaja" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "सङ्केतित समूह · सदस्य मात्र" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "versleutelde groep · alleen leden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "szyfrowana grupa · tylko członkowie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupo encriptado · apenas membros" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "зашифрованная группа · только участники" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "krypterad grupp · endast medlemmar" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குறியாக்கம் செய்யப்பட்ட குழு · உறுப்பினர்கள் மட்டுமே" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "กลุ่มที่เข้ารหัส · เฉพาะสมาชิก" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "şifreli grup · yalnızca üyeler" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "зашифрована група · лише учасники" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "خفیہ گروپ · صرف اراکین" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhóm mã hóa · chỉ thành viên" + } } } }, @@ -22628,6 +31700,150 @@ "state" : "translated", "value" : "✓ VOUCHED" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ موثوق" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ সমর্থিত" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ VERBÜRGT" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ AVALADO" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ ATTESTÉ" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ בערבות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ अनुशंसित" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ DIJAMIN" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ GARANTITO" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ 保証済み" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ 보증됨" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ DIJAMIN" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ जमानत" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ INGESTAAN" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ PORĘCZONY" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ ATESTADO" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ ПОРУЧЕНО" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ INTYGAD" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ உத்தரவாதம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ รับรองแล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ KEFİL OLUNDU" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ ЗАСВІДЧЕНО" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ ضمانت شدہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ ĐÃ BẢO CHỨNG" + } } } }, @@ -23199,6 +32415,290 @@ } } } + }, + "bn" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনি যাচাই করেছেন এমন %d জনের দ্বারা সমর্থিত" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনি যাচাই করেছেন এমন %d জনের দ্বারা সমর্থিত" + } + } + } + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "avalado por %#@people@ que verificaste" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d persona" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d personas" + } + } + } + } + } + } + }, + "hi" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आपके सत्यापित %d व्यक्ति द्वारा अनुशंसित" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आपके सत्यापित %d लोगों द्वारा अनुशंसित" + } + } + } + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dijamin oleh %#@people@ yang kamu verifikasi" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d orang" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d orang" + } + } + } + } + } + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%#@people@ が保証しています(あなたが確認済み)" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d人" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d人" + } + } + } + } + } + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "당신이 확인한 %#@people@이(가) 보증함" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d명" + } + } + } + } + } + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dijamin oleh %#@people@ yang anda sahkan" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d orang" + } + } + } + } + } + } + }, + "ne" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिमीले प्रमाणित गरेका %d व्यक्तिले जमानत गरेका" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिमीले प्रमाणित गरेका %d व्यक्तिले जमानत गरेका" + } + } + } + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "за него поручились %#@people@, кого ты проверил" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d человек" + } + }, + "few" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d человека" + } + }, + "many" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d человек" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d человека" + } + } + } + } + } + } + }, + "ta" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "நீங்கள் சரிபார்த்த %d நபரால் உத்தரவாதம் அளிக்கப்பட்டது" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "நீங்கள் சரிபார்த்த %d நபர்களால் உத்தரவாதம் அளிக்கப்பட்டது" + } + } + } + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "รับรองโดย %#@people@ ที่คุณยืนยันแล้ว" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d คน" + } + } + } + } + } + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "được bảo chứng bởi %#@people@ mà bạn đã xác minh" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d người" + } + } + } + } + } + } } } }, @@ -24285,6 +33785,150 @@ "state" : "translated", "value" : "in this area" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "في هذه المنطقة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এই এলাকায়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "in diesem gebiet" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "en esta zona" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dans cette zone" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "באזור הזה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इस क्षेत्र में" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "di area ini" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "in questa zona" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "このエリア内" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이 지역 내" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "di kawasan ini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "यही क्षेत्रमा" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "in dit gebied" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "w tym obszarze" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nesta área" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "в этой зоне" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i det här området" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இந்தப் பகுதியில்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ในพื้นที่นี้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bu bölgede" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "у цій зоні" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اس علاقے میں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "trong khu vực này" + } } } }, @@ -24297,6 +33941,150 @@ "state" : "translated", "value" : "teleported from elsewhere" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "منتقل فوريًا من مكان آخر" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "অন্য কোথাও থেকে টেলিপোর্টেড" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "von woanders teleportiert" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "teletransportado desde otro lugar" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "téléporté d'ailleurs" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "עבר בטלפורט ממקום אחר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "कहीं और से टेलीपोर्टेड" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teleport dari tempat lain" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teletrasportato da altrove" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "別の場所からテレポート" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "다른 곳에서 텔레포트" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teleport dari tempat lain" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "अन्त कतैबाट टेलिपोर्ट" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "van elders geteleporteerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teleportowany skądinąd" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teletransportado de outro lugar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "телепортирован из другого места" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teleporterad från annan plats" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "வேறு இடத்திலிருந்து டெலிபோர்ட் செய்யப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เทเลพอร์ตจากที่อื่น" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "başka bir yerden ışınlandı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "телепортований звідкись" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "کہیں اور سے ٹیلی پورٹ ہوا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dịch chuyển từ nơi khác" + } } } }, @@ -24309,6 +34097,150 @@ "state" : "translated", "value" : "you" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "أنت" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "tú" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toi" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אתה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आप" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kamu" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tu" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "あなた" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "나" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anda" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिमी" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "jij" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ty" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tu" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ты" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "நீங்கள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "คุณ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sen" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ти" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آپ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bạn" + } } } }, @@ -24678,6 +34610,150 @@ "state" : "translated", "value" : "Opens the group chat" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يفتح الدردشة الجماعية" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "গ্রুপ চ্যাট খোলে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Öffnet den gruppenchat" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abre el chat de grupo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ouvre la discussion de groupe" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "פותח את הצ'אט הקבוצתי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह चैट खोलता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka obrolan grup" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Apre la chat di gruppo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループチャットを開きます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹 채팅을 엽니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka sembang kumpulan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह च्याट खोल्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Opent de groepschat" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Otwiera czat grupowy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Abre a conversa de grupo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "открывает групповой чат" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Öppnar gruppchatten" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குழு உரையாடலைத் திறக்கும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เปิดแชทกลุ่ม" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Grup sohbetini açar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Відкриває груповий чат" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گروپ چیٹ کھولتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mở cuộc trò chuyện nhóm" + } } } }, @@ -24689,6 +34765,150 @@ "state" : "translated", "value" : "(%@)" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "(%@)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } } } }, @@ -24700,6 +34920,150 @@ "state" : "translated", "value" : "groups" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "المجموعات" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "গ্রুপ" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "grupos" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "groupes" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "קבוצות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grup" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kumpulan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूहहरू" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "groepen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupos" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "группы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupper" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குழுக்கள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "กลุ่ม" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruplar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "групи" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گروپس" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhóm" + } } } }, @@ -24711,6 +35075,150 @@ "state" : "translated", "value" : "Creator" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "المُنشئ" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "নির্মাতা" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ersteller" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Creador" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Créateur" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "יוצר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निर्माता" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pembuat" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Creatore" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "作成者" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "생성자" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pencipta" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "सिर्जनाकर्ता" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Maker" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Twórca" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Criador" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "создатель" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Skapare" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "உருவாக்கியவர்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ผู้สร้าง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Oluşturan" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Створювач" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بنانے والا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "người tạo" + } } } }, @@ -24723,6 +35231,150 @@ "state" : "translated", "value" : "bookmark channel" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "إضافة إشارة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "চ্যানেল বুকমার্ক করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kanal mit lesezeichen versehen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "marcar canal" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mettre le canal en signet" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הוסף סימנייה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चैनल बुकमार्क करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tandai kanal" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "aggiungi il canale ai segnalibri" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "チャンネルをブックマーク" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "채널 북마크" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tanda buku kanal" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "च्यानल बुकमार्क गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kanaal toevoegen aan bladwijzers" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dodaj kanał do zakładek" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "marcar canal" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "добавить канал в закладки" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bokmärk kanal" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "சேனலைப் புக்மார்க் செய்யவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "บุ๊กมาร์กช่อง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kanalı yer imlerine ekle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "додати канал у закладки" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "چینل کو بُک مارک کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đánh dấu kênh" + } } } }, @@ -24735,6 +35387,150 @@ "state" : "translated", "value" : "remove bookmark" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "إزالة الإشارة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "বুকমার্ক সরান" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lesezeichen entfernen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "quitar marcador" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "supprimer le signet" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הסר סימנייה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "बुकमार्क हटाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hapus tanda" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "rimuovi segnalibro" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ブックマークを削除" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "북마크 제거" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "buang tanda buku" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "बुकमार्क हटाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bladwijzer verwijderen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "usuń zakładkę" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "remover marcador" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "удалить закладку" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ta bort bokmärke" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "புக்மார்க்கை நீக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ลบบุ๊กมาร์ก" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "yer imini kaldır" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "видалити закладку" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بُک مارک ہٹائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bỏ đánh dấu" + } } } }, @@ -24747,6 +35543,150 @@ "state" : "translated", "value" : "switches to this channel" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "التبديل إلى هذه القناة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এই চ্যানেলে বদলে যায়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wechselt zu diesem kanal" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "cambia a este canal" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bascule vers ce canal" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מחליף לערוץ הזה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इस चैनल पर स्विच करता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "beralih ke kanal ini" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "passa a questo canale" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "このチャンネルに切り替えます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이 채널로 전환합니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "beralih ke kanal ini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "यो च्यानलमा बदल्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "schakelt naar dit kanaal" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "przełącza na ten kanał" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "muda para este canal" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "переключает на этот канал" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "byter till den här kanalen" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இந்த சேனலுக்கு மாறும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "สลับไปยังช่องนี้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bu kanala geçer" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "перемикає на цей канал" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اس چینل پر منتقل ہوتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chuyển sang kênh này" + } } } }, @@ -26012,6 +36952,150 @@ "state" : "translated", "value" : "share your internet with nearby mesh peers so their geohash messages reach the network" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "شارك إنترنتك مع أقران mesh القريبين لتصل رسائل geohash الخاصة بهم إلى الشبكة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "কাছাকাছি মেশ পিয়ারদের সঙ্গে আপনার ইন্টারনেট ভাগ করুন যাতে তাদের জিওহ্যাশ বার্তা নেটওয়ার্কে পৌঁছায়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teile dein internet mit nahen mesh-peers, damit ihre geohash-nachrichten das netzwerk erreichen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "comparte tu internet con peers cercanos del mesh para que sus mensajes geohash lleguen a la red" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "partage ton internet avec les pairs mesh à proximité pour que leurs messages geohash atteignent le réseau" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שתף את האינטרנט שלך עם עמיתי mesh קרובים כדי שהודעות ה-geohash שלהם יגיעו לרשת" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "अपना इंटरनेट आसपास के मेश पीयरों के साथ साझा करें ताकि उनके जियोहैश संदेश नेटवर्क तक पहुँचें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bagikan internetmu ke peer mesh terdekat agar pesan geohash mereka sampai ke jaringan" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "condividi il tuo internet con i peer mesh vicini così i loro messaggi geohash raggiungono la rete" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "近くのmeshピアとインターネットを共有して、そのgeohashメッセージをネットワークに届けます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "근처 mesh 피어와 인터넷을 공유하여 그들의 geohash 메시지가 네트워크에 도달하도록 합니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kongsi internetmu dengan peer mesh berdekatan supaya pesan geohash mereka sampai ke rangkaian" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "नजिकका mesh सहकर्मीसँग तिम्रो इन्टरनेट साझेदारी गर ताकि उनीहरूका geohash सन्देश नेटवर्कसम्म पुगून्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "deel je internet met mesh-peers in de buurt zodat hun geohash-berichten het netwerk bereiken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "udostępnij internet pobliskim peerom mesh, aby ich wiadomości geohash docierały do sieci" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "partilha a tua internet com pares mesh próximos para que as mensagens geohash deles cheguem à rede" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "раздай интернет ближайшим mesh-пирам, чтобы их geohash-сообщения дошли до сети" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dela ditt internet med mesh-peers i närheten så att deras geohash-meddelanden når nätverket" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "உங்கள் இணையத்தை அருகிலுள்ள mesh peer-களுடன் பகிர்ந்து அவர்களின் geohash செய்திகள் நெட்வொர்க்கை அடையச் செய்யவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แชร์อินเทอร์เน็ตของคุณกับเพียร์ mesh ที่อยู่ใกล้เพื่อให้ข้อความ geohash ของพวกเขาไปถึงเครือข่าย" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "geohash mesajlarının ağa ulaşması için internetini yakındaki mesh eşleriyle paylaş" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "поділися інтернетом з ближніми пірами mesh, щоб їхні повідомлення geohash досягали мережі" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "قریبی mesh ہم منصبوں کے ساتھ اپنا انٹرنیٹ شیئر کریں تاکہ ان کے geohash پیغامات نیٹ ورک تک پہنچیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chia sẻ internet của bạn với các nút mesh gần đó để tin nhắn geohash của họ đến được mạng" + } } } }, @@ -26024,6 +37108,150 @@ "state" : "translated", "value" : "internet gateway" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بوابة الإنترنت" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ইন্টারনেট গেটওয়ে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "internet-gateway" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "puerta de enlace a internet" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "passerelle internet" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שער אינטרנט" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इंटरनेट गेटवे" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gateway internet" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gateway internet" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "インターネットゲートウェイ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "인터넷 게이트웨이" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gateway internet" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इन्टरनेट गेटवे" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "internetgateway" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "brama internetowa" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gateway de internet" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "интернет-шлюз" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "internetgateway" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இணைய நுழைவாயில்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เกตเวย์อินเทอร์เน็ต" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "internet ağ geçidi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "інтернет-шлюз" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "انٹرنیٹ گیٹ وے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cổng internet" + } } } }, @@ -31995,6 +43223,150 @@ "state" : "translated", "value" : "cancel sending" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "إلغاء الإرسال" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "পাঠানো বাতিল করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "senden abbrechen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "cancelar envío" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "annuler l'envoi" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ביטול שליחה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "भेजना रद्द करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "batalkan pengiriman" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "annulla invio" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "送信をキャンセル" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "전송 취소" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "batalkan penghantaran" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पठाउने रद्द गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verzenden annuleren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anuluj wysyłanie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cancelar envio" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "отменить отправку" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "avbryt sändning" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "அனுப்புவதை ரத்து செய்யவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ยกเลิกการส่ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "göndermeyi iptal et" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "скасувати надсилання" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بھیجنا منسوخ کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hủy gửi" + } } } }, @@ -32007,6 +43379,150 @@ "state" : "translated", "value" : "hidden image" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "صورة مخفية" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "লুকানো ছবি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verstecktes bild" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "imagen oculta" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "image masquée" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "תמונה מוסתרת" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "छिपा हुआ चित्र" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gambar tersembunyi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "immagine nascosta" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "非表示の画像" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "숨겨진 이미지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imej tersembunyi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "लुकाइएको तस्बिर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verborgen afbeelding" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ukryty obraz" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imagem oculta" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "скрытое изображение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dold bild" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "மறைக்கப்பட்ட படம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "รูปภาพที่ซ่อนอยู่" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gizli görsel" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "приховане зображення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "چھپی ہوئی تصویر" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hình ảnh ẩn" + } } } }, @@ -32019,6 +43535,150 @@ "state" : "translated", "value" : "opens the image full screen" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يفتح الصورة بملء الشاشة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবিটি পূর্ণ স্ক্রিনে খোলে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öffnet das bild im vollbild" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "abre la imagen a pantalla completa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ouvre l'image en plein écran" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "פותח את התמונה במסך מלא" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चित्र को पूरी स्क्रीन पर खोलता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka gambar layar penuh" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "apre l'immagine a schermo intero" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "画像を全画面で開きます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이미지를 전체 화면으로 엽니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka imej skrin penuh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर पूरा स्क्रिनमा खोल्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "opent de afbeelding op volledig scherm" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "otwiera obraz na pełnym ekranie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abre a imagem em ecrã inteiro" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "открывает изображение на весь экран" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öppnar bilden i helskärm" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படத்தை முழுத் திரையில் திறக்கும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เปิดรูปภาพแบบเต็มหน้าจอ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "görseli tam ekran açar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "відкриває зображення на весь екран" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر کو پوری اسکرین پر کھولتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mở hình ảnh toàn màn hình" + } } } }, @@ -32031,6 +43691,150 @@ "state" : "translated", "value" : "reveals the image" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يكشف الصورة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবিটি প্রকাশ করে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zeigt das bild" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "revela la imagen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "révèle l'image" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "חושף את התמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चित्र दिखाता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "menampilkan gambar" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "rivela l'immagine" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "画像を表示します" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이미지를 표시합니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "menunjukkan imej" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर देखाउँछ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toont de afbeelding" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "odsłania obraz" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "revela a imagem" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "показывает изображение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "visar bilden" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படத்தை வெளிப்படுத்தும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แสดงรูปภาพ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "görseli gösterir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "показує зображення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر ظاہر کرتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hiện hình ảnh" + } } } }, @@ -32043,6 +43847,150 @@ "state" : "translated", "value" : "image" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "صورة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "imagen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "image" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "תמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चित्र" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gambar" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "immagine" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "画像" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이미지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imej" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "afbeelding" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "obraz" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imagem" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "изображение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "รูปภาพ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "görsel" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "зображення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hình ảnh" + } } } }, @@ -32055,6 +44003,150 @@ "state" : "translated", "value" : "sending image" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "جارٍ إرسال الصورة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবি পাঠানো হচ্ছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild wird gesendet" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "enviando imagen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "envoi de l'image" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שולח תמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चित्र भेजा जा रहा है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mengirim gambar" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "invio immagine" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "画像を送信中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이미지 전송 중" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "menghantar imej" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर पठाइँदै" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "afbeelding verzenden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wysyłanie obrazu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "a enviar imagem" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "отправка изображения" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "skickar bild" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படத்தை அனுப்புகிறது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "กำลังส่งรูปภาพ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "görsel gönderiliyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "надсилання зображення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر بھیجی جا رہی ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đang gửi hình ảnh" + } } } }, @@ -32067,6 +44159,150 @@ "state" : "translated", "value" : "delete image" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "حذف الصورة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবি মুছুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild löschen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "eliminar imagen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "supprimer l'image" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מחק תמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चित्र हटाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hapus gambar" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "elimina immagine" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "画像を削除" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이미지 삭제" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "padam imej" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर मेटाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "afbeelding verwijderen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "usuń obraz" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "eliminar imagem" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "удалить изображение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ta bort bild" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படத்தை நீக்கு" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ลบรูปภาพ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "görseli sil" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "видалити зображення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر حذف کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "xóa hình ảnh" + } } } }, @@ -32079,6 +44315,150 @@ "state" : "translated", "value" : "hide image" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "إخفاء الصورة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবি লুকান" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild verbergen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "ocultar imagen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "masquer l'image" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הסתר תמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चित्र छिपाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sembunyikan gambar" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nascondi immagine" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "画像を非表示" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이미지 숨기기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sembunyikan imej" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर लुकाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "afbeelding verbergen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ukryj obraz" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ocultar imagem" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "скрыть изображение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dölj bild" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படத்தை மறை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ซ่อนรูปภาพ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "görseli gizle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "приховати зображення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر چھپائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ẩn hình ảnh" + } } } }, @@ -32091,6 +44471,150 @@ "state" : "translated", "value" : "open image" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "فتح الصورة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবি খুলুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild öffnen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "abrir imagen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ouvrir l'image" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "פתח תמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चित्र खोलें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "buka gambar" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "apri immagine" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "画像を開く" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이미지 열기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "buka imej" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर खोल" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "afbeelding openen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "otwórz obraz" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abrir imagem" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "открыть изображение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öppna bild" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படத்தைத் திற" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เปิดรูปภาพ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "görseli aç" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "відкрити зображення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر کھولیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mở hình ảnh" + } } } }, @@ -32103,6 +44627,150 @@ "state" : "translated", "value" : "reveal image" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "كشف الصورة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবি প্রকাশ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild anzeigen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "revelar imagen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "révéler l'image" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "חשוף תמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चित्र दिखाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tampilkan gambar" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "rivela immagine" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "画像を表示" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이미지 표시" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tunjukkan imej" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर देखाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "afbeelding tonen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "odsłoń obraz" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "revelar imagem" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "показать изображение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "visa bild" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படத்தை வெளிப்படுத்து" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แสดงรูปภาพ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "görseli göster" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "показати зображення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر ظاہر کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hiện hình ảnh" + } } } }, @@ -32115,6 +44783,150 @@ "state" : "translated", "value" : "this cannot be undone — the sender may not be in range to send it again." } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "لا يمكن التراجع عن هذا — قد لا يكون المرسِل في النطاق لإرسالها مرة أخرى." + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এটি ফেরানো যাবে না — প্রেরক আবার পাঠানোর মতো পরিসরে নাও থাকতে পারেন।" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "das kann nicht rückgängig gemacht werden — der absender ist möglicherweise nicht in reichweite, um es erneut zu senden." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "esto no se puede deshacer — puede que el remitente no esté a tu alcance para enviarla de nuevo." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cette action est irréversible — l'expéditeur n'est peut-être pas à portée pour la renvoyer." + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אי אפשר לבטל את זה — ייתכן שהשולח לא בטווח כדי לשלוח אותה שוב." + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "इसे पूर्ववत नहीं किया जा सकता — भेजने वाला शायद इसे दोबारा भेजने की रेंज में न हो।" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ini tidak bisa dibatalkan — pengirim mungkin tidak dalam jangkauan untuk mengirimnya lagi." + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "questa azione non può essere annullata — il mittente potrebbe non essere a portata per inviarla di nuovo." + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "この操作は取り消せません — 送信者が圏内におらず、再送信できない場合があります。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이 작업은 취소할 수 없습니다 — 보낸 사람이 범위 내에 없어 다시 보내지 못할 수 있습니다." + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ini tidak boleh dibatalkan — penghantar mungkin tiada dalam jangkauan untuk menghantarnya semula." + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "यो फिर्ता गर्न सकिँदैन — पठाउने फेरि पठाउन दायरामा नहुन सक्छ।" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dit kan niet ongedaan worden gemaakt — de afzender is mogelijk niet in bereik om het opnieuw te sturen." + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tej operacji nie można cofnąć — nadawca może być poza zasięgiem, aby wysłać go ponownie." + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "isto não pode ser anulado — o remetente pode não estar ao alcance para a enviar de novo." + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "это нельзя отменить — отправитель может быть вне зоны, чтобы отправить снова." + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "detta kan inte ångras — avsändaren kanske inte är inom räckhåll för att skicka den igen." + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இதை மீட்டெடுக்க முடியாது — அனுப்பியவர் மீண்டும் அனுப்பும் வரம்பில் இல்லாமல் இருக்கலாம்." + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "การกระทำนี้ไม่สามารถยกเลิกได้ — ผู้ส่งอาจไม่อยู่ในระยะที่จะส่งอีกครั้ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bu geri alınamaz — gönderen tekrar göndermek için menzilde olmayabilir." + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "це не можна скасувати — відправник може бути поза радіусом, щоб надіслати його знову." + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اسے واپس نہیں کیا جا سکتا — ممکن ہے بھیجنے والا اسے دوبارہ بھیجنے کیلئے رینج میں نہ ہو۔" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không thể hoàn tác — người gửi có thể không trong phạm vi để gửi lại." + } } } }, @@ -32127,6 +44939,150 @@ "state" : "translated", "value" : "delete this image?" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "حذف هذه الصورة؟" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এই ছবি মুছবেন?" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dieses bild löschen?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿eliminar esta imagen?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "supprimer cette image ?" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "למחוק את התמונה הזו?" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "यह चित्र हटाएँ?" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hapus gambar ini?" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "eliminare questa immagine?" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "この画像を削除しますか?" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이 이미지를 삭제할까요?" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "padam imej ini?" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "यो तस्बिर मेटाउने?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "deze afbeelding verwijderen?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "usunąć ten obraz?" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "eliminar esta imagem?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "удалить это изображение?" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ta bort den här bilden?" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இந்தப் படத்தை நீக்கவா?" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ลบรูปภาพนี้หรือไม่?" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bu görsel silinsin mi?" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "видалити це зображення?" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "یہ تصویر حذف کریں؟" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "xóa hình ảnh này?" + } } } }, @@ -32139,6 +45095,150 @@ "state" : "translated", "value" : "tap to reveal" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "اضغط للكشف" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "প্রকাশ করতে ট্যাপ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zum anzeigen tippen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "toca para revelar" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "touche pour révéler" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הקש לחשיפה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "दिखाने के लिए टैप करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ketuk untuk menampilkan" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tocca per rivelare" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "タップして表示" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "탭하여 표시" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ketuk untuk menunjukkan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "देखाउन ट्याप गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tik om te tonen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "stuknij, aby odsłonić" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toca para revelar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "нажми, чтобы показать" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tryck för att visa" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "வெளிப்படுத்த தட்டவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แตะเพื่อแสดง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "göstermek için dokunun" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "торкнися, щоб показати" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ظاہر کرنے کیلئے ٹیپ کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chạm để hiện" + } } } }, @@ -32151,6 +45251,150 @@ "state" : "translated", "value" : "pause voice note" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "إيقاف الملاحظة الصوتية مؤقتًا" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ভয়েস নোট থামান" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sprachnachricht pausieren" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "pausar nota de voz" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mettre la note vocale en pause" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "השהיית הערה קולית" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वॉइस नोट रोकें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "jeda catatan suara" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "metti in pausa la nota vocale" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ボイスメモを一時停止" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "음성 메모 일시정지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "jeda nota suara" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "भ्वाइस नोट रोक" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "spraakbericht pauzeren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wstrzymaj notatkę głosową" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "colocar a nota de voz em pausa" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "приостановить голосовое сообщение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pausa röstmeddelande" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குரல் குறிப்பை இடைநிறுத்தவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "หยุดข้อความเสียงชั่วคราว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesli notu duraklat" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "призупинити голосову нотатку" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "وائس نوٹ روکیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tạm dừng ghi chú giọng nói" + } } } }, @@ -32163,6 +45407,150 @@ "state" : "translated", "value" : "play voice note" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تشغيل الملاحظة الصوتية" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ভয়েস নোট চালান" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sprachnachricht abspielen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "reproducir nota de voz" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lire la note vocale" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "השמעת הערה קולית" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वॉइस नोट चलाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "putar catatan suara" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "riproduci la nota vocale" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ボイスメモを再生" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "음성 메모 재생" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mainkan nota suara" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "भ्वाइस नोट बजाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "spraakbericht afspelen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "odtwórz notatkę głosową" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "reproduzir a nota de voz" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "воспроизвести голосовое сообщение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "spela upp röstmeddelande" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குரல் குறிப்பை இயக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เล่นข้อความเสียง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesli notu oynat" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "відтворити голосову нотатку" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "وائس نوٹ چلائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "phát ghi chú giọng nói" + } } } }, @@ -32175,6 +45563,150 @@ "state" : "translated", "value" : "opens a private chat" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يفتح دردشة خاصة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "একটি ব্যক্তিগত চ্যাট খোলে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öffnet einen privaten chat" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "abre un chat privado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ouvre une discussion privée" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "פותח צ'אט פרטי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी चैट खोलता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka obrolan pribadi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "apre una chat privata" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "プライベートチャットを開きます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "비공개 채팅을 엽니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka sembang peribadi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी च्याट खोल्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "opent een privéchat" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "otwiera czat prywatny" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abre uma conversa privada" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "открывает личный чат" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öppnar en privat chatt" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "தனிப்பட்ட உரையாடலைத் திறக்கும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เปิดแชทส่วนตัว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "özel bir sohbet açar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "відкриває приватний чат" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نجی چیٹ کھولتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mở cuộc trò chuyện riêng tư" + } } } }, @@ -32187,6 +45719,150 @@ "state" : "translated", "value" : "show fingerprint" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "عرض البصمة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ফিঙ্গারপ্রিন্ট দেখান" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fingerabdruck anzeigen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mostrar huella" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "afficher l'empreinte" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הצג טביעת אצבע" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "फ़िंगरप्रिंट दिखाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tampilkan sidik" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mostra impronta" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "フィンガープリントを表示" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "지문 표시" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tunjukkan sidik" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "फिंगरप्रिन्ट देखाऊ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "vingerafdruk tonen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pokaż odcisk" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mostrar impressão digital" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "показать отпечаток" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "visa fingeravtryck" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "கைரேகையைக் காட்டு" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แสดงลายนิ้วมือ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "parmak izini göster" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "показати відбиток" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "فنگرپرنٹ دکھائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hiện vân tay" + } } } }, @@ -32199,6 +45875,150 @@ "state" : "translated", "value" : "blocked" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "محظور" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ব্লক করা" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "blockiert" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "bloqueado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bloqué" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "חסום" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ब्लॉक किया गया" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "diblokir" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bloccato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ブロック中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "차단됨" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "diblokir" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ब्लक" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "geblokkeerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zablokowany" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bloqueado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "заблокирован" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "blockerad" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "தடுக்கப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ถูกบล็อก" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "engellendi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "заблоковано" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بلاک شدہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã chặn" + } } } }, @@ -32211,6 +46031,150 @@ "state" : "translated", "value" : "favorite" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "مفضّل" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "প্রিয়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorit" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorito" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favori" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מועדף" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पसंदीदा" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorit" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "preferito" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "お気に入り" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "즐겨찾기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorit" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "मनपर्ने" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favoriet" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ulubiony" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorito" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "избранное" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorit" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "சிறப்பு" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "คนโปรด" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favori" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "улюблений" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پسندیدہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "yêu thích" + } } } }, @@ -32223,6 +46187,150 @@ "state" : "translated", "value" : "offline" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "غير متصل" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "অফলাইন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "sin conexión" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hors ligne" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא מקוון" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ऑफ़लाइन" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "オフライン" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "오프라인" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "अफलाइन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "офлайн" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ஆஃப்லைன்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ออฟไลน์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "çevrimdışı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "офлайн" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آف لائن" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ngoại tuyến" + } } } }, @@ -32235,6 +46343,150 @@ "state" : "translated", "value" : "new messages" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "رسائل جديدة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "নতুন বার্তা" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "neue nachrichten" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensajes nuevos" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nouveaux messages" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הודעות חדשות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "नए संदेश" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan baru" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nuovi messaggi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "新着メッセージ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "새 메시지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan baru" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "नयाँ सन्देश" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nieuwe berichten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nowe wiadomości" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "novas mensagens" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "новые сообщения" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nya meddelanden" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "புதிய செய்திகள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ข้อความใหม่" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "yeni mesajlar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "нові повідомлення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نئے پیغامات" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tin nhắn mới" + } } } }, @@ -32247,6 +46499,150 @@ "state" : "translated", "value" : "vouched" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "موثوق" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "সমর্থিত" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verbürgt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "avalado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "attesté" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "בערבות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "अनुशंसित" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dijamin" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "garantito" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "保証済み" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "보증됨" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dijamin" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "जमानत" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ingestaan" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "poręczony" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "atestado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "поручились" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "intygad" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "உத்தரவாதம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "รับรองแล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kefil olundu" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "засвідчено" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ضمانت شدہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã bảo chứng" + } } } }, @@ -32438,6 +46834,150 @@ "state" : "translated", "value" : "vouched for by someone you verified" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "موثوق من قِبل شخص تحقّقت منه" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনি যাচাই করেছেন এমন কারো দ্বারা সমর্থিত" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verbürgt von jemandem, den du verifiziert hast" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "avalado por alguien que verificaste" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "attesté par une personne que tu as vérifiée" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מישהו שאימתת ערב לו" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आपके किसी सत्यापित व्यक्ति द्वारा अनुशंसित" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dijamin oleh seseorang yang kamu verifikasi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "garantito da qualcuno che hai verificato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "あなたが確認した人が保証しています" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "당신이 확인한 사람이 보증함" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dijamin oleh seseorang yang anda sahkan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिमीले प्रमाणित गरेका कसैले जमानत गरेको" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ingestaan door iemand die je hebt geverifieerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "poręczony przez kogoś, kogo zweryfikowałeś" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "atestado por alguém que verificaste" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "за него поручился тот, кого ты проверил" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "intygad av någon du verifierat" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "நீங்கள் சரிபார்த்த ஒருவரால் உத்தரவாதம் அளிக்கப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "รับรองโดยคนที่คุณยืนยันแล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "doğruladığın biri tarafından kefil olundu" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "засвідчено кимось, кого ти підтвердив" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "کسی ایسے شخص کی ضمانت جس کی آپ نے توثیق کی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "được bảo chứng bởi người bạn đã xác minh" + } } } }, @@ -33882,6 +48422,150 @@ "state" : "translated", "value" : "sent via mesh gateway" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "أُرسل عبر بوابة mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "মেশ গেটওয়ের মাধ্যমে পাঠানো হয়েছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "über mesh-gateway gesendet" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "enviado por la puerta de enlace del mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "envoyé via la passerelle mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "נשלח דרך שער mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "मेश गेटवे के ज़रिए भेजा गया" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dikirim via gateway mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inviato tramite gateway mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "meshゲートウェイ経由で送信" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh 게이트웨이를 통해 전송됨" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dihantar via gateway mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh गेटवे मार्फत पठाइयो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verzonden via mesh-gateway" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wysłano przez bramę mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enviado através do gateway mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "отправлено через mesh-шлюз" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "skickat via mesh-gateway" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh நுழைவாயில் வழியாக அனுப்பப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งผ่านเกตเวย์ mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh ağ geçidi üzerinden gönderildi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "надіслано через шлюз mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh گیٹ وے کے ذریعے بھیجا گیا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã gửi qua cổng mesh" + } } } }, @@ -34251,6 +48935,150 @@ "state" : "translated", "value" : "%@ is already a member" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ عضو بالفعل" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ ইতিমধ্যে একজন সদস্য" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ ist bereits mitglied" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ ya es miembro" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ est déjà membre" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ כבר חבר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ पहले से ही सदस्य है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ sudah menjadi anggota" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ è già un membro" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ はすでにメンバーです" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 님은 이미 멤버입니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ sudah menjadi ahli" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ पहिले नै सदस्य हो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ is al lid" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ jest już członkiem" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ já é membro" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ уже участник" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ är redan medlem" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ ஏற்கனவே ஒரு உறுப்பினர்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ เป็นสมาชิกอยู่แล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ zaten üye" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ уже учасник" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ پہلے ہی رکن ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ đã là thành viên" + } } } }, @@ -34262,6 +49090,150 @@ "state" : "translated", "value" : "the creator cannot be removed" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "لا يمكن إزالة المُنشئ" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "নির্মাতাকে সরানো যায় না" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "der ersteller kann nicht entfernt werden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no se puede eliminar al creador" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "le créateur ne peut pas être retiré" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אי אפשר להסיר את היוצר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निर्माता को हटाया नहीं जा सकता" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pembuat tidak bisa dihapus" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "il creatore non può essere rimosso" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "作成者は削除できません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "생성자는 제거할 수 없습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pencipta tidak boleh dibuang" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "सिर्जनाकर्तालाई हटाउन सकिँदैन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "de maker kan niet worden verwijderd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie można usunąć twórcy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "o criador não pode ser removido" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "создателя нельзя удалить" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "skaparen kan inte tas bort" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "உருவாக்கியவரை நீக்க முடியாது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่สามารถลบผู้สร้างได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "oluşturan kişi kaldırılamaz" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "створювача не можна видалити" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بنانے والے کو ہٹایا نہیں جا سکتا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không thể xóa người tạo" + } } } }, @@ -34273,6 +49245,150 @@ "state" : "translated", "value" : "could not create the group" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تعذّر إنشاء المجموعة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "গ্রুপ তৈরি করা যায়নি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "die gruppe konnte nicht erstellt werden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no se pudo crear el grupo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossible de créer le groupe" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא ניתן ליצור את הקבוצה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह नहीं बनाया जा सका" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak bisa membuat grup" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossibile creare il gruppo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループを作成できませんでした" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹을 생성할 수 없습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak dapat mencipta kumpulan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह सिर्जना गर्न सकिएन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kon de groep niet aanmaken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie udało się utworzyć grupy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível criar o grupo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не удалось создать группу" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kunde inte skapa gruppen" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குழுவை உருவாக்க முடியவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่สามารถสร้างกลุ่มได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grup oluşturulamadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не вдалося створити групу" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گروپ نہیں بنایا جا سکا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không thể tạo nhóm" + } } } }, @@ -34284,6 +49400,150 @@ "state" : "translated", "value" : "created group '%@' — use /group invite @name to add people" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "أُنشئت المجموعة '%@' — استخدم /group invite @name لإضافة أشخاص" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' গ্রুপ তৈরি হয়েছে — মানুষ যোগ করতে /group invite @name ব্যবহার করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppe '%@' erstellt — nutze /group invite @name, um leute hinzuzufügen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "grupo '%@' creado — usa /group invite @name para añadir personas" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "groupe '%@' créé — utilise /group invite @name pour ajouter des personnes" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "נוצרה הקבוצה '%@' — השתמש ב-/group invite @name כדי להוסיף אנשים" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह '%@' बनाया गया — लोगों को जोड़ने के लिए /group invite @name का उपयोग करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grup '%@' dibuat — gunakan /group invite @name untuk menambah orang" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppo '%@' creato — usa /group invite @name per aggiungere persone" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループ '%@' を作成しました — /group invite @name で人を追加できます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹 '%@' 을(를) 생성했습니다 — /group invite @name 으로 사람을 추가하세요" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kumpulan '%@' dicipta — guna /group invite @name untuk menambah orang" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह '%@' सिर्जना भयो — मानिस थप्न /group invite @name प्रयोग गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "groep '%@' aangemaakt — gebruik /group invite @name om mensen toe te voegen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "utworzono grupę '%@' — użyj /group invite @name, aby dodać osoby" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupo '%@' criado — usa /group invite @name para adicionar pessoas" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "создана группа «%@» — используй /group invite @name, чтобы добавить людей" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "skapade grupp '%@' — använd /group invite @name för att lägga till personer" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' குழு உருவாக்கப்பட்டது — நபர்களைச் சேர்க்க /group invite @name ஐப் பயன்படுத்தவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "สร้างกลุ่ม '%@' แล้ว — ใช้ /group invite @name เพื่อเพิ่มคน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' grubu oluşturuldu — kişi eklemek için /group invite @name kullanın" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "створено групу '%@' — використай /group invite @name, щоб додати людей" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گروپ '%@' بنایا گیا — لوگوں کو شامل کرنے کیلئے /group invite @name استعمال کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã tạo nhóm '%@' — dùng /group invite @name để thêm người" + } } } }, @@ -34295,6 +49555,150 @@ "state" : "translated", "value" : "only the group creator can do that" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "منشئ المجموعة فقط يمكنه فعل ذلك" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "শুধু গ্রুপের নির্মাতা এটি করতে পারেন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nur der gruppenersteller kann das tun" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "solo el creador del grupo puede hacer eso" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "seul le créateur du groupe peut faire cela" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "רק יוצר הקבוצה יכול לעשות זאת" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "केवल समूह निर्माता ही ऐसा कर सकता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hanya pembuat grup yang bisa melakukan itu" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "solo il creatore del gruppo può farlo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループの作成者のみが実行できます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹 생성자만 할 수 있습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hanya pencipta kumpulan boleh berbuat demikian" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह सिर्जनाकर्ताले मात्र त्यो गर्न सक्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "alleen de maker van de groep kan dat doen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tylko twórca grupy może to zrobić" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "só o criador do grupo pode fazer isso" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "это может сделать только создатель группы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "endast gruppens skapare kan göra det" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குழுவை உருவாக்கியவர் மட்டுமே அதைச் செய்ய முடியும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เฉพาะผู้สร้างกลุ่มเท่านั้นที่ทำได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bunu yalnızca grubu oluşturan yapabilir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "це може лише створювач групи" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "صرف گروپ بنانے والا یہ کر سکتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chỉ người tạo nhóm mới có thể làm điều đó" + } } } }, @@ -34306,6 +49710,150 @@ "state" : "translated", "value" : "group is full (max %@ members)" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "المجموعة ممتلئة (الحد الأقصى %@ عضو)" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "গ্রুপ পূর্ণ (সর্বোচ্চ %@ সদস্য)" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppe ist voll (max. %@ mitglieder)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "el grupo está lleno (máx. %@ miembros)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "le groupe est plein (max %@ membres)" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הקבוצה מלאה (מקסימום %@ חברים)" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह भरा हुआ है (अधिकतम %@ सदस्य)" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grup penuh (maks %@ anggota)" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "il gruppo è pieno (max %@ membri)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループが満員です(最大 %@ 人)" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹이 가득 찼습니다 (최대 %@명)" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kumpulan penuh (maks %@ ahli)" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह भरिएको छ (बढीमा %@ सदस्य)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "groep is vol (max %@ leden)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupa jest pełna (maks. %@ członków)" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "o grupo está cheio (máx. %@ membros)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "группа заполнена (макс. %@ участников)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppen är full (max %@ medlemmar)" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குழு நிரம்பிவிட்டது (அதிகபட்சம் %@ உறுப்பினர்கள்)" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "กลุ่มเต็มแล้ว (สูงสุด %@ คน)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grup dolu (en fazla %@ üye)" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "група заповнена (макс. %@ учасників)" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گروپ بھر گیا ہے (زیادہ سے زیادہ %@ اراکین)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhóm đã đầy (tối đa %@ thành viên)" + } } } }, @@ -34317,6 +49865,150 @@ "state" : "translated", "value" : "your identity keys are not ready yet" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "مفاتيح هويتك ليست جاهزة بعد" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনার পরিচয় কী এখনো প্রস্তুত নয়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "deine identitätsschlüssel sind noch nicht bereit" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "tus claves de identidad aún no están listas" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tes clés d'identité ne sont pas encore prêtes" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מפתחות הזהות שלך עדיין לא מוכנים" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आपकी पहचान कुंजियाँ अभी तैयार नहीं हैं" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kunci identitasmu belum siap" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "le tue chiavi di identità non sono ancora pronte" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "身元確認用のキーがまだ準備できていません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "신원 키가 아직 준비되지 않았습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kunci identitimu belum sedia" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिम्रा पहिचान कुञ्जीहरू अझै तयार छैनन्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "je identiteitssleutels zijn nog niet klaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "twoje klucze tożsamości nie są jeszcze gotowe" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "as tuas chaves de identidade ainda não estão prontas" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "твои ключи личности ещё не готовы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dina identitetsnycklar är inte redo än" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "உங்கள் அடையாள விசைகள் இன்னும் தயாராகவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "คีย์ยืนยันตัวตนของคุณยังไม่พร้อม" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kimlik anahtarların henüz hazır değil" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "твої ключі особи ще не готові" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آپ کی شناختی کلیدیں ابھی تیار نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "khóa danh tính của bạn chưa sẵn sàng" + } } } }, @@ -34328,6 +50020,150 @@ "state" : "translated", "value" : "could not build the group invite" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تعذّر إنشاء دعوة المجموعة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "গ্রুপ আমন্ত্রণ তৈরি করা যায়নি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "die gruppeneinladung konnte nicht erstellt werden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no se pudo generar la invitación al grupo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossible de créer l'invitation au groupe" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא ניתן לבנות את הזמנת הקבוצה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह आमंत्रण नहीं बनाया जा सका" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak bisa membuat undangan grup" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossibile creare l'invito al gruppo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループ招待を作成できませんでした" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹 초대를 만들 수 없습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak dapat membina jemputan kumpulan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह निमन्त्रणा बनाउन सकिएन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kon de groepsuitnodiging niet aanmaken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie udało się utworzyć zaproszenia do grupy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível criar o convite do grupo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не удалось создать приглашение в группу" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kunde inte skapa gruppinbjudan" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குழு அழைப்பை உருவாக்க முடியவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่สามารถสร้างคำเชิญกลุ่มได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grup daveti oluşturulamadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не вдалося створити запрошення до групи" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گروپ کی دعوت نہیں بنائی جا سکی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không thể tạo lời mời nhóm" + } } } }, @@ -34339,6 +50175,150 @@ "state" : "translated", "value" : "invited %1$@ to '%2$@'" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تمت دعوة %1$@ إلى '%2$@'" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@-কে '%2$@'-এ আমন্ত্রণ জানানো হয়েছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ zu '%2$@' eingeladen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "invitaste a %1$@ a '%2$@'" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ invité(e) dans '%2$@'" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ הוזמן ל-'%2$@'" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ को '%2$@' में आमंत्रित किया" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mengundang %1$@ ke '%2$@'" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ invitato in '%2$@'" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ を '%2$@' に招待しました" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ 님을 '%2$@' 에 초대했습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "menjemput %1$@ ke '%2$@'" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ लाई '%2$@' मा निमन्त्रणा गरियो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ uitgenodigd voor '%2$@'" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zaproszono %1$@ do '%2$@'" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ convidado para '%2$@'" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ приглашён в «%2$@»" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bjöd in %1$@ till '%2$@'" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ ஐ '%2$@' க்கு அழைத்தது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เชิญ %1$@ เข้า '%2$@' แล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ '%2$@' grubuna davet edildi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "запрошено %1$@ до '%2$@'" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ کو '%2$@' میں مدعو کیا گیا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã mời %1$@ vào '%2$@'" + } } } }, @@ -34350,6 +50330,150 @@ "state" : "translated", "value" : "you were added to group '%1$@' by %2$@ — it now appears in your people list" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "أضافك %2$@ إلى المجموعة '%1$@' — تظهر الآن في قائمة الأشخاص" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ আপনাকে '%1$@' গ্রুপে যুক্ত করেছেন — এটি এখন আপনার মানুষের তালিকায় দেখা যাবে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du wurdest von %2$@ zur gruppe '%1$@' hinzugefügt — sie erscheint jetzt in deiner personenliste" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%2$@ te añadió al grupo '%1$@' — ahora aparece en tu lista de personas" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tu as été ajouté(e) au groupe '%1$@' par %2$@ — il apparaît maintenant dans ta liste de personnes" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ הוסיף אותך לקבוצה '%1$@' — היא מופיעה כעת ברשימת האנשים שלך" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आपको %2$@ द्वारा समूह '%1$@' में जोड़ा गया — यह अब आपकी लोगों की सूची में दिखाई देता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kamu ditambahkan ke grup '%1$@' oleh %2$@ — kini muncul di daftar orangmu" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sei stato aggiunto al gruppo '%1$@' da %2$@ — ora appare nella tua lista di persone" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ によってグループ '%1$@' に追加されました — ピープルリストに表示されます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ 님이 그룹 '%1$@' 에 추가했습니다 — 이제 피플 목록에 표시됩니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anda ditambah ke kumpulan '%1$@' oleh %2$@ — kini ia muncul dalam senarai orangmu" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ ले तिमीलाई समूह '%1$@' मा थप्यो — अब यो तिम्रो मानिस सूचीमा देखिन्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "je bent door %2$@ toegevoegd aan groep '%1$@' — die verschijnt nu in je personenlijst" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ dodał cię do grupy '%1$@' — pojawia się teraz na liście osób" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "foste adicionado ao grupo '%1$@' por %2$@ — agora aparece na tua lista de pessoas" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ добавил тебя в группу «%1$@» — теперь она в твоём списке людей" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ lade till dig i gruppen '%1$@' — den visas nu i din personlista" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ உங்களை '%1$@' குழுவில் சேர்த்தார் — அது இப்போது உங்கள் நபர்கள் பட்டியலில் தோன்றுகிறது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ เพิ่มคุณเข้ากลุ่ม '%1$@' — ตอนนี้จะปรากฏในรายชื่อคนของคุณ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ seni '%1$@' grubuna ekledi — artık kişi listende görünüyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ додав тебе до групи '%1$@' — вона тепер у твоєму списку людей" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ نے آپ کو گروپ '%1$@' میں شامل کیا — یہ اب آپ کی لوگوں کی فہرست میں ظاہر ہوتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bạn đã được %2$@ thêm vào nhóm '%1$@' — nó giờ xuất hiện trong danh sách người của bạn" + } } } }, @@ -34361,6 +50485,150 @@ "state" : "translated", "value" : "left group '%@'" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "غادرت المجموعة '%@'" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' গ্রুপ ছেড়ে দিয়েছেন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppe '%@' verlassen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "saliste del grupo '%@'" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "groupe '%@' quitté" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "עזבת את הקבוצה '%@'" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह '%@' छोड़ दिया" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "keluar dari grup '%@'" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uscito dal gruppo '%@'" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループ '%@' から退出しました" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹 '%@' 에서 나갔습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "keluar dari kumpulan '%@'" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह '%@' छोडियो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "groep '%@' verlaten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "opuszczono grupę '%@'" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "saíste do grupo '%@'" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ты покинул группу «%@»" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lämnade gruppen '%@'" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' குழுவிலிருந்து வெளியேறியது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ออกจากกลุ่ม '%@' แล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' grubundan ayrıldın" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "залишено групу '%@'" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گروپ '%@' چھوڑ دیا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã rời nhóm '%@'" + } } } }, @@ -34372,6 +50640,150 @@ "state" : "translated", "value" : "your groups:" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "مجموعاتك:" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনার গ্রুপসমূহ:" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "deine gruppen:" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "tus grupos:" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tes groupes :" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הקבוצות שלך:" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आपके समूह:" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupmu:" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i tuoi gruppi:" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "あなたのグループ:" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "내 그룹:" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kumpulanmu:" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिम्रा समूहहरू:" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "je groepen:" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "twoje grupy:" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "os teus grupos:" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "твои группы:" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dina grupper:" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "உங்கள் குழுக்கள்:" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "กลุ่มของคุณ:" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupların:" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "твої групи:" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آپ کے گروپس:" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhóm của bạn:" + } } } }, @@ -34383,6 +50795,150 @@ "state" : "translated", "value" : "'%@' is not a member of this group" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' ليس عضوًا في هذه المجموعة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' এই গ্রুপের সদস্য নন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' ist kein mitglied dieser gruppe" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' no es miembro de este grupo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' n'est pas membre de ce groupe" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' אינו חבר בקבוצה הזו" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' इस समूह का सदस्य नहीं है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' bukan anggota grup ini" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' non è un membro di questo gruppo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' はこのグループのメンバーではありません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' 님은 이 그룹의 멤버가 아닙니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' bukan ahli kumpulan ini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' यो समूहको सदस्य होइन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' is geen lid van deze groep" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' nie jest członkiem tej grupy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' não é membro deste grupo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "«%@» не является участником этой группы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' är inte medlem i den här gruppen" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' இந்தக் குழுவின் உறுப்பினர் அல்ல" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' ไม่ใช่สมาชิกของกลุ่มนี้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' bu grubun üyesi değil" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' не учасник цієї групи" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' اس گروپ کا رکن نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' không phải là thành viên của nhóm này" + } } } }, @@ -34394,6 +50950,150 @@ "state" : "translated", "value" : "group names are limited to 40 characters" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "أسماء المجموعات محدودة بـ 40 حرفًا" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "গ্রুপের নাম ৪০ অক্ষরে সীমাবদ্ধ" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppennamen sind auf 40 zeichen begrenzt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "los nombres de grupo están limitados a 40 caracteres" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "les noms de groupe sont limités à 40 caractères" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שמות קבוצות מוגבלים ל-40 תווים" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह के नाम 40 अक्षरों तक सीमित हैं" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nama grup dibatasi 40 karakter" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i nomi dei gruppi sono limitati a 40 caratteri" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループ名は40文字までです" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹 이름은 40자로 제한됩니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nama kumpulan terhad kepada 40 aksara" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह नाम ४० अक्षरमा सीमित छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "groepsnamen zijn beperkt tot 40 tekens" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nazwy grup są ograniczone do 40 znaków" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "os nomes de grupo estão limitados a 40 caracteres" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "имена групп ограничены 40 символами" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gruppnamn är begränsade till 40 tecken" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குழுப் பெயர்கள் 40 எழுத்துகளுக்கு வரம்பிடப்பட்டுள்ளன" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ชื่อกลุ่มจำกัดไม่เกิน 40 ตัวอักษร" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grup adları en fazla 40 karakter olabilir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "назви груп обмежені 40 символами" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گروپ کے نام 40 حروف تک محدود ہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tên nhóm giới hạn 40 ký tự" + } } } }, @@ -34405,6 +51105,150 @@ "state" : "translated", "value" : "you are not in any groups — /group create to start one" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "لست في أي مجموعة — /group create لبدء واحدة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনি কোনো গ্রুপে নেই — একটি শুরু করতে /group create " + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du bist in keiner gruppe — /group create , um eine zu starten" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no estás en ningún grupo — /group create para crear uno" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tu n'es dans aucun groupe — /group create pour en démarrer un" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אתה לא באף קבוצה — /group create כדי להתחיל אחת" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आप किसी समूह में नहीं हैं — शुरू करने के लिए /group create " + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kamu tidak ada di grup mana pun — /group create untuk memulai" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "non sei in nessun gruppo — /group create per crearne uno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "どのグループにも参加していません — /group create で作成できます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "참여 중인 그룹이 없습니다 — /group create 으로 시작하세요" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anda tiada dalam mana-mana kumpulan — /group create untuk memulakan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिमी कुनै समूहमा छैनौ — सुरु गर्न /group create " + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "je zit in geen enkele groep — /group create om er een te starten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie należysz do żadnej grupy — /group create , aby utworzyć" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não estás em nenhum grupo — /group create para começar um" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ты не состоишь ни в одной группе — /group create , чтобы создать" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du är inte med i någon grupp — /group create för att skapa en" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "நீங்கள் எந்தக் குழுவிலும் இல்லை — ஒன்றைத் தொடங்க /group create " + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "คุณยังไม่ได้อยู่ในกลุ่มใด — /group create เพื่อเริ่มกลุ่ม" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hiçbir grupta değilsin — bir grup oluşturmak için /group create " + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ти не в жодній групі — /group create , щоб створити" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آپ کسی گروپ میں نہیں ہیں — ایک شروع کرنے کیلئے /group create " + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bạn không ở trong nhóm nào — /group create để tạo một nhóm" + } } } }, @@ -34416,6 +51260,150 @@ "state" : "translated", "value" : "open a group chat first" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "افتح دردشة جماعية أولاً" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "প্রথমে একটি গ্রুপ চ্যাট খুলুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öffne zuerst einen gruppenchat" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "abre primero un chat de grupo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ouvre d'abord une discussion de groupe" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "פתח קודם צ'אט קבוצתי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पहले कोई समूह चैट खोलें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "buka obrolan grup dulu" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "apri prima una chat di gruppo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "先にグループチャットを開いてください" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "먼저 그룹 채팅을 여세요" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "buka sembang kumpulan dahulu" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पहिले समूह च्याट खोल" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "open eerst een groepschat" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "najpierw otwórz czat grupowy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abre primeiro uma conversa de grupo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "сначала открой групповой чат" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "öppna en gruppchatt först" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "முதலில் ஒரு குழு உரையாடலைத் திறக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เปิดแชทกลุ่มก่อน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "önce bir grup sohbeti aç" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "спочатку відкрий груповий чат" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پہلے کوئی گروپ چیٹ کھولیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mở một cuộc trò chuyện nhóm trước" + } } } }, @@ -34427,6 +51415,150 @@ "state" : "translated", "value" : "cannot verify %@'s identity yet — wait for their announce" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "لا يمكن التحقق من هوية %@ بعد — انتظر إعلانه" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@-এর পরিচয় এখনো যাচাই করা যাচ্ছে না — তাদের অ্যানাউন্সের জন্য অপেক্ষা করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@s identität kann noch nicht verifiziert werden — warte auf deren announce" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "aún no se puede verificar la identidad de %@ — espera su anuncio" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossible de vérifier l'identité de %@ pour l'instant — attends son announce" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא ניתן לאמת את הזהות של %@ עדיין — המתן להכרזה שלו" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ की पहचान अभी सत्यापित नहीं की जा सकती — उनके अनाउंस की प्रतीक्षा करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "belum bisa memverifikasi identitas %@ — tunggu announce mereka" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossibile verificare ancora l'identità di %@ — attendi il suo announce" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ の身元をまだ確認できません — announceを待ってください" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 님의 신원을 아직 확인할 수 없습니다 — announce를 기다리세요" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "belum boleh mengesahkan identiti %@ — tunggu announce mereka" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ को पहिचान अझै प्रमाणित गर्न सकिँदैन — उनको घोषणा पर्ख" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kan de identiteit van %@ nog niet verifiëren — wacht op hun announce" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie można jeszcze zweryfikować tożsamości %@ — poczekaj na ich ogłoszenie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ainda não é possível verificar a identidade de %@ — aguarda o announce dele" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "пока нельзя проверить личность %@ — дождись его анонса" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kan inte verifiera %@:s identitet än — vänta på deras announce" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ இன் அடையாளத்தை இன்னும் சரிபார்க்க முடியவில்லை — அவர்களின் அறிவிப்புக்காகக் காத்திருக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ยังไม่สามารถยืนยันตัวตนของ %@ — รอ announce ของพวกเขา" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ kimliği henüz doğrulanamıyor — duyurusunu bekle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "поки не можна підтвердити особу %@ — почекай на їхнє оголошення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ کی شناخت ابھی تصدیق نہیں ہو سکتی — ان کے اعلان کا انتظار کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chưa thể xác minh danh tính của %@ — chờ announce của họ" + } } } }, @@ -34438,6 +51570,150 @@ "state" : "translated", "value" : "%@ must be connected over mesh to be invited" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يجب أن يكون %@ متصلاً عبر mesh لدعوته" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আমন্ত্রণ জানাতে %@-কে মেশে সংযুক্ত থাকতে হবে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ muss über mesh verbunden sein, um eingeladen zu werden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ debe estar conectado por mesh para ser invitado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ doit être connecté en mesh pour être invité" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ חייב להיות מחובר דרך mesh כדי להזמינו" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ को आमंत्रित करने के लिए मेश पर जुड़ा होना ज़रूरी है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ harus terhubung lewat mesh untuk diundang" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ deve essere connesso via mesh per essere invitato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ は招待するためにmeshで接続している必要があります" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 님을 초대하려면 mesh로 연결되어 있어야 합니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ mesti bersambung melalui mesh untuk dijemput" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निमन्त्रणा गर्न %@ mesh मार्फत जडान भएको हुनुपर्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ moet via mesh verbonden zijn om uitgenodigd te worden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ musi być połączony przez mesh, aby otrzymać zaproszenie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ tem de estar ligado por mesh para ser convidado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ должен быть подключён по mesh, чтобы получить приглашение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ måste vara ansluten via mesh för att bjudas in" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ அழைக்கப்படுவதற்கு mesh மூலம் இணைக்கப்பட்டிருக்க வேண்டும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ ต้องเชื่อมต่อผ่าน mesh จึงจะเชิญได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "davet edilebilmesi için %@ mesh üzerinden bağlı olmalı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ має бути з'єднаний через mesh, щоб отримати запрошення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "دعوت دینے کیلئے %@ کا mesh پر جڑا ہونا ضروری ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ phải được kết nối qua mesh để được mời" + } } } }, @@ -34449,6 +51725,150 @@ "state" : "translated", "value" : "'%@' not found" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' غير موجود" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' পাওয়া যায়নি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' nicht gefunden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' no encontrado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' introuvable" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' לא נמצא" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' नहीं मिला" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' tidak ditemukan" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' non trovato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' が見つかりません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' 을(를) 찾을 수 없습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' tidak dijumpai" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' भेटिएन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' niet gevonden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie znaleziono '%@'" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' não encontrado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "«%@» не найден" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' hittades inte" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' கண்டறியப்படவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่พบ '%@'" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' bulunamadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' не знайдено" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' نہیں ملا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không tìm thấy '%@'" + } } } }, @@ -34460,6 +51880,150 @@ "state" : "translated", "value" : "you were removed from group '%@'" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تمت إزالتك من المجموعة '%@'" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনাকে '%@' গ্রুপ থেকে সরানো হয়েছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du wurdest aus der gruppe '%@' entfernt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "fuiste eliminado del grupo '%@'" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tu as été retiré(e) du groupe '%@'" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הוסרת מהקבוצה '%@'" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आपको समूह '%@' से हटा दिया गया" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kamu dikeluarkan dari grup '%@'" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sei stato rimosso dal gruppo '%@'" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループ '%@' から削除されました" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹 '%@' 에서 제거되었습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anda dikeluarkan dari kumpulan '%@'" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिमीलाई समूह '%@' बाट हटाइयो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "je bent verwijderd uit groep '%@'" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "usunięto cię z grupy '%@'" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "foste removido do grupo '%@'" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "тебя удалили из группы «%@»" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du togs bort från gruppen '%@'" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' குழுவிலிருந்து நீங்கள் நீக்கப்பட்டீர்கள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "คุณถูกนำออกจากกลุ่ม '%@'" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' grubundan çıkarıldın" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "тебе видалено з групи '%@'" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آپ کو گروپ '%@' سے ہٹا دیا گیا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bạn đã bị xóa khỏi nhóm '%@'" + } } } }, @@ -34471,6 +52035,150 @@ "state" : "translated", "value" : "removed %@ and rotated the group key" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تمت إزالة %@ وتدوير مفتاح المجموعة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@-কে সরানো হয়েছে এবং গ্রুপ কী রোটেট করা হয়েছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ entfernt und den gruppenschlüssel rotiert" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "se eliminó a %@ y se rotó la clave del grupo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ retiré(e) et clé du groupe renouvelée" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ הוסר ומפתח הקבוצה סובב" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ को हटाया और समूह कुंजी घुमाई" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "menghapus %@ dan memutar ulang kunci grup" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ rimosso e chiave del gruppo ruotata" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ を削除しグループキーをローテーションしました" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 님을 제거하고 그룹 키를 교체했습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuang %@ dan memutar kunci kumpulan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ लाई हटाइयो र समूह कुञ्जी घुमाइयो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ verwijderd en de groepssleutel geroteerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "usunięto %@ i wymieniono klucz grupy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ removido e chave do grupo rodada" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ удалён, ключ группы обновлён" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tog bort %@ och roterade gruppnyckeln" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ ஐ நீக்கி குழு விசையைச் சுழற்றியது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "นำ %@ ออกและเปลี่ยนคีย์กลุ่มแล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ çıkarıldı ve grup anahtarı döndürüldü" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "видалено %@ і замінено ключ групи" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ کو ہٹا دیا اور گروپ کی کلید تبدیل کر دی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã xóa %@ và xoay khóa nhóm" + } } } }, @@ -34482,6 +52190,150 @@ "state" : "translated", "value" : "could not rotate the group key" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تعذّر تدوير مفتاح المجموعة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "গ্রুপ কী রোটেট করা যায়নি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "der gruppenschlüssel konnte nicht rotiert werden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no se pudo rotar la clave del grupo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossible de renouveler la clé du groupe" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא ניתן לסובב את מפתח הקבוצה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह कुंजी नहीं घुमाई जा सकी" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak bisa memutar ulang kunci grup" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossibile ruotare la chiave del gruppo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "グループキーをローテーションできませんでした" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "그룹 키를 교체할 수 없습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak dapat memutar kunci kumpulan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "समूह कुञ्जी घुमाउन सकिएन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kon de groepssleutel niet roteren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie udało się wymienić klucza grupy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível rodar a chave do grupo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не удалось обновить ключ группы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kunde inte rotera gruppnyckeln" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குழு விசையைச் சுழற்ற முடியவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่สามารถเปลี่ยนคีย์กลุ่มได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grup anahtarı döndürülemedi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не вдалося замінити ключ групи" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گروپ کی کلید تبدیل نہیں کی جا سکی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không thể xoay khóa nhóm" + } } } }, @@ -34493,6 +52345,150 @@ "state" : "translated", "value" : "could not encrypt the message" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تعذّر تشفير الرسالة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "বার্তা এনক্রিপ্ট করা যায়নি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "die nachricht konnte nicht verschlüsselt werden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no se pudo cifrar el mensaje" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossible de chiffrer le message" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא ניתן להצפין את ההודעה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "संदेश एन्क्रिप्ट नहीं किया जा सका" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak bisa mengenkripsi pesan" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossibile cifrare il messaggio" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "メッセージを暗号化できませんでした" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "메시지를 암호화할 수 없습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak dapat mengenkripsi pesan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "सन्देश सङ्केत गर्न सकिएन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kon het bericht niet versleutelen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie udało się zaszyfrować wiadomości" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível encriptar a mensagem" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не удалось зашифровать сообщение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kunde inte kryptera meddelandet" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "செய்தியைக் குறியாக்கம் செய்ய முடியவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่สามารถเข้ารหัสข้อความได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesaj şifrelenemedi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не вдалося зашифрувати повідомлення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پیغام کو خفیہ نہیں کیا جا سکا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không thể mã hóa tin nhắn" + } } } }, @@ -34504,6 +52500,150 @@ "state" : "translated", "value" : "you are no longer in this group" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "لم تعد في هذه المجموعة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনি আর এই গ্রুপে নেই" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du bist nicht mehr in dieser gruppe" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "ya no estás en este grupo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tu n'es plus dans ce groupe" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אתה כבר לא בקבוצה הזו" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "आप अब इस समूह में नहीं हैं" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kamu tidak lagi ada di grup ini" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "non sei più in questo gruppo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "このグループには参加していません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "더 이상 이 그룹에 속해 있지 않습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anda tidak lagi dalam kumpulan ini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तिमी अब यो समूहमा छैनौ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "je zit niet meer in deze groep" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie należysz już do tej grupy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "já não estás neste grupo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ты больше не в этой группе" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "du är inte längre med i den här gruppen" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "நீங்கள் இனி இந்தக் குழுவில் இல்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "คุณไม่ได้อยู่ในกลุ่มนี้แล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "artık bu grupta değilsin" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ти більше не в цій групі" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آپ اب اس گروپ میں نہیں ہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bạn không còn ở trong nhóm này" + } } } }, @@ -34515,6 +52655,150 @@ "state" : "translated", "value" : "usage: /group create " } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الاستخدام: /group create " + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ব্যবহার: /group create " + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verwendung: /group create " + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "uso: /group create " + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "utilisation : /group create " + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שימוש: /group create " + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "उपयोग: /group create " + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "penggunaan: /group create " + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uso: /group create " + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "使い方: /group create " + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "사용법: /group create " + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "penggunaan: /group create " + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "प्रयोग: /group create " + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gebruik: /group create " + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "użycie: /group create " + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "utilização: /group create " + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "использование: /group create " + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "användning: /group create " + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "பயன்பாடு: /group create " + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "วิธีใช้: /group create " + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kullanım: /group create " + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "використання: /group create " + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "استعمال: /group create " + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cách dùng: /group create " + } } } }, @@ -34526,6 +52810,150 @@ "state" : "translated", "value" : "usage: /group invite @name" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الاستخدام: /group invite @name" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ব্যবহার: /group invite @name" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verwendung: /group invite @name" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "uso: /group invite @name" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "utilisation : /group invite @name" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שימוש: /group invite @name" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "उपयोग: /group invite @name" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "penggunaan: /group invite @name" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uso: /group invite @name" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "使い方: /group invite @name" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "사용법: /group invite @name" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "penggunaan: /group invite @name" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "प्रयोग: /group invite @name" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gebruik: /group invite @name" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "użycie: /group invite @name" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "utilização: /group invite @name" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "использование: /group invite @name" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "användning: /group invite @name" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "பயன்பாடு: /group invite @name" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "วิธีใช้: /group invite @name" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kullanım: /group invite @name" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "використання: /group invite @name" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "استعمال: /group invite @name" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cách dùng: /group invite @name" + } } } }, @@ -34537,6 +52965,150 @@ "state" : "translated", "value" : "usage: /group remove @name" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الاستخدام: /group remove @name" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ব্যবহার: /group remove @name" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verwendung: /group remove @name" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "uso: /group remove @name" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "utilisation : /group remove @name" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שימוש: /group remove @name" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "उपयोग: /group remove @name" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "penggunaan: /group remove @name" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uso: /group remove @name" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "使い方: /group remove @name" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "사용법: /group remove @name" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "penggunaan: /group remove @name" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "प्रयोग: /group remove @name" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gebruik: /group remove @name" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "użycie: /group remove @name" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "utilização: /group remove @name" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "использование: /group remove @name" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "användning: /group remove @name" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "பயன்பாடு: /group remove @name" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "วิธีใช้: /group remove @name" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kullanım: /group remove @name" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "використання: /group remove @name" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "استعمال: /group remove @name" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cách dùng: /group remove @name" + } } } }, @@ -34907,6 +53479,150 @@ "state" : "translated", "value" : "cannot block %@: not found or unable to verify identity" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تعذّر حظر %@: غير موجود أو تعذّر التحقق من الهوية" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@-কে ব্লক করা যায় না: পাওয়া যায়নি বা পরিচয় যাচাই করা যায়নি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ kann nicht blockiert werden: nicht gefunden oder identität nicht verifizierbar" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no se puede bloquear a %@: no encontrado o no se pudo verificar la identidad" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossible de bloquer %@ : introuvable ou identité invérifiable" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא ניתן לחסום את %@: לא נמצא או שלא ניתן לאמת זהות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ को ब्लॉक नहीं कर सकते: नहीं मिला या पहचान सत्यापित नहीं हो सकी" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak bisa memblokir %@: tidak ditemukan atau tidak bisa memverifikasi identitas" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossibile bloccare %@: non trovato o identità non verificabile" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ をブロックできません: 見つからないか身元を確認できません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 님을 차단할 수 없습니다: 찾을 수 없거나 신원을 확인할 수 없습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak dapat memblokir %@: tidak dijumpai atau tidak dapat mengesahkan identiti" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ लाई ब्लक गर्न सकिएन: भेटिएन वा पहिचान प्रमाणित गर्न सकिएन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kan %@ niet blokkeren: niet gevonden of identiteit niet te verifiëren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie można zablokować %@: nie znaleziono lub nie można zweryfikować tożsamości" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não é possível bloquear %@: não encontrado ou identidade não verificável" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не удалось заблокировать %@: не найден или нельзя проверить личность" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kan inte blockera %@: hittades inte eller kan inte verifiera identitet" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ ஐத் தடுக்க முடியாது: கண்டறியப்படவில்லை அல்லது அடையாளத்தைச் சரிபார்க்க முடியவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่สามารถบล็อก %@: ไม่พบหรือไม่สามารถยืนยันตัวตน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ engellenemiyor: bulunamadı veya kimlik doğrulanamıyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не можна заблокувати %@: не знайдено або не вдалося підтвердити особу" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ کو بلاک نہیں کیا جا سکتا: نہیں ملا یا شناخت کی تصدیق ممکن نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không thể chặn %@: không tìm thấy hoặc không thể xác minh danh tính" + } } } }, @@ -34919,6 +53635,150 @@ "state" : "translated", "value" : "blocked %@. you will no longer receive messages from them" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تم حظر %@. لن تتلقى رسائل منه بعد الآن" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@-কে ব্লক করা হয়েছে। আপনি আর তাদের বার্তা পাবেন না" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ blockiert. du erhältst keine nachrichten mehr von ihnen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "se bloqueó a %@. ya no recibirás mensajes suyos" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ bloqué. tu ne recevras plus ses messages" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ נחסם. לא תקבל ממנו יותר הודעות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ को ब्लॉक किया। अब आपको उनसे संदेश नहीं मिलेंगे" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "memblokir %@. kamu tidak akan menerima pesan dari mereka lagi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ bloccato. non riceverai più messaggi da questa persona" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ をブロックしました。今後この相手からのメッセージは受信しません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 님을 차단했습니다. 이제 이 사용자의 메시지를 받지 않습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "memblokir %@. anda tidak akan menerima pesan daripada mereka lagi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ लाई ब्लक गरियो। अब उनीबाट सन्देश पाउने छैनौ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ geblokkeerd. je ontvangt geen berichten meer van deze persoon" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "zablokowano %@. nie będziesz już otrzymywać od nich wiadomości" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ bloqueado. deixarás de receber mensagens desta pessoa" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ заблокирован. ты больше не будешь получать от него сообщения" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "blockerade %@. du får inte längre meddelanden från dem" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ தடுக்கப்பட்டது. அவர்களிடமிருந்து இனி செய்திகளைப் பெறமாட்டீர்கள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "บล็อก %@ แล้ว คุณจะไม่ได้รับข้อความจากพวกเขาอีก" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ engellendi. artık ondan mesaj almayacaksın" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "заблоковано %@. ти більше не отримуватимеш від них повідомлень" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ کو بلاک کر دیا۔ اب آپ کو ان سے پیغامات نہیں ملیں گے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã chặn %@. bạn sẽ không còn nhận tin nhắn từ họ nữa" + } } } }, @@ -34931,6 +53791,150 @@ "state" : "translated", "value" : "cannot unblock %@: not found" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تعذّر إلغاء حظر %@: غير موجود" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@-কে আনব্লক করা যায় না: পাওয়া যায়নি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ kann nicht entsperrt werden: nicht gefunden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no se puede desbloquear a %@: no encontrado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossible de débloquer %@ : introuvable" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא ניתן לבטל חסימה של %@: לא נמצא" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ को अनब्लॉक नहीं कर सकते: नहीं मिला" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak bisa membuka blokir %@: tidak ditemukan" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossibile sbloccare %@: non trovato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ のブロックを解除できません: 見つかりません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 님의 차단을 해제할 수 없습니다: 찾을 수 없습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tidak dapat membuka blokir %@: tidak dijumpai" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ लाई अनब्लक गर्न सकिएन: भेटिएन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kan %@ niet deblokkeren: niet gevonden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie można odblokować %@: nie znaleziono" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não é possível desbloquear %@: não encontrado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не удалось разблокировать %@: не найден" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kan inte avblockera %@: hittades inte" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ இன் தடையை நீக்க முடியாது: கண்டறியப்படவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่สามารถเลิกบล็อก %@: ไม่พบ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ engeli kaldırılamıyor: bulunamadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не можна розблокувати %@: не знайдено" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ کو ان بلاک نہیں کیا جا سکتا: نہیں ملا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không thể bỏ chặn %@: không tìm thấy" + } } } }, @@ -34943,6 +53947,150 @@ "state" : "translated", "value" : "unblocked %@" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "أُلغي حظر %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@-কে আনব্লক করা হয়েছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ entsperrt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "se desbloqueó a %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ débloqué" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "החסימה של %@ בוטלה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ को अनब्लॉक किया" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka blokir %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ sbloccato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ のブロックを解除しました" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 님의 차단을 해제했습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "membuka blokir %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ लाई अनब्लक गरियो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ gedeblokkeerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "odblokowano %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ desbloqueado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ разблокирован" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "avblockerade %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ இன் தடை நீக்கப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เลิกบล็อก %@ แล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ engeli kaldırıldı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "розблоковано %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ کو ان بلاک کر دیا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "đã bỏ chặn %@" + } } } }, @@ -35850,6 +54998,150 @@ "state" : "translated", "value" : "estimated from gossiped neighbor lists (up to 10 per peer) — your device is highlighted" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "مُقدَّرة من قوائم الجيران المتناقلة (حتى 10 لكل قرين) — جهازك مميَّز" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "গসিপ করা প্রতিবেশী তালিকা থেকে অনুমান করা (প্রতি পিয়ারে সর্বোচ্চ ১০) — আপনার ডিভাইস হাইলাইট করা" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "geschätzt aus verbreiteten nachbarlisten (bis zu 10 pro peer) — dein gerät ist hervorgehoben" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimado a partir de listas de vecinos difundidas (hasta 10 por peer) — tu dispositivo está resaltado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "estimé à partir des listes de voisins diffusées (jusqu'à 10 par pair) — ton appareil est mis en évidence" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "מוערך מרשימות שכנים שהופצו (עד 10 לכל עמית) — המכשיר שלך מודגש" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "गॉसिप की गई पड़ोसी सूचियों से अनुमानित (प्रति पीयर 10 तक) — आपका डिवाइस हाइलाइट किया गया है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "diperkirakan dari daftar tetangga yang di-gossip (hingga 10 per peer) — perangkatmu disorot" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "stimato dalle liste di vicini diffuse (fino a 10 per peer) — il tuo dispositivo è evidenziato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ゴシップされた近隣リスト(ピアあたり最大10件)から推定 — お使いのデバイスをハイライト" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "가십으로 전파된 이웃 목록(피어당 최대 10개)에서 추정 — 사용 중인 기기가 강조 표시됨" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "dianggarkan dari senarai jiran yang di-gossip (sehingga 10 setiap peer) — perantimu diserlahkan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "गसिप गरिएका छिमेकी सूचीबाट अनुमानित (प्रति सहकर्मी बढीमा १०) — तिम्रो यन्त्र हाइलाइट गरिएको छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "geschat op basis van verspreide buurlijsten (tot 10 per peer) — je apparaat is gemarkeerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "oszacowane na podstawie rozgłaszanych list sąsiadów (do 10 na peera) — twoje urządzenie jest wyróżnione" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "estimado a partir de listas de vizinhos difundidas (até 10 por par) — o teu dispositivo está destacado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "оценено по gossip-спискам соседей (до 10 на пира) — твоё устройство выделено" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uppskattat från skvallrade grannlistor (upp till 10 per peer) — din enhet är markerad" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "வதந்தியாகப் பகிரப்பட்ட அண்டை பட்டியல்களிலிருந்து மதிப்பிடப்பட்டது (ஒரு peer க்கு 10 வரை) — உங்கள் சாதனம் தனிப்படுத்தப்பட்டுள்ளது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ประมาณจากรายชื่อเพื่อนบ้านที่ส่งต่อแบบ gossip (สูงสุด 10 รายต่อเพียร์) — อุปกรณ์ของคุณถูกไฮไลต์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "yayılan komşu listelerinden tahmin edildi (eş başına en fazla 10) — cihazın vurgulanmış" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "оцінено на основі поширюваних списків сусідів (до 10 на піра) — твій пристрій виділено" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گپ شپ کی گئی پڑوسیوں کی فہرستوں سے اندازہ (فی ہم منصب 10 تک) — آپ کی ڈیوائس نمایاں ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ước tính từ danh sách hàng xóm được gossip (tối đa 10 mỗi nút) — thiết bị của bạn được làm nổi bật" + } } } }, @@ -35862,6 +55154,150 @@ "state" : "translated", "value" : "no mesh links yet — the map fills in as peer announces arrive" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "لا توجد روابط mesh بعد — تمتلئ الخريطة مع وصول إعلانات الأقران" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "এখনো কোনো মেশ লিঙ্ক নেই — পিয়ার অ্যানাউন্স এলে মানচিত্র পূরণ হয়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "noch keine mesh-verbindungen — die karte füllt sich, sobald peer-announces eintreffen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "aún no hay enlaces del mesh — el mapa se completa a medida que llegan los anuncios de peers" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "aucun lien mesh pour l'instant — la carte se remplit à mesure que les annonces des pairs arrivent" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אין עדיין קישורי mesh — המפה מתמלאת כשהכרזות עמיתים מגיעות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "अभी तक कोई मेश लिंक नहीं — पीयर अनाउंस आने पर नक्शा भरता जाता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "belum ada tautan mesh — peta terisi saat announce peer berdatangan" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ancora nessun collegamento mesh — la mappa si riempie man mano che arrivano gli announce dei peer" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "まだmeshリンクがありません — ピアのannounceが届くとマップが埋まります" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "아직 mesh 링크가 없습니다 — 피어 announce가 도착하면 지도가 채워집니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "belum ada pautan mesh — peta terisi apabila announce peer tiba" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "अझै mesh लिंक छैन — सहकर्मी घोषणा आउँदै जाँदा नक्सा भरिन्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nog geen mesh-verbindingen — de kaart vult zich naarmate peer-announces binnenkomen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "brak połączeń mesh — mapa wypełnia się, gdy nadchodzą ogłoszenia peerów" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ainda sem ligações mesh — o mapa preenche-se à medida que chegam os announces dos pares" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "пока нет mesh-связей — карта заполнится по мере поступления анонсов пиров" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inga mesh-länkar än — kartan fylls i när peer-announces kommer in" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இன்னும் mesh இணைப்புகள் இல்லை — peer அறிவிப்புகள் வரும்போது வரைபடம் நிரப்பப்படும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ยังไม่มีการเชื่อมต่อ mesh — แผนที่จะเติมเต็มเมื่อ announce ของเพียร์มาถึง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "henüz mesh bağlantısı yok — eş duyuruları geldikçe harita dolar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "поки немає зв'язків mesh — карта заповнюється, коли надходять оголошення пірів" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ابھی کوئی mesh روابط نہیں — ہم منصبوں کے اعلانات آتے ہی نقشہ بھر جاتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chưa có liên kết mesh nào — bản đồ sẽ được điền khi các announce của nút đến" + } } } }, @@ -35874,6 +55310,150 @@ "state" : "translated", "value" : "refresh topology" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تحديث الطوبولوجيا" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "টপোলজি রিফ্রেশ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologie aktualisieren" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "actualizar topología" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "actualiser la topologie" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "רענון טופולוגיה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "टोपोलॉजी रीफ़्रेश करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "segarkan topologi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "aggiorna topologia" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "トポロジーを更新" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "토폴로지 새로고침" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "segarkan topologi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "टोपोलोजी ताजा गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologie vernieuwen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "odśwież topologię" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "atualizar topologia" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "обновить топологию" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uppdatera topologi" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "டோபாலஜியைப் புதுப்பிக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "รีเฟรชโทโพโลยี" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topolojiyi yenile" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "оновити топологію" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ٹوپولوجی ریفریش کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "làm mới cấu trúc" + } } } }, @@ -35886,6 +55466,150 @@ "state" : "translated", "value" : "%1$ld peers · %2$ld links" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld قرين · %2$ld رابط" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld পিয়ার · %2$ld লিঙ্ক" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld peers · %2$ld verbindungen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$ld peers · %2$ld enlaces" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld pairs · %2$ld liens" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld עמיתים · %2$ld קישורים" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld पीयर · %2$ld लिंक" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld peer · %2$ld tautan" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld peer · %2$ld collegamenti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld ピア · %2$ld リンク" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "피어 %1$ld개 · 링크 %2$ld개" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld peer · %2$ld pautan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld सहकर्मी · %2$ld लिंक" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld peers · %2$ld verbindingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld peerów · %2$ld połączeń" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld pares · %2$ld ligações" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld пиров · %2$ld связей" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld peers · %2$ld länkar" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld peer-கள் · %2$ld இணைப்புகள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld เพียร์ · %2$ld การเชื่อมต่อ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld eş · %2$ld bağlantı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld пірів · %2$ld зв'язків" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld ہم منصب · %2$ld روابط" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld nút · %2$ld liên kết" + } } } }, @@ -35898,6 +55622,150 @@ "state" : "translated", "value" : "mesh topology" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "طوبولوجيا mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "মেশ টপোলজি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh-topologie" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "topología del mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologie mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "טופולוגיית mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "मेश टोपोलॉजी" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologi mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologia mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh トポロジー" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh 토폴로지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologi mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh टोपोलोजी" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh-topologie" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologia mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologia mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "топология mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh-topologi" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh டோபாலஜி" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "โทโพโลยี mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh topolojisi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "топологія mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh ٹوپولوجی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cấu trúc mesh" + } } } }, @@ -38238,6 +58106,150 @@ "state" : "translated", "value" : "image unavailable" } + }, + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الصورة غير متاحة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবি অনুপলব্ধ" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild nicht verfügbar" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "imagen no disponible" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "image indisponible" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "התמונה לא זמינה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चित्र उपलब्ध नहीं" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gambar tidak tersedia" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "immagine non disponibile" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "画像を利用できません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이미지를 사용할 수 없음" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imej tidak tersedia" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर उपलब्ध छैन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "afbeelding niet beschikbaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "obraz niedostępny" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imagem indisponível" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "изображение недоступно" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild otillgänglig" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படம் கிடைக்கவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่สามารถใช้รูปภาพได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "görsel kullanılamıyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "зображення недоступне" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر دستیاب نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hình ảnh không khả dụng" + } } } } From 8415c529131441a6b44da4029d6375775623aa43 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 17:40:12 +0200 Subject: [PATCH 042/158] Unified notices: one pin, one sheet for board pins + location notes (#1392) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Unified notices: merge board pins and location notes into one sheet One pin icon in the header now opens a single Notices sheet with a geo/mesh scope toggle, replacing the separate board, location-notes, and mesh-only note buttons: - geo tab: current geohash's notices — mesh-synced board posts merged and deduped with Nostr kind-1 location notes, with per-item mesh/net source badges. Scope follows the selected location channel, or the device's building geohash when chatting on mesh. - mesh tab: mesh-local board only (fully offline). - One composer: geo posts go to the board and bridge to Nostr (existing bridge), so mesh and internet see the same notice. - Merged delete: tombstoning an own board post now also retracts the bridged Nostr copy via NIP-09 (new createDeleteEvent, bridged event ids tracked in BoardManager); own Nostr-only notes are deletable too. - LocationNotesManager accepts any channel-precision geohash (1-12 chars), not just building-level. BoardView and LocationNotesView are superseded by NoticesView. Co-Authored-By: Claude Fable 5 * Notices round 2: honest composer, friendlier copy, new-pin chat alerts - Urgent + expiry controls now appear on the mesh tab only: the bridged Nostr copy of a geo post carries neither, so relay-side readers would never see them. Geo posts default to non-urgent with 7-day expiry, and the bridged note now gets a NIP-40 expiration tag so honoring relays drop it in step with the board copy. - Geo tab explainer reuses the original location-notes description (keeps its 29 existing translations); mesh tab gets a new plain- language description. - New-pin chat alerts, fully local (no wire traffic): BoardStore fires postArrivals for posts newly accepted from the wire; BoardAlertsModel filters own posts, dedups by postID, and for urgent pins created within the last 30 minutes emits one system line into the matching timeline (geo pin -> that geohash's chat, mesh pin -> mesh chat), collapsing simultaneous arrivals into a count line. - Routine pins light up the header: the pin icon tints orange whenever the current scope has notices at all, and fills (pin.fill) while unseen new pins are waiting; opening the sheet clears them. Co-Authored-By: Claude Fable 5 * i18n: translate the unified-notices strings into all 28 non-English locales Adds the 13 new notices keys (sheet title, geo/mesh tabs, mesh description, source badges, urgent alert lines, button tooltip and accessibility strings) to the string catalog with translations for every locale the app ships. The geo tab already reuses the fully translated location_notes.description; this covers the rest. Insertion preserves the catalog's case-insensitive key order, so the diff is purely additive. Co-Authored-By: Claude Fable 5 * Address Codex review: panic-wipe reset, scoped badge clear, geohash-aware dedupe - BoardStore.wipe() now emits didWipe; BoardAlertsModel subscribes and resets, so a panic wipe drops pending urgent lines (which could otherwise re-append pre-wipe content into chat after the collapse flush), unseen badge scopes, and handled-post history. - Opening the notices sheet clears unseen badges only for the scopes it actually shows (mesh + current geo scope); pins for other geohash channels keep their badge until visited. - LocationNotesManager.Note now retains the matched g tag, and the bridged-copy dedupe requires the note's geohash to equal the board post's — a same-text note from a neighboring cell is no longer swallowed as a duplicate. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/AppRuntime.swift | 19 + bitchat/BitchatApp.swift | 1 + bitchat/Localizable.xcstrings | 7189 +++++++++++------ bitchat/Nostr/NostrProtocol.swift | 29 +- bitchat/Protocols/Geohash.swift | 8 + bitchat/Services/Board/BoardAlertsModel.swift | 160 + bitchat/Services/Board/BoardManager.swift | 50 +- bitchat/Services/Board/BoardStore.swift | 18 + bitchat/Services/Board/UnifiedNotices.swift | 88 + bitchat/Services/LocationNotesManager.swift | 56 +- bitchat/ViewModels/ChatViewModel.swift | 13 + bitchat/Views/BoardView.swift | 270 - bitchat/Views/ContentHeaderView.swift | 175 +- bitchat/Views/ContentView.swift | 4 - bitchat/Views/LocationNotesView.swift | 304 - bitchat/Views/NoticesView.swift | 560 ++ .../Services/BoardAlertsModelTests.swift | 215 + .../Services/UnifiedNoticesTests.swift | 142 + bitchatTests/ViewSmokeTests.swift | 48 +- 19 files changed, 6210 insertions(+), 3139 deletions(-) create mode 100644 bitchat/Services/Board/BoardAlertsModel.swift create mode 100644 bitchat/Services/Board/UnifiedNotices.swift delete mode 100644 bitchat/Views/BoardView.swift delete mode 100644 bitchat/Views/LocationNotesView.swift create mode 100644 bitchat/Views/NoticesView.swift create mode 100644 bitchatTests/Services/BoardAlertsModelTests.swift create mode 100644 bitchatTests/Services/UnifiedNoticesTests.swift diff --git a/bitchat/App/AppRuntime.swift b/bitchat/App/AppRuntime.swift index a706cfac..de096e8e 100644 --- a/bitchat/App/AppRuntime.swift +++ b/bitchat/App/AppRuntime.swift @@ -28,6 +28,7 @@ final class AppRuntime: ObservableObject { let locationChannelsModel: LocationChannelsModel let peerListModel: PeerListModel let appChromeModel: AppChromeModel + let boardAlertsModel: BoardAlertsModel private let idBridge: NostrIdentityBridge private var cancellables = Set() @@ -91,6 +92,24 @@ final class AppRuntime: ObservableObject { chatViewModel: self.chatViewModel, privateInboxModel: self.privateInboxModel ) + let chatViewModel = self.chatViewModel + self.boardAlertsModel = BoardAlertsModel( + arrivals: BoardStore.shared.postArrivals.eraseToAnyPublisher(), + wipes: BoardStore.shared.didWipe.eraseToAnyPublisher(), + dependencies: BoardAlertsModel.Dependencies( + isOwnPost: { post in + let key = chatViewModel.meshService.noiseSigningPublicKeyData() + return !key.isEmpty && key == post.authorSigningKey + }, + emitSystemLine: { content, geohash in + if geohash.isEmpty { + chatViewModel.addMeshOnlySystemMessage(content) + } else { + chatViewModel.addGeohashSystemMessage(content, geohash: geohash) + } + } + ) + ) GeoRelayDirectory.shared.prefetchIfNeeded() bindRuntimeObservers() diff --git a/bitchat/BitchatApp.swift b/bitchat/BitchatApp.swift index e606506f..41a01f6d 100644 --- a/bitchat/BitchatApp.swift +++ b/bitchat/BitchatApp.swift @@ -40,6 +40,7 @@ struct BitchatApp: App { .environmentObject(runtime.locationChannelsModel) .environmentObject(runtime.peerListModel) .environmentObject(runtime.appChromeModel) + .environmentObject(runtime.boardAlertsModel) .onAppear { appDelegate.runtime = runtime runtime.start() diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index fdabb822..c2ef1442 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -1,6 +1,9 @@ { "sourceLanguage" : "en", "strings" : { + "#%@" : { + + }, "%@" : { "comment" : "Non-localizable symbol used in code", "extractionState" : "manual", @@ -5019,12 +5022,6 @@ "comment" : "Legend entry for the nosign glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "blocked" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -5043,6 +5040,12 @@ "value" : "blockiert" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -5175,12 +5178,6 @@ "comment" : "Legend entry for the lock glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "end-to-end encrypted session" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -5199,6 +5196,12 @@ "value" : "end-to-end-verschlüsselte sitzung" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "end-to-end encrypted session" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -5331,12 +5334,6 @@ "comment" : "Legend entry for the failed-encryption lock-slash glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "encryption failed — messages not secured" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -5355,6 +5352,12 @@ "value" : "verschlüsselung fehlgeschlagen — nachrichten nicht gesichert" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "encryption failed — messages not secured" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -5487,12 +5490,6 @@ "comment" : "Legend entry for the star glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "favorite — enables offline messages via nostr when mutual" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -5511,6 +5508,12 @@ "value" : "favorit — ermöglicht offline-nachrichten über nostr, wenn beidseitig" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorite — enables offline messages via nostr when mutual" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -5643,12 +5646,6 @@ "comment" : "Legend entry for the map pin glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "physically in this location channel's area" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -5667,6 +5664,12 @@ "value" : "physisch im gebiet dieses standortkanals" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "physically in this location channel's area" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -5799,12 +5802,6 @@ "comment" : "Legend entry for the antenna glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "connected directly over bluetooth" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -5823,6 +5820,12 @@ "value" : "direkt über bluetooth verbunden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "connected directly over bluetooth" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -5955,12 +5958,6 @@ "comment" : "Legend entry for the relayed-mesh glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "reachable through the mesh, relayed by others" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -5979,6 +5976,12 @@ "value" : "über das mesh erreichbar, von anderen weitergeleitet" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "reachable through the mesh, relayed by others" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -6111,12 +6114,6 @@ "comment" : "Legend entry for the globe glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "reachable over the internet (nostr) — mutual favorites only" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -6135,6 +6132,12 @@ "value" : "über das internet erreichbar (nostr) — nur bei beidseitigen favoriten" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "reachable over the internet (nostr) — mutual favorites only" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -6267,12 +6270,6 @@ "comment" : "Legend entry for the offline person glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "offline — not currently reachable" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -6291,6 +6288,12 @@ "value" : "offline — derzeit nicht erreichbar" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "offline — not currently reachable" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -6423,12 +6426,6 @@ "comment" : "Legend entry for the teleported glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "teleported — joined the channel from somewhere else" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -6447,6 +6444,12 @@ "value" : "teleportiert — dem kanal von woanders beigetreten" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "teleported — joined the channel from somewhere else" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -6579,12 +6582,6 @@ "comment" : "Section header for the symbols legend in app info", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "SYMBOLS" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -6603,6 +6600,12 @@ "value" : "SYMBOLE" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "SYMBOLS" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -6735,12 +6738,6 @@ "comment" : "Legend entry for the envelope glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "unread private messages" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -6759,6 +6756,12 @@ "value" : "ungelesene private nachrichten" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "unread private messages" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -6891,12 +6894,6 @@ "comment" : "Legend entry for the verified seal glyph", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "identity verified" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -6915,6 +6912,12 @@ "value" : "identität verifiziert" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "identity verified" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -7047,12 +7050,6 @@ "comment" : "Section header for network diagnostics in the app info sheet", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "NETWORK" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -7071,6 +7068,12 @@ "value" : "NETZWERK" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "NETWORK" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -7203,12 +7206,6 @@ "comment" : "Row description for the mesh topology map", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "map of peers and links learned from mesh announces" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -7227,6 +7224,12 @@ "value" : "karte der peers und verbindungen, aus mesh-announces gelernt" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "map of peers and links learned from mesh announces" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -7359,12 +7362,6 @@ "comment" : "Accessibility hint for the mesh topology row", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "opens the mesh topology map" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -7383,6 +7380,12 @@ "value" : "öffnet die mesh-topologie-karte" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "opens the mesh topology map" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -7515,12 +7518,6 @@ "comment" : "Row title opening the mesh topology map", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "mesh topology" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -7539,6 +7536,12 @@ "value" : "mesh-topologie" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh topology" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -9457,6 +9460,186 @@ } } }, + "Choose an image" : { + "comment" : "A label displayed above a button that allows the user to choose an image to send.", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "اختر صورة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "একটি ছবি নির্বাচন করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bild auswählen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Choose an image" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elige una imagen" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumili ng larawan" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Choisir une image" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בחר תמונה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "एक चित्र चुनें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pilih gambar" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scegli un’immagine" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "画像を選択" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이미지를 선택하세요" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pilih imej" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "एउटा तस्वीर चयन गर्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kies een afbeelding" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wybierz obraz" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Escolher uma imagem" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Escolha uma imagem" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Выберите изображение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Välj en bild" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "ஒரு படத்தைத் தேர்ந்தெடுக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เลือกภาพ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bir görüntü seç" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Виберіть зображення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "ایک تصویر منتخب کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chọn một hình ảnh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择图像" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "選擇圖像" + } + } + } + }, "close" : { "comment" : "Button to dismiss fullscreen media viewer", "localizations" : { @@ -11072,12 +11255,6 @@ "comment" : "Accessibility hint on the bitchat/ logo explaining a tap opens app info", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "shows app info" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -11096,6 +11273,12 @@ "value" : "zeigt app-infos" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "shows app info" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -11228,12 +11411,6 @@ "comment" : "Accessibility label for the photo attachment button", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "attach photo" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -11252,6 +11429,12 @@ "value" : "foto anhängen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "attach photo" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -11384,12 +11567,6 @@ "comment" : "Accessibility hint explaining the attachment button opens the photo library", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "opens the photo library; use the take photo action for the camera" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -11408,6 +11585,12 @@ "value" : "öffnet die fotobibliothek; nutze die aktion foto aufnehmen für die kamera" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "opens the photo library; use the take photo action for the camera" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -11898,12 +12081,6 @@ "comment" : "Accessibility label for the macOS photo picker button", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "choose photo" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -11922,6 +12099,12 @@ "value" : "foto auswählen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "choose photo" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -12233,12 +12416,6 @@ "comment" : "Accessibility hint for the delivery status glyph explaining a tap reveals details", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "tap to show delivery details" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -12257,6 +12434,12 @@ "value" : "tippe, um zustelldetails anzuzeigen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "tap to show delivery details" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -12568,12 +12751,6 @@ "comment" : "Accessibility label for the internet gateway indicator", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Internet gateway active, sharing your connection with the mesh" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -12592,6 +12769,12 @@ "value" : "Internet-gateway aktiv, teilt deine verbindung mit dem mesh" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Internet gateway active, sharing your connection with the mesh" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -12723,12 +12906,6 @@ "content.accessibility.group_chat" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Group chat" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -12747,6 +12924,12 @@ "value" : "Gruppenchat" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Group chat" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -12879,12 +13062,6 @@ "comment" : "Accessibility label for the jump to latest messages button", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "jump to latest messages" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -12903,6 +13080,12 @@ "value" : "zu den neuesten nachrichten springen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "jump to latest messages" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -13389,6 +13572,366 @@ } } }, + "content.accessibility.notices" : { + "comment" : "Accessibility label for the notices button", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إعلانات" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "নোটিশ" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hinweise" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notices" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avisos" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mga paunawa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annonces" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מודעות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "सूचनाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pengumuman" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avvisi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "お知らせ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pengumuman" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सूचनाहरू" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mededelingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ogłoszenia" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avisos" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avisos" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Объявления" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anslag" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அறிவிப்புகள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ประกาศ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duyurular" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Оголошення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "اعلانات" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thông báo" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "公告" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "公告" + } + } + } + }, + "content.accessibility.notices_new" : { + "comment" : "Accessibility value for the notices button when unseen pins arrived", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld جديد" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lldটি নতুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld neu" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld new" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld nuevos" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld bago" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld nouvelles" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld חדשות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld नई" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld baru" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld nuovi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld件の新着" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld개 새 항목" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld baharu" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld नयाँ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld nieuw" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld nowych" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld novos" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld novos" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld новых" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld nya" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld புதியவை" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ใหม่ %lld รายการ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld yeni" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld нових" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld نئے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld mới" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 条新公告" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 則新公告" + } + } + } + }, "content.accessibility.open_unread_private_chat" : { "extractionState" : "manual", "localizations" : { @@ -13572,12 +14115,6 @@ "comment" : "Accessibility value when peers are reachable", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "connected" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -13596,6 +14133,12 @@ "value" : "verbunden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "connected" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -13728,12 +14271,6 @@ "comment" : "Accessibility value when no peers are reachable", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "no one reachable" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -13752,6 +14289,12 @@ "value" : "niemand erreichbar" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one reachable" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -14805,12 +15348,6 @@ "comment" : "Accessibility hint explaining double-tap toggles voice recording", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "double-tap to start recording, double-tap again to send" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -14829,6 +15366,12 @@ "value" : "doppeltippen zum aufnehmen, erneut doppeltippen zum senden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "double-tap to start recording, double-tap again to send" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -14961,12 +15504,6 @@ "comment" : "Accessibility label for the voice note button", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "record voice note" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -14985,6 +15522,12 @@ "value" : "sprachnachricht aufnehmen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "record voice note" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -15117,12 +15660,6 @@ "comment" : "Accessibility value announced while a voice note is recording", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "recording" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -15141,6 +15678,12 @@ "value" : "aufnahme" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "recording" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -15989,12 +16532,6 @@ "comment" : "Accessibility action name for taking a photo with the camera", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "take photo with camera" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -16013,6 +16550,12 @@ "value" : "foto mit kamera aufnehmen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "take photo with camera" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -16503,12 +17046,6 @@ "comment" : "Accessibility label for the verification QR button", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "verify encryption" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -16527,6 +17064,12 @@ "value" : "verschlüsselung verifizieren" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "verify encryption" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -17554,12 +18097,6 @@ "comment" : "Context menu action that resends a failed private message", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "resend" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -17578,6 +18115,12 @@ "value" : "erneut senden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "resend" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -19321,12 +19864,6 @@ "comment" : "Destructive confirmation button that clears the current chat", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "clear chat" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -19345,6 +19882,12 @@ "value" : "chat leeren" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "clear chat" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -19477,12 +20020,6 @@ "comment" : "Title of the confirmation dialog shown before clearing the current chat", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "clear this chat?" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -19501,6 +20038,12 @@ "value" : "diesen chat leeren?" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "clear this chat?" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -20169,12 +20712,6 @@ "content.commands.group" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "create or manage private groups" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -20193,6 +20730,12 @@ "value" : "private gruppen erstellen oder verwalten" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "create or manage private groups" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -20325,12 +20868,6 @@ "comment" : "Description of the /help command in the suggestions panel", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "show available commands" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -20349,6 +20886,12 @@ "value" : "verfügbare befehle anzeigen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "show available commands" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -20839,12 +21382,6 @@ "comment" : "Autocomplete description for the /pay command that sends a Cashu ecash token", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "send a cashu ecash token in this chat" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -20863,6 +21400,12 @@ "value" : "einen cashu-ecash-token in diesem chat senden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "send a cashu ecash token in this chat" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -20995,12 +21538,6 @@ "comment" : "Description of the /ping command in the suggestions panel", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "measure round-trip time to a mesh peer" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -21019,6 +21556,12 @@ "value" : "die roundtrip-zeit zu einem mesh-peer messen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "measure round-trip time to a mesh peer" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -21330,12 +21873,6 @@ "comment" : "Description of the /trace command in the suggestions panel", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "estimate the mesh path to a peer" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -21354,6 +21891,12 @@ "value" : "den mesh-pfad zu einem peer schätzen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimate the mesh path to a peer" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -22914,172 +23457,10 @@ } } }, - "content.delivery.reason.not_delivered" : { - "comment" : "Failure reason shown when the router gave up delivering a message", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "not delivered" - } - }, - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "لم يُسلَّم" - } - }, - "bn" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "পৌঁছায়নি" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nicht zugestellt" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "no entregado" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "non livré" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "לא נמסר" - } - }, - "hi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "डिलीवर नहीं हुआ" - } - }, - "id" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "tidak terkirim" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "non consegnato" - } - }, - "ja" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "未配信" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "전송되지 않음" - } - }, - "ms" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "tidak dihantar" - } - }, - "ne" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "डेलिभर भएन" - } - }, - "nl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "niet bezorgd" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nie dostarczono" - } - }, - "pt" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "não entregue" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "не доставлено" - } - }, - "sv" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "inte levererat" - } - }, - "ta" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "வழங்கப்படவில்லை" - } - }, - "th" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ยังไม่ได้ส่ง" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "teslim edilmedi" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "не доставлено" - } - }, - "ur" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "نہیں پہنچا" - } - }, - "vi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "chưa gửi được" - } - } - } - }, "content.delivery.reason.encryption_failed" : { "comment" : "Failure reason shown when a message could not be encrypted for the peer", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "encryption failed" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -23098,6 +23479,12 @@ "value" : "verschlüsselung fehlgeschlagen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "encryption failed" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -23226,314 +23613,158 @@ } } }, - "content.delivery.reason.voice_too_large" : { - "comment" : "Failure reason shown when a voice note exceeds the size limit", + "content.delivery.reason.not_delivered" : { + "comment" : "Failure reason shown when the router gave up delivering a message", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "voice note too large" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", - "value" : "الملاحظة الصوتية كبيرة جدًا" + "value" : "لم يُسلَّم" } }, "bn" : { "stringUnit" : { "state" : "needs_review", - "value" : "ভয়েস নোট খুব বড়" + "value" : "পৌঁছায়নি" } }, "de" : { "stringUnit" : { "state" : "needs_review", - "value" : "sprachnachricht zu groß" + "value" : "nicht zugestellt" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "nota de voz demasiado grande" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "note vocale trop volumineuse" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ההערה הקולית גדולה מדי" - } - }, - "hi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "वॉइस नोट बहुत बड़ा" - } - }, - "id" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "catatan suara terlalu besar" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nota vocale troppo grande" - } - }, - "ja" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ボイスメモが大きすぎます" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "음성 메모가 너무 큼" - } - }, - "ms" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nota suara terlalu besar" - } - }, - "ne" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "भ्वाइस नोट धेरै ठूलो" - } - }, - "nl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "spraakbericht te groot" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "notatka głosowa zbyt duża" - } - }, - "pt" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nota de voz demasiado grande" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "голосовое сообщение слишком большое" - } - }, - "sv" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "röstmeddelandet är för stort" - } - }, - "ta" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "குரல் குறிப்பு மிகப் பெரியது" - } - }, - "th" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ข้อความเสียงใหญ่เกินไป" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "sesli not çok büyük" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "голосова нотатка завелика" - } - }, - "ur" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "وائس نوٹ بہت بڑا ہے" - } - }, - "vi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ghi chú giọng nói quá lớn" - } - } - } - }, - "content.delivery.reason.voice_send_failed" : { - "comment" : "Failure reason shown when a voice note could not be sent", - "extractionState" : "manual", - "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "voice note failed to send" - } - }, - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "فشل إرسال الملاحظة الصوتية" - } - }, - "bn" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ভয়েস নোট পাঠানো যায়নি" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "sprachnachricht konnte nicht gesendet werden" + "value" : "not delivered" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "no se pudo enviar la nota de voz" + "value" : "no entregado" } }, "fr" : { "stringUnit" : { "state" : "needs_review", - "value" : "échec de l'envoi de la note vocale" + "value" : "non livré" } }, "he" : { "stringUnit" : { "state" : "needs_review", - "value" : "שליחת ההערה הקולית נכשלה" + "value" : "לא נמסר" } }, "hi" : { "stringUnit" : { "state" : "needs_review", - "value" : "वॉइस नोट भेजने में विफल" + "value" : "डिलीवर नहीं हुआ" } }, "id" : { "stringUnit" : { "state" : "needs_review", - "value" : "catatan suara gagal dikirim" + "value" : "tidak terkirim" } }, "it" : { "stringUnit" : { "state" : "needs_review", - "value" : "invio della nota vocale non riuscito" + "value" : "non consegnato" } }, "ja" : { "stringUnit" : { "state" : "needs_review", - "value" : "ボイスメモの送信に失敗" + "value" : "未配信" } }, "ko" : { "stringUnit" : { "state" : "needs_review", - "value" : "음성 메모 전송 실패" + "value" : "전송되지 않음" } }, "ms" : { "stringUnit" : { "state" : "needs_review", - "value" : "nota suara gagal dihantar" + "value" : "tidak dihantar" } }, "ne" : { "stringUnit" : { "state" : "needs_review", - "value" : "भ्वाइस नोट पठाउन असफल" + "value" : "डेलिभर भएन" } }, "nl" : { "stringUnit" : { "state" : "needs_review", - "value" : "spraakbericht kon niet worden verzonden" + "value" : "niet bezorgd" } }, "pl" : { "stringUnit" : { "state" : "needs_review", - "value" : "nie udało się wysłać notatki głosowej" + "value" : "nie dostarczono" } }, "pt" : { "stringUnit" : { "state" : "needs_review", - "value" : "falha ao enviar a nota de voz" + "value" : "não entregue" } }, "ru" : { "stringUnit" : { "state" : "needs_review", - "value" : "не удалось отправить голосовое сообщение" + "value" : "не доставлено" } }, "sv" : { "stringUnit" : { "state" : "needs_review", - "value" : "röstmeddelandet kunde inte skickas" + "value" : "inte levererat" } }, "ta" : { "stringUnit" : { "state" : "needs_review", - "value" : "குரல் குறிப்பு அனுப்ப முடியவில்லை" + "value" : "வழங்கப்படவில்லை" } }, "th" : { "stringUnit" : { "state" : "needs_review", - "value" : "ส่งข้อความเสียงไม่สำเร็จ" + "value" : "ยังไม่ได้ส่ง" } }, "tr" : { "stringUnit" : { "state" : "needs_review", - "value" : "sesli not gönderilemedi" + "value" : "teslim edilmedi" } }, "uk" : { "stringUnit" : { "state" : "needs_review", - "value" : "не вдалося надіслати голосову нотатку" + "value" : "не доставлено" } }, "ur" : { "stringUnit" : { "state" : "needs_review", - "value" : "وائس نوٹ بھیجنے میں ناکام" + "value" : "نہیں پہنچا" } }, "vi" : { "stringUnit" : { "state" : "needs_review", - "value" : "gửi ghi chú giọng nói thất bại" + "value" : "chưa gửi được" } } } @@ -24254,16 +24485,322 @@ } } }, + "content.delivery.reason.voice_send_failed" : { + "comment" : "Failure reason shown when a voice note could not be sent", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "فشل إرسال الملاحظة الصوتية" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ভয়েস নোট পাঠানো যায়নি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sprachnachricht konnte nicht gesendet werden" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "voice note failed to send" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no se pudo enviar la nota de voz" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "échec de l'envoi de la note vocale" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שליחת ההערה הקולית נכשלה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वॉइस नोट भेजने में विफल" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "catatan suara gagal dikirim" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "invio della nota vocale non riuscito" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ボイスメモの送信に失敗" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "음성 메모 전송 실패" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nota suara gagal dihantar" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "भ्वाइस नोट पठाउन असफल" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "spraakbericht kon niet worden verzonden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie udało się wysłać notatki głosowej" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "falha ao enviar a nota de voz" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не удалось отправить голосовое сообщение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "röstmeddelandet kunde inte skickas" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குரல் குறிப்பு அனுப்ப முடியவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งข้อความเสียงไม่สำเร็จ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesli not gönderilemedi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не вдалося надіслати голосову нотатку" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "وائس نوٹ بھیجنے میں ناکام" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gửi ghi chú giọng nói thất bại" + } + } + } + }, + "content.delivery.reason.voice_too_large" : { + "comment" : "Failure reason shown when a voice note exceeds the size limit", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الملاحظة الصوتية كبيرة جدًا" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ভয়েস নোট খুব বড়" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sprachnachricht zu groß" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "voice note too large" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "nota de voz demasiado grande" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "note vocale trop volumineuse" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ההערה הקולית גדולה מדי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "वॉइस नोट बहुत बड़ा" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "catatan suara terlalu besar" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nota vocale troppo grande" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ボイスメモが大きすぎます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "음성 메모가 너무 큼" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nota suara terlalu besar" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "भ्वाइस नोट धेरै ठूलो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "spraakbericht te groot" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "notatka głosowa zbyt duża" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nota de voz demasiado grande" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "голосовое сообщение слишком большое" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "röstmeddelandet är för stort" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "குரல் குறிப்பு மிகப் பெரியது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ข้อความเสียงใหญ่เกินไป" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesli not çok büyük" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "голосова нотатка завелика" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "وائس نوٹ بہت بڑا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ghi chú giọng nói quá lớn" + } + } + } + }, "content.delivery.sending" : { "comment" : "Delivery status description while a private message is being sent", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "sending..." - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -24282,6 +24819,12 @@ "value" : "wird gesendet ..." } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "sending..." + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -24414,12 +24957,6 @@ "comment" : "Delivery status description for a sent but not yet confirmed private message", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "sent — no delivery confirmation yet" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -24438,6 +24975,12 @@ "value" : "gesendet — noch keine zustellbestätigung" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent — no delivery confirmation yet" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -24570,12 +25113,6 @@ "comment" : "First line of an empty geohash timeline naming the channel", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "you're in #%@ — a public location channel over the internet" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -24594,6 +25131,12 @@ "value" : "du bist in #%@ — ein öffentlicher standortkanal über das internet" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you're in #%@ — a public location channel over the internet" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -24726,12 +25269,6 @@ "comment" : "First line of the empty mesh timeline explaining what the mesh channel is", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "you're on #mesh — reaches people within bluetooth range" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -24750,6 +25287,12 @@ "value" : "du bist auf #mesh — erreicht menschen in bluetooth-reichweite" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you're on #mesh — reaches people within bluetooth range" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -24882,12 +25425,6 @@ "comment" : "Second line of the empty mesh timeline saying no peers are in range yet", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "nobody in range yet... messages appear here" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -24906,6 +25443,12 @@ "value" : "noch niemand in reichweite ... nachrichten erscheinen hier" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody in range yet... messages appear here" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -25038,12 +25581,6 @@ "comment" : "Empty timeline hint pointing at the channel switcher and the help screen", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "tap the channel name above to switch · tap bitchat/ for help" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -25062,6 +25599,12 @@ "value" : "tippe oben auf den kanalnamen zum wechseln · tippe bitchat/ für hilfe" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "tap the channel name above to switch · tap bitchat/ for help" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -25194,12 +25737,6 @@ "comment" : "Tooltip for the internet gateway indicator", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sharing your internet connection with nearby mesh peers" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -25218,6 +25755,12 @@ "value" : "teilt deine internetverbindung mit nahen mesh-peers" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sharing your internet connection with nearby mesh peers" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -25346,6 +25889,186 @@ } } }, + "content.header.notices" : { + "comment" : "Tooltip for the notices button", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إعلانات: منشورات مثبتة لهذه المنطقة وشبكة mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "নোটিশ: এই এলাকা ও মেশের জন্য পিন করা পোস্ট" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hinweise: angeheftete Beiträge für diese Gegend und das Mesh" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notices: pinned posts for this area and the mesh" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avisos: publicaciones fijadas para esta zona y el mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mga paunawa: naka-pin na post para sa lugar na ito at sa mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annonces : publications épinglées pour cette zone et le mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מודעות: פוסטים נעוצים לאזור הזה ול-mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "सूचनाएँ: इस क्षेत्र और मेश के लिए पिन की गई पोस्ट" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pengumuman: kiriman yang disematkan untuk area ini dan mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avvisi: post appuntati per questa zona e il mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "お知らせ: このエリアとmeshのピン留め投稿" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공지: 이 지역과 mesh에 고정된 게시물" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pengumuman: kiriman disemat untuk kawasan ini dan mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सूचनाहरू: यो क्षेत्र र मेशका लागि पिन गरिएका पोस्ट" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mededelingen: vastgeprikte berichten voor deze omgeving en het mesh" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ogłoszenia: przypięte wpisy dla tej okolicy i mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avisos: publicações afixadas para esta zona e o mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avisos: publicações fixadas para esta área e o mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Объявления: закреплённые записи для этого места и mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anslag: uppnålade inlägg för det här området och mesh" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அறிவிப்புகள்: இந்தப் பகுதி மற்றும் மெஷுக்கான பின் செய்யப்பட்ட பதிவுகள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ประกาศ: โพสต์ที่ปักหมุดสำหรับบริเวณนี้และ mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duyurular: bu bölge ve mesh için sabitlenmiş gönderiler" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Оголошення: закріплені дописи для цієї місцевості та mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "اعلانات: اس علاقے اور mesh کیلئے پن شدہ پوسٹس" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thông báo: bài ghim cho khu vực này và mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "公告:此区域和 mesh 的置顶帖子" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "公告:此區域和 mesh 的置頂貼文" + } + } + } + }, "content.header.people" : { "extractionState" : "manual", "localizations" : { @@ -25707,12 +26430,6 @@ "content.input.group_placeholder" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "create|invite|leave|list" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -25731,6 +26448,12 @@ "value" : "create|invite|leave|list" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "create|invite|leave|list" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -25859,786 +26582,6 @@ } } }, - "content.input.placeholder.location" : { - "comment" : "Composer placeholder for a public geohash channel, naming it", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "message #%@ — public" - } - }, - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "رسالة #%@ — عام" - } - }, - "bn" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "#%@-এ বার্তা — পাবলিক" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nachricht an #%@ — öffentlich" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "mensaje #%@ — público" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "message vers #%@ — public" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "הודעה ל-#%@ — ציבורי" - } - }, - "hi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "संदेश #%@ — सार्वजनिक" - } - }, - "id" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "pesan #%@ — publik" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "messaggio a #%@ — pubblico" - } - }, - "ja" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "#%@ にメッセージ — 公開" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "#%@ 에 메시지 — 공개" - } - }, - "ms" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "pesan #%@ — awam" - } - }, - "ne" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "#%@ मा सन्देश — सार्वजनिक" - } - }, - "nl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "bericht naar #%@ — openbaar" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "wiadomość #%@ — publiczna" - } - }, - "pt" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "mensagem para #%@ — público" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "сообщение в #%@ — публичное" - } - }, - "sv" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "meddelande #%@ — publikt" - } - }, - "ta" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "#%@ க்கு செய்தி — பொது" - } - }, - "th" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ส่งข้อความถึง #%@ — สาธารณะ" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "mesaj #%@ — herkese açık" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "повідомлення #%@ — публічне" - } - }, - "ur" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "پیغام #%@ — عوامی" - } - }, - "vi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nhắn #%@ — công khai" - } - } - } - }, - "content.input.placeholder.mesh" : { - "comment" : "Composer placeholder for the public mesh channel", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "message #mesh — public, nearby" - } - }, - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "رسالة #mesh — عام، قريب" - } - }, - "bn" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "#mesh-এ বার্তা — পাবলিক, কাছাকাছি" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nachricht an #mesh — öffentlich, in der nähe" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "mensaje #mesh — público, cerca" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "message vers #mesh — public, à proximité" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "הודעה ל-#mesh — ציבורי, קרוב" - } - }, - "hi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "संदेश #mesh — सार्वजनिक, आसपास" - } - }, - "id" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "pesan #mesh — publik, terdekat" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "messaggio a #mesh — pubblico, nelle vicinanze" - } - }, - "ja" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "#mesh にメッセージ — 公開、近くの人へ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "#mesh 에 메시지 — 공개, 근처" - } - }, - "ms" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "pesan #mesh — awam, berdekatan" - } - }, - "ne" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "#mesh मा सन्देश — सार्वजनिक, नजिकको" - } - }, - "nl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "bericht naar #mesh — openbaar, in de buurt" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "wiadomość #mesh — publiczna, w pobliżu" - } - }, - "pt" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "mensagem para #mesh — público, próximo" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "сообщение в #mesh — публичное, рядом" - } - }, - "sv" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "meddelande #mesh — publikt, i närheten" - } - }, - "ta" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "#mesh க்கு செய்தி — பொது, அருகில்" - } - }, - "th" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ส่งข้อความถึง #mesh — สาธารณะ, ใกล้เคียง" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "mesaj #mesh — herkese açık, yakında" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "повідомлення #mesh — публічне, поблизу" - } - }, - "ur" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "پیغام #mesh — عوامی، قریبی" - } - }, - "vi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nhắn #mesh — công khai, gần đây" - } - } - } - }, - "content.input.placeholder.private" : { - "comment" : "Composer placeholder inside a private chat, naming the conversation partner", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "message %@ — private" - } - }, - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "رسالة %@ — خاص" - } - }, - "bn" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@-কে বার্তা — ব্যক্তিগত" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nachricht an %@ — privat" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "mensaje %@ — privado" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "message à %@ — privé" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "הודעה ל-%@ — פרטי" - } - }, - "hi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "संदेश %@ — निजी" - } - }, - "id" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "pesan %@ — pribadi" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "messaggio a %@ — privato" - } - }, - "ja" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@ にメッセージ — プライベート" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@ 에게 메시지 — 비공개" - } - }, - "ms" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "pesan %@ — peribadi" - } - }, - "ne" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@ लाई सन्देश — निजी" - } - }, - "nl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "bericht naar %@ — privé" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "wiadomość do %@ — prywatna" - } - }, - "pt" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "mensagem para %@ — privado" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "сообщение для %@ — личное" - } - }, - "sv" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "meddelande %@ — privat" - } - }, - "ta" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@ க்கு செய்தி — தனிப்பட்டது" - } - }, - "th" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ส่งข้อความถึง %@ — ส่วนตัว" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "mesaj %@ — özel" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "повідомлення %@ — приватне" - } - }, - "ur" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "پیغام %@ — نجی" - } - }, - "vi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "nhắn %@ — riêng tư" - } - } - } - }, - "content.private.caption" : { - "comment" : "Caption above the private chat composer before encryption is established", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "private conversation" - } - }, - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "محادثة خاصة" - } - }, - "bn" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ব্যক্তিগত কথোপকথন" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "privates gespräch" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "conversación privada" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "conversation privée" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "שיחה פרטית" - } - }, - "hi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "निजी बातचीत" - } - }, - "id" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "percakapan pribadi" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "conversazione privata" - } - }, - "ja" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "プライベートな会話" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "비공개 대화" - } - }, - "ms" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "perbualan peribadi" - } - }, - "ne" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "निजी कुराकानी" - } - }, - "nl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "privégesprek" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "rozmowa prywatna" - } - }, - "pt" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "conversa privada" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "личный разговор" - } - }, - "sv" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "privat konversation" - } - }, - "ta" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "தனிப்பட்ட உரையாடல்" - } - }, - "th" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "การสนทนาส่วนตัว" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "özel konuşma" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "приватна розмова" - } - }, - "ur" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "نجی گفتگو" - } - }, - "vi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "cuộc trò chuyện riêng tư" - } - } - } - }, - "content.private.caption_encrypted" : { - "comment" : "Caption above the private chat composer once the session is end-to-end encrypted", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "private · end-to-end encrypted" - } - }, - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "خاص · مشفّر من طرف إلى طرف" - } - }, - "bn" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ব্যক্তিগত · এন্ড-টু-এন্ড এনক্রিপ্টেড" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "privat · end-to-end-verschlüsselt" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "privado · cifrado de extremo a extremo" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "privé · chiffré de bout en bout" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "פרטי · מוצפן מקצה לקצה" - } - }, - "hi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "निजी · एंड-टू-एंड एन्क्रिप्टेड" - } - }, - "id" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "pribadi · terenkripsi ujung ke ujung" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "privato · cifrato end-to-end" - } - }, - "ja" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "プライベート · エンドツーエンド暗号化" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "비공개 · 종단간 암호화" - } - }, - "ms" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "peribadi · terenkripsi ujung ke ujung" - } - }, - "ne" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "निजी · एन्ड-टु-एन्ड सङ्केत" - } - }, - "nl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "privé · end-to-end-versleuteld" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "prywatna · szyfrowana end-to-end" - } - }, - "pt" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "privado · encriptado ponta a ponta" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "лично · сквозное шифрование" - } - }, - "sv" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "privat · end-to-end-krypterad" - } - }, - "ta" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "தனிப்பட்டது · முனை-முதல்-முனை குறியாக்கம்" - } - }, - "th" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ส่วนตัว · เข้ารหัสแบบครบวงจร" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "özel · uçtan uca şifreli" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "приватна · наскрізно зашифрована" - } - }, - "ur" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "نجی · اینڈ ٹو اینڈ خفیہ" - } - }, - "vi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "riêng tư · mã hóa đầu cuối" - } - } - } - }, "content.input.nickname_placeholder" : { "extractionState" : "manual", "localizations" : { @@ -26818,16 +26761,478 @@ } } }, + "content.input.placeholder.location" : { + "comment" : "Composer placeholder for a public geohash channel, naming it", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "رسالة #%@ — عام" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@-এ বার্তা — পাবলিক" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nachricht an #%@ — öffentlich" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "message #%@ — public" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensaje #%@ — público" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "message vers #%@ — public" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הודעה ל-#%@ — ציבורי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "संदेश #%@ — सार्वजनिक" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan #%@ — publik" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "messaggio a #%@ — pubblico" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ にメッセージ — 公開" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ 에 메시지 — 공개" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan #%@ — awam" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ मा सन्देश — सार्वजनिक" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bericht naar #%@ — openbaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wiadomość #%@ — publiczna" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagem para #%@ — público" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "сообщение в #%@ — публичное" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "meddelande #%@ — publikt" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#%@ க்கு செய்தி — பொது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งข้อความถึง #%@ — สาธารณะ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesaj #%@ — herkese açık" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "повідомлення #%@ — публічне" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پیغام #%@ — عوامی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhắn #%@ — công khai" + } + } + } + }, + "content.input.placeholder.mesh" : { + "comment" : "Composer placeholder for the public mesh channel", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "رسالة #mesh — عام، قريب" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh-এ বার্তা — পাবলিক, কাছাকাছি" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nachricht an #mesh — öffentlich, in der nähe" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "message #mesh — public, nearby" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensaje #mesh — público, cerca" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "message vers #mesh — public, à proximité" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הודעה ל-#mesh — ציבורי, קרוב" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "संदेश #mesh — सार्वजनिक, आसपास" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan #mesh — publik, terdekat" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "messaggio a #mesh — pubblico, nelle vicinanze" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh にメッセージ — 公開、近くの人へ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh 에 메시지 — 공개, 근처" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan #mesh — awam, berdekatan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh मा सन्देश — सार्वजनिक, नजिकको" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bericht naar #mesh — openbaar, in de buurt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wiadomość #mesh — publiczna, w pobliżu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagem para #mesh — público, próximo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "сообщение в #mesh — публичное, рядом" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "meddelande #mesh — publikt, i närheten" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "#mesh க்கு செய்தி — பொது, அருகில்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งข้อความถึง #mesh — สาธารณะ, ใกล้เคียง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesaj #mesh — herkese açık, yakında" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "повідомлення #mesh — публічне, поблизу" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پیغام #mesh — عوامی، قریبی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhắn #mesh — công khai, gần đây" + } + } + } + }, + "content.input.placeholder.private" : { + "comment" : "Composer placeholder inside a private chat, naming the conversation partner", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "رسالة %@ — خاص" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@-কে বার্তা — ব্যক্তিগত" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nachricht an %@ — privat" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "message %@ — private" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensaje %@ — privado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "message à %@ — privé" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הודעה ל-%@ — פרטי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "संदेश %@ — निजी" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan %@ — pribadi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "messaggio a %@ — privato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ にメッセージ — プライベート" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 에게 메시지 — 비공개" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pesan %@ — peribadi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ लाई सन्देश — निजी" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bericht naar %@ — privé" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wiadomość do %@ — prywatna" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagem para %@ — privado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "сообщение для %@ — личное" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "meddelande %@ — privat" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ க்கு செய்தி — தனிப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่งข้อความถึง %@ — ส่วนตัว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesaj %@ — özel" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "повідомлення %@ — приватне" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پیغام %@ — نجی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nhắn %@ — riêng tư" + } + } + } + }, "content.input.token_placeholder" : { "comment" : "Placeholder shown after /pay in the command suggestion panel", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "token" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -26846,6 +27251,12 @@ "value" : "token" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "token" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -26978,12 +27389,6 @@ "comment" : "Count of messages that arrived while scrolled up, shown in the jump-to-latest pill", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "%lld new" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -27002,6 +27407,12 @@ "value" : "%lld neu" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld new" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -28387,12 +28798,6 @@ "comment" : "Context menu action copying a Cashu token to the pasteboard", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "copy token" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -28411,6 +28816,12 @@ "value" : "token kopieren" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "copy token" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -28722,12 +29133,6 @@ "comment" : "Context menu action opening a Cashu token in an ecash wallet app", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "redeem in wallet" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -28746,6 +29151,12 @@ "value" : "in wallet einlösen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "redeem in wallet" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -28878,12 +29289,6 @@ "comment" : "Context menu action opening a Cashu token in the web redemption page", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "redeem on web" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -28902,6 +29307,12 @@ "value" : "im web einlösen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "redeem on web" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -29030,15 +29441,321 @@ } } }, - "content.private.caption_group" : { + "content.private.caption" : { + "comment" : "Caption above the private chat composer before encryption is established", "extractionState" : "manual", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "محادثة خاصة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ব্যক্তিগত কথোপকথন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privates gespräch" + } + }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "encrypted group · members only" + "value" : "private conversation" } }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "conversación privada" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "conversation privée" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שיחה פרטית" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी बातचीत" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "percakapan pribadi" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "conversazione privata" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "プライベートな会話" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "비공개 대화" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "perbualan peribadi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी कुराकानी" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privégesprek" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "rozmowa prywatna" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "conversa privada" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "личный разговор" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privat konversation" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "தனிப்பட்ட உரையாடல்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "การสนทนาส่วนตัว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "özel konuşma" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "приватна розмова" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نجی گفتگو" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cuộc trò chuyện riêng tư" + } + } + } + }, + "content.private.caption_encrypted" : { + "comment" : "Caption above the private chat composer once the session is end-to-end encrypted", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "خاص · مشفّر من طرف إلى طرف" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ব্যক্তিগত · এন্ড-টু-এন্ড এনক্রিপ্টেড" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privat · end-to-end-verschlüsselt" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "private · end-to-end encrypted" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "privado · cifrado de extremo a extremo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privé · chiffré de bout en bout" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "פרטי · מוצפן מקצה לקצה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी · एंड-टू-एंड एन्क्रिप्टेड" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pribadi · terenkripsi ujung ke ujung" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privato · cifrato end-to-end" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "プライベート · エンドツーエンド暗号化" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "비공개 · 종단간 암호화" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "peribadi · terenkripsi ujung ke ujung" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "निजी · एन्ड-टु-एन्ड सङ्केत" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privé · end-to-end-versleuteld" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "prywatna · szyfrowana end-to-end" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privado · encriptado ponta a ponta" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "лично · сквозное шифрование" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privat · end-to-end-krypterad" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "தனிப்பட்டது · முனை-முதல்-முனை குறியாக்கம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ส่วนตัว · เข้ารหัสแบบครบวงจร" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "özel · uçtan uca şifreli" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "приватна · наскрізно зашифрована" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "نجی · اینڈ ٹو اینڈ خفیہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "riêng tư · mã hóa đầu cuối" + } + } + } + }, + "content.private.caption_group" : { + "extractionState" : "manual", + "localizations" : { "ar" : { "stringUnit" : { "state" : "needs_review", @@ -29057,6 +29774,12 @@ "value" : "verschlüsselte gruppe · nur mitglieder" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "encrypted group · members only" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -31695,12 +32418,6 @@ "comment" : "Badge shown when a peer is vouched for by people the user verified but not directly verified", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "✓ VOUCHED" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -31719,6 +32436,12 @@ "value" : "✓ VERBÜRGT" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ VOUCHED" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -32388,6 +33111,24 @@ "comment" : "How many people the user verified have vouched for this peer", "extractionState" : "manual", "localizations" : { + "bn" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনি যাচাই করেছেন এমন %d জনের দ্বারা সমর্থিত" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "আপনি যাচাই করেছেন এমন %d জনের দ্বারা সমর্থিত" + } + } + } + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -32416,24 +33157,6 @@ } } }, - "bn" : { - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "আপনি যাচাই করেছেন এমন %d জনের দ্বারা সমর্থিত" - } - }, - "other" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "আপনি যাচাই করেছেন এমন %d জনের দ্বারা সমর্থিত" - } - } - } - } - }, "es" : { "stringUnit" : { "state" : "translated", @@ -32609,12 +33332,6 @@ "formatSpecifier" : "lld", "variations" : { "plural" : { - "one" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%d человек" - } - }, "few" : { "stringUnit" : { "state" : "needs_review", @@ -32627,6 +33344,12 @@ "value" : "%d человек" } }, + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d человек" + } + }, "other" : { "stringUnit" : { "state" : "needs_review", @@ -33780,12 +34503,6 @@ "comment" : "State label for someone physically in the location channel's area", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "in this area" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -33804,6 +34521,12 @@ "value" : "in diesem gebiet" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "in this area" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -33936,12 +34659,6 @@ "comment" : "State label for someone who joined the location channel from elsewhere", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "teleported from elsewhere" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -33960,6 +34677,12 @@ "value" : "von woanders teleportiert" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "teleported from elsewhere" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -34092,12 +34815,6 @@ "comment" : "State label marking your own row in the people list", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "you" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -34116,6 +34833,12 @@ "value" : "du" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -34605,12 +35328,6 @@ "groups.accessibility.open_group_hint" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Opens the group chat" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -34629,6 +35346,12 @@ "value" : "Öffnet den gruppenchat" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opens the group chat" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -34760,12 +35483,6 @@ "groups.member_count %@" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "(%@)" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -34784,6 +35501,12 @@ "value" : "(%@)" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "(%@)" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -34915,12 +35638,6 @@ "groups.section.header" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "groups" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -34939,6 +35656,12 @@ "value" : "gruppen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -35070,12 +35793,6 @@ "groups.state.creator" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Creator" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -35094,6 +35811,12 @@ "value" : "Ersteller" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Creator" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -35222,16 +35945,189 @@ } } }, + "Images are only available in mesh chats." : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الصور متاحة فقط في محادثات الميش." + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "ছবি শুধু মেশ চ্যাটে উপলব্ধ।" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bilder sind nur im Mesh-Chat verfügbar." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Images are only available in mesh chats." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Las imágenes solo están disponibles en los chats de mesh." + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ang mga larawan ay available lamang sa mga mesh chat." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Les images sont uniquement disponibles dans les discussions mesh." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "תמונות זמינות רק בצ׳אט של mesh." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "चित्र केवल मेश चैट में ही उपलब्ध हैं।" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gambar hanya tersedia di obrolan mesh." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le immagini sono disponibili solo nelle chat mesh." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "画像はメッシュチャットでのみ利用できます。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이미지는 메쉬 채팅에서만 사용할 수 있습니다." + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Imej hanya tersedia dalam sembang mesh." + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "तस्बिरहरू केवल मेष च्याटमा मात्र उपलब्ध छन्।" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afbeeldingen zijn alleen beschikbaar in mesh-chats." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obrazy są dostępne tylko na czatach mesh." + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "As imagens só estão disponíveis nos chats mesh." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "As imagens só estão disponíveis nos chats mesh." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Изображения доступны только в mesh-чатах." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bilder är bara tillgängliga i mesh-chattar." + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "படங்கள் மெஷ் உரையாடல்களில் மட்டுமே கிடைக்கும்." + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "รูปภาพใช้งานได้เฉพาะในแชต mesh เท่านั้น" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Görseller yalnızca mesh sohbetlerinde kullanılabilir." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Зображення доступні лише в mesh-чатах." + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "تصاویر صرف میش چیٹس میں دستیاب ہیں۔" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hình ảnh chỉ khả dụng trong các cuộc trò chuyện mesh." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "图片仅可在 mesh 聊天中使用。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "圖片僅能在 mesh 聊天中使用。" + } + } + } + }, "location_channels.accessibility.add_bookmark" : { "comment" : "Accessibility action name for bookmarking a channel", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "bookmark channel" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -35250,6 +36146,12 @@ "value" : "kanal mit lesezeichen versehen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "bookmark channel" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -35382,12 +36284,6 @@ "comment" : "Accessibility action name for removing a channel bookmark", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "remove bookmark" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -35406,6 +36302,12 @@ "value" : "lesezeichen entfernen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "remove bookmark" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -35538,12 +36440,6 @@ "comment" : "Accessibility hint on a channel row explaining activation switches to it", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "switches to this channel" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -35562,6 +36458,12 @@ "value" : "wechselt zu diesem kanal" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "switches to this channel" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -36947,12 +37849,6 @@ "comment" : "Explanation under the internet gateway toggle", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "share your internet with nearby mesh peers so their geohash messages reach the network" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -36971,6 +37867,12 @@ "value" : "teile dein internet mit nahen mesh-peers, damit ihre geohash-nachrichten das netzwerk erreichen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "share your internet with nearby mesh peers so their geohash messages reach the network" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -37103,12 +38005,6 @@ "comment" : "Title for the internet gateway toggle in the location channels sheet", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "internet gateway" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -37127,6 +38023,12 @@ "value" : "internet-gateway" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "internet gateway" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -43218,12 +44120,6 @@ "comment" : "Accessibility label for the cancel button on an in-flight media send", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "cancel sending" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -43242,6 +44138,12 @@ "value" : "senden abbrechen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "cancel sending" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -43374,12 +44276,6 @@ "comment" : "Accessibility label for a blurred incoming image", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "hidden image" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -43398,6 +44294,12 @@ "value" : "verstecktes bild" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "hidden image" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -43530,12 +44432,6 @@ "comment" : "Accessibility hint for a revealed image; activating it opens the image full screen", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "opens the image full screen" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -43554,6 +44450,12 @@ "value" : "öffnet das bild im vollbild" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "opens the image full screen" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -43686,12 +44588,6 @@ "comment" : "Accessibility hint for a blurred image; activating it reveals the image", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "reveals the image" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -43710,6 +44606,12 @@ "value" : "zeigt das bild" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "reveals the image" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -43842,12 +44744,6 @@ "comment" : "Accessibility label for a revealed image", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "image" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -43866,6 +44762,12 @@ "value" : "bild" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "image" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -43998,12 +44900,6 @@ "comment" : "Accessibility label for an image that is still sending", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "sending image" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -44022,6 +44918,12 @@ "value" : "bild wird gesendet" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "sending image" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -44150,16 +45052,166 @@ } } }, + "media.image.accessibility.unavailable" : { + "comment" : "Accessibility label for an image whose file could not be loaded", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "الصورة غير متاحة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ছবি অনুপলব্ধ" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild nicht verfügbar" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "image unavailable" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "imagen no disponible" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "image indisponible" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "התמונה לא זמינה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "चित्र उपलब्ध नहीं" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gambar tidak tersedia" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "immagine non disponibile" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "画像を利用できません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "이미지를 사용할 수 없음" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imej tidak tersedia" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "तस्बिर उपलब्ध छैन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "afbeelding niet beschikbaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "obraz niedostępny" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imagem indisponível" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "изображение недоступно" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bild otillgänglig" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "படம் கிடைக்கவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่สามารถใช้รูปภาพได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "görsel kullanılamıyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "зображення недоступне" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تصویر دستیاب نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hình ảnh không khả dụng" + } + } + } + }, "media.image.action.delete" : { "comment" : "Context menu action that deletes a received image", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "delete image" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -44178,6 +45230,12 @@ "value" : "bild löschen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "delete image" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -44310,12 +45368,6 @@ "comment" : "Context menu action that re-blurs a revealed image", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "hide image" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -44334,6 +45386,12 @@ "value" : "bild verbergen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "hide image" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -44466,12 +45524,6 @@ "comment" : "Context menu action that opens an image full screen", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "open image" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -44490,6 +45542,12 @@ "value" : "bild öffnen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "open image" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -44622,12 +45680,6 @@ "comment" : "Context menu action that reveals a blurred image", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "reveal image" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -44646,6 +45698,12 @@ "value" : "bild anzeigen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "reveal image" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -44778,12 +45836,6 @@ "comment" : "Body of the confirmation dialog before deleting a received image", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "this cannot be undone — the sender may not be in range to send it again." - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -44802,6 +45854,12 @@ "value" : "das kann nicht rückgängig gemacht werden — der absender ist möglicherweise nicht in reichweite, um es erneut zu senden." } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "this cannot be undone — the sender may not be in range to send it again." + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -44934,12 +45992,6 @@ "comment" : "Title of the confirmation dialog before deleting a received image", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "delete this image?" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -44958,6 +46010,12 @@ "value" : "dieses bild löschen?" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "delete this image?" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -45090,12 +46148,6 @@ "comment" : "Caption on a blurred incoming image inviting a tap to reveal it", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "tap to reveal" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -45114,6 +46166,12 @@ "value" : "zum anzeigen tippen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "tap to reveal" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -45246,12 +46304,6 @@ "comment" : "Accessibility label for pausing voice note playback", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "pause voice note" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -45270,6 +46322,12 @@ "value" : "sprachnachricht pausieren" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "pause voice note" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -45402,12 +46460,6 @@ "comment" : "Accessibility label for playing a voice note", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "play voice note" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -45426,6 +46478,12 @@ "value" : "sprachnachricht abspielen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "play voice note" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -45558,12 +46616,6 @@ "comment" : "Accessibility hint on a peer row explaining activation opens a private chat", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "opens a private chat" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -45582,6 +46634,12 @@ "value" : "öffnet einen privaten chat" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "opens a private chat" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -45714,12 +46772,6 @@ "comment" : "Context menu action that shows a peer's fingerprint/verification screen", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "show fingerprint" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -45738,6 +46790,12 @@ "value" : "fingerabdruck anzeigen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "show fingerprint" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -45870,12 +46928,6 @@ "comment" : "State label for a blocked peer", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "blocked" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -45894,6 +46946,12 @@ "value" : "blockiert" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -46026,12 +47084,6 @@ "comment" : "State label for a favorited peer", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "favorite" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -46050,6 +47102,12 @@ "value" : "favorit" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorite" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -46182,12 +47240,6 @@ "comment" : "State label for a peer that is not currently reachable", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "offline" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -46206,6 +47258,12 @@ "value" : "offline" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "offline" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -46338,12 +47396,6 @@ "comment" : "State label for a peer with unread private messages", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "new messages" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -46362,6 +47414,12 @@ "value" : "neue nachrichten" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "new messages" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -46494,12 +47552,6 @@ "comment" : "State label for a peer vouched for by someone the user verified", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "vouched" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -46518,6 +47570,12 @@ "value" : "verbürgt" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "vouched" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -46829,12 +47887,6 @@ "comment" : "Tooltip for the vouched (unfilled seal) badge next to a peer", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "vouched for by someone you verified" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -46853,6 +47905,12 @@ "value" : "verbürgt von jemandem, den du verifiziert hast" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "vouched for by someone you verified" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -46981,6 +48039,1806 @@ } } }, + "notices.accessibility.close" : { + "comment" : "Accessibility label for the notices close button", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إغلاق الإعلانات" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "নোটিশ বন্ধ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hinweise schließen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Close notices" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cerrar avisos" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Isara ang mga paunawa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fermer les annonces" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "סגור מודעות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "सूचनाएँ बंद करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tutup pengumuman" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiudi avvisi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "お知らせを閉じる" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공지 닫기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tutup pengumuman" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सूचना बन्द गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mededelingen sluiten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zamknij ogłoszenia" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fechar avisos" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fechar avisos" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Закрыть объявления" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stäng anslag" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அறிவிப்புகளை மூடு" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ปิดประกาศ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duyuruları kapat" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Закрити оголошення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "اعلانات بند کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đóng thông báo" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭公告" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "關閉公告" + } + } + } + }, + "notices.accessibility.scope" : { + "comment" : "Accessibility label for the geo/mesh scope toggle", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "نطاق الإعلانات" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "নোটিশের পরিধি" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bereich der Hinweise" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notices scope" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ámbito de los avisos" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Saklaw ng mga paunawa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Portée des annonces" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "טווח המודעות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "सूचनाओं का दायरा" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cakupan pengumuman" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ambito degli avvisi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "お知らせの範囲" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공지 범위" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skop pengumuman" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सूचनाको दायरा" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bereik van mededelingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zakres ogłoszeń" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Âmbito dos avisos" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Escopo dos avisos" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Раздел объявлений" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anslagens omfattning" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அறிவிப்புகளின் வரம்பு" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ขอบเขตประกาศ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duyuru kapsamı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Розділ оголошень" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "اعلانات کا دائرہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Phạm vi thông báo" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "公告范围" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "公告範圍" + } + } + } + }, + "notices.alert.urgent_collapsed" : { + "comment" : "Local chat line when several urgent notices arrive together", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld إعلانات عاجلة جديدة — اضغط على الدبوس للعرض" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lldটি নতুন জরুরি নোটিশ — দেখতে পিনে ট্যাপ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld neue dringende hinweise — tippe zum ansehen auf den pin" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld new urgent notices — tap the pin to view" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld avisos urgentes nuevos — toca el pin para verlos" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld bagong agarang paunawa — i-tap ang pin para makita" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld nouvelles annonces urgentes — touche l'épingle pour voir" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld מודעות דחופות חדשות — הקש על הנעץ לצפייה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld नई ज़रूरी सूचनाएँ — देखने के लिए पिन टैप करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld pengumuman mendesak baru — ketuk pin untuk melihat" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld nuovi avvisi urgenti — tocca la puntina per vederli" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 新しい緊急のお知らせが%lld件 — ピンをタップして表示" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 새 긴급 공지 %lld개 — 핀을 탭하여 확인" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld pengumuman segera baharu — ketik pin untuk melihat" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld नयाँ जरुरी सूचना — हेर्न पिन ट्याप गर" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld nieuwe dringende mededelingen — tik op de pin om te bekijken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld nowych pilnych ogłoszeń — dotknij pinezki, aby zobaczyć" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld novos avisos urgentes — toca no pin para ver" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld avisos urgentes novos — toque no pin para ver" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld новых срочных объявлений — нажми на булавку, чтобы посмотреть" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld nya brådskande anslag — tryck på nålen för att visa" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld புதிய அவசர அறிவிப்புகள் — பார்க்க பின்னைத் தட்டவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 ประกาศด่วนใหม่ %lld รายการ — แตะหมุดเพื่อดู" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld yeni acil duyuru — görmek için raptiyeye dokun" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld нових термінових оголошень — натисни на шпильку, щоб переглянути" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld نئے فوری اعلانات — دیکھنے کیلئے پن پر ٹیپ کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld thông báo khẩn mới — chạm vào ghim để xem" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld 条新紧急公告 — 点按图钉查看" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 %lld 則新緊急公告 — 點按圖釘查看" + } + } + } + }, + "notices.alert.urgent_single" : { + "comment" : "Local chat line when one urgent notice is pinned nearby", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 إعلان عاجل من @%@: %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 @%@-এর জরুরি নোটিশ: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 dringender hinweis von @%@: %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 urgent notice from @%@: %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 aviso urgente de @%@: %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 agarang paunawa mula kay @%@: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 annonce urgente de @%@ : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 מודעה דחופה מאת @%@: %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 @%@ की ज़रूरी सूचना: %@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 pengumuman mendesak dari @%@: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 avviso urgente da @%@: %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 @%@からの緊急のお知らせ: %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 @%@님의 긴급 공지: %@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 pengumuman segera daripada @%@: %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 @%@को जरुरी सूचना: %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 dringende mededeling van @%@: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 pilne ogłoszenie od @%@: %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 aviso urgente de @%@: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 aviso urgente de @%@: %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 срочное объявление от @%@: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 brådskande anslag från @%@: %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 @%@ இன் அவசர அறிவிப்பு: %@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 ประกาศด่วนจาก @%@: %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 @%@ kişisinden acil duyuru: %@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 термінове оголошення від @%@: %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 @%@ کا فوری اعلان: %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 thông báo khẩn từ @%@: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 来自 @%@ 的紧急公告:%@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "📌 來自 @%@ 的緊急公告:%@" + } + } + } + }, + "notices.description.mesh" : { + "comment" : "Explainer for the mesh tab of the notices sheet", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "ثبّت إعلانات قصيرة لمن حولك. تنتقل من هاتف إلى هاتف حتى دون اتصال، وتختفي وحدها بعد أيام قليلة." + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "আশেপাশের মানুষের জন্য ছোট নোটিশ পিন করুন। অফলাইনেও ফোন থেকে ফোনে পৌঁছে যায় আর কয়েক দিন পরে নিজে থেকেই মুছে যায়।" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "hefte kurze hinweise für leute in deiner nähe an. sie springen von handy zu handy, auch offline, und verschwinden nach ein paar tagen von selbst." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "pin short notices for people around you. they hop phone to phone, even offline, and disappear on their own after a few days." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "fija avisos cortos para la gente cercana. saltan de teléfono a teléfono, incluso sin conexión, y desaparecen solos después de unos días." + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "mag-pin ng maiikling paunawa para sa mga taong nasa paligid mo. lumilipat ito mula sa isang telepono patungo sa iba, kahit offline, at kusang nawawala pagkatapos ng ilang araw." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "épingle de courtes annonces pour les gens autour de toi. elles passent de téléphone en téléphone, même hors ligne, et disparaissent d'elles-mêmes après quelques jours." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הצמד מודעות קצרות לאנשים סביבך. הן עוברות מטלפון לטלפון, גם בלי אינטרנט, ונעלמות מעצמן אחרי כמה ימים." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "आस-पास के लोगों के लिए छोटी सूचनाएँ पिन करें। ये ऑफ़लाइन भी फ़ोन से फ़ोन तक पहुँचती हैं और कुछ दिनों बाद अपने आप मिट जाती हैं।" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "sematkan pengumuman singkat untuk orang di sekitarmu. berpindah dari ponsel ke ponsel, bahkan saat offline, dan hilang sendiri setelah beberapa hari." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "appunta brevi avvisi per chi ti sta intorno. passano da telefono a telefono, anche offline, e spariscono da soli dopo qualche giorno." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "近くの人に向けて短いお知らせをピン留め。オフラインでもスマホからスマホへ伝わり、数日後に自動的に消えます。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "주변 사람들을 위해 짧은 공지를 고정하세요. 오프라인에서도 휴대폰에서 휴대폰으로 전달되고 며칠 후 스스로 사라집니다." + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "semat pengumuman ringkas untuk orang di sekeliling anda. ia berpindah dari telefon ke telefon, walaupun di luar talian, dan hilang sendiri selepas beberapa hari." + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "वरपरका मानिसहरूका लागि छोटा सूचना पिन गर। अफलाइनमा पनि फोनबाट फोनमा पुग्छन् र केही दिनपछि आफैँ हराउँछन्।" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "prik korte mededelingen voor mensen om je heen. ze springen van telefoon naar telefoon, ook offline, en verdwijnen vanzelf na een paar dagen." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "przypinaj krótkie ogłoszenia dla ludzi w pobliżu. przeskakują z telefonu na telefon, nawet offline, i same znikają po kilku dniach." + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "afixa avisos curtos para quem está por perto. saltam de telemóvel em telemóvel, mesmo offline, e desaparecem sozinhos após alguns dias." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "fixe avisos curtos para as pessoas por perto. eles pulam de celular em celular, mesmo offline, e somem sozinhos depois de alguns dias." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "закрепляй короткие объявления для людей рядом. они передаются с телефона на телефон, даже офлайн, и сами исчезают через несколько дней." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "nåla upp korta anslag för folk i närheten. de hoppar från telefon till telefon, även offline, och försvinner av sig själva efter några dagar." + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அருகிலுள்ளவர்களுக்காக சிறிய அறிவிப்புகளைப் பின் செய்யவும். ஆஃப்லைனிலும் ஃபோனிலிருந்து ஃபோனுக்குப் பரவி, சில நாட்களில் தானாக மறைந்துவிடும்." + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ปักประกาศสั้น ๆ ให้คนรอบตัว ส่งต่อจากมือถือสู่มือถือได้แม้ออฟไลน์ และหายไปเองหลังผ่านไปสองสามวัน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "çevrendekiler için kısa duyurular sabitle. çevrimdışıyken bile telefondan telefona geçer ve birkaç gün sonra kendiliğinden kaybolur." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "закріплюй короткі оголошення для людей поруч. вони передаються з телефона на телефон, навіть офлайн, і самі зникають за кілька днів." + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "آس پاس کے لوگوں کیلئے مختصر اعلانات پن کریں۔ یہ آف لائن بھی فون سے فون تک پہنچتے ہیں اور کچھ دنوں بعد خود مٹ جاتے ہیں۔" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ghim thông báo ngắn cho những người quanh bạn. chúng truyền từ điện thoại này sang điện thoại khác, kể cả khi ngoại tuyến, và tự biến mất sau vài ngày." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "为周围的人钉上简短公告。即使离线也能在手机间传递,几天后自动消失。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "為周圍的人釘上簡短公告。即使離線也能在手機間傳遞,幾天後自動消失。" + } + } + } + }, + "notices.source.mesh" : { + "comment" : "Source badge for notices carried by the mesh", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + } + } + }, + "notices.source.nostr" : { + "comment" : "Source badge for notices seen on internet relays", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "نت" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "নেট" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "netz" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "net" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "red" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "net" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "net" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "רשת" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "नेट" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "net" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "rete" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ネット" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "넷" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "net" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "नेट" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "net" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "sieć" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "rede" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "rede" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "сеть" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "nät" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "நெட்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เน็ต" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ağ" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "мережа" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "نیٹ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "mạng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "网络" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "網路" + } + } + } + }, + "notices.tab.geo" : { + "comment" : "Segmented control label for geohash-scoped notices", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "جغرافي" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "এলাকা" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "geo" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "geo" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "geo" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "geo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "géo" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אזור" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "क्षेत्र" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "area" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "geo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "エリア" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "지역" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "kawasan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "क्षेत्र" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "geo" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "geo" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "geo" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "geo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "гео" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "geo" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "பகுதி" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "พื้นที่" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "bölge" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "гео" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "علاقہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "khu vực" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "区域" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "區域" + } + } + } + }, + "notices.tab.mesh" : { + "comment" : "Segmented control label for mesh-local notices", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh" + } + } + } + }, + "notices.title" : { + "comment" : "Title prefix of the unified notices sheet", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إعلانات" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "নোটিশ" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "hinweise" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "notices" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "avisos" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "mga paunawa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "annonces" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מודעות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "सूचनाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "pengumuman" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "avvisi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "お知らせ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "pengumuman" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सूचनाहरू" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "mededelingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "ogłoszenia" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "avisos" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "avisos" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "объявления" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "anslag" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அறிவிப்புகள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ประกาศ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "duyurular" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "оголошення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "اعلانات" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "thông báo" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "公告" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "公告" + } + } + } + }, "recording %@" : { "comment" : "Voice note recording duration indicator", "localizations" : { @@ -48417,12 +51275,6 @@ "comment" : "System message when a geohash message was handed to a mesh internet gateway because no relay is reachable", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "sent via mesh gateway" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -48441,6 +51293,12 @@ "value" : "über mesh-gateway gesendet" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent via mesh gateway" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -48930,12 +51788,6 @@ "system.group.already_member" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ is already a member" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -48954,6 +51806,12 @@ "value" : "%@ ist bereits mitglied" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a member" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -49085,12 +51943,6 @@ "system.group.cannot_remove_creator" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "the creator cannot be removed" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -49109,6 +51961,12 @@ "value" : "der ersteller kann nicht entfernt werden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "the creator cannot be removed" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -49240,12 +52098,6 @@ "system.group.create_failed" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "could not create the group" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -49264,6 +52116,12 @@ "value" : "die gruppe konnte nicht erstellt werden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not create the group" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -49395,12 +52253,6 @@ "system.group.created" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "created group '%@' — use /group invite @name to add people" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -49419,6 +52271,12 @@ "value" : "gruppe '%@' erstellt — nutze /group invite @name, um leute hinzuzufügen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "created group '%@' — use /group invite @name to add people" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -49550,12 +52408,6 @@ "system.group.creator_only" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "only the group creator can do that" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -49574,6 +52426,12 @@ "value" : "nur der gruppenersteller kann das tun" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "only the group creator can do that" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -49705,12 +52563,6 @@ "system.group.full" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "group is full (max %@ members)" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -49729,6 +52581,12 @@ "value" : "gruppe ist voll (max. %@ mitglieder)" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "group is full (max %@ members)" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -49860,12 +52718,6 @@ "system.group.identity_unavailable" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "your identity keys are not ready yet" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -49884,6 +52736,12 @@ "value" : "deine identitätsschlüssel sind noch nicht bereit" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "your identity keys are not ready yet" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -50015,12 +52873,6 @@ "system.group.invite_failed" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "could not build the group invite" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -50039,6 +52891,12 @@ "value" : "die gruppeneinladung konnte nicht erstellt werden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not build the group invite" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -50170,12 +53028,6 @@ "system.group.invited" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "invited %1$@ to '%2$@'" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -50194,6 +53046,12 @@ "value" : "%1$@ zu '%2$@' eingeladen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "invited %1$@ to '%2$@'" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -50325,12 +53183,6 @@ "system.group.joined" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "you were added to group '%1$@' by %2$@ — it now appears in your people list" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -50349,6 +53201,12 @@ "value" : "du wurdest von %2$@ zur gruppe '%1$@' hinzugefügt — sie erscheint jetzt in deiner personenliste" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you were added to group '%1$@' by %2$@ — it now appears in your people list" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -50480,12 +53338,6 @@ "system.group.left" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "left group '%@'" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -50504,6 +53356,12 @@ "value" : "gruppe '%@' verlassen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "left group '%@'" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -50635,12 +53493,6 @@ "system.group.list_header" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "your groups:" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -50659,6 +53511,12 @@ "value" : "deine gruppen:" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "your groups:" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -50790,12 +53648,6 @@ "system.group.member_not_found" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "'%@' is not a member of this group" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -50814,6 +53666,12 @@ "value" : "'%@' ist kein mitglied dieser gruppe" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' is not a member of this group" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -50945,12 +53803,6 @@ "system.group.name_too_long" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "group names are limited to 40 characters" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -50969,6 +53821,12 @@ "value" : "gruppennamen sind auf 40 zeichen begrenzt" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "group names are limited to 40 characters" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -51100,12 +53958,6 @@ "system.group.none" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "you are not in any groups — /group create to start one" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -51124,6 +53976,12 @@ "value" : "du bist in keiner gruppe — /group create , um eine zu starten" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you are not in any groups — /group create to start one" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -51255,12 +54113,6 @@ "system.group.not_in_group" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "open a group chat first" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -51279,6 +54131,12 @@ "value" : "öffne zuerst einen gruppenchat" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "open a group chat first" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -51410,12 +54268,6 @@ "system.group.peer_identity_unknown" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "cannot verify %@'s identity yet — wait for their announce" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -51434,6 +54286,12 @@ "value" : "%@s identität kann noch nicht verifiziert werden — warte auf deren announce" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot verify %@'s identity yet — wait for their announce" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -51565,12 +54423,6 @@ "system.group.peer_not_connected" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ must be connected over mesh to be invited" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -51589,6 +54441,12 @@ "value" : "%@ muss über mesh verbunden sein, um eingeladen zu werden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ must be connected over mesh to be invited" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -51720,12 +54578,6 @@ "system.group.peer_not_found" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "'%@' not found" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -51744,6 +54596,12 @@ "value" : "'%@' nicht gefunden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -51875,12 +54733,6 @@ "system.group.removed_from" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "you were removed from group '%@'" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -51899,6 +54751,12 @@ "value" : "du wurdest aus der gruppe '%@' entfernt" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you were removed from group '%@'" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -52030,12 +54888,6 @@ "system.group.removed_member" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "removed %@ and rotated the group key" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -52054,6 +54906,12 @@ "value" : "%@ entfernt und den gruppenschlüssel rotiert" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ and rotated the group key" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -52185,12 +55043,6 @@ "system.group.rotate_failed" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "could not rotate the group key" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -52209,6 +55061,12 @@ "value" : "der gruppenschlüssel konnte nicht rotiert werden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not rotate the group key" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -52340,12 +55198,6 @@ "system.group.send_failed" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "could not encrypt the message" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -52364,6 +55216,12 @@ "value" : "die nachricht konnte nicht verschlüsselt werden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "could not encrypt the message" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -52495,12 +55353,6 @@ "system.group.unknown" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "you are no longer in this group" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -52519,6 +55371,12 @@ "value" : "du bist nicht mehr in dieser gruppe" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "you are no longer in this group" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -52650,12 +55508,6 @@ "system.group.usage_create" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "usage: /group create " - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -52674,6 +55526,12 @@ "value" : "verwendung: /group create " } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create " + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -52805,12 +55663,6 @@ "system.group.usage_invite" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "usage: /group invite @name" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -52829,6 +55681,12 @@ "value" : "verwendung: /group invite @name" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group invite @name" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -52960,12 +55818,6 @@ "system.group.usage_remove" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "usage: /group remove @name" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -52984,6 +55836,12 @@ "value" : "verwendung: /group remove @name" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group remove @name" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -53474,12 +56332,6 @@ "comment" : "System message shown when a mesh peer cannot be blocked", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "cannot block %@: not found or unable to verify identity" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -53498,6 +56350,12 @@ "value" : "%@ kann nicht blockiert werden: nicht gefunden oder identität nicht verifizierbar" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -53630,12 +56488,6 @@ "comment" : "System message shown when a mesh peer is blocked", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "blocked %@. you will no longer receive messages from them" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -53654,6 +56506,12 @@ "value" : "%@ blockiert. du erhältst keine nachrichten mehr von ihnen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -53786,12 +56644,6 @@ "comment" : "System message shown when a mesh peer cannot be unblocked", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "cannot unblock %@: not found" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -53810,6 +56662,12 @@ "value" : "%@ kann nicht entsperrt werden: nicht gefunden" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -53942,12 +56800,6 @@ "comment" : "System message shown when a mesh peer is unblocked", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "unblocked %@" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -53966,6 +56818,12 @@ "value" : "%@ entsperrt" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -54993,12 +57851,6 @@ "comment" : "Caption under the mesh topology map", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "estimated from gossiped neighbor lists (up to 10 per peer) — your device is highlighted" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -55017,6 +57869,12 @@ "value" : "geschätzt aus verbreiteten nachbarlisten (bis zu 10 pro peer) — dein gerät ist hervorgehoben" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated from gossiped neighbor lists (up to 10 per peer) — your device is highlighted" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -55149,12 +58007,6 @@ "comment" : "Empty state of the mesh topology map", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "no mesh links yet — the map fills in as peer announces arrive" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -55173,6 +58025,12 @@ "value" : "noch keine mesh-verbindungen — die karte füllt sich, sobald peer-announces eintreffen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "no mesh links yet — the map fills in as peer announces arrive" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -55305,12 +58163,6 @@ "comment" : "Accessibility label of the topology refresh button", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "refresh topology" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -55329,6 +58181,12 @@ "value" : "topologie aktualisieren" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "refresh topology" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -55461,12 +58319,6 @@ "comment" : "Topology map summary: number of peers and links", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$ld peers · %2$ld links" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -55485,6 +58337,12 @@ "value" : "%1$ld peers · %2$ld verbindungen" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$ld peers · %2$ld links" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -55617,12 +58475,6 @@ "comment" : "Title of the mesh topology map sheet", "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "mesh topology" - } - }, "ar" : { "stringUnit" : { "state" : "needs_review", @@ -55641,6 +58493,12 @@ "value" : "mesh-topologie" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh topology" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -57737,522 +60595,7 @@ } } } - }, - "Images are only available in mesh chats." : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "الصور متاحة فقط في محادثات الميش." - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "ছবি শুধু মেশ চ্যাটে উপলব্ধ।" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bilder sind nur im Mesh-Chat verfügbar." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Images are only available in mesh chats." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Las imágenes solo están disponibles en los chats de mesh." - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ang mga larawan ay available lamang sa mga mesh chat." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Les images sont uniquement disponibles dans les discussions mesh." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "תמונות זמינות רק בצ׳אט של mesh." - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "चित्र केवल मेश चैट में ही उपलब्ध हैं।" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gambar hanya tersedia di obrolan mesh." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le immagini sono disponibili solo nelle chat mesh." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "画像はメッシュチャットでのみ利用できます。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이미지는 메쉬 채팅에서만 사용할 수 있습니다." - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "Imej hanya tersedia dalam sembang mesh." - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "तस्बिरहरू केवल मेष च्याटमा मात्र उपलब्ध छन्।" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Afbeeldingen zijn alleen beschikbaar in mesh-chats." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obrazy są dostępne tylko na czatach mesh." - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "As imagens só estão disponíveis nos chats mesh." - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "As imagens só estão disponíveis nos chats mesh." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Изображения доступны только в mesh-чатах." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bilder är bara tillgängliga i mesh-chattar." - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "படங்கள் மெஷ் உரையாடல்களில் மட்டுமே கிடைக்கும்." - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "รูปภาพใช้งานได้เฉพาะในแชต mesh เท่านั้น" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Görseller yalnızca mesh sohbetlerinde kullanılabilir." - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Зображення доступні лише в mesh-чатах." - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "تصاویر صرف میش چیٹس میں دستیاب ہیں۔" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hình ảnh chỉ khả dụng trong các cuộc trò chuyện mesh." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "图片仅可在 mesh 聊天中使用。" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "圖片僅能在 mesh 聊天中使用。" - } - } - } - }, - "Choose an image" : { - "comment" : "A label displayed above a button that allows the user to choose an image to send.", - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "اختر صورة" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "একটি ছবি নির্বাচন করুন" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bild auswählen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Choose an image" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elige una imagen" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pumili ng larawan" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Choisir une image" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "בחר תמונה" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "एक चित्र चुनें" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pilih gambar" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Scegli un’immagine" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "画像を選択" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이미지를 선택하세요" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pilih imej" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "एउटा तस्वीर चयन गर्नुहोस्" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kies een afbeelding" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wybierz obraz" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Escolher uma imagem" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Escolha uma imagem" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Выберите изображение" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Välj en bild" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "ஒரு படத்தைத் தேர்ந்தெடுக்கவும்" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "เลือกภาพ" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bir görüntü seç" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Виберіть зображення" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "ایک تصویر منتخب کریں" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chọn một hình ảnh" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择图像" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "選擇圖像" - } - } - } - }, - "media.image.accessibility.unavailable" : { - "comment" : "Accessibility label for an image whose file could not be loaded", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "image unavailable" - } - }, - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "الصورة غير متاحة" - } - }, - "bn" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ছবি অনুপলব্ধ" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "bild nicht verfügbar" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "imagen no disponible" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "image indisponible" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "התמונה לא זמינה" - } - }, - "hi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "चित्र उपलब्ध नहीं" - } - }, - "id" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "gambar tidak tersedia" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "immagine non disponibile" - } - }, - "ja" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "画像を利用できません" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "이미지를 사용할 수 없음" - } - }, - "ms" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "imej tidak tersedia" - } - }, - "ne" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "तस्बिर उपलब्ध छैन" - } - }, - "nl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "afbeelding niet beschikbaar" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "obraz niedostępny" - } - }, - "pt" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "imagem indisponível" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "изображение недоступно" - } - }, - "sv" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "bild otillgänglig" - } - }, - "ta" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "படம் கிடைக்கவில்லை" - } - }, - "th" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ไม่สามารถใช้รูปภาพได้" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "görsel kullanılamıyor" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "зображення недоступне" - } - }, - "ur" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "تصویر دستیاب نہیں" - } - }, - "vi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "hình ảnh không khả dụng" - } - } - } } }, "version" : "1.1" -} +} \ No newline at end of file diff --git a/bitchat/Nostr/NostrProtocol.swift b/bitchat/Nostr/NostrProtocol.swift index 83578e2b..7e39bdb4 100644 --- a/bitchat/Nostr/NostrProtocol.swift +++ b/bitchat/Nostr/NostrProtocol.swift @@ -19,6 +19,7 @@ struct NostrProtocol { case giftWrap = 1059 // NIP-59 gift wrap case ephemeralEvent = 20000 case geohashPresence = 20001 + case deletion = 5 // NIP-09 event deletion request } /// Create a NIP-17 private message @@ -256,16 +257,22 @@ struct NostrProtocol { } /// Create a persistent location note (kind 1: text note) tagged to a street-level geohash. + /// An optional `expiresAt` adds a NIP-40 expiration tag so honoring relays + /// drop the note in step with a bridged board post's expiry. static func createGeohashTextNote( content: String, geohash: String, senderIdentity: NostrIdentity, - nickname: String? = nil + nickname: String? = nil, + expiresAt: Date? = nil ) throws -> NostrEvent { var tags = [["g", geohash]] if let nickname = nickname?.trimmedOrNilIfEmpty { tags.append(["n", nickname]) } + if let expiresAt { + tags.append(["expiration", String(Int(expiresAt.timeIntervalSince1970))]) + } let event = NostrEvent( pubkey: senderIdentity.publicKeyHex, createdAt: Date(), @@ -276,7 +283,25 @@ struct NostrProtocol { let schnorrKey = try senderIdentity.schnorrSigningKey() return try event.sign(with: schnorrKey) } - + + /// Create a NIP-09 deletion request for one of our own events. Relays that + /// honor NIP-09 drop the referenced event; it must be signed by the same + /// key that signed the original. + static func createDeleteEvent( + ofEventID eventID: String, + senderIdentity: NostrIdentity + ) throws -> NostrEvent { + let event = NostrEvent( + pubkey: senderIdentity.publicKeyHex, + createdAt: Date(), + kind: .deletion, + tags: [["e", eventID]], + content: "" + ) + let schnorrKey = try senderIdentity.schnorrSigningKey() + return try event.sign(with: schnorrKey) + } + // MARK: - Private Methods private static func createSeal( diff --git a/bitchat/Protocols/Geohash.swift b/bitchat/Protocols/Geohash.swift index f436ea27..6fbb2b90 100644 --- a/bitchat/Protocols/Geohash.swift +++ b/bitchat/Protocols/Geohash.swift @@ -18,6 +18,14 @@ enum Geohash { return geohash.lowercased().allSatisfy { base32Map[$0] != nil } } + /// Validates a geohash string at any channel precision (1-12 characters). + /// - Parameter geohash: The geohash string to validate + /// - Returns: true if a non-empty base32 geohash of at most 12 characters + static func isValidGeohash(_ geohash: String) -> Bool { + guard (1...12).contains(geohash.count) else { return false } + return geohash.lowercased().allSatisfy { base32Map[$0] != nil } + } + /// Encodes the provided coordinates into a geohash string. /// - Parameters: /// - latitude: Latitude in degrees (-90...90) diff --git a/bitchat/Services/Board/BoardAlertsModel.swift b/bitchat/Services/Board/BoardAlertsModel.swift new file mode 100644 index 00000000..35daedfe --- /dev/null +++ b/bitchat/Services/Board/BoardAlertsModel.swift @@ -0,0 +1,160 @@ +// +// BoardAlertsModel.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Combine +import Foundation + +/// Turns newly arriving board posts into local, scope-matched chat alerts. +/// Everything here is derived from posts the mesh already synced — no extra +/// wire traffic, nothing another peer can't already see. +/// +/// - Urgent, recent pins get one system line in the matching chat (geo pin → +/// that geohash's timeline, mesh pin → mesh chat), collapsed when several +/// arrive together. +/// - Every other new pin just marks the header's pin icon until the notices +/// sheet is opened. +@MainActor +final class BoardAlertsModel: ObservableObject { + struct Dependencies { + /// Own posts never alert; the author already knows. + var isOwnPost: @MainActor (BoardPostPacket) -> Bool + /// Appends a local system line to a scope's chat timeline + /// (geohash, or "" for mesh chat). + var emitSystemLine: @MainActor (_ content: String, _ geohash: String) -> Void + var now: () -> Date = Date.init + /// Schedules the collapsed flush of pending urgent alerts; tests + /// inject a synchronous hook. + var scheduleFlush: (_ flush: @escaping @MainActor () -> Void) -> Void = { flush in + Task { @MainActor in + try? await Task.sleep(nanoseconds: UInt64(BoardAlertsModel.collapseDelaySeconds * 1_000_000_000)) + flush() + } + } + } + + /// Posts older than this at arrival are backfilled history carried in by + /// a peer, not something happening now; they badge but never line the chat. + static let inlineRecencyWindow: TimeInterval = 30 * 60 + /// Urgent arrivals within this window collapse into one line. + static let collapseDelaySeconds: TimeInterval = 4 + private static let alertContentMaxChars = 120 + + /// Unseen new pins by postID (hex) → geohash scope, cleared when the + /// notices sheet opens. + @Published private(set) var unseenPostScopes: [String: String] = [:] + + /// PostIDs already handled this session, so store eviction/re-sync churn + /// can't re-alert. Bounded by session wire volume (32-byte strings). + private var handledPostIDs = Set() + private var pendingUrgent: [String: [BoardPostPacket]] = [:] + private var flushScheduled = false + private let dependencies: Dependencies + private var cancellable: AnyCancellable? + private var wipeCancellable: AnyCancellable? + + private enum Strings { + static func urgentSingle(author: String, content: String) -> String { + String( + format: String(localized: "notices.alert.urgent_single", defaultValue: "📌 urgent notice from @%@: %@", comment: "Local chat line when one urgent notice is pinned nearby"), + locale: .current, + author, content + ) + } + + static func urgentCollapsed(_ count: Int) -> String { + String( + format: String(localized: "notices.alert.urgent_collapsed", defaultValue: "📌 %lld new urgent notices — tap the pin to view", comment: "Local chat line when several urgent notices arrive together"), + locale: .current, + count + ) + } + } + + init( + arrivals: AnyPublisher, + wipes: AnyPublisher = Empty(completeImmediately: false).eraseToAnyPublisher(), + dependencies: Dependencies + ) { + self.dependencies = dependencies + cancellable = arrivals + .receive(on: DispatchQueue.main) + .sink { [weak self] post in + self?.handleArrival(post) + } + wipeCancellable = wipes + .receive(on: DispatchQueue.main) + .sink { [weak self] in + self?.reset() + } + } + + func unseenCount(forGeohash geohash: String) -> Int { + unseenPostScopes.values.reduce(0) { $0 + ($1 == geohash ? 1 : 0) } + } + + /// Marks pins in the given scopes as seen — only the scopes the notices + /// sheet actually shows, so unseen pins for other geohash channels keep + /// their badge until visited. + func markSeen(forScopes scopes: Set) { + guard unseenPostScopes.contains(where: { scopes.contains($0.value) }) else { return } + unseenPostScopes = unseenPostScopes.filter { !scopes.contains($0.value) } + } + + /// Panic wipe: drop everything derived from pre-wipe posts, including + /// urgent lines still waiting on the collapse flush. + func reset() { + pendingUrgent.removeAll() + handledPostIDs.removeAll() + guard !unseenPostScopes.isEmpty else { return } + unseenPostScopes.removeAll() + } + + func handleArrival(_ post: BoardPostPacket) { + let postID = post.postID.hexEncodedString() + guard !handledPostIDs.contains(postID) else { return } + handledPostIDs.insert(postID) + guard !dependencies.isOwnPost(post) else { return } + + unseenPostScopes[postID] = post.geohash + + let createdAt = Date(timeIntervalSince1970: TimeInterval(post.createdAt) / 1000) + guard post.isUrgent, + dependencies.now().timeIntervalSince(createdAt) <= Self.inlineRecencyWindow else { + return + } + pendingUrgent[post.geohash, default: []].append(post) + if !flushScheduled { + flushScheduled = true + dependencies.scheduleFlush { [weak self] in + self?.flushPendingUrgent() + } + } + } + + private func flushPendingUrgent() { + flushScheduled = false + let pending = pendingUrgent + pendingUrgent.removeAll() + for (geohash, posts) in pending { + guard let first = posts.first else { continue } + let line: String + if posts.count == 1 { + let author = first.authorNickname.trimmedOrNilIfEmpty ?? "anon" + line = Strings.urgentSingle(author: author, content: Self.truncated(first.content)) + } else { + line = Strings.urgentCollapsed(posts.count) + } + dependencies.emitSystemLine(line, geohash) + } + } + + private static func truncated(_ content: String) -> String { + guard content.count > alertContentMaxChars else { return content } + return content.prefix(alertContentMaxChars) + "…" + } +} diff --git a/bitchat/Services/Board/BoardManager.swift b/bitchat/Services/Board/BoardManager.swift index 989fda34..1f307bd4 100644 --- a/bitchat/Services/Board/BoardManager.swift +++ b/bitchat/Services/Board/BoardManager.swift @@ -20,17 +20,28 @@ final class BoardManager: ObservableObject { private let transport: Transport private let store: BoardStore - private let publishToNostr: (_ content: String, _ geohash: String, _ nickname: String) -> Void + /// Publishes a bridged kind-1 note (expiring with the board post via + /// NIP-40) and returns its Nostr event id, or nil when bridging failed or + /// was skipped. + private let publishToNostr: (_ content: String, _ geohash: String, _ nickname: String, _ expiresAtMs: UInt64) -> String? + /// Requests NIP-09 deletion of a previously bridged note. + private let deleteFromNostr: (_ eventID: String, _ geohash: String) -> Void + /// Bridged Nostr event ids by postID, for merged deletes. In-memory only: + /// after a relaunch a delete still tombstones the board copy, but the + /// Nostr copy is left to expire with relay retention. + private var bridgedEventIDs: [Data: String] = [:] private var cancellable: AnyCancellable? init( transport: Transport, store: BoardStore = .shared, - publishToNostr: ((String, String, String) -> Void)? = nil + publishToNostr: ((String, String, String, UInt64) -> String?)? = nil, + deleteFromNostr: ((String, String) -> Void)? = nil ) { self.transport = transport self.store = store self.publishToNostr = publishToNostr ?? Self.livePublishToNostr + self.deleteFromNostr = deleteFromNostr ?? Self.liveDeleteFromNostr cancellable = store.$postsSnapshot .receive(on: DispatchQueue.main) .sink { [weak self] snapshot in @@ -115,10 +126,10 @@ final class BoardManager: ObservableObject { ) transport.sendBoardPayload(BoardWire.post(post).encode()) - // One-way Nostr bridge (v1): geohash posts also go out as kind-1 - // location notes so online users see them. No inbound merge yet. - if !geohash.isEmpty { - publishToNostr(trimmed, geohash, cleanNickname) + // Nostr bridge: geohash posts also go out as kind-1 location notes so + // online users see them. Remember the event id for merged deletes. + if !geohash.isEmpty, let eventID = publishToNostr(trimmed, geohash, cleanNickname, expiresAt) { + bridgedEventIDs[postID] = eventID } return true } @@ -140,14 +151,20 @@ final class BoardManager: ObservableObject { signature: signature ) transport.sendBoardPayload(BoardWire.tombstone(tombstone).encode()) + + // Merged delete: also retract the bridged Nostr copy when we still + // know its event id. + if !post.geohash.isEmpty, let eventID = bridgedEventIDs.removeValue(forKey: post.postID) { + deleteFromNostr(eventID, post.geohash) + } return true } - private static func livePublishToNostr(content: String, geohash: String, nickname: String) { + private static func livePublishToNostr(content: String, geohash: String, nickname: String, expiresAtMs: UInt64) -> String? { let relays = GeoRelayDirectory.shared.closestRelays(toGeohash: geohash, count: TransportConfig.nostrGeoRelayCount) guard !relays.isEmpty else { SecureLogger.debug("Board: no geo relays for \(geohash); skipping Nostr bridge", category: .session) - return + return nil } do { let identity = try NostrIdentityBridge().deriveIdentity(forGeohash: geohash) @@ -155,11 +172,26 @@ final class BoardManager: ObservableObject { content: content, geohash: geohash, senderIdentity: identity, - nickname: nickname + nickname: nickname, + expiresAt: Date(timeIntervalSince1970: TimeInterval(expiresAtMs) / 1000) ) NostrRelayManager.shared.sendEvent(event, to: relays) + return event.id } catch { SecureLogger.error("Board: failed to bridge post to Nostr: \(error)", category: .session) + return nil + } + } + + private static func liveDeleteFromNostr(eventID: String, geohash: String) { + let relays = GeoRelayDirectory.shared.closestRelays(toGeohash: geohash, count: TransportConfig.nostrGeoRelayCount) + guard !relays.isEmpty else { return } + do { + let identity = try NostrIdentityBridge().deriveIdentity(forGeohash: geohash) + let deletion = try NostrProtocol.createDeleteEvent(ofEventID: eventID, senderIdentity: identity) + NostrRelayManager.shared.sendEvent(deletion, to: relays) + } catch { + SecureLogger.error("Board: failed to delete bridged Nostr note: \(error)", category: .session) } } } diff --git a/bitchat/Services/Board/BoardStore.swift b/bitchat/Services/Board/BoardStore.swift index 8ffdf7f3..c96670d0 100644 --- a/bitchat/Services/Board/BoardStore.swift +++ b/bitchat/Services/Board/BoardStore.swift @@ -78,6 +78,16 @@ final class BoardStore { /// Live posts, published on the main thread for the board UI. @Published private(set) var postsSnapshot: [BoardPostPacket] = [] + /// Fires on the main thread for each post newly accepted from the wire + /// (radio, sync, or local echo) — not for disk restores. Drives the + /// local new-pin chat alerts; duplicates never fire twice because the + /// store rejects them. + let postArrivals = PassthroughSubject() + + /// Fires on the main thread after a panic wipe so derived state (pending + /// alerts, unseen badges) is dropped along with the posts themselves. + let didWipe = PassthroughSubject() + private var posts: [StoredPost] = [] private var tombstones: [StoredTombstone] = [] private let queue = DispatchQueue(label: "chat.bitchat.board.store") @@ -104,6 +114,11 @@ final class BoardStore { let result = ingestLocked(wire, packet: packet, rawPacket: rawPacket, nowMs: nowMs) if result == .accepted { persistLocked() + if case .post(let post) = wire { + DispatchQueue.main.async { [weak self] in + self?.postArrivals.send(post) + } + } } return result } @@ -149,6 +164,9 @@ final class BoardStore { } publishSnapshotLocked() } + DispatchQueue.main.async { [weak self] in + self?.didWipe.send() + } } // MARK: - Internals (call only on `queue`) diff --git a/bitchat/Services/Board/UnifiedNotices.swift b/bitchat/Services/Board/UnifiedNotices.swift new file mode 100644 index 00000000..16d88a97 --- /dev/null +++ b/bitchat/Services/Board/UnifiedNotices.swift @@ -0,0 +1,88 @@ +// +// UnifiedNotices.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation + +/// One row in the unified notices sheet: a mesh board post or a Nostr +/// location note, normalized for display. +struct NoticeItem: Identifiable, Equatable { + enum Source: Equatable { + /// Signed board post carried by the mesh. + case board(BoardPostPacket) + /// Kind-1 location note seen on geo relays. + case nostr(LocationNotesManager.Note) + } + + let id: String + let author: String + let content: String + let createdAt: Date + let isUrgent: Bool + let source: Source + + var isBoardPost: Bool { + if case .board = source { return true } + return false + } + + init(post: BoardPostPacket) { + id = post.postID.hexEncodedString() + author = post.authorNickname.trimmedOrNilIfEmpty ?? "anon" + content = post.content + createdAt = Date(timeIntervalSince1970: TimeInterval(post.createdAt) / 1000) + isUrgent = post.isUrgent + source = .board(post) + } + + init(note: LocationNotesManager.Note) { + id = note.id + let display = note.displayName + author = display.split(separator: "#", maxSplits: 1, omittingEmptySubsequences: false) + .first.map(String.init) ?? display + content = note.content + createdAt = note.createdAt + isUrgent = false + source = .nostr(note) + } +} + +/// Merges mesh board posts and Nostr location notes into one deduplicated +/// list for the notices sheet's geo tab. +enum UnifiedNotices { + /// Board posts on geohash channels are bridged to Nostr as kind-1 notes at + /// post time, so the same notice arrives twice. The copies share content + /// and nickname but are signed by unlinkable keys; match them + /// heuristically by content + author within a time window. + static let bridgeDedupeWindow: TimeInterval = 15 * 60 + + /// Returns board posts and notes as one list, urgent posts first, then + /// newest first. Notes that look like bridged copies of a board post are + /// dropped — the board copy wins because it carries urgency and supports + /// merged deletion. The geohash must match exactly: the notes + /// subscription also surfaces neighboring cells, and a same-text note + /// from a neighbor is not the bridged copy. + static func merge(posts: [BoardPostPacket], notes: [LocationNotesManager.Note]) -> [NoticeItem] { + var items = posts.map(NoticeItem.init(post:)) + for note in notes { + let noteNickname = note.nickname?.trimmedOrNilIfEmpty ?? "anon" + let isBridgedCopy = posts.contains { post in + post.geohash == note.geohash + && post.content == note.content + && (post.authorNickname.trimmedOrNilIfEmpty ?? "anon") == noteNickname + && abs(Date(timeIntervalSince1970: TimeInterval(post.createdAt) / 1000).timeIntervalSince(note.createdAt)) <= bridgeDedupeWindow + } + if !isBridgedCopy { + items.append(NoticeItem(note: note)) + } + } + return items.sorted { + if $0.isUrgent != $1.isUrgent { return $0.isUrgent } + return $0.createdAt > $1.createdAt + } + } +} diff --git a/bitchat/Services/LocationNotesManager.swift b/bitchat/Services/LocationNotesManager.swift index 910ecced..e95f536a 100644 --- a/bitchat/Services/LocationNotesManager.swift +++ b/bitchat/Services/LocationNotesManager.swift @@ -67,6 +67,9 @@ final class LocationNotesManager: ObservableObject { let content: String let createdAt: Date let nickname: String? + /// The matched `g` tag: the cell the note was posted to, which can be + /// a neighbor of the subscribed geohash. + let geohash: String var displayName: String { let suffix = String(pubkey.suffix(4)) @@ -82,6 +85,8 @@ final class LocationNotesManager: ObservableObject { @Published private(set) var initialLoadComplete: Bool = false @Published private(set) var state: State = .loading @Published private(set) var errorMessage: String? + /// Public key of our per-geohash Nostr identity; identifies our own notes. + private var ownPubkey: String? private var subscriptionID: String? private var noteIDs = Set() // O(1) duplicate detection private var directoryUpdateCancellable: AnyCancellable? @@ -104,10 +109,10 @@ final class LocationNotesManager: ObservableObject { let norm = geohash.lowercased() self.geohash = norm self.dependencies = dependencies - // Validate geohash (building-level precision: 8 chars) - if !Geohash.isValidBuildingGeohash(norm) { - SecureLogger.warning("LocationNotesManager: invalid geohash '\(norm)' (expected 8 valid base32 chars)", category: .session) + if !Geohash.isValidGeohash(norm) { + SecureLogger.warning("LocationNotesManager: invalid geohash '\(norm)' (expected 1-12 valid base32 chars)", category: .session) } + ownPubkey = (try? dependencies.deriveIdentity(norm))?.publicKeyHex subscribe() // The relay directory may load after init (remote fetch over Tor); // retry automatically instead of staying stuck on "no relays". @@ -123,9 +128,8 @@ final class LocationNotesManager: ObservableObject { func setGeohash(_ newGeohash: String) { let norm = newGeohash.lowercased() guard norm != geohash else { return } - // Validate geohash (building-level precision: 8 chars) - guard Geohash.isValidBuildingGeohash(norm) else { - SecureLogger.warning("LocationNotesManager: rejecting invalid geohash '\(norm)' (expected 8 valid base32 chars)", category: .session) + guard Geohash.isValidGeohash(norm) else { + SecureLogger.warning("LocationNotesManager: rejecting invalid geohash '\(norm)' (expected 1-12 valid base32 chars)", category: .session) return } if let sub = subscriptionID { @@ -137,6 +141,7 @@ final class LocationNotesManager: ObservableObject { initialLoadComplete = false errorMessage = nil geohash = norm + ownPubkey = (try? dependencies.deriveIdentity(norm))?.publicKeyHex notes.removeAll() noteIDs.removeAll() subscribe() @@ -193,14 +198,14 @@ final class LocationNotesManager: ObservableObject { guard let self = self else { return } guard event.kind == NostrProtocol.EventKind.textNote.rawValue else { return } // Ensure matching tag - accept any of our 9 geohashes - guard event.tags.contains(where: { tag in + guard let matchedGeohash = event.tags.first(where: { tag in tag.count >= 2 && tag[0].lowercased() == "g" && validGeohashes.contains(tag[1].lowercased()) - }) else { return } + })?[1].lowercased() else { return } guard !self.noteIDs.contains(event.id) else { return } self.noteIDs.insert(event.id) let nick = event.tags.first(where: { $0.first?.lowercased() == "n" && $0.count >= 2 })?.dropFirst().first let ts = Date(timeIntervalSince1970: TimeInterval(event.created_at)) - let note = Note(id: event.id, pubkey: event.pubkey, content: event.content, createdAt: ts, nickname: nick) + let note = Note(id: event.id, pubkey: event.pubkey, content: event.content, createdAt: ts, nickname: nick, geohash: matchedGeohash) self.notes.append(note) self.notes.sort { $0.createdAt > $1.createdAt } self.enforceMemoryCap() @@ -239,7 +244,8 @@ final class LocationNotesManager: ObservableObject { pubkey: id.publicKeyHex, content: trimmed, createdAt: Date(timeIntervalSince1970: TimeInterval(event.created_at)), - nickname: nickname + nickname: nickname, + geohash: geohash ) self.noteIDs.insert(event.id) self.notes.insert(echo, at: 0) @@ -252,6 +258,36 @@ final class LocationNotesManager: ObservableObject { } } + /// Whether the note was published by this device's identity for the + /// current geohash (and can therefore be deleted with NIP-09). + func isOwnNote(_ note: Note) -> Bool { + guard let ownPubkey else { return false } + return note.pubkey == ownPubkey + } + + /// Requests NIP-09 deletion of one of our own notes and removes it locally. + @discardableResult + func delete(note: Note) -> Bool { + guard isOwnNote(note) else { return false } + let relays = dependencies.relayLookup(geohash, TransportConfig.nostrGeoRelayCount) + guard !relays.isEmpty else { + state = .noRelays + errorMessage = Strings.noRelays + return false + } + do { + let identity = try dependencies.deriveIdentity(geohash) + let deletion = try NostrProtocol.createDeleteEvent(ofEventID: note.id, senderIdentity: identity) + dependencies.sendEvent(deletion, relays) + // Keep the id in noteIDs so a relay replay can't resurrect it. + notes.removeAll { $0.id == note.id } + return true + } catch { + SecureLogger.error("LocationNotesManager: failed to delete note: \(error)", category: .session) + return false + } + } + /// Enforces defensive memory cap on notes array (keeps newest). private func enforceMemoryCap() { if notes.count > maxNotesInMemory { diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index c0c0d8b1..29140383 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1744,6 +1744,19 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele func addGeohashOnlySystemMessage(_ content: String) { publicConversationCoordinator.addGeohashOnlySystemMessage(content) } + + /// Add a local system message to one specific geohash timeline, active or + /// not. Used by the board's new-pin alerts to scope-match the pin's channel. + @MainActor + func addGeohashSystemMessage(_ content: String, geohash: String) { + let systemMessage = BitchatMessage( + sender: "system", + content: content, + timestamp: Date(), + isRelay: false + ) + appendGeohashMessageIfAbsent(systemMessage, toGeohash: geohash) + } // Send a public message without adding a local user echo. // Used for emotes where we want a local system-style confirmation instead. @MainActor diff --git a/bitchat/Views/BoardView.swift b/bitchat/Views/BoardView.swift deleted file mode 100644 index 8c443847..00000000 --- a/bitchat/Views/BoardView.swift +++ /dev/null @@ -1,270 +0,0 @@ -// -// BoardView.swift -// bitchat -// -// This is free and unencumbered software released into the public domain. -// For more information, see -// - -import SwiftUI - -/// The bulletin board for one context: a geohash channel, or the mesh-local -/// board when `geohash` is empty. Urgent posts pin to the top; own posts can -/// be swipe-deleted, which broadcasts a signed tombstone. -struct BoardView: View { - /// Empty string = mesh-local board. - let geohash: String - let senderNickname: String - @ObservedObject var board: BoardManager - - @ThemedPalette private var palette - @Environment(\.dynamicTypeSize) private var dynamicTypeSize - @Environment(\.dismiss) private var dismiss - @State private var draft: String = "" - @State private var urgent = false - @State private var expiryDays = 7 - - private var maxDraftLines: Int { dynamicTypeSize.isAccessibilitySize ? 5 : 3 } - private var posts: [BoardPostPacket] { board.posts(forGeohash: geohash) } - - private enum Strings { - static let boardName = String(localized: "board.title", defaultValue: "board", comment: "Title prefix of the bulletin board sheet") - static let description = String(localized: "board.description", defaultValue: "persistent notices carried by the mesh. posts are signed, spread device-to-device, and expire on their own.", comment: "Explainer under the board sheet title") - static let emptyTitle = String(localized: "board.empty_title", defaultValue: "no notices yet", comment: "Title shown when the board has no posts") - static let emptySubtitle = String(localized: "board.empty_subtitle", defaultValue: "pin the first notice for people around here.", comment: "Subtitle shown when the board has no posts") - static let urgentBadge = String(localized: "board.urgent_badge", defaultValue: "urgent", comment: "Badge shown on urgent board posts") - static let urgentToggle = String(localized: "board.compose.urgent", defaultValue: "urgent", comment: "Label for the urgent toggle in the board composer") - static let placeholder = String(localized: "board.compose.placeholder", defaultValue: "post a notice…", comment: "Placeholder for the board composer text field") - static let send = String(localized: "board.accessibility.post", defaultValue: "Post notice", comment: "Accessibility label for the board post button") - static let deleteAction = String(localized: "board.action.delete", defaultValue: "delete", comment: "Delete action for own board posts") - static let expiryLabel = String(localized: "board.compose.expiry", defaultValue: "expires in", comment: "Label for the board post expiry picker") - static let closeHint = String(localized: "board.accessibility.close", defaultValue: "Close board", comment: "Accessibility label for the board close button") - - static func expiryDaysOption(_ days: Int) -> String { - String( - format: String(localized: "board.compose.expiry_days", defaultValue: "%lldd", comment: "Expiry picker option, number of days abbreviated"), - locale: .current, - days - ) - } - - static func postAccessibilityLabel(author: String, content: String, urgent: Bool) -> String { - let base = String( - format: String(localized: "board.accessibility.post_row", defaultValue: "Notice from %@: %@", comment: "Accessibility label for a board post row"), - locale: .current, - author, content - ) - return urgent ? "\(urgentBadge), \(base)" : base - } - } - - var body: some View { - VStack(spacing: 0) { - headerSection - postList - composer - } - .themedSurface() - #if os(macOS) - .frame(minWidth: 420, idealWidth: 440, minHeight: 620, idealHeight: 680) - #endif - .themedSheetBackground() - } - - private var headerSection: some View { - VStack(alignment: .leading, spacing: 8) { - HStack(spacing: 12) { - Text(verbatim: geohash.isEmpty ? "\(Strings.boardName) @ #mesh" : "\(Strings.boardName) @ #\(geohash)") - .bitchatFont(size: 18) - Spacer() - SheetCloseButton { dismiss() } - .accessibilityLabel(Strings.closeHint) - } - Text(Strings.description) - .bitchatFont(size: 12) - .foregroundColor(palette.secondary) - .fixedSize(horizontal: false, vertical: true) - } - .padding(.horizontal, 16) - .padding(.top, 16) - .padding(.bottom, 12) - .themedSurface() - } - - private var postList: some View { - Group { - if posts.isEmpty { - ScrollView { - VStack(alignment: .leading, spacing: 4) { - Text(Strings.emptyTitle) - .bitchatFont(size: 13, weight: .semibold) - Text(Strings.emptySubtitle) - .bitchatFont(size: 12) - .foregroundColor(palette.secondary) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.horizontal, 16) - .padding(.vertical, 12) - } - } else { - List { - ForEach(posts, id: \.postID) { post in - postRow(post) - .listRowBackground(palette.background) - .listRowSeparatorTint(palette.divider) - } - } - .listStyle(.plain) - .scrollContentBackground(.hidden) - } - } - .frame(maxWidth: .infinity, maxHeight: .infinity) - .themedSurface() - } - - private func postRow(_ post: BoardPostPacket) -> some View { - let isOwn = board.isOwnPost(post) - let author = post.authorNickname.trimmedOrNilIfEmpty ?? "anon" - return VStack(alignment: .leading, spacing: 2) { - HStack(spacing: 6) { - if post.isUrgent { - Image(systemName: "exclamationmark.triangle.fill") - .font(.bitchatSystem(size: 11)) - .foregroundColor(palette.alertRed) - Text(Strings.urgentBadge) - .bitchatFont(size: 11, weight: .semibold) - .foregroundColor(palette.alertRed) - } - Text(verbatim: "@\(author)") - .bitchatFont(size: 12, weight: .semibold) - Text(timestampText(forMs: post.createdAt)) - .bitchatFont(size: 11) - .foregroundColor(palette.secondary) - Spacer() - if isOwn { - Button { - board.deletePost(post) - } label: { - Image(systemName: "trash") - .font(.bitchatSystem(size: 12)) - .foregroundColor(palette.secondary) - } - .buttonStyle(.plain) - .accessibilityLabel(Strings.deleteAction) - } - } - Text(post.content) - .bitchatFont(size: 14) - .fixedSize(horizontal: false, vertical: true) - } - .padding(.vertical, 4) - .accessibilityElement(children: .ignore) - .accessibilityLabel(Strings.postAccessibilityLabel(author: author, content: post.content, urgent: post.isUrgent)) - .accessibilityActions { - if isOwn { - Button(Strings.deleteAction) { board.deletePost(post) } - } - } - .swipeActions(edge: .trailing, allowsFullSwipe: false) { - if isOwn { - Button(role: .destructive) { - board.deletePost(post) - } label: { - Label(Strings.deleteAction, systemImage: "trash") - } - } - } - } - - private var composer: some View { - VStack(alignment: .leading, spacing: 8) { - HStack(alignment: .top, spacing: 10) { - TextField(Strings.placeholder, text: $draft, axis: .vertical) - .textFieldStyle(.plain) - .bitchatFont(size: 14) - .lineLimit(maxDraftLines, reservesSpace: true) - .padding(.vertical, 6) - Button(action: send) { - Image(systemName: "arrow.up.circle.fill") - .font(.bitchatSystem(size: 20)) - .foregroundColor(sendEnabled ? palette.accent : .secondary) - } - .padding(.top, 2) - .buttonStyle(.plain) - .disabled(!sendEnabled) - .accessibilityLabel(Strings.send) - } - HStack(spacing: 12) { - Toggle(isOn: $urgent) { - Text(Strings.urgentToggle) - .bitchatFont(size: 12) - .foregroundColor(urgent ? palette.alertRed : palette.secondary) - } - .toggleStyle(.switch) - .fixedSize() - .accessibilityLabel(Strings.urgentToggle) - Spacer() - Text(Strings.expiryLabel) - .bitchatFont(size: 12) - .foregroundColor(palette.secondary) - Picker(Strings.expiryLabel, selection: $expiryDays) { - ForEach([1, 3, 7], id: \.self) { days in - Text(Strings.expiryDaysOption(days)).tag(days) - } - } - .pickerStyle(.segmented) - .fixedSize() - .accessibilityLabel(Strings.expiryLabel) - } - } - .padding(.horizontal, 16) - .padding(.vertical, 14) - .themedSurface() - .overlay(Divider(), alignment: .top) - } - - private var sendEnabled: Bool { - let trimmed = draft.trimmed - return !trimmed.isEmpty && trimmed.utf8.count <= BoardWireConstants.contentMaxBytes - } - - private func send() { - guard let content = draft.trimmedOrNilIfEmpty else { return } - let sent = board.createPost( - content: content, - geohash: geohash, - urgent: urgent, - expiryDays: expiryDays, - nickname: senderNickname - ) - if sent { - draft = "" - urgent = false - } - } - - private func timestampText(forMs ms: UInt64) -> String { - let date = Date(timeIntervalSince1970: TimeInterval(ms) / 1000) - let now = Date() - if let days = Calendar.current.dateComponents([.day], from: date, to: now).day, days < 7 { - let rel = Self.relativeFormatter.string(from: date, to: now) ?? "" - return rel.isEmpty ? "" : "\(rel) ago" - } - return Self.absDateFormatter.string(from: date) - } - - private static let relativeFormatter: DateComponentsFormatter = { - let f = DateComponentsFormatter() - f.allowedUnits = [.day, .hour, .minute] - f.maximumUnitCount = 1 - f.unitsStyle = .abbreviated - f.collapsesLargestUnit = true - return f - }() - - private static let absDateFormatter: DateFormatter = { - let f = DateFormatter() - f.setLocalizedDateFormatFromTemplate("MMM d") - return f - }() -} diff --git a/bitchat/Views/ContentHeaderView.swift b/bitchat/Views/ContentHeaderView.swift index 6a260b07..9bac1095 100644 --- a/bitchat/Views/ContentHeaderView.swift +++ b/bitchat/Views/ContentHeaderView.swift @@ -1,21 +1,17 @@ import SwiftUI -#if os(iOS) -import UIKit -#endif struct ContentHeaderView: View { @EnvironmentObject private var appChromeModel: AppChromeModel @EnvironmentObject private var verificationModel: VerificationModel @EnvironmentObject private var locationChannelsModel: LocationChannelsModel @EnvironmentObject private var peerListModel: PeerListModel + @EnvironmentObject private var boardAlertsModel: BoardAlertsModel @Environment(\.dynamicTypeSize) private var dynamicTypeSize @Environment(\.appTheme) private var theme @ThemedPalette private var palette @Binding var showSidebar: Bool @Binding var showVerifySheet: Bool - @Binding var showLocationNotes: Bool - @Binding var notesGeohash: String? var isNicknameFieldFocused: FocusState.Binding let headerHeight: CGFloat @@ -25,8 +21,13 @@ struct ContentHeaderView: View { /// Courier envelopes this device is carrying for offline third parties. @State private var carriedMailCount = 0 - /// Bulletin board sheet for the current channel context. - @State private var showBoard = false + /// Unified notices sheet (board posts + location notes) for the current + /// channel context. + @State private var showNotices = false + + /// Board posts mirrored from the store so the pin icon can show when the + /// current scope has notices. + @State private var boardPosts: [BoardPostPacket] = [] var body: some View { HStack(spacing: 0) { @@ -137,36 +138,40 @@ struct ContentHeaderView: View { ) } - if case .mesh = locationChannelsModel.selectedChannel, - locationChannelsModel.permissionState == .authorized { - Button(action: { - locationChannelsModel.enableAndRefresh() - notesGeohash = locationChannelsModel.currentBuildingGeohash - showLocationNotes = true - }) { - Image(systemName: "note.text") - .font(.bitchatSystem(size: 12)) - .foregroundColor(Color.orange.opacity(0.8)) - .headerTapTarget() + Button(action: { + var scopes: Set = [""] + if let geoScope = noticesGeoScope { + scopes.insert(geoScope) } - .buttonStyle(.plain) - .accessibilityLabel( - String(localized: "content.accessibility.location_notes", comment: "Accessibility label for location notes button") - ) - } - - Button(action: { showBoard = true }) { - Image(systemName: "pin") + boardAlertsModel.markSeen(forScopes: scopes) + showNotices = true + }) { + // Fill marks unseen new pins; the tint says the current + // scope has notices at all. + Image(systemName: unseenNoticesCount > 0 ? "pin.fill" : "pin") .font(.bitchatSystem(size: 12)) - .foregroundColor(palette.secondary.opacity(0.9)) + .foregroundColor( + scopeHasNotices || unseenNoticesCount > 0 + ? Color.orange.opacity(0.8) + : palette.secondary.opacity(0.9) + ) .headerTapTarget() } .buttonStyle(.plain) .accessibilityLabel( - String(localized: "content.accessibility.board", defaultValue: "Bulletin board", comment: "Accessibility label for the bulletin board button") + String(localized: "content.accessibility.notices", defaultValue: "Notices", comment: "Accessibility label for the notices button") + ) + .accessibilityValue( + unseenNoticesCount > 0 + ? String( + format: String(localized: "content.accessibility.notices_new", defaultValue: "%lld new", comment: "Accessibility value for the notices button when unseen pins arrived"), + locale: .current, + unseenNoticesCount + ) + : "" ) .help( - String(localized: "content.header.board", defaultValue: "Bulletin board: persistent notices for this channel", comment: "Tooltip for the bulletin board button") + String(localized: "content.header.notices", defaultValue: "Notices: pinned posts for this area and the mesh", comment: "Tooltip for the notices button") ) if case .location(let channel) = locationChannelsModel.selectedChannel { @@ -267,54 +272,21 @@ struct ContentHeaderView: View { .onReceive(CourierStore.shared.$carriedCount) { count in carriedMailCount = count } + .onReceive(BoardStore.shared.$postsSnapshot) { posts in + boardPosts = posts + } .sheet(isPresented: $appChromeModel.isLocationChannelsSheetPresented) { LocationChannelsSheet(isPresented: $appChromeModel.isLocationChannelsSheetPresented) .environmentObject(locationChannelsModel) .environmentObject(peerListModel) } - .sheet(isPresented: $showBoard) { - BoardView( - geohash: boardGeohash, + .sheet(isPresented: $showNotices) { + NoticesView( senderNickname: appChromeModel.nickname, - board: appChromeModel.boardManager + board: appChromeModel.boardManager, + initialTab: initialNoticesTab ) - } - .sheet(isPresented: $showLocationNotes, onDismiss: { - notesGeohash = nil - }) { - Group { - if let geohash = notesGeohash ?? locationChannelsModel.currentBuildingGeohash { - LocationNotesView( - geohash: geohash, - senderNickname: appChromeModel.nickname - ) - .environmentObject(locationChannelsModel) - } else { - ContentLocationNotesUnavailableView( - showLocationNotes: $showLocationNotes, - headerHeight: headerHeight - ) - .environmentObject(locationChannelsModel) - } - } - .onAppear { - locationChannelsModel.enableLocationChannels() - locationChannelsModel.beginLiveRefresh() - } - .onDisappear { - locationChannelsModel.endLiveRefresh() - } - .onChange(of: locationChannelsModel.availableChannels) { channels in - if let current = channels.first(where: { $0.level == .building })?.geohash, - notesGeohash != current { - notesGeohash = current - #if os(iOS) - let generator = UIImpactFeedbackGenerator(style: .light) - generator.prepare() - generator.impactOccurred() - #endif - } - } + .environmentObject(locationChannelsModel) } .onAppear { locationChannelsModel.refreshMeshChannelsIfNeeded() @@ -348,13 +320,34 @@ private extension ContentHeaderView { dynamicTypeSize.isAccessibilitySize ? 2 : 1 } - /// The board scope for the current channel: the geohash channel's board, - /// or the mesh-local board ("") in mesh chat. - var boardGeohash: String { + /// Open the notices sheet on the tab matching the current channel: the + /// geohash channel's notices, or the mesh-local board in mesh chat. + var initialNoticesTab: NoticesView.Tab { + if case .location = locationChannelsModel.selectedChannel { + return .geo + } + return .mesh + } + + /// The geo scope the notices sheet would open on: the selected location + /// channel, or the device's building geohash when chatting on mesh. + var noticesGeoScope: String? { if case .location(let channel) = locationChannelsModel.selectedChannel { return channel.geohash } - return "" + return locationChannelsModel.currentBuildingGeohash + } + + /// Whether either tab of the notices sheet currently has content. + var scopeHasNotices: Bool { + boardPosts.contains { $0.geohash.isEmpty || $0.geohash == noticesGeoScope } + } + + /// New pins in either visible scope since the sheet was last opened. + var unseenNoticesCount: Int { + let meshCount = boardAlertsModel.unseenCount(forGeohash: "") + let geoCount = noticesGeoScope.map { boardAlertsModel.unseenCount(forGeohash: $0) } ?? 0 + return meshCount + geoCount } /// Whether anyone is actually reachable on the current channel — the @@ -380,37 +373,3 @@ private extension ContentHeaderView { } } } - -private struct ContentLocationNotesUnavailableView: View { - @EnvironmentObject private var locationChannelsModel: LocationChannelsModel - @ThemedPalette private var palette - - @Binding var showLocationNotes: Bool - - let headerHeight: CGFloat - - var body: some View { - VStack(spacing: 12) { - HStack { - Text("content.notes.title") - .bitchatFont(size: 16, weight: .bold) - Spacer() - SheetCloseButton { showLocationNotes = false } - .foregroundColor(palette.primary) - } - .frame(minHeight: headerHeight) - .padding(.horizontal, 12) - .themedChromePanel(edge: .top) - Text("content.notes.location_unavailable") - .bitchatFont(size: 14) - .foregroundColor(palette.secondary) - Button("content.location.enable") { - locationChannelsModel.enableAndRefresh() - } - .buttonStyle(.bordered) - Spacer() - } - .themedSheetBackground() - .foregroundColor(palette.primary) - } -} diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index bd434ad1..901c61b5 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -49,8 +49,6 @@ struct ContentView: View { @State private var isAtBottomPrivate = true @State private var autocompleteDebounceTimer: Timer? @State private var showVerifySheet = false - @State private var showLocationNotes = false - @State private var notesGeohash: String? @State private var imagePreviewURL: URL? #if os(iOS) @State private var showImagePicker = false @@ -269,8 +267,6 @@ struct ContentView: View { ContentHeaderView( showSidebar: $showSidebar, showVerifySheet: $showVerifySheet, - showLocationNotes: $showLocationNotes, - notesGeohash: $notesGeohash, isNicknameFieldFocused: $isNicknameFieldFocused, headerHeight: headerHeight, headerPeerIconSize: headerPeerIconSize, diff --git a/bitchat/Views/LocationNotesView.swift b/bitchat/Views/LocationNotesView.swift deleted file mode 100644 index d2cd3f16..00000000 --- a/bitchat/Views/LocationNotesView.swift +++ /dev/null @@ -1,304 +0,0 @@ -import SwiftUI - -struct LocationNotesView: View { - @StateObject private var manager: LocationNotesManager - let geohash: String - let senderNickname: String - let onNotesCountChanged: ((Int) -> Void)? - - @ThemedPalette private var palette - @Environment(\.dynamicTypeSize) private var dynamicTypeSize - @EnvironmentObject private var locationChannelsModel: LocationChannelsModel - @Environment(\.dismiss) private var dismiss - @State private var draft: String = "" - - init( - geohash: String, - senderNickname: String, - onNotesCountChanged: ((Int) -> Void)? = nil, - manager: LocationNotesManager? = nil - ) { - let gh = geohash.lowercased() - self.geohash = gh - self.senderNickname = senderNickname - self.onNotesCountChanged = onNotesCountChanged - _manager = StateObject(wrappedValue: manager ?? LocationNotesManager(geohash: gh)) - } - - private var backgroundColor: Color { palette.background } - private var accentGreen: Color { palette.accent } - private var maxDraftLines: Int { dynamicTypeSize.isAccessibilitySize ? 5 : 3 } - - private enum Strings { - static let description: LocalizedStringKey = "location_notes.description" - static let loadingRecent: LocalizedStringKey = "location_notes.loading_recent" - static let relaysPaused: LocalizedStringKey = "location_notes.relays_paused" - static let noRelaysNearby: LocalizedStringKey = "location_notes.no_relays_nearby" - static let retry: LocalizedStringKey = "location_notes.action.retry" - static let relaysRetryHint: LocalizedStringKey = "location_notes.relays_retry_hint" - static let loadingNotes: LocalizedStringKey = "location_notes.loading_notes" - static let emptyTitle: LocalizedStringKey = "location_notes.empty_title" - static let emptySubtitle: LocalizedStringKey = "location_notes.empty_subtitle" - static let dismissError: LocalizedStringKey = "location_notes.action.dismiss" - static let addPlaceholder: LocalizedStringKey = "location_notes.placeholder" - } - - var body: some View { -#if os(macOS) - VStack(spacing: 0) { - ScrollView { - VStack(spacing: 0) { - headerSection - notesContent - } - } - .themedSurface() - inputSection - } - .frame(minWidth: 420, idealWidth: 440, minHeight: 620, idealHeight: 680) - .themedSheetBackground() - .onDisappear { manager.cancel() } - .onChange(of: geohash) { newValue in - manager.setGeohash(newValue) - } - .onAppear { onNotesCountChanged?(manager.notes.count) } - .onChange(of: manager.notes.count) { newValue in - onNotesCountChanged?(newValue) - } -#else - NavigationView { - VStack(spacing: 0) { - headerSection - ScrollView { - notesContent - } - .frame(maxWidth: .infinity, maxHeight: .infinity) - inputSection - } - .themedSurface() - #if os(iOS) - .navigationBarTitleDisplayMode(.inline) - .navigationBarHidden(true) - #else - .navigationTitle("") - #endif - } - .themedSheetBackground() - .onDisappear { manager.cancel() } - .onChange(of: geohash) { newValue in - manager.setGeohash(newValue) - } - .onAppear { onNotesCountChanged?(manager.notes.count) } - .onChange(of: manager.notes.count) { newValue in - onNotesCountChanged?(newValue) - } -#endif - } - - private var closeButton: some View { - SheetCloseButton { dismiss() } - } - - private var headerSection: some View { - let count = manager.notes.count - return VStack(alignment: .leading, spacing: 8) { - HStack(spacing: 12) { - Text(headerTitle(for: count)) - .bitchatFont(size: 18) - Spacer() - closeButton - } - if let building = locationChannelsModel.locationName(for: .building), !building.isEmpty { - Text(building) - .bitchatFont(size: 12) - .foregroundColor(accentGreen) - } else if let block = locationChannelsModel.locationName(for: .block), !block.isEmpty { - Text(block) - .bitchatFont(size: 12) - .foregroundColor(accentGreen) - } - Text(Strings.description) - .bitchatFont(size: 12) - .foregroundColor(palette.secondary) - .fixedSize(horizontal: false, vertical: true) - if manager.state == .noRelays { - Text(Strings.relaysPaused) - .bitchatFont(size: 11) - .foregroundColor(palette.secondary) - } - } - .padding(.horizontal, 16) - .padding(.top, 16) - .padding(.bottom, 12) - .themedSurface() - } - - private func headerTitle(for count: Int) -> String { - String( - format: String(localized: "location_notes.header", comment: "Header displaying the geohash and localized note count"), - locale: .current, - "\(geohash) ± 1", count - ) - } - - private var notesContent: some View { - LazyVStack(alignment: .leading, spacing: 12) { - if manager.state == .noRelays { - noRelaysRow - } else if manager.state == .loading && !manager.initialLoadComplete { - loadingRow - } else if manager.notes.isEmpty { - emptyRow - } else { - ForEach(manager.notes) { note in - noteRow(note) - } - } - - if let error = manager.errorMessage, manager.state != .noRelays { - errorRow(message: error) - } - } - .padding(.horizontal, 16) - .padding(.vertical, 8) - } - - private func noteRow(_ note: LocationNotesManager.Note) -> some View { - let baseName = note.displayName.split(separator: "#", maxSplits: 1, omittingEmptySubsequences: false).first.map(String.init) ?? note.displayName - let ts = timestampText(for: note.createdAt) - return VStack(alignment: .leading, spacing: 2) { - HStack(spacing: 6) { - Text(verbatim: "@\(baseName)") - .bitchatFont(size: 12, weight: .semibold) - if !ts.isEmpty { - Text(ts) - .bitchatFont(size: 11) - .foregroundColor(palette.secondary) - } - Spacer() - } - Text(note.content) - .bitchatFont(size: 14) - .fixedSize(horizontal: false, vertical: true) - } - .padding(.vertical, 4) - } - - private var noRelaysRow: some View { - VStack(alignment: .leading, spacing: 4) { - Text(Strings.noRelaysNearby) - .bitchatFont(size: 13, weight: .semibold) - Text(Strings.relaysRetryHint) - .bitchatFont(size: 12) - .foregroundColor(palette.secondary) - Button(Strings.retry) { manager.refresh() } - .bitchatFont(size: 12) - .buttonStyle(.plain) - } - .padding(.vertical, 6) - } - - private var loadingRow: some View { - HStack(spacing: 10) { - ProgressView() - Text(Strings.loadingNotes) - .bitchatFont(size: 12) - .foregroundColor(palette.secondary) - Spacer() - } - .padding(.vertical, 8) - } - - private var emptyRow: some View { - VStack(alignment: .leading, spacing: 4) { - Text(Strings.emptyTitle) - .bitchatFont(size: 13, weight: .semibold) - Text(Strings.emptySubtitle) - .bitchatFont(size: 12) - .foregroundColor(palette.secondary) - } - .padding(.vertical, 6) - } - - private func errorRow(message: String) -> some View { - VStack(alignment: .leading, spacing: 4) { - HStack(spacing: 6) { - Image(systemName: "exclamationmark.triangle.fill") - .bitchatFont(size: 12) - Text(message) - .bitchatFont(size: 12) - Spacer() - } - Button(Strings.dismissError) { manager.clearError() } - .bitchatFont(size: 12) - .buttonStyle(.plain) - } - .padding(.vertical, 6) - } - - private var inputSection: some View { - HStack(alignment: .top, spacing: 10) { - TextField(Strings.addPlaceholder, text: $draft, axis: .vertical) - .textFieldStyle(.plain) - .bitchatFont(size: 14) - .lineLimit(maxDraftLines, reservesSpace: true) - .padding(.vertical, 6) - Button(action: send) { - Image(systemName: "arrow.up.circle.fill") - .font(.bitchatSystem(size: 20)) - .foregroundColor(sendButtonEnabled ? accentGreen : .secondary) - } - .padding(.top, 2) - .buttonStyle(.plain) - .disabled(!sendButtonEnabled) - } - .padding(.horizontal, 16) - .padding(.vertical, 14) - .themedSurface() - .overlay(Divider(), alignment: .top) - } - - private func send() { - guard let content = draft.trimmedOrNilIfEmpty else { return } - manager.send(content: content, nickname: senderNickname) - draft = "" - } - - private var sendButtonEnabled: Bool { - !draft.trimmed.isEmpty && manager.state != .noRelays - } - - // MARK: - Timestamp Formatting - private func timestampText(for date: Date) -> String { - let now = Date() - if let days = Calendar.current.dateComponents([.day], from: date, to: now).day, days < 7 { - let rel = Self.relativeFormatter.string(from: date, to: now) ?? "" - return rel.isEmpty ? "" : "\(rel) ago" - } else { - let sameYear = Calendar.current.isDate(date, equalTo: now, toGranularity: .year) - let fmt = sameYear ? Self.absDateFormatter : Self.absDateYearFormatter - return fmt.string(from: date) - } - } - - private static let relativeFormatter: DateComponentsFormatter = { - let f = DateComponentsFormatter() - f.allowedUnits = [.day, .hour, .minute] - f.maximumUnitCount = 1 - f.unitsStyle = .abbreviated - f.collapsesLargestUnit = true - return f - }() - - private static let absDateFormatter: DateFormatter = { - let f = DateFormatter() - f.setLocalizedDateFormatFromTemplate("MMM d") - return f - }() - - private static let absDateYearFormatter: DateFormatter = { - let f = DateFormatter() - f.setLocalizedDateFormatFromTemplate("MMM d, y") - return f - }() -} diff --git a/bitchat/Views/NoticesView.swift b/bitchat/Views/NoticesView.swift new file mode 100644 index 00000000..692158f1 --- /dev/null +++ b/bitchat/Views/NoticesView.swift @@ -0,0 +1,560 @@ +// +// NoticesView.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import SwiftUI + +/// The unified notices sheet behind the header's pin icon: one place for +/// everything pinned around you, with a scope toggle. +/// +/// - geo: the current geohash's notices — mesh-synced board posts merged and +/// deduped with Nostr kind-1 location notes, so you also see notices from +/// people who aren't on your mesh. +/// - mesh: the mesh-local board only (empty geohash, fully offline). +struct NoticesView: View { + enum Tab: Hashable { + case geo + case mesh + } + + let senderNickname: String + @ObservedObject var board: BoardManager + + @ThemedPalette private var palette + @Environment(\.dynamicTypeSize) private var dynamicTypeSize + @Environment(\.dismiss) private var dismiss + @EnvironmentObject private var locationChannelsModel: LocationChannelsModel + @State private var tab: Tab + @State private var draft: String = "" + @State private var urgent = false + @State private var expiryDays = 7 + + /// Injected notes manager for tests; live use derives one per geohash. + private let notesManager: LocationNotesManager? + + init( + senderNickname: String, + board: BoardManager, + initialTab: Tab, + notesManager: LocationNotesManager? = nil + ) { + self.senderNickname = senderNickname + self.board = board + self.notesManager = notesManager + _tab = State(initialValue: initialTab) + } + + private var maxDraftLines: Int { dynamicTypeSize.isAccessibilitySize ? 5 : 3 } + + /// The geohash the geo tab is scoped to: the selected location channel, + /// or the device's building geohash when chatting on mesh. + private var geoGeohash: String? { + if case .location(let channel) = locationChannelsModel.selectedChannel { + return channel.geohash + } + return locationChannelsModel.currentBuildingGeohash + } + + /// The geo scope comes from device location only when no location channel + /// is selected; that's the case that needs the location machinery. + private var geoTabNeedsDeviceLocation: Bool { + if case .location = locationChannelsModel.selectedChannel { return false } + return true + } + + private var activeGeohash: String? { + switch tab { + case .geo: return geoGeohash + case .mesh: return "" + } + } + + enum Strings { + static let title = String(localized: "notices.title", defaultValue: "notices", comment: "Title prefix of the unified notices sheet") + static let geoTab = String(localized: "notices.tab.geo", defaultValue: "geo", comment: "Segmented control label for geohash-scoped notices") + static let meshTab = String(localized: "notices.tab.mesh", defaultValue: "mesh", comment: "Segmented control label for mesh-local notices") + static let scopePicker = String(localized: "notices.accessibility.scope", defaultValue: "Notices scope", comment: "Accessibility label for the geo/mesh scope toggle") + // The pre-merge location-notes explainer, reused so its existing + // translations carry over. + static let geoDescription = String(localized: "location_notes.description", comment: "Explainer for the geo tab of the notices sheet") + static let meshDescription = String(localized: "notices.description.mesh", defaultValue: "pin short notices for people around you. they hop phone to phone, even offline, and disappear on their own after a few days.", comment: "Explainer for the mesh tab of the notices sheet") + static let emptyTitle = String(localized: "board.empty_title", defaultValue: "no notices yet", comment: "Title shown when the board has no posts") + static let emptySubtitle = String(localized: "board.empty_subtitle", defaultValue: "pin the first notice for people around here.", comment: "Subtitle shown when the board has no posts") + static let urgentBadge = String(localized: "board.urgent_badge", defaultValue: "urgent", comment: "Badge shown on urgent board posts") + static let urgentToggle = String(localized: "board.compose.urgent", defaultValue: "urgent", comment: "Label for the urgent toggle in the board composer") + static let placeholder = String(localized: "board.compose.placeholder", defaultValue: "post a notice…", comment: "Placeholder for the board composer text field") + static let send = String(localized: "board.accessibility.post", defaultValue: "Post notice", comment: "Accessibility label for the board post button") + static let deleteAction = String(localized: "board.action.delete", defaultValue: "delete", comment: "Delete action for own board posts") + static let expiryLabel = String(localized: "board.compose.expiry", defaultValue: "expires in", comment: "Label for the board post expiry picker") + static let closeHint = String(localized: "notices.accessibility.close", defaultValue: "Close notices", comment: "Accessibility label for the notices close button") + static let meshSource = String(localized: "notices.source.mesh", defaultValue: "mesh", comment: "Source badge for notices carried by the mesh") + static let nostrSource = String(localized: "notices.source.nostr", defaultValue: "net", comment: "Source badge for notices seen on internet relays") + static let locationUnavailable = String(localized: "content.notes.location_unavailable", comment: "Shown when the device location is unavailable for geo notices") + static let enableLocation = String(localized: "content.location.enable", comment: "Button enabling location for geo notices") + static let loadingNotes: LocalizedStringKey = "location_notes.loading_notes" + static let noRelaysNearby: LocalizedStringKey = "location_notes.no_relays_nearby" + static let relaysRetryHint: LocalizedStringKey = "location_notes.relays_retry_hint" + static let retry: LocalizedStringKey = "location_notes.action.retry" + static let dismissError: LocalizedStringKey = "location_notes.action.dismiss" + + static func expiryDaysOption(_ days: Int) -> String { + String( + format: String(localized: "board.compose.expiry_days", defaultValue: "%lldd", comment: "Expiry picker option, number of days abbreviated"), + locale: .current, + days + ) + } + + static func rowAccessibilityLabel(author: String, content: String, urgent: Bool) -> String { + let base = String( + format: String(localized: "board.accessibility.post_row", defaultValue: "Notice from %@: %@", comment: "Accessibility label for a board post row"), + locale: .current, + author, content + ) + return urgent ? "\(urgentBadge), \(base)" : base + } + } + + var body: some View { + VStack(spacing: 0) { + headerSection + contentSection + if activeGeohash != nil { + composer + } + } + .themedSurface() + #if os(macOS) + .frame(minWidth: 420, idealWidth: 440, minHeight: 620, idealHeight: 680) + #endif + .themedSheetBackground() + .onAppear { beginGeoLocationIfNeeded() } + .onChange(of: tab) { newTab in + if newTab == .geo { + beginGeoLocationIfNeeded() + } else { + locationChannelsModel.endLiveRefresh() + } + } + // Catches permission granted from the geo tab's enable button. + .onChange(of: locationChannelsModel.permissionState) { _ in + beginGeoLocationIfNeeded() + } + .onDisappear { locationChannelsModel.endLiveRefresh() } + } + + /// The geo tab tracks the device's building geohash while on mesh; keep + /// location fresh only in that case (a selected location channel already + /// fixes the scope). + private func beginGeoLocationIfNeeded() { + guard tab == .geo, geoTabNeedsDeviceLocation, + locationChannelsModel.permissionState == .authorized else { return } + locationChannelsModel.enableLocationChannels() + locationChannelsModel.beginLiveRefresh() + } + + private var headerSection: some View { + VStack(alignment: .leading, spacing: 8) { + HStack(spacing: 12) { + Text(verbatim: scopeTitle) + .bitchatFont(size: 18) + Spacer() + SheetCloseButton { dismiss() } + .accessibilityLabel(Strings.closeHint) + } + Picker(Strings.scopePicker, selection: $tab) { + Text(Strings.geoTab).tag(Tab.geo) + Text(Strings.meshTab).tag(Tab.mesh) + } + .pickerStyle(.segmented) + .accessibilityLabel(Strings.scopePicker) + Text(tab == .geo ? Strings.geoDescription : Strings.meshDescription) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.horizontal, 16) + .padding(.top, 16) + .padding(.bottom, 12) + .themedSurface() + } + + private var scopeTitle: String { + switch tab { + case .mesh: + return "\(Strings.title) @ #mesh" + case .geo: + if let geohash = geoGeohash { + return "\(Strings.title) @ #\(geohash)" + } + return Strings.title + } + } + + @ViewBuilder + private var contentSection: some View { + switch tab { + case .mesh: + NoticesList( + items: UnifiedNotices.merge(posts: board.posts(forGeohash: ""), notes: []), + showsSource: false, + board: board, + notesManager: nil + ) + case .geo: + if let geohash = geoGeohash { + GeoNoticesList(geohash: geohash, board: board, manager: notesManager) + } else { + locationUnavailableSection + } + } + } + + private var locationUnavailableSection: some View { + ScrollView { + VStack(alignment: .leading, spacing: 12) { + Text(Strings.locationUnavailable) + .bitchatFont(size: 14) + .foregroundColor(palette.secondary) + .fixedSize(horizontal: false, vertical: true) + Button(Strings.enableLocation) { + locationChannelsModel.enableAndRefresh() + } + .buttonStyle(.bordered) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 16) + .padding(.vertical, 12) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .themedSurface() + } + + private var composer: some View { + VStack(alignment: .leading, spacing: 8) { + HStack(alignment: .top, spacing: 10) { + TextField(Strings.placeholder, text: $draft, axis: .vertical) + .textFieldStyle(.plain) + .bitchatFont(size: 14) + .lineLimit(maxDraftLines, reservesSpace: true) + .padding(.vertical, 6) + Button(action: send) { + Image(systemName: "arrow.up.circle.fill") + .font(.bitchatSystem(size: 20)) + .foregroundColor(sendEnabled ? palette.accent : .secondary) + } + .padding(.top, 2) + .buttonStyle(.plain) + .disabled(!sendEnabled) + .accessibilityLabel(Strings.send) + } + // Urgency and expiry only travel with the mesh copy — the bridged + // Nostr note carries neither, so relay-side readers would never + // see them. Offer the controls only where they fully apply. + if tab == .mesh { + HStack(spacing: 12) { + Toggle(isOn: $urgent) { + Text(Strings.urgentToggle) + .bitchatFont(size: 12) + .foregroundColor(urgent ? palette.alertRed : palette.secondary) + } + .toggleStyle(.switch) + .fixedSize() + .accessibilityLabel(Strings.urgentToggle) + Spacer() + Text(Strings.expiryLabel) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + Picker(Strings.expiryLabel, selection: $expiryDays) { + ForEach([1, 3, 7], id: \.self) { days in + Text(Strings.expiryDaysOption(days)).tag(days) + } + } + .pickerStyle(.segmented) + .fixedSize() + .accessibilityLabel(Strings.expiryLabel) + } + } + } + .padding(.horizontal, 16) + .padding(.vertical, 14) + .themedSurface() + .overlay(Divider(), alignment: .top) + } + + private var sendEnabled: Bool { + let trimmed = draft.trimmed + return !trimmed.isEmpty && trimmed.utf8.count <= BoardWireConstants.contentMaxBytes + } + + private func send() { + guard let geohash = activeGeohash, let content = draft.trimmedOrNilIfEmpty else { return } + // Geo posts go to the board and are bridged to Nostr by BoardManager, + // so mesh and internet see the same notice. They always use the + // defaults: non-urgent, 7-day expiry (NIP-40 on the bridged copy). + let sent = board.createPost( + content: content, + geohash: geohash, + urgent: tab == .mesh && urgent, + expiryDays: tab == .mesh ? expiryDays : 7, + nickname: senderNickname + ) + if sent { + draft = "" + urgent = false + } + } +} + +/// The geo tab's list: owns the Nostr notes subscription for the scope +/// geohash and merges it with the board posts for the same geohash. +private struct GeoNoticesList: View { + let geohash: String + @ObservedObject var board: BoardManager + @StateObject private var notesManager: LocationNotesManager + + init(geohash: String, board: BoardManager, manager: LocationNotesManager? = nil) { + let gh = geohash.lowercased() + self.geohash = gh + self.board = board + _notesManager = StateObject(wrappedValue: manager ?? LocationNotesManager(geohash: gh)) + } + + var body: some View { + NoticesList( + items: UnifiedNotices.merge( + posts: board.posts(forGeohash: geohash), + notes: notesManager.notes + ), + showsSource: true, + board: board, + notesManager: notesManager + ) + .onChange(of: geohash) { newValue in + notesManager.setGeohash(newValue) + } + .onDisappear { notesManager.cancel() } + } +} + +/// Renders merged notices with per-source affordances: swipe-delete for own +/// items and a mesh/net badge when sources mix. +private struct NoticesList: View { + let items: [NoticeItem] + let showsSource: Bool + let board: BoardManager + let notesManager: LocationNotesManager? + + @ThemedPalette private var palette + + private typealias Strings = NoticesView.Strings + + var body: some View { + Group { + if items.isEmpty { + ScrollView { + VStack(alignment: .leading, spacing: 4) { + statusRows + if showEmptyState { + Text(Strings.emptyTitle) + .bitchatFont(size: 13, weight: .semibold) + Text(Strings.emptySubtitle) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 16) + .padding(.vertical, 12) + } + } else { + List { + statusRows + .listRowBackground(palette.background) + .listRowSeparatorTint(palette.divider) + ForEach(items) { item in + row(item) + .listRowBackground(palette.background) + .listRowSeparatorTint(palette.divider) + } + } + .listStyle(.plain) + .scrollContentBackground(.hidden) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .themedSurface() + } + + /// Notes may still be loading or unreachable; only claim "no notices yet" + /// once the sources settled. + private var showEmptyState: Bool { + guard let notesManager else { return true } + return notesManager.initialLoadComplete && notesManager.state != .loading + } + + @ViewBuilder + private var statusRows: some View { + if let notesManager { + if notesManager.state == .loading && !notesManager.initialLoadComplete { + HStack(spacing: 10) { + ProgressView() + Text(Strings.loadingNotes) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + Spacer() + } + .padding(.vertical, 8) + } else if notesManager.state == .noRelays { + VStack(alignment: .leading, spacing: 4) { + Text(Strings.noRelaysNearby) + .bitchatFont(size: 13, weight: .semibold) + Text(Strings.relaysRetryHint) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + Button(Strings.retry) { notesManager.refresh() } + .bitchatFont(size: 12) + .buttonStyle(.plain) + } + .padding(.bottom, 8) + } else if let error = notesManager.errorMessage { + VStack(alignment: .leading, spacing: 4) { + HStack(spacing: 6) { + Image(systemName: "exclamationmark.triangle.fill") + .bitchatFont(size: 12) + Text(error) + .bitchatFont(size: 12) + Spacer() + } + Button(Strings.dismissError) { notesManager.clearError() } + .bitchatFont(size: 12) + .buttonStyle(.plain) + } + .padding(.bottom, 8) + } + } + } + + private func canDelete(_ item: NoticeItem) -> Bool { + switch item.source { + case .board(let post): + return board.isOwnPost(post) + case .nostr(let note): + return notesManager?.isOwnNote(note) ?? false + } + } + + private func delete(_ item: NoticeItem) { + switch item.source { + case .board(let post): + // Tombstones the board post and retracts the bridged Nostr copy. + board.deletePost(post) + case .nostr(let note): + notesManager?.delete(note: note) + } + } + + private func row(_ item: NoticeItem) -> some View { + let isOwn = canDelete(item) + return VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 6) { + if item.isUrgent { + Image(systemName: "exclamationmark.triangle.fill") + .font(.bitchatSystem(size: 11)) + .foregroundColor(palette.alertRed) + Text(Strings.urgentBadge) + .bitchatFont(size: 11, weight: .semibold) + .foregroundColor(palette.alertRed) + } + Text(verbatim: "@\(item.author)") + .bitchatFont(size: 12, weight: .semibold) + Text(Self.timestampText(for: item.createdAt)) + .bitchatFont(size: 11) + .foregroundColor(palette.secondary) + Spacer() + if showsSource { + sourceBadge(item) + } + if isOwn { + Button { + delete(item) + } label: { + Image(systemName: "trash") + .font(.bitchatSystem(size: 12)) + .foregroundColor(palette.secondary) + } + .buttonStyle(.plain) + .accessibilityLabel(Strings.deleteAction) + } + } + Text(item.content) + .bitchatFont(size: 14) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.vertical, 4) + .accessibilityElement(children: .ignore) + .accessibilityLabel(Strings.rowAccessibilityLabel(author: item.author, content: item.content, urgent: item.isUrgent)) + .accessibilityActions { + if isOwn { + Button(Strings.deleteAction) { delete(item) } + } + } + .swipeActions(edge: .trailing, allowsFullSwipe: false) { + if isOwn { + Button(role: .destructive) { + delete(item) + } label: { + Label(Strings.deleteAction, systemImage: "trash") + } + } + } + } + + private func sourceBadge(_ item: NoticeItem) -> some View { + HStack(spacing: 3) { + Image(systemName: item.isBoardPost ? "antenna.radiowaves.left.and.right" : "globe") + .font(.bitchatSystem(size: 10)) + Text(item.isBoardPost ? Strings.meshSource : Strings.nostrSource) + .bitchatFont(size: 10) + } + .foregroundColor(palette.secondary.opacity(0.8)) + .accessibilityLabel(item.isBoardPost ? Strings.meshSource : Strings.nostrSource) + } + + // MARK: - Timestamp Formatting + + private static func timestampText(for date: Date) -> String { + let now = Date() + if let days = Calendar.current.dateComponents([.day], from: date, to: now).day, days < 7 { + let rel = relativeFormatter.string(from: date, to: now) ?? "" + return rel.isEmpty ? "" : "\(rel) ago" + } + let sameYear = Calendar.current.isDate(date, equalTo: now, toGranularity: .year) + return (sameYear ? absDateFormatter : absDateYearFormatter).string(from: date) + } + + private static let relativeFormatter: DateComponentsFormatter = { + let f = DateComponentsFormatter() + f.allowedUnits = [.day, .hour, .minute] + f.maximumUnitCount = 1 + f.unitsStyle = .abbreviated + f.collapsesLargestUnit = true + return f + }() + + private static let absDateFormatter: DateFormatter = { + let f = DateFormatter() + f.setLocalizedDateFormatFromTemplate("MMM d") + return f + }() + + private static let absDateYearFormatter: DateFormatter = { + let f = DateFormatter() + f.setLocalizedDateFormatFromTemplate("MMM d, y") + return f + }() +} diff --git a/bitchatTests/Services/BoardAlertsModelTests.swift b/bitchatTests/Services/BoardAlertsModelTests.swift new file mode 100644 index 00000000..df891cea --- /dev/null +++ b/bitchatTests/Services/BoardAlertsModelTests.swift @@ -0,0 +1,215 @@ +// +// BoardAlertsModelTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Combine +import Foundation +import Testing +@testable import bitchat + +@MainActor +struct BoardAlertsModelTests { + + private let baseDate = Date(timeIntervalSince1970: 1_700_000_000) + private var baseMs: UInt64 { UInt64(baseDate.timeIntervalSince1970 * 1000) } + private let ownKey = Data(repeating: 7, count: 32) + + private final class Harness { + var lines: [(content: String, geohash: String)] = [] + var pendingFlushes: [@MainActor () -> Void] = [] + + @MainActor + func flushAll() { + let flushes = pendingFlushes + pendingFlushes = [] + for flush in flushes { flush() } + } + } + + private func makeModel(harness: Harness, now: Date? = nil) -> BoardAlertsModel { + let fixedNow = now ?? baseDate + return BoardAlertsModel( + arrivals: Empty(completeImmediately: false).eraseToAnyPublisher(), + dependencies: BoardAlertsModel.Dependencies( + isOwnPost: { [ownKey] in $0.authorSigningKey == ownKey }, + emitSystemLine: { content, geohash in + harness.lines.append((content, geohash)) + }, + now: { fixedNow }, + scheduleFlush: { flush in + harness.pendingFlushes.append(flush) + } + ) + ) + } + + private func makePost( + content: String = "hello", + geohash: String = "9q8yy", + nickname: String = "alice", + createdAt: UInt64? = nil, + urgent: Bool = false, + authorKey: Data = Data(repeating: 1, count: 32), + postID: Data? = nil + ) -> BoardPostPacket { + BoardPostPacket( + postID: postID ?? Data((0..<16).map { _ in UInt8.random(in: 0...255) }), + geohash: geohash, + content: content, + authorSigningKey: authorKey, + authorNickname: nickname, + createdAt: createdAt ?? baseMs, + expiresAt: (createdAt ?? baseMs) + 24 * 60 * 60 * 1000, + flags: urgent ? BoardPostPacket.urgentFlag : 0, + signature: Data(repeating: 2, count: 64) + ) + } + + @Test + func ownPosts_neverBadgeOrAlert() { + let harness = Harness() + let model = makeModel(harness: harness) + + model.handleArrival(makePost(urgent: true, authorKey: ownKey)) + harness.flushAll() + + #expect(model.unseenCount(forGeohash: "9q8yy") == 0) + #expect(harness.lines.isEmpty) + } + + @Test + func routinePost_badgesWithoutChatLine() { + let harness = Harness() + let model = makeModel(harness: harness) + + model.handleArrival(makePost(geohash: "")) + harness.flushAll() + + #expect(model.unseenCount(forGeohash: "") == 1) + #expect(model.unseenCount(forGeohash: "9q8yy") == 0) + #expect(harness.lines.isEmpty) + } + + @Test + func urgentRecentPost_emitsLineInMatchingScope() { + let harness = Harness() + let model = makeModel(harness: harness) + + model.handleArrival(makePost(content: "road closed", geohash: "9q8yy", urgent: true)) + #expect(harness.lines.isEmpty) + harness.flushAll() + + #expect(harness.lines.count == 1) + #expect(harness.lines[0].geohash == "9q8yy") + #expect(harness.lines[0].content.contains("road closed")) + #expect(harness.lines[0].content.contains("@alice")) + } + + @Test + func urgentBackfilledPost_badgesOnly() { + let harness = Harness() + let arrivalTime = baseDate.addingTimeInterval(BoardAlertsModel.inlineRecencyWindow + 120) + let model = makeModel(harness: harness, now: arrivalTime) + + model.handleArrival(makePost(createdAt: baseMs, urgent: true)) + harness.flushAll() + + #expect(model.unseenCount(forGeohash: "9q8yy") == 1) + #expect(harness.lines.isEmpty) + } + + @Test + func simultaneousUrgentPosts_collapseIntoOneLine() { + let harness = Harness() + let model = makeModel(harness: harness) + + model.handleArrival(makePost(content: "one", urgent: true)) + model.handleArrival(makePost(content: "two", urgent: true)) + model.handleArrival(makePost(content: "three", urgent: true)) + harness.flushAll() + + #expect(harness.lines.count == 1) + #expect(harness.lines[0].content.contains("3")) + #expect(harness.pendingFlushes.isEmpty) + } + + @Test + func urgentPostsInDifferentScopes_alertEachScope() { + let harness = Harness() + let model = makeModel(harness: harness) + + model.handleArrival(makePost(content: "geo pin", geohash: "9q8yy", urgent: true)) + model.handleArrival(makePost(content: "mesh pin", geohash: "", urgent: true)) + harness.flushAll() + + #expect(harness.lines.count == 2) + #expect(Set(harness.lines.map(\.geohash)) == ["9q8yy", ""]) + } + + @Test + func duplicateArrival_isHandledOnce() { + let harness = Harness() + let model = makeModel(harness: harness) + let id = Data(repeating: 3, count: 16) + + model.handleArrival(makePost(urgent: true, postID: id)) + model.handleArrival(makePost(urgent: true, postID: id)) + harness.flushAll() + + #expect(model.unseenCount(forGeohash: "9q8yy") == 1) + #expect(harness.lines.count == 1) + #expect(!harness.lines[0].content.contains("2")) + } + + @Test + func markSeen_clearsOnlyVisibleScopes() { + let harness = Harness() + let model = makeModel(harness: harness) + + model.handleArrival(makePost(geohash: "")) + model.handleArrival(makePost(geohash: "9q8yy")) + model.handleArrival(makePost(geohash: "u4pruyd")) + + // Opening the sheet on mesh + 9q8yy must not eat the badge for the + // never-shown u4pruyd channel. + model.markSeen(forScopes: ["", "9q8yy"]) + + #expect(model.unseenCount(forGeohash: "") == 0) + #expect(model.unseenCount(forGeohash: "9q8yy") == 0) + #expect(model.unseenCount(forGeohash: "u4pruyd") == 1) + } + + @Test + func reset_dropsPendingUrgentLinesAndBadges() { + let harness = Harness() + let model = makeModel(harness: harness) + + model.handleArrival(makePost(content: "pre-wipe secret", urgent: true)) + #expect(harness.pendingFlushes.count == 1) + + // Panic wipe lands before the collapse flush fires. + model.reset() + harness.flushAll() + + #expect(harness.lines.isEmpty) + #expect(model.unseenCount(forGeohash: "9q8yy") == 0) + } + + @Test + func longUrgentContent_isTruncatedInLine() { + let harness = Harness() + let model = makeModel(harness: harness) + let long = String(repeating: "a", count: 400) + + model.handleArrival(makePost(content: long, urgent: true)) + harness.flushAll() + + #expect(harness.lines.count == 1) + #expect(harness.lines[0].content.count < 200) + #expect(harness.lines[0].content.contains("…")) + } +} diff --git a/bitchatTests/Services/UnifiedNoticesTests.swift b/bitchatTests/Services/UnifiedNoticesTests.swift new file mode 100644 index 00000000..3dd369b4 --- /dev/null +++ b/bitchatTests/Services/UnifiedNoticesTests.swift @@ -0,0 +1,142 @@ +// +// UnifiedNoticesTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +@testable import bitchat + +struct UnifiedNoticesTests { + + private let baseDate = Date(timeIntervalSince1970: 1_700_000_000) + private var baseMs: UInt64 { UInt64(baseDate.timeIntervalSince1970 * 1000) } + + private func makePost( + content: String, + nickname: String = "alice", + createdAt: UInt64? = nil, + urgent: Bool = false + ) -> BoardPostPacket { + BoardPostPacket( + postID: Data((0..<16).map { _ in UInt8.random(in: 0...255) }), + geohash: "9q8yy", + content: content, + authorSigningKey: Data(repeating: 1, count: 32), + authorNickname: nickname, + createdAt: createdAt ?? baseMs, + expiresAt: (createdAt ?? baseMs) + 24 * 60 * 60 * 1000, + flags: urgent ? BoardPostPacket.urgentFlag : 0, + signature: Data(repeating: 2, count: 64) + ) + } + + private func makeNote( + content: String, + nickname: String? = "alice", + createdAt: Date? = nil, + geohash: String = "9q8yy" + ) -> LocationNotesManager.Note { + LocationNotesManager.Note( + id: UUID().uuidString, + pubkey: "ab" + UUID().uuidString.replacingOccurrences(of: "-", with: ""), + content: content, + createdAt: createdAt ?? baseDate, + nickname: nickname, + geohash: geohash + ) + } + + @Test + func merge_dropsBridgedCopyOfBoardPost() { + let post = makePost(content: "free couch on 5th") + let bridged = makeNote(content: "free couch on 5th", createdAt: baseDate.addingTimeInterval(30)) + + let merged = UnifiedNotices.merge(posts: [post], notes: [bridged]) + + #expect(merged.count == 1) + #expect(merged[0].isBoardPost) + } + + @Test + func merge_keepsNoteWithSameContentOutsideWindow() { + let post = makePost(content: "water station here") + let oldNote = makeNote( + content: "water station here", + createdAt: baseDate.addingTimeInterval(-UnifiedNotices.bridgeDedupeWindow - 60) + ) + + let merged = UnifiedNotices.merge(posts: [post], notes: [oldNote]) + + #expect(merged.count == 2) + } + + @Test + func merge_keepsSameTextNoteFromNeighborCell() { + // The notes subscription covers the center cell plus 8 neighbors; a + // matching note posted to a *neighbor* is not the bridged copy. + let post = makePost(content: "free couch on 5th") + let neighborNote = makeNote(content: "free couch on 5th", createdAt: baseDate.addingTimeInterval(30), geohash: "9q8yz") + + let merged = UnifiedNotices.merge(posts: [post], notes: [neighborNote]) + + #expect(merged.count == 2) + } + + @Test + func merge_keepsNoteFromDifferentAuthor() { + let post = makePost(content: "meetup at 6", nickname: "alice") + let note = makeNote(content: "meetup at 6", nickname: "bob") + + let merged = UnifiedNotices.merge(posts: [post], notes: [note]) + + #expect(merged.count == 2) + } + + @Test + func merge_sortsUrgentFirstThenNewest() { + let urgent = makePost(content: "road closed", createdAt: baseMs - 60_000, urgent: true) + let newerPost = makePost(content: "later post", createdAt: baseMs) + let note = makeNote(content: "a note", nickname: "carol", createdAt: baseDate.addingTimeInterval(30)) + + let merged = UnifiedNotices.merge(posts: [newerPost, urgent], notes: [note]) + + #expect(merged.map(\.content) == ["road closed", "a note", "later post"]) + #expect(merged[0].isUrgent) + } + + @Test + func merge_anonNicknamesMatchForDedupe() { + // Bridged posts from an empty nickname arrive as anon notes with no + // "n" tag; they must still dedupe against the anon board copy. + let post = makePost(content: "hello", nickname: "") + let bridged = makeNote(content: "hello", nickname: nil) + + let merged = UnifiedNotices.merge(posts: [post], notes: [bridged]) + + #expect(merged.count == 1) + #expect(merged[0].isBoardPost) + #expect(merged[0].author == "anon") + } + + @Test + func noticeItem_normalizesNoteDisplayName() { + let note = LocationNotesManager.Note( + id: "e1", + pubkey: "deadbeef", + content: "hi", + createdAt: baseDate, + nickname: "dave", + geohash: "9q8yy" + ) + + let item = NoticeItem(note: note) + + #expect(item.author == "dave") + #expect(!item.isBoardPost) + #expect(!item.isUrgent) + } +} diff --git a/bitchatTests/ViewSmokeTests.swift b/bitchatTests/ViewSmokeTests.swift index 786b481e..debb41e5 100644 --- a/bitchatTests/ViewSmokeTests.swift +++ b/bitchatTests/ViewSmokeTests.swift @@ -1,3 +1,4 @@ +import Combine import Testing import Foundation import SwiftUI @@ -39,6 +40,7 @@ private struct SmokeFeatureModels { let verificationModel: VerificationModel let conversationUIModel: ConversationUIModel let peerListModel: PeerListModel + let boardAlertsModel: BoardAlertsModel } @MainActor @@ -80,6 +82,14 @@ private func makeSmokeFeatureModels(for viewModel: ChatViewModel) -> SmokeFeatur locationChannelsModel: locationChannelsModel ) + let boardAlertsModel = BoardAlertsModel( + arrivals: Empty(completeImmediately: false).eraseToAnyPublisher(), + dependencies: BoardAlertsModel.Dependencies( + isOwnPost: { _ in false }, + emitSystemLine: { _, _ in } + ) + ) + return SmokeFeatureModels( publicChatModel: publicChatModel, appChromeModel: appChromeModel, @@ -88,7 +98,8 @@ private func makeSmokeFeatureModels(for viewModel: ChatViewModel) -> SmokeFeatur privateConversationModel: privateConversationModel, verificationModel: verificationModel, conversationUIModel: conversationUIModel, - peerListModel: peerListModel + peerListModel: peerListModel, + boardAlertsModel: boardAlertsModel ) } @@ -106,6 +117,7 @@ private func installSmokeEnvironment( .environmentObject(featureModels.verificationModel) .environmentObject(featureModels.conversationUIModel) .environmentObject(featureModels.peerListModel) + .environmentObject(featureModels.boardAlertsModel) } @MainActor @@ -395,9 +407,17 @@ struct ViewSmokeTests { } @Test - func locationNotesView_rendersNoRelayAndLoadedStates() throws { - let (viewModel, _, _) = makeSmokeViewModel() + func noticesView_rendersNoRelayAndLoadedStates() throws { + let (viewModel, transport, _) = makeSmokeViewModel() let featureModels = makeSmokeFeatureModels(for: viewModel) + featureModels.locationChannelsModel.select(.location(GeohashChannel(level: .building, geohash: "u4pruydq"))) + defer { featureModels.locationChannelsModel.select(.mesh) } + let board = BoardManager( + transport: transport, + store: BoardStore(persistsToDisk: false, fileURL: nil, now: { Date() }), + publishToNostr: { _, _, _, _ in nil }, + deleteFromNostr: { _, _ in } + ) let noRelayManager = LocationNotesManager( geohash: "u4pruydq", @@ -440,18 +460,28 @@ struct ViewSmokeTests { eose?() _ = mount( - LocationNotesView( - geohash: "u4pruydq", + NoticesView( senderNickname: viewModel.nickname, - manager: noRelayManager + board: board, + initialTab: .geo, + notesManager: noRelayManager ) .environmentObject(featureModels.locationChannelsModel) ) _ = mount( - LocationNotesView( - geohash: "u4pruydq", + NoticesView( senderNickname: viewModel.nickname, - manager: loadedManager + board: board, + initialTab: .geo, + notesManager: loadedManager + ) + .environmentObject(featureModels.locationChannelsModel) + ) + _ = mount( + NoticesView( + senderNickname: viewModel.nickname, + board: board, + initialTab: .mesh ) .environmentObject(featureModels.locationChannelsModel) ) From 28ffc53f3fa34c5ff21c6f2df9660f6a5fd3493b Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 17:57:05 +0200 Subject: [PATCH 043/158] i18n: fill all locale gaps so no string falls back to English (#1393) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to #1391 — the Codex review flagged that the new feature-string batch stopped at vi, omitting fil, pt-BR, zh-Hans, and zh-Hant. - Translate the 137 feature strings into fil, pt-BR, zh-Hans, zh-Hant (548 entries) - Translate fingerprint.message.vouched_by (plural) into the 16 locales it was missing, with CLDR-correct plural categories per language - Add the 13 locales missing from the share extension catalog (78 entries), bringing it to the same 29 locales as the main app - Mark the '#%@' channel-hashtag format as shouldTranslate=false like '%@' - Add LocalizationCoverageTests: fails if any translatable key in either catalog is missing any supported locale, or if the share extension supports fewer locales than the main app Machine translations marked needs_review, matching #1391. Verified no existing translation was altered; full suite (1348 tests) green. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Localizable.xcstrings | 3790 ++++++++++++++++- .../Localization/Localizable.xcstrings | 1470 ++++--- bitchatTests/LocalizationCoverageTests.swift | 74 + 3 files changed, 4831 insertions(+), 503 deletions(-) create mode 100644 bitchatTests/LocalizationCoverageTests.swift diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index c2ef1442..8d379ff7 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -2,7 +2,9 @@ "sourceLanguage" : "en", "strings" : { "#%@" : { - + "comment" : "Non-localizable channel hashtag format used in code", + "extractionState" : "manual", + "shouldTranslate" : false }, "%@" : { "comment" : "Non-localizable symbol used in code", @@ -5052,6 +5054,12 @@ "value" : "bloqueado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "na-block" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -5124,6 +5132,12 @@ "value" : "bloqueado" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bloqueado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -5171,6 +5185,18 @@ "state" : "needs_review", "value" : "đã chặn" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已屏蔽" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已屏蔽" + } } } }, @@ -5208,6 +5234,12 @@ "value" : "sesión cifrada de extremo a extremo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "end-to-end na naka-encrypt na session" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -5280,6 +5312,12 @@ "value" : "sessão encriptada ponta a ponta" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sessão criptografada ponto a ponto" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -5327,6 +5365,18 @@ "state" : "needs_review", "value" : "phiên mã hóa đầu cuối" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "端到端加密会话" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "端到端加密會話" + } } } }, @@ -5364,6 +5414,12 @@ "value" : "cifrado fallido — mensajes no protegidos" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nabigo ang pag-encrypt — hindi ligtas ang mga mensahe" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -5436,6 +5492,12 @@ "value" : "falha na encriptação — mensagens não protegidas" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "falha na criptografia — mensagens sem proteção" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -5483,6 +5545,18 @@ "state" : "needs_review", "value" : "mã hóa thất bại — tin nhắn không được bảo mật" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "加密失败 — 消息未受保护" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "加密失敗 — 訊息未受保護" + } } } }, @@ -5520,6 +5594,12 @@ "value" : "favorito — habilita mensajes sin conexión vía Nostr cuando es mutuo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "paborito — nagbibigay-daan sa offline na mensahe sa nostr kapag mutual" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -5592,6 +5672,12 @@ "value" : "favorito — ativa mensagens offline via nostr quando for mútuo" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorito — habilita mensagens offline via nostr quando mútuo" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -5639,6 +5725,18 @@ "state" : "needs_review", "value" : "yêu thích — bật tin nhắn ngoại tuyến qua nostr khi cả hai cùng thích" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "收藏 — 互相收藏后可通过 nostr 发送离线消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "收藏 — 互相收藏後可透過 nostr 收發離線訊息" + } } } }, @@ -5676,6 +5774,12 @@ "value" : "físicamente en el área de este canal de ubicación" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pisikal na nasa lugar ng channel ng lokasyon na ito" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -5748,6 +5852,12 @@ "value" : "fisicamente na área deste canal de localização" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "fisicamente na área deste canal de localização" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -5795,6 +5905,18 @@ "state" : "needs_review", "value" : "hiện đang ở trong khu vực của kênh vị trí này" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "本人就在此位置频道的区域内" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "實際位於此位置頻道的區域內" + } } } }, @@ -5832,6 +5954,12 @@ "value" : "conectado directamente por Bluetooth" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "direktang nakakonekta sa bluetooth" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -5904,6 +6032,12 @@ "value" : "ligado diretamente por bluetooth" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "conectado diretamente por bluetooth" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -5951,6 +6085,18 @@ "state" : "needs_review", "value" : "kết nối trực tiếp qua Bluetooth" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "通过 bluetooth 直接连接" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "透過 bluetooth 直接連線" + } } } }, @@ -5988,6 +6134,12 @@ "value" : "alcanzable a través del mesh, retransmitido por otros" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "maabot sa pamamagitan ng mesh, ipinapasa ng iba" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -6060,6 +6212,12 @@ "value" : "acessível através da mesh, retransmitido por outros" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "alcançável pelo mesh, retransmitido por outros" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -6107,6 +6265,18 @@ "state" : "needs_review", "value" : "có thể tiếp cận qua mesh, được người khác chuyển tiếp" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "可通过 mesh 到达,由他人中继" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "可透過 mesh 到達,由其他人中繼" + } } } }, @@ -6144,6 +6314,12 @@ "value" : "alcanzable por internet (Nostr) — solo favoritos mutuos" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "maabot sa internet (nostr) — mutual na paborito lamang" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -6216,6 +6392,12 @@ "value" : "acessível pela internet (nostr) — apenas favoritos mútuos" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "alcançável pela internet (nostr) — apenas favoritos mútuos" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -6263,6 +6445,18 @@ "state" : "needs_review", "value" : "có thể tiếp cận qua internet (nostr) — chỉ khi cả hai cùng thích" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "可通过互联网 (nostr) 到达 — 仅限互相收藏" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "可透過網際網路 (nostr) 到達 — 僅限互相收藏" + } } } }, @@ -6300,6 +6494,12 @@ "value" : "sin conexión — no alcanzable ahora" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline — kasalukuyang hindi maabot" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -6372,6 +6572,12 @@ "value" : "offline — atualmente inacessível" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline — inalcançável no momento" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -6419,6 +6625,18 @@ "state" : "needs_review", "value" : "ngoại tuyến — hiện không thể tiếp cận" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "离线 — 当前不可达" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "離線 — 目前無法到達" + } } } }, @@ -6456,6 +6674,12 @@ "value" : "teletransportado — se unió al canal desde otro lugar" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nag-teleport — sumali sa channel mula sa ibang lugar" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -6528,6 +6752,12 @@ "value" : "teletransportado — entrou no canal a partir de outro sítio" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teletransportado — entrou no canal de outro lugar" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -6575,6 +6805,18 @@ "state" : "needs_review", "value" : "đã dịch chuyển — tham gia kênh từ nơi khác" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已瞬移 — 从别处加入此频道" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "瞬移 — 從其他地方加入此頻道" + } } } }, @@ -6612,6 +6854,12 @@ "value" : "SÍMBOLOS" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "MGA SIMBOLO" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -6684,6 +6932,12 @@ "value" : "SÍMBOLOS" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "SÍMBOLOS" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -6731,6 +6985,18 @@ "state" : "needs_review", "value" : "KÝ HIỆU" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "符号" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "符號" + } } } }, @@ -6768,6 +7034,12 @@ "value" : "mensajes privados sin leer" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi pa nababasang mga pribadong mensahe" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -6840,6 +7112,12 @@ "value" : "mensagens privadas não lidas" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagens privadas não lidas" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -6887,6 +7165,18 @@ "state" : "needs_review", "value" : "tin nhắn riêng tư chưa đọc" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "未读私信" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "未讀私信" + } } } }, @@ -6924,6 +7214,12 @@ "value" : "identidad verificada" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "beripikado ang pagkakakilanlan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -6996,6 +7292,12 @@ "value" : "identidade verificada" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "identidade verificada" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -7043,6 +7345,18 @@ "state" : "needs_review", "value" : "danh tính đã xác minh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "身份已验证" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "身份已驗證" + } } } }, @@ -7080,6 +7394,12 @@ "value" : "RED" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "NETWORK" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -7152,6 +7472,12 @@ "value" : "REDE" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "REDE" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -7199,6 +7525,18 @@ "state" : "needs_review", "value" : "MẠNG" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "网络" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "網路" + } } } }, @@ -7236,6 +7574,12 @@ "value" : "mapa de peers y enlaces obtenidos de los anuncios del mesh" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mapa ng mga peer at link na natutunan mula sa mga mesh announce" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -7308,6 +7652,12 @@ "value" : "mapa de pares e ligações obtido dos announces mesh" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mapa de pares e conexões aprendido dos anúncios do mesh" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -7355,6 +7705,18 @@ "state" : "needs_review", "value" : "bản đồ các nút ngang hàng và liên kết học được từ các announce mesh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "根据 mesh 广播获知的同伴与链路地图" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "根據 mesh 宣告得知的同伴與連線地圖" + } } } }, @@ -7392,6 +7754,12 @@ "value" : "abre el mapa de topología del mesh" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "binubuksan ang mapa ng mesh topology" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -7464,6 +7832,12 @@ "value" : "abre o mapa de topologia mesh" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abre o mapa de topologia do mesh" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -7511,6 +7885,18 @@ "state" : "needs_review", "value" : "mở bản đồ cấu trúc mesh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打开 mesh 拓扑图" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打開 mesh 拓撲地圖" + } } } }, @@ -7548,6 +7934,12 @@ "value" : "topología del mesh" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh topology" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -7620,6 +8012,12 @@ "value" : "topologia mesh" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologia do mesh" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -7667,6 +8065,18 @@ "state" : "needs_review", "value" : "cấu trúc mesh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh 拓扑" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh 拓撲" + } } } }, @@ -11285,6 +11695,12 @@ "value" : "muestra la información de la app" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ipinapakita ang impormasyon ng app" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -11357,6 +11773,12 @@ "value" : "mostra as informações da app" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mostra informações do app" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -11404,6 +11826,18 @@ "state" : "needs_review", "value" : "hiển thị thông tin ứng dụng" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "显示应用信息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "顯示應用程式資訊" + } } } }, @@ -11441,6 +11875,12 @@ "value" : "adjuntar foto" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "maglakip ng larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -11513,6 +11953,12 @@ "value" : "anexar foto" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "anexar foto" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -11560,6 +12006,18 @@ "state" : "needs_review", "value" : "đính kèm ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "附加照片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "附加照片" + } } } }, @@ -11597,6 +12055,12 @@ "value" : "abre la fototeca; usa la acción tomar foto para la cámara" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "binubuksan ang photo library; gamitin ang aksyong kumuha ng larawan para sa camera" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -11669,6 +12133,12 @@ "value" : "abre a biblioteca de fotos; usa a ação tirar foto para a câmara" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abre a biblioteca de fotos; use a ação tirar foto para a câmera" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -11716,6 +12186,18 @@ "state" : "needs_review", "value" : "mở thư viện ảnh; dùng thao tác chụp ảnh cho máy ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打开照片图库;使用拍照操作可调用相机" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打開照片圖庫;要用相機請使用拍照操作" + } } } }, @@ -12111,6 +12593,12 @@ "value" : "elegir foto" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pumili ng larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -12183,6 +12671,12 @@ "value" : "escolher foto" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "escolher foto" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -12230,6 +12724,18 @@ "state" : "needs_review", "value" : "chọn ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "选择照片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "選擇照片" + } } } }, @@ -12446,6 +12952,12 @@ "value" : "toca para ver los detalles de entrega" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i-tap para makita ang mga detalye ng paghahatid" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -12518,6 +13030,12 @@ "value" : "toca para mostrar os detalhes de entrega" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toque para ver detalhes da entrega" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -12565,6 +13083,18 @@ "state" : "needs_review", "value" : "chạm để xem chi tiết gửi" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "轻点显示送达详情" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "輕點顯示送達詳情" + } } } }, @@ -12781,6 +13311,12 @@ "value" : "Puerta de enlace a internet activa, compartiendo tu conexión con el mesh" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Aktibo ang internet gateway, ibinabahagi ang koneksyon mo sa mesh" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -12853,6 +13389,12 @@ "value" : "gateway de internet ativo, a partilhar a tua ligação com a mesh" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Gateway de internet ativo, compartilhando sua conexão com o mesh" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -12900,6 +13442,18 @@ "state" : "needs_review", "value" : "cổng internet đang hoạt động, chia sẻ kết nối của bạn với mesh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "互联网网关已激活,正在与 mesh 共享你的连接" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "網際網路閘道已啟用,正在與 mesh 分享你的連線" + } } } }, @@ -12936,6 +13490,12 @@ "value" : "Chat de grupo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Group chat" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -13008,6 +13568,12 @@ "value" : "Conversa de grupo" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Chat de grupo" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -13055,6 +13621,18 @@ "state" : "needs_review", "value" : "trò chuyện nhóm" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "群聊" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "群組聊天" + } } } }, @@ -13092,6 +13670,12 @@ "value" : "ir a los mensajes más recientes" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tumalon sa pinakabagong mga mensahe" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -13164,6 +13748,12 @@ "value" : "ir para as mensagens mais recentes" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pular para as mensagens mais recentes" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -13211,6 +13801,18 @@ "state" : "needs_review", "value" : "nhảy đến tin nhắn mới nhất" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "跳到最新消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "跳至最新訊息" + } } } }, @@ -14145,6 +14747,12 @@ "value" : "conectado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nakakonekta" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -14217,6 +14825,12 @@ "value" : "ligado" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "conectado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -14264,6 +14878,18 @@ "state" : "needs_review", "value" : "đã kết nối" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已连接" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已連線" + } } } }, @@ -14301,6 +14927,12 @@ "value" : "nadie alcanzable" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "walang taong maabot" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -14373,6 +15005,12 @@ "value" : "ninguém acessível" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ninguém alcançável" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -14420,6 +15058,18 @@ "state" : "needs_review", "value" : "không ai có thể tiếp cận" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "没有可达的人" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "沒有可到達的人" + } } } }, @@ -15378,6 +16028,12 @@ "value" : "toca dos veces para empezar a grabar, toca dos veces de nuevo para enviar" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i-double tap para simulan ang pagre-record, i-double tap ulit para ipadala" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -15450,6 +16106,12 @@ "value" : "toca duas vezes para começar a gravar, toca duas vezes de novo para enviar" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toque duas vezes para começar a gravar, toque duas vezes de novo para enviar" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -15497,6 +16159,18 @@ "state" : "needs_review", "value" : "chạm hai lần để bắt đầu ghi, chạm hai lần nữa để gửi" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "双击开始录音,再次双击发送" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "雙擊開始錄音,再次雙擊發送" + } } } }, @@ -15534,6 +16208,12 @@ "value" : "grabar nota de voz" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mag-record ng voice note" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -15606,6 +16286,12 @@ "value" : "gravar nota de voz" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gravar mensagem de voz" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -15653,6 +16339,18 @@ "state" : "needs_review", "value" : "ghi chú giọng nói" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "录制语音消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "錄製語音訊息" + } } } }, @@ -15690,6 +16388,12 @@ "value" : "grabando" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nagre-record" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -15762,6 +16466,12 @@ "value" : "a gravar" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gravando" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -15809,6 +16519,18 @@ "state" : "needs_review", "value" : "đang ghi" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "录音中" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "錄音中" + } } } }, @@ -16562,6 +17284,12 @@ "value" : "tomar foto con la cámara" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kumuha ng larawan gamit ang camera" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -16634,6 +17362,12 @@ "value" : "tirar foto com a câmara" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tirar foto com a câmera" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -16681,6 +17415,18 @@ "state" : "needs_review", "value" : "chụp ảnh bằng máy ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "用相机拍照" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "用相機拍照" + } } } }, @@ -17076,6 +17822,12 @@ "value" : "verificar cifrado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "beripikahin ang pag-encrypt" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -17148,6 +17900,12 @@ "value" : "verificar a encriptação" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verificar criptografia" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -17195,6 +17953,18 @@ "state" : "needs_review", "value" : "xác minh mã hóa" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "验证加密" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "驗證加密" + } } } }, @@ -18127,6 +18897,12 @@ "value" : "reenviar" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ipadala muli" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -18199,6 +18975,12 @@ "value" : "reenviar" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "reenviar" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -18246,6 +19028,18 @@ "state" : "needs_review", "value" : "gửi lại" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "重新发送" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "重新發送" + } } } }, @@ -19894,6 +20688,12 @@ "value" : "limpiar chat" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "burahin ang chat" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -19966,6 +20766,12 @@ "value" : "limpar conversa" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "limpar chat" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -20013,6 +20819,18 @@ "state" : "needs_review", "value" : "xóa cuộc trò chuyện" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "清除聊天" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "清除聊天" + } } } }, @@ -20050,6 +20868,12 @@ "value" : "¿limpiar este chat?" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "burahin ang chat na ito?" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -20122,6 +20946,12 @@ "value" : "limpar esta conversa?" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "limpar este chat?" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -20169,6 +20999,18 @@ "state" : "needs_review", "value" : "xóa cuộc trò chuyện này?" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "清除此聊天?" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "清除此聊天?" + } } } }, @@ -20742,6 +21584,12 @@ "value" : "crear o gestionar grupos privados" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lumikha o mamahala ng mga pribadong grupo" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -20814,6 +21662,12 @@ "value" : "criar ou gerir grupos privados" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "criar ou gerenciar grupos privados" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -20861,6 +21715,18 @@ "state" : "needs_review", "value" : "tạo hoặc quản lý nhóm riêng tư" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "创建或管理私密群组" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "建立或管理私密群組" + } } } }, @@ -20898,6 +21764,12 @@ "value" : "mostrar los comandos disponibles" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ipakita ang mga available na utos" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -20970,6 +21842,12 @@ "value" : "mostrar os comandos disponíveis" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mostrar comandos disponíveis" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -21017,6 +21895,18 @@ "state" : "needs_review", "value" : "hiển thị các lệnh khả dụng" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "显示可用指令" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "顯示可用指令" + } } } }, @@ -21412,6 +22302,12 @@ "value" : "enviar un token de ecash Cashu en este chat" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "magpadala ng cashu ecash token sa chat na ito" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -21484,6 +22380,12 @@ "value" : "enviar um token ecash cashu nesta conversa" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enviar um token ecash cashu neste chat" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -21531,6 +22433,18 @@ "state" : "needs_review", "value" : "gửi token cashu ecash trong cuộc trò chuyện này" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "在此聊天中发送 cashu ecash 代币" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "在此聊天中發送 cashu ecash 代幣" + } } } }, @@ -21568,6 +22482,12 @@ "value" : "medir el tiempo de ida y vuelta a un peer del mesh" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sukatin ang round-trip time papunta sa isang mesh peer" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -21640,6 +22560,12 @@ "value" : "medir o tempo de ida e volta até um par mesh" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "medir o tempo de ida e volta até um par do mesh" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -21687,6 +22613,18 @@ "state" : "needs_review", "value" : "đo thời gian khứ hồi đến một nút mesh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "测量到 mesh 同伴的往返时间" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "測量到 mesh 同伴的往返時間" + } } } }, @@ -21903,6 +22841,12 @@ "value" : "estimar la ruta del mesh hasta un peer" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tantiyahin ang mesh path papunta sa isang peer" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -21975,6 +22919,12 @@ "value" : "estimar o caminho mesh até um par" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "estimar o caminho no mesh até um par" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -22022,6 +22972,18 @@ "state" : "needs_review", "value" : "ước tính đường đi mesh đến một nút" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "估计到某个同伴的 mesh 路径" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "估算到同伴的 mesh 路徑" + } } } }, @@ -23491,6 +24453,12 @@ "value" : "cifrado fallido" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nabigo ang pag-encrypt" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -23563,6 +24531,12 @@ "value" : "falha na encriptação" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "falha na criptografia" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -23610,6 +24584,18 @@ "state" : "needs_review", "value" : "mã hóa thất bại" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "加密失败" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "加密失敗" + } } } }, @@ -23647,6 +24633,12 @@ "value" : "no entregado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi naihatid" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -23719,6 +24711,12 @@ "value" : "não entregue" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não entregue" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -23766,6 +24764,18 @@ "state" : "needs_review", "value" : "chưa gửi được" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "未送达" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "未送達" + } } } }, @@ -24519,6 +25529,12 @@ "value" : "no se pudo enviar la nota de voz" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nabigong maipadala ang voice note" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -24591,6 +25607,12 @@ "value" : "falha ao enviar a nota de voz" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível enviar a mensagem de voz" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -24638,6 +25660,18 @@ "state" : "needs_review", "value" : "gửi ghi chú giọng nói thất bại" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "语音消息发送失败" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "語音訊息發送失敗" + } } } }, @@ -24675,6 +25709,12 @@ "value" : "nota de voz demasiado grande" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "masyadong malaki ang voice note" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -24747,6 +25787,12 @@ "value" : "nota de voz demasiado grande" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagem de voz grande demais" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -24794,6 +25840,18 @@ "state" : "needs_review", "value" : "ghi chú giọng nói quá lớn" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "语音消息过大" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "語音訊息過大" + } } } }, @@ -24831,6 +25889,12 @@ "value" : "enviando..." } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ipinapadala..." + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -24903,6 +25967,12 @@ "value" : "a enviar..." } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enviando..." + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -24950,6 +26020,18 @@ "state" : "needs_review", "value" : "đang gửi..." } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "发送中..." + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "發送中..." + } } } }, @@ -24987,6 +26069,12 @@ "value" : "enviado — aún sin confirmación de entrega" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "naipadala — wala pang kumpirmasyon ng paghahatid" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -25059,6 +26147,12 @@ "value" : "enviado — ainda sem confirmação de entrega" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enviada — ainda sem confirmação de entrega" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -25106,6 +26200,18 @@ "state" : "needs_review", "value" : "đã gửi — chưa có xác nhận nhận được" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已发送 — 尚无送达确认" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已發送 — 尚無送達確認" + } } } }, @@ -25143,6 +26249,12 @@ "value" : "estás en #%@ — un canal de ubicación público por internet" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nasa #%@ ka — isang pampublikong channel ng lokasyon sa internet" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -25215,6 +26327,12 @@ "value" : "estás em #%@ — um canal de localização público pela internet" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "você está em #%@ — um canal público de localização pela internet" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -25262,6 +26380,18 @@ "state" : "needs_review", "value" : "bạn đang ở #%@ — một kênh vị trí công khai qua internet" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你在 #%@ — 一个通过互联网的公共位置频道" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你在 #%@ — 一個透過網際網路的公開位置頻道" + } } } }, @@ -25299,6 +26429,12 @@ "value" : "estás en #mesh — llega a personas dentro del alcance de Bluetooth" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nasa #mesh ka — umaabot sa mga taong nasa saklaw ng bluetooth" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -25371,6 +26507,12 @@ "value" : "estás em #mesh — alcança pessoas dentro do alcance bluetooth" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "você está no #mesh — alcança pessoas dentro do alcance do bluetooth" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -25418,6 +26560,18 @@ "state" : "needs_review", "value" : "bạn đang ở #mesh — tiếp cận mọi người trong phạm vi Bluetooth" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你在 #mesh — 可触达 bluetooth 范围内的人" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你在 #mesh — 可到達 bluetooth 範圍內的人" + } } } }, @@ -25455,6 +26609,12 @@ "value" : "nadie a tu alcance todavía... los mensajes aparecerán aquí" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wala pang tao sa saklaw... dito lalabas ang mga mensahe" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -25527,6 +26687,12 @@ "value" : "ainda ninguém ao alcance... as mensagens aparecem aqui" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ninguém no alcance ainda... as mensagens aparecem aqui" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -25574,6 +26740,18 @@ "state" : "needs_review", "value" : "chưa có ai trong phạm vi... tin nhắn sẽ xuất hiện ở đây" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "范围内还没有人... 消息会显示在这里" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "範圍內還沒有人... 訊息會顯示在這裡" + } } } }, @@ -25611,6 +26789,12 @@ "value" : "toca el nombre del canal de arriba para cambiar · toca bitchat/ para ayuda" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i-tap ang pangalan ng channel sa itaas para magpalit · i-tap ang bitchat/ para sa tulong" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -25683,6 +26867,12 @@ "value" : "toca no nome do canal acima para trocar · toca em bitchat/ para ajuda" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toque o nome do canal acima para trocar · toque bitchat/ para ajuda" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -25730,6 +26920,18 @@ "state" : "needs_review", "value" : "chạm tên kênh phía trên để chuyển · chạm bitchat/ để được trợ giúp" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "轻点上方频道名切换 · 轻点 bitchat/ 获取帮助" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "輕點上方頻道名稱切換 · 輕點 bitchat/ 取得協助" + } } } }, @@ -25767,6 +26969,12 @@ "value" : "Compartiendo tu conexión a internet con peers cercanos del mesh" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ibinabahagi ang iyong koneksyon sa internet sa mga kalapit na mesh peer" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -25839,6 +27047,12 @@ "value" : "a partilhar a tua ligação à internet com pares mesh próximos" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Compartilhando sua conexão de internet com pares do mesh por perto" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -25886,6 +27100,18 @@ "state" : "needs_review", "value" : "chia sẻ kết nối internet của bạn với các nút mesh gần đó" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "正在与附近 mesh 同伴共享你的互联网连接" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "正在與附近的 mesh 同伴分享你的網際網路連線" + } } } }, @@ -26460,6 +27686,12 @@ "value" : "create|invite|leave|list" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -26532,6 +27764,12 @@ "value" : "create|invite|leave|list" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -26579,6 +27817,18 @@ "state" : "needs_review", "value" : "create|invite|leave|list" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "create|invite|leave|list" + } } } }, @@ -26795,6 +28045,12 @@ "value" : "mensaje #%@ — público" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensahe sa #%@ — pampubliko" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -26867,6 +28123,12 @@ "value" : "mensagem para #%@ — público" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagem para #%@ — público" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -26914,6 +28176,18 @@ "state" : "needs_review", "value" : "nhắn #%@ — công khai" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "发消息到 #%@ — 公开" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "發訊息到 #%@ — 公開" + } } } }, @@ -26951,6 +28225,12 @@ "value" : "mensaje #mesh — público, cerca" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensahe sa #mesh — pampubliko, malapit" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -27023,6 +28303,12 @@ "value" : "mensagem para #mesh — público, próximo" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagem para #mesh — público, por perto" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -27070,6 +28356,18 @@ "state" : "needs_review", "value" : "nhắn #mesh — công khai, gần đây" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "发消息到 #mesh — 公开、附近" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "發訊息到 #mesh — 公開、附近" + } } } }, @@ -27107,6 +28405,12 @@ "value" : "mensaje %@ — privado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensahe kay %@ — pribado" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -27179,6 +28483,12 @@ "value" : "mensagem para %@ — privado" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mensagem para %@ — privado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -27226,6 +28536,18 @@ "state" : "needs_review", "value" : "nhắn %@ — riêng tư" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "发消息给 %@ — 私密" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "發訊息給 %@ — 私密" + } } } }, @@ -27263,6 +28585,12 @@ "value" : "token" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -27335,6 +28663,12 @@ "value" : "token" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -27382,6 +28716,18 @@ "state" : "needs_review", "value" : "token" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "代币" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "token" + } } } }, @@ -27419,6 +28765,12 @@ "value" : "%lld nuevos" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld bago" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -27491,6 +28843,12 @@ "value" : "%lld novas" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld novas" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -27538,6 +28896,18 @@ "state" : "needs_review", "value" : "%lld mới" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld 条新消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%lld 則新訊息" + } } } }, @@ -28828,6 +30198,12 @@ "value" : "copiar token" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kopyahin ang token" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -28900,6 +30276,12 @@ "value" : "copiar token" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "copiar token" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -28947,6 +30329,18 @@ "state" : "needs_review", "value" : "sao chép token" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "复制代币" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "複製代幣" + } } } }, @@ -29163,6 +30557,12 @@ "value" : "canjear en la cartera" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i-redeem sa wallet" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -29235,6 +30635,12 @@ "value" : "resgatar na wallet" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "resgatar na carteira" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -29282,6 +30688,18 @@ "state" : "needs_review", "value" : "đổi trong ví" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "在钱包中兑换" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "在錢包中兌換" + } } } }, @@ -29319,6 +30737,12 @@ "value" : "canjear en la web" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i-redeem sa web" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -29391,6 +30815,12 @@ "value" : "resgatar na web" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "resgatar na web" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -29438,6 +30868,18 @@ "state" : "needs_review", "value" : "đổi trên web" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "在网页上兑换" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "在網頁上兌換" + } } } }, @@ -29475,6 +30917,12 @@ "value" : "conversación privada" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pribadong pag-uusap" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -29547,6 +30995,12 @@ "value" : "conversa privada" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "conversa privada" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -29594,6 +31048,18 @@ "state" : "needs_review", "value" : "cuộc trò chuyện riêng tư" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "私密对话" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "私密對話" + } } } }, @@ -29631,6 +31097,12 @@ "value" : "privado · cifrado de extremo a extremo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pribado · end-to-end na naka-encrypt" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -29703,6 +31175,12 @@ "value" : "privado · encriptado ponta a ponta" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "privado · criptografado ponto a ponto" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -29750,6 +31228,18 @@ "state" : "needs_review", "value" : "riêng tư · mã hóa đầu cuối" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "私密 · 端到端加密" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "私密 · 端到端加密" + } } } }, @@ -29786,6 +31276,12 @@ "value" : "grupo cifrado · solo miembros" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "naka-encrypt na grupo · mga miyembro lamang" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -29858,6 +31354,12 @@ "value" : "grupo encriptado · apenas membros" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupo criptografado · apenas membros" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -29905,6 +31407,18 @@ "state" : "needs_review", "value" : "nhóm mã hóa · chỉ thành viên" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "加密群组 · 仅限成员" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "加密群組 · 僅限成員" + } } } }, @@ -32448,6 +33962,12 @@ "value" : "✓ AVALADO" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ GINARANTIYAHAN" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -32520,6 +34040,12 @@ "value" : "✓ ATESTADO" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ ENDOSSADO" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -32567,6 +34093,18 @@ "state" : "needs_review", "value" : "✓ ĐÃ BẢO CHỨNG" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ 已担保" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ 已擔保" + } } } }, @@ -33111,6 +34649,58 @@ "comment" : "How many people the user verified have vouched for this peer", "extractionState" : "manual", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "زكّاه %#@people@ ممن تحققت منهم" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "zero" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d أشخاص" + } + }, + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d شخص" + } + }, + "two" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d شخصان" + } + }, + "few" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d أشخاص" + } + }, + "many" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d شخصًا" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d شخص" + } + } + } + } + } + } + }, "bn" : { "variations" : { "plural" : { @@ -33129,6 +34719,34 @@ } } }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "verbürgt von %#@people@, die du verifiziert hast" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d Person" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d Personen" + } + } + } + } + } + } + }, "en" : { "stringUnit" : { "state" : "translated", @@ -33185,6 +34803,102 @@ } } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ginarantiyahan ng %#@people@ na na-verify mo" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d tao" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d tao" + } + } + } + } + } + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "recommandé par %#@people@ que tu as vérifiées" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d personne" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d personnes" + } + } + } + } + } + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ערבו לו %#@people@ שאימתת" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d אדם" + } + }, + "two" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d אנשים" + } + }, + "many" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d אנשים" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d אנשים" + } + } + } + } + } + } + }, "hi" : { "variations" : { "plural" : { @@ -33231,6 +34945,34 @@ } } }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "garantito da %#@people@ che hai verificato" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d persona" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d persone" + } + } + } + } + } + } + }, "ja" : { "stringUnit" : { "state" : "needs_review", @@ -33321,6 +35063,130 @@ } } }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "aanbevolen door %#@people@ die je hebt geverifieerd" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d persoon" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d personen" + } + } + } + } + } + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "poręczone przez %#@people@, które zweryfikowano" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d osobę" + } + }, + "few" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d osoby" + } + }, + "many" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d osób" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d osoby" + } + } + } + } + } + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "avalizado por %#@people@ que verificaste" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d pessoa" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d pessoas" + } + } + } + } + } + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "avalizado por %#@people@ que você verificou" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d pessoa" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d pessoas" + } + } + } + } + } + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -33361,6 +35227,34 @@ } } }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "intygad av %#@people@ som du har verifierat" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d person" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d personer" + } + } + } + } + } + } + }, "ta" : { "variations" : { "plural" : { @@ -33401,6 +35295,102 @@ } } }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "doğruladığın %#@people@ kefil oldu" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d kişi" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d kişi" + } + } + } + } + } + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "за нього поручилися %#@people@, яких ти перевірив" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d особа" + } + }, + "few" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d особи" + } + }, + "many" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d осіб" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d особи" + } + } + } + } + } + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "آپ کے تصدیق شدہ %#@people@ نے ضمانت دی ہے" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d شخص" + } + }, + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d افراد" + } + } + } + } + } + } + }, "vi" : { "stringUnit" : { "state" : "needs_review", @@ -33422,6 +35412,50 @@ } } } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "由你验证过的 %#@people@ 担保" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d 人" + } + } + } + } + } + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "由你驗證過的 %#@people@ 擔保" + }, + "substitutions" : { + "people" : { + "argNum" : 1, + "formatSpecifier" : "lld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d 人" + } + } + } + } + } + } } } }, @@ -34533,6 +36567,12 @@ "value" : "en esta zona" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nasa lugar na ito" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -34605,6 +36645,12 @@ "value" : "nesta área" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nesta área" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -34652,6 +36698,18 @@ "state" : "needs_review", "value" : "trong khu vực này" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "在此区域内" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "在此區域內" + } } } }, @@ -34689,6 +36747,12 @@ "value" : "teletransportado desde otro lugar" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nag-teleport mula sa ibang lugar" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -34761,6 +36825,12 @@ "value" : "teletransportado de outro lugar" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "teletransportado de outro lugar" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -34808,6 +36878,18 @@ "state" : "needs_review", "value" : "dịch chuyển từ nơi khác" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "从别处瞬移而来" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "從其他地方瞬移而來" + } } } }, @@ -34845,6 +36927,12 @@ "value" : "tú" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ikaw" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -34917,6 +37005,12 @@ "value" : "tu" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "você" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -34964,6 +37058,18 @@ "state" : "needs_review", "value" : "bạn" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你" + } } } }, @@ -35358,6 +37464,12 @@ "value" : "Abre el chat de grupo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Binubuksan ang group chat" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -35430,6 +37542,12 @@ "value" : "Abre a conversa de grupo" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Abre o chat do grupo" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -35477,6 +37595,18 @@ "state" : "needs_review", "value" : "mở cuộc trò chuyện nhóm" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打开该群聊" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打開群組聊天" + } } } }, @@ -35513,6 +37643,12 @@ "value" : "(%@)" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -35585,6 +37721,12 @@ "value" : "(%@)" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -35632,6 +37774,18 @@ "state" : "needs_review", "value" : "(%@)" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "(%@)" + } } } }, @@ -35668,6 +37822,12 @@ "value" : "grupos" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mga grupo" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -35740,6 +37900,12 @@ "value" : "grupos" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupos" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -35787,6 +37953,18 @@ "state" : "needs_review", "value" : "nhóm" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "群组" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "群組" + } } } }, @@ -35823,6 +38001,12 @@ "value" : "Creador" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Tagalikha" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -35895,6 +38079,12 @@ "value" : "Criador" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Criador" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -35942,6 +38132,18 @@ "state" : "needs_review", "value" : "người tạo" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "创建者" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "建立者" + } } } }, @@ -36158,6 +38360,12 @@ "value" : "marcar canal" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i-bookmark ang channel" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -36230,6 +38438,12 @@ "value" : "marcar canal" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "marcar canal" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -36277,6 +38491,18 @@ "state" : "needs_review", "value" : "đánh dấu kênh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "为频道添加书签" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "將頻道加入書簽" + } } } }, @@ -36314,6 +38540,12 @@ "value" : "quitar marcador" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "alisin ang bookmark" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -36386,6 +38618,12 @@ "value" : "remover marcador" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "remover marcador" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -36433,6 +38671,18 @@ "state" : "needs_review", "value" : "bỏ đánh dấu" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "移除书签" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "移除書簽" + } } } }, @@ -36470,6 +38720,12 @@ "value" : "cambia a este canal" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "lumilipat sa channel na ito" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -36542,6 +38798,12 @@ "value" : "muda para este canal" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "troca para este canal" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -36589,6 +38851,18 @@ "state" : "needs_review", "value" : "chuyển sang kênh này" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "切换到此频道" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "切換到此頻道" + } } } }, @@ -37879,6 +40153,12 @@ "value" : "comparte tu internet con peers cercanos del mesh para que sus mensajes geohash lleguen a la red" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ibahagi ang iyong internet sa mga kalapit na mesh peer para makarating sa network ang kanilang mga geohash na mensahe" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -37951,6 +40231,12 @@ "value" : "partilha a tua internet com pares mesh próximos para que as mensagens geohash deles cheguem à rede" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "compartilhe sua internet com pares do mesh por perto para que as mensagens geohash deles cheguem à rede" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -37998,6 +40284,18 @@ "state" : "needs_review", "value" : "chia sẻ internet của bạn với các nút mesh gần đó để tin nhắn geohash của họ đến được mạng" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "与附近 mesh 同伴共享你的互联网,让他们的 geohash 消息能到达网络" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "與附近的 mesh 同伴分享你的網際網路,讓他們的 geohash 訊息能傳到網路上" + } } } }, @@ -38035,6 +40333,12 @@ "value" : "puerta de enlace a internet" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "internet gateway" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -38107,6 +40411,12 @@ "value" : "gateway de internet" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gateway de internet" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -38154,6 +40464,18 @@ "state" : "needs_review", "value" : "cổng internet" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "互联网网关" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "網際網路閘道" + } } } }, @@ -44150,6 +46472,12 @@ "value" : "cancelar envío" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kanselahin ang pagpapadala" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -44222,6 +46550,12 @@ "value" : "cancelar envio" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "cancelar envio" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -44269,6 +46603,18 @@ "state" : "needs_review", "value" : "hủy gửi" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "取消发送" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "取消發送" + } } } }, @@ -44306,6 +46652,12 @@ "value" : "imagen oculta" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nakatagong larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -44378,6 +46730,12 @@ "value" : "imagem oculta" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imagem oculta" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -44425,6 +46783,18 @@ "state" : "needs_review", "value" : "hình ảnh ẩn" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已隐藏的图片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "隱藏的圖片" + } } } }, @@ -44462,6 +46832,12 @@ "value" : "abre la imagen a pantalla completa" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "binubuksan ang larawan nang full screen" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -44534,6 +46910,12 @@ "value" : "abre a imagem em ecrã inteiro" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abre a imagem em tela cheia" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -44581,6 +46963,18 @@ "state" : "needs_review", "value" : "mở hình ảnh toàn màn hình" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "全屏打开图片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "全螢幕打開圖片" + } } } }, @@ -44618,6 +47012,12 @@ "value" : "revela la imagen" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ipinapakita ang larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -44690,6 +47090,12 @@ "value" : "revela a imagem" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "revela a imagem" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -44737,6 +47143,18 @@ "state" : "needs_review", "value" : "hiện hình ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "显示图片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "顯示圖片" + } } } }, @@ -44774,6 +47192,12 @@ "value" : "imagen" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -44846,6 +47270,12 @@ "value" : "imagem" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imagem" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -44893,6 +47323,18 @@ "state" : "needs_review", "value" : "hình ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "图片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "圖片" + } } } }, @@ -44930,6 +47372,12 @@ "value" : "enviando imagen" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ipinapadala ang larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -45002,6 +47450,12 @@ "value" : "a enviar imagem" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enviando imagem" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -45049,6 +47503,18 @@ "state" : "needs_review", "value" : "đang gửi hình ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "正在发送图片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "圖片發送中" + } } } }, @@ -45086,6 +47552,12 @@ "value" : "imagen no disponible" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi magagamit ang larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -45158,6 +47630,12 @@ "value" : "imagem indisponível" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "imagem indisponível" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -45205,6 +47683,18 @@ "state" : "needs_review", "value" : "hình ảnh không khả dụng" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "图片不可用" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "圖片不可用" + } } } }, @@ -45242,6 +47732,12 @@ "value" : "eliminar imagen" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "burahin ang larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -45314,6 +47810,12 @@ "value" : "eliminar imagem" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "apagar imagem" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -45361,6 +47863,18 @@ "state" : "needs_review", "value" : "xóa hình ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "删除图片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "刪除圖片" + } } } }, @@ -45398,6 +47912,12 @@ "value" : "ocultar imagen" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "itago ang larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -45470,6 +47990,12 @@ "value" : "ocultar imagem" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ocultar imagem" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -45517,6 +48043,18 @@ "state" : "needs_review", "value" : "ẩn hình ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "隐藏图片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "隱藏圖片" + } } } }, @@ -45554,6 +48092,12 @@ "value" : "abrir imagen" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "buksan ang larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -45626,6 +48170,12 @@ "value" : "abrir imagem" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abrir imagem" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -45673,6 +48223,18 @@ "state" : "needs_review", "value" : "mở hình ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打开图片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打開圖片" + } } } }, @@ -45710,6 +48272,12 @@ "value" : "revelar imagen" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ipakita ang larawan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -45782,6 +48350,12 @@ "value" : "revelar imagem" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "revelar imagem" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -45829,6 +48403,18 @@ "state" : "needs_review", "value" : "hiện hình ảnh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "显示图片" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "顯示圖片" + } } } }, @@ -45866,6 +48452,12 @@ "value" : "esto no se puede deshacer — puede que el remitente no esté a tu alcance para enviarla de nuevo." } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi na ito maibabalik — maaaring wala na sa saklaw ang nagpadala para maipadala itong muli." + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -45938,6 +48530,12 @@ "value" : "isto não pode ser anulado — o remetente pode não estar ao alcance para a enviar de novo." } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "isso não pode ser desfeito — quem enviou pode não estar no alcance para enviar de novo." + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -45985,6 +48583,18 @@ "state" : "needs_review", "value" : "không thể hoàn tác — người gửi có thể không trong phạm vi để gửi lại." } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "此操作无法撤销 — 发送者可能不在范围内,无法再次发送。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "此操作無法復原 — 發送者可能不在範圍內,無法再次發送。" + } } } }, @@ -46022,6 +48632,12 @@ "value" : "¿eliminar esta imagen?" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "burahin ang larawang ito?" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -46094,6 +48710,12 @@ "value" : "eliminar esta imagem?" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "apagar esta imagem?" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -46141,6 +48763,18 @@ "state" : "needs_review", "value" : "xóa hình ảnh này?" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "删除此图片?" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "刪除此圖片?" + } } } }, @@ -46178,6 +48812,12 @@ "value" : "toca para revelar" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i-tap para ipakita" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -46250,6 +48890,12 @@ "value" : "toca para revelar" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "toque para revelar" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -46297,6 +48943,18 @@ "state" : "needs_review", "value" : "chạm để hiện" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "轻点显示" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "輕點顯示" + } } } }, @@ -46334,6 +48992,12 @@ "value" : "pausar nota de voz" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i-pause ang voice note" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -46406,6 +49070,12 @@ "value" : "colocar a nota de voz em pausa" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pausar mensagem de voz" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -46453,6 +49123,18 @@ "state" : "needs_review", "value" : "tạm dừng ghi chú giọng nói" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "暂停语音消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "暫停語音訊息" + } } } }, @@ -46490,6 +49172,12 @@ "value" : "reproducir nota de voz" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i-play ang voice note" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -46562,6 +49250,12 @@ "value" : "reproduzir a nota de voz" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "reproduzir mensagem de voz" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -46609,6 +49303,18 @@ "state" : "needs_review", "value" : "phát ghi chú giọng nói" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "播放语音消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "播放語音訊息" + } } } }, @@ -46646,6 +49352,12 @@ "value" : "abre un chat privado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "binubuksan ang isang pribadong chat" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -46718,6 +49430,12 @@ "value" : "abre uma conversa privada" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abre um chat privado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -46765,6 +49483,18 @@ "state" : "needs_review", "value" : "mở cuộc trò chuyện riêng tư" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打开私聊" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打開私聊" + } } } }, @@ -46802,6 +49532,12 @@ "value" : "mostrar huella" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ipakita ang fingerprint" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -46874,6 +49610,12 @@ "value" : "mostrar impressão digital" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mostrar impressão digital" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -46921,6 +49663,18 @@ "state" : "needs_review", "value" : "hiện vân tay" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "显示指纹" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "顯示指紋" + } } } }, @@ -46958,6 +49712,12 @@ "value" : "bloqueado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "na-block" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -47030,6 +49790,12 @@ "value" : "bloqueado" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bloqueado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -47077,6 +49843,18 @@ "state" : "needs_review", "value" : "đã chặn" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已屏蔽" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已屏蔽" + } } } }, @@ -47114,6 +49892,12 @@ "value" : "favorito" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "paborito" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -47186,6 +49970,12 @@ "value" : "favorito" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "favorito" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -47233,6 +50023,18 @@ "state" : "needs_review", "value" : "yêu thích" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "收藏" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "收藏" + } } } }, @@ -47270,6 +50072,12 @@ "value" : "sin conexión" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -47342,6 +50150,12 @@ "value" : "offline" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "offline" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -47389,6 +50203,18 @@ "state" : "needs_review", "value" : "ngoại tuyến" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "离线" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "離線" + } } } }, @@ -47426,6 +50252,12 @@ "value" : "mensajes nuevos" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "may bagong mensahe" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -47498,6 +50330,12 @@ "value" : "novas mensagens" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "novas mensagens" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -47545,6 +50383,18 @@ "state" : "needs_review", "value" : "tin nhắn mới" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "新消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "新訊息" + } } } }, @@ -47582,6 +50432,12 @@ "value" : "avalado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ginarantiyahan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -47654,6 +50510,12 @@ "value" : "atestado" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "endossado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -47701,6 +50563,18 @@ "state" : "needs_review", "value" : "đã bảo chứng" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已担保" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已擔保" + } } } }, @@ -47917,6 +50791,12 @@ "value" : "avalado por alguien que verificaste" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ginarantiyahan ng taong na-beripika mo" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -47989,6 +50869,12 @@ "value" : "atestado por alguém que verificaste" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "endossado por alguém que você verificou" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -48036,6 +50922,18 @@ "state" : "needs_review", "value" : "được bảo chứng bởi người bạn đã xác minh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "由你已验证的人担保" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "由你驗證過的人擔保" + } } } }, @@ -51305,6 +54203,12 @@ "value" : "enviado por la puerta de enlace del mesh" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "naipadala sa pamamagitan ng mesh gateway" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -51377,6 +54281,12 @@ "value" : "enviado através do gateway mesh" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "enviado pelo gateway do mesh" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -51424,6 +54334,18 @@ "state" : "needs_review", "value" : "đã gửi qua cổng mesh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已通过 mesh 网关发送" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已透過 mesh 閘道發送" + } } } }, @@ -51818,6 +54740,12 @@ "value" : "%@ ya es miembro" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "miyembro na si %@" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -51890,6 +54818,12 @@ "value" : "%@ já é membro" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ já é membro" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -51937,6 +54871,18 @@ "state" : "needs_review", "value" : "%@ đã là thành viên" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 已是成员" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 已是成員" + } } } }, @@ -51973,6 +54919,12 @@ "value" : "no se puede eliminar al creador" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi maaaring alisin ang tagalikha" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -52045,6 +54997,12 @@ "value" : "o criador não pode ser removido" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "o criador não pode ser removido" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -52092,6 +55050,18 @@ "state" : "needs_review", "value" : "không thể xóa người tạo" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "创建者无法被移除" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "無法移除建立者" + } } } }, @@ -52128,6 +55098,12 @@ "value" : "no se pudo crear el grupo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi malikha ang grupo" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -52200,6 +55176,12 @@ "value" : "não foi possível criar o grupo" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível criar o grupo" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -52247,6 +55229,18 @@ "state" : "needs_review", "value" : "không thể tạo nhóm" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "无法创建群组" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "無法建立群組" + } } } }, @@ -52283,6 +55277,12 @@ "value" : "grupo '%@' creado — usa /group invite @name para añadir personas" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nalikha ang grupong '%@' — gamitin ang /group invite @name para magdagdag ng tao" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -52355,6 +55355,12 @@ "value" : "grupo '%@' criado — usa /group invite @name para adicionar pessoas" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "grupo '%@' criado — use /group invite @nome para adicionar pessoas" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -52402,6 +55408,18 @@ "state" : "needs_review", "value" : "đã tạo nhóm '%@' — dùng /group invite @name để thêm người" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已创建群组 '%@' — 使用 /group invite @name 添加成员" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已建立群組「%@」— 使用 /group invite @name 添加成員" + } } } }, @@ -52438,6 +55456,12 @@ "value" : "solo el creador del grupo puede hacer eso" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tanging ang tagalikha ng grupo ang maaaring gumawa niyan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -52510,6 +55534,12 @@ "value" : "só o criador do grupo pode fazer isso" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "só o criador do grupo pode fazer isso" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -52557,6 +55587,18 @@ "state" : "needs_review", "value" : "chỉ người tạo nhóm mới có thể làm điều đó" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "只有群组创建者才能执行该操作" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "只有群組建立者可以這麼做" + } } } }, @@ -52593,6 +55635,12 @@ "value" : "el grupo está lleno (máx. %@ miembros)" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "puno na ang grupo (max %@ miyembro)" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -52665,6 +55713,12 @@ "value" : "o grupo está cheio (máx. %@ membros)" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "o grupo está cheio (máx. %@ membros)" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -52712,6 +55766,18 @@ "state" : "needs_review", "value" : "nhóm đã đầy (tối đa %@ thành viên)" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "群组已满(最多 %@ 名成员)" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "群組已滿(最多 %@ 位成員)" + } } } }, @@ -52748,6 +55814,12 @@ "value" : "tus claves de identidad aún no están listas" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi pa handa ang iyong mga identity key" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -52820,6 +55892,12 @@ "value" : "as tuas chaves de identidade ainda não estão prontas" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "suas chaves de identidade ainda não estão prontas" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -52867,6 +55945,18 @@ "state" : "needs_review", "value" : "khóa danh tính của bạn chưa sẵn sàng" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你的身份密钥尚未就绪" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你的身份金鑰尚未就緒" + } } } }, @@ -52903,6 +55993,12 @@ "value" : "no se pudo generar la invitación al grupo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi mabuo ang imbitasyon sa grupo" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -52975,6 +56071,12 @@ "value" : "não foi possível criar o convite do grupo" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível montar o convite do grupo" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -53022,6 +56124,18 @@ "state" : "needs_review", "value" : "không thể tạo lời mời nhóm" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "无法生成群组邀请" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "無法建立群組邀請" + } } } }, @@ -53058,6 +56172,12 @@ "value" : "invitaste a %1$@ a '%2$@'" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inimbitahan si %1$@ sa '%2$@'" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -53130,6 +56250,12 @@ "value" : "%1$@ convidado para '%2$@'" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$@ foi convidado para '%2$@'" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -53177,6 +56303,18 @@ "state" : "needs_review", "value" : "đã mời %1$@ vào '%2$@'" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已邀请 %1$@ 加入 '%2$@'" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已邀請 %1$@ 加入「%2$@」" + } } } }, @@ -53213,6 +56351,12 @@ "value" : "%2$@ te añadió al grupo '%1$@' — ahora aparece en tu lista de personas" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "idinagdag ka ni %2$@ sa grupong '%1$@' — lalabas na ito sa iyong listahan ng mga tao" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -53285,6 +56429,12 @@ "value" : "foste adicionado ao grupo '%1$@' por %2$@ — agora aparece na tua lista de pessoas" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "você foi adicionado ao grupo '%1$@' por %2$@ — ele agora aparece na sua lista de pessoas" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -53332,6 +56482,18 @@ "state" : "needs_review", "value" : "bạn đã được %2$@ thêm vào nhóm '%1$@' — nó giờ xuất hiện trong danh sách người của bạn" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ 已将你加入群组 '%1$@' — 现在它会显示在你的成员列表中" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%2$@ 將你加入了群組「%1$@」— 現在會顯示在你的成員列表中" + } } } }, @@ -53368,6 +56530,12 @@ "value" : "saliste del grupo '%@'" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "umalis sa grupong '%@'" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -53440,6 +56608,12 @@ "value" : "saíste do grupo '%@'" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "você saiu do grupo '%@'" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -53487,6 +56661,18 @@ "state" : "needs_review", "value" : "đã rời nhóm '%@'" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已退出群组 '%@'" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已離開群組「%@」" + } } } }, @@ -53523,6 +56709,12 @@ "value" : "tus grupos:" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mga grupo mo:" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -53595,6 +56787,12 @@ "value" : "os teus grupos:" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "seus grupos:" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -53642,6 +56840,18 @@ "state" : "needs_review", "value" : "nhóm của bạn:" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你的群组:" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你的群組:" + } } } }, @@ -53678,6 +56888,12 @@ "value" : "'%@' no es miembro de este grupo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi miyembro ng grupong ito si '%@'" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -53750,6 +56966,12 @@ "value" : "'%@' não é membro deste grupo" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' não é membro deste grupo" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -53797,6 +57019,18 @@ "state" : "needs_review", "value" : "'%@' không phải là thành viên của nhóm này" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' 不是此群组的成员" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "「%@」不是此群組的成員" + } } } }, @@ -53833,6 +57067,12 @@ "value" : "los nombres de grupo están limitados a 40 caracteres" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hanggang 40 character lamang ang pangalan ng grupo" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -53905,6 +57145,12 @@ "value" : "os nomes de grupo estão limitados a 40 caracteres" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nomes de grupo são limitados a 40 caracteres" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -53952,6 +57198,18 @@ "state" : "needs_review", "value" : "tên nhóm giới hạn 40 ký tự" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "群组名最多 40 个字符" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "群組名稱最多 40 個字元" + } } } }, @@ -53988,6 +57246,12 @@ "value" : "no estás en ningún grupo — /group create para crear uno" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wala ka sa anumang grupo — /group create para magsimula" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -54060,6 +57324,12 @@ "value" : "não estás em nenhum grupo — /group create para começar um" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "você não está em nenhum grupo — /group create para começar um" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -54107,6 +57377,18 @@ "state" : "needs_review", "value" : "bạn không ở trong nhóm nào — /group create để tạo một nhóm" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你不在任何群组中 — 使用 /group create 创建一个" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你不在任何群組中 — 使用 /group create 建立一個" + } } } }, @@ -54143,6 +57425,12 @@ "value" : "abre primero un chat de grupo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "magbukas muna ng group chat" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -54215,6 +57503,12 @@ "value" : "abre primeiro uma conversa de grupo" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "abra um chat de grupo primeiro" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -54262,6 +57556,18 @@ "state" : "needs_review", "value" : "mở một cuộc trò chuyện nhóm trước" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "请先打开一个群聊" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "請先打開一個群組聊天" + } } } }, @@ -54298,6 +57604,12 @@ "value" : "aún no se puede verificar la identidad de %@ — espera su anuncio" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi pa ma-beripika ang pagkakakilanlan ni %@ — hintayin ang kanilang announce" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -54370,6 +57682,12 @@ "value" : "ainda não é possível verificar a identidade de %@ — aguarda o announce dele" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ainda não é possível verificar a identidade de %@ — aguarde o anúncio dessa pessoa" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -54417,6 +57735,18 @@ "state" : "needs_review", "value" : "chưa thể xác minh danh tính của %@ — chờ announce của họ" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "暂时无法验证 %@ 的身份 — 请等待对方的广播" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "尚無法驗證 %@ 的身份 — 請等待對方的宣告" + } } } }, @@ -54453,6 +57783,12 @@ "value" : "%@ debe estar conectado por mesh para ser invitado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kailangang nakakonekta sa mesh si %@ para maimbitahan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -54525,6 +57861,12 @@ "value" : "%@ tem de estar ligado por mesh para ser convidado" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ precisa estar conectado pelo mesh para ser convidado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -54572,6 +57914,18 @@ "state" : "needs_review", "value" : "%@ phải được kết nối qua mesh để được mời" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 必须通过 mesh 连接才能被邀请" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ 必須透過 mesh 連線才能被邀請" + } } } }, @@ -54608,6 +57962,12 @@ "value" : "'%@' no encontrado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi nahanap si '%@'" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -54680,6 +58040,12 @@ "value" : "'%@' não encontrado" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "'%@' não encontrado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -54727,6 +58093,18 @@ "state" : "needs_review", "value" : "không tìm thấy '%@'" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "未找到 '%@'" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "找不到「%@」" + } } } }, @@ -54763,6 +58141,12 @@ "value" : "fuiste eliminado del grupo '%@'" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inalis ka sa grupong '%@'" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -54835,6 +58219,12 @@ "value" : "foste removido do grupo '%@'" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "você foi removido do grupo '%@'" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -54882,6 +58272,18 @@ "state" : "needs_review", "value" : "bạn đã bị xóa khỏi nhóm '%@'" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你已被移出群组 '%@'" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你已被移出群組「%@」" + } } } }, @@ -54918,6 +58320,12 @@ "value" : "se eliminó a %@ y se rotó la clave del grupo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inalis si %@ at ni-rotate ang group key" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -54990,6 +58398,12 @@ "value" : "%@ removido e chave do grupo rodada" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ foi removido e a chave do grupo foi rotacionada" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -55037,6 +58451,18 @@ "state" : "needs_review", "value" : "đã xóa %@ và xoay khóa nhóm" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已移除 %@ 并轮换了群组密钥" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已移除 %@ 並輪換了群組金鑰" + } } } }, @@ -55073,6 +58499,12 @@ "value" : "no se pudo rotar la clave del grupo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi ma-rotate ang group key" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -55145,6 +58577,12 @@ "value" : "não foi possível rodar a chave do grupo" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível rotacionar a chave do grupo" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -55192,6 +58630,18 @@ "state" : "needs_review", "value" : "không thể xoay khóa nhóm" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "无法轮换群组密钥" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "無法輪換群組金鑰" + } } } }, @@ -55228,6 +58678,12 @@ "value" : "no se pudo cifrar el mensaje" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi ma-encrypt ang mensahe" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -55300,6 +58756,12 @@ "value" : "não foi possível encriptar a mensagem" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível criptografar a mensagem" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -55347,6 +58809,18 @@ "state" : "needs_review", "value" : "không thể mã hóa tin nhắn" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "无法加密该消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "無法加密訊息" + } } } }, @@ -55383,6 +58857,12 @@ "value" : "ya no estás en este grupo" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wala ka na sa grupong ito" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -55455,6 +58935,12 @@ "value" : "já não estás neste grupo" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "você não está mais neste grupo" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -55502,6 +58988,18 @@ "state" : "needs_review", "value" : "bạn không còn ở trong nhóm này" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你已不在此群组中" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "你已不在此群組中" + } } } }, @@ -55538,6 +59036,12 @@ "value" : "uso: /group create " } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "paggamit: /group create " + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -55610,6 +59114,12 @@ "value" : "utilização: /group create " } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uso: /group create " + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -55657,6 +59167,18 @@ "state" : "needs_review", "value" : "cách dùng: /group create " } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "用法:/group create " + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "用法:/group create " + } } } }, @@ -55693,6 +59215,12 @@ "value" : "uso: /group invite @name" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "paggamit: /group invite @name" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -55765,6 +59293,12 @@ "value" : "utilização: /group invite @name" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uso: /group invite @nome" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -55812,6 +59346,18 @@ "state" : "needs_review", "value" : "cách dùng: /group invite @name" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "用法:/group invite @name" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "用法:/group invite @name" + } } } }, @@ -55848,6 +59394,12 @@ "value" : "uso: /group remove @name" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "paggamit: /group remove @name" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -55920,6 +59472,12 @@ "value" : "utilização: /group remove @name" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "uso: /group remove @nome" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -55967,6 +59525,18 @@ "state" : "needs_review", "value" : "cách dùng: /group remove @name" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "用法:/group remove @name" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "用法:/group remove @name" + } } } }, @@ -56362,6 +59932,12 @@ "value" : "no se puede bloquear a %@: no encontrado o no se pudo verificar la identidad" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi ma-block si %@: hindi nahanap o hindi ma-beripika ang pagkakakilanlan" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -56434,6 +60010,12 @@ "value" : "não é possível bloquear %@: não encontrado ou identidade não verificável" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não é possível bloquear %@: não encontrado ou identidade não verificável" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -56481,6 +60063,18 @@ "state" : "needs_review", "value" : "không thể chặn %@: không tìm thấy hoặc không thể xác minh danh tính" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "无法屏蔽 %@:未找到或无法验证身份" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "無法屏蔽 %@:未找到或無法驗證身份" + } } } }, @@ -56518,6 +60112,12 @@ "value" : "se bloqueó a %@. ya no recibirás mensajes suyos" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "na-block si %@. hindi ka na makakatanggap ng mensahe mula sa kanila" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -56590,6 +60190,12 @@ "value" : "%@ bloqueado. deixarás de receber mensagens desta pessoa" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ foi bloqueado. você não vai mais receber mensagens dessa pessoa" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -56637,6 +60243,18 @@ "state" : "needs_review", "value" : "đã chặn %@. bạn sẽ không còn nhận tin nhắn từ họ nữa" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已屏蔽 %@。你将不再收到对方的消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已屏蔽 %@。你將不再收到對方的訊息" + } } } }, @@ -56674,6 +60292,12 @@ "value" : "no se puede desbloquear a %@: no encontrado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi ma-unblock si %@: hindi nahanap" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -56746,6 +60370,12 @@ "value" : "não é possível desbloquear %@: não encontrado" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não é possível desbloquear %@: não encontrado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -56793,6 +60423,18 @@ "state" : "needs_review", "value" : "không thể bỏ chặn %@: không tìm thấy" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "无法取消屏蔽 %@:未找到" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "無法取消屏蔽 %@:未找到" + } } } }, @@ -56830,6 +60472,12 @@ "value" : "se desbloqueó a %@" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "in-unblock si %@" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -56902,6 +60550,12 @@ "value" : "%@ desbloqueado" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ foi desbloqueado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -56949,6 +60603,18 @@ "state" : "needs_review", "value" : "đã bỏ chặn %@" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已取消屏蔽 %@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "已取消屏蔽 %@" + } } } }, @@ -57881,6 +61547,12 @@ "value" : "estimado a partir de listas de vecinos difundidas (hasta 10 por peer) — tu dispositivo está resaltado" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tinantiya mula sa mga ibinahaging listahan ng kapitbahay (hanggang 10 bawat peer) — naka-highlight ang iyong device" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -57953,6 +61625,12 @@ "value" : "estimado a partir de listas de vizinhos difundidas (até 10 por par) — o teu dispositivo está destacado" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "estimado a partir das listas de vizinhos divulgadas (até 10 por par) — seu dispositivo está destacado" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -58000,6 +61678,18 @@ "state" : "needs_review", "value" : "ước tính từ danh sách hàng xóm được gossip (tối đa 10 mỗi nút) — thiết bị của bạn được làm nổi bật" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "根据传播的邻居列表估算(每个同伴最多 10 个)— 你的设备已高亮显示" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "根據同伴間流傳的鄰居列表估算(每位同伴最多 10 個)— 你的裝置已高亮顯示" + } } } }, @@ -58037,6 +61727,12 @@ "value" : "aún no hay enlaces del mesh — el mapa se completa a medida que llegan los anuncios de peers" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wala pang mesh link — napupuno ang mapa habang dumarating ang mga announce ng peer" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -58109,6 +61805,12 @@ "value" : "ainda sem ligações mesh — o mapa preenche-se à medida que chegam os announces dos pares" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nenhuma conexão do mesh ainda — o mapa se preenche conforme os anúncios dos pares chegam" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -58156,6 +61858,18 @@ "state" : "needs_review", "value" : "chưa có liên kết mesh nào — bản đồ sẽ được điền khi các announce của nút đến" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "尚无 mesh 链路 — 随着同伴广播到达,地图会逐渐填充" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "尚無 mesh 連線 — 地圖會隨著同伴宣告到達而逐漸填滿" + } } } }, @@ -58193,6 +61907,12 @@ "value" : "actualizar topología" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "i-refresh ang topology" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -58265,6 +61985,12 @@ "value" : "atualizar topologia" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "atualizar topologia" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -58312,6 +62038,18 @@ "state" : "needs_review", "value" : "làm mới cấu trúc" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "刷新拓扑" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "重新整理拓撲" + } } } }, @@ -58349,6 +62087,12 @@ "value" : "%1$ld peers · %2$ld enlaces" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld peer · %2$ld link" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -58421,6 +62165,12 @@ "value" : "%1$ld pares · %2$ld ligações" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld pares · %2$ld conexões" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -58468,6 +62218,18 @@ "state" : "needs_review", "value" : "%1$ld nút · %2$ld liên kết" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld 个同伴 · %2$ld 条链路" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%1$ld 位同伴 · %2$ld 條連線" + } } } }, @@ -58505,6 +62267,12 @@ "value" : "topología del mesh" } }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh topology" + } + }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -58577,6 +62345,12 @@ "value" : "topologia mesh" } }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "topologia do mesh" + } + }, "ru" : { "stringUnit" : { "state" : "needs_review", @@ -58624,6 +62398,18 @@ "state" : "needs_review", "value" : "cấu trúc mesh" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh 拓扑" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "mesh 拓撲" + } } } }, @@ -60598,4 +64384,4 @@ } }, "version" : "1.1" -} \ No newline at end of file +} diff --git a/bitchatShareExtension/Localization/Localizable.xcstrings b/bitchatShareExtension/Localization/Localizable.xcstrings index 20a68af4..6ffa096c 100644 --- a/bitchatShareExtension/Localization/Localizable.xcstrings +++ b/bitchatShareExtension/Localization/Localizable.xcstrings @@ -1,708 +1,1176 @@ { - "sourceLanguage": "en", - "strings": { - "share.fallback.shared_link_title": { - "extractionState": "manual", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "shared Link", - "comment": "Fallback title when saving a shared link" + "sourceLanguage" : "en", + "strings" : { + "share.fallback.shared_link_title" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "رابط مشترك", + "comment" : "Fallback title when saving a shared link" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "رابط مشترك", - "comment": "Fallback title when saving a shared link" + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "শেয়ার করা লিঙ্ক" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "geteilter link", - "comment": "Fallback title when saving a shared link" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "geteilter link", + "comment" : "Fallback title when saving a shared link" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "enlace compartido", - "comment": "Fallback title when saving a shared link" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "shared Link", + "comment" : "Fallback title when saving a shared link" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "lien partagé", - "comment": "Fallback title when saving a shared link" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "enlace compartido", + "comment" : "Fallback title when saving a shared link" } }, - "he": { - "stringUnit": { - "state": "translated", - "value": "קישור משותף", - "comment": "Fallback title when saving a shared link" + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "naibahaging link" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "tautan dibagikan", - "comment": "Fallback title when saving a shared link" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "lien partagé", + "comment" : "Fallback title when saving a shared link" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "link condiviso", - "comment": "Fallback title when saving a shared link" + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קישור משותף", + "comment" : "Fallback title when saving a shared link" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "共有リンク", - "comment": "Fallback title when saving a shared link" + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "शेयर किया गया लिंक" } }, - "ne": { - "stringUnit": { - "state": "translated", - "value": "साझा गरिएको लिङ्क", - "comment": "Fallback title when saving a shared link" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "tautan dibagikan", + "comment" : "Fallback title when saving a shared link" } }, - "pt-BR": { - "stringUnit": { - "state": "translated", - "value": "link compartilhado", - "comment": "Fallback title when saving a shared link" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "link condiviso", + "comment" : "Fallback title when saving a shared link" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "поделился ссылкой", - "comment": "Fallback title when saving a shared link" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "共有リンク", + "comment" : "Fallback title when saving a shared link" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "спільне посилання", - "comment": "Fallback title when saving a shared link" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공유된 링크", + "comment" : "Fallback title when saving a shared link" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "分享的链接", - "comment": "Fallback title when saving a shared link" + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "pautan dikongsi" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "공유된 링크", - "comment": "Fallback title when saving a shared link" + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "साझा गरिएको लिङ्क", + "comment" : "Fallback title when saving a shared link" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "paylaşılan bağlantı", - "comment": "Fallback title when saving a shared link" + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gedeelde link" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "udostępniony link" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ligação partilhada" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "link compartilhado", + "comment" : "Fallback title when saving a shared link" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "поделился ссылкой", + "comment" : "Fallback title when saving a shared link" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "delad länk" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "பகிரப்பட்ட இணைப்பு" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ลิงก์ที่แชร์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "paylaşılan bağlantı", + "comment" : "Fallback title when saving a shared link" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "спільне посилання", + "comment" : "Fallback title when saving a shared link" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "شیئر کردہ لنک" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "liên kết đã chia sẻ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "分享的链接", + "comment" : "Fallback title when saving a shared link" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "分享的連結" } } } }, - "share.status.failed_to_encode": { - "extractionState": "manual", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "failed to encode link", - "comment": "Shown when the share payload cannot be encoded" + "share.status.failed_to_encode" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعذر ترميز الرابط", + "comment" : "Shown when the share payload cannot be encoded" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "تعذر ترميز الرابط", - "comment": "Shown when the share payload cannot be encoded" + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "লিঙ্ক এনকোড করা যায়নি" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "link konnte nicht codiert werden", - "comment": "Shown when the share payload cannot be encoded" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "link konnte nicht codiert werden", + "comment" : "Shown when the share payload cannot be encoded" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "no se pudo codificar el enlace", - "comment": "Shown when the share payload cannot be encoded" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "failed to encode link", + "comment" : "Shown when the share payload cannot be encoded" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "échec de l'encodage du lien", - "comment": "Shown when the share payload cannot be encoded" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no se pudo codificar el enlace", + "comment" : "Shown when the share payload cannot be encoded" } }, - "he": { - "stringUnit": { - "state": "translated", - "value": "לא ניתן לקודד את הקישור", - "comment": "Shown when the share payload cannot be encoded" + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi ma-encode ang link" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "gagal mengodekan tautan", - "comment": "Shown when the share payload cannot be encoded" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "échec de l'encodage du lien", + "comment" : "Shown when the share payload cannot be encoded" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "impossibile codificare il link", - "comment": "Shown when the share payload cannot be encoded" + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא ניתן לקודד את הקישור", + "comment" : "Shown when the share payload cannot be encoded" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "リンクのエンコードに失敗しました", - "comment": "Shown when the share payload cannot be encoded" + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "लिंक एन्कोड नहीं हो सका" } }, - "ne": { - "stringUnit": { - "state": "translated", - "value": "लिङ्क सङ्केत गर्न सकेन", - "comment": "Shown when the share payload cannot be encoded" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "gagal mengodekan tautan", + "comment" : "Shown when the share payload cannot be encoded" } }, - "pt-BR": { - "stringUnit": { - "state": "translated", - "value": "falha ao codificar link", - "comment": "Shown when the share payload cannot be encoded" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "impossibile codificare il link", + "comment" : "Shown when the share payload cannot be encoded" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "не удалось закодировать ссылку", - "comment": "Shown when the share payload cannot be encoded" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "リンクのエンコードに失敗しました", + "comment" : "Shown when the share payload cannot be encoded" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "не вдалося закодувати посилання", - "comment": "Shown when the share payload cannot be encoded" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "링크를 인코딩하는 데 실패했습니다", + "comment" : "Shown when the share payload cannot be encoded" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "无法编码链接", - "comment": "Shown when the share payload cannot be encoded" + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "gagal mengekod pautan" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "링크를 인코딩하는 데 실패했습니다", - "comment": "Shown when the share payload cannot be encoded" + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "लिङ्क सङ्केत गर्न सकेन", + "comment" : "Shown when the share payload cannot be encoded" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "bağlantı kodlanamadı", - "comment": "Shown when the share payload cannot be encoded" + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "link coderen mislukt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie udało się zakodować linku" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "falha ao codificar a ligação" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "falha ao codificar link", + "comment" : "Shown when the share payload cannot be encoded" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "не удалось закодировать ссылку", + "comment" : "Shown when the share payload cannot be encoded" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "kunde inte koda länken" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "இணைப்பை என்கோட் செய்ய முடியவில்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เข้ารหัสลิงก์ไม่สำเร็จ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "bağlantı kodlanamadı", + "comment" : "Shown when the share payload cannot be encoded" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "не вдалося закодувати посилання", + "comment" : "Shown when the share payload cannot be encoded" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "لنک انکوڈ نہیں ہو سکا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không thể mã hóa liên kết" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法编码链接", + "comment" : "Shown when the share payload cannot be encoded" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "無法編碼連結" } } } }, - "share.status.no_shareable_content": { - "extractionState": "manual", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "no shareable content", - "comment": "Shown when provided content cannot be shared" + "share.status.no_shareable_content" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا محتوى قابلاً للمشاركة", + "comment" : "Shown when provided content cannot be shared" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "لا محتوى قابلاً للمشاركة", - "comment": "Shown when provided content cannot be shared" + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "শেয়ার করার মতো কোনো কনটেন্ট নেই" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "kein teilbarer inhalt", - "comment": "Shown when provided content cannot be shared" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "kein teilbarer inhalt", + "comment" : "Shown when provided content cannot be shared" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "sin contenido que se pueda compartir", - "comment": "Shown when provided content cannot be shared" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "no shareable content", + "comment" : "Shown when provided content cannot be shared" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "aucun contenu partageable", - "comment": "Shown when provided content cannot be shared" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "sin contenido que se pueda compartir", + "comment" : "Shown when provided content cannot be shared" } }, - "he": { - "stringUnit": { - "state": "translated", - "value": "אין תוכן שניתן לשתף", - "comment": "Shown when provided content cannot be shared" + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "walang maibabahaging nilalaman" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "tidak ada konten yang bisa dibagikan", - "comment": "Shown when provided content cannot be shared" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "aucun contenu partageable", + "comment" : "Shown when provided content cannot be shared" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "nessun contenuto condivisibile", - "comment": "Shown when provided content cannot be shared" + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין תוכן שניתן לשתף", + "comment" : "Shown when provided content cannot be shared" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "共有可能なコンテンツがありません", - "comment": "Shown when provided content cannot be shared" + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "शेयर करने योग्य कोई सामग्री नहीं" } }, - "ne": { - "stringUnit": { - "state": "translated", - "value": "बाँड्न मिल्ने सामग्री छैन", - "comment": "Shown when provided content cannot be shared" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "tidak ada konten yang bisa dibagikan", + "comment" : "Shown when provided content cannot be shared" } }, - "pt-BR": { - "stringUnit": { - "state": "translated", - "value": "nenhum conteúdo compartilhável", - "comment": "Shown when provided content cannot be shared" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "nessun contenuto condivisibile", + "comment" : "Shown when provided content cannot be shared" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "нет подходящего контента", - "comment": "Shown when provided content cannot be shared" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "共有可能なコンテンツがありません", + "comment" : "Shown when provided content cannot be shared" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "нема відповідного контенту", - "comment": "Shown when provided content cannot be shared" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공유할 수 있는 내용이 없습니다", + "comment" : "Shown when provided content cannot be shared" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有可分享的素材", - "comment": "Shown when provided content cannot be shared" + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tiada kandungan yang boleh dikongsi" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "공유할 수 있는 내용이 없습니다", - "comment": "Shown when provided content cannot be shared" + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "बाँड्न मिल्ने सामग्री छैन", + "comment" : "Shown when provided content cannot be shared" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "paylaşılabilir içerik yok", - "comment": "Shown when provided content cannot be shared" + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "geen deelbare inhoud" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "brak treści do udostępnienia" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sem conteúdo partilhável" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "nenhum conteúdo compartilhável", + "comment" : "Shown when provided content cannot be shared" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "нет подходящего контента", + "comment" : "Shown when provided content cannot be shared" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inget delbart innehåll" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "பகிரக்கூடிய உள்ளடக்கம் இல்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่มีเนื้อหาที่แชร์ได้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "paylaşılabilir içerik yok", + "comment" : "Shown when provided content cannot be shared" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "нема відповідного контенту", + "comment" : "Shown when provided content cannot be shared" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "شیئر کرنے کے قابل کوئی مواد نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không có nội dung có thể chia sẻ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有可分享的素材", + "comment" : "Shown when provided content cannot be shared" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "沒有可分享的素材" } } } }, - "share.status.nothing_to_share": { - "extractionState": "manual", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "nothing to share", - "comment": "Shown when the share extension receives no content" + "share.status.nothing_to_share" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا شيء لمشاركته", + "comment" : "Shown when the share extension receives no content" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "لا شيء لمشاركته", - "comment": "Shown when the share extension receives no content" + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "শেয়ার করার কিছু নেই" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "nichts zum teilen", - "comment": "Shown when the share extension receives no content" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "nichts zum teilen", + "comment" : "Shown when the share extension receives no content" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "nada que compartir", - "comment": "Shown when the share extension receives no content" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "nothing to share", + "comment" : "Shown when the share extension receives no content" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "rien à partager", - "comment": "Shown when the share extension receives no content" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "nada que compartir", + "comment" : "Shown when the share extension receives no content" } }, - "he": { - "stringUnit": { - "state": "translated", - "value": "אין מה לשתף", - "comment": "Shown when the share extension receives no content" + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "walang maibabahagi" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "tidak ada yang bisa dibagikan", - "comment": "Shown when the share extension receives no content" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "rien à partager", + "comment" : "Shown when the share extension receives no content" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "niente da condividere", - "comment": "Shown when the share extension receives no content" + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין מה לשתף", + "comment" : "Shown when the share extension receives no content" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "共有できるものがありません", - "comment": "Shown when the share extension receives no content" + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "शेयर करने के लिए कुछ नहीं" } }, - "ne": { - "stringUnit": { - "state": "translated", - "value": "बाँड्ने केही छैन", - "comment": "Shown when the share extension receives no content" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "tidak ada yang bisa dibagikan", + "comment" : "Shown when the share extension receives no content" } }, - "pt-BR": { - "stringUnit": { - "state": "translated", - "value": "nada para compartilhar", - "comment": "Shown when the share extension receives no content" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "niente da condividere", + "comment" : "Shown when the share extension receives no content" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "нечем поделиться", - "comment": "Shown when the share extension receives no content" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "共有できるものがありません", + "comment" : "Shown when the share extension receives no content" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "нема чим ділитися", - "comment": "Shown when the share extension receives no content" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공유할 내용이 없습니다", + "comment" : "Shown when the share extension receives no content" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "没有可分享的内容", - "comment": "Shown when the share extension receives no content" + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "tiada apa-apa untuk dikongsi" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "공유할 내용이 없습니다", - "comment": "Shown when the share extension receives no content" + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "बाँड्ने केही छैन", + "comment" : "Shown when the share extension receives no content" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "paylaşılacak bir şey yok", - "comment": "Shown when the share extension receives no content" + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "niets om te delen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie ma nic do udostępnienia" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nada para partilhar" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "nada para compartilhar", + "comment" : "Shown when the share extension receives no content" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "нечем поделиться", + "comment" : "Shown when the share extension receives no content" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "inget att dela" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "பகிர எதுவும் இல்லை" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่มีอะไรให้แชร์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "paylaşılacak bir şey yok", + "comment" : "Shown when the share extension receives no content" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "нема чим ділитися", + "comment" : "Shown when the share extension receives no content" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "شیئر کرنے کے لیے کچھ نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không có gì để chia sẻ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有可分享的内容", + "comment" : "Shown when the share extension receives no content" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "沒有可分享的內容" } } } }, - "share.status.shared_link": { - "extractionState": "manual", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "✓ shared link to bitchat", - "comment": "Confirmation after successfully sharing a link" + "share.status.shared_link" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ تم إرسال الرابط إلى bitchat", + "comment" : "Confirmation after successfully sharing a link" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "✓ تم إرسال الرابط إلى bitchat", - "comment": "Confirmation after successfully sharing a link" + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ bitchat-এ লিঙ্ক শেয়ার করা হয়েছে" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "✓ link zu bitchat geteilt", - "comment": "Confirmation after successfully sharing a link" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ link zu bitchat geteilt", + "comment" : "Confirmation after successfully sharing a link" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "✓ enlace compartido con bitchat", - "comment": "Confirmation after successfully sharing a link" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ shared link to bitchat", + "comment" : "Confirmation after successfully sharing a link" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "✓ lien partagé vers bitchat", - "comment": "Confirmation after successfully sharing a link" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ enlace compartido con bitchat", + "comment" : "Confirmation after successfully sharing a link" } }, - "he": { - "stringUnit": { - "state": "translated", - "value": "✓ הקישור נשלח אל bitchat", - "comment": "Confirmation after successfully sharing a link" + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ naibahagi ang link sa bitchat" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "✓ tautan dikirim ke bitchat", - "comment": "Confirmation after successfully sharing a link" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ lien partagé vers bitchat", + "comment" : "Confirmation after successfully sharing a link" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "✓ link inviato a bitchat", - "comment": "Confirmation after successfully sharing a link" + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ הקישור נשלח אל bitchat", + "comment" : "Confirmation after successfully sharing a link" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "✓ bitchatにリンクを共有", - "comment": "Confirmation after successfully sharing a link" + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ bitchat पर लिंक शेयर किया गया" } }, - "ne": { - "stringUnit": { - "state": "translated", - "value": "✓ bitchat मा लिङ्क पठाइयो", - "comment": "Confirmation after successfully sharing a link" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ tautan dikirim ke bitchat", + "comment" : "Confirmation after successfully sharing a link" } }, - "pt-BR": { - "stringUnit": { - "state": "translated", - "value": "✓ link enviado para bitchat", - "comment": "Confirmation after successfully sharing a link" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ link inviato a bitchat", + "comment" : "Confirmation after successfully sharing a link" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "✓ ссылка отправлена в bitchat", - "comment": "Confirmation after successfully sharing a link" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ bitchatにリンクを共有", + "comment" : "Confirmation after successfully sharing a link" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "✓ посилання надіслано в bitchat", - "comment": "Confirmation after successfully sharing a link" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ bitchat으로 링크를 공유했습니다", + "comment" : "Confirmation after successfully sharing a link" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "✓ 已将链接分享至 bitchat", - "comment": "Confirmation after successfully sharing a link" + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ pautan dikongsi ke bitchat" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "✓ bitchat으로 링크를 공유했습니다", - "comment": "Confirmation after successfully sharing a link" + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ bitchat मा लिङ्क पठाइयो", + "comment" : "Confirmation after successfully sharing a link" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "✓ bitchat'e bağlantı paylaşıldı", - "comment": "Confirmation after successfully sharing a link" + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ link gedeeld met bitchat" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ udostępniono link w bitchat" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ ligação enviada para o bitchat" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ link enviado para bitchat", + "comment" : "Confirmation after successfully sharing a link" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ ссылка отправлена в bitchat", + "comment" : "Confirmation after successfully sharing a link" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ länk delad till bitchat" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ bitchat-க்கு இணைப்பு பகிரப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ แชร์ลิงก์ไปยัง bitchat แล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ bitchat'e bağlantı paylaşıldı", + "comment" : "Confirmation after successfully sharing a link" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ посилання надіслано в bitchat", + "comment" : "Confirmation after successfully sharing a link" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ bitchat پر لنک شیئر کر دیا گیا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ đã chia sẻ liên kết tới bitchat" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ 已将链接分享至 bitchat", + "comment" : "Confirmation after successfully sharing a link" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ 已將連結分享至 bitchat" } } } }, - "share.status.shared_text": { - "extractionState": "manual", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "✓ shared text to bitchat", - "comment": "Confirmation after successfully sharing text" + "share.status.shared_text" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ تم إرسال النص إلى bitchat", + "comment" : "Confirmation after successfully sharing text" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "✓ تم إرسال النص إلى bitchat", - "comment": "Confirmation after successfully sharing text" + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ bitchat-এ টেক্সট শেয়ার করা হয়েছে" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "✓ text zu bitchat geteilt", - "comment": "Confirmation after successfully sharing text" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ text zu bitchat geteilt", + "comment" : "Confirmation after successfully sharing text" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "✓ texto compartido con bitchat", - "comment": "Confirmation after successfully sharing text" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ shared text to bitchat", + "comment" : "Confirmation after successfully sharing text" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "✓ texte partagé vers bitchat", - "comment": "Confirmation after successfully sharing text" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ texto compartido con bitchat", + "comment" : "Confirmation after successfully sharing text" } }, - "he": { - "stringUnit": { - "state": "translated", - "value": "✓ הטקסט נשלח אל bitchat", - "comment": "Confirmation after successfully sharing text" + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ naibahagi ang teksto sa bitchat" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "✓ teks dikirim ke bitchat", - "comment": "Confirmation after successfully sharing text" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ texte partagé vers bitchat", + "comment" : "Confirmation after successfully sharing text" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "✓ testo inviato a bitchat", - "comment": "Confirmation after successfully sharing text" + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ הטקסט נשלח אל bitchat", + "comment" : "Confirmation after successfully sharing text" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "✓ bitchatにテキストを共有", - "comment": "Confirmation after successfully sharing text" + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ bitchat पर टेक्स्ट शेयर किया गया" } }, - "ne": { - "stringUnit": { - "state": "translated", - "value": "✓ bitchat मा पाठ पठाइयो", - "comment": "Confirmation after successfully sharing text" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ teks dikirim ke bitchat", + "comment" : "Confirmation after successfully sharing text" } }, - "pt-BR": { - "stringUnit": { - "state": "translated", - "value": "✓ texto enviado para bitchat", - "comment": "Confirmation after successfully sharing text" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ testo inviato a bitchat", + "comment" : "Confirmation after successfully sharing text" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "✓ текст отправлен в bitchat", - "comment": "Confirmation after successfully sharing text" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ bitchatにテキストを共有", + "comment" : "Confirmation after successfully sharing text" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "✓ текст надіслано в bitchat", - "comment": "Confirmation after successfully sharing text" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ bitchat으로 텍스트를 공유했습니다", + "comment" : "Confirmation after successfully sharing text" } }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "✓ 已将文本分享至 bitchat", - "comment": "Confirmation after successfully sharing text" + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ teks dikongsi ke bitchat" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "✓ bitchat으로 텍스트를 공유했습니다", - "comment": "Confirmation after successfully sharing text" + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ bitchat मा पाठ पठाइयो", + "comment" : "Confirmation after successfully sharing text" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "✓ bitchat'e metin paylaşıldı", - "comment": "Confirmation after successfully sharing text" + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ tekst gedeeld met bitchat" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ udostępniono tekst w bitchat" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ texto enviado para o bitchat" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ texto enviado para bitchat", + "comment" : "Confirmation after successfully sharing text" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ текст отправлен в bitchat", + "comment" : "Confirmation after successfully sharing text" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ text delad till bitchat" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ bitchat-க்கு உரை பகிரப்பட்டது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ แชร์ข้อความไปยัง bitchat แล้ว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ bitchat'e metin paylaşıldı", + "comment" : "Confirmation after successfully sharing text" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ текст надіслано в bitchat", + "comment" : "Confirmation after successfully sharing text" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ bitchat پر متن شیئر کر دیا گیا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ đã chia sẻ văn bản tới bitchat" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "✓ 已将文本分享至 bitchat", + "comment" : "Confirmation after successfully sharing text" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "✓ 已將文字分享至 bitchat" } } } } }, - "version": "1.0" + "version" : "1.0" } diff --git a/bitchatTests/LocalizationCoverageTests.swift b/bitchatTests/LocalizationCoverageTests.swift new file mode 100644 index 00000000..10e0fb87 --- /dev/null +++ b/bitchatTests/LocalizationCoverageTests.swift @@ -0,0 +1,74 @@ +import Testing +import Foundation + +/// Guards against locale gaps in the string catalogs: every translatable key +/// must have a localization for every supported locale, so no user ever sees +/// an English fallback (see PR #1391 review). +struct LocalizationCoverageTests { + private static let repoRoot = URL(fileURLWithPath: #filePath) + .deletingLastPathComponent() // bitchatTests + .deletingLastPathComponent() // repo root + + private struct Catalog { + let sourceLanguage: String + /// key -> set of locales with a localization entry + let coverage: [String: Set] + /// all locales appearing anywhere in the catalog + var allLocales: Set { coverage.values.reduce(into: []) { $0.formUnion($1) } } + } + + private static func loadCatalog(_ relativePath: String) throws -> Catalog { + let url = repoRoot.appendingPathComponent(relativePath) + let data = try Data(contentsOf: url) + let root = try #require(try JSONSerialization.jsonObject(with: data) as? [String: Any]) + let strings = try #require(root["strings"] as? [String: Any]) + let sourceLanguage = try #require(root["sourceLanguage"] as? String) + + var coverage: [String: Set] = [:] + for (key, value) in strings { + guard let entry = value as? [String: Any] else { continue } + if entry["shouldTranslate"] as? Bool == false { continue } + let localizations = entry["localizations"] as? [String: Any] ?? [:] + var locales: Set = [] + for (locale, loc) in localizations { + guard let loc = loc as? [String: Any] else { continue } + // A localization counts if it has a non-empty stringUnit value + // or uses variations/substitutions (plural forms). + if let unit = loc["stringUnit"] as? [String: Any], + let unitValue = unit["value"] as? String, !unitValue.isEmpty { + locales.insert(locale) + } else if loc["variations"] != nil || loc["substitutions"] != nil { + locales.insert(locale) + } + } + coverage[key] = locales + } + return Catalog(sourceLanguage: sourceLanguage, coverage: coverage) + } + + @Test func mainCatalogCoversAllLocalesForEveryKey() throws { + let catalog = try Self.loadCatalog("bitchat/Localizable.xcstrings") + let expected = catalog.allLocales + #expect(expected.count > 1, "catalog should declare more locales than the source language") + for (key, locales) in catalog.coverage.sorted(by: { $0.key < $1.key }) { + let missing = expected.subtracting(locales).sorted() + #expect(missing.isEmpty, "\(key) is missing locales: \(missing.joined(separator: ", "))") + } + } + + @Test func shareExtensionCatalogCoversAllLocalesForEveryKey() throws { + let catalog = try Self.loadCatalog("bitchatShareExtension/Localization/Localizable.xcstrings") + let expected = catalog.allLocales + for (key, locales) in catalog.coverage.sorted(by: { $0.key < $1.key }) { + let missing = expected.subtracting(locales).sorted() + #expect(missing.isEmpty, "\(key) is missing locales: \(missing.joined(separator: ", "))") + } + } + + @Test func shareExtensionSupportsSameLocalesAsMainApp() throws { + let main = try Self.loadCatalog("bitchat/Localizable.xcstrings") + let shareExt = try Self.loadCatalog("bitchatShareExtension/Localization/Localizable.xcstrings") + let missing = main.allLocales.subtracting(shareExt.allLocales).sorted() + #expect(missing.isEmpty, "share extension is missing locales: \(missing.joined(separator: ", "))") + } +} From bbe5e1ef4e8ff61a23536063c2d93cb23c0c48fe Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 18:09:30 +0200 Subject: [PATCH 044/158] Fix reachability-gate races flagged by Codex on #1389 (#1394) P1: TorManager.shutdownCompletely() resets didStart asynchronously (after Arti has actually stopped, up to ~5s later). A brief offline->online flap could call startIfNeeded() inside that window; the guard on didStart dropped it, and nothing reevaluated afterwards, so Tor stayed down while activationAllowed was true. Track shutdowns in flight and record a deferred start, honored when the last shutdown finishes (still gated on allowAutoStart/foreground at that point). P2: NWPathReachabilityMonitor.ingest() cancelled and rescheduled the flush a full debounce interval from "now" on every observation, even duplicates (e.g. interface detail changes while still unsatisfied). ReachabilityDebounce already preserves the original pending.since, so schedule the flush for the remaining time to the true deadline instead of restarting the window. Tests: debounce deadline preservation (pure) + a monitor-level timing test that a mid-window duplicate does not postpone the offline commit. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- .../Services/NetworkReachabilityMonitor.swift | 14 +++++++- .../NetworkReachabilityGateTests.swift | 33 +++++++++++++++++++ localPackages/Arti/Sources/TorManager.swift | 18 ++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/bitchat/Services/NetworkReachabilityMonitor.swift b/bitchat/Services/NetworkReachabilityMonitor.swift index bc2b77cf..53bb0677 100644 --- a/bitchat/Services/NetworkReachabilityMonitor.swift +++ b/bitchat/Services/NetworkReachabilityMonitor.swift @@ -48,6 +48,15 @@ struct ReachabilityDebounce { /// Whether a change is currently waiting out the debounce window. var hasPendingChange: Bool { pending != nil } + /// Time left before the pending change may commit, or `nil` when nothing + /// is pending. Lets callers schedule a flush at the true deadline instead + /// of a full interval from "now" (duplicate observations must not push + /// the deadline out). + func pendingRemaining(at now: Date) -> TimeInterval? { + guard let pending else { return nil } + return max(0, interval - now.timeIntervalSince(pending.since)) + } + /// Feed a raw observation. Returns the new committed value if it changed, /// otherwise `nil`. mutating func observe(reachable: Bool, at now: Date) -> Bool? { @@ -157,7 +166,10 @@ final class NWPathReachabilityMonitor: NetworkReachabilityMonitoring { } } flushWorkItem = work - DispatchQueue.main.asyncAfter(deadline: .now() + debounce.interval, execute: work) + // Fire at the pending change's real deadline (pending.since + interval): + // duplicate path updates re-enter here and must not restart the window. + let delay = debounce.pendingRemaining(at: now()) ?? debounce.interval + DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: work) } private func publish(_ reachable: Bool) { diff --git a/bitchatTests/Services/NetworkReachabilityGateTests.swift b/bitchatTests/Services/NetworkReachabilityGateTests.swift index 420a54db..fee973aa 100644 --- a/bitchatTests/Services/NetworkReachabilityGateTests.swift +++ b/bitchatTests/Services/NetworkReachabilityGateTests.swift @@ -57,6 +57,39 @@ final class NetworkReachabilityGateTests: XCTestCase { XCTAssertTrue(d.committed) } + func test_debounce_duplicateObservationsPreservePendingDeadline() { + var d = ReachabilityDebounce(interval: 2.5, initial: true) + let t0 = Date() + XCTAssertNil(d.observe(reachable: false, at: t0)) + // Duplicate unsatisfied updates mid-window keep the original deadline. + XCTAssertNil(d.observe(reachable: false, at: t0.addingTimeInterval(1.0))) + XCTAssertEqual(d.pendingRemaining(at: t0.addingTimeInterval(1.0)), 1.5) + // A duplicate arriving past the deadline commits immediately. + XCTAssertEqual(d.observe(reachable: false, at: t0.addingTimeInterval(2.5)), false) + XCTAssertNil(d.pendingRemaining(at: t0.addingTimeInterval(2.5))) + } + + func test_monitor_duplicateUpdatesDoNotPostponeOfflineCommit() async { + let monitor = NWPathReachabilityMonitor(debounceInterval: 1.0) + var received: [Bool] = [] + let cancellable = monitor.reachabilityPublisher.sink { received.append($0) } + defer { cancellable.cancel() } + + let start = Date() + monitor.ingest(reachable: false) + try? await Task.sleep(nanoseconds: 500_000_000) + // Duplicate unsatisfied update mid-window (e.g. interface detail change + // while still offline) must not restart the debounce window. + monitor.ingest(reachable: false) + + let committed = await waitUntil(timeout: 2.0) { !received.isEmpty } + XCTAssertTrue(committed) + XCTAssertEqual(received, [false]) + // The flush must fire at the original ~1.0s deadline, not ~1.5s + // (a full interval after the duplicate). + XCTAssertLessThan(Date().timeIntervalSince(start), 1.4) + } + // MARK: - Service gating func test_start_whenUnreachable_suppressesTorAndRelays() { diff --git a/localPackages/Arti/Sources/TorManager.swift b/localPackages/Arti/Sources/TorManager.swift index cd831ba5..2e252fad 100644 --- a/localPackages/Arti/Sources/TorManager.swift +++ b/localPackages/Arti/Sources/TorManager.swift @@ -75,6 +75,11 @@ public final class TorManager: ObservableObject { } private var didStart = false + // shutdownCompletely() resets `didStart` asynchronously (after Arti has + // actually stopped). A startIfNeeded() arriving in that window must not be + // dropped — it is recorded here and honored when the shutdown finishes. + private var shutdownsInFlight = 0 + private var startPendingAfterShutdown = false private var bootstrapMonitorStarted = false private var pathMonitor: NWPathMonitor? private var isAppForeground: Bool = true @@ -90,6 +95,11 @@ public final class TorManager: ObservableObject { public func startIfNeeded() { guard allowAutoStart else { return } guard isAppForeground else { return } + if shutdownsInFlight > 0 { + SecureLogger.debug("TorManager: startIfNeeded() deferred - shutdown in flight", category: .session) + startPendingAfterShutdown = true + return + } guard !didStart else { return } didStart = true isDormant = false @@ -329,6 +339,8 @@ public final class TorManager: ObservableObject { public func shutdownCompletely() { SecureLogger.debug("TorManager: shutdownCompletely() called", category: .session) + startPendingAfterShutdown = false + shutdownsInFlight += 1 Task.detached { [weak self] in guard let self = self else { return } _ = arti_stop() @@ -352,6 +364,12 @@ public final class TorManager: ObservableObject { self.bootstrapMonitorStarted = false // Note: Don't clear startedAt here - it will be set fresh on next startIfNeeded() // Clearing it here races with startup and defeats the grace period + self.shutdownsInFlight -= 1 + if self.shutdownsInFlight == 0 && self.startPendingAfterShutdown { + self.startPendingAfterShutdown = false + SecureLogger.debug("TorManager: honoring start deferred during shutdown", category: .session) + self.startIfNeeded() + } } } } From b0433240354e8dde5600f59f9778fbddee536dc4 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 18:18:41 +0200 Subject: [PATCH 045/158] BLE background presence: pending-connect wake-on-proximity + wake-window maintenance (#1395) iOS cancels nothing for us: pending CBCentralManager connects never expire, complete whenever the peer reappears in range, and relaunch the app via the existing state-restoration path. Use that as the wake-on-proximity mechanism: - BLERecentPeripheralCache: retains handles to recently seen/dropped peripherals (LRU 16, 15 min max age to respect BLE address rotation) - On backgrounding, arm indefinite pending connects to cached peripherals within a slot budget (2 of 6 central slots reserved for live background discovery); armed entries carry lastConnectionAttempt == nil so a quick background/foreground bounce can't strand them as connecting - The 8s app-level connect timeout defers while backgrounded so discovery-driven background connects also stay pending - Foreground return cancels stale pending connects (including connecting entries rebuilt by state restoration after a relaunch) and hands control back to the scanner/scheduler - A link dropped while backgrounded re-arms after the disconnect-settle window, so a peer walking away and returning wakes us again - Packet ingress while backgrounded triggers a catch-up maintenance pass (announce/flush/drain) since the maintenance timer is suspended with the app; rate-limited to the normal 5s cadence Battery cost ~0: pending connects live in the controller's allowlist (no scanning, no app CPU), and the catch-up pass only runs inside wake windows the radio already granted. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- .../BLE/BLERecentPeripheralCache.swift | 53 +++++++ bitchat/Services/BLE/BLEService.swift | 145 +++++++++++++++++- bitchat/Services/TransportConfig.swift | 10 ++ .../BLERecentPeripheralCacheTests.swift | 99 ++++++++++++ 4 files changed, 304 insertions(+), 3 deletions(-) create mode 100644 bitchat/Services/BLE/BLERecentPeripheralCache.swift create mode 100644 bitchatTests/Services/BLERecentPeripheralCacheTests.swift diff --git a/bitchat/Services/BLE/BLERecentPeripheralCache.swift b/bitchat/Services/BLE/BLERecentPeripheralCache.swift new file mode 100644 index 00000000..1f7819fd --- /dev/null +++ b/bitchat/Services/BLE/BLERecentPeripheralCache.swift @@ -0,0 +1,53 @@ +import Foundation + +/// Remembers recently seen bitchat peripherals (fresh discoveries and dropped +/// links) so the service can arm pending background connections against them +/// when the app leaves the foreground. Generic over the peripheral type so +/// the eviction/expiry logic is testable without CoreBluetooth. +final class BLERecentPeripheralCache { + private struct Entry { + let peripheral: Peripheral + var lastSeen: Date + } + + private var entries: [String: Entry] = [:] + private let capacity: Int + private let maxAge: TimeInterval + + init( + capacity: Int = TransportConfig.bleRecentPeripheralCacheCap, + maxAge: TimeInterval = TransportConfig.bleRecentPeripheralMaxAgeSeconds + ) { + self.capacity = capacity + self.maxAge = maxAge + } + + var count: Int { entries.count } + + func record(_ peripheral: Peripheral, peripheralID: String, at now: Date) { + entries[peripheralID] = Entry(peripheral: peripheral, lastSeen: now) + guard entries.count > capacity else { return } + // Inserts overshoot capacity by at most one; evict the stalest entry + if let stalest = entries.min(by: { $0.value.lastSeen < $1.value.lastSeen }) { + entries.removeValue(forKey: stalest.key) + } + } + + /// Most-recently-seen peripherals eligible for a pending background + /// connect, freshest first, capped at `limit`. Expired entries are + /// pruned as a side effect. + func reconnectTargets( + now: Date, + limit: Int, + excluding: (String) -> Bool + ) -> [(peripheralID: String, peripheral: Peripheral)] { + let cutoff = now.addingTimeInterval(-maxAge) + entries = entries.filter { $0.value.lastSeen >= cutoff } + guard limit > 0 else { return [] } + return entries + .filter { !excluding($0.key) } + .sorted { $0.value.lastSeen > $1.value.lastSeen } + .prefix(limit) + .map { (peripheralID: $0.key, peripheral: $0.value.peripheral) } + } +} diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 8d9234af..673210a0 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -197,6 +197,7 @@ final class BLEService: NSObject { private var maintenanceTimer: DispatchSourceTimer? // Single timer for all maintenance tasks private var maintenanceCounter = 0 // Track maintenance cycles + private var lastMaintenanceAt = Date.distantPast // bleQueue-confined; drives background-wake catch-up passes /// Whether real CoreBluetooth managers were initialized. When false (unit /// tests), periodic mesh background work is not started — the maintenance /// timer and the gossip-sync timers only drain BLE writes/notifications, @@ -207,6 +208,9 @@ final class BLEService: NSObject { // MARK: - Connection budget & scheduling (central role) private var connectionScheduler = BLEConnectionScheduler() + // Recently seen peripherals retained for background wake-on-proximity + // connects (bleQueue-confined, like the link state store) + private let recentPeripheralCache = BLERecentPeripheralCache() // MARK: - Adaptive scanning duty-cycle private var scanDutyTimer: DispatchSourceTimer? @@ -1609,6 +1613,9 @@ extension BLEService: CBCentralManagerDelegate { isConnectable: isConnectable, discoveredAt: Date() ) + if isConnectable { + recentPeripheralCache.record(peripheral, peripheralID: peripheralID, at: candidate.discoveredAt) + } let existingState = linkStateStore.state(forPeripheralID: peripheralID).map(BLEExistingConnectionState.init) switch connectionScheduler.handleDiscovery( @@ -1635,7 +1642,15 @@ extension BLEService: CBCentralManagerDelegate { func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { let peripheralID = peripheral.identifier.uuidString - + + #if os(iOS) + // A connect completing while backgrounded is the wake-on-proximity + // path doing its job — worth an info line for field verification. + if !isAppActive { + SecureLogger.info("🌙 Background wake: connected to \(peripheral.name ?? peripheralID) while backgrounded", category: .session) + } + #endif + // Update state to connected linkStateStore.markConnected(peripheral) @@ -1660,7 +1675,24 @@ extension BLEService: CBCentralManagerDelegate { if error != nil { connectionScheduler.recordDisconnectError(peripheralID: peripheralID, at: Date()) } - + + // Retain the handle: a dropped link is the best wake-on-proximity + // candidate if the app backgrounds before the peer returns. + recentPeripheralCache.record(peripheral, peripheralID: peripheralID, at: Date()) + + #if os(iOS) + // Link lost while backgrounded (peer walked away): re-arm a pending + // connect during this wake window so the peer's return wakes us again. + // Delayed past the disconnect-settle window to avoid reconnect thrash + // at range edge. + if !isAppActive { + bleQueue.asyncAfter(deadline: .now() + TransportConfig.bleDisconnectDiscoveryIgnoreSeconds) { [weak self] in + guard let self, !self.isAppActive else { return } + self.armPendingBackgroundConnects() + } + } + #endif + // Clean up references and peer mappings _ = linkStateStore.removePeripheral(peripheralID) if let peerID { @@ -1788,6 +1820,18 @@ extension BLEService { return } + #if os(iOS) + if !self.isAppActive { + // Backgrounded: leave the connect pending. iOS never expires + // it — the controller completes it whenever the peer comes + // back into range, waking the app (state restoration relaunches + // us if we were terminated). Foreground return cancels stale + // pendings via cancelStalePendingConnects(). + SecureLogger.info("🌙 Connect timeout deferred while backgrounded, left pending for wake-on-proximity: \(candidate.name)", category: .session) + return + } + #endif + SecureLogger.debug("⏱️ Timeout: \(candidate.name)", category: .session) central.cancelPeripheralConnection(peripheral) _ = self.linkStateStore.removePeripheral(peripheralID) @@ -3407,11 +3451,12 @@ extension BLEService { centralManager?.stopScan() startScanning() } + cancelStalePendingConnects() logBluetoothStatus("became-active") scheduleBluetoothStatusSample(after: 5.0, context: "active-5s") // No Local Name; nothing to refresh for advertising policy } - + @objc private func appDidEnterBackground() { isAppActive = false // Restart scanning without allow duplicates in background @@ -3419,6 +3464,7 @@ extension BLEService { centralManager?.stopScan() startScanning() } + armPendingBackgroundConnects() // Backgrounding may precede a kill; flush the public-history archive // outside its 30s maintenance cadence. gossipSyncManager?.persistNow() @@ -3426,6 +3472,76 @@ extension BLEService { scheduleBluetoothStatusSample(after: 15.0, context: "background-15s") // No Local Name; nothing to refresh for advertising policy } + + /// Issue indefinite `connect()` requests to recently seen peripherals on + /// backgrounding. Pending connects live in the Bluetooth controller's + /// allowlist — no scanning and no app CPU — and complete whenever a peer + /// comes into range, waking (or relaunching) the app. A couple of central + /// slots stay reserved for connects driven by live background discovery. + private func armPendingBackgroundConnects() { + bleQueue.async { [weak self] in + guard let self, let central = self.centralManager, central.state == .poweredOn else { return } + let budget = TransportConfig.bleMaxCentralLinks + - TransportConfig.bleBackgroundPendingConnectSlotReserve + - self.linkStateStore.connectedOrConnectingPeripheralCount + let now = Date() + let targets = self.recentPeripheralCache.reconnectTargets(now: now, limit: budget) { peripheralID in + let state = self.linkStateStore.state(forPeripheralID: peripheralID) + return state?.isConnected == true || state?.isConnecting == true + } + guard !targets.isEmpty else { return } + for target in targets { + // lastConnectionAttempt stays nil: an indefinite pending connect + // has no attempt clock, and nil marks it always-stale so + // cancelStalePendingConnects() reclaims it on foreground even + // after a quick background→foreground bounce. + self.linkStateStore.setPeripheralState( + BLEPeripheralLinkState( + peripheral: target.peripheral, + characteristic: nil, + peerID: nil, + isConnecting: true, + isConnected: false, + lastConnectionAttempt: nil, + assembler: NotificationStreamAssembler() + ), + for: target.peripheralID + ) + target.peripheral.delegate = self + central.connect(target.peripheral, options: [ + CBConnectPeripheralOptionNotifyOnConnectionKey: true, + CBConnectPeripheralOptionNotifyOnDisconnectionKey: true, + CBConnectPeripheralOptionNotifyOnNotificationKey: true + ]) + } + SecureLogger.info("🌙 Armed \(targets.count) pending background connect(s) for wake-on-proximity", category: .session) + } + } + + /// Foreground restores normal connection management: pending connects + /// older than the connect timeout (including ones rebuilt by state + /// restoration after a relaunch) are cancelled so live scanning and the + /// scheduler take over. Anything still nearby is rediscovered within + /// seconds by the allow-duplicates foreground scan. + private func cancelStalePendingConnects() { + bleQueue.async { [weak self] in + guard let self, let central = self.centralManager else { return } + let now = Date() + var cancelled = 0 + for state in self.linkStateStore.peripheralStates where state.isConnecting && !state.isConnected { + let age = state.lastConnectionAttempt.map { now.timeIntervalSince($0) } ?? .infinity + guard age > TransportConfig.bleConnectTimeoutSeconds else { continue } + let peripheralID = state.peripheral.identifier.uuidString + central.cancelPeripheralConnection(state.peripheral) + _ = self.linkStateStore.removePeripheral(peripheralID) + cancelled += 1 + } + if cancelled > 0 { + SecureLogger.info("🌅 Cancelled \(cancelled) stale pending connect(s) on foreground", category: .session) + self.tryConnectFromQueue() + } + } + } #endif // MARK: Private Message Handling @@ -3774,6 +3890,16 @@ extension BLEService { } } + #if os(iOS) + // The maintenance timer is suspended with the app, so a packet arriving + // while backgrounded means the radio woke us — use the wake window to + // run the announce/flush/drain pass the timer would have run. + if !isAppActive { + bleQueue.async { [weak self] in self?.performBackgroundWakeMaintenanceIfStale() } + } + #endif + + // Process by type switch context.messageType { case .announce: @@ -4270,6 +4396,7 @@ extension BLEService { private func performMaintenance() { maintenanceCounter += 1 + lastMaintenanceAt = Date() let now = Date() let connectedCount = collectionsQueue.sync { peerRegistry.connectedCount } @@ -4334,6 +4461,18 @@ extension BLEService { } } + #if os(iOS) + /// Catch-up maintenance for background wake windows (bleQueue-confined). + /// Rate-limited to the normal maintenance cadence so a burst of inbound + /// packets during one wake still runs at most one extra pass. + private func performBackgroundWakeMaintenanceIfStale() { + guard meshBackgroundEnabled, + !isAppActive, + Date().timeIntervalSince(lastMaintenanceAt) >= TransportConfig.bleMaintenanceInterval else { return } + performMaintenance() + } + #endif + private func checkPeerConnectivity() { let now = Date() let peerIDsForLinkState: [PeerID] = collectionsQueue.sync { peerRegistry.peerIDs } diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 07e11666..63eff4a4 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -242,6 +242,16 @@ enum TransportConfig { static let bleDisconnectNotifyDebounceSeconds: TimeInterval = 0.9 static let bleReconnectLogDebounceSeconds: TimeInterval = 2.0 + // Background wake-on-proximity (iOS). Pending connects issued on + // backgrounding never expire at the OS level: the Bluetooth controller + // completes them whenever the peer reappears in range and relaunches the + // app via state restoration. Entries older than the BLE address-rotation + // window no longer map to a reachable address, so the cache prunes them. + static let bleRecentPeripheralCacheCap: Int = 16 + static let bleRecentPeripheralMaxAgeSeconds: TimeInterval = 15 * 60 + // Central slots kept free for connects driven by live background discovery + static let bleBackgroundPendingConnectSlotReserve: Int = 2 + // Weak-link cooldown after connection timeouts static let bleWeakLinkCooldownSeconds: TimeInterval = 30.0 static let bleWeakLinkRSSICutoff: Int = -90 diff --git a/bitchatTests/Services/BLERecentPeripheralCacheTests.swift b/bitchatTests/Services/BLERecentPeripheralCacheTests.swift new file mode 100644 index 00000000..15eb057e --- /dev/null +++ b/bitchatTests/Services/BLERecentPeripheralCacheTests.swift @@ -0,0 +1,99 @@ +// +// BLERecentPeripheralCacheTests.swift +// bitchatTests +// +// Eviction, expiry, and reconnect-target selection for the background +// wake-on-proximity peripheral cache. +// + +import Testing +import Foundation +@testable import bitchat + +struct BLERecentPeripheralCacheTests { + + private let base = Date(timeIntervalSince1970: 1_700_000_000) + + private func makeCache(capacity: Int = 4, maxAge: TimeInterval = 900) -> BLERecentPeripheralCache { + BLERecentPeripheralCache(capacity: capacity, maxAge: maxAge) + } + + @Test + func recordUpsertsByPeripheralID() { + let cache = makeCache() + cache.record("p1", peripheralID: "A", at: base) + cache.record("p1-updated", peripheralID: "A", at: base.addingTimeInterval(10)) + + #expect(cache.count == 1) + let targets = cache.reconnectTargets(now: base.addingTimeInterval(11), limit: 10) { _ in false } + #expect(targets.map(\.peripheral) == ["p1-updated"]) + } + + @Test + func overCapacityEvictsStalestEntry() { + let cache = makeCache(capacity: 2) + cache.record("p1", peripheralID: "A", at: base) + cache.record("p2", peripheralID: "B", at: base.addingTimeInterval(1)) + cache.record("p3", peripheralID: "C", at: base.addingTimeInterval(2)) + + #expect(cache.count == 2) + let targets = cache.reconnectTargets(now: base.addingTimeInterval(3), limit: 10) { _ in false } + #expect(targets.map(\.peripheralID) == ["C", "B"]) + } + + @Test + func refreshingAnEntryProtectsItFromEviction() { + let cache = makeCache(capacity: 2) + cache.record("p1", peripheralID: "A", at: base) + cache.record("p2", peripheralID: "B", at: base.addingTimeInterval(1)) + // A becomes the freshest again; adding C must evict B, not A + cache.record("p1", peripheralID: "A", at: base.addingTimeInterval(2)) + cache.record("p3", peripheralID: "C", at: base.addingTimeInterval(3)) + + let targets = cache.reconnectTargets(now: base.addingTimeInterval(4), limit: 10) { _ in false } + #expect(targets.map(\.peripheralID) == ["C", "A"]) + } + + @Test + func expiredEntriesArePruned() { + let cache = makeCache(maxAge: 100) + cache.record("p1", peripheralID: "A", at: base) + cache.record("p2", peripheralID: "B", at: base.addingTimeInterval(50)) + + let targets = cache.reconnectTargets(now: base.addingTimeInterval(120), limit: 10) { _ in false } + #expect(targets.map(\.peripheralID) == ["B"]) + #expect(cache.count == 1) + } + + @Test + func targetsAreFreshestFirstAndCappedAtLimit() { + let cache = makeCache(capacity: 8) + for (index, id) in ["A", "B", "C", "D"].enumerated() { + cache.record("p\(id)", peripheralID: id, at: base.addingTimeInterval(TimeInterval(index))) + } + + let targets = cache.reconnectTargets(now: base.addingTimeInterval(10), limit: 2) { _ in false } + #expect(targets.map(\.peripheralID) == ["D", "C"]) + } + + @Test + func excludedPeripheralsAreSkippedWithoutConsumingTheLimit() { + let cache = makeCache(capacity: 8) + for (index, id) in ["A", "B", "C"].enumerated() { + cache.record("p\(id)", peripheralID: id, at: base.addingTimeInterval(TimeInterval(index))) + } + + // C (freshest) is already connected; the two slots go to B and A + let targets = cache.reconnectTargets(now: base.addingTimeInterval(10), limit: 2) { $0 == "C" } + #expect(targets.map(\.peripheralID) == ["B", "A"]) + } + + @Test + func nonPositiveLimitReturnsNothing() { + let cache = makeCache() + cache.record("p1", peripheralID: "A", at: base) + + #expect(cache.reconnectTargets(now: base, limit: 0) { _ in false }.isEmpty) + #expect(cache.reconnectTargets(now: base, limit: -3) { _ in false }.isEmpty) + } +} From 0c3136282e3be93d08f9fc42a90c8ac55410d1b5 Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 7 Jul 2026 18:21:49 +0200 Subject: [PATCH 046/158] Revert "BLE background presence: pending-connect wake-on-proximity + wake-window maintenance (#1395)" This reverts commit b0433240354e8dde5600f59f9778fbddee536dc4. --- .../BLE/BLERecentPeripheralCache.swift | 53 ------- bitchat/Services/BLE/BLEService.swift | 145 +----------------- bitchat/Services/TransportConfig.swift | 10 -- .../BLERecentPeripheralCacheTests.swift | 99 ------------ 4 files changed, 3 insertions(+), 304 deletions(-) delete mode 100644 bitchat/Services/BLE/BLERecentPeripheralCache.swift delete mode 100644 bitchatTests/Services/BLERecentPeripheralCacheTests.swift diff --git a/bitchat/Services/BLE/BLERecentPeripheralCache.swift b/bitchat/Services/BLE/BLERecentPeripheralCache.swift deleted file mode 100644 index 1f7819fd..00000000 --- a/bitchat/Services/BLE/BLERecentPeripheralCache.swift +++ /dev/null @@ -1,53 +0,0 @@ -import Foundation - -/// Remembers recently seen bitchat peripherals (fresh discoveries and dropped -/// links) so the service can arm pending background connections against them -/// when the app leaves the foreground. Generic over the peripheral type so -/// the eviction/expiry logic is testable without CoreBluetooth. -final class BLERecentPeripheralCache { - private struct Entry { - let peripheral: Peripheral - var lastSeen: Date - } - - private var entries: [String: Entry] = [:] - private let capacity: Int - private let maxAge: TimeInterval - - init( - capacity: Int = TransportConfig.bleRecentPeripheralCacheCap, - maxAge: TimeInterval = TransportConfig.bleRecentPeripheralMaxAgeSeconds - ) { - self.capacity = capacity - self.maxAge = maxAge - } - - var count: Int { entries.count } - - func record(_ peripheral: Peripheral, peripheralID: String, at now: Date) { - entries[peripheralID] = Entry(peripheral: peripheral, lastSeen: now) - guard entries.count > capacity else { return } - // Inserts overshoot capacity by at most one; evict the stalest entry - if let stalest = entries.min(by: { $0.value.lastSeen < $1.value.lastSeen }) { - entries.removeValue(forKey: stalest.key) - } - } - - /// Most-recently-seen peripherals eligible for a pending background - /// connect, freshest first, capped at `limit`. Expired entries are - /// pruned as a side effect. - func reconnectTargets( - now: Date, - limit: Int, - excluding: (String) -> Bool - ) -> [(peripheralID: String, peripheral: Peripheral)] { - let cutoff = now.addingTimeInterval(-maxAge) - entries = entries.filter { $0.value.lastSeen >= cutoff } - guard limit > 0 else { return [] } - return entries - .filter { !excluding($0.key) } - .sorted { $0.value.lastSeen > $1.value.lastSeen } - .prefix(limit) - .map { (peripheralID: $0.key, peripheral: $0.value.peripheral) } - } -} diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 673210a0..8d9234af 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -197,7 +197,6 @@ final class BLEService: NSObject { private var maintenanceTimer: DispatchSourceTimer? // Single timer for all maintenance tasks private var maintenanceCounter = 0 // Track maintenance cycles - private var lastMaintenanceAt = Date.distantPast // bleQueue-confined; drives background-wake catch-up passes /// Whether real CoreBluetooth managers were initialized. When false (unit /// tests), periodic mesh background work is not started — the maintenance /// timer and the gossip-sync timers only drain BLE writes/notifications, @@ -208,9 +207,6 @@ final class BLEService: NSObject { // MARK: - Connection budget & scheduling (central role) private var connectionScheduler = BLEConnectionScheduler() - // Recently seen peripherals retained for background wake-on-proximity - // connects (bleQueue-confined, like the link state store) - private let recentPeripheralCache = BLERecentPeripheralCache() // MARK: - Adaptive scanning duty-cycle private var scanDutyTimer: DispatchSourceTimer? @@ -1613,9 +1609,6 @@ extension BLEService: CBCentralManagerDelegate { isConnectable: isConnectable, discoveredAt: Date() ) - if isConnectable { - recentPeripheralCache.record(peripheral, peripheralID: peripheralID, at: candidate.discoveredAt) - } let existingState = linkStateStore.state(forPeripheralID: peripheralID).map(BLEExistingConnectionState.init) switch connectionScheduler.handleDiscovery( @@ -1642,15 +1635,7 @@ extension BLEService: CBCentralManagerDelegate { func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { let peripheralID = peripheral.identifier.uuidString - - #if os(iOS) - // A connect completing while backgrounded is the wake-on-proximity - // path doing its job — worth an info line for field verification. - if !isAppActive { - SecureLogger.info("🌙 Background wake: connected to \(peripheral.name ?? peripheralID) while backgrounded", category: .session) - } - #endif - + // Update state to connected linkStateStore.markConnected(peripheral) @@ -1675,24 +1660,7 @@ extension BLEService: CBCentralManagerDelegate { if error != nil { connectionScheduler.recordDisconnectError(peripheralID: peripheralID, at: Date()) } - - // Retain the handle: a dropped link is the best wake-on-proximity - // candidate if the app backgrounds before the peer returns. - recentPeripheralCache.record(peripheral, peripheralID: peripheralID, at: Date()) - - #if os(iOS) - // Link lost while backgrounded (peer walked away): re-arm a pending - // connect during this wake window so the peer's return wakes us again. - // Delayed past the disconnect-settle window to avoid reconnect thrash - // at range edge. - if !isAppActive { - bleQueue.asyncAfter(deadline: .now() + TransportConfig.bleDisconnectDiscoveryIgnoreSeconds) { [weak self] in - guard let self, !self.isAppActive else { return } - self.armPendingBackgroundConnects() - } - } - #endif - + // Clean up references and peer mappings _ = linkStateStore.removePeripheral(peripheralID) if let peerID { @@ -1820,18 +1788,6 @@ extension BLEService { return } - #if os(iOS) - if !self.isAppActive { - // Backgrounded: leave the connect pending. iOS never expires - // it — the controller completes it whenever the peer comes - // back into range, waking the app (state restoration relaunches - // us if we were terminated). Foreground return cancels stale - // pendings via cancelStalePendingConnects(). - SecureLogger.info("🌙 Connect timeout deferred while backgrounded, left pending for wake-on-proximity: \(candidate.name)", category: .session) - return - } - #endif - SecureLogger.debug("⏱️ Timeout: \(candidate.name)", category: .session) central.cancelPeripheralConnection(peripheral) _ = self.linkStateStore.removePeripheral(peripheralID) @@ -3451,12 +3407,11 @@ extension BLEService { centralManager?.stopScan() startScanning() } - cancelStalePendingConnects() logBluetoothStatus("became-active") scheduleBluetoothStatusSample(after: 5.0, context: "active-5s") // No Local Name; nothing to refresh for advertising policy } - + @objc private func appDidEnterBackground() { isAppActive = false // Restart scanning without allow duplicates in background @@ -3464,7 +3419,6 @@ extension BLEService { centralManager?.stopScan() startScanning() } - armPendingBackgroundConnects() // Backgrounding may precede a kill; flush the public-history archive // outside its 30s maintenance cadence. gossipSyncManager?.persistNow() @@ -3472,76 +3426,6 @@ extension BLEService { scheduleBluetoothStatusSample(after: 15.0, context: "background-15s") // No Local Name; nothing to refresh for advertising policy } - - /// Issue indefinite `connect()` requests to recently seen peripherals on - /// backgrounding. Pending connects live in the Bluetooth controller's - /// allowlist — no scanning and no app CPU — and complete whenever a peer - /// comes into range, waking (or relaunching) the app. A couple of central - /// slots stay reserved for connects driven by live background discovery. - private func armPendingBackgroundConnects() { - bleQueue.async { [weak self] in - guard let self, let central = self.centralManager, central.state == .poweredOn else { return } - let budget = TransportConfig.bleMaxCentralLinks - - TransportConfig.bleBackgroundPendingConnectSlotReserve - - self.linkStateStore.connectedOrConnectingPeripheralCount - let now = Date() - let targets = self.recentPeripheralCache.reconnectTargets(now: now, limit: budget) { peripheralID in - let state = self.linkStateStore.state(forPeripheralID: peripheralID) - return state?.isConnected == true || state?.isConnecting == true - } - guard !targets.isEmpty else { return } - for target in targets { - // lastConnectionAttempt stays nil: an indefinite pending connect - // has no attempt clock, and nil marks it always-stale so - // cancelStalePendingConnects() reclaims it on foreground even - // after a quick background→foreground bounce. - self.linkStateStore.setPeripheralState( - BLEPeripheralLinkState( - peripheral: target.peripheral, - characteristic: nil, - peerID: nil, - isConnecting: true, - isConnected: false, - lastConnectionAttempt: nil, - assembler: NotificationStreamAssembler() - ), - for: target.peripheralID - ) - target.peripheral.delegate = self - central.connect(target.peripheral, options: [ - CBConnectPeripheralOptionNotifyOnConnectionKey: true, - CBConnectPeripheralOptionNotifyOnDisconnectionKey: true, - CBConnectPeripheralOptionNotifyOnNotificationKey: true - ]) - } - SecureLogger.info("🌙 Armed \(targets.count) pending background connect(s) for wake-on-proximity", category: .session) - } - } - - /// Foreground restores normal connection management: pending connects - /// older than the connect timeout (including ones rebuilt by state - /// restoration after a relaunch) are cancelled so live scanning and the - /// scheduler take over. Anything still nearby is rediscovered within - /// seconds by the allow-duplicates foreground scan. - private func cancelStalePendingConnects() { - bleQueue.async { [weak self] in - guard let self, let central = self.centralManager else { return } - let now = Date() - var cancelled = 0 - for state in self.linkStateStore.peripheralStates where state.isConnecting && !state.isConnected { - let age = state.lastConnectionAttempt.map { now.timeIntervalSince($0) } ?? .infinity - guard age > TransportConfig.bleConnectTimeoutSeconds else { continue } - let peripheralID = state.peripheral.identifier.uuidString - central.cancelPeripheralConnection(state.peripheral) - _ = self.linkStateStore.removePeripheral(peripheralID) - cancelled += 1 - } - if cancelled > 0 { - SecureLogger.info("🌅 Cancelled \(cancelled) stale pending connect(s) on foreground", category: .session) - self.tryConnectFromQueue() - } - } - } #endif // MARK: Private Message Handling @@ -3890,16 +3774,6 @@ extension BLEService { } } - #if os(iOS) - // The maintenance timer is suspended with the app, so a packet arriving - // while backgrounded means the radio woke us — use the wake window to - // run the announce/flush/drain pass the timer would have run. - if !isAppActive { - bleQueue.async { [weak self] in self?.performBackgroundWakeMaintenanceIfStale() } - } - #endif - - // Process by type switch context.messageType { case .announce: @@ -4396,7 +4270,6 @@ extension BLEService { private func performMaintenance() { maintenanceCounter += 1 - lastMaintenanceAt = Date() let now = Date() let connectedCount = collectionsQueue.sync { peerRegistry.connectedCount } @@ -4461,18 +4334,6 @@ extension BLEService { } } - #if os(iOS) - /// Catch-up maintenance for background wake windows (bleQueue-confined). - /// Rate-limited to the normal maintenance cadence so a burst of inbound - /// packets during one wake still runs at most one extra pass. - private func performBackgroundWakeMaintenanceIfStale() { - guard meshBackgroundEnabled, - !isAppActive, - Date().timeIntervalSince(lastMaintenanceAt) >= TransportConfig.bleMaintenanceInterval else { return } - performMaintenance() - } - #endif - private func checkPeerConnectivity() { let now = Date() let peerIDsForLinkState: [PeerID] = collectionsQueue.sync { peerRegistry.peerIDs } diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 63eff4a4..07e11666 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -242,16 +242,6 @@ enum TransportConfig { static let bleDisconnectNotifyDebounceSeconds: TimeInterval = 0.9 static let bleReconnectLogDebounceSeconds: TimeInterval = 2.0 - // Background wake-on-proximity (iOS). Pending connects issued on - // backgrounding never expire at the OS level: the Bluetooth controller - // completes them whenever the peer reappears in range and relaunches the - // app via state restoration. Entries older than the BLE address-rotation - // window no longer map to a reachable address, so the cache prunes them. - static let bleRecentPeripheralCacheCap: Int = 16 - static let bleRecentPeripheralMaxAgeSeconds: TimeInterval = 15 * 60 - // Central slots kept free for connects driven by live background discovery - static let bleBackgroundPendingConnectSlotReserve: Int = 2 - // Weak-link cooldown after connection timeouts static let bleWeakLinkCooldownSeconds: TimeInterval = 30.0 static let bleWeakLinkRSSICutoff: Int = -90 diff --git a/bitchatTests/Services/BLERecentPeripheralCacheTests.swift b/bitchatTests/Services/BLERecentPeripheralCacheTests.swift deleted file mode 100644 index 15eb057e..00000000 --- a/bitchatTests/Services/BLERecentPeripheralCacheTests.swift +++ /dev/null @@ -1,99 +0,0 @@ -// -// BLERecentPeripheralCacheTests.swift -// bitchatTests -// -// Eviction, expiry, and reconnect-target selection for the background -// wake-on-proximity peripheral cache. -// - -import Testing -import Foundation -@testable import bitchat - -struct BLERecentPeripheralCacheTests { - - private let base = Date(timeIntervalSince1970: 1_700_000_000) - - private func makeCache(capacity: Int = 4, maxAge: TimeInterval = 900) -> BLERecentPeripheralCache { - BLERecentPeripheralCache(capacity: capacity, maxAge: maxAge) - } - - @Test - func recordUpsertsByPeripheralID() { - let cache = makeCache() - cache.record("p1", peripheralID: "A", at: base) - cache.record("p1-updated", peripheralID: "A", at: base.addingTimeInterval(10)) - - #expect(cache.count == 1) - let targets = cache.reconnectTargets(now: base.addingTimeInterval(11), limit: 10) { _ in false } - #expect(targets.map(\.peripheral) == ["p1-updated"]) - } - - @Test - func overCapacityEvictsStalestEntry() { - let cache = makeCache(capacity: 2) - cache.record("p1", peripheralID: "A", at: base) - cache.record("p2", peripheralID: "B", at: base.addingTimeInterval(1)) - cache.record("p3", peripheralID: "C", at: base.addingTimeInterval(2)) - - #expect(cache.count == 2) - let targets = cache.reconnectTargets(now: base.addingTimeInterval(3), limit: 10) { _ in false } - #expect(targets.map(\.peripheralID) == ["C", "B"]) - } - - @Test - func refreshingAnEntryProtectsItFromEviction() { - let cache = makeCache(capacity: 2) - cache.record("p1", peripheralID: "A", at: base) - cache.record("p2", peripheralID: "B", at: base.addingTimeInterval(1)) - // A becomes the freshest again; adding C must evict B, not A - cache.record("p1", peripheralID: "A", at: base.addingTimeInterval(2)) - cache.record("p3", peripheralID: "C", at: base.addingTimeInterval(3)) - - let targets = cache.reconnectTargets(now: base.addingTimeInterval(4), limit: 10) { _ in false } - #expect(targets.map(\.peripheralID) == ["C", "A"]) - } - - @Test - func expiredEntriesArePruned() { - let cache = makeCache(maxAge: 100) - cache.record("p1", peripheralID: "A", at: base) - cache.record("p2", peripheralID: "B", at: base.addingTimeInterval(50)) - - let targets = cache.reconnectTargets(now: base.addingTimeInterval(120), limit: 10) { _ in false } - #expect(targets.map(\.peripheralID) == ["B"]) - #expect(cache.count == 1) - } - - @Test - func targetsAreFreshestFirstAndCappedAtLimit() { - let cache = makeCache(capacity: 8) - for (index, id) in ["A", "B", "C", "D"].enumerated() { - cache.record("p\(id)", peripheralID: id, at: base.addingTimeInterval(TimeInterval(index))) - } - - let targets = cache.reconnectTargets(now: base.addingTimeInterval(10), limit: 2) { _ in false } - #expect(targets.map(\.peripheralID) == ["D", "C"]) - } - - @Test - func excludedPeripheralsAreSkippedWithoutConsumingTheLimit() { - let cache = makeCache(capacity: 8) - for (index, id) in ["A", "B", "C"].enumerated() { - cache.record("p\(id)", peripheralID: id, at: base.addingTimeInterval(TimeInterval(index))) - } - - // C (freshest) is already connected; the two slots go to B and A - let targets = cache.reconnectTargets(now: base.addingTimeInterval(10), limit: 2) { $0 == "C" } - #expect(targets.map(\.peripheralID) == ["B", "A"]) - } - - @Test - func nonPositiveLimitReturnsNothing() { - let cache = makeCache() - cache.record("p1", peripheralID: "A", at: base) - - #expect(cache.reconnectTargets(now: base, limit: 0) { _ in false }.isEmpty) - #expect(cache.reconnectTargets(now: base, limit: -3) { _ in false }.isEmpty) - } -} From f79c2e3e9fd537588ecbcf11b261d146d575b9de Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 19:54:10 +0200 Subject: [PATCH 047/158] BLE background presence: pending-connect wake-on-proximity + wake-window maintenance (#1396) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * BLE background presence: pending-connect wake-on-proximity + wake-window maintenance (#1395) iOS cancels nothing for us: pending CBCentralManager connects never expire, complete whenever the peer reappears in range, and relaunch the app via the existing state-restoration path. Use that as the wake-on-proximity mechanism: - BLERecentPeripheralCache: retains handles to recently seen/dropped peripherals (LRU 16, 15 min max age to respect BLE address rotation) - On backgrounding, arm indefinite pending connects to cached peripherals within a slot budget (2 of 6 central slots reserved for live background discovery); armed entries carry lastConnectionAttempt == nil so a quick background/foreground bounce can't strand them as connecting - The 8s app-level connect timeout defers while backgrounded so discovery-driven background connects also stay pending - Foreground return cancels stale pending connects (including connecting entries rebuilt by state restoration after a relaunch) and hands control back to the scanner/scheduler - A link dropped while backgrounded re-arms after the disconnect-settle window, so a peer walking away and returning wakes us again - Packet ingress while backgrounded triggers a catch-up maintenance pass (announce/flush/drain) since the maintenance timer is suspended with the app; rate-limited to the normal 5s cadence Battery cost ~0: pending connects live in the controller's allowlist (no scanning, no app CPU), and the catch-up pass only runs inside wake windows the radio already granted. Co-authored-by: jack Co-authored-by: Claude Fable 5 * Restore: seed wake-on-proximity cache and resume service discovery Field finding from on-device testing: after a state-restoration relaunch, the recent-peripheral cache starts empty, so backgrounding shortly after a restore armed no pending connects. Seed the cache from the restored peripherals — they are the freshest proximity candidates we have. Also resume service discovery for peripherals restored as connected with no characteristic: the CBCharacteristic reference dies with the old process, and without rediscovery the link sits connected-but-unusable until the peer drops it. Co-Authored-By: Claude Fable 5 * Defer restored-link service rediscovery until poweredOn Field finding: CBPeripheral.discoverServices issued inside willRestoreState fires before the central manager reaches poweredOn — CoreBluetooth drops the command with an API MISUSE warning, leaving restored-connected links characteristic-less after all. Move the rediscovery to centralManagerDidUpdateState(.poweredOn), which restoration guarantees runs afterwards. Co-Authored-By: Claude Fable 5 * Let disconnect re-arms use the freed slot (Codex P2 on #1396) The background-entry arm reserves 2 of 6 central slots for live discovery, but the disconnect re-arm path shared that budget: with 4+ links remaining the budget hit zero and the just-dropped peer was never armed — defeating walk-away/walk-back re-arming in dense meshes. The disconnect path now arms with no reserve, consuming the slot the disconnect itself freed. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- .../BLE/BLERecentPeripheralCache.swift | 53 ++++++ bitchat/Services/BLE/BLEService.swift | 171 +++++++++++++++++- bitchat/Services/TransportConfig.swift | 10 + .../BLERecentPeripheralCacheTests.swift | 99 ++++++++++ 4 files changed, 330 insertions(+), 3 deletions(-) create mode 100644 bitchat/Services/BLE/BLERecentPeripheralCache.swift create mode 100644 bitchatTests/Services/BLERecentPeripheralCacheTests.swift diff --git a/bitchat/Services/BLE/BLERecentPeripheralCache.swift b/bitchat/Services/BLE/BLERecentPeripheralCache.swift new file mode 100644 index 00000000..1f7819fd --- /dev/null +++ b/bitchat/Services/BLE/BLERecentPeripheralCache.swift @@ -0,0 +1,53 @@ +import Foundation + +/// Remembers recently seen bitchat peripherals (fresh discoveries and dropped +/// links) so the service can arm pending background connections against them +/// when the app leaves the foreground. Generic over the peripheral type so +/// the eviction/expiry logic is testable without CoreBluetooth. +final class BLERecentPeripheralCache { + private struct Entry { + let peripheral: Peripheral + var lastSeen: Date + } + + private var entries: [String: Entry] = [:] + private let capacity: Int + private let maxAge: TimeInterval + + init( + capacity: Int = TransportConfig.bleRecentPeripheralCacheCap, + maxAge: TimeInterval = TransportConfig.bleRecentPeripheralMaxAgeSeconds + ) { + self.capacity = capacity + self.maxAge = maxAge + } + + var count: Int { entries.count } + + func record(_ peripheral: Peripheral, peripheralID: String, at now: Date) { + entries[peripheralID] = Entry(peripheral: peripheral, lastSeen: now) + guard entries.count > capacity else { return } + // Inserts overshoot capacity by at most one; evict the stalest entry + if let stalest = entries.min(by: { $0.value.lastSeen < $1.value.lastSeen }) { + entries.removeValue(forKey: stalest.key) + } + } + + /// Most-recently-seen peripherals eligible for a pending background + /// connect, freshest first, capped at `limit`. Expired entries are + /// pruned as a side effect. + func reconnectTargets( + now: Date, + limit: Int, + excluding: (String) -> Bool + ) -> [(peripheralID: String, peripheral: Peripheral)] { + let cutoff = now.addingTimeInterval(-maxAge) + entries = entries.filter { $0.value.lastSeen >= cutoff } + guard limit > 0 else { return [] } + return entries + .filter { !excluding($0.key) } + .sorted { $0.value.lastSeen > $1.value.lastSeen } + .prefix(limit) + .map { (peripheralID: $0.key, peripheral: $0.value.peripheral) } + } +} diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 8d9234af..a021661c 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -197,6 +197,7 @@ final class BLEService: NSObject { private var maintenanceTimer: DispatchSourceTimer? // Single timer for all maintenance tasks private var maintenanceCounter = 0 // Track maintenance cycles + private var lastMaintenanceAt = Date.distantPast // bleQueue-confined; drives background-wake catch-up passes /// Whether real CoreBluetooth managers were initialized. When false (unit /// tests), periodic mesh background work is not started — the maintenance /// timer and the gossip-sync timers only drain BLE writes/notifications, @@ -207,6 +208,9 @@ final class BLEService: NSObject { // MARK: - Connection budget & scheduling (central role) private var connectionScheduler = BLEConnectionScheduler() + // Recently seen peripherals retained for background wake-on-proximity + // connects (bleQueue-confined, like the link state store) + private let recentPeripheralCache = BLERecentPeripheralCache() // MARK: - Adaptive scanning duty-cycle private var scanDutyTimer: DispatchSourceTimer? @@ -1515,6 +1519,14 @@ extension BLEService: CBCentralManagerDelegate { assembler: assembler ) linkStateStore.setPeripheralState(restoredState, for: identifier) + + // Restored peripherals are the freshest wake-on-proximity + // candidates we have after a relaunch — without this the cache + // starts empty and backgrounding right after a restore arms + // nothing. Service rediscovery for restored-connected links waits + // for poweredOn: CoreBluetooth drops commands issued during + // restoration (API MISUSE warnings). + recentPeripheralCache.record(peripheral, peripheralID: identifier, at: Date()) } captureBluetoothStatus(context: "central-restore") @@ -1530,6 +1542,17 @@ extension BLEService: CBCentralManagerDelegate { switch central.state { case .poweredOn: + // Links restored as connected have no characteristic in the new + // process; without rediscovery they sit connected-but-unusable + // until the peer disconnects. Runs here (not willRestoreState) + // because commands issued before poweredOn are dropped. + for state in linkStateStore.peripheralStates where state.isConnected + && state.characteristic == nil + && state.peripheral.state == .connected { + SecureLogger.info("♻️ Rediscovering services on restored link: \(state.peripheral.identifier.uuidString.prefix(8))…", category: .session) + state.peripheral.discoverServices([BLEService.serviceUUID]) + } + // Start scanning - use allow duplicates for faster discovery when active startScanning() @@ -1609,6 +1632,9 @@ extension BLEService: CBCentralManagerDelegate { isConnectable: isConnectable, discoveredAt: Date() ) + if isConnectable { + recentPeripheralCache.record(peripheral, peripheralID: peripheralID, at: candidate.discoveredAt) + } let existingState = linkStateStore.state(forPeripheralID: peripheralID).map(BLEExistingConnectionState.init) switch connectionScheduler.handleDiscovery( @@ -1635,7 +1661,15 @@ extension BLEService: CBCentralManagerDelegate { func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { let peripheralID = peripheral.identifier.uuidString - + + #if os(iOS) + // A connect completing while backgrounded is the wake-on-proximity + // path doing its job — worth an info line for field verification. + if !isAppActive { + SecureLogger.info("🌙 Background wake: connected to \(peripheral.name ?? peripheralID) while backgrounded", category: .session) + } + #endif + // Update state to connected linkStateStore.markConnected(peripheral) @@ -1660,7 +1694,26 @@ extension BLEService: CBCentralManagerDelegate { if error != nil { connectionScheduler.recordDisconnectError(peripheralID: peripheralID, at: Date()) } - + + // Retain the handle: a dropped link is the best wake-on-proximity + // candidate if the app backgrounds before the peer returns. + recentPeripheralCache.record(peripheral, peripheralID: peripheralID, at: Date()) + + #if os(iOS) + // Link lost while backgrounded (peer walked away): re-arm a pending + // connect during this wake window so the peer's return wakes us again. + // Delayed past the disconnect-settle window to avoid reconnect thrash + // at range edge. + if !isAppActive { + bleQueue.asyncAfter(deadline: .now() + TransportConfig.bleDisconnectDiscoveryIgnoreSeconds) { [weak self] in + guard let self, !self.isAppActive else { return } + // Reserve 0: use the slot this disconnect freed even in a + // dense mesh, so the lost peer can wake us when it returns. + self.armPendingBackgroundConnects(slotReserve: 0) + } + } + #endif + // Clean up references and peer mappings _ = linkStateStore.removePeripheral(peripheralID) if let peerID { @@ -1788,6 +1841,18 @@ extension BLEService { return } + #if os(iOS) + if !self.isAppActive { + // Backgrounded: leave the connect pending. iOS never expires + // it — the controller completes it whenever the peer comes + // back into range, waking the app (state restoration relaunches + // us if we were terminated). Foreground return cancels stale + // pendings via cancelStalePendingConnects(). + SecureLogger.info("🌙 Connect timeout deferred while backgrounded, left pending for wake-on-proximity: \(candidate.name)", category: .session) + return + } + #endif + SecureLogger.debug("⏱️ Timeout: \(candidate.name)", category: .session) central.cancelPeripheralConnection(peripheral) _ = self.linkStateStore.removePeripheral(peripheralID) @@ -3407,11 +3472,12 @@ extension BLEService { centralManager?.stopScan() startScanning() } + cancelStalePendingConnects() logBluetoothStatus("became-active") scheduleBluetoothStatusSample(after: 5.0, context: "active-5s") // No Local Name; nothing to refresh for advertising policy } - + @objc private func appDidEnterBackground() { isAppActive = false // Restart scanning without allow duplicates in background @@ -3419,6 +3485,7 @@ extension BLEService { centralManager?.stopScan() startScanning() } + armPendingBackgroundConnects() // Backgrounding may precede a kill; flush the public-history archive // outside its 30s maintenance cadence. gossipSyncManager?.persistNow() @@ -3426,6 +3493,81 @@ extension BLEService { scheduleBluetoothStatusSample(after: 15.0, context: "background-15s") // No Local Name; nothing to refresh for advertising policy } + + /// Issue indefinite `connect()` requests to recently seen peripherals on + /// backgrounding. Pending connects live in the Bluetooth controller's + /// allowlist — no scanning and no app CPU — and complete whenever a peer + /// comes into range, waking (or relaunching) the app. A couple of central + /// slots stay reserved for connects driven by live background discovery — + /// except on the disconnect re-arm path, which may consume the slot the + /// disconnect itself just freed (a dense mesh with 4+ remaining links + /// would otherwise compute a zero budget and never re-arm the lost peer). + private func armPendingBackgroundConnects( + slotReserve: Int = TransportConfig.bleBackgroundPendingConnectSlotReserve + ) { + bleQueue.async { [weak self] in + guard let self, let central = self.centralManager, central.state == .poweredOn else { return } + let budget = TransportConfig.bleMaxCentralLinks + - slotReserve + - self.linkStateStore.connectedOrConnectingPeripheralCount + let now = Date() + let targets = self.recentPeripheralCache.reconnectTargets(now: now, limit: budget) { peripheralID in + let state = self.linkStateStore.state(forPeripheralID: peripheralID) + return state?.isConnected == true || state?.isConnecting == true + } + guard !targets.isEmpty else { return } + for target in targets { + // lastConnectionAttempt stays nil: an indefinite pending connect + // has no attempt clock, and nil marks it always-stale so + // cancelStalePendingConnects() reclaims it on foreground even + // after a quick background→foreground bounce. + self.linkStateStore.setPeripheralState( + BLEPeripheralLinkState( + peripheral: target.peripheral, + characteristic: nil, + peerID: nil, + isConnecting: true, + isConnected: false, + lastConnectionAttempt: nil, + assembler: NotificationStreamAssembler() + ), + for: target.peripheralID + ) + target.peripheral.delegate = self + central.connect(target.peripheral, options: [ + CBConnectPeripheralOptionNotifyOnConnectionKey: true, + CBConnectPeripheralOptionNotifyOnDisconnectionKey: true, + CBConnectPeripheralOptionNotifyOnNotificationKey: true + ]) + } + SecureLogger.info("🌙 Armed \(targets.count) pending background connect(s) for wake-on-proximity", category: .session) + } + } + + /// Foreground restores normal connection management: pending connects + /// older than the connect timeout (including ones rebuilt by state + /// restoration after a relaunch) are cancelled so live scanning and the + /// scheduler take over. Anything still nearby is rediscovered within + /// seconds by the allow-duplicates foreground scan. + private func cancelStalePendingConnects() { + bleQueue.async { [weak self] in + guard let self, let central = self.centralManager else { return } + let now = Date() + var cancelled = 0 + for state in self.linkStateStore.peripheralStates where state.isConnecting && !state.isConnected { + let age = state.lastConnectionAttempt.map { now.timeIntervalSince($0) } ?? .infinity + guard age > TransportConfig.bleConnectTimeoutSeconds else { continue } + let peripheralID = state.peripheral.identifier.uuidString + central.cancelPeripheralConnection(state.peripheral) + _ = self.linkStateStore.removePeripheral(peripheralID) + cancelled += 1 + } + if cancelled > 0 { + SecureLogger.info("🌅 Cancelled \(cancelled) stale pending connect(s) on foreground", category: .session) + self.tryConnectFromQueue() + } + } + } #endif // MARK: Private Message Handling @@ -3774,6 +3916,16 @@ extension BLEService { } } + #if os(iOS) + // The maintenance timer is suspended with the app, so a packet arriving + // while backgrounded means the radio woke us — use the wake window to + // run the announce/flush/drain pass the timer would have run. + if !isAppActive { + bleQueue.async { [weak self] in self?.performBackgroundWakeMaintenanceIfStale() } + } + #endif + + // Process by type switch context.messageType { case .announce: @@ -4270,6 +4422,7 @@ extension BLEService { private func performMaintenance() { maintenanceCounter += 1 + lastMaintenanceAt = Date() let now = Date() let connectedCount = collectionsQueue.sync { peerRegistry.connectedCount } @@ -4334,6 +4487,18 @@ extension BLEService { } } + #if os(iOS) + /// Catch-up maintenance for background wake windows (bleQueue-confined). + /// Rate-limited to the normal maintenance cadence so a burst of inbound + /// packets during one wake still runs at most one extra pass. + private func performBackgroundWakeMaintenanceIfStale() { + guard meshBackgroundEnabled, + !isAppActive, + Date().timeIntervalSince(lastMaintenanceAt) >= TransportConfig.bleMaintenanceInterval else { return } + performMaintenance() + } + #endif + private func checkPeerConnectivity() { let now = Date() let peerIDsForLinkState: [PeerID] = collectionsQueue.sync { peerRegistry.peerIDs } diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 07e11666..63eff4a4 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -242,6 +242,16 @@ enum TransportConfig { static let bleDisconnectNotifyDebounceSeconds: TimeInterval = 0.9 static let bleReconnectLogDebounceSeconds: TimeInterval = 2.0 + // Background wake-on-proximity (iOS). Pending connects issued on + // backgrounding never expire at the OS level: the Bluetooth controller + // completes them whenever the peer reappears in range and relaunches the + // app via state restoration. Entries older than the BLE address-rotation + // window no longer map to a reachable address, so the cache prunes them. + static let bleRecentPeripheralCacheCap: Int = 16 + static let bleRecentPeripheralMaxAgeSeconds: TimeInterval = 15 * 60 + // Central slots kept free for connects driven by live background discovery + static let bleBackgroundPendingConnectSlotReserve: Int = 2 + // Weak-link cooldown after connection timeouts static let bleWeakLinkCooldownSeconds: TimeInterval = 30.0 static let bleWeakLinkRSSICutoff: Int = -90 diff --git a/bitchatTests/Services/BLERecentPeripheralCacheTests.swift b/bitchatTests/Services/BLERecentPeripheralCacheTests.swift new file mode 100644 index 00000000..15eb057e --- /dev/null +++ b/bitchatTests/Services/BLERecentPeripheralCacheTests.swift @@ -0,0 +1,99 @@ +// +// BLERecentPeripheralCacheTests.swift +// bitchatTests +// +// Eviction, expiry, and reconnect-target selection for the background +// wake-on-proximity peripheral cache. +// + +import Testing +import Foundation +@testable import bitchat + +struct BLERecentPeripheralCacheTests { + + private let base = Date(timeIntervalSince1970: 1_700_000_000) + + private func makeCache(capacity: Int = 4, maxAge: TimeInterval = 900) -> BLERecentPeripheralCache { + BLERecentPeripheralCache(capacity: capacity, maxAge: maxAge) + } + + @Test + func recordUpsertsByPeripheralID() { + let cache = makeCache() + cache.record("p1", peripheralID: "A", at: base) + cache.record("p1-updated", peripheralID: "A", at: base.addingTimeInterval(10)) + + #expect(cache.count == 1) + let targets = cache.reconnectTargets(now: base.addingTimeInterval(11), limit: 10) { _ in false } + #expect(targets.map(\.peripheral) == ["p1-updated"]) + } + + @Test + func overCapacityEvictsStalestEntry() { + let cache = makeCache(capacity: 2) + cache.record("p1", peripheralID: "A", at: base) + cache.record("p2", peripheralID: "B", at: base.addingTimeInterval(1)) + cache.record("p3", peripheralID: "C", at: base.addingTimeInterval(2)) + + #expect(cache.count == 2) + let targets = cache.reconnectTargets(now: base.addingTimeInterval(3), limit: 10) { _ in false } + #expect(targets.map(\.peripheralID) == ["C", "B"]) + } + + @Test + func refreshingAnEntryProtectsItFromEviction() { + let cache = makeCache(capacity: 2) + cache.record("p1", peripheralID: "A", at: base) + cache.record("p2", peripheralID: "B", at: base.addingTimeInterval(1)) + // A becomes the freshest again; adding C must evict B, not A + cache.record("p1", peripheralID: "A", at: base.addingTimeInterval(2)) + cache.record("p3", peripheralID: "C", at: base.addingTimeInterval(3)) + + let targets = cache.reconnectTargets(now: base.addingTimeInterval(4), limit: 10) { _ in false } + #expect(targets.map(\.peripheralID) == ["C", "A"]) + } + + @Test + func expiredEntriesArePruned() { + let cache = makeCache(maxAge: 100) + cache.record("p1", peripheralID: "A", at: base) + cache.record("p2", peripheralID: "B", at: base.addingTimeInterval(50)) + + let targets = cache.reconnectTargets(now: base.addingTimeInterval(120), limit: 10) { _ in false } + #expect(targets.map(\.peripheralID) == ["B"]) + #expect(cache.count == 1) + } + + @Test + func targetsAreFreshestFirstAndCappedAtLimit() { + let cache = makeCache(capacity: 8) + for (index, id) in ["A", "B", "C", "D"].enumerated() { + cache.record("p\(id)", peripheralID: id, at: base.addingTimeInterval(TimeInterval(index))) + } + + let targets = cache.reconnectTargets(now: base.addingTimeInterval(10), limit: 2) { _ in false } + #expect(targets.map(\.peripheralID) == ["D", "C"]) + } + + @Test + func excludedPeripheralsAreSkippedWithoutConsumingTheLimit() { + let cache = makeCache(capacity: 8) + for (index, id) in ["A", "B", "C"].enumerated() { + cache.record("p\(id)", peripheralID: id, at: base.addingTimeInterval(TimeInterval(index))) + } + + // C (freshest) is already connected; the two slots go to B and A + let targets = cache.reconnectTargets(now: base.addingTimeInterval(10), limit: 2) { $0 == "C" } + #expect(targets.map(\.peripheralID) == ["B", "A"]) + } + + @Test + func nonPositiveLimitReturnsNothing() { + let cache = makeCache() + cache.record("p1", peripheralID: "A", at: base) + + #expect(cache.reconnectTargets(now: base, limit: 0) { _ in false }.isEmpty) + #expect(cache.reconnectTargets(now: base, limit: -3) { _ in false }.isEmpty) + } +} From 963d3a089fe92df54a0335f78f6ab4571cb75a44 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 20:09:01 +0200 Subject: [PATCH 048/158] Device-test findings: keychain lock access, GeoDM dedup, sync log clarity (#1397) Three findings from the July 7 locked-phone test sessions: - Keychain items move from WhenUnlocked to AfterFirstUnlock: the mesh keeps running while the device is locked (identity-cache saves failed with -25308 throughout testing), and a wake-on-proximity relaunch via BLE state restoration must read the noise keys before the user unlocks. A one-time SecItemUpdate migration upgrades existing items (retried on next launch if the device is locked); backup semantics unchanged. - GeoDM inbound messages dedup by message ID at the handler: outbox retries re-wrap the same message in fresh gift-wrap events, so relay-level event-ID dedup can't catch them and every copy ran full processing (3-6x per message observed). DELIVERED acks still go through markGeoDeliveryAckSent first, so re-sent copies from a lost ack are still answered. - Periodic gossip sync logs now name the type group ("message+fragment"). The five per-type schedules log identical lines when several fire in one maintenance tick, which reads as duplicated sends (misdiagnosed twice during testing). Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Services/KeychainManager.swift | 49 +++++++++++++++++-- bitchat/Sync/GossipSyncManager.swift | 2 +- bitchat/Sync/SyncTypeFlags.swift | 9 ++++ .../ChatPrivateConversationCoordinator.swift | 28 ++++++++++- 4 files changed, 82 insertions(+), 6 deletions(-) diff --git a/bitchat/Services/KeychainManager.swift b/bitchat/Services/KeychainManager.swift index e469f98d..54d2ff93 100644 --- a/bitchat/Services/KeychainManager.swift +++ b/bitchat/Services/KeychainManager.swift @@ -15,7 +15,50 @@ final class KeychainManager: KeychainManagerProtocol { // Use consistent service name for all keychain items private let service = BitchatApp.bundleID private let appGroup = "group.\(BitchatApp.bundleID)" - + + // AfterFirstUnlock, not WhenUnlocked: the mesh keeps running with the + // device locked (identity-cache saves failed with -25308 throughout + // locked-phone testing), and a wake-on-proximity relaunch via BLE state + // restoration must be able to read the noise keys before the user + // unlocks. Backup/sync semantics are unchanged (not ThisDeviceOnly). + private static let itemAccessibility = kSecAttrAccessibleAfterFirstUnlock + + init() { + #if os(iOS) + migrateAccessibilityIfNeeded() + #endif + } + + #if os(iOS) + /// One-time upgrade of items created under WhenUnlocked. New saves get + /// the right class on their own (saves are delete-then-add), but the + /// long-lived identity keys are written once and would otherwise stay + /// unreadable while the device is locked. + private func migrateAccessibilityIfNeeded() { + let flag = "keychain.accessibility.afterFirstUnlock.migrated" + guard !UserDefaults.standard.bool(forKey: flag) else { return } + + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service + ] + let update: [String: Any] = [ + kSecAttrAccessible as String: Self.itemAccessibility + ] + let status = SecItemUpdate(query as CFDictionary, update as CFDictionary) + switch status { + case errSecSuccess, errSecItemNotFound: + // Nothing to migrate on a fresh install; both are terminal. + UserDefaults.standard.set(true, forKey: flag) + SecureLogger.info("Keychain accessibility migrated to AfterFirstUnlock (status \(status))", category: .keychain) + default: + // Likely errSecInteractionNotAllowed (relaunched while locked) — + // leave the flag unset so the next launch retries. + SecureLogger.warning("Keychain accessibility migration deferred (status \(status))", category: .keychain) + } + } + #endif + // MARK: - Identity Keys func saveIdentityKey(_ keyData: Data, forKey key: String) -> Bool { @@ -62,7 +105,7 @@ final class KeychainManager: KeychainManagerProtocol { kSecAttrAccount as String: key, kSecValueData as String: data, kSecAttrService as String: service, - kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked, + kSecAttrAccessible as String: Self.itemAccessibility, kSecAttrLabel as String: "bitchat-\(key)" ] #if os(macOS) @@ -227,7 +270,7 @@ final class KeychainManager: KeychainManagerProtocol { kSecAttrAccount as String: key, kSecValueData as String: data, kSecAttrService as String: service, - kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked, + kSecAttrAccessible as String: Self.itemAccessibility, kSecAttrLabel as String: "bitchat-\(key)" ] #if os(macOS) diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index 3dee21e0..b9b0f771 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -313,7 +313,7 @@ final class GossipSyncManager { private func sendPeriodicSync(for types: SyncTypeFlags) { // Unicast sync to connected peers to allow RSR attribution if let connectedPeers = delegate?.getConnectedPeers(), !connectedPeers.isEmpty { - SecureLogger.debug("Sending periodic sync to \(connectedPeers.count) connected peers", category: .sync) + SecureLogger.debug("Sending periodic sync (\(types.logDescription)) to \(connectedPeers.count) connected peers", category: .sync) for peerID in connectedPeers { sendRequestSync(to: peerID, types: types) } diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index 3b4b0c82..f5c0566a 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -115,6 +115,15 @@ struct SyncTypeFlags: OptionSet { SyncTypeFlags(rawValue: rawValue & other.rawValue) } + /// Compact form for logs, e.g. "message+fragment". Without this, the + /// per-schedule periodic sync rounds log identical lines and read as + /// duplicated sends (misdiagnosed twice during July 2026 device testing). + var logDescription: String { + let types = toMessageTypes() + guard !types.isEmpty else { return "none" } + return types.map { String(describing: $0) }.joined(separator: "+") + } + func toMessageTypes() -> [MessageType] { guard rawValue != 0 else { return [] } var types: [MessageType] = [] diff --git a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift index e577e406..7aa95de3 100644 --- a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift @@ -227,10 +227,29 @@ extension ChatViewModel: ChatPrivateConversationContext { final class ChatPrivateConversationCoordinator { private unowned let context: any ChatPrivateConversationContext + // Outbox retries re-wrap the same message in fresh gift-wrap events, so + // relay-level event-ID dedup can't catch them; track inbound GeoDM + // message IDs so each copy past the first costs one (already-deduped) + // ack check and nothing else. + private var seenInboundGeoDMIDs: Set = [] + private var seenInboundGeoDMOrder: [String] = [] + private static let seenInboundGeoDMCap = 512 + init(context: any ChatPrivateConversationContext) { self.context = context } + /// Returns `false` if this GeoDM message ID was already handled. + private func markInboundGeoDMSeen(_ messageId: String) -> Bool { + guard !seenInboundGeoDMIDs.contains(messageId) else { return false } + seenInboundGeoDMIDs.insert(messageId) + seenInboundGeoDMOrder.append(messageId) + if seenInboundGeoDMOrder.count > Self.seenInboundGeoDMCap { + seenInboundGeoDMIDs.remove(seenInboundGeoDMOrder.removeFirst()) + } + return true + } + func sendPrivateMessage(_ content: String, to peerID: PeerID) { guard !content.isEmpty else { return } @@ -408,10 +427,15 @@ final class ChatPrivateConversationCoordinator { guard let pm = PrivateMessagePacket.decode(from: payload.data) else { return } let messageId = pm.messageID - SecureLogger.info("GeoDM: recv PM <- sender=\(senderPubkey.prefix(8))… mid=\(messageId.prefix(8))…", category: .session) - + // Ack before the dedup guard: a re-sent copy means the sender may not + // have our DELIVERED yet, and markGeoDeliveryAckSent dedups the + // actual sends. sendDeliveryAckIfNeeded(to: messageId, senderPubKey: senderPubkey, from: id) + guard markInboundGeoDMSeen(messageId) else { return } + + SecureLogger.info("GeoDM: recv PM <- sender=\(senderPubkey.prefix(8))… mid=\(messageId.prefix(8))…", category: .session) + if context.isNostrBlocked(pubkeyHexLowercased: senderPubkey) { return } From 81c45e964980d8c780cd4ab04b2eccb583ffef47 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Tue, 7 Jul 2026 21:08:10 +0200 Subject: [PATCH 049/158] Reconnect hygiene: paced acks, persistent gift-wrap dedup, self-fragment sync fix (#1398) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Reconnect hygiene: paced acks, persistent gift-wrap dedup, self-fragment sync fix Remaining findings from the July 7 locked-phone test sessions, all rooted in reconnect/relaunch behavior: - All Nostr acks (READ and DELIVERED, direct and geohash) now flow through the paced queue that previously only throttled direct READ receipts. Reconnect redelivery produced 8 DELIVERED acks in under a second, which damus rejects ("noting too much"). - Processed gift-wrap event IDs persist across launches (NostrProcessedEventStore, wired through MessageDeduplicationService, debounced writes, wiped on the existing clear/panic paths). NIP-59 randomizes gift-wrap timestamps, so the 24h-lookback DM subscriptions redeliver the same events every launch; without a cross-launch record each relaunch reprocessed old PMs and acks — the re-ack bursts and the "delivered ack for unknown mid" warnings (now debug: a stale ack is expected occasionally and not actionable). - Own fragments handed back by sync replay (the deliberate RSR ttl=0 restore path) now re-enter the gossip sync store before the self-drop. The fragment store is not archived, so after a relaunch our sync filter did not cover our own fragments and peers re-offered them every 30s round indefinitely; recording them stops the redelivery after one round while keeping assembly skipped. Co-Authored-By: Claude Fable 5 * Address Codex review on #1398: shared ack pacer, transient clears keep disk record - Geohash acks are sent through short-lived NostrTransport instances (makeGeohashNostrTransport creates one per ack), so the per-instance ack queue never paced a burst. Acks now flow through a pacer shared across instances: Dependencies.live wires the process-wide sharedAckPacer, and the default Dependencies init builds an isolated pacer from the same injected scheduleAfter so tests keep stepping the throttle manually. - clearNostrCaches() runs on every geohash channel switch, so it no longer wipes the persisted gift-wrap record (that stays on the clearAll/panic path). Persistence is now append-merge instead of snapshot-overwrite — serialized on the store's IO queue — so a transient in-memory clear between debounced flushes can't shrink the on-disk record either. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Services/BLE/BLEFragmentHandler.swift | 14 +- .../MessageDeduplicationService.swift | 52 ++++- .../Services/NostrProcessedEventStore.swift | 106 ++++++++++ bitchat/Services/NostrTransport.swift | 192 ++++++++++++------ .../ChatPrivateConversationCoordinator.swift | 5 +- .../ChatViewModelBootstrapper.swift | 6 +- .../Services/BLEFragmentHandlerTests.swift | 7 +- 7 files changed, 310 insertions(+), 72 deletions(-) create mode 100644 bitchat/Services/NostrProcessedEventStore.swift diff --git a/bitchat/Services/BLE/BLEFragmentHandler.swift b/bitchat/Services/BLE/BLEFragmentHandler.swift index da65fd36..9d913151 100644 --- a/bitchat/Services/BLE/BLEFragmentHandler.swift +++ b/bitchat/Services/BLE/BLEFragmentHandler.swift @@ -33,13 +33,21 @@ final class BLEFragmentHandler { func handle(_ packet: BitchatPacket, from peerID: PeerID) { let env = environment - // Don't process our own fragments + guard let header = BLEFragmentHeader(packet: packet) else { return } + + // Sync replay legitimately hands us our own fragments back (the RSR + // ttl=0 restore path): after a relaunch the fragment store starts + // empty, so our sync filter doesn't cover them and peers re-offer + // them. Record them as seen — the next round's filter then covers + // them and the redelivery stops — but skip assembly: we authored + // the original, there is nothing to reassemble. if peerID == env.localPeerID() { + if header.isBroadcastFragment { + env.trackPacketSeen(packet) + } return } - guard let header = BLEFragmentHeader(packet: packet) else { return } - if header.isBroadcastFragment { env.trackPacketSeen(packet) } diff --git a/bitchat/Services/MessageDeduplicationService.swift b/bitchat/Services/MessageDeduplicationService.swift index f84c1f47..3d20e227 100644 --- a/bitchat/Services/MessageDeduplicationService.swift +++ b/bitchat/Services/MessageDeduplicationService.swift @@ -172,17 +172,37 @@ final class MessageDeduplicationService { /// Cache for Nostr ACK deduplication (messageId:ackType:senderPubkey format) private let nostrAckCache: LRUDeduplicationCache + /// Optional cross-launch persistence for the Nostr event cache. NIP-59 + /// randomizes gift-wrap timestamps, so DM subscriptions look back 24h and + /// relays redeliver the same events on every launch; without this record + /// each relaunch reprocesses old PMs and acks. Nil (tests, macOS callers + /// that don't opt in) keeps the cache purely in-memory. + private let nostrEventStore: NostrProcessedEventStore? + private let nostrEventCapacity: Int + private var persistScheduled = false + private var pendingPersistIDs: [String] = [] + /// Creates a new deduplication service with specified capacities. /// - Parameters: /// - contentCapacity: Max entries for content cache /// - nostrEventCapacity: Max entries for Nostr event cache + /// - nostrEventStore: Optional disk store preloading and persisting + /// processed Nostr event IDs across launches init( contentCapacity: Int = TransportConfig.contentLRUCap, - nostrEventCapacity: Int = TransportConfig.uiProcessedNostrEventsCap + nostrEventCapacity: Int = TransportConfig.uiProcessedNostrEventsCap, + nostrEventStore: NostrProcessedEventStore? = nil ) { self.contentCache = LRUDeduplicationCache(capacity: contentCapacity) self.nostrEventCache = LRUDeduplicationCache(capacity: nostrEventCapacity) self.nostrAckCache = LRUDeduplicationCache(capacity: nostrEventCapacity) + self.nostrEventStore = nostrEventStore + self.nostrEventCapacity = nostrEventCapacity + if let nostrEventStore { + for eventID in nostrEventStore.load() { + nostrEventCache.record(eventID, value: true) + } + } } // MARK: - Content Deduplication @@ -239,6 +259,26 @@ final class MessageDeduplicationService { /// - Parameter eventId: The event ID func recordNostrEvent(_ eventId: String) { nostrEventCache.record(eventId, value: true) + if nostrEventStore != nil { + pendingPersistIDs.append(eventId) + schedulePersistIfNeeded() + } + } + + /// Debounced persistence: bursts of inbound events (reconnect redelivery) + /// collapse into one append. Append-merge rather than snapshot, so a + /// transient in-memory clear between flushes can't shrink the disk record. + private func schedulePersistIfNeeded() { + guard let nostrEventStore, !persistScheduled else { return } + persistScheduled = true + Task { @MainActor [weak self] in + try? await Task.sleep(nanoseconds: 2_000_000_000) + guard let self else { return } + self.persistScheduled = false + let newIDs = self.pendingPersistIDs + self.pendingPersistIDs.removeAll() + nostrEventStore.append(newIDs, cap: self.nostrEventCapacity) + } } // MARK: - Nostr ACK Deduplication @@ -263,14 +303,20 @@ final class MessageDeduplicationService { // MARK: - Clear - /// Clears all caches + /// Clears all caches. This is the wipe/panic path: the persisted + /// gift-wrap record goes with everything else. func clearAll() { contentCache.clear() nostrEventCache.clear() nostrAckCache.clear() + pendingPersistIDs.removeAll() + nostrEventStore?.wipe() } - /// Clears only the Nostr caches (events and ACKs) + /// Clears only the in-memory Nostr caches (events and ACKs). Runs on + /// every geohash channel switch, so the disk record deliberately + /// survives — wiping it here would forfeit cross-launch gift-wrap dedup + /// each time the user changes channels (flagged by Codex on #1398). func clearNostrCaches() { nostrEventCache.clear() nostrAckCache.clear() diff --git a/bitchat/Services/NostrProcessedEventStore.swift b/bitchat/Services/NostrProcessedEventStore.swift new file mode 100644 index 00000000..167d29d9 --- /dev/null +++ b/bitchat/Services/NostrProcessedEventStore.swift @@ -0,0 +1,106 @@ +// +// NostrProcessedEventStore.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitLogger +import Foundation + +/// Disk persistence for processed gift-wrap event IDs. NIP-59 randomizes +/// gift-wrap timestamps, so DM subscriptions must look back generously (24h) +/// and relays redeliver the same events on every launch — without a +/// cross-launch record, each relaunch reprocesses old PMs and acks +/// (re-sent DELIVERED bursts, "delivered ack for unknown mid" noise). +/// +/// Contents are event IDs already visible to every relay, so +/// until-first-unlock file protection is the right at-rest posture — the +/// file must also load during a locked-background restoration relaunch. +/// Wiped on panic via the dedup service's clear paths. +final class NostrProcessedEventStore { + private let fileURL: URL? + // All file access is serialized here: appends are read-modify-write, and + // overlapping debounced flushes would otherwise race and drop IDs. + private let ioQueue = DispatchQueue(label: "chat.bitchat.nostr-processed-events", qos: .utility) + + init(fileURL: URL? = nil) { + self.fileURL = fileURL ?? Self.defaultFileURL() + } + + /// Processed event IDs, oldest first (insertion order). + func load() -> [String] { + ioQueue.sync { loadLocked() } + } + + /// Merge new IDs onto the persisted record, oldest-first, trimming from + /// the front past `cap`. Append-merge (not snapshot-overwrite) so the + /// in-memory cache being cleared transiently (channel switches) can + /// never shrink the on-disk record. + func append(_ newIDs: [String], cap: Int) { + guard !newIDs.isEmpty else { return } + ioQueue.async { [self] in + var merged = loadLocked() + var known = Set(merged) + for id in newIDs where !known.contains(id) { + merged.append(id) + known.insert(id) + } + if merged.count > cap { + merged.removeFirst(merged.count - cap) + } + saveLocked(merged) + } + } + + func wipe() { + ioQueue.async { [self] in + guard let fileURL else { return } + try? FileManager.default.removeItem(at: fileURL) + } + } + + private func loadLocked() -> [String] { + guard let fileURL, + let data = try? Data(contentsOf: fileURL), + let ids = try? JSONDecoder().decode([String].self, from: data) else { + return [] + } + return ids + } + + private func saveLocked(_ eventIDs: [String]) { + guard let fileURL else { return } + guard !eventIDs.isEmpty else { + try? FileManager.default.removeItem(at: fileURL) + return + } + do { + try FileManager.default.createDirectory( + at: fileURL.deletingLastPathComponent(), + withIntermediateDirectories: true + ) + let data = try JSONEncoder().encode(eventIDs) + var options: Data.WritingOptions = [.atomic] + #if os(iOS) + options.insert(.completeFileProtectionUntilFirstUserAuthentication) + #endif + try data.write(to: fileURL, options: options) + } catch { + SecureLogger.error("Failed to persist processed Nostr events: \(error)", category: .session) + } + } + + private static func defaultFileURL() -> URL? { + guard let base = try? FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) else { return nil } + return base + .appendingPathComponent("nostr", isDirectory: true) + .appendingPathComponent("processed-events.json") + } +} diff --git a/bitchat/Services/NostrTransport.swift b/bitchat/Services/NostrTransport.swift index 7a5c052b..197a3034 100644 --- a/bitchat/Services/NostrTransport.swift +++ b/bitchat/Services/NostrTransport.swift @@ -19,6 +19,36 @@ final class NostrTransport: Transport, @unchecked Sendable { /// doesn't count: DM sends target the default relay set and would /// still queue. let relayConnectivity: @MainActor () -> AnyPublisher + /// Paces outbound acks. Defaults to an isolated pacer so tests don't + /// serialize behind each other; `live` passes the process-wide one. + let ackPacer: AckPacer + + init( + notificationCenter: NotificationCenter, + loadFavorites: @escaping @MainActor () -> [Data: FavoritesPersistenceService.FavoriteRelationship], + favoriteStatusForNoiseKey: @escaping @MainActor (Data) -> FavoritesPersistenceService.FavoriteRelationship?, + favoriteStatusForPeerID: @escaping @MainActor (PeerID) -> FavoritesPersistenceService.FavoriteRelationship?, + currentIdentity: @escaping @MainActor () throws -> NostrIdentity?, + registerPendingGiftWrap: @escaping @MainActor (String) -> Void, + sendEvent: @escaping @MainActor (NostrEvent) -> Void, + scheduleAfter: @escaping @Sendable (TimeInterval, @escaping @Sendable () -> Void) -> Void, + relayConnectivity: @escaping @MainActor () -> AnyPublisher, + ackPacer: AckPacer? = nil + ) { + self.notificationCenter = notificationCenter + self.loadFavorites = loadFavorites + self.favoriteStatusForNoiseKey = favoriteStatusForNoiseKey + self.favoriteStatusForPeerID = favoriteStatusForPeerID + self.currentIdentity = currentIdentity + self.registerPendingGiftWrap = registerPendingGiftWrap + self.sendEvent = sendEvent + self.scheduleAfter = scheduleAfter + self.relayConnectivity = relayConnectivity + // Default pacer drives its throttle through the same injected + // scheduler, so tests that step scheduleAfter manually keep + // control of the ack cadence. + self.ackPacer = ackPacer ?? AckPacer(scheduleAfter: scheduleAfter) + } @MainActor static func live(idBridge: NostrIdentityBridge) -> Dependencies { @@ -33,7 +63,8 @@ final class NostrTransport: Transport, @unchecked Sendable { scheduleAfter: { delay, action in DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: action) }, - relayConnectivity: { NostrRelayManager.shared.$isDMRelayConnected.eraseToAnyPublisher() } + relayConnectivity: { NostrRelayManager.shared.$isDMRelayConnected.eraseToAnyPublisher() }, + ackPacer: NostrTransport.sharedAckPacer ) } } @@ -41,14 +72,61 @@ final class NostrTransport: Transport, @unchecked Sendable { // Provide BLE short peer ID for BitChat embedding var senderPeerID = PeerID(str: "") - // Throttle READ receipts to avoid relay rate limits - private struct QueuedRead { - let receipt: ReadReceipt - let peerID: PeerID + // Throttle outbound acks — READ receipts and DELIVERED acks, direct and + // geohash — to avoid relay rate limits. Reconnect redelivery produces a + // burst of acks at once: 8 DELIVERED in under a second tripped damus's + // "noting too much" during July 2026 device testing. + private enum QueuedAck { + case readDirect(ReadReceipt, PeerID) + case deliveredDirect(messageID: String, peerID: PeerID) + case deliveredGeohash(messageID: String, recipientHex: String, identity: NostrIdentity) + case readGeohash(messageID: String, recipientHex: String, identity: NostrIdentity) } - private var readQueue: [QueuedRead] = [] - private var isSendingReadAcks = false - private let readAckInterval: TimeInterval = TransportConfig.nostrReadAckInterval + + /// Ack pacing shared across transport instances. Geohash acks are sent + /// through short-lived transports created per ack + /// (`makeGeohashNostrTransport()`), so a per-instance queue would only + /// ever hold one item and never pace a burst (flagged by Codex on + /// #1398). Production wires `sharedAckPacer` via `Dependencies.live`; + /// tests get an isolated instance per `Dependencies` by default. + final class AckPacer { + typealias Scheduler = @Sendable (TimeInterval, @escaping @Sendable () -> Void) -> Void + + private let queue = DispatchQueue(label: "chat.bitchat.nostr-ack-pacer") + private var pending: [() -> Void] = [] + private var isSending = false + private let interval: TimeInterval = TransportConfig.nostrReadAckInterval + private let scheduleAfter: Scheduler + + init(scheduleAfter: @escaping Scheduler = { delay, action in + DispatchQueue.global(qos: .utility).asyncAfter(deadline: .now() + delay, execute: action) + }) { + self.scheduleAfter = scheduleAfter + } + + func enqueue(_ send: @escaping () -> Void) { + queue.async { + self.pending.append(send) + self.processNext() + } + } + + /// Must be called on `queue`. + private func processNext() { + guard !isSending, !pending.isEmpty else { return } + isSending = true + let send = pending.removeFirst() + send() + scheduleAfter(interval) { [weak self] in + guard let self else { return } + self.queue.async { + self.isSending = false + self.processNext() + } + } + } + } + static let sharedAckPacer = AckPacer() private let keychain: KeychainManagerProtocol private let idBridge: NostrIdentityBridge private let dependencies: Dependencies @@ -187,12 +265,14 @@ final class NostrTransport: Transport, @unchecked Sendable { } func sendReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) { - // Enqueue and process with throttling to avoid relay rate limits - // Use barrier to synchronize access to readQueue - queue.async(flags: .barrier) { - self.readQueue.append(QueuedRead(receipt: receipt, peerID: peerID)) - self.processReadQueueIfNeeded() - } + enqueueAck(.readDirect(receipt, peerID)) + } + + /// Enqueue an ack for paced sending. Captures self strongly on purpose: + /// geohash acks ride throwaway transport instances that must stay alive + /// until their ack leaves the queue. + private func enqueueAck(_ ack: QueuedAck) { + dependencies.ackPacer.enqueue { self.sendAckItem(ack) } } func sendFavoriteNotification(to peerID: PeerID, isFavorite: Bool) { @@ -212,17 +292,7 @@ final class NostrTransport: Transport, @unchecked Sendable { func sendBroadcastAnnounce() { /* no-op for Nostr */ } func sendDeliveryAck(for messageID: String, to peerID: PeerID) { - Task { @MainActor in - guard let recipientNpub = resolveRecipientNpub(for: peerID), - let recipientHex = npubToHex(recipientNpub), - let senderIdentity = try? dependencies.currentIdentity() else { return } - SecureLogger.debug("NostrTransport: preparing DELIVERED ack id=\(messageID.prefix(8))…", category: .session) - guard let ack = NostrEmbeddedBitChat.encodeAckForNostr(type: .delivered, messageID: messageID, recipientPeerID: peerID, senderPeerID: senderPeerID) else { - SecureLogger.error("NostrTransport: failed to embed DELIVERED ack", category: .session) - return - } - sendWrappedMessage(content: ack, recipientHex: recipientHex, senderIdentity: senderIdentity) - } + enqueueAck(.deliveredDirect(messageID: messageID, peerID: peerID)) } } @@ -232,19 +302,11 @@ extension NostrTransport { // MARK: Geohash ACK helpers func sendDeliveryAckGeohash(for messageID: String, toRecipientHex recipientHex: String, from identity: NostrIdentity) { - Task { @MainActor in - SecureLogger.debug("GeoDM: send DELIVERED mid=\(messageID.prefix(8))…", category: .session) - guard let embedded = NostrEmbeddedBitChat.encodeAckForNostrNoRecipient(type: .delivered, messageID: messageID, senderPeerID: senderPeerID) else { return } - sendWrappedMessage(content: embedded, recipientHex: recipientHex, senderIdentity: identity, registerPending: true) - } + enqueueAck(.deliveredGeohash(messageID: messageID, recipientHex: recipientHex, identity: identity)) } func sendReadReceiptGeohash(_ messageID: String, toRecipientHex recipientHex: String, from identity: NostrIdentity) { - Task { @MainActor in - SecureLogger.debug("GeoDM: send READ mid=\(messageID.prefix(8))…", category: .session) - guard let embedded = NostrEmbeddedBitChat.encodeAckForNostrNoRecipient(type: .readReceipt, messageID: messageID, senderPeerID: senderPeerID) else { return } - sendWrappedMessage(content: embedded, recipientHex: recipientHex, senderIdentity: identity, registerPending: true) - } + enqueueAck(.readGeohash(messageID: messageID, recipientHex: recipientHex, identity: identity)) } // MARK: Geohash DMs (per-geohash identity) @@ -290,36 +352,42 @@ extension NostrTransport { dependencies.sendEvent(event) } - /// Must be called within a barrier on `queue` - private func processReadQueueIfNeeded() { - guard !isSendingReadAcks else { return } - guard !readQueue.isEmpty else { return } - isSendingReadAcks = true - let item = readQueue.removeFirst() - sendReadAckItem(item) - } - /// Sends a single read ack item (called after extraction from queue within barrier) - private func sendReadAckItem(_ item: QueuedRead) { + /// Sends a single ack item (invoked by the pacer, one per interval) + private func sendAckItem(_ item: QueuedAck) { Task { @MainActor in - defer { scheduleNextReadAck() } - guard let recipientNpub = resolveRecipientNpub(for: item.peerID), - let recipientHex = npubToHex(recipientNpub), - let senderIdentity = try? dependencies.currentIdentity() else { return } - SecureLogger.debug("NostrTransport: preparing READ ack id=\(item.receipt.originalMessageID.prefix(8))…", category: .session) - guard let ack = NostrEmbeddedBitChat.encodeAckForNostr(type: .readReceipt, messageID: item.receipt.originalMessageID, recipientPeerID: item.peerID, senderPeerID: senderPeerID) else { - SecureLogger.error("NostrTransport: failed to embed READ ack", category: .session) - return - } - sendWrappedMessage(content: ack, recipientHex: recipientHex, senderIdentity: senderIdentity) - } - } + switch item { + case .readDirect(let receipt, let peerID): + guard let recipientNpub = resolveRecipientNpub(for: peerID), + let recipientHex = npubToHex(recipientNpub), + let senderIdentity = try? dependencies.currentIdentity() else { return } + SecureLogger.debug("NostrTransport: preparing READ ack id=\(receipt.originalMessageID.prefix(8))…", category: .session) + guard let ack = NostrEmbeddedBitChat.encodeAckForNostr(type: .readReceipt, messageID: receipt.originalMessageID, recipientPeerID: peerID, senderPeerID: senderPeerID) else { + SecureLogger.error("NostrTransport: failed to embed READ ack", category: .session) + return + } + sendWrappedMessage(content: ack, recipientHex: recipientHex, senderIdentity: senderIdentity) - private func scheduleNextReadAck() { - dependencies.scheduleAfter(readAckInterval) { [weak self] in - self?.queue.async(flags: .barrier) { [weak self] in - self?.isSendingReadAcks = false - self?.processReadQueueIfNeeded() + case .deliveredDirect(let messageID, let peerID): + guard let recipientNpub = resolveRecipientNpub(for: peerID), + let recipientHex = npubToHex(recipientNpub), + let senderIdentity = try? dependencies.currentIdentity() else { return } + SecureLogger.debug("NostrTransport: preparing DELIVERED ack id=\(messageID.prefix(8))…", category: .session) + guard let ack = NostrEmbeddedBitChat.encodeAckForNostr(type: .delivered, messageID: messageID, recipientPeerID: peerID, senderPeerID: senderPeerID) else { + SecureLogger.error("NostrTransport: failed to embed DELIVERED ack", category: .session) + return + } + sendWrappedMessage(content: ack, recipientHex: recipientHex, senderIdentity: senderIdentity) + + case .deliveredGeohash(let messageID, let recipientHex, let identity): + SecureLogger.debug("GeoDM: send DELIVERED mid=\(messageID.prefix(8))…", category: .session) + guard let embedded = NostrEmbeddedBitChat.encodeAckForNostrNoRecipient(type: .delivered, messageID: messageID, senderPeerID: senderPeerID) else { return } + sendWrappedMessage(content: embedded, recipientHex: recipientHex, senderIdentity: identity, registerPending: true) + + case .readGeohash(let messageID, let recipientHex, let identity): + SecureLogger.debug("GeoDM: send READ mid=\(messageID.prefix(8))…", category: .session) + guard let embedded = NostrEmbeddedBitChat.encodeAckForNostrNoRecipient(type: .readReceipt, messageID: messageID, senderPeerID: senderPeerID) else { return } + sendWrappedMessage(content: embedded, recipientHex: recipientHex, senderIdentity: identity, registerPending: true) } } } diff --git a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift index 7aa95de3..73b784aa 100644 --- a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift @@ -514,7 +514,10 @@ final class ChatPrivateConversationCoordinator { category: .session ) } else { - SecureLogger.warning("GeoDM: delivered ack for unknown mid=\(messageID.prefix(8))… conv=\(convKey)", category: .session) + // A stale ack for a message this device no longer tracks (dropped + // outbox entry, cleared chat, or a peer re-acking after losing our + // receipt) — expected occasionally, not actionable. + SecureLogger.debug("GeoDM: delivered ack for unknown mid=\(messageID.prefix(8))… conv=\(convKey)", category: .session) } } diff --git a/bitchat/ViewModels/ChatViewModelBootstrapper.swift b/bitchat/ViewModels/ChatViewModelBootstrapper.swift index caca90ec..8332efab 100644 --- a/bitchat/ViewModels/ChatViewModelBootstrapper.swift +++ b/bitchat/ViewModels/ChatViewModelBootstrapper.swift @@ -41,7 +41,11 @@ struct ChatViewModelServiceBundle { self.privateChatManager = privateChatManager self.unifiedPeerService = unifiedPeerService self.autocompleteService = AutocompleteService() - self.deduplicationService = MessageDeduplicationService() + // Persist processed gift-wrap event IDs: NIP-59 randomizes their + // timestamps, so the 24h-lookback DM subscriptions redeliver the same + // events on every launch and only a cross-launch record stops the + // reprocessing (re-sent DELIVERED bursts, phantom-ack noise). + self.deduplicationService = MessageDeduplicationService(nostrEventStore: NostrProcessedEventStore()) self.publicMessagePipeline = PublicMessagePipeline() } } diff --git a/bitchatTests/Services/BLEFragmentHandlerTests.swift b/bitchatTests/Services/BLEFragmentHandlerTests.swift index d3694be0..e48a74ed 100644 --- a/bitchatTests/Services/BLEFragmentHandlerTests.swift +++ b/bitchatTests/Services/BLEFragmentHandlerTests.swift @@ -40,14 +40,17 @@ struct BLEFragmentHandlerTests { } @Test - func ownFragmentIsIgnored() { + func ownFragmentIsTrackedForSyncButNotAssembled() { let recorder = Recorder() let handler = makeHandler(recorder: recorder) let packet = makeFragmentPacket(sender: localPeerID, index: 0, total: 2) handler.handle(packet, from: localPeerID) - #expect(recorder.trackedPackets.isEmpty) + // Sync replay hands own fragments back after a relaunch; they must + // re-enter the sync store (so the next round's filter covers them + // and redelivery stops) without being reassembled. + #expect(recorder.trackedPackets.count == 1) #expect(recorder.appendedHeaders.isEmpty) #expect(recorder.reinjectedPackets.isEmpty) } From 5dffb04912b805e4e14b055759d95f04db5ffa0e Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 7 Jul 2026 21:09:17 +0200 Subject: [PATCH 050/158] Bump version to 1.6.0 BLE background presence (wake-on-proximity pending connects), keychain AfterFirstUnlock for locked-device operation, cross-launch gift-wrap dedup, paced Nostr acks, GeoDM inbound dedup, and self-fragment sync fixes (#1396-#1398). Co-Authored-By: Claude Fable 5 --- Configs/Release.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configs/Release.xcconfig b/Configs/Release.xcconfig index e4035c9e..af303984 100644 --- a/Configs/Release.xcconfig +++ b/Configs/Release.xcconfig @@ -1,4 +1,4 @@ -MARKETING_VERSION = 1.5.4 +MARKETING_VERSION = 1.6.0 CURRENT_PROJECT_VERSION = 1 IPHONEOS_DEPLOYMENT_TARGET = 16.0 From 3f677776bbe1bd97fdabb5752ba989b060947543 Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 7 Jul 2026 21:13:48 +0200 Subject: [PATCH 051/158] Mark AckPacer @unchecked Sendable Its mutable state is confined to the serial pacer queue; the annotation silences the capture-of-non-Sendable warning in the scheduler callback (NostrTransport.swift:123) under the app target's concurrency checking. Co-Authored-By: Claude Fable 5 --- bitchat/Services/NostrTransport.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bitchat/Services/NostrTransport.swift b/bitchat/Services/NostrTransport.swift index 197a3034..9dd6ad68 100644 --- a/bitchat/Services/NostrTransport.swift +++ b/bitchat/Services/NostrTransport.swift @@ -89,7 +89,10 @@ final class NostrTransport: Transport, @unchecked Sendable { /// ever hold one item and never pace a burst (flagged by Codex on /// #1398). Production wires `sharedAckPacer` via `Dependencies.live`; /// tests get an isolated instance per `Dependencies` by default. - final class AckPacer { + /// @unchecked Sendable: all mutable state (`pending`, `isSending`) is + /// confined to the serial `queue`; the class is only touched via + /// `enqueue` and the scheduler callback, both of which hop onto it. + final class AckPacer: @unchecked Sendable { typealias Scheduler = @Sendable (TimeInterval, @escaping @Sendable () -> Void) -> Void private let queue = DispatchQueue(label: "chat.bitchat.nostr-ack-pacer") From e642f696cbb6df955e338233299a57de40a6def6 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 08:46:40 +0200 Subject: [PATCH 052/158] Header: globe opens channel sheet; deterministic crowding cascade (#1400) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The gateway globe indicator was a plain Image with a tooltip but no tap handler. Wrap it in a Button that opens the location channels sheet, where the gateway toggle lives, so tapping it lets people turn the gateway on or off. Adds an accessibility hint localized into all 29 locales. When the header got crowded with indicator icons, the bitchat/ logo and the nickname field both sat at layout priority 0, so compression was split arbitrarily between them — and the logo, lacking a lineLimit, wrapped to two lines inside the fixed-height bar. Make the degradation order explicit: the nickname shrinks first, the logo holds full width until the name is gone and then truncates on one line, and the icon cluster (priority 3) never compresses. Render-verified with an offscreen ImageRenderer harness at 320/375/500pt with the maximum icon load (globe, courier, envelope, pin, bookmark). Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Localizable.xcstrings | 180 ++++++++++++++++++++++++++ bitchat/Views/ContentHeaderView.swift | 33 +++-- 2 files changed, 203 insertions(+), 10 deletions(-) diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 8d379ff7..72dc28ef 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -13457,6 +13457,186 @@ } } }, + "content.accessibility.gateway_hint" : { + "comment" : "Accessibility hint for the internet gateway indicator explaining a tap opens the channel sheet", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "يفتح إعدادات القنوات لتشغيل البوابة أو إيقافها" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "গেটওয়ে চালু বা বন্ধ করতে চ্যানেল সেটিংস খোলে" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Öffnet die kanaleinstellungen, um das gateway ein- oder auszuschalten" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opens channel settings to turn the gateway on or off" + } + }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Abre los ajustes de canales para activar o desactivar la puerta de enlace" + } + }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Binubuksan ang mga setting ng channel para i-on o i-off ang gateway" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ouvre les réglages des canaux pour activer ou désactiver la passerelle" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "פותח את הגדרות הערוצים כדי להפעיל או לכבות את השער" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "गेटवे चालू या बंद करने के लिए चैनल सेटिंग्स खोलता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Membuka pengaturan kanal untuk menyalakan atau mematikan gateway" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Apre le impostazioni dei canali per attivare o disattivare il gateway" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "チャンネル設定を開いてゲートウェイのオン/オフを切り替えます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "채널 설정을 열어 게이트웨이를 켜거나 끕니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Membuka tetapan saluran untuk menghidupkan atau mematikan gateway" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "गेटवे खोल्न वा बन्द गर्न च्यानल सेटिङहरू खोल्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Opent kanaalinstellingen om de gateway aan of uit te zetten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Otwiera ustawienia kanałów, aby włączyć lub wyłączyć bramę" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Abre as definições de canais para ligar ou desligar o gateway" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Abre as configurações de canais para ligar ou desligar o gateway" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Открывает настройки каналов, чтобы включить или выключить шлюз" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Öppnar kanalinställningar för att slå på eller av gatewayen" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "கேட்வேயை இயக்க அல்லது அணைக்க சேனல் அமைப்புகளைத் திறக்கிறது" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "เปิดการตั้งค่าช่องเพื่อเปิดหรือปิดเกตเวย์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ağ geçidini açmak veya kapatmak için kanal ayarlarını açar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Відкриває налаштування каналів, щоб увімкнути або вимкнути шлюз" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "گیٹ وے کو آن یا آف کرنے کے لیے چینل کی ترتیبات کھولتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Mở cài đặt kênh để bật hoặc tắt gateway" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "打开频道设置以开启或关闭网关" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "開啟頻道設定以開啟或關閉閘道" + } + } + } + }, "content.accessibility.group_chat" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Views/ContentHeaderView.swift b/bitchat/Views/ContentHeaderView.swift index 9bac1095..24af46f5 100644 --- a/bitchat/Views/ContentHeaderView.swift +++ b/bitchat/Views/ContentHeaderView.swift @@ -33,7 +33,12 @@ struct ContentHeaderView: View { HStack(spacing: 0) { Text(verbatim: "bitchat/") .bitchatFont(size: 18, weight: .medium) + .lineLimit(1) .foregroundColor(palette.primary) + // When icons crowd the header, squeeze the nickname first + // (priority 0) and the logo only as a last resort; the icon + // cluster at priority 3 never gives up width. + .layoutPriority(2) .onTapGesture(count: 3) { appChromeModel.panicClearAllData() } @@ -55,6 +60,8 @@ struct ContentHeaderView: View { Text(verbatim: "@") .bitchatFont(size: 14) .foregroundColor(palette.secondary) + // Keep the sigil whole while the field beside it shrinks. + .fixedSize() TextField( "content.input.nickname_placeholder", @@ -96,16 +103,22 @@ struct ContentHeaderView: View { HStack(spacing: 2) { if locationChannelsModel.gatewayEnabled { - Image(systemName: "globe") - .font(.bitchatSystem(size: 12)) - .foregroundColor(palette.secondary.opacity(0.8)) - .headerTapTarget() - .accessibilityLabel( - String(localized: "content.accessibility.gateway_active", defaultValue: "Internet gateway active, sharing your connection with the mesh", comment: "Accessibility label for the internet gateway indicator") - ) - .help( - String(localized: "content.header.gateway_active", defaultValue: "Sharing your internet connection with nearby mesh peers", comment: "Tooltip for the internet gateway indicator") - ) + Button(action: { appChromeModel.isLocationChannelsSheetPresented = true }) { + Image(systemName: "globe") + .font(.bitchatSystem(size: 12)) + .foregroundColor(palette.secondary.opacity(0.8)) + .headerTapTarget() + } + .buttonStyle(.plain) + .accessibilityLabel( + String(localized: "content.accessibility.gateway_active", defaultValue: "Internet gateway active, sharing your connection with the mesh", comment: "Accessibility label for the internet gateway indicator") + ) + .accessibilityHint( + String(localized: "content.accessibility.gateway_hint", defaultValue: "Opens channel settings to turn the gateway on or off", comment: "Accessibility hint for the internet gateway indicator explaining a tap opens the channel sheet") + ) + .help( + String(localized: "content.header.gateway_active", defaultValue: "Sharing your internet connection with nearby mesh peers", comment: "Tooltip for the internet gateway indicator") + ) } if carriedMailCount > 0 { From 6886035632bfd93f9384fcd6c9b8acdbc056941c Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 09:20:54 +0200 Subject: [PATCH 053/158] Fix press-and-hold mic dying instantly in private chats (#1405) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The private-chat sheet wraps its entire content — composer included — in a high-priority swipe-right-to-leave DragGesture. A high-priority ancestor drag preempts child gestures, so the composer mic's press-and-hold was cancelled 3-10 ms after touch-down (observed on both iOS and macOS in field logs), making voice notes unrecordable inside DMs while working fine in the public timeline. Same starvation mechanism as the DM image-reveal bug (#1402), hitting a drag instead of a tap. The swipe-to-leave gesture now attaches to the message list only — where users actually swipe — leaving the composer's gestures (mic hold, text field, buttons) out of its reach. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Views/ContentSheetViews.swift | 28 ++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/bitchat/Views/ContentSheetViews.swift b/bitchat/Views/ContentSheetViews.swift index 4d9d5c5b..f8fb9411 100644 --- a/bitchat/Views/ContentSheetViews.swift +++ b/bitchat/Views/ContentSheetViews.swift @@ -393,6 +393,11 @@ private struct ContentPrivateChatSheetView: View { ) .themedSurface() .frame(maxWidth: .infinity, maxHeight: .infinity) + // Swipe-right-to-leave lives on the message list only. On the + // whole sheet it preempted the composer's press-and-hold mic + // gesture (a high-priority ancestor drag cancels child gestures + // within milliseconds — same starvation as the image-reveal bug). + .highPriorityGesture(swipeToLeaveGesture) if !theme.usesGlassChrome { Divider() @@ -423,18 +428,19 @@ private struct ContentPrivateChatSheetView: View { } .themedSheetBackground() .foregroundColor(palette.primary) - .highPriorityGesture( - DragGesture(minimumDistance: 25, coordinateSpace: .local) - .onEnded { value in - let horizontal = value.translation.width - let vertical = abs(value.translation.height) - guard horizontal > 80, vertical < 60 else { return } - withAnimation(.easeInOut(duration: TransportConfig.uiAnimationMediumSeconds)) { - showSidebar = true - privateConversationModel.endConversation() - } + } + + private var swipeToLeaveGesture: some Gesture { + DragGesture(minimumDistance: 25, coordinateSpace: .local) + .onEnded { value in + let horizontal = value.translation.width + let vertical = abs(value.translation.height) + guard horizontal > 80, vertical < 60 else { return } + withAnimation(.easeInOut(duration: TransportConfig.uiAnimationMediumSeconds)) { + showSidebar = true + privateConversationModel.endConversation() } - ) + } } /// Persistent one-line reminder that this composer feeds a private From eacd8f075044899c2f02274b5b829a88965cea72 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 09:20:58 +0200 Subject: [PATCH 054/158] Live push-to-talk voice for DMs (streams while you talk, voice note as fallback) (#1403) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Live push-to-talk voice for DMs: stream while you talk, voice note as fallback Holding the mic in a DM now streams AAC frames live over the Noise session (walkie-talkie style, ~0.5s mouth-to-ear at one hop) while recording the same audio as a normal voice note. On release the note ships through the existing fileTransfer pipeline; receivers that heard the live stream absorb it silently into the same bubble (matched by the burst ID embedded in the file name), so reliability comes for free and nobody sees duplicates. Protocol: - NoisePayloadType.voiceFrame = 0x08 carrying VoiceBurstPacket (burstID + seq + START/data/END/CANCELED, length-prefixed AAC frames) - 210-byte burst-content budget keeps each Noise packet inside the 256-byte padding bucket: one BLE frame, never the fragment scheduler - fire-and-forget: frames are dropped (never queued) without an established session; live is only offered when the peer is mesh-reachable Receive: - ChatLiveVoiceCoordinator assembles bursts (jitter-ordered, 0.5s gap skip, 3s idle end, flood/size caps), persists progressively as ADTS .aac so even a partial burst is a replayable bubble - live autoplay only when the conversation is on screen, app active, and the new app-info "live voice messages" toggle is on (also gates live sending) - one-playback-at-a-time via a shared ExclusivePlayback slot Capture: - PTTCaptureEngine taps AVAudioEngine, dual-encodes: live AAC frames + the finalized .m4a (same 16kHz/mono/16kbps settings as VoiceRecorder) - VoiceRecordingViewModel now drives a pluggable VoiceCaptureSession; the composer HUD shows a pulsing LIVE treatment when streaming Includes the push-to-talk design doc, 6 new localization keys across all 29 locales, and unit tests for framing, packetizer budget, ADTS output, codec round-trip, and the assembly/absorb lifecycle. Public-mesh PTT (MessageType 0x29) lands separately on top of this. Co-Authored-By: Claude Fable 5 * PTT follow-ups from review + field test: peer-ID normalization, toggle gates inbound, drop-path diagnostics Codex review fixes (#1403): - makeVoiceCaptureSession normalizes the selected peer with toShort() before the reachability/session checks and binds the send target to that same routing ID — a conversation selected under the stable 64-hex Noise key no longer silently falls back to a classic note while the short-ID session is established - the live-voice toggle now gates inbound bursts too: off means classic-notes-only in both directions (no live bubble, partial file, or early notification; the finalized note still arrives), with a test Field-test diagnostics (first device run: DM frames decrypted but no bubble appeared, with no log evidence of which guard dropped them): - coordinator logs undecodable frames (size + hex prefix) and blocked drops - makeAssembly logs directory/file-handle failures instead of returning nil silently - PTTLiveVoiceSession logs capture start and finish (packet/frame/duration counts); PTTCaptureEngine logs engine start success/failure with the input format; BLEService.sendVoiceFrame logs no-session drops Co-Authored-By: Claude Fable 5 * Fix iPhone live-capture failure: dead input unit (AURemoteIO -10851, 0 Hz) Field testing showed the phone's live capture failing at mic enable with AURemoteIO -10851 and an input format of 0 Hz / 2 ch — an input unit bound to an earlier (playback-only or settling) audio session. The Mac, which has no session lifecycle, captured fine, which is why public bursts from the Mac worked while phone-side sends degraded from working (first hold) to sporadic to dead across holds. Three layers of defense: - PTTCaptureEngine recreates its AVAudioEngine on every start(), after the session is configured, so the input unit binds to the session that is active now; a dead input (0 Hz or 0 channels) is now a distinct, logged error instead of a silent setup failure - PTTLiveVoiceSession retries the capture start once after a 150 ms route-settle pause - VoiceRecordingViewModel falls back to the classic VoiceRecorder within the same hold if the live engine still cannot start — a route glitch now costs the live stream, never the voice note Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/ConversationUIModel.swift | 11 + bitchat/Features/voice/PTTAudioCodec.swift | 175 +++ bitchat/Features/voice/PTTAudioFormat.swift | 84 ++ bitchat/Features/voice/PTTBurstPlayer.swift | 144 +++ bitchat/Features/voice/PTTCaptureEngine.swift | 171 +++ bitchat/Features/voice/PTTSettings.swift | 39 + .../Features/voice/VoiceCaptureSession.swift | 183 +++ .../voice/VoiceNotePlaybackController.swift | 22 +- bitchat/Localizable.xcstrings | 1074 +++++++++++++++++ bitchat/Protocols/BitchatProtocol.swift | 3 + bitchat/Protocols/VoiceBurstPacket.swift | 220 ++++ bitchat/Services/BLE/BLEService.swift | 21 + bitchat/Services/Transport.swift | 7 + bitchat/Services/TransportConfig.swift | 19 + .../ViewModels/ChatLiveVoiceCoordinator.swift | 434 +++++++ .../ChatTransportEventCoordinator.swift | 10 + bitchat/ViewModels/ChatViewModel.swift | 1 + .../ChatViewModel+PrivateChat.swift | 39 + bitchat/ViewModels/NostrInboundPipeline.swift | 12 +- .../ViewModels/VoiceRecordingViewModel.swift | 59 +- bitchat/Views/AppInfoView.swift | 25 + bitchat/Views/ContentComposerView.swift | 26 +- bitchat/Views/ContentView.swift | 3 + bitchat/Views/Media/LiveVoiceBadge.swift | 51 + bitchat/Views/Media/MediaMessageView.swift | 1 + bitchat/Views/Media/VoiceNoteView.swift | 14 +- .../ChatLiveVoiceCoordinatorTests.swift | 241 ++++ ...ransportEventCoordinatorContextTests.swift | 7 + bitchatTests/PTTAudioTests.swift | 100 ++ bitchatTests/VoiceBurstPacketTests.swift | 161 +++ docs/PUSH-TO-TALK-DESIGN.md | 160 +++ 31 files changed, 3488 insertions(+), 29 deletions(-) create mode 100644 bitchat/Features/voice/PTTAudioCodec.swift create mode 100644 bitchat/Features/voice/PTTAudioFormat.swift create mode 100644 bitchat/Features/voice/PTTBurstPlayer.swift create mode 100644 bitchat/Features/voice/PTTCaptureEngine.swift create mode 100644 bitchat/Features/voice/PTTSettings.swift create mode 100644 bitchat/Features/voice/VoiceCaptureSession.swift create mode 100644 bitchat/Protocols/VoiceBurstPacket.swift create mode 100644 bitchat/ViewModels/ChatLiveVoiceCoordinator.swift create mode 100644 bitchat/Views/Media/LiveVoiceBadge.swift create mode 100644 bitchatTests/ChatLiveVoiceCoordinatorTests.swift create mode 100644 bitchatTests/PTTAudioTests.swift create mode 100644 bitchatTests/VoiceBurstPacketTests.swift create mode 100644 docs/PUSH-TO-TALK-DESIGN.md diff --git a/bitchat/App/ConversationUIModel.swift b/bitchat/App/ConversationUIModel.swift index f8633e0d..95412b58 100644 --- a/bitchat/App/ConversationUIModel.swift +++ b/bitchat/App/ConversationUIModel.swift @@ -150,6 +150,17 @@ final class ConversationUIModel: ObservableObject { chatViewModel.sendVoiceNote(at: url) } + /// Capture backend for the mic gesture: live PTT when the current DM + /// peer can hear it now, classic voice note otherwise. + func makeVoiceCaptureSession() -> VoiceCaptureSession { + chatViewModel.makeVoiceCaptureSession() + } + + /// Whether this message is a live voice burst still streaming in. + func isLiveVoiceMessage(_ message: BitchatMessage) -> Bool { + chatViewModel.liveVoiceCoordinator.isLiveVoiceMessage(message) + } + func cancelMediaSend(messageID: String) { chatViewModel.cancelMediaSend(messageID: messageID) } diff --git a/bitchat/Features/voice/PTTAudioCodec.swift b/bitchat/Features/voice/PTTAudioCodec.swift new file mode 100644 index 00000000..0b8ed6f3 --- /dev/null +++ b/bitchat/Features/voice/PTTAudioCodec.swift @@ -0,0 +1,175 @@ +// +// PTTAudioCodec.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import AVFoundation +import BitLogger +import Foundation + +/// Streaming PCM -> AAC-LC encoder for live voice. Stateful (the AAC encoder +/// carries a bit reservoir across frames); one instance per burst. +/// Not thread-safe — confine to one queue. +final class PTTFrameEncoder { + private let converter: AVAudioConverter + private var pendingInput: [AVAudioPCMBuffer] = [] + + init?() { + guard let pcm = PTTAudioFormat.pcmFormat, + let aac = PTTAudioFormat.aacFormat, + let converter = AVAudioConverter(from: pcm, to: aac) + else { return nil } + converter.bitRate = PTTAudioFormat.bitRate + self.converter = converter + } + + /// Feeds PCM (16 kHz mono float) and returns every complete AAC frame the + /// encoder produced. Frames come out ~130 bytes each at 16 kbps. + func encode(_ buffer: AVAudioPCMBuffer) -> [Data] { + pendingInput.append(buffer) + return drainConverter() + } + + private func drainConverter() -> [Data] { + var frames: [Data] = [] + while true { + let output = AVAudioCompressedBuffer( + format: converter.outputFormat, + packetCapacity: 8, + maximumPacketSize: max(converter.maximumOutputPacketSize, 1) + ) + var error: NSError? + let status = converter.convert(to: output, error: &error) { [weak self] _, outStatus in + guard let self, let next = self.pendingInput.first else { + outStatus.pointee = .noDataNow + return nil + } + self.pendingInput.removeFirst() + outStatus.pointee = .haveData + return next + } + if status == .error { + SecureLogger.error("PTT encode failed: \(error?.localizedDescription ?? "unknown")", category: .session) + return frames + } + frames.append(contentsOf: Self.extractPackets(from: output)) + // .haveData means the output buffer filled and more may be ready; + // anything else means the converter wants more input. + if status != .haveData { return frames } + } + } + + private static func extractPackets(from buffer: AVAudioCompressedBuffer) -> [Data] { + guard buffer.packetCount > 0, let descriptions = buffer.packetDescriptions else { return [] } + var frames: [Data] = [] + frames.reserveCapacity(Int(buffer.packetCount)) + for index in 0.. 0 else { continue } + let start = buffer.data.advanced(by: Int(description.mStartOffset)) + frames.append(Data(bytes: start, count: Int(description.mDataByteSize))) + } + return frames + } +} + +/// Streaming AAC-LC -> PCM decoder for live voice. Stateful; one instance per +/// inbound burst. Not thread-safe — confine to one queue/actor. +final class PTTFrameDecoder { + private let converter: AVAudioConverter + private let pcmFormat: AVAudioFormat + private let aacFormat: AVAudioFormat + + init?() { + guard let pcm = PTTAudioFormat.pcmFormat, + let aac = PTTAudioFormat.aacFormat, + let converter = AVAudioConverter(from: aac, to: pcm) + else { return nil } + self.converter = converter + self.pcmFormat = pcm + self.aacFormat = aac + } + + /// Decodes one raw AAC frame to PCM. Returns nil for malformed input or + /// while the decoder is still priming (the first frame of a stream). + func decode(_ frame: Data) -> AVAudioPCMBuffer? { + guard !frame.isEmpty, frame.count <= 8 * 1024 else { return nil } + + let input = AVAudioCompressedBuffer(format: aacFormat, packetCapacity: 1, maximumPacketSize: frame.count) + frame.withUnsafeBytes { raw in + guard let base = raw.baseAddress else { return } + input.data.copyMemory(from: base, byteCount: frame.count) + } + input.byteLength = UInt32(frame.count) + input.packetCount = 1 + input.packetDescriptions?.pointee = AudioStreamPacketDescription( + mStartOffset: 0, + mVariableFramesInPacket: 0, + mDataByteSize: UInt32(frame.count) + ) + + guard let output = AVAudioPCMBuffer( + pcmFormat: pcmFormat, + frameCapacity: PTTAudioFormat.samplesPerFrame * 2 + ) else { return nil } + + var consumed = false + var error: NSError? + let status = converter.convert(to: output, error: &error) { _, outStatus in + if consumed { + outStatus.pointee = .noDataNow + return nil + } + consumed = true + outStatus.pointee = .haveData + return input + } + guard status != .error else { + SecureLogger.debug("PTT decode failed: \(error?.localizedDescription ?? "unknown")", category: .session) + return nil + } + return output.frameLength > 0 ? output : nil + } +} + +/// Sample-rate/channel converter from the microphone's native format to the +/// 16 kHz mono processing format. Stateful; not thread-safe. +final class PTTInputResampler { + private let converter: AVAudioConverter + private let outputFormat: AVAudioFormat + private let ratio: Double + + init?(inputFormat: AVAudioFormat) { + guard let pcm = PTTAudioFormat.pcmFormat, + let converter = AVAudioConverter(from: inputFormat, to: pcm) + else { return nil } + self.converter = converter + self.outputFormat = pcm + self.ratio = PTTAudioFormat.sampleRate / inputFormat.sampleRate + } + + func resample(_ buffer: AVAudioPCMBuffer) -> AVAudioPCMBuffer? { + let capacity = AVAudioFrameCount(Double(buffer.frameLength) * ratio) + 64 + guard let output = AVAudioPCMBuffer(pcmFormat: outputFormat, frameCapacity: capacity) else { return nil } + + var consumed = false + var error: NSError? + let status = converter.convert(to: output, error: &error) { _, outStatus in + if consumed { + outStatus.pointee = .noDataNow + return nil + } + consumed = true + outStatus.pointee = .haveData + return buffer + } + guard status != .error else { + SecureLogger.debug("PTT resample failed: \(error?.localizedDescription ?? "unknown")", category: .session) + return nil + } + return output.frameLength > 0 ? output : nil + } +} diff --git a/bitchat/Features/voice/PTTAudioFormat.swift b/bitchat/Features/voice/PTTAudioFormat.swift new file mode 100644 index 00000000..39e5a61a --- /dev/null +++ b/bitchat/Features/voice/PTTAudioFormat.swift @@ -0,0 +1,84 @@ +// +// PTTAudioFormat.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import AVFoundation +import Foundation + +/// Shared audio parameters for live push-to-talk: AAC-LC, 16 kHz, mono, +/// ~16 kbps — deliberately identical to `VoiceRecorder`'s voice-note settings +/// so a burst's finalized `.m4a` and its live frames sound the same. +enum PTTAudioFormat { + static let sampleRate: Double = 16_000 + static let channelCount: AVAudioChannelCount = 1 + static let bitRate = 16_000 + /// AAC-LC frame size is fixed by the codec: 1024 samples = 64 ms at 16 kHz. + static let samplesPerFrame: AVAudioFrameCount = 1024 + static var frameDuration: TimeInterval { Double(samplesPerFrame) / sampleRate } + + /// Uncompressed processing format (deinterleaved float PCM). + static var pcmFormat: AVAudioFormat? { + AVAudioFormat(standardFormatWithSampleRate: sampleRate, channels: channelCount) + } + + /// Compressed wire format. + static var aacFormat: AVAudioFormat? { + var description = AudioStreamBasicDescription( + mSampleRate: sampleRate, + mFormatID: kAudioFormatMPEG4AAC, + mFormatFlags: 0, + mBytesPerPacket: 0, + mFramesPerPacket: samplesPerFrame, + mBytesPerFrame: 0, + mChannelsPerFrame: channelCount, + mBitsPerChannel: 0, + mReserved: 0 + ) + return AVAudioFormat(streamDescription: &description) + } + + /// Voice-note container settings for the finalized `.m4a`, mirroring + /// `VoiceRecorder.startRecording()`. + static var voiceNoteFileSettings: [String: Any] { + [ + AVFormatIDKey: kAudioFormatMPEG4AAC, + AVSampleRateKey: sampleRate, + AVNumberOfChannelsKey: Int(channelCount), + AVEncoderBitRateKey: bitRate + ] + } +} + +/// Builds ADTS-framed AAC so a receiver can persist a burst progressively: +/// unlike `.m4a` (whose moov atom only exists after close), an ADTS `.aac` +/// stream is playable at any prefix — a partially received burst is still a +/// replayable voice note. +enum ADTSFramer { + private static let headerSize = 7 + /// MPEG-4 sampling frequency index for 16 kHz. + private static let samplingFrequencyIndex: UInt8 = 8 + private static let channelConfiguration: UInt8 = 1 + + /// Wraps one raw AAC-LC frame in an ADTS header. + static func frame(_ aacFrame: Data) -> Data { + let frameLength = aacFrame.count + headerSize + var data = Data(capacity: frameLength) + // Syncword 0xFFF, MPEG-4, layer 00, no CRC. + data.append(0xFF) + data.append(0xF1) + // Profile AAC-LC (audio object type 2 -> bits 01), frequency index, + // private bit 0, channel config high bit. + data.append((0b01 << 6) | (samplingFrequencyIndex << 2) | ((channelConfiguration >> 2) & 0x1)) + data.append(((channelConfiguration & 0x3) << 6) | UInt8((frameLength >> 11) & 0x3)) + data.append(UInt8((frameLength >> 3) & 0xFF)) + data.append(UInt8((frameLength & 0x7) << 5) | 0x1F) + // Buffer fullness 0x7FF (VBR), one AAC frame per ADTS frame. + data.append(0xFC) + data.append(aacFrame) + return data + } +} diff --git a/bitchat/Features/voice/PTTBurstPlayer.swift b/bitchat/Features/voice/PTTBurstPlayer.swift new file mode 100644 index 00000000..4834c2e8 --- /dev/null +++ b/bitchat/Features/voice/PTTBurstPlayer.swift @@ -0,0 +1,144 @@ +// +// PTTBurstPlayer.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import AVFoundation +import BitLogger +import Foundation + +/// Plays one inbound live voice burst with a small jitter buffer. +/// +/// Frames are decoded and scheduled back-to-back on an `AVAudioPlayerNode`; +/// an underrun (missing/late packets) simply pauses output until the next +/// buffer arrives, which self-heals timing without explicit silence +/// insertion. Playback starts once `TransportConfig.pttJitterBufferSeconds` +/// of audio is queued or `pttJitterDeadlineSeconds` has elapsed. +@MainActor +final class PTTBurstPlayer { + private let engine = AVAudioEngine() + private let node = AVAudioPlayerNode() + private let decoder: PTTFrameDecoder + + private var queuedBuffers: [AVAudioPCMBuffer] = [] + private var queuedDuration: TimeInterval = 0 + private var scheduledCount = 0 + private var engineStarted = false + private var finished = false + private var stopped = false + private var deadlineTask: Task? + + private(set) var isPlaying = false + + init?() { + guard let format = PTTAudioFormat.pcmFormat, let decoder = PTTFrameDecoder() else { return nil } + self.decoder = decoder + engine.attach(node) + engine.connect(node, to: engine.mainMixerNode, format: format) + + deadlineTask = Task { [weak self] in + try? await Task.sleep(nanoseconds: UInt64(TransportConfig.pttJitterDeadlineSeconds * 1_000_000_000)) + self?.startIfReady(force: true) + } + } + + /// Decodes and queues frames (in burst order). Starts playback when the + /// jitter buffer fills. + func enqueue(_ frames: [Data]) { + guard !stopped else { return } + for frame in frames { + guard let pcm = decoder.decode(frame) else { continue } + if engineStarted { + schedule(pcm) + } else { + queuedBuffers.append(pcm) + queuedDuration += Double(pcm.frameLength) / PTTAudioFormat.sampleRate + } + } + startIfReady(force: false) + } + + /// The burst ended: stop once everything scheduled has played out. + func finishAfterDrain() { + finished = true + stopIfDrained() + } + + /// Immediate stop (cancel, another playback taking over, teardown). + func stop() { + guard !stopped else { return } + stopped = true + deadlineTask?.cancel() + queuedBuffers = [] + if engineStarted { + node.stop() + engine.stop() + } + isPlaying = false + VoiceNotePlaybackCoordinator.shared.deactivate(self) + } + + private func startIfReady(force: Bool) { + guard !engineStarted, !stopped, !queuedBuffers.isEmpty else { return } + guard force || queuedDuration >= TransportConfig.pttJitterBufferSeconds else { return } + + #if os(iOS) + do { + let session = AVAudioSession.sharedInstance() + try session.setCategory(.playback, mode: .spokenAudio, options: [.mixWithOthers]) + try session.setActive(true, options: []) + } catch { + SecureLogger.error("PTT playback session activation failed: \(error)", category: .session) + } + #endif + + engine.prepare() + do { + try engine.start() + } catch { + SecureLogger.error("PTT playback engine failed to start: \(error)", category: .session) + stopped = true + return + } + engineStarted = true + isPlaying = true + VoiceNotePlaybackCoordinator.shared.activate(self) + node.play() + + let buffered = queuedBuffers + queuedBuffers = [] + queuedDuration = 0 + for buffer in buffered { + schedule(buffer) + } + } + + private func schedule(_ buffer: AVAudioPCMBuffer) { + scheduledCount += 1 + node.scheduleBuffer(buffer) { [weak self] in + Task { @MainActor [weak self] in + guard let self else { return } + self.scheduledCount -= 1 + self.stopIfDrained() + } + } + } + + private func stopIfDrained() { + guard finished, scheduledCount <= 0 else { return } + stop() + } +} + +extension PTTBurstPlayer: ExclusivePlayback { + /// A live stream can't meaningfully pause; yielding the floor stops it. + /// The burst keeps assembling to file, so nothing is lost. + nonisolated func pauseForExclusivity() { + Task { @MainActor [weak self] in + self?.stop() + } + } +} diff --git a/bitchat/Features/voice/PTTCaptureEngine.swift b/bitchat/Features/voice/PTTCaptureEngine.swift new file mode 100644 index 00000000..8150f7bf --- /dev/null +++ b/bitchat/Features/voice/PTTCaptureEngine.swift @@ -0,0 +1,171 @@ +// +// PTTCaptureEngine.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import AVFoundation +import BitLogger +import Foundation + +/// Captures microphone audio for a live push-to-talk burst, producing both: +/// - live AAC frames via `onFrames` (called on the capture queue), and +/// - a finalized `.m4a` voice note on `stop()` — the same artifact +/// `VoiceRecorder` produces, so the existing voice-note send pipeline +/// handles delivery to receivers that missed the live stream. +final class PTTCaptureEngine { + /// Hard cap matching `VoiceRecorder.maxRecordingDuration`: past it the + /// engine keeps running (the UI owns the gesture) but stops encoding. + private static let maxCaptureDuration: TimeInterval = 120 + + /// Recreated on every `start()`: an engine whose input unit was + /// instantiated against an earlier (playback-only or inactive) audio + /// session keeps reporting a dead 0 Hz / 2 ch input format and fails to + /// enable the mic (AURemoteIO -10851, observed on iPhone field tests). + private var engine = AVAudioEngine() + private let queue = DispatchQueue(label: "chat.bitchat.ptt.capture", qos: .userInitiated) + + // Capture-queue-confined state. + private var resampler: PTTInputResampler? + private var encoder: PTTFrameEncoder? + private var file: AVAudioFile? + private var fileURL: URL? + private var encodedFrameCount = 0 + private var running = false + private var captureStart = Date() + + /// Called on the capture queue with each batch of encoded AAC frames. + var onFrames: (([Data]) -> Void)? + + enum CaptureError: Error { + case inputUnavailable + case audioSetupFailed + } + + func start(outputURL: URL) throws { + #if os(iOS) + try Self.configureAudioSession() + #endif + + // Fresh engine per capture so its input unit binds to the session + // that is active *now* (see `engine` doc comment). + engine = AVAudioEngine() + let inputFormat = engine.inputNode.outputFormat(forBus: 0) + guard inputFormat.sampleRate > 0, inputFormat.channelCount > 0 else { + SecureLogger.error("PTT: capture input unavailable (input reports \(Int(inputFormat.sampleRate)) Hz, \(inputFormat.channelCount) ch)", category: .session) + throw CaptureError.inputUnavailable + } + guard let resampler = PTTInputResampler(inputFormat: inputFormat), + let encoder = PTTFrameEncoder(), + let pcmFormat = PTTAudioFormat.pcmFormat + else { throw CaptureError.audioSetupFailed } + + let file = try AVAudioFile( + forWriting: outputURL, + settings: PTTAudioFormat.voiceNoteFileSettings, + commonFormat: pcmFormat.commonFormat, + interleaved: pcmFormat.isInterleaved + ) + + queue.sync { + self.resampler = resampler + self.encoder = encoder + self.file = file + self.fileURL = outputURL + self.encodedFrameCount = 0 + self.captureStart = Date() + self.running = true + } + + engine.inputNode.installTap(onBus: 0, bufferSize: 4096, format: inputFormat) { [weak self] buffer, _ in + self?.queue.async { self?.process(buffer) } + } + engine.prepare() + do { + try engine.start() + } catch { + SecureLogger.error("PTT: capture engine failed to start (input: \(Int(inputFormat.sampleRate)) Hz, \(inputFormat.channelCount) ch): \(error)", category: .session) + engine.inputNode.removeTap(onBus: 0) + queue.sync { self.teardown(deleteFile: true) } + throw error + } + SecureLogger.info("PTT: capture engine running (input: \(Int(inputFormat.sampleRate)) Hz, \(inputFormat.channelCount) ch)", category: .session) + } + + /// Stops capture and finalizes the `.m4a`. Returns the file URL and the + /// number of encoded AAC frames (each `PTTAudioFormat.frameDuration` long). + func stop() -> (url: URL?, encodedFrames: Int) { + engine.inputNode.removeTap(onBus: 0) + engine.stop() + let result: (URL?, Int) = queue.sync { + let url = fileURL + let frames = encodedFrameCount + teardown(deleteFile: false) + return (url, frames) + } + #if os(iOS) + Self.deactivateAudioSession() + #endif + return result + } + + func cancel() { + engine.inputNode.removeTap(onBus: 0) + engine.stop() + queue.sync { teardown(deleteFile: true) } + #if os(iOS) + Self.deactivateAudioSession() + #endif + } + + // MARK: - Capture queue + + private func process(_ buffer: AVAudioPCMBuffer) { + guard running, + Date().timeIntervalSince(captureStart) < Self.maxCaptureDuration, + let resampled = resampler?.resample(buffer) + else { return } + + do { + try file?.write(from: resampled) + } catch { + SecureLogger.error("PTT capture file write failed: \(error)", category: .session) + } + + guard let frames = encoder?.encode(resampled), !frames.isEmpty else { return } + encodedFrameCount += frames.count + onFrames?(frames) + } + + private func teardown(deleteFile: Bool) { + running = false + // Releasing the AVAudioFile finalizes the .m4a container. + file = nil + encoder = nil + resampler = nil + if deleteFile, let url = fileURL { + try? FileManager.default.removeItem(at: url) + } + fileURL = nil + } + + // MARK: - Audio session (iOS) + + #if os(iOS) + private static func configureAudioSession() throws { + let session = AVAudioSession.sharedInstance() + #if targetEnvironment(simulator) + try session.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetoothA2DP]) + #else + try session.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetoothA2DP, .allowBluetoothHFP]) + #endif + try session.setActive(true, options: .notifyOthersOnDeactivation) + } + + private static func deactivateAudioSession() { + try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation) + } + #endif +} diff --git a/bitchat/Features/voice/PTTSettings.swift b/bitchat/Features/voice/PTTSettings.swift new file mode 100644 index 00000000..c3b56510 --- /dev/null +++ b/bitchat/Features/voice/PTTSettings.swift @@ -0,0 +1,39 @@ +// +// PTTSettings.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +#if os(iOS) +import UIKit +#elseif os(macOS) +import AppKit +#endif + +/// User preference for live push-to-talk voice. One switch controls both +/// directions: streaming your holds live, and auto-playing inbound bursts. +/// Off means voice messages behave exactly like classic voice notes. +enum PTTSettings { + private static let liveVoiceEnabledKey = "ptt.liveVoiceEnabled" + + static var liveVoiceEnabled: Bool { + get { UserDefaults.standard.object(forKey: liveVoiceEnabledKey) as? Bool ?? true } + set { UserDefaults.standard.set(newValue, forKey: liveVoiceEnabledKey) } + } + + /// Autoplay is foreground-only: audio must never start from the + /// background. + @MainActor + static var isAppActive: Bool { + #if os(iOS) + return UIApplication.shared.applicationState == .active + #elseif os(macOS) + return NSApplication.shared.isActive + #else + return true + #endif + } +} diff --git a/bitchat/Features/voice/VoiceCaptureSession.swift b/bitchat/Features/voice/VoiceCaptureSession.swift new file mode 100644 index 00000000..5a28b91c --- /dev/null +++ b/bitchat/Features/voice/VoiceCaptureSession.swift @@ -0,0 +1,183 @@ +// +// VoiceCaptureSession.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import Foundation + +/// Capture backend behind the composer's hold-to-record gesture. +/// `VoiceRecordingViewModel` drives one session per press; the concrete type +/// decides *how* audio leaves the device: `VoiceNoteCaptureSession` records a +/// note delivered on release (today's behavior), `PTTLiveVoiceSession` +/// additionally streams frames live while the button is held. +@MainActor +protocol VoiceCaptureSession: AnyObject { + /// Whether audio is leaving the device in real time while recording — + /// drives the composer's LIVE treatment. + var isLive: Bool { get } + func requestPermission() async -> Bool + func start() async throws + /// Stops capture and returns the finalized voice-note file, or nil when + /// nothing valid was captured. + func finish() async -> URL? + func cancel() async +} + +/// The classic record-then-send backend, wrapping the shared `VoiceRecorder`. +@MainActor +final class VoiceNoteCaptureSession: VoiceCaptureSession { + var isLive: Bool { false } + + func requestPermission() async -> Bool { + await VoiceRecorder.shared.requestPermission() + } + + func start() async throws { + try await VoiceRecorder.shared.startRecording() + } + + func finish() async -> URL? { + await VoiceRecorder.shared.stopRecording() + } + + func cancel() async { + await VoiceRecorder.shared.cancelRecording() + } +} + +/// Live push-to-talk backend: streams `VoiceBurstPacket`s to one peer while +/// recording, then finalizes the same audio as a standard voice note whose +/// file name carries the burst ID (`voice_.m4a`) so receivers that +/// heard the live stream absorb the note silently instead of seeing a +/// duplicate. +@MainActor +final class PTTLiveVoiceSession: VoiceCaptureSession { + let burstID: Data + + private let sendPacket: (Data) -> Void + private let capture = PTTCaptureEngine() + /// Capture-queue-confined stream state: packetizes frames and lazily + /// emits START so packet order is guaranteed by queue serialization. + private final class StreamState { + var packetizer: VoiceBurstPacketizer + var sentStart = false + init(burstID: Data) { + packetizer = VoiceBurstPacketizer(burstID: burstID) + } + } + private let stream: StreamState + private var startDate: Date? + private var completed = false + + var isLive: Bool { true } + + /// - Parameter sendPacket: delivers one encoded `VoiceBurstPacket` to the + /// target peer; must be safe to call from any queue (BLEService hops to + /// its own message queue internally). + init(sendPacket: @escaping (Data) -> Void) { + self.burstID = VoiceBurstPacket.makeBurstID() + self.sendPacket = sendPacket + self.stream = StreamState(burstID: burstID) + } + + func requestPermission() async -> Bool { + await VoiceRecorder.shared.requestPermission() + } + + func start() async throws { + let outputURL = try Self.makeOutputURL(burstID: burstID) + let sendPacket = sendPacket + let stream = stream + capture.onFrames = { frames in + if !stream.sentStart { + stream.sentStart = true + if let start = VoiceBurstPacket( + burstID: stream.packetizer.burstID, + seq: 0, + kind: .start(codec: .aacLC16kMono) + ) { + sendPacket(start.encode()) + } + } + for frame in frames { + for packet in stream.packetizer.add(frame) { + sendPacket(packet) + } + } + // Flush per callback batch: at ~130-byte frames the budget fits + // one frame per packet anyway, and holding residue would add + // ~100 ms of avoidable latency. + for packet in stream.packetizer.flush() { + sendPacket(packet) + } + } + do { + try capture.start(outputURL: outputURL) + } catch { + // The HAL can briefly report a dead input right after the audio + // session (re)activates while the route settles; one retry after + // a short pause covers it (observed on iPhone field tests). + SecureLogger.warning("PTT: capture start failed (\(error)) — retrying once after route settle", category: .session) + try? await Task.sleep(nanoseconds: 150_000_000) + try capture.start(outputURL: outputURL) + } + startDate = Date() + SecureLogger.info("PTT: live burst \(burstID.hexEncodedString()) capture started", category: .session) + } + + func finish() async -> URL? { + guard !completed else { return nil } + completed = true + + let elapsed = startDate.map { Date().timeIntervalSince($0) } ?? 0 + let (url, encodedFrames) = capture.stop() + // stop() drained the capture queue, so touching `stream` is safe now. + + guard elapsed >= VoiceRecorder.minRecordingDuration, let url else { + sendControlPacket(.canceled) + if let url { + try? FileManager.default.removeItem(at: url) + } + return nil + } + + for packet in stream.packetizer.flush() { + sendPacket(packet) + } + let durationMs = UInt32((Double(encodedFrames) * PTTAudioFormat.frameDuration * 1000).rounded()) + sendControlPacket(.end(totalDataPackets: stream.packetizer.dataPacketCount, durationMs: durationMs)) + SecureLogger.info("PTT: live burst \(burstID.hexEncodedString()) finished — \(stream.packetizer.dataPacketCount) data packets, \(encodedFrames) frames, \(durationMs) ms", category: .session) + return url + } + + func cancel() async { + guard !completed else { return } + completed = true + capture.cancel() + sendControlPacket(.canceled) + } + + private func sendControlPacket(_ kind: VoiceBurstPacket.Kind) { + guard let packet = VoiceBurstPacket(burstID: burstID, seq: stream.packetizer.nextSeq, kind: kind) else { return } + sendPacket(packet.encode()) + } + + private static func makeOutputURL(burstID: Data) throws -> URL { + let base = try FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) + let directory = base + .appendingPathComponent("files", isDirectory: true) + .appendingPathComponent("voicenotes/outgoing", isDirectory: true) + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil) + return directory.appendingPathComponent("voice_\(burstID.hexEncodedString()).m4a") + } +} diff --git a/bitchat/Features/voice/VoiceNotePlaybackController.swift b/bitchat/Features/voice/VoiceNotePlaybackController.swift index 79b9af6c..ad520b6f 100644 --- a/bitchat/Features/voice/VoiceNotePlaybackController.swift +++ b/bitchat/Features/voice/VoiceNotePlaybackController.swift @@ -181,23 +181,35 @@ final class VoiceNotePlaybackController: NSObject, ObservableObject, AVAudioPlay } } -/// Ensures only one voice note plays at a time. +/// Something that can hold the app's single audio-playback slot and yield it +/// when another playback starts (voice notes pause; live bursts stop). +protocol ExclusivePlayback: AnyObject { + func pauseForExclusivity() +} + +extension VoiceNotePlaybackController: ExclusivePlayback { + func pauseForExclusivity() { + pause() + } +} + +/// Ensures only one voice playback (note or live burst) runs at a time. final class VoiceNotePlaybackCoordinator { static let shared = VoiceNotePlaybackCoordinator() - private weak var activeController: VoiceNotePlaybackController? + private weak var activeController: (any ExclusivePlayback)? private init() {} - func activate(_ controller: VoiceNotePlaybackController) { + func activate(_ controller: any ExclusivePlayback) { if activeController === controller { return } - activeController?.pause() + activeController?.pauseForExclusivity() activeController = controller } - func deactivate(_ controller: VoiceNotePlaybackController) { + func deactivate(_ controller: any ExclusivePlayback) { if activeController === controller { activeController = nil } diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 72dc28ef..99a7e5ac 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -9512,6 +9512,543 @@ } } }, + "app_info.voice.live.description" : { + "comment" : "Description of the live voice messages setting", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "بث الرسائل الصوتية أثناء التحدث عندما يكون المستلم متاحًا؛ يتم تشغيل الصوت المباشر الوارد تلقائيًا في المحادثة المفتوحة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "প্রাপক নাগালের মধ্যে থাকলে কথা বলার সাথে সাথে ভয়েস বার্তা স্ট্রিম হয়; খোলা চ্যাটে আগত লাইভ ভয়েস স্বয়ংক্রিয়ভাবে চলে" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "sprachnachrichten werden beim sprechen live übertragen, wenn der empfänger erreichbar ist; eingehende live-stimme wird im geöffneten chat automatisch abgespielt" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "stream voice messages as you speak when the recipient is reachable; incoming live voice plays automatically in the open chat" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "transmite mensajes de voz mientras hablas cuando el destinatario está disponible; la voz en vivo entrante se reproduce automáticamente en el chat abierto" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "ini-stream ang mga voice message habang nagsasalita kapag maaabot ang tatanggap; awtomatikong tumutugtog ang papasok na live na boses sa bukas na chat" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "diffuse les messages vocaux pendant que vous parlez lorsque le destinataire est joignable ; la voix en direct entrante est lue automatiquement dans la discussion ouverte" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "משדר הודעות קוליות בזמן שאתה מדבר כשהנמען זמין; קול חי נכנס מושמע אוטומטית בצ'אט הפתוח" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "प्राप्तकर्ता पहुंच में होने पर बोलते समय वॉयस संदेश स्ट्रीम होते हैं; खुली चैट में आने वाली लाइव आवाज़ अपने आप चलती है" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "streaming pesan suara saat Anda berbicara ketika penerima terjangkau; suara langsung yang masuk diputar otomatis di obrolan yang terbuka" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "trasmette i messaggi vocali mentre parli quando il destinatario è raggiungibile; la voce in diretta in arrivo viene riprodotta automaticamente nella chat aperta" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "受信者に到達可能なとき、話しながら音声メッセージをライブ配信します。受信したライブ音声は開いているチャットで自動再生されます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상대방이 연결되어 있으면 말하는 동안 음성 메시지가 실시간 전송됩니다. 수신된 라이브 음성은 열려 있는 채팅에서 자동 재생됩니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "strim mesej suara semasa anda bercakap apabila penerima boleh dihubungi; suara langsung masuk dimainkan secara automatik dalam sembang terbuka" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "प्रापक पहुँचयोग्य हुँदा बोल्दै गर्दा भ्वाइस सन्देशहरू स्ट्रिम हुन्छन्; खुला च्याटमा आगमन लाइभ आवाज स्वतः बज्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "streamt spraakberichten terwijl je praat wanneer de ontvanger bereikbaar is; inkomende live spraak wordt automatisch afgespeeld in de geopende chat" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "przesyła wiadomości głosowe na żywo podczas mówienia, gdy odbiorca jest osiągalny; przychodzący głos na żywo odtwarza się automatycznie w otwartym czacie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "transmite mensagens de voz enquanto fala quando o destinatário está acessível; a voz ao vivo recebida é reproduzida automaticamente na conversa aberta" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "transmite mensagens de voz enquanto você fala quando o destinatário está acessível; a voz ao vivo recebida toca automaticamente na conversa aberta" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "передаёт голосовые сообщения в реальном времени, пока вы говорите, если получатель доступен; входящий живой голос автоматически воспроизводится в открытом чате" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "strömmar röstmeddelanden medan du pratar när mottagaren är nåbar; inkommande live-röst spelas upp automatiskt i den öppna chatten" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "பெறுநர் அணுகக்கூடியதாக இருக்கும்போது நீங்கள் பேசும்போதே குரல் செய்திகள் நேரலையாக அனுப்பப்படும்; உள்வரும் நேரலை குரல் திறந்த அரட்டையில் தானாக ஒலிக்கும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "สตรีมข้อความเสียงขณะพูดเมื่อติดต่อผู้รับได้ เสียงสดขาเข้าจะเล่นอัตโนมัติในแชทที่เปิดอยู่" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "alıcı erişilebilir olduğunda sesli mesajlar siz konuşurken canlı iletilir; gelen canlı ses açık sohbette otomatik çalınır" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "передає голосові повідомлення наживо, поки ви говорите, якщо одержувач доступний; вхідний живий голос автоматично відтворюється у відкритому чаті" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "جب وصول کنندہ قابل رسائی ہو تو بولتے وقت صوتی پیغامات لائیو نشر ہوتے ہیں؛ موصول ہونے والی لائیو آواز کھلی چیٹ میں خود بخود چلتی ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "phát trực tiếp tin nhắn thoại khi bạn nói nếu người nhận trong tầm kết nối; giọng nói trực tiếp đến sẽ tự phát trong cuộc trò chuyện đang mở" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当接收方可达时,语音消息会在你说话的同时实时传输;收到的实时语音会在打开的聊天中自动播放" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "當接收方可達時,語音訊息會在你說話的同時即時傳輸;收到的即時語音會在開啟的聊天中自動播放" + } + } + } + }, + "app_info.voice.live.title" : { + "comment" : "Title of the live voice messages setting", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "رسائل صوتية مباشرة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "লাইভ ভয়েস বার্তা" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "live-sprachnachrichten" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "live voice messages" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensajes de voz en vivo" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "live na mga voice message" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "messages vocaux en direct" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הודעות קוליות חיות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "लाइव वॉयस संदेश" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "pesan suara langsung" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "messaggi vocali in diretta" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ライブ音声メッセージ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "라이브 음성 메시지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesej suara langsung" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "लाइभ भ्वाइस सन्देशहरू" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "live spraakberichten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "wiadomości głosowe na żywo" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensagens de voz ao vivo" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensagens de voz ao vivo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "живые голосовые сообщения" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "live-röstmeddelanden" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "நேரலை குரல் செய்திகள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ข้อความเสียงสด" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "canlı sesli mesajlar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "живі голосові повідомлення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "لائیو صوتی پیغامات" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "tin nhắn thoại trực tiếp" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "实时语音消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "即時語音訊息" + } + } + } + }, + "app_info.voice.title" : { + "comment" : "Section header for voice settings in the app info sheet", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الصوت" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "ভয়েস" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "AUDIO" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "VOICE" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "VOZ" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "BOSES" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "VOIX" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קול" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "वॉयस" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "SUARA" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "VOCE" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ボイス" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "음성" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "SUARA" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "आवाज" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "SPRAAK" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "GŁOS" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "VOZ" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "VOZ" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "ГОЛОС" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "RÖST" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "குரல்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เสียง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "SES" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "ГОЛОС" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "آواز" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "GIỌNG NÓI" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "语音" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "語音" + } + } + } + }, "app_info.warning.message" : { "extractionState" : "manual", "localizations" : { @@ -38506,6 +39043,185 @@ } } }, + "live %@" : { + "comment" : "Recording HUD label while a voice message streams live to the recipient", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مباشر %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "লাইভ %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "live %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "live %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "en vivo %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "live %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "en direct %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שידור חי %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "लाइव %@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "langsung %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "in diretta %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ライブ %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "라이브 %@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "langsung %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "लाइभ %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "live %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "na żywo %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "ao vivo %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ao vivo %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "в эфире %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "live %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "நேரலை %@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "สด %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "canlı %@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "наживо %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "لائیو %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "trực tiếp %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "直播 %@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "直播 %@" + } + } + } + }, "location_channels.accessibility.add_bookmark" : { "comment" : "Accessibility action name for bookmarking a channel", "extractionState" : "manual", @@ -49138,6 +49854,185 @@ } } }, + "media.voice.accessibility.live" : { + "comment" : "Accessibility label announcing a live incoming voice message", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "رسالة صوتية مباشرة واردة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "আগত লাইভ ভয়েস বার্তা" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "eingehende live-sprachnachricht" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "incoming live voice message" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensaje de voz en vivo entrante" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "papasok na live na voice message" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "message vocal en direct entrant" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הודעה קולית חיה נכנסת" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "आने वाला लाइव वॉयस संदेश" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "pesan suara langsung masuk" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "messaggio vocale in diretta in arrivo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ライブ音声メッセージを受信中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "수신 중인 라이브 음성 메시지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesej suara langsung masuk" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "आगमन लाइभ भ्वाइस सन्देश" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "inkomend live spraakbericht" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "przychodząca wiadomość głosowa na żywo" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensagem de voz ao vivo a chegar" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensagem de voz ao vivo chegando" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "входящее живое голосовое сообщение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "inkommande live-röstmeddelande" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "உள்வரும் நேரலை குரல் செய்தி" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ข้อความเสียงสดขาเข้า" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "gelen canlı sesli mesaj" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "вхідне живе голосове повідомлення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "موصول ہونے والا لائیو صوتی پیغام" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "tin nhắn thoại trực tiếp đang đến" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在接收实时语音消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在接收即時語音訊息" + } + } + } + }, "media.voice.accessibility.pause" : { "comment" : "Accessibility label for pausing voice note playback", "extractionState" : "manual", @@ -49498,6 +50393,185 @@ } } }, + "media.voice.live_badge" : { + "comment" : "Badge on a voice message that is currently streaming in live", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مباشر" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "লাইভ" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "LIVE" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "LIVE" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "EN VIVO" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "LIVE" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "DIRECT" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "חי" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "लाइव" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "LANGSUNG" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "LIVE" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ライブ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "라이브" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "LANGSUNG" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "लाइभ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "LIVE" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "NA ŻYWO" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "AO VIVO" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "AO VIVO" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "ЭФИР" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "LIVE" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "நேரலை" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "สด" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "CANLI" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "НАЖИВО" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "لائیو" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "TRỰC TIẾP" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "直播" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "直播" + } + } + } + }, "mesh_peers.accessibility.open_dm_hint" : { "comment" : "Accessibility hint on a peer row explaining activation opens a private chat", "extractionState" : "manual", diff --git a/bitchat/Protocols/BitchatProtocol.swift b/bitchat/Protocols/BitchatProtocol.swift index 476ae876..9ac7ebe9 100644 --- a/bitchat/Protocols/BitchatProtocol.swift +++ b/bitchat/Protocols/BitchatProtocol.swift @@ -77,6 +77,8 @@ enum NoisePayloadType: UInt8 { // Private groups (0x04/0x05 reserved by other features) case groupInvite = 0x06 // Creator-signed group state (invite) case groupKeyUpdate = 0x07 // Creator-signed group state (key rotation / roster update) + // Live voice (push-to-talk) + case voiceFrame = 0x08 // One live voice-burst packet (see VoiceBurstPacket) // Verification (QR-based OOB binding) case verifyChallenge = 0x10 // Verification challenge case verifyResponse = 0x11 // Verification response @@ -90,6 +92,7 @@ enum NoisePayloadType: UInt8 { case .delivered: return "delivered" case .groupInvite: return "groupInvite" case .groupKeyUpdate: return "groupKeyUpdate" + case .voiceFrame: return "voiceFrame" case .verifyChallenge: return "verifyChallenge" case .verifyResponse: return "verifyResponse" case .vouch: return "vouch" diff --git a/bitchat/Protocols/VoiceBurstPacket.swift b/bitchat/Protocols/VoiceBurstPacket.swift new file mode 100644 index 00000000..3d534175 --- /dev/null +++ b/bitchat/Protocols/VoiceBurstPacket.swift @@ -0,0 +1,220 @@ +// +// VoiceBurstPacket.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Security + +/// Audio codec of a live voice burst. START packets carry it so receivers can +/// reject bursts they can't decode instead of feeding garbage to the decoder. +enum VoiceBurstCodec: UInt8 { + /// AAC-LC, 16 kHz, mono, ~16 kbps — matches the voice-note recorder, so + /// the finalized `.m4a` and the live frames come from the same encoder + /// settings. + case aacLC16kMono = 0x01 +} + +/// One packet of a live push-to-talk voice burst (the inner payload of +/// `NoisePayloadType.voiceFrame`, and — for public mesh bursts — the payload +/// of `MessageType.voiceFrame`). +/// +/// Wire format: +/// ``` +/// [burstID: 8][seq: UInt16 BE][flags: UInt8][payload…] +/// ``` +/// - flags 0x01 (START): payload = [codec: UInt8] +/// - flags 0x02 (END): payload = [totalDataPackets: UInt16 BE][durationMs: UInt32 BE] +/// - flags 0x04 (CANCELED): empty payload; receivers discard the burst +/// - flags 0x00 (data): payload = repeated [length: UInt16 BE][AAC frame] +struct VoiceBurstPacket: Equatable { + enum Kind: Equatable { + case start(codec: VoiceBurstCodec) + case frames([Data]) + case end(totalDataPackets: UInt16, durationMs: UInt32) + case canceled + } + + static let burstIDSize = 8 + private static let headerSize = burstIDSize + 2 + 1 + /// Sanity cap on frames per packet; real packets carry 1-2 frames. + static let maxFramesPerPacket = 8 + + private enum Flags { + static let start: UInt8 = 0x01 + static let end: UInt8 = 0x02 + static let canceled: UInt8 = 0x04 + } + + let burstID: Data + let seq: UInt16 + let kind: Kind + + init?(burstID: Data, seq: UInt16, kind: Kind) { + guard burstID.count == Self.burstIDSize else { return nil } + if case .frames(let frames) = kind { + guard !frames.isEmpty, + frames.count <= Self.maxFramesPerPacket, + frames.allSatisfy({ !$0.isEmpty && $0.count <= Int(UInt16.max) }) + else { return nil } + } + self.burstID = burstID + self.seq = seq + self.kind = kind + } + + func encode() -> Data { + var data = Data(capacity: Self.headerSize + payloadSize) + data.append(burstID) + data.append(UInt8((seq >> 8) & 0xFF)) + data.append(UInt8(seq & 0xFF)) + switch kind { + case .start(let codec): + data.append(Flags.start) + data.append(codec.rawValue) + case .frames(let frames): + data.append(0) + for frame in frames { + let length = UInt16(frame.count) + data.append(UInt8((length >> 8) & 0xFF)) + data.append(UInt8(length & 0xFF)) + data.append(frame) + } + case .end(let totalDataPackets, let durationMs): + data.append(Flags.end) + data.append(UInt8((totalDataPackets >> 8) & 0xFF)) + data.append(UInt8(totalDataPackets & 0xFF)) + for shift in stride(from: 24, through: 0, by: -8) { + data.append(UInt8((durationMs >> UInt32(shift)) & 0xFF)) + } + case .canceled: + data.append(Flags.canceled) + } + return data + } + + static func decode(_ data: Data) -> VoiceBurstPacket? { + // Work on a re-based copy so subscripting is offset-safe. + let data = Data(data) + guard data.count >= headerSize else { return nil } + + let burstID = data.prefix(burstIDSize) + let seq = (UInt16(data[burstIDSize]) << 8) | UInt16(data[burstIDSize + 1]) + let flags = data[burstIDSize + 2] + let payload = data.dropFirst(headerSize) + + let kind: Kind + switch flags { + case Flags.start: + guard let codecByte = payload.first, + let codec = VoiceBurstCodec(rawValue: codecByte) + else { return nil } + kind = .start(codec: codec) + case Flags.end: + guard payload.count >= 6 else { return nil } + let bytes = Array(payload) + let total = (UInt16(bytes[0]) << 8) | UInt16(bytes[1]) + let duration = bytes[2...5].reduce(UInt32(0)) { ($0 << 8) | UInt32($1) } + kind = .end(totalDataPackets: total, durationMs: duration) + case Flags.canceled: + kind = .canceled + case 0: + var frames: [Data] = [] + var offset = payload.startIndex + while offset < payload.endIndex { + guard payload.distance(from: offset, to: payload.endIndex) >= 2 else { return nil } + let length = (Int(payload[offset]) << 8) | Int(payload[payload.index(after: offset)]) + offset = payload.index(offset, offsetBy: 2) + guard length > 0, + payload.distance(from: offset, to: payload.endIndex) >= length, + frames.count < maxFramesPerPacket + else { return nil } + let end = payload.index(offset, offsetBy: length) + frames.append(Data(payload[offset.. Data { + var bytes = Data(count: burstIDSize) + let result = bytes.withUnsafeMutableBytes { + SecRandomCopyBytes(kSecRandomDefault, burstIDSize, $0.baseAddress!) + } + guard result == errSecSuccess else { + return Data((0.. [Data] { + let frameCost = 2 + frame.count + guard VoiceBurstPacket.burstIDSize + 3 + frameCost <= budget else { return [] } + + var packets: [Data] = [] + if !pendingFrames.isEmpty, + VoiceBurstPacket.burstIDSize + 3 + pendingSize + frameCost > budget + || pendingFrames.count >= VoiceBurstPacket.maxFramesPerPacket { + packets.append(contentsOf: flush()) + } + pendingFrames.append(frame) + pendingSize += frameCost + return packets + } + + /// Emits any buffered frames as a final data packet. + mutating func flush() -> [Data] { + guard !pendingFrames.isEmpty, + let packet = VoiceBurstPacket(burstID: burstID, seq: nextSeq, kind: .frames(pendingFrames)) + else { + pendingFrames = [] + pendingSize = 0 + return [] + } + pendingFrames = [] + pendingSize = 0 + nextSeq &+= 1 + dataPacketCount &+= 1 + return [packet.encode()] + } +} diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index a021661c..2657dcb8 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -1456,6 +1456,27 @@ final class BLEService: NSObject { sendNoisePayload(NoisePayload(type: .vouch, data: payload).encode(), to: peerID) } + // MARK: Live Voice (PTT) + + /// Sends one live voice-burst packet inside the Noise session. Unlike + /// `sendNoisePayload` this never queues behind a handshake: live audio is + /// only useful now, so without an established session frames are dropped. + func sendVoiceFrame(_ burstContent: Data, to peerID: PeerID) { + messageQueue.async { [weak self] in + guard let self else { return } + guard self.noiseService.hasEstablishedSession(with: peerID) else { + SecureLogger.debug("PTT: dropping voice frame — no established session with \(peerID.id.prefix(8))…", category: .session) + return + } + do { + let typedPayload = NoisePayload(type: .voiceFrame, data: burstContent).encode() + self.broadcastPacket(try self.makeEncryptedNoisePacket(typedPayload, to: peerID)) + } catch { + SecureLogger.error("Failed to send voice frame: \(error)", category: .session) + } + } + } + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) { // Appends to the encryption service's handler array, so this never // displaces the callbacks installed by installNoiseSessionCallbacks. diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index d6bdef33..1ce72534 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -155,6 +155,12 @@ protocol Transport: AnyObject { func sendFilePrivate(_ packet: BitchatFilePacket, to peerID: PeerID, transferId: String) func cancelTransfer(_ transferId: String) + // Live voice / push-to-talk (mesh transports only): one encoded + // `VoiceBurstPacket`, fire-and-forget inside the Noise session. Frames are + // only useful now — transports drop them (never queue) when no + // established session exists. + func sendVoiceFrame(_ burstContent: Data, to peerID: PeerID) + // Courier store-and-forward (mesh transports only): seal a message to the // recipient's static key and hand it to connected couriers for physical // delivery while the recipient is offline. Returns false when the @@ -231,6 +237,7 @@ extension Transport { func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) {} func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { false } func sendBoardPayload(_ payload: Data) {} + func sendVoiceFrame(_ burstContent: Data, to peerID: PeerID) {} // Mesh diagnostics are mesh-transport-only; other transports report // "no reply"/"no path" rather than pretending to measure anything. diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 63eff4a4..967abbda 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -16,6 +16,25 @@ enum TransportConfig { static let bleFragmentRelayTtlCap: UInt8 = 7 static let bleFragmentRelayTtlCapDense: UInt8 = 5 // Contain fragment floods in dense graphs + // Live voice (push-to-talk) + // Burst-content budget per voice packet. Sized so the Noise ciphertext + // (content + 1 type byte + 16 tag bytes) stays within MessagePadding's + // 256-byte bucket and the whole directed packet (16 header + 8 sender + + // 8 recipient + 256 payload = 288 bytes) rides one BLE frame — live audio + // must never enter the fragment scheduler, which caps concurrent + // transfers at 2 and would let voice starve file sends. + static let pttMaxBurstContentBytes: Int = 210 + static let pttJitterBufferSeconds: TimeInterval = 0.35 // buffered audio before live playback starts + static let pttJitterDeadlineSeconds: TimeInterval = 0.5 // start anyway after this wall-clock wait + static let pttBurstEndTimeoutSeconds: TimeInterval = 3.0 // no frames -> burst considered ended + static let pttAssemblyStaleSeconds: TimeInterval = 30.0 // drop half-open assemblies after this + static let pttMaxConcurrentAssemblies: Int = 8 // concurrent inbound bursts cap + static let pttMaxBurstBytes: Int = 384 * 1024 // 120s at ~2KB/s + generous slack + static let pttFinishedBurstRegistrySeconds: TimeInterval = 600 // window to absorb the finalized note + // Inbound flood guard: a real burst arrives at ~2KB/s; allow 3x plus a + // small settling allowance before dropping a sender's frames. + static let pttInboundMaxBytesPerSecond: Int = 6_000 + // Mesh diagnostics (/ping) static let meshPingTimeoutSeconds: TimeInterval = 10 // Give up on a probe after this window static let meshPingInboundMaxPerLink: Int = 5 // Inbound ping budget per ingress link (claimed sender is spoofable)... diff --git a/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift b/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift new file mode 100644 index 00000000..1a45723e --- /dev/null +++ b/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift @@ -0,0 +1,434 @@ +import BitFoundation +import BitLogger +import Foundation + +/// The narrow surface `ChatLiveVoiceCoordinator` needs from its owner. +/// +/// Follows the `ChatDeliveryContext` exemplar: the coordinator depends on the +/// minimal context it actually uses instead of holding an `unowned` back-ref +/// to the whole `ChatViewModel`, keeping it independently testable. +@MainActor +protocol ChatLiveVoiceContext: AnyObject { + var nickname: String { get } + var selectedPrivateChatPeer: PeerID? { get } + func isPeerBlocked(_ peerID: PeerID) -> Bool + func resolveNickname(for peerID: PeerID) -> String + /// Routes an inbound private message through the full pipeline + /// (store append, unread state, notification, read receipt). + func handlePrivateMessage(_ message: BitchatMessage) + /// Replace-or-append by message ID via the single-writer store intent. + func upsertPrivateMessage(_ message: BitchatMessage, in peerID: PeerID) + @discardableResult + func removePrivateMessage(withID messageID: String) -> BitchatMessage? + func notifyUIChanged() +} + +extension ChatViewModel: ChatLiveVoiceContext {} + +/// Assembles inbound live push-to-talk bursts (`NoisePayloadType.voiceFrame`): +/// orders packets behind a jitter window, persists frames progressively as an +/// ADTS `.aac` so even a partial burst is a replayable voice-note bubble, +/// optionally plays the stream live, and absorbs the sender's finalized +/// `.m4a` voice note (matched by the burst ID in its file name) into the same +/// bubble so nobody sees a duplicate. +@MainActor +final class ChatLiveVoiceCoordinator { + private final class Assembly { + let burstID: Data + let peerID: PeerID + let message: BitchatMessage + var messageID: String { message.id } + var messageTimestamp: Date { message.timestamp } + let fileURL: URL + var fileHandle: FileHandle? + /// Data packets buffered ahead of `nextSeq` (seq -> frames). + var buffered: [UInt16: [Data]] = [:] + /// Next data-packet seq to deliver (seq 0 is START). + var nextSeq: UInt16 = 1 + var deliveredFrames = 0 + var receivedBytes = 0 + let firstPacketAt: Date + var endInfo: (totalDataPackets: UInt16, durationMs: UInt32)? + /// When a seq gap was first observed; after + /// `ChatLiveVoiceCoordinator.gapSkipSeconds` the gap is skipped. + var gapSince: Date? + var player: PTTBurstPlayer? + var idleTimeout: Task? + var gapRedrain: Task? + + init(burstID: Data, peerID: PeerID, message: BitchatMessage, fileURL: URL, fileHandle: FileHandle) { + self.burstID = burstID + self.peerID = peerID + self.message = message + self.fileURL = fileURL + self.fileHandle = fileHandle + self.firstPacketAt = Date() + } + } + + private struct FinishedBurst { + let messageID: String + let peerID: PeerID + let fileURL: URL + let messageTimestamp: Date + let expiresAt: Date + } + + /// How long a missing packet stalls delivery before being skipped. + private static let gapSkipSeconds: TimeInterval = 0.5 + private static let finishedBurstsCap = 32 + + private unowned let context: any ChatLiveVoiceContext + private var assemblies: [Data: Assembly] = [:] + private var finishedBursts: [Data: FinishedBurst] = [:] + + init(context: any ChatLiveVoiceContext) { + self.context = context + } + + // MARK: - Inbound frames + + func handleVoiceFramePayload(from peerID: PeerID, payload: Data, timestamp: Date) { + // Live voice off means classic-notes-only in both directions: no live + // bubble, no partial file, no early notification — the finalized + // voice note still arrives through the normal pipeline. + guard PTTSettings.liveVoiceEnabled else { return } + guard let packet = VoiceBurstPacket.decode(payload) else { + SecureLogger.warning("PTT: undecodable voice frame from \(peerID.id.prefix(8))… (\(payload.count) bytes: \(payload.prefix(16).hexEncodedString())…)", category: .session) + return + } + guard !context.isPeerBlocked(peerID) else { + SecureLogger.debug("PTT: dropping voice frame from blocked peer \(peerID.id.prefix(8))…", category: .session) + return + } + + if let assembly = assemblies[packet.burstID] { + // The sender is Noise-authenticated; a different peer reusing the + // same burst ID is a collision or a replay — drop it. + guard assembly.peerID == peerID else { return } + apply(packet, to: assembly) + return + } + + switch packet.kind { + case .start, .frames: + // A data packet with no prior START (lost or mid-burst state) + // still opens the assembly with the default codec. + guard assemblies.count < TransportConfig.pttMaxConcurrentAssemblies else { + SecureLogger.debug("PTT: dropping burst from \(peerID.id.prefix(8))… — assembly cap reached", category: .session) + return + } + guard let assembly = makeAssembly(burstID: packet.burstID, peerID: peerID, timestamp: timestamp) else { return } + assemblies[packet.burstID] = assembly + apply(packet, to: assembly) + case .end, .canceled: + // Control packet for a burst we never saw — nothing to do. + break + } + } + + /// Whether this message is the bubble of a burst still streaming in. + func isLiveVoiceMessage(_ message: BitchatMessage) -> Bool { + assemblies.values.contains { $0.messageID == message.id } + } + + /// Called for every inbound private message: when it is the finalized + /// voice note of a burst we assembled (matched by burst ID in the file + /// name), swap it into the existing live bubble and report `true` so the + /// caller skips normal handling — no duplicate row, no second + /// notification. + func absorbFinalizedVoiceNote(_ message: BitchatMessage) -> Bool { + let prefix = MimeType.Category.audio.messagePrefix + guard message.content.hasPrefix(prefix), + let burstID = Self.burstID(fromVoiceFileName: String(message.content.dropFirst(prefix.count))) + else { return false } + + // The note usually lands after END, but a lost END or a fast transfer + // can beat it — close out the live assembly first. + if let assembly = assemblies[burstID] { + finalize(assembly) + } + + pruneFinishedBursts() + guard let finished = finishedBursts[burstID] else { return false } + // Bind the note to the burst's authenticated sender. + guard message.senderPeerID == nil || message.senderPeerID == finished.peerID else { return false } + + let replacement = BitchatMessage( + id: finished.messageID, + sender: message.sender, + content: message.content, + timestamp: finished.messageTimestamp, + isRelay: false, + originalSender: nil, + isPrivate: true, + recipientNickname: context.nickname, + senderPeerID: finished.peerID, + mentions: nil, + deliveryStatus: message.deliveryStatus + ) + context.upsertPrivateMessage(replacement, in: finished.peerID) + + // The complete .m4a replaces the partial live capture. + WaveformCache.shared.purge(url: finished.fileURL) + try? FileManager.default.removeItem(at: finished.fileURL) + finishedBursts.removeValue(forKey: burstID) + + context.notifyUIChanged() + SecureLogger.debug("PTT: absorbed finalized note for burst \(burstID.hexEncodedString())", category: .session) + return true + } + + // MARK: - Assembly lifecycle + + private func makeAssembly(burstID: Data, peerID: PeerID, timestamp: Date) -> Assembly? { + guard let fileURL = Self.makeIncomingURL(burstID: burstID) else { + SecureLogger.error("PTT: cannot resolve incoming media directory for burst \(burstID.hexEncodedString())", category: .session) + return nil + } + FileManager.default.createFile(atPath: fileURL.path, contents: nil) + guard let handle = try? FileHandle(forWritingTo: fileURL) else { + SecureLogger.error("PTT: cannot open capture file for burst \(burstID.hexEncodedString())", category: .session) + try? FileManager.default.removeItem(at: fileURL) + return nil + } + + let message = BitchatMessage( + sender: context.resolveNickname(for: peerID), + content: "\(MimeType.Category.audio.messagePrefix)\(fileURL.lastPathComponent)", + timestamp: timestamp, + isRelay: false, + originalSender: nil, + isPrivate: true, + recipientNickname: context.nickname, + senderPeerID: peerID + ) + + let assembly = Assembly( + burstID: burstID, + peerID: peerID, + message: message, + fileURL: fileURL, + fileHandle: handle + ) + + // Full inbound pipeline: store append, unread, notification. + context.handlePrivateMessage(message) + + // Live playback only when the user is looking at this conversation + // with the app frontmost and live voice enabled. + if PTTSettings.liveVoiceEnabled, + PTTSettings.isAppActive, + context.selectedPrivateChatPeer == peerID { + assembly.player = PTTBurstPlayer() + } + + SecureLogger.debug("PTT: burst \(burstID.hexEncodedString()) started from \(peerID.id.prefix(8))…", category: .session) + return assembly + } + + private func apply(_ packet: VoiceBurstPacket, to assembly: Assembly) { + assembly.receivedBytes += packet.encode().count + let elapsed = Date().timeIntervalSince(assembly.firstPacketAt) + // Flood guards: a real burst arrives at ~2 KB/s. + guard assembly.receivedBytes <= TransportConfig.pttInboundMaxBytesPerSecond * Int(elapsed + 2), + assembly.receivedBytes <= TransportConfig.pttMaxBurstBytes + else { + SecureLogger.warning("PTT: burst from \(assembly.peerID.id.prefix(8))… exceeded rate/size caps — finalizing", category: .security) + finalize(assembly) + return + } + + rescheduleIdleTimeout(for: assembly) + + switch packet.kind { + case .start(let codec): + guard codec == .aacLC16kMono else { + // Codec we can't decode: drop the burst; the finalized note + // (whose MIME/magic the file handler validates) still arrives. + cancelAssembly(assembly) + return + } + case .frames(let frames): + guard packet.seq >= assembly.nextSeq, assembly.buffered[packet.seq] == nil else { return } + assembly.buffered[packet.seq] = frames + drainInOrder(assembly) + case .end(let totalDataPackets, let durationMs): + assembly.endInfo = (totalDataPackets, durationMs) + drainInOrder(assembly) + finalizeIfComplete(assembly) + case .canceled: + cancelAssembly(assembly) + } + } + + private func drainInOrder(_ assembly: Assembly) { + while true { + if let frames = assembly.buffered.removeValue(forKey: assembly.nextSeq) { + deliver(frames, to: assembly) + assembly.nextSeq &+= 1 + assembly.gapSince = nil + continue + } + guard !assembly.buffered.isEmpty else { + assembly.gapSince = nil + return + } + // Packets buffered ahead of a hole. + if let since = assembly.gapSince { + guard Date().timeIntervalSince(since) >= Self.gapSkipSeconds, + let smallest = assembly.buffered.keys.min() + else { return } + // Give up on the missing packet(s); playback underrun already + // covered the audible gap. + assembly.nextSeq = smallest + assembly.gapSince = nil + } else { + assembly.gapSince = Date() + scheduleGapRedrain(for: assembly) + return + } + } + } + + private func deliver(_ frames: [Data], to assembly: Assembly) { + for frame in frames { + do { + try assembly.fileHandle?.write(contentsOf: ADTSFramer.frame(frame)) + } catch { + SecureLogger.error("PTT: incoming burst write failed: \(error)", category: .session) + assembly.fileHandle = nil + } + } + assembly.deliveredFrames += frames.count + assembly.player?.enqueue(frames) + } + + private func finalizeIfComplete(_ assembly: Assembly) { + guard let end = assembly.endInfo else { return } + // All data packets delivered when nextSeq passed the last one + // (data seqs are 1...totalDataPackets). Otherwise stragglers may + // still arrive; the gap-redrain or idle timeout closes the burst. + if assembly.nextSeq > end.totalDataPackets { + finalize(assembly) + } + } + + private func finalize(_ assembly: Assembly) { + assembly.idleTimeout?.cancel() + assembly.gapRedrain?.cancel() + // Deliver whatever is decodable past any remaining holes. + while !assembly.buffered.isEmpty, let smallest = assembly.buffered.keys.min() { + assembly.nextSeq = smallest + if let frames = assembly.buffered.removeValue(forKey: smallest) { + deliver(frames, to: assembly) + assembly.nextSeq &+= 1 + } + } + try? assembly.fileHandle?.close() + assembly.fileHandle = nil + assemblies.removeValue(forKey: assembly.burstID) + + guard assembly.deliveredFrames > 0 else { + // Nothing audible ever arrived — drop the empty bubble. + context.removePrivateMessage(withID: assembly.messageID) + try? FileManager.default.removeItem(at: assembly.fileURL) + context.notifyUIChanged() + return + } + + assembly.player?.finishAfterDrain() + // The bubble's waveform may have been computed from a partial file. + WaveformCache.shared.purge(url: assembly.fileURL) + // Republish so the row re-renders without its LIVE treatment even if + // no finalized note ever arrives to swap in. + context.upsertPrivateMessage(assembly.message, in: assembly.peerID) + + pruneFinishedBursts() + finishedBursts[assembly.burstID] = FinishedBurst( + messageID: assembly.messageID, + peerID: assembly.peerID, + fileURL: assembly.fileURL, + messageTimestamp: assembly.messageTimestamp, + expiresAt: Date().addingTimeInterval(TransportConfig.pttFinishedBurstRegistrySeconds) + ) + context.notifyUIChanged() + SecureLogger.debug("PTT: burst \(assembly.burstID.hexEncodedString()) finalized (\(assembly.deliveredFrames) frames)", category: .session) + } + + private func cancelAssembly(_ assembly: Assembly) { + assembly.idleTimeout?.cancel() + assembly.gapRedrain?.cancel() + assembly.player?.stop() + try? assembly.fileHandle?.close() + assembly.fileHandle = nil + assemblies.removeValue(forKey: assembly.burstID) + context.removePrivateMessage(withID: assembly.messageID) + WaveformCache.shared.purge(url: assembly.fileURL) + try? FileManager.default.removeItem(at: assembly.fileURL) + context.notifyUIChanged() + } + + // MARK: - Timers + + private func rescheduleIdleTimeout(for assembly: Assembly) { + assembly.idleTimeout?.cancel() + let burstID = assembly.burstID + assembly.idleTimeout = Task { @MainActor [weak self] in + try? await Task.sleep(nanoseconds: UInt64(TransportConfig.pttBurstEndTimeoutSeconds * 1_000_000_000)) + guard !Task.isCancelled, let self, let assembly = self.assemblies[burstID] else { return } + // Talker went silent/out of range without an END. + self.finalize(assembly) + } + } + + private func scheduleGapRedrain(for assembly: Assembly) { + assembly.gapRedrain?.cancel() + let burstID = assembly.burstID + assembly.gapRedrain = Task { @MainActor [weak self] in + try? await Task.sleep(nanoseconds: UInt64((Self.gapSkipSeconds + 0.05) * 1_000_000_000)) + guard !Task.isCancelled, let self, let assembly = self.assemblies[burstID] else { return } + self.drainInOrder(assembly) + self.finalizeIfComplete(assembly) + } + } + + // MARK: - Helpers + + private func pruneFinishedBursts() { + let now = Date() + finishedBursts = finishedBursts.filter { $0.value.expiresAt > now } + while finishedBursts.count >= Self.finishedBurstsCap { + guard let oldest = finishedBursts.min(by: { $0.value.expiresAt < $1.value.expiresAt }) else { break } + finishedBursts.removeValue(forKey: oldest.key) + } + } + + /// Extracts the 8-byte burst ID from a finalized note's file name + /// (`voice_<16 hex>.m4a`, possibly uniquified by the incoming file store). + static func burstID(fromVoiceFileName fileName: String) -> Data? { + guard fileName.hasPrefix("voice_") else { return nil } + let afterPrefix = fileName.dropFirst("voice_".count) + let hex = String(afterPrefix.prefix(16)) + guard hex.count == 16, hex.allSatisfy(\.isHexDigit) else { return nil } + return Data(hexString: hex) + } + + private static func makeIncomingURL(burstID: Data) -> URL? { + guard let base = try? FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) else { return nil } + let directory = base + .appendingPathComponent("files", isDirectory: true) + .appendingPathComponent("\(MimeType.Category.audio.mediaDir)/incoming", isDirectory: true) + do { + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil) + } catch { + return nil + } + return directory.appendingPathComponent("voice_live_\(burstID.hexEncodedString()).aac") + } +} diff --git a/bitchat/ViewModels/ChatTransportEventCoordinator.swift b/bitchat/ViewModels/ChatTransportEventCoordinator.swift index 34b1653c..1ec74850 100644 --- a/bitchat/ViewModels/ChatTransportEventCoordinator.swift +++ b/bitchat/ViewModels/ChatTransportEventCoordinator.swift @@ -72,6 +72,9 @@ protocol ChatTransportEventContext: AnyObject { func handleVerifyChallengePayload(from peerID: PeerID, payload: Data) func handleVerifyResponsePayload(from peerID: PeerID, payload: Data) + // MARK: Live voice (push-to-talk) + func handleVoiceFramePayload(from peerID: PeerID, payload: Data, timestamp: Date) + // MARK: Group payloads (creator-signed state over Noise) func handleGroupInvitePayload(from peerID: PeerID, payload: Data) func handleGroupKeyUpdatePayload(from peerID: PeerID, payload: Data) @@ -135,6 +138,10 @@ extension ChatViewModel: ChatTransportEventContext { verificationCoordinator.handleVerifyResponsePayload(from: peerID, payload: payload) } + // `handleVoiceFramePayload(from:payload:timestamp:)` lives in + // ChatViewModel+PrivateChat.swift next to the rest of the live-voice + // surface. + func handleGroupInvitePayload(from peerID: PeerID, payload: Data) { groupCoordinator.handleGroupInvitePayload(from: peerID, payload: payload) } @@ -397,6 +404,9 @@ private extension ChatTransportEventCoordinator { case .vouch: context.handleVouchPayload(from: peerID, payload: payload) + + case .voiceFrame: + context.handleVoiceFramePayload(from: peerID, payload: payload, timestamp: timestamp) } } diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 29140383..8c195162 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -178,6 +178,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele lazy var privateConversationCoordinator = ChatPrivateConversationCoordinator(context: self) lazy var nostrCoordinator = ChatNostrCoordinator(context: self) lazy var mediaTransferCoordinator = ChatMediaTransferCoordinator(context: self) + lazy var liveVoiceCoordinator = ChatLiveVoiceCoordinator(context: self) lazy var verificationCoordinator = ChatVerificationCoordinator(context: self) lazy var groupCoordinator = ChatGroupCoordinator(context: self) lazy var vouchCoordinator = ChatVouchCoordinator(context: self) diff --git a/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift b/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift index 939adf6a..397c8f72 100644 --- a/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift +++ b/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift @@ -6,6 +6,7 @@ // import BitFoundation +import BitLogger import Foundation import SwiftUI @@ -69,6 +70,41 @@ extension ChatViewModel { mediaTransferCoordinator.sendVoiceNote(at: url) } + /// Picks the capture backend for the composer's hold-to-record gesture: + /// live push-to-talk when the selected DM peer can hear it now (mesh + /// reachable + established Noise session), otherwise the classic + /// record-then-send voice note. Either way the release delivers a normal + /// voice note through `sendVoiceNote(at:)`. + @MainActor + func makeVoiceCaptureSession() -> VoiceCaptureSession { + guard PTTSettings.liveVoiceEnabled, + let selectedPeer = selectedPrivateChatPeer, + !selectedPeer.isGeoDM, !selectedPeer.isGeoChat, !selectedPeer.isGroup + else { + return VoiceNoteCaptureSession() + } + // A conversation can be selected under the stable 64-hex Noise key + // (e.g. after migration on disconnect), but Noise sessions are keyed + // by the 16-hex routing ID — normalize once and send to that same + // short ID, like the private-message/file paths do. + let peerID = selectedPeer.toShort() + guard meshService.isPeerReachable(peerID), + case .established = meshService.getNoiseSessionState(for: peerID) + else { + SecureLogger.debug("PTT: live unavailable for \(peerID.id.prefix(8))… (reachable=\(meshService.isPeerReachable(peerID))) — using classic voice note", category: .session) + return VoiceNoteCaptureSession() + } + return PTTLiveVoiceSession(sendPacket: { [meshService] packet in + meshService.sendVoiceFrame(packet, to: peerID) + }) + } + + /// Inbound handler for `NoisePayloadType.voiceFrame`. + @MainActor + func handleVoiceFramePayload(from peerID: PeerID, payload: Data, timestamp: Date) { + liveVoiceCoordinator.handleVoiceFramePayload(from: peerID, payload: payload, timestamp: timestamp) + } + #if os(iOS) func processThenSendImage(_ image: UIImage?) { mediaTransferCoordinator.processThenSendImage(image) @@ -129,6 +165,9 @@ extension ChatViewModel { @MainActor func handlePrivateMessage(_ message: BitchatMessage) { + // A finalized voice note whose burst already streamed in live swaps + // into the existing bubble instead of appearing (and notifying) twice. + if liveVoiceCoordinator.absorbFinalizedVoiceNote(message) { return } privateConversationCoordinator.handlePrivateMessage(message) } diff --git a/bitchat/ViewModels/NostrInboundPipeline.swift b/bitchat/ViewModels/NostrInboundPipeline.swift index be50a687..bc5ae744 100644 --- a/bitchat/ViewModels/NostrInboundPipeline.swift +++ b/bitchat/ViewModels/NostrInboundPipeline.swift @@ -305,7 +305,9 @@ final class NostrInboundPipeline { context.handleReadReceipt(noisePayload, senderPubkey: senderPubkey, convKey: convKey) // Group state travels only over mesh Noise sessions in v1; anything // claiming to be group traffic over Nostr is ignored. - case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate, .vouch: + // Live voice is mesh-only: latency and relay cost make it + // meaningless over Nostr. + case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate, .vouch, .voiceFrame: break } } @@ -359,7 +361,9 @@ final class NostrInboundPipeline { context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: convKey) // Group state travels only over mesh Noise sessions in v1; anything // claiming to be group traffic over Nostr is ignored. - case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate, .vouch: + // Live voice is mesh-only: latency and relay cost make it + // meaningless over Nostr. + case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate, .vouch, .voiceFrame: break } } @@ -440,7 +444,9 @@ final class NostrInboundPipeline { context.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: targetPeerID) // Group state travels only over mesh Noise sessions // in v1; group traffic over Nostr is ignored. - case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate, .vouch: + // Live voice is mesh-only: latency and relay cost make it + // meaningless over Nostr. + case .verifyChallenge, .verifyResponse, .groupInvite, .groupKeyUpdate, .vouch, .voiceFrame: break } } diff --git a/bitchat/ViewModels/VoiceRecordingViewModel.swift b/bitchat/ViewModels/VoiceRecordingViewModel.swift index 92e70a02..0f3f4349 100644 --- a/bitchat/ViewModels/VoiceRecordingViewModel.swift +++ b/bitchat/ViewModels/VoiceRecordingViewModel.swift @@ -55,6 +55,14 @@ final class VoiceRecordingViewModel: ObservableObject { } @Published private(set) var state = State.idle + /// True while the active session streams audio live (push-to-talk); the + /// composer switches its recording HUD to the LIVE treatment. + @Published private(set) var isLiveStreaming = false + + /// Supplies the capture backend per press. `ChatViewModel` swaps in a + /// live push-to-talk session when the current DM peer can hear it now. + var sessionProvider: () -> VoiceCaptureSession = { VoiceNoteCaptureSession() } + private var activeSession: VoiceCaptureSession? func formattedDuration(for date: Date) -> String { let clamped = max(0, state.duration(for: date)) @@ -67,26 +75,54 @@ final class VoiceRecordingViewModel: ObservableObject { func start(shouldShow: Bool) { guard shouldShow, state == .idle else { return } + let session = sessionProvider() + activeSession = session state = .requestingPermission Task { - let granted = await VoiceRecorder.shared.requestPermission() - guard state == .requestingPermission else { return } + let granted = await session.requestPermission() + guard state == .requestingPermission, activeSession === session else { return } guard granted else { state = .permissionDenied + activeSession = nil return } state = .preparing do { - try await VoiceRecorder.shared.startRecording() - guard state == .preparing else { - cancel() + try await session.start() + guard state == .preparing, activeSession === session else { + await session.cancel() return } state = .recording(startDate: Date()) + isLiveStreaming = session.isLive } catch { SecureLogger.error("Voice recording failed to start: \(error)", category: .session) - await VoiceRecorder.shared.cancelRecording() - guard state == .preparing else { return } + await session.cancel() + guard state == .preparing, activeSession === session else { return } + // The live engine and the classic recorder are separate + // capture stacks: when the live one hits an audio-route + // glitch, fall back within the same hold so the user still + // gets a voice note instead of an error. + if session.isLive { + let fallback = VoiceNoteCaptureSession() + activeSession = fallback + do { + try await fallback.start() + guard state == .preparing, activeSession === fallback else { + await fallback.cancel() + return + } + SecureLogger.warning("PTT: live capture failed — fell back to classic voice note", category: .session) + state = .recording(startDate: Date()) + isLiveStreaming = false + return + } catch { + SecureLogger.error("Voice recording fallback failed to start: \(error)", category: .session) + await fallback.cancel() + guard state == .preparing else { return } + } + } + activeSession = nil state = .error(message: "Could not start recording.") } } @@ -103,15 +139,18 @@ final class VoiceRecordingViewModel: ObservableObject { } state = .idle + isLiveStreaming = false + let session = activeSession + activeSession = nil - guard case .recording(let startDate) = previousState, let completion else { - Task { await VoiceRecorder.shared.cancelRecording() } + guard case .recording(let startDate) = previousState, let completion, let session else { + Task { await session?.cancel() } return } Task { let finalDuration = Date().timeIntervalSince(startDate) - if let url = await VoiceRecorder.shared.stopRecording(), + if let url = await session.finish(), isValidRecording(at: url, duration: finalDuration) { completion(url) } else { diff --git a/bitchat/Views/AppInfoView.swift b/bitchat/Views/AppInfoView.swift index 3f74a354..324f74d2 100644 --- a/bitchat/Views/AppInfoView.swift +++ b/bitchat/Views/AppInfoView.swift @@ -9,6 +9,7 @@ struct AppInfoView: View { /// hides the topology row entirely. var topologyProvider: (@MainActor () -> MeshTopologyDisplayModel)? @State private var showTopology = false + @State private var liveVoiceEnabled = PTTSettings.liveVoiceEnabled private var selectedTheme: AppTheme { AppTheme(rawValue: appThemeRawValue) ?? .matrix @@ -80,6 +81,15 @@ struct AppInfoView: View { ] } + enum Voice { + static let title: LocalizedStringKey = "app_info.voice.title" + static let live = AppInfoFeatureInfo( + icon: "dot.radiowaves.left.and.right", + title: "app_info.voice.live.title", + description: "app_info.voice.live.description" + ) + } + enum Network { static let title: LocalizedStringKey = "app_info.network.title" static let topology = AppInfoFeatureInfo( @@ -223,6 +233,21 @@ struct AppInfoView: View { .foregroundColor(textColor) } + // Voice + VStack(alignment: .leading, spacing: 16) { + SectionHeader(Strings.Voice.title) + + HStack(spacing: 0) { + FeatureRow(info: Strings.Voice.live) + Toggle(Strings.Voice.live.title, isOn: $liveVoiceEnabled) + .labelsHidden() + .tint(palette.accent) + .onChange(of: liveVoiceEnabled) { newValue in + PTTSettings.liveVoiceEnabled = newValue + } + } + } + // Network diagnostics if topologyProvider != nil { VStack(alignment: .leading, spacing: 16) { diff --git a/bitchat/Views/ContentComposerView.swift b/bitchat/Views/ContentComposerView.swift index a3ec8d0f..f8598e0e 100644 --- a/bitchat/Views/ContentComposerView.swift +++ b/bitchat/Views/ContentComposerView.swift @@ -137,16 +137,28 @@ private extension ContentComposerView { var recordingIndicator: some View { HStack(spacing: 12) { - Image(systemName: "waveform.circle.fill") + Image(systemName: voiceRecordingVM.isLiveStreaming ? "dot.radiowaves.left.and.right" : "waveform.circle.fill") .foregroundColor(.red) .font(.bitchatSystem(size: 20)) + .modifier(PulsingOpacityModifier(active: voiceRecordingVM.isLiveStreaming)) TimelineView(.periodic(from: .now, by: 0.05)) { context in - Text( - "recording \(voiceRecordingVM.formattedDuration(for: context.date))", - comment: "Voice note recording duration indicator" - ) - .bitchatFont(size: 13) - .foregroundColor(.red) + // Live streaming means audio is heard as you speak — the HUD + // must make that unmistakable, not just show a timer. + if voiceRecordingVM.isLiveStreaming { + Text( + "live \(voiceRecordingVM.formattedDuration(for: context.date))", + comment: "Recording HUD label while a voice message streams live to the recipient" + ) + .bitchatFont(size: 13, weight: .bold) + .foregroundColor(.red) + } else { + Text( + "recording \(voiceRecordingVM.formattedDuration(for: context.date))", + comment: "Voice note recording duration indicator" + ) + .bitchatFont(size: 13) + .foregroundColor(.red) + } } Spacer() Button(action: voiceRecordingVM.cancel) { diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index 901c61b5..a40213b8 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -75,6 +75,9 @@ struct ContentView: View { .onAppear { conversationUIModel.setCurrentColorScheme(colorScheme) conversationUIModel.setCurrentTheme(appTheme) + voiceRecordingVM.sessionProvider = { [weak conversationUIModel] in + conversationUIModel?.makeVoiceCaptureSession() ?? VoiceNoteCaptureSession() + } #if os(macOS) DispatchQueue.main.async { isNicknameFieldFocused = false diff --git a/bitchat/Views/Media/LiveVoiceBadge.swift b/bitchat/Views/Media/LiveVoiceBadge.swift new file mode 100644 index 00000000..709a170b --- /dev/null +++ b/bitchat/Views/Media/LiveVoiceBadge.swift @@ -0,0 +1,51 @@ +// +// LiveVoiceBadge.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import SwiftUI + +/// Slow opacity pulse for live-voice indicators (composer HUD, bubble badge). +struct PulsingOpacityModifier: ViewModifier { + let active: Bool + @State private var dimmed = false + + func body(content: Content) -> some View { + content + .opacity(active && dimmed ? 0.35 : 1) + .animation(active ? .easeInOut(duration: 0.7).repeatForever(autoreverses: true) : .default, value: dimmed) + .onAppear { + if active { dimmed = true } + } + .onChange(of: active) { nowActive in + dimmed = nowActive + } + } +} + +/// The red pulsing "LIVE" chip shown on a voice bubble while its burst is +/// still streaming in. +struct LiveVoiceBadge: View { + var body: some View { + HStack(spacing: 4) { + Circle() + .fill(Color.red) + .frame(width: 6, height: 6) + Text("media.voice.live_badge", comment: "Badge on a voice message that is currently streaming in live") + .bitchatFont(size: 10, weight: .bold) + .foregroundColor(.red) + } + .padding(.horizontal, 6) + .padding(.vertical, 3) + .background( + Capsule().fill(Color.red.opacity(0.15)) + ) + .modifier(PulsingOpacityModifier(active: true)) + .accessibilityLabel( + String(localized: "media.voice.accessibility.live", comment: "Accessibility label announcing a live incoming voice message") + ) + } +} diff --git a/bitchat/Views/Media/MediaMessageView.swift b/bitchat/Views/Media/MediaMessageView.swift index 90fd13c4..2534aedf 100644 --- a/bitchat/Views/Media/MediaMessageView.swift +++ b/bitchat/Views/Media/MediaMessageView.swift @@ -96,6 +96,7 @@ struct MediaMessageView: View { url: url, isSending: state.isSending, sendProgress: state.progress, + isLive: conversationUIModel.isLiveVoiceMessage(message), onCancel: cancelAction ) case .image(let url): diff --git a/bitchat/Views/Media/VoiceNoteView.swift b/bitchat/Views/Media/VoiceNoteView.swift index d2a63e6e..661d2193 100644 --- a/bitchat/Views/Media/VoiceNoteView.swift +++ b/bitchat/Views/Media/VoiceNoteView.swift @@ -5,6 +5,7 @@ struct VoiceNoteView: View { private let url: URL private let isSending: Bool private let sendProgress: Double? + private let isLive: Bool private let onCancel: (() -> Void)? @Environment(\.colorScheme) private var colorScheme @@ -12,10 +13,11 @@ struct VoiceNoteView: View { @StateObject private var playback: VoiceNotePlaybackController @State private var waveform: [Float] = [] - init(url: URL, isSending: Bool, sendProgress: Double?, onCancel: (() -> Void)?) { + init(url: URL, isSending: Bool, sendProgress: Double?, isLive: Bool = false, onCancel: (() -> Void)?) { self.url = url self.isSending = isSending self.sendProgress = sendProgress + self.isLive = isLive self.onCancel = onCancel _playback = StateObject(wrappedValue: VoiceNotePlaybackController(url: url)) } @@ -69,9 +71,13 @@ struct VoiceNoteView: View { isInteractive: playback.isPlaying ) - Text(playbackLabel) - .bitchatFont(size: 13) - .foregroundColor(palette.secondary) + if isLive { + LiveVoiceBadge() + } else { + Text(playbackLabel) + .bitchatFont(size: 13) + .foregroundColor(palette.secondary) + } if let onCancel = onCancel, isSending { Button(action: onCancel) { diff --git a/bitchatTests/ChatLiveVoiceCoordinatorTests.swift b/bitchatTests/ChatLiveVoiceCoordinatorTests.swift new file mode 100644 index 00000000..4c2929e6 --- /dev/null +++ b/bitchatTests/ChatLiveVoiceCoordinatorTests.swift @@ -0,0 +1,241 @@ +// +// ChatLiveVoiceCoordinatorTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +import BitFoundation +@testable import bitchat + +@MainActor +private final class MockChatLiveVoiceContext: ChatLiveVoiceContext { + var nickname = "me" + var selectedPrivateChatPeer: PeerID? + var blockedPeers: Set = [] + + private(set) var handledPrivateMessages: [BitchatMessage] = [] + private(set) var upsertedMessages: [(message: BitchatMessage, peerID: PeerID)] = [] + private(set) var removedMessageIDs: [String] = [] + + func isPeerBlocked(_ peerID: PeerID) -> Bool { blockedPeers.contains(peerID) } + func resolveNickname(for peerID: PeerID) -> String { "alice" } + func handlePrivateMessage(_ message: BitchatMessage) { handledPrivateMessages.append(message) } + func upsertPrivateMessage(_ message: BitchatMessage, in peerID: PeerID) { + upsertedMessages.append((message, peerID)) + } + @discardableResult + func removePrivateMessage(withID messageID: String) -> BitchatMessage? { + removedMessageIDs.append(messageID) + return nil + } + func notifyUIChanged() {} +} + +@MainActor +struct ChatLiveVoiceCoordinatorTests { + private let peer = PeerID(str: "aaaabbbbcccc0001") + + private func makeBurstID(_ fill: UInt8) -> Data { + Data(repeating: fill, count: VoiceBurstPacket.burstIDSize) + } + + private func send(_ packet: VoiceBurstPacket, to coordinator: ChatLiveVoiceCoordinator, from peerID: PeerID) { + coordinator.handleVoiceFramePayload(from: peerID, payload: packet.encode(), timestamp: Date()) + } + + private func incomingFileURL(burstID: Data) -> URL? { + guard let base = try? FileManager.default.url( + for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false + ) else { return nil } + return base + .appendingPathComponent("files/voicenotes/incoming", isDirectory: true) + .appendingPathComponent("voice_live_\(burstID.hexEncodedString()).aac") + } + + @Test func burstCreatesBubbleAndPersistsFramesInOrder() throws { + let context = MockChatLiveVoiceContext() + let coordinator = ChatLiveVoiceCoordinator(context: context) + let burstID = makeBurstID(0xA1) + defer { incomingFileURL(burstID: burstID).map { try? FileManager.default.removeItem(at: $0) } } + + let frame1 = Data(repeating: 0x01, count: 60) + let frame2 = Data(repeating: 0x02, count: 60) + + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 0, kind: .start(codec: .aacLC16kMono))), to: coordinator, from: peer) + #expect(context.handledPrivateMessages.count == 1) + let bubble = try #require(context.handledPrivateMessages.first) + #expect(bubble.isPrivate) + #expect(bubble.senderPeerID == peer) + #expect(bubble.content == "[voice] voice_live_\(burstID.hexEncodedString()).aac") + #expect(coordinator.isLiveVoiceMessage(bubble)) + + // Deliver out of order: seq 2 buffers behind the seq-1 hole, then + // seq 1 releases both in order. + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 2, kind: .frames([frame2]))), to: coordinator, from: peer) + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames([frame1]))), to: coordinator, from: peer) + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 3, kind: .end(totalDataPackets: 2, durationMs: 128))), to: coordinator, from: peer) + + let url = try #require(incomingFileURL(burstID: burstID)) + let written = try Data(contentsOf: url) + var expected = ADTSFramer.frame(frame1) + expected.append(ADTSFramer.frame(frame2)) + #expect(written == expected) + + // Burst ended: no longer live, bubble republished for re-render. + #expect(!coordinator.isLiveVoiceMessage(bubble)) + #expect(context.upsertedMessages.contains { $0.message.id == bubble.id }) + #expect(context.removedMessageIDs.isEmpty) + } + + @Test func absorbsFinalizedNoteIntoLiveBubble() throws { + let context = MockChatLiveVoiceContext() + let coordinator = ChatLiveVoiceCoordinator(context: context) + let burstID = makeBurstID(0xB2) + let hex = burstID.hexEncodedString() + + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames([Data(repeating: 7, count: 50)]))), to: coordinator, from: peer) + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 2, kind: .end(totalDataPackets: 1, durationMs: 64))), to: coordinator, from: peer) + let bubble = try #require(context.handledPrivateMessages.first) + + let note = BitchatMessage( + sender: "alice", + content: "[voice] voice_\(hex).m4a", + timestamp: Date(), + isRelay: false, + isPrivate: true, + recipientNickname: "me", + senderPeerID: peer + ) + #expect(coordinator.absorbFinalizedVoiceNote(note)) + + // The note replaced the live bubble in place: same message ID, new + // content, partial capture deleted. + let replacement = try #require(context.upsertedMessages.last) + #expect(replacement.message.id == bubble.id) + #expect(replacement.message.content == note.content) + #expect(replacement.peerID == peer) + let url = try #require(incomingFileURL(burstID: burstID)) + #expect(!FileManager.default.fileExists(atPath: url.path)) + + // Absorption is one-shot. + #expect(!coordinator.absorbFinalizedVoiceNote(note)) + } + + @Test func absorbIgnoresUnrelatedVoiceNotes() throws { + let context = MockChatLiveVoiceContext() + let coordinator = ChatLiveVoiceCoordinator(context: context) + + // A classic voice note (date-stamped name) and a live-capture name + // must both pass through untouched. + let classic = BitchatMessage( + sender: "alice", content: "[voice] voice_20260708_1201.m4a", timestamp: Date(), + isRelay: false, isPrivate: true, recipientNickname: "me", senderPeerID: peer + ) + #expect(!coordinator.absorbFinalizedVoiceNote(classic)) + let liveCapture = BitchatMessage( + sender: "alice", content: "[voice] voice_live_aabbccdd00112233.aac", timestamp: Date(), + isRelay: false, isPrivate: true, recipientNickname: "me", senderPeerID: peer + ) + #expect(!coordinator.absorbFinalizedVoiceNote(liveCapture)) + // Unknown burst ID. + let unknown = BitchatMessage( + sender: "alice", content: "[voice] voice_ffffffffffffffff.m4a", timestamp: Date(), + isRelay: false, isPrivate: true, recipientNickname: "me", senderPeerID: peer + ) + #expect(!coordinator.absorbFinalizedVoiceNote(unknown)) + } + + @Test func canceledBurstRemovesBubbleAndFile() throws { + let context = MockChatLiveVoiceContext() + let coordinator = ChatLiveVoiceCoordinator(context: context) + let burstID = makeBurstID(0xC3) + + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames([Data(repeating: 9, count: 40)]))), to: coordinator, from: peer) + let bubble = try #require(context.handledPrivateMessages.first) + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 2, kind: .canceled)), to: coordinator, from: peer) + + #expect(context.removedMessageIDs == [bubble.id]) + let url = try #require(incomingFileURL(burstID: burstID)) + #expect(!FileManager.default.fileExists(atPath: url.path)) + #expect(!coordinator.isLiveVoiceMessage(bubble)) + } + + @Test func emptyBurstLeavesNoBubble() throws { + let context = MockChatLiveVoiceContext() + let coordinator = ChatLiveVoiceCoordinator(context: context) + let burstID = makeBurstID(0xD4) + + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 0, kind: .start(codec: .aacLC16kMono))), to: coordinator, from: peer) + let bubble = try #require(context.handledPrivateMessages.first) + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .end(totalDataPackets: 0, durationMs: 0))), to: coordinator, from: peer) + + // Nothing audible arrived: the placeholder bubble is withdrawn. + #expect(context.removedMessageIDs == [bubble.id]) + } + + @Test func ignoresBlockedPeersAndUnknownControlPackets() throws { + let context = MockChatLiveVoiceContext() + let coordinator = ChatLiveVoiceCoordinator(context: context) + + context.blockedPeers = [peer] + send(try #require(VoiceBurstPacket(burstID: makeBurstID(0xE5), seq: 0, kind: .start(codec: .aacLC16kMono))), to: coordinator, from: peer) + #expect(context.handledPrivateMessages.isEmpty) + + context.blockedPeers = [] + // END/CANCELED for a burst that never started must not create state. + send(try #require(VoiceBurstPacket(burstID: makeBurstID(0xE6), seq: 5, kind: .end(totalDataPackets: 4, durationMs: 256))), to: coordinator, from: peer) + send(try #require(VoiceBurstPacket(burstID: makeBurstID(0xE7), seq: 5, kind: .canceled)), to: coordinator, from: peer) + #expect(context.handledPrivateMessages.isEmpty) + } + + @Test func concurrentAssemblyCapDropsExtraBursts() throws { + let context = MockChatLiveVoiceContext() + let coordinator = ChatLiveVoiceCoordinator(context: context) + + var cleanup: [Data] = [] + defer { + for burstID in cleanup { + incomingFileURL(burstID: burstID).map { try? FileManager.default.removeItem(at: $0) } + } + } + for i in 0.. +// + +import Testing +import AVFoundation +import Foundation +@testable import bitchat + +struct PTTAudioTests { + // MARK: - ADTS framing + + @Test func adtsHeaderEncodesFrameLengthAndFormat() { + let payload = Data(repeating: 0xAB, count: 100) + let framed = ADTSFramer.frame(payload) + #expect(framed.count == 107) + + // Syncword + MPEG-4 + layer 00 + no CRC. + #expect(framed[0] == 0xFF) + #expect(framed[1] == 0xF1) + // AAC-LC (01), sampling index 8 (16 kHz), channel config 1. + #expect(framed[2] == 0x60) + #expect(framed[3] == 0x40 | UInt8((107 >> 11) & 0x3)) + #expect(framed[4] == UInt8((107 >> 3) & 0xFF)) + #expect(framed[5] == UInt8((107 & 0x7) << 5) | 0x1F) + #expect(framed[6] == 0xFC) + #expect(Data(framed.dropFirst(7)) == payload) + } + + @Test func adtsStreamIsReadableByCoreAudio() throws { + // A receiver persists bursts as ADTS .aac; the file must be openable + // by the same machinery the voice-note UI uses (AVAudioFile). + let frames = try encodeSineFrames(seconds: 0.5) + #expect(frames.count >= 4) + + let url = FileManager.default.temporaryDirectory + .appendingPathComponent("ptt-test-\(UUID().uuidString).aac") + defer { try? FileManager.default.removeItem(at: url) } + var stream = Data() + for frame in frames { + stream.append(ADTSFramer.frame(frame)) + } + try stream.write(to: url) + + let file = try AVAudioFile(forReading: url) + #expect(file.length > 0) + } + + // MARK: - Codec round trip + + @Test func encoderProducesRealtimeSizedFrames() throws { + let frames = try encodeSineFrames(seconds: 1.0) + // 1 s of 64 ms frames ≈ 15 (allow encoder priming slack). + #expect(frames.count >= 10) + // ~16 kbps -> ~130 bytes/frame; all frames must fit the wire budget. + for frame in frames { + #expect(frame.count > 0) + #expect(frame.count < TransportConfig.pttMaxBurstContentBytes) + } + } + + @Test func decoderRoundTripsEncodedAudio() throws { + let frames = try encodeSineFrames(seconds: 0.5) + let decoder = try #require(PTTFrameDecoder()) + + var decodedSamples = 0 + var energy: Float = 0 + for frame in frames { + guard let pcm = decoder.decode(frame) else { continue } // priming + decodedSamples += Int(pcm.frameLength) + if let channel = pcm.floatChannelData?[0] { + for i in 0..= 4 * Int(PTTAudioFormat.samplesPerFrame)) + #expect(energy > 1) + } + + // MARK: - Helpers + + private func encodeSineFrames(seconds: Double) throws -> [Data] { + let encoder = try #require(PTTFrameEncoder()) + let format = try #require(PTTAudioFormat.pcmFormat) + let totalFrames = AVAudioFrameCount(seconds * PTTAudioFormat.sampleRate) + let buffer = try #require(AVAudioPCMBuffer(pcmFormat: format, frameCapacity: totalFrames)) + buffer.frameLength = totalFrames + let channel = try #require(buffer.floatChannelData?[0]) + for i in 0.. +// + +import Testing +import Foundation +@testable import bitchat + +struct VoiceBurstPacketTests { + private let burstID = Data((0..<8).map { UInt8($0 + 1) }) + + // MARK: - Round trips + + @Test func startRoundTrip() throws { + let packet = try #require(VoiceBurstPacket(burstID: burstID, seq: 0, kind: .start(codec: .aacLC16kMono))) + let decoded = try #require(VoiceBurstPacket.decode(packet.encode())) + #expect(decoded == packet) + #expect(decoded.seq == 0) + } + + @Test func framesRoundTrip() throws { + let frames = [Data([0xDE, 0xAD]), Data(repeating: 0x42, count: 130)] + let packet = try #require(VoiceBurstPacket(burstID: burstID, seq: 7, kind: .frames(frames))) + let decoded = try #require(VoiceBurstPacket.decode(packet.encode())) + #expect(decoded == packet) + guard case .frames(let decodedFrames) = decoded.kind else { + Issue.record("expected frames") + return + } + #expect(decodedFrames == frames) + } + + @Test func endRoundTrip() throws { + let packet = try #require(VoiceBurstPacket(burstID: burstID, seq: 42, kind: .end(totalDataPackets: 41, durationMs: 2_688))) + let decoded = try #require(VoiceBurstPacket.decode(packet.encode())) + #expect(decoded == packet) + } + + @Test func canceledRoundTrip() throws { + let packet = try #require(VoiceBurstPacket(burstID: burstID, seq: 3, kind: .canceled)) + let decoded = try #require(VoiceBurstPacket.decode(packet.encode())) + #expect(decoded == packet) + } + + @Test func decodeSurvivesReslicedData() throws { + // Simulates the payload arriving as a slice with a non-zero start index. + let packet = try #require(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames([Data([1, 2, 3])]))) + var padded = Data([0xAA, 0xBB]) + padded.append(packet.encode()) + let slice = padded.dropFirst(2) + #expect(VoiceBurstPacket.decode(slice) == packet) + } + + // MARK: - Validation + + @Test func rejectsMalformedInput() { + #expect(VoiceBurstPacket.decode(Data()) == nil) + #expect(VoiceBurstPacket.decode(Data(repeating: 0, count: 10)) == nil) + // Unknown flags byte. + var unknownFlags = burstID + unknownFlags.append(contentsOf: [0, 1, 0xFF]) + #expect(VoiceBurstPacket.decode(unknownFlags) == nil) + // Data packet with zero frames. + var empty = burstID + empty.append(contentsOf: [0, 1, 0]) + #expect(VoiceBurstPacket.decode(empty) == nil) + // Truncated frame length. + var truncated = burstID + truncated.append(contentsOf: [0, 1, 0, 0x00, 0x10, 0xAB]) + #expect(VoiceBurstPacket.decode(truncated) == nil) + // Unknown codec in START. + var badCodec = burstID + badCodec.append(contentsOf: [0, 0, 0x01, 0x7F]) + #expect(VoiceBurstPacket.decode(badCodec) == nil) + } + + @Test func rejectsInvalidConstruction() { + #expect(VoiceBurstPacket(burstID: Data([1, 2]), seq: 0, kind: .canceled) == nil) + #expect(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames([])) == nil) + #expect(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames([Data()])) == nil) + let tooMany = Array(repeating: Data([0x01]), count: VoiceBurstPacket.maxFramesPerPacket + 1) + #expect(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames(tooMany)) == nil) + } + + @Test func makeBurstIDProducesUniqueEightBytes() { + let a = VoiceBurstPacket.makeBurstID() + let b = VoiceBurstPacket.makeBurstID() + #expect(a.count == VoiceBurstPacket.burstIDSize) + #expect(a != b) + } + + // MARK: - Packetizer + + @Test func packetizerRespectsBudgetAndCounts() throws { + var packetizer = VoiceBurstPacketizer(burstID: burstID, budget: 210) + let frame = Data(repeating: 0x55, count: 130) // realistic 16 kbps AAC frame + + // First frame buffers, second forces a flush of the first. + #expect(packetizer.add(frame).isEmpty) + let flushed = packetizer.add(frame) + #expect(flushed.count == 1) + let first = try #require(VoiceBurstPacket.decode(flushed[0])) + #expect(first.seq == 1) + guard case .frames(let frames) = first.kind else { + Issue.record("expected frames") + return + } + #expect(frames == [frame]) + + // Remaining frame flushes on demand; counters advance. + let final = packetizer.flush() + #expect(final.count == 1) + #expect(try #require(VoiceBurstPacket.decode(final[0])).seq == 2) + #expect(packetizer.dataPacketCount == 2) + #expect(packetizer.nextSeq == 3) + #expect(packetizer.flush().isEmpty) + } + + @Test func packetizerBatchesSmallFrames() throws { + var packetizer = VoiceBurstPacketizer(burstID: burstID, budget: 210) + let small = Data(repeating: 0x11, count: 40) + for _ in 0..<4 { + #expect(packetizer.add(small).isEmpty) // 4 * 42 + 11 = 179 <= 210 + } + let packets = packetizer.flush() + #expect(packets.count == 1) + guard case .frames(let frames) = try #require(VoiceBurstPacket.decode(packets[0])).kind else { + Issue.record("expected frames") + return + } + #expect(frames.count == 4) + } + + @Test func packetizerDropsOversizedFrame() { + var packetizer = VoiceBurstPacketizer(burstID: burstID, budget: 210) + #expect(packetizer.add(Data(repeating: 0, count: 500)).isEmpty) + #expect(packetizer.flush().isEmpty) + #expect(packetizer.dataPacketCount == 0) + } + + @Test func encodedPacketStaysWithinNoisePaddingBucket() throws { + // The whole point of the budget: burst content + 1 type byte + + // 16-byte Noise tag must stay within MessagePadding's 256 bucket. + var packetizer = VoiceBurstPacketizer(burstID: burstID) + var largest = 0 + for _ in 0..<3 { + for packet in packetizer.add(Data(repeating: 0xAB, count: 160)) { + largest = max(largest, packet.count) + } + } + for packet in packetizer.flush() { + largest = max(largest, packet.count) + } + #expect(largest > 0) + #expect(largest + 1 + 16 <= 256) + } +} diff --git a/docs/PUSH-TO-TALK-DESIGN.md b/docs/PUSH-TO-TALK-DESIGN.md new file mode 100644 index 00000000..8c72db62 --- /dev/null +++ b/docs/PUSH-TO-TALK-DESIGN.md @@ -0,0 +1,160 @@ +# Smart Push-to-Talk (PTT) — Design + +**Status:** Draft for review — no code yet +**Scope:** Live voice bursts over the BLE mesh, in public chat and Noise DMs, with graceful degradation to the existing voice-note pipeline. + +## 1. Goal and core idea + +Today, holding the mic button records an AAC `.m4a` and ships it as a `fileTransfer` (0x22) after you release — the receiver hears nothing until the whole file arrives. PTT makes the same gesture *live*: encoded audio frames stream over the mesh while you speak, and nearby receivers hear you with sub-second delay, walkie-talkie style. + +The "smart" part is that PTT is not a separate mode the user must choose. It is a **delivery strategy**, picked automatically per conversation: + +| Context | Delivery | +|---|---| +| DM, peer connected/reachable on mesh | **Live stream** (Noise-encrypted frames) + finalized voice note for reliability | +| DM, peer only reachable via Nostr | Existing voice-note recording only (no live; media doesn't ride Nostr today) | +| Public mesh chat | **Live broadcast stream**, best-effort, no file follow-up | +| Geohash (Nostr) channels | PTT unavailable (matches existing `canSendMediaInCurrentContext` media policy) | + +One gesture (hold mic), one mental model ("talk"), and the system degrades from live → reliable-note → unavailable based on what the transport can actually do. + +**Bandwidth reality check:** the mesh moves ~15 KB/s per link (469 B fragments at 30 ms spacing); our voice codec needs ~2 KB/s. Live voice fits with a wide margin, even relayed. + +## 2. What already exists (reused, not rebuilt) + +- **Capture UX:** `ContentComposerView.micButtonView` already implements hold-to-record / release-to-send via `DragGesture`, backed by `VoiceRecordingViewModel`'s state machine and `VoiceRecorder` (AAC-LC, 16 kHz mono, 16 kbps). Mic permission string is already in Info.plist. +- **Reliable delivery:** `BitchatFilePacket` TLV + `fileTransfer` (0x22) + fragmentation + transfer progress + `ChatMediaTransferCoordinator`. +- **Playback:** `VoiceNotePlaybackController` + `VoiceNotePlaybackCoordinator` (single active playback), `WaveformView`, `VoiceNoteView`. +- **Transport:** signed public packets, Noise sessions with typed inner payloads, `RelayController` flood control, `MessageDeduplicator`, `MessageRouter.canDeliverPromptly`. + +New work is the **streaming path**: a frame encoder/packetizer, a wire format for bursts, a jitter-buffered receiver/player, relay policy, and the live-bubble UI. + +## 3. Wire protocol + +### 3.1 Burst framing (shared inner format) + +A talk burst is a sequence of packets sharing an 8-byte random `burstID`: + +``` +[burstID: 8][seq: UInt16 BE][flags: 1][payload…] +``` + +`flags` bits: +- `0x01 START` — payload is a header TLV: codec (1 B enum, 0x01 = AAC-LC/16kHz/mono), frame duration ms, batch size. Sent as seq 0 and re-attached (piggybacked TLV) every ~2 s so mid-burst joiners can sync. +- `0x02 END` — payload: total data-packet count (UInt16), duration ms (UInt32). Lets receivers detect tail loss. +- `0x04 CANCELED` — sender slid-to-cancel; receivers stop playback, discard buffered audio, and drop the bubble. +- `0x00` (data) — payload is N length-prefixed AAC frames: `[len: UInt16 BE][ADTS-less raw AAC frame]…` + +Audio math: AAC-LC at 16 kHz has 1024-sample frames = **64 ms/frame ≈ 130 B at 16 kbps**. A greedy packetizer batches frames up to a **210-byte burst-content budget** (`pttMaxBurstContentBytes`), chosen so the Noise ciphertext (content + 1 inner-type byte + 16-byte tag) stays inside `MessagePadding`'s 256-byte bucket — the whole directed packet is 288 bytes and voice **never enters the fragment scheduler** (which caps concurrent transfers at 2 and would starve file sends). At 16 kbps that works out to **1 frame/packet, ~15.6 pkt/s, ~5.3 KB/s wire** for DMs; public bursts (unpadded, planned for phase 2) can batch 3 frames. + +### 3.2 Public mesh: new `MessageType.voiceFrame = 0x29` + +- Broadcast (no recipient), **signed** like public messages; unsigned or signature-mismatched frames are dropped on receive. +- **No padding** (add to `BLEOutboundPacketPolicy` alongside `fileTransfer`) — padding to the 512 block would push every packet over MTU into fragmentation. +- TTL: `messageTTL` (7) at origin; `RelayController` gets a `voiceFrame` case mirroring the fragment policy — dense clamp to 5, jitter 8–25 ms — so live audio floods like fragments, not like announces. Per-hop cost is ~10–40 ms; 3 hops stays comfortably inside the jitter buffer. +- Dedup: existing `MessageDeduplicator` (timestamp ms + seq make each packet unique). +- 0x29 is the next free code after `nostrCarrier = 0x28`; unknown types are ignored by older clients (iOS and Android), so rollout is compatible — old clients simply don't hear live bursts. + +### 3.3 DM: new `NoisePayloadType.voiceFrame = 0x08` + +- Inner payload = the same burst framing, wrapped in `noiseEncrypted` (0x11) directed packets — wire-indistinguishable from other DM traffic by size/type (0x04/0x05 are reserved per the comment in `BitchatProtocol.swift`; 0x08 is the first free slot after `groupKeyUpdate = 0x07`). +- Directed encrypted packets are already always-relayed by `RelayController`, so multi-hop DMs work unchanged. +- Requires an established session; PTT-live is only offered when `noiseService.hasEstablishedSession` (otherwise first hold triggers the normal handshake + falls back to voice-note for that burst). +- Fire-and-forget: **no delivery acks, no retransmit** for frames. Late audio is worthless; reliability comes from the finalized note (§5). + +### 3.4 Known traffic-analysis tradeoff + +A steady ~8 pkt/s cadence for the duration of a burst is a timing fingerprint even under Noise (observers can infer "someone is speaking to someone", not content). This is inherent to live voice; the doc records it as accepted for v1. Block padding is skipped for voiceFrame (size classes would leak little beyond what cadence already does). + +## 4. Sender pipeline + +`VoiceRecorder` (AVAudioRecorder → file) can't stream, so PTT capture uses a parallel path in a new `PTTStreamEncoder` actor: + +``` +AVAudioEngine input tap (native format) + → PTTInputResampler → 16 kHz mono PCM + → PTTFrameEncoder (AVAudioConverter) → AAC-LC frames → packetizer → BLEService.sendVoiceFrame + → the same PCM is simultaneously written to an AVAudioFile .m4a (identical settings + to VoiceRecorder), so finalization needs no remux step +``` + +- On release: emit `END`, then hand the finalized `.m4a` to the **existing** `sendVoiceNote` flow. The note's `fileName` embeds the burst ID (`voice_.m4a`) — that links note↔burst with **zero changes** to `BitchatFilePacket`/Android interop. +- On slide-to-cancel: stop tap, emit `CANCELED`, delete local file, skip finalization. UX note: unlike voice notes, live audio already played on the far side cannot be unsent — the recording UI must make "you are live" unmistakable (see §7). +- Caps: max burst 120 s (matching the voice-note recorder's cap), exactly one outbound burst at a time. +- Audio session: reuse `VoiceRecorder`'s `.playAndRecord` config; add `.duckOthers`. + +## 5. Receiver pipeline + +New `VoiceBurstAssembler` (keyed by sender + burstID) feeding a `PTTBurstPlayer`: + +- **Jitter buffer:** start playback after 350 ms of buffered audio or 500 ms wall-clock, whichever first. Frames decode via `AVAudioConverter` → `AVAudioPlayerNode`. +- **Loss handling:** gap in seq → insert silence for the missing frames (64 ms each) and keep going. No PLC in v1; at these frame sizes brief dropouts are acceptable. +- **Burst end:** on `END`, or 3 s with no frames (talker walked out of range). +- **Persistence:** frames append to an incoming ADTS `.aac` file (already an allowed `MimeType`), so every burst becomes a replayable voice-note bubble containing whatever was captured — even a partial one. +- **Dedup with the finalized note (DM):** when a `fileTransfer` arrives whose fileName carries a burstID we already assembled, it silently *replaces* the partial file behind the existing bubble (no new message row, no second notification). Receivers that heard everything live just get a lossless copy. +- **Resource caps:** ≤ 8 concurrent assemblies, ≤ 256 KB per burst (60 s × 2 KB/s + slack), 30 s stale cleanup, and drop inbound frames beyond ~2× realtime per sender (spam/flood guard). + +## 6. Playback policy — when does it actually make sound? + +Auto-playing strangers' audio is the fastest way to make this feature hated. Rules: + +1. **Live autoplay** only when *all* hold: app foregrounded, the burst's conversation is the one currently on screen, and the **"live voice messages"** toggle is on (app-level, in the app-info sheet, default on; per-conversation overrides are a v2 refinement). The same toggle gates live *sending* — off means voice behaves exactly like classic notes in both directions. +2. Otherwise the burst appears as a **live bubble**: pulsing waveform + `LIVE` badge + sender name; tapping it joins playback at the live edge. When the burst ends it becomes a normal voice-note bubble. +3. **One voice at a time:** route through `VoiceNotePlaybackCoordinator`. If two people talk simultaneously, the first burst holds the floor; the second shows as a tappable live bubble. No mixing in v1. +4. Notifications: a live burst in a non-focused DM fires the normal message notification once (at START), not per-frame. + +**Floor courtesy (public mesh):** while someone else's burst is live in the current channel, the mic button tints "busy" with the talker's name. Holding it still works — a decentralized mesh has no floor arbiter, and rejecting sends would desync under partitions — but the UI discourages talk-over. Hard floor control (token passing) is explicitly out of scope. + +## 7. UX + +- **Same gesture:** hold mic = talk. When the live path is active, the recording HUD shows a red pulsing **LIVE** treatment (vs. the current neutral recording UI) so the sender knows audio is leaving in real time, not on release. When live isn't available (Nostr-only peer, no session yet), the HUD looks like today's and behavior is unchanged. +- Slide-to-cancel keeps working in both modes, with the §4 caveat surfaced simply: cancel stops and discards; it can't unplay what was heard. +- VoiceOver: mirror the existing `accessibilityAction` toggle-record pattern on the mic button. +- Foreground-only in v1: no `audio` UIBackgroundMode (App Store review + battery implications). If the app backgrounds mid-burst, capture stops cleanly with END. Background listen/talk is a v2 candidate. + +## 8. Latency budget (1 hop, DM) + +| Stage | Cost | +|---|---| +| Frame accumulation (1 × 64 ms) | 64 ms | +| Encode + packetize | ~5 ms | +| BLE write + delivery | 30–60 ms | +| Jitter buffer | 350 ms | +| **Mouth-to-ear** | **~470 ms** | + +Each relay hop adds ~10–40 ms jitter + radio time. 2–3 hops stays under ~800 ms — solidly in walkie-talkie territory (commercial PoC apps run 300 ms–1 s+). + +## 9. Security & privacy summary + +- Public frames signed with the existing packet signature; verified against the sender's announce before decode. Unsigned → dropped. +- DM frames ride inside Noise; content confidentiality/integrity as any DM. +- Codec input is validated by frame-length prefixes and total-size caps before touching `AVAudioConverter` (malformed frames dropped, assembly aborted over cap). +- Timing fingerprint accepted per §3.4. No PTT in geohash channels (would put voice on public Nostr relays). +- Mic capture only while the button is held; recording state is always visible. + +## 10. New components & touch points + +| Piece | Where | +|---|---| +| `PTTStreamEncoder` (tap → AAC → packets) | `bitchat/Features/voice/` | +| `PTTBurstPlayer` (jitter buffer → decode → engine) | `bitchat/Features/voice/` | +| `VoiceBurstFramer` / `VoiceBurstAssembler` (wire encode/decode, caps) | `bitchat/Protocols/` + `bitchat/Services/PTT/` | +| `MessageType.voiceFrame = 0x29` | `localPackages/BitFoundation/.../MessageType.swift` + `BLEReceivePipeline` / `BLEService.handleReceivedPacket` | +| `NoisePayloadType.voiceFrame = 0x08` | `BitchatProtocol.swift` + `ChatTransportEventCoordinator` dispatch | +| Relay policy case | `RelayController` (fragment-like clamp/jitter) | +| No-padding rule | `BLEOutboundPacketPolicy` | +| Pacing/cap constants | `TransportConfig` | +| Live bubble + LIVE HUD + busy mic tint + settings toggle | `VoiceNoteView`/`MediaMessageView`, `ContentComposerView`, conversation settings | +| Delivery-mode selection | `ChatViewModel` / `ChatMediaTransferCoordinator` (reuse `isPeerConnected` / `canDeliverPromptly` / `hasEstablishedSession`) | + +## 11. Phasing + +1. **Phase 1 — DM live (highest value, lowest blast radius):** encoder, framer, Noise inner type, assembler/player, live bubble, finalize-as-note dedup. Single-hop DMs are the dominant real-world case. +2. **Phase 2 — public mesh:** `voiceFrame` 0x29, signing/verification, relay policy, floor-courtesy UI, autoplay defaults. +3. **Phase 3 (v2 candidates):** background audio mode, mid-burst repair requests (piggyback on REQUEST_SYNC), talk-over mixing, AAC-ELD low-delay profile, dedicated walkie-mode screen, media-over-Nostr (unlocks live-ish PTT for internet peers), Android protocol spec sync. + +## 12. Testing + +- Unit: framer round-trip (START/data/END/CANCELED, seq gaps, oversize frames), assembler caps + stale cleanup + burstID note dedup, packetizer batch sizing vs. MTU (assert no fragmentation), relay-policy clamps. +- Integration: two-simulator loopback via the existing mesh test harness; loss injection (drop every Nth frame) → verify silence-fill + partial-file persistence. +- Device: two-phone live DM (latency measurement vs. §8 budget), three-phone relay chain, talk-over behavior, cancel semantics, mic-permission-denied path. From 78a291ab77008dc045b063f8cafebc0d8f4d1e60 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 09:23:16 +0200 Subject: [PATCH 055/158] Public-mesh push-to-talk: signed live voice bursts in the mesh channel (#1406) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Live push-to-talk voice for DMs: stream while you talk, voice note as fallback Holding the mic in a DM now streams AAC frames live over the Noise session (walkie-talkie style, ~0.5s mouth-to-ear at one hop) while recording the same audio as a normal voice note. On release the note ships through the existing fileTransfer pipeline; receivers that heard the live stream absorb it silently into the same bubble (matched by the burst ID embedded in the file name), so reliability comes for free and nobody sees duplicates. Protocol: - NoisePayloadType.voiceFrame = 0x08 carrying VoiceBurstPacket (burstID + seq + START/data/END/CANCELED, length-prefixed AAC frames) - 210-byte burst-content budget keeps each Noise packet inside the 256-byte padding bucket: one BLE frame, never the fragment scheduler - fire-and-forget: frames are dropped (never queued) without an established session; live is only offered when the peer is mesh-reachable Receive: - ChatLiveVoiceCoordinator assembles bursts (jitter-ordered, 0.5s gap skip, 3s idle end, flood/size caps), persists progressively as ADTS .aac so even a partial burst is a replayable bubble - live autoplay only when the conversation is on screen, app active, and the new app-info "live voice messages" toggle is on (also gates live sending) - one-playback-at-a-time via a shared ExclusivePlayback slot Capture: - PTTCaptureEngine taps AVAudioEngine, dual-encodes: live AAC frames + the finalized .m4a (same 16kHz/mono/16kbps settings as VoiceRecorder) - VoiceRecordingViewModel now drives a pluggable VoiceCaptureSession; the composer HUD shows a pulsing LIVE treatment when streaming Includes the push-to-talk design doc, 6 new localization keys across all 29 locales, and unit tests for framing, packetizer budget, ADTS output, codec round-trip, and the assembly/absorb lifecycle. Public-mesh PTT (MessageType 0x29) lands separately on top of this. Co-Authored-By: Claude Fable 5 * Public-mesh push-to-talk: signed live voice bursts in the mesh channel Extends live PTT from DMs to the public mesh timeline. Holding the mic in the mesh channel now broadcasts the burst live as signed voiceFrame packets (MessageType 0x29) while the finalized voice note still ships on release — new clients hear you as you speak and absorb the note silently into the live bubble; old clients (and late joiners) keep receiving the note exactly as before, so mixed-version meshes lose nothing. Wire/relay: - MessageType.voiceFrame = 0x29: ephemeral signed broadcast, never gossip-synced (SyncTypeFlags maps it to no bit), never padded (padding to the 512 block would push every ~490-byte signed packet into fragmentation) - RelayController treats voiceFrame like media fragments: dense-graph TTL clamp contains the sustained ~15 pkt/s per-talker stream, tight 8-25 ms jitter keeps multi-hop latency inside the receiver's 350 ms jitter buffer - inbound gate mirrors public messages: broadcast-only, 30 s freshness cap, packet signature verified against the claimed sender's announce before any audio reaches the UI App: - ChatLiveVoiceCoordinator gains burst scopes: public bubbles land in the mesh timeline, autoplay only while that timeline is on screen, and the finalized-note absorb is scope-bound (a public note can't replace a DM burst or vice versa) - floor courtesy: while someone talks live in the public channel the composer mic tints red and pulses, with an accessibility value naming the talker ("%@ is speaking", localized in all 29 locales); holding still works — a decentralized mesh has no floor arbiter, the tint just discourages talk-over Tests: relay policy (sparse cap + dense clamp), public bubble + talker indicator lifecycle, note absorption into the mesh store, and scope-binding rejection; full suite green (1382 tests). Co-Authored-By: Claude Fable 5 * PTT follow-ups from review + field test: peer-ID normalization, toggle gates inbound, drop-path diagnostics Codex review fixes (#1403): - makeVoiceCaptureSession normalizes the selected peer with toShort() before the reachability/session checks and binds the send target to that same routing ID — a conversation selected under the stable 64-hex Noise key no longer silently falls back to a classic note while the short-ID session is established - the live-voice toggle now gates inbound bursts too: off means classic-notes-only in both directions (no live bubble, partial file, or early notification; the finalized note still arrives), with a test Field-test diagnostics (first device run: DM frames decrypted but no bubble appeared, with no log evidence of which guard dropped them): - coordinator logs undecodable frames (size + hex prefix) and blocked drops - makeAssembly logs directory/file-handle failures instead of returning nil silently - PTTLiveVoiceSession logs capture start and finish (packet/frame/duration counts); PTTCaptureEngine logs engine start success/failure with the input format; BLEService.sendVoiceFrame logs no-session drops Co-Authored-By: Claude Fable 5 * Fix iPhone live-capture failure: dead input unit (AURemoteIO -10851, 0 Hz) Field testing showed the phone's live capture failing at mic enable with AURemoteIO -10851 and an input format of 0 Hz / 2 ch — an input unit bound to an earlier (playback-only or settling) audio session. The Mac, which has no session lifecycle, captured fine, which is why public bursts from the Mac worked while phone-side sends degraded from working (first hold) to sporadic to dead across holds. Three layers of defense: - PTTCaptureEngine recreates its AVAudioEngine on every start(), after the session is configured, so the input unit binds to the session that is active now; a dead input (0 Hz or 0 channels) is now a distinct, logged error instead of a silent setup failure - PTTLiveVoiceSession retries the capture start once after a 150 ms route-settle pause - VoiceRecordingViewModel falls back to the classic VoiceRecorder within the same hold if the live engine still cannot start — a route glitch now costs the live stream, never the voice note Co-Authored-By: Claude Fable 5 * Blue mic when the hold will stream live The mic button now shows readiness at a glance — and doubles as a build marker for device testing: - blue: holding will stream live (DM peer reachable with an established Noise session, or the public mesh channel) - accent (orange in DMs): holding records a classic voice note (no session yet, peer unreachable, or live voice toggled off) - red states unchanged (recording, floor busy) Refactors capture-backend selection into a single liveVoiceTarget() so the indicator and makeVoiceCaptureSession can never disagree. Co-Authored-By: Claude Fable 5 * Revert the blue live-ready mic to the normal accent color The build-verification marker did its job; idle mic color goes back to the accent. The LIVE recording HUD remains the signal for whether a hold is streaming. Keeps the liveVoiceTarget() refactor so backend selection stays in one place. Co-Authored-By: Claude Fable 5 * Leave a trace on every mic press and every inbound-frame drop Field testing read "tap does nothing" as breakage: the mic start is async (permission check + engine spin-up), so releasing before recording begins has always been a silent cancel — for classic voice notes too. Every press now logs which backend it chose and, for quick presses, that it released before recording started. Also logs the two remaining silent drops: inbound voice frames rejected by the live-voice toggle (the one unlogged guard left in the receive path) and the classic-note fallback now includes the toggle state. Co-Authored-By: Claude Fable 5 * Fix mic hold dying instantly in DMs: sheet swipe gesture starved the composer Field logs showed every DM mic hold ending 3-10 ms after it began, on both platforms, while public-channel holds worked — the private sheet wraps its entire content (composer included) in a high-priority swipe-right-to-leave DragGesture, and a high-priority ancestor drag cancels the mic button's press-and-hold within milliseconds. Same starvation mechanism as the DM image-reveal bug (#1402), hitting a drag instead of a tap. The swipe-to-leave gesture now lives on the message list only, so the composer's gestures (mic hold, text field, buttons) are out of its reach and the swipe still works where users actually swipe. Also stops touching the capture engine when a hold cancels before the engine ever started: probing inputNode on a never-started engine instantiates its input unit against whatever session is active and spams benign-but-alarming AURemoteIO -10851 errors into field logs. Co-Authored-By: Claude Fable 5 * Reorder app info sheet: usage first, then settings, then reference New section order: HOW TO USE, then the adjustable bits (appearance, voice, network), then the reference material (features, privacy, symbols legend). Co-Authored-By: Claude Fable 5 * App info: flow HOW TO USE into one paragraph; "list" and "person" wording The six how-to-use bullets now read as a single comma-separated paragraph (same instruction strings, legacy bullet prefix stripped at render). Two wording updates across all 29 locales: the people icon opens the "list" (not "sidebar"), and you tap a "person's" name (not a "peer's") to start a DM. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/ConversationUIModel.swift | 7 + bitchat/Features/voice/PTTCaptureEngine.swift | 20 +- bitchat/Localizable.xcstrings | 295 ++++++++++++++---- bitchat/Protocols/BitchatProtocol.swift | 7 + .../BLE/BLEOutboundPacketPolicy.swift | 5 +- bitchat/Services/BLE/BLEReceivePipeline.swift | 1 + bitchat/Services/BLE/BLEService.swift | 79 +++++ bitchat/Services/RelayController.swift | 7 +- bitchat/Services/Transport.swift | 8 + bitchat/Services/TransportConfig.swift | 3 + bitchat/Sync/SyncTypeFlags.swift | 3 + .../ViewModels/ChatLiveVoiceCoordinator.swift | 155 +++++++-- bitchat/ViewModels/ChatViewModel.swift | 17 + .../ChatViewModel+PrivateChat.swift | 67 ++-- .../ViewModels/VoiceRecordingViewModel.swift | 5 + bitchat/Views/AppInfoView.swift | 73 +++-- bitchat/Views/ContentComposerView.swift | 28 +- .../ChatLiveVoiceCoordinatorTests.swift | 72 +++++ .../Services/RelayControllerTests.swift | 40 +++ docs/PUSH-TO-TALK-DESIGN.md | 6 +- .../Sources/BitFoundation/MessageType.swift | 5 + 21 files changed, 762 insertions(+), 141 deletions(-) diff --git a/bitchat/App/ConversationUIModel.swift b/bitchat/App/ConversationUIModel.swift index 95412b58..683a9dee 100644 --- a/bitchat/App/ConversationUIModel.swift +++ b/bitchat/App/ConversationUIModel.swift @@ -12,6 +12,9 @@ final class ConversationUIModel: ObservableObject { @Published private(set) var currentNickname: String @Published private(set) var isBatchingPublic = false @Published private(set) var canSendMediaInCurrentContext = true + /// Who is talking live in the public mesh channel right now (floor + /// courtesy: the composer mic tints "busy" while someone holds the floor). + @Published private(set) var activeLiveVoiceTalker: String? private let chatViewModel: ChatViewModel private let privateConversationModel: PrivateConversationModel @@ -186,6 +189,10 @@ final class ConversationUIModel: ObservableObject { .receive(on: DispatchQueue.main) .assign(to: &$isBatchingPublic) + chatViewModel.$activePublicVoiceTalker + .receive(on: DispatchQueue.main) + .assign(to: &$activeLiveVoiceTalker) + conversations.$activeChannel .receive(on: DispatchQueue.main) .sink { [weak self] channel in diff --git a/bitchat/Features/voice/PTTCaptureEngine.swift b/bitchat/Features/voice/PTTCaptureEngine.swift index 8150f7bf..e98f2458 100644 --- a/bitchat/Features/voice/PTTCaptureEngine.swift +++ b/bitchat/Features/voice/PTTCaptureEngine.swift @@ -35,6 +35,9 @@ final class PTTCaptureEngine { private var encodedFrameCount = 0 private var running = false private var captureStart = Date() + /// Whether `engine.start()` succeeded for the current capture (main-actor + /// callers only; see `stopEngineIfStarted`). + private var engineStarted = false /// Called on the capture queue with each batch of encoded AAC frames. var onFrames: (([Data]) -> Void)? @@ -91,14 +94,14 @@ final class PTTCaptureEngine { queue.sync { self.teardown(deleteFile: true) } throw error } + engineStarted = true SecureLogger.info("PTT: capture engine running (input: \(Int(inputFormat.sampleRate)) Hz, \(inputFormat.channelCount) ch)", category: .session) } /// Stops capture and finalizes the `.m4a`. Returns the file URL and the /// number of encoded AAC frames (each `PTTAudioFormat.frameDuration` long). func stop() -> (url: URL?, encodedFrames: Int) { - engine.inputNode.removeTap(onBus: 0) - engine.stop() + stopEngineIfStarted() let result: (URL?, Int) = queue.sync { let url = fileURL let frames = encodedFrameCount @@ -112,14 +115,23 @@ final class PTTCaptureEngine { } func cancel() { - engine.inputNode.removeTap(onBus: 0) - engine.stop() + stopEngineIfStarted() queue.sync { teardown(deleteFile: true) } #if os(iOS) Self.deactivateAudioSession() #endif } + /// Touching `inputNode` on an engine that never started instantiates its + /// input unit against whatever session is active and spams AURemoteIO + /// errors — a canceled-before-start hold must not touch the engine. + private func stopEngineIfStarted() { + guard engineStarted else { return } + engineStarted = false + engine.inputNode.removeTap(onBus: 0) + engine.stop() + } + // MARK: - Capture queue private func process(_ buffer: AVAudioPCMBuffer) { diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 99a7e5ac..12e3f978 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -4310,175 +4310,175 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "• اضغط أيقونة الأشخاص لفتح الشريط الجانبي" + "value" : "• اضغط أيقونة الأشخاص لفتح القائمة" } }, "bn" : { "stringUnit" : { "state" : "translated", - "value" : "• সাইডবার খুলতে মানুষ আইকনে ট্যাপ করুন" + "value" : "• তালিকা খুলতে মানুষ আইকনে ট্যাপ করুন" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "• tippe auf das personen-icon, um die seitenleiste zu öffnen" + "value" : "• tippe auf das personen-icon für die liste" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "• tap people icon for sidebar" + "value" : "• tap people icon for list" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "• toca el ícono de personas para abrir la barra lateral" + "value" : "• toca el ícono de personas para ver la lista" } }, "fil" : { "stringUnit" : { "state" : "translated", - "value" : "• i-tap ang icon ng tao para buksan ang sidebar" + "value" : "• i-tap ang icon ng tao para sa listahan" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "• tape sur l'icône personnes pour ouvrir la barre latérale" + "value" : "• tape sur l'icône personnes pour la liste" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "• הקש על אייקון האנשים כדי לפתוח סרגל צד" + "value" : "• הקש על אייקון האנשים כדי לפתוח את הרשימה" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "• साइडबार खोलने के लिए लोगों वाले आइकन पर टैप करें" + "value" : "• सूची खोलने के लिए लोगों वाले आइकन पर टैप करें" } }, "id" : { "stringUnit" : { "state" : "translated", - "value" : "• ketuk ikon orang untuk membuka sidebar" + "value" : "• ketuk ikon orang untuk membuka daftar" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "• tocca l'icona persone per aprire la barra laterale" + "value" : "• tocca l'icona persone per aprire la lista" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "• 人アイコンをタップしてサイドバーを開く" + "value" : "• 人アイコンをタップして一覧を開く" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "• 사람 아이콘을 탭하여 사이드바를 엽니다" + "value" : "• 사람 아이콘을 탭하여 목록을 엽니다" } }, "ms" : { "stringUnit" : { "state" : "translated", - "value" : "• ketuk ikon orang untuk membuka sidebar" + "value" : "• ketuk ikon orang untuk membuka senarai" } }, "ne" : { "stringUnit" : { "state" : "translated", - "value" : "• साइडबार खोल्न मान्छे आइकन ट्याप गर" + "value" : "• सूची खोल्न मान्छे आइकन ट्याप गर" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "• tik op het personen-icoon om de zijbalk te openen" + "value" : "• tik op het personen-icoon voor de lijst" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "• stuknij ikonę osób, aby otworzyć panel boczny" + "value" : "• stuknij ikonę osób, aby otworzyć listę" } }, "pt" : { "stringUnit" : { "state" : "translated", - "value" : "• toca no ícone das pessoas para abrir a barra lateral" + "value" : "• toca no ícone das pessoas para abrir a lista" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "• toque o ícone de pessoas para abrir a barra lateral" + "value" : "• toque o ícone de pessoas para abrir a lista" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "• нажми на иконку людей, чтобы открыть боковое меню" + "value" : "• нажми на иконку людей, чтобы открыть список" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "• tryck på personikonen för att öppna sidomenyn" + "value" : "• tryck på personikonen för att öppna listan" } }, "ta" : { "stringUnit" : { "state" : "translated", - "value" : "• பக்கப்பட்டியைத் திறக்க மனிதர் சின்னத்தைத் தட்டுங்கள்" + "value" : "• பட்டியலைத் திறக்க மனிதர் சின்னத்தைத் தட்டுங்கள்" } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "• แตะไอคอนคนเพื่อเปิดแถบด้านข้าง" + "value" : "• แตะไอคอนคนเพื่อเปิดรายชื่อ" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "• kenar çubuğunu açmak için insan simgesine dokunun" + "value" : "• listeyi açmak için insan simgesine dokunun" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "• торкни піктограму людей, щоб відкрити бічну панель" + "value" : "• торкни піктограму людей, щоб відкрити список" } }, "ur" : { "stringUnit" : { "state" : "translated", - "value" : "• سائیڈ بار کھولنے کیلئے لوگوں کا آئیکن ٹیپ کریں" + "value" : "• فہرست کھولنے کیلئے لوگوں کا آئیکن ٹیپ کریں" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "• chạm biểu tượng người để mở thanh bên" + "value" : "• chạm biểu tượng người để mở danh sách" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "• 轻点人物图标打开侧栏" + "value" : "• 轻点人物图标打开列表" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "• 輕點人物圖示打開側欄" + "value" : "• 輕點人物圖示打開列表" } } } @@ -4668,175 +4668,175 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "• اضغط اسم القرين لبدء رسائل خاصة" + "value" : "• اضغط اسم شخص لبدء رسائل خاصة" } }, "bn" : { "stringUnit" : { "state" : "translated", - "value" : "• ডিএম শুরু করতে পিয়ারের নাম ট্যাপ করুন" + "value" : "• ডিএম শুরু করতে কোনো ব্যক্তির নাম ট্যাপ করুন" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "• tippe auf den namen eines peers, um eine pn zu starten" + "value" : "• tippe auf den namen einer person, um eine pn zu starten" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "• tap a peer's name to start a DM" + "value" : "• tap a person's name to start a DM" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "• toca el nombre de un participante para iniciar un MD" + "value" : "• toca el nombre de una persona para iniciar un MD" } }, "fil" : { "stringUnit" : { "state" : "translated", - "value" : "• i-tap ang pangalan ng peer para magsimula ng DM" + "value" : "• i-tap ang pangalan ng isang tao para magsimula ng DM" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "• tape sur le nom d'un pair pour démarrer un mp" + "value" : "• tape sur le nom d'une personne pour démarrer un mp" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "• הקש על שם עמית כדי להתחיל הודעה פרטית" + "value" : "• הקש על שם של אדם כדי להתחיל הודעה פרטית" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "• किसी पीयर का नाम टैप करके DM शुरू करें" + "value" : "• किसी व्यक्ति का नाम टैप करके DM शुरू करें" } }, "id" : { "stringUnit" : { "state" : "translated", - "value" : "• ketuk nama peer untuk mulai dm" + "value" : "• ketuk nama seseorang untuk mulai dm" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "• tocca il nome di un peer per avviare un dm" + "value" : "• tocca il nome di una persona per avviare un dm" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "• ピアの名前をタップしてdm開始" + "value" : "• 人の名前をタップしてdm開始" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "• 피어의 이름을 탭하여 DM을 시작합니다" + "value" : "• 상대방의 이름을 탭하여 DM을 시작합니다" } }, "ms" : { "stringUnit" : { "state" : "translated", - "value" : "• ketuk nama peer untuk mulai dm" + "value" : "• ketuk nama seseorang untuk mulai dm" } }, "ne" : { "stringUnit" : { "state" : "translated", - "value" : "• dm सुरु गर्न कुनै सहकर्मीको नाम ट्याप गर" + "value" : "• dm सुरु गर्न कुनै व्यक्तिको नाम ट्याप गर" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "• tik op de naam van een peer om een DM te starten" + "value" : "• tik op de naam van een persoon om een DM te starten" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "• stuknij nazwę peera, aby rozpocząć DM" + "value" : "• stuknij czyjeś imię, aby rozpocząć DM" } }, "pt" : { "stringUnit" : { "state" : "translated", - "value" : "• toca no nome de um par para iniciar um DM" + "value" : "• toca no nome de uma pessoa para iniciar um DM" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "• toque o nome de um par para iniciar um dm" + "value" : "• toque o nome de uma pessoa para iniciar um dm" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "• нажми имя пользователя, чтобы начать лс" + "value" : "• нажми имя человека, чтобы начать лс" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "• tryck på en peers namn för att starta ett DM" + "value" : "• tryck på en persons namn för att starta ett DM" } }, "ta" : { "stringUnit" : { "state" : "translated", - "value" : "• peer பெயரைத் தட்டி DM தொடங்கவும்" + "value" : "• ஒருவரின் பெயரைத் தட்டி DM தொடங்கவும்" } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "• แตะชื่อเพียร์เพื่อเริ่ม DM" + "value" : "• แตะชื่อบุคคลเพื่อเริ่ม DM" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "• bir eşin adına dokunarak DM başlatın" + "value" : "• bir kişinin adına dokunarak DM başlatın" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "• торкни ім'я піра, щоб почати приватний чат" + "value" : "• торкни ім'я людини, щоб почати приватний чат" } }, "ur" : { "stringUnit" : { "state" : "translated", - "value" : "• DM شروع کرنے کیلئے کسی ہم منصب کے نام پر ٹیپ کریں" + "value" : "• DM شروع کرنے کیلئے کسی شخص کے نام پر ٹیپ کریں" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "• chạm tên một nút ngang hàng để mở DM" + "value" : "• chạm tên một người để mở DM" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "• 轻点同伴名字开始 dm" + "value" : "• 轻点某人名字开始 dm" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "• 輕點同伴名字開始 dm" + "value" : "• 輕點某人名字開始 dm" } } } @@ -17967,6 +17967,185 @@ } } }, + "content.accessibility.someone_speaking" : { + "comment" : "Accessibility value on the mic button naming who is talking live in the public channel", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ يتحدث الآن" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ কথা বলছেন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ spricht gerade" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is speaking" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ está hablando" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "nagsasalita si %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ est en train de parler" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ מדבר כעת" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ बोल रहे हैं" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ sedang berbicara" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ sta parlando" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@が話しています" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 님이 말하는 중" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ sedang bercakap" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ बोल्दै हुनुहुन्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is aan het spreken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ mówi" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ está a falar" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ está falando" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ говорит" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ pratar" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ பேசுகிறார்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ กำลังพูด" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ konuşuyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ говорить" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ بول رہے ہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ đang nói" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 正在讲话" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 正在說話" + } + } + } + }, "content.accessibility.take_photo" : { "comment" : "Accessibility action name for taking a photo with the camera", "extractionState" : "manual", diff --git a/bitchat/Protocols/BitchatProtocol.swift b/bitchat/Protocols/BitchatProtocol.swift index 9ac7ebe9..6c259f5f 100644 --- a/bitchat/Protocols/BitchatProtocol.swift +++ b/bitchat/Protocols/BitchatProtocol.swift @@ -130,6 +130,9 @@ protocol BitchatDelegate: AnyObject { // Encrypted group broadcast (opaque envelope; decrypted by the group coordinator) func didReceiveGroupMessage(payload: Data, timestamp: Date) + // Public live-voice burst packet (signature-verified by the transport) + func didReceivePublicVoiceFrame(from peerID: PeerID, nickname: String, payload: Data, timestamp: Date) + // Bluetooth state updates for user notifications func didUpdateBluetoothState(_ state: CBManagerState) func didReceivePublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) @@ -153,6 +156,10 @@ extension BitchatDelegate { // Default empty implementation } + func didReceivePublicVoiceFrame(from peerID: PeerID, nickname: String, payload: Data, timestamp: Date) { + // Default empty implementation + } + func didReceivePublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) { // Default empty implementation } diff --git a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift index 64cfa73e..9449dfa9 100644 --- a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift +++ b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift @@ -12,7 +12,10 @@ enum BLEOutboundPacketPolicy { switch MessageType(rawValue: packetType) { case .noiseEncrypted, .noiseHandshake: return true - case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .boardPost, .ping, .pong, .nostrCarrier, .prekeyBundle, .groupMessage: + // voiceFrame is deliberately unpadded: padding to the 512 block would + // push every ~490-byte signed voice packet over the MTU into the + // fragment path. + case .none, .announce, .message, .leave, .requestSync, .fragment, .fileTransfer, .courierEnvelope, .boardPost, .ping, .pong, .nostrCarrier, .prekeyBundle, .groupMessage, .voiceFrame: return false } } diff --git a/bitchat/Services/BLE/BLEReceivePipeline.swift b/bitchat/Services/BLE/BLEReceivePipeline.swift index 92e3bec8..e81fabd5 100644 --- a/bitchat/Services/BLE/BLEReceivePipeline.swift +++ b/bitchat/Services/BLE/BLEReceivePipeline.swift @@ -70,6 +70,7 @@ struct BLEReceivePipeline { // announce-class TTL headroom so alerts travel the extra hop. isUrgentBoardPost: packet.type == MessageType.boardPost.rawValue && BoardWire.urgentFlag(in: packet.payload), + isVoiceFrame: packet.type == MessageType.voiceFrame.rawValue, degree: degree, highDegreeThreshold: highDegreeThreshold ) diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 2657dcb8..412e4e32 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -1477,6 +1477,34 @@ final class BLEService: NSObject { } } + /// Broadcasts one live voice-burst packet to the public mesh, signed like + /// a public message so receivers can authenticate the talker. Ephemeral: + /// never tracked for gossip sync (stale audio is worthless to replay). + func sendVoiceFrameBroadcast(_ burstContent: Data) { + guard !burstContent.isEmpty else { return } + messageQueue.async { [weak self] in + guard let self else { return } + let packet = BitchatPacket( + type: MessageType.voiceFrame.rawValue, + senderID: self.myPeerIDData, + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: burstContent, + signature: nil, + ttl: self.messageTTL + ) + guard let signedPacket = self.noiseService.signPacket(packet) else { + SecureLogger.error("❌ Failed to sign voice frame", category: .security) + return + } + // Pre-mark our own broadcast as processed to avoid handling a + // relayed self copy. + let dedupID = BLESelfBroadcastTracker.dedupID(for: signedPacket) + self.messageDeduplicator.markProcessed(dedupID) + self.broadcastPacket(signedPacket) + } + } + func addPeerAuthenticatedObserver(_ handler: @escaping (PeerID, String) -> Void) { // Appends to the encryption service's handler array, so this never // displaces the callbacks installed by installNoiseSessionCallbacks. @@ -3985,6 +4013,11 @@ extension BLEService { case .nostrCarrier: handleNostrCarrier(packet, from: peerID) + case .voiceFrame: + // Rejected frames (unsigned/stale/spoofed) must not spread; skip + // the relay step below, like invalid board posts. + guard handleVoiceFrame(packet, from: senderID) else { return } + case .ping: // Rate limiting must key on the ingress link (`peerID`), not the // packet-claimed sender: pings are unsigned, so `senderID` is @@ -4333,6 +4366,52 @@ extension BLEService { } } + /// Inbound public live-voice packet: broadcast-only, freshness-gated, and + /// signature-verified against the claimed sender's announce (mirrors the + /// public-message identity gate — `senderID` is attacker-controlled, so a + /// valid packet signature is required before any audio reaches the UI). + /// Returns whether the packet was accepted; rejected packets must not be + /// relayed either, or spoofed 0x29 floods would still amplify. + private func handleVoiceFrame(_ packet: BitchatPacket, from peerID: PeerID) -> Bool { + guard peerID != myPeerID else { return false } + guard BLEPacketFreshnessPolicy.isBroadcastRecipient(packet.recipientID) else { return false } + guard !BLEPacketFreshnessPolicy.isStale( + timestampMilliseconds: packet.timestamp, + now: Date(), + maxAgeSeconds: TransportConfig.pttPublicFrameMaxAgeSeconds + ) else { return false } + + let peersSnapshot = collectionsQueue.sync { peerRegistry.snapshotByID } + let registrySigningKey = peersSnapshot[peerID]?.signingPublicKey + let verifiedViaRegistry = registrySigningKey.map { noiseService.verifyPacketSignature(packet, publicKey: $0) } ?? false + let signedDisplayName = verifiedViaRegistry ? nil : signedSenderDisplayName(for: packet, from: peerID) + guard verifiedViaRegistry || signedDisplayName != nil else { + SecureLogger.warning("🚫 Dropping voice frame with missing/invalid signature for claimed sender \(peerID.id.prefix(8))…", category: .security) + return false + } + guard let senderNickname = BLEPeerSenderDisplayName.resolveKnownPeer( + peerID: peerID, + localPeerID: myPeerID, + localNickname: myNickname, + peers: peersSnapshot, + allowConnectedUnverified: false + ) ?? signedDisplayName else { + return false + } + + let payload = packet.payload + let timestamp = Date(timeIntervalSince1970: TimeInterval(packet.timestamp) / 1000) + notifyUI { [weak self] in + self?.deliverTransportEvent(.publicVoiceFrameReceived( + peerID: peerID, + nickname: senderNickname, + payload: payload, + timestamp: timestamp + )) + } + return true + } + private func handleNoiseHandshake(_ packet: BitchatPacket, from peerID: PeerID) { noisePacketHandler.handleHandshake(packet, from: peerID) } diff --git a/bitchat/Services/RelayController.swift b/bitchat/Services/RelayController.swift index 10b4f2c6..dc87fabf 100644 --- a/bitchat/Services/RelayController.swift +++ b/bitchat/Services/RelayController.swift @@ -20,6 +20,7 @@ struct RelayController { isAnnounce: Bool, isRequestSync: Bool = false, isUrgentBoardPost: Bool = false, + isVoiceFrame: Bool = false, degree: Int, highDegreeThreshold: Int) -> RelayDecision { let ttlCap = min(ttl, TransportConfig.messageTTLDefault) @@ -46,7 +47,11 @@ struct RelayController { return RelayDecision(shouldRelay: true, newTTL: newTTL, delayMs: delayMs) } - if isFragment { + // Live voice floods with the fragment policy: the dense clamp + // contains the sustained ~15 pkt/s per-talker stream, and the tight + // jitter window keeps per-hop latency inside the receiver's ~350 ms + // jitter buffer across multi-hop paths. + if isFragment || isVoiceFrame { // Dense graphs clamp harder to contain full-fanout fragment floods; // sparse graphs get full depth so media reaches as far as text. let fragmentCap = degree >= highDegreeThreshold diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 1ce72534..82bcc166 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -72,6 +72,9 @@ enum TransportEvent: @unchecked Sendable { /// Encrypted group broadcast (MessageType 0x25). Opaque here — the group /// coordinator decrypts and authenticates against the roster. case groupMessageReceived(payload: Data, timestamp: Date) + /// Public live-voice burst packet (MessageType 0x29), already + /// signature-verified against the claimed sender. + case publicVoiceFrameReceived(peerID: PeerID, nickname: String, payload: Data, timestamp: Date) case peerConnected(PeerID) case peerDisconnected(PeerID) case peerListUpdated([PeerID]) @@ -160,6 +163,8 @@ protocol Transport: AnyObject { // only useful now — transports drop them (never queue) when no // established session exists. func sendVoiceFrame(_ burstContent: Data, to peerID: PeerID) + // Public-mesh counterpart: signed ephemeral broadcast, never synced. + func sendVoiceFrameBroadcast(_ burstContent: Data) // Courier store-and-forward (mesh transports only): seal a message to the // recipient's static key and hand it to connected couriers for physical @@ -238,6 +243,7 @@ extension Transport { func sendCourierMessage(_ content: String, messageID: String, recipientNoiseKey: Data, via couriers: [PeerID]) -> Bool { false } func sendBoardPayload(_ payload: Data) {} func sendVoiceFrame(_ burstContent: Data, to peerID: PeerID) {} + func sendVoiceFrameBroadcast(_ burstContent: Data) {} // Mesh diagnostics are mesh-transport-only; other transports report // "no reply"/"no path" rather than pretending to measure anything. @@ -280,6 +286,8 @@ extension BitchatDelegate { didReceiveNoisePayload(from: peerID, type: type, payload: payload, timestamp: timestamp) case let .groupMessageReceived(payload, timestamp): didReceiveGroupMessage(payload: payload, timestamp: timestamp) + case let .publicVoiceFrameReceived(peerID, nickname, payload, timestamp): + didReceivePublicVoiceFrame(from: peerID, nickname: nickname, payload: payload, timestamp: timestamp) case .peerConnected(let peerID): didConnectToPeer(peerID) case .peerDisconnected(let peerID): diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 967abbda..bf8c0270 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -34,6 +34,9 @@ enum TransportConfig { // Inbound flood guard: a real burst arrives at ~2KB/s; allow 3x plus a // small settling allowance before dropping a sender's frames. static let pttInboundMaxBytesPerSecond: Int = 6_000 + // Public bursts are live-only traffic: frames older than this are relay + // stragglers or replays, not audio anyone should start hearing. + static let pttPublicFrameMaxAgeSeconds: TimeInterval = 30 // Mesh diagnostics (/ping) static let meshPingTimeoutSeconds: TimeInterval = 10 // Give up on a probe after this window diff --git a/bitchat/Sync/SyncTypeFlags.swift b/bitchat/Sync/SyncTypeFlags.swift index f5c0566a..c2c96a1c 100644 --- a/bitchat/Sync/SyncTypeFlags.swift +++ b/bitchat/Sync/SyncTypeFlags.swift @@ -54,6 +54,9 @@ struct SyncTypeFlags: OptionSet { // downlinks are rate-budgeted rebroadcasts); replaying them via sync // would waste airtime and extend their lifetime. case .nostrCarrier: return nil + // Live voice is only useful now; replaying stale audio frames via + // sync would waste airtime (receivers drop them as stale anyway). + case .voiceFrame: return nil // Prekey bundles gossip like board posts. The bitfield is a // wire-tolerant little-endian UInt64 (1-8 bytes, unknown high bits // ignored by `type(forBit:)`), so bits 8+ need no format change: old diff --git a/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift b/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift index 1a45723e..62f13653 100644 --- a/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift +++ b/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift @@ -11,19 +11,58 @@ import Foundation protocol ChatLiveVoiceContext: AnyObject { var nickname: String { get } var selectedPrivateChatPeer: PeerID? { get } + /// Whether the public mesh timeline is what's on screen (autoplay gate + /// for public bursts). + var isViewingPublicMeshTimeline: Bool { get } func isPeerBlocked(_ peerID: PeerID) -> Bool func resolveNickname(for peerID: PeerID) -> String /// Routes an inbound private message through the full pipeline /// (store append, unread state, notification, read receipt). func handlePrivateMessage(_ message: BitchatMessage) + /// Appends directly to the public mesh timeline, bypassing the batched + /// public pipeline: a live bubble must be removable when its burst is + /// canceled or empty, which a pipeline-buffered entry is not (it would + /// re-commit at the next flush). + func appendPublicMeshMessage(_ message: BitchatMessage) /// Replace-or-append by message ID via the single-writer store intent. func upsertPrivateMessage(_ message: BitchatMessage, in peerID: PeerID) + /// Replace-or-append by message ID in the public mesh timeline. + func upsertPublicMeshMessage(_ message: BitchatMessage) @discardableResult func removePrivateMessage(withID messageID: String) -> BitchatMessage? + /// Removes a message from whichever conversation holds it. + func removeMessage(withID messageID: String, cleanupFile: Bool) + /// Publishes who is currently talking live in the public mesh channel + /// (floor-courtesy indicator on the composer mic), nil when nobody is. + func setActivePublicVoiceTalker(_ nickname: String?) func notifyUIChanged() } -extension ChatViewModel: ChatLiveVoiceContext {} +extension ChatViewModel: ChatLiveVoiceContext { + var isViewingPublicMeshTimeline: Bool { + selectedPrivateChatPeer == nil && activeChannel == .mesh + } + + func appendPublicMeshMessage(_ message: BitchatMessage) { + _ = appendPublicMessage(message, to: ConversationID(channelID: .mesh)) + } + + func upsertPublicMeshMessage(_ message: BitchatMessage) { + conversations.upsertByID(message, in: ConversationID(channelID: .mesh)) + } + + func setActivePublicVoiceTalker(_ nickname: String?) { + if activePublicVoiceTalker != nickname { + activePublicVoiceTalker = nickname + } + } +} + +/// Where a live voice burst lives: a Noise DM or the public mesh timeline. +enum VoiceBurstScope: Equatable { + case directMessage + case publicMesh +} /// Assembles inbound live push-to-talk bursts (`NoisePayloadType.voiceFrame`): /// orders packets behind a jitter window, persists frames progressively as an @@ -36,6 +75,8 @@ final class ChatLiveVoiceCoordinator { private final class Assembly { let burstID: Data let peerID: PeerID + let scope: VoiceBurstScope + let nickname: String let message: BitchatMessage var messageID: String { message.id } var messageTimestamp: Date { message.timestamp } @@ -56,9 +97,11 @@ final class ChatLiveVoiceCoordinator { var idleTimeout: Task? var gapRedrain: Task? - init(burstID: Data, peerID: PeerID, message: BitchatMessage, fileURL: URL, fileHandle: FileHandle) { + init(burstID: Data, peerID: PeerID, scope: VoiceBurstScope, nickname: String, message: BitchatMessage, fileURL: URL, fileHandle: FileHandle) { self.burstID = burstID self.peerID = peerID + self.scope = scope + self.nickname = nickname self.message = message self.fileURL = fileURL self.fileHandle = fileHandle @@ -69,6 +112,7 @@ final class ChatLiveVoiceCoordinator { private struct FinishedBurst { let messageID: String let peerID: PeerID + let scope: VoiceBurstScope let fileURL: URL let messageTimestamp: Date let expiresAt: Date @@ -88,11 +132,25 @@ final class ChatLiveVoiceCoordinator { // MARK: - Inbound frames + /// Inbound DM burst packet (`NoisePayloadType.voiceFrame`). func handleVoiceFramePayload(from peerID: PeerID, payload: Data, timestamp: Date) { + handle(payload, from: peerID, scope: .directMessage, nickname: context.resolveNickname(for: peerID), timestamp: timestamp) + } + + /// Inbound public burst packet (`MessageType.voiceFrame`), already + /// signature-verified by the transport, which resolved the nickname. + func handlePublicVoiceFramePayload(from peerID: PeerID, nickname: String, payload: Data, timestamp: Date) { + handle(payload, from: peerID, scope: .publicMesh, nickname: nickname, timestamp: timestamp) + } + + private func handle(_ payload: Data, from peerID: PeerID, scope: VoiceBurstScope, nickname: String, timestamp: Date) { // Live voice off means classic-notes-only in both directions: no live // bubble, no partial file, no early notification — the finalized // voice note still arrives through the normal pipeline. - guard PTTSettings.liveVoiceEnabled else { return } + guard PTTSettings.liveVoiceEnabled else { + SecureLogger.debug("PTT: dropping inbound voice frame — live voice is toggled off", category: .session) + return + } guard let packet = VoiceBurstPacket.decode(payload) else { SecureLogger.warning("PTT: undecodable voice frame from \(peerID.id.prefix(8))… (\(payload.count) bytes: \(payload.prefix(16).hexEncodedString())…)", category: .session) return @@ -103,23 +161,25 @@ final class ChatLiveVoiceCoordinator { } if let assembly = assemblies[packet.burstID] { - // The sender is Noise-authenticated; a different peer reusing the - // same burst ID is a collision or a replay — drop it. - guard assembly.peerID == peerID else { return } + // The sender is authenticated (Noise session or packet + // signature); a different peer or scope reusing the same burst + // ID is a collision or a replay — drop it. + guard assembly.peerID == peerID, assembly.scope == scope else { return } apply(packet, to: assembly) return } switch packet.kind { case .start, .frames: - // A data packet with no prior START (lost or mid-burst state) + // A data packet with no prior START (lost or mid-burst join) // still opens the assembly with the default codec. guard assemblies.count < TransportConfig.pttMaxConcurrentAssemblies else { SecureLogger.debug("PTT: dropping burst from \(peerID.id.prefix(8))… — assembly cap reached", category: .session) return } - guard let assembly = makeAssembly(burstID: packet.burstID, peerID: peerID, timestamp: timestamp) else { return } + guard let assembly = makeAssembly(burstID: packet.burstID, peerID: peerID, scope: scope, nickname: nickname, timestamp: timestamp) else { return } assemblies[packet.burstID] = assembly + updatePublicTalkerIndicator() apply(packet, to: assembly) case .end, .canceled: // Control packet for a burst we never saw — nothing to do. @@ -151,8 +211,9 @@ final class ChatLiveVoiceCoordinator { pruneFinishedBursts() guard let finished = finishedBursts[burstID] else { return false } - // Bind the note to the burst's authenticated sender. + // Bind the note to the burst's authenticated sender and scope. guard message.senderPeerID == nil || message.senderPeerID == finished.peerID else { return false } + guard message.isPrivate == (finished.scope == .directMessage) else { return false } let replacement = BitchatMessage( id: finished.messageID, @@ -161,13 +222,18 @@ final class ChatLiveVoiceCoordinator { timestamp: finished.messageTimestamp, isRelay: false, originalSender: nil, - isPrivate: true, - recipientNickname: context.nickname, + isPrivate: finished.scope == .directMessage, + recipientNickname: finished.scope == .directMessage ? context.nickname : nil, senderPeerID: finished.peerID, mentions: nil, deliveryStatus: message.deliveryStatus ) - context.upsertPrivateMessage(replacement, in: finished.peerID) + switch finished.scope { + case .directMessage: + context.upsertPrivateMessage(replacement, in: finished.peerID) + case .publicMesh: + context.upsertPublicMeshMessage(replacement) + } // The complete .m4a replaces the partial live capture. WaveformCache.shared.purge(url: finished.fileURL) @@ -181,7 +247,7 @@ final class ChatLiveVoiceCoordinator { // MARK: - Assembly lifecycle - private func makeAssembly(burstID: Data, peerID: PeerID, timestamp: Date) -> Assembly? { + private func makeAssembly(burstID: Data, peerID: PeerID, scope: VoiceBurstScope, nickname: String, timestamp: Date) -> Assembly? { guard let fileURL = Self.makeIncomingURL(burstID: burstID) else { SecureLogger.error("PTT: cannot resolve incoming media directory for burst \(burstID.hexEncodedString())", category: .session) return nil @@ -193,33 +259,46 @@ final class ChatLiveVoiceCoordinator { return nil } + let isPrivate = scope == .directMessage let message = BitchatMessage( - sender: context.resolveNickname(for: peerID), + sender: nickname, content: "\(MimeType.Category.audio.messagePrefix)\(fileURL.lastPathComponent)", timestamp: timestamp, isRelay: false, originalSender: nil, - isPrivate: true, - recipientNickname: context.nickname, + isPrivate: isPrivate, + recipientNickname: isPrivate ? context.nickname : nil, senderPeerID: peerID ) let assembly = Assembly( burstID: burstID, peerID: peerID, + scope: scope, + nickname: nickname, message: message, fileURL: fileURL, fileHandle: handle ) - // Full inbound pipeline: store append, unread, notification. - context.handlePrivateMessage(message) + // DM bubbles ride the full inbound pipeline (store append, unread, + // notification). Public bubbles append directly to the store: the + // batched public pipeline can't purge a buffered entry if the burst + // is canceled before the flush. + switch scope { + case .directMessage: + context.handlePrivateMessage(message) + case .publicMesh: + context.appendPublicMeshMessage(message) + } // Live playback only when the user is looking at this conversation // with the app frontmost and live voice enabled. - if PTTSettings.liveVoiceEnabled, - PTTSettings.isAppActive, - context.selectedPrivateChatPeer == peerID { + let isViewing = switch scope { + case .directMessage: context.selectedPrivateChatPeer == peerID + case .publicMesh: context.isViewingPublicMeshTimeline + } + if PTTSettings.liveVoiceEnabled, PTTSettings.isAppActive, isViewing { assembly.player = PTTBurstPlayer() } @@ -227,6 +306,13 @@ final class ChatLiveVoiceCoordinator { return assembly } + /// Keeps the composer's floor-courtesy indicator pointing at whoever is + /// currently talking live in the public mesh channel. + private func updatePublicTalkerIndicator() { + let talker = assemblies.values.first { $0.scope == .publicMesh }?.nickname + context.setActivePublicVoiceTalker(talker) + } + private func apply(_ packet: VoiceBurstPacket, to assembly: Assembly) { assembly.receivedBytes += packet.encode().count let elapsed = Date().timeIntervalSince(assembly.firstPacketAt) @@ -328,10 +414,11 @@ final class ChatLiveVoiceCoordinator { try? assembly.fileHandle?.close() assembly.fileHandle = nil assemblies.removeValue(forKey: assembly.burstID) + updatePublicTalkerIndicator() guard assembly.deliveredFrames > 0 else { // Nothing audible ever arrived — drop the empty bubble. - context.removePrivateMessage(withID: assembly.messageID) + removeBubble(of: assembly) try? FileManager.default.removeItem(at: assembly.fileURL) context.notifyUIChanged() return @@ -342,12 +429,13 @@ final class ChatLiveVoiceCoordinator { WaveformCache.shared.purge(url: assembly.fileURL) // Republish so the row re-renders without its LIVE treatment even if // no finalized note ever arrives to swap in. - context.upsertPrivateMessage(assembly.message, in: assembly.peerID) + republishBubble(of: assembly) pruneFinishedBursts() finishedBursts[assembly.burstID] = FinishedBurst( messageID: assembly.messageID, peerID: assembly.peerID, + scope: assembly.scope, fileURL: assembly.fileURL, messageTimestamp: assembly.messageTimestamp, expiresAt: Date().addingTimeInterval(TransportConfig.pttFinishedBurstRegistrySeconds) @@ -356,6 +444,24 @@ final class ChatLiveVoiceCoordinator { SecureLogger.debug("PTT: burst \(assembly.burstID.hexEncodedString()) finalized (\(assembly.deliveredFrames) frames)", category: .session) } + private func removeBubble(of assembly: Assembly) { + switch assembly.scope { + case .directMessage: + context.removePrivateMessage(withID: assembly.messageID) + case .publicMesh: + context.removeMessage(withID: assembly.messageID, cleanupFile: false) + } + } + + private func republishBubble(of assembly: Assembly) { + switch assembly.scope { + case .directMessage: + context.upsertPrivateMessage(assembly.message, in: assembly.peerID) + case .publicMesh: + context.upsertPublicMeshMessage(assembly.message) + } + } + private func cancelAssembly(_ assembly: Assembly) { assembly.idleTimeout?.cancel() assembly.gapRedrain?.cancel() @@ -363,7 +469,8 @@ final class ChatLiveVoiceCoordinator { try? assembly.fileHandle?.close() assembly.fileHandle = nil assemblies.removeValue(forKey: assembly.burstID) - context.removePrivateMessage(withID: assembly.messageID) + updatePublicTalkerIndicator() + removeBubble(of: assembly) WaveformCache.shared.purge(url: assembly.fileURL) try? FileManager.default.removeItem(at: assembly.fileURL) context.notifyUIChanged() diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 8c195162..38985d62 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -187,6 +187,9 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele @MainActor var connectedPeers: Set { unifiedPeerService.connectedPeerIDs } @Published var allPeers: [BitchatPeer] = [] + /// Nickname of whoever is talking live in the public mesh channel right + /// now (floor-courtesy indicator on the composer mic), nil when nobody. + @Published var activePublicVoiceTalker: String? /// Read-only derived view of all direct conversations in the /// `ConversationStore`, keyed by routing peer ID. Serves the coordinator @@ -1624,6 +1627,17 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele } } + func didReceivePublicVoiceFrame(from peerID: PeerID, nickname: String, payload: Data, timestamp: Date) { + Task { @MainActor [weak self] in + self?.liveVoiceCoordinator.handlePublicVoiceFramePayload( + from: peerID, + nickname: nickname, + payload: payload, + timestamp: timestamp + ) + } + } + // MARK: - QR Verification API @MainActor func beginQRVerification(with qr: VerificationService.VerificationQR) -> Bool { @@ -1776,6 +1790,9 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele /// Handle incoming public message @MainActor func handlePublicMessage(_ message: BitchatMessage) { + // A finalized voice note whose burst already streamed in live swaps + // into the existing bubble instead of appearing twice. + if liveVoiceCoordinator.absorbFinalizedVoiceNote(message) { return } publicConversationCoordinator.handlePublicMessage(message) } diff --git a/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift b/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift index 397c8f72..2d40cfea 100644 --- a/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift +++ b/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift @@ -70,33 +70,56 @@ extension ChatViewModel { mediaTransferCoordinator.sendVoiceNote(at: url) } + /// Where a live burst would stream right now, or nil when the hold would + /// fall back to a classic voice note. + private enum LiveVoiceTarget { + case peer(PeerID) + case publicMesh + } + + @MainActor + private func liveVoiceTarget() -> LiveVoiceTarget? { + guard PTTSettings.liveVoiceEnabled else { return nil } + + if let selectedPeer = selectedPrivateChatPeer { + guard !selectedPeer.isGeoDM, !selectedPeer.isGeoChat, !selectedPeer.isGroup else { return nil } + // A conversation can be selected under the stable 64-hex Noise key + // (e.g. after migration on disconnect), but Noise sessions are keyed + // by the 16-hex routing ID — normalize once and send to that same + // short ID, like the private-message/file paths do. + let peerID = selectedPeer.toShort() + guard meshService.isPeerReachable(peerID), + case .established = meshService.getNoiseSessionState(for: peerID) + else { return nil } + return .peer(peerID) + } + + // Public mesh timeline: signed live broadcast. Geohash channels never + // reach here (the composer hides media affordances there). + return activeChannel == .mesh ? .publicMesh : nil + } + /// Picks the capture backend for the composer's hold-to-record gesture: - /// live push-to-talk when the selected DM peer can hear it now (mesh - /// reachable + established Noise session), otherwise the classic - /// record-then-send voice note. Either way the release delivers a normal - /// voice note through `sendVoiceNote(at:)`. + /// live push-to-talk when the audience can hear it now — a DM peer that + /// is mesh-reachable with an established Noise session, or the public + /// mesh channel — otherwise the classic record-then-send voice note. + /// Either way the release delivers a normal voice note through + /// `sendVoiceNote(at:)`, which live receivers absorb into the live bubble. @MainActor func makeVoiceCaptureSession() -> VoiceCaptureSession { - guard PTTSettings.liveVoiceEnabled, - let selectedPeer = selectedPrivateChatPeer, - !selectedPeer.isGeoDM, !selectedPeer.isGeoChat, !selectedPeer.isGroup - else { + switch liveVoiceTarget() { + case .peer(let peerID): + return PTTLiveVoiceSession(sendPacket: { [meshService] packet in + meshService.sendVoiceFrame(packet, to: peerID) + }) + case .publicMesh: + return PTTLiveVoiceSession(sendPacket: { [meshService] packet in + meshService.sendVoiceFrameBroadcast(packet) + }) + case nil: + SecureLogger.info("PTT: hold uses classic voice note (liveVoiceEnabled=\(PTTSettings.liveVoiceEnabled), dmSelected=\(selectedPrivateChatPeer != nil))", category: .session) return VoiceNoteCaptureSession() } - // A conversation can be selected under the stable 64-hex Noise key - // (e.g. after migration on disconnect), but Noise sessions are keyed - // by the 16-hex routing ID — normalize once and send to that same - // short ID, like the private-message/file paths do. - let peerID = selectedPeer.toShort() - guard meshService.isPeerReachable(peerID), - case .established = meshService.getNoiseSessionState(for: peerID) - else { - SecureLogger.debug("PTT: live unavailable for \(peerID.id.prefix(8))… (reachable=\(meshService.isPeerReachable(peerID))) — using classic voice note", category: .session) - return VoiceNoteCaptureSession() - } - return PTTLiveVoiceSession(sendPacket: { [meshService] packet in - meshService.sendVoiceFrame(packet, to: peerID) - }) } /// Inbound handler for `NoisePayloadType.voiceFrame`. diff --git a/bitchat/ViewModels/VoiceRecordingViewModel.swift b/bitchat/ViewModels/VoiceRecordingViewModel.swift index 0f3f4349..97d54ad2 100644 --- a/bitchat/ViewModels/VoiceRecordingViewModel.swift +++ b/bitchat/ViewModels/VoiceRecordingViewModel.swift @@ -76,6 +76,7 @@ final class VoiceRecordingViewModel: ObservableObject { func start(shouldShow: Bool) { guard shouldShow, state == .idle else { return } let session = sessionProvider() + SecureLogger.info("PTT: mic hold began (backend: \(session.isLive ? "live" : "classic"))", category: .session) activeSession = session state = .requestingPermission Task { @@ -144,6 +145,10 @@ final class VoiceRecordingViewModel: ObservableObject { activeSession = nil guard case .recording(let startDate) = previousState, let completion, let session else { + // A quick press releases before the recorder spins up; that has + // always been a silent no-op for voice notes — log it so field + // tests can tell "tapped" apart from "capture broke". + SecureLogger.info("PTT: mic released before recording started (state was \(previousState)) — hold longer to record", category: .session) Task { await session?.cancel() } return } diff --git a/bitchat/Views/AppInfoView.swift b/bitchat/Views/AppInfoView.swift index 324f74d2..1b696234 100644 --- a/bitchat/Views/AppInfoView.swift +++ b/bitchat/Views/AppInfoView.swift @@ -120,14 +120,21 @@ struct AppInfoView: View { enum HowToUse { static let title: LocalizedStringKey = "app_info.how_to_use.title" - static let instructions: [LocalizedStringKey] = [ - "app_info.how_to_use.set_nickname", - "app_info.how_to_use.change_channels", - "app_info.how_to_use.open_sidebar", - "app_info.how_to_use.start_dm", - "app_info.how_to_use.clear_chat", - "app_info.how_to_use.commands" - ] + /// The instruction strings flowed into one comma-separated + /// paragraph. The translations carry their legacy bullet-list + /// prefix ("• "), so it is stripped here. + static var paragraph: String { + [ + String(localized: "app_info.how_to_use.set_nickname"), + String(localized: "app_info.how_to_use.change_channels"), + String(localized: "app_info.how_to_use.open_sidebar"), + String(localized: "app_info.how_to_use.start_dm"), + String(localized: "app_info.how_to_use.clear_chat"), + String(localized: "app_info.how_to_use.commands") + ] + .map { $0.hasPrefix("• ") ? String($0.dropFirst(2)) : $0 } + .joined(separator: ", ") + } } } @@ -196,6 +203,16 @@ struct AppInfoView: View { .frame(maxWidth: .infinity) .padding(.vertical) + // How to Use + VStack(alignment: .leading, spacing: 16) { + SectionHeader(Strings.HowToUse.title) + + Text(verbatim: Strings.HowToUse.paragraph) + .bitchatFont(size: 14) + .foregroundColor(textColor) + .fixedSize(horizontal: false, vertical: true) + } + // Appearance — single row: label left, theme chips right HStack(spacing: 12) { SectionHeader(Strings.appearanceTitle) @@ -220,17 +237,19 @@ struct AppInfoView: View { } } - // How to Use + // Voice VStack(alignment: .leading, spacing: 16) { - SectionHeader(Strings.HowToUse.title) + SectionHeader(Strings.Voice.title) - VStack(alignment: .leading, spacing: 8) { - ForEach(Array(Strings.HowToUse.instructions.enumerated()), id: \.offset) { _, instruction in - Text(instruction) - } + HStack(spacing: 0) { + FeatureRow(info: Strings.Voice.live) + Toggle(Strings.Voice.live.title, isOn: $liveVoiceEnabled) + .labelsHidden() + .tint(palette.accent) + .onChange(of: liveVoiceEnabled) { newValue in + PTTSettings.liveVoiceEnabled = newValue + } } - .bitchatFont(size: 14) - .foregroundColor(textColor) } // Voice @@ -286,6 +305,17 @@ struct AppInfoView: View { FeatureRow(info: Strings.Features.mentions) } + // Privacy + VStack(alignment: .leading, spacing: 16) { + SectionHeader(Strings.Privacy.title) + + FeatureRow(info: Strings.Privacy.noTracking) + + FeatureRow(info: Strings.Privacy.ephemeral) + + FeatureRow(info: Strings.Privacy.panic) + } + // Symbols legend VStack(alignment: .leading, spacing: 10) { SectionHeader(Strings.Legend.title) @@ -307,17 +337,6 @@ struct AppInfoView: View { .accessibilityElement(children: .combine) } } - - // Privacy - VStack(alignment: .leading, spacing: 16) { - SectionHeader(Strings.Privacy.title) - - FeatureRow(info: Strings.Privacy.noTracking) - - FeatureRow(info: Strings.Privacy.ephemeral) - - FeatureRow(info: Strings.Privacy.panic) - } } .padding() } diff --git a/bitchat/Views/ContentComposerView.swift b/bitchat/Views/ContentComposerView.swift index f8598e0e..6ebcd756 100644 --- a/bitchat/Views/ContentComposerView.swift +++ b/bitchat/Views/ContentComposerView.swift @@ -241,10 +241,28 @@ private extension ContentComposerView { } } + /// Floor courtesy: someone else is talking live in the public channel. + /// Only advisory — a decentralized mesh has no floor arbiter, so holding + /// the mic still works; the tint just discourages talk-over. + var busyTalker: String? { + guard privateConversationModel.selectedPeerID == nil else { return nil } + return conversationUIModel.activeLiveVoiceTalker + } + + /// Recording > floor-busy > default accent. Whether the hold streams + /// live or records a classic note is signaled by the recording HUD's + /// LIVE treatment, not the idle button color. + var micColor: Color { + if voiceRecordingVM.state.isActive { return .red } + if busyTalker != nil { return Color.red.opacity(0.6) } + return composerAccentColor + } + var micButtonView: some View { Image(systemName: "mic.circle.fill") .font(.bitchatSystem(size: 24)) - .foregroundColor(voiceRecordingVM.state.isActive ? Color.red : composerAccentColor) + .foregroundColor(micColor) + .modifier(PulsingOpacityModifier(active: busyTalker != nil && !voiceRecordingVM.state.isActive)) .frame(width: 36, height: 36) .contentShape(Circle()) .overlay( @@ -266,7 +284,13 @@ private extension ContentComposerView { .accessibilityValue( voiceRecordingVM.state.isActive ? String(localized: "content.accessibility.recording", comment: "Accessibility value announced while a voice note is recording") - : "" + : busyTalker.map { + String( + format: String(localized: "content.accessibility.someone_speaking", comment: "Accessibility value on the mic button naming who is talking live in the public channel"), + locale: .current, + $0 + ) + } ?? "" ) .accessibilityHint( String(localized: "content.accessibility.record_voice_hint", comment: "Accessibility hint explaining double-tap toggles voice recording") diff --git a/bitchatTests/ChatLiveVoiceCoordinatorTests.swift b/bitchatTests/ChatLiveVoiceCoordinatorTests.swift index 4c2929e6..52f5172b 100644 --- a/bitchatTests/ChatLiveVoiceCoordinatorTests.swift +++ b/bitchatTests/ChatLiveVoiceCoordinatorTests.swift @@ -15,23 +15,39 @@ import BitFoundation private final class MockChatLiveVoiceContext: ChatLiveVoiceContext { var nickname = "me" var selectedPrivateChatPeer: PeerID? + var isViewingPublicMeshTimeline = false var blockedPeers: Set = [] private(set) var handledPrivateMessages: [BitchatMessage] = [] + private(set) var appendedPublicMessages: [BitchatMessage] = [] private(set) var upsertedMessages: [(message: BitchatMessage, peerID: PeerID)] = [] + private(set) var upsertedPublicMessages: [BitchatMessage] = [] private(set) var removedMessageIDs: [String] = [] + private(set) var talkerUpdates: [String?] = [] func isPeerBlocked(_ peerID: PeerID) -> Bool { blockedPeers.contains(peerID) } func resolveNickname(for peerID: PeerID) -> String { "alice" } func handlePrivateMessage(_ message: BitchatMessage) { handledPrivateMessages.append(message) } + func appendPublicMeshMessage(_ message: BitchatMessage) { appendedPublicMessages.append(message) } func upsertPrivateMessage(_ message: BitchatMessage, in peerID: PeerID) { upsertedMessages.append((message, peerID)) } + func upsertPublicMeshMessage(_ message: BitchatMessage) { + upsertedPublicMessages.append(message) + } @discardableResult func removePrivateMessage(withID messageID: String) -> BitchatMessage? { removedMessageIDs.append(messageID) return nil } + func removeMessage(withID messageID: String, cleanupFile: Bool) { + removedMessageIDs.append(messageID) + } + func setActivePublicVoiceTalker(_ nickname: String?) { + if talkerUpdates.last ?? nil != nickname { + talkerUpdates.append(nickname) + } + } func notifyUIChanged() {} } @@ -230,6 +246,62 @@ struct ChatLiveVoiceCoordinatorTests { #expect(!FileManager.default.fileExists(atPath: url.path)) } + @Test func publicBurstCreatesMeshBubbleAndTracksTalker() throws { + let context = MockChatLiveVoiceContext() + let coordinator = ChatLiveVoiceCoordinator(context: context) + let burstID = makeBurstID(0x71) + defer { incomingFileURL(burstID: burstID).map { try? FileManager.default.removeItem(at: $0) } } + + func sendPublic(_ packet: VoiceBurstPacket) { + coordinator.handlePublicVoiceFramePayload(from: peer, nickname: "bob", payload: packet.encode(), timestamp: Date()) + } + + sendPublic(try #require(VoiceBurstPacket(burstID: burstID, seq: 0, kind: .start(codec: .aacLC16kMono)))) + sendPublic(try #require(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames([Data(repeating: 3, count: 50)])))) + + // Bubble appends straight to the mesh store with the verified + // nickname, and the floor-courtesy indicator names the talker. + #expect(context.handledPrivateMessages.isEmpty) + let bubble = try #require(context.appendedPublicMessages.first) + #expect(!bubble.isPrivate) + #expect(bubble.sender == "bob") + #expect(context.talkerUpdates.last == "bob") + + sendPublic(try #require(VoiceBurstPacket(burstID: burstID, seq: 2, kind: .end(totalDataPackets: 1, durationMs: 64)))) + // Burst over: talker cleared, bubble republished into the mesh store. + #expect(context.talkerUpdates.last == .some(nil)) + #expect(context.upsertedPublicMessages.contains { $0.id == bubble.id }) + + // The broadcast finalized note absorbs into the same bubble. + let note = BitchatMessage( + sender: "bob", content: "[voice] voice_\(burstID.hexEncodedString()).m4a", timestamp: Date(), + isRelay: false, isPrivate: false, senderPeerID: peer + ) + #expect(coordinator.absorbFinalizedVoiceNote(note)) + let replacement = try #require(context.upsertedPublicMessages.last) + #expect(replacement.id == bubble.id) + #expect(replacement.content == note.content) + #expect(!replacement.isPrivate) + } + + @Test func absorbEnforcesScopeBinding() throws { + let context = MockChatLiveVoiceContext() + let coordinator = ChatLiveVoiceCoordinator(context: context) + let burstID = makeBurstID(0x72) + defer { incomingFileURL(burstID: burstID).map { try? FileManager.default.removeItem(at: $0) } } + + // A DM burst... + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames([Data(repeating: 4, count: 40)]))), to: coordinator, from: peer) + send(try #require(VoiceBurstPacket(burstID: burstID, seq: 2, kind: .end(totalDataPackets: 1, durationMs: 64))), to: coordinator, from: peer) + + // ...must not be replaced by a *public* note claiming the same burst. + let publicNote = BitchatMessage( + sender: "alice", content: "[voice] voice_\(burstID.hexEncodedString()).m4a", timestamp: Date(), + isRelay: false, isPrivate: false, senderPeerID: peer + ) + #expect(!coordinator.absorbFinalizedVoiceNote(publicNote)) + } + @Test func burstIDParsingFromFileNames() { #expect(ChatLiveVoiceCoordinator.burstID(fromVoiceFileName: "voice_00112233445566ff.m4a") == Data(hexString: "00112233445566ff")) // Uniquified copies keep the leading hex run. diff --git a/bitchatTests/Services/RelayControllerTests.swift b/bitchatTests/Services/RelayControllerTests.swift index 7c04fab6..cb18ec64 100644 --- a/bitchatTests/Services/RelayControllerTests.swift +++ b/bitchatTests/Services/RelayControllerTests.swift @@ -134,6 +134,46 @@ struct RelayControllerTests { #expect(decision.newTTL == TransportConfig.bleFragmentRelayTtlCapDense - 1) } + @Test + func voiceFrame_relaysWithFragmentPolicy() async { + // Sparse graph: fragment cap, tight jitter (multi-hop latency must + // stay inside the receiver's jitter buffer). + let sparse = RelayController.decide( + ttl: 7, + senderIsSelf: false, + isEncrypted: false, + isDirectedEncrypted: false, + isFragment: false, + isDirectedFragment: false, + isHandshake: false, + isAnnounce: false, + isVoiceFrame: true, + degree: 3, + highDegreeThreshold: TransportConfig.bleHighDegreeThreshold + ) + #expect(sparse.shouldRelay) + #expect(sparse.newTTL == min(UInt8(7), TransportConfig.bleFragmentRelayTtlCap) &- 1) + #expect(sparse.delayMs >= TransportConfig.bleFragmentRelayMinDelayMs) + #expect(sparse.delayMs <= TransportConfig.bleFragmentRelayMaxDelayMs) + + // Dense graph: harder clamp contains the sustained per-talker stream. + let dense = RelayController.decide( + ttl: 7, + senderIsSelf: false, + isEncrypted: false, + isDirectedEncrypted: false, + isFragment: false, + isDirectedFragment: false, + isHandshake: false, + isAnnounce: false, + isVoiceFrame: true, + degree: TransportConfig.bleHighDegreeThreshold, + highDegreeThreshold: TransportConfig.bleHighDegreeThreshold + ) + #expect(dense.shouldRelay) + #expect(dense.newTTL == TransportConfig.bleFragmentRelayTtlCapDense - 1) + } + @Test func requestSync_neverRelaysEvenWithTTLHeadroom() async { let decision = RelayController.decide( diff --git a/docs/PUSH-TO-TALK-DESIGN.md b/docs/PUSH-TO-TALK-DESIGN.md index 8c72db62..fc3a69fd 100644 --- a/docs/PUSH-TO-TALK-DESIGN.md +++ b/docs/PUSH-TO-TALK-DESIGN.md @@ -13,9 +13,11 @@ The "smart" part is that PTT is not a separate mode the user must choose. It is |---|---| | DM, peer connected/reachable on mesh | **Live stream** (Noise-encrypted frames) + finalized voice note for reliability | | DM, peer only reachable via Nostr | Existing voice-note recording only (no live; media doesn't ride Nostr today) | -| Public mesh chat | **Live broadcast stream**, best-effort, no file follow-up | +| Public mesh chat | **Live broadcast stream** (signed) + finalized voice note, same dedup as DMs | | Geohash (Nostr) channels | PTT unavailable (matches existing `canSendMediaInCurrentContext` media policy) | +*(Public originally speced as live-only to avoid doubling bandwidth, but dropping the note broadcast would regress mixed-version meshes — old clients that can't decode live bursts would stop receiving public voice entirely — and late joiners/out-of-range peers would get nothing. The note stays; live receivers absorb it silently.)* + One gesture (hold mic), one mental model ("talk"), and the system degrades from live → reliable-note → unavailable based on what the transport can actually do. **Bandwidth reality check:** the mesh moves ~15 KB/s per link (469 B fragments at 30 ms spacing); our voice codec needs ~2 KB/s. Live voice fits with a wide margin, even relayed. @@ -91,7 +93,7 @@ New `VoiceBurstAssembler` (keyed by sender + burstID) feeding a `PTTBurstPlayer` - **Loss handling:** gap in seq → insert silence for the missing frames (64 ms each) and keep going. No PLC in v1; at these frame sizes brief dropouts are acceptable. - **Burst end:** on `END`, or 3 s with no frames (talker walked out of range). - **Persistence:** frames append to an incoming ADTS `.aac` file (already an allowed `MimeType`), so every burst becomes a replayable voice-note bubble containing whatever was captured — even a partial one. -- **Dedup with the finalized note (DM):** when a `fileTransfer` arrives whose fileName carries a burstID we already assembled, it silently *replaces* the partial file behind the existing bubble (no new message row, no second notification). Receivers that heard everything live just get a lossless copy. +- **Dedup with the finalized note:** when a `fileTransfer` arrives whose fileName carries a burstID we already assembled (DM or public), it silently *replaces* the partial file behind the existing bubble (no new message row, no second notification). Receivers that heard everything live just get a lossless copy. - **Resource caps:** ≤ 8 concurrent assemblies, ≤ 256 KB per burst (60 s × 2 KB/s + slack), 30 s stale cleanup, and drop inbound frames beyond ~2× realtime per sender (spam/flood guard). ## 6. Playback policy — when does it actually make sound? diff --git a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift index 4ddf5ab1..0ba2730f 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/MessageType.swift @@ -36,6 +36,10 @@ public enum MessageType: UInt8 { // an internet gateway peer. case nostrCarrier = 0x28 + // Live voice: one signed push-to-talk burst packet (ephemeral broadcast, + // never gossip-synced). Private bursts ride noiseEncrypted instead. + case voiceFrame = 0x29 + public var description: String { switch self { case .announce: return "announce" @@ -53,6 +57,7 @@ public enum MessageType: UInt8 { case .ping: return "ping" case .pong: return "pong" case .nostrCarrier: return "nostrCarrier" + case .voiceFrame: return "voiceFrame" } } } From 3e9230229dcf1f90975772426a9d1c20d6d6ba96 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 10:08:23 +0200 Subject: [PATCH 056/158] Heal peer-ID rotation: rebind link on verified announce, retire ghost peer (#1401) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Heal peer-ID rotation: rebind link on verified announce, retire ghost When a peer relaunches it rotates its ephemeral peer ID, but a still-open BLE connection kept its stale peripheral/central→peerID binding for the reachability retention window (~45-60s). Until it aged out, the other side showed a duplicate ghost peer and dropped the rotated peer's direct announces as spoofing attempts. Root cause: the ingress guard rejected a direct announce whose claimed sender differed from the link binding before signature verification could ever see it, so the binding could never heal. - Ingress guard: let a mismatched direct announce through, attributed to the claimed sender; REQUEST_SYNC keeps the strict binding check. - Bind sites: raw (pre-verification) announces may only bind unbound links, never rebind bound ones — rebinding now requires the announce handler's signature verification to pass. - On a verified direct announce whose ingress link is bound to a different peer, rebind the link to the announced ID and retire the rotated-away ID immediately (registry + gossip + UI), mirroring handleLeave. - BLELinkStateStore.bindPeripheral: drop the previous peer's reverse mapping on rebind so the retired ID no longer claims the link. Fixes #1387 Co-Authored-By: Claude Fable 5 * Contain forged-directness rebinds: no identity steal, per-link cooldown The announce signature does not authenticate directness (TTL is excluded from signing because relays mutate it), so a bound peer could replay another peer's fresh signed announce with its TTL restored and reach the rotation rebind path. Contain what such a replay can do: - Refuse a rebind when the claimed identity already owns another live link — a replayed announce can no longer steal a connected peer's binding or route its directed traffic to the replaying link. - Allow at most one rebind per link per cooldown window (60s) so two identities cannot fight over a link in a replay flip-flop, with each flip retiring the other peer. A replay against an identity with no live link remains possible, but that capability already exists today on unbound links, where any raw direct announce binds pre-verification. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- .../Services/BLE/BLEIngressLinkRegistry.swift | 28 +++- bitchat/Services/BLE/BLELinkStateStore.swift | 14 +- bitchat/Services/BLE/BLEService.swift | 136 ++++++++++++++++-- bitchat/Services/TransportConfig.swift | 4 + bitchatTests/BLEServiceCoreTests.swift | 124 +++++++++++++++- .../BLEIngressLinkRegistryTests.swift | 33 ++++- .../Services/BLEIngressPacketGuardTests.swift | 44 +++++- 7 files changed, 358 insertions(+), 25 deletions(-) diff --git a/bitchat/Services/BLE/BLEIngressLinkRegistry.swift b/bitchat/Services/BLE/BLEIngressLinkRegistry.swift index 442ba0d2..970921b1 100644 --- a/bitchat/Services/BLE/BLEIngressLinkRegistry.swift +++ b/bitchat/Services/BLE/BLEIngressLinkRegistry.swift @@ -78,10 +78,21 @@ struct BLEIngressLinkRegistry { return .failure(.selfLoopback(packetType: packet.type)) } - if let boundPeerID, - boundPeerID != claimedSenderID, - requiresDirectSenderBinding(packet, directAnnounceTTL: directAnnounceTTL) { - return .failure(.directSenderMismatch(boundPeerID: boundPeerID, claimedSenderID: claimedSenderID)) + if let boundPeerID, boundPeerID != claimedSenderID { + if requiresDirectSenderBinding(packet) { + return .failure(.directSenderMismatch(boundPeerID: boundPeerID, claimedSenderID: claimedSenderID)) + } + // A direct announce claiming a new sender on a bound link is either + // a spoof or a legitimate peer-ID rotation on a connection that + // outlived the old ID. Attribute it to the claimed sender and let + // it through: announces are self-authenticating, and only a + // signature-verified announce may rebind the link (BLEService). + if isDirectAnnounce(packet, directAnnounceTTL: directAnnounceTTL) { + return .success(BLEIngressPacketContext( + receivedFromPeerID: claimedSenderID, + validationPeerID: claimedSenderID + )) + } } let receivedFromPeerID = boundPeerID ?? claimedSenderID @@ -98,12 +109,15 @@ struct BLEIngressLinkRegistry { return "\(senderID)-\(packet.timestamp)-\(packet.type)-\(digestPrefix)" } - private static func requiresDirectSenderBinding(_ packet: BitchatPacket, directAnnounceTTL: UInt8) -> Bool { + private static func requiresDirectSenderBinding(_ packet: BitchatPacket) -> Bool { // REQUEST_SYNC is never relayed, so on a bound link the claimed sender // must be the link peer — it elicits a full store replay, and the // response is addressed to whoever the sender claims to be. - if packet.type == MessageType.requestSync.rawValue { return true } - return packet.type == MessageType.announce.rawValue && packet.ttl == directAnnounceTTL + packet.type == MessageType.requestSync.rawValue + } + + static func isDirectAnnounce(_ packet: BitchatPacket, directAnnounceTTL: UInt8) -> Bool { + packet.type == MessageType.announce.rawValue && packet.ttl == directAnnounceTTL } private static func isSelfAuthoredSyncResponse(_ packet: BitchatPacket) -> Bool { diff --git a/bitchat/Services/BLE/BLELinkStateStore.swift b/bitchat/Services/BLE/BLELinkStateStore.swift index 54fad9b9..cbb75fa2 100644 --- a/bitchat/Services/BLE/BLELinkStateStore.swift +++ b/bitchat/Services/BLE/BLELinkStateStore.swift @@ -203,9 +203,19 @@ final class BLELinkStateStore { func bindPeripheral(_ peripheralUUID: String, to peerID: PeerID) { assertOwned() - if updatePeripheral(peripheralUUID, { $0.peerID = peerID }) != nil { - peerToPeripheralUUID[peerID] = peripheralUUID + var previousPeerID: PeerID? + let updated = updatePeripheral(peripheralUUID) { + previousPeerID = $0.peerID + $0.peerID = peerID } + guard updated != nil else { return } + // Rebinding (peer-ID rotation): drop the retired ID's reverse mapping + // so the old peer no longer claims this link. + if let previousPeerID, previousPeerID != peerID, + peerToPeripheralUUID[previousPeerID] == peripheralUUID { + peerToPeripheralUUID.removeValue(forKey: previousPeerID) + } + peerToPeripheralUUID[peerID] = peripheralUUID } func removePeripheral(_ peripheralID: String) -> PeerID? { diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 412e4e32..b4b5aaea 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -38,6 +38,10 @@ final class BLEService: NSObject { // 1. Consolidated BLE link tracking for both central and peripheral roles. private var linkStateStore = BLELinkStateStore() + // Rotation-rebind cooldown per link UUID (bleQueue-owned, like the link + // store): entries older than the cooldown are pruned on insert. + private var lastLinkRebindAt: [String: Date] = [:] + // BCH-01-004: Rate-limiting for subscription-triggered announces. private var subscriptionAnnounceLimiter = BLESubscriptionAnnounceLimiter() @@ -1972,6 +1976,28 @@ extension BLEService { recordIngressIfNew(packet, link: .central(linkID), peerID: PeerID(hexData: packet.senderID)) } + func _test_bindCentral(_ centralUUID: String, to peerID: PeerID) { + bleQueue.sync { linkStateStore.bindCentral(centralUUID, to: peerID) } + } + + func _test_centralBinding(_ centralUUID: String) -> PeerID? { + bleQueue.sync { linkStateStore.peerID(forCentralUUID: centralUUID) } + } + + func _test_seedConnectedPeer(_ peerID: PeerID, nickname: String) { + collectionsQueue.sync(flags: .barrier) { + peerRegistry.upsert(BLEPeerInfo( + peerID: peerID, + nickname: nickname, + isConnected: true, + noisePublicKey: nil, + signingPublicKey: nil, + isVerifiedNickname: true, + lastSeen: Date() + )) + } + } + static func _test_shouldRediscoverBitChatService( invalidatedServiceUUIDs: [CBUUID], cachedServiceUUIDs: [CBUUID]? @@ -2152,16 +2178,20 @@ extension BLEService: CBPeripheralDelegate { SecureLogger.debug("📦 Decoded notification packet type: \(packet.type) from sender: \(senderID.id.prefix(8))…", category: .session) } - if packet.type == MessageType.announce.rawValue { - if packet.ttl == messageTTL { + if packet.type == MessageType.announce.rawValue, + packet.ttl == messageTTL { + // Only bind an unbound link here: this runs before signature + // verification, so a bound link must not be re-bound by a raw + // announce (spoofable). Rotation rebinds happen after the announce + // verifies (rebindLinkAfterVerifiedDirectAnnounce). + let boundPeerID = linkStateStore.peerID(forPeripheralID: peripheralUUID) + if boundPeerID == nil || boundPeerID == senderID { linkStateStore.bindPeripheral(peripheralUUID, to: senderID) refreshLocalTopology() } - - handleReceivedPacket(packet, from: peerID) - } else { - handleReceivedPacket(packet, from: peerID) } + + handleReceivedPacket(packet, from: peerID) } func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) { @@ -2523,8 +2553,13 @@ extension BLEService: CBPeripheralManagerDelegate { if packet.type == MessageType.announce.rawValue, packet.ttl == messageTTL { - linkStateStore.bindCentral(centralUUID, to: claimedSenderID) - refreshLocalTopology() + // Same rule as the peripheral path: raw announces only bind + // unbound links; rotation rebinds require a verified announce. + let boundPeerID = linkStateStore.peerID(forCentralUUID: centralUUID) + if boundPeerID == nil || boundPeerID == claimedSenderID { + linkStateStore.bindCentral(centralUUID, to: claimedSenderID) + refreshLocalTopology() + } } guard recordIngressIfNew(packet, link: .central(centralUUID), peerID: context.receivedFromPeerID) else { @@ -4096,6 +4131,12 @@ extension BLEService { drainPendingPrekeyBundles(for: result.peerID) } + // A verified direct announce proves the sender owns the link it came + // in on: heal any stale binding left by a peer-ID rotation. + if let result, result.isVerified, result.isDirectAnnounce { + rebindLinkAfterVerifiedDirectAnnounce(packet, to: result.peerID) + } + // Courier work: an announce is the moment we learn a peer's Noise // static key, so check whether we're carrying mail addressed to them // (or spray-able mail they could carry). Verified announces only. @@ -4115,6 +4156,85 @@ extension BLEService { } } + /// When a peer relaunches it rotates its ephemeral peer ID, but an + /// already-open BLE connection keeps its old peripheral/central→peerID + /// binding. Until that binding heals, the rotated peer shows up twice in + /// the peer list and its directed traffic on this link is dropped as + /// spoofed. A signature-verified direct announce proves the claimed + /// sender owns the link it arrived on, so rebind the link to the new ID + /// and retire the old identity. + private func rebindLinkAfterVerifiedDirectAnnounce(_ packet: BitchatPacket, to peerID: PeerID) { + guard let link = (collectionsQueue.sync { ingressLinks.link(for: packet) }) else { return } + bleQueue.async { [weak self] in + guard let self else { return } + let linkUUID: String + let previousPeerID: PeerID? + switch link { + case .peripheral(let peripheralUUID): + linkUUID = peripheralUUID + previousPeerID = self.linkStateStore.peerID(forPeripheralID: peripheralUUID) + case .central(let centralUUID): + linkUUID = centralUUID + previousPeerID = self.linkStateStore.peerID(forCentralUUID: centralUUID) + } + guard let previousPeerID, previousPeerID != peerID else { return } + + // The signature does not authenticate directness (TTL is excluded + // from signing because relays mutate it), so a "verified direct" + // announce can be a replay of another peer's fresh announce with + // its TTL restored. Contain what a forged rebind could do: + // never steal an identity another live link already owns, and + // allow at most one rebind per link per cooldown window so two + // identities can't fight over a link in a replay flip-flop. + guard self.linkStateStore.links(to: peerID).isEmpty else { + SecureLogger.warning("🚫 Refusing link rebind to \(peerID.id.prefix(8))…: identity already owns another live link", category: .security) + return + } + let now = Date() + self.lastLinkRebindAt = self.lastLinkRebindAt.filter { + now.timeIntervalSince($0.value) < TransportConfig.bleLinkRebindCooldownSeconds + } + guard self.lastLinkRebindAt[linkUUID] == nil else { + SecureLogger.warning("🚫 Refusing link rebind to \(peerID.id.prefix(8))…: rebind cooldown active for this link", category: .security) + return + } + self.lastLinkRebindAt[linkUUID] = now + + switch link { + case .peripheral(let peripheralUUID): + self.linkStateStore.bindPeripheral(peripheralUUID, to: peerID) + case .central(let centralUUID): + self.linkStateStore.bindCentral(centralUUID, to: peerID) + } + SecureLogger.debug("🔄 Rebinding link after peer-ID rotation: \(previousPeerID.id.prefix(8))… → \(peerID.id.prefix(8))…", category: .session) + self.refreshLocalTopology() + // Retire the rotated-away ID only once its last link is gone; a + // remaining stale link heals the same way or ages out. + guard self.linkStateStore.links(to: previousPeerID).isEmpty else { return } + self.messageQueue.async { [weak self] in + self?.retireRotatedPeer(previousPeerID) + } + } + } + + /// Rotation is an implicit leave of the old identity: drop it immediately + /// instead of letting a ghost duplicate linger for the reachability + /// retention window. + private func retireRotatedPeer(_ peerID: PeerID) { + let removed = collectionsQueue.sync(flags: .barrier) { + peerRegistry.remove(peerID) != nil + } + guard removed else { return } + gossipSyncManager?.removeAnnouncementForPeer(peerID) + refreshLocalTopology() + notifyUI { [weak self] in + guard let self else { return } + let currentPeerIDs = self.collectionsQueue.sync { self.peerRegistry.peerIDs } + self.deliverTransportEvent(.peerDisconnected(peerID)) + self.deliverTransportEvent(.peerListUpdated(currentPeerIDs)) + } + } + /// Builds the announce handler environment. All queue hops stay here so /// `BLEAnnounceHandler` remains queue-agnostic and synchronously testable. private func makeAnnounceHandlerEnvironment() -> BLEAnnounceHandlerEnvironment { diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index bf8c0270..b9603564 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -137,6 +137,10 @@ enum TransportConfig { static let bleReachabilityRetentionUnverifiedSeconds: TimeInterval = 45.0 // unknown/unverified static let bleFragmentLifetimeSeconds: TimeInterval = 30.0 static let bleIngressRecordLifetimeSeconds: TimeInterval = 3.0 + // At most one rotation rebind per link per window: TTL is not signed, so + // a replayed announce can forge "direct", and without a cooldown two + // identities could fight over a link in a rebind flip-flop. + static let bleLinkRebindCooldownSeconds: TimeInterval = 60.0 static let bleConnectTimeoutBackoffWindowSeconds: TimeInterval = 120.0 static let bleRecentPacketWindowSeconds: TimeInterval = 30.0 static let bleRecentPacketWindowMaxCount: Int = 100 diff --git a/bitchatTests/BLEServiceCoreTests.swift b/bitchatTests/BLEServiceCoreTests.swift index 6a9cdfc1..3da4a700 100644 --- a/bitchatTests/BLEServiceCoreTests.swift +++ b/bitchatTests/BLEServiceCoreTests.swift @@ -114,7 +114,9 @@ struct BLEServiceCoreTests { } @Test - func ingressRejectsDirectAnnounceThatConflictsWithBoundLink() async throws { + func ingressAllowsDirectAnnounceThatConflictsWithBoundLink() async throws { + // Peer-ID rotation heal: the announce must reach signature + // verification, which decides whether the link rebinds. let ble = makeService() let boundPeer = PeerID(str: "1122334455667788") let claimedPeer = PeerID(str: "8899aabbccddeeff") @@ -128,9 +130,129 @@ struct BLEServiceCoreTests { ttl: 7 ) + #expect(ble._test_acceptsIngress(packet: packet, boundPeerID: boundPeer)) + } + + @Test + func ingressRejectsRequestSyncThatConflictsWithBoundLink() async throws { + let ble = makeService() + let boundPeer = PeerID(str: "1122334455667788") + let claimedPeer = PeerID(str: "8899aabbccddeeff") + let packet = BitchatPacket( + type: MessageType.requestSync.rawValue, + senderID: Data(hexString: claimedPeer.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: Data(), + signature: nil, + ttl: 0 + ) + #expect(!ble._test_acceptsIngress(packet: packet, boundPeerID: boundPeer)) } + @Test + func verifiedDirectAnnounceRebindsRotatedLinkAndRetiresOldPeer() async throws { + let ble = makeService() + let oldPeerID = PeerID(str: "1122334455667788") + let centralUUID = "central-rotation" + + // A connected peer whose link binding predates its relaunch. + ble._test_seedConnectedPeer(oldPeerID, nickname: "alice") + ble._test_bindCentral(centralUUID, to: oldPeerID) + + // The relaunched device re-announces its rotated identity over the + // still-open link. + let signer = NoiseEncryptionService(keychain: MockKeychain()) + let announcement = AnnouncementPacket( + nickname: "alice", + noisePublicKey: signer.getStaticPublicKeyData(), + signingPublicKey: signer.getSigningPublicKeyData(), + directNeighbors: nil + ) + let payload = try #require(announcement.encode(), "Failed to encode announcement") + let newPeerID = PeerID(publicKey: announcement.noisePublicKey) + let unsigned = BitchatPacket( + type: MessageType.announce.rawValue, + senderID: Data(hexString: newPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: 7 + ) + let packet = try #require(signer.signPacket(unsigned), "Failed to sign announce packet") + + #expect(ble._test_recordIngressIfNew(packet: packet, linkID: centralUUID)) + ble._test_handlePacket(packet, fromPeerID: newPeerID, preseedPeer: false) + + let rebound = await TestHelpers.waitUntil( + { ble._test_centralBinding(centralUUID) == newPeerID }, + timeout: TestConstants.defaultTimeout + ) + #expect(rebound) + + let retired = await TestHelpers.waitUntil( + { + let peerIDs = ble.currentPeerSnapshots().map(\.peerID) + return peerIDs.contains(newPeerID) && !peerIDs.contains(oldPeerID) + }, + timeout: TestConstants.defaultTimeout + ) + #expect(retired) + } + + @Test + func replayedDirectAnnounceCannotStealBoundIdentity() async throws { + let ble = makeService() + let attackerPeerID = PeerID(str: "1122334455667788") + let victimLink = "central-victim" + let attackerLink = "central-attacker" + + // The victim's identity, genuinely bound on its own link. + let victimSigner = NoiseEncryptionService(keychain: MockKeychain()) + let announcement = AnnouncementPacket( + nickname: "victim", + noisePublicKey: victimSigner.getStaticPublicKeyData(), + signingPublicKey: victimSigner.getSigningPublicKeyData(), + directNeighbors: nil + ) + let payload = try #require(announcement.encode(), "Failed to encode announcement") + let victimPeerID = PeerID(publicKey: announcement.noisePublicKey) + ble._test_seedConnectedPeer(victimPeerID, nickname: "victim") + ble._test_bindCentral(victimLink, to: victimPeerID) + ble._test_seedConnectedPeer(attackerPeerID, nickname: "attacker") + ble._test_bindCentral(attackerLink, to: attackerPeerID) + + // The victim's fresh signed announce replayed on the attacker's bound + // link with its direct TTL restored (TTL is excluded from signing, so + // the signature still verifies). + let unsigned = BitchatPacket( + type: MessageType.announce.rawValue, + senderID: Data(hexString: victimPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: 7 + ) + let packet = try #require(victimSigner.signPacket(unsigned), "Failed to sign announce packet") + + #expect(ble._test_recordIngressIfNew(packet: packet, linkID: attackerLink)) + ble._test_handlePacket(packet, fromPeerID: victimPeerID, preseedPeer: false) + + // The rebind must be refused: the identity already owns a live link. + let stolen = await TestHelpers.waitUntil( + { ble._test_centralBinding(attackerLink) == victimPeerID }, + timeout: 0.3 + ) + #expect(!stolen) + #expect(ble._test_centralBinding(attackerLink) == attackerPeerID) + #expect(ble._test_centralBinding(victimLink) == victimPeerID) + // And the replay must not retire the link's real bound peer. + #expect(ble.currentPeerSnapshots().map(\.peerID).contains(attackerPeerID)) + } + @Test func ingressRejectsSelfLoopbackBeforeSpoofChecks() async throws { let ble = makeService() diff --git a/bitchatTests/Services/BLEIngressLinkRegistryTests.swift b/bitchatTests/Services/BLEIngressLinkRegistryTests.swift index 75550bc5..40532d19 100644 --- a/bitchatTests/Services/BLEIngressLinkRegistryTests.swift +++ b/bitchatTests/Services/BLEIngressLinkRegistryTests.swift @@ -88,21 +88,46 @@ struct BLEIngressLinkRegistryTests { } @Test - func packetContextRejectsDirectAnnounceMismatchOnBoundLink() { + func packetContextAttributesDirectAnnounceMismatchToClaimedSender() throws { + // A rotated peer re-announces its new ID on a link still bound to the + // old one. The announce must flow through (attributed to the claimed + // sender) so signature verification can decide whether to rebind. let localPeer = PeerID(str: "0011223344556677") let boundPeer = PeerID(str: "1122334455667788") let claimedPeer = PeerID(str: "8899aabbccddeeff") let packet = makeAnnouncePacket(sender: claimedPeer, ttl: 7) - let result = BLEIngressLinkRegistry.packetContext( + let context = try #require(trySuccess(BLEIngressLinkRegistry.packetContext( for: packet, claimedSenderID: claimedPeer, boundPeerID: boundPeer, localPeerID: localPeer, directAnnounceTTL: 7 - ) + ))) - #expect(result == .failure(.directSenderMismatch(boundPeerID: boundPeer, claimedSenderID: claimedPeer))) + #expect(context.receivedFromPeerID == claimedPeer) + #expect(context.validationPeerID == claimedPeer) + } + + @Test + func packetContextAttributesRelayedAnnounceMismatchToBoundPeer() throws { + // Relayed announces (ttl below direct) keep relayed attribution: the + // link peer forwarded someone else's announce. + let localPeer = PeerID(str: "0011223344556677") + let boundPeer = PeerID(str: "1122334455667788") + let claimedPeer = PeerID(str: "8899aabbccddeeff") + let packet = makeAnnouncePacket(sender: claimedPeer, ttl: 6) + + let context = try #require(trySuccess(BLEIngressLinkRegistry.packetContext( + for: packet, + claimedSenderID: claimedPeer, + boundPeerID: boundPeer, + localPeerID: localPeer, + directAnnounceTTL: 7 + ))) + + #expect(context.receivedFromPeerID == boundPeer) + #expect(context.validationPeerID == claimedPeer) } @Test diff --git a/bitchatTests/Services/BLEIngressPacketGuardTests.swift b/bitchatTests/Services/BLEIngressPacketGuardTests.swift index 754bc585..0d07ec1b 100644 --- a/bitchatTests/Services/BLEIngressPacketGuardTests.swift +++ b/bitchatTests/Services/BLEIngressPacketGuardTests.swift @@ -26,13 +26,13 @@ struct BLEIngressPacketGuardTests { #expect(context.validationPeerID == sender) } - @Test("self loopback and direct announce spoofing are rejected before timestamp checks") + @Test("self loopback and request-sync spoofing are rejected before timestamp checks") func linkBindingRejectionsWinBeforeTimestampChecks() { let local = PeerID(str: "0011223344556677") let bound = PeerID(str: "1122334455667788") let claimed = PeerID(str: "8899aabbccddeeff") let selfPacket = makePacket(sender: local, timestamp: 0) - let spoofedAnnounce = makePacket(type: .announce, sender: claimed, timestamp: 0, ttl: 7) + let spoofedRequestSync = makePacket(type: .requestSync, sender: claimed, timestamp: 0, ttl: 0) let selfResult = BLEIngressPacketGuard.evaluate( packet: selfPacket, @@ -44,7 +44,7 @@ struct BLEIngressPacketGuardTests { isValidSyncResponse: { _ in false } ) let spoofResult = BLEIngressPacketGuard.evaluate( - packet: spoofedAnnounce, + packet: spoofedRequestSync, claimedSenderID: claimed, boundPeerID: bound, localPeerID: local, @@ -57,6 +57,44 @@ struct BLEIngressPacketGuardTests { #expect(spoofResult == .failure(.directSenderMismatch(boundPeerID: bound, claimedSenderID: claimed))) } + @Test("direct announce with a mismatched binding flows through to normal validation") + func directAnnounceMismatchStillValidatesTimestamp() throws { + // Rotation heal path: the announce passes the binding check attributed + // to the claimed sender, but stays subject to timestamp validation. + let local = PeerID(str: "0011223344556677") + let bound = PeerID(str: "1122334455667788") + let claimed = PeerID(str: "8899aabbccddeeff") + let freshAnnounce = makePacket(type: .announce, sender: claimed, timestamp: 1_000_000, ttl: 7) + let staleAnnounce = makePacket(type: .announce, sender: claimed, timestamp: 0, ttl: 7) + + let freshContext = try #require(success(BLEIngressPacketGuard.evaluate( + packet: freshAnnounce, + claimedSenderID: claimed, + boundPeerID: bound, + localPeerID: local, + directAnnounceTTL: 7, + nowMs: 1_000_000, + isValidSyncResponse: { _ in false } + ))) + let staleResult = BLEIngressPacketGuard.evaluate( + packet: staleAnnounce, + claimedSenderID: claimed, + boundPeerID: bound, + localPeerID: local, + directAnnounceTTL: 7, + nowMs: 1_000_000, + isValidSyncResponse: { _ in false } + ) + + #expect(freshContext.receivedFromPeerID == claimed) + #expect(freshContext.validationPeerID == claimed) + #expect(staleResult == .failure(.timestampSkew( + peerID: claimed, + skewMs: 1_000_000, + maxSkewMs: 120_000 + ))) + } + @Test("timestamp skew outside the window is rejected") func timestampSkewIsRejected() { let local = PeerID(str: "0011223344556677") From 35fb9fdd42617fe7f232ffc39bea6ae87004446f Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 10:08:36 +0200 Subject: [PATCH 057/158] Fix received DM images stuck as grey box: stamp incoming media delivered, reveal tap as Button (#1402) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make image tap-to-reveal a Button so the DM sheet can't swallow it Received images in a DM rendered as a grey "tap to reveal" box that never revealed: the DM sheet wraps the whole conversation in a high-priority swipe-to-close DragGesture (ContentSheetViews), and an ancestor high-priority gesture starves descendant TapGestures — the image's reveal/open tap never fired. Button actions survive that suppression (the sheet's own header buttons work for the same reason), so the tap now lives on a plain-style Button wrapping the image; swipe-to-hide stays attached as a simultaneous gesture. Fixes #1388 Co-Authored-By: Claude Fable 5 * Move the cancel control out of the reveal Button Nested buttons don't get reliable independent hit testing, and the outer reveal tap is a no-op while sending, so the in-flight cancel x could become untappable. The cancel overlay now sits on the Button rather than inside its label. Co-Authored-By: Claude Fable 5 * Root cause: received media stuck in .sending — grey box, dead tap Field testing showed the Button conversion alone didn't fix #1388: a received DM image still rendered as a flat grey box with a dead tap. The real culprit is BitchatMessage's initializer, which defaults every private message without an explicit status to `.sending`. BLEFileTransferHandler built incoming media messages without one, so every received private image/voice note was permanently "sending": mediaSendState returned progress 0 → BlockRevealMask rendered 0% of the image (the flat grey box is the blur overlay over an empty mask), and the reveal tap was disabled by the isSending guard — regardless of which gesture carried it. Two layers: - BLEFileTransferHandler now stamps incoming private media `.delivered(to: , at: )`, matching the received-text path in ChatPrivateConversationCoordinator. - MediaMessageView treats received messages as never-sending, so no other construction path can reproduce the grey-box state. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- .../Services/BLE/BLEFileTransferHandler.swift | 8 +- .../Views/Media/BlockRevealImageView.swift | 143 ++++++++++-------- bitchat/Views/Media/MediaMessageView.swift | 8 +- .../BLEFileTransferHandlerTests.swift | 5 + 4 files changed, 97 insertions(+), 67 deletions(-) diff --git a/bitchat/Services/BLE/BLEFileTransferHandler.swift b/bitchat/Services/BLE/BLEFileTransferHandler.swift index 43d13aa9..177741f8 100644 --- a/bitchat/Services/BLE/BLEFileTransferHandler.swift +++ b/bitchat/Services/BLE/BLEFileTransferHandler.swift @@ -113,7 +113,13 @@ final class BLEFileTransferHandler { originalSender: nil, isPrivate: deliveryPlan.isPrivateMessage, recipientNickname: nil, - senderPeerID: peerID + senderPeerID: peerID, + // Received messages need an explicit status: BitchatMessage + // defaults private messages to .sending, which the media views + // render as an in-flight send (empty reveal mask, disabled tap). + deliveryStatus: deliveryPlan.isPrivateMessage + ? .delivered(to: env.localNickname(), at: ts) + : nil ) SecureLogger.debug("📁 Stored incoming media from \(peerID.id.prefix(8))… -> \(destination.lastPathComponent)", category: .session) diff --git a/bitchat/Views/Media/BlockRevealImageView.swift b/bitchat/Views/Media/BlockRevealImageView.swift index 8e5d8bd2..01b5d8cb 100644 --- a/bitchat/Views/Media/BlockRevealImageView.swift +++ b/bitchat/Views/Media/BlockRevealImageView.swift @@ -65,58 +65,19 @@ struct BlockRevealImageView: View { } var body: some View { - ZStack(alignment: .topTrailing) { - if let image = platformImage { - Image(platformImage: image) - .resizable() - .aspectRatio(aspectRatio, contentMode: .fit) - .clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous)) - .overlay( - RoundedRectangle(cornerRadius: 16, style: .continuous) - .stroke(Color.gray.opacity(0.2), lineWidth: 1) - ) - .mask( - BlockRevealMask( - fraction: fraction, - columns: 24, - rows: 16 - ) - .animation(.easeOut(duration: 0.2), value: fraction) - ) - .blur(radius: isBlurred ? 20 : 0) - .overlay { - if isBlurred { - RoundedRectangle(cornerRadius: 16, style: .continuous) - .fill(Color.black.opacity(0.35)) - .overlay( - VStack(spacing: 6) { - Image(systemName: "eye.slash.fill") - .font(.bitchatSystem(size: 24, weight: .semibold)) - Text(verbatim: Strings.tapToReveal) - // Themed: monospaced under matrix, - // system under liquid glass. - .bitchatFont(size: 12, weight: .medium) - } - .foregroundColor(.white.opacity(0.85)) - ) - } - } - } else { - RoundedRectangle(cornerRadius: 16, style: .continuous) - .fill(palette.secondary.opacity(0.2)) - .frame(height: 200) - .overlay { - if loadFailed { - Image(systemName: "photo") - .font(.bitchatSystem(size: 24, weight: .semibold)) - .foregroundColor(palette.secondary) - } else { - ProgressView() - .progressViewStyle(.circular) - } - } - } - + // The DM sheet wraps the conversation in a high-priority + // swipe-to-close DragGesture (ContentSheetViews). An ancestor + // high-priority gesture starves descendant TapGestures, but Button + // actions still fire — the reveal/open tap must stay a Button or + // received DM images become untappable. + Button(action: handleTap) { + imageContent + } + .buttonStyle(.plain) + // The cancel control must sit outside the Button label: nested + // buttons don't get reliable independent hit testing, and the outer + // tap is a no-op while sending — the x could become untappable. + .overlay(alignment: .topTrailing) { if let onCancel = onCancel, isSending { Button(action: onCancel) { Image(systemName: "xmark") @@ -130,6 +91,7 @@ struct BlockRevealImageView: View { .accessibilityLabel(Strings.cancelSend) } } + .simultaneousGesture(hideSwipe) .onAppear { isBlurred = initiallyBlurred loadImage() @@ -138,7 +100,6 @@ struct BlockRevealImageView: View { isBlurred = initiallyBlurred loadImage() } - .gesture(mainGesture) .contextMenu { if isSending { cancelSendAction @@ -173,6 +134,60 @@ struct BlockRevealImageView: View { } } + @ViewBuilder + private var imageContent: some View { + if let image = platformImage { + Image(platformImage: image) + .resizable() + .aspectRatio(aspectRatio, contentMode: .fit) + .clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .stroke(Color.gray.opacity(0.2), lineWidth: 1) + ) + .mask( + BlockRevealMask( + fraction: fraction, + columns: 24, + rows: 16 + ) + .animation(.easeOut(duration: 0.2), value: fraction) + ) + .blur(radius: isBlurred ? 20 : 0) + .overlay { + if isBlurred { + RoundedRectangle(cornerRadius: 16, style: .continuous) + .fill(Color.black.opacity(0.35)) + .overlay( + VStack(spacing: 6) { + Image(systemName: "eye.slash.fill") + .font(.bitchatSystem(size: 24, weight: .semibold)) + Text(verbatim: Strings.tapToReveal) + // Themed: monospaced under matrix, + // system under liquid glass. + .bitchatFont(size: 12, weight: .medium) + } + .foregroundColor(.white.opacity(0.85)) + ) + } + } + } else { + RoundedRectangle(cornerRadius: 16, style: .continuous) + .fill(palette.secondary.opacity(0.2)) + .frame(height: 200) + .overlay { + if loadFailed { + Image(systemName: "photo") + .font(.bitchatSystem(size: 24, weight: .semibold)) + .foregroundColor(palette.secondary) + } else { + ProgressView() + .progressViewStyle(.circular) + } + } + } + } + @ViewBuilder private var cancelSendAction: some View { if let onCancel { @@ -235,18 +250,19 @@ struct BlockRevealImageView: View { // photo gesture on mobile, racing the reveal tap, with no confirmation // and no way to get the file back. Delete now lives in the context menu // behind a confirmation; taps only reveal and open. - private var mainGesture: some Gesture { - let singleTap = TapGesture().onEnded { - guard !isSending, !loadFailed else { return } - if isBlurred { - withAnimation(.easeOut(duration: 0.2)) { - isBlurred = false - } - } else { - onOpen?() + private func handleTap() { + guard !isSending, !loadFailed else { return } + if isBlurred { + withAnimation(.easeOut(duration: 0.2)) { + isBlurred = false } + } else { + onOpen?() } - let swipe = DragGesture(minimumDistance: 20, coordinateSpace: .local).onEnded { value in + } + + private var hideSwipe: some Gesture { + DragGesture(minimumDistance: 20, coordinateSpace: .local).onEnded { value in guard !isSending, !loadFailed else { return } let horizontal = value.translation.width let vertical = value.translation.height @@ -257,7 +273,6 @@ struct BlockRevealImageView: View { } } } - return singleTap.simultaneously(with: swipe) } } diff --git a/bitchat/Views/Media/MediaMessageView.swift b/bitchat/Views/Media/MediaMessageView.swift index 2534aedf..dd3b79b0 100644 --- a/bitchat/Views/Media/MediaMessageView.swift +++ b/bitchat/Views/Media/MediaMessageView.swift @@ -33,8 +33,8 @@ struct MediaMessageView: View { } var body: some View { - let state = mediaSendState(for: deliveryStatus) let isFromMe = conversationUIModel.isMediaMessageFromCurrentUser(message) + let state = mediaSendState(for: deliveryStatus, isFromMe: isFromMe) let cancelAction: (() -> Void)? = state.canCancel ? { conversationUIModel.cancelMediaSend(messageID: message.id) } : nil // Baseline alignment (via the header text inside the VStack) keeps the @@ -127,7 +127,11 @@ struct MediaMessageView: View { } } - private func mediaSendState(for deliveryStatus: DeliveryStatus?) -> (isSending: Bool, progress: Double?, canCancel: Bool) { + private func mediaSendState(for deliveryStatus: DeliveryStatus?, isFromMe: Bool) -> (isSending: Bool, progress: Double?, canCancel: Bool) { + // A received message is never in a send state: BitchatMessage defaults + // private messages to .sending, so an incoming message's status must + // not drive the reveal mask or disable the reveal tap. + guard isFromMe else { return (false, nil, false) } var isSending = false var progress: Double? if let status = deliveryStatus { diff --git a/bitchatTests/Services/BLEFileTransferHandlerTests.swift b/bitchatTests/Services/BLEFileTransferHandlerTests.swift index 518c97c0..2e3d2450 100644 --- a/bitchatTests/Services/BLEFileTransferHandlerTests.swift +++ b/bitchatTests/Services/BLEFileTransferHandlerTests.swift @@ -77,6 +77,7 @@ struct BLEFileTransferHandlerTests { #expect(message?.isPrivate == false) #expect(message?.senderPeerID == remotePeerID) #expect(message?.timestamp == Date(timeIntervalSince1970: 900)) + #expect(message?.deliveryStatus == nil) } @Test @@ -157,6 +158,10 @@ struct BLEFileTransferHandlerTests { #expect(recorder.lastSeenUpdates == [remotePeerID]) #expect(recorder.deliveredMessages.count == 1) #expect(recorder.deliveredMessages.first?.isPrivate == true) + // Must be explicit: BitchatMessage defaults private messages to + // .sending, which the media views render as an in-flight send + // (empty reveal mask, disabled reveal tap). + #expect(recorder.deliveredMessages.first?.deliveryStatus == .delivered(to: "Me", at: Date(timeIntervalSince1970: 900))) } @Test From d5cf64f99e3d7aa30361ca34cede06606f82f42c Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 11:07:40 +0200 Subject: [PATCH 058/158] Require signed sender for broadcast file transfers (#1406 follow-up) (#1407) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Require signed sender for broadcast file transfers (#1406 follow-up) Broadcast file transfers trusted the packet's claimed senderID whenever the peer was merely connected (resolveKnownPeer allowConnectedUnverified: true), unlike public messages and public voice frames, which both require a valid packet signature from the claimed sender. Codex flagged the consequence on PR #1406: a peer that observed a public voice burst could broadcast a spoofed voice_.m4a note under the talker's senderID, and ChatLiveVoiceCoordinator.absorbFinalizedVoiceNote would replace the signature-verified live bubble with attacker audio (senderPeerID + scope were the only bindings, both attacker-forgeable on this path). Bring broadcast file transfers up to the same bar as public messages: verify the packet signature against the registry signing key, falling back to the persisted-identity signature lookup, before trusting the sender. Directed (private) transfers keep the lenient connected-peer path — they are addressed to us specifically and carry no broadcast exposure. Co-Authored-By: Claude Opus 4.8 * Exempt self broadcasts from the file-transfer signature gate Review of #1407 caught a regression: our own broadcast files replayed via gossip sync arrive with ttl==0 (so isSelfEcho does not drop them) and cannot be verified against the peer registry or identity cache, so the new broadcast signature guard would drop them. Mirror BLEPublicMessageHandler's self exemption — self packets are trivially authentic — and add a regression test. Co-Authored-By: Claude Opus 4.8 * Stop relaying broadcast file packets that fail sender authentication Codex review on #1407: the new signature gate dropped spoofed broadcast files locally, but BLEService's .fileTransfer case still fell through to scheduleRelayIfNeeded, so a forged file kept propagating to downstream (possibly older, ungated) nodes. Have the handler report failed sender authentication and skip the relay step, like invalid board posts and voice frames. Local-only drops (malformed payload, quota, save failure) and files directed to other peers still relay unchanged. Co-Authored-By: Claude Fable 5 * Fix CI hang: sign the max-size reassembly file transfer, unhang timeouts Both CI runs on #1407 died at the 5-minute watchdog (SIGKILL, exit 137) with the test process fully idle. Root cause was a pair of issues in FragmentationTests: - "Max-sized file transfer survives reassembly" injected an UNSIGNED broadcast file from an unknown peer, which the new broadcast signature gate now drops by design. Sign the packet and preseed the sender's signing key, mirroring the public-message reassembly tests. - CaptureDelegate's wait helpers could never time out: the timeout task threw, but withThrowingTaskGroup then awaited the sibling child that was parked in a non-cancellable withCheckedContinuation, deadlocking the whole run (hang instead of a 5s failure). Resume the parked continuation from a cancellation handler so timeouts now fail fast. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Opus 4.8 --- .../Services/BLE/BLEFileTransferHandler.swift | 98 ++++++++--- bitchat/Services/BLE/BLEService.swift | 10 +- .../Fragmentation/FragmentationTests.swift | 94 ++++++---- .../BLEFileTransferHandlerTests.swift | 165 +++++++++++++++--- 4 files changed, 295 insertions(+), 72 deletions(-) diff --git a/bitchat/Services/BLE/BLEFileTransferHandler.swift b/bitchat/Services/BLE/BLEFileTransferHandler.swift index 177741f8..015a1967 100644 --- a/bitchat/Services/BLE/BLEFileTransferHandler.swift +++ b/bitchat/Services/BLE/BLEFileTransferHandler.swift @@ -14,6 +14,8 @@ struct BLEFileTransferHandlerEnvironment { let localNickname: () -> String /// Snapshot of known peers keyed by ID (registry read). let peersSnapshot: () -> [PeerID: BLEPeerInfo] + /// Verifies a packet's signature against a candidate signing key (registry path). + let verifyPacketSignature: (_ packet: BitchatPacket, _ signingPublicKey: Data) -> Bool /// Resolves a display name from a verified packet signature for peers missing from the registry. let signedSenderDisplayName: (_ packet: BitchatPacket, _ peerID: PeerID) -> String? /// Tracks the broadcast file packet for gossip sync. @@ -44,25 +46,32 @@ final class BLEFileTransferHandler { self.environment = environment } - func handle(_ packet: BitchatPacket, from peerID: PeerID) { + /// Returns `false` when the packet fails sender authentication and must + /// not be relayed onward. Every other outcome returns `true`: files + /// directed to another peer are forwarded untouched, and local-only drops + /// (malformed payload, quota, save failure) don't affect multi-hop + /// delivery to nodes that may handle them fine. + @discardableResult + func handle(_ packet: BitchatPacket, from peerID: PeerID) -> Bool { let env = environment - if BLEFileTransferPolicy.isSelfEcho(packet: packet, from: peerID, localPeerID: env.localPeerID()) { return } - - let peersSnapshot = env.peersSnapshot() - guard let senderNickname = BLEPeerSenderDisplayName.resolveKnownPeer( - peerID: peerID, - localPeerID: env.localPeerID(), - localNickname: env.localNickname(), - peers: peersSnapshot, - allowConnectedUnverified: true - ) ?? env.signedSenderDisplayName(packet, peerID) else { - SecureLogger.warning("🚫 Dropping file transfer from unverified or unknown peer \(peerID.id.prefix(8))…", category: .security) - return - } + if BLEFileTransferPolicy.isSelfEcho(packet: packet, from: peerID, localPeerID: env.localPeerID()) { return true } guard let deliveryPlan = BLEFileTransferPolicy.deliveryPlan(packet: packet, localPeerID: env.localPeerID()) else { - return + return true } + + let peersSnapshot = env.peersSnapshot() + guard let senderNickname = resolveSenderNickname( + packet: packet, + from: peerID, + isBroadcast: !deliveryPlan.isPrivateMessage, + peers: peersSnapshot, + env: env + ) else { + SecureLogger.warning("🚫 Dropping file transfer from unverified or unknown peer \(peerID.id.prefix(8))…", category: .security) + return false + } + if deliveryPlan.shouldTrackForSync { env.trackPacketSeen(packet) } @@ -75,16 +84,16 @@ final class BLEFileTransferHandler { mime = acceptance.mime case .failure(.malformedPayload): SecureLogger.error("❌ Failed to decode file transfer payload", category: .session) - return + return true case .failure(.payloadTooLarge(let bytes)): SecureLogger.warning("🚫 Dropping file transfer exceeding size cap (\(bytes) bytes)", category: .security) - return + return true case .failure(.unsupportedMime(let mimeType, let bytes)): SecureLogger.warning("🚫 MIME REJECT: '\(mimeType ?? "")' not supported. Size=\(bytes)b from \(peerID.id.prefix(8))...", category: .security) - return + return true case .failure(.magicMismatch(let mime, let bytes, let prefixHex)): SecureLogger.warning("🚫 MAGIC REJECT: MIME='\(mime)' size=\(bytes)b prefix=[\(prefixHex)] from \(peerID.id.prefix(8))...", category: .security) - return + return true } // BCH-01-002: Enforce storage quota before saving @@ -97,7 +106,7 @@ final class BLEFileTransferHandler { mime.defaultExtension, mime.category.rawValue ) else { - return + return true } if deliveryPlan.isPrivateMessage { @@ -125,5 +134,54 @@ final class BLEFileTransferHandler { SecureLogger.debug("📁 Stored incoming media from \(peerID.id.prefix(8))… -> \(destination.lastPathComponent)", category: .session) env.deliverMessage(message) + return true + } + + /// Resolves the authenticated display name for a file transfer's sender. + /// + /// Directed (private) transfers are addressed to us specifically and keep + /// the lenient connected-peer path. Broadcast transfers carry an + /// attacker-controllable `senderID` exactly like public messages and public + /// voice frames — registry membership alone is NOT proof of identity, so a + /// valid packet signature from the claimed sender is required before we + /// trust it. Without this, a peer that observed a public voice burst could + /// spoof a broadcast `voice_.m4a` note under the talker's ID and + /// overwrite the signature-verified live bubble with attacker audio. + private func resolveSenderNickname( + packet: BitchatPacket, + from peerID: PeerID, + isBroadcast: Bool, + peers: [PeerID: BLEPeerInfo], + env: BLEFileTransferHandlerEnvironment + ) -> String? { + guard isBroadcast else { + return BLEPeerSenderDisplayName.resolveKnownPeer( + peerID: peerID, + localPeerID: env.localPeerID(), + localNickname: env.localNickname(), + peers: peers, + allowConnectedUnverified: true + ) ?? env.signedSenderDisplayName(packet, peerID) + } + + // Our own broadcasts replayed back via gossip sync (ttl==0) are + // trivially authentic and cannot be verified against the peer registry + // or identity cache, so exempt self exactly as `BLEPublicMessageHandler` + // does. Verify against the signing key already in the + // (synchronously-updated) registry first, then fall back to the + // persisted-identity signature lookup for peers not yet cached there. + let isSelf = peerID == env.localPeerID() + let registrySigningKey = peers[peerID]?.signingPublicKey + let verifiedViaRegistry = !isSelf && (registrySigningKey.map { env.verifyPacketSignature(packet, $0) } ?? false) + let signedDisplayName = (isSelf || verifiedViaRegistry) ? nil : env.signedSenderDisplayName(packet, peerID) + guard isSelf || verifiedViaRegistry || signedDisplayName != nil else { return nil } + + return BLEPeerSenderDisplayName.resolveKnownPeer( + peerID: peerID, + localPeerID: env.localPeerID(), + localNickname: env.localNickname(), + peers: peers, + allowConnectedUnverified: false + ) ?? signedDisplayName } } diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index b4b5aaea..88cb0be2 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -1232,7 +1232,7 @@ final class BLEService: NSObject { return nil } - private func handleFileTransfer(_ packet: BitchatPacket, from peerID: PeerID) { + private func handleFileTransfer(_ packet: BitchatPacket, from peerID: PeerID) -> Bool { fileTransferHandler.handle(packet, from: peerID) } @@ -1251,6 +1251,9 @@ final class BLEService: NSObject { guard let self = self else { return [:] } return self.collectionsQueue.sync { self.peerRegistry.snapshotByID } }, + verifyPacketSignature: { [weak self] packet, signingPublicKey in + self?.noiseService.verifyPacketSignature(packet, publicKey: signingPublicKey) ?? false + }, signedSenderDisplayName: { [weak self] packet, peerID in self?.signedSenderDisplayName(for: packet, from: peerID) }, @@ -4031,7 +4034,10 @@ extension BLEService { handleFragment(packet, from: senderID) case .fileTransfer: - handleFileTransfer(packet, from: senderID) + // Broadcast files that fail sender authentication must not spread + // to downstream (possibly older, ungated) nodes; skip the relay + // step below, like invalid board posts and voice frames. + guard handleFileTransfer(packet, from: senderID) else { return } case .courierEnvelope: handleCourierEnvelope(packet, from: peerID) diff --git a/bitchatTests/Fragmentation/FragmentationTests.swift b/bitchatTests/Fragmentation/FragmentationTests.swift index 53b4f0a7..1052b012 100644 --- a/bitchatTests/Fragmentation/FragmentationTests.swift +++ b/bitchatTests/Fragmentation/FragmentationTests.swift @@ -94,6 +94,11 @@ struct FragmentationTests { let capture = CaptureDelegate() ble.delegate = capture + // Broadcast file transfers must carry a valid sender signature (same + // gate as public messages), so sign the packet and preseed the + // sender's signing key into the registry. + let signer = NoiseEncryptionService(keychain: MockKeychain()) + let signingKey = signer.getSigningPublicKeyData() let remoteID = PeerID(str: "CAFEBABECAFEBABE") let fileContent = Data(repeating: 0x42, count: FileTransferLimits.maxPayloadBytes) let filePacket = BitchatFilePacket( @@ -104,15 +109,18 @@ struct FragmentationTests { ) let encoded = try #require(filePacket.encode(), "File packet encoding failed") - let packet = BitchatPacket( - type: MessageType.fileTransfer.rawValue, - senderID: Data(hexString: remoteID.id) ?? Data(), - recipientID: nil, - timestamp: UInt64(Date().timeIntervalSince1970 * 1000), - payload: encoded, - signature: nil, - ttl: 7, - version: 2 + let packet = try #require( + signer.signPacket(BitchatPacket( + type: MessageType.fileTransfer.rawValue, + senderID: Data(hexString: remoteID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: encoded, + signature: nil, + ttl: 7, + version: 2 + )), + "Failed to sign file transfer packet" ) let fragments = fragmentPacket(packet, fragmentSize: 4096, pad: false) @@ -122,7 +130,7 @@ struct FragmentationTests { if i > 0 { try await Task.sleep(for: .milliseconds(5)) } - ble._test_handlePacket(fragment, fromPeerID: remoteID) + ble._test_handlePacket(fragment, fromPeerID: remoteID, signingPublicKey: signingKey) } try await capture.waitForReceivedMessages(count: 1, timeout: .seconds(5)) @@ -265,19 +273,32 @@ extension FragmentationTests { try await withThrowingTaskGroup(of: Void.self) { group in group.addTask { - await withCheckedContinuation { continuation in - let shouldResumeImmediately = self.withLock { - // Recheck count after acquiring lock to avoid race condition - // where message arrives between initial check and continuation install - if self._publicMessages.count >= count { - return true + // withCheckedContinuation itself is not cancellable, so hook + // group.cancelAll() to resume the parked continuation — + // otherwise a timeout leaves the group awaiting this child + // forever and the test run hangs instead of failing. + await withTaskCancellationHandler { + await withCheckedContinuation { continuation in + let shouldResumeImmediately = self.withLock { + // Recheck count after acquiring lock to avoid race condition + // where message arrives between initial check and continuation install + if self._publicMessages.count >= count { + return true + } + self.publicMessageContinuation = continuation + return false + } + if shouldResumeImmediately { + continuation.resume() } - self.publicMessageContinuation = continuation - return false } - if shouldResumeImmediately { - continuation.resume() + } onCancel: { + let continuation = self.withLock { + let parked = self.publicMessageContinuation + self.publicMessageContinuation = nil + return parked } + continuation?.resume() } } group.addTask { @@ -304,19 +325,32 @@ extension FragmentationTests { try await withThrowingTaskGroup(of: Void.self) { group in group.addTask { - await withCheckedContinuation { continuation in - let shouldResumeImmediately = self.withLock { - // Recheck count after acquiring lock to avoid race condition - // where message arrives between initial check and continuation install - if self._receivedMessages.count >= count { - return true + // withCheckedContinuation itself is not cancellable, so hook + // group.cancelAll() to resume the parked continuation — + // otherwise a timeout leaves the group awaiting this child + // forever and the test run hangs instead of failing. + await withTaskCancellationHandler { + await withCheckedContinuation { continuation in + let shouldResumeImmediately = self.withLock { + // Recheck count after acquiring lock to avoid race condition + // where message arrives between initial check and continuation install + if self._receivedMessages.count >= count { + return true + } + self.receivedMessageContinuation = continuation + return false + } + if shouldResumeImmediately { + continuation.resume() } - self.receivedMessageContinuation = continuation - return false } - if shouldResumeImmediately { - continuation.resume() + } onCancel: { + let continuation = self.withLock { + let parked = self.receivedMessageContinuation + self.receivedMessageContinuation = nil + return parked } + continuation?.resume() } } group.addTask { diff --git a/bitchatTests/Services/BLEFileTransferHandlerTests.swift b/bitchatTests/Services/BLEFileTransferHandlerTests.swift index 2e3d2450..d277674d 100644 --- a/bitchatTests/Services/BLEFileTransferHandlerTests.swift +++ b/bitchatTests/Services/BLEFileTransferHandlerTests.swift @@ -8,8 +8,10 @@ struct BLEFileTransferHandlerTests { var localNickname = "Me" var peers: [PeerID: BLEPeerInfo] = [:] var signedName: String? + var signatureVerifies = false var saveResult: URL? = URL(fileURLWithPath: "/tmp/files/incoming/sample.pdf") + var signatureVerifyCount = 0 var signedNameQueries: [PeerID] = [] var trackedPackets: [BitchatPacket] = [] var quotaReservations: [Int] = [] @@ -20,12 +22,17 @@ struct BLEFileTransferHandlerTests { private let localPeerID = PeerID(str: "0102030405060708") private let remotePeerID = PeerID(str: "1122334455667788") + private let sampleSigningKey = Data(repeating: 0xAB, count: 32) private func makeHandler(recorder: Recorder) -> BLEFileTransferHandler { let environment = BLEFileTransferHandlerEnvironment( localPeerID: { [localPeerID] in localPeerID }, localNickname: { recorder.localNickname }, peersSnapshot: { recorder.peers }, + verifyPacketSignature: { _, _ in + recorder.signatureVerifyCount += 1 + return recorder.signatureVerifies + }, signedSenderDisplayName: { _, peerID in recorder.signedNameQueries.append(peerID) return recorder.signedName @@ -53,13 +60,15 @@ struct BLEFileTransferHandlerTests { @Test func broadcastFileFromVerifiedPeerIsSavedAndDelivered() throws { let recorder = Recorder() - recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Alice", isVerified: true)] + recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Alice", isVerified: true, signingPublicKey: sampleSigningKey)] + recorder.signatureVerifies = true let handler = makeHandler(recorder: recorder) let content = Data("%PDF-1.7".utf8) let packet = try makeFileTransferPacket(sender: remotePeerID, mimeType: "application/pdf", content: content) - handler.handle(packet, from: remotePeerID) + #expect(handler.handle(packet, from: remotePeerID)) + #expect(recorder.signatureVerifyCount == 1) #expect(recorder.signedNameQueries.isEmpty) #expect(recorder.trackedPackets.count == 1) #expect(recorder.quotaReservations == [content.count]) @@ -86,7 +95,9 @@ struct BLEFileTransferHandlerTests { let handler = makeHandler(recorder: recorder) let packet = try makeFileTransferPacket(sender: localPeerID, mimeType: "application/pdf", content: Data("%PDF-1.7".utf8), ttl: 3) - handler.handle(packet, from: localPeerID) + // The relay pipeline already suppresses self-originated packets, so the + // handler reports "relayable" rather than treating the echo as forged. + #expect(handler.handle(packet, from: localPeerID)) expectNoSideEffects(recorder) } @@ -97,7 +108,7 @@ struct BLEFileTransferHandlerTests { let handler = makeHandler(recorder: recorder) let packet = try makeFileTransferPacket(sender: remotePeerID, mimeType: "application/pdf", content: Data("%PDF-1.7".utf8)) - handler.handle(packet, from: remotePeerID) + #expect(!handler.handle(packet, from: remotePeerID)) #expect(recorder.signedNameQueries == [remotePeerID]) #expect(recorder.trackedPackets.isEmpty) @@ -105,20 +116,126 @@ struct BLEFileTransferHandlerTests { } @Test - func connectedUnverifiedPeerIsAccepted() throws { + func broadcastFromConnectedUnverifiedPeerWithoutSignatureIsDropped() throws { let recorder = Recorder() recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Bob", isVerified: false, isConnected: true)] let handler = makeHandler(recorder: recorder) let packet = try makeFileTransferPacket(sender: remotePeerID, mimeType: "application/pdf", content: Data("%PDF-1.7".utf8)) - handler.handle(packet, from: remotePeerID) + // Failed sender authentication must also stop the packet from being + // relayed to downstream nodes. + #expect(!handler.handle(packet, from: remotePeerID)) - // Unlike public messages, file transfers accept connected-but-unverified peers. - #expect(recorder.signedNameQueries.isEmpty) + // Broadcast files carry an attacker-controllable senderID, so — like + // public messages — a connected-but-unverified peer must present a valid + // packet signature. No signing key + no signed identity means dropped. + #expect(recorder.signedNameQueries == [remotePeerID]) + #expect(recorder.trackedPackets.isEmpty) + #expect(recorder.deliveredMessages.isEmpty) + } + + @Test + func broadcastFromConnectedUnverifiedPeerWithSignedIdentityIsAccepted() throws { + let recorder = Recorder() + // Connected but nickname not yet verified and no registry signing key — + // the persisted-identity signature lookup still authenticates the + // sender, so the transfer is accepted under that verified name. + recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Bob", isVerified: false, isConnected: true)] + recorder.signedName = "Bob" + let handler = makeHandler(recorder: recorder) + let packet = try makeFileTransferPacket(sender: remotePeerID, mimeType: "application/pdf", content: Data("%PDF-1.7".utf8)) + + #expect(handler.handle(packet, from: remotePeerID)) + + #expect(recorder.signedNameQueries == [remotePeerID]) #expect(recorder.deliveredMessages.count == 1) #expect(recorder.deliveredMessages.first?.sender == "Bob") } + @Test + func selfBroadcastReplayIsDeliveredWithoutSignatureCheck() throws { + // Our own broadcast file replayed via gossip sync arrives with ttl==0 + // (so it is not treated as a self-echo) and cannot be verified against + // the peer registry — it must still be accepted, matching + // BLEPublicMessageHandler's self exemption. + let recorder = Recorder() + let handler = makeHandler(recorder: recorder) + let packet = try makeFileTransferPacket( + sender: localPeerID, + mimeType: "application/pdf", + content: Data("%PDF-1.7".utf8), + ttl: 0 + ) + + #expect(handler.handle(packet, from: localPeerID)) + + #expect(recorder.signatureVerifyCount == 0) + #expect(recorder.signedNameQueries.isEmpty) + #expect(recorder.deliveredMessages.count == 1) + #expect(recorder.deliveredMessages.first?.sender == "Me") + } + + @Test + func broadcastFromPeerNotInRegistryAcceptedViaSignedIdentity() throws { + let recorder = Recorder() + recorder.signedName = "Carol" + let handler = makeHandler(recorder: recorder) + let packet = try makeFileTransferPacket(sender: remotePeerID, mimeType: "application/pdf", content: Data("%PDF-1.7".utf8)) + + #expect(handler.handle(packet, from: remotePeerID)) + + // Peer absent from the registry: fall back to the persisted-identity + // signature lookup (mirrors BLEPublicMessageHandler). + #expect(recorder.signedNameQueries == [remotePeerID]) + #expect(recorder.deliveredMessages.count == 1) + #expect(recorder.deliveredMessages.first?.sender == "Carol") + } + + @Test + func spoofedBroadcastVoiceNoteWithoutSignatureIsDropped() throws { + // Regression for the PR #1406 finding: an in-range peer that observed a + // public voice burst tries to overwrite the live bubble by broadcasting + // a `voice_.m4a` note under the talker's senderID. Without a + // valid signature the note never reaches the coordinator's absorption. + let recorder = Recorder() + recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Mallory", isVerified: false, isConnected: true)] + let handler = makeHandler(recorder: recorder) + let m4a = Data([0x00, 0x00, 0x00, 0x18]) + Data("ftypM4A ".utf8) + let packet = try makeFileTransferPacket( + sender: remotePeerID, + mimeType: "audio/mp4", + content: m4a, + fileName: "voice_1122334455667788" + ) + + // The spoofed note must be dropped locally AND not relayed onward. + #expect(!handler.handle(packet, from: remotePeerID)) + + #expect(recorder.deliveredMessages.isEmpty) + } + + @Test + func privateFileFromConnectedUnverifiedPeerIsAccepted() throws { + let recorder = Recorder() + recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Bob", isVerified: false, isConnected: true)] + let handler = makeHandler(recorder: recorder) + let packet = try makeFileTransferPacket( + sender: remotePeerID, + mimeType: "application/pdf", + content: Data("%PDF-1.7".utf8), + recipientID: Data(hexString: localPeerID.id) + ) + + #expect(handler.handle(packet, from: remotePeerID)) + + // Directed transfers keep the lenient connected-peer path (no broadcast + // exposure); no signature check is required. + #expect(recorder.signatureVerifyCount == 0) + #expect(recorder.signedNameQueries.isEmpty) + #expect(recorder.deliveredMessages.count == 1) + #expect(recorder.deliveredMessages.first?.isPrivate == true) + } + @Test func fileDirectedToAnotherPeerIsIgnored() throws { let recorder = Recorder() @@ -131,7 +248,8 @@ struct BLEFileTransferHandlerTests { recipientID: Data(hexString: "AABBCCDDEEFF0011") ) - handler.handle(packet, from: remotePeerID) + // Not for us, but it must keep relaying toward the real recipient. + #expect(handler.handle(packet, from: remotePeerID)) #expect(recorder.trackedPackets.isEmpty) #expect(recorder.quotaReservations.isEmpty) @@ -151,7 +269,7 @@ struct BLEFileTransferHandlerTests { recipientID: Data(hexString: localPeerID.id) ) - handler.handle(packet, from: remotePeerID) + #expect(handler.handle(packet, from: remotePeerID)) // Directed transfers are not tracked for gossip sync. #expect(recorder.trackedPackets.isEmpty) @@ -167,7 +285,8 @@ struct BLEFileTransferHandlerTests { @Test func malformedPayloadIsTrackedForSyncButDropped() { let recorder = Recorder() - recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Alice", isVerified: true)] + recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Alice", isVerified: true, signingPublicKey: sampleSigningKey)] + recorder.signatureVerifies = true let handler = makeHandler(recorder: recorder) let packet = BitchatPacket( type: MessageType.fileTransfer.rawValue, @@ -179,7 +298,8 @@ struct BLEFileTransferHandlerTests { ttl: TransportConfig.messageTTLDefault ) - handler.handle(packet, from: remotePeerID) + // Local decode failures are not proof of forgery; the packet stays relayable. + #expect(handler.handle(packet, from: remotePeerID)) // Sync tracking happens before payload validation, matching the original order. #expect(recorder.trackedPackets.count == 1) @@ -191,11 +311,12 @@ struct BLEFileTransferHandlerTests { @Test func unsupportedMimeIsDroppedBeforeQuotaAndSave() throws { let recorder = Recorder() - recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Alice", isVerified: true)] + recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Alice", isVerified: true, signingPublicKey: sampleSigningKey)] + recorder.signatureVerifies = true let handler = makeHandler(recorder: recorder) let packet = try makeFileTransferPacket(sender: remotePeerID, mimeType: nil, content: Data([0x4D, 0x5A, 0x00, 0x00])) - handler.handle(packet, from: remotePeerID) + #expect(handler.handle(packet, from: remotePeerID)) #expect(recorder.trackedPackets.count == 1) #expect(recorder.quotaReservations.isEmpty) @@ -206,12 +327,14 @@ struct BLEFileTransferHandlerTests { @Test func saveFailureSkipsDelivery() throws { let recorder = Recorder() - recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Alice", isVerified: true)] + recorder.peers = [remotePeerID: makePeerInfo(remotePeerID, nickname: "Alice", isVerified: true, signingPublicKey: sampleSigningKey)] + recorder.signatureVerifies = true recorder.saveResult = nil let handler = makeHandler(recorder: recorder) let packet = try makeFileTransferPacket(sender: remotePeerID, mimeType: "application/pdf", content: Data("%PDF-1.7".utf8)) - handler.handle(packet, from: remotePeerID) + // A local save failure must not stop the mesh relay. + #expect(handler.handle(packet, from: remotePeerID)) #expect(recorder.quotaReservations.count == 1) #expect(recorder.saveCalls.count == 1) @@ -232,14 +355,15 @@ struct BLEFileTransferHandlerTests { _ peerID: PeerID, nickname: String, isVerified: Bool, - isConnected: Bool = true + isConnected: Bool = true, + signingPublicKey: Data? = nil ) -> BLEPeerInfo { BLEPeerInfo( peerID: peerID, nickname: nickname, isConnected: isConnected, noisePublicKey: nil, - signingPublicKey: nil, + signingPublicKey: signingPublicKey, isVerifiedNickname: isVerified, lastSeen: Date(timeIntervalSince1970: 999) ) @@ -250,10 +374,11 @@ struct BLEFileTransferHandlerTests { mimeType: String?, content: Data, ttl: UInt8 = TransportConfig.messageTTLDefault, - recipientID: Data? = nil + recipientID: Data? = nil, + fileName: String = "sample" ) throws -> BitchatPacket { let filePacket = BitchatFilePacket( - fileName: "sample", + fileName: fileName, fileSize: UInt64(content.count), mimeType: mimeType, content: content From ef848857b7fc5526766061d535dddfc8f9d99918 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 11:24:19 +0200 Subject: [PATCH 059/158] Remove dead code found by full Periphery audit; add scan config + advisory CI (#1410) Periphery 3.7.4 audit of both schemes (macOS + iOS, intersected so platform-specific code is never touched), with test targets indexed and the share extension built. 277 dead declarations removed or demoted: dead forwarding wrappers (ChatViewModel+Nostr/+PrivateChat), removed- feature remnants (autocomplete command suggestions, back-swipe tuning, MediaSendError, GeohashParticipantTracker), unused Tor dormancy bindings, assign-only properties, unused parameters (renamed to _), and redundant public accessibility. 13 orphaned localization keys deleted across all 29 locales (old pre-#1392 location-notes UI, app_info warnings). Two real tests were flagged as unused because they never ran: Swift Testing methods missing @Test (NostrProtocolTests. testAckRoundTripNIP44V2_Delivered, NotificationStreamAssemblerTests. testAssemblesCompressedLargeFrame). Re-armed both; they pass. Deliberately kept, now recorded in .periphery.baseline.json: iOS-only code invisible to the CI macOS scan, C FFI signatures, keep-alive NWPathMonitor reference, InboundEventKey.eventID (dedup semantics), wifiBulk capability bit (reserved for Wi-Fi bulk work, used by BitFoundation package tests), and the String secureClear cluster (exercised by package tests). New: .periphery.yml config and an advisory Dead Code CI job (mirrors the SwiftLint precedent from #1361) that fails on findings not in the committed baseline. Verified: full macOS app suite, BitFoundation (119) and BitLogger (13) package tests green; periphery scan --strict exits clean. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- .github/workflows/periphery.yml | 30 + .periphery.baseline.json | 1 + .periphery.yml | 14 + bitchat/App/AppArchitecture.swift | 22 - bitchat/App/AppRuntime.swift | 4 - bitchat/App/ConversationStore.swift | 10 - bitchat/App/LocationChannelsModel.swift | 2 - bitchat/App/PeerIdentityStore.swift | 8 - bitchat/App/VerificationModel.swift | 6 - bitchat/Features/voice/VoiceRecorder.swift | 1 - bitchat/Features/voice/Waveform.swift | 6 - bitchat/Identity/IdentityModels.swift | 7 - .../Identity/SecureIdentityStateManager.swift | 29 +- bitchat/Localizable.xcstrings | 2711 ----------------- bitchat/Models/BitchatMessage+Media.swift | 7 - bitchat/Models/BitchatPeer.swift | 4 +- bitchat/Noise/NoiseProtocol.swift | 2 +- bitchat/Noise/NoiseSecurityConstants.swift | 6 - bitchat/Noise/NoiseSecurityError.swift | 1 - bitchat/Noise/NoiseSessionManager.swift | 10 +- bitchat/Nostr/NostrIdentity.swift | 12 +- bitchat/Nostr/NostrIdentityBridge.swift | 8 - bitchat/Nostr/NostrProtocol.swift | 34 - bitchat/Nostr/NostrRelayManager.swift | 3 - bitchat/Protocols/Geohash.swift | 8 - bitchat/Services/AutocompleteService.swift | 29 +- .../BLE/BLEFragmentAssemblyBuffer.swift | 2 - bitchat/Services/BLE/BLELogRateLimiter.swift | 5 - .../BLE/BLEOutboundPacketPolicy.swift | 2 +- bitchat/Services/BLE/BLEPeerRegistry.swift | 8 - bitchat/Services/BLE/BLEService.swift | 18 +- bitchat/Services/Board/BoardManager.swift | 2 - bitchat/Services/Board/BoardStore.swift | 8 - bitchat/Services/Courier/CourierStore.swift | 8 - .../Courier/StoreAndForwardMetrics.swift | 6 - bitchat/Services/Gateway/GatewayService.swift | 3 +- .../Services/GeohashParticipantTracker.swift | 44 +- bitchat/Services/Groups/GroupProtocol.swift | 1 - bitchat/Services/KeychainManager.swift | 27 +- bitchat/Services/LocationStateManager.swift | 17 +- .../Services/MessageFormattingEngine.swift | 8 +- bitchat/Services/MessageRouter.swift | 7 - bitchat/Services/NoiseEncryptionService.swift | 4 +- bitchat/Services/NostrTransport.swift | 11 +- bitchat/Services/PrivateChatManager.swift | 15 +- bitchat/Services/RelayController.swift | 2 +- .../Services/TransferProgressManager.swift | 6 - bitchat/Services/Transport.swift | 3 +- bitchat/Services/TransportConfig.swift | 19 +- bitchat/Services/UnifiedPeerService.swift | 9 +- bitchat/Utils/MessageDeduplicator.swift | 19 - bitchat/Utils/Theme.swift | 2 +- bitchat/ViewModels/ChatGroupCoordinator.swift | 2 +- .../ChatPeerIdentityCoordinator.swift | 3 +- .../ChatPrivateConversationCoordinator.swift | 25 +- .../ChatPublicConversationCoordinator.swift | 16 +- .../ChatVerificationCoordinator.swift | 2 - bitchat/ViewModels/ChatViewModel.swift | 52 +- .../Extensions/ChatViewModel+Nostr.swift | 39 - .../ChatViewModel+PrivateChat.swift | 73 - .../Extensions/ChatViewModel+Tor.swift | 2 +- bitchat/ViewModels/MessageRateLimiter.swift | 5 - .../ViewModels/MinimalDistancePalette.swift | 7 - .../ViewModels/PublicMessagePipeline.swift | 12 +- bitchat/Views/AppInfoView.swift | 2 - bitchat/Views/ContentSheetViews.swift | 8 +- bitchat/Views/FingerprintView.swift | 5 - bitchat/Views/LocationChannelsSheet.swift | 4 +- bitchat/Views/VerificationViews.swift | 1 - .../ChatNostrCoordinatorContextTests.swift | 29 - ...tPeerIdentityCoordinatorContextTests.swift | 1 - ...eConversationCoordinatorContextTests.swift | 15 - ...cConversationCoordinatorContextTests.swift | 5 - bitchatTests/CommandProcessorTests.swift | 4 - .../EndToEnd/CourierEndToEndTests.swift | 3 - .../EndToEnd/PublicChatE2ETests.swift | 4 +- bitchatTests/FontBitchatTests.swift | 1 - .../Fragmentation/FragmentationTests.swift | 1 - .../Integration/TestNetworkHelper.swift | 8 - bitchatTests/LocalizationCoverageTests.swift | 4 +- bitchatTests/Mocks/MockBLEBus.swift | 1 - bitchatTests/Mocks/MockBLEService.swift | 62 - bitchatTests/Mocks/MockIdentityManager.swift | 25 +- bitchatTests/Mocks/MockTransport.swift | 3 - bitchatTests/Noise/NoiseProtocolTests.swift | 3 - bitchatTests/NostrProtocolTests.swift | 1 + .../NotificationStreamAssemblerTests.swift | 1 + .../PerformanceBaselineTests.swift | 5 - bitchatTests/ProtocolContractTests.swift | 4 - bitchatTests/PublicMessagePipelineTests.swift | 12 +- .../GeohashPresenceServiceTests.swift | 4 - .../NetworkActivationServiceTests.swift | 2 - .../Services/NostrRelayManagerTests.swift | 6 +- .../Services/UnifiedPeerServiceTests.swift | 18 - .../TestUtilities/TestConstants.swift | 4 - bitchatTests/TestUtilities/TestHelpers.swift | 55 +- localPackages/Arti/Sources/TorManager.swift | 10 - .../BitFoundation/BinaryProtocol.swift | 4 - .../BitFoundation/BitchatMessage.swift | 18 - .../Sources/BitFoundation/BitchatPacket.swift | 31 +- .../BitLogger/Sources/OSLog+Categories.swift | 1 - .../BitLogger/Sources/SecureLogger.swift | 15 - 102 files changed, 137 insertions(+), 3712 deletions(-) create mode 100644 .github/workflows/periphery.yml create mode 100644 .periphery.baseline.json create mode 100644 .periphery.yml diff --git a/.github/workflows/periphery.yml b/.github/workflows/periphery.yml new file mode 100644 index 00000000..e33fc7c2 --- /dev/null +++ b/.github/workflows/periphery.yml @@ -0,0 +1,30 @@ +name: Dead Code + +on: + push: + branches: + - main + pull_request: + +jobs: + periphery: + name: Periphery scan + runs-on: macos-latest + timeout-minutes: 30 + # Advisory, like SwiftLint (#1361): findings annotate the PR but don't + # block merges. Drop continue-on-error once the baseline proves stable. + continue-on-error: true + + steps: + - name: Checkout code + uses: actions/checkout@v5 + + - name: Install Periphery + # homebrew-core formula; the peripheryapp tap lags years behind. + run: brew install periphery + + - name: Scan for dead code + # Config comes from .periphery.yml; known findings (mostly iOS-only + # code invisible to a macOS scan) are suppressed by the committed + # baseline. --strict fails the step when NEW dead code appears. + run: periphery scan --strict --disable-update-check diff --git a/.periphery.baseline.json b/.periphery.baseline.json new file mode 100644 index 00000000..0b826869 --- /dev/null +++ b/.periphery.baseline.json @@ -0,0 +1 @@ +{"v1":{"usrs":["param-buf-arti_bootstrap_summary(_:_:)-s:3Tor22arti_bootstrap_summary33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSpys4Int8VG_AEtF","param-dataDir-arti_start(_:_:)-s:3Tor10arti_start33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSPys4Int8VG_s6UInt16VtF","param-len-arti_bootstrap_summary(_:_:)-s:3Tor22arti_bootstrap_summary33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSpys4Int8VG_AEtF","param-socksPort-arti_start(_:_:)-s:3Tor10arti_start33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSPys4Int8VG_s6UInt16VtF","s:13BitFoundation16PeerCapabilitiesV8wifiBulkACvpZ","s:13BitFoundation18KeychainReadResultO18isRecoverableErrorSbvp","s:13BitFoundation23KeychainManagerProtocolP11secureClearyySSzF","s:18bitchatTests_macOS12MockKeychainC11secureClearyySSzF","s:18bitchatTests_macOS20TrackingMockKeychainC11resetCountsyyF","s:18bitchatTests_macOS20TrackingMockKeychainC11secureClearyySSzF","s:18bitchatTests_macOS20TrackingMockKeychainC25totalSecureClearCallCountSivp","s:18bitchatTests_macOS20TrackingMockKeychainC26secureClearStringCallCountSivp","s:18bitchatTests_macOS20TrackingMockKeychainC27_secureClearStringCallCount06_AB6D1M24FD239F2969C82F4108818260LLSivp","s:18bitchatTests_macOS24FailingCacheSaveKeychain33_22380C7A11A569A0B83FA83F34C498A7LLC11secureClearyySSzF","s:18bitchatTests_macOS24MockGeohashPresenceTimer33_483587EFB96650EE130EFB09BBA2A1AALLC7handleryycvp","s:3Tor0A7ManagerC21goDormantOnBackgroundyyF","s:7bitchat10AppRuntimeC24handleScreenshotCaptured33_C8B369AD8BC1D9963A50CEDA77A4332ALLyyF","s:7bitchat10AppRuntimeC33handleDidBecomeActiveNotificationyyF","s:7bitchat10BLEServiceC18logBluetoothStatus33_69191C53E68500C17D98DBCF2BDA7100LLyySSF","s:7bitchat10BLEServiceC20centralRestorationID33_69191C53E68500C17D98DBCF2BDA7100LLSSvpZ","s:7bitchat10BLEServiceC22captureBluetoothStatus33_69191C53E68500C17D98DBCF2BDA7100LL7contextySS_tF","s:7bitchat10BLEServiceC23peripheralRestorationID33_69191C53E68500C17D98DBCF2BDA7100LLSSvpZ","s:7bitchat10BLEServiceC29scheduleBluetoothStatusSample33_69191C53E68500C17D98DBCF2BDA7100LL5after7contextySd_SStF","s:7bitchat10QRScanViewV8isActiveSbvp","s:7bitchat15BLEPeerRegistryV5countSivp","s:7bitchat15KeychainManagerC11secureClearyySSzF","s:7bitchat15PaymentChipViewV7openURL33_10AC50641B1EBCD52E5092A2E521D236LL7SwiftUI13OpenURLActionVvp","s:7bitchat15TransportConfigO29uiBatchDispatchStaggerSecondsSdvpZ","s:7bitchat15TransportConfigO35uiShareExtensionDismissDelaySecondsSdvpZ","s:7bitchat15TransportConfigO38bleBackgroundPendingConnectSlotReserveSivpZ","s:7bitchat17GossipSyncManagerC10persistNowyyF","s:7bitchat17NostrRelayManagerC15InboundEventKey33_E4160FE8A9A2C9D6308EAAD5A8B5CB07LLV7eventIDSSvp","s:7bitchat25LocationNotesDependenciesV3now10Foundation4DateVycvp","s:7bitchat25NWPathReachabilityMonitorC7monitor33_84633C9DBCAF57538179C1E04DB8E015LL7Network0bD0CSgvp"]}} \ No newline at end of file diff --git a/.periphery.yml b/.periphery.yml new file mode 100644 index 00000000..865def40 --- /dev/null +++ b/.periphery.yml @@ -0,0 +1,14 @@ +# Periphery dead-code scan configuration (https://github.com/peripheryapp/periphery) +# +# CI runs the macOS scheme only (an iOS scan needs a device destination and +# doubles the build time). macOS-only scans falsely flag iOS-only code — +# state restoration, screenshot handlers, background BLE sampling — so those +# findings live in .periphery.baseline.json rather than being "fixed". +# When auditing by hand, scan BOTH schemes and intersect: +# periphery scan --schemes "bitchat (iOS)" -- -destination 'generic/platform=iOS' ARCHS=arm64 +project: bitchat.xcodeproj +schemes: + - bitchat (macOS) +retain_swift_ui_previews: true +relative_results: true +baseline: .periphery.baseline.json diff --git a/bitchat/App/AppArchitecture.swift b/bitchat/App/AppArchitecture.swift index a0710673..72b43b7d 100644 --- a/bitchat/App/AppArchitecture.swift +++ b/bitchat/App/AppArchitecture.swift @@ -36,34 +36,12 @@ enum AppEvent: Sendable, Equatable { actor AppEventStream { private var continuations: [UUID: AsyncStream.Continuation] = [:] - func stream() -> AsyncStream { - let id = UUID() - return AsyncStream { continuation in - continuations[id] = continuation - continuation.onTermination = { [id] _ in - Task { - await self.removeContinuation(id) - } - } - } - } - func emit(_ event: AppEvent) { for continuation in continuations.values { continuation.yield(event) } } - func finish() { - for continuation in continuations.values { - continuation.finish() - } - continuations.removeAll() - } - - private func removeContinuation(_ id: UUID) { - continuations.removeValue(forKey: id) - } } /// Identity key for a direct conversation. Equality and hashing use the diff --git a/bitchat/App/AppRuntime.swift b/bitchat/App/AppRuntime.swift index de096e8e..27d0d993 100644 --- a/bitchat/App/AppRuntime.swift +++ b/bitchat/App/AppRuntime.swift @@ -18,8 +18,6 @@ final class AppRuntime: ObservableObject { /// (docs/CONVERSATION-STORE-DESIGN.md). Owned here; the feature models /// and `ChatViewModel` observe and mutate it through its intent API. let conversations: ConversationStore - let peerIdentityStore: PeerIdentityStore - let locationPresenceStore: LocationPresenceStore let publicChatModel: PublicChatModel let privateInboxModel: PrivateInboxModel let privateConversationModel: PrivateConversationModel @@ -51,8 +49,6 @@ final class AppRuntime: ObservableObject { let locationPresenceStore = LocationPresenceStore() let locationManager = LocationChannelManager.shared self.conversations = conversations - self.peerIdentityStore = peerIdentityStore - self.locationPresenceStore = locationPresenceStore self.chatViewModel = ChatViewModel( keychain: keychain, idBridge: idBridge, diff --git a/bitchat/App/ConversationStore.swift b/bitchat/App/ConversationStore.swift index 88d72085..c5195ae3 100644 --- a/bitchat/App/ConversationStore.swift +++ b/bitchat/App/ConversationStore.swift @@ -796,16 +796,6 @@ extension ConversationStore { return messageIDs } - /// Removes every direct conversation (panic clear). - func removeAllDirectConversations() { - let directIDs = conversationIDs.filter { id in - if case .direct = id { return true } - return false - } - for id in directIDs { - removeConversation(id) - } - } } // MARK: - Diagnostics support diff --git a/bitchat/App/LocationChannelsModel.swift b/bitchat/App/LocationChannelsModel.swift index d7431d6d..230e75a0 100644 --- a/bitchat/App/LocationChannelsModel.swift +++ b/bitchat/App/LocationChannelsModel.swift @@ -1,4 +1,3 @@ -import BitFoundation import Combine import Foundation @@ -17,7 +16,6 @@ final class LocationChannelsModel: ObservableObject { private let manager: LocationChannelManager private let network: NetworkActivationService private let gateway: GatewayService - private var cancellables = Set() init( manager: LocationChannelManager? = nil, diff --git a/bitchat/App/PeerIdentityStore.swift b/bitchat/App/PeerIdentityStore.swift index 119d765f..e7e49f01 100644 --- a/bitchat/App/PeerIdentityStore.swift +++ b/bitchat/App/PeerIdentityStore.swift @@ -25,10 +25,6 @@ final class PeerIdentityStore: ObservableObject { stablePeerIDsByShortID[peerID] = stablePeerID } - func replaceStablePeerIDs(_ mappings: [PeerID: PeerID]) { - stablePeerIDsByShortID = mappings - } - func fingerprint(for peerID: PeerID) -> String? { peerFingerprintsByPeerID[peerID] } @@ -94,10 +90,6 @@ final class PeerIdentityStore: ObservableObject { invalidateEncryptionCache(for: peerID) } - func replaceEncryptionStatuses(_ statuses: [PeerID: EncryptionStatus]) { - encryptionStatuses = statuses - } - func setVerifiedFingerprints(_ fingerprints: Set) { verifiedFingerprints = fingerprints } diff --git a/bitchat/App/VerificationModel.swift b/bitchat/App/VerificationModel.swift index 5916a958..d9c2ce08 100644 --- a/bitchat/App/VerificationModel.swift +++ b/bitchat/App/VerificationModel.swift @@ -3,7 +3,6 @@ import Combine import Foundation struct FingerprintPresentationState: Equatable { - let statusPeerID: PeerID let peerNickname: String let encryptionStatus: EncryptionStatus let theirFingerprint: String? @@ -56,10 +55,6 @@ final class VerificationModel: ObservableObject { return VerificationService.shared.buildMyQRString(nickname: currentNickname, npub: npub) ?? "" } - func beginQRVerification(with qr: VerificationService.VerificationQR) -> Bool { - chatViewModel.beginQRVerification(with: qr) - } - func verifyScannedPayload(_ payload: String) -> VerificationScanOutcome { guard let qr = VerificationService.shared.verifyScannedQR(payload) else { return .invalid @@ -110,7 +105,6 @@ final class VerificationModel: ObservableObject { } return FingerprintPresentationState( - statusPeerID: statusPeerID, peerNickname: peerNickname, encryptionStatus: encryptionStatus, theirFingerprint: theirFingerprint, diff --git a/bitchat/Features/voice/VoiceRecorder.swift b/bitchat/Features/voice/VoiceRecorder.swift index b7b4b91f..586e8fdf 100644 --- a/bitchat/Features/voice/VoiceRecorder.swift +++ b/bitchat/Features/voice/VoiceRecorder.swift @@ -5,7 +5,6 @@ import AVFoundation actor VoiceRecorder { enum RecorderError: Error { case microphoneAccessDenied - case recorderInitializationFailed case recordingInProgress } diff --git a/bitchat/Features/voice/Waveform.swift b/bitchat/Features/voice/Waveform.swift index e33c72bd..cfc79310 100644 --- a/bitchat/Features/voice/Waveform.swift +++ b/bitchat/Features/voice/Waveform.swift @@ -56,12 +56,6 @@ final class WaveformCache { } } - func purgeAll() { - queue.async(flags: .barrier) { [weak self] in - self?.cache.removeAll() - } - } - private func computeWaveform(url: URL, bins: Int) -> [Float]? { guard bins > 0 else { return nil } // Use autoreleasepool to manage memory from audio buffer allocations diff --git a/bitchat/Identity/IdentityModels.swift b/bitchat/Identity/IdentityModels.swift index 921a071a..0d8dc475 100644 --- a/bitchat/Identity/IdentityModels.swift +++ b/bitchat/Identity/IdentityModels.swift @@ -88,8 +88,6 @@ import BitFoundation /// Represents the ephemeral layer of identity - short-lived peer IDs that provide network privacy. /// These IDs rotate periodically to prevent tracking while maintaining cryptographic relationships. struct EphemeralIdentity { - let peerID: PeerID // 8 random bytes - let sessionStart: Date var handshakeState: HandshakeState } @@ -98,7 +96,6 @@ enum HandshakeState { case initiated case inProgress case completed(fingerprint: String) - case failed(reason: String) } /// Represents the cryptographic layer of identity - the stable Noise Protocol static key pair. @@ -110,7 +107,6 @@ struct CryptographicIdentity: Codable { // Optional Ed25519 signing public key (used to authenticate public messages) var signingPublicKey: Data? = nil let firstSeen: Date - let lastHandshake: Date? } /// Represents the social layer of identity - user-assigned names and trust relationships. @@ -193,9 +189,6 @@ struct IdentityCache: Codable { // Fingerprint -> when we verified it (orders outgoing vouch batches; // entries verified before this field exists sort as oldest) var verifiedAt: [String: Date]? = nil - - // Schema version for future migrations - var version: Int = 1 } // diff --git a/bitchat/Identity/SecureIdentityStateManager.swift b/bitchat/Identity/SecureIdentityStateManager.swift index 021ea776..7c68a01b 100644 --- a/bitchat/Identity/SecureIdentityStateManager.swift +++ b/bitchat/Identity/SecureIdentityStateManager.swift @@ -108,8 +108,6 @@ protocol SecureIdentityStateManagerProtocol { func updateSocialIdentity(_ identity: SocialIdentity) // MARK: Favorites Management - func getFavorites() -> Set - func setFavorite(_ fingerprint: String, isFavorite: Bool) func isFavorite(fingerprint: String) -> Bool // MARK: Blocked Users Management @@ -123,8 +121,7 @@ protocol SecureIdentityStateManagerProtocol { // MARK: Ephemeral Session Management func registerEphemeralSession(peerID: PeerID, handshakeState: HandshakeState) - func updateHandshakeState(peerID: PeerID, state: HandshakeState) - + // MARK: Cleanup func clearAllIdentityData() func removeEphemeralSession(peerID: PeerID) @@ -139,7 +136,6 @@ protocol SecureIdentityStateManagerProtocol { func recordVouch(voucheeFingerprint: String, voucherFingerprint: String, timestamp: Date) -> Bool func validVouchers(for fingerprint: String) -> [VouchRecord] func isVouched(fingerprint: String) -> Bool - func effectiveTrustLevel(for fingerprint: String) -> TrustLevel func lastVouchBatchSent(to fingerprint: String) -> Date? func markVouchBatchSent(to fingerprint: String, at date: Date) func signingPublicKey(forFingerprint fingerprint: String) -> Data? @@ -322,21 +318,13 @@ final class SecureIdentityStateManager: SecureIdentityStateManagerProtocol { fingerprint: fingerprint, publicKey: noisePublicKey, signingPublicKey: signingPublicKey ?? existing.signingPublicKey, - firstSeen: existing.firstSeen, - lastHandshake: now + firstSeen: existing.firstSeen ) self.cryptographicIdentities[fingerprint] = existing } else { - // Update signing key and lastHandshake + // Update signing key existing.signingPublicKey = signingPublicKey ?? existing.signingPublicKey - let updated = CryptographicIdentity( - fingerprint: existing.fingerprint, - publicKey: existing.publicKey, - signingPublicKey: existing.signingPublicKey, - firstSeen: existing.firstSeen, - lastHandshake: now - ) - self.cryptographicIdentities[fingerprint] = updated + self.cryptographicIdentities[fingerprint] = existing } // Persist updated state (already assigned in branches above) } else { @@ -345,8 +333,7 @@ final class SecureIdentityStateManager: SecureIdentityStateManagerProtocol { fingerprint: fingerprint, publicKey: noisePublicKey, signingPublicKey: signingPublicKey, - firstSeen: now, - lastHandshake: now + firstSeen: now ) self.cryptographicIdentities[fingerprint] = entry } @@ -511,11 +498,7 @@ final class SecureIdentityStateManager: SecureIdentityStateManagerProtocol { func registerEphemeralSession(peerID: PeerID, handshakeState: HandshakeState = .none) { queue.async(flags: .barrier) { - self.ephemeralSessions[peerID] = EphemeralIdentity( - peerID: peerID, - sessionStart: Date(), - handshakeState: handshakeState - ) + self.ephemeralSessions[peerID] = EphemeralIdentity(handshakeState: handshakeState) } } diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 12e3f978..c0be8226 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -1082,185 +1082,6 @@ } } }, - "app_info.close" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "إغلاق" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "বন্ধ করুন" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "schließen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "close" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "cerrar" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "isara" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "fermer" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "סגור" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "बंद करें" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "tutup" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "chiudi" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "閉じる" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "닫기" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "tutup" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "बन्द" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "sluiten" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "zamknij" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "fechar" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "fechar" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "закрыть" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "stäng" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "மூடு" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "ปิด" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "kapat" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "закрити" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "بند کریں" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "đóng" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "关闭" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "關閉" - } - } - } - }, "app_info.done" : { "extractionState" : "manual", "localizations" : { @@ -10049,364 +9870,6 @@ } } }, - "app_info.warning.message" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "أمان الرسائل الخاصة لم يتم تدقيقه بالكامل بعد. لا تستخدمها في الحالات الحرجة حتى يختفي هذا التحذير." - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "ব্যক্তিগত বার্তার নিরাপত্তা এখনো সম্পূর্ণ অডিট হয়নি। এই সতর্কতা না থাকা পর্যন্ত জরুরি পরিস্থিতিতে ব্যবহার করবেন না।" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "die sicherheit privater nachrichten wurde noch nicht vollständig geprüft. nutze sie nicht für kritische situationen, solange dieser hinweis erscheint." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "private message security has not yet been fully audited. do not use for critical situations until this warning disappears." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "la seguridad de los mensajes privados aún no ha sido auditada por completo. no lo uses en situaciones críticas hasta que este aviso desaparezca." - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "hindi pa ganap na na-audit ang seguridad ng pribadong mensahe. huwag gamitin para sa kritikal na sitwasyon hangga't hindi nawawala ang babalang ito." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "la sécurité des messages privés n'a pas encore été entièrement auditée. n'utilise pas pour des situations critiques tant que cet avertissement reste." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אבטחת ההודעות הפרטיות עדיין לא נבדקה במלואה. אל תשתמש למצבים קריטיים עד שהאזהרה תיעלם." - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "निजी संदेश सुरक्षा का अभी पूरा ऑडिट नहीं हुआ है। यह चेतावनी हटने तक गंभीर स्थितियों में उपयोग न करें।" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "keamanan pesan pribadi belum diaudit sepenuhnya. jangan dipakai untuk situasi kritis sampai peringatan ini hilang." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "la sicurezza dei messaggi privati non è stata ancora auditata completamente. non usarli in situazioni critiche finché questo avviso resta." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プライベートメッセージの安全性はまだ完全に監査されていません。この警告が消えるまで重要な場面では使わないでください。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비공개 메시지 보안은 아직 완전히 감사받지 않았습니다. 이 경고가 사라질 때까지 중요한 상황에서는 사용하지 마세요." - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "keamanan pesan pribadi belum diaudit sepenuhnya. jangan diguna untuk situasi kritis sampai peringatan ini hilang." - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "व्यक्तिगत सन्देशको सुरक्षा पूर्ण रूपमा अडिट भएको छैन। यो चेतावनी हट्दासम्म गम्भीर अवस्थामा प्रयोग नगर्नु।" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "de beveiliging van privéberichten is nog niet volledig geaudit. gebruik dit niet in kritieke situaties totdat deze melding verdwijnt." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "bezpieczeństwo wiadomości prywatnych nie zostało jeszcze w pełni sprawdzone. nie używaj w sytuacjach krytycznych, dopóki to ostrzeżenie nie zniknie." - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "a segurança das mensagens privadas ainda não foi totalmente auditada. não uses em situações críticas até este aviso desaparecer." - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "a segurança das mensagens privadas ainda não foi totalmente auditada. não use em situações críticas até que este aviso desapareça." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "безопасность приватных сообщений ещё не прошла полный аудит. не используй для критичных случаев, пока предупреждение не исчезнет." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "säkerheten för privata meddelanden är ännu inte fullständigt granskad. använd inte i kritiska situationer förrän detta meddelande försvinner." - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "தனிப்பட்ட செய்தி பாதுகாப்பு இன்னும் முழுமையாக ஆய்வு செய்யப்படவில்லை. இந்த எச்சரிக்கை மறையும் வரை முக்கிய அவசரங்களுக்கு பயன்படுத்தாதீர்கள்." - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "ความปลอดภัยของข้อความส่วนตัวยังไม่ได้รับการตรวจสอบทั้งหมด อย่าใช้ในสถานการณ์วิกฤติจนกว่าคำเตือนนี้จะหายไป" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "özel mesaj güvenliği henüz tamamen denetlenmedi. bu uyarı kaybolana kadar kritik durumlarda kullanmayın." - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "безпека приватних повідомлень ще не пройшла повний аудит. не використовуй для критичних ситуацій, поки це попередження не зникне." - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "نجی پیغامات کی سیکیورٹی کا ابھی مکمل آڈٹ نہیں ہوا۔ اس انتباہ کے ختم ہونے تک اسے اہم حالات میں استعمال نہ کریں۔" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "bảo mật tin nhắn riêng tư vẫn chưa được kiểm toán đầy đủ. đừng dùng cho tình huống quan trọng cho tới khi cảnh báo này biến mất." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "私信安全尚未完全审计。在此警告消失前不要用于关键情境。" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "私信安全尚未完全審計。在此警告消失前不要用於關鍵情境。" - } - } - } - }, - "app_info.warning.title" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "تحذير" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "সতর্কতা" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "WARNUNG" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "WARNING" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "ADVERTENCIA" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "BABALA" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "AVERTISSEMENT" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אזהרה" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "चेतावनी" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "PERINGATAN" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "AVVISO" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "警告" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "경고" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "PERINGATAN" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "चेतावनी" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "WAARSCHUWING" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "OSTRZEŻENIE" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "AVISO" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "AVISO" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "ПРЕДУПРЕЖДЕНИЕ" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "VARNING" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "எச்சரிக்கை" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "คำเตือน" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "UYARI" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "ПОПЕРЕДЖЕННЯ" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "انتباہ" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "CẢNH BÁO" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "警告" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "警告" - } - } - } - }, "Choose an image" : { "comment" : "A label displayed above a button that allows the user to choose an image to send.", "extractionState" : "manual", @@ -14712,185 +14175,6 @@ } } }, - "content.accessibility.location_notes" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "ملاحظات الموقع لهذا المكان" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "এই স্থানের লোকেশন নোট" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "standortnotizen für diesen ort" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "location notes for this place" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "notas de ubicación de este lugar" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "mga tala para sa lugar na ito" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "notes de localisation pour cet endroit" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הערות מיקום למקום הזה" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "इस स्थान के लोकेशन नोट" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "catatan lokasi untuk tempat ini" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "note di posizione per questo posto" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "この場所のロケーションノート" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 장소의 위치 노트" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "catatan lokasi untuk tempat ini" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "यस ठाउँका स्थान नोटहरू" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "locatienotities voor deze plek" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "notatki lokalizacyjne dla tego miejsca" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "notas de localização deste lugar" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "notas de localização deste lugar" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "заметки для этого места" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "platsanteckningar för den här platsen" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "இந்த இடத்திற்கான குறிப்புகள்" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "บันทึกตำแหน่งสำหรับสถานที่นี้" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "bu yer için konum notları" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "замітки про це місце" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "اس جگہ کیلئے لوکیشن نوٹس" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "ghi chú vị trí cho nơi này" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "此位置的笔记" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "此位置的筆記" - } - } - } - }, "content.accessibility.notices" : { "comment" : "Accessibility label for the notices button", "extractionState" : "manual", @@ -18505,185 +17789,6 @@ } } }, - "content.accessibility.toggle_favorite_hint" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "اضغط مرتين لتبديل حالة المفضلة" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "প্রিয় অবস্থা বদলাতে দুইবার ট্যাপ করুন" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "doppelt tippen, um favoritenstatus zu wechseln" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "double tap to toggle favorite status" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "toca dos veces para alternar el estado de favorito" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "i-double tap para i-toggle ang paborito" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "tape deux fois pour basculer le statut favori" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הקש פעמיים כדי להחליף מצב מועדפים" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "पसंदीदा स्थिति बदलने के लिए डबल टैप करें" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "ketuk dua kali untuk mengubah status favorit" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "tocca due volte per cambiare stato preferito" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ダブルタップでお気に入り状態を切り替え" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "두 번 탭하여 즐겨찾기 상태 토글" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "ketuk dua kali untuk mengubah status favorit" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "मनपर्ने स्थिति बदल्न दोहोरो ट्याप गर" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "dubbelklikken om favoriet te schakelen" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "stuknij dwukrotnie, aby zmienić stan ulubionych" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "toca duas vezes para alternar o estado de favorito" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "toque duas vezes para alternar status de favorito" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "дважды тапни, чтобы переключить статус избранного" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "dubbeltryck för att växla favoritstatus" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "பிரியப்பட்ட நிலையை மாற்ற இருமுறை தட்டவும்" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "แตะสองครั้งเพื่อสลับสถานะรายการโปรด" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "favori durumunu değiştirmek için çift dokunun" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "торкни двічі, щоб змінити статус вибраного" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "پسندیدہ حالت بدلنے کیلئے دو بار ٹیپ کریں" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "chạm hai lần để chuyển trạng thái yêu thích" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "双击切换收藏状态" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "雙擊切換收藏狀態" - } - } - } - }, "content.accessibility.verification" : { "comment" : "Accessibility label for the verification QR button", "extractionState" : "manual", @@ -30702,185 +29807,6 @@ } } }, - "content.notes.title" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "ملاحظات" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "নোট" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "notizen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "notes" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "notas" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "mga tala" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "notes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הערות" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "नोट्स" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "catatan" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "note" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ノート" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "노트" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "catatan" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "नोट" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "notities" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "notatki" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "notas" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "notas" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "заметки" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "anteckningar" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "குறிப்புகள்" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "บันทึก" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "notlar" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "замітки" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "نوٹس" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "ghi chú" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "笔记" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "筆記" - } - } - } - }, "content.payment.cashu" : { "extractionState" : "manual", "localizations" : { @@ -45160,364 +44086,6 @@ } } }, - "location_notes.empty_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "كن أول من يضيف هنا." - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "এই জায়গার জন্য প্রথম নোট যোগ করুন।" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "sei die erste person, die hier eine notiz hinterlässt." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "be the first to add one for this spot." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "sé la primera persona en añadir una en este lugar." - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "maging unang magdagdag para sa puntong ito" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "sois la première personne à en ajouter ici." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "היה הראשון להוסיף כאן." - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "इस जगह के लिए पहला नोट आप जोड़ें।" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "jadilah orang pertama yang menambahkannya di sini." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "fai tu la prima nota qui." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ここで最初のノートを残そう。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 장소에 첫 번째 노트를 남겨보세요." - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "jadilah orang pertama yang menambahkannya di sini." - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "यस ठाउँमा नोट थप्ने पहिलो व्यक्ती बन।" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "wees de eerste die er hier een toevoegt" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "dodaj pierwszą notatkę dla tego miejsca" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "sê o primeiro a adicionar uma nota para este sítio." - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "seja a primeira pessoa a adicionar uma aqui." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "стань первым, кто добавит здесь заметку." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "var först med en anteckning här" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "இந்த இடத்திற்கு முதலில் ஒரு குறிப்பைச் சேர்க்கவும்" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "เป็นคนแรกที่เพิ่มบันทึกให้จุดนี้" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "bu yer için ilk notu sen ekle." - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "стань першим, хто додасть тут замітку." - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "اس مقام کیلئے پہلا نوٹ آپ شامل کریں" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "hãy là người đầu tiên thêm ghi chú tại đây" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "成为这里的第一条笔记。" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "成為這裡的第一條筆記。" - } - } - } - }, - "location_notes.empty_title" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "لا توجد ملاحظات بعد" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "এখনও কোনো নোট নেই" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "noch keine notizen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "no notes yet" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "aún no hay notas" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "wala pang tala" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "pas encore de notes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אין הערות עדיין" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "अभी कोई नोट नहीं" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "belum ada catatan" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "ancora nessuna nota" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ノートはまだありません" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "아직 노트가 없습니다" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "belum ada catatan" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "अहिले नोट छैन" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "nog geen notities" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "brak notatek" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "ainda sem notas" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "nenhuma nota ainda" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "заметок пока нет" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "inga anteckningar än" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "இன்னும் குறிப்புகள் இல்லை" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "ยังไม่มีบันทึก" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "henüz not yok" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "заміток ще немає" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "ابھی تک کوئی نوٹس نہیں" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "chưa có ghi chú" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "尚无笔记" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "尚無筆記" - } - } - } - }, "location_notes.error.failed_to_send" : { "extractionState" : "manual", "localizations" : { @@ -45876,569 +44444,6 @@ } } }, - "location_notes.header" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "few" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d ملاحظات" - } - }, - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d ملاحظة" - } - }, - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d ملاحظة" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d ملاحظة" - } - }, - "two" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d ملاحظتان" - } - }, - "zero" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d ملاحظات" - } - } - } - } - } - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d notiz" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d notizen" - } - } - } - } - } - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d note" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d notes" - } - } - } - } - } - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d nota" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d notas" - } - } - } - } - } - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d note" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d notes" - } - } - } - } - } - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d הערות" - } - }, - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d הערה" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d הערות" - } - }, - "two" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d הערות" - } - } - } - } - } - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d catatan" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d catatan" - } - } - } - } - } - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d nota" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d note" - } - } - } - } - } - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d件のノート" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d件のノート" - } - } - } - } - } - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d개의 노트" - } - } - } - } - } - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d नोट" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d नोटहरू" - } - } - } - } - } - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d nota" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d notas" - } - } - } - } - } - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "few" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d заметки" - } - }, - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d заметок" - } - }, - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d заметка" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d заметки" - } - } - } - } - } - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "few" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d замітки" - } - }, - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d заміток" - } - }, - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d замітка" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d замітки" - } - } - } - } - } - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - }, - "substitutions" : { - "note_count" : { - "argNum" : 2, - "formatSpecifier" : "lld", - "variations" : { - "plural" : { - "one" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d 条笔记" - } - }, - "other" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d 条笔记" - } - } - } - } - } - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "#%1$@ • %2$#@note_count@" - } - } - } - }, "location_notes.loading_notes" : { "extractionState" : "manual", "localizations" : { @@ -46618,185 +44623,6 @@ } } }, - "location_notes.loading_recent" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "جار تحميل الملاحظات الحديثة…" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "সাম্প্রতিক নোট লোড হচ্ছে…" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "aktuelle notizen werden geladen…" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "loading recent notes…" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "cargando notas recientes…" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "nagse-load ng pinakahuling mga tala…" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "chargement des notes récentes…" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "טוען הערות אחרונות…" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "हाल के नोट लोड हो रहे हैं…" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "memuat catatan terbaru…" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "caricamento note recenti…" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "最新ノートを読み込み中…" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "최근 노트 로딩 중…" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "memuat catatan terbaru…" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "हालैका नोट लोड गर्दै…" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "recentste notities laden…" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "ładowanie ostatnich notatek…" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "a carregar notas recentes…" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "carregando notas recentes…" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "загрузка свежих заметок…" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "laddar senaste anteckningar…" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "சமீபத்திய குறிப்புகள் ஏற்றப்படுகின்றன…" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "กำลังโหลดบันทึกล่าสุด…" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "son notlar yükleniyor…" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "завантаження свіжих заміток…" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "حالیہ نوٹس لوڈ ہو رہے ہیں…" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "đang tải ghi chú gần đây…" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "正在加载最新笔记…" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "正在加載最新筆記…" - } - } - } - }, "location_notes.no_relays_nearby" : { "extractionState" : "manual", "localizations" : { @@ -46976,364 +44802,6 @@ } } }, - "location_notes.placeholder" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "أضف ملاحظة لهذا المكان" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "এই স্থানের জন্য একটি নোট যোগ করুন" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "notiz für diesen ort hinzufügen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "add a note for this place" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "añade una nota para este lugar" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "magdagdag ng tala para sa lugar na ito" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "ajoute une note pour cet endroit" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הוסף הערה למקום הזה" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "इस स्थान के लिए नोट जोड़ें" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "tambahkan catatan untuk tempat ini" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "aggiungi una nota per questo posto" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "この場所のノートを追加" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 장소에 대한 노트 추가" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "tambahkan catatan untuk tempat ini" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "यस स्थानका लागि नोट थप" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "voeg een notitie toe voor deze plek" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "dodaj notatkę do tego miejsca" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "adiciona uma nota para este local" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "adicione uma nota para este lugar" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "добавь заметку для этого места" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "lägg till en anteckning för den här platsen" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "இந்த இடத்திற்கான ஒரு குறிப்பைச் சேர்க்கவும்" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "เพิ่มบันทึกให้สถานที่นี้" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "bu yer için bir not ekleyin" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "додай замітку для цього місця" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "اس جگہ کیلئے نوٹ شامل کریں" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "thêm ghi chú cho nơi này" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "为此地点添加笔记" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "為此地點添加筆記" - } - } - } - }, - "location_notes.relays_paused" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "المرحلات الجغرافية غير متاحة؛ الملاحظات متوقفة" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "জিও রিলে অনুপলব্ধ; নোট স্থগিত" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "geo-relays nicht verfügbar; notizen pausiert" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "geo relays unavailable; notes paused" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "relays geográficos no disponibles; notas en pausa" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "hindi magagamit ang mga geo relay; naka-pause ang mga tala" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "relais géo indisponibles ; notes en pause" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ממסרי geo אינם זמינים; הערות הושהו" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "जियो रिले अनुपलब्ध; नोट रुके हैं" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "relay geo tidak tersedia; catatan dijeda" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "relay geo non disponibili; note in pausa" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ジオリレーが利用不可: ノート一時停止" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "geo 릴레이를 사용할 수 없습니다; 노트가 일시 중지됩니다" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "relay geo tidak tersedia; catatan dijeda" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "georelay उपलब्ध छैन; नोट रोकिएको" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "geo-relays niet beschikbaar; notities gepauzeerd" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "geo relay niedostępne; notatki wstrzymane" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "relés geográficos indisponíveis; notas em pausa" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "relays geográficos indisponíveis; notas pausadas" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "геореле недоступны; заметки приостановлены" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "geo-reläer otillgängliga; anteckningar pausade" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "geo relay கிடைக்கவில்லை; குறிப்புகள் இடைநிறுத்தப்பட்டுள்ளன" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "geo relay ไม่พร้อมใช้งาน บันทึกถูกหยุดชั่วคราว" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "geo röleler kullanılamıyor; notlar durduruldu" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "гео-релеї недоступні; замітки призупинено" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "geo relay دستیاب نہیں؛ نوٹس موقوف" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "relay địa lý không sẵn có; ghi chú bị tạm dừng" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "地理中继不可用;笔记已暂停" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "地理中繼不可用;筆記已暫停" - } - } - } - }, "location_notes.relays_retry_hint" : { "extractionState" : "manual", "localizations" : { @@ -54886,185 +52354,6 @@ } } }, - "system.common.user" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "مستخدم" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "ব্যবহারকারী" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "nutzer" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "user" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "usuario" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "user" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "utilisateur" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "משתמש" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "उपयोगकर्ता" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "pengguna" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "utente" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ユーザー" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사용자" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "pengguna" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "प्रयोगकर्ता" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "gebruiker" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "użytkownik" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "utilizador" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "usuário" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "пользователь" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "användare" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "பயனர்" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "ผู้ใช้" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "kullanıcı" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "користувач" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "صارف" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "người dùng" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "用户" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "使用者" - } - } - } - }, "system.dm.blocked_generic" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Models/BitchatMessage+Media.swift b/bitchat/Models/BitchatMessage+Media.swift index 5706654c..a718e484 100644 --- a/bitchat/Models/BitchatMessage+Media.swift +++ b/bitchat/Models/BitchatMessage+Media.swift @@ -13,13 +13,6 @@ extension BitchatMessage { enum Media { case voice(URL) case image(URL) - - var url: URL { - switch self { - case .voice(let url), .image(let url): - return url - } - } } // Cache the directory lookup to avoid repeated FileManager calls during view rendering diff --git a/bitchat/Models/BitchatPeer.swift b/bitchat/Models/BitchatPeer.swift index 6b69d019..fcccda49 100644 --- a/bitchat/Models/BitchatPeer.swift +++ b/bitchat/Models/BitchatPeer.swift @@ -7,7 +7,6 @@ struct BitchatPeer: Equatable { let peerID: PeerID // Hex-encoded peer ID let noisePublicKey: Data let nickname: String - let lastSeen: Date let isConnected: Bool let isReachable: Bool @@ -77,14 +76,13 @@ struct BitchatPeer: Equatable { peerID: PeerID, noisePublicKey: Data, nickname: String, - lastSeen: Date = Date(), + lastSeen _: Date = Date(), isConnected: Bool = false, isReachable: Bool = false ) { self.peerID = peerID self.noisePublicKey = noisePublicKey self.nickname = nickname - self.lastSeen = lastSeen self.isConnected = isConnected self.isReachable = isReachable diff --git a/bitchat/Noise/NoiseProtocol.swift b/bitchat/Noise/NoiseProtocol.swift index be130f10..a42b86a0 100644 --- a/bitchat/Noise/NoiseProtocol.swift +++ b/bitchat/Noise/NoiseProtocol.swift @@ -723,7 +723,7 @@ final class NoiseHandshakeState { return messageBuffer } - func readMessage(_ message: Data, expectedPayloadLength: Int = 0) throws -> Data { + func readMessage(_ message: Data, expectedPayloadLength _: Int = 0) throws -> Data { guard currentPattern < messagePatterns.count else { throw NoiseError.handshakeComplete diff --git a/bitchat/Noise/NoiseSecurityConstants.swift b/bitchat/Noise/NoiseSecurityConstants.swift index 17781352..67a722b1 100644 --- a/bitchat/Noise/NoiseSecurityConstants.swift +++ b/bitchat/Noise/NoiseSecurityConstants.swift @@ -21,12 +21,6 @@ enum NoiseSecurityConstants { // Maximum number of messages before rekey (2^64 - 1 is the nonce limit) static let maxMessagesPerSession: UInt64 = 1_000_000_000 // 1 billion messages - // Handshake timeout - abandon incomplete handshakes - static let handshakeTimeout: TimeInterval = 60 // 1 minute - - // Maximum concurrent sessions per peer - static let maxSessionsPerPeer = 3 - // Rate limiting static let maxHandshakesPerMinute = 10 static let maxMessagesPerSecond = 100 diff --git a/bitchat/Noise/NoiseSecurityError.swift b/bitchat/Noise/NoiseSecurityError.swift index aff73c8b..8ffba1eb 100644 --- a/bitchat/Noise/NoiseSecurityError.swift +++ b/bitchat/Noise/NoiseSecurityError.swift @@ -14,5 +14,4 @@ enum NoiseSecurityError: Error { case messageTooLarge case invalidPeerID case rateLimitExceeded - case handshakeTimeout } diff --git a/bitchat/Noise/NoiseSessionManager.swift b/bitchat/Noise/NoiseSessionManager.swift index 9029b228..619f84ac 100644 --- a/bitchat/Noise/NoiseSessionManager.swift +++ b/bitchat/Noise/NoiseSessionManager.swift @@ -13,8 +13,6 @@ import BitFoundation final class NoiseSessionManager { private var sessions: [PeerID: NoiseSession] = [:] - private let localStaticKey: Curve25519.KeyAgreement.PrivateKey - private let keychain: KeychainManagerProtocol private let sessionFactory: (PeerID, NoiseRole) -> NoiseSession private let managerQueue = DispatchQueue(label: "chat.bitchat.noise.manager", attributes: .concurrent) @@ -23,8 +21,6 @@ final class NoiseSessionManager { var onSessionFailed: ((PeerID, Error) -> Void)? init(localStaticKey: Curve25519.KeyAgreement.PrivateKey, keychain: KeychainManagerProtocol) { - self.localStaticKey = localStaticKey - self.keychain = keychain self.sessionFactory = { peerID, role in SecureNoiseSession( peerID: peerID, @@ -37,12 +33,10 @@ final class NoiseSessionManager { #if DEBUG init( - localStaticKey: Curve25519.KeyAgreement.PrivateKey, - keychain: KeychainManagerProtocol, + localStaticKey _: Curve25519.KeyAgreement.PrivateKey, + keychain _: KeychainManagerProtocol, sessionFactory: @escaping (PeerID, NoiseRole) -> NoiseSession ) { - self.localStaticKey = localStaticKey - self.keychain = keychain self.sessionFactory = sessionFactory } #endif diff --git a/bitchat/Nostr/NostrIdentity.swift b/bitchat/Nostr/NostrIdentity.swift index 72fb7bbf..7dedfd08 100644 --- a/bitchat/Nostr/NostrIdentity.swift +++ b/bitchat/Nostr/NostrIdentity.swift @@ -6,14 +6,12 @@ struct NostrIdentity: Codable { let privateKey: Data let publicKey: Data let npub: String // Bech32-encoded public key - let createdAt: Date - + /// Memberwise initializer - init(privateKey: Data, publicKey: Data, npub: String, createdAt: Date) { + init(privateKey: Data, publicKey: Data, npub: String, createdAt _: Date) { self.privateKey = privateKey self.publicKey = publicKey self.npub = npub - self.createdAt = createdAt } /// Generate a new Nostr identity @@ -39,12 +37,6 @@ struct NostrIdentity: Codable { self.privateKey = privateKeyData self.publicKey = xOnlyPubkey self.npub = try Bech32.encode(hrp: "npub", data: xOnlyPubkey) - self.createdAt = Date() - } - - /// Get signing key for event signatures - func signingKey() throws -> P256K.Signing.PrivateKey { - try P256K.Signing.PrivateKey(dataRepresentation: privateKey) } /// Get Schnorr signing key for Nostr event signatures diff --git a/bitchat/Nostr/NostrIdentityBridge.swift b/bitchat/Nostr/NostrIdentityBridge.swift index a2e091ba..ab0c89db 100644 --- a/bitchat/Nostr/NostrIdentityBridge.swift +++ b/bitchat/Nostr/NostrIdentityBridge.swift @@ -37,14 +37,6 @@ final class NostrIdentityBridge { return nostrIdentity } - /// Associate a Nostr identity with a Noise public key (for favorites) - func associateNostrIdentity(_ nostrPubkey: String, with noisePublicKey: Data) { - let key = "nostr-noise-\(noisePublicKey.base64EncodedString())" - if let data = nostrPubkey.data(using: .utf8) { - keychain.save(key: key, data: data, service: keychainService, accessible: nil) - } - } - /// Get Nostr public key associated with a Noise public key func getNostrPublicKey(for noisePublicKey: Data) -> String? { let key = "nostr-noise-\(noisePublicKey.base64EncodedString())" diff --git a/bitchat/Nostr/NostrProtocol.swift b/bitchat/Nostr/NostrProtocol.swift index 7e39bdb4..7168b818 100644 --- a/bitchat/Nostr/NostrProtocol.swift +++ b/bitchat/Nostr/NostrProtocol.swift @@ -548,37 +548,6 @@ struct NostrProtocol { return sharedSecretData } - // Direct version that doesn't try to add prefixes - private static func deriveSharedSecretDirect( - privateKey: P256K.Schnorr.PrivateKey, - publicKey: Data - ) throws -> Data { - // Direct shared secret calculation - - // Convert Schnorr private key to KeyAgreement private key - let keyAgreementPrivateKey = try P256K.KeyAgreement.PrivateKey( - dataRepresentation: privateKey.dataRepresentation - ) - - // Use the public key as-is (should already have prefix) - let keyAgreementPublicKey = try P256K.KeyAgreement.PublicKey( - dataRepresentation: publicKey, - format: .compressed - ) - - // Perform ECDH - let sharedSecret = try keyAgreementPrivateKey.sharedSecretFromKeyAgreement( - with: keyAgreementPublicKey, - format: .compressed - ) - - // Convert SharedSecret to Data - let sharedSecretData = sharedSecret.withUnsafeBytes { Data($0) } - - // Return raw ECDH shared secret; HKDF is applied by deriveNIP44V2Key - return sharedSecretData - } - private static func randomizedTimestamp() -> Date { // Add random offset to current time for privacy // This prevents timing correlation attacks while the actual message timestamp @@ -708,11 +677,8 @@ struct NostrEvent: Codable { enum NostrError: Error { case invalidPublicKey - case invalidPrivateKey case invalidEvent case invalidCiphertext - case signingFailed - case encryptionFailed } // MARK: - NIP-44 v2 helpers (XChaCha20-Poly1305) diff --git a/bitchat/Nostr/NostrRelayManager.swift b/bitchat/Nostr/NostrRelayManager.swift index e1de49d6..004ba5f3 100644 --- a/bitchat/Nostr/NostrRelayManager.swift +++ b/bitchat/Nostr/NostrRelayManager.swift @@ -117,7 +117,6 @@ final class NostrRelayManager: ObservableObject { let url: String var isConnected: Bool = false var lastError: Error? - var lastConnectedAt: Date? var messagesSent: Int = 0 var messagesReceived: Int = 0 var reconnectAttempts: Int = 0 @@ -347,7 +346,6 @@ final class NostrRelayManager: ObservableObject { relays[index].nextReconnectTime = nil if resetState { relays[index].lastError = nil - relays[index].lastConnectedAt = nil relays[index].lastDisconnectedAt = nil relays[index].messagesSent = 0 relays[index].messagesReceived = 0 @@ -1075,7 +1073,6 @@ final class NostrRelayManager: ObservableObject { relays[index].isConnected = isConnected relays[index].lastError = error if isConnected { - relays[index].lastConnectedAt = dependencies.now() relays[index].reconnectAttempts = 0 // Reset on successful connection relays[index].nextReconnectTime = nil } else { diff --git a/bitchat/Protocols/Geohash.swift b/bitchat/Protocols/Geohash.swift index 6fbb2b90..d0061c5c 100644 --- a/bitchat/Protocols/Geohash.swift +++ b/bitchat/Protocols/Geohash.swift @@ -10,14 +10,6 @@ enum Geohash { return map }() - /// Validates a geohash string for building-level precision (8 characters). - /// - Parameter geohash: The geohash string to validate - /// - Returns: true if valid 8-character base32 geohash, false otherwise - static func isValidBuildingGeohash(_ geohash: String) -> Bool { - guard geohash.count == 8 else { return false } - return geohash.lowercased().allSatisfy { base32Map[$0] != nil } - } - /// Validates a geohash string at any channel precision (1-12 characters). /// - Parameter geohash: The geohash string to validate /// - Returns: true if a non-empty base32 geohash of at most 12 characters diff --git a/bitchat/Services/AutocompleteService.swift b/bitchat/Services/AutocompleteService.swift index 6b672d53..9ae47df9 100644 --- a/bitchat/Services/AutocompleteService.swift +++ b/bitchat/Services/AutocompleteService.swift @@ -11,14 +11,7 @@ import Foundation /// Manages autocomplete functionality for chat final class AutocompleteService { private let mentionRegex = try? NSRegularExpression(pattern: "@([\\p{L}0-9_]*)$", options: []) - private let commandRegex = try? NSRegularExpression(pattern: "^/([a-z]*)$", options: []) - - private let commands = [ - "/msg", "/who", "/clear", - "/hug", "/slap", "/fav", "/unfav", - "/block", "/unblock" - ] - + /// Get autocomplete suggestions for current text func getSuggestions(for text: String, peers: [String], cursorPosition: Int) -> (suggestions: [String], range: NSRange?) { let textToPosition = String(text.prefix(cursorPosition)) @@ -73,26 +66,6 @@ final class AutocompleteService { return suggestions.isEmpty ? nil : (Array(suggestions), fullRange) } - private func getCommandSuggestions(_ text: String) -> ([String], NSRange)? { - guard let regex = commandRegex else { return nil } - - let nsText = text as NSString - let matches = regex.matches(in: text, options: [], range: NSRange(location: 0, length: nsText.length)) - - guard let match = matches.last else { return nil } - - let fullRange = match.range(at: 0) - let captureRange = match.range(at: 1) - let prefix = nsText.substring(with: captureRange).lowercased() - - let suggestions = commands - .filter { $0.hasPrefix("/\(prefix)") } - .sorted() - .prefix(5) - - return suggestions.isEmpty ? nil : (Array(suggestions), fullRange) - } - private func needsArgument(command: String) -> Bool { switch command { case "/who", "/clear": diff --git a/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift b/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift index 83311584..9550e196 100644 --- a/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift +++ b/bitchat/Services/BLE/BLEFragmentAssemblyBuffer.swift @@ -61,7 +61,6 @@ struct BLEFragmentAssemblyBuffer { } private struct Metadata { - let type: UInt8 let total: Int let timestamp: Date let isBroadcast: Bool @@ -150,7 +149,6 @@ struct BLEFragmentAssemblyBuffer { fragmentsByKey[header.key] = [:] metadataByKey[header.key] = Metadata( - type: header.originalType, total: header.total, timestamp: now, isBroadcast: header.isBroadcastFragment, diff --git a/bitchat/Services/BLE/BLELogRateLimiter.swift b/bitchat/Services/BLE/BLELogRateLimiter.swift index 65892970..e1e246d8 100644 --- a/bitchat/Services/BLE/BLELogRateLimiter.swift +++ b/bitchat/Services/BLE/BLELogRateLimiter.swift @@ -25,9 +25,4 @@ final class BLELogRateLimiter { } } - func removeAll() { - queue.sync { - lastLogTimeByKey.removeAll() - } - } } diff --git a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift index 9449dfa9..ddcc4abc 100644 --- a/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift +++ b/bitchat/Services/BLE/BLEOutboundPacketPolicy.swift @@ -20,7 +20,7 @@ enum BLEOutboundPacketPolicy { } } - static func priority(for packet: BitchatPacket, data: Data) -> BLEOutboundWritePriority { + static func priority(for packet: BitchatPacket, data _: Data) -> BLEOutboundWritePriority { guard let messageType = MessageType(rawValue: packet.type) else { return .low } switch messageType { case .fragment: diff --git a/bitchat/Services/BLE/BLEPeerRegistry.swift b/bitchat/Services/BLE/BLEPeerRegistry.swift index 41ef8098..dc714d13 100644 --- a/bitchat/Services/BLE/BLEPeerRegistry.swift +++ b/bitchat/Services/BLE/BLEPeerRegistry.swift @@ -141,14 +141,6 @@ struct BLEPeerRegistry { } } - func collisionResolvedNickname(for peerID: PeerID, selfNickname: String) -> String? { - guard let info = peers[peerID], info.isVerifiedNickname else { return nil } - let hasCollision = peers.values.contains { - $0.isConnected && $0.nickname == info.nickname && $0.peerID != peerID - } || selfNickname == info.nickname - return hasCollision ? info.nickname + "#" + String(peerID.id.prefix(4)) : info.nickname - } - mutating func markDisconnected(_ peerID: PeerID) { guard var info = peers[peerID] else { return } info.isConnected = false diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 88cb0be2..ba46d7b3 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -10,7 +10,6 @@ import UIKit /// BLEService — Bluetooth Mesh Transport /// - Emits events exclusively via `BitchatDelegate` for UI. /// - ChatViewModel must consume delegate callbacks (`didReceivePublicMessage`, `didReceiveNoisePayload`). -/// - A lightweight `peerSnapshotPublisher` is provided for non-UI services. final class BLEService: NSObject { // MARK: - Constants @@ -493,13 +492,6 @@ final class BLEService: NSObject { weak var delegate: BitchatDelegate? weak var eventDelegate: TransportEventDelegate? weak var peerEventsDelegate: TransportPeerEventsDelegate? - - // MARK: Peer snapshots publisher (non-UI convenience) - - private let peerSnapshotSubject = PassthroughSubject<[TransportPeerSnapshot], Never>() - var peerSnapshotPublisher: AnyPublisher<[TransportPeerSnapshot], Never> { - peerSnapshotSubject.eraseToAnyPublisher() - } func currentPeerSnapshots() -> [TransportPeerSnapshot] { collectionsQueue.sync { @@ -1323,7 +1315,7 @@ final class BLEService: NSObject { } } - private func handleLeave(_ packet: BitchatPacket, from peerID: PeerID) { + private func handleLeave(_: BitchatPacket, from peerID: PeerID) { _ = collectionsQueue.sync(flags: .barrier) { // Remove the peer when they leave peerRegistry.remove(peerID) @@ -2174,7 +2166,7 @@ extension BLEService: CBPeripheralDelegate { } } - private func processNotificationPacket(_ packet: BitchatPacket, from peripheral: CBPeripheral, peripheralUUID: String, receivedFrom peerID: PeerID) { + private func processNotificationPacket(_ packet: BitchatPacket, from _: CBPeripheral, peripheralUUID: String, receivedFrom peerID: PeerID) { let senderID = PeerID(hexData: packet.senderID) if packet.type != MessageType.announce.rawValue { @@ -3422,7 +3414,7 @@ extension BLEService { /// Transport-level handling for a received nostrCarrier packet; policy /// (verification of the carried event, quotas, loop prevention) lives in /// `GatewayService` behind `onNostrCarrierPacket`. - private func handleNostrCarrier(_ packet: BitchatPacket, from peerID: PeerID) { + private func handleNostrCarrier(_ packet: BitchatPacket, from _: PeerID) { let senderID = PeerID(hexData: packet.senderID) let directedToUs: Bool if let recipientID = packet.recipientID { @@ -4476,7 +4468,7 @@ extension BLEService { /// gossip backfill and hand the payload to the UI layer, where the group /// coordinator decrypts and authenticates against the roster. Non-members /// still relay (generic broadcast relay path) but never decode. - private func handleGroupMessage(_ packet: BitchatPacket, from peerID: PeerID) { + private func handleGroupMessage(_ packet: BitchatPacket, from _: PeerID) { let isBroadcastRecipient: Bool = { guard let recipient = packet.recipientID else { return true } return recipient.count == 8 && recipient.allSatisfy { $0 == 0xFF } @@ -4636,8 +4628,6 @@ extension BLEService { let transportPeers: [TransportPeerSnapshot] = collectionsQueue.sync { peerRegistry.transportSnapshots(selfNickname: myNickname) } - // Notify non-UI listeners - peerSnapshotSubject.send(transportPeers) // Notify UI on MainActor via delegate Task { @MainActor [weak self] in self?.peerEventsDelegate?.didUpdatePeerSnapshots(transportPeers) diff --git a/bitchat/Services/Board/BoardManager.swift b/bitchat/Services/Board/BoardManager.swift index 1f307bd4..8c758fa8 100644 --- a/bitchat/Services/Board/BoardManager.swift +++ b/bitchat/Services/Board/BoardManager.swift @@ -19,7 +19,6 @@ final class BoardManager: ObservableObject { @Published private(set) var posts: [BoardPostPacket] = [] private let transport: Transport - private let store: BoardStore /// Publishes a bridged kind-1 note (expiring with the board post via /// NIP-40) and returns its Nostr event id, or nil when bridging failed or /// was skipped. @@ -39,7 +38,6 @@ final class BoardManager: ObservableObject { deleteFromNostr: ((String, String) -> Void)? = nil ) { self.transport = transport - self.store = store self.publishToNostr = publishToNostr ?? Self.livePublishToNostr self.deleteFromNostr = deleteFromNostr ?? Self.liveDeleteFromNostr cancellable = store.$postsSnapshot diff --git a/bitchat/Services/Board/BoardStore.swift b/bitchat/Services/Board/BoardStore.swift index c96670d0..db6a9605 100644 --- a/bitchat/Services/Board/BoardStore.swift +++ b/bitchat/Services/Board/BoardStore.swift @@ -146,14 +146,6 @@ final class BoardStore { // MARK: - Maintenance - func pruneExpired() { - let nowMs = currentMs() - queue.sync { - pruneExpiredLocked(nowMs: nowMs) - persistLocked() - } - } - /// Panic wipe: drop all board data from memory and disk. func wipe() { queue.sync { diff --git a/bitchat/Services/Courier/CourierStore.swift b/bitchat/Services/Courier/CourierStore.swift index a24eb371..06bfc7c1 100644 --- a/bitchat/Services/Courier/CourierStore.swift +++ b/bitchat/Services/Courier/CourierStore.swift @@ -272,14 +272,6 @@ final class CourierStore { // MARK: - Maintenance - func pruneExpired() { - let date = now() - queue.sync { - pruneExpiredLocked(at: date) - persistLocked() - } - } - /// Panic wipe: drop all carried mail from memory and disk. func wipe() { queue.sync { diff --git a/bitchat/Services/Courier/StoreAndForwardMetrics.swift b/bitchat/Services/Courier/StoreAndForwardMetrics.swift index 5452f357..4fddf251 100644 --- a/bitchat/Services/Courier/StoreAndForwardMetrics.swift +++ b/bitchat/Services/Courier/StoreAndForwardMetrics.swift @@ -58,12 +58,6 @@ final class StoreAndForwardMetrics { SecureLogger.debug("📊 S&F \(event.rawValue) → \(total)", category: .session) } - func snapshot() -> [String: Int] { - lock.lock() - defer { lock.unlock() } - return counts - } - /// Included in the panic wipe alongside the stores it describes. func reset() { lock.lock() diff --git a/bitchat/Services/Gateway/GatewayService.swift b/bitchat/Services/Gateway/GatewayService.swift index c8d13756..3b5ec30a 100644 --- a/bitchat/Services/Gateway/GatewayService.swift +++ b/bitchat/Services/Gateway/GatewayService.swift @@ -82,7 +82,6 @@ final class GatewayService: ObservableObject { let depositor: PeerID let geohash: String let event: NostrEvent - let queuedAt: Date } static let shared = GatewayService() @@ -221,7 +220,7 @@ final class GatewayService: ObservableObject { publish(event, geohash: carrier.geohash) accepted = true } else { - accepted = enqueueUplink(QueuedUplink(depositor: depositor, geohash: carrier.geohash, event: event, queuedAt: now())) + accepted = enqueueUplink(QueuedUplink(depositor: depositor, geohash: carrier.geohash, event: event)) } // Only render on our own timeline what we actually accepted for diff --git a/bitchat/Services/GeohashParticipantTracker.swift b/bitchat/Services/GeohashParticipantTracker.swift index 0e46ad34..be1ea35e 100644 --- a/bitchat/Services/GeohashParticipantTracker.swift +++ b/bitchat/Services/GeohashParticipantTracker.swift @@ -9,12 +9,12 @@ import Foundation /// Represents a participant in a geohash channel -public struct GeoPerson: Identifiable, Equatable, Sendable { - public let id: String // pubkey hex (lowercased) - public let displayName: String - public let lastSeen: Date +struct GeoPerson: Identifiable, Equatable, Sendable { + let id: String // pubkey hex (lowercased) + let displayName: String + let lastSeen: Date - public init(id: String, displayName: String, lastSeen: Date) { + init(id: String, displayName: String, lastSeen: Date) { self.id = id self.displayName = displayName self.lastSeen = lastSeen @@ -23,7 +23,7 @@ public struct GeoPerson: Identifiable, Equatable, Sendable { /// Protocol for resolving display names and checking block status @MainActor -public protocol GeohashParticipantContext: AnyObject { +protocol GeohashParticipantContext: AnyObject { /// Returns display name for a Nostr pubkey (e.g., "alice#a1b2" or "anon#c3d4") func displayNameForPubkey(_ pubkeyHex: String) -> String /// Returns true if the pubkey is blocked @@ -32,16 +32,16 @@ public protocol GeohashParticipantContext: AnyObject { /// Tracks participants across multiple geohash channels @MainActor -public final class GeohashParticipantTracker: ObservableObject { +final class GeohashParticipantTracker: ObservableObject { /// Activity cutoff duration (defaults to 5 minutes) - public let activityCutoff: TimeInterval + let activityCutoff: TimeInterval /// Per-geohash participant map: [geohash: [pubkeyHex: lastSeen]] private var participants: [String: [String: Date]] = [:] /// Currently visible people for the active geohash - @Published public private(set) var visiblePeople: [GeoPerson] = [] + @Published private(set) var visiblePeople: [GeoPerson] = [] /// The currently active geohash (if any) private var activeGeohash: String? @@ -52,17 +52,17 @@ public final class GeohashParticipantTracker: ObservableObject { /// Timer for periodic refresh private var refreshTimer: Timer? - public init(activityCutoff: TimeInterval = -300) { // default 5 minutes + init(activityCutoff: TimeInterval = -300) { // default 5 minutes self.activityCutoff = activityCutoff } /// Configure with a context provider - public func configure(context: GeohashParticipantContext) { + func configure(context: GeohashParticipantContext) { self.context = context } /// Set the currently active geohash - public func setActiveGeohash(_ geohash: String?) { + func setActiveGeohash(_ geohash: String?) { activeGeohash = geohash if geohash == nil { visiblePeople = [] @@ -72,13 +72,13 @@ public final class GeohashParticipantTracker: ObservableObject { } /// Record activity from a participant in the current active geohash - public func recordParticipant(pubkeyHex: String) { + func recordParticipant(pubkeyHex: String) { guard let gh = activeGeohash else { return } recordParticipant(pubkeyHex: pubkeyHex, geohash: gh) } /// Record activity from a participant in a specific geohash - public func recordParticipant(pubkeyHex: String, geohash: String) { + func recordParticipant(pubkeyHex: String, geohash: String) { let key = pubkeyHex.lowercased() var map = participants[geohash] ?? [:] map[key] = Date() @@ -94,7 +94,7 @@ public final class GeohashParticipantTracker: ObservableObject { } /// Remove a participant from all geohashes (used when blocking) - public func removeParticipant(pubkeyHex: String) { + func removeParticipant(pubkeyHex: String) { let key = pubkeyHex.lowercased() for (gh, var map) in participants { map.removeValue(forKey: key) @@ -104,14 +104,14 @@ public final class GeohashParticipantTracker: ObservableObject { } /// Get participant count for a specific geohash - public func participantCount(for geohash: String) -> Int { + func participantCount(for geohash: String) -> Int { let cutoff = Date().addingTimeInterval(activityCutoff) let map = participants[geohash] ?? [:] return map.values.filter { $0 >= cutoff }.count } /// Get the visible people list for the active geohash (read-only query) - public func getVisiblePeople() -> [GeoPerson] { + func getVisiblePeople() -> [GeoPerson] { guard let gh = activeGeohash, let context = context else { return [] } let cutoff = Date().addingTimeInterval(activityCutoff) let map = (participants[gh] ?? [:]) @@ -126,12 +126,12 @@ public final class GeohashParticipantTracker: ObservableObject { } /// Refresh the visible people list - public func refresh() { + func refresh() { visiblePeople = getVisiblePeople() } /// Start the periodic refresh timer - public func startRefreshTimer(interval: TimeInterval = 30.0) { + func startRefreshTimer(interval: TimeInterval = 30.0) { stopRefreshTimer() refreshTimer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { [weak self] _ in Task { @MainActor in @@ -141,19 +141,19 @@ public final class GeohashParticipantTracker: ObservableObject { } /// Stop the periodic refresh timer - public func stopRefreshTimer() { + func stopRefreshTimer() { refreshTimer?.invalidate() refreshTimer = nil } /// Clear all participant data - public func clear() { + func clear() { participants.removeAll() visiblePeople = [] } /// Clear participant data for a specific geohash - public func clear(geohash: String) { + func clear(geohash: String) { participants.removeValue(forKey: geohash) if activeGeohash == geohash { visiblePeople = [] diff --git a/bitchat/Services/Groups/GroupProtocol.swift b/bitchat/Services/Groups/GroupProtocol.swift index dc4a0abf..8f4a09d1 100644 --- a/bitchat/Services/Groups/GroupProtocol.swift +++ b/bitchat/Services/Groups/GroupProtocol.swift @@ -406,7 +406,6 @@ enum GroupCryptoError: Error, Equatable { case malformedPayload case signingFailed case sealFailed - case wrongEpoch case decryptionFailed case badSenderSignature } diff --git a/bitchat/Services/KeychainManager.swift b/bitchat/Services/KeychainManager.swift index 54d2ff93..39035547 100644 --- a/bitchat/Services/KeychainManager.swift +++ b/bitchat/Services/KeychainManager.swift @@ -255,11 +255,6 @@ final class KeychainManager: KeychainManagerProtocol { // MARK: - Generic Operations - private func save(_ value: String, forKey key: String) -> Bool { - guard let data = value.data(using: .utf8) else { return false } - return saveData(data, forKey: key) - } - private func saveData(_ data: Data, forKey key: String) -> Bool { // Delete any existing item first to ensure clean state _ = delete(forKey: key) @@ -305,11 +300,6 @@ final class KeychainManager: KeychainManagerProtocol { return false } - private func retrieve(forKey key: String) -> String? { - guard let data = retrieveData(forKey: key) else { return nil } - return String(data: data, encoding: .utf8) - } - private func retrieveData(forKey key: String) -> Data? { // Base query let base: [String: Any] = [ @@ -365,22 +355,7 @@ final class KeychainManager: KeychainManagerProtocol { } // MARK: - Cleanup - - func deleteAllPasswords() -> Bool { - var query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword - ] - - // Add service if not empty - if !service.isEmpty { - query[kSecAttrService as String] = service - } - - let status = SecItemDelete(query as CFDictionary) - return status == errSecSuccess || status == errSecItemNotFound - } - - + // Delete ALL keychain data for panic mode func deleteAllKeychainData() -> Bool { SecureLogger.warning("Panic mode - deleting all keychain data", category: .security) diff --git a/bitchat/Services/LocationStateManager.swift b/bitchat/Services/LocationStateManager.swift index aca9fb87..36fb4bc4 100644 --- a/bitchat/Services/LocationStateManager.swift +++ b/bitchat/Services/LocationStateManager.swift @@ -101,9 +101,7 @@ final class LocationStateManager: NSObject, CLLocationManagerDelegate, Observabl private let cl: LocationStateManaging private let geocoder: LocationStateGeocoding - private var lastLocation: CLLocation? private var refreshTimer: Timer? - private var isGeocoding: Bool = false // MARK: - Persistence Keys @@ -268,7 +266,7 @@ final class LocationStateManager: NSObject, CLLocationManagerDelegate, Observabl } } - func beginLiveRefresh(interval: TimeInterval = TransportConfig.locationLiveRefreshInterval) { + func beginLiveRefresh(interval _: TimeInterval = TransportConfig.locationLiveRefreshInterval) { guard permissionState == .authorized else { return } refreshTimer?.invalidate() refreshTimer = nil @@ -385,7 +383,6 @@ final class LocationStateManager: NSObject, CLLocationManagerDelegate, Observabl func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { guard let loc = locations.last else { return } - lastLocation = loc computeChannels(from: loc.coordinate) reverseGeocodeLocation(loc) } @@ -441,10 +438,8 @@ final class LocationStateManager: NSObject, CLLocationManagerDelegate, Observabl private func reverseGeocodeLocation(_ location: CLLocation) { geocoder.cancelGeocode() - isGeocoding = true geocoder.reverseGeocodeLocation(location) { [weak self] placemarks, _ in guard let self = self else { return } - self.isGeocoding = false if let pm = placemarks?.first { let names = self.locationNamesByLevel(from: pm) Task { @MainActor in self.locationNames = names } @@ -632,15 +627,5 @@ extension LocationStateManager { func toggle(_ geohash: String) { toggleBookmark(geohash) } - - /// Backward compatibility: add bookmark (was GeohashBookmarksStore.add) - func add(_ geohash: String) { - addBookmark(geohash) - } - - /// Backward compatibility: remove bookmark (was GeohashBookmarksStore.remove) - func remove(_ geohash: String) { - removeBookmark(geohash) - } } #endif diff --git a/bitchat/Services/MessageFormattingEngine.swift b/bitchat/Services/MessageFormattingEngine.swift index 71abcbe4..4bd4b073 100644 --- a/bitchat/Services/MessageFormattingEngine.swift +++ b/bitchat/Services/MessageFormattingEngine.swift @@ -70,10 +70,6 @@ final class MessageFormattingEngine { static let quickCashuPresence: NSRegularExpression = { try! NSRegularExpression(pattern: "\\bcashu[AB][A-Za-z0-9._-]{40,}\\b", options: []) }() - - static let simplifyHTTPURL: NSRegularExpression = { - try! NSRegularExpression(pattern: "https?://[^\\s?#]+(?:[?#][^\\s]*)?", options: [.caseInsensitive]) - }() } // MARK: - Match Types @@ -195,7 +191,7 @@ final class MessageFormattingEngine { // MARK: - Private Helpers - private static func formatSystemMessage(_ message: BitchatMessage, isDark: Bool) -> AttributedString { + private static func formatSystemMessage(_ message: BitchatMessage, isDark _: Bool) -> AttributedString { var result = AttributedString() let content = AttributedString("* \(message.content) *") @@ -414,7 +410,7 @@ final class MessageFormattingEngine { return AttributedString(text).mergingAttributes(style) } - private static func formatMatch(_ text: String, type: MatchType, baseColor: Color, isSelf: Bool) -> AttributedString { + private static func formatMatch(_ text: String, type: MatchType, baseColor _: Color, isSelf _: Bool) -> AttributedString { var style = AttributeContainer() switch type { diff --git a/bitchat/Services/MessageRouter.swift b/bitchat/Services/MessageRouter.swift index 976b8eb8..54b53ee8 100644 --- a/bitchat/Services/MessageRouter.swift +++ b/bitchat/Services/MessageRouter.swift @@ -311,13 +311,6 @@ final class MessageRouter { } } - func sendDeliveryAck(_ messageID: String, to peerID: PeerID) { - if let transport = reachableTransport(for: peerID) { - SecureLogger.debug("Routing DELIVERED ack via \(type(of: transport)) to \(peerID.id.prefix(8))… id=\(messageID.prefix(8))…", category: .session) - transport.sendDeliveryAck(for: messageID, to: peerID) - } - } - func sendFavoriteNotification(to peerID: PeerID, isFavorite: Bool) { if let transport = connectedTransport(for: peerID) { transport.sendFavoriteNotification(to: peerID, isFavorite: isFavorite) diff --git a/bitchat/Services/NoiseEncryptionService.swift b/bitchat/Services/NoiseEncryptionService.swift index 9e7e6eae..3e0aae6b 100644 --- a/bitchat/Services/NoiseEncryptionService.swift +++ b/bitchat/Services/NoiseEncryptionService.swift @@ -153,11 +153,11 @@ enum EncryptionStatus: Equatable { final class NoiseEncryptionService { // Static identity key (persistent across sessions) private let staticIdentityKey: Curve25519.KeyAgreement.PrivateKey - public let staticIdentityPublicKey: Curve25519.KeyAgreement.PublicKey + let staticIdentityPublicKey: Curve25519.KeyAgreement.PublicKey // Ed25519 signing key (persistent across sessions) private let signingKey: Curve25519.Signing.PrivateKey - public let signingPublicKey: Curve25519.Signing.PublicKey + let signingPublicKey: Curve25519.Signing.PublicKey // Session manager private let sessionManager: NoiseSessionManager diff --git a/bitchat/Services/NostrTransport.swift b/bitchat/Services/NostrTransport.swift index 9dd6ad68..dc8418a8 100644 --- a/bitchat/Services/NostrTransport.swift +++ b/bitchat/Services/NostrTransport.swift @@ -13,7 +13,6 @@ final class NostrTransport: Transport, @unchecked Sendable { let currentIdentity: @MainActor () throws -> NostrIdentity? let registerPendingGiftWrap: @MainActor (String) -> Void let sendEvent: @MainActor (NostrEvent) -> Void - let scheduleAfter: @Sendable (TimeInterval, @escaping @Sendable () -> Void) -> Void /// Emits whether a relay that carries private messages is up /// (fail-closed behind Tor). A connected geohash/custom relay alone /// doesn't count: DM sends target the default relay set and would @@ -42,7 +41,6 @@ final class NostrTransport: Transport, @unchecked Sendable { self.currentIdentity = currentIdentity self.registerPendingGiftWrap = registerPendingGiftWrap self.sendEvent = sendEvent - self.scheduleAfter = scheduleAfter self.relayConnectivity = relayConnectivity // Default pacer drives its throttle through the same injected // scheduler, so tests that step scheduleAfter manually keep @@ -130,8 +128,6 @@ final class NostrTransport: Transport, @unchecked Sendable { } } static let sharedAckPacer = AckPacer() - private let keychain: KeychainManagerProtocol - private let idBridge: NostrIdentityBridge private let dependencies: Dependencies private var favoriteStatusObserver: NSObjectProtocol? @@ -145,12 +141,10 @@ final class NostrTransport: Transport, @unchecked Sendable { @MainActor init( - keychain: KeychainManagerProtocol, + keychain _: KeychainManagerProtocol, idBridge: NostrIdentityBridge, dependencies: Dependencies? = nil ) { - self.keychain = keychain - self.idBridge = idBridge self.dependencies = dependencies ?? .live(idBridge: idBridge) setupObservers() @@ -207,9 +201,6 @@ final class NostrTransport: Transport, @unchecked Sendable { weak var eventDelegate: TransportEventDelegate? weak var peerEventsDelegate: TransportPeerEventsDelegate? - var peerSnapshotPublisher: AnyPublisher<[TransportPeerSnapshot], Never> { - Just([]).eraseToAnyPublisher() - } func currentPeerSnapshots() -> [TransportPeerSnapshot] { [] } var myPeerID: PeerID { senderPeerID } diff --git a/bitchat/Services/PrivateChatManager.swift b/bitchat/Services/PrivateChatManager.swift index c979b073..513acebb 100644 --- a/bitchat/Services/PrivateChatManager.swift +++ b/bitchat/Services/PrivateChatManager.swift @@ -28,7 +28,6 @@ final class PrivateChatManager: ObservableObject { @Published private(set) var selectedPeer: PeerID? = nil private var selectedPeerMirrorCancellable: AnyCancellable? = nil - private var selectedPeerFingerprint: String? = nil var sentReadReceipts: Set = [] // Made accessible for ChatViewModel weak var meshService: Transport? @@ -219,18 +218,13 @@ final class PrivateChatManager: ObservableObject { /// Start a private chat with a peer. Selection is mutated through the /// store's intent (the store owns it); the manager keeps its side - /// effects (fingerprint tracking, read receipts, unread clearing). + /// effects (read receipts, unread clearing). @MainActor func startChat(with peerID: PeerID) { // Also creates the conversation if needed and updates the derived // `selectedConversationID`; `selectedPeer` mirrors the change. conversationStore?.setSelectedPrivatePeer(peerID) - // Store fingerprint for persistence across reconnections - if let fingerprint = meshService?.getFingerprint(for: peerID) { - selectedPeerFingerprint = fingerprint - } - // Mark messages as read markAsRead(from: peerID) } @@ -239,15 +233,8 @@ final class PrivateChatManager: ObservableObject { /// channel's conversation). func endChat() { conversationStore?.setSelectedPrivatePeer(nil) - selectedPeerFingerprint = nil } - /// No-op since the `ConversationStore` cutover: the store maintains - /// chronological order and dedups by message ID on every insert, so the - /// per-append re-sort/dedup sweep this performed is no longer needed. - /// Kept only for API compatibility until step 5 removes the callers. - func sanitizeChat(for peerID: PeerID) {} - /// Mark messages from a peer as read @MainActor func markAsRead(from peerID: PeerID) { diff --git a/bitchat/Services/RelayController.swift b/bitchat/Services/RelayController.swift index dc87fabf..7dbcf4ab 100644 --- a/bitchat/Services/RelayController.swift +++ b/bitchat/Services/RelayController.swift @@ -12,7 +12,7 @@ struct RelayController { static func decide(ttl: UInt8, senderIsSelf: Bool, recipientIsSelf: Bool = false, - isEncrypted: Bool, + isEncrypted _: Bool, isDirectedEncrypted: Bool, isFragment: Bool, isDirectedFragment: Bool, diff --git a/bitchat/Services/TransferProgressManager.swift b/bitchat/Services/TransferProgressManager.swift index 3ab721ba..4c6a34d8 100644 --- a/bitchat/Services/TransferProgressManager.swift +++ b/bitchat/Services/TransferProgressManager.swift @@ -49,12 +49,6 @@ final class TransferProgressManager { } } - func reset(id: String) { - queue.async(flags: .barrier) { [weak self] in - self?.states.removeValue(forKey: id) - } - } - func snapshot(id: String) -> (sent: Int, total: Int)? { var result: (sent: Int, total: Int)? queue.sync { diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 82bcc166..62712db7 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -96,7 +96,6 @@ protocol Transport: AnyObject { var peerEventsDelegate: TransportPeerEventsDelegate? { get set } // Peer snapshots (for non-UI services) - var peerSnapshotPublisher: AnyPublisher<[TransportPeerSnapshot], Never> { get } func currentPeerSnapshots() -> [TransportPeerSnapshot] // Identity @@ -265,7 +264,7 @@ extension Transport { } protocol TransportPeerEventsDelegate: AnyObject { - @MainActor func didUpdatePeerSnapshots(_ peers: [TransportPeerSnapshot]) + @MainActor func didUpdatePeerSnapshots(_: [TransportPeerSnapshot]) } extension BitchatDelegate { diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index b9603564..22069296 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -27,7 +27,6 @@ enum TransportConfig { static let pttJitterBufferSeconds: TimeInterval = 0.35 // buffered audio before live playback starts static let pttJitterDeadlineSeconds: TimeInterval = 0.5 // start anyway after this wall-clock wait static let pttBurstEndTimeoutSeconds: TimeInterval = 3.0 // no frames -> burst considered ended - static let pttAssemblyStaleSeconds: TimeInterval = 30.0 // drop half-open assemblies after this static let pttMaxConcurrentAssemblies: Int = 8 // concurrent inbound bursts cap static let pttMaxBurstBytes: Int = 384 * 1024 // 120s at ~2KB/s + generous slack static let pttFinishedBurstRegistrySeconds: TimeInterval = 600 // window to absorb the finalized note @@ -93,8 +92,7 @@ enum TransportConfig { // UI thresholds static let uiProcessedNostrEventsCap: Int = 2000 - static let uiChannelInactivityThresholdSeconds: TimeInterval = 9 * 60 - + // UI rate limiters (token buckets) static let uiSenderRateBucketCapacity: Double = 5 static let uiSenderRateBucketRefillPerSec: Double = 1.0 @@ -103,17 +101,13 @@ enum TransportConfig { // UI sleeps/delays static let uiStartupInitialDelaySeconds: TimeInterval = 1.0 - static let uiStartupShortSleepNs: UInt64 = 200_000_000 static let uiStartupPhaseDurationSeconds: TimeInterval = 2.0 static let uiAsyncShortSleepNs: UInt64 = 100_000_000 - static let uiAsyncMediumSleepNs: UInt64 = 500_000_000 static let uiReadReceiptRetryShortSeconds: TimeInterval = 0.1 static let uiReadReceiptRetryLongSeconds: TimeInterval = 0.5 static let uiBatchDispatchStaggerSeconds: TimeInterval = 0.15 static let uiScrollThrottleSeconds: TimeInterval = 0.5 - static let uiAnimationShortSeconds: TimeInterval = 0.15 static let uiAnimationMediumSeconds: TimeInterval = 0.2 - static let uiAnimationSidebarSeconds: TimeInterval = 0.25 static let uiRecentCutoffFiveMinutesSeconds: TimeInterval = 5 * 60 static let uiMeshEmptyConfirmationSeconds: TimeInterval = 30.0 @@ -179,10 +173,6 @@ enum TransportConfig { static let nostrGeohashSampleLimit: Int = 100 static let nostrDMSubscribeLookbackSeconds: TimeInterval = 86400 - // Nostr helpers - static let nostrShortKeyDisplayLength: Int = 8 - static let nostrConvKeyPrefixLength: Int = 16 - // Message deduplication static let messageDedupMaxAgeSeconds: TimeInterval = 300 static let messageDedupMaxCount: Int = 1000 @@ -294,12 +284,7 @@ enum TransportConfig { static let uiVeryLongTokenThreshold: Int = 512 static let uiLongMessageLineLimit: Int = 30 static let uiFingerprintSampleCount: Int = 3 - - // UI swipe/gesture thresholds - static let uiBackSwipeTranslationLarge: CGFloat = 50 - static let uiBackSwipeTranslationSmall: CGFloat = 30 - static let uiBackSwipeVelocityThreshold: CGFloat = 300 - + // UI color tuning static let uiColorHueAvoidanceDelta: Double = 0.05 static let uiColorHueOffset: Double = 0.12 diff --git a/bitchat/Services/UnifiedPeerService.swift b/bitchat/Services/UnifiedPeerService.swift index a5d64621..84a4843f 100644 --- a/bitchat/Services/UnifiedPeerService.swift +++ b/bitchat/Services/UnifiedPeerService.swift @@ -70,7 +70,7 @@ final class UnifiedPeerService: ObservableObject, TransportPeerEventsDelegate { } // TransportPeerEventsDelegate - func didUpdatePeerSnapshots(_ peers: [TransportPeerSnapshot]) { + func didUpdatePeerSnapshots(_: [TransportPeerSnapshot]) { updatePeers() } @@ -367,12 +367,7 @@ final class UnifiedPeerService: ObservableObject, TransportPeerEventsDelegate { } // MARK: - Compatibility Methods (for easy migration) - - var allPeers: [BitchatPeer] { peers } - var connectedPeers: Set { connectedPeerIDs } - var favoritePeers: Set { - Set(favorites.compactMap { getFingerprint(for: $0.peerID) }) - } + var blockedUsers: Set { Set(peers.compactMap { peer in isBlocked(peer.peerID) ? getFingerprint(for: peer.peerID) : nil diff --git a/bitchat/Utils/MessageDeduplicator.swift b/bitchat/Utils/MessageDeduplicator.swift index 00ea0eb5..215384fa 100644 --- a/bitchat/Utils/MessageDeduplicator.swift +++ b/bitchat/Utils/MessageDeduplicator.swift @@ -52,18 +52,6 @@ final class MessageDeduplicator { return false } - /// Record an ID with a specific timestamp (for content key tracking) - func record(_ id: String, timestamp: Date) { - lock.lock() - defer { lock.unlock() } - - if lookup[id] == nil { - entries.append(Entry(id: id, timestamp: timestamp)) - } - lookup[id] = timestamp - trimIfNeeded() - } - /// Add an ID without checking (for announce-back tracking) func markProcessed(_ id: String) { lock.lock() @@ -83,13 +71,6 @@ final class MessageDeduplicator { return lookup[id] != nil } - /// Get timestamp for an ID (for content deduplication time-window checks) - func timestampFor(_ id: String) -> Date? { - lock.lock() - defer { lock.unlock() } - return lookup[id] - } - private func trimIfNeeded() { let activeCount = entries.count - head guard activeCount > maxCount else { return } diff --git a/bitchat/Utils/Theme.swift b/bitchat/Utils/Theme.swift index 40fe035f..ec0283e0 100644 --- a/bitchat/Utils/Theme.swift +++ b/bitchat/Utils/Theme.swift @@ -96,7 +96,7 @@ struct ThemePalette { ) } - static func liquidGlass(_ colorScheme: ColorScheme) -> ThemePalette { + static func liquidGlass(_: ColorScheme) -> ThemePalette { ThemePalette( background: systemBackground, primary: .primary, diff --git a/bitchat/ViewModels/ChatGroupCoordinator.swift b/bitchat/ViewModels/ChatGroupCoordinator.swift index a83cb024..7489b3bc 100644 --- a/bitchat/ViewModels/ChatGroupCoordinator.swift +++ b/bitchat/ViewModels/ChatGroupCoordinator.swift @@ -387,7 +387,7 @@ final class ChatGroupCoordinator { /// Decrypt-verify path for an incoming 0x25 broadcast. Drops silently for /// unknown groups (non-members relay but never read), wrong epochs, bad /// sender signatures, and senders missing from the pinned roster. - func handleGroupMessagePayload(_ payload: Data, timestamp: Date) { + func handleGroupMessagePayload(_ payload: Data, timestamp _: Date) { guard let envelope = GroupMessageEnvelope.decode(payload) else { return } guard let group = context.groupStore.group(withID: envelope.groupID) else { return } guard envelope.epoch == group.epoch else { diff --git a/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift b/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift index 30d566b8..a1e340fe 100644 --- a/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift +++ b/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift @@ -29,7 +29,6 @@ protocol ChatPeerIdentityContext: AnyObject { func migratePrivateChat(from oldPeerID: PeerID, to newPeerID: PeerID) var selectedPrivateChatPeer: PeerID? { get set } var selectedPrivateChatFingerprint: String? { get set } - var nickname: String { get } var myPeerID: PeerID { get } var activeChannel: ChannelID { get } /// Signals that message state changed so observers refresh (e.g. `objectWillChange.send()`). @@ -104,7 +103,7 @@ protocol ChatPeerIdentityContext: AnyObject { extension ChatViewModel: ChatPeerIdentityContext { // `privateChats`, `unreadPrivateMessages`, `selectedPrivateChatPeer`, - // `selectedPrivateChatFingerprint`, `nickname`, `myPeerID`, + // `selectedPrivateChatFingerprint`, `myPeerID`, // `activeChannel`, `connectedPeers`, `geoNicknames`, `notifyUIChanged()`, // `addSystemMessage(_:)`, `peerNickname(for:)`, `meshPeerNicknames()`, // `ephemeralPeerID(forNoiseKey:)`, `unifiedPeer(for:)`, diff --git a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift index 73b784aa..6765746a 100644 --- a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift @@ -19,7 +19,6 @@ protocol ChatPrivateConversationContext: AnyObject { /// lookup on `ChatViewModel` (no `privateChats` dictionary build). func privateMessages(for peerID: PeerID) -> [BitchatMessage] var sentReadReceipts: Set { get } - var unreadPrivateMessages: Set { get } var selectedPrivateChatPeer: PeerID? { get } var nickname: String { get } var activeChannel: ChannelID { get } @@ -40,8 +39,6 @@ protocol ChatPrivateConversationContext: AnyObject { func setPrivateDeliveryStatus(_ status: DeliveryStatus, forMessageID messageID: String, peerID: PeerID) -> Bool func markPrivateChatUnread(_ peerID: PeerID) func markPrivateChatRead(_ peerID: PeerID) - /// Removes the peer's chat entirely, including unread state. - func removePrivateChat(_ peerID: PeerID) /// Moves all messages from `oldPeerID`'s chat into `newPeerID`'s chat /// (dedup by ID, order preserved, unread carried, old chat removed). func migratePrivateChat(from oldPeerID: PeerID, to newPeerID: PeerID) @@ -87,7 +84,6 @@ protocol ChatPrivateConversationContext: AnyObject { // MARK: Routing & acknowledgements func routePrivateMessage(_ content: String, to peerID: PeerID, recipientNickname: String, messageID: String) func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) - func routeFavoriteNotification(to peerID: PeerID, isFavorite: Bool) func sendMeshReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) func sendGeohashPrivateMessage(_ content: String, toRecipientHex recipientHex: String, from identity: NostrIdentity, messageID: String) func sendGeohashDeliveryAck(for messageID: String, toRecipientHex recipientHex: String, from identity: NostrIdentity) @@ -606,7 +602,7 @@ final class ChatPrivateConversationCoordinator { /// O(1)-per-conversation dedup via the store's message-ID indexes /// (replaces the full scan over every private chat). - func isDuplicateMessage(_ messageId: String, targetPeerID: PeerID) -> Bool { + func isDuplicateMessage(_ messageId: String, targetPeerID _: PeerID) -> Bool { context.privateChatsContainMessage(withID: messageId) } @@ -825,25 +821,6 @@ final class ChatPrivateConversationCoordinator { } } - func sendFavoriteNotification(to peerID: PeerID, isFavorite: Bool) { - var noiseKey: Data? - - if let hexKey = Data(hexString: peerID.id) { - noiseKey = hexKey - } else if let peerNoiseKey = context.noisePublicKey(for: peerID) { - noiseKey = peerNoiseKey - } - - if context.isPeerConnected(peerID) { - context.routeFavoriteNotification(to: peerID, isFavorite: isFavorite) - SecureLogger.debug("📤 Sent favorite notification via BLE to \(peerID)", category: .session) - } else if let key = noiseKey { - context.routeFavoriteNotification(to: PeerID(hexData: key), isFavorite: isFavorite) - } else { - SecureLogger.warning("⚠️ Cannot send favorite notification - peer not connected and no Nostr pubkey", category: .session) - } - } - func isMessageBlocked(_ message: BitchatMessage) -> Bool { if let peerID = message.senderPeerID ?? context.getPeerIDForNickname(message.sender) { if context.isPeerBlocked(peerID) { return true } diff --git a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift index c5f19c44..f5f57cf1 100644 --- a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift @@ -36,9 +36,6 @@ protocol ChatPublicConversationContext: AnyObject { /// message with the same ID is already in that conversation. @discardableResult func appendPublicMessage(_ message: BitchatMessage, to conversationID: ConversationID) -> Bool - /// Appends a geohash message if absent. Returns `true` when stored. - @discardableResult - func appendGeohashMessageIfAbsent(_ message: BitchatMessage, toGeohash geohash: String) -> Bool func publicConversationContainsMessage(withID messageID: String, in conversationID: ConversationID) -> Bool /// Removes a message by ID from whichever public conversation contains it. @discardableResult @@ -109,7 +106,6 @@ extension ChatViewModel: ChatPublicConversationContext { // `geoParticipantCount(for:)`, `isNostrBlocked(pubkeyHexLowercased:)`, // `deriveNostrIdentity(forGeohash:)`, the public conversation store // intents (`appendPublicMessage(_:to:)`, - // `appendGeohashMessageIfAbsent(_:toGeohash:)`, // `publicConversationContainsMessage(withID:in:)`, // `removePublicMessage(withID:)`, // `removePublicMessages(fromGeohash:where:)`, @@ -520,27 +516,27 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { #endif } - func pipeline(_ pipeline: PublicMessagePipeline, normalizeContent content: String) -> String { + func pipeline(_: PublicMessagePipeline, normalizeContent content: String) -> String { context.normalizedContentKey(content) } - func pipeline(_ pipeline: PublicMessagePipeline, contentTimestampForKey key: String) -> Date? { + func pipeline(_: PublicMessagePipeline, contentTimestampForKey key: String) -> Date? { context.contentTimestamp(forKey: key) } - func pipeline(_ pipeline: PublicMessagePipeline, recordContentKey key: String, timestamp: Date) { + func pipeline(_: PublicMessagePipeline, recordContentKey key: String, timestamp: Date) { context.recordContentKey(key, timestamp: timestamp) } - func pipeline(_ pipeline: PublicMessagePipeline, commit message: BitchatMessage, to conversationID: ConversationID) -> Bool { + func pipeline(_: PublicMessagePipeline, commit message: BitchatMessage, to conversationID: ConversationID) -> Bool { context.appendPublicMessage(message, to: conversationID) } - func pipelinePrewarmMessage(_ pipeline: PublicMessagePipeline, message: BitchatMessage) { + func pipelinePrewarmMessage(_: PublicMessagePipeline, message: BitchatMessage) { context.prewarmMessageFormatting(message) } - func pipelineSetBatchingState(_ pipeline: PublicMessagePipeline, isBatching: Bool) { + func pipelineSetBatchingState(_: PublicMessagePipeline, isBatching: Bool) { context.setPublicBatching(isBatching) } } diff --git a/bitchat/ViewModels/ChatVerificationCoordinator.swift b/bitchat/ViewModels/ChatVerificationCoordinator.swift index 8f7d484a..3b78797d 100644 --- a/bitchat/ViewModels/ChatVerificationCoordinator.swift +++ b/bitchat/ViewModels/ChatVerificationCoordinator.swift @@ -135,7 +135,6 @@ final class ChatVerificationCoordinator { let noiseKeyHex: String let signKeyHex: String let nonceA: Data - let startedAt: Date var sent: Bool } @@ -258,7 +257,6 @@ final class ChatVerificationCoordinator { noiseKeyHex: qr.noiseKeyHex, signKeyHex: qr.signKeyHex, nonceA: nonce, - startedAt: Date(), sent: false ) pendingQRVerifications[peerID] = pending diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 38985d62..0877090e 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -84,7 +84,6 @@ import SwiftUI import Combine import CommonCrypto import CoreBluetooth -import Tor #if os(iOS) import UIKit #endif @@ -222,12 +221,6 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele conversations.unreadDirectRoutingPeerIDs() } - /// Check if there are any unread messages (including from temporary Nostr peer IDs) - @MainActor - var hasAnyUnreadMessages: Bool { - !unreadPrivateMessages.isEmpty - } - /// Open the most relevant private chat when tapping the toolbar unread icon. /// Prefers the most recently active unread conversation, otherwise the most recent PM. @MainActor @@ -245,20 +238,6 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele set { peerIdentityStore.setSelectedPrivateChatFingerprint(newValue) } } - // Resolve full Noise key for a peer's short ID (used by UI header rendering) - @MainActor - private func getNoiseKeyForShortID(_ shortPeerID: PeerID) -> PeerID? { - if let mapped = peerIdentityStore.stablePeerID(forShortID: shortPeerID) { return mapped } - // Fallback: derive from active Noise session if available - if shortPeerID.id.count == 16, - let key = meshService.noiseSessionPublicKeyData(for: shortPeerID) { - let stable = PeerID(hexData: key) - peerIdentityStore.setStablePeerID(stable, forShortID: shortPeerID) - return stable - } - return nil - } - // Resolve short mesh ID (16-hex) from a full Noise public key hex (64-hex) @MainActor func getShortIDForNoiseKey(_ fullNoiseKeyHex: PeerID) -> PeerID { @@ -354,18 +333,11 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele // MARK: - Social Features (Delegated to PeerStateManager) - @MainActor - var favoritePeers: Set { unifiedPeerService.favoritePeers } @MainActor var blockedUsers: Set { unifiedPeerService.blockedUsers } // MARK: - Encryption and Security - // Noise Protocol encryption status - var peerEncryptionStatus: [PeerID: EncryptionStatus] { - get { peerIdentityStore.encryptionStatuses } - set { peerIdentityStore.replaceEncryptionStatuses(newValue) } - } var verifiedFingerprints: Set { get { peerIdentityStore.verifiedFingerprints } set { peerIdentityStore.setVerifiedFingerprints(newValue) } @@ -959,11 +931,6 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele // MARK: - Public helpers - /// Published geohash people list for SwiftUI observation - var geohashPeople: [GeoPerson] { - participantTracker.visiblePeople - } - /// Return the current, pruned, sorted people list for the active geohash without mutating state. @MainActor func visibleGeohashPeople() -> [GeoPerson] { @@ -1056,14 +1023,6 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele publicConversationCoordinator.displayNameForNostrPubkey(pubkeyHex) } - // MARK: - Media Transfers - - private enum MediaSendError: Error { - case encodingFailed - case tooLarge - case copyFailed - } - func currentPublicSender() -> (name: String, peerID: PeerID) { publicConversationCoordinator.currentPublicSender() } @@ -1125,7 +1084,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele } @MainActor - @objc func handlePeerStatusUpdate(_ notification: Notification) { + @objc func handlePeerStatusUpdate(_: Notification) { peerIdentityCoordinator.handlePeerStatusUpdate() } @@ -1159,15 +1118,6 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele lifecycleCoordinator.markPrivateMessagesAsRead(from: peerID) } - func getMessages(for peerID: PeerID?) -> [BitchatMessage] { - lifecycleCoordinator.getMessages(for: peerID) - } - - @MainActor - func getPrivateChatMessages(for peerID: PeerID) -> [BitchatMessage] { - lifecycleCoordinator.getPrivateChatMessages(for: peerID) - } - @MainActor func getPeerIDForNickname(_ nickname: String) -> PeerID? { peerIdentityCoordinator.getPeerIDForNickname(nickname) diff --git a/bitchat/ViewModels/Extensions/ChatViewModel+Nostr.swift b/bitchat/ViewModels/Extensions/ChatViewModel+Nostr.swift index a63d6672..8205e13b 100644 --- a/bitchat/ViewModels/Extensions/ChatViewModel+Nostr.swift +++ b/bitchat/ViewModels/Extensions/ChatViewModel+Nostr.swift @@ -35,11 +35,6 @@ extension ChatViewModel { nostrCoordinator.inbound.handleNostrEvent(event) } - @MainActor - func subscribeToGeoChat(_ ch: GeohashChannel) { - nostrCoordinator.subscriptions.subscribeToGeoChat(ch) - } - @MainActor func handleGiftWrap(_ giftWrap: NostrEvent, id: NostrIdentity) { nostrCoordinator.inbound.handleGiftWrap(giftWrap, id: id) @@ -55,21 +50,11 @@ extension ChatViewModel { nostrCoordinator.subscriptions.beginGeohashSampling(for: geohashes) } - @MainActor - func subscribe(_ gh: String) { - nostrCoordinator.subscriptions.subscribe(gh) - } - @MainActor func subscribeNostrEvent(_ event: NostrEvent, gh: String) { nostrCoordinator.presence.subscribeNostrEvent(event, gh: gh) } - @MainActor - func cooldownPerGeohash(_ gh: String, content: String, event: NostrEvent) { - nostrCoordinator.presence.cooldownPerGeohash(gh, content: content, event: event) - } - @MainActor func endGeohashSampling() { nostrCoordinator.subscriptions.endGeohashSampling() @@ -80,35 +65,11 @@ extension ChatViewModel { nostrCoordinator.subscriptions.setupNostrMessageHandling() } - @MainActor - func handleNostrMessage(_ giftWrap: NostrEvent) { - nostrCoordinator.inbound.handleNostrMessage(giftWrap) - } - - func processNostrMessage(_ giftWrap: NostrEvent) async { - await nostrCoordinator.inbound.processNostrMessage(giftWrap) - } - @MainActor func findNoiseKey(for nostrPubkey: String) -> Data? { nostrCoordinator.inbound.findNoiseKey(for: nostrPubkey) } - @MainActor - func sendDeliveryAckViaNostrEmbedded( - _ message: BitchatMessage, - wasReadBefore: Bool, - senderPubkey: String, - key: Data? - ) { - nostrCoordinator.sendDeliveryAckViaNostrEmbedded( - message, - wasReadBefore: wasReadBefore, - senderPubkey: senderPubkey, - key: key - ) - } - @MainActor func sendFavoriteNotificationViaNostr(noisePublicKey: Data, isFavorite: Bool) { nostrCoordinator.sendFavoriteNotificationViaNostr(noisePublicKey: noisePublicKey, isFavorite: isFavorite) diff --git a/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift b/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift index 2d40cfea..d77a4221 100644 --- a/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift +++ b/bitchat/ViewModels/Extensions/ChatViewModel+PrivateChat.swift @@ -55,16 +55,6 @@ extension ChatViewModel { privateConversationCoordinator.handleReadReceipt(payload, senderPubkey: senderPubkey, convKey: convKey) } - @MainActor - func sendDeliveryAckIfNeeded(to messageId: String, senderPubKey: String, from id: NostrIdentity) { - privateConversationCoordinator.sendDeliveryAckIfNeeded(to: messageId, senderPubKey: senderPubKey, from: id) - } - - @MainActor - func sendReadReceiptIfNeeded(to messageId: String, senderPubKey: String, from id: NostrIdentity) { - privateConversationCoordinator.sendReadReceiptIfNeeded(to: messageId, senderPubKey: senderPubKey, from: id) - } - @MainActor func sendVoiceNote(at url: URL) { mediaTransferCoordinator.sendVoiceNote(at: url) @@ -162,11 +152,6 @@ extension ChatViewModel { mediaTransferCoordinator.clearTransferMapping(for: messageID) } - @MainActor - func handleMediaSendFailure(messageID: String, reason: String) { - mediaTransferCoordinator.handleMediaSendFailure(messageID: messageID, reason: reason) - } - @MainActor func handleTransferEvent(_ event: TransferProgressManager.Event) { mediaTransferCoordinator.handleTransferEvent(event) @@ -194,59 +179,6 @@ extension ChatViewModel { privateConversationCoordinator.handlePrivateMessage(message) } - @MainActor - func isDuplicateMessage(_ messageId: String, targetPeerID: PeerID) -> Bool { - privateConversationCoordinator.isDuplicateMessage(messageId, targetPeerID: targetPeerID) - } - - @MainActor - func addMessageToPrivateChatsIfNeeded(_ message: BitchatMessage, targetPeerID: PeerID) { - privateConversationCoordinator.addMessageToPrivateChatsIfNeeded(message, targetPeerID: targetPeerID) - } - - @MainActor - func mirrorToEphemeralIfNeeded(_ message: BitchatMessage, targetPeerID: PeerID, key: Data?) { - privateConversationCoordinator.mirrorToEphemeralIfNeeded(message, targetPeerID: targetPeerID, key: key) - } - - @MainActor - func handleViewingThisChat(_ message: BitchatMessage, targetPeerID: PeerID, key: Data?, senderPubkey: String) { - privateConversationCoordinator.handleViewingThisChat( - message, - targetPeerID: targetPeerID, - key: key, - senderPubkey: senderPubkey - ) - } - - @MainActor - func markAsUnreadIfNeeded( - shouldMarkAsUnread: Bool, - targetPeerID: PeerID, - key: Data?, - isRecentMessage: Bool, - senderNickname: String, - messageContent: String - ) { - privateConversationCoordinator.markAsUnreadIfNeeded( - shouldMarkAsUnread: shouldMarkAsUnread, - targetPeerID: targetPeerID, - key: key, - isRecentMessage: isRecentMessage, - senderNickname: senderNickname, - messageContent: messageContent - ) - } - - @MainActor - func handleFavoriteNotification(_ content: String, from peerID: PeerID, senderNickname: String) { - privateConversationCoordinator.handleFavoriteNotification( - content, - from: peerID, - senderNickname: senderNickname - ) - } - @MainActor func processActionMessage(_ message: BitchatMessage) -> BitchatMessage { privateConversationCoordinator.processActionMessage(message) @@ -257,11 +189,6 @@ extension ChatViewModel { privateConversationCoordinator.migratePrivateChatsIfNeeded(for: peerID, senderNickname: senderNickname) } - @MainActor - func sendFavoriteNotification(to peerID: PeerID, isFavorite: Bool) { - privateConversationCoordinator.sendFavoriteNotification(to: peerID, isFavorite: isFavorite) - } - @MainActor func isMessageBlocked(_ message: BitchatMessage) -> Bool { privateConversationCoordinator.isMessageBlocked(message) diff --git a/bitchat/ViewModels/Extensions/ChatViewModel+Tor.swift b/bitchat/ViewModels/Extensions/ChatViewModel+Tor.swift index 443849db..a0142cde 100644 --- a/bitchat/ViewModels/Extensions/ChatViewModel+Tor.swift +++ b/bitchat/ViewModels/Extensions/ChatViewModel+Tor.swift @@ -54,7 +54,7 @@ extension ChatViewModel { } } - @objc func handleTorPreferenceChanged(_ notification: Notification) { + @objc func handleTorPreferenceChanged(_: Notification) { Task { @MainActor in self.torStatusAnnounced = false self.torInitialReadyAnnounced = false diff --git a/bitchat/ViewModels/MessageRateLimiter.swift b/bitchat/ViewModels/MessageRateLimiter.swift index a0309447..1196c47f 100644 --- a/bitchat/ViewModels/MessageRateLimiter.swift +++ b/bitchat/ViewModels/MessageRateLimiter.swift @@ -79,9 +79,4 @@ struct MessageRateLimiter { return senderAllowed && contentAllowed } - - mutating func reset() { - senderBuckets.removeAll() - contentBuckets.removeAll() - } } diff --git a/bitchat/ViewModels/MinimalDistancePalette.swift b/bitchat/ViewModels/MinimalDistancePalette.swift index fb05d3c9..c142382c 100644 --- a/bitchat/ViewModels/MinimalDistancePalette.swift +++ b/bitchat/ViewModels/MinimalDistancePalette.swift @@ -82,13 +82,6 @@ final class MinimalDistancePalette { return Color(hue: entry.hue, saturation: saturation, brightness: brightness) } - @MainActor - func reset() { - currentSeeds.removeAll() - entries.removeAll() - previousEntries.removeAll() - } - @MainActor private func rebuildEntries() { guard !currentSeeds.isEmpty else { diff --git a/bitchat/ViewModels/PublicMessagePipeline.swift b/bitchat/ViewModels/PublicMessagePipeline.swift index 7383151b..289e1d75 100644 --- a/bitchat/ViewModels/PublicMessagePipeline.swift +++ b/bitchat/ViewModels/PublicMessagePipeline.swift @@ -14,15 +14,15 @@ import Foundation @MainActor protocol PublicMessagePipelineDelegate: AnyObject { - func pipeline(_ pipeline: PublicMessagePipeline, normalizeContent content: String) -> String - func pipeline(_ pipeline: PublicMessagePipeline, contentTimestampForKey key: String) -> Date? - func pipeline(_ pipeline: PublicMessagePipeline, recordContentKey key: String, timestamp: Date) + func pipeline(_: PublicMessagePipeline, normalizeContent content: String) -> String + func pipeline(_: PublicMessagePipeline, contentTimestampForKey key: String) -> Date? + func pipeline(_: PublicMessagePipeline, recordContentKey key: String, timestamp: Date) /// Commits a batched message to its conversation in the store. /// Returns `false` when the message was already present (ID dedup). @discardableResult - func pipeline(_ pipeline: PublicMessagePipeline, commit message: BitchatMessage, to conversationID: ConversationID) -> Bool - func pipelinePrewarmMessage(_ pipeline: PublicMessagePipeline, message: BitchatMessage) - func pipelineSetBatchingState(_ pipeline: PublicMessagePipeline, isBatching: Bool) + func pipeline(_: PublicMessagePipeline, commit message: BitchatMessage, to conversationID: ConversationID) -> Bool + func pipelinePrewarmMessage(_: PublicMessagePipeline, message: BitchatMessage) + func pipelineSetBatchingState(_: PublicMessagePipeline, isBatching: Bool) } @MainActor diff --git a/bitchat/Views/AppInfoView.swift b/bitchat/Views/AppInfoView.swift index 1b696234..8335d874 100644 --- a/bitchat/Views/AppInfoView.swift +++ b/bitchat/Views/AppInfoView.swift @@ -15,8 +15,6 @@ struct AppInfoView: View { AppTheme(rawValue: appThemeRawValue) ?? .matrix } - private var backgroundColor: Color { palette.background } - private var textColor: Color { palette.primary } private var secondaryTextColor: Color { palette.secondary } diff --git a/bitchat/Views/ContentSheetViews.swift b/bitchat/Views/ContentSheetViews.swift index f8fb9411..a6a68c82 100644 --- a/bitchat/Views/ContentSheetViews.swift +++ b/bitchat/Views/ContentSheetViews.swift @@ -11,8 +11,6 @@ struct ContentPeopleSheetView: View { @EnvironmentObject private var privateConversationModel: PrivateConversationModel @EnvironmentObject private var verificationModel: VerificationModel @EnvironmentObject private var conversationUIModel: ConversationUIModel - @EnvironmentObject private var locationChannelsModel: LocationChannelsModel - @EnvironmentObject private var peerListModel: PeerListModel @Binding var showSidebar: Bool @Binding var messageText: String @@ -79,8 +77,7 @@ struct ContentPeopleSheetView: View { #endif } else { ContentPeopleListView( - showSidebar: $showSidebar, - headerHeight: headerHeight + showSidebar: $showSidebar ) } } @@ -142,8 +139,6 @@ private struct ContentPeopleListView: View { @Binding var showSidebar: Bool - let headerHeight: CGFloat - @State private var showVerifySheet = false var body: some View { @@ -285,7 +280,6 @@ private extension ContentPeopleListView { } private struct ContentPrivateChatSheetView: View { - @EnvironmentObject private var appChromeModel: AppChromeModel @EnvironmentObject private var privateConversationModel: PrivateConversationModel @Binding var showSidebar: Bool diff --git a/bitchat/Views/FingerprintView.swift b/bitchat/Views/FingerprintView.swift index fb4541f5..a6c371ae 100644 --- a/bitchat/Views/FingerprintView.swift +++ b/bitchat/Views/FingerprintView.swift @@ -17,8 +17,6 @@ struct FingerprintView: View { private var textColor: Color { palette.primary } - private var backgroundColor: Color { palette.background } - private enum Strings { static let title: LocalizedStringKey = "fingerprint.title" static let theirFingerprint: LocalizedStringKey = "fingerprint.their_label" @@ -45,9 +43,6 @@ struct FingerprintView: View { count ) } - static func unknownPeer() -> String { - String(localized: "common.unknown", comment: "Label for an unknown peer") - } } var body: some View { diff --git a/bitchat/Views/LocationChannelsSheet.swift b/bitchat/Views/LocationChannelsSheet.swift index 0a6e077a..c8f3241b 100644 --- a/bitchat/Views/LocationChannelsSheet.swift +++ b/bitchat/Views/LocationChannelsSheet.swift @@ -13,8 +13,6 @@ struct LocationChannelsSheet: View { @State private var customGeohash: String = "" @State private var customError: String? = nil - private var backgroundColor: Color { palette.background } - private enum Strings { static let title: LocalizedStringKey = "location_channels.title" static let description: LocalizedStringKey = "location_channels.description" @@ -401,7 +399,7 @@ struct LocationChannelsSheet: View { title: String, subtitlePrefix: String, subtitleName: String? = nil, - subtitleNameBold: Bool = false, + subtitleNameBold _: Bool = false, isSelected: Bool, titleColor: Color? = nil, titleBold: Bool = false, diff --git a/bitchat/Views/VerificationViews.swift b/bitchat/Views/VerificationViews.swift index 1fba4f2d..94aaf211 100644 --- a/bitchat/Views/VerificationViews.swift +++ b/bitchat/Views/VerificationViews.swift @@ -288,7 +288,6 @@ struct VerificationSheetView: View { @State private var showingScanner = false @ThemedPalette private var palette - private var backgroundColor: Color { palette.background } private var accentColor: Color { palette.accent } private var boxColor: Color { palette.secondary.opacity(0.1) } diff --git a/bitchatTests/ChatNostrCoordinatorContextTests.swift b/bitchatTests/ChatNostrCoordinatorContextTests.swift index 5cbd0c7d..647e0957 100644 --- a/bitchatTests/ChatNostrCoordinatorContextTests.swift +++ b/bitchatTests/ChatNostrCoordinatorContextTests.swift @@ -70,7 +70,6 @@ private final class MockChatNostrContext: ChatNostrContext { private(set) var mentionCheckedMessageIDs: [String] = [] private(set) var hapticMessageIDs: [String] = [] - func handlePublicMessage(_ message: BitchatMessage) { handledPublicMessages.append(message) } func handlePublicMessage(_ message: BitchatMessage, powBits: Int) { handledPublicMessages.append(message) } func checkForMentions(_ message: BitchatMessage) { mentionCheckedMessageIDs.append(message.id) } func sendHapticFeedback(for message: BitchatMessage) { hapticMessageIDs.append(message.id) } @@ -214,8 +213,6 @@ private final class MockChatNostrContext: ChatNostrContext { // Favorites & notifications var favoriteRelationshipsByNoiseKey: [Data: FavoritesPersistenceService.FavoriteRelationship] = [:] - private(set) var addedFavorites: [(noiseKey: Data, nostrPublicKey: String?, nickname: String)] = [] - private(set) var postedLocalNotifications: [(title: String, body: String, identifier: String)] = [] private(set) var geohashActivityNotifications: [(geohash: String, bodyPreview: String)] = [] func favoriteRelationship(forNoiseKey noiseKey: Data) -> FavoritesPersistenceService.FavoriteRelationship? { @@ -226,14 +223,6 @@ private final class MockChatNostrContext: ChatNostrContext { Array(favoriteRelationshipsByNoiseKey.values) } - func addFavorite(noiseKey: Data, nostrPublicKey: String?, nickname: String) { - addedFavorites.append((noiseKey, nostrPublicKey, nickname)) - } - - func postLocalNotification(title: String, body: String, identifier: String) { - postedLocalNotifications.append((title, body, identifier)) - } - func notifyGeohashActivity(geohash: String, bodyPreview: String) { geohashActivityNotifications.append((geohash, bodyPreview)) } @@ -250,24 +239,6 @@ private func drainMainQueue() async { } } -private func makeFavoriteRelationship( - noiseKey: Data, - nostrPublicKey: String? = nil, - nickname: String = "alice", - isFavorite: Bool = false, - theyFavoritedUs: Bool = false -) -> FavoritesPersistenceService.FavoriteRelationship { - FavoritesPersistenceService.FavoriteRelationship( - peerNoisePublicKey: noiseKey, - peerNostrPublicKey: nostrPublicKey, - peerNickname: nickname, - isFavorite: isFavorite, - theyFavoritedUs: theyFavoritedUs, - favoritedAt: Date(timeIntervalSince1970: 0), - lastUpdated: Date(timeIntervalSince1970: 0) - ) -} - // MARK: - Coordinator Tests Against Mock Context /// Exercises `ChatNostrCoordinator` against `MockChatNostrContext` with no diff --git a/bitchatTests/ChatPeerIdentityCoordinatorContextTests.swift b/bitchatTests/ChatPeerIdentityCoordinatorContextTests.swift index b756999b..bbdda609 100644 --- a/bitchatTests/ChatPeerIdentityCoordinatorContextTests.swift +++ b/bitchatTests/ChatPeerIdentityCoordinatorContextTests.swift @@ -29,7 +29,6 @@ private final class MockChatPeerIdentityContext: ChatPeerIdentityContext { var unreadPrivateMessages: Set = [] var selectedPrivateChatPeer: PeerID? var selectedPrivateChatFingerprint: String? - var nickname = "me" var myPeerID = PeerID(str: "0011223344556677") var activeChannel: ChannelID = .mesh private(set) var notifyUIChangedCount = 0 diff --git a/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift b/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift index 9e96cabe..aed8f482 100644 --- a/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift +++ b/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift @@ -100,11 +100,6 @@ private final class MockChatPrivateConversationContext: ChatPrivateConversationC unreadPrivateMessages.remove(peerID) } - func removePrivateChat(_ peerID: PeerID) { - privateChats.removeValue(forKey: peerID) - unreadPrivateMessages.remove(peerID) - } - func migratePrivateChat(from oldPeerID: PeerID, to newPeerID: PeerID) { migratedChats.append((oldPeerID, newPeerID)) guard oldPeerID != newPeerID, let source = privateChats[oldPeerID] else { return } @@ -177,12 +172,10 @@ private final class MockChatPrivateConversationContext: ChatPrivateConversationC // Routing & acknowledgements private(set) var routedPrivateMessages: [(content: String, peerID: PeerID, messageID: String)] = [] private(set) var routedReadReceipts: [(messageID: String, peerID: PeerID)] = [] - private(set) var routedFavoriteNotifications: [(peerID: PeerID, isFavorite: Bool)] = [] private(set) var meshReadReceipts: [(messageID: String, peerID: PeerID)] = [] private(set) var geoPrivateMessages: [(content: String, recipientHex: String, messageID: String)] = [] private(set) var geoDeliveryAcks: [(messageID: String, recipientHex: String)] = [] private(set) var geoReadReceipts: [(messageID: String, recipientHex: String)] = [] - private(set) var embeddedDeliveryAckMessageIDs: [String] = [] func routePrivateMessage(_ content: String, to peerID: PeerID, recipientNickname: String, messageID: String) { routedPrivateMessages.append((content, peerID, messageID)) @@ -192,10 +185,6 @@ private final class MockChatPrivateConversationContext: ChatPrivateConversationC routedReadReceipts.append((receipt.originalMessageID, peerID)) } - func routeFavoriteNotification(to peerID: PeerID, isFavorite: Bool) { - routedFavoriteNotifications.append((peerID, isFavorite)) - } - func sendMeshReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) { meshReadReceipts.append((receipt.originalMessageID, peerID)) } @@ -212,10 +201,6 @@ private final class MockChatPrivateConversationContext: ChatPrivateConversationC geoReadReceipts.append((messageID, recipientHex)) } - func sendDeliveryAckViaNostrEmbedded(_ message: BitchatMessage, wasReadBefore: Bool, senderPubkey: String, key: Data?) { - embeddedDeliveryAckMessageIDs.append(message.id) - } - // Favorites & notifications var favoriteRelationshipsByNoiseKey: [Data: FavoritesPersistenceService.FavoriteRelationship] = [:] private(set) var peerFavoritedUsUpdates: [(noiseKey: Data, favorited: Bool, nickname: String, nostrPublicKey: String?)] = [] diff --git a/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift b/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift index be76fe82..54858217 100644 --- a/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift +++ b/bitchatTests/ChatPublicConversationCoordinatorContextTests.swift @@ -58,11 +58,6 @@ private final class MockChatPublicConversationContext: ChatPublicConversationCon return true } - @discardableResult - func appendGeohashMessageIfAbsent(_ message: BitchatMessage, toGeohash geohash: String) -> Bool { - appendPublicMessage(message, to: .geohash(geohash.lowercased())) - } - func publicConversationContainsMessage(withID messageID: String, in conversationID: ConversationID) -> Bool { conversations[conversationID]?.contains(where: { $0.id == messageID }) == true } diff --git a/bitchatTests/CommandProcessorTests.swift b/bitchatTests/CommandProcessorTests.swift index 3da82140..e2d9d561 100644 --- a/bitchatTests/CommandProcessorTests.swift +++ b/bitchatTests/CommandProcessorTests.swift @@ -675,10 +675,6 @@ private final class MockCommandContextProvider: CommandContextProvider { toggledFavorites.append(peerID) } - func sendFavoriteNotification(to peerID: PeerID, isFavorite: Bool) { - favoriteNotifications.append((peerID, isFavorite)) - } - // Groups: record the parsed subcommand + argument the processor forwarded. private(set) var groupCommands: [(subcommand: String, argument: String)] = [] diff --git a/bitchatTests/EndToEnd/CourierEndToEndTests.swift b/bitchatTests/EndToEnd/CourierEndToEndTests.swift index 22e56c79..cedcc15f 100644 --- a/bitchatTests/EndToEnd/CourierEndToEndTests.swift +++ b/bitchatTests/EndToEnd/CourierEndToEndTests.swift @@ -590,9 +590,6 @@ private final class CourierCaptureTransport: Transport { private(set) var courierSends: [(messageID: String, recipientKey: Data, couriers: [PeerID])] = [] private(set) var directSends: [String] = [] - var peerSnapshotPublisher: AnyPublisher<[TransportPeerSnapshot], Never> { - Just(snapshots).eraseToAnyPublisher() - } func currentPeerSnapshots() -> [TransportPeerSnapshot] { snapshots } var myPeerID = PeerID(str: "00000000000000aa") diff --git a/bitchatTests/EndToEnd/PublicChatE2ETests.swift b/bitchatTests/EndToEnd/PublicChatE2ETests.swift index 6672e678..b67901d2 100644 --- a/bitchatTests/EndToEnd/PublicChatE2ETests.swift +++ b/bitchatTests/EndToEnd/PublicChatE2ETests.swift @@ -18,9 +18,7 @@ struct PublicChatE2ETests { private let charlie: MockBLEService private let david: MockBLEService private let bus = MockBLEBus() - - private var receivedMessages: [String: [BitchatMessage]] = [:] - + init() { // Create mock services with unique peer IDs to avoid any collision alice = MockBLEService(peerID: PeerID(str: UUID().uuidString), nickname: TestConstants.testNickname1, bus: bus) diff --git a/bitchatTests/FontBitchatTests.swift b/bitchatTests/FontBitchatTests.swift index 729c2bf8..327c5efb 100644 --- a/bitchatTests/FontBitchatTests.swift +++ b/bitchatTests/FontBitchatTests.swift @@ -1,6 +1,5 @@ import SwiftUI import XCTest -@testable import bitchat final class FontBitchatTests: XCTestCase { // func testMonospacedMapping() { diff --git a/bitchatTests/Fragmentation/FragmentationTests.swift b/bitchatTests/Fragmentation/FragmentationTests.swift index 1052b012..5b64bfeb 100644 --- a/bitchatTests/Fragmentation/FragmentationTests.swift +++ b/bitchatTests/Fragmentation/FragmentationTests.swift @@ -369,7 +369,6 @@ extension FragmentationTests { func didUpdateMessageDeliveryStatus(_ messageID: String, status: DeliveryStatus) {} func didReceiveNoisePayload(from peerID: PeerID, type: NoisePayloadType, payload: Data, timestamp: Date) {} func didUpdateBluetoothState(_ state: CBManagerState) {} - func didReceiveRegionalPublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date) {} } // Helper: build a large message packet (unencrypted public message) diff --git a/bitchatTests/Integration/TestNetworkHelper.swift b/bitchatTests/Integration/TestNetworkHelper.swift index d7b7b7ef..d9e0b3a9 100644 --- a/bitchatTests/Integration/TestNetworkHelper.swift +++ b/bitchatTests/Integration/TestNetworkHelper.swift @@ -33,14 +33,6 @@ final class TestNetworkHelper { return node } - func getNode(_ name: String) -> MockBLEService? { - nodes[name] - } - - func getManager(_ name: String) -> NoiseSessionManager? { - noiseManagers[name] - } - // MARK: - Topology func connect(_ a: String, _ b: String) { diff --git a/bitchatTests/LocalizationCoverageTests.swift b/bitchatTests/LocalizationCoverageTests.swift index 10e0fb87..c9d7c602 100644 --- a/bitchatTests/LocalizationCoverageTests.swift +++ b/bitchatTests/LocalizationCoverageTests.swift @@ -10,7 +10,6 @@ struct LocalizationCoverageTests { .deletingLastPathComponent() // repo root private struct Catalog { - let sourceLanguage: String /// key -> set of locales with a localization entry let coverage: [String: Set] /// all locales appearing anywhere in the catalog @@ -22,7 +21,6 @@ struct LocalizationCoverageTests { let data = try Data(contentsOf: url) let root = try #require(try JSONSerialization.jsonObject(with: data) as? [String: Any]) let strings = try #require(root["strings"] as? [String: Any]) - let sourceLanguage = try #require(root["sourceLanguage"] as? String) var coverage: [String: Set] = [:] for (key, value) in strings { @@ -43,7 +41,7 @@ struct LocalizationCoverageTests { } coverage[key] = locales } - return Catalog(sourceLanguage: sourceLanguage, coverage: coverage) + return Catalog(coverage: coverage) } @Test func mainCatalogCoversAllLocalesForEveryKey() throws { diff --git a/bitchatTests/Mocks/MockBLEBus.swift b/bitchatTests/Mocks/MockBLEBus.swift index c4b5cb24..7496d8db 100644 --- a/bitchatTests/Mocks/MockBLEBus.swift +++ b/bitchatTests/Mocks/MockBLEBus.swift @@ -8,7 +8,6 @@ import Foundation import BitFoundation -@testable import bitchat final class MockBLEBus { private var registry: [PeerID: MockBLEService] = [:] diff --git a/bitchatTests/Mocks/MockBLEService.swift b/bitchatTests/Mocks/MockBLEService.swift index 7437a8be..a127b3dd 100644 --- a/bitchatTests/Mocks/MockBLEService.swift +++ b/bitchatTests/Mocks/MockBLEService.swift @@ -48,10 +48,6 @@ final class MockBLEService: NSObject { set { myNickname = newValue } } - var nickname: String { - return myNickname - } - var peerID: PeerID { return myPeerID } @@ -62,12 +58,6 @@ final class MockBLEService: NSObject { self.bus = bus } - // MARK: - Methods matching BLEService - - func setNickname(_ nickname: String) { - self.myNickname = nickname - } - // MARK: - In-memory test bus (for E2E/Integration) /// Registers this instance on first use. @@ -92,10 +82,6 @@ final class MockBLEService: NSObject { return connectedPeers.contains(peerID) } - func peerNickname(peerID: String) -> String? { - "MockPeer_\(peerID)" - } - func getPeerNicknames() -> [PeerID: String] { var nicknames: [PeerID: String] = [:] for peer in connectedPeers { @@ -103,10 +89,6 @@ final class MockBLEService: NSObject { } return nicknames } - - func getPeers() -> [PeerID: String] { - return getPeerNicknames() - } /// Keep local echo synchronous so Swift Testing confirmations observe it deterministically. private func deliverLocalEcho(_ message: BitchatMessage) { @@ -155,14 +137,6 @@ final class MockBLEService: NSObject { } } - func sendFileBroadcast(_ packet: BitchatFilePacket, transferId: String) { - // Tests currently ignore file transfer flows; keep stub for protocol conformance. - } - - func sendFilePrivate(_ packet: BitchatFilePacket, to peerID: PeerID, transferId: String) { - // Tests currently ignore file transfer flows; keep stub for protocol conformance. - } - func sendPrivateMessage(_ content: String, to recipientPeerID: PeerID, recipientNickname: String, messageID: String) { let message = BitchatMessage( id: messageID, @@ -209,39 +183,6 @@ final class MockBLEService: NSObject { } } - func sendFavoriteNotification(to peerID: String, isFavorite: Bool) { - // Mock implementation - } - - func sendReadReceipt(_ receipt: ReadReceipt, to peerID: String) { - // Mock implementation - } - - func sendBroadcastAnnounce() { - // Mock implementation - } - - func getPeerFingerprint(_ peerID: String) -> String? { - return nil - } - - func getNoiseSessionState(for peerID: String) -> LazyHandshakeState { - return .none - } - - func triggerHandshake(with peerID: String) { - // Mock implementation - } - - func emergencyDisconnectAll() { - connectedPeers.removeAll() - delegate?.didUpdatePeerList([]) - } - - func getFingerprint(for peerID: String) -> String? { - return nil - } - // MARK: - Test Helper Methods func simulateConnectedPeer(_ peerID: PeerID) { @@ -314,9 +255,6 @@ final class MockBLEService: NSObject { } } -// Backward compatibility for older tests -typealias MockSimplifiedBluetoothService = MockBLEService - // MARK: - Helpers extension MockBLEService { diff --git a/bitchatTests/Mocks/MockIdentityManager.swift b/bitchatTests/Mocks/MockIdentityManager.swift index 1ff1926a..a3603017 100644 --- a/bitchatTests/Mocks/MockIdentityManager.swift +++ b/bitchatTests/Mocks/MockIdentityManager.swift @@ -11,18 +11,11 @@ import BitFoundation @testable import bitchat final class MockIdentityManager: SecureIdentityStateManagerProtocol { - private let keychain: KeychainManagerProtocol private var blockedFingerprints: Set = [] private var blockedNostrPubkeys: Set = [] private var socialIdentities: [String: SocialIdentity] = [:] - - init(_ keychain: KeychainManagerProtocol) { - self.keychain = keychain - } - - func loadIdentityCache() {} - - func saveIdentityCache() {} + + init(_: KeychainManagerProtocol) {} func forceSave() {} @@ -45,12 +38,6 @@ final class MockIdentityManager: SecureIdentityStateManagerProtocol { } } - func getFavorites() -> Set { - Set() - } - - func setFavorite(_ fingerprint: String, isFavorite: Bool) {} - func isFavorite(fingerprint: String) -> Bool { false } @@ -99,9 +86,7 @@ final class MockIdentityManager: SecureIdentityStateManagerProtocol { } func registerEphemeralSession(peerID: PeerID, handshakeState: HandshakeState) {} - - func updateHandshakeState(peerID: PeerID, state: HandshakeState) {} - + func clearAllIdentityData() {} func removeEphemeralSession(peerID: PeerID) {} @@ -139,10 +124,6 @@ final class MockIdentityManager: SecureIdentityStateManagerProtocol { !(vouchesByVouchee[fingerprint] ?? []).isEmpty } - func effectiveTrustLevel(for fingerprint: String) -> TrustLevel { - socialIdentities[fingerprint]?.trustLevel ?? .unknown - } - func lastVouchBatchSent(to fingerprint: String) -> Date? { vouchBatchSentAt[fingerprint] } diff --git a/bitchatTests/Mocks/MockTransport.swift b/bitchatTests/Mocks/MockTransport.swift index 5f1243e8..6c617249 100644 --- a/bitchatTests/Mocks/MockTransport.swift +++ b/bitchatTests/Mocks/MockTransport.swift @@ -26,9 +26,6 @@ final class MockTransport: Transport { var myNickname: String = "TestUser" private let peerSnapshotSubject = CurrentValueSubject<[TransportPeerSnapshot], Never>([]) - var peerSnapshotPublisher: AnyPublisher<[TransportPeerSnapshot], Never> { - peerSnapshotSubject.eraseToAnyPublisher() - } // MARK: - Recording Properties (for test assertions) diff --git a/bitchatTests/Noise/NoiseProtocolTests.swift b/bitchatTests/Noise/NoiseProtocolTests.swift index 5d1a3129..f7e8e6be 100644 --- a/bitchatTests/Noise/NoiseProtocolTests.swift +++ b/bitchatTests/Noise/NoiseProtocolTests.swift @@ -31,11 +31,8 @@ struct NoiseTestVector: Codable { let init_prologue: String let init_static: String let init_ephemeral: String - let init_psks: [String]? - let resp_prologue: String let resp_static: String let resp_ephemeral: String - let resp_psks: [String]? let handshake_hash: String? let messages: [TestMessage] diff --git a/bitchatTests/NostrProtocolTests.swift b/bitchatTests/NostrProtocolTests.swift index d237f5fc..1f9d21ab 100644 --- a/bitchatTests/NostrProtocolTests.swift +++ b/bitchatTests/NostrProtocolTests.swift @@ -156,6 +156,7 @@ struct NostrProtocolTests { } } + @Test func testAckRoundTripNIP44V2_Delivered() throws { // Identities let sender = try NostrIdentity.generate() diff --git a/bitchatTests/NotificationStreamAssemblerTests.swift b/bitchatTests/NotificationStreamAssemblerTests.swift index de76bda0..81bf8502 100644 --- a/bitchatTests/NotificationStreamAssemblerTests.swift +++ b/bitchatTests/NotificationStreamAssemblerTests.swift @@ -118,6 +118,7 @@ struct NotificationStreamAssemblerTests { #expect(decoded.timestamp == packet2.timestamp) } + @Test func testAssemblesCompressedLargeFrame() throws { var assembler = NotificationStreamAssembler() diff --git a/bitchatTests/Performance/PerformanceBaselineTests.swift b/bitchatTests/Performance/PerformanceBaselineTests.swift index d496529c..74246df2 100644 --- a/bitchatTests/Performance/PerformanceBaselineTests.swift +++ b/bitchatTests/Performance/PerformanceBaselineTests.swift @@ -610,7 +610,6 @@ private final class PerfNostrContext: ChatNostrContext { func appendGeohashMessageIfAbsent(_ message: BitchatMessage, toGeohash geohash: String) -> Bool { true } private(set) var handledPublicMessageCount = 0 - func handlePublicMessage(_ message: BitchatMessage) { handledPublicMessageCount += 1 } func handlePublicMessage(_ message: BitchatMessage, powBits: Int) { handledPublicMessageCount += 1 } func checkForMentions(_ message: BitchatMessage) {} func sendHapticFeedback(for message: BitchatMessage) {} @@ -668,8 +667,6 @@ private final class PerfNostrContext: ChatNostrContext { func favoriteRelationship(forNoiseKey noiseKey: Data) -> FavoritesPersistenceService.FavoriteRelationship? { nil } func allFavoriteRelationships() -> [FavoritesPersistenceService.FavoriteRelationship] { [] } - func addFavorite(noiseKey: Data, nostrPublicKey: String?, nickname: String) {} - func postLocalNotification(title: String, body: String, identifier: String) {} func notifyGeohashActivity(geohash: String, bodyPreview: String) {} } @@ -779,7 +776,6 @@ private final class PerfDeliveryContext: ChatDeliveryContext { @MainActor private final class PerfPipelineFixture { let viewModel: ChatViewModel - let transport: MockTransport let conversations: ConversationStore let privateInbox: PrivateInboxModel let publicChat: PublicChatModel @@ -791,7 +787,6 @@ private final class PerfPipelineFixture { let transport = MockTransport() let conversations = ConversationStore() - self.transport = transport self.conversations = conversations self.viewModel = ChatViewModel( keychain: keychain, diff --git a/bitchatTests/ProtocolContractTests.swift b/bitchatTests/ProtocolContractTests.swift index e7097121..73609823 100644 --- a/bitchatTests/ProtocolContractTests.swift +++ b/bitchatTests/ProtocolContractTests.swift @@ -23,10 +23,6 @@ private final class DefaultTransportProbe: Transport { var myNickname = "Tester" private(set) var sentMessages: [(content: String, mentions: [String])] = [] - var peerSnapshotPublisher: AnyPublisher<[TransportPeerSnapshot], Never> { - subject.eraseToAnyPublisher() - } - func currentPeerSnapshots() -> [TransportPeerSnapshot] { subject.value } func setNickname(_ nickname: String) { myNickname = nickname } func startServices() {} diff --git a/bitchatTests/PublicMessagePipelineTests.swift b/bitchatTests/PublicMessagePipelineTests.swift index 6d1458da..da26d80e 100644 --- a/bitchatTests/PublicMessagePipelineTests.swift +++ b/bitchatTests/PublicMessagePipelineTests.swift @@ -27,28 +27,28 @@ private final class TestPipelineDelegate: PublicMessagePipelineDelegate { committed.filter { $0.conversationID == conversationID }.map(\.message) } - func pipeline(_ pipeline: PublicMessagePipeline, normalizeContent content: String) -> String { + func pipeline(_: PublicMessagePipeline, normalizeContent content: String) -> String { dedupService.normalizedContentKey(content) } - func pipeline(_ pipeline: PublicMessagePipeline, contentTimestampForKey key: String) -> Date? { + func pipeline(_: PublicMessagePipeline, contentTimestampForKey key: String) -> Date? { dedupService.contentTimestamp(forKey: key) } - func pipeline(_ pipeline: PublicMessagePipeline, recordContentKey key: String, timestamp: Date) { + func pipeline(_: PublicMessagePipeline, recordContentKey key: String, timestamp: Date) { dedupService.recordContentKey(key, timestamp: timestamp) recordedContentKeys.append(key) } - func pipeline(_ pipeline: PublicMessagePipeline, commit message: BitchatMessage, to conversationID: ConversationID) -> Bool { + func pipeline(_: PublicMessagePipeline, commit message: BitchatMessage, to conversationID: ConversationID) -> Bool { guard !rejectedMessageIDs.contains(message.id) else { return false } committed.append((message, conversationID)) return true } - func pipelinePrewarmMessage(_ pipeline: PublicMessagePipeline, message: BitchatMessage) {} + func pipelinePrewarmMessage(_: PublicMessagePipeline, message: BitchatMessage) {} - func pipelineSetBatchingState(_ pipeline: PublicMessagePipeline, isBatching: Bool) { + func pipelineSetBatchingState(_: PublicMessagePipeline, isBatching: Bool) { batchingStates.append(isBatching) } } diff --git a/bitchatTests/Services/GeohashPresenceServiceTests.swift b/bitchatTests/Services/GeohashPresenceServiceTests.swift index f6be1f25..65c33f0c 100644 --- a/bitchatTests/Services/GeohashPresenceServiceTests.swift +++ b/bitchatTests/Services/GeohashPresenceServiceTests.swift @@ -230,8 +230,4 @@ private final class MockGeohashPresenceTimer: GeohashPresenceTimerProtocol { invalidateCallCount += 1 isValid = false } - - func fire() { - handler() - } } diff --git a/bitchatTests/Services/NetworkActivationServiceTests.swift b/bitchatTests/Services/NetworkActivationServiceTests.swift index 01d8fdca..72d9f6be 100644 --- a/bitchatTests/Services/NetworkActivationServiceTests.swift +++ b/bitchatTests/Services/NetworkActivationServiceTests.swift @@ -120,7 +120,6 @@ final class NetworkActivationServiceTests: XCTestCase { return NetworkActivationTestContext( service: service, storage: storage, - permissionSubject: permissionSubject, favoritesSubject: favoritesSubject, torController: torController, relayController: relayController, @@ -148,7 +147,6 @@ final class NetworkActivationServiceTests: XCTestCase { private struct NetworkActivationTestContext { let service: NetworkActivationService let storage: UserDefaults - let permissionSubject: CurrentValueSubject let favoritesSubject: CurrentValueSubject, Never> let torController: MockNetworkActivationTorController let relayController: MockNetworkActivationRelayController diff --git a/bitchatTests/Services/NostrRelayManagerTests.swift b/bitchatTests/Services/NostrRelayManagerTests.swift index fbb46060..125b252c 100644 --- a/bitchatTests/Services/NostrRelayManagerTests.swift +++ b/bitchatTests/Services/NostrRelayManagerTests.swift @@ -1483,7 +1483,6 @@ final class NostrRelayManagerTests: XCTestCase { return RelayManagerTestContext( manager: manager, permissionSubject: permissionSubject, - favoritesSubject: favoritesSubject, sessionFactory: sessionFactory, scheduler: scheduler, clock: clock, @@ -1537,7 +1536,6 @@ final class NostrRelayManagerTests: XCTestCase { private struct RelayManagerTestContext { let manager: NostrRelayManager let permissionSubject: CurrentValueSubject - let favoritesSubject: CurrentValueSubject, Never> let sessionFactory: MockRelaySessionFactory let scheduler: MockRelayScheduler let clock: MutableClock @@ -1644,7 +1642,6 @@ private final class MockRelaySessionFactory: NostrRelaySessionProtocol { } private final class MockRelayConnection: NostrRelayConnectionProtocol { - private let url: String private let pingError: Error? private let sendError: Error? private var receiveHandler: ((Result) -> Void)? @@ -1662,8 +1659,7 @@ private final class MockRelayConnection: NostrRelayConnectionProtocol { } } - init(url: String, pingError: Error? = nil, sendError: Error? = nil) { - self.url = url + init(url _: String, pingError: Error? = nil, sendError: Error? = nil) { self.pingError = pingError self.sendError = sendError } diff --git a/bitchatTests/Services/UnifiedPeerServiceTests.swift b/bitchatTests/Services/UnifiedPeerServiceTests.swift index 172bf5b1..17b30def 100644 --- a/bitchatTests/Services/UnifiedPeerServiceTests.swift +++ b/bitchatTests/Services/UnifiedPeerServiceTests.swift @@ -214,18 +214,6 @@ private final class TestIdentityManager: SecureIdentityStateManagerProtocol { socialIdentities[identity.fingerprint] = identity } - func getFavorites() -> Set { - favorites - } - - func setFavorite(_ fingerprint: String, isFavorite: Bool) { - if isFavorite { - favorites.insert(fingerprint) - } else { - favorites.remove(fingerprint) - } - } - func isFavorite(fingerprint: String) -> Bool { favorites.contains(fingerprint) } @@ -266,8 +254,6 @@ private final class TestIdentityManager: SecureIdentityStateManagerProtocol { func registerEphemeralSession(peerID: PeerID, handshakeState: HandshakeState) {} - func updateHandshakeState(peerID: PeerID, state: HandshakeState) {} - func clearAllIdentityData() { socialIdentities.removeAll() favorites.removeAll() @@ -308,10 +294,6 @@ private final class TestIdentityManager: SecureIdentityStateManagerProtocol { false } - func effectiveTrustLevel(for fingerprint: String) -> TrustLevel { - verified.contains(fingerprint) ? .verified : .unknown - } - func lastVouchBatchSent(to fingerprint: String) -> Date? { nil } diff --git a/bitchatTests/TestUtilities/TestConstants.swift b/bitchatTests/TestUtilities/TestConstants.swift index b64e6378..83f5b46b 100644 --- a/bitchatTests/TestUtilities/TestConstants.swift +++ b/bitchatTests/TestUtilities/TestConstants.swift @@ -25,9 +25,5 @@ struct TestConstants { static let testNickname4 = "David" static let testMessage1 = "Hello, World!" - static let testMessage2 = "How are you?" - static let testMessage3 = "This is a test message" static let testLongMessage = String(repeating: "This is a long message. ", count: 100) - - static let testSignature = Data(repeating: 0xAB, count: 64) } diff --git a/bitchatTests/TestUtilities/TestHelpers.swift b/bitchatTests/TestUtilities/TestHelpers.swift index d92f0474..45b432cb 100644 --- a/bitchatTests/TestUtilities/TestHelpers.swift +++ b/bitchatTests/TestUtilities/TestHelpers.swift @@ -12,20 +12,7 @@ import BitFoundation @testable import bitchat final class TestHelpers { - - // MARK: - Key Generation - - static func generateTestKeyPair() -> (privateKey: Curve25519.KeyAgreement.PrivateKey, publicKey: Curve25519.KeyAgreement.PublicKey) { - let privateKey = Curve25519.KeyAgreement.PrivateKey() - let publicKey = privateKey.publicKey - return (privateKey, publicKey) - } - - static func generateTestIdentity(peerID: String, nickname: String) -> (peerID: String, nickname: String, privateKey: Curve25519.KeyAgreement.PrivateKey, publicKey: Curve25519.KeyAgreement.PublicKey) { - let (privateKey, publicKey) = generateTestKeyPair() - return (peerID: peerID, nickname: nickname, privateKey: privateKey, publicKey: publicKey) - } - + // MARK: - Message Creation static func createTestMessage( @@ -78,11 +65,7 @@ final class TestHelpers { } return data } - - static func generateTestPeerID() -> String { - return "PEER" + UUID().uuidString.prefix(8) - } - + // MARK: - Async Helpers static func waitFor(_ condition: @escaping () -> Bool, timeout: TimeInterval = TestConstants.defaultTimeout) async throws { @@ -110,32 +93,10 @@ final class TestHelpers { } return true } - - static func expectAsync( - timeout: TimeInterval = TestConstants.defaultTimeout, - operation: @escaping () async throws -> T - ) async throws -> T { - return try await withThrowingTaskGroup(of: T.self) { group in - group.addTask { - return try await operation() - } - - group.addTask { - try await sleep(1) - throw TestError.timeout - } - - let result = try await group.next()! - group.cancelAll() - return result - } - } } enum TestError: Error { case timeout - case unexpectedValue - case testFailure(String) } // MARK: - Private chat seeding (ConversationStore migration) @@ -164,18 +125,6 @@ extension ChatViewModel { } } - /// Test-only replacement for `messages.removeAll()`: empties a public - /// channel's conversation. - @MainActor - func clearPublicMessages(for channel: ChannelID = .mesh) { - conversations.clear(ConversationID(channelID: channel)) - } - - /// Test-only: drops every private chat and unread flag. - @MainActor - func clearAllPrivateChats() { - conversations.removeAllDirectConversations() - } } func sleep(_ seconds: TimeInterval) async throws { diff --git a/localPackages/Arti/Sources/TorManager.swift b/localPackages/Arti/Sources/TorManager.swift index 2e252fad..384f5239 100644 --- a/localPackages/Arti/Sources/TorManager.swift +++ b/localPackages/Arti/Sources/TorManager.swift @@ -30,12 +30,6 @@ private func arti_bootstrap_progress() -> Int32 @_silgen_name("arti_bootstrap_summary") private func arti_bootstrap_summary(_ buf: UnsafeMutablePointer, _ len: Int32) -> Int32 -@_silgen_name("arti_go_dormant") -private func arti_go_dormant() -> Int32 - -@_silgen_name("arti_wake") -private func arti_wake() -> Int32 - /// Arti-based Tor integration for BitChat. /// - Boots a local Arti client and exposes a SOCKS5 proxy /// on 127.0.0.1:socksPort. All app networking should await readiness and @@ -83,7 +77,6 @@ public final class TorManager: ObservableObject { private var bootstrapMonitorStarted = false private var pathMonitor: NWPathMonitor? private var isAppForeground: Bool = true - private var isDormant: Bool = false private var lastRestartAt: Date? = nil private var startedAt: Date? = nil // Tracks initial startup time for grace period private(set) var allowAutoStart: Bool = false @@ -102,7 +95,6 @@ public final class TorManager: ObservableObject { } guard !didStart else { return } didStart = true - isDormant = false isStarting = true startedAt = Date() // Track startup time for grace period SecureLogger.debug("TorManager: startIfNeeded() - startedAt set", category: .session) @@ -353,7 +345,6 @@ public final class TorManager: ObservableObject { } await MainActor.run { - self.isDormant = false self.isReady = false self.socksReady = false self.bootstrapProgress = 0 @@ -383,7 +374,6 @@ public final class TorManager: ObservableObject { self.bootstrapProgress = 0 self.bootstrapSummary = "" self.isStarting = true - self.isDormant = false self.lastRestartAt = Date() } diff --git a/localPackages/BitFoundation/Sources/BitFoundation/BinaryProtocol.swift b/localPackages/BitFoundation/Sources/BitFoundation/BinaryProtocol.swift index 34ce30d8..e326eed2 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/BinaryProtocol.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/BinaryProtocol.swift @@ -105,10 +105,6 @@ public struct BinaryProtocol { // Field offsets within packet header public struct Offsets { - static let version = 0 - static let type = 1 - static let ttl = 2 - static let timestamp = 3 public static let flags = 11 // After version(1) + type(1) + ttl(1) + timestamp(8) } diff --git a/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift b/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift index ced3a9b7..80ebf506 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift @@ -341,21 +341,3 @@ extension BitchatMessage { } } -extension Array where Element == BitchatMessage { - /// Filters out empty ones and deduplicate by ID while preserving order (from oldest to newest) - public func cleanedAndDeduped() -> [Element] { - let arr = filter { $0.content.trimmed.isEmpty == false } - guard arr.count > 1 else { - return arr - } - var seen = Set() - var dedup: [BitchatMessage] = [] - for m in arr.sorted(by: { $0.timestamp < $1.timestamp }) { - if !seen.contains(m.id) { - dedup.append(m) - seen.insert(m.id) - } - } - return dedup - } -} diff --git a/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift b/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift index ca29a2b2..db286ae3 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/BitchatPacket.swift @@ -7,7 +7,6 @@ // import struct Foundation.Data -import struct Foundation.Date /// The core packet structure for all BitChat protocol messages. /// Encapsulates all data needed for routing through the mesh network, @@ -37,35 +36,7 @@ public struct BitchatPacket: Codable { self.route = route self.isRSR = isRSR } - - // Convenience initializer for new binary format - init(type: UInt8, ttl: UInt8, senderID: PeerID, payload: Data, isRSR: Bool = false) { - self.version = 1 - self.type = type - // Convert hex string peer ID to binary data (8 bytes) - var senderData = Data() - var tempID = senderID.id - while tempID.count >= 2 { - let hexByte = String(tempID.prefix(2)) - if let byte = UInt8(hexByte, radix: 16) { - senderData.append(byte) - } - tempID = String(tempID.dropFirst(2)) - } - self.senderID = senderData - self.recipientID = nil - self.timestamp = UInt64(Date().timeIntervalSince1970 * 1000) // milliseconds - self.payload = payload - self.signature = nil - self.ttl = ttl - self.route = nil - self.isRSR = isRSR - } - - var data: Data? { - BinaryProtocol.encode(self) - } - + public func toBinaryData(padding: Bool = true) -> Data? { BinaryProtocol.encode(self, padding: padding) } diff --git a/localPackages/BitLogger/Sources/OSLog+Categories.swift b/localPackages/BitLogger/Sources/OSLog+Categories.swift index 1d74e27e..4810b2fb 100644 --- a/localPackages/BitLogger/Sources/OSLog+Categories.swift +++ b/localPackages/BitLogger/Sources/OSLog+Categories.swift @@ -18,6 +18,5 @@ public extension OSLog { static let keychain = OSLog(subsystem: subsystem, category: "keychain") static let session = OSLog(subsystem: subsystem, category: "session") static let security = OSLog(subsystem: subsystem, category: "security") - static let handshake = OSLog(subsystem: subsystem, category: "handshake") static let sync = OSLog(subsystem: subsystem, category: "sync") } diff --git a/localPackages/BitLogger/Sources/SecureLogger.swift b/localPackages/BitLogger/Sources/SecureLogger.swift index 5aaffd53..e12fda0f 100644 --- a/localPackages/BitLogger/Sources/SecureLogger.swift +++ b/localPackages/BitLogger/Sources/SecureLogger.swift @@ -202,10 +202,6 @@ public extension SecureLogger { } } - static func debug(_ event: SecurityEvent, file: String = #file, line: Int = #line, function: String = #function) { - logSecurityEvent(event, level: .debug, file: file, line: line, function: function) - } - static func info(_ event: SecurityEvent, file: String = #file, line: Int = #line, function: String = #function) { logSecurityEvent(event, level: .info, file: file, line: line, function: function) } @@ -280,14 +276,3 @@ private extension SecureLogger { } } -// MARK: - Migration Helper - -/// Helper to migrate from print statements to SecureLogger -/// Usage: Replace print(...) with secureLog(...) -public func secureLog(_ items: Any..., separator: String = " ", terminator: String = "\n", - file: String = #file, line: Int = #line, function: String = #function) { - #if DEBUG - let message = items.map { String(describing: $0) }.joined(separator: separator) - SecureLogger.debug(message, file: file, line: line, function: function) - #endif -} From 74b8a47d024b6e61277dbd2eb349f649a30dd59b Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 13:24:44 +0200 Subject: [PATCH 060/158] Empty-mesh liveliness: nearby conversations, echoes, wave, dead drops, radar (#1409) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Empty-mesh liveliness: nearby conversations, echoes, wave action, dead drops, radar The empty mesh timeline was a dead end: a grey zero and "nobody in range yet". This turns it into a live surface and gives the app pull when the mesh wakes up: - Nearest conversation: background geohash sampling now tracks actual chat messages (not just presence) per regional channel; the empty state surfaces the busiest nearby conversation with a preview, one tap to join (GeohashChatActivityTracker, fed from GeoPresenceTracker). - Echoes: the carried 6h store-and-forward window renders as dimmed "heard here earlier" rows at launch (new Transport collectArchivedPublicMessages -> GossipSyncManager snapshot, decoded with signature-derived nicknames; content-identity dedup guards against re-synced duplicates). - Wave: the "bitchatters nearby" notification gains a "wave" quick action that broadcasts a mesh 👋 straight from the notification, even backgrounded (first UNNotificationCategory in the app). - Dead drops: /drop pins a note to the current building geohash as a kind-1 location note with a 24h NIP-40 expiry; expired notes are now dropped client-side at ingest; the notices sheet shows "fades in Xh"; a "location notes" toggle plus location-permission controls live in app info (also fixes the duplicated Voice section). - Radar: an ambient sonar animation shows the radio scanning, with a privacy-safe daily tally ("N devices passed within range today" via salted per-day hashes) and a "notes left here" hint that opens the notices geo tab. All new user-facing strings ship in all 29 locales. 1403 tests green, including new suites for the activity tracker, sightings tally, and note expiry/drop publishing. Co-Authored-By: Claude Fable 5 * Review round: app-info polish, urgent/expiry parity, centered radar, pin fill, Codex P2s - App info: LOCATION header uppercased like sibling sections; location notes and live voice descriptions shortened (29 locales); redundant "location access granted" line removed. - Notices parity: urgent + expiry controls now show on the geo tab too; the bridged Nostr note carries ["t","urgent"] and NIP-40 so relay-side readers see both; urgent parsed back from incoming notes. - Radar moved from the top of the empty state to the center of the chat area, below the help text (empty state fills the visible height). - Header pin fills whenever the scope has notices (was: only unseen), and Nostr-only nearby notes now light it too. - Codex P2 fixes: notification completion deferred until the wave action is handled (background suspension dropped the send); NIP-40 notes now prune on a timer when they expire while displayed; the location-notes kill switch retargets the nearby-notes counter immediately. Co-Authored-By: Claude Fable 5 * Hide macOS segmented picker's built-in label in notices composer (duplicate 'expires in') Co-Authored-By: Claude Fable 5 * Geo notes: permanent (∞) expiry default, urgent stays mesh-only - Geo expiry picker gains ∞ as the default: a permanent note posts as a pure relay note (no NIP-40 tag, no mesh-board copy — a board copy must fade within days, contradicting the ∞ the user picked). 1/3/7d keep the board + bridged-note path with NIP-40. - The notes manager is now owned by the notices sheet (not the list) so the composer local-echoes ∞ notes into the list; it revives via refresh() after a tab-switch cancel, and its expiry-prune timer survives cancel (weak self, dies with the instance). - Urgent toggle returns to mesh-only per review — notes are ambient; the read-side urgent-tag parse stays so tagged notes still render. - macOS: hide the segmented picker's built-in label (duplicate "expires in"). Co-Authored-By: Claude Fable 5 * Clearing the mesh timeline dismisses echoes for good; tighter divider copy Triple-tap /clear emptied the timeline but the next launch re-seeded "heard here earlier" from the persisted archive. A MeshEchoSettings watermark now records the clear; only messages heard after it come back (the archive itself still carries everything for peers' sync). The echo dedup keys reset with it, and panic wipe drops the watermark. Divider copy tightened to "heard here earlier · last 6h" (29 locales). Co-Authored-By: Claude Fable 5 * Echoes visual polish: tinted history block, radar-captioned tally, ambient footer Device-test feedback on the echoes screen: - Archived echoes now sit on a subtle tinted background (secondary at 8%) in addition to the dim, so "heard here earlier" reads as one distinct block; the divider carries the echo ID prefix to join it. - "N devices passed within range today" moves out of the narration lines to sit centered under the radar as its caption. - When the timeline holds only echoes/system lines, a compact ambient footer (small radar + tally + live hints) renders below the history instead of the whole ambient layer vanishing. Co-Authored-By: Claude Fable 5 * Notes strip persists above the mesh chat; leaner empty-state narration - The 📍 "notes left here" line was empty-state-only, so starting a conversation hid it. It is now a tappable strip pinned above the mesh timeline whenever unexpired notes exist at this place (opens the notices geo tab); the nearby-notes counter runs for the whole mesh timeline, not just the empty state. - Empty state narration drops "nobody in range yet..." (the radar and the sightings caption already say it) and the nearby-conversation hint moves below the help line instead of splitting the narration. Co-Authored-By: Claude Fable 5 * Radar means searching: hide the sweep once mesh peers are connected or reachable Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/AppChromeModel.swift | 9 + bitchat/App/AppRuntime.swift | 11 +- bitchat/App/NearbyNotesCounter.swift | 89 + bitchat/BitchatApp.swift | 12 +- bitchat/Localizable.xcstrings | 2938 ++++++++++++++++- bitchat/Models/CommandInfo.swift | 6 +- bitchat/Nostr/NostrProtocol.swift | 6 +- bitchat/Services/BLE/BLEService.swift | 50 + bitchat/Services/Board/BoardManager.swift | 11 +- bitchat/Services/Board/UnifiedNotices.swift | 9 +- bitchat/Services/CommandProcessor.swift | 29 + .../Services/GeohashChatActivityTracker.swift | 122 + bitchat/Services/LocationNotesManager.swift | 119 +- bitchat/Services/LocationNotesSettings.swift | 29 + bitchat/Services/MeshEchoSettings.swift | 27 + bitchat/Services/MeshSightingsTracker.swift | 106 + bitchat/Services/NotificationService.swift | 56 +- bitchat/Services/Transport.swift | 30 + bitchat/Services/TransportConfig.swift | 8 + bitchat/Sync/GossipSyncManager.swift | 13 + .../ViewModels/ChatOutgoingCoordinator.swift | 7 + .../ViewModels/ChatPeerListCoordinator.swift | 10 + .../ChatPublicConversationCoordinator.swift | 35 + bitchat/ViewModels/ChatViewModel.swift | 12 + .../ChatViewModelBootstrapper.swift | 54 + bitchat/ViewModels/GeoPresenceTracker.swift | 23 + bitchat/Views/AppInfoView.swift | 58 +- .../Views/Components/MeshEmptyStateView.swift | 180 + bitchat/Views/Components/MeshRadarView.swift | 68 + bitchat/Views/ContentHeaderView.swift | 29 +- bitchat/Views/MessageListView.swift | 105 +- bitchat/Views/NoticesView.swift | 149 +- .../ChatPeerListCoordinatorContextTests.swift | 7 + bitchatTests/LocationNotesManagerTests.swift | 120 + .../GeohashChatActivityTrackerTests.swift | 113 + .../Services/MeshSightingsTrackerTests.swift | 81 + bitchatTests/ViewSmokeTests.swift | 2 +- 37 files changed, 4633 insertions(+), 100 deletions(-) create mode 100644 bitchat/App/NearbyNotesCounter.swift create mode 100644 bitchat/Services/GeohashChatActivityTracker.swift create mode 100644 bitchat/Services/LocationNotesSettings.swift create mode 100644 bitchat/Services/MeshEchoSettings.swift create mode 100644 bitchat/Services/MeshSightingsTracker.swift create mode 100644 bitchat/Views/Components/MeshEmptyStateView.swift create mode 100644 bitchat/Views/Components/MeshRadarView.swift create mode 100644 bitchatTests/Services/GeohashChatActivityTrackerTests.swift create mode 100644 bitchatTests/Services/MeshSightingsTrackerTests.swift diff --git a/bitchat/App/AppChromeModel.swift b/bitchat/App/AppChromeModel.swift index a920c128..9db9e51e 100644 --- a/bitchat/App/AppChromeModel.swift +++ b/bitchat/App/AppChromeModel.swift @@ -10,6 +10,10 @@ final class AppChromeModel: ObservableObject { @Published var showingFingerprintFor: PeerID? @Published var isAppInfoPresented = false @Published var isLocationChannelsSheetPresented = false + @Published var isNoticesSheetPresented = false + /// When the sheet is opened for "notes left here" (empty mesh timeline), + /// it should land on the geo tab instead of the channel-derived default. + @Published var noticesSheetPrefersGeoTab = false @Published var showBluetoothAlert = false @Published var bluetoothAlertMessage = "" @Published var bluetoothState: CBManagerState = .unknown @@ -62,6 +66,11 @@ final class AppChromeModel: ObservableObject { isAppInfoPresented = true } + func presentNotices(geoTab: Bool = false) { + noticesSheetPrefersGeoTab = geoTab + isNoticesSheetPresented = true + } + /// Builds the mesh topology map model from the transport's gossiped /// graph plus the live nickname table. Unknown nodes (heard about via a /// neighbor claim but never announced to us) fall back to a short ID. diff --git a/bitchat/App/AppRuntime.swift b/bitchat/App/AppRuntime.swift index 27d0d993..81f2995b 100644 --- a/bitchat/App/AppRuntime.swift +++ b/bitchat/App/AppRuntime.swift @@ -217,7 +217,16 @@ final class AppRuntime: ObservableObject { chatViewModel.applicationWillTerminate() } - func handleNotificationResponse(identifier: String, userInfo: [AnyHashable: Any]) { + func handleNotificationResponse( + identifier: String, + actionIdentifier: String = UNNotificationDefaultActionIdentifier, + userInfo: [AnyHashable: Any] + ) { + if actionIdentifier == NotificationService.waveActionID { + chatViewModel.sendMeshWave() + return + } + if identifier.hasPrefix("private-"), let peerID = PeerID(str: userInfo["peerID"] as? String) { record(.notificationOpened(peerID: peerID)) chatViewModel.startPrivateChat(with: peerID) diff --git a/bitchat/App/NearbyNotesCounter.swift b/bitchat/App/NearbyNotesCounter.swift new file mode 100644 index 00000000..3c1f630a --- /dev/null +++ b/bitchat/App/NearbyNotesCounter.swift @@ -0,0 +1,89 @@ +// +// NearbyNotesCounter.swift +// bitchat +// +// Counts unexpired location notes left at the user's current building-level +// geohash so the empty mesh timeline can say "📍 3 notes left here". Only +// subscribes while a view holds it active, and only when location notes are +// enabled and location permission is already granted (it never prompts). +// This is free and unencumbered software released into the public domain. +// + +import Combine +import Foundation + +@MainActor +final class NearbyNotesCounter: ObservableObject { + static let shared = NearbyNotesCounter() + + @Published private(set) var noteCount = 0 + + private var manager: LocationNotesManager? + private var managerCancellable: AnyCancellable? + private var channelsCancellable: AnyCancellable? + private var settingCancellable: AnyCancellable? + private var activeHolders = 0 + private let locationManager: LocationChannelManager + + init(locationManager: LocationChannelManager = .shared) { + self.locationManager = locationManager + } + + /// Begins (or keeps) the notes subscription for the current building + /// geohash. Balanced by `deactivate()`; ref-counted so multiple views can + /// hold it. + func activate() { + activeHolders += 1 + guard activeHolders == 1 else { return } + channelsCancellable = locationManager.$availableChannels + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in self?.retarget() } + // The app-info kill switch must take effect immediately, not on the + // next location change or remount. + settingCancellable = NotificationCenter.default + .publisher(for: LocationNotesSettings.didChangeNotification) + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in self?.retarget() } + retarget() + } + + func deactivate() { + activeHolders = max(0, activeHolders - 1) + guard activeHolders == 0 else { return } + channelsCancellable = nil + settingCancellable = nil + managerCancellable = nil + manager?.cancel() + manager = nil + noteCount = 0 + } + + private func retarget() { + guard activeHolders > 0, + LocationNotesSettings.enabled, + locationManager.permissionState == .authorized, + let geohash = locationManager.availableChannels + .first(where: { $0.level == .building })?.geohash + else { + managerCancellable = nil + manager?.cancel() + manager = nil + noteCount = 0 + return + } + + if let manager { + manager.setGeohash(geohash) + return + } + + let fresh = LocationNotesManager(geohash: geohash) + manager = fresh + managerCancellable = fresh.$notes + .receive(on: DispatchQueue.main) + .sink { [weak self] notes in + let now = Date() + self?.noteCount = notes.filter { $0.expiresAt.map { $0 > now } ?? true }.count + } + } +} diff --git a/bitchat/BitchatApp.swift b/bitchat/BitchatApp.swift index 41a01f6d..c1a39fff 100644 --- a/bitchat/BitchatApp.swift +++ b/bitchat/BitchatApp.swift @@ -104,12 +104,20 @@ final class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let identifier = response.notification.request.identifier + let actionIdentifier = response.actionIdentifier let userInfo = response.notification.request.content.userInfo + // Complete only after the response is handled: for a background + // action (👋 wave) the system may suspend the app the moment the + // completion handler runs, which would drop the queued send. Task { @MainActor in - self.runtime?.handleNotificationResponse(identifier: identifier, userInfo: userInfo) + self.runtime?.handleNotificationResponse( + identifier: identifier, + actionIdentifier: actionIdentifier, + userInfo: userInfo + ) + completionHandler() } - completionHandler() } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index c0be8226..a5c93c76 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -7181,6 +7181,906 @@ } } }, + "app_info.location.enable" : { + "comment" : "Button in app info requesting location permission", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تفعيل الوصول إلى الموقع" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "অবস্থান অ্যাক্সেস চালু করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "standortzugriff aktivieren" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "enable location access" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "activar acceso a la ubicación" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "i-enable ang access sa lokasyon" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "activer l'accès à la localisation" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אפשר גישה למיקום" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "स्थान एक्सेस चालू करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "aktifkan akses lokasi" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "attiva accesso alla posizione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置情報へのアクセスを有効にする" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "위치 접근 허용" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "aktifkan akses lokasi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "स्थान पहुँच सक्षम गर्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "locatietoegang inschakelen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "włącz dostęp do lokalizacji" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "ativar acesso à localização" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ativar acesso à localização" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "включить доступ к геолокации" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "aktivera platsåtkomst" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இருப்பிட அணுகலை இயக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เปิดการเข้าถึงตำแหน่งที่ตั้ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "konum erişimini etkinleştir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "увімкнути доступ до місцезнаходження" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "مقام تک رسائی فعال کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "bật quyền truy cập vị trí" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用位置权限" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用位置權限" + } + } + } + }, + "app_info.location.notes.description" : { + "comment" : "Description of the location notes toggle in app info", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "ثبّت ملاحظات في الأماكن باستخدام /drop، يقرؤها أي مارّ خلال 24 ساعة. يتطلب الموقع." + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "/drop দিয়ে জায়গায় নোট পিন করুন, 24 ঘণ্টা ধরে পাশ দিয়ে যাওয়া যে কেউ পড়তে পারবে। অবস্থান প্রয়োজন।" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "hefte notizen mit /drop an orte, 24h lesbar für alle, die vorbeikommen. benötigt standort." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "pin notes to places with /drop, readable by anyone passing by for 24h. needs location." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "fija notas en lugares con /drop, legibles por cualquiera que pase durante 24h. necesita ubicación." + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "mag-pin ng mga note sa mga lugar gamit ang /drop, mababasa ng sinumang dadaan sa loob ng 24h. kailangan ng lokasyon." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "épinglez des notes à des lieux avec /drop, lisibles par quiconque passe pendant 24h. nécessite la localisation." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הצמד פתקים למקומות עם /drop, קריאים לכל מי שעובר במשך 24 שעות. דורש מיקום." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "/drop से जगहों पर नोट पिन करें, 24 घंटे तक वहां से गुजरने वाला कोई भी पढ़ सकता है। स्थान आवश्यक।" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "sematkan catatan di tempat dengan /drop, dapat dibaca siapa pun yang lewat selama 24 jam. perlu lokasi." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "fissa note nei luoghi con /drop, leggibili da chiunque passi per 24h. richiede la posizione." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "/drop で場所にメモをピン留め。24時間、通りかかった誰でも読めます。位置情報が必要です。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "/drop로 장소에 메모를 고정하세요. 24시간 동안 지나가는 누구나 읽을 수 있습니다. 위치 필요." + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinkan nota di tempat dengan /drop, boleh dibaca sesiapa yang lalu selama 24 jam. perlukan lokasi." + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "/drop ले ठाउँहरूमा नोट पिन गर्नुहोस्, 24 घण्टासम्म त्यहाँबाट जाने जोकोहीले पढ्न सक्छ। स्थान आवश्यक।" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "pin notities aan plekken met /drop, 24 uur leesbaar voor iedereen die langskomt. vereist locatie." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "przypinaj notatki do miejsc za pomocą /drop, czytelne dla każdego przechodzącego przez 24h. wymaga lokalizacji." + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "fixe notas em locais com /drop, legíveis por quem passar durante 24h. requer localização." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "fixe notas em lugares com /drop, legíveis por quem passar durante 24h. precisa de localização." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "закрепляйте заметки в местах с помощью /drop — 24 часа их сможет прочитать любой, кто проходит мимо. нужна геолокация." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "fäst anteckningar på platser med /drop, läsbara av alla som passerar i 24h. kräver plats." + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "/drop மூலம் இடங்களில் குறிப்புகளை பின் செய்யுங்கள், 24 மணி நேரம் கடந்து செல்லும் யாரும் படிக்கலாம். இருப்பிடம் தேவை." + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ปักโน้ตไว้ตามสถานที่ด้วย /drop ใครผ่านมาก็อ่านได้ตลอด 24 ชั่วโมง ต้องใช้ตำแหน่งที่ตั้ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "/drop ile yerlere not sabitle, 24 saat boyunca yoldan geçen herkes okuyabilir. konum gerekir." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "закріплюйте нотатки в місцях за допомогою /drop — 24 години їх зможе прочитати будь-хто, хто проходить повз. потрібне місцезнаходження." + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "/drop سے جگہوں پر نوٹ پن کریں، 24 گھنٹے تک وہاں سے گزرنے والا کوئی بھی پڑھ سکتا ہے۔ مقام درکار ہے۔" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ghim ghi chú vào địa điểm bằng /drop, ai đi ngang cũng đọc được trong 24h. cần vị trí." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用 /drop 把便签钉在地点,24小时内路过的任何人都能读到。需要位置权限。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "用 /drop 將便箋釘在地點,24小時內路過的任何人都能讀到。需要位置權限。" + } + } + } + }, + "app_info.location.notes.title" : { + "comment" : "Title of the location notes toggle in app info", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "ملاحظات الموقع" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "অবস্থান নোট" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "standortnotizen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "notas de ubicación" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "mga note sa lokasyon" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "notes de lieu" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פתקי מיקום" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "स्थान नोट" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "catatan lokasi" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "note di posizione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置メモ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "위치 쪽지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "nota lokasi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "स्थान नोटहरू" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "locatienotities" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "notatki lokalizacji" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "notas de localização" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "notas de localização" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "геозаметки" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "platsanteckningar" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இருப்பிடக் குறிப்புகள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "โน้ตตำแหน่งที่ตั้ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "konum notları" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "геонотатки" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "مقام کے نوٹس" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ghi chú vị trí" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置留言" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置留言" + } + } + } + }, + "app_info.location.open_settings" : { + "comment" : "Button in app info when location permission was denied", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "افتح إعدادات النظام للسماح بالموقع" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "অবস্থান অনুমতি দিতে সিস্টেম সেটিংস খুলুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "systemeinstellungen öffnen, um standort zu erlauben" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "open system settings to allow location" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "abre los ajustes del sistema para permitir la ubicación" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "buksan ang system settings para payagan ang lokasyon" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ouvre les réglages système pour autoriser la localisation" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פתח את הגדרות המערכת כדי לאפשר מיקום" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "स्थान की अनुमति देने के लिए सिस्टम सेटिंग्स खोलें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "buka pengaturan sistem untuk mengizinkan lokasi" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "apri le impostazioni di sistema per consentire la posizione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "システム設定を開いて位置情報を許可" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "시스템 설정을 열어 위치 허용" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "buka tetapan sistem untuk benarkan lokasi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "स्थान अनुमति दिन प्रणाली सेटिङ खोल्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "open systeeminstellingen om locatie toe te staan" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "otwórz ustawienia systemowe, aby zezwolić na lokalizację" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "abrir definições do sistema para permitir a localização" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "abrir os ajustes do sistema para permitir a localização" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "откройте настройки системы, чтобы разрешить геолокацию" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "öppna systeminställningar för att tillåta plats" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இருப்பிடத்தை அனுமதிக்க கணினி அமைப்புகளைத் திறக்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เปิดการตั้งค่าระบบเพื่ออนุญาตตำแหน่งที่ตั้ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "konuma izin vermek için sistem ayarlarını aç" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "відкрийте системні налаштування, щоб дозволити місцезнаходження" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "مقام کی اجازت دینے کے لیے سسٹم سیٹنگز کھولیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "mở cài đặt hệ thống để cho phép vị trí" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开系统设置以允许位置访问" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "打開系統設定以允許位置存取" + } + } + } + }, + "app_info.location.title" : { + "comment" : "Section header for location settings in the app info sheet", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الموقع" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "অবস্থান" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "STANDORT" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOCATION" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "UBICACIÓN" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOKASYON" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOCALISATION" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מיקום" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "स्थान" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOKASI" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "POSIZIONE" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置情報" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "위치" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOKASI" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "स्थान" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOCATIE" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOKALIZACJA" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOCALIZAÇÃO" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOCALIZAÇÃO" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "ГЕОЛОКАЦИЯ" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "PLATS" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இருப்பிடம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ตำแหน่งที่ตั้ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "KONUM" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "МІСЦЕЗНАХОДЖЕННЯ" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "مقام" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "VỊ TRÍ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置" + } + } + } + }, "app_info.network.title" : { "comment" : "Section header for network diagnostics in the app info sheet", "extractionState" : "manual", @@ -9339,175 +10239,175 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "بث الرسائل الصوتية أثناء التحدث عندما يكون المستلم متاحًا؛ يتم تشغيل الصوت المباشر الوارد تلقائيًا في المحادثة المفتوحة" + "value" : "يُبث أثناء التحدث؛ الصوت المباشر الوارد يُشغَّل تلقائيًا" } }, "bn" : { "stringUnit" : { "state" : "translated", - "value" : "প্রাপক নাগালের মধ্যে থাকলে কথা বলার সাথে সাথে ভয়েস বার্তা স্ট্রিম হয়; খোলা চ্যাটে আগত লাইভ ভয়েস স্বয়ংক্রিয়ভাবে চলে" + "value" : "কথা বলার সাথে সাথে স্ট্রিম হয়; আগত লাইভ ভয়েস স্বয়ংক্রিয়ভাবে চলে" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "sprachnachrichten werden beim sprechen live übertragen, wenn der empfänger erreichbar ist; eingehende live-stimme wird im geöffneten chat automatisch abgespielt" + "value" : "überträgt live beim sprechen; eingehende live-stimme wird automatisch abgespielt" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "stream voice messages as you speak when the recipient is reachable; incoming live voice plays automatically in the open chat" + "value" : "streams as you speak; incoming live voice plays automatically" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "transmite mensajes de voz mientras hablas cuando el destinatario está disponible; la voz en vivo entrante se reproduce automáticamente en el chat abierto" + "value" : "transmite mientras hablas; la voz en vivo entrante se reproduce automáticamente" } }, "fil" : { "stringUnit" : { "state" : "translated", - "value" : "ini-stream ang mga voice message habang nagsasalita kapag maaabot ang tatanggap; awtomatikong tumutugtog ang papasok na live na boses sa bukas na chat" + "value" : "nag-i-stream habang nagsasalita ka; awtomatikong tumutugtog ang papasok na live na boses" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "diffuse les messages vocaux pendant que vous parlez lorsque le destinataire est joignable ; la voix en direct entrante est lue automatiquement dans la discussion ouverte" + "value" : "diffuse pendant que vous parlez ; la voix en direct entrante est lue automatiquement" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "משדר הודעות קוליות בזמן שאתה מדבר כשהנמען זמין; קול חי נכנס מושמע אוטומטית בצ'אט הפתוח" + "value" : "משדר בזמן שאתה מדבר; קול חי נכנס מושמע אוטומטית" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "प्राप्तकर्ता पहुंच में होने पर बोलते समय वॉयस संदेश स्ट्रीम होते हैं; खुली चैट में आने वाली लाइव आवाज़ अपने आप चलती है" + "value" : "बोलते समय स्ट्रीम होता है; आने वाली लाइव आवाज़ अपने आप चलती है" } }, "id" : { "stringUnit" : { "state" : "translated", - "value" : "streaming pesan suara saat Anda berbicara ketika penerima terjangkau; suara langsung yang masuk diputar otomatis di obrolan yang terbuka" + "value" : "streaming saat Anda berbicara; suara langsung yang masuk diputar otomatis" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "trasmette i messaggi vocali mentre parli quando il destinatario è raggiungibile; la voce in diretta in arrivo viene riprodotta automaticamente nella chat aperta" + "value" : "trasmette mentre parli; la voce in diretta in arrivo viene riprodotta automaticamente" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "受信者に到達可能なとき、話しながら音声メッセージをライブ配信します。受信したライブ音声は開いているチャットで自動再生されます" + "value" : "話しながらライブ配信。受信したライブ音声は自動再生されます" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "상대방이 연결되어 있으면 말하는 동안 음성 메시지가 실시간 전송됩니다. 수신된 라이브 음성은 열려 있는 채팅에서 자동 재생됩니다" + "value" : "말하는 동안 실시간 전송됩니다. 수신된 라이브 음성은 자동 재생됩니다" } }, "ms" : { "stringUnit" : { "state" : "translated", - "value" : "strim mesej suara semasa anda bercakap apabila penerima boleh dihubungi; suara langsung masuk dimainkan secara automatik dalam sembang terbuka" + "value" : "strim semasa anda bercakap; suara langsung masuk dimainkan secara automatik" } }, "ne" : { "stringUnit" : { "state" : "translated", - "value" : "प्रापक पहुँचयोग्य हुँदा बोल्दै गर्दा भ्वाइस सन्देशहरू स्ट्रिम हुन्छन्; खुला च्याटमा आगमन लाइभ आवाज स्वतः बज्छ" + "value" : "बोल्दै गर्दा स्ट्रिम हुन्छ; आगमन लाइभ आवाज स्वतः बज्छ" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "streamt spraakberichten terwijl je praat wanneer de ontvanger bereikbaar is; inkomende live spraak wordt automatisch afgespeeld in de geopende chat" + "value" : "streamt terwijl je praat; inkomende live spraak wordt automatisch afgespeeld" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "przesyła wiadomości głosowe na żywo podczas mówienia, gdy odbiorca jest osiągalny; przychodzący głos na żywo odtwarza się automatycznie w otwartym czacie" + "value" : "przesyła na żywo podczas mówienia; przychodzący głos na żywo odtwarza się automatycznie" } }, "pt" : { "stringUnit" : { "state" : "translated", - "value" : "transmite mensagens de voz enquanto fala quando o destinatário está acessível; a voz ao vivo recebida é reproduzida automaticamente na conversa aberta" + "value" : "transmite enquanto fala; a voz ao vivo recebida é reproduzida automaticamente" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "transmite mensagens de voz enquanto você fala quando o destinatário está acessível; a voz ao vivo recebida toca automaticamente na conversa aberta" + "value" : "transmite enquanto você fala; a voz ao vivo recebida toca automaticamente" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "передаёт голосовые сообщения в реальном времени, пока вы говорите, если получатель доступен; входящий живой голос автоматически воспроизводится в открытом чате" + "value" : "передаёт, пока вы говорите; входящий живой голос воспроизводится автоматически" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "strömmar röstmeddelanden medan du pratar när mottagaren är nåbar; inkommande live-röst spelas upp automatiskt i den öppna chatten" + "value" : "strömmar medan du pratar; inkommande live-röst spelas upp automatiskt" } }, "ta" : { "stringUnit" : { "state" : "translated", - "value" : "பெறுநர் அணுகக்கூடியதாக இருக்கும்போது நீங்கள் பேசும்போதே குரல் செய்திகள் நேரலையாக அனுப்பப்படும்; உள்வரும் நேரலை குரல் திறந்த அரட்டையில் தானாக ஒலிக்கும்" + "value" : "நீங்கள் பேசும்போதே நேரலையாக அனுப்பப்படும்; உள்வரும் நேரலை குரல் தானாக ஒலிக்கும்" } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "สตรีมข้อความเสียงขณะพูดเมื่อติดต่อผู้รับได้ เสียงสดขาเข้าจะเล่นอัตโนมัติในแชทที่เปิดอยู่" + "value" : "สตรีมขณะพูด เสียงสดขาเข้าจะเล่นอัตโนมัติ" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "alıcı erişilebilir olduğunda sesli mesajlar siz konuşurken canlı iletilir; gelen canlı ses açık sohbette otomatik çalınır" + "value" : "siz konuşurken canlı iletilir; gelen canlı ses otomatik çalınır" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "передає голосові повідомлення наживо, поки ви говорите, якщо одержувач доступний; вхідний живий голос автоматично відтворюється у відкритому чаті" + "value" : "передає, поки ви говорите; вхідний живий голос відтворюється автоматично" } }, "ur" : { "stringUnit" : { "state" : "translated", - "value" : "جب وصول کنندہ قابل رسائی ہو تو بولتے وقت صوتی پیغامات لائیو نشر ہوتے ہیں؛ موصول ہونے والی لائیو آواز کھلی چیٹ میں خود بخود چلتی ہے" + "value" : "بولتے وقت لائیو نشر ہوتا ہے؛ موصول ہونے والی لائیو آواز خود بخود چلتی ہے" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "phát trực tiếp tin nhắn thoại khi bạn nói nếu người nhận trong tầm kết nối; giọng nói trực tiếp đến sẽ tự phát trong cuộc trò chuyện đang mở" + "value" : "phát trực tiếp khi bạn nói; giọng nói trực tiếp đến sẽ tự phát" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "当接收方可达时,语音消息会在你说话的同时实时传输;收到的实时语音会在打开的聊天中自动播放" + "value" : "边说边实时传输;收到的实时语音会自动播放" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "當接收方可達時,語音訊息會在你說話的同時即時傳輸;收到的即時語音會在開啟的聊天中自動播放" + "value" : "邊說邊即時傳輸;收到的即時語音會自動播放" } } } @@ -21373,6 +22273,186 @@ } } }, + "content.commands.drop" : { + "comment" : "Description of the /drop command in the command suggestions panel", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "ثبّت ملاحظة في هذا المكان لمدة 24 ساعة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "এই জায়গায় 24 ঘণ্টার জন্য একটি নোট পিন করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "eine notiz für 24 std. an diesem ort anheften" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "pin a note to this place for 24h" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "fija una nota en este lugar por 24 h" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "mag-pin ng note sa lugar na ito nang 24 na oras" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "épingle une note à cet endroit pendant 24 h" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הצמד פתק למקום הזה ל-24 שעות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "इस जगह पर 24 घंटे के लिए एक नोट पिन करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "sematkan catatan di tempat ini selama 24 jam" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "fissa una nota in questo luogo per 24 ore" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "この場所に24時間メモをピン留め" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이 장소에 24시간 동안 쪽지 고정" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinkan nota di tempat ini selama 24 jam" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "यस ठाउँमा 24 घण्टाका लागि नोट पिन गर्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "pin een notitie op deze plek voor 24 uur" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "przypnij notatkę do tego miejsca na 24 godz." + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "fixar uma nota neste local por 24 h" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "fixar uma nota neste lugar por 24 h" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "закрепить заметку в этом месте на 24 ч" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "fäst en anteckning på den här platsen i 24 tim" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இந்த இடத்தில் 24 மணி நேரத்திற்கு ஒரு குறிப்பை பொருத்தவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ปักโน้ตไว้ที่นี่เป็นเวลา 24 ชม." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "bu yere 24 saatliğine bir not sabitle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "закріпити нотатку в цьому місці на 24 год" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "اس جگہ پر 24 گھنٹے کے لیے ایک نوٹ پن کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ghim một ghi chú tại nơi này trong 24 giờ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在此地固定一条留言 24 小时" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "在此地固定一則留言 24 小時" + } + } + } + }, "content.commands.favorite" : { "extractionState" : "manual", "localizations" : { @@ -26216,6 +27296,546 @@ } } }, + "content.echoes.divider" : { + "comment" : "System line shown above dimmed archived messages replayed on the mesh timeline at launch", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "سُمع هنا سابقًا · آخر 6 ساعات" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "আগে এখানে শোনা গেছে · গত ৬ ঘণ্টা" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "vorhin hier gehört · letzte 6 std." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "heard here earlier · last 6h" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "escuchado aquí antes · últimas 6 h" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "narinig dito kanina · huling 6 oras" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "entendu ici plus tôt · 6 dernières h" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נשמע כאן קודם · 6 שעות אחרונות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "पहले यहाँ सुना गया · पिछले 6 घंटे" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "terdengar di sini sebelumnya · 6 jam terakhir" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "sentito qui prima · ultime 6 ore" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ここで聞こえた · 過去6時間" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "여기서 들린 대화 · 지난 6시간" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "didengar di sini tadi · 6 jam lepas" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "पहिले यहाँ सुनिएको · पछिल्लो ६ घण्टा" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "eerder hier gehoord · afgelopen 6 u" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "słyszane tu wcześniej · ostatnie 6 godz." + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "ouvido aqui antes · últimas 6 h" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ouvido aqui antes · últimas 6 h" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "слышано здесь ранее · последние 6 ч" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "hört här tidigare · senaste 6 tim" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "முன்பு இங்கே கேட்டது · கடந்த 6 மணி" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ได้ยินที่นี่ก่อนหน้านี้ · 6 ชม.ที่ผ่านมา" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "daha önce burada duyuldu · son 6 sa" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "почуто тут раніше · останні 6 год" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "پہلے یہاں سنا گیا · گزشتہ 6 گھنٹے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "đã nghe ở đây trước đó · 6 giờ qua" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "之前在这里听到 · 最近6小时" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "之前在這裡聽到 · 最近6小時" + } + } + } + }, + "content.empty.activity_many" : { + "comment" : "Empty mesh timeline hint when several people are chatting in a nearby geohash channel; placeholder is the geohash", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "أشخاص يتحدثون في #%@ — انقر للانضمام" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "লোকজন #%@-এ কথা বলছে — যোগ দিতে ট্যাপ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "leute reden in #%@ — tippen zum beitreten" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "people are talking in #%@ — tap to join" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "hay gente hablando en #%@ — toca para unirte" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "may mga nag-uusap sa #%@ — i-tap para sumali" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "des gens parlent dans #%@ — appuyez pour rejoindre" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אנשים מדברים ב-#%@ — הקש כדי להצטרף" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ में लोग बात कर रहे हैं — शामिल होने के लिए टैप करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "orang-orang sedang mengobrol di #%@ — ketuk untuk bergabung" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "c'è gente che parla in #%@ — tocca per unirti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ で人々が話しています — タップして参加" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@에서 사람들이 이야기 중 — 탭하여 참여" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "ramai sedang berbual di #%@ — ketik untuk sertai" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ मा मानिसहरू कुरा गर्दैछन् — सामेल हुन ट्याप गर्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensen praten in #%@ — tik om mee te doen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "ludzie rozmawiają w #%@ — stuknij, aby dołączyć" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "há pessoas a falar em #%@ — toque para entrar" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "tem gente conversando em #%@ — toque para entrar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "люди общаются в #%@ — нажмите, чтобы присоединиться" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "folk pratar i #%@ — tryck för att gå med" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ இல் மக்கள் பேசுகிறார்கள் — சேர தட்டவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "หลายคนกำลังคุยใน #%@ — แตะเพื่อเข้าร่วม" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ içinde insanlar konuşuyor — katılmak için dokun" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "люди спілкуються в #%@ — торкніться, щоб приєднатися" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ میں لوگ بات کر رہے ہیں — شامل ہونے کے لیے تھپتھپائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "mọi người đang trò chuyện trong #%@ — chạm để tham gia" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大家正在 #%@ 聊天 — 点按加入" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "大家正在 #%@ 聊天 — 點按加入" + } + } + } + }, + "content.empty.activity_one" : { + "comment" : "Empty mesh timeline hint when one person is chatting in a nearby geohash channel; placeholder is the geohash", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "أحدهم يتحدث في #%@ — انقر للانضمام" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "কেউ #%@-এ কথা বলছে — যোগ দিতে ট্যাপ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "jemand redet in #%@ — tippen zum beitreten" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "someone is talking in #%@ — tap to join" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "alguien está hablando en #%@ — toca para unirte" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "may nagsasalita sa #%@ — i-tap para sumali" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "quelqu'un parle dans #%@ — appuyez pour rejoindre" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מישהו מדבר ב-#%@ — הקש כדי להצטרף" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ में कोई बात कर रहा है — शामिल होने के लिए टैप करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "seseorang sedang mengobrol di #%@ — ketuk untuk bergabung" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "qualcuno sta parlando in #%@ — tocca per unirti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ で誰かが話しています — タップして参加" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@에서 누군가 이야기 중 — 탭하여 참여" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "seseorang sedang berbual di #%@ — ketik untuk sertai" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ मा कोही कुरा गर्दैछ — सामेल हुन ट्याप गर्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "iemand praat in #%@ — tik om mee te doen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "ktoś rozmawia w #%@ — stuknij, aby dołączyć" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "alguém está a falar em #%@ — toque para entrar" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "alguém está conversando em #%@ — toque para entrar" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "кто-то общается в #%@ — нажмите, чтобы присоединиться" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "någon pratar i #%@ — tryck för att gå med" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ இல் யாரோ பேசுகிறார்கள் — சேர தட்டவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "มีคนกำลังคุยใน #%@ — แตะเพื่อเข้าร่วม" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ içinde biri konuşuyor — katılmak için dokun" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "хтось спілкується в #%@ — торкніться, щоб приєднатися" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ میں کوئی بات کر رہا ہے — شامل ہونے کے لیے تھپتھپائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "có người đang trò chuyện trong #%@ — chạm để tham gia" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "有人正在 #%@ 聊天 — 点按加入" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "有人正在 #%@ 聊天 — 點按加入" + } + } + } + }, "content.empty.location_intro" : { "comment" : "First line of an empty geohash timeline naming the channel", "extractionState" : "manual", @@ -26756,6 +28376,726 @@ } } }, + "content.empty.notes_many" : { + "comment" : "Empty mesh timeline hint counting notes left at this place", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تُركت %lld ملاحظات هنا — انقر للقراءة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "এখানে %lldটি নোট রাখা আছে — পড়তে ট্যাপ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld notizen hier hinterlassen — tippen zum lesen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld notes left here — tap to read" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld notas dejadas aquí — toca para leer" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld note ang naiwan dito — i-tap para basahin" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld notes laissées ici — appuyez pour lire" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld פתקים הושארו כאן — הקש לקריאה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "यहाँ %lld नोट छोड़े गए हैं — पढ़ने के लिए टैप करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld catatan ditinggalkan di sini — ketuk untuk membaca" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld note lasciate qui — tocca per leggere" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ここに%lld件のメモがあります — タップして読む" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "여기 남겨진 쪽지 %lld개 — 탭하여 읽기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld nota ditinggalkan di sini — ketik untuk baca" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "यहाँ %lld नोटहरू छोडिएका छन् — पढ्न ट्याप गर्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld notities hier achtergelaten — tik om te lezen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld notatek zostawionych tutaj — stuknij, aby przeczytać" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld notas deixadas aqui — toque para ler" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld notas deixadas aqui — toque para ler" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "здесь оставлено заметок: %lld — нажмите, чтобы прочитать" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld anteckningar lämnade här — tryck för att läsa" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இங்கே %lld குறிப்புகள் விடப்பட்டுள்ளன — படிக்க தட்டவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "มี %lld โน้ตทิ้งไว้ที่นี่ — แตะเพื่ออ่าน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "buraya %lld not bırakıldı — okumak için dokun" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "тут залишено %lld нотаток — торкніться, щоб прочитати" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "یہاں %lld نوٹ چھوڑے گئے ہیں — پڑھنے کے لیے تھپتھپائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "có %lld ghi chú để lại ở đây — chạm để đọc" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "这里留有 %lld 条留言 — 点按阅读" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "這裡留有 %lld 則留言 — 點按閱讀" + } + } + } + }, + "content.empty.notes_one" : { + "comment" : "Empty mesh timeline hint when exactly one note was left at this place", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تُركت ملاحظة واحدة هنا — انقر للقراءة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "এখানে 1টি নোট রাখা আছে — পড়তে ট্যাপ করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 notiz hier hinterlassen — tippen zum lesen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 note left here — tap to read" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 nota dejada aquí — toca para leer" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 note ang naiwan dito — i-tap para basahin" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 note laissée ici — appuyez pour lire" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פתק אחד הושאר כאן — הקש לקריאה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "यहाँ 1 नोट छोड़ा गया है — पढ़ने के लिए टैप करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 catatan ditinggalkan di sini — ketuk untuk membaca" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 nota lasciata qui — tocca per leggere" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ここに1件のメモがあります — タップして読む" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "여기 남겨진 쪽지 1개 — 탭하여 읽기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 nota ditinggalkan di sini — ketik untuk baca" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "यहाँ 1 नोट छोडिएको छ — पढ्न ट्याप गर्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 notitie hier achtergelaten — tik om te lezen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 notatka zostawiona tutaj — stuknij, aby przeczytać" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 nota deixada aqui — toque para ler" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 nota deixada aqui — toque para ler" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "здесь оставлена 1 заметка — нажмите, чтобы прочитать" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 anteckning lämnad här — tryck för att läsa" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இங்கே 1 குறிப்பு விடப்பட்டுள்ளது — படிக்க தட்டவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "มี 1 โน้ตทิ้งไว้ที่นี่ — แตะเพื่ออ่าน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "buraya 1 not bırakıldı — okumak için dokun" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "тут залишено 1 нотатку — торкніться, щоб прочитати" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "یہاں 1 نوٹ چھوڑا گیا ہے — پڑھنے کے لیے تھپتھپائیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "có 1 ghi chú để lại ở đây — chạm để đọc" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "这里留有 1 条留言 — 点按阅读" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "這裡留有 1 則留言 — 點按閱讀" + } + } + } + }, + "content.empty.sightings_many" : { + "comment" : "Empty mesh timeline stat counting devices that came within range today", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مرّ %lld جهاز ضمن النطاق اليوم" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "আজ %lldটি ডিভাইস রেঞ্জের মধ্যে দিয়ে গেছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld geräte waren heute in reichweite" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld devices passed within range today" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dispositivos pasaron dentro del alcance hoy" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld device ang dumaan sa saklaw ngayong araw" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld appareils sont passés à portée aujourd'hui" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld מכשירים עברו בטווח היום" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "आज %lld डिवाइस रेंज में से गुज़रे" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld perangkat lewat dalam jangkauan hari ini" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dispositivi sono passati nel raggio oggi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "今日%lld台のデバイスが範囲内を通過" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "오늘 기기 %lld대가 범위 안을 지나갔어요" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld peranti lalu dalam jangkauan hari ini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "आज %lld यन्त्रहरू दायराभित्र आए" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld apparaten kwamen vandaag binnen bereik" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld urządzeń było dziś w zasięgu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dispositivos passaram dentro do alcance hoje" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dispositivos passaram dentro do alcance hoje" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "сегодня %lld устройств прошло в зоне досягаемости" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld enheter passerade inom räckvidd idag" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இன்று %lld சாதனங்கள் வரம்பிற்குள் கடந்தன" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "วันนี้มี %lld อุปกรณ์ผ่านเข้ามาในระยะ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "bugün %lld cihaz menzilden geçti" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "сьогодні %lld пристроїв пройшло в зоні досяжності" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "آج %lld ڈیوائسز رینج میں سے گزریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "hôm nay có %lld thiết bị đi qua trong tầm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "今天有 %lld 台设备经过范围内" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "今天有 %lld 台裝置經過範圍內" + } + } + } + }, + "content.empty.sightings_one" : { + "comment" : "Empty mesh timeline stat when exactly one device came within range today", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مرّ جهاز واحد ضمن النطاق اليوم" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "আজ 1টি ডিভাইস রেঞ্জের মধ্যে দিয়ে গেছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 gerät war heute in reichweite" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 device passed within range today" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 dispositivo pasó dentro del alcance hoy" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 device ang dumaan sa saklaw ngayong araw" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 appareil est passé à portée aujourd'hui" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מכשיר אחד עבר בטווח היום" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "आज 1 डिवाइस रेंज में से गुज़रा" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 perangkat lewat dalam jangkauan hari ini" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 dispositivo è passato nel raggio oggi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "今日1台のデバイスが範囲内を通過" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "오늘 기기 1대가 범위 안을 지나갔어요" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 peranti lalu dalam jangkauan hari ini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "आज 1 यन्त्र दायराभित्र आयो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 apparaat kwam vandaag binnen bereik" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 urządzenie było dziś w zasięgu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 dispositivo passou dentro do alcance hoje" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 dispositivo passou dentro do alcance hoje" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "сегодня 1 устройство прошло в зоне досягаемости" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 enhet passerade inom räckvidd idag" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இன்று 1 சாதனம் வரம்பிற்குள் கடந்தது" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "วันนี้มี 1 อุปกรณ์ผ่านเข้ามาในระยะ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "bugün 1 cihaz menzilden geçti" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "сьогодні 1 пристрій пройшов у зоні досяжності" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "آج 1 ڈیوائس رینج میں سے گزری" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "hôm nay có 1 thiết bị đi qua trong tầm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "今天有 1 台设备经过范围内" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "今天有 1 台裝置經過範圍內" + } + } + } + }, "content.empty.switch_hint" : { "comment" : "Empty timeline hint pointing at the channel switcher and the help screen", "extractionState" : "manual", @@ -28012,6 +30352,186 @@ } } }, + "content.input.note_placeholder" : { + "comment" : "Placeholder argument name for the /drop command suggestion", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "رسالة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "বার্তা" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "nachricht" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "message" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensaje" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensahe" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "message" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הודעה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "संदेश" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "pesan" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "messaggio" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "メッセージ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesej" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सन्देश" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "bericht" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "wiadomość" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensagem" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensagem" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "сообщение" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "meddelande" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "செய்தி" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ข้อความ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesaj" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "повідомлення" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "پیغام" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "tin nhắn" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "消息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "訊息" + } + } + } + }, "content.input.placeholder.location" : { "comment" : "Composer placeholder for a public geohash channel, naming it", "extractionState" : "manual", @@ -50738,6 +53258,366 @@ } } }, + "notices.expiry.permanent" : { + "comment" : "Accessibility label for the ∞ (never expires) option in the geo notes expiry picker", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "دائم" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "স্থায়ী" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "dauerhaft" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "permanent" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "permanente" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "permanente" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "permanent" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קבוע" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "स्थायी" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "permanen" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "permanente" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "無期限" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "영구" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "kekal" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "स्थायी" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "permanent" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "na stałe" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "permanente" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "permanente" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "навсегда" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "permanent" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "நிரந்தரம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ถาวร" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "kalıcı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "назавжди" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "مستقل" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "vĩnh viễn" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "永久" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "永久" + } + } + } + }, + "notices.fades" : { + "comment" : "Shown on notices with an expiry; placeholder is a localized relative time like 'in 23h'", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يتلاشى %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ মুছে যাবে" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "verblasst %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "fades %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "se desvanece %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "maglalaho %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "s'efface %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "דוהה %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ मिट जाएगा" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "memudar %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "svanisce %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@に消えます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 사라짐" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "pudar %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ मेटिन्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "vervaagt %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "zniknie %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "desvanece %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "desaparece %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "исчезнет %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "tonar bort %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ மறையும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เลือนหาย %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ kaybolur" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "зникне %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ مٹ جائے گا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "mờ dần %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@消失" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@消失" + } + } + } + }, "notices.source.mesh" : { "comment" : "Source badge for notices carried by the mesh", "extractionState" : "manual", diff --git a/bitchat/Models/CommandInfo.swift b/bitchat/Models/CommandInfo.swift index b4f309d9..2b077759 100644 --- a/bitchat/Models/CommandInfo.swift +++ b/bitchat/Models/CommandInfo.swift @@ -28,6 +28,7 @@ enum CommandInfo: String, Identifiable { case unfavorite = "unfav" case ping case trace + case drop var id: String { rawValue } @@ -41,6 +42,8 @@ enum CommandInfo: String, Identifiable { return "<" + String(localized: "content.input.group_placeholder") + ">" case .pay: return "<" + String(localized: "content.input.token_placeholder") + ">" + case .drop: + return "<" + String(localized: "content.input.note_placeholder") + ">" case .clear, .help, .who: return nil } @@ -62,11 +65,12 @@ enum CommandInfo: String, Identifiable { case .unfavorite: String(localized: "content.commands.unfavorite") case .ping: String(localized: "content.commands.ping") case .trace: String(localized: "content.commands.trace") + case .drop: String(localized: "content.commands.drop") } } static func all(isGeoPublic: Bool, isGeoDM: Bool) -> [CommandInfo] { - var commands: [CommandInfo] = [.block, .unblock, .clear, .help, .hug, .message, .slap, .who] + var commands: [CommandInfo] = [.block, .unblock, .clear, .drop, .help, .hug, .message, .slap, .who] // Cashu tokens are bearer instruments: in a public geohash any nearby // stranger can redeem one, so don't *suggest* /pay there (the // processor still allows it behind an explicit "public" confirm). diff --git a/bitchat/Nostr/NostrProtocol.swift b/bitchat/Nostr/NostrProtocol.swift index 7168b818..80c57f14 100644 --- a/bitchat/Nostr/NostrProtocol.swift +++ b/bitchat/Nostr/NostrProtocol.swift @@ -264,7 +264,8 @@ struct NostrProtocol { geohash: String, senderIdentity: NostrIdentity, nickname: String? = nil, - expiresAt: Date? = nil + expiresAt: Date? = nil, + urgent: Bool = false ) throws -> NostrEvent { var tags = [["g", geohash]] if let nickname = nickname?.trimmedOrNilIfEmpty { @@ -273,6 +274,9 @@ struct NostrProtocol { if let expiresAt { tags.append(["expiration", String(Int(expiresAt.timeIntervalSince1970))]) } + if urgent { + tags.append(["t", "urgent"]) + } let event = NostrEvent( pubkey: senderIdentity.publicKeyHex, createdAt: Date(), diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index ba46d7b3..5050ea2c 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -1224,6 +1224,56 @@ final class BLEService: NSObject { return nil } + // MARK: - Archived public messages ("heard here earlier") + + func collectArchivedPublicMessages(completion: @escaping @MainActor ([ArchivedPublicMessage]) -> Void) { + guard let sync = gossipSyncManager else { + Task { @MainActor in completion([]) } + return + } + sync.collectPublicMessagePackets { [weak self] packets in + guard let self = self else { + Task { @MainActor in completion([]) } + return + } + // Signature verification and registry lookups run on messageQueue + // like the live receive path. + self.messageQueue.async { + let decoded = packets + .compactMap { self.decodeArchivedPublicMessage($0) } + .sorted { $0.timestamp < $1.timestamp } + Task { @MainActor in completion(decoded) } + } + } + } + + private func decodeArchivedPublicMessage(_ packet: BitchatPacket) -> ArchivedPublicMessage? { + guard packet.type == MessageType.message.rawValue, + let content = String(data: packet.payload, encoding: .utf8)?.trimmedOrNilIfEmpty + else { return nil } + let senderPeerID = PeerID(hexData: packet.senderID) + let peers = collectionsQueue.sync { peerRegistry.snapshotByID } + // Archived senders are usually long gone, so the signature-derived + // identity is the best shot at a name; a live registry entry is + // next; anonymous fallback matches the live path. + let nickname = signedSenderDisplayName(for: packet, from: senderPeerID) + ?? BLEPeerSenderDisplayName.resolveKnownPeer( + peerID: senderPeerID, + localPeerID: myPeerID, + localNickname: myNickname, + peers: peers, + allowConnectedUnverified: false + ) + ?? BLEPeerSenderDisplayName.anonymousNickname(for: senderPeerID) + return ArchivedPublicMessage( + packetIdHex: PacketIdUtil.computeId(packet).hexEncodedString(), + senderPeerID: senderPeerID, + senderNickname: nickname, + content: content, + timestamp: Date(timeIntervalSince1970: TimeInterval(packet.timestamp) / 1000) + ) + } + private func handleFileTransfer(_ packet: BitchatPacket, from peerID: PeerID) -> Bool { fileTransferHandler.handle(packet, from: peerID) } diff --git a/bitchat/Services/Board/BoardManager.swift b/bitchat/Services/Board/BoardManager.swift index 8c758fa8..60c6b827 100644 --- a/bitchat/Services/Board/BoardManager.swift +++ b/bitchat/Services/Board/BoardManager.swift @@ -22,7 +22,7 @@ final class BoardManager: ObservableObject { /// Publishes a bridged kind-1 note (expiring with the board post via /// NIP-40) and returns its Nostr event id, or nil when bridging failed or /// was skipped. - private let publishToNostr: (_ content: String, _ geohash: String, _ nickname: String, _ expiresAtMs: UInt64) -> String? + private let publishToNostr: (_ content: String, _ geohash: String, _ nickname: String, _ expiresAtMs: UInt64, _ urgent: Bool) -> String? /// Requests NIP-09 deletion of a previously bridged note. private let deleteFromNostr: (_ eventID: String, _ geohash: String) -> Void /// Bridged Nostr event ids by postID, for merged deletes. In-memory only: @@ -34,7 +34,7 @@ final class BoardManager: ObservableObject { init( transport: Transport, store: BoardStore = .shared, - publishToNostr: ((String, String, String, UInt64) -> String?)? = nil, + publishToNostr: ((String, String, String, UInt64, Bool) -> String?)? = nil, deleteFromNostr: ((String, String) -> Void)? = nil ) { self.transport = transport @@ -126,7 +126,7 @@ final class BoardManager: ObservableObject { // Nostr bridge: geohash posts also go out as kind-1 location notes so // online users see them. Remember the event id for merged deletes. - if !geohash.isEmpty, let eventID = publishToNostr(trimmed, geohash, cleanNickname, expiresAt) { + if !geohash.isEmpty, let eventID = publishToNostr(trimmed, geohash, cleanNickname, expiresAt, urgent) { bridgedEventIDs[postID] = eventID } return true @@ -158,7 +158,7 @@ final class BoardManager: ObservableObject { return true } - private static func livePublishToNostr(content: String, geohash: String, nickname: String, expiresAtMs: UInt64) -> String? { + private static func livePublishToNostr(content: String, geohash: String, nickname: String, expiresAtMs: UInt64, urgent: Bool) -> String? { let relays = GeoRelayDirectory.shared.closestRelays(toGeohash: geohash, count: TransportConfig.nostrGeoRelayCount) guard !relays.isEmpty else { SecureLogger.debug("Board: no geo relays for \(geohash); skipping Nostr bridge", category: .session) @@ -171,7 +171,8 @@ final class BoardManager: ObservableObject { geohash: geohash, senderIdentity: identity, nickname: nickname, - expiresAt: Date(timeIntervalSince1970: TimeInterval(expiresAtMs) / 1000) + expiresAt: Date(timeIntervalSince1970: TimeInterval(expiresAtMs) / 1000), + urgent: urgent ) NostrRelayManager.shared.sendEvent(event, to: relays) return event.id diff --git a/bitchat/Services/Board/UnifiedNotices.swift b/bitchat/Services/Board/UnifiedNotices.swift index 16d88a97..31bc14c8 100644 --- a/bitchat/Services/Board/UnifiedNotices.swift +++ b/bitchat/Services/Board/UnifiedNotices.swift @@ -23,6 +23,9 @@ struct NoticeItem: Identifiable, Equatable { let content: String let createdAt: Date let isUrgent: Bool + /// When the notice fades (board expiry or a note's NIP-40 tag, as dead + /// drops carry). Nil means it only ages out of the relay window. + let expiresAt: Date? let source: Source var isBoardPost: Bool { @@ -36,6 +39,9 @@ struct NoticeItem: Identifiable, Equatable { content = post.content createdAt = Date(timeIntervalSince1970: TimeInterval(post.createdAt) / 1000) isUrgent = post.isUrgent + expiresAt = post.expiresAt > 0 + ? Date(timeIntervalSince1970: TimeInterval(post.expiresAt) / 1000) + : nil source = .board(post) } @@ -46,7 +52,8 @@ struct NoticeItem: Identifiable, Equatable { .first.map(String.init) ?? display content = note.content createdAt = note.createdAt - isUrgent = false + isUrgent = note.isUrgent + expiresAt = note.expiresAt source = .nostr(note) } } diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index b8a4785e..9f125291 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -146,6 +146,8 @@ final class CommandProcessor { return handleTrace(args) case "/pay": return handlePay(args) + case "/drop": + return handleDrop(args) case "/help": return .success(message: Self.helpText) default: @@ -171,9 +173,36 @@ final class CommandProcessor { /ping @name — measure round-trip time (mesh only) /trace @name — estimated mesh path (mesh only) /pay — send a cashu ecash token in this chat + /drop — pin a note to this place for 24h (needs location) /help — this list """ + /// /drop — a dead drop: pins a note to the current building-level + /// geohash with a 24h NIP-40 expiry. Anyone who passes through here and + /// looks at notices (or hits the empty-timeline "notes left here" hint) + /// reads it. + private func handleDrop(_ args: String) -> CommandResult { + guard LocationNotesSettings.enabled else { + return .error(message: "location notes are off — enable them in the info screen") + } + guard let content = args.trimmedOrNilIfEmpty else { + return .error(message: "usage: /drop ") + } + let location = LocationChannelManager.shared + guard location.permissionState == .authorized else { + return .error(message: "leaving a note needs location — enable it in the info screen") + } + guard let geohash = location.availableChannels.first(where: { $0.level == .building })?.geohash else { + location.refreshChannels() + return .error(message: "still finding this place — try again in a moment") + } + guard let nickname = contextProvider?.nickname, + LocationNotesManager.postDrop(content: content, nickname: nickname, geohash: geohash) else { + return .error(message: "no geo relays reachable — note not left") + } + return .success(message: "📍 note left here — it fades in 24h") + } + // MARK: - Command Handlers private func handleMessage(_ args: String) -> CommandResult { diff --git a/bitchat/Services/GeohashChatActivityTracker.swift b/bitchat/Services/GeohashChatActivityTracker.swift new file mode 100644 index 00000000..8d8f71a8 --- /dev/null +++ b/bitchat/Services/GeohashChatActivityTracker.swift @@ -0,0 +1,122 @@ +// +// GeohashChatActivityTracker.swift +// bitchat +// +// Tracks actual chat-message activity per sampled geohash so the empty mesh +// timeline can point at a nearby channel where a conversation is happening — +// not merely where participants are present. +// This is free and unencumbered software released into the public domain. +// + +import Foundation + +/// A recent chat message observed in a sampled geohash channel. +struct GeohashChatPreview: Equatable, Sendable { + let senderName: String + let content: String + let timestamp: Date + + init(senderName: String, content: String, timestamp: Date) { + self.senderName = senderName + self.content = content + self.timestamp = timestamp + } +} + +/// The liveliest nearby conversation, resolved against the user's regional +/// channels. +struct NearbyConversation: Equatable, Sendable { + let channel: GeohashChannel + /// Chat messages seen within the activity window. + let messageCount: Int + let lastMessage: GeohashChatPreview +} + +/// Records kind-20000 chat events seen by the background geohash sampling +/// subscriptions (blocked and self senders are filtered by the caller) and +/// answers "where nearby is a conversation actually happening?". +@MainActor +final class GeohashChatActivityTracker: ObservableObject { + static let shared = GeohashChatActivityTracker() + + /// How far back a message still counts as "a conversation is happening". + private let window: TimeInterval + /// Per-geohash recent message timestamps (pruned to the window). + private var messageTimes: [String: [Date]] = [:] + /// Per-geohash newest message preview. + private var lastMessages: [String: GeohashChatPreview] = [:] + private let now: () -> Date + + init( + window: TimeInterval = TransportConfig.uiGeohashChatActivityWindowSeconds, + now: @escaping () -> Date = { Date() } + ) { + self.window = window + self.now = now + } + + func recordChatMessage( + geohash: String, + senderName: String, + content: String, + timestamp: Date + ) { + let gh = geohash.lowercased() + let clamped = min(timestamp, now()) + guard now().timeIntervalSince(clamped) < window else { return } + + var times = messageTimes[gh] ?? [] + times.append(clamped) + messageTimes[gh] = prune(times) + + if let existing = lastMessages[gh], existing.timestamp > clamped { + // Keep the newer preview. + } else { + lastMessages[gh] = GeohashChatPreview(senderName: senderName, content: content, timestamp: clamped) + } + objectWillChange.send() + } + + /// Messages seen in the window for one geohash. + func messageCount(for geohash: String) -> Int { + prune(messageTimes[geohash.lowercased()] ?? []).count + } + + func lastMessage(for geohash: String) -> GeohashChatPreview? { + let gh = geohash.lowercased() + guard messageCount(for: gh) > 0 else { return nil } + return lastMessages[gh] + } + + /// The busiest channel with at least one chat message in the window. + /// Ties go to the more local (higher-precision) channel, so a lone + /// message on your block beats a lone message across the region. + func mostActiveConversation(among channels: [GeohashChannel]) -> NearbyConversation? { + var best: NearbyConversation? + for channel in channels { + let count = messageCount(for: channel.geohash) + guard count > 0, let last = lastMessage(for: channel.geohash) else { continue } + let candidate = NearbyConversation(channel: channel, messageCount: count, lastMessage: last) + if let current = best { + let better = count > current.messageCount + || (count == current.messageCount + && channel.level.precision > current.channel.level.precision) + if better { best = candidate } + } else { + best = candidate + } + } + return best + } + + func clear() { + messageTimes.removeAll() + lastMessages.removeAll() + objectWillChange.send() + } + + private func prune(_ times: [Date]) -> [Date] { + let cutoff = now().addingTimeInterval(-window) + return times.filter { $0 >= cutoff } + } +} diff --git a/bitchat/Services/LocationNotesManager.swift b/bitchat/Services/LocationNotesManager.swift index e95f536a..4b5577a1 100644 --- a/bitchat/Services/LocationNotesManager.swift +++ b/bitchat/Services/LocationNotesManager.swift @@ -70,6 +70,30 @@ final class LocationNotesManager: ObservableObject { /// The matched `g` tag: the cell the note was posted to, which can be /// a neighbor of the subscribed geohash. let geohash: String + /// NIP-40 expiration, when the note carries one (dead drops do). + let expiresAt: Date? + /// Carries a `["t","urgent"]` tag (parity with urgent board posts). + let isUrgent: Bool + + init( + id: String, + pubkey: String, + content: String, + createdAt: Date, + nickname: String?, + geohash: String, + expiresAt: Date? = nil, + isUrgent: Bool = false + ) { + self.id = id + self.pubkey = pubkey + self.content = content + self.createdAt = createdAt + self.nickname = nickname + self.geohash = geohash + self.expiresAt = expiresAt + self.isUrgent = isUrgent + } var displayName: String { let suffix = String(pubkey.suffix(4)) @@ -90,6 +114,7 @@ final class LocationNotesManager: ObservableObject { private var subscriptionID: String? private var noteIDs = Set() // O(1) duplicate detection private var directoryUpdateCancellable: AnyCancellable? + private var expiryPruneTimer: Timer? private let dependencies: LocationNotesDependencies private let maxNotesInMemory = 500 // Defensive cap (relay limit is 200) @@ -123,6 +148,33 @@ final class LocationNotesManager: ObservableObject { self.subscribe() } } + // NIP-40 notes can expire while displayed (a 24h dead drop crossing + // its boundary); ingest-time filtering alone would keep it visible + // until the subscription is recreated. + expiryPruneTimer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) { [weak self] _ in + Task { @MainActor [weak self] in + self?.pruneExpiredNotes() + } + } + } + + deinit { + expiryPruneTimer?.invalidate() + } + + /// Drops notes whose NIP-40 expiry has passed. Their ids stay in + /// `noteIDs` so a relay replay cannot resurrect them. + func pruneExpiredNotes() { + let now = dependencies.now() + let expired = notes.contains { note in + if let expiresAt = note.expiresAt { return expiresAt <= now } + return false + } + guard expired else { return } + notes.removeAll { note in + if let expiresAt = note.expiresAt { return expiresAt <= now } + return false + } } func setGeohash(_ newGeohash: String) { @@ -202,10 +254,15 @@ final class LocationNotesManager: ObservableObject { tag.count >= 2 && tag[0].lowercased() == "g" && validGeohashes.contains(tag[1].lowercased()) })?[1].lowercased() else { return } guard !self.noteIDs.contains(event.id) else { return } + // NIP-40: relays are not required to enforce expiration — drop + // expired notes client-side so 24h dead drops actually vanish. + let expiresAt = Self.expirationDate(of: event) + if let expiresAt, expiresAt <= self.dependencies.now() { return } self.noteIDs.insert(event.id) let nick = event.tags.first(where: { $0.first?.lowercased() == "n" && $0.count >= 2 })?.dropFirst().first let ts = Date(timeIntervalSince1970: TimeInterval(event.created_at)) - let note = Note(id: event.id, pubkey: event.pubkey, content: event.content, createdAt: ts, nickname: nick, geohash: matchedGeohash) + let urgent = event.tags.contains { $0.count >= 2 && $0[0].lowercased() == "t" && $0[1].lowercased() == "urgent" } + let note = Note(id: event.id, pubkey: event.pubkey, content: event.content, createdAt: ts, nickname: nick, geohash: matchedGeohash, expiresAt: expiresAt, isUrgent: urgent) self.notes.append(note) self.notes.sort { $0.createdAt > $1.createdAt } self.enforceMemoryCap() @@ -219,8 +276,10 @@ final class LocationNotesManager: ObservableObject { }) } - /// Send a location note for the current geohash using the per-geohash identity. - func send(content: String, nickname: String) { + /// Send a location note for the current geohash using the per-geohash + /// identity, optionally expiring via NIP-40 (dead drops pass 24h; the + /// composer's ∞ option passes nil) and optionally tagged urgent. + func send(content: String, nickname: String, expiresAt: Date? = nil, urgent: Bool = false) { guard let trimmed = content.trimmedOrNilIfEmpty else { return } let relays = dependencies.relayLookup(geohash, TransportConfig.nostrGeoRelayCount) guard !relays.isEmpty else { @@ -235,7 +294,9 @@ final class LocationNotesManager: ObservableObject { content: trimmed, geohash: geohash, senderIdentity: id, - nickname: nickname + nickname: nickname, + expiresAt: expiresAt, + urgent: urgent ) dependencies.sendEvent(event, relays) // Optimistic local-echo @@ -245,7 +306,9 @@ final class LocationNotesManager: ObservableObject { content: trimmed, createdAt: Date(timeIntervalSince1970: TimeInterval(event.created_at)), nickname: nickname, - geohash: geohash + geohash: geohash, + expiresAt: expiresAt, + isUrgent: urgent ) self.noteIDs.insert(event.id) self.notes.insert(echo, at: 0) @@ -288,6 +351,14 @@ final class LocationNotesManager: ObservableObject { } } + /// The NIP-40 `expiration` tag as a date, if the event carries one. + static func expirationDate(of event: NostrEvent) -> Date? { + guard let tag = event.tags.first(where: { $0.count >= 2 && $0[0].lowercased() == "expiration" }), + let seconds = TimeInterval(tag[1]) + else { return nil } + return Date(timeIntervalSince1970: seconds) + } + /// Enforces defensive memory cap on notes array (keeps newest). private func enforceMemoryCap() { if notes.count > maxNotesInMemory { @@ -297,7 +368,43 @@ final class LocationNotesManager: ObservableObject { } } - /// Explicitly cancel subscription and release resources. + /// One-shot dead-drop publish without holding a subscription: pins a + /// note to `geohash` that expires via NIP-40. Returns false when no geo + /// relays are known or signing fails. + @MainActor + static func postDrop( + content: String, + nickname: String, + geohash: String, + expiry: TimeInterval = TransportConfig.locationDropExpirySeconds, + dependencies: LocationNotesDependencies = .live + ) -> Bool { + guard let trimmed = content.trimmedOrNilIfEmpty else { return false } + let relays = dependencies.relayLookup(geohash, TransportConfig.nostrGeoRelayCount) + guard !relays.isEmpty else { + SecureLogger.warning("LocationNotesManager: drop blocked, no geo relays for geohash=\(geohash)", category: .session) + return false + } + do { + let identity = try dependencies.deriveIdentity(geohash) + let event = try NostrProtocol.createGeohashTextNote( + content: trimmed, + geohash: geohash, + senderIdentity: identity, + nickname: nickname, + expiresAt: dependencies.now().addingTimeInterval(expiry) + ) + dependencies.sendEvent(event, relays) + return true + } catch { + SecureLogger.error("LocationNotesManager: failed to post drop: \(error)", category: .session) + return false + } + } + + /// Explicitly cancel the subscription. The prune timer stays alive (it + /// holds only a weak self) so a reused instance — the notices sheet + /// cancels on tab switch and refreshes on return — keeps pruning. func cancel() { if let sub = subscriptionID { dependencies.unsubscribe(sub) diff --git a/bitchat/Services/LocationNotesSettings.swift b/bitchat/Services/LocationNotesSettings.swift new file mode 100644 index 00000000..5bda810f --- /dev/null +++ b/bitchat/Services/LocationNotesSettings.swift @@ -0,0 +1,29 @@ +// +// LocationNotesSettings.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation + +/// User preference for location notes (dead drops): leaving notes pinned to +/// nearby places with /drop and surfacing notes others left here. On by +/// default, but everything it powers additionally requires location +/// permission — the toggle in app info is the kill switch. +enum LocationNotesSettings { + private static let enabledKey = "locationNotes.enabled" + + /// Fired on every toggle write so live consumers (the nearby-notes + /// counter) can drop or restart their relay subscription immediately. + static let didChangeNotification = Notification.Name("bitchat.locationNotesSettingsDidChange") + + static var enabled: Bool { + get { UserDefaults.standard.object(forKey: enabledKey) as? Bool ?? true } + set { + UserDefaults.standard.set(newValue, forKey: enabledKey) + NotificationCenter.default.post(name: didChangeNotification, object: nil) + } + } +} diff --git a/bitchat/Services/MeshEchoSettings.swift b/bitchat/Services/MeshEchoSettings.swift new file mode 100644 index 00000000..347c178a --- /dev/null +++ b/bitchat/Services/MeshEchoSettings.swift @@ -0,0 +1,27 @@ +// +// MeshEchoSettings.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation + +/// Watermark for "heard here earlier" echoes: clearing the mesh timeline +/// (triple-tap or /clear) records the moment, and the next launch only +/// re-seeds archived messages heard after it. The archive itself is left +/// alone — the device keeps carrying those messages for peers; the user +/// just doesn't want to see them again. +enum MeshEchoSettings { + private static let clearedThroughKey = "meshEchoes.clearedThrough" + + static var clearedThrough: Date? { + get { UserDefaults.standard.object(forKey: clearedThroughKey) as? Date } + set { UserDefaults.standard.set(newValue, forKey: clearedThroughKey) } + } + + static func reset() { + UserDefaults.standard.removeObject(forKey: clearedThroughKey) + } +} diff --git a/bitchat/Services/MeshSightingsTracker.swift b/bitchat/Services/MeshSightingsTracker.swift new file mode 100644 index 00000000..1a5a9d80 --- /dev/null +++ b/bitchat/Services/MeshSightingsTracker.swift @@ -0,0 +1,106 @@ +// +// MeshSightingsTracker.swift +// bitchat +// +// Privacy-preserving daily tally of mesh peers that came within radio range, +// so an empty timeline can say "3 devices passed within range today" instead +// of feeling dead. Stores only a per-day salted hash per peer plus a count — +// no identities, no history beyond today. +// This is free and unencumbered software released into the public domain. +// + +import BitFoundation +import CryptoKit +import Foundation + +@MainActor +final class MeshSightingsTracker: ObservableObject { + static let shared = MeshSightingsTracker() + + private enum Keys { + static let dayKey = "meshSightings.dayKey" + static let salt = "meshSightings.salt" + static let hashes = "meshSightings.hashes" + static let lastSeenAt = "meshSightings.lastSeenAt" + } + + /// Distinct devices seen within range today (rotating peer IDs may count + /// a long-lived neighbor more than once across rotations; that is fine + /// for an ambient stat). + @Published private(set) var todayCount: Int = 0 + @Published private(set) var lastSightingAt: Date? + + private let defaults: UserDefaults + private let now: () -> Date + private var seenHashes: Set = [] + + init(defaults: UserDefaults = .standard, now: @escaping () -> Date = { Date() }) { + self.defaults = defaults + self.now = now + restore() + } + + func recordSighting(peerID: PeerID) { + rollOverIfNeeded() + let hash = saltedHash(peerID.id) + let seenAt = now() + lastSightingAt = seenAt + defaults.set(seenAt, forKey: Keys.lastSeenAt) + guard seenHashes.insert(hash).inserted else { return } + todayCount = seenHashes.count + defaults.set(Array(seenHashes), forKey: Keys.hashes) + } + + func clear() { + seenHashes.removeAll() + todayCount = 0 + lastSightingAt = nil + defaults.removeObject(forKey: Keys.dayKey) + defaults.removeObject(forKey: Keys.salt) + defaults.removeObject(forKey: Keys.hashes) + defaults.removeObject(forKey: Keys.lastSeenAt) + } + + private func restore() { + rollOverIfNeeded() + seenHashes = Set(defaults.stringArray(forKey: Keys.hashes) ?? []) + todayCount = seenHashes.count + lastSightingAt = defaults.object(forKey: Keys.lastSeenAt) as? Date + } + + /// Resets the tally when the local calendar day changes; the salt rotates + /// with it so hashes from different days can never be correlated. + private func rollOverIfNeeded() { + let today = Self.dayKey(for: now()) + guard defaults.string(forKey: Keys.dayKey) != today else { return } + defaults.set(today, forKey: Keys.dayKey) + defaults.set(Self.randomSalt(), forKey: Keys.salt) + defaults.removeObject(forKey: Keys.hashes) + seenHashes.removeAll() + todayCount = 0 + } + + private func saltedHash(_ value: String) -> String { + let salt = defaults.data(forKey: Keys.salt) ?? { + let fresh = Self.randomSalt() + defaults.set(fresh, forKey: Keys.salt) + return fresh + }() + var digest = SHA256() + digest.update(data: salt) + digest.update(data: Data(value.utf8)) + return digest.finalize().map { String(format: "%02x", $0) }.joined() + } + + private static func dayKey(for date: Date) -> String { + let formatter = DateFormatter() + formatter.calendar = Calendar.current + formatter.timeZone = TimeZone.current + formatter.dateFormat = "yyyy-MM-dd" + return formatter.string(from: date) + } + + private static func randomSalt() -> Data { + Data((0..<16).map { _ in UInt8.random(in: .min ... .max) }) + } +} diff --git a/bitchat/Services/NotificationService.swift b/bitchat/Services/NotificationService.swift index 091f4289..cc75bcef 100644 --- a/bitchat/Services/NotificationService.swift +++ b/bitchat/Services/NotificationService.swift @@ -26,6 +26,10 @@ protocol NotificationRequestDelivering { func add(_ request: UNNotificationRequest) } +protocol NotificationCategoryRegistering { + func setCategories(_ categories: Set) +} + private final class NotificationCenterAuthorizerAdapter: NotificationAuthorizing { private let center: UNUserNotificationCenter @@ -55,6 +59,18 @@ private final class NotificationCenterRequestDelivererAdapter: NotificationReque } } +private final class NotificationCenterCategoryRegistrarAdapter: NotificationCategoryRegistering { + private let center: UNUserNotificationCenter + + init(center: UNUserNotificationCenter) { + self.center = center + } + + func setCategories(_ categories: Set) { + center.setNotificationCategories(categories) + } +} + private struct NoopNotificationAuthorizer: NotificationAuthorizing { func requestAuthorization( options: UNAuthorizationOptions, @@ -68,12 +84,21 @@ private struct NoopNotificationRequestDeliverer: NotificationRequestDelivering { func add(_ request: UNNotificationRequest) {} } +private struct NoopNotificationCategoryRegistrar: NotificationCategoryRegistering { + func setCategories(_ categories: Set) {} +} + final class NotificationService { static let shared = NotificationService() + /// Category for the "bitchatters nearby" notification, carrying the wave quick action. + static let nearbyCategoryID = "chat.bitchat.category.nearby" + static let waveActionID = "chat.bitchat.action.wave" + private let isRunningTestsProvider: () -> Bool private let authorizer: NotificationAuthorizing private let requestDeliverer: NotificationRequestDelivering + private let categoryRegistrar: NotificationCategoryRegistering /// Returns true if running in test environment (XCTest, Swift Testing, or CI) private var isRunningTests: Bool { @@ -92,25 +117,30 @@ final class NotificationService { if isRunningTestsProvider() { self.authorizer = NoopNotificationAuthorizer() self.requestDeliverer = NoopNotificationRequestDeliverer() + self.categoryRegistrar = NoopNotificationCategoryRegistrar() } else { let center = UNUserNotificationCenter.current() self.authorizer = NotificationCenterAuthorizerAdapter(center: center) self.requestDeliverer = NotificationCenterRequestDelivererAdapter(center: center) + self.categoryRegistrar = NotificationCenterCategoryRegistrarAdapter(center: center) } } internal init( isRunningTestsProvider: @escaping () -> Bool, authorizer: NotificationAuthorizing, - requestDeliverer: NotificationRequestDelivering + requestDeliverer: NotificationRequestDelivering, + categoryRegistrar: NotificationCategoryRegistering = NoopNotificationCategoryRegistrar() ) { self.isRunningTestsProvider = isRunningTestsProvider self.authorizer = authorizer self.requestDeliverer = requestDeliverer + self.categoryRegistrar = categoryRegistrar } func requestAuthorization() { guard !isRunningTests else { return } + registerCategories() authorizer.requestAuthorization(options: [.alert, .sound, .badge]) { granted, _ in if granted { // Permission granted @@ -119,13 +149,29 @@ final class NotificationService { } } } + + private func registerCategories() { + let wave = UNNotificationAction( + identifier: Self.waveActionID, + title: "wave 👋", + options: [] + ) + let nearby = UNNotificationCategory( + identifier: Self.nearbyCategoryID, + actions: [wave], + intentIdentifiers: [], + options: [] + ) + categoryRegistrar.setCategories([nearby]) + } func sendLocalNotification( title: String, body: String, identifier: String, userInfo: [String: Any]? = nil, - interruptionLevel: UNNotificationInterruptionLevel = .active + interruptionLevel: UNNotificationInterruptionLevel = .active, + categoryIdentifier: String? = nil ) { guard !isRunningTests else { return } let content = UNMutableNotificationContent() @@ -133,6 +179,9 @@ final class NotificationService { content.body = body content.sound = .default content.interruptionLevel = interruptionLevel + if let categoryIdentifier = categoryIdentifier { + content.categoryIdentifier = categoryIdentifier + } if let userInfo = userInfo { content.userInfo = userInfo @@ -183,7 +232,8 @@ final class NotificationService { title: title, body: body, identifier: identifier, - interruptionLevel: .timeSensitive + interruptionLevel: .timeSensitive, + categoryIdentifier: Self.nearbyCategoryID ) } } diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 62712db7..43ece9ea 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -211,6 +211,32 @@ protocol Transport: AnyObject { // Pending file management (BCH-01-002: files held in memory until user accepts) func acceptPendingFile(id: String) -> URL? func declinePendingFile(id: String) + + // Store-and-forward archive (mesh transports only): the public messages + // this device is carrying for gossip sync, decoded for display as + // "heard here earlier" timeline echoes. + func collectArchivedPublicMessages(completion: @escaping @MainActor ([ArchivedPublicMessage]) -> Void) +} + +/// A carried public mesh message from the store-and-forward window, decoded +/// for display. `packetIdHex` is stable across launches so echo rows keep a +/// deterministic message ID. +struct ArchivedPublicMessage { + let packetIdHex: String + let senderPeerID: PeerID + let senderNickname: String + let content: String + let timestamp: Date +} + +extension BitchatMessage { + /// Echo rows are minted locally with this prefix (packet-id derived, so + /// stable across launches); the timeline dims them. + static let archivedEchoIDPrefix = "echo-" + + var isArchivedEcho: Bool { + id.hasPrefix(Self.archivedEchoIDPrefix) + } } extension Transport { @@ -261,6 +287,10 @@ extension Transport { func acceptPendingFile(id: String) -> URL? { nil } func declinePendingFile(id: String) {} + + func collectArchivedPublicMessages(completion: @escaping @MainActor ([ArchivedPublicMessage]) -> Void) { + Task { @MainActor in completion([]) } + } } protocol TransportPeerEventsDelegate: AnyObject { diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 22069296..b86791be 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -172,6 +172,14 @@ enum TransportConfig { static let nostrGeohashSampleLookbackSeconds: TimeInterval = 300 static let nostrGeohashSampleLimit: Int = 100 static let nostrDMSubscribeLookbackSeconds: TimeInterval = 86400 + // A sampled chat message this recent means "a conversation is happening + // there" for the empty-timeline nearby-activity hint. + static let uiGeohashChatActivityWindowSeconds: TimeInterval = 900 + // Startup delay before reading the gossip archive for "heard here + // earlier" echoes; covers the archive's async disk restore. + static let uiArchivedEchoLoadDelaySeconds: TimeInterval = 1.5 + // Dead drops: location notes left via /drop expire after this long. + static let locationDropExpirySeconds: TimeInterval = 24 * 60 * 60 // Message deduplication static let messageDedupMaxAgeSeconds: TimeInterval = 300 diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index b9b0f771..b619e75d 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -652,6 +652,19 @@ final class GossipSyncManager { } } + /// Snapshot of the carried public-message packets (fresh window only), + /// for the "heard here earlier" timeline echoes. Completion runs on the + /// sync queue. + func collectPublicMessagePackets(completion: @escaping ([BitchatPacket]) -> Void) { + queue.async { [weak self] in + guard let self else { + completion([]) + return + } + completion(self.messages.allPackets(isFresh: self.isPacketFresh)) + } + } + private func performPeriodicMaintenance(now: Date = Date()) { cleanupExpiredMessages() cleanupStaleAnnouncementsIfNeeded(now: now) diff --git a/bitchat/ViewModels/ChatOutgoingCoordinator.swift b/bitchat/ViewModels/ChatOutgoingCoordinator.swift index 8d8b6a9e..d8005099 100644 --- a/bitchat/ViewModels/ChatOutgoingCoordinator.swift +++ b/bitchat/ViewModels/ChatOutgoingCoordinator.swift @@ -112,6 +112,13 @@ final class ChatOutgoingCoordinator { sendGeohashPublicMessage(trimmed, mentions: mentions, channel: channel) } } + + /// Broadcasts a wave on the mesh channel regardless of the active channel — + /// used by the "bitchatters nearby" notification quick action, which always + /// refers to mesh peers. + func sendMeshWave() { + sendMeshPublicMessage(originalContent: "👋", trimmed: "👋", mentions: []) + } } private extension ChatOutgoingCoordinator { diff --git a/bitchat/ViewModels/ChatPeerListCoordinator.swift b/bitchat/ViewModels/ChatPeerListCoordinator.swift index 77a40c6b..bd045939 100644 --- a/bitchat/ViewModels/ChatPeerListCoordinator.swift +++ b/bitchat/ViewModels/ChatPeerListCoordinator.swift @@ -36,6 +36,9 @@ protocol ChatPeerListContext: AnyObject { // MARK: Notifications /// Posts the "bitchatters nearby" local notification. func notifyNetworkAvailable(peerCount: Int) + + /// Records peers seen within range for the daily ambient sightings tally. + func recordMeshSightings(peerIDs: [PeerID]) } extension ChatViewModel: ChatPeerListContext { @@ -60,6 +63,12 @@ extension ChatViewModel: ChatPeerListContext { func notifyNetworkAvailable(peerCount: Int) { NotificationService.shared.sendNetworkAvailableNotification(peerCount: peerCount) } + + func recordMeshSightings(peerIDs: [PeerID]) { + for peerID in peerIDs { + MeshSightingsTracker.shared.recordSighting(peerID: peerID) + } + } } final class ChatPeerListCoordinator: @unchecked Sendable { @@ -129,6 +138,7 @@ private extension ChatPeerListCoordinator { } invalidateNetworkEmptyTimer() + context.recordMeshSightings(peerIDs: meshPeers) let newPeers = meshPeerSet.subtracting(recentlySeenPeers) // Record every sighted peer even when no notification fires. A peer diff --git a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift index f5f57cf1..b6623f3a 100644 --- a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift @@ -288,6 +288,15 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { func clearCurrentPublicTimeline() { context.clearPublicConversation(ConversationID(channelID: context.activeChannel)) + // Clearing the mesh timeline also dismisses its archived echoes for + // good: the watermark stops the next launch from re-seeding them + // (the archive itself keeps carrying the messages for peers), and + // the dedup keys go so a cleared message arriving live shows again. + if case .mesh = context.activeChannel { + MeshEchoSettings.clearedThrough = Date() + archivedEchoKeys.removeAll() + } + // The SPM test process shares the real Application Support tree, so this // detached deletion can land mid-test under parallel scheduling and flake // a file-dependent test. Tests never need the on-disk media cleared. @@ -407,6 +416,21 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { /// event (0 for mesh messages). Sufficient PoW relaxes the per-sender /// rate limit; low/no-PoW events keep the strict limits so old clients /// still get through at normal rates. + /// Identity keys of the archived echoes seeded into the mesh timeline at + /// launch. The mesh wire format carries no stable message ID, so a + /// re-synced copy of an already-rendered echo arrives with a fresh UUID — + /// this content identity is the only way to recognize it. + private var archivedEchoKeys = Set() + + func registerArchivedEcho(senderPeerID: PeerID?, timestamp: Date, content: String) { + archivedEchoKeys.insert(Self.archivedEchoKey(senderPeerID: senderPeerID, timestamp: timestamp, content: content)) + } + + static func archivedEchoKey(senderPeerID: PeerID?, timestamp: Date, content: String) -> String { + let ms = UInt64((timestamp.timeIntervalSince1970 * 1000).rounded()) + return "\(senderPeerID?.id ?? "")|\(ms)|\(content)" + } + func handlePublicMessage(_ message: BitchatMessage, powBits: Int = 0) { let finalMessage = context.processActionMessage(message) if context.isMessageBlocked(finalMessage) { return } @@ -442,6 +466,17 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { } guard let destination else { return } + // A live copy of a message already rendered as an archived echo + // (e.g. re-served by a peer's gossip sync) would duplicate the row. + if destination == .mesh, !isSystem { + let key = Self.archivedEchoKey( + senderPeerID: finalMessage.senderPeerID, + timestamp: finalMessage.timestamp, + content: finalMessage.content + ) + if archivedEchoKeys.contains(key) { return } + } + let channelMatches: Bool = { switch context.activeChannel { case .mesh: return !isGeo || isSystem diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 0877090e..e9b84e64 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -904,6 +904,12 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele outgoingCoordinator.sendMessage(content) } + /// Sends a 👋 to the mesh channel regardless of the active channel. + @MainActor + func sendMeshWave() { + outgoingCoordinator.sendMeshWave() + } + // MARK: - Geohash Participants @MainActor @@ -1169,6 +1175,12 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele GossipMessageArchive.wipeDefault() StoreAndForwardMetrics.shared.reset() + // Ambient-liveliness bookkeeping: sampled nearby-chat previews, the + // daily sightings tally, and the echoes-dismissed watermark + GeohashChatActivityTracker.shared.clear() + MeshSightingsTracker.shared.clear() + MeshEchoSettings.reset() + // Drop private group keys and rosters (keychain + disk) groupStore.wipe() // Drop cached peers' prekey bundles (who we could write to is diff --git a/bitchat/ViewModels/ChatViewModelBootstrapper.swift b/bitchat/ViewModels/ChatViewModelBootstrapper.swift index 8332efab..55a8925a 100644 --- a/bitchat/ViewModels/ChatViewModelBootstrapper.swift +++ b/bitchat/ViewModels/ChatViewModelBootstrapper.swift @@ -178,6 +178,8 @@ private extension ChatViewModelBootstrapper { viewModel.publicMessagePipeline.delegate = viewModel.publicConversationCoordinator + loadArchivedEchoes() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak viewModel] in guard let viewModel, let bleService = viewModel.meshService as? BLEService else { return } @@ -197,6 +199,58 @@ private extension ChatViewModelBootstrapper { } } + /// Surfaces the carried store-and-forward window (up to 6h of public + /// mesh messages, persisted across restarts) as dimmed "heard here + /// earlier" rows, so the mesh timeline opens with the place's memory + /// instead of a void. The archive restore runs async on the sync queue + /// right after transport start, so give it a beat before asking. + private func loadArchivedEchoes() { + DispatchQueue.main.asyncAfter(deadline: .now() + TransportConfig.uiArchivedEchoLoadDelaySeconds) { [weak viewModel] in + guard let viewModel else { return } + viewModel.meshService.collectArchivedPublicMessages { [weak viewModel] allArchived in + // A previous /clear dismissed everything heard up to its + // watermark; only newer archive entries come back. + let clearedThrough = MeshEchoSettings.clearedThrough ?? .distantPast + let archived = allArchived.filter { $0.timestamp > clearedThrough } + guard let viewModel, !archived.isEmpty else { return } + // Seed only an untouched timeline: with live rows already + // present (or after /clear) splicing history back in would + // be wrong. + guard viewModel.conversations.conversationsByID[.mesh]?.messages.isEmpty != false else { return } + + for item in archived { + let echo = BitchatMessage( + id: BitchatMessage.archivedEchoIDPrefix + item.packetIdHex, + sender: item.senderNickname, + content: item.content, + timestamp: item.timestamp, + isRelay: false, + senderPeerID: item.senderPeerID + ) + viewModel.publicConversationCoordinator.registerArchivedEcho( + senderPeerID: item.senderPeerID, + timestamp: item.timestamp, + content: item.content + ) + _ = viewModel.appendPublicMessage(echo, to: .mesh) + } + + if let firstTimestamp = archived.map(\.timestamp).min() { + // Echo-prefixed ID so the divider joins the tinted, + // dimmed echo block in the timeline. + let divider = BitchatMessage( + id: BitchatMessage.archivedEchoIDPrefix + "divider", + sender: "system", + content: String(localized: "content.echoes.divider", comment: "System line shown above dimmed archived messages replayed on the mesh timeline at launch"), + timestamp: firstTimestamp.addingTimeInterval(-1), + isRelay: false + ) + _ = viewModel.appendPublicMessage(divider, to: .mesh) + } + } + } + } + func bindPeerService() { viewModel.unifiedPeerService.$peers .receive(on: DispatchQueue.main) diff --git a/bitchat/ViewModels/GeoPresenceTracker.swift b/bitchat/ViewModels/GeoPresenceTracker.swift index ffe423b5..4fa22ade 100644 --- a/bitchat/ViewModels/GeoPresenceTracker.swift +++ b/bitchat/ViewModels/GeoPresenceTracker.swift @@ -115,6 +115,16 @@ final class GeoPresenceTracker { my.publicKeyHex.lowercased() == event.pubkey.lowercased() { return } + + // Non-empty content on a sampled event means an actual chat message + // (presence events are empty) — feed the nearby-conversation hint. + GeohashChatActivityTracker.shared.recordChatMessage( + geohash: gh, + senderName: Self.sampledSenderName(for: event, context: context), + content: content, + timestamp: Date(timeIntervalSince1970: TimeInterval(event.created_at)) + ) + guard existingCount == 0 else { return } let eventTime = Date(timeIntervalSince1970: TimeInterval(event.created_at)) @@ -131,6 +141,19 @@ final class GeoPresenceTracker { cooldownPerGeohash(gh, content: content, event: event) } + /// Attribution for a sampled event: the event's own `n` tag wins (the + /// active-channel nickname table only covers the selected geohash), + /// falling back to the table, then "anon", always suffixed with the + /// pubkey tail like every other geohash display name. + @MainActor + static func sampledSenderName(for event: NostrEvent, context: any GeoPresenceContext) -> String { + let suffix = String(event.pubkey.suffix(4)) + let tagNick = event.tags.first { $0.count >= 2 && $0[0].lowercased() == "n" }?[1] + let nick = tagNick?.trimmedOrNilIfEmpty + ?? context.geoNicknames[event.pubkey.lowercased()]?.trimmedOrNilIfEmpty + return (nick ?? "anon") + "#" + suffix + } + @MainActor func cooldownPerGeohash(_ gh: String, content: String, event: NostrEvent) { guard let context else { return } diff --git a/bitchat/Views/AppInfoView.swift b/bitchat/Views/AppInfoView.swift index 8335d874..a850f3e4 100644 --- a/bitchat/Views/AppInfoView.swift +++ b/bitchat/Views/AppInfoView.swift @@ -10,6 +10,8 @@ struct AppInfoView: View { var topologyProvider: (@MainActor () -> MeshTopologyDisplayModel)? @State private var showTopology = false @State private var liveVoiceEnabled = PTTSettings.liveVoiceEnabled + @State private var locationNotesEnabled = LocationNotesSettings.enabled + @ObservedObject private var locationManager = LocationChannelManager.shared private var selectedTheme: AppTheme { AppTheme(rawValue: appThemeRawValue) ?? .matrix @@ -88,6 +90,17 @@ struct AppInfoView: View { ) } + enum Location { + static let title: LocalizedStringKey = "app_info.location.title" + static let notes = AppInfoFeatureInfo( + icon: "mappin.and.ellipse", + title: "app_info.location.notes.title", + description: "app_info.location.notes.description" + ) + static let enable: LocalizedStringKey = "app_info.location.enable" + static let openSettings: LocalizedStringKey = "app_info.location.open_settings" + } + enum Network { static let title: LocalizedStringKey = "app_info.network.title" static let topology = AppInfoFeatureInfo( @@ -250,19 +263,24 @@ struct AppInfoView: View { } } - // Voice + // Location (notes / dead drops) VStack(alignment: .leading, spacing: 16) { - SectionHeader(Strings.Voice.title) + SectionHeader(Strings.Location.title) HStack(spacing: 0) { - FeatureRow(info: Strings.Voice.live) - Toggle(Strings.Voice.live.title, isOn: $liveVoiceEnabled) + FeatureRow(info: Strings.Location.notes) + Toggle(Strings.Location.notes.title, isOn: $locationNotesEnabled) .labelsHidden() .tint(palette.accent) - .onChange(of: liveVoiceEnabled) { newValue in - PTTSettings.liveVoiceEnabled = newValue + .onChange(of: locationNotesEnabled) { newValue in + LocationNotesSettings.enabled = newValue + if newValue { + locationManager.enableLocationChannels() + } } } + + locationPermissionRow } // Network diagnostics @@ -340,6 +358,34 @@ struct AppInfoView: View { } } +private extension AppInfoView { + /// One status/action line under the notes toggle so the location + /// requirement is actionable right here instead of only in the channel + /// sheet. + @ViewBuilder + var locationPermissionRow: some View { + if locationNotesEnabled { + switch locationManager.permissionState { + case .notDetermined: + Button(Strings.Location.enable) { + locationManager.enableLocationChannels() + } + .buttonStyle(.plain) + .bitchatFont(size: 13) + .foregroundColor(palette.accent) + case .denied, .restricted: + Button(Strings.Location.openSettings, action: SystemSettings.location.open) + .buttonStyle(.plain) + .bitchatFont(size: 13) + .foregroundColor(palette.accent) + case .authorized: + // Granted needs no status line — the toggle being on says it. + EmptyView() + } + } + } +} + struct AppInfoFeatureInfo { let icon: String let title: LocalizedStringKey diff --git a/bitchat/Views/Components/MeshEmptyStateView.swift b/bitchat/Views/Components/MeshEmptyStateView.swift new file mode 100644 index 00000000..fad25b21 --- /dev/null +++ b/bitchat/Views/Components/MeshEmptyStateView.swift @@ -0,0 +1,180 @@ +// +// MeshEmptyStateView.swift +// bitchat +// +// The empty mesh timeline, upgraded from a dead end into a live surface: +// a sonar shows the radio scanning, the daily sightings tally proves the +// spot isn't dead, the liveliest nearby geohash conversation is one tap +// away, and notes left at this place surface when there are any. +// This is free and unencumbered software released into the public domain. +// + +import SwiftUI + +struct MeshEmptyStateView: View { + /// Visible chat height to fill; the radar centers in the space left + /// below the narration. Zero (previews) keeps a compact layout. + var fillHeight: CGFloat = 0 + /// Ambient-footer mode, appended below archived echoes: skips the + /// intro/help narration (the timeline isn't empty) and shrinks the + /// radar, keeping the sightings tally and the live hints visible. + var compact: Bool = false + + @EnvironmentObject private var locationChannelsModel: LocationChannelsModel + @EnvironmentObject private var peerListModel: PeerListModel + @ObservedObject private var activityTracker = GeohashChatActivityTracker.shared + @ObservedObject private var sightingsTracker = MeshSightingsTracker.shared + + @ThemedPalette private var palette + + /// The activity window is evaluated at render time; without new events + /// nothing would trigger a re-render, so a stale "people are talking" + /// hint could linger. A slow tick keeps the hints and relative times + /// honest. + @State private var refreshTick = 0 + private let refreshTimer = Timer.publish(every: 60, on: .main, in: .common).autoconnect() + + private enum Strings { + static let meshIntro = String(localized: "content.empty.mesh_intro", comment: "First line of the empty mesh timeline explaining what the mesh channel is") + static let switchHint = String(localized: "content.empty.switch_hint", comment: "Empty timeline hint pointing at the channel switcher and the help screen") + static let sightingsOne = String(localized: "content.empty.sightings_one", comment: "Empty mesh timeline stat when exactly one device came within range today") + + static func sightingsMany(_ count: Int) -> String { + String( + format: String(localized: "content.empty.sightings_many", comment: "Empty mesh timeline stat counting devices that came within range today"), + locale: .current, + count + ) + } + + static func activityOne(_ geohash: String) -> String { + String( + format: String(localized: "content.empty.activity_one", comment: "Empty mesh timeline hint when one person is chatting in a nearby geohash channel; placeholder is the geohash"), + locale: .current, + geohash + ) + } + + static func activityMany(_ geohash: String) -> String { + String( + format: String(localized: "content.empty.activity_many", comment: "Empty mesh timeline hint when several people are chatting in a nearby geohash channel; placeholder is the geohash"), + locale: .current, + geohash + ) + } + + } + + /// The radar means "searching for people": once anyone is connected or + /// reachable on the mesh, the search is over and the sweep goes away. + private var isSearchingForPeers: Bool { + peerListModel.connectedMeshPeerCount == 0 && peerListModel.reachableMeshPeerCount == 0 + } + + var body: some View { + VStack(alignment: .leading, spacing: 6) { + if compact { + if isSearchingForPeers { + radarBlock + } + if let conversation = nearbyConversation { + conversationHint(conversation) + } + } else { + // The radar + tally already say "scanning, nobody yet", so + // the narration stays to two lines with the live hint after + // them, not wedged in between. + narrationLine(Strings.meshIntro) + narrationLine(Strings.switchHint) + if let conversation = nearbyConversation { + conversationHint(conversation) + } + + // The radar centers in whatever space is left below the + // text — the flexible spacers split it evenly. + if isSearchingForPeers { + Spacer(minLength: 24) + radarBlock + Spacer(minLength: 12) + } + } + } + .frame(minHeight: compact ? 0 : fillHeight, alignment: .top) + .onReceive(refreshTimer) { _ in refreshTick += 1 } + } + + /// The radar with today's tally as its caption — the stat belongs to + /// the scanning visual, not the narration lines. + private var radarBlock: some View { + VStack(spacing: 4) { + MeshRadarView(height: compact ? 44 : 72) + if sightingsTracker.todayCount > 0 { + Text(verbatim: sightingsText) + .bitchatFont(size: 11) + .foregroundColor(palette.secondary.opacity(0.8)) + } + } + .frame(maxWidth: .infinity) + } +} + +private extension MeshEmptyStateView { + var nearbyConversation: NearbyConversation? { + activityTracker.mostActiveConversation(among: locationChannelsModel.availableChannels) + } + + var sightingsText: String { + sightingsTracker.todayCount == 1 + ? Strings.sightingsOne + : Strings.sightingsMany(sightingsTracker.todayCount) + } + + func conversationHint(_ conversation: NearbyConversation) -> some View { + let headline = conversation.messageCount == 1 + ? Strings.activityOne(conversation.channel.geohash) + : Strings.activityMany(conversation.channel.geohash) + + return Button { + locationChannelsModel.markTeleported(for: conversation.channel.geohash, false) + locationChannelsModel.select(.location(conversation.channel)) + } label: { + VStack(alignment: .leading, spacing: 2) { + actionLine("💬 \(headline)") + narrationLine(" \(previewText(for: conversation.lastMessage))") + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + } + + func previewText(for message: GeohashChatPreview) -> String { + let maxLen = TransportConfig.uiGeoNotifySnippetMaxLen + var content = message.content + if content.count > maxLen { + content = String(content.prefix(maxLen)) + "…" + } + let formatter = RelativeDateTimeFormatter() + formatter.unitsStyle = .abbreviated + let ago = formatter.localizedString(for: message.timestamp, relativeTo: Date()) + return "<\(message.senderName)> \(content) · \(ago)" + } + + func narrationLine(_ text: String) -> some View { + emptyStateLine(text, color: palette.secondary.opacity(0.9)) + } + + /// Tappable lines render in the primary color so they read as actions + /// amid the grey narration. + func actionLine(_ text: String) -> some View { + emptyStateLine(text, color: palette.primary) + } + + func emptyStateLine(_ text: String, color: Color) -> some View { + // Non-breaking space before the closing asterisk so a tight wrap + // can't orphan a lone "*" onto its own line. + Text(verbatim: "* \(text)\u{00A0}*") + .bitchatFont(size: 13) + .foregroundColor(color) + .fixedSize(horizontal: false, vertical: true) + } +} diff --git a/bitchat/Views/Components/MeshRadarView.swift b/bitchat/Views/Components/MeshRadarView.swift new file mode 100644 index 00000000..d59c569e --- /dev/null +++ b/bitchat/Views/Components/MeshRadarView.swift @@ -0,0 +1,68 @@ +// +// MeshRadarView.swift +// bitchat +// +// Ambient sonar shown on the empty mesh timeline: expanding rings around a +// center dot make it visible that the radio is broadcasting and scanning +// even when nobody is in range. Purely decorative — hidden from +// accessibility, static under Reduce Motion. +// This is free and unencumbered software released into the public domain. +// + +import SwiftUI + +struct MeshRadarView: View { + /// Full size on the empty timeline; the ambient footer under archived + /// echoes uses a smaller one. + var height: CGFloat = 72 + + @Environment(\.accessibilityReduceMotion) private var reduceMotion + @ThemedPalette private var palette + + private let ringCount = 3 + private let period: TimeInterval = 3.0 + + var body: some View { + Group { + if reduceMotion { + radar(at: 0.35) + } else { + TimelineView(.animation(minimumInterval: 1.0 / 20.0)) { context in + radar(at: context.date.timeIntervalSinceReferenceDate) + } + } + } + .frame(height: height) + .frame(maxWidth: .infinity) + .accessibilityHidden(true) + } + + private func radar(at time: TimeInterval) -> some View { + Canvas { context, size in + let center = CGPoint(x: size.width / 2, y: size.height / 2) + let maxRadius = min(size.width, size.height) / 2 - 2 + + for ring in 0.. 1 else { continue } + let alpha = 0.45 * (1 - phase) + let rect = CGRect( + x: center.x - radius, + y: center.y - radius, + width: radius * 2, + height: radius * 2 + ) + context.stroke( + Path(ellipseIn: rect), + with: .color(palette.primary.opacity(alpha)), + lineWidth: 1 + ) + } + + let dot = CGRect(x: center.x - 2, y: center.y - 2, width: 4, height: 4) + context.fill(Path(ellipseIn: dot), with: .color(palette.primary.opacity(0.9))) + } + } +} diff --git a/bitchat/Views/ContentHeaderView.swift b/bitchat/Views/ContentHeaderView.swift index 24af46f5..792e2870 100644 --- a/bitchat/Views/ContentHeaderView.swift +++ b/bitchat/Views/ContentHeaderView.swift @@ -23,12 +23,15 @@ struct ContentHeaderView: View { /// Unified notices sheet (board posts + location notes) for the current /// channel context. - @State private var showNotices = false /// Board posts mirrored from the store so the pin icon can show when the /// current scope has notices. @State private var boardPosts: [BoardPostPacket] = [] + /// Nostr-only location notes at this place (live while the empty mesh + /// timeline is showing) — they should light the pin too. + @ObservedObject private var nearbyNotes = NearbyNotesCounter.shared + var body: some View { HStack(spacing: 0) { Text(verbatim: "bitchat/") @@ -157,11 +160,11 @@ struct ContentHeaderView: View { scopes.insert(geoScope) } boardAlertsModel.markSeen(forScopes: scopes) - showNotices = true + appChromeModel.presentNotices() }) { - // Fill marks unseen new pins; the tint says the current - // scope has notices at all. - Image(systemName: unseenNoticesCount > 0 ? "pin.fill" : "pin") + // Filled whenever the current scope has notices at all + // (matching the orange tint); hollow means nothing here. + Image(systemName: scopeHasNotices || unseenNoticesCount > 0 ? "pin.fill" : "pin") .font(.bitchatSystem(size: 12)) .foregroundColor( scopeHasNotices || unseenNoticesCount > 0 @@ -293,7 +296,10 @@ struct ContentHeaderView: View { .environmentObject(locationChannelsModel) .environmentObject(peerListModel) } - .sheet(isPresented: $showNotices) { + .sheet( + isPresented: $appChromeModel.isNoticesSheetPresented, + onDismiss: { appChromeModel.noticesSheetPrefersGeoTab = false } + ) { NoticesView( senderNickname: appChromeModel.nickname, board: appChromeModel.boardManager, @@ -334,8 +340,12 @@ private extension ContentHeaderView { } /// Open the notices sheet on the tab matching the current channel: the - /// geohash channel's notices, or the mesh-local board in mesh chat. + /// geohash channel's notices, or the mesh-local board in mesh chat. An + /// explicit geo-tab request (the "notes left here" hint) wins. var initialNoticesTab: NoticesView.Tab { + if appChromeModel.noticesSheetPrefersGeoTab { + return .geo + } if case .location = locationChannelsModel.selectedChannel { return .geo } @@ -351,9 +361,12 @@ private extension ContentHeaderView { return locationChannelsModel.currentBuildingGeohash } - /// Whether either tab of the notices sheet currently has content. + /// Whether either tab of the notices sheet currently has content: board + /// posts in scope, plus Nostr-only location notes when the nearby-notes + /// counter happens to be live (it runs with the empty mesh timeline). var scopeHasNotices: Bool { boardPosts.contains { $0.geohash.isEmpty || $0.geohash == noticesGeoScope } + || nearbyNotes.noteCount > 0 } /// New pins in either visible scope since the sheet was last opened. diff --git a/bitchat/Views/MessageListView.swift b/bitchat/Views/MessageListView.swift index 1506c1da..605599ea 100644 --- a/bitchat/Views/MessageListView.swift +++ b/bitchat/Views/MessageListView.swift @@ -19,6 +19,8 @@ struct MessageListView: View { @EnvironmentObject private var privateConversationModel: PrivateConversationModel @EnvironmentObject private var conversationUIModel: ConversationUIModel @EnvironmentObject private var locationChannelsModel: LocationChannelsModel + @EnvironmentObject private var appChromeModel: AppChromeModel + @ObservedObject private var nearbyNotes = NearbyNotesCounter.shared @Environment(\.colorScheme) private var colorScheme @Environment(\.appTheme) private var theme @@ -45,6 +47,9 @@ struct MessageListView: View { /// switches swap the timeline wholesale, so a count delta is only a /// "new messages" signal while the context is unchanged. @State private var unseenBaselineKey = "" + /// Whether this instance holds the nearby-notes counter active (mesh + /// public timeline only); balanced against activate/deactivate. + @State private var holdsNotesCounter = false @ThemedPalette private var palette @@ -72,10 +77,19 @@ struct MessageListView: View { return MessageDisplayItem(id: "\(contextKey)|\(message.id)", message: message) } + VStack(spacing: 0) { + // Notes pinned to this place stay visible while chatting — a + // conversation starting must not hide what's left here. + if privatePeer == nil, + case .mesh = locationChannelsModel.selectedChannel, + nearbyNotes.noteCount > 0 { + notesHereStrip + } + GeometryReader { geometry in ScrollViewReader { proxy in ScrollView { if messageItems.isEmpty && privatePeer == nil { - publicEmptyState + publicEmptyState(fillHeight: geometry.size.height) } LazyVStack(alignment: .leading, spacing: 0) { ForEach(messageItems) { item in @@ -150,10 +164,23 @@ struct MessageListView: View { } .padding(.horizontal, 12) .padding(.vertical, 1) + // Archived echoes read as one tinted block, not + // just faded rows. + .background(message.isArchivedEcho ? palette.secondary.opacity(0.08) : Color.clear) } } .transaction { tx in if conversationUIModel.isBatchingPublic { tx.disablesAnimations = true } } .padding(.vertical, 2) + + // Only carried history on screen: the ambient layer (radar, + // sightings, live hints) stays visible below it instead of + // vanishing the moment echoes exist. + if privatePeer == nil, showsAmbientFooter(messageItems: messageItems) { + MeshEmptyStateView(compact: true) + .padding(.horizontal, 12) + .padding(.top, 20) + .padding(.bottom, 8) + } } .overlay(alignment: .bottomTrailing) { if !isAtBottom && !messageItems.isEmpty { @@ -246,6 +273,12 @@ struct MessageListView: View { scrollThrottleTimer?.invalidate() } } + } + } + .onAppear { updateNotesCounterHold() } + .onDisappear { releaseNotesCounterHold() } + .onChange(of: locationChannelsModel.selectedChannel) { _ in updateNotesCounterHold() } + .onChange(of: privatePeer) { _ in updateNotesCounterHold() } .environment(\.openURL, OpenURLAction { url in // Intercept custom cashu: links created in attributed text if let scheme = url.scheme?.lowercased(), scheme == "cashu" || scheme == "lightning" { @@ -270,16 +303,75 @@ private extension MessageListView { return locationChannelsModel.selectedChannel.contextKey } + /// Tappable strip above the mesh timeline while notes are pinned at this + /// place: opens the notices sheet on the geo tab. + var notesHereStrip: some View { + let text: String = nearbyNotes.noteCount == 1 + ? String(localized: "content.empty.notes_one", comment: "Hint when exactly one note was left at this place") + : String( + format: String(localized: "content.empty.notes_many", comment: "Hint counting notes left at this place"), + locale: .current, + nearbyNotes.noteCount + ) + + return Button { + appChromeModel.presentNotices(geoTab: true) + } label: { + HStack(spacing: 6) { + Text(verbatim: "📍 \(text)") + .bitchatFont(size: 12) + .foregroundColor(palette.primary) + Spacer() + Image(systemName: "chevron.right") + .font(.bitchatSystem(size: 10)) + .foregroundColor(palette.secondary) + } + .padding(.horizontal, 12) + .padding(.vertical, 7) + .background(palette.secondary.opacity(0.08)) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + } + + /// The nearby-notes counter runs whenever the mesh public timeline is + /// showing — the strip needs a live count before it can decide to exist. + func updateNotesCounterHold() { + let shouldHold = privatePeer == nil && locationChannelsModel.selectedChannel.isMesh + guard shouldHold != holdsNotesCounter else { return } + holdsNotesCounter = shouldHold + if shouldHold { + NearbyNotesCounter.shared.activate() + } else { + NearbyNotesCounter.shared.deactivate() + } + } + + func releaseNotesCounterHold() { + guard holdsNotesCounter else { return } + holdsNotesCounter = false + NearbyNotesCounter.shared.deactivate() + } + + /// True when the mesh timeline holds nothing but archived echoes and + /// system lines — no live conversation yet, so the ambient layer still + /// applies. + private func showsAmbientFooter(messageItems: [MessageDisplayItem]) -> Bool { + guard case .mesh = locationChannelsModel.selectedChannel, + !messageItems.isEmpty else { return false } + return messageItems.allSatisfy { $0.message.isArchivedEcho || $0.message.sender == "system" } + } + /// Terminal-styled narration for an empty public timeline: says which /// channel this is, that the app is waiting for peers, and where to go /// next. Rendered inside the ScrollView; disappears with the first row. - var publicEmptyState: some View { + /// The mesh case fills the visible chat height so its radar can center + /// in the space below the text. + func publicEmptyState(fillHeight: CGFloat) -> some View { VStack(alignment: .leading, spacing: 6) { switch locationChannelsModel.selectedChannel { case .mesh: - emptyStateLine(String(localized: "content.empty.mesh_intro", comment: "First line of the empty mesh timeline explaining what the mesh channel is")) - emptyStateLine(String(localized: "content.empty.mesh_waiting", comment: "Second line of the empty mesh timeline saying no peers are in range yet")) - emptyStateLine(String(localized: "content.empty.switch_hint", comment: "Empty timeline hint pointing at the channel switcher and the help screen")) + MeshEmptyStateView(fillHeight: max(0, fillHeight - 24)) case .location(let channel): emptyStateLine( String( @@ -410,6 +502,9 @@ private extension MessageListView { TextMessageView(message: message) } } + // Archived echoes ("heard here earlier") render dimmed: real history, + // visually distinct from the live conversation. + .opacity(message.isArchivedEcho ? 0.55 : 1) } @ViewBuilder diff --git a/bitchat/Views/NoticesView.swift b/bitchat/Views/NoticesView.swift index 692158f1..a4ad3522 100644 --- a/bitchat/Views/NoticesView.swift +++ b/bitchat/Views/NoticesView.swift @@ -31,10 +31,18 @@ struct NoticesView: View { @State private var tab: Tab @State private var draft: String = "" @State private var urgent = false - @State private var expiryDays = 7 + /// Days until the notice fades; `permanentExpiry` (geo default) means no + /// NIP-40 tag — the note stays until its relay drops it. + @State private var expiryDays: Int + + /// Sentinel picker tag for the ∞ option (geo tab only). + private static let permanentExpiry = 0 /// Injected notes manager for tests; live use derives one per geohash. private let notesManager: LocationNotesManager? + /// Live manager owned by the sheet so the composer can post pure Nostr + /// notes (∞ expiry has no mesh-board copy) and the list can render them. + @State private var liveGeoManager: LocationNotesManager? init( senderNickname: String, @@ -46,6 +54,27 @@ struct NoticesView: View { self.board = board self.notesManager = notesManager _tab = State(initialValue: initialTab) + _expiryDays = State(initialValue: initialTab == .geo ? Self.permanentExpiry : 7) + } + + private var activeNotesManager: LocationNotesManager? { + notesManager ?? liveGeoManager + } + + /// Creates (or retargets/revives) the sheet-owned notes manager for the + /// current geo scope. + private func ensureGeoNotesManager() { + guard notesManager == nil, tab == .geo, let geohash = geoGeohash else { return } + if let manager = liveGeoManager { + if manager.geohash != geohash.lowercased() { + manager.setGeohash(geohash) + } else if manager.state == .idle { + // Cancelled on a tab switch; returning re-subscribes. + manager.refresh() + } + } else { + liveGeoManager = LocationNotesManager(geohash: geohash) + } } private var maxDraftLines: Int { dynamicTypeSize.isAccessibilitySize ? 5 : 3 } @@ -90,6 +119,7 @@ struct NoticesView: View { static let send = String(localized: "board.accessibility.post", defaultValue: "Post notice", comment: "Accessibility label for the board post button") static let deleteAction = String(localized: "board.action.delete", defaultValue: "delete", comment: "Delete action for own board posts") static let expiryLabel = String(localized: "board.compose.expiry", defaultValue: "expires in", comment: "Label for the board post expiry picker") + static let permanentOption = String(localized: "notices.expiry.permanent", defaultValue: "permanent", comment: "Accessibility label for the ∞ (never expires) option in the geo notes expiry picker") static let closeHint = String(localized: "notices.accessibility.close", defaultValue: "Close notices", comment: "Accessibility label for the notices close button") static let meshSource = String(localized: "notices.source.mesh", defaultValue: "mesh", comment: "Source badge for notices carried by the mesh") static let nostrSource = String(localized: "notices.source.nostr", defaultValue: "net", comment: "Source badge for notices seen on internet relays") @@ -109,6 +139,16 @@ struct NoticesView: View { ) } + static func fades(_ expiresAt: Date) -> String { + let formatter = RelativeDateTimeFormatter() + formatter.unitsStyle = .abbreviated + return String( + format: String(localized: "notices.fades", defaultValue: "fades %@", comment: "Shown on notices with an expiry; placeholder is a localized relative time like 'in 23h'"), + locale: .current, + formatter.localizedString(for: expiresAt, relativeTo: Date()) + ) + } + static func rowAccessibilityLabel(author: String, content: String, urgent: Bool) -> String { let base = String( format: String(localized: "board.accessibility.post_row", defaultValue: "Notice from %@: %@", comment: "Accessibility label for a board post row"), @@ -132,18 +172,29 @@ struct NoticesView: View { .frame(minWidth: 420, idealWidth: 440, minHeight: 620, idealHeight: 680) #endif .themedSheetBackground() - .onAppear { beginGeoLocationIfNeeded() } + .onAppear { + beginGeoLocationIfNeeded() + ensureGeoNotesManager() + } .onChange(of: tab) { newTab in if newTab == .geo { beginGeoLocationIfNeeded() + ensureGeoNotesManager() } else { locationChannelsModel.endLiveRefresh() } + // Each tab keeps its natural default: geo notes stay until + // deleted (∞), mesh board posts fade within a week. + expiryDays = newTab == .geo ? Self.permanentExpiry : 7 + urgent = false } // Catches permission granted from the geo tab's enable button. .onChange(of: locationChannelsModel.permissionState) { _ in beginGeoLocationIfNeeded() } + .onChange(of: geoGeohash) { _ in + ensureGeoNotesManager() + } .onDisappear { locationChannelsModel.endLiveRefresh() } } @@ -207,7 +258,14 @@ struct NoticesView: View { ) case .geo: if let geohash = geoGeohash { - GeoNoticesList(geohash: geohash, board: board, manager: notesManager) + if let manager = activeNotesManager { + GeoNoticesList(geohash: geohash, board: board, manager: manager) + } else { + // Manager is created on appear; visible for one frame. + Color.clear + .frame(maxWidth: .infinity, maxHeight: .infinity) + .onAppear { ensureGeoNotesManager() } + } } else { locationUnavailableSection } @@ -252,11 +310,10 @@ struct NoticesView: View { .disabled(!sendEnabled) .accessibilityLabel(Strings.send) } - // Urgency and expiry only travel with the mesh copy — the bridged - // Nostr note carries neither, so relay-side readers would never - // see them. Offer the controls only where they fully apply. - if tab == .mesh { - HStack(spacing: 12) { + // Both tabs pick an expiry (geo notes may be ∞); urgency is a + // mesh-board concept — notes are ambient by nature. + HStack(spacing: 12) { + if tab == .mesh { Toggle(isOn: $urgent) { Text(Strings.urgentToggle) .bitchatFont(size: 12) @@ -265,19 +322,30 @@ struct NoticesView: View { .toggleStyle(.switch) .fixedSize() .accessibilityLabel(Strings.urgentToggle) - Spacer() - Text(Strings.expiryLabel) - .bitchatFont(size: 12) - .foregroundColor(palette.secondary) - Picker(Strings.expiryLabel, selection: $expiryDays) { - ForEach([1, 3, 7], id: \.self) { days in - Text(Strings.expiryDaysOption(days)).tag(days) - } - } - .pickerStyle(.segmented) - .fixedSize() - .accessibilityLabel(Strings.expiryLabel) } + Spacer() + Text(Strings.expiryLabel) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + Picker(Strings.expiryLabel, selection: $expiryDays) { + // Mesh board posts must fade (the wire caps their + // lifetime); only relay-backed geo notes can be ∞. + if tab == .geo { + Text(verbatim: "∞") + .accessibilityLabel(Strings.permanentOption) + .tag(Self.permanentExpiry) + } + ForEach([1, 3, 7], id: \.self) { days in + Text(Strings.expiryDaysOption(days)).tag(days) + } + } + .pickerStyle(.segmented) + // macOS segmented pickers render their own label; the themed + // Text alongside already carries it (and accessibility keeps + // the explicit label below). + .labelsHidden() + .fixedSize() + .accessibilityLabel(Strings.expiryLabel) } } .padding(.horizontal, 16) @@ -293,14 +361,27 @@ struct NoticesView: View { private func send() { guard let geohash = activeGeohash, let content = draft.trimmedOrNilIfEmpty else { return } - // Geo posts go to the board and are bridged to Nostr by BoardManager, - // so mesh and internet see the same notice. They always use the - // defaults: non-urgent, 7-day expiry (NIP-40 on the bridged copy). + + // ∞ (geo default): a pure relay note with no NIP-40 tag. It skips + // the mesh board deliberately — a board copy must fade within days, + // which would contradict the permanence the user just picked. + if tab == .geo, expiryDays == Self.permanentExpiry { + guard let manager = activeNotesManager else { return } + manager.send(content: content, nickname: senderNickname, expiresAt: nil) + draft = "" + urgent = false + return + } + + // Expiring posts go to the board and are bridged to Nostr by + // BoardManager, so mesh and internet see the same notice with the + // chosen expiry (expiresAt on mesh, NIP-40 on the bridged note). + // Urgency is mesh-only. let sent = board.createPost( content: content, geohash: geohash, urgent: tab == .mesh && urgent, - expiryDays: tab == .mesh ? expiryDays : 7, + expiryDays: expiryDays, nickname: senderNickname ) if sent { @@ -310,18 +391,19 @@ struct NoticesView: View { } } -/// The geo tab's list: owns the Nostr notes subscription for the scope -/// geohash and merges it with the board posts for the same geohash. +/// The geo tab's list: renders the sheet-owned Nostr notes subscription +/// merged with the board posts for the same geohash. The manager lives on +/// `NoticesView` so the composer can post through the same instance (∞ +/// notes local-echo into this list). private struct GeoNoticesList: View { let geohash: String @ObservedObject var board: BoardManager - @StateObject private var notesManager: LocationNotesManager + @ObservedObject var notesManager: LocationNotesManager - init(geohash: String, board: BoardManager, manager: LocationNotesManager? = nil) { - let gh = geohash.lowercased() - self.geohash = gh + init(geohash: String, board: BoardManager, manager: LocationNotesManager) { + self.geohash = geohash.lowercased() self.board = board - _notesManager = StateObject(wrappedValue: manager ?? LocationNotesManager(geohash: gh)) + self.notesManager = manager } var body: some View { @@ -475,6 +557,11 @@ private struct NoticesList: View { Text(Self.timestampText(for: item.createdAt)) .bitchatFont(size: 11) .foregroundColor(palette.secondary) + if let expiresAt = item.expiresAt, expiresAt > Date() { + Text(Strings.fades(expiresAt)) + .bitchatFont(size: 11) + .foregroundColor(palette.secondary.opacity(0.8)) + } Spacer() if showsSource { sourceBadge(item) diff --git a/bitchatTests/ChatPeerListCoordinatorContextTests.swift b/bitchatTests/ChatPeerListCoordinatorContextTests.swift index e9c7549c..079da987 100644 --- a/bitchatTests/ChatPeerListCoordinatorContextTests.swift +++ b/bitchatTests/ChatPeerListCoordinatorContextTests.swift @@ -68,6 +68,13 @@ private final class MockChatPeerListContext: ChatPeerListContext { func notifyNetworkAvailable(peerCount: Int) { networkAvailableNotifications.append(peerCount) } + + // Sightings + private(set) var recordedSightings: [[PeerID]] = [] + + func recordMeshSightings(peerIDs: [PeerID]) { + recordedSightings.append(peerIDs) + } } // MARK: - Helpers diff --git a/bitchatTests/LocationNotesManagerTests.swift b/bitchatTests/LocationNotesManagerTests.swift index bf08fd84..896aca28 100644 --- a/bitchatTests/LocationNotesManagerTests.swift +++ b/bitchatTests/LocationNotesManagerTests.swift @@ -216,6 +216,126 @@ struct LocationNotesManagerTests { #expect(manager.errorMessage == nil) } + @Test + func ingestDropsExpiredNotesAndKeepsUnexpiredOnes() throws { + var storedHandler: ((NostrEvent) -> Void)? + let now = Date(timeIntervalSince1970: 1_700_000_000) + let deps = LocationNotesDependencies( + relayLookup: { _, _ in ["wss://relay.one"] }, + subscribe: { _, _, _, handler, _ in + storedHandler = handler + }, + unsubscribe: { _ in }, + sendEvent: { _, _ in }, + deriveIdentity: { _ in throw TestError.shouldNotDerive }, + now: { now } + ) + + let manager = LocationNotesManager(geohash: "u4pruydq", dependencies: deps) + let identity = try NostrIdentity.generate() + + let expired = NostrEvent( + pubkey: identity.publicKeyHex, + createdAt: now.addingTimeInterval(-3600), + kind: .textNote, + tags: [["g", "u4pruydq"], ["expiration", String(Int(now.timeIntervalSince1970) - 60)]], + content: "gone" + ) + storedHandler?(try expired.sign(with: identity.schnorrSigningKey())) + + let live = NostrEvent( + pubkey: identity.publicKeyHex, + createdAt: now.addingTimeInterval(-3600), + kind: .textNote, + tags: [["g", "u4pruydq"], ["expiration", String(Int(now.timeIntervalSince1970) + 3600)]], + content: "still here" + ) + storedHandler?(try live.sign(with: identity.schnorrSigningKey())) + + #expect(manager.notes.count == 1) + #expect(manager.notes.first?.content == "still here") + #expect(manager.notes.first?.expiresAt == Date(timeIntervalSince1970: TimeInterval(Int(now.timeIntervalSince1970) + 3600))) + } + + @Test + func postDrop_sendsExpiringNoteToGeoRelays() throws { + var sentEvents: [NostrEvent] = [] + let now = Date(timeIntervalSince1970: 1_700_000_000) + let identity = try NostrIdentity.generate() + let deps = LocationNotesDependencies( + relayLookup: { _, _ in ["wss://relay.one"] }, + subscribe: { _, _, _, _, _ in }, + unsubscribe: { _ in }, + sendEvent: { event, _ in sentEvents.append(event) }, + deriveIdentity: { _ in identity }, + now: { now } + ) + + let posted = LocationNotesManager.postDrop( + content: " the coffee here is great ", + nickname: "scout", + geohash: "u4pruydq", + dependencies: deps + ) + + #expect(posted) + #expect(sentEvents.count == 1) + let event = try #require(sentEvents.first) + #expect(event.kind == NostrProtocol.EventKind.textNote.rawValue) + #expect(event.content == "the coffee here is great") + #expect(event.tags.contains(["g", "u4pruydq"])) + let expiration = event.tags.first { $0.first == "expiration" }?.last + let expected = Int(now.addingTimeInterval(TransportConfig.locationDropExpirySeconds).timeIntervalSince1970) + #expect(expiration == String(expected)) + } + + @Test + func postDrop_failsWithoutRelays() { + let deps = LocationNotesDependencies( + relayLookup: { _, _ in [] }, + subscribe: { _, _, _, _, _ in }, + unsubscribe: { _ in }, + sendEvent: { _, _ in }, + deriveIdentity: { _ in throw TestError.shouldNotDerive }, + now: { Date() } + ) + + #expect(!LocationNotesManager.postDrop(content: "hi", nickname: "x", geohash: "u4pruydq", dependencies: deps)) + } + + @Test + func pruneExpiredNotes_dropsNotesWhoseExpiryPassed() throws { + var storedHandler: ((NostrEvent) -> Void)? + var currentNow = Date(timeIntervalSince1970: 1_700_000_000) + let deps = LocationNotesDependencies( + relayLookup: { _, _ in ["wss://relay.one"] }, + subscribe: { _, _, _, handler, _ in + storedHandler = handler + }, + unsubscribe: { _ in }, + sendEvent: { _, _ in }, + deriveIdentity: { _ in throw TestError.shouldNotDerive }, + now: { currentNow } + ) + + let manager = LocationNotesManager(geohash: "u4pruydq", dependencies: deps) + let identity = try NostrIdentity.generate() + let note = NostrEvent( + pubkey: identity.publicKeyHex, + createdAt: currentNow, + kind: .textNote, + tags: [["g", "u4pruydq"], ["expiration", String(Int(currentNow.timeIntervalSince1970) + 60)]], + content: "short lived" + ) + storedHandler?(try note.sign(with: identity.schnorrSigningKey())) + #expect(manager.notes.count == 1) + + currentNow = currentNow.addingTimeInterval(120) + manager.pruneExpiredNotes() + + #expect(manager.notes.isEmpty) + } + private enum TestError: Error { case shouldNotDerive } diff --git a/bitchatTests/Services/GeohashChatActivityTrackerTests.swift b/bitchatTests/Services/GeohashChatActivityTrackerTests.swift new file mode 100644 index 00000000..a9786b14 --- /dev/null +++ b/bitchatTests/Services/GeohashChatActivityTrackerTests.swift @@ -0,0 +1,113 @@ +// +// GeohashChatActivityTrackerTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +@testable import bitchat + +@MainActor +struct GeohashChatActivityTrackerTests { + + private let baseDate = Date(timeIntervalSince1970: 1_700_000_000) + + private func makeTracker(window: TimeInterval = 900, now: Date? = nil) -> (GeohashChatActivityTracker, (Date) -> Void) { + var currentNow = now ?? baseDate + let tracker = GeohashChatActivityTracker(window: window, now: { currentNow }) + return (tracker, { currentNow = $0 }) + } + + private func channel(_ geohash: String, _ level: GeohashChannelLevel) -> GeohashChannel { + GeohashChannel(level: level, geohash: geohash) + } + + @Test + func recordsAndCountsMessagesInWindow() { + let (tracker, _) = makeTracker() + tracker.recordChatMessage(geohash: "9Q8YY", senderName: "alice#ab12", content: "hi", timestamp: baseDate) + tracker.recordChatMessage(geohash: "9q8yy", senderName: "bob#cd34", content: "yo", timestamp: baseDate) + + #expect(tracker.messageCount(for: "9q8yy") == 2) + #expect(tracker.lastMessage(for: "9q8YY")?.senderName == "bob#cd34") + } + + @Test + func dropsMessagesOlderThanWindow() { + let (tracker, advance) = makeTracker(window: 900) + tracker.recordChatMessage(geohash: "9q8yy", senderName: "alice#ab12", content: "hi", timestamp: baseDate) + + advance(baseDate.addingTimeInterval(901)) + + #expect(tracker.messageCount(for: "9q8yy") == 0) + #expect(tracker.lastMessage(for: "9q8yy") == nil) + } + + @Test + func ignoresMessagesAlreadyOutsideWindow() { + let (tracker, _) = makeTracker(window: 900) + tracker.recordChatMessage( + geohash: "9q8yy", + senderName: "alice#ab12", + content: "old", + timestamp: baseDate.addingTimeInterval(-1000) + ) + + #expect(tracker.messageCount(for: "9q8yy") == 0) + } + + @Test + func keepsNewestPreview() { + let (tracker, _) = makeTracker() + tracker.recordChatMessage(geohash: "9q8yy", senderName: "a#1111", content: "newer", timestamp: baseDate) + tracker.recordChatMessage(geohash: "9q8yy", senderName: "b#2222", content: "older", timestamp: baseDate.addingTimeInterval(-60)) + + #expect(tracker.lastMessage(for: "9q8yy")?.content == "newer") + #expect(tracker.messageCount(for: "9q8yy") == 2) + } + + @Test + func mostActivePicksBusiestChannel() { + let (tracker, _) = makeTracker() + tracker.recordChatMessage(geohash: "9q8yy", senderName: "a#1111", content: "one", timestamp: baseDate) + tracker.recordChatMessage(geohash: "9q8", senderName: "b#2222", content: "two", timestamp: baseDate) + tracker.recordChatMessage(geohash: "9q8", senderName: "c#3333", content: "three", timestamp: baseDate) + + let channels = [channel("9q8yy", .city), channel("9q8", .province)] + let best = tracker.mostActiveConversation(among: channels) + + #expect(best?.channel.geohash == "9q8") + #expect(best?.messageCount == 2) + } + + @Test + func mostActiveTieGoesToMoreLocalChannel() { + let (tracker, _) = makeTracker() + tracker.recordChatMessage(geohash: "9q8yyzz1", senderName: "a#1111", content: "local", timestamp: baseDate) + tracker.recordChatMessage(geohash: "9q", senderName: "b#2222", content: "regional", timestamp: baseDate) + + let channels = [channel("9q", .region), channel("9q8yyzz1", .building)] + let best = tracker.mostActiveConversation(among: channels) + + #expect(best?.channel.geohash == "9q8yyzz1") + } + + @Test + func mostActiveIsNilWithoutMessages() { + let (tracker, _) = makeTracker() + #expect(tracker.mostActiveConversation(among: [channel("9q8yy", .city)]) == nil) + } + + @Test + func clearRemovesEverything() { + let (tracker, _) = makeTracker() + tracker.recordChatMessage(geohash: "9q8yy", senderName: "a#1111", content: "hi", timestamp: baseDate) + tracker.clear() + + #expect(tracker.messageCount(for: "9q8yy") == 0) + #expect(tracker.mostActiveConversation(among: [channel("9q8yy", .city)]) == nil) + } +} diff --git a/bitchatTests/Services/MeshSightingsTrackerTests.swift b/bitchatTests/Services/MeshSightingsTrackerTests.swift new file mode 100644 index 00000000..e6795e7b --- /dev/null +++ b/bitchatTests/Services/MeshSightingsTrackerTests.swift @@ -0,0 +1,81 @@ +// +// MeshSightingsTrackerTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +@testable import bitchat +import BitFoundation + +@MainActor +struct MeshSightingsTrackerTests { + + private func makeDefaults() -> UserDefaults { + let suite = "MeshSightingsTrackerTests-\(UUID().uuidString)" + let defaults = UserDefaults(suiteName: suite)! + defaults.removePersistentDomain(forName: suite) + return defaults + } + + private let noon = Date(timeIntervalSince1970: 1_700_000_000) + + @Test + func countsDistinctPeersOnce() { + let defaults = makeDefaults() + let tracker = MeshSightingsTracker(defaults: defaults, now: { self.noon }) + + tracker.recordSighting(peerID: PeerID(str: "aaaa111122223333")) + tracker.recordSighting(peerID: PeerID(str: "aaaa111122223333")) + tracker.recordSighting(peerID: PeerID(str: "bbbb444455556666")) + + #expect(tracker.todayCount == 2) + #expect(tracker.lastSightingAt == noon) + } + + @Test + func persistsAcrossInstances() { + let defaults = makeDefaults() + let first = MeshSightingsTracker(defaults: defaults, now: { self.noon }) + first.recordSighting(peerID: PeerID(str: "aaaa111122223333")) + + let second = MeshSightingsTracker(defaults: defaults, now: { self.noon.addingTimeInterval(60) }) + #expect(second.todayCount == 1) + + // Same peer again does not double count after a relaunch. + second.recordSighting(peerID: PeerID(str: "aaaa111122223333")) + #expect(second.todayCount == 1) + } + + @Test + func rollsOverOnNewDay() { + let defaults = makeDefaults() + var currentNow = noon + let tracker = MeshSightingsTracker(defaults: defaults, now: { currentNow }) + tracker.recordSighting(peerID: PeerID(str: "aaaa111122223333")) + #expect(tracker.todayCount == 1) + + currentNow = noon.addingTimeInterval(2 * 24 * 60 * 60) + tracker.recordSighting(peerID: PeerID(str: "bbbb444455556666")) + + #expect(tracker.todayCount == 1) + } + + @Test + func clearResetsEverything() { + let defaults = makeDefaults() + let tracker = MeshSightingsTracker(defaults: defaults, now: { self.noon }) + tracker.recordSighting(peerID: PeerID(str: "aaaa111122223333")) + + tracker.clear() + + #expect(tracker.todayCount == 0) + #expect(tracker.lastSightingAt == nil) + + let reloaded = MeshSightingsTracker(defaults: defaults, now: { self.noon }) + #expect(reloaded.todayCount == 0) + } +} diff --git a/bitchatTests/ViewSmokeTests.swift b/bitchatTests/ViewSmokeTests.swift index debb41e5..b33c905b 100644 --- a/bitchatTests/ViewSmokeTests.swift +++ b/bitchatTests/ViewSmokeTests.swift @@ -415,7 +415,7 @@ struct ViewSmokeTests { let board = BoardManager( transport: transport, store: BoardStore(persistsToDisk: false, fileURL: nil, now: { Date() }), - publishToNostr: { _, _, _, _ in nil }, + publishToNostr: { _, _, _, _, _ in nil }, deleteFromNostr: { _, _ in } ) From 4baeaab717e43a05a4c0a8262b9cf7f674535090 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 14:16:46 +0200 Subject: [PATCH 061/158] Geo notes latency: EOSE scoped to reached relays + connecting state with auto-retry (#1411) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Empty-mesh liveliness: nearby conversations, echoes, wave action, dead drops, radar The empty mesh timeline was a dead end: a grey zero and "nobody in range yet". This turns it into a live surface and gives the app pull when the mesh wakes up: - Nearest conversation: background geohash sampling now tracks actual chat messages (not just presence) per regional channel; the empty state surfaces the busiest nearby conversation with a preview, one tap to join (GeohashChatActivityTracker, fed from GeoPresenceTracker). - Echoes: the carried 6h store-and-forward window renders as dimmed "heard here earlier" rows at launch (new Transport collectArchivedPublicMessages -> GossipSyncManager snapshot, decoded with signature-derived nicknames; content-identity dedup guards against re-synced duplicates). - Wave: the "bitchatters nearby" notification gains a "wave" quick action that broadcasts a mesh 👋 straight from the notification, even backgrounded (first UNNotificationCategory in the app). - Dead drops: /drop pins a note to the current building geohash as a kind-1 location note with a 24h NIP-40 expiry; expired notes are now dropped client-side at ingest; the notices sheet shows "fades in Xh"; a "location notes" toggle plus location-permission controls live in app info (also fixes the duplicated Voice section). - Radar: an ambient sonar animation shows the radio scanning, with a privacy-safe daily tally ("N devices passed within range today" via salted per-day hashes) and a "notes left here" hint that opens the notices geo tab. All new user-facing strings ship in all 29 locales. 1403 tests green, including new suites for the activity tracker, sightings tally, and note expiry/drop publishing. Co-Authored-By: Claude Fable 5 * Review round: app-info polish, urgent/expiry parity, centered radar, pin fill, Codex P2s - App info: LOCATION header uppercased like sibling sections; location notes and live voice descriptions shortened (29 locales); redundant "location access granted" line removed. - Notices parity: urgent + expiry controls now show on the geo tab too; the bridged Nostr note carries ["t","urgent"] and NIP-40 so relay-side readers see both; urgent parsed back from incoming notes. - Radar moved from the top of the empty state to the center of the chat area, below the help text (empty state fills the visible height). - Header pin fills whenever the scope has notices (was: only unseen), and Nostr-only nearby notes now light it too. - Codex P2 fixes: notification completion deferred until the wave action is handled (background suspension dropped the send); NIP-40 notes now prune on a timer when they expire while displayed; the location-notes kill switch retargets the nearby-notes counter immediately. Co-Authored-By: Claude Fable 5 * Hide macOS segmented picker's built-in label in notices composer (duplicate 'expires in') Co-Authored-By: Claude Fable 5 * Geo notes: permanent (∞) expiry default, urgent stays mesh-only - Geo expiry picker gains ∞ as the default: a permanent note posts as a pure relay note (no NIP-40 tag, no mesh-board copy — a board copy must fade within days, contradicting the ∞ the user picked). 1/3/7d keep the board + bridged-note path with NIP-40. - The notes manager is now owned by the notices sheet (not the list) so the composer local-echoes ∞ notes into the list; it revives via refresh() after a tab-switch cancel, and its expiry-prune timer survives cancel (weak self, dies with the instance). - Urgent toggle returns to mesh-only per review — notes are ambient; the read-side urgent-tag parse stays so tagged notes still render. - macOS: hide the segmented picker's built-in label (duplicate "expires in"). Co-Authored-By: Claude Fable 5 * Geo notes latency: EOSE scoped to reached relays, connecting state with auto-retry Field finding: opening notices on a cold launch showed "no notices yet" after ~10s, with notes popping in later — the empty state was a lie told by two mechanisms: - EOSE tracking waited on ALL target relays, including ones still mid-Tor-circuit; one dead relay of five pinned "loading" until the 10s fallback. Trackers now count a relay only once the REQ actually reached it (marked from the send completion, or proven by its EOSE), so the first responding relay resolves the initial load and dropped targets can't stall it. The 10s fallback stays as backstop. - When that fallback fired with ZERO connected target relays (Tor still bootstrapping), LocationNotesManager reported .ready with no notes. It now enters a .connecting state — rendered as "connecting to relays…" instead of the empty state — and polls every 3s, re- subscribing for a fresh initial fetch the moment a target relay comes up. New NostrRelayManager.isAnyRelayConnected(among:) feeds the check via an injectable dependency (tests default to legacy behavior). String localized in all 29 locales. 1412 tests green, iOS+macOS builds clean. Co-Authored-By: Claude Fable 5 * Clearing the mesh timeline dismisses echoes for good; tighter divider copy Triple-tap /clear emptied the timeline but the next launch re-seeded "heard here earlier" from the persisted archive. A MeshEchoSettings watermark now records the clear; only messages heard after it come back (the archive itself still carries everything for peers' sync). The echo dedup keys reset with it, and panic wipe drops the watermark. Divider copy tightened to "heard here earlier · last 6h" (29 locales). Co-Authored-By: Claude Fable 5 * Mark EOSE relays at send initiation, closing the in-flight-send race Codex P2 on #1411: with several sockets already connected, a fast relay's EOSE could complete the tracker while a slower relay's async send completion hadn't yet moved it out of awaitingSend — the initial load reported done with that relay's stored events still pending. Relays are now marked awaiting-EOSE synchronously when the REQ send is initiated (and when a flush skips an already-subscribed relay), so every relay that was actually asked is counted before any EOSE can race. Failed sends resolve via the disconnect settle or the fallback. Co-Authored-By: Claude Fable 5 * Echoes visual polish: tinted history block, radar-captioned tally, ambient footer Device-test feedback on the echoes screen: - Archived echoes now sit on a subtle tinted background (secondary at 8%) in addition to the dim, so "heard here earlier" reads as one distinct block; the divider carries the echo ID prefix to join it. - "N devices passed within range today" moves out of the narration lines to sit centered under the radar as its caption. - When the timeline holds only echoes/system lines, a compact ambient footer (small radar + tally + live hints) renders below the history instead of the whole ambient layer vanishing. Co-Authored-By: Claude Fable 5 * Notes strip persists above the mesh chat; leaner empty-state narration - The 📍 "notes left here" line was empty-state-only, so starting a conversation hid it. It is now a tappable strip pinned above the mesh timeline whenever unexpired notes exist at this place (opens the notices geo tab); the nearby-notes counter runs for the whole mesh timeline, not just the empty state. - Empty state narration drops "nobody in range yet..." (the radar and the sightings caption already say it) and the nearby-conversation hint moves below the help line instead of splitting the narration. Co-Authored-By: Claude Fable 5 * Radar means searching: hide the sweep once mesh peers are connected or reachable Co-Authored-By: Claude Fable 5 * Resolve leftover merge conflict markers from the main restack Co-Authored-By: Claude Fable 5 * Drop two Nostr helper constants resurrected by the restack merge (dead on main) Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Localizable.xcstrings | 180 +++++++++++++++++++ bitchat/Nostr/NostrRelayManager.swift | 68 ++++++- bitchat/Services/LocationNotesManager.swift | 56 +++++- bitchat/Services/TransportConfig.swift | 3 + bitchat/Views/NoticesView.swift | 14 +- bitchatTests/LocationNotesManagerTests.swift | 73 ++++++++ 6 files changed, 382 insertions(+), 12 deletions(-) diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index a5c93c76..6fb76002 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -46427,6 +46427,186 @@ } } }, + "location_notes.connecting_relays" : { + "comment" : "Status line while geo notes wait for a relay connection (e.g. Tor still bootstrapping)", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "جارٍ الاتصال بالمرحّلات…" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "রিলেতে সংযোগ হচ্ছে…" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "verbinde mit relays…" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "conectando a los relays…" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "kumokonekta sa mga relay…" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "connexion aux relais…" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מתחבר לממסרים…" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "रिले से कनेक्ट हो रहा है…" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "menghubungkan ke relay…" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "connessione ai relay…" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "リレーに接続中…" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "릴레이에 연결 중…" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "menyambung ke relay…" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "रिलेमा जडान हुँदैछ…" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "verbinden met relays…" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "łączenie z relay…" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "a ligar aos relés…" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "conectando aos relés…" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "подключение к релеям…" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "ansluter till reläer…" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "ரிலேயுடன் இணைக்கிறது…" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "กำลังเชื่อมต่อรีเลย์…" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "relay'lere bağlanılıyor…" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "підключення до релеїв…" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "ریلے سے منسلک ہو رہا ہے…" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "đang kết nối đến relay…" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在连接中继…" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在連接中繼…" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "connecting to relays…" + } + } + } + }, "location_notes.description" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Nostr/NostrRelayManager.swift b/bitchat/Nostr/NostrRelayManager.swift index 004ba5f3..63583cc7 100644 --- a/bitchat/Nostr/NostrRelayManager.swift +++ b/bitchat/Nostr/NostrRelayManager.swift @@ -183,11 +183,26 @@ final class NostrRelayManager: ObservableObject { } private var subscriptionRequestState: [String: SubscriptionRequestState] = [:] - // Track EOSE per subscription to signal when initial stored events are done + // Track EOSE per subscription to signal when initial stored events are + // done. Completion is scoped to relays the REQ actually reached: targets + // still mid-connect must not hold the callback hostage until the fallback + // timer (a dead relay of five used to pin "loading" for the full 10s). private struct EOSETracker { - var pendingRelays: Set + /// Targets the REQ has not been delivered to yet (still connecting). + var awaitingSend: Set + /// Relays that received the REQ and have not sent EOSE yet. + var awaitingEOSE: Set + /// True once any relay received the REQ (or answered with EOSE) — + /// completion with zero sends would mean "done" without ever asking. + var didSend = false var callback: () -> Void let epoch: Int + + /// Done when every relay that got the REQ has resolved, provided at + /// least one did — or when every target dropped out entirely. + var isComplete: Bool { + (didSend && awaitingEOSE.isEmpty) || (awaitingSend.isEmpty && awaitingEOSE.isEmpty) + } } private var eoseTrackers: [String: EOSETracker] = [:] private var eoseTrackerEpoch = 0 @@ -793,7 +808,7 @@ final class NostrRelayManager: ObservableObject { private func startEOSETracking(id: String, relayURLs: Set, callback: @escaping () -> Void) { eoseTrackerEpoch += 1 let epoch = eoseTrackerEpoch - eoseTrackers[id] = EOSETracker(pendingRelays: relayURLs, callback: callback, epoch: epoch) + eoseTrackers[id] = EOSETracker(awaitingSend: relayURLs, awaitingEOSE: [], callback: callback, epoch: epoch) // Fallback timeout to avoid hanging if a relay never sends EOSE. dependencies.scheduleAfter(TransportConfig.nostrSubscriptionEOSEFallbackSeconds) { [weak self] in Task { @MainActor [weak self] in @@ -933,8 +948,19 @@ final class NostrRelayManager: ObservableObject { toSend[id] = state.messageString } for (id, messageString) in toSend { - if self.subscriptions[relayUrl]?.contains(id) == true { continue } + if self.subscriptions[relayUrl]?.contains(id) == true { + // Already subscribed on this relay (e.g. a tracker promoted + // after an earlier flush): its EOSE is coming, count it. + markEOSESubscribed(id: id, relayUrl: relayUrl) + continue + } startPendingEOSETrackingIfNeeded(id: id) + // Mark at send *initiation*, not in the async completion: a fast + // relay's EOSE could otherwise complete the tracker while this + // relay — REQ already on the wire — still sat in awaitingSend. + // If the send fails the socket is going down with it, and the + // disconnect settle (or the fallback timer) releases the wait. + markEOSESubscribed(id: id, relayUrl: relayUrl) connection.send(.string(messageString)) { [weak self, weak connection] error in Task { @MainActor [weak self] in guard let self else { return } @@ -1016,8 +1042,12 @@ final class NostrRelayManager: ObservableObject { } case .eose(let subId): if var tracker = eoseTrackers[subId] { - tracker.pendingRelays.remove(relayUrl) - if tracker.pendingRelays.isEmpty { + // An EOSE proves the relay received the REQ even if the local + // send completion hasn't run yet. + tracker.awaitingSend.remove(relayUrl) + tracker.awaitingEOSE.remove(relayUrl) + tracker.didSend = true + if tracker.isComplete { eoseTrackers.removeValue(forKey: subId) tracker.callback() } else { @@ -1097,9 +1127,11 @@ final class NostrRelayManager: ObservableObject { /// callbacks; treat it as done and let the remaining relays (or the /// fallback timeout) drive completion. private func settleEOSETrackers(droppingRelay relayUrl: String) { - for (id, var tracker) in eoseTrackers where tracker.pendingRelays.contains(relayUrl) { - tracker.pendingRelays.remove(relayUrl) - if tracker.pendingRelays.isEmpty { + for (id, var tracker) in eoseTrackers + where tracker.awaitingSend.contains(relayUrl) || tracker.awaitingEOSE.contains(relayUrl) { + tracker.awaitingSend.remove(relayUrl) + tracker.awaitingEOSE.remove(relayUrl) + if tracker.isComplete { eoseTrackers.removeValue(forKey: id) tracker.callback() } else { @@ -1108,6 +1140,24 @@ final class NostrRelayManager: ObservableObject { } } + /// Whether any of `relayUrls` currently holds a live connection. Lets + /// subscribers distinguish "loaded, empty" from "never reached a relay" + /// when an EOSE fallback fires. + func isAnyRelayConnected(among relayUrls: [String]) -> Bool { + let targets = Set(relayUrls) + return relays.contains { targets.contains($0.url) && $0.isConnected } + } + + /// Marks the REQ as delivered to `relayUrl`: EOSE completion now waits on + /// this relay instead of the never-connected remainder. + private func markEOSESubscribed(id: String, relayUrl: String) { + guard var tracker = eoseTrackers[id], + tracker.awaitingSend.remove(relayUrl) != nil else { return } + tracker.awaitingEOSE.insert(relayUrl) + tracker.didSend = true + eoseTrackers[id] = tracker + } + private func handleDisconnection(relayUrl: String, error: Error) { connections.removeValue(forKey: relayUrl) subscriptions.removeValue(forKey: relayUrl) diff --git a/bitchat/Services/LocationNotesManager.swift b/bitchat/Services/LocationNotesManager.swift index 4b5577a1..a85a32bc 100644 --- a/bitchat/Services/LocationNotesManager.swift +++ b/bitchat/Services/LocationNotesManager.swift @@ -17,6 +17,10 @@ struct LocationNotesDependencies { var now: () -> Date // Fires when the geo relay directory refreshes; used to retry after "no relays". var relayDirectoryUpdates: AnyPublisher = Empty(completeImmediately: false).eraseToAnyPublisher() + /// Whether any of the target relays has a live connection — distinguishes + /// "loaded, empty" from "still connecting (Tor warming up)" when EOSE + /// fires without data. Defaults to true so tests keep legacy behavior. + var anyRelayConnected: @MainActor (_ relayUrls: [String]) -> Bool = { _ in true } private static let idBridge = NostrIdentityBridge() @@ -46,7 +50,10 @@ struct LocationNotesDependencies { relayDirectoryUpdates: NotificationCenter.default .publisher(for: .geoRelayDirectoryDidRefresh) .map { _ in () } - .eraseToAnyPublisher() + .eraseToAnyPublisher(), + anyRelayConnected: { relayUrls in + NostrRelayManager.shared.isAnyRelayConnected(among: relayUrls) + } ) } @@ -57,6 +64,10 @@ final class LocationNotesManager: ObservableObject { enum State: Equatable { case idle case loading + /// The initial fetch timed out with zero target relays connected + /// (usually Tor still bootstrapping): not "empty", just not there + /// yet. Retries automatically once a relay comes up. + case connecting case ready case noRelays } @@ -115,6 +126,7 @@ final class LocationNotesManager: ObservableObject { private var noteIDs = Set() // O(1) duplicate detection private var directoryUpdateCancellable: AnyCancellable? private var expiryPruneTimer: Timer? + private var connectivityRetryTimer: Timer? private let dependencies: LocationNotesDependencies private let maxNotesInMemory = 500 // Defensive cap (relay limit is 200) @@ -160,6 +172,7 @@ final class LocationNotesManager: ObservableObject { deinit { expiryPruneTimer?.invalidate() + connectivityRetryTimer?.invalidate() } /// Drops notes whose NIP-40 expiry has passed. Their ids stay in @@ -220,6 +233,8 @@ final class LocationNotesManager: ObservableObject { private func subscribe() { state = .loading errorMessage = nil + connectivityRetryTimer?.invalidate() + connectivityRetryTimer = nil if let sub = subscriptionID { dependencies.unsubscribe(sub) subscriptionID = nil @@ -270,12 +285,47 @@ final class LocationNotesManager: ObservableObject { }, { [weak self] in guard let self = self else { return } self.initialLoadComplete = true - if self.state != .noRelays { + guard self.state != .noRelays else { return } + // EOSE with no data and zero connected target relays means the + // 10s fallback fired while Tor was still warming up — showing + // "no notes" would be a lie. Wait visibly and retry. + if self.notes.isEmpty, !self.dependencies.anyRelayConnected(relays) { + self.state = .connecting + self.scheduleConnectivityRetry(relays: relays) + } else { self.state = .ready } }) } + /// While `.connecting`, poll for a live target relay and re-subscribe as + /// soon as one appears (fresh REQ, fresh EOSE tracking). The poll dies + /// with the state: any subscribe/cancel invalidates it. + private func scheduleConnectivityRetry(relays: [String]) { + connectivityRetryTimer?.invalidate() + connectivityRetryTimer = Timer.scheduledTimer( + withTimeInterval: TransportConfig.uiGeoNotesConnectivityRetrySeconds, + repeats: true + ) { [weak self] _ in + Task { @MainActor [weak self] in + self?.retryIfRelaysAvailable(relays: relays) + } + } + } + + func retryIfRelaysAvailable(relays: [String]) { + guard state == .connecting else { + connectivityRetryTimer?.invalidate() + connectivityRetryTimer = nil + return + } + guard dependencies.anyRelayConnected(relays) else { return } + connectivityRetryTimer?.invalidate() + connectivityRetryTimer = nil + SecureLogger.debug("LocationNotesManager: relay came up, retrying notes fetch for \(geohash)", category: .session) + refresh() + } + /// Send a location note for the current geohash using the per-geohash /// identity, optionally expiring via NIP-40 (dead drops pass 24h; the /// composer's ∞ option passes nil) and optionally tagged urgent. @@ -410,6 +460,8 @@ final class LocationNotesManager: ObservableObject { dependencies.unsubscribe(sub) subscriptionID = nil } + connectivityRetryTimer?.invalidate() + connectivityRetryTimer = nil state = .idle errorMessage = nil } diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index b86791be..ac42aa9f 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -180,6 +180,9 @@ enum TransportConfig { static let uiArchivedEchoLoadDelaySeconds: TimeInterval = 1.5 // Dead drops: location notes left via /drop expire after this long. static let locationDropExpirySeconds: TimeInterval = 24 * 60 * 60 + // Poll cadence while geo notes wait for a relay connection (Tor warming + // up); re-subscribes as soon as one comes up. + static let uiGeoNotesConnectivityRetrySeconds: TimeInterval = 3.0 // Message deduplication static let messageDedupMaxAgeSeconds: TimeInterval = 300 diff --git a/bitchat/Views/NoticesView.swift b/bitchat/Views/NoticesView.swift index a4ad3522..7f133709 100644 --- a/bitchat/Views/NoticesView.swift +++ b/bitchat/Views/NoticesView.swift @@ -126,6 +126,7 @@ struct NoticesView: View { static let locationUnavailable = String(localized: "content.notes.location_unavailable", comment: "Shown when the device location is unavailable for geo notices") static let enableLocation = String(localized: "content.location.enable", comment: "Button enabling location for geo notices") static let loadingNotes: LocalizedStringKey = "location_notes.loading_notes" + static let connectingRelays: LocalizedStringKey = "location_notes.connecting_relays" static let noRelaysNearby: LocalizedStringKey = "location_notes.no_relays_nearby" static let relaysRetryHint: LocalizedStringKey = "location_notes.relays_retry_hint" static let retry: LocalizedStringKey = "location_notes.action.retry" @@ -476,7 +477,9 @@ private struct NoticesList: View { /// once the sources settled. private var showEmptyState: Bool { guard let notesManager else { return true } - return notesManager.initialLoadComplete && notesManager.state != .loading + return notesManager.initialLoadComplete + && notesManager.state != .loading + && notesManager.state != .connecting } @ViewBuilder @@ -491,6 +494,15 @@ private struct NoticesList: View { Spacer() } .padding(.vertical, 8) + } else if notesManager.state == .connecting { + HStack(spacing: 10) { + ProgressView() + Text(Strings.connectingRelays) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + Spacer() + } + .padding(.vertical, 8) } else if notesManager.state == .noRelays { VStack(alignment: .leading, spacing: 4) { Text(Strings.noRelaysNearby) diff --git a/bitchatTests/LocationNotesManagerTests.swift b/bitchatTests/LocationNotesManagerTests.swift index 896aca28..80b8713d 100644 --- a/bitchatTests/LocationNotesManagerTests.swift +++ b/bitchatTests/LocationNotesManagerTests.swift @@ -336,6 +336,79 @@ struct LocationNotesManagerTests { #expect(manager.notes.isEmpty) } + @Test + func eoseWithoutConnectedRelays_showsConnectingInsteadOfEmpty() { + var storedEOSE: (() -> Void)? + var deps = LocationNotesDependencies( + relayLookup: { _, _ in ["wss://relay.one"] }, + subscribe: { _, _, _, _, eose in storedEOSE = eose }, + unsubscribe: { _ in }, + sendEvent: { _, _ in }, + deriveIdentity: { _ in throw TestError.shouldNotDerive }, + now: { Date() } + ) + deps.anyRelayConnected = { _ in false } + + let manager = LocationNotesManager(geohash: "u4pruydq", dependencies: deps) + storedEOSE?() + + #expect(manager.state == .connecting) + #expect(manager.initialLoadComplete) + } + + @Test + func eoseWithConnectedRelayAndNoNotes_isReadyEmpty() { + var storedEOSE: (() -> Void)? + var deps = LocationNotesDependencies( + relayLookup: { _, _ in ["wss://relay.one"] }, + subscribe: { _, _, _, _, eose in storedEOSE = eose }, + unsubscribe: { _ in }, + sendEvent: { _, _ in }, + deriveIdentity: { _ in throw TestError.shouldNotDerive }, + now: { Date() } + ) + deps.anyRelayConnected = { _ in true } + + let manager = LocationNotesManager(geohash: "u4pruydq", dependencies: deps) + storedEOSE?() + + #expect(manager.state == .ready) + } + + @Test + func connectingState_retriesOnceARelayComesUp() { + var storedEOSE: (() -> Void)? + var subscribeCount = 0 + var relayUp = false + var deps = LocationNotesDependencies( + relayLookup: { _, _ in ["wss://relay.one"] }, + subscribe: { _, _, _, _, eose in + subscribeCount += 1 + storedEOSE = eose + }, + unsubscribe: { _ in }, + sendEvent: { _, _ in }, + deriveIdentity: { _ in throw TestError.shouldNotDerive }, + now: { Date() } + ) + deps.anyRelayConnected = { _ in relayUp } + + let manager = LocationNotesManager(geohash: "u4pruydq", dependencies: deps) + #expect(subscribeCount == 1) + storedEOSE?() + #expect(manager.state == .connecting) + + // Relay still down: no retry. + manager.retryIfRelaysAvailable(relays: ["wss://relay.one"]) + #expect(subscribeCount == 1) + + // Relay up: re-subscribes for a fresh initial fetch. + relayUp = true + manager.retryIfRelaysAvailable(relays: ["wss://relay.one"]) + #expect(subscribeCount == 2) + #expect(manager.state == .loading) + } + private enum TestError: Error { case shouldNotDerive } From d499c3e4158a296a07032c78e6a9d6fb8d80fa71 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 17:20:00 +0200 Subject: [PATCH 062/158] Isolate tests from the developer's real login keychain (#1413) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Isolate tests from the developer's real login keychain Every test run prompted for the login keychain password (repeatedly, since the xctest runner's code signature changes each build, so "Always Allow" can never stick) and silently deleted the developer's real Nostr identity via panic-mode tests. Two holes let tests reach the real keychain: - NostrIdentityBridge() defaulted to the real KeychainManager. Tests inject mocks, but app-side constructions with no injection point (LocationNotesManager's static bridge, GeohashPresenceService, BoardManager, AppRuntime) read the real chat.bitchat.nostr item when exercised under test. - clearAllAssociations() used raw SecItem* calls that bypassed the injected keychain entirely, so panicClearAllData tests wiped the real Nostr identity items on every run. Fix: centralize FavoritesPersistenceService's test-guarded in-memory default as KeychainManager.makeDefault() and use it for all default keychain parameters, and add deleteAll(service:) to KeychainManagerProtocol so clearAllAssociations() goes through the injected keychain like every other operation. Co-Authored-By: Claude Fable 5 * Share one in-memory test keychain per process (Codex P2) A fresh store per makeDefault() call diverges from production, where separate default-constructed bridges share chat.bitchat.nostr — BoardManager's publish and NIP-09 delete paths would derive different geohash identities under test. PreviewKeychainManager gains a lock since the shared instance is reached from arbitrary threads. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/AppRuntime.swift | 2 +- bitchat/Nostr/NostrIdentityBridge.swift | 29 ++--------- .../FavoritesPersistenceService.swift | 18 +------ bitchat/Services/KeychainManager.swift | 52 +++++++++++++++++++ .../PreviewKeychainManager.swift | 41 ++++++++++++--- bitchatTests/Mocks/MockKeychain.swift | 8 +++ .../SecureIdentityStateManagerTests.swift | 4 ++ .../KeychainManagerProtocol.swift | 2 + .../BitFoundationTests/MockKeychain.swift | 8 +++ 9 files changed, 115 insertions(+), 49 deletions(-) diff --git a/bitchat/App/AppRuntime.swift b/bitchat/App/AppRuntime.swift index 81f2995b..abd1e49f 100644 --- a/bitchat/App/AppRuntime.swift +++ b/bitchat/App/AppRuntime.swift @@ -40,7 +40,7 @@ final class AppRuntime: ObservableObject { #endif init( - keychain: KeychainManagerProtocol = KeychainManager(), + keychain: KeychainManagerProtocol = KeychainManager.makeDefault(), idBridge: NostrIdentityBridge = NostrIdentityBridge() ) { self.idBridge = idBridge diff --git a/bitchat/Nostr/NostrIdentityBridge.swift b/bitchat/Nostr/NostrIdentityBridge.swift index ab0c89db..c91ffc42 100644 --- a/bitchat/Nostr/NostrIdentityBridge.swift +++ b/bitchat/Nostr/NostrIdentityBridge.swift @@ -15,7 +15,7 @@ final class NostrIdentityBridge { private let keychain: KeychainManagerProtocol - init(keychain: KeychainManagerProtocol = KeychainManager()) { + init(keychain: KeychainManagerProtocol = KeychainManager.makeDefault()) { self.keychain = keychain } @@ -49,29 +49,10 @@ final class NostrIdentityBridge { /// Clear all Nostr identity associations and current identity func clearAllAssociations() { - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrService as String: keychainService, - kSecMatchLimit as String: kSecMatchLimitAll, - kSecReturnAttributes as String: true - ] - - var result: AnyObject? - let status = SecItemCopyMatching(query as CFDictionary, &result) - if status == errSecSuccess, let items = result as? [[String: Any]] { - for item in items { - var deleteQuery: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrService as String: keychainService - ] - if let account = item[kSecAttrAccount as String] as? String { - deleteQuery[kSecAttrAccount as String] = account - } - SecItemDelete(deleteQuery as CFDictionary) - } - } else if status == errSecItemNotFound { - // nothing persisted; no action needed - } + // Must go through the injected keychain, not raw SecItem calls: + // under test that keychain is in-memory, and a direct delete here + // would wipe the developer's real Nostr identity on every test run. + keychain.deleteAll(service: keychainService) deviceSeedCache = nil // Also drop the in-memory derived per-geohash identities. These hold the diff --git a/bitchat/Services/FavoritesPersistenceService.swift b/bitchat/Services/FavoritesPersistenceService.swift index aa045841..84abe5d3 100644 --- a/bitchat/Services/FavoritesPersistenceService.swift +++ b/bitchat/Services/FavoritesPersistenceService.swift @@ -34,23 +34,7 @@ final class FavoritesPersistenceService: ObservableObject { static let shared = FavoritesPersistenceService() - /// Default keychain for the `shared` singleton. Under test this is an - /// in-memory keychain so touching `shared` never blocks on securityd - /// (`SecItemCopyMatching` can hang in test environments) and never reads - /// or writes the developer's real keychain. Production behavior is - /// unchanged. Tests that need their own instance keep injecting a mock - /// via `init(keychain:)`. - private nonisolated static func makeDefaultKeychain() -> KeychainManagerProtocol { - // PreviewKeychainManager lives in _PreviewHelpers, a development - // asset excluded from archive builds — release code must not - // reference it. Tests always run Debug, so the guard is lossless. - #if DEBUG - if TestEnvironment.isRunningTests { return PreviewKeychainManager() } - #endif - return KeychainManager() - } - - init(keychain: KeychainManagerProtocol = FavoritesPersistenceService.makeDefaultKeychain()) { + init(keychain: KeychainManagerProtocol = KeychainManager.makeDefault()) { self.keychain = keychain loadFavorites() diff --git a/bitchat/Services/KeychainManager.swift b/bitchat/Services/KeychainManager.swift index 39035547..cbd61f18 100644 --- a/bitchat/Services/KeychainManager.swift +++ b/bitchat/Services/KeychainManager.swift @@ -12,6 +12,32 @@ import Foundation import Security final class KeychainManager: KeychainManagerProtocol { + /// Default keychain for components that construct their own rather than + /// having one injected. Under test this is an in-memory keychain: the + /// xctest runner's code signature changes every build, so any read of a + /// real login-keychain item triggers a macOS password prompt that + /// "Always Allow" can never satisfy — and tests must never read or + /// mutate the developer's real keychain (`SecItemCopyMatching` can also + /// hang in test environments). Production behavior is unchanged. + static func makeDefault() -> KeychainManagerProtocol { + // PreviewKeychainManager lives in _PreviewHelpers, a development + // asset excluded from archive builds — release code must not + // reference it. Tests always run Debug, so the guard is lossless. + #if DEBUG + if TestEnvironment.isRunningTests { return sharedTestKeychain } + #endif + return KeychainManager() + } + + #if DEBUG + /// One store per process, mirroring the real keychain: separate + /// default-constructed components (e.g. two NostrIdentityBridge + /// instances in BoardManager's publish and delete paths) must see each + /// other's writes, or they would derive different Nostr identities + /// under test. + private static let sharedTestKeychain = PreviewKeychainManager() + #endif + // Use consistent service name for all keychain items private let service = BitchatApp.bundleID private let appGroup = "group.\(BitchatApp.bundleID)" @@ -540,4 +566,30 @@ final class KeychainManager: KeychainManagerProtocol { SecItemDelete(query as CFDictionary) } + + /// Delete every item stored under a custom service + func deleteAll(service customService: String) { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: customService, + kSecMatchLimit as String: kSecMatchLimitAll, + kSecReturnAttributes as String: true + ] + + var result: AnyObject? + let status = SecItemCopyMatching(query as CFDictionary, &result) + guard status == errSecSuccess, let items = result as? [[String: Any]] else { + return + } + for item in items { + var deleteQuery: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: customService + ] + if let account = item[kSecAttrAccount as String] as? String { + deleteQuery[kSecAttrAccount as String] = account + } + SecItemDelete(deleteQuery as CFDictionary) + } + } } diff --git a/bitchat/_PreviewHelpers/PreviewKeychainManager.swift b/bitchat/_PreviewHelpers/PreviewKeychainManager.swift index 49e63d3f..32827f48 100644 --- a/bitchat/_PreviewHelpers/PreviewKeychainManager.swift +++ b/bitchat/_PreviewHelpers/PreviewKeychainManager.swift @@ -10,25 +10,37 @@ import BitFoundation import Foundation final class PreviewKeychainManager: KeychainManagerProtocol { + // Locked: KeychainManager.makeDefault() hands one shared instance to + // every default-constructed component under test, which access it from + // arbitrary threads. + private let lock = NSLock() private var storage: [String: Data] = [:] private var serviceStorage: [String: [String: Data]] = [:] init() {} func saveIdentityKey(_ keyData: Data, forKey key: String) -> Bool { + lock.lock() + defer { lock.unlock() } storage[key] = keyData return true } func getIdentityKey(forKey key: String) -> Data? { - storage[key] + lock.lock() + defer { lock.unlock() } + return storage[key] } func deleteIdentityKey(forKey key: String) -> Bool { + lock.lock() + defer { lock.unlock() } storage.removeValue(forKey: key) return true } func deleteAllKeychainData() -> Bool { + lock.lock() + defer { lock.unlock() } storage.removeAll() serviceStorage.removeAll() return true @@ -39,11 +51,15 @@ final class PreviewKeychainManager: KeychainManagerProtocol { func secureClear(_ string: inout String) {} func verifyIdentityKeyExists() -> Bool { - storage["identity_noiseStaticKey"] != nil + lock.lock() + defer { lock.unlock() } + return storage["identity_noiseStaticKey"] != nil } // BCH-01-009: New methods with proper error classification func getIdentityKeyWithResult(forKey key: String) -> KeychainReadResult { + lock.lock() + defer { lock.unlock() } if let data = storage[key] { return .success(data) } @@ -51,6 +67,8 @@ final class PreviewKeychainManager: KeychainManagerProtocol { } func saveIdentityKeyWithResult(_ keyData: Data, forKey key: String) -> KeychainSaveResult { + lock.lock() + defer { lock.unlock() } storage[key] = keyData return .success } @@ -58,17 +76,26 @@ final class PreviewKeychainManager: KeychainManagerProtocol { // MARK: - Generic Data Storage (consolidated from KeychainHelper) func save(key: String, data: Data, service: String, accessible: CFString?) { - if serviceStorage[service] == nil { - serviceStorage[service] = [:] - } - serviceStorage[service]?[key] = data + lock.lock() + defer { lock.unlock() } + serviceStorage[service, default: [:]][key] = data } func load(key: String, service: String) -> Data? { - serviceStorage[service]?[key] + lock.lock() + defer { lock.unlock() } + return serviceStorage[service]?[key] } func delete(key: String, service: String) { + lock.lock() + defer { lock.unlock() } serviceStorage[service]?.removeValue(forKey: key) } + + func deleteAll(service: String) { + lock.lock() + defer { lock.unlock() } + serviceStorage.removeValue(forKey: service) + } } diff --git a/bitchatTests/Mocks/MockKeychain.swift b/bitchatTests/Mocks/MockKeychain.swift index 2c8d7c32..cb974bae 100644 --- a/bitchatTests/Mocks/MockKeychain.swift +++ b/bitchatTests/Mocks/MockKeychain.swift @@ -85,6 +85,10 @@ final class MockKeychain: KeychainManagerProtocol { func delete(key: String, service: String) { serviceStorage[service]?.removeValue(forKey: key) } + + func deleteAll(service: String) { + serviceStorage.removeValue(forKey: service) + } } /// Typealias for backwards compatibility with tests using MockKeychainHelper @@ -198,4 +202,8 @@ final class TrackingMockKeychain: KeychainManagerProtocol { func delete(key: String, service: String) { serviceStorage[service]?.removeValue(forKey: key) } + + func deleteAll(service: String) { + serviceStorage.removeValue(forKey: service) + } } diff --git a/bitchatTests/Services/SecureIdentityStateManagerTests.swift b/bitchatTests/Services/SecureIdentityStateManagerTests.swift index 27e57fdf..a280d02e 100644 --- a/bitchatTests/Services/SecureIdentityStateManagerTests.swift +++ b/bitchatTests/Services/SecureIdentityStateManagerTests.swift @@ -496,4 +496,8 @@ private final class FailingCacheSaveKeychain: KeychainManagerProtocol { func delete(key: String, service: String) { serviceStorage[service]?.removeValue(forKey: key) } + + func deleteAll(service: String) { + serviceStorage.removeValue(forKey: service) + } } diff --git a/localPackages/BitFoundation/Sources/BitFoundation/KeychainManagerProtocol.swift b/localPackages/BitFoundation/Sources/BitFoundation/KeychainManagerProtocol.swift index ea78288e..5a7ec448 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/KeychainManagerProtocol.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/KeychainManagerProtocol.swift @@ -34,6 +34,8 @@ public protocol KeychainManagerProtocol { func load(key: String, service: String) -> Data? /// Delete data from a custom service func delete(key: String, service: String) + /// Delete every item stored under a custom service + func deleteAll(service: String) } // MARK: - Keychain Error Types diff --git a/localPackages/BitFoundation/Tests/BitFoundationTests/MockKeychain.swift b/localPackages/BitFoundation/Tests/BitFoundationTests/MockKeychain.swift index 5d4071ec..870911ce 100644 --- a/localPackages/BitFoundation/Tests/BitFoundationTests/MockKeychain.swift +++ b/localPackages/BitFoundation/Tests/BitFoundationTests/MockKeychain.swift @@ -85,6 +85,10 @@ final class MockKeychain: KeychainManagerProtocol { func delete(key: String, service: String) { serviceStorage[service]?.removeValue(forKey: key) } + + func deleteAll(service: String) { + serviceStorage.removeValue(forKey: service) + } } /// Typealias for backwards compatibility with tests using MockKeychainHelper @@ -198,4 +202,8 @@ final class TrackingMockKeychain: KeychainManagerProtocol { func delete(key: String, service: String) { serviceStorage[service]?.removeValue(forKey: key) } + + func deleteAll(service: String) { + serviceStorage.removeValue(forKey: service) + } } From 020de9651956f01391ca0ede5316e3ddfcf0e776 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 21:45:38 +0200 Subject: [PATCH 063/158] Mesh bridging: stitch nearby mesh islands over the internet, courier drops, unified settings (#1412) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Mesh bridging: stitch nearby mesh islands over Nostr, courier drops, settings surface Three features plus a UI consolidation, all opt-in behind a new Bridge toggle: Channel bridge: while bridging, outgoing public mesh messages are also signed (with a derived, unlinkable per-cell Nostr identity) as kind-20000 events tagged #r with the local geohash-6 cell and published to the cell's deterministic geo relays; mesh-only peers deposit via new toBridge/fromBridge carrier directions through a bridge gateway (bridge + gateway toggles). Remote islands' events render into the mesh timeline marked with a network glyph. Events carry the original mesh message ID so the store's insert-by-ID absorbs radio/bridge duplicates in either order. Loop prevention mirrors GatewayService (three BoundedIDSet caches + skip-if-seen-locally + budgets). Nothing crosses a bridge unless its author signed it for the bridge; a per-message "nearby only" composer toggle keeps a message radio-only. Courier over the bridge: sealed courier envelopes park on default relays as kind-1401 drops tagged #x with their day-rotating recipient tag (NIP-40 expiry), signed by per-drop throwaway keys. Recipients subscribe for their own candidate tags; bridge gateways watch verified local peers' tags and hand matching drops over as directed courier packets. DM delivery to known peers stops requiring a physical courier encounter; the Noise-X seal never opens in transit. Presence: kind-20001 heartbeats on the rendezvous feed a "people across the bridge" count in the header (approximate: local participants subtracted by radio-copy attribution). Settings/Info: AppInfoView is now a segmented Settings/Info sheet. Settings hosts appearance, voice (fixes the duplicated Voice section), a Connectivity section (bridge + gateway + Tor toggles, the latter two moved out of the location sheet), and a confirmed panic-wipe button. New announce TLV 0x06 advertises the gateway's rendezvous cell; PeerCapabilities gains .bridge. i18n: 23 new keys across all 29 locales; coverage tests green. Tests: 50 new app tests + 3 BitFoundation tests; full suite 1445 green. Co-Authored-By: Claude Fable 5 * Settings polish: one toggle style, sticky Info-first tab, location access in Settings - The live-voice toggle now uses the same settings card + IRC pill as the connectivity toggles (settingToggle, renamed from connectivityToggle). - Segmented control orders Info first; the selected pane persists across opens (AppStorage), so first-ever open lands on Info and afterwards the sheet reopens where it was left. - "remove location access" moved from the channels sheet into the Settings Connectivity section (same key, still deep-links to system settings). Co-Authored-By: Claude Fable 5 * Location UX + copy: state-aware access control, honest empty state, clearer bridge/gateway text - Settings' location control now covers all three permission states: grant (real prompt, only possible while never-asked), open-system-settings when denied, remove-access when granted. The channels sheet keeps its own grant path for people who start there. - The channels list no longer spins forever without permission; it shows "grant location access to find nearby channels" instead (new key, 29 locales). - Bridge and gateway subtitles rewritten for clarity; the gateway subtitle moved to a new key since it now carries bridge traffic, and the old geohash-only key is deleted. The word "user" is banned from copy in every locale ("this person is blocked"). Co-Authored-By: Claude Fable 5 * Field-test fixes: dedupe relay-connectivity triggers, throttle presence, log bridge decisions First on-device run confirmed publishes accepted and the subscription delivering, but exposed trigger spam: NostrRelayManager's isConnected re-emits per relay recompute, so presence published 5x/second and the courier-drop subscription rebuilt 6x in 300ms. removeDuplicates() on the sinks + a 30s presence throttle (same-second heartbeats are byte-identical events anyway). Also: injection/skip/downlink now log under 🌉 so field verification is observable — the first test looked silent precisely because dedup correctly suppressed same-island bridged copies. Co-Authored-By: Claude Fable 5 * Fix restart self-echo: recognize own rendezvous events by derived pubkey Second field run proved bidirectional bridging live (~1-2s Mac<->iPhone via Tor) but caught a bug: relay backfill after an app relaunch re-delivered the device's own pre-restart events, and with the in-memory published-ID cache wiped they rendered as bridged copies of your own messages. The rendezvous identity is deterministically derived per cell, so self-recognition by pubkey needs no cache and survives restarts; own events are also marked never-downlink. Regression test simulates the fresh-launch state. Co-Authored-By: Claude Fable 5 * People sheet: mesh, bridge, and groups in one list The header's bridged count had no matching faces anywhere — the people sheet only knew mesh peers. BridgeService now publishes named participants (nickname from message tags, geohash-style #last4 disambiguation, presence keeps a known name alive) and the mesh people sheet gains an "across the bridge" section between mesh peers and groups. Display-only rows in v1 (bridged identities have no DM route yet). Two new catalog keys x29 locales; also normalizes one out-of-sort-order entry inherited from a hand-edited key on main. Co-Authored-By: Claude Fable 5 * Header: one people icon, one count, one sheet Fold the bridged-people count into the main person.2.fill count instead of a second network-glyph counter; the merged people sheet (mesh / across the bridge / groups) is the breakdown. VoiceOver still announces how many of the total are across the bridge. Co-Authored-By: Claude Fable 5 * People sheet symmetry: #mesh section header, no active count Every section now gets the same glyph+label header shape (shared PeopleSectionHeader): #mesh over the peer list, across-the-bridge over bridged people. The "N active" line is gone (mesh); location channels keep their geohash subtitle. Dead subtitle/count helpers removed. Co-Authored-By: Claude Fable 5 * One switch: the bridge toggle drives all internet sharing Field feedback: two toggles (bridge + gateway) with an invisible dependency was a trap — bridged messages silently never reached mesh-only neighbors unless a second lever was found and flipped. Collapsed to a single switch that does the right thing for your situation: - Bridge ON + internet: your messages cross, you see the bridge, AND your device serves its island — accepts toBridge deposits, carries remote messages onto the radio, watches courier drops for verified local peers, advertises the cell, and runs the geohash-channel gateway. - Bridge ON, no internet: you ride whoever nearby is serving. - Bridge OFF: nothing of yours crosses; radio reception of bridged traffic stays passive and free. With every online bridger serving, downlink gets a 0.2-1.5s jittered holdoff + send-time suppression recheck so co-located gateways don't burn duplicate airtime (two-gateway test included). The internet-gateway card is gone from Settings (GatewayService now follows the bridge switch, with launch-time migration); its orphaned catalog keys deleted and the bridge subtitle broadened across all 29 locales. Also: MeshPeerList's empty state ("nobody around...") aligned to the section row rhythm. Co-Authored-By: Claude Fable 5 * Bridge pumps its own location; fix centered people sheet; stop drop-subscription churn Field session 3 found the bridge silently cell-less: it read availableChannels passively, which only flow while some other feature (channels sheet, location notes, geo sampling) happens to pump location — turn those off and the bridge never gets a rendezvous. BridgeService now requests a one-shot fix whenever it's enabled without a cell (and piggybacks one on the presence timer so moving devices migrate cells). Also from the session: the people sheet's scroll content hugged its widest child and got centered on iPhone when the list was empty — pinned to full width, leading. And the courier-drop subscription rebuilt every ~60s on verified announces despite an unchanged tag set — now resubscribes only when the tags actually change. (Also merges origin/main: keychain test isolation #1413.) Co-Authored-By: Claude Fable 5 * Fix launch race: bridge reacts to the permission callback, retries cell-less Field session 4: the launch-time location request ran before the CoreLocation authorization callback delivered, so refreshChannels() silently no-opped (it requires .authorized) and nothing ever retried — the bridge stayed cell-less all session. Three layers now close it: - a $permissionState sink re-enters refreshRendezvous the moment authorization resolves (the fast path), - the maintenance timer arms even without a cell and retries the full rendezvous refresh (the backstop; it previously required a cell, which made it useless for exactly this failure), - flipping the bridge switch while never-asked triggers the location prompt — that's the user-initiated moment for it. Co-Authored-By: Claude Fable 5 * People sheet: one header style for every section; bridged people visible while own bridge is off GroupChatList's header now uses the shared PeopleSectionHeader (glyph + label, same size/padding as #mesh and across-the-bridge; keeps its key and header trait). Bridge section and the header count are no longer gated on this device's own toggle: bridged people arrive over passive radio from a serving neighbor, and whoever is visible in the timeline belongs in the sheet and the count. Co-Authored-By: Claude Fable 5 * People sheet: equalize the first section's gap MeshPeerList's first row kept a legacy 10pt top bump from when nothing sat above it, and the outer VStack's 6pt inter-child spacing applied between the #mesh header and the list but not inside the other sections. Both gone: sections own their rhythm (header 12/4, rows 4), spacing 0 outside. Co-Authored-By: Claude Fable 5 * People sheet: rows drop their leading glyphs — the section header carries the type Mesh rows lose the per-state transport icon (connected/relayed/nostr/ offline), bridge rows the network glyph, group rows the person.3 icon. Trailing state badges (star, lock, verified, unread, blocked, crown) stay, and the row accessibility description still announces connection state, so VoiceOver loses nothing. Co-Authored-By: Claude Fable 5 * Remove dead code left behind by the Settings|Info consolidation Periphery (--strict) flagged five leftovers on this branch: - LocationChannelsModel.setGatewayEnabled: the standalone internet-gateway toggle is gone (the bridge switch drives internet sharing), so nothing calls it; the gatewayEnabled published property stays for the header dot. - AppInfoView Strings.Location title/enable/openSettings: the old Location section's header and permission buttons no longer exist. Their orphaned Localizable.xcstrings entries go with them (the gateway-toggle keys were already pruned). - BridgePeopleList's appTheme environment value was never read. The sixth CI finding (PrekeyBundleStore.StoredBundle.noiseKey assign-only) is a Periphery flake: the property is read in loadFromDisk, the finding didn't reproduce locally or on the next CI run of unchanged code. Co-Authored-By: Claude Fable 5 * People sheet: mesh rows get their transport glyph back The mesh section is the one heterogeneous list — the leading icon encodes HOW a peer is reachable (radio / relayed / nostr-only / offline), which the header can't say. Bridge and group rows stay glyph-free. Co-Authored-By: Claude Fable 5 * Fix courier drop skipped by stale BLE reachability; periodic deposit sweep Field test: a DM sent seconds after the recipient's radio vanished still saw them as "reachable" (60s verified retention), so canDeliverPromptly held, every deposit was skipped, and the message sat spooled with no retry path. MessageRouter now sweeps its outbox every 2 minutes and publishes bridge drops for messages whose recipient no transport can promptly reach; the drop layer's message-ID dedup makes the sweep idempotent. Regression test reproduces the exact field sequence. Co-Authored-By: Claude Fable 5 * Show "carried" when a message ships as a bridge drop Field feedback: dropped DMs delivered but the sender saw nothing — the drop path never fired onMessageCarried, and the recipient's delivery ack has no radio route back until the peers next share a transport. depositDrop now reports whether a fresh drop was sealed and the router marks the message carried (📦) on both the send path and the sweep; the ack still upgrades it to delivered whenever a route exists. Co-Authored-By: Claude Fable 5 * Fix locale word order: offline tag after name in DM header; localized "ago" The private-chat header rendered the localized offline word in the availability-glyph slot, before the name — "sin conexión bob". Offline now shows the same dimmed person glyph the mesh list uses, with the word as a small trailing tag after the name and lock, so it reads correctly in every locale. Full sweep of views found one more composition bug: notice timestamps glued English "ago" onto a localized duration; now the whole phrase comes from RelativeDateTimeFormatter (same as the "fades" label). Co-Authored-By: Claude Fable 5 * DM header offline state: icon only The availability slot now reads uniformly as a glyph (radio / relayed / globe / dimmed person), matching the mesh list; the text tag is gone. VoiceOver still announces "offline" via the glyph's accessibility label. Co-Authored-By: Claude Fable 5 * Offline glyph: slashed antenna instead of dimmed person Offline is now the visual negation of connected (same antenna glyph, slashed) in both the DM header and mesh list rows; a generic person icon didn't say "unreachable". Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/App/LocationChannelsModel.swift | 4 - bitchat/Localizable.xcstrings | 5404 ++++++++++++++--- bitchat/Nostr/NostrIdentityBridge.swift | 7 + bitchat/Nostr/NostrProtocol.swift | 82 + bitchat/Nostr/NostrRelayManager.swift | 23 + bitchat/Protocols/NostrCarrierPacket.swift | 8 + bitchat/Protocols/Packets.swift | 26 +- bitchat/Services/BLE/BLEPeerRegistry.swift | 17 +- bitchat/Services/BLE/BLEService.swift | 137 +- bitchat/Services/Courier/CourierStore.swift | 29 + bitchat/Services/Gateway/BoundedIDSet.swift | 35 + .../Gateway/BridgeCourierService.swift | 284 + bitchat/Services/Gateway/BridgeService.swift | 689 +++ bitchat/Services/Gateway/GatewayService.swift | 31 +- bitchat/Services/MessageRouter.swift | 52 + .../ViewModels/ChatOutgoingCoordinator.swift | 8 + .../ChatViewModelBootstrapper.swift | 231 +- bitchat/Views/AppInfoView.swift | 477 +- bitchat/Views/BridgePeopleList.swift | 76 + bitchat/Views/Components/IRCToggleStyle.swift | 34 + .../Views/Components/TextMessageView.swift | 9 + bitchat/Views/ContentComposerView.swift | 40 + bitchat/Views/ContentHeaderView.swift | 35 +- bitchat/Views/ContentSheetViews.swift | 89 +- bitchat/Views/ContentView.swift | 7 +- bitchat/Views/GroupChatList.swift | 17 +- bitchat/Views/LocationChannelsSheet.swift | 123 +- bitchat/Views/MeshPeerList.swift | 24 +- bitchat/Views/NoticesView.swift | 13 +- .../ChatOutgoingCoordinatorContextTests.swift | 5 + .../EndToEnd/CourierEndToEndTests.swift | 44 + .../Protocols/BridgeWireFormatTests.swift | 149 + .../Services/BridgeCourierServiceTests.swift | 284 + .../Services/BridgeServiceTests.swift | 594 ++ bitchatTests/ViewSmokeTests.swift | 4 +- .../BitFoundation/BitchatMessage.swift | 35 +- .../BitFoundation/PeerCapabilities.swift | 4 + .../Sources/BitFoundation/PeerID.swift | 15 + .../BitchatMessageBridgedFlagTests.swift | 57 + 39 files changed, 7925 insertions(+), 1277 deletions(-) create mode 100644 bitchat/Services/Gateway/BoundedIDSet.swift create mode 100644 bitchat/Services/Gateway/BridgeCourierService.swift create mode 100644 bitchat/Services/Gateway/BridgeService.swift create mode 100644 bitchat/Views/BridgePeopleList.swift create mode 100644 bitchat/Views/Components/IRCToggleStyle.swift create mode 100644 bitchatTests/Protocols/BridgeWireFormatTests.swift create mode 100644 bitchatTests/Services/BridgeCourierServiceTests.swift create mode 100644 bitchatTests/Services/BridgeServiceTests.swift create mode 100644 localPackages/BitFoundation/Tests/BitFoundationTests/BitchatMessageBridgedFlagTests.swift diff --git a/bitchat/App/LocationChannelsModel.swift b/bitchat/App/LocationChannelsModel.swift index 230e75a0..25cb2b9f 100644 --- a/bitchat/App/LocationChannelsModel.swift +++ b/bitchat/App/LocationChannelsModel.swift @@ -100,10 +100,6 @@ final class LocationChannelsModel: ObservableObject { network.setUserTorEnabled(enabled) } - func setGatewayEnabled(_ enabled: Bool) { - gateway.setEnabled(enabled) - } - func refreshMeshChannelsIfNeeded() { guard case .mesh = selectedChannel, permissionState == .authorized, diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 6fb76002..64067a7c 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -189,6 +189,7 @@ }, "%@ active" : { "comment" : "A label at the bottom of the people list sheet showing the number of active users.", + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -1261,6 +1262,364 @@ } } }, + "app_info.features.bridge.description" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يربط جزر mesh القريبة عبر الإنترنت حتى لا ينقسم الحشد الواحد بسبب مدى الراديو" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "কাছাকাছি মেশ দ্বীপগুলোকে ইন্টারনেটের মাধ্যমে যুক্ত করে, যাতে রেডিও পরিসরের কারণে একই ভিড় ভাগ না হয়" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "verbindet nahe mesh-inseln über das internet, damit eine menge nicht durch die funkreichweite geteilt wird" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "links nearby mesh islands through the internet so one crowd isn't split by radio range" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "une islas mesh cercanas a través de internet para que una multitud no quede dividida por el alcance de radio" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "iniuugnay ang mga kalapit na mesh island sa pamamagitan ng internet para hindi mahati ng saklaw ng radyo ang iisang grupo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "relie les îlots mesh voisins via internet pour qu'une même foule ne soit pas coupée par la portée radio" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מקשר איי mesh קרובים דרך האינטרנט כדי שקהל אחד לא יתפצל בגלל טווח הרדיו" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "आसपास के मेश द्वीपों को इंटरनेट से जोड़ता है ताकि एक ही भीड़ रेडियो दायरे से बँट न जाए" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "menghubungkan pulau-pulau mesh terdekat lewat internet agar satu kerumunan tidak terbelah oleh jangkauan radio" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "collega le isole mesh vicine tramite internet così una folla non viene divisa dalla portata radio" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "近くのmeshの島々をインターネットでつなぎ、電波範囲で人の輪が分断されないようにします" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "근처의 mesh 섬들을 인터넷으로 연결해 한 무리가 전파 범위 때문에 갈라지지 않게 합니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "menghubungkan pulau-pulau mesh berdekatan melalui internet supaya satu kumpulan tidak terpisah oleh jangkauan radio" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "नजिकका mesh टापुहरूलाई इन्टरनेटमार्फत जोड्छ ताकि एउटै भीड रेडियो पहुँचले नबाँडियोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "verbindt nabije mesh-eilanden via internet zodat één groep niet door radiobereik wordt gesplitst" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "łączy pobliskie wyspy mesh przez internet, aby jeden tłum nie był dzielony przez zasięg radiowy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "liga ilhas mesh próximas através da internet para que uma multidão não fique dividida pelo alcance de rádio" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "liga ilhas mesh próximas pela internet para que uma multidão não fique dividida pelo alcance de rádio" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "связывает соседние mesh-острова через интернет, чтобы одна толпа не делилась радиусом радиосвязи" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "länkar närliggande mesh-öar via internet så att en folkmassa inte delas av radioräckvidden" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அருகிலுள்ள mesh தீவுகளை இணையம் வழியாக இணைக்கிறது, ஒரே கூட்டம் ரேடியோ வரம்பால் பிரியாமல் இருக்க" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เชื่อมเกาะ mesh ที่อยู่ใกล้กันผ่านอินเทอร์เน็ต เพื่อให้ฝูงชนเดียวกันไม่ถูกแบ่งด้วยระยะวิทยุ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "yakındaki mesh adalarını internet üzerinden birbirine bağlar, böylece bir kalabalık telsiz menziliyle bölünmez" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "з'єднує сусідні mesh-острови через інтернет, щоб один натовп не ділився радіусом радіозв'язку" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "قریبی mesh جزیروں کو انٹرنیٹ کے ذریعے جوڑتا ہے تاکہ ایک ہجوم ریڈیو رینج سے تقسیم نہ ہو" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "liên kết các đảo mesh gần nhau qua internet để một đám đông không bị chia cắt bởi phạm vi sóng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过互联网连接附近的 mesh 孤岛,让同一群人不被无线电范围隔开" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "透過網際網路連接附近的 mesh 孤島,讓同一群人不被無線電範圍隔開" + } + } + } + }, + "app_info.features.bridge.title" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "جسور mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "মেশ ব্রিজিং" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh-bridging" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh bridging" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "puentes mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh bridging" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "pontage mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "גישור mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "मेश ब्रिजिंग" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "jembatan mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "bridging mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "meshブリッジング" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh 브리징" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "jambatan mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh ब्रिजिङ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh-bridging" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "mostkowanie mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "pontes mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "pontes mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh-мосты" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh-bryggning" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh பாலம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "การบริดจ์ mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh köprüleme" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh-мости" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh پل" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cầu nối mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh 桥接" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh 橋接" + } + } + } + }, "app_info.features.encryption.description" : { "extractionState" : "manual", "localizations" : { @@ -5021,6 +5380,185 @@ } } }, + "app_info.legend.bridged" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "وصلت الرسالة عبر جسر mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "বার্তাটি মেশ ব্রিজ পেরিয়ে এসেছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "nachricht kam über eine mesh-brücke an" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "message arrived across a mesh bridge" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "el mensaje llegó a través de un puente mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "dumating ang mensahe sa pamamagitan ng mesh bridge" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "message arrivé via un pont mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ההודעה הגיעה דרך גשר mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "संदेश मेश ब्रिज से होकर आया" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "pesan tiba lewat jembatan mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "messaggio arrivato attraverso un ponte mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "meshブリッジ経由で届いたメッセージ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh 브리지를 거쳐 도착한 메시지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "pesan tiba melalui jambatan mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सन्देश mesh पुल हुँदै आइपुग्यो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "bericht kwam via een mesh-brug binnen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "wiadomość dotarła przez most mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensagem chegou através de uma ponte mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensagem chegou por uma ponte mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "сообщение пришло через mesh-мост" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "meddelandet kom via en mesh-brygga" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "செய்தி mesh பாலம் வழியாக வந்தது" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ข้อความมาถึงผ่านบริดจ์ mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesaj bir mesh köprüsü üzerinden geldi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "повідомлення надійшло через mesh-міст" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "پیغام mesh پل کے ذریعے پہنچا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "tin nhắn đến qua cầu nối mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "消息经 mesh 桥接送达" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "訊息經 mesh 橋接送達" + } + } + } + }, "app_info.legend.encrypted" : { "comment" : "Legend entry for the lock glyph", "extractionState" : "manual", @@ -7181,186 +7719,6 @@ } } }, - "app_info.location.enable" : { - "comment" : "Button in app info requesting location permission", - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "تفعيل الوصول إلى الموقع" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "অবস্থান অ্যাক্সেস চালু করুন" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "standortzugriff aktivieren" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "enable location access" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "activar acceso a la ubicación" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "i-enable ang access sa lokasyon" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "activer l'accès à la localisation" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אפשר גישה למיקום" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "स्थान एक्सेस चालू करें" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "aktifkan akses lokasi" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "attiva accesso alla posizione" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "位置情報へのアクセスを有効にする" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "위치 접근 허용" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "aktifkan akses lokasi" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "स्थान पहुँच सक्षम गर्नुहोस्" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "locatietoegang inschakelen" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "włącz dostęp do lokalizacji" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "ativar acesso à localização" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "ativar acesso à localização" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "включить доступ к геолокации" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "aktivera platsåtkomst" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "இருப்பிட அணுகலை இயக்கவும்" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "เปิดการเข้าถึงตำแหน่งที่ตั้ง" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "konum erişimini etkinleştir" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "увімкнути доступ до місцезнаходження" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "مقام تک رسائی فعال کریں" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "bật quyền truy cập vị trí" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "启用位置权限" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "啟用位置權限" - } - } - } - }, "app_info.location.notes.description" : { "comment" : "Description of the location notes toggle in app info", "extractionState" : "manual", @@ -7721,366 +8079,6 @@ } } }, - "app_info.location.open_settings" : { - "comment" : "Button in app info when location permission was denied", - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "افتح إعدادات النظام للسماح بالموقع" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "অবস্থান অনুমতি দিতে সিস্টেম সেটিংস খুলুন" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "systemeinstellungen öffnen, um standort zu erlauben" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "open system settings to allow location" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "abre los ajustes del sistema para permitir la ubicación" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "buksan ang system settings para payagan ang lokasyon" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "ouvre les réglages système pour autoriser la localisation" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "פתח את הגדרות המערכת כדי לאפשר מיקום" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "स्थान की अनुमति देने के लिए सिस्टम सेटिंग्स खोलें" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "buka pengaturan sistem untuk mengizinkan lokasi" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "apri le impostazioni di sistema per consentire la posizione" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "システム設定を開いて位置情報を許可" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "시스템 설정을 열어 위치 허용" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "buka tetapan sistem untuk benarkan lokasi" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "स्थान अनुमति दिन प्रणाली सेटिङ खोल्नुहोस्" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "open systeeminstellingen om locatie toe te staan" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "otwórz ustawienia systemowe, aby zezwolić na lokalizację" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "abrir definições do sistema para permitir a localização" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "abrir os ajustes do sistema para permitir a localização" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "откройте настройки системы, чтобы разрешить геолокацию" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "öppna systeminställningar för att tillåta plats" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "இருப்பிடத்தை அனுமதிக்க கணினி அமைப்புகளைத் திறக்கவும்" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "เปิดการตั้งค่าระบบเพื่ออนุญาตตำแหน่งที่ตั้ง" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "konuma izin vermek için sistem ayarlarını aç" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "відкрийте системні налаштування, щоб дозволити місцезнаходження" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "مقام کی اجازت دینے کے لیے سسٹم سیٹنگز کھولیں" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "mở cài đặt hệ thống để cho phép vị trí" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "打开系统设置以允许位置访问" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "打開系統設定以允許位置存取" - } - } - } - }, - "app_info.location.title" : { - "comment" : "Section header for location settings in the app info sheet", - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "الموقع" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "অবস্থান" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "STANDORT" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "LOCATION" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "UBICACIÓN" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "LOKASYON" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "LOCALISATION" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מיקום" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "स्थान" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "LOKASI" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "POSIZIONE" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "位置情報" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "위치" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "LOKASI" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "स्थान" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "LOCATIE" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "LOKALIZACJA" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "LOCALIZAÇÃO" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "LOCALIZAÇÃO" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "ГЕОЛОКАЦИЯ" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "PLATS" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "இருப்பிடம்" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "ตำแหน่งที่ตั้ง" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "KONUM" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "МІСЦЕЗНАХОДЖЕННЯ" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "مقام" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "VỊ TRÍ" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "位置" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "位置" - } - } - } - }, "app_info.network.title" : { "comment" : "Section header for network diagnostics in the app info sheet", "extractionState" : "manual", @@ -10054,6 +10052,2333 @@ } } }, + "app_info.settings.bridge.cell" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "خلية اللقاء: %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "মিলনস্থল সেল: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "rendezvous-zelle: %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "rendezvous cell: %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "celda de encuentro: %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "rendezvous cell: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "cellule de rendez-vous : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "תא מפגש: %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "मिलन सेल: %@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "sel titik temu: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "cella di incontro: %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ランデブーセル: %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "랑데부 셀: %@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "sel titik temu: %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "भेट हुने सेल: %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "ontmoetingscel: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "komórka spotkania: %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "célula de encontro: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "célula de encontro: %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "ячейка встречи: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "mötescell: %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "சந்திப்பு செல்: %@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เซลล์นัดพบ: %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "buluşma hücresi: %@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "комірка зустрічі: %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "ملاقات سیل: %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ô hẹn gặp: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "会合单元:%@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "會合單元:%@" + } + } + } + }, + "app_info.settings.bridge.no_cell" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا توجد خلية لقاء بعد — يلزم صلاحية الموقع أو قرين جسر قريب" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "এখনও কোনো মিলনস্থল সেল নেই — লোকেশন অ্যাক্সেস বা কাছাকাছি একটি ব্রিজ পিয়ার দরকার" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "noch keine rendezvous-zelle — braucht standortzugriff oder einen brücken-peer in der nähe" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "no rendezvous cell yet — needs location access or a nearby bridge peer" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "aún no hay celda de encuentro — necesita acceso a la ubicación o un peer puente cercano" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "wala pang rendezvous cell — kailangan ng access sa lokasyon o kalapit na bridge peer" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "pas encore de cellule de rendez-vous — nécessite l'accès localisation ou un pair pont à proximité" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "עדיין אין תא מפגש — נדרשת גישת מיקום או עמית גשר קרוב" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "अभी कोई मिलन सेल नहीं — लोकेशन एक्सेस या आसपास का कोई ब्रिज पीयर चाहिए" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "belum ada sel titik temu — perlu akses lokasi atau peer jembatan terdekat" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "ancora nessuna cella di incontro — serve l'accesso alla posizione o un peer ponte vicino" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ランデブーセルはまだありません — 位置アクセスか近くのブリッジピアが必要です" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "아직 랑데부 셀이 없습니다 — 위치 접근 권한이나 근처의 브리지 피어가 필요합니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "belum ada sel titik temu — perlu capaian lokasi atau peer jambatan berdekatan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "अहिलेसम्म भेट हुने सेल छैन — स्थान पहुँच वा नजिकैको bridge peer चाहिन्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "nog geen ontmoetingscel — vereist toegang tot locatie of een brug-peer in de buurt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "nie ma jeszcze komórki spotkania — potrzebny dostęp do lokalizacji lub pobliski peer mostu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "ainda sem célula de encontro — precisa de acesso à localização ou de um par ponte próximo" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ainda sem célula de encontro — precisa de acesso à localização ou de um par ponte por perto" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "ячейки встречи пока нет — нужен доступ к локации или ближайший пир-мост" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "ingen mötescell ännu — kräver platsåtkomst eller en brygg-peer i närheten" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இன்னும் சந்திப்பு செல் இல்லை — இட அணுகல் அல்லது அருகிலுள்ள பாலம் peer தேவை" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ยังไม่มีเซลล์นัดพบ — ต้องมีสิทธิ์เข้าถึงตำแหน่งหรือเพียร์บริดจ์ที่อยู่ใกล้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "henüz buluşma hücresi yok — konum erişimi veya yakında bir köprü eşi gerekiyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "комірки зустрічі поки немає — потрібен доступ до локації або ближній пір-міст" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "ابھی کوئی ملاقات سیل نہیں — لوکیشن رسائی یا قریبی پل ہم منصب درکار ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "chưa có ô hẹn gặp — cần quyền truy cập vị trí hoặc một nút cầu nối gần đó" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "尚无会合单元 — 需要位置访问或附近有桥接同伴" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "尚無會合單元 — 需要位置存取權或附近有橋接同伴" + } + } + } + }, + "app_info.settings.bridge.subtitle" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يصل جزر mesh القريبة عبر الإنترنت: ما تقوله في قناة mesh يصل أيضًا إلى أشخاص في منطقتك خارج مدى الراديو، وتظهر رسائلهم هنا معلَّمة برمز الشبكة. ما دام لديك إنترنت، يحمل جهازك أيضًا حركة الجسر وقنوات الموقع للهواتف من حولك التي لا تملك اتصالًا." + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "কাছাকাছি মেশ দ্বীপগুলোকে ইন্টারনেটের মাধ্যমে যুক্ত করে: মেশ চ্যানেলে আপনি যা বলেন তা আপনার এলাকার রেডিও পরিসরের বাইরের মানুষের কাছেও পৌঁছায়, আর তাদের বার্তা নেটওয়ার্ক চিহ্নসহ এখানে দেখা যায়। আপনার ইন্টারনেট থাকাকালীন, আপনার ডিভাইস আশপাশের ইন্টারনেটবিহীন ফোনের জন্য ব্রিজ ও লোকেশন-চ্যানেলের ট্র্যাফিকও বহন করে।" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "verbindet nahe mesh-inseln über das internet: was du im mesh-kanal sagst, erreicht auch personen in deiner gegend außerhalb der funkreichweite, und ihre nachrichten erscheinen hier mit dem netzwerk-symbol markiert. solange du internet hast, trägt dein gerät auch brücken- und standortkanal-verkehr für handys um dich herum, die keins haben." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "joins nearby mesh islands over the internet: what you say in the mesh channel also reaches people in your area beyond radio range, and their messages appear here marked with the network glyph. while you have internet, your device also carries bridge and location-channel traffic for phones around you that have none." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "une islas mesh cercanas a través de internet: lo que dices en el canal mesh también llega a personas de tu zona fuera del alcance de radio, y sus mensajes aparecen aquí marcados con el símbolo de red. mientras tengas internet, tu dispositivo también lleva el tráfico del puente y de los canales de ubicación para teléfonos a tu alrededor que no tienen conexión." + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinagdurugtong ang mga kalapit na mesh island sa pamamagitan ng internet: ang sinasabi mo sa mesh channel ay umaabot din sa mga tao sa iyong lugar na lampas sa saklaw ng radyo, at lumalabas dito ang kanilang mga mensahe na may markang simbolo ng network. habang may internet ka, dinadala rin ng device mo ang trapiko ng bridge at ng mga channel ng lokasyon para sa mga teleponong nasa paligid mo na walang koneksyon." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "relie les îlots mesh voisins via internet : ce que tu dis dans le canal mesh atteint aussi les personnes de ta zone hors de portée radio, et leurs messages apparaissent ici marqués du symbole réseau. tant que tu as internet, ton appareil achemine aussi le trafic du pont et des canaux localisation pour les téléphones autour de toi qui n'en ont pas." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחבר איי mesh קרובים דרך האינטרנט: מה שאתה אומר בערוץ ה-mesh מגיע גם לאנשים באזורך מעבר לטווח הרדיו, וההודעות שלהם מופיעות כאן מסומנות בסמל הרשת. כל עוד יש לך אינטרנט, המכשיר שלך גם מעביר תעבורת גשר וערוצי מיקום עבור טלפונים סביבך שאין להם חיבור." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "आसपास के मेश द्वीपों को इंटरनेट से जोड़ता है: मेश चैनल में आप जो कहते हैं वह आपके क्षेत्र में रेडियो दायरे से बाहर के लोगों तक भी पहुँचता है, और उनके संदेश यहाँ नेटवर्क चिह्न के साथ दिखते हैं। जब तक आपके पास इंटरनेट है, आपका डिवाइस आसपास के बिना इंटरनेट वाले फोनों के लिए ब्रिज और लोकेशन-चैनल का ट्रैफ़िक भी पहुँचाता है।" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "menyatukan pulau-pulau mesh terdekat lewat internet: yang kamu katakan di kanal mesh juga sampai ke orang-orang di areamu di luar jangkauan radio, dan pesan mereka muncul di sini ditandai dengan simbol jaringan. selama kamu punya internet, perangkatmu juga membawa lalu lintas jembatan dan kanal lokasi untuk ponsel di sekitarmu yang tidak punya koneksi." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "unisce le isole mesh vicine tramite internet: ciò che dici nel canale mesh raggiunge anche persone della tua zona oltre la portata radio, e i loro messaggi appaiono qui contrassegnati con il simbolo di rete. finché hai internet, il tuo dispositivo trasporta anche il traffico del ponte e dei canali posizione per i telefoni intorno a te che non ne hanno." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "近くのmeshの島々をインターネットでつなぎます: meshチャンネルでの発言はエリア内の電波範囲外の人にも届き、相手のメッセージはネットワーク記号付きでここに表示されます。インターネットがある間は、あなたの端末が周囲の接続を持たない端末のためにブリッジとロケーションチャンネルの通信も運びます。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "근처의 mesh 섬들을 인터넷으로 연결합니다: mesh 채널에서 말한 내용이 이 지역의 전파 범위 밖 사람들에게도 전달되고, 그들의 메시지는 네트워크 기호가 붙어 여기에 표시됩니다. 인터넷이 있는 동안에는 내 기기가 주변의 연결이 없는 휴대폰을 위해 브리지와 위치 채널 트래픽도 전달합니다." + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "menyatukan pulau-pulau mesh berdekatan melalui internet: apa yang kamu katakan di kanal mesh juga sampai kepada orang di kawasanmu di luar jangkauan radio, dan pesan mereka muncul di sini ditanda dengan simbol rangkaian. selagi kamu ada internet, perantimu juga membawa trafik jambatan dan kanal lokasi untuk telefon di sekelilingmu yang tiada sambungan." + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "नजिकका mesh टापुहरूलाई इन्टरनेटमार्फत जोड्छ: mesh च्यानलमा तिमीले भनेको कुरा तिम्रो क्षेत्रमा रेडियो पहुँचभन्दा बाहिरका मानिससम्म पनि पुग्छ, र उनीहरूका सन्देश नेटवर्क चिन्हसहित यहाँ देखिन्छन्। तिमीसँग इन्टरनेट भएसम्म, तिम्रो यन्त्रले वरपरका इन्टरनेट नभएका फोनहरूका लागि पुल र स्थान-च्यानलको ट्राफिक पनि बोक्छ।" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "verbindt nabije mesh-eilanden via internet: wat je in het mesh-kanaal zegt bereikt ook mensen in jouw omgeving buiten radiobereik, en hun berichten verschijnen hier gemarkeerd met het netwerksymbool. zolang je internet hebt, draagt je apparaat ook brug- en locatiekanaalverkeer voor telefoons om je heen die geen verbinding hebben." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "łączy pobliskie wyspy mesh przez internet: to, co mówisz na kanale mesh, dociera też do osób w twojej okolicy poza zasięgiem radiowym, a ich wiadomości pojawiają się tutaj oznaczone symbolem sieci. dopóki masz internet, twoje urządzenie przenosi też ruch mostu i kanałów lokalizacji dla telefonów wokół ciebie, które go nie mają." + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "junta ilhas mesh próximas através da internet: o que dizes no canal mesh também chega a pessoas na tua zona fora do alcance de rádio, e as mensagens delas aparecem aqui marcadas com o símbolo de rede. enquanto tens internet, o teu dispositivo também transporta o tráfego da ponte e dos canais de localização para telemóveis à tua volta que não têm ligação." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "junta ilhas mesh próximas pela internet: o que você diz no canal mesh também chega a pessoas na sua área fora do alcance de rádio, e as mensagens delas aparecem aqui marcadas com o símbolo de rede. enquanto você tem internet, seu dispositivo também leva o tráfego da ponte e dos canais de localização para celulares ao seu redor que não têm conexão." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "объединяет соседние mesh-острова через интернет: то, что ты говоришь в mesh-канале, доходит и до людей в твоём районе за пределами радиуса радиосвязи, а их сообщения появляются здесь с пометкой символом сети. пока у тебя есть интернет, твоё устройство также переносит трафик моста и каналов локации для телефонов вокруг, у которых его нет." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "kopplar ihop närliggande mesh-öar via internet: det du säger i mesh-kanalen når även personer i ditt område utom radioräckvidd, och deras meddelanden visas här markerade med nätverkssymbolen. så länge du har internet bär din enhet också brygg- och platskanaltrafik åt telefoner omkring dig som saknar anslutning." + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அருகிலுள்ள mesh தீவுகளை இணையம் வழியாக இணைக்கிறது: mesh சேனலில் நீங்கள் சொல்வது உங்கள் பகுதியில் ரேடியோ வரம்புக்கு அப்பாலுள்ளவர்களையும் சென்றடையும், அவர்களின் செய்திகள் நெட்வொர்க் சின்னத்துடன் இங்கே தோன்றும். உங்களிடம் இணையம் இருக்கும் வரை, சுற்றியுள்ள இணைப்பு இல்லாத போன்களுக்காக உங்கள் சாதனம் பாலம் மற்றும் இட சேனல்களின் போக்குவரத்தையும் சுமக்கிறது." + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เชื่อมเกาะ mesh ที่อยู่ใกล้กันผ่านอินเทอร์เน็ต: สิ่งที่คุณพูดในช่อง mesh ยังไปถึงผู้คนในพื้นที่ของคุณที่อยู่นอกระยะวิทยุ และข้อความของพวกเขาจะปรากฏที่นี่พร้อมสัญลักษณ์เครือข่ายกำกับ ตราบใดที่คุณมีอินเทอร์เน็ต อุปกรณ์ของคุณยังส่งต่อทราฟฟิกของบริดจ์และช่องตามตำแหน่งให้โทรศัพท์รอบตัวที่ไม่มีอินเทอร์เน็ตด้วย" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "yakındaki mesh adalarını internet üzerinden birleştirir: mesh kanalında söylediklerin bölgendeki telsiz menzili dışındaki kişilere de ulaşır ve onların mesajları burada ağ simgesiyle işaretli olarak görünür. internetin olduğu sürece cihazın, çevrendeki bağlantısı olmayan telefonlar için köprü ve konum kanalı trafiğini de taşır." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "об'єднує сусідні mesh-острови через інтернет: те, що ти кажеш у mesh-каналі, доходить і до людей у твоєму районі поза радіусом радіозв'язку, а їхні повідомлення з'являються тут із позначкою символом мережі. поки в тебе є інтернет, твій пристрій також переносить трафік мосту й каналів локації для телефонів навколо, які його не мають." + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "قریبی mesh جزیروں کو انٹرنیٹ کے ذریعے جوڑتا ہے: mesh چینل میں آپ جو کہتے ہیں وہ آپ کے علاقے میں ریڈیو رینج سے باہر لوگوں تک بھی پہنچتا ہے، اور ان کے پیغامات یہاں نیٹ ورک علامت کے ساتھ نظر آتے ہیں۔ جب تک آپ کے پاس انٹرنیٹ ہے، آپ کا آلہ ارد گرد کے بغیر انٹرنیٹ والے فونز کے لیے پل اور لوکیشن چینلز کی ٹریفک بھی پہنچاتا ہے۔" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "nối các đảo mesh gần nhau qua internet: những gì bạn nói trong kênh mesh cũng đến được mọi người trong khu vực ngoài phạm vi sóng, và tin nhắn của họ hiện ở đây kèm ký hiệu mạng. khi bạn có internet, thiết bị của bạn cũng chuyển lưu lượng cầu nối và kênh vị trí cho những điện thoại xung quanh không có kết nối." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过互联网连接附近的 mesh 孤岛:你在 mesh 频道说的话也会送达本地区无线电范围之外的人,他们的消息会带网络符号显示在这里。当你有互联网时,你的设备还会为周围没有网络的手机传送桥接和位置频道流量。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "透過網際網路連接附近的 mesh 孤島:你在 mesh 頻道說的話也會送達本地區無線電範圍之外的人,他們的訊息會帶網路符號顯示在這裡。當你有網際網路時,你的裝置還會為周圍沒有網路的手機傳送橋接和位置頻道流量。" + } + } + } + }, + "app_info.settings.bridge.title" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "جسر mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "মেশ ব্রিজ" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh-brücke" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh bridge" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "puente mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh bridge" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "pont mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "גשר mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "मेश ब्रिज" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "jembatan mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "ponte mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "meshブリッジ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh 브리지" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "jambatan mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh पुल" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh-brug" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "most mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "ponte mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ponte mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh-мост" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh-brygga" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh பாலம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "บริดจ์ mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh köprüsü" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh-міст" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh پل" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cầu nối mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh 桥接" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh 橋接" + } + } + } + }, + "app_info.settings.connectivity.title" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الاتصال" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "সংযোগ" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KONNEKTIVITÄT" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "CONNECTIVITY" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "CONECTIVIDAD" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "KONEKTIBIDAD" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "CONNECTIVITÉ" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קישוריות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "कनेक्टिविटी" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "KONEKTIVITAS" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "CONNETTIVITÀ" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "接続" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "연결" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "KESAMBUNGAN" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "जडान" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "CONNECTIVITEIT" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "ŁĄCZNOŚĆ" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "CONECTIVIDADE" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "CONECTIVIDADE" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "СВЯЗЬ" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "ANSLUTNING" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இணைப்பு" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "การเชื่อมต่อ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "BAĞLANTI" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "ЗВ'ЯЗОК" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "کنیکٹیویٹی" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "KẾT NỐI" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连接" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "連線" + } + } + } + }, + "app_info.settings.danger.panic_button" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مسح الذعر" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "প্যানিক ওয়াইপ" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "panik-löschung" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "panic wipe" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "borrado de pánico" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "panic wipe" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "effacement panique" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחיקת בהלה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "पैनिक वाइप" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "hapus panik" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "cancellazione panico" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "パニック消去" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "패닉 삭제" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "hapus panik" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "घबराहट मेटाइ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "paniekwissen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "awaryjne wymazanie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "limpeza de pânico" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "limpeza de pânico" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "экстренное стирание" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "panikradering" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "பதற்ற அழிப்பு" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ล้างข้อมูลฉุกเฉิน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "panik silme" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "екстрене стирання" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "پینک وائپ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "xóa khẩn cấp" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "紧急抹除" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "緊急抹除" + } + } + } + }, + "app_info.settings.danger.panic_confirm_action" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مسح كل شيء" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "সব মুছে ফেলুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "alles löschen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "wipe everything" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "borrar todo" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "burahin lahat" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "tout effacer" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחק הכול" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "सब कुछ मिटाएँ" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "hapus semuanya" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "cancella tutto" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "すべて消去" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모두 지우기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "hapus semuanya" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सबै मेट" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "alles wissen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "wymaż wszystko" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "limpar tudo" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "apagar tudo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "стереть всё" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "radera allt" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அனைத்தையும் அழி" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ล้างทั้งหมด" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "her şeyi sil" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "стерти все" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "سب کچھ مٹا دیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "xóa tất cả" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "抹除全部" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "抹除全部" + } + } + } + }, + "app_info.settings.danger.panic_confirm_title" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مسح كل البيانات؟" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "সব ডেটা মুছবেন?" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "alle daten löschen?" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "wipe all data?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿borrar todos los datos?" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "burahin ang lahat ng data?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "effacer toutes les données ?" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "למחוק את כל הנתונים?" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "सारा डेटा मिटाएँ?" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "hapus semua data?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "cancellare tutti i dati?" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "全データを消去しますか?" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모든 데이터를 지울까요?" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "hapus semua data?" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सबै डाटा मेट्ने हो?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "alle data wissen?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "wymazać wszystkie dane?" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "limpar todos os dados?" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "apagar todos os dados?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "стереть все данные?" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "radera all data?" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "எல்லா தரவையும் அழிக்கவா?" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ล้างข้อมูลทั้งหมด?" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "tüm veriler silinsin mi?" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "стерти всі дані?" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "تمام ڈیٹا مٹا دیں؟" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "xóa toàn bộ dữ liệu?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "抹除全部数据?" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "抹除全部資料?" + } + } + } + }, + "app_info.settings.danger.panic_note" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يمسح كل الرسائل والمفاتيح والهوية. النقر ثلاث مرات على شعار bitchat/ يفعل الشيء نفسه فورًا." + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "সব বার্তা, কী ও পরিচয় মুছে দেয়। bitchat/ লোগোতে তিনবার ট্যাপ করলেও সঙ্গে সঙ্গে একই কাজ হয়।" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "löscht alle nachrichten, schlüssel und identität. dreimaliges tippen auf das bitchat/-logo macht dasselbe, sofort." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "erases all messages, keys, and identity. triple-tapping the bitchat/ logo does the same, instantly." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "borra todos los mensajes, claves e identidad. tocar tres veces el logotipo de bitchat/ hace lo mismo, al instante." + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "binubura ang lahat ng mensahe, key, at pagkakakilanlan. ang pag-tap nang tatlong beses sa logo ng bitchat/ ay pareho ang ginagawa, agad-agad." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "efface tous les messages, les clés et l'identité. taper trois fois sur le logo bitchat/ fait la même chose, instantanément." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מוחק את כל ההודעות, המפתחות והזהות. הקשה משולשת על הלוגו של bitchat/ עושה את אותו הדבר, מייד." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "सभी संदेश, कुंजियाँ और पहचान मिटा देता है। bitchat/ लोगो पर तीन बार टैप करने से भी तुरंत यही होता है।" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "menghapus semua pesan, kunci, dan identitas. mengetuk logo bitchat/ tiga kali melakukan hal yang sama, seketika." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "cancella tutti i messaggi, le chiavi e l'identità. toccare tre volte il logo bitchat/ fa lo stesso, all'istante." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "すべてのメッセージ、鍵、アイデンティティを消去します。bitchat/ ロゴを3回タップしても同じことが即座に行われます。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모든 메시지, 키, 신원을 지웁니다. bitchat/ 로고를 세 번 탭해도 즉시 같은 동작이 실행됩니다." + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "menghapus semua pesan, kunci, dan identiti. mengetuk logo bitchat/ tiga kali melakukan perkara yang sama, serta-merta." + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सबै सन्देश, कुञ्जी र पहिचान मेटाउँछ। bitchat/ लोगोमा तीन पटक ट्याप गर्दा पनि तुरुन्तै त्यही हुन्छ।" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "wist alle berichten, sleutels en identiteit. drie keer tikken op het bitchat/-logo doet hetzelfde, direct." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usuwa wszystkie wiadomości, klucze i tożsamość. trzykrotne stuknięcie logo bitchat/ robi to samo, natychmiast." + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "apaga todas as mensagens, chaves e identidade. tocar três vezes no logótipo bitchat/ faz o mesmo, de imediato." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "apaga todas as mensagens, chaves e identidade. tocar três vezes no logo bitchat/ faz o mesmo, instantaneamente." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "стирает все сообщения, ключи и личность. тройной тап по логотипу bitchat/ делает то же самое, мгновенно." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "raderar alla meddelanden, nycklar och identitet. att trycka tre gånger på bitchat/-logotypen gör detsamma, direkt." + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "எல்லா செய்திகள், சாவிகள், அடையாளத்தையும் அழிக்கிறது. bitchat/ லோகோவை மூன்று முறைத் தட்டினாலும் உடனடியாக அதுவே நடக்கும்." + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ลบข้อความ กุญแจ และตัวตนทั้งหมด การแตะโลโก้ bitchat/ สามครั้งก็ทำแบบเดียวกันทันที" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "tüm mesajları, anahtarları ve kimliği siler. bitchat/ logosuna üç kez dokunmak da aynısını anında yapar." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "стирає всі повідомлення, ключі та особистість. потрійний дотик до логотипа bitchat/ робить те саме, миттєво." + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "تمام پیغامات، کلیدیں اور شناخت مٹا دیتا ہے۔ bitchat/ لوگو پر تین بار ٹیپ کرنے سے بھی فوراً یہی ہوتا ہے۔" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "xóa toàn bộ tin nhắn, khóa và danh tính. chạm ba lần vào logo bitchat/ cũng làm điều tương tự, ngay lập tức." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "抹除所有消息、密钥和身份。三击 bitchat/ 标志也会立即执行相同操作。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "抹除所有訊息、金鑰和身分。三擊 bitchat/ 標誌也會立即執行相同操作。" + } + } + } + }, + "app_info.settings.danger.title" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "منطقة الخطر" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "বিপদ অঞ্চল" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "GEFAHRENZONE" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "DANGER ZONE" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "ZONA DE PELIGRO" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "DANGER ZONE" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ZONE DE DANGER" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אזור סכנה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "खतरे का क्षेत्र" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "ZONA BERBAHAYA" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "ZONA PERICOLOSA" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "危険ゾーン" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "위험 구역" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "ZON BAHAYA" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "खतरा क्षेत्र" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "GEVARENZONE" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "STREFA ZAGROŻENIA" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "ZONA DE PERIGO" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ZONA DE PERIGO" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "ОПАСНАЯ ЗОНА" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "FARLIG ZON" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "ஆபத்து மண்டலம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "โซนอันตราย" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "TEHLİKELİ BÖLGE" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "НЕБЕЗПЕЧНА ЗОНА" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "خطرے کا علاقہ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "VÙNG NGUY HIỂM" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "危险区域" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "危險區域" + } + } + } + }, + "app_info.tab.info" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "معلومات" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "তথ্য" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "info" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "info" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "info" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "impormasyon" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "infos" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מידע" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "जानकारी" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "info" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "info" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "情報" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "정보" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "info" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "जानकारी" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "info" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "informacje" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "info" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "informações" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "инфо" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "info" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "தகவல்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ข้อมูล" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "bilgi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "інфо" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "معلومات" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "thông tin" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "信息" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "資訊" + } + } + } + }, + "app_info.tab.picker_label" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "عرض" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "ভিউ" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "ansicht" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "view" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "vista" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "view" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "vue" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "תצוגה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "दृश्य" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "tampilan" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "vista" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "表示" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "보기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "paparan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "दृश्य" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "weergave" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "widok" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "vista" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "exibição" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "вид" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "vy" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "காட்சி" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "มุมมอง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "görünüm" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "вигляд" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "منظر" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "chế độ xem" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "视图" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "檢視" + } + } + } + }, + "app_info.tab.settings" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الإعدادات" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "সেটিংস" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "einstellungen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "settings" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "ajustes" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "settings" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "réglages" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "सेटिंग्स" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "pengaturan" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "impostazioni" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설정" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "tetapan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "सेटिङ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "instellingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "ustawienia" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "definições" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ajustes" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "настройки" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "inställningar" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அமைப்புகள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ตั้งค่า" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ayarlar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "налаштування" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "سیٹنگز" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cài đặt" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定" + } + } + } + }, "app_info.tagline" : { "extractionState" : "manual", "localizations" : { @@ -10770,6 +13095,366 @@ } } }, + "bridge_people.accessibility.row_hint" : { + "comment" : "Accessibility hint for a person listed in the bridge section of the people sheet", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "في منطقتك، متصل عبر الجسر" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "আপনার এলাকায়, সেতুর মাধ্যমে সংযুক্ত" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "In deiner Gegend, verbunden über die Brücke" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "In your area, connected through the bridge" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "En tu zona, conectado a través del puente" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nasa inyong lugar, konektado sa pamamagitan ng tulay" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dans votre zone, connecté via le pont" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "באזור שלך, מחובר דרך הגשר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "आपके क्षेत्र में, पुल के माध्यम से जुड़ा हुआ" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Di area Anda, terhubung melalui jembatan" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nella tua zona, connesso tramite il ponte" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "あなたのエリア内、ブリッジ経由で接続" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "당신의 지역에서 브리지를 통해 연결됨" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Di kawasan anda, disambungkan melalui jambatan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "तपाईंको क्षेत्रमा, पुल मार्फत जोडिएको" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "In jouw omgeving, verbonden via de brug" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "W Twojej okolicy, połączony przez most" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Na sua área, ligado através da ponte" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Na sua área, conectado pela ponte" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "В вашем районе, на связи через мост" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "I ditt område, ansluten via bron" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "உங்கள் பகுதியில், பாலம் வழியாக இணைக்கப்பட்டுள்ளது" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ในพื้นที่ของคุณ เชื่อมต่อผ่านสะพาน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bölgenizde, köprü üzerinden bağlı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "У вашому районі, на зв'язку через міст" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "آپ کے علاقے میں، پل کے ذریعے منسلک" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trong khu vực của bạn, kết nối qua cầu" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在您的区域内,通过桥接连接" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "在您的區域內,透過橋接連線" + } + } + } + }, + "bridge_people.section_title" : { + "comment" : "Section header in the people sheet for participants reachable via the mesh bridge", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "عبر الجسر" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "সেতুর ওপারে" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "über die brücke" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "across the bridge" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "al otro lado del puente" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "sa kabila ng tulay" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "de l'autre côté du pont" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מעבר לגשר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "पुल के पार" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "di seberang jembatan" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "oltre il ponte" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ブリッジの向こう側" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "브리지 건너편" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "di seberang jambatan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "पुल पारि" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "aan de overkant van de brug" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "po drugiej stronie mostu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "do outro lado da ponte" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "do outro lado da ponte" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "по ту сторону моста" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "på andra sidan bron" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "பாலத்தின் மறுபுறம்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "อีกฝั่งของสะพาน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "köprünün öte yanında" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "по той бік мосту" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "پل کے پار" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "bên kia cầu" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "桥的另一端" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "橋的另一端" + } + } + } + }, "Choose an image" : { "comment" : "A label displayed above a button that allows the user to choose an image to send.", "extractionState" : "manual", @@ -13459,6 +16144,364 @@ } } }, + "content.accessibility.bridged_count" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld أشخاص آخرون عبر الجسر" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "ব্রিজের ওপারে আরও %lld জন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld weitere personen über die brücke" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld more people across the bridge" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld personas más al otro lado del puente" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld pang tao sa kabila ng bridge" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld personnes de plus via le pont" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "עוד %lld אנשים מעבר לגשר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ब्रिज के पार %lld और लोग" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld orang lagi di seberang jembatan" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "altre %lld persone oltre il ponte" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ブリッジの先にさらに%lld人" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "브리지 너머 %lld명 더" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld lagi orang di seberang jambatan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "पुलपारि थप %lld जना" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld extra mensen via de brug" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld więcej osób po drugiej stronie mostu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "mais %lld pessoas do outro lado da ponte" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mais %lld pessoas do outro lado da ponte" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "ещё %lld человек по ту сторону моста" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld personer till via bryggan" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "பாலத்தின் அப்பால் மேலும் %lld பேர்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "อีก %lld คนที่อีกฝั่งของบริดจ์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "köprünün ötesinde %lld kişi daha" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "ще %lld людей по той бік мосту" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "پل کے پار %lld مزید لوگ" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "thêm %lld người bên kia cầu" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "桥另一侧还有 %lld 人" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "橋另一側還有 %lld 人" + } + } + } + }, + "content.accessibility.bridged_message" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "وصلت عبر جسر mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "মেশ ব্রিজ পেরিয়ে এসেছে" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Über eine mesh-brücke angekommen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arrived across a mesh bridge" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Llegó a través de un puente mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dumating sa pamamagitan ng mesh bridge" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arrivé via un pont mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגיעה דרך גשר mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "मेश ब्रिज से होकर आया" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiba lewat jembatan mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arrivato attraverso un ponte mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "meshブリッジ経由で届きました" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh 브리지를 거쳐 도착함" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiba melalui jambatan mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh पुल हुँदै आइपुग्यो" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via een mesh-brug binnengekomen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dotarła przez most mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chegou através de uma ponte mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chegou por uma ponte mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пришло через mesh-мост" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kom via en mesh-brygga" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh பாலம் வழியாக வந்தது" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "มาถึงผ่านบริดจ์ mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bir mesh köprüsü üzerinden geldi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Надійшло через mesh-міст" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesh پل کے ذریعے پہنچا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đến qua cầu nối mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "经 mesh 桥接送达" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "經 mesh 橋接送達" + } + } + } + }, "content.accessibility.choose_photo" : { "comment" : "Accessibility label for the macOS photo picker button", "extractionState" : "manual", @@ -14357,182 +17400,181 @@ } } }, - "content.accessibility.gateway_hint" : { - "comment" : "Accessibility hint for the internet gateway indicator explaining a tap opens the channel sheet", + "content.accessibility.gateway_settings_hint" : { "extractionState" : "manual", "localizations" : { "ar" : { "stringUnit" : { - "state" : "needs_review", - "value" : "يفتح إعدادات القنوات لتشغيل البوابة أو إيقافها" + "state" : "translated", + "value" : "يفتح الإعدادات لتشغيل البوابة أو إيقافها" } }, "bn" : { "stringUnit" : { - "state" : "needs_review", - "value" : "গেটওয়ে চালু বা বন্ধ করতে চ্যানেল সেটিংস খোলে" + "state" : "translated", + "value" : "গেটওয়ে চালু বা বন্ধ করতে সেটিংস খোলে" } }, "de" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Öffnet die kanaleinstellungen, um das gateway ein- oder auszuschalten" + "state" : "translated", + "value" : "Öffnet die einstellungen, um das gateway ein- oder auszuschalten" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "Opens channel settings to turn the gateway on or off" + "value" : "Opens settings to turn the gateway on or off" } }, "es" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Abre los ajustes de canales para activar o desactivar la puerta de enlace" + "state" : "translated", + "value" : "Abre los ajustes para activar o desactivar la puerta de enlace" } }, "fil" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Binubuksan ang mga setting ng channel para i-on o i-off ang gateway" + "state" : "translated", + "value" : "Binubuksan ang mga setting para i-on o i-off ang gateway" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Ouvre les réglages des canaux pour activer ou désactiver la passerelle" + "state" : "translated", + "value" : "Ouvre les réglages pour activer ou désactiver la passerelle" } }, "he" : { "stringUnit" : { - "state" : "needs_review", - "value" : "פותח את הגדרות הערוצים כדי להפעיל או לכבות את השער" + "state" : "translated", + "value" : "פותח את ההגדרות כדי להפעיל או לכבות את השער" } }, "hi" : { "stringUnit" : { - "state" : "needs_review", - "value" : "गेटवे चालू या बंद करने के लिए चैनल सेटिंग्स खोलता है" + "state" : "translated", + "value" : "गेटवे चालू या बंद करने के लिए सेटिंग्स खोलता है" } }, "id" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Membuka pengaturan kanal untuk menyalakan atau mematikan gateway" + "state" : "translated", + "value" : "Membuka pengaturan untuk menyalakan atau mematikan gateway" } }, "it" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Apre le impostazioni dei canali per attivare o disattivare il gateway" + "state" : "translated", + "value" : "Apre le impostazioni per attivare o disattivare il gateway" } }, "ja" : { "stringUnit" : { - "state" : "needs_review", - "value" : "チャンネル設定を開いてゲートウェイのオン/オフを切り替えます" + "state" : "translated", + "value" : "設定を開いてゲートウェイのオン/オフを切り替えます" } }, "ko" : { "stringUnit" : { - "state" : "needs_review", - "value" : "채널 설정을 열어 게이트웨이를 켜거나 끕니다" + "state" : "translated", + "value" : "설정을 열어 게이트웨이를 켜거나 끕니다" } }, "ms" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Membuka tetapan saluran untuk menghidupkan atau mematikan gateway" + "state" : "translated", + "value" : "Membuka tetapan untuk menghidupkan atau mematikan gateway" } }, "ne" : { "stringUnit" : { - "state" : "needs_review", - "value" : "गेटवे खोल्न वा बन्द गर्न च्यानल सेटिङहरू खोल्छ" + "state" : "translated", + "value" : "गेटवे खोल्न वा बन्द गर्न सेटिङहरू खोल्छ" } }, "nl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Opent kanaalinstellingen om de gateway aan of uit te zetten" + "state" : "translated", + "value" : "Opent instellingen om de gateway aan of uit te zetten" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Otwiera ustawienia kanałów, aby włączyć lub wyłączyć bramę" + "state" : "translated", + "value" : "Otwiera ustawienia, aby włączyć lub wyłączyć bramę" } }, "pt" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Abre as definições de canais para ligar ou desligar o gateway" + "state" : "translated", + "value" : "Abre as definições para ligar ou desligar o gateway" } }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Abre as configurações de canais para ligar ou desligar o gateway" + "state" : "translated", + "value" : "Abre as configurações para ligar ou desligar o gateway" } }, "ru" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Открывает настройки каналов, чтобы включить или выключить шлюз" + "state" : "translated", + "value" : "Открывает настройки, чтобы включить или выключить шлюз" } }, "sv" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Öppnar kanalinställningar för att slå på eller av gatewayen" + "state" : "translated", + "value" : "Öppnar inställningar för att slå på eller av gatewayen" } }, "ta" : { "stringUnit" : { - "state" : "needs_review", - "value" : "கேட்வேயை இயக்க அல்லது அணைக்க சேனல் அமைப்புகளைத் திறக்கிறது" + "state" : "translated", + "value" : "கேட்வேயை இயக்க அல்லது அணைக்க அமைப்புகளைத் திறக்கிறது" } }, "th" : { "stringUnit" : { - "state" : "needs_review", - "value" : "เปิดการตั้งค่าช่องเพื่อเปิดหรือปิดเกตเวย์" + "state" : "translated", + "value" : "เปิดการตั้งค่าเพื่อเปิดหรือปิดเกตเวย์" } }, "tr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Ağ geçidini açmak veya kapatmak için kanal ayarlarını açar" + "state" : "translated", + "value" : "Ağ geçidini açmak veya kapatmak için ayarları açar" } }, "uk" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Відкриває налаштування каналів, щоб увімкнути або вимкнути шлюз" + "state" : "translated", + "value" : "Відкриває налаштування, щоб увімкнути або вимкнути шлюз" } }, "ur" : { "stringUnit" : { - "state" : "needs_review", - "value" : "گیٹ وے کو آن یا آف کرنے کے لیے چینل کی ترتیبات کھولتا ہے" + "state" : "translated", + "value" : "گیٹ وے کو آن یا آف کرنے کے لیے ترتیبات کھولتا ہے" } }, "vi" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Mở cài đặt kênh để bật hoặc tắt gateway" + "state" : "translated", + "value" : "Mở cài đặt để bật hoặc tắt gateway" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", - "value" : "打开频道设置以开启或关闭网关" + "state" : "translated", + "value" : "打开设置以开启或关闭网关" } }, "zh-Hant" : { "stringUnit" : { - "state" : "needs_review", - "value" : "開啟頻道設定以開啟或關閉閘道" + "state" : "translated", + "value" : "開啟設定以開啟或關閉閘道" } } } @@ -15075,6 +18117,364 @@ } } }, + "content.accessibility.nearby_only_off" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "موصول بالجسر: تصل الرسائل أيضًا إلى من هم عبر الجسر" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "ব্রিজযুক্ত: বার্তা ব্রিজের ওপারের মানুষের কাছেও পৌঁছায়" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Überbrückt: nachrichten erreichen auch personen über die brücke" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bridged: messages also reach people across the bridge" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con puente: los mensajes también llegan a personas al otro lado del puente" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Naka-bridge: umaabot din ang mga mensahe sa mga tao sa kabila ng bridge" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pont actif : les messages atteignent aussi les gens de l'autre côté du pont" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מגושר: ההודעות מגיעות גם לאנשים מעבר לגשר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ब्रिज सक्रिय: संदेश ब्रिज के पार के लोगों तक भी पहुँचते हैं" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Terjembatani: pesan juga sampai ke orang di seberang jembatan" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con ponte: i messaggi raggiungono anche le persone oltre il ponte" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ブリッジ中: メッセージはブリッジの先の人にも届きます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "브리지 사용: 메시지가 브리지 너머 사람들에게도 전달됩니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Berjambatan: pesan juga sampai kepada orang di seberang jambatan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "पुल जोडिएको: सन्देशहरू पुलपारिका मानिससम्म पनि पुग्छन्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overbrugd: berichten bereiken ook mensen via de brug" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zmostkowane: wiadomości docierają też do osób po drugiej stronie mostu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Com ponte: as mensagens também chegam a pessoas do outro lado da ponte" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Com ponte: as mensagens também chegam a pessoas do outro lado da ponte" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Через мост: сообщения доходят и до людей по ту сторону моста" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bryggad: meddelanden når även personer via bryggan" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "பாலம் இணைந்தது: செய்திகள் பாலத்தின் அப்பாலுள்ளவர்களையும் சென்றடையும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "บริดจ์อยู่: ข้อความยังไปถึงคนที่อีกฝั่งของบริดจ์ด้วย" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Köprülü: mesajlar köprünün ötesindeki kişilere de ulaşır" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Через міст: повідомлення доходять і до людей по той бік мосту" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "پل فعال: پیغامات پل کے پار لوگوں تک بھی پہنچتے ہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đã bắc cầu: tin nhắn cũng đến người bên kia cầu" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已桥接:消息也会送达桥另一侧的人" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "已橋接:訊息也會送達橋另一側的人" + } + } + } + }, + "content.accessibility.nearby_only_on" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قريب فقط: تبقى الرسائل ضمن مدى الراديو" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "শুধু কাছাকাছি: বার্তা রেডিও পরিসরের মধ্যেই থাকে" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nur in der nähe: nachrichten bleiben innerhalb der funkreichweite" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nearby only: messages stay within radio range" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Solo cerca: los mensajes se quedan dentro del alcance de radio" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Malapit lamang: nananatili ang mga mensahe sa loob ng saklaw ng radyo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Proximité uniquement : les messages restent à portée radio" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קרוב בלבד: ההודעות נשארות בטווח הרדיו" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "केवल आसपास: संदेश रेडियो दायरे के भीतर रहते हैं" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hanya terdekat: pesan tetap dalam jangkauan radio" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Solo vicinanze: i messaggi restano entro la portata radio" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "近くのみ: メッセージは電波範囲内にとどまります" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "근처 전용: 메시지가 전파 범위 안에만 머뭅니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Berdekatan sahaja: pesan kekal dalam jangkauan radio" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "नजिक मात्र: सन्देशहरू रेडियो पहुँचभित्रै रहन्छन्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alleen dichtbij: berichten blijven binnen radiobereik" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tylko w pobliżu: wiadomości pozostają w zasięgu radiowym" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Só por perto: as mensagens ficam dentro do alcance de rádio" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Só por perto: as mensagens ficam dentro do alcance de rádio" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Только рядом: сообщения остаются в радиусе радиосвязи" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Endast i närheten: meddelanden stannar inom radioräckvidd" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அருகில் மட்டும்: செய்திகள் ரேடியோ வரம்புக்குள் இருக்கும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เฉพาะใกล้เคียง: ข้อความอยู่ภายในระยะวิทยุ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yalnızca yakın: mesajlar telsiz menzili içinde kalır" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Лише поблизу: повідомлення залишаються в радіусі радіозв'язку" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "صرف قریبی: پیغامات ریڈیو رینج کے اندر رہتے ہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chỉ gần đây: tin nhắn ở trong phạm vi sóng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅限附近:消息只在无线电范围内传播" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "僅限附近:訊息只在無線電範圍內傳播" + } + } + } + }, "content.accessibility.notices" : { "comment" : "Accessibility label for the notices button", "extractionState" : "manual", @@ -24605,6 +28005,364 @@ } } }, + "content.composer.nearby_only_off" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "موصول بالجسر — تصل إلى أشخاص خارج مدى الراديو في هذه المنطقة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "ব্রিজযুক্ত — এই এলাকায় রেডিও পরিসরের বাইরের মানুষের কাছেও পৌঁছায়" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Überbrückt — erreicht personen außerhalb der funkreichweite in dieser gegend" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bridged — reaches people beyond radio range in this area" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con puente — llega a personas fuera del alcance de radio en esta zona" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Naka-bridge — umaabot sa mga taong lampas sa saklaw ng radyo sa lugar na ito" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pont actif — atteint les gens hors de portée radio dans cette zone" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מגושר — מגיעה לאנשים מעבר לטווח הרדיו באזור הזה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ब्रिज सक्रिय — इस क्षेत्र में रेडियो दायरे से बाहर के लोगों तक पहुँचता है" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Terjembatani — sampai ke orang di luar jangkauan radio di area ini" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con ponte — raggiunge persone oltre la portata radio in questa zona" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ブリッジ中 — このエリアの電波範囲外の人にも届きます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "브리지 사용 — 이 지역의 전파 범위 밖 사람들에게도 전달됩니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Berjambatan — sampai kepada orang di luar jangkauan radio di kawasan ini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "पुल जोडिएको — यस क्षेत्रमा रेडियो पहुँचभन्दा बाहिरका मानिससम्म पुग्छ" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overbrugd — bereikt mensen buiten radiobereik in deze omgeving" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zmostkowane — dociera do osób poza zasięgiem radiowym w tej okolicy" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Com ponte — chega a pessoas fora do alcance de rádio nesta zona" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Com ponte — chega a pessoas fora do alcance de rádio nesta área" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Через мост — доходит до людей за пределами радиуса радиосвязи в этом районе" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bryggad — når personer utom radioräckvidd i det här området" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "பாலம் இணைந்தது — இந்தப் பகுதியில் ரேடியோ வரம்புக்கு அப்பாலுள்ளவர்களைச் சென்றடையும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "บริดจ์อยู่ — ไปถึงคนที่อยู่นอกระยะวิทยุในพื้นที่นี้" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Köprülü — bu bölgedeki telsiz menzili dışındaki kişilere ulaşır" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Через міст — доходить до людей поза радіусом радіозв'язку в цьому районі" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "پل فعال — اس علاقے میں ریڈیو رینج سے باہر لوگوں تک پہنچتا ہے" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đã bắc cầu — đến được người ngoài phạm vi sóng trong khu vực này" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已桥接 — 可送达本地区无线电范围之外的人" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "已橋接 — 可送達本地區無線電範圍之外的人" + } + } + } + }, + "content.composer.nearby_only_on" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قريب فقط — لن تعبر هذه الرسالة الجسر" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "শুধু কাছাকাছি — এই বার্তা ব্রিজ পার হবে না" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nur in der nähe — diese nachricht überquert die brücke nicht" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nearby only — this message won't cross the bridge" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Solo cerca — este mensaje no cruzará el puente" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Malapit lamang — hindi tatawid sa bridge ang mensaheng ito" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Proximité uniquement — ce message ne franchira pas le pont" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קרוב בלבד — ההודעה הזו לא תחצה את הגשר" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "केवल आसपास — यह संदेश ब्रिज पार नहीं करेगा" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hanya terdekat — pesan ini tidak akan menyeberangi jembatan" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Solo vicinanze — questo messaggio non attraverserà il ponte" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "近くのみ — このメッセージはブリッジを越えません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "근처 전용 — 이 메시지는 브리지를 건너지 않습니다" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Berdekatan sahaja — pesan ini tidak akan menyeberangi jambatan" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "नजिक मात्र — यो सन्देश पुल तर्दैन" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alleen dichtbij — dit bericht gaat de brug niet over" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tylko w pobliżu — ta wiadomość nie przejdzie przez most" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Só por perto — esta mensagem não vai atravessar a ponte" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Só por perto — esta mensagem não vai atravessar a ponte" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Только рядом — это сообщение не пересечёт мост" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Endast i närheten — det här meddelandet korsar inte bryggan" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "அருகில் மட்டும் — இந்தச் செய்தி பாலத்தைத் தாண்டாது" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เฉพาะใกล้เคียง — ข้อความนี้จะไม่ข้ามบริดจ์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yalnızca yakın — bu mesaj köprüyü geçmeyecek" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Лише поблизу — це повідомлення не перетне міст" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "صرف قریبی — یہ پیغام پل پار نہیں کرے گا" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chỉ gần đây — tin nhắn này sẽ không qua cầu" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅限附近 — 这条消息不会跨越桥接" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "僅限附近 — 這則訊息不會跨越橋接" + } + } + } + }, "content.delivery.delivered_members" : { "extractionState" : "manual", "localizations" : { @@ -25327,175 +29085,175 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "المستخدم محظور" + "value" : "هذا الشخص محظور" } }, "bn" : { "stringUnit" : { "state" : "translated", - "value" : "ব্যবহারকারী ব্লক করা" + "value" : "এই ব্যক্তি ব্লক করা" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "nutzer blockiert" + "value" : "diese person ist blockiert" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "user is blocked" + "value" : "this person is blocked" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "el usuario está bloqueado" + "value" : "esta persona está bloqueada" } }, "fil" : { "stringUnit" : { "state" : "translated", - "value" : "na-block ang user" + "value" : "naka-block ang taong ito" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "utilisateur bloqué" + "value" : "cette personne est bloquée" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "המשתמש חסום" + "value" : "האדם הזה חסום" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "उपयोगकर्ता ब्लॉक है" + "value" : "यह व्यक्ति ब्लॉक है" } }, "id" : { "stringUnit" : { "state" : "translated", - "value" : "pengguna diblokir" + "value" : "orang ini diblokir" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "utente bloccato" + "value" : "questa persona è bloccata" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ユーザーをブロック中" + "value" : "この人をブロック中" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "차단된 사용자입니다" + "value" : "차단된 사람입니다" } }, "ms" : { "stringUnit" : { "state" : "translated", - "value" : "pengguna diblokir" + "value" : "orang ini diblokir" } }, "ne" : { "stringUnit" : { "state" : "translated", - "value" : "प्रयोगकर्ता ब्लक गरिएको" + "value" : "यो व्यक्ति ब्लक गरिएको छ" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "gebruiker is geblokkeerd" + "value" : "deze persoon is geblokkeerd" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "użytkownik zablokowany" + "value" : "ta osoba jest zablokowana" } }, "pt" : { "stringUnit" : { "state" : "translated", - "value" : "utilizador bloqueado" + "value" : "esta pessoa está bloqueada" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "usuário bloqueado" + "value" : "esta pessoa está bloqueada" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "пользователь заблокирован" + "value" : "этот человек заблокирован" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "användaren är blockerad" + "value" : "den här personen är blockerad" } }, "ta" : { "stringUnit" : { "state" : "translated", - "value" : "பயனர் தடுக்கப்பட்டுள்ளார்" + "value" : "இந்த நபர் தடுக்கப்பட்டுள்ளார்" } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "ผู้ใช้ถูกบล็อก" + "value" : "คนนี้ถูกบล็อก" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "kullanıcı engellendi" + "value" : "bu kişi engellendi" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "користувач заблокований" + "value" : "цю людину заблоковано" } }, "ur" : { "stringUnit" : { "state" : "translated", - "value" : "صارف بلاک ہے" + "value" : "یہ شخص بلاک ہے" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "người dùng bị chặn" + "value" : "người này bị chặn" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "用户已被屏蔽" + "value" : "此人已被屏蔽" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "使用者已被屏蔽" + "value" : "此人已被屏蔽" } } } @@ -37002,24 +40760,6 @@ "formatSpecifier" : "lld", "variations" : { "plural" : { - "zero" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%d أشخاص" - } - }, - "one" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%d شخص" - } - }, - "two" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%d شخصان" - } - }, "few" : { "stringUnit" : { "state" : "needs_review", @@ -37032,11 +40772,29 @@ "value" : "%d شخصًا" } }, + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d شخص" + } + }, "other" : { "stringUnit" : { "state" : "needs_review", "value" : "%d شخص" } + }, + "two" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d شخصان" + } + }, + "zero" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d أشخاص" + } } } } @@ -37212,29 +40970,29 @@ "formatSpecifier" : "lld", "variations" : { "plural" : { - "one" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%d אדם" - } - }, - "two" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%d אנשים" - } - }, "many" : { "stringUnit" : { "state" : "needs_review", "value" : "%d אנשים" } }, + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d אדם" + } + }, "other" : { "stringUnit" : { "state" : "needs_review", "value" : "%d אנשים" } + }, + "two" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d אנשים" + } } } } @@ -37444,12 +41202,6 @@ "formatSpecifier" : "lld", "variations" : { "plural" : { - "one" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%d osobę" - } - }, "few" : { "stringUnit" : { "state" : "needs_review", @@ -37462,6 +41214,12 @@ "value" : "%d osób" } }, + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d osobę" + } + }, "other" : { "stringUnit" : { "state" : "needs_review", @@ -37676,12 +41434,6 @@ "formatSpecifier" : "lld", "variations" : { "plural" : { - "one" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%d особа" - } - }, "few" : { "stringUnit" : { "state" : "needs_review", @@ -37694,6 +41446,12 @@ "value" : "%d осіб" } }, + "one" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%d особа" + } + }, "other" : { "stringUnit" : { "state" : "needs_review", @@ -42640,362 +46398,182 @@ } } }, - "location_channels.gateway.subtitle" : { - "comment" : "Explanation under the internet gateway toggle", + "location_channels.grant_to_find" : { + "comment" : "Hint shown in the channel list instead of a loading spinner when location permission is missing", "extractionState" : "manual", "localizations" : { "ar" : { "stringUnit" : { - "state" : "needs_review", - "value" : "شارك إنترنتك مع أقران mesh القريبين لتصل رسائل geohash الخاصة بهم إلى الشبكة" + "state" : "translated", + "value" : "امنح إذن الموقع للعثور على القنوات القريبة" } }, "bn" : { "stringUnit" : { - "state" : "needs_review", - "value" : "কাছাকাছি মেশ পিয়ারদের সঙ্গে আপনার ইন্টারনেট ভাগ করুন যাতে তাদের জিওহ্যাশ বার্তা নেটওয়ার্কে পৌঁছায়" + "state" : "translated", + "value" : "কাছাকাছি চ্যানেল খুঁজতে অবস্থানের অনুমতি দিন" } }, "de" : { "stringUnit" : { - "state" : "needs_review", - "value" : "teile dein internet mit nahen mesh-peers, damit ihre geohash-nachrichten das netzwerk erreichen" + "state" : "translated", + "value" : "standortzugriff erlauben, um kanäle in der nähe zu finden" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "share your internet with nearby mesh peers so their geohash messages reach the network" + "value" : "grant location access to find nearby channels" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "comparte tu internet con peers cercanos del mesh para que sus mensajes geohash lleguen a la red" + "value" : "concede acceso a la ubicación para encontrar canales cercanos" } }, "fil" : { "stringUnit" : { - "state" : "needs_review", - "value" : "ibahagi ang iyong internet sa mga kalapit na mesh peer para makarating sa network ang kanilang mga geohash na mensahe" + "state" : "translated", + "value" : "payagan ang access sa lokasyon para makahanap ng mga kalapit na channel" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "partage ton internet avec les pairs mesh à proximité pour que leurs messages geohash atteignent le réseau" + "state" : "translated", + "value" : "autorisez l'accès à la position pour trouver les canaux à proximité" } }, "he" : { "stringUnit" : { - "state" : "needs_review", - "value" : "שתף את האינטרנט שלך עם עמיתי mesh קרובים כדי שהודעות ה-geohash שלהם יגיעו לרשת" + "state" : "translated", + "value" : "אפשרו גישה למיקום כדי למצוא ערוצים בקרבת מקום" } }, "hi" : { "stringUnit" : { - "state" : "needs_review", - "value" : "अपना इंटरनेट आसपास के मेश पीयरों के साथ साझा करें ताकि उनके जियोहैश संदेश नेटवर्क तक पहुँचें" + "state" : "translated", + "value" : "आस-पास के चैनल खोजने के लिए स्थान की अनुमति दें" } }, "id" : { "stringUnit" : { - "state" : "needs_review", - "value" : "bagikan internetmu ke peer mesh terdekat agar pesan geohash mereka sampai ke jaringan" + "state" : "translated", + "value" : "izinkan akses lokasi untuk menemukan channel terdekat" } }, "it" : { "stringUnit" : { - "state" : "needs_review", - "value" : "condividi il tuo internet con i peer mesh vicini così i loro messaggi geohash raggiungono la rete" + "state" : "translated", + "value" : "consenti l'accesso alla posizione per trovare i canali vicini" } }, "ja" : { "stringUnit" : { - "state" : "needs_review", - "value" : "近くのmeshピアとインターネットを共有して、そのgeohashメッセージをネットワークに届けます" + "state" : "translated", + "value" : "近くのチャンネルを見つけるには位置情報へのアクセスを許可してください" } }, "ko" : { "stringUnit" : { - "state" : "needs_review", - "value" : "근처 mesh 피어와 인터넷을 공유하여 그들의 geohash 메시지가 네트워크에 도달하도록 합니다" + "state" : "translated", + "value" : "주변 채널을 찾으려면 위치 접근을 허용하세요" } }, "ms" : { "stringUnit" : { - "state" : "needs_review", - "value" : "kongsi internetmu dengan peer mesh berdekatan supaya pesan geohash mereka sampai ke rangkaian" + "state" : "translated", + "value" : "benarkan akses lokasi untuk mencari saluran berdekatan" } }, "ne" : { "stringUnit" : { - "state" : "needs_review", - "value" : "नजिकका mesh सहकर्मीसँग तिम्रो इन्टरनेट साझेदारी गर ताकि उनीहरूका geohash सन्देश नेटवर्कसम्म पुगून्" + "state" : "translated", + "value" : "नजिकैका च्यानलहरू फेला पार्न स्थान पहुँच दिनुहोस्" } }, "nl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "deel je internet met mesh-peers in de buurt zodat hun geohash-berichten het netwerk bereiken" + "state" : "translated", + "value" : "geef locatietoegang om kanalen in de buurt te vinden" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "udostępnij internet pobliskim peerom mesh, aby ich wiadomości geohash docierały do sieci" + "state" : "translated", + "value" : "przyznaj dostęp do lokalizacji, aby znaleźć pobliskie kanały" } }, "pt" : { "stringUnit" : { - "state" : "needs_review", - "value" : "partilha a tua internet com pares mesh próximos para que as mensagens geohash deles cheguem à rede" + "state" : "translated", + "value" : "conceda acesso à localização para encontrar canais próximos" } }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "compartilhe sua internet com pares do mesh por perto para que as mensagens geohash deles cheguem à rede" + "state" : "translated", + "value" : "conceda acesso à localização para encontrar canais próximos" } }, "ru" : { "stringUnit" : { - "state" : "needs_review", - "value" : "раздай интернет ближайшим mesh-пирам, чтобы их geohash-сообщения дошли до сети" + "state" : "translated", + "value" : "разрешите доступ к геопозиции, чтобы найти каналы поблизости" } }, "sv" : { "stringUnit" : { - "state" : "needs_review", - "value" : "dela ditt internet med mesh-peers i närheten så att deras geohash-meddelanden når nätverket" + "state" : "translated", + "value" : "ge platsåtkomst för att hitta kanaler i närheten" } }, "ta" : { "stringUnit" : { - "state" : "needs_review", - "value" : "உங்கள் இணையத்தை அருகிலுள்ள mesh peer-களுடன் பகிர்ந்து அவர்களின் geohash செய்திகள் நெட்வொர்க்கை அடையச் செய்யவும்" + "state" : "translated", + "value" : "அருகிலுள்ள சேனல்களைக் கண்டறிய இருப்பிட அணுகலை வழங்கவும்" } }, "th" : { "stringUnit" : { - "state" : "needs_review", - "value" : "แชร์อินเทอร์เน็ตของคุณกับเพียร์ mesh ที่อยู่ใกล้เพื่อให้ข้อความ geohash ของพวกเขาไปถึงเครือข่าย" + "state" : "translated", + "value" : "อนุญาตการเข้าถึงตำแหน่งเพื่อค้นหาช่องใกล้เคียง" } }, "tr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "geohash mesajlarının ağa ulaşması için internetini yakındaki mesh eşleriyle paylaş" + "state" : "translated", + "value" : "yakındaki kanalları bulmak için konum erişimine izin verin" } }, "uk" : { "stringUnit" : { - "state" : "needs_review", - "value" : "поділися інтернетом з ближніми пірами mesh, щоб їхні повідомлення geohash досягали мережі" + "state" : "translated", + "value" : "надайте доступ до геолокації, щоб знайти канали поблизу" } }, "ur" : { "stringUnit" : { - "state" : "needs_review", - "value" : "قریبی mesh ہم منصبوں کے ساتھ اپنا انٹرنیٹ شیئر کریں تاکہ ان کے geohash پیغامات نیٹ ورک تک پہنچیں" + "state" : "translated", + "value" : "قریبی چینلز تلاش کرنے کے لیے مقام تک رسائی دیں" } }, "vi" : { "stringUnit" : { - "state" : "needs_review", - "value" : "chia sẻ internet của bạn với các nút mesh gần đó để tin nhắn geohash của họ đến được mạng" + "state" : "translated", + "value" : "cấp quyền truy cập vị trí để tìm các kênh gần đây" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", - "value" : "与附近 mesh 同伴共享你的互联网,让他们的 geohash 消息能到达网络" + "state" : "translated", + "value" : "授予位置权限以查找附近的频道" } }, "zh-Hant" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "與附近的 mesh 同伴分享你的網際網路,讓他們的 geohash 訊息能傳到網路上" - } - } - } - }, - "location_channels.gateway.title" : { - "comment" : "Title for the internet gateway toggle in the location channels sheet", - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "بوابة الإنترنت" - } - }, - "bn" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ইন্টারনেট গেটওয়ে" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "internet-gateway" - } - }, - "en" : { "stringUnit" : { "state" : "translated", - "value" : "internet gateway" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "puerta de enlace a internet" - } - }, - "fil" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "internet gateway" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "passerelle internet" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "שער אינטרנט" - } - }, - "hi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "इंटरनेट गेटवे" - } - }, - "id" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "gateway internet" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "gateway internet" - } - }, - "ja" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "インターネットゲートウェイ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "인터넷 게이트웨이" - } - }, - "ms" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "gateway internet" - } - }, - "ne" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "इन्टरनेट गेटवे" - } - }, - "nl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "internetgateway" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "brama internetowa" - } - }, - "pt" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "gateway de internet" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "gateway de internet" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "интернет-шлюз" - } - }, - "sv" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "internetgateway" - } - }, - "ta" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "இணைய நுழைவாயில்" - } - }, - "th" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "เกตเวย์อินเทอร์เน็ต" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "internet ağ geçidi" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "інтернет-шлюз" - } - }, - "ur" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "انٹرنیٹ گیٹ وے" - } - }, - "vi" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "cổng internet" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "互联网网关" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "網際網路閘道" + "value" : "授予位置權限以尋找附近的頻道" } } } @@ -46449,6 +50027,12 @@ "value" : "verbinde mit relays…" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "connecting to relays…" + } + }, "es" : { "stringUnit" : { "state" : "translated", @@ -46598,12 +50182,6 @@ "state" : "translated", "value" : "正在連接中繼…" } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "connecting to relays…" - } } } }, diff --git a/bitchat/Nostr/NostrIdentityBridge.swift b/bitchat/Nostr/NostrIdentityBridge.swift index c91ffc42..2e18a235 100644 --- a/bitchat/Nostr/NostrIdentityBridge.swift +++ b/bitchat/Nostr/NostrIdentityBridge.swift @@ -86,6 +86,13 @@ final class NostrIdentityBridge { return seed } + /// Derive a deterministic, unlinkable Nostr identity for a mesh-bridge + /// rendezvous cell. Distinct HMAC label keeps it unlinkable from the + /// geohash-chat identity for the same cell string. + func deriveIdentity(forBridgeRendezvous cell: String) throws -> NostrIdentity { + try deriveIdentity(forGeohash: "bridge|" + cell) + } + /// Derive a deterministic, unlinkable Nostr identity for a given geohash. /// Uses HMAC-SHA256(deviceSeed, geohash) as private key material, with fallback rehashing /// if the candidate is not a valid secp256k1 private key. diff --git a/bitchat/Nostr/NostrProtocol.swift b/bitchat/Nostr/NostrProtocol.swift index 80c57f14..bdcb60f5 100644 --- a/bitchat/Nostr/NostrProtocol.swift +++ b/bitchat/Nostr/NostrProtocol.swift @@ -20,6 +20,10 @@ struct NostrProtocol { case ephemeralEvent = 20000 case geohashPresence = 20001 case deletion = 5 // NIP-09 event deletion request + /// Sealed courier envelope parked on relays under its rotating + /// recipient tag (`#x`). Regular (stored) kind so it survives until + /// its NIP-40 expiration — the whole point is store-and-forward. + case courierDrop = 1401 } /// Create a NIP-17 private message @@ -256,6 +260,84 @@ struct NostrProtocol { return try event.sign(with: schnorrKey) } + // MARK: - Mesh bridge (rendezvous) events + + /// Create a mesh-bridge public message (kind 20000) for a geohash-cell + /// rendezvous. The distinct `r` tag keeps bridge traffic out of geohash + /// channel subscriptions (which filter on `#g`); `m` carries the original + /// mesh message ID so receivers dedup the bridged copy against the radio + /// copy by timeline ID. + static func createBridgeMeshEvent( + content: String, + cell: String, + senderIdentity: NostrIdentity, + nickname: String? = nil, + meshMessageID: String? = nil + ) throws -> NostrEvent { + var tags = [["r", cell]] + if let nickname = nickname?.trimmedOrNilIfEmpty { + tags.append(["n", nickname]) + } + if let meshMessageID = meshMessageID?.trimmedOrNilIfEmpty { + tags.append(["m", meshMessageID]) + } + let event = NostrEvent( + pubkey: senderIdentity.publicKeyHex, + createdAt: Date(), + kind: .ephemeralEvent, + tags: tags, + content: content + ) + let schnorrKey = try senderIdentity.schnorrSigningKey() + return try event.sign(with: schnorrKey) + } + + /// Create a mesh-bridge presence heartbeat (kind 20001) on a rendezvous + /// cell: empty content, `r` tag only — the bridge analogue of geohash + /// presence, counted into "people across the bridge". + static func createBridgePresenceEvent( + cell: String, + senderIdentity: NostrIdentity + ) throws -> NostrEvent { + let event = NostrEvent( + pubkey: senderIdentity.publicKeyHex, + createdAt: Date(), + kind: .geohashPresence, + tags: [["r", cell]], + content: "" + ) + let schnorrKey = try senderIdentity.schnorrSigningKey() + return try event.sign(with: schnorrKey) + } + + /// Create a courier drop (kind 1401): an opaque sealed courier envelope + /// parked on relays. `x` is the hex recipient tag the recipient (or a + /// gateway acting for them) subscribes for; the NIP-40 expiration tracks + /// the envelope expiry so honoring relays garbage-collect the drop. The + /// signing identity should be a throwaway — the envelope authenticates + /// its sender internally via Noise-X, and linking drops to a stable + /// publisher key would leak courier traffic patterns. + static func createCourierDropEvent( + envelope: Data, + recipientTagHex: String, + expiresAt: Date, + senderIdentity: NostrIdentity + ) throws -> NostrEvent { + let tags = [ + ["x", recipientTagHex], + ["expiration", String(Int(expiresAt.timeIntervalSince1970))], + ] + let event = NostrEvent( + pubkey: senderIdentity.publicKeyHex, + createdAt: Date(), + kind: .courierDrop, + tags: tags, + content: envelope.base64EncodedString() + ) + let schnorrKey = try senderIdentity.schnorrSigningKey() + return try event.sign(with: schnorrKey) + } + /// Create a persistent location note (kind 1: text note) tagged to a street-level geohash. /// An optional `expiresAt` adds a NIP-40 expiration tag so honoring relays /// drop the note in step with a bridged board post's expiry. diff --git a/bitchat/Nostr/NostrRelayManager.swift b/bitchat/Nostr/NostrRelayManager.swift index 63583cc7..88da5dff 100644 --- a/bitchat/Nostr/NostrRelayManager.swift +++ b/bitchat/Nostr/NostrRelayManager.swift @@ -1510,6 +1510,29 @@ struct NostrFilter: Encodable { filter.limit = limit return filter } + + // For the mesh bridge: rendezvous messages (kind 20000) and presence + // (kind 20001) tagged `#r` with one or more cells (own + neighbors). + static func bridgeRendezvous(_ cells: [String], since: Date? = nil, limit: Int = 200) -> NostrFilter { + var filter = NostrFilter() + filter.kinds = [20000, 20001] + filter.since = since?.timeIntervalSince1970.toInt() + filter.tagFilters = ["r": cells] + filter.limit = limit + return filter + } + + // For courier drops: sealed envelopes (kind 1401) parked under rotating + // recipient tags (`#x`, hex). Callers pass every candidate tag (adjacent + // UTC days x recipients) in one filter. + static func courierDrops(recipientTagsHex: [String], since: Date? = nil, limit: Int = 100) -> NostrFilter { + var filter = NostrFilter() + filter.kinds = [NostrProtocol.EventKind.courierDrop.rawValue] + filter.since = since?.timeIntervalSince1970.toInt() + filter.tagFilters = ["x": recipientTagsHex] + filter.limit = limit + return filter + } } // Dynamic coding key for tag filters diff --git a/bitchat/Protocols/NostrCarrierPacket.swift b/bitchat/Protocols/NostrCarrierPacket.swift index e65f2b66..8e7b7c06 100644 --- a/bitchat/Protocols/NostrCarrierPacket.swift +++ b/bitchat/Protocols/NostrCarrierPacket.swift @@ -32,6 +32,14 @@ struct NostrCarrierPacket: Equatable { enum Direction: UInt8 { case toGateway = 0x01 case fromGateway = 0x02 + /// Mesh-bridge uplink: a mesh-only peer asks a bridge gateway to + /// publish its signed rendezvous event. Directed, like `toGateway`. + case toBridge = 0x03 + /// Mesh-bridge downlink: a bridge gateway rebroadcasts a rendezvous + /// event from a remote island. Broadcast, like `fromGateway`. + /// Old clients fail the Direction decode on 0x03/0x04 and drop the + /// carrier quietly — bridge traffic degrades to invisible, not junk. + case fromBridge = 0x04 } let direction: Direction diff --git a/bitchat/Protocols/Packets.swift b/bitchat/Protocols/Packets.swift index 309860aa..1f691dd4 100644 --- a/bitchat/Protocols/Packets.swift +++ b/bitchat/Protocols/Packets.swift @@ -9,19 +9,25 @@ struct AnnouncementPacket { let signingPublicKey: Data // Ed25519 public key for signing let directNeighbors: [Data]? // 8-byte peer IDs let capabilities: PeerCapabilities? // advertised feature bits; nil when absent (old clients) + /// Rendezvous geohash cell this peer bridges, when advertising `.bridge`. + /// Coarse (cell-level) by design; lets mesh-only peers compose correctly + /// tagged rendezvous events without their own location fix. + let bridgeGeohash: String? init( nickname: String, noisePublicKey: Data, signingPublicKey: Data, directNeighbors: [Data]?, - capabilities: PeerCapabilities? = nil + capabilities: PeerCapabilities? = nil, + bridgeGeohash: String? = nil ) { self.nickname = nickname self.noisePublicKey = noisePublicKey self.signingPublicKey = signingPublicKey self.directNeighbors = directNeighbors self.capabilities = capabilities + self.bridgeGeohash = bridgeGeohash } private enum TLVType: UInt8 { @@ -30,6 +36,7 @@ struct AnnouncementPacket { case signingPublicKey = 0x03 case directNeighbors = 0x04 case capabilities = 0x05 + case bridgeGeohash = 0x06 } func encode() -> Data? { @@ -74,6 +81,15 @@ struct AnnouncementPacket { data.append(capabilityBytes) } + // TLV for bridge rendezvous cell (optional; old clients skip it) + if let bridgeGeohash = bridgeGeohash, + let cellData = bridgeGeohash.data(using: .utf8), + !cellData.isEmpty, cellData.count <= 12 { + data.append(TLVType.bridgeGeohash.rawValue) + data.append(UInt8(cellData.count)) + data.append(cellData) + } + return data } @@ -84,6 +100,7 @@ struct AnnouncementPacket { var signingPublicKey: Data? var directNeighbors: [Data]? var capabilities: PeerCapabilities? + var bridgeGeohash: String? while offset + 2 <= data.count { let typeRaw = data[offset] @@ -116,6 +133,10 @@ struct AnnouncementPacket { } case .capabilities: capabilities = PeerCapabilities(encoded: Data(value)) + case .bridgeGeohash: + if length <= 12 { + bridgeGeohash = String(data: value, encoding: .utf8) + } } } else { // Unknown TLV; skip (tolerant decoder for forward compatibility) @@ -129,7 +150,8 @@ struct AnnouncementPacket { noisePublicKey: noisePublicKey, signingPublicKey: signingPublicKey, directNeighbors: directNeighbors, - capabilities: capabilities + capabilities: capabilities, + bridgeGeohash: bridgeGeohash ) } } diff --git a/bitchat/Services/BLE/BLEPeerRegistry.swift b/bitchat/Services/BLE/BLEPeerRegistry.swift index dc714d13..9195d147 100644 --- a/bitchat/Services/BLE/BLEPeerRegistry.swift +++ b/bitchat/Services/BLE/BLEPeerRegistry.swift @@ -10,6 +10,8 @@ struct BLEPeerInfo: Equatable { var isVerifiedNickname: Bool var lastSeen: Date var capabilities: PeerCapabilities = [] + /// Rendezvous cell from the peer's announce when it advertises `.bridge`. + var bridgeGeohash: String? } struct BLEPeerAnnounceUpdate: Equatable { @@ -117,6 +119,15 @@ struct BLEPeerRegistry { peers.values.filter { $0.capabilities.contains(capability) }.map(\.peerID) } + /// A rendezvous cell advertised by any bridge-capable peer, if one is + /// known — lets location-less devices join the island's rendezvous. + func advertisedBridgeGeohash() -> String? { + peers.values + .filter { $0.capabilities.contains(.bridge) } + .compactMap(\.bridgeGeohash) + .first + } + func displayNicknames(selfNickname: String) -> [PeerID: String] { let connected = peers.filter { $0.value.isConnected } let tuples = connected.map { ($0.key, $0.value.nickname, true) } @@ -160,7 +171,8 @@ struct BLEPeerRegistry { signingPublicKey: Data?, isConnected: Bool, now: Date, - capabilities: PeerCapabilities = [] + capabilities: PeerCapabilities = [], + bridgeGeohash: String? = nil ) -> BLEPeerAnnounceUpdate { let existing = peers[peerID] let update = BLEPeerAnnounceUpdate( @@ -177,7 +189,8 @@ struct BLEPeerRegistry { signingPublicKey: signingPublicKey, isVerifiedNickname: true, lastSeen: now, - capabilities: capabilities + capabilities: capabilities, + bridgeGeohash: bridgeGeohash ) return update diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 5050ea2c..19eb6a32 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -84,7 +84,11 @@ final class BLEService: NSObject { // for every announce. `directedToUs` distinguishes an uplink deposit // addressed to this device from a downlink broadcast. var onNostrCarrierPacket: (@MainActor (_ payload: Data, _ from: PeerID, _ directedToUs: Bool) -> Void)? + /// Fired (off-main) when a signature-verified announce is processed — + /// the bridge courier watch refreshes its tag set on new arrivals. + var onVerifiedPeerAnnounce: ((_ peerID: PeerID) -> Void)? private var runtimeCapabilities: PeerCapabilities = [] // collectionsQueue + private var localBridgeGeohash: String? // collectionsQueue #if DEBUG // Test-only tap on the outbound pipeline so multi-node tests can ferry @@ -708,6 +712,33 @@ final class BLEService: NSObject { } } + /// Reachable peers currently advertising the `.bridge` capability. + func reachableBridgePeers() -> [PeerID] { + let now = Date() + return collectionsQueue.sync { + peerRegistry.peers(advertising: .bridge) + .filter { peerRegistry.isReachable($0, now: now) } + } + } + + /// A rendezvous cell advertised by a bridge-capable peer's announce. + func advertisedBridgeGeohash() -> String? { + collectionsQueue.sync { peerRegistry.advertisedBridgeGeohash() } + } + + /// The rendezvous cell this device advertises in its own announces while + /// bridging with the gateway toggle on. Set from the main actor; the + /// value rides the next (forced) announce. + func setLocalBridgeGeohash(_ cell: String?) { + let changed: Bool = collectionsQueue.sync(flags: .barrier) { + guard localBridgeGeohash != cell else { return false } + localBridgeGeohash = cell + return true + } + guard changed else { return } + sendAnnounce(forceSend: true) + } + func getPeerNicknames() -> [PeerID: String] { return collectionsQueue.sync { peerRegistry.displayNicknames(selfNickname: myNickname) @@ -1395,8 +1426,12 @@ final class BLEService: NSObject { let noisePub = noiseService.getStaticPublicKeyData() // For noise handshakes and peer identification let signingPub = noiseService.getSigningPublicKeyData() // For signature verification - let (connectedPeerIDs, advertisedCapabilities): ([Data], PeerCapabilities) = collectionsQueue.sync { - (peerRegistry.connectedRoutingData, PeerCapabilities.localSupported.union(runtimeCapabilities)) + let (connectedPeerIDs, advertisedCapabilities, advertisedBridgeCell): ([Data], PeerCapabilities, String?) = collectionsQueue.sync { + ( + peerRegistry.connectedRoutingData, + PeerCapabilities.localSupported.union(runtimeCapabilities), + runtimeCapabilities.contains(.bridge) ? localBridgeGeohash : nil + ) } let announcement = AnnouncementPacket( @@ -1404,7 +1439,8 @@ final class BLEService: NSObject { noisePublicKey: noisePub, signingPublicKey: signingPub, directNeighbors: connectedPeerIDs, - capabilities: advertisedCapabilities + capabilities: advertisedCapabilities, + bridgeGeohash: advertisedBridgeCell ) guard let payload = announcement.encode() else { @@ -3066,6 +3102,92 @@ extension BLEService { return true } + // MARK: Courier over the bridge + + /// Seals `content` into a courier envelope for relay parking (a bridge + /// courier drop). Same sealing rules as `sendCourierMessage` — prekey + /// (v2) when a verified bundle is cached, static Noise X (v1) otherwise — + /// but carry-only: a relay copy never sprays. + func sealBridgeCourierEnvelope(_ content: String, messageID: String, recipientNoiseKey: Data) -> CourierEnvelope? { + guard let typedPayload = BLENoisePayloadFactory.privateMessage(content: content, messageID: messageID) else { + return nil + } + do { + let now = Date() + let sealed: Data + let prekeyID: UInt32? + if let prekey = assignRecipientPrekey(messageID: messageID, recipientNoiseKey: recipientNoiseKey) { + sealed = try noiseService.sealPrekeyPayload(typedPayload, recipientPrekey: prekey) + prekeyID = prekey.id + } else { + sealed = try noiseService.sealCourierPayload(typedPayload, recipientStaticKey: recipientNoiseKey) + prekeyID = nil + } + return CourierEnvelope( + recipientTag: CourierEnvelope.recipientTag( + noiseStaticKey: recipientNoiseKey, + epochDay: CourierEnvelope.epochDay(for: now) + ), + expiry: UInt64((now.timeIntervalSince1970 + CourierEnvelope.maxLifetimeSeconds) * 1000), + ciphertext: sealed, + copies: 1, + prekeyID: prekeyID + ) + } catch { + SecureLogger.error("Failed to seal bridge courier envelope: \(error)", category: .encryption) + return nil + } + } + + /// Opens a courier envelope that arrived as a bridge drop (relay fetch, + /// not a directed mesh packet). Returns false when the rotating tag does + /// not match our static key — a drop for someone else, or a stale tag. + /// The inner Noise X seal authenticates the sender; there is no packet + /// signature to check on this path. + @discardableResult + func openBridgedCourierEnvelope(_ envelope: CourierEnvelope) -> Bool { + guard !envelope.isExpired else { return false } + let myKey = noiseService.getStaticPublicKeyData() + guard CourierEnvelope.candidateTags(noiseStaticKey: myKey, around: Date()).contains(envelope.recipientTag) else { + return false + } + openCourierEnvelope(envelope) + return true + } + + /// Hands a bridge-fetched envelope directly to the matching local peer + /// as a directed courier packet. Delivery-only by design: the recipient's + /// tag matched, so this never lands in a stranger's carry quota. + @discardableResult + func deliverBridgedEnvelope(_ envelope: CourierEnvelope, to peerID: PeerID) -> Bool { + guard isPeerConnected(peerID) || isPeerReachable(peerID) else { return false } + guard let payload = envelope.encode() else { return false } + let packet = makeCourierPacket(payload, to: peerID) + messageQueue.async { [weak self] in + self?.sendPacketDirected(packet, to: peerID) + } + return true + } + + /// Our own Noise static public key (for computing our courier tags). + func myNoiseStaticPublicKey() -> Data { + noiseService.getStaticPublicKeyData() + } + + /// Verified reachable peers with known Noise keys — the set a bridge + /// gateway watches courier drops for. + func verifiedPeersWithNoiseKeys() -> [(peerID: PeerID, noiseKey: Data)] { + let now = Date() + return collectionsQueue.sync { + peerRegistry.snapshotByID.values.compactMap { info in + guard info.isVerifiedNickname, + let key = info.noisePublicKey, + peerRegistry.isReachable(info.peerID, now: now) else { return nil } + return (info.peerID, key) + } + } + } + /// The prekey to seal a courier message with, or nil to fall back to /// static sealing. The real signal is a verified, unexpired bundle with a /// spare prekey; the advertised `.prekeys` capability only acts as a veto @@ -4185,6 +4307,12 @@ extension BLEService { rebindLinkAfterVerifiedDirectAnnounce(packet, to: result.peerID) } + // Bridge courier watch: a verified announce may add a peer whose + // relay-parked drops we should start watching for. + if let result, result.isVerified { + onVerifiedPeerAnnounce?(result.peerID) + } + // Courier work: an announce is the moment we learn a peer's Noise // static key, so check whether we're carrying mail addressed to them // (or spray-able mail they could carry). Verified announces only. @@ -4314,7 +4442,8 @@ extension BLEService { signingPublicKey: announcement.signingPublicKey, isConnected: isConnected, now: now, - capabilities: announcement.capabilities ?? [] + capabilities: announcement.capabilities ?? [], + bridgeGeohash: announcement.bridgeGeohash ) ?? BLEPeerAnnounceUpdate(isNewPeer: false, wasDisconnected: false, previousNickname: nil) }, shouldEmitReconnectLog: { [weak self] peerID, now in diff --git a/bitchat/Services/Courier/CourierStore.swift b/bitchat/Services/Courier/CourierStore.swift index 06bfc7c1..b765edc5 100644 --- a/bitchat/Services/Courier/CourierStore.swift +++ b/bitchat/Services/Courier/CourierStore.swift @@ -42,6 +42,8 @@ final class CourierStore { var sprayedTo: Set /// Last speculative multi-hop handover toward a relayed announce. var lastRemoteHandoverAt: Date? + /// Last publish of this envelope as a bridge courier drop on relays. + var lastBridgePublishAt: Date? /// Prekey-sealed (envelope v2) discriminator; nil for static-sealed v1. let prekeyID: UInt32? @@ -59,6 +61,7 @@ final class CourierStore { copies: UInt8, sprayedTo: Set = [], lastRemoteHandoverAt: Date? = nil, + lastBridgePublishAt: Date? = nil, prekeyID: UInt32? = nil ) { self.recipientTag = recipientTag @@ -70,6 +73,7 @@ final class CourierStore { self.copies = copies self.sprayedTo = sprayedTo self.lastRemoteHandoverAt = lastRemoteHandoverAt + self.lastBridgePublishAt = lastBridgePublishAt self.prekeyID = prekeyID } @@ -86,6 +90,7 @@ final class CourierStore { copies = try container.decodeIfPresent(UInt8.self, forKey: .copies) ?? 1 sprayedTo = try container.decodeIfPresent(Set.self, forKey: .sprayedTo) ?? [] lastRemoteHandoverAt = try container.decodeIfPresent(Date.self, forKey: .lastRemoteHandoverAt) + lastBridgePublishAt = try container.decodeIfPresent(Date.self, forKey: .lastBridgePublishAt) prekeyID = try container.decodeIfPresent(UInt32.self, forKey: .prekeyID) } } @@ -242,6 +247,30 @@ final class CourierStore { } } + /// Envelopes to park on relays as bridge courier drops. Non-destructive + /// like remote handover — the relay copy is speculative, so the carried + /// copy stays until direct handover or expiry. The per-envelope cooldown + /// keeps relay churn from republishing the same mail; publishing relays + /// dedup identical events by ID anyway. + func envelopesForBridgePublish(cooldown: TimeInterval) -> [CourierEnvelope] { + let date = now() + return queue.sync { + pruneExpiredLocked(at: date) + var matched: [CourierEnvelope] = [] + for index in envelopes.indices { + if let last = envelopes[index].lastBridgePublishAt, + date.timeIntervalSince(last) < cooldown { + continue + } + envelopes[index].lastBridgePublishAt = date + // The relay copy carries no spray budget. + matched.append(envelopes[index].envelope.withCopies(1)) + } + if !matched.isEmpty { persistLocked() } + return matched + } + } + // MARK: - Spray-and-wait (on encountering another courier) /// Envelopes to re-deposit with a courier we just encountered, each with diff --git a/bitchat/Services/Gateway/BoundedIDSet.swift b/bitchat/Services/Gateway/BoundedIDSet.swift new file mode 100644 index 00000000..8509c295 --- /dev/null +++ b/bitchat/Services/Gateway/BoundedIDSet.swift @@ -0,0 +1,35 @@ +// +// BoundedIDSet.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +/// Insertion-ordered string set with a fixed capacity; the oldest entry is +/// evicted when full. Shared by the gateway and bridge loop-prevention +/// caches. +struct BoundedIDSet { + private var members: Set = [] + private var order: [String] = [] + let capacity: Int + + init(capacity: Int) { + self.capacity = capacity + } + + func contains(_ id: String) -> Bool { + members.contains(id) + } + + /// Returns false when the ID was already present. + @discardableResult + mutating func insert(_ id: String) -> Bool { + guard members.insert(id).inserted else { return false } + order.append(id) + if order.count > capacity { + members.remove(order.removeFirst()) + } + return true + } +} diff --git a/bitchat/Services/Gateway/BridgeCourierService.swift b/bitchat/Services/Gateway/BridgeCourierService.swift new file mode 100644 index 00000000..164249d0 --- /dev/null +++ b/bitchat/Services/Gateway/BridgeCourierService.swift @@ -0,0 +1,284 @@ +// +// BridgeCourierService.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import Foundation +import Security + +/// Courier delivery over the internet bridge: sealed courier envelopes are +/// parked on relays as kind-1401 "drops" tagged with their rotating +/// recipient tag, so delivery stops requiring a physical courier to bump +/// into the recipient. +/// +/// Three duties, all gated on the bridge toggle: +/// - Sender: when the message router seals mail for an unreachable peer, a +/// copy is published as a drop (queued until relays connect). The drop is +/// signed with a fresh throwaway key per publish — the envelope +/// authenticates its sender internally via Noise-X, and a stable publisher +/// key would leak courier traffic patterns to relays. +/// - Recipient: subscribes for its own candidate tags (adjacent UTC days) +/// and opens matching drops directly. +/// - Gateway (bridge + gateway toggles): additionally watches the tags of +/// verified local mesh peers and hands matching drops to them as directed +/// courier packets, so mesh-only recipients are served too. +/// +/// Privacy: a drop reveals to relays only that "someone" is messaging "some +/// 16-byte day-rotating tag". Only parties who already know the recipient's +/// Noise static key can compute the tag; the payload is an opaque Noise-X +/// seal. Duplicate deliveries (drop + physical courier + direct link) are +/// absorbed downstream by message-ID dedup. +@MainActor +final class BridgeCourierService: ObservableObject { + enum Limits { + /// Drops waiting for relay connectivity (bounded, drop-oldest). + static let maxPendingDrops = 20 + /// Republish cooldown for gateway-held envelopes. + static let heldEnvelopePublishCooldown: TimeInterval = 30 * 60 + /// Local peers a gateway watches drops for (x3 candidate tags each). + static let maxWatchedPeers = 16 + /// Tag-set refresh cadence (also covers UTC day rollover). + static let refreshIntervalSeconds: TimeInterval = 30 * 60 + /// Minimum spacing for announce-driven refreshes. + static let announceRefreshDebounceSeconds: TimeInterval = 60 + /// Encoded envelope cap for a drop (16 KiB ciphertext + TLV slack). + static let maxDropEnvelopeBytes = 20 * 1024 + static let maxTrackedIDs = 512 + } + + static let shared = BridgeCourierService() + + // MARK: Wiring (set once by the bootstrapper; fakes in tests) + + var bridgeEnabled: (@MainActor () -> Bool)? + var relaysConnected: (@MainActor () -> Bool)? + /// Publishes a signed drop event to the default (DM) relays. + var publishEvent: (@MainActor (NostrEvent) -> Void)? + /// (Re)opens the drop subscription for the given hex tags. + var openSubscription: (@MainActor ([String]) -> Void)? + var closeSubscription: (@MainActor () -> Void)? + /// Our own Noise static public key. + var myNoiseKey: (@MainActor () -> Data?)? + /// Verified reachable local peers with known Noise keys. + var localVerifiedPeers: (@MainActor () -> [(peerID: PeerID, noiseKey: Data)])? + /// Seals content into a carry-only envelope for a recipient key. + var sealEnvelope: (@MainActor (String, String, Data) -> CourierEnvelope?)? + /// Opens a drop addressed to us (tag verified inside). + var openEnvelope: (@MainActor (CourierEnvelope) -> Void)? + /// Hands a drop to a matching local peer as a directed courier packet. + var deliverToPeer: (@MainActor (CourierEnvelope, PeerID) -> Void)? + /// Held envelopes eligible for (re)publish, honoring the cooldown. + var heldEnvelopes: (@MainActor (TimeInterval) -> [CourierEnvelope])? + /// Timer injection for tests; nil arms a real `Task`. + var scheduleTimer: (@MainActor (TimeInterval, @escaping @MainActor () -> Void) -> Void)? + + // MARK: State + + private(set) var myTagsHex: Set = [] + private(set) var watchedPeerTags: [(peerID: PeerID, tagsHex: Set)] = [] + private(set) var pendingDrops: [(envelope: CourierEnvelope, dedupKey: String?)] = [] + /// Message IDs already published as drops (sender-side dedup). + private var publishedDropKeys: BoundedIDSet + /// Drop event IDs already handled (multi-relay dedup). + private var seenDropEventIDs: BoundedIDSet + private var subscriptionOpen = false + private var lastSubscribedTags: Set = [] + private var refreshTimerArmed = false + private var lastAnnounceRefresh = Date.distantPast + + private let now: () -> Date + + init(now: @escaping () -> Date = Date.init) { + self.now = now + self.publishedDropKeys = BoundedIDSet(capacity: Limits.maxTrackedIDs) + self.seenDropEventIDs = BoundedIDSet(capacity: Limits.maxTrackedIDs) + } + + // MARK: - Sender role + + /// Parallel-deposit a sealed copy of an outbound private message as a + /// relay drop. Called by the message router alongside physical courier + /// deposits; idempotent per message ID. Returns true when a fresh drop + /// was sealed (published now or queued for the next relay connection) — + /// the router marks the message "carried" so the sender sees progress. + @discardableResult + func depositDrop(content: String, messageID: String, recipientNoiseKey: Data) -> Bool { + guard bridgeEnabled?() ?? false else { return false } + guard !publishedDropKeys.contains(messageID) else { return false } + guard let envelope = sealEnvelope?(content, messageID, recipientNoiseKey) else { return false } + publishedDropKeys.insert(messageID) + publishDrop(envelope) + return true + } + + /// Publishes held envelopes (mail we carry for others) as drops, + /// honoring the per-envelope cooldown. + func publishHeldEnvelopes() { + guard bridgeEnabled?() ?? false, relaysConnected?() ?? false else { return } + for envelope in heldEnvelopes?(Limits.heldEnvelopePublishCooldown) ?? [] { + publishDrop(envelope) + } + } + + private func publishDrop(_ envelope: CourierEnvelope) { + guard let encoded = envelope.encode(), + encoded.count <= Limits.maxDropEnvelopeBytes, + !envelope.isExpired else { return } + guard relaysConnected?() ?? false else { + pendingDrops.append((envelope, nil)) + if pendingDrops.count > Limits.maxPendingDrops { + pendingDrops.removeFirst(pendingDrops.count - Limits.maxPendingDrops) + } + return + } + guard let identity = Self.makeThrowawayIdentity(), + let event = try? NostrProtocol.createCourierDropEvent( + envelope: encoded, + recipientTagHex: envelope.recipientTag.hexEncodedString(), + expiresAt: Date(timeIntervalSince1970: TimeInterval(envelope.expiry) / 1000), + senderIdentity: identity + ) else { + SecureLogger.error("📦🌉 Failed to compose courier drop", category: .encryption) + return + } + publishEvent?(event) + SecureLogger.debug("📦🌉 Published courier drop for tag \(envelope.recipientTag.hexEncodedString().prefix(8))…", category: .session) + } + + /// Drops queued while relays were unreachable publish on reconnect. + func flushPendingDrops() { + guard bridgeEnabled?() ?? false, relaysConnected?() ?? false, !pendingDrops.isEmpty else { return } + let queued = pendingDrops + pendingDrops.removeAll() + for item in queued { + publishDrop(item.envelope) + } + } + + // MARK: - Subscription (recipient + gateway watch) + + /// Recomputes the watched tag set and (re)opens the subscription. + /// Call on toggle changes, relay connectivity changes, and periodically + /// (tags rotate daily); idempotent. + func refresh() { + armRefreshTimerIfNeeded() + guard bridgeEnabled?() ?? false, relaysConnected?() ?? false else { + if subscriptionOpen { + closeSubscription?() + subscriptionOpen = false + } + return + } + let date = now() + if let myKey = myNoiseKey?() { + myTagsHex = Set(CourierEnvelope.candidateTags(noiseStaticKey: myKey, around: date).map { $0.hexEncodedString() }) + } else { + myTagsHex = [] + } + // While bridging with internet, every device watches drops for its + // verified local peers — the single-switch analogue of gateway duty. + let peers = (localVerifiedPeers?() ?? []).prefix(Limits.maxWatchedPeers) + watchedPeerTags = peers.map { peer in + (peer.peerID, Set(CourierEnvelope.candidateTags(noiseStaticKey: peer.noiseKey, around: date).map { $0.hexEncodedString() })) + } + let allTags = myTagsHex.union(watchedPeerTags.flatMap(\.tagsHex)) + guard !allTags.isEmpty else { + if subscriptionOpen { + closeSubscription?() + subscriptionOpen = false + lastSubscribedTags = [] + } + return + } + // Resubscribe only when the watched set actually changed — refresh + // fires on every verified announce (field logs showed the drop + // subscription rebuilt every ~60s for an unchanged tag set). + if !subscriptionOpen || allTags != lastSubscribedTags { + openSubscription?(allTags.sorted()) + subscriptionOpen = true + lastSubscribedTags = allTags + } + flushPendingDrops() + publishHeldEnvelopes() + } + + /// Announce-driven refresh, debounced — a newly verified peer should be + /// watched promptly, but announce storms must not thrash subscriptions. + func refreshAfterVerifiedAnnounce() { + guard bridgeEnabled?() ?? false else { return } + guard now().timeIntervalSince(lastAnnounceRefresh) >= Limits.announceRefreshDebounceSeconds else { return } + lastAnnounceRefresh = now() + refresh() + } + + private func armRefreshTimerIfNeeded() { + guard bridgeEnabled?() ?? false, !refreshTimerArmed else { return } + refreshTimerArmed = true + let fire: @MainActor () -> Void = { [weak self] in + guard let self else { return } + self.refreshTimerArmed = false + self.refresh() + } + if let scheduleTimer { + scheduleTimer(Limits.refreshIntervalSeconds, fire) + } else { + Task { @MainActor in + try? await Task.sleep(nanoseconds: UInt64(Limits.refreshIntervalSeconds * 1_000_000_000)) + fire() + } + } + } + + // MARK: - Inbound drops + + /// Entry point for every drop event the subscription delivers (the relay + /// manager has already verified the event signature). + func handleDropEvent(_ event: NostrEvent) { + guard bridgeEnabled?() ?? false else { return } + guard event.kind == NostrProtocol.EventKind.courierDrop.rawValue else { return } + guard seenDropEventIDs.insert(event.id) else { return } + guard let data = Data(base64Encoded: event.content), + data.count <= Limits.maxDropEnvelopeBytes, + let envelope = CourierEnvelope.decode(data), + !envelope.isExpired else { + return + } + let tagHex = envelope.recipientTag.hexEncodedString() + // The envelope's own tag must match the event's filterable tag — + // otherwise a mislabeled drop could ride a subscription it doesn't + // belong to. + guard event.tags.contains(where: { $0.count >= 2 && $0[0] == "x" && $0[1] == tagHex }) else { return } + + if myTagsHex.contains(tagHex) { + SecureLogger.info("📦🌉 Courier drop for us arrived via bridge", category: .session) + openEnvelope?(envelope) + return + } + if let match = watchedPeerTags.first(where: { $0.tagsHex.contains(tagHex) }) { + SecureLogger.info("📦🌉 Courier drop fetched for local peer \(match.peerID.id.prefix(8))…", category: .session) + deliverToPeer?(envelope, match.peerID) + } + } + + // MARK: - Helpers + + /// A fresh random Nostr identity for signing one drop. + static func makeThrowawayIdentity() -> NostrIdentity? { + for _ in 0..<10 { + var bytes = Data(count: 32) + let status = bytes.withUnsafeMutableBytes { ptr in + SecRandomCopyBytes(kSecRandomDefault, 32, ptr.baseAddress!) + } + guard status == errSecSuccess else { return nil } + if let identity = try? NostrIdentity(privateKeyData: bytes) { + return identity + } + } + return nil + } +} diff --git a/bitchat/Services/Gateway/BridgeService.swift b/bitchat/Services/Gateway/BridgeService.swift new file mode 100644 index 00000000..eb84944d --- /dev/null +++ b/bitchat/Services/Gateway/BridgeService.swift @@ -0,0 +1,689 @@ +// +// BridgeService.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import BitLogger +import Combine +import Foundation + +/// Policy engine for the mesh bridge: an opt-in stitcher of disjoint BLE +/// mesh islands that share a place. While the toggle is on, this device's +/// public mesh messages are additionally signed (with a derived, unlinkable +/// per-cell Nostr identity) as rendezvous events for the local geohash cell +/// and published to the cell's deterministic geo relays — directly when we +/// have internet, or deposited with a bridge gateway peer over a directed +/// `toBridge` carrier when we are mesh-only. Inbound rendezvous events from +/// other islands render into the mesh timeline marked as bridged. +/// +/// A device with BOTH this toggle and the gateway toggle on serves the +/// island: it accepts `toBridge` deposits, publishes them, and rebroadcasts +/// remote rendezvous events onto the mesh as `fromBridge` carriers so +/// mesh-only peers see across the bridge too. +/// +/// Consent model: +/// - Nothing crosses a bridge unless its author signed it for the bridge: +/// gateways carry only finished, Schnorr-signed rendezvous events, so a +/// neighbor's gateway cannot exfiltrate radio-only traffic. The per-message +/// "nearby only" flag simply skips composing a rendezvous copy. +/// - Receiving over radio (`fromBridge` carriers) is always on — it is +/// passive and leaks nothing. Subscribing over the internet (which reveals +/// the coarse cell to relays) and publishing both require the toggle. +/// +/// Loop-prevention rules (adapted from `GatewayService`, unit-tested): +/// 1. An event learned from a `fromBridge` mesh broadcast is never published +/// and never rebroadcast (`meshBroadcastEventIDs`) — a second bridge +/// gateway on the same island cannot echo mesh-carried traffic. +/// 2. An event this device published (own messages or uplinked deposits, +/// `publishedEventIDs`) is never downlink-rebroadcast: it originated on +/// this island, so our own relay subscription redelivering it must not +/// double BLE airtime. +/// 3. A subscription event is rebroadcast at most once +/// (`rebroadcastEventIDs`, marked after send), and never when the island +/// already holds the radio copy (`isMessageSeenLocally` on the event's +/// mesh message ID) — remote islands' traffic is the only thing worth +/// airtime. +/// Receivers additionally dedup by timeline message ID: a bridged copy +/// carries the original mesh message ID in its `m` tag, so the store's +/// insert-by-ID absorbs radio/bridge duplicates in either arrival order. +/// +/// All dependencies are closure-injected (repo convention) so the policy +/// layer is unit-testable without relays, radios, or CoreLocation. +@MainActor +final class BridgeService: ObservableObject { + enum Limits { + /// Uplink deposits held while relays are unreachable. + static let maxQueuedUplinks = 20 + static let maxQueuedUplinksPerDepositor = 5 + /// Uplink deposits accepted per depositor per minute. + static let uplinkEventsPerMinutePerDepositor = 10 + /// Downlink mesh rebroadcasts per minute — BLE airtime is precious, + /// and bridge traffic shares the radio with everything else. + static let downlinkEventsPerMinute = 20 + static let maxPendingDownlinks = 30 + /// Accepted clock skew for a rendezvous event. + static let maxEventAgeSeconds: TimeInterval = 15 * 60 + /// Bounded loop-prevention ID caches (oldest evicted). + static let maxTrackedEventIDs = 512 + /// Presence heartbeat cadence while the bridge is active. + static let presenceIntervalSeconds: TimeInterval = 4 * 60 + /// A rendezvous participant counts toward "via bridge" for this long + /// after their last event. + static let participantFreshnessSeconds: TimeInterval = 10 * 60 + /// Content cap, matching the public-message pipeline's own limit. + static let maxContentBytes = 16_000 + /// Geohash-cell precision of the rendezvous (neighborhood, ~1.2 km). + static let cellPrecision = 6 + } + + struct QueuedUplink { + let depositor: PeerID + let cell: String + let event: NostrEvent + } + + /// A validated rendezvous message ready for the timeline. + struct InboundBridgeMessage { + let messageID: String + let senderNickname: String + let senderPubkey: String + let content: String + let timestamp: Date + } + + /// A person currently visible across the bridge (fresh, not attributed + /// to the local island), for the people sheet. + struct BridgedParticipant: Identifiable, Equatable { + let pubkey: String + let nickname: String? + let lastSeen: Date + var id: String { pubkey } + /// Geohash-chat convention: nickname#last-4-of-pubkey, so two remote + /// "anon"s stay distinguishable. + var displayName: String { + (nickname?.trimmedOrNilIfEmpty ?? "anon") + "#" + String(pubkey.suffix(4)) + } + } + + static let shared = BridgeService() + + /// The user toggle. While true this device publishes its own public mesh + /// messages to the rendezvous and subscribes to it when online. + @Published private(set) var isEnabled: Bool + /// Distinct remote rendezvous participants seen within the freshness + /// window. Approximate by design: local participants are subtracted by + /// matching their events' mesh message IDs against the local timeline, + /// which cannot attribute silent (presence-only) local peers. + @Published private(set) var bridgedPeerCount: Int = 0 + /// The people behind the count, newest activity first. + @Published private(set) var bridgedParticipants: [BridgedParticipant] = [] + /// The rendezvous cell currently in use, when the bridge is active. + @Published private(set) var activeCell: String? + /// Per-session compose flag: while true, outgoing messages stay on the + /// radio — no rendezvous copy is composed, so no gateway can carry them. + @Published var nearbyOnly: Bool = false + + // MARK: Wiring (set once by the bootstrapper; fakes in tests) + + /// Publishes a signed event to the geo relays for a cell. + var publishToRelays: (@MainActor (NostrEvent, String) -> Void)? + /// Opens the rendezvous subscription for (cell + neighbors); events are + /// fed back via `handleRendezvousEvent`. + var openSubscription: (@MainActor ([String]) -> Void)? + /// Closes the rendezvous subscription. + var closeSubscription: (@MainActor () -> Void)? + /// Whether any Nostr relay connection is currently working. + var relaysConnected: (@MainActor () -> Bool)? + /// The local neighborhood cell from CoreLocation, if permitted. + var locationCell: (@MainActor () -> String?)? + /// Asks the location layer for a fresh one-shot fix. The bridge must + /// pump location itself: channel data otherwise only flows while some + /// other feature (channels sheet, location notes) happens to be active — + /// a field failure mode where the bridge silently never got a cell. + var requestLocationFix: (@MainActor () -> Void)? + /// A rendezvous cell advertised by a reachable mesh bridge peer's + /// announce — lets a mesh-only, location-less device still compose + /// correctly tagged events. + var meshAdvertisedCell: (@MainActor () -> String?)? + /// Sends an encoded `toBridge` carrier directed to a bridge peer. + var sendToBridgePeer: (@MainActor (Data, PeerID) -> Bool)? + /// Reachable mesh peers advertising the `.bridge` capability. + var availableBridgePeers: (@MainActor () -> [PeerID])? + /// Broadcasts an encoded `fromBridge` carrier on the mesh. + var broadcastToMesh: (@MainActor (Data) -> Void)? + /// Delivers a validated inbound bridge message to the mesh timeline. + var injectInbound: (@MainActor (InboundBridgeMessage) -> Void)? + /// True when the mesh timeline already holds this message ID (the radio + /// copy) — used to skip pointless downlink airtime. + var isMessageSeenLocally: (@MainActor (String) -> Bool)? + /// Derives the unlinkable per-cell rendezvous identity. + var deriveIdentity: (@MainActor (String) throws -> NostrIdentity)? + /// Local nickname for the `n` tag. + var myNickname: (@MainActor () -> String)? + /// Fired on toggle changes (advertise/withdraw `.bridge` + re-announce). + var onEnabledChanged: (@MainActor (Bool) -> Void)? + /// Fired when the active rendezvous cell changes (including to nil) so + /// the announce advertisement stays current. + var onActiveCellChanged: (@MainActor (String?) -> Void)? + /// Schedules a closure after a delay; nil arms a real `Task`. Injected so + /// timers are deterministic in tests. + var scheduleTimer: (@MainActor (TimeInterval, @escaping @MainActor () -> Void) -> Void)? + + // MARK: State + + /// Loop rule 1: event IDs seen in `fromBridge` mesh broadcasts. + private var meshBroadcastEventIDs: BoundedIDSet + /// Loop rule 2: event IDs this device published (own or deposited). + private var publishedEventIDs: BoundedIDSet + /// Loop rule 3: event IDs this device already rebroadcast. + private var rebroadcastEventIDs: BoundedIDSet + /// Timeline message IDs already injected (either arrival path). + private var injectedMessageIDs: BoundedIDSet + + /// Cells the rendezvous subscription covers (own + neighbor ring). + private(set) var subscribedCells: Set = [] + private(set) var queuedUplinks: [QueuedUplink] = [] + private var uplinkDepositTimes: [PeerID: [Date]] = [:] + private var downlinkSendTimes: [Date] = [] + private var pendingDownlinks: [(event: NostrEvent, cell: String)] = [] + private var downlinkDrainScheduled = false + private var presenceTimerArmed = false + private var lastPresenceAt = Date.distantPast + + /// pubkey -> (lastSeen, attributed-to-local-island, last known nickname). + private var participants: [String: (lastSeen: Date, isLocal: Bool, nickname: String?)] = [:] + + private let defaults: UserDefaults + private let now: () -> Date + private static let enabledKey = "bridge.userEnabled" + + init(defaults: UserDefaults = .standard, now: @escaping () -> Date = Date.init) { + self.defaults = defaults + self.now = now + self.isEnabled = defaults.bool(forKey: Self.enabledKey) + self.meshBroadcastEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + self.publishedEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + self.rebroadcastEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + self.injectedMessageIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + } + + // MARK: - Toggle & lifecycle + + func setEnabled(_ enabled: Bool) { + guard enabled != isEnabled else { return } + isEnabled = enabled + defaults.set(enabled, forKey: Self.enabledKey) + if !enabled { + queuedUplinks.removeAll() + pendingDownlinks.removeAll() + uplinkDepositTimes.removeAll() + participants.removeAll() + bridgedPeerCount = 0 + bridgedParticipants = [] + } + SecureLogger.info("🌉 Bridge mode \(enabled ? "enabled" : "disabled")", category: .session) + refreshRendezvous() + onEnabledChanged?(enabled) + } + + /// Recomputes the active cell and (re)opens or closes the subscription. + /// Call on toggle changes, location updates, and relay connectivity + /// changes; idempotent. + func refreshRendezvous() { + let cell = isEnabled ? currentCell() : nil + // No cell yet: ask for a fix — the availableChannels change re-enters + // here once it lands. + if isEnabled, cell == nil { + requestLocationFix?() + } + guard cell != activeCell else { + // The maintenance timer must run even cell-less: it is what + // retries the location fix (launch races the permission + // callback, so the first request can silently no-op). + if isEnabled { armPresenceTimerIfNeeded() } + return + } + if activeCell != nil { + closeSubscription?() + subscribedCells = [] + } + activeCell = cell + onActiveCellChanged?(cell) + guard let cell else { + if isEnabled { armPresenceTimerIfNeeded() } + return + } + // Own cell + neighbors: islands straddling a cell edge still meet. + // Publishes go to the own cell only; symmetric because both sides + // subscribe to each other's cell via the neighbor ring. + let cells = [cell] + Geohash.neighbors(of: cell) + subscribedCells = Set(cells) + openSubscription?(cells) + SecureLogger.info("🌉 Bridge: rendezvous open for cell \(cell)", category: .session) + publishPresence() + armPresenceTimerIfNeeded() + } + + /// The rendezvous cell: our own location when we have it, else the cell + /// a reachable bridge gateway advertises in its announce. + private func currentCell() -> String? { + if let own = locationCell?(), !own.isEmpty { + return String(own.prefix(Limits.cellPrecision)) + } + if let advertised = meshAdvertisedCell?(), GatewayService.isValidGeohash(advertised) { + return String(advertised.prefix(Limits.cellPrecision)) + } + return nil + } + + // One switch does the right thing: while bridging, a device with + // internet automatically serves its island (accepts deposits, carries + // remote messages onto the radio). The marginal cost over bridging + // yourself is small — the relay connections and subscription already + // exist for you — and a separate "serve others" lever proved to be a + // silent trap for mesh-only neighbors. + + // MARK: - Outgoing (sender role) + + /// Composes and ships the bridged copy of an outgoing public mesh + /// message. Call after the radio send; no-op when the bridge is off, + /// no cell is known, or the message was flagged nearby-only upstream. + func bridgeOutgoing(content: String, messageID: String) { + guard isEnabled, !nearbyOnly, let cell = activeCell ?? currentCell() else { return } + guard content.utf8.count <= Limits.maxContentBytes else { return } + guard let identity = try? deriveIdentity?(cell), + let event = try? NostrProtocol.createBridgeMeshEvent( + content: content, + cell: cell, + senderIdentity: identity, + nickname: myNickname?(), + meshMessageID: messageID + ) else { + SecureLogger.error("🌉 Bridge: failed to compose rendezvous event", category: .session) + return + } + publishedEventIDs.insert(event.id) + injectedMessageIDs.insert(messageID) // our own timeline already has it + if relaysConnected?() ?? false { + publishToRelays?(event, cell) + } else if let carrier = NostrCarrierPacket(direction: .toBridge, geohash: cell, event: event), + let payload = carrier.encode(), + let gateway = availableBridgePeers?().first { + if sendToBridgePeer?(payload, gateway) ?? false { + SecureLogger.debug("🌉 Bridge: uplinked own event via gateway \(gateway.id.prefix(8))…", category: .session) + } + } + } + + /// Publishes a presence heartbeat so silent participants still register + /// across the bridge. Throttled: several triggers (enable, cell change, + /// relay reconnect) can coincide, and same-second heartbeats are + /// byte-identical events anyway. + func publishPresence() { + guard isEnabled, let cell = activeCell, relaysConnected?() ?? false else { return } + guard now().timeIntervalSince(lastPresenceAt) >= 30 else { return } + lastPresenceAt = now() + guard let identity = try? deriveIdentity?(cell), + let event = try? NostrProtocol.createBridgePresenceEvent(cell: cell, senderIdentity: identity) else { return } + publishedEventIDs.insert(event.id) + publishToRelays?(event, cell) + } + + /// Maintenance heartbeat while bridging: presence, participant pruning, + /// and a location retry. Runs with or without a cell — the cell-less + /// case is exactly when the location retry matters. + private func armPresenceTimerIfNeeded() { + guard isEnabled, !presenceTimerArmed else { return } + presenceTimerArmed = true + let fire: @MainActor () -> Void = { [weak self] in + guard let self else { return } + self.presenceTimerArmed = false + self.publishPresence() + self.pruneParticipants() + // Location refresh: migrates cells on a moving device and + // recovers a launch that raced the permission callback. + if self.activeCell == nil { + self.refreshRendezvous() + } else { + self.requestLocationFix?() + } + self.armPresenceTimerIfNeeded() + } + if let scheduleTimer { + scheduleTimer(Limits.presenceIntervalSeconds, fire) + } else { + Task { @MainActor in + try? await Task.sleep(nanoseconds: UInt64(Limits.presenceIntervalSeconds * 1_000_000_000)) + fire() + } + } + } + + // MARK: - Subscription ingress (internet role) + + /// Entry point for every event the rendezvous subscription delivers. + /// Handles presence accounting, timeline injection, and — when acting as + /// the island's gateway — downlink rebroadcast. + func handleRendezvousEvent(_ event: NostrEvent) { + guard isEnabled else { return } + // The subscription spans our cell + neighbors; trust only the + // event's own signed `r` tag, and only within that ring. + guard let cell = event.tags.first(where: { $0.count >= 2 && $0[0] == "r" })?[1], + subscribedCells.contains(cell) else { + return + } + guard let kind = classify(event, cell: cell) else { return } + // Events we published come back from our own subscription; they are + // presence-neutral (we never count ourselves) and never re-injected + // or rebroadcast. Two layers: the published-ID cache (this session) + // and pubkey self-recognition — the rendezvous identity is derived + // deterministically, so even after a relaunch wipes the cache our + // own relay-backfilled events are recognized (field bug: own + // pre-restart messages re-rendered as bridged). + guard !publishedEventIDs.contains(event.id) else { return } + if isOwnRendezvousEvent(event, cell: cell) { + publishedEventIDs.insert(event.id) // never downlink it either + return + } + guard event.isValidSignature() else { return } + + switch kind { + case .presence: + recordParticipant(event.pubkey, isLocal: false, nickname: nil) + case .message(let message): + let isLocalRadioCopy = isMessageSeenLocally?(message.messageID) ?? false + if isLocalRadioCopy { + SecureLogger.debug("🌉 Bridge: radio copy of \(message.messageID.prefix(8))… already present; sender counted as local", category: .session) + } + recordParticipant(event.pubkey, isLocal: isLocalRadioCopy, nickname: message.senderNickname) + inject(message) + // Serving duty: carry remote islands' messages onto the radio for + // mesh-only peers. Local-origin events are skipped — the island + // already heard them (loop rule 3). The drain is jitter-delayed: + // with every online bridger serving, the holdoff lets gateways + // hear each other's broadcasts and skip duplicates. + if !isLocalRadioCopy, + !meshBroadcastEventIDs.contains(event.id), + !rebroadcastEventIDs.contains(event.id), + !pendingDownlinks.contains(where: { $0.event.id == event.id }) { + pendingDownlinks.append((event, cell)) + if pendingDownlinks.count > Limits.maxPendingDownlinks { + pendingDownlinks.removeFirst(pendingDownlinks.count - Limits.maxPendingDownlinks) + } + scheduleDownlinkDrainIfNeeded(jitter: true) + } + } + } + + // MARK: - Mesh carrier ingress (both roles) + + /// Entry point for received `nostrCarrier` packets with bridge + /// directions. `directedToUs` is true for `toBridge` deposits addressed + /// to this device; false for `fromBridge` broadcasts. + func handleMeshCarrier(_ carrier: NostrCarrierPacket, from peerID: PeerID, directedToUs: Bool) { + switch carrier.direction { + case .toBridge: + guard directedToUs else { return } + handleUplinkDeposit(carrier, from: peerID) + case .fromBridge: + guard !directedToUs else { return } + handleDownlinkBroadcast(carrier) + case .toGateway, .fromGateway: + return // GatewayService territory; routed there by the caller. + } + } + + // MARK: - Uplink (gateway role: mesh peer -> internet) + + private func handleUplinkDeposit(_ carrier: NostrCarrierPacket, from depositor: PeerID) { + guard isEnabled else { return } + // Cheap structural gates before any crypto, mirroring GatewayService. + guard let event = structurallyValidEvent(from: carrier) else { + SecureLogger.debug("🌉 Bridge: rejected deposit from \(depositor.id.prefix(8))… (failed validation)", category: .security) + return + } + guard !meshBroadcastEventIDs.contains(event.id), + !publishedEventIDs.contains(event.id), + !queuedUplinks.contains(where: { $0.event.id == event.id }) else { + return + } + guard allowUplinkDeposit(from: depositor) else { + SecureLogger.debug("🌉 Bridge: rate-limited deposit from \(depositor.id.prefix(8))…", category: .session) + return + } + guard event.isValidSignature() else { + SecureLogger.debug("🌉 Bridge: rejected deposit from \(depositor.id.prefix(8))… (bad signature)", category: .security) + return + } + if relaysConnected?() ?? false { + publish(event, cell: carrier.geohash) + } else { + enqueueUplink(QueuedUplink(depositor: depositor, cell: carrier.geohash, event: event)) + } + // No local injection: the depositor's radio broadcast already carried + // the message to this island, including us. + } + + /// Publish everything queued while relays were unreachable. + func flushQueuedUplinks() { + guard isEnabled, relaysConnected?() ?? false, !queuedUplinks.isEmpty else { return } + let queued = queuedUplinks + queuedUplinks.removeAll() + for item in queued where !publishedEventIDs.contains(item.event.id) { + publish(item.event, cell: item.cell) + } + } + + private func publish(_ event: NostrEvent, cell: String) { + publishedEventIDs.insert(event.id) + publishToRelays?(event, cell) + SecureLogger.info("🌉 Bridge: published carried event \(event.id.prefix(8))… for cell \(cell)", category: .session) + } + + @discardableResult + private func enqueueUplink(_ item: QueuedUplink) -> Bool { + let fromDepositor = queuedUplinks.filter { $0.depositor == item.depositor }.count + guard fromDepositor < Limits.maxQueuedUplinksPerDepositor else { return false } + if queuedUplinks.count >= Limits.maxQueuedUplinks { + queuedUplinks.removeFirst(queuedUplinks.count - Limits.maxQueuedUplinks + 1) + } + queuedUplinks.append(item) + return true + } + + private func allowUplinkDeposit(from depositor: PeerID) -> Bool { + let cutoff = now().addingTimeInterval(-60) + var times = uplinkDepositTimes[depositor, default: []] + times.removeAll { $0 < cutoff } + guard times.count < Limits.uplinkEventsPerMinutePerDepositor else { + uplinkDepositTimes[depositor] = times + return false + } + times.append(now()) + uplinkDepositTimes[depositor] = times + if uplinkDepositTimes.count > Limits.maxTrackedEventIDs { + uplinkDepositTimes = uplinkDepositTimes.filter { $0.value.contains { $0 >= cutoff } } + } + return true + } + + // MARK: - Downlink (gateway role: internet -> mesh) + + private func drainPendingDownlinks() { + let cutoff = now().addingTimeInterval(-60) + downlinkSendTimes.removeAll { $0 < cutoff } + while !pendingDownlinks.isEmpty, + downlinkSendTimes.count < Limits.downlinkEventsPerMinute { + let (event, cell) = pendingDownlinks.removeFirst() + guard isFresh(event) else { continue } + // Suppression recheck at send time: another gateway may have + // broadcast this event during our jitter holdoff. + guard !meshBroadcastEventIDs.contains(event.id), + !rebroadcastEventIDs.contains(event.id) else { continue } + guard let carrier = NostrCarrierPacket(direction: .fromBridge, geohash: cell, event: event), + let payload = carrier.encode() else { continue } + broadcastToMesh?(payload) + SecureLogger.debug("🌉 Bridge: downlinked remote event \(event.id.prefix(8))… onto the mesh", category: .session) + // Mark-after-send (loop rule 3): a queue-overflow drop stays + // retryable on relay redelivery. + rebroadcastEventIDs.insert(event.id) + downlinkSendTimes.append(now()) + } + scheduleDownlinkDrainIfNeeded() + } + + private func scheduleDownlinkDrainIfNeeded(jitter: Bool = false) { + guard !pendingDownlinks.isEmpty, !downlinkDrainScheduled else { return } + let delay: TimeInterval + if jitter { + // Multi-gateway suppression window: enough spread for another + // gateway's broadcast to land and mark the event mesh-carried. + delay = Double.random(in: 0.2...1.5) + } else { + let oldest = downlinkSendTimes.min() ?? now() + delay = max(0.05, 60 - now().timeIntervalSince(oldest)) + } + downlinkDrainScheduled = true + let fire: @MainActor () -> Void = { [weak self] in + guard let self else { return } + self.downlinkDrainScheduled = false + self.drainPendingDownlinks() + } + if let scheduleTimer { + scheduleTimer(delay, fire) + } else { + Task { @MainActor in + try? await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000)) + fire() + } + } + } + + // MARK: - Downlink (receiver role: carried event arrives over radio) + + private func handleDownlinkBroadcast(_ carrier: NostrCarrierPacket) { + // Reception is deliberately NOT gated on the toggle: it is passive + // radio, and two phones side by side should not disagree about what + // the channel said. Publishing/subscribing remain opt-in. + guard let event = structurallyValidEvent(from: carrier), + !publishedEventIDs.contains(event.id), + !isOwnRendezvousEvent(event, cell: carrier.geohash), + event.isValidSignature() else { + return + } + // Mark after verification (a forged copy must not poison the cache), + // and use the marking as multi-path dedup. + guard meshBroadcastEventIDs.insert(event.id) else { return } + guard case .message(let message)? = classify(event, cell: carrier.geohash) else { + return + } + recordParticipant(event.pubkey, isLocal: false, nickname: message.senderNickname) + inject(message) + } + + // MARK: - Injection & participants + + private func inject(_ message: InboundBridgeMessage) { + guard injectedMessageIDs.insert(message.messageID) else { return } + guard !(isMessageSeenLocally?(message.messageID) ?? false) else { return } + SecureLogger.info("🌉 Bridge: injected bridged message \(message.messageID.prefix(8))… from \(message.senderNickname)", category: .session) + injectInbound?(message) + } + + private func recordParticipant(_ pubkey: String, isLocal: Bool, nickname: String?) { + let previous = participants[pubkey] + // Local attribution is sticky: one radio-confirmed message marks the + // pubkey as an islander for as long as they stay fresh. Presence + // events carry no nickname, so a known name is never forgotten. + participants[pubkey] = ( + lastSeen: now(), + isLocal: (previous?.isLocal ?? false) || isLocal, + nickname: nickname?.trimmedOrNilIfEmpty ?? previous?.nickname + ) + recomputeBridgedCount() + } + + private func pruneParticipants() { + let cutoff = now().addingTimeInterval(-Limits.participantFreshnessSeconds) + participants = participants.filter { $0.value.lastSeen >= cutoff } + recomputeBridgedCount() + } + + private func recomputeBridgedCount() { + let cutoff = now().addingTimeInterval(-Limits.participantFreshnessSeconds) + let visible = participants + .filter { $0.value.lastSeen >= cutoff && !$0.value.isLocal } + .map { BridgedParticipant(pubkey: $0.key, nickname: $0.value.nickname, lastSeen: $0.value.lastSeen) } + .sorted { $0.lastSeen > $1.lastSeen } + if visible.count != bridgedPeerCount { + bridgedPeerCount = visible.count + } + if visible != bridgedParticipants { + bridgedParticipants = visible + } + } + + // MARK: - Validation + + private enum RendezvousKind { + case message(InboundBridgeMessage) + case presence + } + + /// Classifies a structurally acceptable rendezvous event; nil rejects. + private func classify(_ event: NostrEvent, cell: String) -> RendezvousKind? { + guard isFresh(event), + event.tags.contains(where: { $0.count >= 2 && $0[0] == "r" && $0[1] == cell }), + GatewayService.isValidGeohash(cell) else { + return nil + } + switch event.kind { + case NostrProtocol.EventKind.geohashPresence.rawValue: + return .presence + case NostrProtocol.EventKind.ephemeralEvent.rawValue: + let content = event.content + guard !content.trimmed.isEmpty, content.utf8.count <= Limits.maxContentBytes else { return nil } + let nickname = event.tags.first(where: { $0.count >= 2 && $0[0] == "n" })?[1] + let meshID = event.tags.first(where: { $0.count >= 2 && $0[0] == "m" })?[1] + let messageID = (meshID?.trimmedOrNilIfEmpty) ?? event.id + return .message(InboundBridgeMessage( + messageID: messageID, + senderNickname: nickname?.trimmedOrNilIfEmpty ?? "anon#\(event.pubkey.prefix(4))", + senderPubkey: event.pubkey, + content: content, + timestamp: Date(timeIntervalSince1970: TimeInterval(event.created_at)) + )) + default: + return nil + } + } + + /// Parse + size + cell + kind + `r` tag + freshness, with NO signature + /// verification — callers dedup/rate-limit first, Schnorr-verify last. + private func structurallyValidEvent(from carrier: NostrCarrierPacket) -> NostrEvent? { + guard carrier.eventJSON.count <= NostrCarrierPacket.maxEventJSONBytes, + GatewayService.isValidGeohash(carrier.geohash), + let event = carrier.event(), + classify(event, cell: carrier.geohash) != nil else { + return nil + } + return event + } + + private func isFresh(_ event: NostrEvent) -> Bool { + abs(now().timeIntervalSince1970 - TimeInterval(event.created_at)) <= Limits.maxEventAgeSeconds + } + + /// True when the event was signed by this device's own derived + /// rendezvous identity for the cell. Survives relaunches (unlike the + /// published-ID cache) because the derivation is deterministic; the + /// underlying identity cache makes this cheap. + private func isOwnRendezvousEvent(_ event: NostrEvent, cell: String) -> Bool { + guard let identity = try? deriveIdentity?(cell) else { return false } + return identity.publicKeyHex.lowercased() == event.pubkey.lowercased() + } +} diff --git a/bitchat/Services/Gateway/GatewayService.swift b/bitchat/Services/Gateway/GatewayService.swift index 3b5ec30a..0c7bdc9f 100644 --- a/bitchat/Services/Gateway/GatewayService.swift +++ b/bitchat/Services/Gateway/GatewayService.swift @@ -178,6 +178,10 @@ final class GatewayService: ObservableObject { // Downlink rides broadcast only; a directed fromGateway is malformed. guard !directedToUs else { return } handleDownlinkBroadcast(carrier) + case .toBridge, .fromBridge: + // Mesh-bridge carriers are BridgeService territory; the ingress + // router dispatches them there. + return } } @@ -462,30 +466,3 @@ final class GatewayService: ObservableObject { && geohash.allSatisfy { allowed.contains($0) } } } - -/// Insertion-ordered string set with a fixed capacity; the oldest entry is -/// evicted when full. -private struct BoundedIDSet { - private var members: Set = [] - private var order: [String] = [] - let capacity: Int - - init(capacity: Int) { - self.capacity = capacity - } - - func contains(_ id: String) -> Bool { - members.contains(id) - } - - /// Returns false when the ID was already present. - @discardableResult - mutating func insert(_ id: String) -> Bool { - guard members.insert(id).inserted else { return false } - order.append(id) - if order.count > capacity { - members.remove(order.removeFirst()) - } - return true - } -} diff --git a/bitchat/Services/MessageRouter.swift b/bitchat/Services/MessageRouter.swift index 54b53ee8..f8474776 100644 --- a/bitchat/Services/MessageRouter.swift +++ b/bitchat/Services/MessageRouter.swift @@ -52,6 +52,53 @@ final class MessageRouter { /// message until an ack arrives. var onMessageCarried: ((_ messageID: String, _ peerID: PeerID) -> Void)? + /// Parallel deposit into the internet bridge: park a sealed copy on + /// relays as a courier drop, so delivery stops requiring a physical + /// courier encounter. No-op unless the bridge is enabled. Runs alongside + /// (not instead of) mesh couriers; receivers dedup by message ID. + /// Returns true when a fresh drop was sealed, so the sender's message + /// can show the "carried" state instead of sitting on "sending" forever + /// (the delivery ack has no radio route back until the peers next share + /// a transport). + var bridgeCourierDeposit: ((_ content: String, _ messageID: String, _ recipientNoiseKey: Data) -> Bool)? + + /// Re-attempts bridge drops for retained messages whose recipient no + /// transport can promptly reach anymore. Covers sends that raced the BLE + /// reachability retention window: a peer stays "reachable" for a minute + /// after its radio disappears, so the original send trusted the mesh and + /// skipped the deposit — and nothing else ever retried (field-found). + /// Safe to call often: the drop layer dedups by message ID. + func retryBridgeCourierDeposits() { + guard bridgeCourierDeposit != nil else { return } + for (peerID, queue) in outbox { + guard let recipientKey = courierDirectory.noiseKey(peerID) else { continue } + let promptlyDeliverable = transports.contains { + $0.isPeerReachable(peerID) && $0.canDeliverPromptly(to: peerID) + } + guard !promptlyDeliverable else { continue } + for message in queue where now().timeIntervalSince(message.timestamp) <= Self.messageTTLSeconds { + if bridgeCourierDeposit?(message.content, message.messageID, recipientKey) == true { + onMessageCarried?(message.messageID, peerID) + } + } + } + } + + /// Arms the periodic sweep behind `retryBridgeCourierDeposits`. Called + /// once by the bootstrapper after the deposit closure is wired; separate + /// from init so tests drive the retry directly. + func startBridgeDepositSweep(interval: TimeInterval = 120) { + bridgeSweepTask?.cancel() + bridgeSweepTask = Task { @MainActor [weak self] in + while !Task.isCancelled { + try? await Task.sleep(nanoseconds: UInt64(interval * 1_000_000_000)) + self?.retryBridgeCourierDeposits() + } + } + } + + private var bridgeSweepTask: Task? + private var outbox: [PeerID: [QueuedMessage]] = [:] // Outbox limits to prevent unbounded memory growth @@ -160,6 +207,11 @@ final class MessageRouter { private func attemptCourierDeposit(messageID: String, for peerID: PeerID) { guard let recipientKey = courierDirectory.noiseKey(peerID), let entry = queuedMessage(messageID, for: peerID) else { return } + // The bridge drop needs no connected courier — only the recipient + // key — so it runs before the courier-slot bookkeeping. + if bridgeCourierDeposit?(entry.content, messageID, recipientKey) == true { + onMessageCarried?(messageID, peerID) + } let remainingSlots = Self.maxCouriersPerMessage - entry.depositedCourierKeys.count guard remainingSlots > 0 else { return } diff --git a/bitchat/ViewModels/ChatOutgoingCoordinator.swift b/bitchat/ViewModels/ChatOutgoingCoordinator.swift index d8005099..d0638ebd 100644 --- a/bitchat/ViewModels/ChatOutgoingCoordinator.swift +++ b/bitchat/ViewModels/ChatOutgoingCoordinator.swift @@ -42,6 +42,9 @@ protocol ChatOutgoingContext: AnyObject { func recordPublicActivity(forChannelKey key: String) func sendMeshMessage(_ content: String, mentions: [String], messageID: String, timestamp: Date) func sendGeohash(context: ChatViewModel.GeoOutgoingContext) + /// Ships the bridged (rendezvous) copy of a just-sent public mesh + /// message; no-op when the bridge is off or the send is nearby-only. + func bridgeOutgoingPublicMessage(_ content: String, messageID: String) // MARK: Geohash identity (shared with the other contexts) func deriveNostrIdentity(forGeohash geohash: String) throws -> NostrIdentity @@ -62,6 +65,10 @@ extension ChatViewModel: ChatOutgoingContext { func recordPublicActivity(forChannelKey key: String) { lastPublicActivityAt[key] = Date() } + + func bridgeOutgoingPublicMessage(_ content: String, messageID: String) { + BridgeService.shared.bridgeOutgoing(content: content, messageID: messageID) + } } @MainActor @@ -140,6 +147,7 @@ private extension ChatOutgoingCoordinator { messageID: message.id, timestamp: message.timestamp ) + context.bridgeOutgoingPublicMessage(trimmed, messageID: message.id) } /// Geohash sends mine a NIP-13 nonce tag first (off the main actor, see diff --git a/bitchat/ViewModels/ChatViewModelBootstrapper.swift b/bitchat/ViewModels/ChatViewModelBootstrapper.swift index 55a8925a..4d761d8f 100644 --- a/bitchat/ViewModels/ChatViewModelBootstrapper.swift +++ b/bitchat/ViewModels/ChatViewModelBootstrapper.swift @@ -77,6 +77,8 @@ final class ChatViewModelBootstrapper { bindTransferProgress() configureGeoChannels() configureGateway() + configureBridge() + configureBridgeCourier() bindTeleportState() requestNotifications() registerObservers() @@ -350,15 +352,31 @@ private extension ChatViewModelBootstrapper { bleService?.setLocalCapability(.gateway, enabled: enabled) } bleService.onNostrCarrierPacket = { payload, from, directedToUs in - GatewayService.shared.handleMeshCarrier(payload, from: from, directedToUs: directedToUs) + // One decode, two policy engines: geohash-channel carriers go to + // the gateway, mesh-bridge carriers to the bridge. + guard let carrier = NostrCarrierPacket.decode(payload) else { + SecureLogger.debug("🌐 Gateway: dropping undecodable carrier from \(from.id.prefix(8))…", category: .session) + return + } + switch carrier.direction { + case .toGateway, .fromGateway: + GatewayService.shared.handleMeshCarrier(payload, from: from, directedToUs: directedToUs) + case .toBridge, .fromBridge: + BridgeService.shared.handleMeshCarrier(carrier, from: from, directedToUs: directedToUs) + } } // Uplinks deposited while relays were unreachable flush on reconnect. + // The publisher re-emits `true` on every relay state recompute, so + // dedupe: field logs showed presence published 5x in one second. NostrRelayManager.shared.$isConnected + .removeDuplicates() .receive(on: DispatchQueue.main) .sink { connected in if connected { GatewayService.shared.flushQueuedUplinks() + BridgeService.shared.flushQueuedUplinks() + BridgeService.shared.publishPresence() } } .store(in: &viewModel.cancellables) @@ -369,6 +387,217 @@ private extension ChatViewModelBootstrapper { } } + /// Wires the mesh-bridge policy layer (`BridgeService`) to the mesh + /// transport, the relay manager, location, and the public timeline. Same + /// closure-injection style as `configureGateway`. + func configureBridge() { + guard let bleService = viewModel.meshService as? BLEService else { return } + let bridge = BridgeService.shared + let idBridge = viewModel.idBridge + + bridge.publishToRelays = { event, cell in + let relays = GeoRelayDirectory.shared.closestRelays( + toGeohash: cell, + count: TransportConfig.nostrGeoRelayCount + ) + guard !relays.isEmpty else { + SecureLogger.warning("🌉 Bridge: no geo relays for cell \(cell); not publishing", category: .session) + return + } + NostrRelayManager.shared.sendEvent(event, to: relays) + } + bridge.openSubscription = { cells in + guard let cell = cells.first else { return } + let relays = GeoRelayDirectory.shared.closestRelays( + toGeohash: cell, + count: TransportConfig.nostrGeoRelayCount + ) + NostrRelayManager.shared.subscribe( + filter: .bridgeRendezvous(cells, since: Date().addingTimeInterval(-BridgeService.Limits.maxEventAgeSeconds)), + id: Self.bridgeSubscriptionID, + relayUrls: relays.isEmpty ? nil : relays, + handler: { event in + BridgeService.shared.handleRendezvousEvent(event) + } + ) + } + bridge.closeSubscription = { + NostrRelayManager.shared.unsubscribe(id: Self.bridgeSubscriptionID) + } + bridge.relaysConnected = { NostrRelayManager.shared.isConnected } + bridge.locationCell = { [weak viewModel] in + viewModel?.locationManager.availableChannels + .first { $0.level == .neighborhood }? + .geohash + } + bridge.requestLocationFix = { [weak viewModel] in + viewModel?.locationManager.refreshChannels() + } + bridge.meshAdvertisedCell = { [weak bleService] in + bleService?.advertisedBridgeGeohash() + } + bridge.sendToBridgePeer = { [weak bleService] payload, peer in + bleService?.sendNostrCarrier(payload, to: peer) ?? false + } + bridge.availableBridgePeers = { [weak bleService] in + bleService?.reachableBridgePeers() ?? [] + } + bridge.broadcastToMesh = { [weak bleService] payload in + bleService?.broadcastNostrCarrier(payload) + } + bridge.injectInbound = { [weak viewModel] inbound in + viewModel?.handlePublicMessage(BitchatMessage( + id: inbound.messageID, + sender: inbound.senderNickname, + content: inbound.content, + timestamp: inbound.timestamp, + isRelay: false, + senderPeerID: PeerID(bridge: inbound.senderPubkey), + isBridged: true + )) + } + bridge.isMessageSeenLocally = { [weak viewModel] messageID in + viewModel?.publicConversationContainsMessage(withID: messageID, in: .mesh) ?? false + } + bridge.deriveIdentity = { cell in + try idBridge.deriveIdentity(forBridgeRendezvous: cell) + } + bridge.myNickname = { [weak viewModel] in viewModel?.nickname ?? "" } + + // The `.bridge` capability + cell TLV advertise serving duty: "send + // me deposits, and this is the island's cell". One switch: bridging + // with a known cell is serving (deposits queue through connectivity + // gaps, so the advertisement doesn't flap with the relays). + let updateAdvertisement: @MainActor () -> Void = { [weak bleService] in + let advertise = BridgeService.shared.isEnabled + && BridgeService.shared.activeCell != nil + bleService?.setLocalBridgeGeohash(advertise ? BridgeService.shared.activeCell : nil) + bleService?.setLocalCapability(.bridge, enabled: advertise) + } + bridge.onEnabledChanged = { [weak viewModel] enabled in + updateAdvertisement() + // One switch collapses further: the bridge toggle also drives + // the geohash-channel gateway — bridging with internet means + // sharing it with the mesh around you, full stop. + GatewayService.shared.setEnabled(enabled) + // Flipping the switch is the user-initiated moment to ask for + // location if it was never asked; otherwise the bridge sits + // cell-less with only a settings caption explaining why. + if enabled, viewModel?.locationManager.permissionState == .notDetermined { + viewModel?.locationManager.enableLocationChannels() + } + } + bridge.onActiveCellChanged = { _ in updateAdvertisement() } + // Align a persisted split state (e.g. gateway enabled back when it + // had its own toggle) to the single switch at launch. + if GatewayService.shared.isEnabled != bridge.isEnabled { + GatewayService.shared.setEnabled(bridge.isEnabled) + } + + // Location fixes (or losing them) move the rendezvous cell. + viewModel.locationManager.$availableChannels + .receive(on: DispatchQueue.main) + .sink { _ in BridgeService.shared.refreshRendezvous() } + .store(in: &viewModel.cancellables) + // The authorization callback lands asynchronously after launch; the + // bootstrap-time location request races it and silently no-ops, so + // re-enter when the permission state resolves (field bug: bridge + // stayed cell-less for a whole session). + viewModel.locationManager.$permissionState + .removeDuplicates() + .receive(on: DispatchQueue.main) + .sink { _ in BridgeService.shared.refreshRendezvous() } + .store(in: &viewModel.cancellables) + + // Apply the persisted toggle at launch. + if bridge.isEnabled { + bridge.refreshRendezvous() + updateAdvertisement() + } + } + + /// Wires courier-over-bridge (`BridgeCourierService`) to the relay + /// manager, the mesh transport's sealing/opening primitives, the courier + /// store, and the message router's deposit path. + func configureBridgeCourier() { + guard let bleService = viewModel.meshService as? BLEService else { return } + let courier = BridgeCourierService.shared + + courier.bridgeEnabled = { BridgeService.shared.isEnabled } + courier.relaysConnected = { NostrRelayManager.shared.isConnected } + courier.publishEvent = { event in + // Default (DM) relays: drops need the standing global relay set, + // not geo relays — sender and recipient share no cell. + NostrRelayManager.shared.sendEvent(event) + } + courier.openSubscription = { tagsHex in + NostrRelayManager.shared.unsubscribe(id: Self.courierDropSubscriptionID) + NostrRelayManager.shared.subscribe( + filter: .courierDrops( + recipientTagsHex: tagsHex, + since: Date().addingTimeInterval(-CourierEnvelope.maxLifetimeSeconds) + ), + id: Self.courierDropSubscriptionID, + handler: { event in + BridgeCourierService.shared.handleDropEvent(event) + } + ) + } + courier.closeSubscription = { + NostrRelayManager.shared.unsubscribe(id: Self.courierDropSubscriptionID) + } + courier.myNoiseKey = { [weak bleService] in + bleService?.myNoiseStaticPublicKey() + } + courier.localVerifiedPeers = { [weak bleService] in + bleService?.verifiedPeersWithNoiseKeys() ?? [] + } + courier.sealEnvelope = { [weak bleService] content, messageID, recipientKey in + bleService?.sealBridgeCourierEnvelope(content, messageID: messageID, recipientNoiseKey: recipientKey) + } + courier.openEnvelope = { [weak bleService] envelope in + bleService?.openBridgedCourierEnvelope(envelope) + } + courier.deliverToPeer = { [weak bleService] envelope, peerID in + bleService?.deliverBridgedEnvelope(envelope, to: peerID) + } + courier.heldEnvelopes = { cooldown in + CourierStore.shared.envelopesForBridgePublish(cooldown: cooldown) + } + + viewModel.messageRouter.bridgeCourierDeposit = { content, messageID, recipientKey in + BridgeCourierService.shared.depositDrop(content: content, messageID: messageID, recipientNoiseKey: recipientKey) + } + // (depositDrop's Bool flows back so a dropped message shows the + // "carried" state — a drop's delivery ack can't return over radio.) + viewModel.messageRouter.startBridgeDepositSweep() + bleService.onVerifiedPeerAnnounce = { _ in + Task { @MainActor in + BridgeCourierService.shared.refreshAfterVerifiedAnnounce() + } + } + + // Relay connectivity gates everything; refresh (re)opens or closes. + // Deduped: refresh() resubscribes, and the raw publisher re-emits on + // every relay state recompute (6x in 300ms in field logs). + NostrRelayManager.shared.$isConnected + .removeDuplicates() + .receive(on: DispatchQueue.main) + .sink { _ in BridgeCourierService.shared.refresh() } + .store(in: &viewModel.cancellables) + // Toggle changes re-evaluate the watch set. + BridgeService.shared.$isEnabled + .dropFirst() + .receive(on: DispatchQueue.main) + .sink { _ in BridgeCourierService.shared.refresh() } + .store(in: &viewModel.cancellables) + + courier.refresh() + } + + private static let bridgeSubscriptionID = "bridge-rendezvous" + private static let courierDropSubscriptionID = "bridge-courier-drops" + func bindTeleportState() { viewModel.locationManager.$teleported .receive(on: DispatchQueue.main) diff --git a/bitchat/Views/AppInfoView.swift b/bitchat/Views/AppInfoView.swift index a850f3e4..646d6fde 100644 --- a/bitchat/Views/AppInfoView.swift +++ b/bitchat/Views/AppInfoView.swift @@ -1,17 +1,36 @@ import SwiftUI +/// The sheet behind the "bitchat/" logo: a segmented Settings/Info surface. +/// Settings gathers every user preference (appearance, voice, connectivity +/// toggles, panic wipe); Info keeps the about content (how-to, features, +/// privacy, symbols legend). struct AppInfoView: View { @Environment(\.dismiss) var dismiss @ThemedPalette private var palette @AppStorage(AppTheme.storageKey) private var appThemeRawValue = AppTheme.matrix.rawValue + @EnvironmentObject private var locationChannelsModel: LocationChannelsModel + @ObservedObject private var bridgeService = BridgeService.shared /// Supplies the mesh topology map data. Nil (previews, missing wiring) /// hides the topology row entirely. var topologyProvider: (@MainActor () -> MeshTopologyDisplayModel)? + /// Wipes all local data. Nil (previews, missing wiring) hides the danger + /// zone entirely. + var onPanicWipe: (@MainActor () -> Void)? + @State private var showTopology = false @State private var liveVoiceEnabled = PTTSettings.liveVoiceEnabled @State private var locationNotesEnabled = LocationNotesSettings.enabled @ObservedObject private var locationManager = LocationChannelManager.shared + /// Sticky across opens: first-ever open lands on Info (the gentler + /// introduction), and afterwards the sheet reopens wherever it was left. + @AppStorage("appInfo.selectedPane") private var selectedPane: Pane = .info + @State private var showPanicConfirmation = false + + private enum Pane: String { + case settings + case info + } private var selectedTheme: AppTheme { AppTheme(rawValue: appThemeRawValue) ?? .matrix @@ -20,13 +39,48 @@ struct AppInfoView: View { private var textColor: Color { palette.primary } private var secondaryTextColor: Color { palette.secondary } - + // MARK: - Constants private enum Strings { static let appName: LocalizedStringKey = "app_info.app_name" static let tagline: LocalizedStringKey = "app_info.tagline" static let appearanceTitle: LocalizedStringKey = "app_info.appearance.title" + /// New keys carry their English copy inline (defaultValue) until the + /// i18n pass lands them in the catalog; moved keys keep their homes. + enum Settings { + static let tabPickerLabel = String(localized: "app_info.tab.picker_label", defaultValue: "view", comment: "Accessibility label for the segmented control switching between the settings and info panes of the app info sheet") + static let tabSettings = String(localized: "app_info.tab.settings", defaultValue: "settings", comment: "Segmented control label for the settings pane of the app info sheet") + static let tabInfo = String(localized: "app_info.tab.info", defaultValue: "info", comment: "Segmented control label for the info pane of the app info sheet") + + static let connectivityTitle = String(localized: "app_info.settings.connectivity.title", defaultValue: "CONNECTIVITY", comment: "Section header (uppercase) for the connectivity toggles: mesh bridge, internet gateway, tor routing") + + static let bridgeTitle = String(localized: "app_info.settings.bridge.title", defaultValue: "mesh bridge", comment: "Title of the mesh bridge toggle in settings") + static let bridgeSubtitle = String(localized: "app_info.settings.bridge.subtitle", defaultValue: "joins nearby mesh islands over the internet: what you say in the mesh channel also reaches people in your area beyond radio range, and their messages appear here marked with the network glyph. while you have internet, your device also carries bridge and location-channel traffic for phones around you that have none.", comment: "Subtitle explaining what the mesh bridge toggle does") + static func bridgeCell(_ cell: String) -> String { + String( + format: String(localized: "app_info.settings.bridge.cell", defaultValue: "rendezvous cell: %@", comment: "Caption under the mesh bridge toggle showing the geohash cell the bridge is meeting on"), + locale: .current, + cell + ) + } + static let bridgeNoCell = String(localized: "app_info.settings.bridge.no_cell", defaultValue: "no rendezvous cell yet — needs location access or a nearby bridge peer", comment: "Caption under the mesh bridge toggle when the bridge is on but has no geohash cell to meet on") + + // Moved from LocationChannelsSheet; keys unchanged. (The former + // internet-gateway toggle is gone: the bridge switch drives all + // internet sharing, including geohash-channel gatewaying.) + static let torTitle: LocalizedStringKey = "location_channels.tor.title" + static let torSubtitle: LocalizedStringKey = "location_channels.tor.subtitle" + static let toggleOn: LocalizedStringKey = "common.toggle.on" + static let toggleOff: LocalizedStringKey = "common.toggle.off" + + static let dangerTitle = String(localized: "app_info.settings.danger.title", defaultValue: "DANGER ZONE", comment: "Section header (uppercase) for destructive actions in settings") + static let panicButton = String(localized: "app_info.settings.danger.panic_button", defaultValue: "panic wipe", comment: "Button in the settings danger zone that erases all local data after confirmation") + static let panicNote = String(localized: "app_info.settings.danger.panic_note", defaultValue: "erases all messages, keys, and identity. triple-tapping the bitchat/ logo does the same, instantly.", comment: "Caption under the panic wipe button explaining what it does and the triple-tap shortcut") + static let panicConfirmTitle = String(localized: "app_info.settings.danger.panic_confirm_title", defaultValue: "wipe all data?", comment: "Title of the confirmation dialog before a panic wipe") + static let panicConfirmAction = String(localized: "app_info.settings.danger.panic_confirm_action", defaultValue: "wipe everything", comment: "Destructive confirmation button that performs the panic wipe") + } + enum Features { static let title: LocalizedStringKey = "app_info.features.title" static let offlineComm = AppInfoFeatureInfo( @@ -59,46 +113,47 @@ struct AppInfoView: View { title: "app_info.features.geohash.title", description: "app_info.features.geohash.description" ) + static let bridge = AppInfoFeatureInfo( + icon: "network", + resolvedTitle: String(localized: "app_info.features.bridge.title", defaultValue: "mesh bridging", comment: "Feature row title for the mesh bridge in the app info sheet"), + resolvedDescription: String(localized: "app_info.features.bridge.description", defaultValue: "links nearby mesh islands through the internet so one crowd isn't split by radio range", comment: "Feature row description for the mesh bridge in the app info sheet") + ) } enum Legend { static let title: LocalizedStringKey = "app_info.legend.title" /// Every glyph the peer lists and headers use, in one place — - /// nothing else in the app defines them. - static let items: [(icon: String, text: LocalizedStringKey)] = [ - ("antenna.radiowaves.left.and.right", "app_info.legend.mesh_connected"), - ("point.3.filled.connected.trianglepath.dotted", "app_info.legend.mesh_relayed"), - ("globe", "app_info.legend.nostr"), - ("person", "app_info.legend.offline"), - ("mappin.and.ellipse", "app_info.legend.location_nearby"), - ("face.dashed", "app_info.legend.teleported"), - ("lock.fill", "app_info.legend.encrypted"), - ("lock.slash", "app_info.legend.encryption_failed"), - ("checkmark.seal.fill", "app_info.legend.verified"), - ("star.fill", "app_info.legend.favorite"), - ("envelope.fill", "app_info.legend.unread"), - ("nosign", "app_info.legend.blocked") + /// nothing else in the app defines them. A nil color renders in + /// the theme's primary text color. + static let items: [(icon: String, color: Color?, text: String)] = [ + ("antenna.radiowaves.left.and.right", nil, String(localized: "app_info.legend.mesh_connected")), + ("point.3.filled.connected.trianglepath.dotted", nil, String(localized: "app_info.legend.mesh_relayed")), + ("globe", nil, String(localized: "app_info.legend.nostr")), + ("network", Color.cyan, String(localized: "app_info.legend.bridged", defaultValue: "message arrived across a mesh bridge", comment: "Symbols legend entry for the cyan network glyph shown on messages carried across a mesh bridge")), + ("person", nil, String(localized: "app_info.legend.offline")), + ("mappin.and.ellipse", nil, String(localized: "app_info.legend.location_nearby")), + ("face.dashed", nil, String(localized: "app_info.legend.teleported")), + ("lock.fill", nil, String(localized: "app_info.legend.encrypted")), + ("lock.slash", nil, String(localized: "app_info.legend.encryption_failed")), + ("checkmark.seal.fill", nil, String(localized: "app_info.legend.verified")), + ("star.fill", nil, String(localized: "app_info.legend.favorite")), + ("envelope.fill", nil, String(localized: "app_info.legend.unread")), + ("nosign", nil, String(localized: "app_info.legend.blocked")) ] } enum Voice { static let title: LocalizedStringKey = "app_info.voice.title" - static let live = AppInfoFeatureInfo( - icon: "dot.radiowaves.left.and.right", - title: "app_info.voice.live.title", - description: "app_info.voice.live.description" - ) + // The live-voice title/description keys are referenced inline at + // the toggle (they ride the shared settingToggle now). } enum Location { - static let title: LocalizedStringKey = "app_info.location.title" static let notes = AppInfoFeatureInfo( icon: "mappin.and.ellipse", title: "app_info.location.notes.title", description: "app_info.location.notes.description" ) - static let enable: LocalizedStringKey = "app_info.location.enable" - static let openSettings: LocalizedStringKey = "app_info.location.open_settings" } enum Network { @@ -149,7 +204,7 @@ struct AppInfoView: View { } } - + var body: some View { #if os(macOS) VStack(spacing: 0) { @@ -165,8 +220,12 @@ struct AppInfoView: View { } .themedSurface(opacity: 0.95) - ScrollView { - infoContent + VStack(spacing: 0) { + panePicker + + ScrollView { + paneContent + } } .themedSheetBackground() } @@ -178,8 +237,12 @@ struct AppInfoView: View { } #else NavigationView { - ScrollView { - infoContent + VStack(spacing: 0) { + panePicker + + ScrollView { + paneContent + } } .themedSheetBackground() .navigationBarTitleDisplayMode(.inline) @@ -197,33 +260,35 @@ struct AppInfoView: View { } #endif } - + + // MARK: - Pane switching + + private var panePicker: some View { + Picker(Strings.Settings.tabPickerLabel, selection: $selectedPane) { + Text(Strings.Settings.tabInfo).tag(Pane.info) + Text(Strings.Settings.tabSettings).tag(Pane.settings) + } + .pickerStyle(.segmented) + .labelsHidden() + .padding(.horizontal) + .padding(.top, 12) + } + @ViewBuilder - private var infoContent: some View { + private var paneContent: some View { + switch selectedPane { + case .settings: + settingsContent + case .info: + infoContent + } + } + + // MARK: - Settings pane + + @ViewBuilder + private var settingsContent: some View { VStack(alignment: .leading, spacing: 24) { - // Header - VStack(alignment: .center, spacing: 8) { - Text(Strings.appName) - .bitchatFont(size: 32, weight: .bold) - .foregroundColor(textColor) - - Text(Strings.tagline) - .bitchatFont(size: 16) - .foregroundColor(secondaryTextColor) - } - .frame(maxWidth: .infinity) - .padding(.vertical) - - // How to Use - VStack(alignment: .leading, spacing: 16) { - SectionHeader(Strings.HowToUse.title) - - Text(verbatim: Strings.HowToUse.paragraph) - .bitchatFont(size: 14) - .foregroundColor(textColor) - .fixedSize(horizontal: false, vertical: true) - } - // Appearance — single row: label left, theme chips right HStack(spacing: 12) { SectionHeader(Strings.appearanceTitle) @@ -248,39 +313,216 @@ struct AppInfoView: View { } } - // Voice - VStack(alignment: .leading, spacing: 16) { + // Voice — same card + IRC pill as every other toggle setting. + VStack(alignment: .leading, spacing: 12) { SectionHeader(Strings.Voice.title) - HStack(spacing: 0) { - FeatureRow(info: Strings.Voice.live) - Toggle(Strings.Voice.live.title, isOn: $liveVoiceEnabled) - .labelsHidden() - .tint(palette.accent) - .onChange(of: liveVoiceEnabled) { newValue in - PTTSettings.liveVoiceEnabled = newValue - } + settingsCard { + settingToggle( + title: Text("app_info.voice.live.title"), + subtitle: Text("app_info.voice.live.description"), + isOn: Binding( + get: { liveVoiceEnabled }, + set: { newValue in + liveVoiceEnabled = newValue + PTTSettings.liveVoiceEnabled = newValue + } + ) + ) } } - // Location (notes / dead drops) - VStack(alignment: .leading, spacing: 16) { - SectionHeader(Strings.Location.title) + // Connectivity: mesh bridge, internet gateway, tor routing + VStack(alignment: .leading, spacing: 12) { + SectionHeader(verbatim: Strings.Settings.connectivityTitle) - HStack(spacing: 0) { - FeatureRow(info: Strings.Location.notes) - Toggle(Strings.Location.notes.title, isOn: $locationNotesEnabled) - .labelsHidden() - .tint(palette.accent) - .onChange(of: locationNotesEnabled) { newValue in - LocationNotesSettings.enabled = newValue - if newValue { - locationManager.enableLocationChannels() - } - } + settingsCard { + settingToggle( + title: Text(Strings.Settings.bridgeTitle), + subtitle: Text(Strings.Settings.bridgeSubtitle), + isOn: bridgeToggleBinding + ) + // Where the bridge meets: the geohash rendezvous cell, or + // a hint about why there isn't one yet (no location and no + // bridge peer advertising a cell). + if bridgeService.isEnabled { + Text(bridgeService.activeCell.map(Strings.Settings.bridgeCell) ?? Strings.Settings.bridgeNoCell) + .bitchatFont(size: 11) + .foregroundColor(secondaryTextColor) + } } - locationPermissionRow + settingsCard { + settingToggle( + title: Text(Strings.Settings.torTitle), + subtitle: Text(Strings.Settings.torSubtitle), + isOn: torToggleBinding + ) + } + + // Location notes / dead drops (merged from main's flat + // layout into the shared card + pill style). Turning it on + // may need the location prompt; the permission control below + // covers the denied path. + settingsCard { + settingToggle( + title: Strings.Location.notes.title, + subtitle: Strings.Location.notes.description, + isOn: Binding( + get: { locationNotesEnabled }, + set: { newValue in + locationNotesEnabled = newValue + LocationNotesSettings.enabled = newValue + if newValue { + locationManager.enableLocationChannels() + } + } + ) + ) + } + + // Location powers the channels list and the bridge cell, so + // its control lives with the other connectivity settings. + // Platform reality shapes the three states: the app may only + // prompt while never-asked; granted/denied both flip in the + // system permission screen. + switch locationChannelsModel.permissionState { + case .authorized: + Button(action: SystemSettings.location.open) { + Text("location_channels.action.remove_access") + .bitchatFont(size: 12) + .foregroundColor(palette.alertRed) + .frame(maxWidth: .infinity) + .padding(.vertical, 6) + .background(Color.red.opacity(0.08)) + .cornerRadius(6) + } + .buttonStyle(.plain) + case .notDetermined: + Button(action: { locationChannelsModel.enableLocationChannels() }) { + Text("location_channels.action.request_permissions") + .bitchatFont(size: 12) + .foregroundColor(palette.accent) + .frame(maxWidth: .infinity) + .padding(.vertical, 6) + .background(palette.accent.opacity(0.12)) + .cornerRadius(6) + } + .buttonStyle(.plain) + case .denied, .restricted: + settingsCard { + Text("location_channels.permission_denied") + .bitchatFont(size: 11) + .foregroundColor(secondaryTextColor) + Button("location_channels.action.open_settings", action: SystemSettings.location.open) + .buttonStyle(.plain) + .bitchatFont(size: 12) + .foregroundColor(palette.accent) + } + } + } + + // Danger zone + if onPanicWipe != nil { + VStack(alignment: .leading, spacing: 12) { + SectionHeader(verbatim: Strings.Settings.dangerTitle) + + Button(action: { showPanicConfirmation = true }) { + Text(Strings.Settings.panicButton) + .bitchatFont(size: 12) + .foregroundColor(palette.alertRed) + .frame(maxWidth: .infinity) + .padding(.vertical, 6) + .background(Color.red.opacity(0.08)) + .cornerRadius(6) + } + .buttonStyle(.plain) + .confirmationDialog( + Strings.Settings.panicConfirmTitle, + isPresented: $showPanicConfirmation, + titleVisibility: .visible + ) { + Button(Strings.Settings.panicConfirmAction, role: .destructive) { + onPanicWipe?() + } + Button("common.cancel", role: .cancel) {} + } + + Text(Strings.Settings.panicNote) + .bitchatFont(size: 11) + .foregroundColor(secondaryTextColor) + .fixedSize(horizontal: false, vertical: true) + } + } + } + .padding() + } + + private var bridgeToggleBinding: Binding { + Binding( + get: { bridgeService.isEnabled }, + set: { bridgeService.setEnabled($0) } + ) + } + + private var torToggleBinding: Binding { + Binding( + get: { locationChannelsModel.userTorEnabled }, + set: { locationChannelsModel.setUserTorEnabled($0) } + ) + } + + /// The padded card every connectivity setting sits in (moved look from + /// LocationChannelsSheet's toggle sections). + private func settingsCard(@ViewBuilder _ content: () -> Content) -> some View { + VStack(alignment: .leading, spacing: 8, content: content) + .padding(12) + .background(palette.secondary.opacity(0.12)) + .cornerRadius(8) + } + + /// A title+subtitle row driving an IRC-style on/off pill — the one + /// toggle style every setting uses. + private func settingToggle(title: Text, subtitle: Text, isOn: Binding) -> some View { + Toggle(isOn: isOn) { + VStack(alignment: .leading, spacing: 2) { + title + .bitchatFont(size: 12, weight: .semibold) + .foregroundColor(textColor) + subtitle + .bitchatFont(size: 11) + .foregroundColor(secondaryTextColor) + } + } + .toggleStyle(IRCToggleStyle(accent: palette.accent, onLabel: Strings.Settings.toggleOn, offLabel: Strings.Settings.toggleOff)) + } + + // MARK: - Info pane + + @ViewBuilder + private var infoContent: some View { + VStack(alignment: .leading, spacing: 24) { + // Header + VStack(alignment: .center, spacing: 8) { + Text(Strings.appName) + .bitchatFont(size: 32, weight: .bold) + .foregroundColor(textColor) + + Text(Strings.tagline) + .bitchatFont(size: 16) + .foregroundColor(secondaryTextColor) + } + .frame(maxWidth: .infinity) + .padding(.vertical) + + // How to Use + VStack(alignment: .leading, spacing: 16) { + SectionHeader(Strings.HowToUse.title) + + Text(verbatim: Strings.HowToUse.paragraph) + .bitchatFont(size: 14) + .foregroundColor(textColor) + .fixedSize(horizontal: false, vertical: true) } // Network diagnostics @@ -314,6 +556,8 @@ struct AppInfoView: View { FeatureRow(info: Strings.Features.extendedRange) + FeatureRow(info: Strings.Features.bridge) + FeatureRow(info: Strings.Features.favorites) FeatureRow(info: Strings.Features.geohash) @@ -340,7 +584,7 @@ struct AppInfoView: View { HStack(alignment: .top, spacing: 12) { Image(systemName: item.icon) .font(.bitchatSystem(size: 14)) - .foregroundColor(textColor) + .foregroundColor(item.color ?? textColor) .frame(width: 30) Text(item.text) @@ -358,52 +602,44 @@ struct AppInfoView: View { } } -private extension AppInfoView { - /// One status/action line under the notes toggle so the location - /// requirement is actionable right here instead of only in the channel - /// sheet. - @ViewBuilder - var locationPermissionRow: some View { - if locationNotesEnabled { - switch locationManager.permissionState { - case .notDetermined: - Button(Strings.Location.enable) { - locationManager.enableLocationChannels() - } - .buttonStyle(.plain) - .bitchatFont(size: 13) - .foregroundColor(palette.accent) - case .denied, .restricted: - Button(Strings.Location.openSettings, action: SystemSettings.location.open) - .buttonStyle(.plain) - .bitchatFont(size: 13) - .foregroundColor(palette.accent) - case .authorized: - // Granted needs no status line — the toggle being on says it. - EmptyView() - } - } +struct AppInfoFeatureInfo { + let icon: String + let title: Text + let description: Text + + /// Catalog-backed strings (existing keys). + init(icon: String, title: LocalizedStringKey, description: LocalizedStringKey) { + self.icon = icon + self.title = Text(title) + self.description = Text(description) + } + + /// Pre-resolved strings — new keys that carry their English defaultValue + /// inline until the i18n pass adds them to the catalog. + init(icon: String, resolvedTitle: String, resolvedDescription: String) { + self.icon = icon + self.title = Text(resolvedTitle) + self.description = Text(resolvedDescription) } } -struct AppInfoFeatureInfo { - let icon: String - let title: LocalizedStringKey - let description: LocalizedStringKey -} - struct SectionHeader: View { - let title: LocalizedStringKey + private let title: Text @ThemedPalette private var palette private var textColor: Color { palette.primary } init(_ title: LocalizedStringKey) { - self.title = title + self.title = Text(title) } - + + /// For pre-resolved strings (new keys with inline defaultValue). + init(verbatim title: String) { + self.title = Text(title) + } + var body: some View { - Text(title) + title .bitchatFont(size: 16, weight: .bold) .foregroundColor(textColor) .padding(.top, 8) @@ -424,18 +660,18 @@ struct FeatureRow: View { .font(.bitchatSystem(size: 20)) .foregroundColor(textColor) .frame(width: 30) - + VStack(alignment: .leading, spacing: 4) { - Text(info.title) + info.title .bitchatFont(size: 14, weight: .semibold) .foregroundColor(textColor) - - Text(info.description) + + info.description .bitchatFont(size: 12) .foregroundColor(secondaryTextColor) .fixedSize(horizontal: false, vertical: true) } - + Spacer() } } @@ -443,14 +679,17 @@ struct FeatureRow: View { #Preview("Default") { AppInfoView() + .environmentObject(LocationChannelsModel()) } #Preview("Dynamic Type XXL") { AppInfoView() + .environmentObject(LocationChannelsModel()) .environment(\.sizeCategory, .accessibilityExtraExtraExtraLarge) } #Preview("Dynamic Type XS") { AppInfoView() + .environmentObject(LocationChannelsModel()) .environment(\.sizeCategory, .extraSmall) } diff --git a/bitchat/Views/BridgePeopleList.swift b/bitchat/Views/BridgePeopleList.swift new file mode 100644 index 00000000..89162397 --- /dev/null +++ b/bitchat/Views/BridgePeopleList.swift @@ -0,0 +1,76 @@ +// +// BridgePeopleList.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import SwiftUI + +/// Shared section header for the people sheet: a small glyph + label pair, +/// identical shape for every section (#mesh, across the bridge, …). +struct PeopleSectionHeader: View { + @ThemedPalette private var palette + let icon: String + let iconColor: Color + let title: String + + var body: some View { + HStack(spacing: 6) { + Image(systemName: icon) + .font(.bitchatSystem(size: 10)) + .foregroundColor(iconColor) + Text(verbatim: title) + .bitchatFont(size: 11, weight: .semibold) + .foregroundColor(palette.secondary) + } + .padding(.horizontal) + .padding(.top, 12) + .padding(.bottom, 4) + .accessibilityElement(children: .combine) + .accessibilityAddTraits(.isHeader) + } +} + +/// The people-sheet section for participants visible across the mesh bridge: +/// same place, beyond radio range. Display-only in v1 — bridged identities +/// are per-cell rendezvous keys with no DM route yet. +struct BridgePeopleList: View { + @ObservedObject private var bridgeService = BridgeService.shared + @ThemedPalette private var palette + + private enum Strings { + static let sectionTitle = String(localized: "bridge_people.section_title", defaultValue: "across the bridge", comment: "Section header in the people sheet for participants reachable via the mesh bridge") + static let rowHint = String(localized: "bridge_people.accessibility.row_hint", defaultValue: "In your area, connected through the bridge", comment: "Accessibility hint for a person listed in the bridge section of the people sheet") + } + + var body: some View { + // Not gated on the toggle: bridged people arrive over passive radio + // (a serving neighbor's carriers) even while this device's own + // bridge is off — whoever is visible in the timeline belongs in the + // sheet. + if !bridgeService.bridgedParticipants.isEmpty { + VStack(alignment: .leading, spacing: 0) { + PeopleSectionHeader( + icon: "network", + iconColor: Color.cyan.opacity(0.9), + title: Strings.sectionTitle + ) + + ForEach(bridgeService.bridgedParticipants) { person in + HStack(spacing: 4) { + Text(person.displayName) + .bitchatFont(size: 14) + .foregroundColor(palette.primary) + Spacer() + } + .padding(.horizontal) + .padding(.vertical, 4) + .accessibilityElement(children: .combine) + .accessibilityHint(Strings.rowHint) + } + } + } + } +} diff --git a/bitchat/Views/Components/IRCToggleStyle.swift b/bitchat/Views/Components/IRCToggleStyle.swift new file mode 100644 index 00000000..0b97bf08 --- /dev/null +++ b/bitchat/Views/Components/IRCToggleStyle.swift @@ -0,0 +1,34 @@ +import SwiftUI + +/// IRC-flavored toggle: the whole row is one button and the state is spelled +/// out as an on/off pill instead of a system switch. Shared by the settings +/// surfaces (App Info's connectivity toggles and friends). +struct IRCToggleStyle: ToggleStyle { + let accent: Color + let onLabel: LocalizedStringKey + let offLabel: LocalizedStringKey + + func makeBody(configuration: Configuration) -> some View { + Button(action: { configuration.isOn.toggle() }) { + HStack(spacing: 12) { + configuration.label + Spacer() + Text(configuration.isOn ? onLabel : offLabel) + .textCase(.uppercase) + .bitchatFont(size: 12, weight: .semibold) + .foregroundColor(configuration.isOn ? accent : .secondary) + .padding(.vertical, 4) + .padding(.horizontal, 10) + .background( + RoundedRectangle(cornerRadius: 6) + .fill(accent.opacity(configuration.isOn ? 0.18 : 0.08)) + ) + .overlay( + RoundedRectangle(cornerRadius: 6) + .stroke(accent.opacity(configuration.isOn ? 0.35 : 0.15), lineWidth: 1) + ) + } + } + .buttonStyle(.plain) + } +} diff --git a/bitchat/Views/Components/TextMessageView.swift b/bitchat/Views/Components/TextMessageView.swift index 4c96b201..497b4280 100644 --- a/bitchat/Views/Components/TextMessageView.swift +++ b/bitchat/Views/Components/TextMessageView.swift @@ -50,6 +50,15 @@ struct TextMessageView: View { .padding(.trailing, 4) .accessibilityHidden(true) } + if message.isBridged { + Image(systemName: "network") + .font(.bitchatSystem(size: 8)) + .foregroundColor(Color.cyan.opacity(0.75)) + .padding(.trailing, 4) + .accessibilityLabel( + String(localized: "content.accessibility.bridged_message", defaultValue: "Arrived across a mesh bridge", comment: "Accessibility label for the glyph marking a message that arrived across a mesh bridge") + ) + } Text(conversationUIModel.formatMessage(message, colorScheme: colorScheme, theme: theme)) .fixedSize(horizontal: false, vertical: true) .lineLimit(isLong && !isExpanded ? TransportConfig.uiLongMessageLineLimit : nil) diff --git a/bitchat/Views/ContentComposerView.swift b/bitchat/Views/ContentComposerView.swift index 6ebcd756..9913ce03 100644 --- a/bitchat/Views/ContentComposerView.swift +++ b/bitchat/Views/ContentComposerView.swift @@ -7,6 +7,7 @@ struct ContentComposerView: View { @EnvironmentObject private var conversationUIModel: ConversationUIModel @EnvironmentObject private var privateConversationModel: PrivateConversationModel @EnvironmentObject private var locationChannelsModel: LocationChannelsModel + @ObservedObject private var bridgeService = BridgeService.shared @Environment(\.appTheme) private var theme @ThemedPalette private var palette @@ -89,6 +90,10 @@ struct ContentComposerView: View { } HStack(alignment: .center, spacing: 4) { + if showsNearbyOnlyToggle { + nearbyOnlyToggle + } + if conversationUIModel.canSendMediaInCurrentContext { attachmentButton } @@ -108,6 +113,41 @@ struct ContentComposerView: View { } private extension ContentComposerView { + /// The nearby-only scope toggle appears only where it means something: + /// the public mesh channel with the bridge on. + var showsNearbyOnlyToggle: Bool { + guard bridgeService.isEnabled, + privateConversationModel.selectedHeaderState == nil, + case .mesh = locationChannelsModel.selectedChannel else { + return false + } + return true + } + + /// Scope control for outgoing messages: bridged (default, crosses to + /// other islands in this area) vs nearby-only (radio range, no internet + /// copy exists for any gateway to carry). + var nearbyOnlyToggle: some View { + Button(action: { bridgeService.nearbyOnly.toggle() }) { + Image(systemName: bridgeService.nearbyOnly ? "antenna.radiowaves.left.and.right" : "network") + .font(.bitchatSystem(size: 16)) + .foregroundColor(bridgeService.nearbyOnly ? palette.secondary : Color.cyan.opacity(0.9)) + .frame(width: 28, height: 28) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityLabel( + bridgeService.nearbyOnly + ? String(localized: "content.accessibility.nearby_only_on", defaultValue: "Nearby only: messages stay within radio range", comment: "Accessibility label for the compose scope toggle when messages stay local") + : String(localized: "content.accessibility.nearby_only_off", defaultValue: "Bridged: messages also reach people across the bridge", comment: "Accessibility label for the compose scope toggle when messages cross the mesh bridge") + ) + .help( + bridgeService.nearbyOnly + ? String(localized: "content.composer.nearby_only_on", defaultValue: "Nearby only — this message won't cross the bridge", comment: "Tooltip for the compose scope toggle when messages stay local") + : String(localized: "content.composer.nearby_only_off", defaultValue: "Bridged — reaches people beyond radio range in this area", comment: "Tooltip for the compose scope toggle when messages cross the mesh bridge") + ) + } + /// States where a message will land: the DM partner's name for private /// chats, the channel (and its public nature) otherwise — so a stressed /// user never has to guess who can read what they're typing. diff --git a/bitchat/Views/ContentHeaderView.swift b/bitchat/Views/ContentHeaderView.swift index 792e2870..96b548fb 100644 --- a/bitchat/Views/ContentHeaderView.swift +++ b/bitchat/Views/ContentHeaderView.swift @@ -6,6 +6,7 @@ struct ContentHeaderView: View { @EnvironmentObject private var locationChannelsModel: LocationChannelsModel @EnvironmentObject private var peerListModel: PeerListModel @EnvironmentObject private var boardAlertsModel: BoardAlertsModel + @ObservedObject private var bridgeService = BridgeService.shared @Environment(\.dynamicTypeSize) private var dynamicTypeSize @Environment(\.appTheme) private var theme @ThemedPalette private var palette @@ -21,9 +22,6 @@ struct ContentHeaderView: View { /// Courier envelopes this device is carrying for offline third parties. @State private var carriedMailCount = 0 - /// Unified notices sheet (board posts + location notes) for the current - /// channel context. - /// Board posts mirrored from the store so the pin icon can show when the /// current scope has notices. @State private var boardPosts: [BoardPostPacket] = [] @@ -32,6 +30,12 @@ struct ContentHeaderView: View { /// timeline is showing) — they should light the pin too. @ObservedObject private var nearbyNotes = NearbyNotesCounter.shared + /// The bridged-people count belongs to the mesh channel only. + private var showBridgedPeerCount: Bool { + if case .location = locationChannelsModel.selectedChannel { return false } + return bridgeService.bridgedPeerCount > 0 + } + var body: some View { HStack(spacing: 0) { Text(verbatim: "bitchat/") @@ -101,12 +105,17 @@ struct ContentHeaderView: View { if case .location = locationChannelsModel.selectedChannel { return peerListModel.visibleGeohashPeerCount } - return countAndColor.0 + // One number for the whole room: radio-reachable peers plus + // people across the bridge (visible via carriers even while + // this device's own bridge is off). The sheet breaks it down. + return countAndColor.0 + bridgeService.bridgedPeerCount }() HStack(spacing: 2) { if locationChannelsModel.gatewayEnabled { - Button(action: { appChromeModel.isLocationChannelsSheetPresented = true }) { + // The gateway toggle lives in the App Info settings pane + // now, so the indicator deep-links there. + Button(action: { appChromeModel.presentAppInfo() }) { Image(systemName: "globe") .font(.bitchatSystem(size: 12)) .foregroundColor(palette.secondary.opacity(0.8)) @@ -117,7 +126,7 @@ struct ContentHeaderView: View { String(localized: "content.accessibility.gateway_active", defaultValue: "Internet gateway active, sharing your connection with the mesh", comment: "Accessibility label for the internet gateway indicator") ) .accessibilityHint( - String(localized: "content.accessibility.gateway_hint", defaultValue: "Opens channel settings to turn the gateway on or off", comment: "Accessibility hint for the internet gateway indicator explaining a tap opens the channel sheet") + String(localized: "content.accessibility.gateway_settings_hint", defaultValue: "Opens settings to turn the gateway on or off", comment: "Accessibility hint for the internet gateway indicator explaining a tap opens the settings sheet") ) .help( String(localized: "content.header.gateway_active", defaultValue: "Sharing your internet connection with nearby mesh peers", comment: "Tooltip for the internet gateway indicator") @@ -265,11 +274,17 @@ struct ContentHeaderView: View { ) ) // Connected-vs-nobody is otherwise encoded only in the icon's - // color; say it. + // color; say it. With a live bridge, also say who's across it. .accessibilityValue( - headerPeersReachable - ? String(localized: "content.accessibility.peers_connected", comment: "Accessibility value when peers are reachable") - : String(localized: "content.accessibility.peers_none", comment: "Accessibility value when no peers are reachable") + showBridgedPeerCount + ? String( + format: String(localized: "content.accessibility.bridged_count", defaultValue: "%lld more people across the bridge", comment: "Accessibility value announcing the number of people reachable via the mesh bridge"), + locale: .current, + bridgeService.bridgedPeerCount + ) + : (headerPeersReachable + ? String(localized: "content.accessibility.peers_connected", comment: "Accessibility value when peers are reachable") + : String(localized: "content.accessibility.peers_none", comment: "Accessibility value when no peers are reachable")) ) } .layoutPriority(3) diff --git a/bitchat/Views/ContentSheetViews.swift b/bitchat/Views/ContentSheetViews.swift index a6a68c82..0cbd27d1 100644 --- a/bitchat/Views/ContentSheetViews.swift +++ b/bitchat/Views/ContentSheetViews.swift @@ -174,32 +174,13 @@ private struct ContentPeopleListView: View { } } - let activeText = String.localizedStringWithFormat( - String(localized: "%@ active", comment: "Count of active users in the people sheet"), - "\(peopleSheetActiveCount)" - ) - - if let subtitle = peopleSheetSubtitle { - let subtitleColor: Color = { - switch locationChannelsModel.selectedChannel { - case .mesh: - return palette.accentBlue - case .location: - return palette.locationAccent - } - }() - - HStack(spacing: 6) { - Text(subtitle) - .foregroundColor(subtitleColor) - Text(activeText) - .foregroundColor(palette.secondary) - } - .bitchatFont(size: 12) - } else { - Text(activeText) + // The mesh sheet titles its sections inline (#mesh / across + // the bridge / groups) — no subtitle or count up here. + // Location channels keep their geohash subtitle. + if case .location(let channel) = locationChannelsModel.selectedChannel { + Text(verbatim: "#\(channel.geohash.lowercased())") .bitchatFont(size: 12) - .foregroundColor(palette.secondary) + .foregroundColor(palette.locationAccent) } } .padding(.horizontal, 16) @@ -208,7 +189,10 @@ private struct ContentPeopleListView: View { .themedSurface() ScrollView { - VStack(alignment: .leading, spacing: 6) { + // spacing 0: every section supplies its own rhythm (header + // top 12 / bottom 4, rows vertical 4), so inter-child spacing + // here would make the first section's gap read differently. + VStack(alignment: .leading, spacing: 0) { if case .location = locationChannelsModel.selectedChannel { GeohashPeopleList( onTapPerson: { @@ -216,12 +200,10 @@ private struct ContentPeopleListView: View { } ) } else { - GroupChatList( - groups: peerListModel.groupRows, - onTapGroup: { peerID in - peerListModel.startConversation(with: peerID) - showSidebar = true - } + PeopleSectionHeader( + icon: "antenna.radiowaves.left.and.right", + iconColor: palette.accentBlue, + title: "#mesh" ) MeshPeerList( onTapPeer: { peerID in @@ -242,9 +224,24 @@ private struct ContentPeopleListView: View { } } ) + // People in this area but beyond radio range, and + // private groups: one sheet for the whole room. + BridgePeopleList() + GroupChatList( + groups: peerListModel.groupRows, + onTapGroup: { peerID in + peerListModel.startConversation(with: peerID) + showSidebar = true + } + ) } } .padding(.top, 4) + // Full width even when every row is narrow (empty mesh, no + // groups): without this the VStack hugs its widest child and + // the ScrollView centers it — headers and empty states + // floated mid-screen on iPhone. + .frame(maxWidth: .infinity, alignment: .leading) .id(peerListModel.renderID) } } @@ -260,23 +257,6 @@ private extension ContentPeopleListView { String(localized: "content.header.people", comment: "Title for the people list sheet").lowercased() } - var peopleSheetSubtitle: String? { - switch locationChannelsModel.selectedChannel { - case .mesh: - return "#mesh" - case .location(let channel): - return "#\(channel.geohash.lowercased())" - } - } - - var peopleSheetActiveCount: Int { - switch locationChannelsModel.selectedChannel { - case .mesh: - return peerListModel.reachableMeshPeerCount - case .location: - return peerListModel.visibleGeohashPeerCount - } - } } private struct ContentPrivateChatSheetView: View { @@ -542,10 +522,14 @@ private struct ContentPrivateHeaderInfoButton: View { .foregroundColor(.purple) .accessibilityLabel(String(localized: "content.accessibility.available_nostr", comment: "Accessibility label for Nostr-available peer indicator")) case .offline: - // Absence of a glyph was the only offline signal; say it. - Text("mesh_peers.state.offline") - .bitchatFont(size: 11) + // Slashed variant of the connected glyph — offline as + // the negation of connected, no text label (a leading + // one read as part of the name: "sin conexión bob"). + // VoiceOver still says it. + Image(systemName: "antenna.radiowaves.left.and.right.slash") + .font(.bitchatSystem(size: 14)) .foregroundColor(palette.secondary) + .accessibilityLabel(String(localized: "mesh_peers.state.offline", comment: "State label for a peer that is not currently reachable")) } } @@ -580,6 +564,7 @@ private struct ContentPrivateHeaderInfoButton: View { ) ) } + } } .buttonStyle(.plain) diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index a40213b8..fc1a6766 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -35,6 +35,7 @@ struct ContentView: View { @EnvironmentObject private var privateConversationModel: PrivateConversationModel @EnvironmentObject private var verificationModel: VerificationModel @EnvironmentObject private var conversationUIModel: ConversationUIModel + @EnvironmentObject private var locationChannelsModel: LocationChannelsModel @StateObject private var voiceRecordingVM = VoiceRecordingViewModel() @State private var messageText = "" @@ -150,7 +151,11 @@ struct ContentView: View { #endif } .sheet(isPresented: $appChromeModel.isAppInfoPresented) { - AppInfoView(topologyProvider: { appChromeModel.meshTopologyDisplayModel() }) + AppInfoView( + topologyProvider: { appChromeModel.meshTopologyDisplayModel() }, + onPanicWipe: { appChromeModel.panicClearAllData() } + ) + .environmentObject(locationChannelsModel) } .sheet(isPresented: Binding( get: { appChromeModel.showingFingerprintFor != nil && !showSidebar && selectedPrivatePeerID == nil }, diff --git a/bitchat/Views/GroupChatList.swift b/bitchat/Views/GroupChatList.swift index 8b62d8a2..4dff5c1d 100644 --- a/bitchat/Views/GroupChatList.swift +++ b/bitchat/Views/GroupChatList.swift @@ -21,20 +21,15 @@ struct GroupChatList: View { var body: some View { if !groups.isEmpty { VStack(alignment: .leading, spacing: 0) { - Text(Strings.header) - .bitchatFont(size: 11, weight: .medium) - .foregroundColor(palette.secondary) - .padding(.horizontal) - .padding(.top, 10) - .padding(.bottom, 2) - .accessibilityAddTraits(.isHeader) + // Same glyph+label header shape as #mesh / across the bridge. + PeopleSectionHeader( + icon: "person.3.fill", + iconColor: palette.primary, + title: Strings.header + ) ForEach(groups) { group in HStack(spacing: 4) { - Image(systemName: "person.3.fill") - .font(.bitchatSystem(size: 10)) - .foregroundColor(palette.primary) - Text("#\(group.name)") .bitchatFont(size: 14) .foregroundColor(palette.primary) diff --git a/bitchat/Views/LocationChannelsSheet.swift b/bitchat/Views/LocationChannelsSheet.swift index c8f3241b..fe916cf2 100644 --- a/bitchat/Views/LocationChannelsSheet.swift +++ b/bitchat/Views/LocationChannelsSheet.swift @@ -20,15 +20,9 @@ struct LocationChannelsSheet: View { static let permissionDenied: LocalizedStringKey = "location_channels.permission_denied" static let openSettings: LocalizedStringKey = "location_channels.action.open_settings" static let loadingNearby: LocalizedStringKey = "location_channels.loading_nearby" + static let grantToFind: LocalizedStringKey = "location_channels.grant_to_find" static let teleport: LocalizedStringKey = "location_channels.action.teleport" static let bookmarked: LocalizedStringKey = "location_channels.bookmarked_section_title" - static let removeAccess: LocalizedStringKey = "location_channels.action.remove_access" - static let torTitle: LocalizedStringKey = "location_channels.tor.title" - static let torSubtitle: LocalizedStringKey = "location_channels.tor.subtitle" - static let gatewayTitle: LocalizedStringKey = "location_channels.gateway.title" - static let gatewaySubtitle: LocalizedStringKey = "location_channels.gateway.subtitle" - static let toggleOn: LocalizedStringKey = "common.toggle.on" - static let toggleOff: LocalizedStringKey = "common.toggle.off" static let invalidGeohash = String(localized: "location_channels.error.invalid_geohash", comment: "Error shown when a custom geohash is invalid") static let switchChannelHint = String(localized: "location_channels.accessibility.switch_hint", comment: "Accessibility hint on a channel row explaining activation switches to it") @@ -218,7 +212,7 @@ struct LocationChannelsSheet: View { } .padding(.vertical, 6) } - } else { + } else if locationChannelsModel.permissionState == .authorized { sectionDivider HStack(spacing: 8) { ProgressView() @@ -227,6 +221,15 @@ struct LocationChannelsSheet: View { } .frame(maxWidth: .infinity, alignment: .leading) .padding(.vertical, 10) + } else { + // No permission means no fix is coming: an honest hint + // beats a spinner that would never finish. + sectionDivider + Text(Strings.grantToFind) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.vertical, 10) } sectionDivider @@ -240,24 +243,6 @@ struct LocationChannelsSheet: View { .padding(.vertical, 8) } - if locationChannelsModel.permissionState == .authorized { - sectionDivider - torToggleSection - .padding(.top, 12) - gatewayToggleSection - .padding(.top, 8) - Button(action: SystemSettings.location.open) { - Text(Strings.removeAccess) - .bitchatFont(size: 12) - .foregroundColor(palette.alertRed) - .frame(maxWidth: .infinity) - .padding(.vertical, 6) - .background(Color.red.opacity(0.08)) - .cornerRadius(6) - } - .buttonStyle(.plain) - .padding(.vertical, 8) - } } .frame(maxWidth: .infinity, alignment: .leading) .padding(.vertical, 6) @@ -482,94 +467,14 @@ struct LocationChannelsSheet: View { } } -// MARK: - TOR Toggle & Standardized Colors +// MARK: - Standardized Colors +// (The tor and internet-gateway toggles moved to AppInfoView's Settings pane; +// IRCToggleStyle now lives in Views/Components.) extension LocationChannelsSheet { - private var torToggleBinding: Binding { - Binding( - get: { locationChannelsModel.userTorEnabled }, - set: { locationChannelsModel.setUserTorEnabled($0) } - ) - } - - private var torToggleSection: some View { - VStack(alignment: .leading, spacing: 8) { - Toggle(isOn: torToggleBinding) { - VStack(alignment: .leading, spacing: 2) { - Text(Strings.torTitle) - .bitchatFont(size: 12, weight: .semibold) - .foregroundColor(palette.primary) - Text(Strings.torSubtitle) - .bitchatFont(size: 11) - .foregroundColor(palette.secondary) - } - } - .toggleStyle(IRCToggleStyle(accent: palette.accent, onLabel: Strings.toggleOn, offLabel: Strings.toggleOff)) - } - .padding(12) - .background(palette.secondary.opacity(0.12)) - .cornerRadius(8) - } - - private var gatewayToggleBinding: Binding { - Binding( - get: { locationChannelsModel.gatewayEnabled }, - set: { locationChannelsModel.setGatewayEnabled($0) } - ) - } - - private var gatewayToggleSection: some View { - VStack(alignment: .leading, spacing: 8) { - Toggle(isOn: gatewayToggleBinding) { - VStack(alignment: .leading, spacing: 2) { - Text(Strings.gatewayTitle) - .bitchatFont(size: 12, weight: .semibold) - .foregroundColor(palette.primary) - Text(Strings.gatewaySubtitle) - .bitchatFont(size: 11) - .foregroundColor(palette.secondary) - } - } - .toggleStyle(IRCToggleStyle(accent: palette.accent, onLabel: Strings.toggleOn, offLabel: Strings.toggleOff)) - } - .padding(12) - .background(palette.secondary.opacity(0.12)) - .cornerRadius(8) - } - private var standardGreen: Color { palette.primary } private var standardBlue: Color { palette.accentBlue } } -private struct IRCToggleStyle: ToggleStyle { - let accent: Color - let onLabel: LocalizedStringKey - let offLabel: LocalizedStringKey - - func makeBody(configuration: Configuration) -> some View { - Button(action: { configuration.isOn.toggle() }) { - HStack(spacing: 12) { - configuration.label - Spacer() - Text(configuration.isOn ? onLabel : offLabel) - .textCase(.uppercase) - .bitchatFont(size: 12, weight: .semibold) - .foregroundColor(configuration.isOn ? accent : .secondary) - .padding(.vertical, 4) - .padding(.horizontal, 10) - .background( - RoundedRectangle(cornerRadius: 6) - .fill(accent.opacity(configuration.isOn ? 0.18 : 0.08)) - ) - .overlay( - RoundedRectangle(cornerRadius: 6) - .stroke(accent.opacity(configuration.isOn ? 0.35 : 0.15), lineWidth: 1) - ) - } - } - .buttonStyle(.plain) - } -} - // MARK: - Coverage helpers extension LocationChannelsSheet { private func coverageString(forPrecision len: Int) -> String { diff --git a/bitchat/Views/MeshPeerList.swift b/bitchat/Views/MeshPeerList.swift index b09ef476..1d94af5f 100644 --- a/bitchat/Views/MeshPeerList.swift +++ b/bitchat/Views/MeshPeerList.swift @@ -44,13 +44,14 @@ struct MeshPeerList: View { } if peerListModel.meshRows.isEmpty { - VStack(alignment: .leading, spacing: 0) { - Text(Strings.noneNearby) - .bitchatFont(size: 14) - .foregroundColor(palette.secondary) - .padding(.horizontal) - .padding(.top, 12) - } + // Match the section's row rhythm (same size, indent, and vertical + // padding as a peer row) so the empty state reads as the list's + // only line, not a floating caption. + Text(Strings.noneNearby) + .bitchatFont(size: 14) + .foregroundColor(palette.secondary) + .padding(.horizontal) + .padding(.vertical, 4) } else { VStack(alignment: .leading, spacing: 0) { ForEach(0.. String { let now = Date() if let days = Calendar.current.dateComponents([.day], from: date, to: now).day, days < 7 { - let rel = relativeFormatter.string(from: date, to: now) ?? "" - return rel.isEmpty ? "" : "\(rel) ago" + // The whole "3 hr ago" phrase must come from the formatter — + // gluing an English "ago" onto a localized duration ships the + // wrong word order to most locales ("hace 3 h", "vor 3 Std"). + return relativeFormatter.localizedString(for: date, relativeTo: now) } let sameYear = Calendar.current.isDate(date, equalTo: now, toGranularity: .year) return (sameYear ? absDateFormatter : absDateYearFormatter).string(from: date) } - private static let relativeFormatter: DateComponentsFormatter = { - let f = DateComponentsFormatter() - f.allowedUnits = [.day, .hour, .minute] - f.maximumUnitCount = 1 + private static let relativeFormatter: RelativeDateTimeFormatter = { + let f = RelativeDateTimeFormatter() f.unitsStyle = .abbreviated - f.collapsesLargestUnit = true return f }() diff --git a/bitchatTests/ChatOutgoingCoordinatorContextTests.swift b/bitchatTests/ChatOutgoingCoordinatorContextTests.swift index 25aa8300..28dabfa9 100644 --- a/bitchatTests/ChatOutgoingCoordinatorContextTests.swift +++ b/bitchatTests/ChatOutgoingCoordinatorContextTests.swift @@ -87,6 +87,11 @@ private final class MockChatOutgoingContext: ChatOutgoingContext { sentGeohashContexts.append(context) } + private(set) var bridgedMessages: [(content: String, messageID: String)] = [] + func bridgeOutgoingPublicMessage(_ content: String, messageID: String) { + bridgedMessages.append((content, messageID)) + } + // Geohash identity struct IdentityUnavailable: Error {} var deriveNostrIdentityError: Error? diff --git a/bitchatTests/EndToEnd/CourierEndToEndTests.swift b/bitchatTests/EndToEnd/CourierEndToEndTests.swift index cedcc15f..00f210f3 100644 --- a/bitchatTests/EndToEnd/CourierEndToEndTests.swift +++ b/bitchatTests/EndToEnd/CourierEndToEndTests.swift @@ -672,6 +672,50 @@ struct MessageRouterCourierTests { #expect(carried == ["m1"]) } + /// Field-found: a DM sent while the recipient sits in the BLE + /// reachability retention window (radio gone, still "reachable" for a + /// minute) trusts the mesh and skips every deposit — and nothing + /// retried. The periodic sweep must publish the bridge drop once the + /// window lapses. + @Test @MainActor + func sweepDropsQueuedMessageOnceReachabilityLapses() { + let bobKey = Data(repeating: 0xB0, count: 32) + let bobID = PeerID(publicKey: bobKey) + let transport = CourierCaptureTransport() + transport.reachablePeers = [bobID] // retention window: stale but "reachable" + transport.promptDelivery = true + + let directory = CourierDirectory( + noiseKey: { peerID in peerID == bobID ? bobKey : nil }, + isTrustedCourier: { _ in false } + ) + let router = MessageRouter(transports: [transport], courierDirectory: directory) + var drops: [(content: String, messageID: String, key: Data)] = [] + router.bridgeCourierDeposit = { content, messageID, key in + drops.append((content, messageID, key)) + return true + } + var carried: [String] = [] + router.onMessageCarried = { messageID, _ in carried.append(messageID) } + + router.sendPrivate("hi bob", to: bobID, recipientNickname: "bob", messageID: "m9") + #expect(drops.isEmpty) // send trusted the (stale) mesh reachability + + // Still inside the window: the sweep must not spam relays. + router.retryBridgeCourierDeposits() + #expect(drops.isEmpty) + + // Window lapses; the sweep publishes the retained copy as a drop and + // the sender's message shows "carried" (its ack has no radio route). + transport.reachablePeers = [] + router.retryBridgeCourierDeposits() + #expect(drops.count == 1) + #expect(drops.first?.messageID == "m9") + #expect(drops.first?.content == "hi bob") + #expect(drops.first?.key == bobKey) + #expect(carried == ["m9"]) + } + @Test @MainActor func noCourierDepositWithoutKnownRecipientKey() { let transport = CourierCaptureTransport() diff --git a/bitchatTests/Protocols/BridgeWireFormatTests.swift b/bitchatTests/Protocols/BridgeWireFormatTests.swift new file mode 100644 index 00000000..95e56920 --- /dev/null +++ b/bitchatTests/Protocols/BridgeWireFormatTests.swift @@ -0,0 +1,149 @@ +// +// BridgeWireFormatTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +@Suite("Bridge wire formats") +struct BridgeWireFormatTests { + // MARK: - Announce bridgeGeohash TLV + + @Test func announceRoundTripsBridgeGeohash() throws { + let packet = AnnouncementPacket( + nickname: "gw", + noisePublicKey: Data(repeating: 1, count: 32), + signingPublicKey: Data(repeating: 2, count: 32), + directNeighbors: nil, + capabilities: [.bridge, .gateway], + bridgeGeohash: "u4pruy" + ) + let encoded = try #require(packet.encode()) + let decoded = try #require(AnnouncementPacket.decode(from: encoded)) + #expect(decoded.bridgeGeohash == "u4pruy") + #expect(decoded.capabilities?.contains(.bridge) == true) + } + + @Test func announceWithoutBridgeCellDecodesNil() throws { + let packet = AnnouncementPacket( + nickname: "plain", + noisePublicKey: Data(repeating: 1, count: 32), + signingPublicKey: Data(repeating: 2, count: 32), + directNeighbors: nil + ) + let encoded = try #require(packet.encode()) + let decoded = try #require(AnnouncementPacket.decode(from: encoded)) + #expect(decoded.bridgeGeohash == nil) + } + + @Test func announceRejectsOversizedBridgeCellAtEncode() throws { + let packet = AnnouncementPacket( + nickname: "gw", + noisePublicKey: Data(repeating: 1, count: 32), + signingPublicKey: Data(repeating: 2, count: 32), + directNeighbors: nil, + bridgeGeohash: String(repeating: "u", count: 13) + ) + // Oversized cell is silently omitted, not a hard failure. + let encoded = try #require(packet.encode()) + let decoded = try #require(AnnouncementPacket.decode(from: encoded)) + #expect(decoded.bridgeGeohash == nil) + } + + // MARK: - Carrier directions + + @Test func bridgeCarrierDirectionsRoundTrip() throws { + for direction in [NostrCarrierPacket.Direction.toBridge, .fromBridge] { + let packet = try #require(NostrCarrierPacket( + direction: direction, + geohash: "u4pruy", + eventJSON: Data("{\"id\":\"x\"}".utf8) + )) + let encoded = try #require(packet.encode()) + let decoded = try #require(NostrCarrierPacket.decode(encoded)) + #expect(decoded.direction == direction) + #expect(decoded.geohash == "u4pruy") + } + } + + // MARK: - BitchatMessage bridged flag + // (Binary round-trip lives in BitFoundation's own tests — + // `toBinaryPayload` is internal to the package.) + + @Test func bridgedFlagSurvivesCodableRoundTrip() throws { + let message = BitchatMessage( + sender: "far-friend", + content: "hi", + timestamp: Date(), + isRelay: false, + isBridged: true + ) + let data = try JSONEncoder().encode(message) + let decoded = try JSONDecoder().decode(BitchatMessage.self, from: data) + #expect(decoded.isBridged) + } + + @Test func legacyJSONWithoutBridgedFlagDecodes() throws { + let plain = BitchatMessage( + sender: "old-client", + content: "hi", + timestamp: Date(), + isRelay: false + ) + let encoded = try JSONEncoder().encode(plain) + var json = try #require(try JSONSerialization.jsonObject(with: encoded) as? [String: Any]) + json.removeValue(forKey: "isBridged") + let decoded = try JSONDecoder().decode(BitchatMessage.self, from: JSONSerialization.data(withJSONObject: json)) + #expect(!decoded.isBridged) + } + + @Test func bridgePeerIDParsesAndClassifies() { + let peerID = PeerID(str: "bridge:deadbeefcafe0123") + #expect(peerID.isBridge) + #expect(peerID.bare == "deadbeefcafe0123") + #expect(!peerID.isGeoChat) + } +} + +@Suite("Courier store bridge publish") +struct CourierStoreBridgePublishTests { + private func makeStore(now: @escaping () -> Date = Date.init) -> CourierStore { + CourierStore(persistsToDisk: false, now: now) + } + + private func makeEnvelope(now: Date = Date()) -> CourierEnvelope { + CourierEnvelope( + recipientTag: Data(repeating: 3, count: 16), + expiry: UInt64((now.timeIntervalSince1970 + 3600) * 1000), + ciphertext: Data(repeating: 9, count: 64), + copies: 4 + ) + } + + @Test func bridgePublishIsNonDestructiveAndCooledDown() { + var currentDate = Date() + let store = makeStore(now: { currentDate }) + #expect(store.deposit(makeEnvelope(now: currentDate), from: Data(repeating: 5, count: 32))) + + let first = store.envelopesForBridgePublish(cooldown: 600) + #expect(first.count == 1) + // The relay copy is carry-only regardless of stored spray budget. + #expect(first.first?.copies == 1) + // (Non-destructiveness is proven below: the same envelope is + // eligible again after the cooldown. `carriedCount` publishes + // asynchronously, so it is not asserted here.) + + // Within cooldown: nothing to publish. + #expect(store.envelopesForBridgePublish(cooldown: 600).isEmpty) + + // After cooldown: eligible again. + currentDate = currentDate.addingTimeInterval(601) + #expect(store.envelopesForBridgePublish(cooldown: 600).count == 1) + } +} diff --git a/bitchatTests/Services/BridgeCourierServiceTests.swift b/bitchatTests/Services/BridgeCourierServiceTests.swift new file mode 100644 index 00000000..13bcbda0 --- /dev/null +++ b/bitchatTests/Services/BridgeCourierServiceTests.swift @@ -0,0 +1,284 @@ +// +// BridgeCourierServiceTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import CryptoKit +import Foundation +import Testing +@testable import bitchat + +@Suite("Courier over the bridge") +@MainActor +struct BridgeCourierServiceTests { + /// Closure-injected harness around `BridgeCourierService`. + @MainActor + private final class Fixture { + var bridgeOn = true + var relaysConnected = true + var myKey: Data? = Fixture.randomKey() + var localPeers: [(peerID: PeerID, noiseKey: Data)] = [] + var held: [CourierEnvelope] = [] + var sealResult: CourierEnvelope? + + private(set) var publishedEvents: [NostrEvent] = [] + private(set) var openedSubscriptions: [[String]] = [] + private(set) var closedSubscriptions = 0 + private(set) var openedEnvelopes: [CourierEnvelope] = [] + private(set) var delivered: [(envelope: CourierEnvelope, peer: PeerID)] = [] + private(set) var sealRequests: [(content: String, messageID: String, key: Data)] = [] + private(set) var heldCooldowns: [TimeInterval] = [] + + let service: BridgeCourierService + + init() { + service = BridgeCourierService() + service.bridgeEnabled = { [weak self] in self?.bridgeOn ?? false } + service.relaysConnected = { [weak self] in self?.relaysConnected ?? false } + service.publishEvent = { [weak self] event in self?.publishedEvents.append(event) } + service.openSubscription = { [weak self] tags in self?.openedSubscriptions.append(tags) } + service.closeSubscription = { [weak self] in self?.closedSubscriptions += 1 } + service.myNoiseKey = { [weak self] in self?.myKey } + service.localVerifiedPeers = { [weak self] in self?.localPeers ?? [] } + service.sealEnvelope = { [weak self] content, messageID, key in + self?.sealRequests.append((content, messageID, key)) + return self?.sealResult + } + service.openEnvelope = { [weak self] envelope in self?.openedEnvelopes.append(envelope) } + service.deliverToPeer = { [weak self] envelope, peer in self?.delivered.append((envelope, peer)) } + service.heldEnvelopes = { [weak self] cooldown in + self?.heldCooldowns.append(cooldown) + return self?.held ?? [] + } + service.scheduleTimer = { _, _ in } // timers driven manually + } + + static func randomKey() -> Data { + Data((0..<32).map { _ in UInt8.random(in: 0...255) }) + } + } + + private func makeEnvelope(recipientKey: Data, ciphertext: Data = Data(repeating: 7, count: 64)) -> CourierEnvelope { + CourierEnvelope( + recipientTag: CourierEnvelope.recipientTag( + noiseStaticKey: recipientKey, + epochDay: CourierEnvelope.epochDay(for: Date()) + ), + expiry: UInt64((Date().timeIntervalSince1970 + 3600) * 1000), + ciphertext: ciphertext, + copies: 1 + ) + } + + private func makeDropEvent(for envelope: CourierEnvelope) throws -> NostrEvent { + let encoded = try #require(envelope.encode()) + let identity = try #require(BridgeCourierService.makeThrowawayIdentity()) + return try NostrProtocol.createCourierDropEvent( + envelope: encoded, + recipientTagHex: envelope.recipientTag.hexEncodedString(), + expiresAt: Date(timeIntervalSince1970: TimeInterval(envelope.expiry) / 1000), + senderIdentity: identity + ) + } + + // MARK: - Sender role + + @Test func depositSealsAndPublishesOnce() throws { + let fixture = Fixture() + let recipientKey = Fixture.randomKey() + fixture.sealResult = makeEnvelope(recipientKey: recipientKey) + let messageID = UUID().uuidString + + fixture.service.depositDrop(content: "hello", messageID: messageID, recipientNoiseKey: recipientKey) + fixture.service.depositDrop(content: "hello", messageID: messageID, recipientNoiseKey: recipientKey) + + #expect(fixture.sealRequests.count == 1) + #expect(fixture.publishedEvents.count == 1) + let event = try #require(fixture.publishedEvents.first) + #expect(event.kind == NostrProtocol.EventKind.courierDrop.rawValue) + #expect(event.isValidSignature()) + #expect(event.tags.contains { $0.count >= 2 && $0[0] == "x" && $0[1] == fixture.sealResult?.recipientTag.hexEncodedString() }) + #expect(event.tags.contains { $0.count >= 2 && $0[0] == "expiration" }) + } + + @Test func depositRequiresBridgeToggle() { + let fixture = Fixture() + fixture.bridgeOn = false + let key = Fixture.randomKey() + fixture.sealResult = makeEnvelope(recipientKey: key) + + fixture.service.depositDrop(content: "hi", messageID: UUID().uuidString, recipientNoiseKey: key) + + #expect(fixture.publishedEvents.isEmpty) + #expect(fixture.sealRequests.isEmpty) + } + + @Test func depositQueuesWithoutRelaysAndFlushesOnReconnect() { + let fixture = Fixture() + fixture.relaysConnected = false + let key = Fixture.randomKey() + fixture.sealResult = makeEnvelope(recipientKey: key) + + fixture.service.depositDrop(content: "later", messageID: UUID().uuidString, recipientNoiseKey: key) + #expect(fixture.publishedEvents.isEmpty) + #expect(fixture.service.pendingDrops.count == 1) + + fixture.relaysConnected = true + fixture.service.flushPendingDrops() + #expect(fixture.publishedEvents.count == 1) + #expect(fixture.service.pendingDrops.isEmpty) + } + + @Test func distinctDropsUseDistinctThrowawayKeys() { + let fixture = Fixture() + let keyA = Fixture.randomKey() + let keyB = Fixture.randomKey() + fixture.sealResult = makeEnvelope(recipientKey: keyA) + fixture.service.depositDrop(content: "a", messageID: UUID().uuidString, recipientNoiseKey: keyA) + fixture.sealResult = makeEnvelope(recipientKey: keyB) + fixture.service.depositDrop(content: "b", messageID: UUID().uuidString, recipientNoiseKey: keyB) + + #expect(fixture.publishedEvents.count == 2) + #expect(fixture.publishedEvents[0].pubkey != fixture.publishedEvents[1].pubkey) + } + + @Test func bridgingPublishesHeldEnvelopesWithCooldown() { + let fixture = Fixture() + fixture.held = [makeEnvelope(recipientKey: Fixture.randomKey())] + + fixture.service.publishHeldEnvelopes() + + #expect(fixture.publishedEvents.count == 1) + #expect(fixture.heldCooldowns == [BridgeCourierService.Limits.heldEnvelopePublishCooldown]) + } + + // MARK: - Subscription management + + @Test func refreshSubscribesOwnCandidateTags() throws { + let fixture = Fixture() + fixture.service.refresh() + + let tags = try #require(fixture.openedSubscriptions.last) + let myKey = try #require(fixture.myKey) + let expected = Set(CourierEnvelope.candidateTags(noiseStaticKey: myKey, around: Date()).map { $0.hexEncodedString() }) + #expect(Set(tags) == expected) + #expect(tags.count == 3) // adjacent UTC days + } + + @Test func refreshAlsoWatchesLocalVerifiedPeers() throws { + let fixture = Fixture() + let peerKey = Fixture.randomKey() + fixture.localPeers = [(PeerID(str: "aabbccdd00112233"), peerKey)] + + fixture.service.refresh() + + let tags = try #require(fixture.openedSubscriptions.last) + #expect(tags.count == 6) // 3 own + 3 watched + } + + @Test func refreshClosesSubscriptionWhenBridgeOff() { + let fixture = Fixture() + fixture.service.refresh() + #expect(fixture.openedSubscriptions.count == 1) + + fixture.bridgeOn = false + fixture.service.refresh() + #expect(fixture.closedSubscriptions == 1) + } + + // MARK: - Inbound drops + + @Test func dropForUsIsOpened() throws { + let fixture = Fixture() + let myKey = try #require(fixture.myKey) + fixture.service.refresh() + let envelope = makeEnvelope(recipientKey: myKey) + + fixture.service.handleDropEvent(try makeDropEvent(for: envelope)) + + #expect(fixture.openedEnvelopes.count == 1) + #expect(fixture.delivered.isEmpty) + } + + @Test func duplicateDropEventOpensOnce() throws { + let fixture = Fixture() + let myKey = try #require(fixture.myKey) + fixture.service.refresh() + let event = try makeDropEvent(for: makeEnvelope(recipientKey: myKey)) + + fixture.service.handleDropEvent(event) + fixture.service.handleDropEvent(event) + + #expect(fixture.openedEnvelopes.count == 1) + } + + @Test func dropForWatchedLocalPeerIsDelivered() throws { + let fixture = Fixture() + let peerKey = Fixture.randomKey() + let peer = PeerID(str: "aabbccdd00112233") + fixture.localPeers = [(peer, peerKey)] + fixture.service.refresh() + let envelope = makeEnvelope(recipientKey: peerKey) + + fixture.service.handleDropEvent(try makeDropEvent(for: envelope)) + + #expect(fixture.delivered.count == 1) + #expect(fixture.delivered.first?.peer == peer) + #expect(fixture.openedEnvelopes.isEmpty) + } + + @Test func dropForStrangerIsIgnored() throws { + let fixture = Fixture() + fixture.service.refresh() + let envelope = makeEnvelope(recipientKey: Fixture.randomKey()) + + fixture.service.handleDropEvent(try makeDropEvent(for: envelope)) + + #expect(fixture.openedEnvelopes.isEmpty) + #expect(fixture.delivered.isEmpty) + } + + @Test func mislabeledDropTagIsRejected() throws { + // The event's filterable #x tag must match the envelope's own tag. + let fixture = Fixture() + let myKey = try #require(fixture.myKey) + fixture.service.refresh() + let envelope = makeEnvelope(recipientKey: Fixture.randomKey()) + let encoded = try #require(envelope.encode()) + let identity = try #require(BridgeCourierService.makeThrowawayIdentity()) + let mislabeled = try NostrProtocol.createCourierDropEvent( + envelope: encoded, + recipientTagHex: CourierEnvelope.recipientTag( + noiseStaticKey: myKey, + epochDay: CourierEnvelope.epochDay(for: Date()) + ).hexEncodedString(), // labeled for us, addressed to a stranger + expiresAt: Date().addingTimeInterval(3600), + senderIdentity: identity + ) + + fixture.service.handleDropEvent(mislabeled) + + #expect(fixture.openedEnvelopes.isEmpty) + #expect(fixture.delivered.isEmpty) + } + + @Test func expiredDropIsIgnored() throws { + let fixture = Fixture() + let myKey = try #require(fixture.myKey) + fixture.service.refresh() + let expired = CourierEnvelope( + recipientTag: CourierEnvelope.recipientTag(noiseStaticKey: myKey, epochDay: CourierEnvelope.epochDay(for: Date())), + expiry: UInt64((Date().timeIntervalSince1970 - 60) * 1000), + ciphertext: Data(repeating: 1, count: 32), + copies: 1 + ) + + fixture.service.handleDropEvent(try makeDropEvent(for: expired)) + + #expect(fixture.openedEnvelopes.isEmpty) + } +} diff --git a/bitchatTests/Services/BridgeServiceTests.swift b/bitchatTests/Services/BridgeServiceTests.swift new file mode 100644 index 00000000..0dc62552 --- /dev/null +++ b/bitchatTests/Services/BridgeServiceTests.swift @@ -0,0 +1,594 @@ +// +// BridgeServiceTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +@Suite("Mesh bridge policy") +@MainActor +struct BridgeServiceTests { + private static let cell = "u4pruy" + + /// Closure-injected harness around `BridgeService` recording every side + /// effect, with a controllable clock, location, and connectivity. + @MainActor + private final class Fixture { + private final class ClockBox { + var now = Date() + } + + var relaysConnected = true + var locationCell: String? = BridgeServiceTests.cell + var meshAdvertisedCell: String? + var bridgePeers: [PeerID] = [] + var sendSucceeds = true + var locallySeenMessageIDs: Set = [] + var nickname = "tester" + + private(set) var published: [(event: NostrEvent, cell: String)] = [] + + /// Published chat messages only — the fixture's own presence + /// heartbeats (kind 20001, sent on enable) are filtered out. + var publishedMessages: [(event: NostrEvent, cell: String)] { + published.filter { $0.event.kind == NostrProtocol.EventKind.ephemeralEvent.rawValue } + } + private(set) var broadcasts: [Data] = [] + private(set) var injected: [BridgeService.InboundBridgeMessage] = [] + private(set) var uplinkSends: [(payload: Data, peer: PeerID)] = [] + private(set) var openedSubscriptions: [[String]] = [] + private(set) var closedSubscriptions = 0 + private(set) var enabledChanges: [Bool] = [] + private(set) var locationFixRequests = 0 + private(set) var cellChanges: [String?] = [] + private(set) var scheduledTimers: [(delay: TimeInterval, work: @MainActor () -> Void)] = [] + + private let clock = ClockBox() + let identity: NostrIdentity + let defaults: UserDefaults + let service: BridgeService + + init(enabled: Bool = true) { + let suite = "BridgeServiceTests-\(UUID().uuidString)" + defaults = UserDefaults(suiteName: suite)! + defaults.removePersistentDomain(forName: suite) + identity = try! NostrIdentity.generate() + let clock = clock + service = BridgeService(defaults: defaults) { clock.now } + service.publishToRelays = { [weak self] event, cell in + self?.published.append((event, cell)) + } + service.openSubscription = { [weak self] cells in + self?.openedSubscriptions.append(cells) + } + service.closeSubscription = { [weak self] in + self?.closedSubscriptions += 1 + } + service.relaysConnected = { [weak self] in self?.relaysConnected ?? false } + service.locationCell = { [weak self] in self?.locationCell } + service.requestLocationFix = { [weak self] in self?.locationFixRequests += 1 } + service.meshAdvertisedCell = { [weak self] in self?.meshAdvertisedCell } + service.sendToBridgePeer = { [weak self] payload, peer in + guard let self, self.sendSucceeds else { return false } + self.uplinkSends.append((payload, peer)) + return true + } + service.availableBridgePeers = { [weak self] in self?.bridgePeers ?? [] } + service.broadcastToMesh = { [weak self] payload in + self?.broadcasts.append(payload) + } + service.injectInbound = { [weak self] message in + self?.injected.append(message) + } + service.isMessageSeenLocally = { [weak self] id in + self?.locallySeenMessageIDs.contains(id) ?? false + } + service.deriveIdentity = { [weak self] _ in + guard let self else { throw NostrError.invalidEvent } + return self.identity + } + service.myNickname = { [weak self] in self?.nickname ?? "" } + service.onEnabledChanged = { [weak self] enabled in self?.enabledChanges.append(enabled) } + service.onActiveCellChanged = { [weak self] cell in self?.cellChanges.append(cell) } + service.scheduleTimer = { [weak self] delay, work in + self?.scheduledTimers.append((delay, work)) + } + if enabled { + service.setEnabled(true) + } + } + + func advance(_ seconds: TimeInterval) { + clock.now = clock.now.addingTimeInterval(seconds) + } + + func fireScheduledTimers() { + let due = scheduledTimers + scheduledTimers.removeAll() + for item in due { item.work() } + } + } + + // MARK: Event helpers + + private func makeRemoteEvent( + cell: String = BridgeServiceTests.cell, + content: String = "hi \(UUID().uuidString.prefix(8))", + meshMessageID: String? = UUID().uuidString + ) throws -> NostrEvent { + let identity = try NostrIdentity.generate() + return try NostrProtocol.createBridgeMeshEvent( + content: content, + cell: cell, + senderIdentity: identity, + nickname: "remote", + meshMessageID: meshMessageID + ) + } + + private func makePresenceEvent(cell: String = BridgeServiceTests.cell) throws -> NostrEvent { + try NostrProtocol.createBridgePresenceEvent(cell: cell, senderIdentity: NostrIdentity.generate()) + } + + private func carrier( + _ event: NostrEvent, + direction: NostrCarrierPacket.Direction, + cell: String = BridgeServiceTests.cell + ) throws -> NostrCarrierPacket { + try #require(NostrCarrierPacket(direction: direction, geohash: cell, event: event)) + } + + // MARK: - Lifecycle & rendezvous + + @Test func enablingOpensSubscriptionForCellAndNeighbors() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + + #expect(fixture.service.activeCell == Self.cell) + let cells = try #require(fixture.openedSubscriptions.first) + #expect(cells.first == Self.cell) + #expect(cells.count == 9) // own cell + 8 neighbors + #expect(fixture.service.subscribedCells.count == 9) + } + + @Test func missingCellRequestsALocationFix() { + // Field bug: the bridge waited passively for availableChannels, + // which only flow while some other feature pumps location. Bridging + // without a cell must ask for a fix itself. + let fixture = Fixture(enabled: true) + fixture.locationCell = nil + fixture.service.refreshRendezvous() + + #expect(fixture.locationFixRequests >= 1) + #expect(fixture.service.activeCell == nil) + + // The fix lands, channels flow, and the sink re-enters here: + fixture.locationCell = Self.cell + fixture.service.refreshRendezvous() + #expect(fixture.service.activeCell == Self.cell) + } + + @Test func noLocationFallsBackToMeshAdvertisedCell() { + let fixture = Fixture(enabled: true) + fixture.locationCell = nil + fixture.meshAdvertisedCell = "u4prux" + fixture.service.refreshRendezvous() + + #expect(fixture.service.activeCell == "u4prux") + } + + @Test func disablingClosesSubscriptionAndClearsState() { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + fixture.service.setEnabled(false) + + #expect(fixture.closedSubscriptions >= 1) + #expect(fixture.service.activeCell == nil) + #expect(fixture.service.bridgedPeerCount == 0) + } + + @Test func togglePersistsAcrossInstances() { + let fixture = Fixture(enabled: true) + let revived = BridgeService(defaults: fixture.defaults) + #expect(revived.isEnabled) + } + + // MARK: - Outgoing + + @Test func outgoingPublishesSignedRendezvousEventWithMeshMessageID() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let messageID = UUID().uuidString + + fixture.service.bridgeOutgoing(content: "hello hill", messageID: messageID) + + let published = try #require(fixture.published.last) + #expect(published.cell == Self.cell) + #expect(published.event.isValidSignature()) + #expect(published.event.content == "hello hill") + #expect(published.event.tags.contains(["r", Self.cell])) + #expect(published.event.tags.contains(["m", messageID])) + #expect(published.event.tags.contains(["n", "tester"])) + } + + @Test func nearbyOnlySuppressesTheBridgedCopy() { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + fixture.service.nearbyOnly = true + + fixture.service.bridgeOutgoing(content: "just us", messageID: UUID().uuidString) + + #expect(fixture.publishedMessages.isEmpty) + #expect(fixture.uplinkSends.isEmpty) + } + + @Test func outgoingWithoutRelaysDepositsWithBridgePeer() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + fixture.relaysConnected = false + fixture.bridgePeers = [PeerID(str: "abcdef0123456789")] + + fixture.service.bridgeOutgoing(content: "no internet here", messageID: UUID().uuidString) + + #expect(fixture.publishedMessages.isEmpty) + let sent = try #require(fixture.uplinkSends.first) + let carrier = try #require(NostrCarrierPacket.decode(sent.payload)) + #expect(carrier.direction == .toBridge) + #expect(carrier.geohash == Self.cell) + } + + @Test func ownRelayBackfilledEventIsIgnoredAfterRestart() throws { + // Field bug: a relaunch wipes the published-ID cache, and relay + // backfill then re-delivered the device's own pre-restart events as + // "bridged". Self-recognition by the deterministic rendezvous pubkey + // must catch them with no cache state at all. + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let ownOldEvent = try NostrProtocol.createBridgeMeshEvent( + content: "sent before the restart", + cell: Self.cell, + senderIdentity: fixture.identity, // == deriveIdentity(cell) + nickname: "tester", + meshMessageID: UUID().uuidString + ) + + fixture.service.handleRendezvousEvent(ownOldEvent) + + #expect(fixture.injected.isEmpty) + #expect(fixture.broadcasts.isEmpty) + #expect(fixture.service.bridgedPeerCount == 0) + } + + @Test func ownEventComingBackFromSubscriptionIsIgnored() { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + fixture.service.bridgeOutgoing(content: "echo me", messageID: UUID().uuidString) + let ownEvent = fixture.published[0].event + + fixture.service.handleRendezvousEvent(ownEvent) + + #expect(fixture.injected.isEmpty) + #expect(fixture.broadcasts.isEmpty) + #expect(fixture.service.bridgedPeerCount == 0) + } + + // MARK: - Subscription ingress + + @Test func remoteMessageInjectsAndDownlinks() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let event = try makeRemoteEvent() + + fixture.service.handleRendezvousEvent(event) + + #expect(fixture.injected.count == 1) + #expect(fixture.injected.first?.content == event.content) + #expect(fixture.service.bridgedPeerCount == 1) + // Serving duty: after the jitter holdoff, the remote event rides out + // as a fromBridge broadcast — one switch, no gateway toggle. + #expect(fixture.broadcasts.isEmpty) + fixture.fireScheduledTimers() + let broadcast = try #require(fixture.broadcasts.first) + let carrier = try #require(NostrCarrierPacket.decode(broadcast)) + #expect(carrier.direction == .fromBridge) + } + + @Test func jitterHoldoffSuppressesAlreadyBroadcastEvents() throws { + // Two gateways, one island: while our drain waits out the jitter, + // the other gateway's fromBridge broadcast arrives — ours must yield. + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let event = try makeRemoteEvent() + + fixture.service.handleRendezvousEvent(event) // queued behind jitter + fixture.service.handleMeshCarrier( + try carrier(event, direction: .fromBridge), + from: PeerID(str: "aabbccdd00112233"), + directedToUs: false + ) + fixture.fireScheduledTimers() + + #expect(fixture.broadcasts.isEmpty) + #expect(fixture.injected.count == 1) // rendered once, either path + } + + @Test func neighborCellEventIsAccepted() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let neighbor = try #require(Geohash.neighbors(of: Self.cell).first) + let event = try makeRemoteEvent(cell: neighbor) + + fixture.service.handleRendezvousEvent(event) + + #expect(fixture.injected.count == 1) + } + + @Test func outOfRingCellEventIsRejected() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let event = try makeRemoteEvent(cell: "9q8yyk") + + fixture.service.handleRendezvousEvent(event) + + #expect(fixture.injected.isEmpty) + #expect(fixture.broadcasts.isEmpty) + } + + @Test func locallySeenMessageIsNeitherInjectedNorDownlinked() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let messageID = UUID().uuidString + fixture.locallySeenMessageIDs = [messageID] + let event = try makeRemoteEvent(meshMessageID: messageID) + + fixture.service.handleRendezvousEvent(event) + + // The island already heard this over radio: no duplicate render, no + // wasted airtime — but the sender still counts as a (local) + // participant, never a bridged one. + #expect(fixture.injected.isEmpty) + #expect(fixture.broadcasts.isEmpty) + #expect(fixture.service.bridgedPeerCount == 0) + } + + @Test func duplicateSubscriptionEventInjectsOnce() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let event = try makeRemoteEvent() + + fixture.service.handleRendezvousEvent(event) + fixture.service.handleRendezvousEvent(event) + fixture.fireScheduledTimers() + + #expect(fixture.injected.count == 1) + #expect(fixture.broadcasts.count == 1) + } + + @Test func presenceCountsParticipantWithoutInjection() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + + fixture.service.handleRendezvousEvent(try makePresenceEvent()) + + #expect(fixture.injected.isEmpty) + #expect(fixture.service.bridgedPeerCount == 1) + } + + @Test func staleParticipantsAgeOutOfTheCount() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + fixture.service.handleRendezvousEvent(try makePresenceEvent()) + #expect(fixture.service.bridgedPeerCount == 1) + + fixture.advance(BridgeService.Limits.participantFreshnessSeconds + 1) + fixture.service.publishPresence() // any activity recomputes via prune path + fixture.fireScheduledTimers() + + #expect(fixture.service.bridgedPeerCount == 0) + } + + @Test func staleEventIsRejected() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let event = try makeRemoteEvent() + fixture.advance(BridgeService.Limits.maxEventAgeSeconds + 60) + + fixture.service.handleRendezvousEvent(event) + + #expect(fixture.injected.isEmpty) + } + + // MARK: - Downlink budget + + @Test func downlinkRespectsPerMinuteBudgetAndDrainsLater() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + + for _ in 0..<(BridgeService.Limits.downlinkEventsPerMinute + 5) { + fixture.service.handleRendezvousEvent(try makeRemoteEvent()) + } + fixture.fireScheduledTimers() // jitter holdoff elapses + + #expect(fixture.broadcasts.count == BridgeService.Limits.downlinkEventsPerMinute) + // Window frees: the re-armed timer drains the backlog. + fixture.advance(61) + fixture.fireScheduledTimers() + #expect(fixture.broadcasts.count == BridgeService.Limits.downlinkEventsPerMinute + 5) + } + + // MARK: - Mesh carrier ingress (receiver role) + + @Test func fromBridgeBroadcastInjectsForMeshOnlyReceiver() throws { + // Reception is not gated on the toggle: passive radio. + let fixture = Fixture(enabled: false) + let event = try makeRemoteEvent() + + fixture.service.handleMeshCarrier( + try carrier(event, direction: .fromBridge), + from: PeerID(str: "aabbccdd00112233"), + directedToUs: false + ) + + #expect(fixture.injected.count == 1) + #expect(fixture.service.bridgedPeerCount == 1) + } + + @Test func fromBridgeBroadcastDedupsAcrossMeshPaths() throws { + let fixture = Fixture(enabled: false) + let event = try makeRemoteEvent() + let packet = try carrier(event, direction: .fromBridge) + let peer = PeerID(str: "aabbccdd00112233") + + fixture.service.handleMeshCarrier(packet, from: peer, directedToUs: false) + fixture.service.handleMeshCarrier(packet, from: peer, directedToUs: false) + + #expect(fixture.injected.count == 1) + } + + @Test func meshCarriedEventIsNeverRebroadcast() throws { + // Loop rule 1: a second gateway hearing a fromBridge broadcast must + // not downlink the same event when its own subscription delivers it. + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let event = try makeRemoteEvent() + + fixture.service.handleMeshCarrier( + try carrier(event, direction: .fromBridge), + from: PeerID(str: "aabbccdd00112233"), + directedToUs: false + ) + fixture.service.handleRendezvousEvent(event) + fixture.fireScheduledTimers() + + #expect(fixture.broadcasts.isEmpty) + #expect(fixture.injected.count == 1) + } + + @Test func directedFromBridgeIsMalformedAndDropped() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + + fixture.service.handleMeshCarrier( + try carrier(makeRemoteEvent(), direction: .fromBridge), + from: PeerID(str: "aabbccdd00112233"), + directedToUs: true + ) + + #expect(fixture.injected.isEmpty) + } + + @Test func tamperedCarrierEventIsRejected() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let event = try makeRemoteEvent() + let dict: [String: Any] = [ + "id": event.id, + "pubkey": event.pubkey, + "created_at": event.created_at, + "kind": event.kind, + "tags": event.tags, + "content": event.content + " (tampered)", + "sig": event.sig ?? "", + ] + let forged = try NostrEvent(from: dict) + + fixture.service.handleMeshCarrier( + try carrier(forged, direction: .fromBridge), + from: PeerID(str: "aabbccdd00112233"), + directedToUs: false + ) + + #expect(fixture.injected.isEmpty) + } + + // MARK: - Uplink deposits (gateway role) + + @Test func validDepositIsPublishedWhenRelaysUp() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let event = try makeRemoteEvent() + + fixture.service.handleMeshCarrier( + try carrier(event, direction: .toBridge), + from: PeerID(str: "aabbccdd00112233"), + directedToUs: true + ) + + #expect(fixture.published.contains { $0.event.id == event.id }) + // Deposits never inject: the depositor's radio broadcast already + // carried the message to this island. + #expect(fixture.injected.isEmpty) + } + + @Test func depositQueuesWhileRelaysDownAndFlushesOnReconnect() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + fixture.relaysConnected = false + let event = try makeRemoteEvent() + + fixture.service.handleMeshCarrier( + try carrier(event, direction: .toBridge), + from: PeerID(str: "aabbccdd00112233"), + directedToUs: true + ) + #expect(fixture.publishedMessages.isEmpty) + #expect(fixture.service.queuedUplinks.count == 1) + + fixture.relaysConnected = true + fixture.service.flushQueuedUplinks() + #expect(fixture.published.contains { $0.event.id == event.id }) + } + + @Test func depositRequiresBridgeToggle() throws { + let fixture = Fixture(enabled: false) + + fixture.service.handleMeshCarrier( + try carrier(makeRemoteEvent(), direction: .toBridge), + from: PeerID(str: "aabbccdd00112233"), + directedToUs: true + ) + + #expect(fixture.publishedMessages.isEmpty) + #expect(fixture.service.queuedUplinks.isEmpty) + } + + @Test func depositRateLimitBoundsPerDepositor() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let depositor = PeerID(str: "aabbccdd00112233") + + for _ in 0..<(BridgeService.Limits.uplinkEventsPerMinutePerDepositor + 4) { + fixture.service.handleMeshCarrier( + try carrier(makeRemoteEvent(), direction: .toBridge), + from: depositor, + directedToUs: true + ) + } + + #expect(fixture.publishedMessages.count == BridgeService.Limits.uplinkEventsPerMinutePerDepositor) + } + + @Test func depositedEventIsNeverDownlinkedBack() throws { + // Loop rule 2: our own relay subscription redelivering an event we + // uplinked must not burn airtime broadcasting it back. + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let event = try makeRemoteEvent() + + fixture.service.handleMeshCarrier( + try carrier(event, direction: .toBridge), + from: PeerID(str: "aabbccdd00112233"), + directedToUs: true + ) + fixture.service.handleRendezvousEvent(event) + fixture.fireScheduledTimers() + + #expect(fixture.broadcasts.isEmpty) + } +} diff --git a/bitchatTests/ViewSmokeTests.swift b/bitchatTests/ViewSmokeTests.swift index b33c905b..e86b52e1 100644 --- a/bitchatTests/ViewSmokeTests.swift +++ b/bitchatTests/ViewSmokeTests.swift @@ -498,13 +498,15 @@ struct ViewSmokeTests { description: "app_info.features.encryption.description" ) + // AppInfoView's settings pane reads LocationChannelsModel from the + // environment, so it can only render mounted with one installed. let appInfo = AppInfoView() + .environmentObject(LocationChannelsModel(manager: makeSmokeLocationManager())) let header = SectionHeader("app_info.features.title") let featureRow = FeatureRow(info: feature) let paymentCashu = PaymentChipView(paymentType: .cashu("cashuA_test-token")) let paymentLightning = PaymentChipView(paymentType: .lightning("lightning:lnbc1test")) - _ = appInfo.body _ = header.body _ = featureRow.body _ = paymentCashu.body diff --git a/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift b/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift index 80ebf506..01cc0769 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift @@ -30,6 +30,9 @@ public final class BitchatMessage: Codable { public let senderPeerID: PeerID? public let mentions: [String]? // Array of mentioned nicknames public var deliveryStatus: DeliveryStatus? // Delivery tracking + /// True when this message reached us across a mesh bridge (signed by its + /// author for an internet rendezvous) rather than over local radio. + public let isBridged: Bool // Cached formatted text (not included in Codable) private var _cachedFormattedText: [String: AttributedString] = [:] @@ -46,8 +49,26 @@ public final class BitchatMessage: Codable { enum CodingKeys: String, CodingKey { case id, sender, content, timestamp, isRelay, originalSender case isPrivate, recipientNickname, senderPeerID, mentions, deliveryStatus + case isBridged } - + + public init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + id = try container.decode(String.self, forKey: .id) + sender = try container.decode(String.self, forKey: .sender) + content = try container.decode(String.self, forKey: .content) + timestamp = try container.decode(Date.self, forKey: .timestamp) + isRelay = try container.decode(Bool.self, forKey: .isRelay) + originalSender = try container.decodeIfPresent(String.self, forKey: .originalSender) + isPrivate = try container.decode(Bool.self, forKey: .isPrivate) + recipientNickname = try container.decodeIfPresent(String.self, forKey: .recipientNickname) + senderPeerID = try container.decodeIfPresent(PeerID.self, forKey: .senderPeerID) + mentions = try container.decodeIfPresent([String].self, forKey: .mentions) + deliveryStatus = try container.decodeIfPresent(DeliveryStatus.self, forKey: .deliveryStatus) + // Absent in archives written before bridging existed. + isBridged = try container.decodeIfPresent(Bool.self, forKey: .isBridged) ?? false + } + public init( id: String? = nil, sender: String, @@ -59,7 +80,8 @@ public final class BitchatMessage: Codable { recipientNickname: String? = nil, senderPeerID: PeerID? = nil, mentions: [String]? = nil, - deliveryStatus: DeliveryStatus? = nil + deliveryStatus: DeliveryStatus? = nil, + isBridged: Bool = false ) { self.id = id ?? UUID().uuidString self.sender = sender @@ -72,6 +94,7 @@ public final class BitchatMessage: Codable { self.senderPeerID = senderPeerID self.mentions = mentions self.deliveryStatus = deliveryStatus ?? (isPrivate ? .sending : nil) + self.isBridged = isBridged } } @@ -89,7 +112,8 @@ extension BitchatMessage: Equatable { lhs.recipientNickname == rhs.recipientNickname && lhs.senderPeerID == rhs.senderPeerID && lhs.mentions == rhs.mentions && - lhs.deliveryStatus == rhs.deliveryStatus + lhs.deliveryStatus == rhs.deliveryStatus && + lhs.isBridged == rhs.isBridged } } @@ -121,6 +145,7 @@ extension BitchatMessage { if recipientNickname != nil { flags |= 0x08 } if senderPeerID != nil { flags |= 0x10 } if mentions != nil && !mentions!.isEmpty { flags |= 0x20 } + if isBridged { flags |= 0x40 } data.append(flags) @@ -213,6 +238,7 @@ extension BitchatMessage { let hasRecipientNickname = (flags & 0x08) != 0 let hasSenderPeerID = (flags & 0x10) != 0 let hasMentions = (flags & 0x20) != 0 + let isBridged = (flags & 0x40) != 0 // Timestamp guard offset + 8 <= dataCopy.count else { @@ -321,7 +347,8 @@ extension BitchatMessage { isPrivate: isPrivate, recipientNickname: recipientNickname, senderPeerID: senderPeerID, - mentions: mentions + mentions: mentions, + isBridged: isBridged ) } } diff --git a/localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift b/localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift index 94858d9b..167f9884 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/PeerCapabilities.swift @@ -20,6 +20,10 @@ public struct PeerCapabilities: OptionSet, Equatable, Hashable, Sendable { public static let board = PeerCapabilities(rawValue: 1 << 4) public static let vouch = PeerCapabilities(rawValue: 1 << 5) public static let meshDiagnostics = PeerCapabilities(rawValue: 1 << 6) + /// Bridges the local mesh channel to the geohash-cell rendezvous on Nostr + /// (uplink/downlink carriers for mesh-only peers). Advertised alongside + /// a `bridgeGeohash` TLV carrying the rendezvous cell. + public static let bridge = PeerCapabilities(rawValue: 1 << 7) /// Minimal little-endian byte encoding; always at least one byte so an /// empty set is distinguishable from an absent TLV. diff --git a/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift b/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift index f22fac18..a9a18973 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift @@ -37,6 +37,10 @@ public struct PeerID: Equatable, Hashable, Sendable { /// `"group_"` (+ 32 characters hex) — virtual conversation ID for a /// private group (16-byte group ID). Never routed to a single peer. case group = "group_" + /// `"bridge:"` (+ 16 characters hex) — a sender reached across a mesh + /// bridge, identified by their rendezvous Nostr pubkey. Not a + /// routable mesh peer. + case bridge = "bridge:" } public let prefix: Prefix @@ -67,6 +71,12 @@ public extension PeerID { self.init(prefix: .geoChat, bare: pubKey.prefix(Constants.nostrShortKeyDisplayLength)) } + /// Convenience init to create a bridged-sender PeerID by appending + /// `"bridge:"` to the first 16 characters of the rendezvous Nostr pubkey. + init(bridge pubKey: String) { + self.init(prefix: .bridge, bare: pubKey.prefix(Constants.nostrConvKeyPrefixLength)) + } + /// Convenience init to create PeerID from String/Substring by splitting it into prefix and bare parts init(str: any StringProtocol) { if let prefix = Prefix.allCases.first(where: { $0 != .empty && str.hasPrefix($0.rawValue) }) { @@ -167,6 +177,11 @@ public extension PeerID { prefix == .group } + /// Returns true if `id` starts with "`bridge:`" + var isBridge: Bool { + prefix == .bridge + } + func toPercentEncoded() -> String { id.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? id } diff --git a/localPackages/BitFoundation/Tests/BitFoundationTests/BitchatMessageBridgedFlagTests.swift b/localPackages/BitFoundation/Tests/BitFoundationTests/BitchatMessageBridgedFlagTests.swift new file mode 100644 index 00000000..c0c8910f --- /dev/null +++ b/localPackages/BitFoundation/Tests/BitFoundationTests/BitchatMessageBridgedFlagTests.swift @@ -0,0 +1,57 @@ +// +// BitchatMessageBridgedFlagTests.swift +// BitFoundationTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +@testable import BitFoundation + +@Suite("BitchatMessage bridged flag") +struct BitchatMessageBridgedFlagTests { + @Test func bridgedFlagSurvivesBinaryRoundTrip() throws { + let message = BitchatMessage( + sender: "far-friend", + content: "hello from across the hill", + timestamp: Date(), + isRelay: false, + senderPeerID: PeerID(bridge: "deadbeefcafe0123deadbeefcafe0123"), + isBridged: true + ) + let binary = try #require(message.toBinaryPayload()) + let decoded = try #require(BitchatMessage(binary)) + #expect(decoded.isBridged) + #expect(decoded.senderPeerID?.isBridge == true) + } + + @Test func plainMessageStaysUnbridgedThroughBinary() throws { + let plain = BitchatMessage( + sender: "neighbor", + content: "radio only", + timestamp: Date(), + isRelay: false + ) + let binary = try #require(plain.toBinaryPayload()) + let decoded = try #require(BitchatMessage(binary)) + #expect(!decoded.isBridged) + } + + @Test func legacyBinaryWithoutBridgedBitDecodesUnbridged() throws { + // A pre-bridge encoder never sets flag bit 0x40; decoding such a + // payload must default to unbridged. + let message = BitchatMessage( + sender: "old", + content: "hi", + timestamp: Date(), + isRelay: false, + isBridged: true + ) + var binary = try #require(message.toBinaryPayload()) + binary[0] &= ~UInt8(0x40) // strip the bridged bit like an old client + let decoded = try #require(BitchatMessage(binary)) + #expect(!decoded.isBridged) + } +} From dc99d641c8d5c813e4d9413f49888a04865b1750 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 22:07:40 +0200 Subject: [PATCH 064/158] Give the macOS app a proper icon matching iOS (#1414) The macOS Debug configuration uses AppIconDebug, which had no mac-idiom entries at all, so Debug builds shipped with the generic dock icon. And the mac slots in AppIcon reused the full-bleed square iOS artwork; macOS does not mask icons at render time, so even Release showed a sharp- cornered square. - Regenerate all AppIcon mac PNGs with the Big Sur icon grid baked in (824x824 rounded-rect body on a transparent 1024 canvas + standard drop shadow), derived from the same 1024 iOS art. - Add a full mac icon set to AppIconDebug from the green debug artwork. - Add scripts/generate-mac-appicon.swift (pure CoreGraphics) to re-derive the mac sizes whenever the 1024 source changes. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- .../AppIcon.appiconset/icon_128x128.png | Bin 848 -> 3750 bytes .../AppIcon.appiconset/icon_128x128@2x.png | Bin 1423 -> 7071 bytes .../AppIcon.appiconset/icon_16x16.png | Bin 356 -> 460 bytes .../AppIcon.appiconset/icon_16x16@2x.png | Bin 429 -> 833 bytes .../AppIcon.appiconset/icon_256x256.png | Bin 1423 -> 7071 bytes .../AppIcon.appiconset/icon_256x256@2x.png | Bin 2709 -> 18249 bytes .../AppIcon.appiconset/icon_32x32.png | Bin 429 -> 833 bytes .../AppIcon.appiconset/icon_32x32@2x.png | Bin 597 -> 1807 bytes .../AppIcon.appiconset/icon_512x512.png | Bin 2709 -> 18249 bytes .../AppIcon.appiconset/icon_512x512@2x.png | Bin 5315 -> 51101 bytes .../AppIconDebug.appiconset/Contents.json | 60 +++++++++++++ .../AppIconDebug.appiconset/mac_128x128.png | Bin 0 -> 4538 bytes .../mac_128x128@2x.png | Bin 0 -> 9541 bytes .../AppIconDebug.appiconset/mac_16x16.png | Bin 0 -> 505 bytes .../AppIconDebug.appiconset/mac_16x16@2x.png | Bin 0 -> 930 bytes .../AppIconDebug.appiconset/mac_256x256.png | Bin 0 -> 9541 bytes .../mac_256x256@2x.png | Bin 0 -> 26124 bytes .../AppIconDebug.appiconset/mac_32x32.png | Bin 0 -> 930 bytes .../AppIconDebug.appiconset/mac_32x32@2x.png | Bin 0 -> 1964 bytes .../AppIconDebug.appiconset/mac_512x512.png | Bin 0 -> 26124 bytes .../mac_512x512@2x.png | Bin 0 -> 74414 bytes scripts/generate-mac-appicon.swift | 81 ++++++++++++++++++ 22 files changed, 141 insertions(+) create mode 100644 bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_128x128.png create mode 100644 bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_128x128@2x.png create mode 100644 bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_16x16.png create mode 100644 bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_16x16@2x.png create mode 100644 bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_256x256.png create mode 100644 bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_256x256@2x.png create mode 100644 bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_32x32.png create mode 100644 bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_32x32@2x.png create mode 100644 bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_512x512.png create mode 100644 bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_512x512@2x.png create mode 100644 scripts/generate-mac-appicon.swift diff --git a/bitchat/Assets.xcassets/AppIcon.appiconset/icon_128x128.png b/bitchat/Assets.xcassets/AppIcon.appiconset/icon_128x128.png index f85ced2c5e541beabda19fe19341006ded6b82d5..c9298e1a66592b1a92d0ff8ce52b0a4cac2124a1 100644 GIT binary patch literal 3750 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 V_vtxbl`nckg#Hb^DqW|j{{Ya9#U%g$ literal 848 zcmeAS@N?(olHy`uVBq!ia0vp^4Is<`Bp9BB+KB@xg=CK)Uj~LMHK2G41H&(n{0jz# zQUeBtR|yOZRx=nF#0%!^3bX-AFeQ1ryDA?d9s}&cbM2@n>w*_gg%}@&3`t7|yuj!MgTsv)K>*hbLsOYn~ zzdNSrcw+|~=y+IM*ZI}#`R1#|9F($=f%YZ zzHM0Npdi3;WowzN{~6|w)~EkkvbR3D+jn!Ck@4;c`=hVs9k;ppnbl(Fz4qj<6}&z1 ztWC%7uoeg_JTrK3HGIM1gRuwxurD~)-hJS6a;22Q8-oYp4vP;rc)T;&!I|-fVMdX- z05{Xj@^eg4=a}yNf2fu4y1A?&dusgtE1wT6Q*bDF`s(c7y9{@H|INKM{jLk6)IT0I zH?0{{wZ7CPt4x}$|FJElk?S5WV_SLcst1aCW(VZHen0zTW8Kg6Lpy!aigLc(tBwy7 z7lea}OCOkf*1g{KN&TWOFiEMFxJHzuB$lLFB^RXvDF!10BU4=ib6o?Y5JNL7V-qV= zOKk%KD+7aH0zI`T8glbfGSez?Yv}ehISACC0k@$fGdH!kBr&%Dx1Ku@qH;hz44$rj JF6*2UngCzIV37a- diff --git a/bitchat/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png b/bitchat/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png index 6516c53c5bbd14b44292208b8d0b0252f24ab07a..7dfe07624bed428a9a8972fa508c006f25a33fed 100644 GIT binary patch literal 7071 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 a823>#eMz{Y@d#l6{M=T*bBm;A8}T1Za>CO9 literal 1423 zcmaJ>Yd8~n9R6?FBb($2k;|D>B#lk0W}{BpT03lE$|bopWHPsH$KCdzBSjZoT#id6 zMoA}P5#vxgI)xfm#wfWomfRhRv%Z|?IUnl%@VmY5`}}^NerZlL@;bOa900J6a+v4> z07O|rz*=PlF`E|Zl*yQJ*o6u}tSJEe6abc#BmNiwTr>c3UjXpg0O*G2)j8WL3Ft`& zG7+q%UVPE0>{K}vDoORDDpb>iFloLB13-mMAs%pz?p5^pgwO*FTc@H7mXl#!8R>j| zPFm>sG?Hmg5a&>YY&HqqMRd*)6Ek>8uT;+J>N6g75;j~Ws*u!gY$vL($}7@0pHx4X z-fDC3WOJ9A+IvH8OU%ImVSh?~=;YffH&Nl;fx3dKeMfpf2&1^(lKx>Z^iauz|(t2M}6YMx8LH(?2q5F#P)4_Wlf#x zqMGE?cg!keHH;?Sc+jfrc6kyR}EK8lDoc!rhD{a z=td65`4mM?NqaG>3ELoO*YR*Ru+Jf|>C!_{r!$7o5eOEo?BOlK7%7KT~B&C-xu)vTe+luDY)~vPx zhrvR}zg>hn*coP+#f2=%0{`WLdT(t*sjg)8HmI7R5_(WhWV*JmcVyg|sL~<|94GU8 zb`_tiBs*wscZ-VZ7-q zrV8oq!Q$Z(c*aKn5_a{-@812{Plj(b+M&2 zd^#?EJ?<`Vxvr!8CI=SZA7RXPF`{_T1jHgF9V3Rno=6OXz@Ir@`cezHfMUx&Q zu<`ZRv-oQd0VB94tng;L&Re~KHOCSrMlzoh6~lAX8H+yZ`TKQ`-ST(Jps^xk1l^?n z)BKtH1Jd|A*>fKk zNV{I{DiCWATB2rFa^m!0kG7=n%EU}~=>vL*t`_YRG)8@*jr-m|+@;r+c;IJ^TcAjbp)%7NVOPQWNh*mNzQJO~zQXN?84G0= zXG*;(vldKni+XV2du>Z%$J;XQ^PdfTh2K|M&6UWz9oEcwNlT%jOmTCr^y;f!t{i*f z)+^}$xAd$vVSJUp|Nh}kIx%|UERF}5t{nSV@g$2yWIbnqknDsIr*^NfP|-~~!fv0H z9L#xQuPdJaT|X0DNtZ~y85}Sb4q9e08`JYP5=M^ literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UA6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDI0I6bN5HFasE6@fg!Ib3f?!xfDz5mR9AdkJo)7O>#B|DRVlJ$GdAFMzj z4^J1z5Q)pl2@BX0(h@Q@`q(Vlt2rb!*h1BzT0 zzp1>%z|g>8iFMrNtsbdMx`h`qFqEtl*qv*1sS9YPYKdz^NlIc#s#S7PDv)9@GB7gL zH89sTFbXj=vobcZGPTq;Ft9Q(_$AO&i=rVnKP5A*61RqKUz3AC4H|G8N-}d(i%Sx7 X3vlbX6Co-G)WhKE>gTe~DWM4fwfbc4 diff --git a/bitchat/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png b/bitchat/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png index 84b3ea2c3222572eb172f0e1e93a05a82dd1f8cb..cf0a709f8988e3388b623d9839be2cf43caf8f15 100644 GIT binary patch delta 821 zcmV-51IqlZ1HlH68Gi-<0047(dh`GQ00DDSM?wIu&K&6g002Z~SV?A0O#mtY000O8 z0f%V-1ONa40RR918UO$Q000A^0RRI4000310RRA?0ssU600031001DM0{{d700031 z001BW00022hGO#o00OH?L_t(o3FTKkuc1K{KEAFMK_R)3TYrdXZX!|m0sIJ^h{g@& z?fD6cO+*OM>b6nn^g4w^BXldG@ezrS^))-s@V<-7i^bl}?n#cBIdkSb&z$*q2hsm7 zDuo1Sc%OQ!3T|h+*4zWSI_tT00I4rrzjFP~b;9+>Zz{$j24W$m(u8^U#^IHh1Fr1O zikOJ4NCGS$0e>z{2C;#0RIuhqmE`=W5*WbxAUbZrdOZqQiVF;23BfLx1a+&_cwh+( z8CR}s0gtBU&Sds54hh^D>wGxvITwvaLu$2}mdhnEhGpD{R;!iUDwRs~OTOzh?j4?I zJ`Q6r_LL|RaJ$`}s8*{{EEYS3zh~F;7H&Lgw=$p4$10Tyv)k>=>2$J2qakd3W{iWgTrS75*{rC; zX0=+`%gYN(r_(Hx$%r~^yD_&Iz!IXE0i+U&8R>L7>i7FJ9*>0$vmOqIA~UE%dcB?~ z2ZMn~e}AXb5pAU(MFOkUiumj)kx0<<^E0*EZK~Jnay+d4F@gP5-=V+aDZoZ+Hk%X( z1jy_4ikZK?y&cB5sjZj+M3#2+d_EUsTrQUkxL7RYlOP+ftehp_a5yLuiI85eC%@lM z@9*zqFc>Hl3W=-$FB*+fp-`a71YcjGr>Ccjmw!N!K&#af$IxUl(QG!OU@%D4YE^7X zv)N3gQb_=!A7@^YVzGEJ0ci}%566((4v)}1+BoX+G5kdv6h1-zIsz9z9B)Y09>#74 z@CDgiWj92>U??y)Un^cYB=GHm0JpjTLnd$->{B15AcM>OmFpv3#uq)yB@)QQANgZ) z{4R3_8k?sx_Q>u&5gk|lV7;MxyZ_1<|FHW{S^SnsbW=pi00000NkvXXu0mjf0q10E literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW(4IWRD z45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^>;_2(k{*s+ZK*{>O<_}h& z&_quc#}JFtZzmdZ9dZzHnJ;ynf1ZoZ7M`xSgXfBGa80{+;+XJ_C8BR^oe!vh(WKay2s==lL0G+VmGpSJ~|~>C-lY^3yfVo3m1T&i=WkHeVxiO2Eo*A^{br zgt+{pD+1-!cCPBnL|I{uo2l}m4@`SGmABuxThO+7zU>@#U;YOF-SUf{%jX|G zWpZ*e>#7q#$ElXMMwFx^mZVxG7o`Fz1|tI_Q(XgdT?3;KLo+L56Dw0oZ36=<1A|`z zJ+&wra`RI%(<*Um==L=^2-Khfx1l66H?_DVF}DD>o;wkuazH%{p00i_>zopr0GgYN AbpQYW diff --git a/bitchat/Assets.xcassets/AppIcon.appiconset/icon_256x256.png b/bitchat/Assets.xcassets/AppIcon.appiconset/icon_256x256.png index 6516c53c5bbd14b44292208b8d0b0252f24ab07a..7dfe07624bed428a9a8972fa508c006f25a33fed 100644 GIT binary patch literal 7071 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 a823>#eMz{Y@d#l6{M=T*bBm;A8}T1Za>CO9 literal 1423 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 D9&`%1 literal 2709 zcmcImX;hO(7k(2PNdsuCAWH;Uiqaqr_~9w8 z{VGx)nmRBVr;ygk&A)nj>`pFm3WY%YQ9hyEb8jI2bEtAakmh$ zUFD-Q*Ng{QaUuNSl@0NDj7-R9z2^&FhDI_H`$DR#qw;#@7Y|5u*Y%8yKC9J>U44#b zuT01pd}|VHHDBGOm}2}KLlWQS9gdc|<|0)xnF&L=UkSDr$xU`t0qXIE)T%$HZZNIx zVWy$+SW#Mo;5Ai*4D6@_)MZSlo9Rt1N!lkr!r*7-QCpE=A{kgm1E9WF%iJF7i1}dCzKwAG#2O-J)%1mmCC85cnzfCEmP4hH0)IGrn9X! zk&Hm@-=y^Lb|G8~pz$Hbk54!;u8Iv7+D#VMK1>x&5esc^n+h3Cbj1NaR6zRVsYm4% zeWbECvunHGZ!kvc>b*jn($?wBwPx7q;Fx@`!S7_#n_AzPjtn;rcv!*J4OGmhAH9p? z)s8Xh_BRaHX&s1eSW94@4)zdatP9j{bdsR>fzeBEx0X(YhO1HoMYQJjGB6uY=jeJ5 zRxjTQSD@g@wQmDFX~@QXw_mMV^vX7|kEyT>V)v-cirdR#9-^jhIjFF(S$ovt6@q@g zaVw|CPNfX{ZjV}7{)j3nKL_t|=94br;_~{?=Qd5}Y4q_H7+jik)1e_7?|w28LukG2 z*Jr}?PuBv|zF}mO*q0+BB@I_#ICLqECbNb+cz0q2hHw#Ul$(opBYwgVLcIc3Yk16? zX)zG|)?Ovm|C&8fS+U#CKI)WydI)#ntgmJuiDs;!FHk!F)ntZ4_4-U34(o!}AtL13 zWv`c4ae4&Xupy9bhtuP{e|ARRasPc*r!*Fin_1N+m!<`fXjU4P4rI1vc$R`%m4Ip` za1Hu1kl+R2Fnf~Rtx@^tq7CGe(Ejs z8&8PdX6RlH%Ut-ab7*yLU(pWtYp9OT?-f3`tczLTL@ zS7+Wi#jel7hg{uW0aTi9M9$xLj8>|l+?mYbWLns-tga;8lw-`r9gvuk6LFIZs*K=d zy(K|IzUv1i#!{+MaGZGK_;L?$o?pF?&Qm&;L5ARcysM(tx_LkRo^c-Hu1DgFDkYTr z=OOfSvA^_Jv{tWNQLnwbn8VrCH?8-s_VVlFN0y(YNFy!b4y~J?SxF~^8+cw?EW{Gt z6)X;E4gq^oM*@vU(yvUkH@O6ByJ;bijb;57ssk%-!cq+w+~L02jF`4rfQG@xgl@&f zbfv9y^pkb$n`*fG_QNt-pch7~Z zRGj_XwM{W*<<8&(&WZ=?l;Zw8vO7z^QSf|jnYZis-LW{DtTa8VzNBR=-(tm_@dkI0 z06#MqyZhsH3gX8JbJK5>b$X!j3*Gf0p?*ta4V4y*f=FEg{7Hk{l~?)oYUHOC6J9iK z^c$^bi(=*%jI}WiLx5NR7QI)dR*PKrFyJ&TV%#istW1A~l#~sY`AclH`Sm9*#b~=J z*bs#haB<=nroa66OVIe%eYa)wj^&lA)hMWW%V%|w`6Y?%uYn$x2#>-WlS?B5d}t9d z0n0CV1;3|KArw^2&)mfgUc(OJnu71lh10mYsSB=iv&0=Z!o5yXFj z^tcKw6Th696`DC0qitXa?w)rlqnABJu8&IykVYTPN-LKnw2hlI`1XfOooGXb6Y~E7 zU8(Qlc?HLa{m>K#l~Or3ZO%w)R?jxnBLwVv-T|QteaHC}v>e0CXcWAlrE3Au%f2BC zb_>!?n_xR@utb6?7b0MAQw@FCS#Y6m#O!yC2(BXN{X9uIDsoLIv4kwA$XeL{O_^10 z9J|J2B8Umly^1I_!QZtC_m7ax!iaZ~;H2}e_-D>>TIC7cugb!`LHIX&<1!LvC4EyoG zr9Xs|;1g)BKxb7f4vRIJ7rtU~q<7f*&1&ElSg{nOg;J*(8Dr%TtMK9GOyPL9Pw@_S zdVRU#C%dMfv-b%WxHHVcbj@+7{p*-xm#wB>Fbn0sAGuH4robv+Tus^-EZX65=cjzg z_AV1iXLizNw091kWQRM*Sr~UT5BD=3VaJ(}8`A>ZXm7?3ys*zRs$q_x%&7jNOdF*( zsC|7^OJY&c)KqF=Yl@O!bV(yzFx&Nvz$Q!LnqPZUHYfS-C*SK>rh=WmyZp}$<-Fxv9fQJU;K3$H2<#a9HJv{l5KZPM1RQ38&n$Erjq*cQPdd zZyAerrOgR0{z#68x=m~OuI*BlP@K}C&re?xhcfl$n96#Pyq%;Pb8@1k+e4rOLscio z`%U`L=vvh#+h0m1NVHqkf|{E7Cr&N{u+@>Ko$S#py!BXxE~jPs!O7Z!`3~+i8ENj8 zX#M^vk9z(}f-vDAg1boEu$`M5sS<~FWazTl)IwqK=Ht{Lww=n?KiIz|H0Y*+%5|pQ)BxwKdgs714zzb1l!Xy5fGwLa?`ZaPpn-kXMmcGCK1w@Unxc~qF diff --git a/bitchat/Assets.xcassets/AppIcon.appiconset/icon_32x32.png b/bitchat/Assets.xcassets/AppIcon.appiconset/icon_32x32.png index 84b3ea2c3222572eb172f0e1e93a05a82dd1f8cb..cf0a709f8988e3388b623d9839be2cf43caf8f15 100644 GIT binary patch delta 821 zcmV-51IqlZ1HlH68Gi-<0047(dh`GQ00DDSM?wIu&K&6g002Z~SV?A0O#mtY000O8 z0f%V-1ONa40RR918UO$Q000A^0RRI4000310RRA?0ssU600031001DM0{{d700031 z001BW00022hGO#o00OH?L_t(o3FTKkuc1K{KEAFMK_R)3TYrdXZX!|m0sIJ^h{g@& z?fD6cO+*OM>b6nn^g4w^BXldG@ezrS^))-s@V<-7i^bl}?n#cBIdkSb&z$*q2hsm7 zDuo1Sc%OQ!3T|h+*4zWSI_tT00I4rrzjFP~b;9+>Zz{$j24W$m(u8^U#^IHh1Fr1O zikOJ4NCGS$0e>z{2C;#0RIuhqmE`=W5*WbxAUbZrdOZqQiVF;23BfLx1a+&_cwh+( z8CR}s0gtBU&Sds54hh^D>wGxvITwvaLu$2}mdhnEhGpD{R;!iUDwRs~OTOzh?j4?I zJ`Q6r_LL|RaJ$`}s8*{{EEYS3zh~F;7H&Lgw=$p4$10Tyv)k>=>2$J2qakd3W{iWgTrS75*{rC; zX0=+`%gYN(r_(Hx$%r~^yD_&Iz!IXE0i+U&8R>L7>i7FJ9*>0$vmOqIA~UE%dcB?~ z2ZMn~e}AXb5pAU(MFOkUiumj)kx0<<^E0*EZK~Jnay+d4F@gP5-=V+aDZoZ+Hk%X( z1jy_4ikZK?y&cB5sjZj+M3#2+d_EUsTrQUkxL7RYlOP+ftehp_a5yLuiI85eC%@lM z@9*zqFc>Hl3W=-$FB*+fp-`a71YcjGr>Ccjmw!N!K&#af$IxUl(QG!OU@%D4YE^7X zv)N3gQb_=!A7@^YVzGEJ0ci}%566((4v)}1+BoX+G5kdv6h1-zIsz9z9B)Y09>#74 z@CDgiWj92>U??y)Un^cYB=GHm0JpjTLnd$->{B15AcM>OmFpv3#uq)yB@)QQANgZ) z{4R3_8k?sx_Q>u&5gk|lV7;MxyZ_1<|FHW{S^SnsbW=pi00000NkvXXu0mjf0q10E literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW(4IWRD z45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^>;_2(k{*s+ZK*{>O<_}h& z&_quc#}JFtZzmdZ9dZzHnJ;ynf1ZoZ7M`xSgXfBGa80{+;+XJ_C8BR^oe!vh(WKay2s==lL0G+VmGpSJ~|~>C-lY^3yfVo3m1T&i=WkHeVxiO2Eo*A^{br zgt+{pD+1-!cCPBnL|I{uo2l}m4@`SGmABuxThO+7zU>@#U;YOF-SUf{%jX|G zWpZ*e>#7q#$ElXMMwFx^mZVxG7o`Fz1|tI_Q(XgdT?3;KLo+L56Dw0oZ36=<1A|`z zJ+&wra`RI%(<*Um==L=^2-Khfx1l66H?_DVF}DD>o;wkuazH%{p00i_>zopr0GgYN AbpQYW diff --git a/bitchat/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png b/bitchat/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png index 58e93947b699302744ccadfac8a89c79d8b7b408..500352c4ac68b4efc4dd565bbd2be1b131789164 100644 GIT binary patch delta 1803 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 D9&`%1 literal 2709 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 diff --git a/bitchat/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png b/bitchat/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png index 9bf9b82ade65e9e3a0a946051b0b3863dabef80b..46801070eb51f082ba9288f4d0fc2f293f407438 100644 GIT binary patch literal 51101 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 diff --git a/bitchat/Assets.xcassets/AppIconDebug.appiconset/Contents.json b/bitchat/Assets.xcassets/AppIconDebug.appiconset/Contents.json index b74e0441..72bc51f7 100644 --- a/bitchat/Assets.xcassets/AppIconDebug.appiconset/Contents.json +++ b/bitchat/Assets.xcassets/AppIconDebug.appiconset/Contents.json @@ -27,6 +27,66 @@ "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" + }, + { + "filename" : "mac_16x16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "mac_16x16@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "mac_32x32.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "mac_32x32@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : "mac_128x128.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : "mac_128x128@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : "mac_256x256.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "mac_256x256@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : "mac_512x512.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "mac_512x512@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" } ], "info" : { diff --git a/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_128x128.png b/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..9915a654eb0048136f92b910362c6b05edbea558 GIT binary patch literal 4538 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 literal 0 HcmV?d00001 diff --git a/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_128x128@2x.png b/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b5458dca7434f1a41aaefc64e69599b31aa07038 GIT binary patch literal 9541 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 literal 0 HcmV?d00001 diff --git a/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_16x16.png b/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a0c8e1084ea13314b19bcf922e78eb45604433 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#jmh9=`7-Au~ zbh4)xi=%*R{Ys15d>Sh{tlv&m7r67q)TUwH3GNrJEaG~1w{a*f(%|y5xc&5ZaW^As~78!PX66m$WRu%V9joeN@t7hO7HG$v3R=Et#;zE z%eBYVMs(%N?M99f%CSZDF@BpIO|(yUrhd-aW8M zeBKxS`CAsQo3>Sm&-Ng9!jXdaieDr=q^&P+{I=C=iA#e2r_W!wy;t^4JsSP<>-iAB boSb^*drVn%#hX&|K*8?m>gTe~DWM4fTzJEE literal 0 HcmV?d00001 diff --git a/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_16x16@2x.png b/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_16x16@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5a292f437f37427a7b0edad284e6055b847c1f84 GIT binary patch literal 930 zcmV;T16}-yP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$?3`s;mR9Fe+mP>0CK@i7#b~g_Z zMe&d*5+aDA2;wb>f?q)J=t(giy!Z|D>Qx0Fc=7|NH$m{^MZ|+BULuHsm|%P$D#5pz z_V@3e-kF`<>Dh$cix&Hz>aMP?s;Ta(S!4cpN+Jnpvew8DQL9}_(GZqvH8TYTH4e^$ zdGHPVTqU$uHe^dSV=v6ISJ(;v1nhtzo3b4ZLQxLGd3YJwmXDsKGgqpD^02sk$X6GQ zAkldZ%W<$PAM)i$w>*%>o5Ey>Tt3=<+k?zu&(sV!m<}K100!)<-dw9zMIkEY-z81$ z)TxS8Sbu=@q_4Ik(pWlLtDtBA$sS``7ufj&U_8A;JG+9v4alz{n*=zw3-~yN>-G2YObW%zJ-4VkbUR5`RJoJUnJ!BCX+{4Gyp5- z)1>ws7N#)x5jdFPiNz!I62@wHjh&sHyCs49km;6Hjl7q04eET zzRK=(;1|bmj3ar%crBn5)4OmHXT;CU$1<8bPKnyGC0X`1rtHl6P zvqUdjZ?@*krI9{1@4+pw5vb!$WLSjn1}f9o|6loVy_6?ZyaTD3GdI1s;;A=W0$;%b zkfYb&5x5WNlr9UfO7cEJcPSQ++cIvhn?;rv6&16SWyxe8Tx;VEB_S+f}p z+M1_eE}xH?9pvR9P<8iDIvzQ0zguZ*iu2UW@V$MWX_gf7se;m9XZ?Gf2m1c0c2@)K zl?~aF&GHL(3s4HAchVgx-jlGl60V#Gv8%Zfd;gg3Ux2Ye=b}|$^8f$<07*qoM6N<$ Ef-6Ft^8f$< literal 0 HcmV?d00001 diff --git a/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_256x256.png b/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..b5458dca7434f1a41aaefc64e69599b31aa07038 GIT binary patch literal 9541 zcmd6NhgVZi@b66m2{lOXMN#P;ksgpD9V~Q^-b6Z51R)Ut5eOh%S`Zb!^eUi~fIvVx zs30|=BV7?(Yy};AW{(o zP(VqUjem*jzgockyLW)fA+B{&MbpJX*VWJv5GIu=08p$4K=zM?lsHHU03a9;03qd| ze{C4>|E7Wf4CMcm|1rA#=FkOz>s7j%>JLLeTeh_I*R?{oLVYYP)Z5yG}to*v0S{a0M1sXirIF>#o;(~^JspQE*gmy*kS@AVkX?tqyVA2C!S~iS2V-6}7 z6^3fSCSvJOyr2Lid)xBehoUS#s|^%`f{#bDy!p!wUAtI#5)W>JP9d^E{jnNxY_Dhw zj0jLX7d{-Di;RBtTY-W{AMAil$dx&jttP`8L?~n7d7yGe=GXDcPDrO1r&y;~PH|4J zo#LGadN|=XQk}7ioiqj94UD^D_Wa4kMd^2yT@pd)8)zZ47+OjJoGhuUD|6P08To*m z#ko8!9djWTp+Wy>=msl!FvtBLT?qwO-6EbXSAqIb!k=J|^@V!?Zrm-b6jqT>VVzI! zzAVI*DEn+KNsQbG78qHT9sWJLrR0n&j4O&Oo-1{V7ob$_at)gc^ILyPRt*v?Mk+_HxbD0z>G@f$hIB;cN6FCVg|W7FO#!3z1a?VbuM8~ zr*;i`#|0lGc<6|qP}>cIw75~;vsqlNE$A7pnKSh)XN9;q+Fqu-^*%!aXTh2j}sHa zB^HRFFu7_J|41#X2-@UVC`Bo3I(8O2jI_@M5`Eq*a3J#NgN@oL4Xmnk{oj4w=m%&o z)3MQ5QM~HSE{|hrT@9Ha+CjUD+o-_A1HYiLD26`}d}=NB0b8 z7r^m2WCHJXoyUU!P9CR-Q^u)!**i)L!LZtlWS4Gs6Bp9Gg(ko^J(F<{WXqPiS^=nWp;DwUAcOs0T z;dkaHbBo+Q*`b*Mr`@|$iG6MSOBSr?_M!x) z>1?(5O{h3M#E~x#odlcCGHTX-+{i{#WR*2AL9~S3 zzV)f!yV0KnrvTJlW9^AB?1swq2;z0GSlqDACQfJY=p$HZkd*_l}JG9*{9II=)ZP$XF@RV9%d~w zo`I78>FSJT#C0H|g$-f4M*wV+T#VE>k;h7p6uJR+%;1P>>S0%XXICsla@oM|XGbG& zgCzEn8&Ymj5qV~gP9D#M_$C(M!rx#0rya!q%wjHp?+01P*xt4Gqv}So^}1rq2-bhw zxRC6s8+)d)4eEt#B_a@4rAig%DYG(6@16fdyK~0!7XF&k$i4tgpa(utc{b6(@WQLY zJ3Si~BpIJTTc(qIVAz{1+YPm$58zTJ)T9<8b~uJbrBIu+L#6T4ppYZ`r<+U-x}={Y zq~Yp39P1GaCrwY02vR_fJkvaRg<@b&h6tuSF}(r3@XtLI5kb;M{wmjJ!%)~0c& z5w>IqMaA9sNo;~Cq&^INW~PpOvLy1I4f=I{sGhSL9HUuln*RT0NRA`KsZ|)kj+vW0 z#_hPGJBaE>)WT`qAHDuxZFB;jC_Da@%AoIaBLx!^zrGVjP?uT}Kh0_T{42U=i5`+6 zx=e$!$pekMEl&kQ=6Uz10}a!fcgN_Rs6^@Vl*4#R+ubyoh0|L7;C#IaiuSJq>3|?G`Tmqouw#{kTl|7L*xhs|Q2YT<6W-06b zRAy~SE;b-uf&y=KMn=gH<;GYBB3eaoN|Td$TP(jaTGA!l_wU;@D-?7z$UXHG(w%7W z;>b!${7{(#TPe}HvwsNuNu1bIyqz!YD+Gg&ywI@lr`R>bU+dbs{ir6Y>d&vNjs|q< zSS7mje9#*I_awC};-@mq#5LA`WSky&Ad&b^Ok9K5Q%aY;ci@xWcN!x6(azKqmp=EF zyk;-}pcd4L!`pL{3u#?1aulc*%f(vyf_;oX{#Mq3x}V(&1_r0e2HwVv5Vo3+32Uyw zxH~&+N(8YP>Z3n?Ngd4*ZP&S^XvKs3iv5~+eu=N?bDzIF!ZW@6URciQ*=aPU(U{+qmCIkUwf6Rr|HY)-;e9KO!v_}TZ{o|xDr{MLjz=3es}%Kz zw##J5jix1u&0&arZvpWQUr*;r=0!4NRx1fLV))Cf^~J%W$vX_>SgOTV)VN=;ugciA z!TTg%#V~DZV~*H@v&*4w?5Dno&8Ev{QOs3%XYlL+QzoXe`@OEk4K;3ii7XhqUAq!=#q^Zf1UcYgebgB zR_)@);io0bpBqi_$bY0A&2WDZU3HgA;)-63*vc`?BRgGn?X!1y81qeZu%rJoG1syA zYj65{nLG$V_9qqta>how2TVU6LCe^Gs=jZ?2rX^tb%gm&l{xm$rNE_0V4!nFc0iTE zGB$tcc`^53E>hIyaWV5ZYmjJnF+0&|{|n*JN=2t#=j%z8Tw&X1LF z7qoPx4;D!~g|m9S-m^v}fi^tK0J9!Dcx9i7@Tf;3V(?wrno+qFfwW&-f>-uU2#cut ziKjIOK2_x2BG&)Coyc6~dpvh`@2vnV*}1Iu7sN%Z!x{ydZv&kMtnzd3;Pt7TF}!FjkO7X{Z-ITq0Ijua!7_5|yx=^n5DN9Nvy=(nrOkT6`=y~D)bs?Og&1SE z-qoJ}-tTZm#N(LSfA(i1yd?j);Z{LzXxmhAt{%0FD7GN4uVYKV47|9;8z!)OXZ6!8 zlyPhzLrnMrwX)s&MPSze;Ebr?2DvV6N8E2(1oyc4%_F{6fj@ZB+^iZsUZb(Nn;7A; zSeXp*{lX=4_#H&V4l#Q#B|AL>b2L!WDh}>u)73?sI!vAk0HWtbi9soyo$PC&Yn}R) zwkUs~Pkedv-uHolL{+{QgkjrPjtKOA!F7@Ep#&Ot^5mTR3dos1xk;Oq*hD|snK|>Z0MbHd4P-i9(p?IdKb5Scw0P`b-QcdN5Tz-C zBpdd+pcYvjR7T&Z^NV@zL~Zmg(e2_4oxdDca5^1!IgpUpEl(Tyaqs@fclAkXB9|Fi zF@9?Ps*0rLNDua){{#ACgN>|IDi>0pxlLgHg8s=NEn5A{dYn_l@3ID!Yr#e2^UmExEX+9IsKxwS$fD%1ke<;~y3>$}@<> zn1A^A>{Xga2w%gP);ADwQ?&(<-8Yj*^_%qZ2>>~{EA7{&zZG9Q?$3zt9X93mmm3C& z`o|&si^nNjsQbrYzAhZo;d)4G)K7K(%+2K&wd;Fh6wGgPQ1w@{PaRzbaB5*U4$0e4 zEs#$($IkXAPmjO-$tz?&wVQRL}W z`zh^m=ee@UJd*M4Dp0HVbsX<8k8DLYlqh>KBag^G2EAa!@@uxgaZ!lylqf$aS1r|* zpu!+@McoaQC){OS2%Rsdv8AsgT~;+a6z~j=CEL*8FzsCurQt z8;Wt?7E9|s8p#(DgoPViX?j7|m1L*2->JnBqPi* zWWfCOxum;^w_$r!)_M}F@p-uDf&tu~ekt*p#|mrgmifyfmhv-4djlv*_?rr0_^3ic z|8>f5edz56{tW4P6`^px97Z37k3qbT0?))=5G?g{Dv(cI{>w^#1dccT?;S}o_oJfb zDJEfG9ebq_5e63NDKfe$BGo$C*HwzX&;G+kbaBUzXR2IS?-J!L-Xx6C(1q!-uRBZh z+_=i$l;BoKIfgWg=WdAARf9YLhTWn0NQn>&f>jHP)$}%%_iU&jul=gLV@X0s#Jkn;Ltuc{h34?RibJv6Y0ntuch?o`UT9@zkx? z!tTLa$|QieUL%{w7F#bAKA3gc^*w_5yI5&(Tsk{W?3 z52OHOvWkvd5BHRwiFhyVIt7dNXm>D^ZLiCa&r{^8a6%9I267=X2HdgM2~Mz^#W(BM z)5d7X{KVvIZ}9(?3Ai>T^%0_PYLfCndPEs^#d`e;+5^i!19fI@#N6Ee?7M8l%UP0?mF6L7J=CsrTV&Wb+#=N1C^RnPkXC*cI`{HZrE=5 ze~PxsqVddJt{Iu~SY?rJ^9r|eW-m;f^8UiQcGN4KR&tlyWARyy*kUra^Y+}eg(!iO zMLUo>#bu6qgU!vxkaThA zW0J??!rBxKX=0&eUqnov__RH~0zpYvvp-9h^vhTTh?l6ph-nD7$9)kUXoMZwtc@GE z3=zBh{l8Ph1UO(#tJDtLPu1Uykw`YiByp3zX)jOKeP3OyLOiF2ZUE)VQm?SJ!m zwS71VWfp_}#$j6q2d3!-#$R;DLNKo@#{x!A)>z3mDi*rbTG`ho2W%Qs{$1|9?cmt7 zO~DAyzz!B6tB1T{j#29oz_fHE~<9Hl%FByrD#0YYa_ z-s)LzTu(_iQnYr}o)K#vHEA746-^l%Eg`jY3-)*QUHTM-jqGUdUKI$vvEctQ)EqR> zSR2M&bvZ{dajopV=0BfGc4(Bu_qEv!qA%b|WU0McH!3zd=-sV2)CYvU>goT0=w$D7Wo{PmSil~x`nhy@cL5kav~kIe<0*Bvzx&$yGr;h2V@j1|P5QQ#tB zBUt&cFKA@@r*L+xDR?}H{3l5Ey9kOJ#DNi+@1Yzwu(()7(PGU(hg@#{Z5=iI_MLx@ zttPx?U%}|5x5M#<$c=^e7yEXAXlxns3$T*@PYB1uu^lp~UEM1tI}zYPU#=RC-iG`6 zAOjQJ9w{Emyc_L(B1d5ib6+Y3WUVHMp=U=xVk8U?1Kei&k+VS0cy`kSURHdSo8ppF zo^_H36V6DatY*T9Gf^wK<$Y-79=9A_L;R#=j|5`}^%NNtuW=x{&FJ%F&JCR~PW;Yk zavIme#J5Uo7Q+<)VM7c4Nlf+{%>ZNBV)xc0)x^b}!(LM??`N?OQmu@5nh4=tVeHHP z^=VYu7y2r-Cay_}O_;@_j7An;+G8#GVy94^-Ao{JmFaNm12QLbFY2XsE7aoGAohRftNPDUtzjLO51S@*Lo+dR5s43Jl zc13!G2LrMp-!f4GfbmvLfrbv@Pd*&GwH4(zv{7NBNG9`)BXEw;BfSkWh-F>KLdPxF zCa?nifUX>bdpb*9yN=Zww6vADsmP#E-p@E1op;|)?w!-w!4ta#RgP9g#p_c>!BG&) zn@%_Tc;5Ln-*GiO#CC`yX*oFrs@x=$8LCam;bA>PP9Mh=>O;VO{hM6}mkr?w%MIJj zVFQ7UHu?Hv>`inAV{(dh?Fyicz5`FHSBCH^@as(x$3loj9L#7wu`+3{-rl-&r&GIN zbFKcOSYDL|BlRG}$E%Z2!-$pT*z!cuffI@eer$eU(Y4&wa;m@22>IY>ex&wkfW3^G zLv|&hmgexiLcuM0IS1SCNAv*qz*AtcDORoUqH-~g|F0VeQcpRh-3Ld`ZtBZB({SaJ z#ZDRo8XY(&v%0>$-UnD(!m~V8Avjjh%zzS|Jgel@oG{Svns#nfa*RRL%3@0}FiZvq z@sQ2Txn>uD<(DeKs#IBANC?Mn(HHu%D;G-DJWXu!oRSVz{y#c!Nle>!M<{2(z8Zg= z)ueMlQ(!NWQa4TOSnGIwJ}toG2zuxOy=4UfU)5`JPMOC>9B3(&dISuzf8 z-aV;pTI>*#((*%*Jo6;DiPi$tLWaLN!-{%}wF6{b;UcL53wTX?JLIuPbs7W}1wto$ z1ySv+&O;?77M}#+9DEx5gwdfn>Um9jM}c@rQn>3A(peHxPd@e1FqvEFYU&)#e44}U zQzkhqmN4N5JXu>GJ(WDIPGQId)poO=jbqC|;uU>k=U6|$?V&2i3u!Q)tie8E$w^H8AsBvP%0uu`A5ZT2QS+kM{H(dg0H!wwn-9<@jsIP?&_c??| zHIE4)+WFu6B+%SM-G&cz8yo~Qrd(R_^|*FPn{z>_6M~^EfC+#}sgRdnihxpWd^84=0hg z!A;PhM`R4;>2pd3l{XuD0}#O3G-|DBxUilg3obHdsEjLB+( za*u=Blg@HK@@-p*ggI`yq}srHDq7NNZrJIRD)0n&0@R{~FK@r?%U3Of`GC+_`?e~z zqHws1I8+bAcqJR|#3U&?7Ve1aTbR53+?lEQGnCQ@&YMQWxpV)0_MZRomExUC{}Vo*w-XbEnf($S3J5WTeoOok`V9!n ztP5xO>Mc<^_0#X~3frnhqaUIjEcpD;jq%$YL}yGJ_T7?wCf=bAByLY0q0&~~D3(4@ z6(D6|3nhNu=?hs34n5n9mTB7}PPeuXo_&}F8;pTQc7+!~+jav&ewMpShCP+(-3hj=I|C8YDzY3@0M6Z?Gi+3M3JJ$I&H%uiUF1-OeC&EWe z>-Bn3MXF%ESOUL!s!dVa;OpOIyb#%~_;)^<^JrBx|Io={ZIai?s7e+@&}%(O(J4C( zV!vFTQ>SW}8-`mUBR)i;ks%_xETjNz={KyU$(aE*<9r+4&fY$InmN~_J5;q2KCofg z8}fD7w*@4R;fy753U>gweGhCX;1cpLyCQwMa*wGwiB_ykDzuP9;B-iOubEmN(i@tz{0FsN1$ubCY=r%Q?PYS){ ze?u0A{mCgrL+gEJDsM?H3L}1M)}%3b3%XcZhahKn0{V=CW6Vt;HX zb|0`LL6#`gUUVrzxFTC{k(|DiY8u6RIS~6^dFwy>3X#4&ba^jsv2oO*j2`QfZ%44_S;_h%lF`|}d14&WVYC)*`$OKS8woUF%tlZ0Ctd^hK5O6!kC-5pl z5f9!*`R4)VWU_&z#{olFl}2VryLtfAt|o@6QOV>10|i7De+eNrXw12el~Bs~$9x(n zhTs)CHf$Dg9zISvIQ2Mo3lqH$f*LBc+mDek+Z=5QWC2$UiV2J`NGv1_G7UEMPv&2gYcqjgCz}bFpv+3ye-S4h}kS26wDIj=E9TH zAuYR_?0WVIEE(nIe!OWVGF>4N^08F0$rHZ4h_Alp8*SI~=Ch zF+-E(@U{>x6T#8Q-pt<0>89=D(&VygCipTzZc<~!g^SxDGUg?F4QVxj)Tw*Q!BsW> zCGpmB!#937^LgZkasjl{t|7N&qZ%bGgO=H9)k)D(Mk;Hi0i>8LBv?Zcax}vQR1u`Q z#i|&K+D%>gJW47-`;+9fb1IEa0bDF^=tMGc=}eq!=?^22V?S@kh!2dUUfs9gim&$! zdD1Db`tJO%!MaEupL5OIdMm_alF8`pl#$Ge`qj{ydaD3usL6&l+{4D|bbKL(sqp=4 ssbtql4?kwljPK0<_a5+I{?MEu9#4!tK8n6n14y5)mXT)V9s3vm3q&ML4*&oF literal 0 HcmV?d00001 diff --git a/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_256x256@2x.png b/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_256x256@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..95912d2f89b2462551e1e547ba8518e9958ec3aa GIT binary patch literal 26124 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 literal 0 HcmV?d00001 diff --git a/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_32x32.png b/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5a292f437f37427a7b0edad284e6055b847c1f84 GIT binary patch literal 930 zcmV;T16}-yP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$?3`s;mR9Fe+mP>0CK@i7#b~g_Z zMe&d*5+aDA2;wb>f?q)J=t(giy!Z|D>Qx0Fc=7|NH$m{^MZ|+BULuHsm|%P$D#5pz z_V@3e-kF`<>Dh$cix&Hz>aMP?s;Ta(S!4cpN+Jnpvew8DQL9}_(GZqvH8TYTH4e^$ zdGHPVTqU$uHe^dSV=v6ISJ(;v1nhtzo3b4ZLQxLGd3YJwmXDsKGgqpD^02sk$X6GQ zAkldZ%W<$PAM)i$w>*%>o5Ey>Tt3=<+k?zu&(sV!m<}K100!)<-dw9zMIkEY-z81$ z)TxS8Sbu=@q_4Ik(pWlLtDtBA$sS``7ufj&U_8A;JG+9v4alz{n*=zw3-~yN>-G2YObW%zJ-4VkbUR5`RJoJUnJ!BCX+{4Gyp5- z)1>ws7N#)x5jdFPiNz!I62@wHjh&sHyCs49km;6Hjl7q04eET zzRK=(;1|bmj3ar%crBn5)4OmHXT;CU$1<8bPKnyGC0X`1rtHl6P zvqUdjZ?@*krI9{1@4+pw5vb!$WLSjn1}f9o|6loVy_6?ZyaTD3GdI1s;;A=W0$;%b zkfYb&5x5WNlr9UfO7cEJcPSQ++cIvhn?;rv6&16SWyxe8Tx;VEB_S+f}p z+M1_eE}xH?9pvR9P<8iDIvzQ0zguZ*iu2UW@V$MWX_gf7se;m9XZ?Gf2m1c0c2@)K zl?~aF&GHL(3s4HAchVgx-jlGl60V#Gv8%Zfd;gg3Ux2Ye=b}|$^8f$<07*qoM6N<$ Ef-6Ft^8f$< literal 0 HcmV?d00001 diff --git a/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_32x32@2x.png b/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_32x32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1cea92ddfcfe9abb82eb65c2d45c1726560e536b GIT binary patch literal 1964 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 literal 0 HcmV?d00001 diff --git a/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_512x512@2x.png b/bitchat/Assets.xcassets/AppIconDebug.appiconset/mac_512x512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..691785a8d4cdfee854be28a326c36eb4cdf391ab GIT binary patch literal 74414 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 z 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 Q5BT#q;{9#Sq0r0!2kD9fMgRZ+ literal 0 HcmV?d00001 diff --git a/scripts/generate-mac-appicon.swift b/scripts/generate-mac-appicon.swift new file mode 100644 index 00000000..fa98934a --- /dev/null +++ b/scripts/generate-mac-appicon.swift @@ -0,0 +1,81 @@ +#!/usr/bin/env swift +// Generates macOS app-icon PNGs from a square 1024x1024 source image. +// +// macOS does not mask icons at render time the way iOS does, so the rounded +// rectangle must be baked into the artwork. This applies Apple's Big Sur icon +// grid: an 824x824 rounded-rect body (corner radius 185.4 @1024) centered on a +// transparent 1024 canvas, with the standard subtle drop shadow. +// +// Usage: swift scripts/generate-mac-appicon.swift +// e.g. swift scripts/generate-mac-appicon.swift icon_1024x1024.png bitchat/Assets.xcassets/AppIcon.appiconset icon + +import AppKit +import UniformTypeIdentifiers + +guard CommandLine.arguments.count == 4 else { + FileHandle.standardError.write(Data("usage: generate-mac-appicon.swift \n".utf8)) + exit(1) +} + +let sourcePath = CommandLine.arguments[1] +let outDir = URL(fileURLWithPath: CommandLine.arguments[2], isDirectory: true) +let prefix = CommandLine.arguments[3] + +guard let dataProvider = CGDataProvider(url: URL(fileURLWithPath: sourcePath) as CFURL), + let source = CGImage(pngDataProviderSource: dataProvider, decode: nil, shouldInterpolate: true, intent: .defaultIntent) else { + FileHandle.standardError.write(Data("error: could not read PNG at \(sourcePath)\n".utf8)) + exit(1) +} + +let sRGB = CGColorSpace(name: CGColorSpace.sRGB)! + +func render(pixels: Int) -> CGImage { + let ctx = CGContext( + data: nil, width: pixels, height: pixels, + bitsPerComponent: 8, bytesPerRow: 0, space: sRGB, + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + )! + let side = CGFloat(pixels) + let inset = side * 100.0 / 1024.0 + let body = CGRect(x: inset, y: inset, width: side - 2 * inset, height: side - 2 * inset) + let radius = side * 185.4 / 1024.0 + let path = CGPath(roundedRect: body, cornerWidth: radius, cornerHeight: radius, transform: nil) + + ctx.saveGState() + ctx.setShadow( + offset: CGSize(width: 0, height: -side * 10.0 / 1024.0), + blur: side * 20.0 / 1024.0, + color: CGColor(colorSpace: sRGB, components: [0, 0, 0, 0.3]) + ) + ctx.addPath(path) + ctx.setFillColor(CGColor(colorSpace: sRGB, components: [0, 0, 0, 1])!) + ctx.fillPath() + ctx.restoreGState() + + ctx.saveGState() + ctx.addPath(path) + ctx.clip() + ctx.interpolationQuality = .high + ctx.draw(source, in: body) + ctx.restoreGState() + + return ctx.makeImage()! +} + +func writePNG(_ image: CGImage, to url: URL) { + let dest = CGImageDestinationCreateWithURL(url as CFURL, UTType.png.identifier as CFString, 1, nil)! + CGImageDestinationAddImage(dest, image, nil) + guard CGImageDestinationFinalize(dest) else { + FileHandle.standardError.write(Data("error: failed to write \(url.path)\n".utf8)) + exit(1) + } +} + +// (point size, scale) for every mac slot in an appiconset +let slots: [(Int, Int)] = [(16, 1), (16, 2), (32, 1), (32, 2), (128, 1), (128, 2), (256, 1), (256, 2), (512, 1), (512, 2)] +for (points, scale) in slots { + let suffix = scale == 1 ? "" : "@\(scale)x" + let url = outDir.appendingPathComponent("\(prefix)_\(points)x\(points)\(suffix).png") + writePNG(render(pixels: points * scale), to: url) + print("wrote \(url.lastPathComponent)") +} From 55d51ba084e9b77f843eb9f613319e76d5aac7ef Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 22:42:39 +0200 Subject: [PATCH 065/158] DMs to unreachable peers use store-and-forward instead of failing instantly (#1415) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * DMs to unreachable peers route through store-and-forward; drop stale reachability gates Field-found: sendPrivateMessage pre-judged reachability and marked the message failed without ever calling the router, so the retained outbox, courier deposits, and bridge drops never ran — a DM composed after a peer's reachability window lapsed was dead on arrival while an identical one sent a minute earlier delivered. Messages now always route; a live path earns "sent", everything else stays "sending" until the router reports carried/delivered or expires it as failed. A sweep for sibling gates found and fixed: - startPrivateChat refused offline non-mutual favorites ("mutual favorite required for offline messaging") — store-and-forward only needs the recipient's noise key, so the gate and its string are gone. - markPrivateMessagesAsRead skipped the whole receipt pass for peers without a stored Nostr key, starving mesh-connected non-favorites; the router picks the transport now (sentReadReceipts dedups the parallel PrivateChatManager path). - DM/geoDM blocked notices and the unknown-group error posted to the active public timeline; they now land in the thread they're about via addLocalPrivateSystemMessage. - Banned copy: literal "user" fallbacks in code become "anon" (the default-nickname convention), and es/fr/it/pt translations of four keys still saying usuario/utilisateur/utente/usuário now say person. Orphaned keys removed (system.dm.unreachable, content.delivery.reason.unreachable, system.chat.requires_favorite). Co-Authored-By: Claude Fable 5 * Deflake BLEServiceCoreTests: longTimeout for positive waits CI flaked on duplicatePacket_isDeduped: the first message landed after the 5s wait expired on a loaded runner (the test's later count==1 assertions passed, proving late delivery, not lost delivery). All four positive waits in the file now use TestConstants.longTimeout, which exists for exactly this — waitUntil returns as soon as the condition holds, so passing runs never pay the longer ceiling. Co-Authored-By: Claude Fable 5 * Fix read-receipt test contamination; baseline Periphery noiseKey flake Two CI failures, both environmental: - markReadReceiptSent_returnsFalseOnSecondCall flaked because every test ChatViewModel shared one per-process read-receipts scratch suite; the lifecycle test persists the same "read-1" ID (a path the receipt-gate removal now reaches), and test order decided who saw whose state. Each instance now gets its own UUID-suffixed suite. - Periphery intermittently misses the loadFromDisk read of PrekeyBundleStore.StoredBundle.noiseKey and fails --strict with a false "assign-only" finding (recurrence of a known flake). Its USR is baselined; an in-source periphery:ignore can't work because strict mode flags it as superfluous on runs where the indexer gets it right. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- .periphery.baseline.json | 2 +- bitchat/Localizable.xcstrings | 563 +----------------- .../Services/Prekeys/PrekeyBundleStore.swift | 5 + bitchat/ViewModels/ChatGroupCoordinator.swift | 7 +- .../ViewModels/ChatLifecycleCoordinator.swift | 5 +- .../ChatPeerIdentityCoordinator.swift | 21 +- .../ChatPrivateConversationCoordinator.swift | 65 +- bitchat/ViewModels/ChatViewModel.swift | 16 +- bitchatTests/BLEServiceCoreTests.swift | 8 +- ...ChatLifecycleCoordinatorContextTests.swift | 9 +- ...eConversationCoordinatorContextTests.swift | 22 +- .../ChatViewModelExtensionsTests.swift | 23 +- 12 files changed, 114 insertions(+), 632 deletions(-) diff --git a/.periphery.baseline.json b/.periphery.baseline.json index 0b826869..67219de2 100644 --- a/.periphery.baseline.json +++ b/.periphery.baseline.json @@ -1 +1 @@ -{"v1":{"usrs":["param-buf-arti_bootstrap_summary(_:_:)-s:3Tor22arti_bootstrap_summary33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSpys4Int8VG_AEtF","param-dataDir-arti_start(_:_:)-s:3Tor10arti_start33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSPys4Int8VG_s6UInt16VtF","param-len-arti_bootstrap_summary(_:_:)-s:3Tor22arti_bootstrap_summary33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSpys4Int8VG_AEtF","param-socksPort-arti_start(_:_:)-s:3Tor10arti_start33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSPys4Int8VG_s6UInt16VtF","s:13BitFoundation16PeerCapabilitiesV8wifiBulkACvpZ","s:13BitFoundation18KeychainReadResultO18isRecoverableErrorSbvp","s:13BitFoundation23KeychainManagerProtocolP11secureClearyySSzF","s:18bitchatTests_macOS12MockKeychainC11secureClearyySSzF","s:18bitchatTests_macOS20TrackingMockKeychainC11resetCountsyyF","s:18bitchatTests_macOS20TrackingMockKeychainC11secureClearyySSzF","s:18bitchatTests_macOS20TrackingMockKeychainC25totalSecureClearCallCountSivp","s:18bitchatTests_macOS20TrackingMockKeychainC26secureClearStringCallCountSivp","s:18bitchatTests_macOS20TrackingMockKeychainC27_secureClearStringCallCount06_AB6D1M24FD239F2969C82F4108818260LLSivp","s:18bitchatTests_macOS24FailingCacheSaveKeychain33_22380C7A11A569A0B83FA83F34C498A7LLC11secureClearyySSzF","s:18bitchatTests_macOS24MockGeohashPresenceTimer33_483587EFB96650EE130EFB09BBA2A1AALLC7handleryycvp","s:3Tor0A7ManagerC21goDormantOnBackgroundyyF","s:7bitchat10AppRuntimeC24handleScreenshotCaptured33_C8B369AD8BC1D9963A50CEDA77A4332ALLyyF","s:7bitchat10AppRuntimeC33handleDidBecomeActiveNotificationyyF","s:7bitchat10BLEServiceC18logBluetoothStatus33_69191C53E68500C17D98DBCF2BDA7100LLyySSF","s:7bitchat10BLEServiceC20centralRestorationID33_69191C53E68500C17D98DBCF2BDA7100LLSSvpZ","s:7bitchat10BLEServiceC22captureBluetoothStatus33_69191C53E68500C17D98DBCF2BDA7100LL7contextySS_tF","s:7bitchat10BLEServiceC23peripheralRestorationID33_69191C53E68500C17D98DBCF2BDA7100LLSSvpZ","s:7bitchat10BLEServiceC29scheduleBluetoothStatusSample33_69191C53E68500C17D98DBCF2BDA7100LL5after7contextySd_SStF","s:7bitchat10QRScanViewV8isActiveSbvp","s:7bitchat15BLEPeerRegistryV5countSivp","s:7bitchat15KeychainManagerC11secureClearyySSzF","s:7bitchat15PaymentChipViewV7openURL33_10AC50641B1EBCD52E5092A2E521D236LL7SwiftUI13OpenURLActionVvp","s:7bitchat15TransportConfigO29uiBatchDispatchStaggerSecondsSdvpZ","s:7bitchat15TransportConfigO35uiShareExtensionDismissDelaySecondsSdvpZ","s:7bitchat15TransportConfigO38bleBackgroundPendingConnectSlotReserveSivpZ","s:7bitchat17GossipSyncManagerC10persistNowyyF","s:7bitchat17NostrRelayManagerC15InboundEventKey33_E4160FE8A9A2C9D6308EAAD5A8B5CB07LLV7eventIDSSvp","s:7bitchat25LocationNotesDependenciesV3now10Foundation4DateVycvp","s:7bitchat25NWPathReachabilityMonitorC7monitor33_84633C9DBCAF57538179C1E04DB8E015LL7Network0bD0CSgvp"]}} \ No newline at end of file +{"v1":{"usrs":["param-buf-arti_bootstrap_summary(_:_:)-s:3Tor22arti_bootstrap_summary33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSpys4Int8VG_AEtF","param-dataDir-arti_start(_:_:)-s:3Tor10arti_start33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSPys4Int8VG_s6UInt16VtF","param-len-arti_bootstrap_summary(_:_:)-s:3Tor22arti_bootstrap_summary33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSpys4Int8VG_AEtF","param-socksPort-arti_start(_:_:)-s:3Tor10arti_start33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSPys4Int8VG_s6UInt16VtF","s:13BitFoundation16PeerCapabilitiesV8wifiBulkACvpZ","s:13BitFoundation18KeychainReadResultO18isRecoverableErrorSbvp","s:13BitFoundation23KeychainManagerProtocolP11secureClearyySSzF","s:18bitchatTests_macOS12MockKeychainC11secureClearyySSzF","s:18bitchatTests_macOS20TrackingMockKeychainC11resetCountsyyF","s:18bitchatTests_macOS20TrackingMockKeychainC11secureClearyySSzF","s:18bitchatTests_macOS20TrackingMockKeychainC25totalSecureClearCallCountSivp","s:18bitchatTests_macOS20TrackingMockKeychainC26secureClearStringCallCountSivp","s:18bitchatTests_macOS20TrackingMockKeychainC27_secureClearStringCallCount06_AB6D1M24FD239F2969C82F4108818260LLSivp","s:18bitchatTests_macOS24FailingCacheSaveKeychain33_22380C7A11A569A0B83FA83F34C498A7LLC11secureClearyySSzF","s:18bitchatTests_macOS24MockGeohashPresenceTimer33_483587EFB96650EE130EFB09BBA2A1AALLC7handleryycvp","s:3Tor0A7ManagerC21goDormantOnBackgroundyyF","s:7bitchat10AppRuntimeC24handleScreenshotCaptured33_C8B369AD8BC1D9963A50CEDA77A4332ALLyyF","s:7bitchat10AppRuntimeC33handleDidBecomeActiveNotificationyyF","s:7bitchat10BLEServiceC18logBluetoothStatus33_69191C53E68500C17D98DBCF2BDA7100LLyySSF","s:7bitchat10BLEServiceC20centralRestorationID33_69191C53E68500C17D98DBCF2BDA7100LLSSvpZ","s:7bitchat10BLEServiceC22captureBluetoothStatus33_69191C53E68500C17D98DBCF2BDA7100LL7contextySS_tF","s:7bitchat10BLEServiceC23peripheralRestorationID33_69191C53E68500C17D98DBCF2BDA7100LLSSvpZ","s:7bitchat10BLEServiceC29scheduleBluetoothStatusSample33_69191C53E68500C17D98DBCF2BDA7100LL5after7contextySd_SStF","s:7bitchat10QRScanViewV8isActiveSbvp","s:7bitchat15BLEPeerRegistryV5countSivp","s:7bitchat15KeychainManagerC11secureClearyySSzF","s:7bitchat15PaymentChipViewV7openURL33_10AC50641B1EBCD52E5092A2E521D236LL7SwiftUI13OpenURLActionVvp","s:7bitchat15TransportConfigO29uiBatchDispatchStaggerSecondsSdvpZ","s:7bitchat15TransportConfigO35uiShareExtensionDismissDelaySecondsSdvpZ","s:7bitchat15TransportConfigO38bleBackgroundPendingConnectSlotReserveSivpZ","s:7bitchat17GossipSyncManagerC10persistNowyyF","s:7bitchat17NostrRelayManagerC15InboundEventKey33_E4160FE8A9A2C9D6308EAAD5A8B5CB07LLV7eventIDSSvp","s:7bitchat17PrekeyBundleStoreC12StoredBundleV8noiseKey10Foundation4DataVvp","s:7bitchat25LocationNotesDependenciesV3now10Foundation4DateVycvp","s:7bitchat25NWPathReachabilityMonitorC7monitor33_84633C9DBCAF57538179C1E04DB8E015LL7Network0bD0CSgvp"]}} \ No newline at end of file diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 64067a7c..89942914 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -27498,7 +27498,7 @@ "es" : { "stringUnit" : { "state" : "translated", - "value" : "desbloquear a un usuario" + "value" : "desbloquear a una persona" } }, "fil" : { @@ -30155,185 +30155,6 @@ } } }, - "content.delivery.reason.unreachable" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "القرين غير متاح" - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "পিয়ার পৌঁছানো যাচ্ছে না" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "peer nicht erreichbar" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "peer not reachable" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "el destinatario no es alcanzable" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "hindi maabot ang peer" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "pair injoignable" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עמית לא זמין" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "पीयर पहुंच योग्य नहीं" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "peer tidak dapat dijangkau" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "peer irraggiungibile" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ピアに到達できません" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "피어에 연결할 수 없습니다" - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "peer tidak dapat dijangkau" - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "पीयर पहुँचयोग्य छैन" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "peer onbereikbaar" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "peer nieosiągalny" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "par inacessível" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "par inalcançável" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "пир недостижим" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "peer ej nåbar" - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "peer அணுக முடியவில்லை" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "ติดต่อเพียร์ไม่ได้" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "eşe ulaşılamıyor" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "пір недосяжний" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "peer تک رسائی نہیں" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "không liên lạc được với nút" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "同伴不可达" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "同伴不可達" - } - } - } - }, "content.delivery.reason.voice_send_failed" : { "comment" : "Failure reason shown when a voice note could not be sent", "extractionState" : "manual", @@ -58664,7 +58485,7 @@ "es" : { "stringUnit" : { "state" : "translated", - "value" : "no se puede iniciar un chat con %@: el usuario está bloqueado." + "value" : "no se puede iniciar un chat con %@: esta persona está bloqueada." } }, "fil" : { @@ -58676,7 +58497,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "impossible de démarrer un chat avec %@ : utilisateur bloqué." + "value" : "impossible de démarrer un chat avec %@ : cette personne est bloquée." } }, "he" : { @@ -58700,7 +58521,7 @@ "it" : { "stringUnit" : { "state" : "translated", - "value" : "impossibile avviare una chat con %@: utente bloccato." + "value" : "impossibile avviare una chat con %@: questa persona è bloccata." } }, "ja" : { @@ -58748,7 +58569,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "não é possível iniciar chat com %@: usuário bloqueado." + "value" : "não é possível iniciar chat com %@: a pessoa está bloqueada." } }, "ru" : { @@ -58813,185 +58634,6 @@ } } }, - "system.chat.requires_favorite" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "لا يمكن بدء دردشة مع %@: يجب أن تكونا مفضلين متبادلين للتشغيل بدون اتصال." - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@-এর সঙ্গে চ্যাট শুরু করা যায় না: অফলাইন মেসেজিংয়ের জন্য পারস্পরিক প্রিয় দরকার।" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "chat mit %@ kann nicht gestartet werden: gegenseitige favoriten für offline nötig." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "cannot start chat with %@: mutual favorite required for offline messaging." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "no se puede iniciar un chat con %@: necesitas ser favoritos mutuos para mensajería sin conexión." - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "hindi makapagsimula ng chat kay %@: kailangan ang mutual na paborito para sa offline na mensahe." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "impossible de démarrer un chat avec %@ : favoris mutuels requis pour le hors ligne." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "לא ניתן להתחיל צ'אט עם %@: נדרשים מועדפים הדדיים לאופליין." - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ के साथ चैट शुरू नहीं कर सकते: ऑफ़लाइन मैसेजिंग के लिए आपसी पसंदीदा आवश्यक है।" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "tidak bisa mulai chat dengan %@: butuh favorit bersama untuk offline." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "impossibile avviare una chat con %@: servono preferiti reciproci per l'offline." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@とはチャットできません: オフラインには相互のお気に入りが必要です。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@와 채팅을 시작할 수 없습니다: 오프라인 메시지를 보내려면 서로 즐겨찾기에 추가해야 합니다." - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "tidak bisa mulai chat dengan %@: butuh favorit bersama untuk offline." - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ सँग च्याट सुरु गर्न मिलेन: अफलाइनका लागि दुवै मनपर्ने हुनुपर्छ" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "kan chat met %@ niet starten: wederzijds favoriet vereist voor offline berichten." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "nie można rozpocząć czatu z %@: potrzebne wzajemne ulubione dla wiadomości offline." - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "não é possível iniciar o chat com %@: precisam de ser favoritos mútuos para mensagens offline." - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "não é possível iniciar chat com %@: vocês precisam ser favoritos mútuos para mensagens offline." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "нельзя начать чат с %@: нужны взаимные избранные для офлайна." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "kan inte starta chatt med %@: ömsesidig favorit krävs för offline-meddelanden." - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ உடன் உரையாடல் தொடங்க முடியாது: ஆஃப்லைன் செய்திகளுக்கு இருபுறமும் பிரியப்பட்டவர்கள் ஆக வேண்டும்." - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "ไม่สามารถเริ่มแชทกับ %@: ต้องเป็นรายการโปรดทั้งสองฝ่ายเพื่อใช้งานออฟไลน์" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ ile sohbet başlatılamıyor: çevrimdışı mesajlaşma için karşılıklı favori gerekiyor." - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "не можна почати чат з %@: потрібне взаємне вибране для офлайна." - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ کے ساتھ چیٹ شروع نہیں کر سکتے: آفلائن پیغامات کیلئے باہمی پسندیدہ ہونا ضروری ہے۔" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "không thể bắt đầu chat với %@: cần yêu thích lẫn nhau để nhắn ngoại tuyến." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "无法与 %@ 开始聊天:离线消息需要互相关注。" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "無法與 %@ 開始聊天:離線訊息需要互相關注。" - } - } - } - }, "system.dm.blocked_generic" : { "extractionState" : "manual", "localizations" : { @@ -59022,7 +58664,7 @@ "es" : { "stringUnit" : { "state" : "translated", - "value" : "no se puede enviar el mensaje: el usuario está bloqueado." + "value" : "no se puede enviar el mensaje: esta persona está bloqueada." } }, "fil" : { @@ -59034,7 +58676,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "envoi impossible : utilisateur bloqué." + "value" : "envoi impossible : cette personne est bloquée." } }, "he" : { @@ -59058,7 +58700,7 @@ "it" : { "stringUnit" : { "state" : "translated", - "value" : "invio non riuscito: utente bloccato." + "value" : "invio non riuscito: questa persona è bloccata." } }, "ja" : { @@ -59106,7 +58748,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "não foi possível enviar: usuário bloqueado." + "value" : "não foi possível enviar: a pessoa está bloqueada." } }, "ru" : { @@ -59201,7 +58843,7 @@ "es" : { "stringUnit" : { "state" : "translated", - "value" : "no se puede enviar un mensaje a %@: el usuario está bloqueado." + "value" : "no se puede enviar un mensaje a %@: esta persona está bloqueada." } }, "fil" : { @@ -59213,7 +58855,7 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "impossible d'envoyer à %@ : utilisateur bloqué." + "value" : "impossible d'envoyer à %@ : cette personne est bloquée." } }, "he" : { @@ -59237,7 +58879,7 @@ "it" : { "stringUnit" : { "state" : "translated", - "value" : "impossibile inviare a %@: utente bloccato." + "value" : "impossibile inviare a %@: questa persona è bloccata." } }, "ja" : { @@ -59285,7 +58927,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "não é possível enviar mensagem para %@: usuário bloqueado." + "value" : "não é possível enviar mensagem para %@: a pessoa está bloqueada." } }, "ru" : { @@ -59350,185 +58992,6 @@ } } }, - "system.dm.unreachable" : { - "extractionState" : "manual", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "لا يمكن الإرسال إلى %@: المستلم غير متاح عبر mesh أو nostr." - } - }, - "bn" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@-কে বার্তা পাঠানো যায় না - পিয়ার মেশ বা নোস্টরে পৌঁছানো যাচ্ছে না।" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "senden an %@ nicht möglich: empfänger über mesh oder nostr nicht erreichbar." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "cannot send message to %@ - peer is not reachable via mesh or nostr." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "no se puede enviar un mensaje a %@: el destinatario no es alcanzable por mesh ni Nostr." - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "hindi maipadala kay %@ - hindi maabot ang peer sa mesh o nostr." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "impossible d'envoyer à %@ : destinataire injoignable via mesh ou nostr." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אי אפשר לשלוח ל-%@: הנמען אינו נגיש דרך mesh או nostr." - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ को संदेश नहीं भेज सकते - पीयर मेश या नोस्ट्र पर पहुँच योग्य नहीं।" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "tidak bisa mengirim ke %@: penerima tidak dapat dijangkau lewat mesh atau nostr." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "impossibile inviare a %@: destinatario irraggiungibile via mesh o nostr." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@に送れません: 受信者はmeshやnostrで到達できません。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@에게 메시지를 보낼 수 없습니다 - mesh 또는 nostr를 통해 피어에 연결할 수 없습니다." - } - }, - "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "tidak bisa menghantar ke %@: penerima tidak dapat dijangkau lewat mesh atau nostr." - } - }, - "ne" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ लाई पठाउन मिलेन: प्राप्तकर्ता mesh वा nostr बाट उपलब्ध छैन" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "kan geen bericht sturen naar %@ – peer niet bereikbaar via mesh of nostr." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "nie można wysłać do %@ – peer nieosiągalny przez mesh ani nostr." - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "não é possível enviar mensagem a %@ - o par não está acessível por mesh ou Nostr." - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "não é possível enviar mensagem para %@: destinatário inalcançável por mesh ou nostr." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "нельзя отправить %@: адресат недоступен через mesh или nostr." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "kan inte skicka till %@ – peer nås inte via mesh eller nostr." - } - }, - "ta" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ க்கு செய்தி அனுப்ப முடியவில்லை - peer mesh அல்லது nostr மூலமாக அணுக முடியவில்லை." - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "ไม่สามารถส่งข้อความถึง %@ - ติดต่อเพียร์ผ่าน mesh หรือ nostr ไม่ได้" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@'a mesaj gönderilemiyor - eş mesh veya Nostr üzerinden ulaşılamıyor." - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "неможливо надіслати %@: одержувач недосяжний через mesh або nostr." - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ کو پیغام نہیں بھیج سکتے - peer mesh یا nostr کے ذریعے دستیاب نہیں۔" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "không thể gửi tin cho %@ - nút không thể liên lạc qua mesh hoặc nostr." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "无法向 %@ 发送:对方无法通过 mesh 或 Nostr 到达。" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "無法向 %@ 發送:對方無法透過 mesh 或 Nostr 到達。" - } - } - } - }, "system.gateway.sent_via_mesh" : { "comment" : "System message when a geohash message was handed to a mesh internet gateway because no relay is reachable", "extractionState" : "manual", diff --git a/bitchat/Services/Prekeys/PrekeyBundleStore.swift b/bitchat/Services/Prekeys/PrekeyBundleStore.swift index fac9227c..18d6ea00 100644 --- a/bitchat/Services/Prekeys/PrekeyBundleStore.swift +++ b/bitchat/Services/Prekeys/PrekeyBundleStore.swift @@ -22,6 +22,11 @@ import Foundation /// prekey-seal for recipients met long ago. Included in the panic wipe. final class PrekeyBundleStore { struct StoredBundle: Codable { + // noiseKey is read in loadFromDisk (dictionary keying), but the + // Periphery indexer intermittently misses that read and flakes CI + // with "assign-only" — its USR is baselined (an in-source ignore + // can't work: strict mode flags it as superfluous on the runs where + // the indexer gets it right). let noiseKey: Data var generatedAt: UInt64 var prekeyIDs: [UInt32] diff --git a/bitchat/ViewModels/ChatGroupCoordinator.swift b/bitchat/ViewModels/ChatGroupCoordinator.swift index 7489b3bc..6e146fa5 100644 --- a/bitchat/ViewModels/ChatGroupCoordinator.swift +++ b/bitchat/ViewModels/ChatGroupCoordinator.swift @@ -336,7 +336,12 @@ final class ChatGroupCoordinator { guard !content.isEmpty, content.count <= InputValidator.Limits.maxMessageLength else { return } guard let group = context.groupStore.group(for: groupPeerID), let key = context.groupStore.key(forGroupID: group.groupID) else { - context.addSystemMessage(String(localized: "system.group.unknown", comment: "System message when sending into an unknown group")) + // The person is inside the group thread; the error belongs there, + // not on the active public timeline. + context.addLocalPrivateSystemMessage( + String(localized: "system.group.unknown", comment: "System message when sending into an unknown group"), + to: groupPeerID + ) return } diff --git a/bitchat/ViewModels/ChatLifecycleCoordinator.swift b/bitchat/ViewModels/ChatLifecycleCoordinator.swift index 1241f71b..bbcde713 100644 --- a/bitchat/ViewModels/ChatLifecycleCoordinator.swift +++ b/bitchat/ViewModels/ChatLifecycleCoordinator.swift @@ -231,7 +231,10 @@ final class ChatLifecycleCoordinator { } } - guard peerNostrPubkey != nil else { return } + // No Nostr-key gate here: the router picks whatever transport can + // reach the peer (mesh included), so read receipts must flow for + // non-favorite mesh peers too. `sentReadReceipts` dedups against the + // PrivateChatManager path; the router drops receipts it can't route. for message in getPrivateChatMessages(for: peerID) { guard (message.senderPeerID == peerID || message.senderPeerID == noiseKeyHex) && !message.isRelay else { diff --git a/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift b/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift index a1e340fe..93b0f32a 100644 --- a/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift +++ b/bitchat/ViewModels/ChatPeerIdentityCoordinator.swift @@ -347,20 +347,10 @@ final class ChatPeerIdentityCoordinator { return } - if let peer = context.unifiedPeer(for: peerID), - peer.isFavorite && !peer.theyFavoritedUs && !peer.isConnected { - context.addSystemMessage( - String( - format: String( - localized: "system.chat.requires_favorite", - comment: "System message when mutual favorite requirement blocks chat" - ), - locale: .current, - peerNickname - ) - ) - return - } + // No mutual-favorite gate: store-and-forward (couriers, bridge drops, + // retained outbox) only needs the recipient's noise key, so an + // offline non-mutual favorite is still worth writing to — the router + // decides what delivery looks like, not chat entry. _ = context.consolidatePrivateMessages(for: peerID, peerNickname: peerNickname) @@ -553,7 +543,8 @@ final class ChatPeerIdentityCoordinator { !favorite.peerNickname.isEmpty { return favorite.peerNickname } - return "user" + // "anon" matches the default-nickname convention; "user" is banned copy. + return "anon" } } diff --git a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift index 6765746a..bfaaab90 100644 --- a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift @@ -92,6 +92,9 @@ protocol ChatPrivateConversationContext: AnyObject { // MARK: System messages func addSystemMessage(_ content: String) func addMeshOnlySystemMessage(_ content: String) + /// Appends a local-only system line into a specific private thread — + /// errors about a DM belong in that DM, not on the active timeline. + func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) // MARK: Favorites & notifications /// The persisted favorite relationship for the peer's Noise static key, if any. @@ -250,13 +253,14 @@ final class ChatPrivateConversationCoordinator { guard !content.isEmpty else { return } if context.isPeerBlocked(peerID) { - let nickname = context.peerNickname(for: peerID) ?? "user" - context.addSystemMessage( + let nickname = context.peerNickname(for: peerID) ?? "anon" + context.addLocalPrivateSystemMessage( String( - format: String(localized: "system.dm.blocked_recipient", comment: "System message when attempting to message a blocked user"), + format: String(localized: "system.dm.blocked_recipient", comment: "System message when attempting to message a blocked person"), locale: .current, nickname - ) + ), + to: peerID ) return } @@ -278,11 +282,11 @@ final class ChatPrivateConversationCoordinator { let isMutualFavorite = favoriteStatus?.isMutual ?? false let hasNostrKey = favoriteStatus?.peerNostrPublicKey != nil - var recipientNickname = context.peerNickname(for: peerID) - if recipientNickname == nil && favoriteStatus != nil { - recipientNickname = favoriteStatus?.peerNickname - } - recipientNickname = recipientNickname ?? "user" + // "anon" matches the app's default-nickname convention; "user" is + // banned copy. + let recipientNickname = context.peerNickname(for: peerID) + ?? favoriteStatus?.peerNickname + ?? "anon" let messageID = UUID().uuidString let message = BitchatMessage( @@ -302,31 +306,25 @@ final class ChatPrivateConversationCoordinator { context.appendPrivateMessage(message, to: peerID) context.notifyUIChanged() + // Always hand the message to the router — it owns delivery. A live + // link sends now; an unreachable peer gets the retained-outbox path + // (resend on reconnect, courier deposits, bridge drops). Pre-judging + // reachability here used to mark the message failed without ever + // routing it, silently bypassing all of that (field-found: DMs + // composed after a peer's reachability window lapsed were dead on + // arrival while identical DMs sent a minute earlier delivered). + context.routePrivateMessage( + content, + to: peerID, + recipientNickname: recipientNickname, + messageID: messageID + ) if isConnected || isReachable || (isMutualFavorite && hasNostrKey) { - context.routePrivateMessage( - content, - to: peerID, - recipientNickname: recipientNickname ?? "user", - messageID: messageID - ) context.setPrivateDeliveryStatus(.sent, forMessageID: messageID, peerID: peerID) - } else { - context.setPrivateDeliveryStatus( - .failed( - reason: String(localized: "content.delivery.reason.unreachable", comment: "Failure reason when a peer is unreachable") - ), - forMessageID: messageID, - peerID: peerID - ) - let name = recipientNickname ?? "user" - context.addSystemMessage( - String( - format: String(localized: "system.dm.unreachable", comment: "System message when a recipient is unreachable"), - locale: .current, - name - ) - ) } + // Otherwise the message stays "sending"; router callbacks move it to + // carried (📦) when a courier/bridge copy ships, delivered/read on + // acks, or failed when the outbox TTL expires. } func sendGeohashDM(_ content: String, to peerID: PeerID) { @@ -372,8 +370,9 @@ final class ChatPrivateConversationCoordinator { forMessageID: messageID, peerID: peerID ) - context.addSystemMessage( - String(localized: "system.dm.blocked_generic", comment: "System message when sending fails because user is blocked") + context.addLocalPrivateSystemMessage( + String(localized: "system.dm.blocked_generic", comment: "System message when sending fails because the person is blocked"), + to: peerID ) return } diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index e9b84e64..082cfb63 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -398,16 +398,18 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele let readReceiptsDefaults: UserDefaults /// Default read-receipt persistence store. Production uses `.standard`. - /// Under test, a dedicated scratch suite is used instead — wiped at first - /// use per process — so back-to-back local test runs never see each - /// other's persisted receipts (and tests never pollute `.standard`). - static let defaultReadReceiptsDefaults: UserDefaults = { + /// Under test, every instance gets its own scratch suite: a per-process + /// shared suite let one test's persisted receipts leak into another + /// test's freshly constructed view model (surfaced as an order-dependent + /// CI flake on a duplicated message ID), and tests never pollute + /// `.standard`. + static func defaultReadReceiptsDefaults() -> UserDefaults { guard TestEnvironment.isRunningTests else { return .standard } - let suiteName = "chat.bitchat.tests.readReceipts" + let suiteName = "chat.bitchat.tests.readReceipts.\(UUID().uuidString)" guard let scratch = UserDefaults(suiteName: suiteName) else { return .standard } scratch.removePersistentDomain(forName: suiteName) return scratch - }() + } // Track sent read receipts to avoid duplicates (persisted across launches) // Note: Persistence happens automatically in didSet, no lifecycle observers needed @@ -809,7 +811,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele self.autocompleteService = services.autocompleteService self.deduplicationService = services.deduplicationService self.publicMessagePipeline = services.publicMessagePipeline - let readReceiptsDefaults = readReceiptsDefaults ?? Self.defaultReadReceiptsDefaults + let readReceiptsDefaults = readReceiptsDefaults ?? Self.defaultReadReceiptsDefaults() self.readReceiptsDefaults = readReceiptsDefaults self.sentReadReceipts = ChatViewModelBootstrapper.loadPersistedReadReceipts(userDefaults: readReceiptsDefaults) diff --git a/bitchatTests/BLEServiceCoreTests.swift b/bitchatTests/BLEServiceCoreTests.swift index 3da4a700..6f7d181b 100644 --- a/bitchatTests/BLEServiceCoreTests.swift +++ b/bitchatTests/BLEServiceCoreTests.swift @@ -32,7 +32,7 @@ struct BLEServiceCoreTests { ble._test_handlePacket(packet, fromPeerID: sender, signingPublicKey: signingKey) let receivedFirst = await TestHelpers.waitUntil( { delegate.publicMessagesSnapshot().count == 1 }, - timeout: TestConstants.defaultTimeout + timeout: TestConstants.longTimeout ) #expect(receivedFirst) @@ -188,7 +188,7 @@ struct BLEServiceCoreTests { let rebound = await TestHelpers.waitUntil( { ble._test_centralBinding(centralUUID) == newPeerID }, - timeout: TestConstants.defaultTimeout + timeout: TestConstants.longTimeout ) #expect(rebound) @@ -197,7 +197,7 @@ struct BLEServiceCoreTests { let peerIDs = ble.currentPeerSnapshots().map(\.peerID) return peerIDs.contains(newPeerID) && !peerIDs.contains(oldPeerID) }, - timeout: TestConstants.defaultTimeout + timeout: TestConstants.longTimeout ) #expect(retired) } @@ -374,7 +374,7 @@ struct BLEServiceCoreTests { let reachedBudget = await TestHelpers.waitUntil( { outbound.count(ofType: .pong) >= budget }, - timeout: TestConstants.defaultTimeout + timeout: TestConstants.longTimeout ) #expect(reachedBudget) // Give any over-budget pong a chance to surface, then confirm the diff --git a/bitchatTests/ChatLifecycleCoordinatorContextTests.swift b/bitchatTests/ChatLifecycleCoordinatorContextTests.swift index 88596f16..f8b0de66 100644 --- a/bitchatTests/ChatLifecycleCoordinatorContextTests.swift +++ b/bitchatTests/ChatLifecycleCoordinatorContextTests.swift @@ -328,7 +328,7 @@ struct ChatLifecycleCoordinatorContextTests { #expect(context.ownerLevelReadPasses == [peerID]) } @Test @MainActor - func markPrivateMessagesAsRead_routesReceiptsOnlyForNostrReachableFavorites() { + func markPrivateMessagesAsRead_routesReceiptsForFavoritesAndNonFavorites() { let context = MockChatLifecycleContext() let coordinator = ChatLifecycleCoordinator(context: context) let noiseKey = Data(repeating: 0xAB, count: 32) @@ -351,12 +351,15 @@ struct ChatLifecycleCoordinatorContextTests { #expect(context.routedReadReceipts.map(\.peerID) == [peerID]) #expect(context.sentReadReceipts.contains("in-1")) - // No favorite relationship (no Nostr key): the receipt pass is skipped. + // No favorite relationship: receipts still route — the router picks + // whatever transport can reach the peer (mesh included). Gating on a + // stored Nostr key silently starved mesh-connected non-favorites. let otherKey = Data(repeating: 0xCD, count: 32) let otherPeer = PeerID(hexData: otherKey) context.privateChats[otherPeer] = [makePrivateMessage(id: "in-2", senderPeerID: otherPeer)] coordinator.markPrivateMessagesAsRead(from: otherPeer) - #expect(context.routedReadReceipts.map(\.messageID) == ["in-1"]) + #expect(context.routedReadReceipts.map(\.messageID) == ["in-1", "in-2"]) + #expect(context.sentReadReceipts.contains("in-2")) } } diff --git a/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift b/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift index aed8f482..a92d1e9c 100644 --- a/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift +++ b/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift @@ -234,6 +234,12 @@ private final class MockChatPrivateConversationContext: ChatPrivateConversationC meshOnlySystemMessages.append(content) } + private(set) var privateSystemMessages: [(content: String, peerID: PeerID)] = [] + + func addLocalPrivateSystemMessage(_ content: String, to peerID: PeerID) { + privateSystemMessages.append((content, peerID)) + } + static let dummyIdentity = NostrIdentity( privateKey: Data(repeating: 0x11, count: 32), publicKey: Data(repeating: 0x22, count: 32), @@ -680,19 +686,21 @@ struct ChatPrivateConversationCoordinatorContextTests { #expect(context.systemMessages.isEmpty) } + /// Field-found: pre-judging reachability here marked the message failed + /// without ever routing it, so the router's retained outbox, courier + /// deposits, and bridge drops never got a chance. A fully unreachable + /// non-favorite must still be routed and stay "sending" (the router's + /// callbacks later move it to carried/delivered or expire it as failed). @Test @MainActor - func sendPrivateMessage_failsWhenOfflineWithoutMutualFavorite() async { + func sendPrivateMessage_routesAndStaysSendingWhenOfflineWithoutMutualFavorite() async { let context = MockChatPrivateConversationContext() let coordinator = ChatPrivateConversationCoordinator(context: context) let peerID = PeerID(hexData: Data(repeating: 0xCD, count: 32)) coordinator.sendPrivateMessage("hello?", to: peerID) - #expect(context.routedPrivateMessages.isEmpty) - #expect(context.systemMessages.count == 1) - guard case .failed = context.privateChats[peerID]?.first?.deliveryStatus else { - Issue.record("expected .failed delivery status") - return - } + #expect(context.routedPrivateMessages.map(\.content) == ["hello?"]) + #expect(context.privateChats[peerID]?.first?.deliveryStatus == .sending) + #expect(context.systemMessages.isEmpty) } } diff --git a/bitchatTests/ChatViewModelExtensionsTests.swift b/bitchatTests/ChatViewModelExtensionsTests.swift index 031247bf..dc0bdaa4 100644 --- a/bitchatTests/ChatViewModelExtensionsTests.swift +++ b/bitchatTests/ChatViewModelExtensionsTests.swift @@ -71,8 +71,11 @@ struct ChatViewModelPrivateChatExtensionTests { // Check MockTransport implementation... it might need update or verification } + /// An unreachable recipient no longer means instant failure: the message + /// is routed anyway so the router's outbox/courier/bridge machinery can + /// deliver it, and it stays "sending" until a router callback resolves it. @Test @MainActor - func sendPrivateMessage_unreachable_setsFailedStatus() async { + func sendPrivateMessage_unreachable_staysSendingForStoreAndForward() async { let (viewModel, _) = makeTestableViewModel() let validHex = "0102030405060708090a0b0c0d0e0f100102030405060708090a0b0c0d0e0f10" let peerID = PeerID(str: validHex) @@ -80,11 +83,7 @@ struct ChatViewModelPrivateChatExtensionTests { viewModel.sendPrivateMessage("Hello", to: peerID) #expect(viewModel.privateChats[peerID]?.count == 1) - let status = viewModel.privateChats[peerID]?.last?.deliveryStatus - #expect({ - if case .failed = status { return true } - return false - }()) + #expect(viewModel.privateChats[peerID]?.last?.deliveryStatus == .sending) } @Test @MainActor @@ -780,8 +779,10 @@ struct ChatViewModelGeoDMTests { #expect(isFailed(status: viewModel.privateChats[convKey]?.last?.deliveryStatus)) } + /// The blocked notice belongs in the DM thread the person is typing in, + /// not on the active location-channel timeline. @Test @MainActor - func sendGeohashDM_blockedRecipient_marksFailedAndAddsSystemMessage() async { + func sendGeohashDM_blockedRecipient_marksFailedAndAddsSystemMessageInThread() async { let (viewModel, _) = makeTestableViewModel() let geohash = "u4pruydq" let recipientHex = "0000000000000000000000000000000000000000000000000000000000000003" @@ -793,9 +794,11 @@ struct ChatViewModelGeoDMTests { viewModel.sendGeohashDM("hello", to: convKey) - #expect(viewModel.privateChats[convKey]?.count == 1) - #expect(isFailed(status: viewModel.privateChats[convKey]?.last?.deliveryStatus)) - #expect(viewModel.messages.contains(where: { $0.sender == "system" })) + let thread = viewModel.privateChats[convKey] ?? [] + #expect(thread.count == 2) + #expect(isFailed(status: thread.first?.deliveryStatus)) + #expect(thread.last?.sender == "system") + #expect(!viewModel.messages.contains(where: { $0.sender == "system" })) } @Test @MainActor From 8c9c1cc6ac165846f82ece041034489c2320964c Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 22:55:45 +0200 Subject: [PATCH 066/158] Bump version to 1.7.0 (#1416) Feature release: mesh bridging, push-to-talk voice, empty-mesh liveliness, store-and-forward DM routing. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- Configs/Release.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configs/Release.xcconfig b/Configs/Release.xcconfig index af303984..0149960f 100644 --- a/Configs/Release.xcconfig +++ b/Configs/Release.xcconfig @@ -1,4 +1,4 @@ -MARKETING_VERSION = 1.6.0 +MARKETING_VERSION = 1.7.0 CURRENT_PROJECT_VERSION = 1 IPHONEOS_DEPLOYMENT_TARGET = 16.0 From 021af3a22dd0ef28acb88a3210b81072253a700e Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Wed, 8 Jul 2026 23:04:30 +0200 Subject: [PATCH 067/158] Remove write-only peerNostrPubkey left by the read-receipt gate removal (#1417) The variable only fed the deleted guard (#1415); the favorites lookup in the unified-peer branch existed solely to populate it. Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/ViewModels/ChatLifecycleCoordinator.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/bitchat/ViewModels/ChatLifecycleCoordinator.swift b/bitchat/ViewModels/ChatLifecycleCoordinator.swift index bbcde713..05831407 100644 --- a/bitchat/ViewModels/ChatLifecycleCoordinator.swift +++ b/bitchat/ViewModels/ChatLifecycleCoordinator.swift @@ -215,16 +215,12 @@ final class ChatLifecycleCoordinator { } var noiseKeyHex: PeerID? - var peerNostrPubkey: String? if let noiseKey = Data(hexString: peerID.id), - let favoriteStatus = context.favoriteRelationship(forNoiseKey: noiseKey) { + context.favoriteRelationship(forNoiseKey: noiseKey) != nil { noiseKeyHex = peerID - peerNostrPubkey = favoriteStatus.peerNostrPublicKey } else if let peer = context.unifiedPeer(for: peerID) { noiseKeyHex = PeerID(hexData: peer.noisePublicKey) - let favoriteStatus = context.favoriteRelationship(forNoiseKey: peer.noisePublicKey) - peerNostrPubkey = favoriteStatus?.peerNostrPublicKey if let noiseKeyHex, context.unreadPrivateMessages.contains(noiseKeyHex) { context.markPrivateChatRead(noiseKeyHex) From dd6b624cae3a90f9c1113da0e6f762022e380b81 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:44:02 +0200 Subject: [PATCH 068/158] Quality pass on the 1.7.0 batch: fix confirmed bugs, bump to 1.7.1 (#1418) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Quality pass on the 1.7.0 batch: fix confirmed bugs, bump to 1.7.1 Post-merge review of PRs #1400–#1417 (push-to-talk, mesh bridging, DM store-and-forward, empty-mesh liveliness, geo-notes). Fixes the confirmed, well-scoped findings; deeper architectural/security items are tracked separately. - PTT hot-mic leak: releasing the mic during VoiceCaptureSession.start()'s 150ms retry pause left the mic live and streaming for up to 120s, because cancel() no-op'd once `completed` was set. Bail after the sleep if the hold was released, and make cancel() always tear down a late-started capture. - Bridge courier depositDrop reported success and burned the dedup slot before the drop was actually published (evicted/compose-fail = lying 📦 "carried" with no retry). Only consume publishedDropKeys on durable accept; add BoundedIDSet.remove() to release evicted/failed slots (uses the dead dedupKey). - Blocked senders resurfaced via archived "heard here earlier" echoes, the one path that bypassed the live block filter — filter at seed time. - A late optimistic .sent clobbered the router's .carried state; extend ConversationStore.shouldSkipStatusUpdate to a full precedence guard (sending < sent < carried < delivered < read). - Read receipts were permanently burned when the router dropped them (marked sent then dropped). sendReadReceipt/routeReadReceipt now return Bool; only record as sent on a successful route, else retry on the next read scan. - MessageRouter.cleanupExpiredMessages() had no production caller, so DMs to a peer that never reconnects sat on .sending until relaunch — run it in the 120s bridge sweep. - Sightings tally now rolls over at midnight while idle; wave notification action localized across all 29 locales; bridged anon#tag uses suffix(4) like everything else; makeThrowawayIdentity delegates to NostrIdentity.generate(); .swiftlint.yml excludes .claude worktrees. - Add regression tests: carried→sent no-downgrade, carried→delivered upgrade, evicted pending drop stays retryable. - Bump MARKETING_VERSION to 1.7.1. Co-Authored-By: Claude Opus 4.8 * Fix CI: adjust delivery-status benchmark and drop now-dead addSystemMessage The stricter no-downgrade guard (delivered/carried never regress to sent) broke two things the earlier commit didn't catch locally (perf tests are skipped in the default run, and Periphery runs only in CI): - PerformanceBaselineTests delivery benchmarks alternated sent <-> delivered assuming both directions apply; the delivered -> sent half is now correctly skipped, so the pass measured 0 updates. Alternate two delivered timestamps instead — every update is real, no downgrade. - Routing the geoDM "not in a location channel" error into the thread removed the only caller of ChatPrivateConversationContext.addSystemMessage, leaving it (and its mock) dead per Periphery. Drop the protocol requirement, the mock impl, and the now-vacuous systemMessages.isEmpty assertions (the invariant is compile-time enforced: the context can no longer emit a public system line). Co-Authored-By: Claude Opus 4.8 * Address review findings: read-receipt dedup, carried-vs-sending, block-time echo purge - Read receipts: claim the receipt in sentReadReceipts synchronously before spawning the routing task (chat open runs two read scans in one MainActor stretch, so the async insert let every unread message route twice), and release the claim when the route fails so the retry-on-failed-route behavior is preserved. - Delivery status: extend the no-downgrade guard so the `.sending` stamp a pre-handshake resend emits can no longer clobber carried/delivered/read (the 📦 indicator survived `.sent` but not `.sending`). - Archived echoes: blocking a peer now purges their carried public messages from the gossip archive at block time (UnifiedPeerService and /block), while the fingerprint-to-peerID mapping is still known — the seed-time filter can't resolve offline non-favorite strangers and stays only as defense-in-depth. New Transport hook (default no-op) + GossipSyncManager.removePublicMessages with immediate persist. - Bridge courier: an envelope that can't encode within the drop size caps fails identically on every attempt; consume the dedup slot so the 120s retry sweep stops re-running Noise sealing on it. - MeshSightingsTracker: cache the day-key DateFormatter instead of building one per call. Tests: double-markAsRead dedup + failed-route retry, carried→sending no-downgrade matrix, block-time purge (manager + service wiring), oversize-drop slot consumption. Co-Authored-By: Claude Fable 5 * Also skip the sent→sending downgrade in the delivery-status guard Codex review follow-up: sendPrivateMessage without an established Noise session emits `.sending` asynchronously, so it can land after the message already reached `.sent` and visibly walk "Sent" back to "Sending...". Treat `.sending` as weaker than `.sent` too — the status was already truthful. `.failed` → `.sending` stays allowed so a retry after a real failure remains visible. Co-Authored-By: Claude Fable 5 * Retain Codable properties in Periphery scan (same fix as #1421) The noiseKey assign-only false positive fired persistently on this branch (twice, including a rerun) despite the baselined USR. Byte-identical to the fix on fix/announce-replay-link-steal so the branches merge cleanly in either order. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Opus 4.8 --- .periphery.baseline.json | 2 +- .periphery.yml | 7 + .swiftlint.yml | 1 + Configs/Release.xcconfig | 2 +- bitchat/App/ConversationStore.swift | 17 +- .../Features/voice/VoiceCaptureSession.swift | 17 +- bitchat/Localizable.xcstrings | 180 ++++++++++++++++++ bitchat/Nostr/NostrProtocol.swift | 2 +- bitchat/Services/BLE/BLEService.swift | 4 + bitchat/Services/CommandProcessor.swift | 3 + bitchat/Services/Gateway/BoundedIDSet.swift | 10 + .../Gateway/BridgeCourierService.swift | 64 ++++--- bitchat/Services/Gateway/BridgeService.swift | 2 +- .../Services/GeohashChatActivityTracker.swift | 6 - bitchat/Services/MeshSightingsTracker.swift | 18 +- bitchat/Services/MessageRouter.swift | 15 +- bitchat/Services/NotificationService.swift | 2 +- bitchat/Services/PrivateChatManager.swift | 18 +- bitchat/Services/Transport.swift | 5 + bitchat/Services/UnifiedPeerService.swift | 6 + bitchat/Sync/GossipSyncManager.swift | 17 ++ .../ViewModels/ChatLifecycleCoordinator.swift | 11 +- .../ChatPrivateConversationCoordinator.swift | 15 +- .../ChatViewModelBootstrapper.swift | 14 +- .../Views/Components/MeshEmptyStateView.swift | 6 +- ...ChatLifecycleCoordinatorContextTests.swift | 4 +- ...eConversationCoordinatorContextTests.swift | 12 +- .../ChatViewModelDeliveryStatusTests.swift | 99 ++++++++++ .../ChatViewModelExtensionsTests.swift | 8 +- bitchatTests/GossipSyncManagerTests.swift | 41 ++++ bitchatTests/Mocks/MockTransport.swift | 5 + .../PerformanceBaselineTests.swift | 13 +- .../Services/BridgeCourierServiceTests.swift | 42 ++++ .../Services/BridgeServiceTests.swift | 2 +- .../Services/PrivateChatManagerTests.swift | 70 +++++++ .../Services/UnifiedPeerServiceTests.swift | 9 +- .../BitFoundation/BitchatMessage.swift | 1 - .../BitLogger/Sources/SecureLogger.swift | 1 - 38 files changed, 670 insertions(+), 81 deletions(-) diff --git a/.periphery.baseline.json b/.periphery.baseline.json index 67219de2..0b826869 100644 --- a/.periphery.baseline.json +++ b/.periphery.baseline.json @@ -1 +1 @@ -{"v1":{"usrs":["param-buf-arti_bootstrap_summary(_:_:)-s:3Tor22arti_bootstrap_summary33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSpys4Int8VG_AEtF","param-dataDir-arti_start(_:_:)-s:3Tor10arti_start33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSPys4Int8VG_s6UInt16VtF","param-len-arti_bootstrap_summary(_:_:)-s:3Tor22arti_bootstrap_summary33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSpys4Int8VG_AEtF","param-socksPort-arti_start(_:_:)-s:3Tor10arti_start33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSPys4Int8VG_s6UInt16VtF","s:13BitFoundation16PeerCapabilitiesV8wifiBulkACvpZ","s:13BitFoundation18KeychainReadResultO18isRecoverableErrorSbvp","s:13BitFoundation23KeychainManagerProtocolP11secureClearyySSzF","s:18bitchatTests_macOS12MockKeychainC11secureClearyySSzF","s:18bitchatTests_macOS20TrackingMockKeychainC11resetCountsyyF","s:18bitchatTests_macOS20TrackingMockKeychainC11secureClearyySSzF","s:18bitchatTests_macOS20TrackingMockKeychainC25totalSecureClearCallCountSivp","s:18bitchatTests_macOS20TrackingMockKeychainC26secureClearStringCallCountSivp","s:18bitchatTests_macOS20TrackingMockKeychainC27_secureClearStringCallCount06_AB6D1M24FD239F2969C82F4108818260LLSivp","s:18bitchatTests_macOS24FailingCacheSaveKeychain33_22380C7A11A569A0B83FA83F34C498A7LLC11secureClearyySSzF","s:18bitchatTests_macOS24MockGeohashPresenceTimer33_483587EFB96650EE130EFB09BBA2A1AALLC7handleryycvp","s:3Tor0A7ManagerC21goDormantOnBackgroundyyF","s:7bitchat10AppRuntimeC24handleScreenshotCaptured33_C8B369AD8BC1D9963A50CEDA77A4332ALLyyF","s:7bitchat10AppRuntimeC33handleDidBecomeActiveNotificationyyF","s:7bitchat10BLEServiceC18logBluetoothStatus33_69191C53E68500C17D98DBCF2BDA7100LLyySSF","s:7bitchat10BLEServiceC20centralRestorationID33_69191C53E68500C17D98DBCF2BDA7100LLSSvpZ","s:7bitchat10BLEServiceC22captureBluetoothStatus33_69191C53E68500C17D98DBCF2BDA7100LL7contextySS_tF","s:7bitchat10BLEServiceC23peripheralRestorationID33_69191C53E68500C17D98DBCF2BDA7100LLSSvpZ","s:7bitchat10BLEServiceC29scheduleBluetoothStatusSample33_69191C53E68500C17D98DBCF2BDA7100LL5after7contextySd_SStF","s:7bitchat10QRScanViewV8isActiveSbvp","s:7bitchat15BLEPeerRegistryV5countSivp","s:7bitchat15KeychainManagerC11secureClearyySSzF","s:7bitchat15PaymentChipViewV7openURL33_10AC50641B1EBCD52E5092A2E521D236LL7SwiftUI13OpenURLActionVvp","s:7bitchat15TransportConfigO29uiBatchDispatchStaggerSecondsSdvpZ","s:7bitchat15TransportConfigO35uiShareExtensionDismissDelaySecondsSdvpZ","s:7bitchat15TransportConfigO38bleBackgroundPendingConnectSlotReserveSivpZ","s:7bitchat17GossipSyncManagerC10persistNowyyF","s:7bitchat17NostrRelayManagerC15InboundEventKey33_E4160FE8A9A2C9D6308EAAD5A8B5CB07LLV7eventIDSSvp","s:7bitchat17PrekeyBundleStoreC12StoredBundleV8noiseKey10Foundation4DataVvp","s:7bitchat25LocationNotesDependenciesV3now10Foundation4DateVycvp","s:7bitchat25NWPathReachabilityMonitorC7monitor33_84633C9DBCAF57538179C1E04DB8E015LL7Network0bD0CSgvp"]}} \ No newline at end of file +{"v1":{"usrs":["param-buf-arti_bootstrap_summary(_:_:)-s:3Tor22arti_bootstrap_summary33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSpys4Int8VG_AEtF","param-dataDir-arti_start(_:_:)-s:3Tor10arti_start33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSPys4Int8VG_s6UInt16VtF","param-len-arti_bootstrap_summary(_:_:)-s:3Tor22arti_bootstrap_summary33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSpys4Int8VG_AEtF","param-socksPort-arti_start(_:_:)-s:3Tor10arti_start33_954FD7701B4E47ABB5F166D1CF862DC9LLys5Int32VSPys4Int8VG_s6UInt16VtF","s:13BitFoundation16PeerCapabilitiesV8wifiBulkACvpZ","s:13BitFoundation18KeychainReadResultO18isRecoverableErrorSbvp","s:13BitFoundation23KeychainManagerProtocolP11secureClearyySSzF","s:18bitchatTests_macOS12MockKeychainC11secureClearyySSzF","s:18bitchatTests_macOS20TrackingMockKeychainC11resetCountsyyF","s:18bitchatTests_macOS20TrackingMockKeychainC11secureClearyySSzF","s:18bitchatTests_macOS20TrackingMockKeychainC25totalSecureClearCallCountSivp","s:18bitchatTests_macOS20TrackingMockKeychainC26secureClearStringCallCountSivp","s:18bitchatTests_macOS20TrackingMockKeychainC27_secureClearStringCallCount06_AB6D1M24FD239F2969C82F4108818260LLSivp","s:18bitchatTests_macOS24FailingCacheSaveKeychain33_22380C7A11A569A0B83FA83F34C498A7LLC11secureClearyySSzF","s:18bitchatTests_macOS24MockGeohashPresenceTimer33_483587EFB96650EE130EFB09BBA2A1AALLC7handleryycvp","s:3Tor0A7ManagerC21goDormantOnBackgroundyyF","s:7bitchat10AppRuntimeC24handleScreenshotCaptured33_C8B369AD8BC1D9963A50CEDA77A4332ALLyyF","s:7bitchat10AppRuntimeC33handleDidBecomeActiveNotificationyyF","s:7bitchat10BLEServiceC18logBluetoothStatus33_69191C53E68500C17D98DBCF2BDA7100LLyySSF","s:7bitchat10BLEServiceC20centralRestorationID33_69191C53E68500C17D98DBCF2BDA7100LLSSvpZ","s:7bitchat10BLEServiceC22captureBluetoothStatus33_69191C53E68500C17D98DBCF2BDA7100LL7contextySS_tF","s:7bitchat10BLEServiceC23peripheralRestorationID33_69191C53E68500C17D98DBCF2BDA7100LLSSvpZ","s:7bitchat10BLEServiceC29scheduleBluetoothStatusSample33_69191C53E68500C17D98DBCF2BDA7100LL5after7contextySd_SStF","s:7bitchat10QRScanViewV8isActiveSbvp","s:7bitchat15BLEPeerRegistryV5countSivp","s:7bitchat15KeychainManagerC11secureClearyySSzF","s:7bitchat15PaymentChipViewV7openURL33_10AC50641B1EBCD52E5092A2E521D236LL7SwiftUI13OpenURLActionVvp","s:7bitchat15TransportConfigO29uiBatchDispatchStaggerSecondsSdvpZ","s:7bitchat15TransportConfigO35uiShareExtensionDismissDelaySecondsSdvpZ","s:7bitchat15TransportConfigO38bleBackgroundPendingConnectSlotReserveSivpZ","s:7bitchat17GossipSyncManagerC10persistNowyyF","s:7bitchat17NostrRelayManagerC15InboundEventKey33_E4160FE8A9A2C9D6308EAAD5A8B5CB07LLV7eventIDSSvp","s:7bitchat25LocationNotesDependenciesV3now10Foundation4DateVycvp","s:7bitchat25NWPathReachabilityMonitorC7monitor33_84633C9DBCAF57538179C1E04DB8E015LL7Network0bD0CSgvp"]}} \ No newline at end of file diff --git a/.periphery.yml b/.periphery.yml index 865def40..fab8b45f 100644 --- a/.periphery.yml +++ b/.periphery.yml @@ -10,5 +10,12 @@ project: bitchat.xcodeproj schemes: - bitchat (macOS) retain_swift_ui_previews: true +# Codable properties are (de)serialized via synthesized conformances the +# indexer doesn't always attribute reads to: PrekeyBundleStore.StoredBundle +# .noiseKey flaked CI as "assign-only" even while read in loadFromDisk — +# and slipped past its baselined USR. Retaining Codable properties outright +# is deterministic; a truly-dead Codable field is a persisted-format change +# anyway, never a safe mechanical delete. +retain_codable_properties: true relative_results: true baseline: .periphery.baseline.json diff --git a/.swiftlint.yml b/.swiftlint.yml index e35a75d0..833662e9 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -2,6 +2,7 @@ # (CI checkouts are fresh, so this only matters in a working tree). excluded: - .build + - .claude - .swiftpm - .DerivedData - DerivedData diff --git a/Configs/Release.xcconfig b/Configs/Release.xcconfig index 0149960f..f018b882 100644 --- a/Configs/Release.xcconfig +++ b/Configs/Release.xcconfig @@ -1,4 +1,4 @@ -MARKETING_VERSION = 1.7.0 +MARKETING_VERSION = 1.7.1 CURRENT_PROJECT_VERSION = 1 IPHONEOS_DEPLOYMENT_TARGET = 16.0 diff --git a/bitchat/App/ConversationStore.swift b/bitchat/App/ConversationStore.swift index c5195ae3..0a1b8cb8 100644 --- a/bitchat/App/ConversationStore.swift +++ b/bitchat/App/ConversationStore.swift @@ -225,8 +225,23 @@ final class Conversation: ObservableObject, Identifiable { guard let current else { return false } if current == new { return true } + // Never downgrade to a weaker delivery state. Ordering of certainty: + // sending < sent < carried < delivered < read. A late `.sent` write + // (e.g. the optimistic stamp after routing) must not clobber the + // `.carried` the router already set when it handed a copy to a + // courier/bridge, nor a `.delivered`/`.read` ack. Same for the + // `.sending` stamp a pre-handshake resend emits asynchronously: it + // can land after the message already reached `.sent`, and "Sent" was + // already truthful. (`.failed` → `.sending` stays allowed so a real + // failure retry is visible.) switch (current, new) { - case (.read, .delivered), (.read, .sent): + case (.read, .delivered), (.read, .carried), (.read, .sent), (.read, .sending): + return true + case (.delivered, .carried), (.delivered, .sent), (.delivered, .sending): + return true + case (.carried, .sent), (.carried, .sending): + return true + case (.sent, .sending): return true default: return false diff --git a/bitchat/Features/voice/VoiceCaptureSession.swift b/bitchat/Features/voice/VoiceCaptureSession.swift index 5a28b91c..556a37f3 100644 --- a/bitchat/Features/voice/VoiceCaptureSession.swift +++ b/bitchat/Features/voice/VoiceCaptureSession.swift @@ -124,6 +124,13 @@ final class PTTLiveVoiceSession: VoiceCaptureSession { // a short pause covers it (observed on iPhone field tests). SecureLogger.warning("PTT: capture start failed (\(error)) — retrying once after route settle", category: .session) try? await Task.sleep(nanoseconds: 150_000_000) + // The hold may have been released/canceled during the retry pause. + // Starting the mic now would leave it live and streaming after the + // user let go, so bail instead of opening a hot mic. + guard !completed else { + capture.cancel() + return + } try capture.start(outputURL: outputURL) } startDate = Date() @@ -156,10 +163,16 @@ final class PTTLiveVoiceSession: VoiceCaptureSession { } func cancel() async { - guard !completed else { return } + let alreadyCompleted = completed completed = true + // Always tear down the capture, even if a quick-release already marked + // us completed: the engine can start late (during start()'s retry + // pause), and only capture.cancel() stops the mic and deactivates the + // session. It is idempotent, so a redundant call is harmless. capture.cancel() - sendControlPacket(.canceled) + if !alreadyCompleted { + sendControlPacket(.canceled) + } } private func sendControlPacket(_ kind: VoiceBurstPacket.Kind) { diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 89942914..797af0ef 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -1,6 +1,186 @@ { "sourceLanguage" : "en", "strings" : { + "notification.action.wave" : { + "comment" : "Title of the notification action button that sends a friendly wave back to a nearby person", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لوّح 👋" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "হাত নাড়ুন 👋" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "winken 👋" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "wave 👋" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "saludar 👋" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "kumaway 👋" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "saluer 👋" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לנופף 👋" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "हाथ हिलाएँ 👋" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "melambai 👋" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "saluta 👋" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "手を振る 👋" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "손 흔들기 👋" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "lambai 👋" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "हात हल्लाउनुहोस् 👋" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "zwaaien 👋" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "pomachaj 👋" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "acenar 👋" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "acenar 👋" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "помахать 👋" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "vinka 👋" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "கை அசைக்கவும் 👋" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "โบกมือ 👋" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "el salla 👋" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "помахати 👋" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "ہاتھ ہلائیں 👋" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "vẫy tay 👋" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "挥手 👋" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "揮手 👋" + } + } + } + }, "#%@" : { "comment" : "Non-localizable channel hashtag format used in code", "extractionState" : "manual", diff --git a/bitchat/Nostr/NostrProtocol.swift b/bitchat/Nostr/NostrProtocol.swift index bdcb60f5..39417883 100644 --- a/bitchat/Nostr/NostrProtocol.swift +++ b/bitchat/Nostr/NostrProtocol.swift @@ -325,7 +325,7 @@ struct NostrProtocol { ) throws -> NostrEvent { let tags = [ ["x", recipientTagHex], - ["expiration", String(Int(expiresAt.timeIntervalSince1970))], + ["expiration", String(Int(expiresAt.timeIntervalSince1970))] ] let event = NostrEvent( pubkey: senderIdentity.publicKeyHex, diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 19eb6a32..9b18ed77 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -1257,6 +1257,10 @@ final class BLEService: NSObject { // MARK: - Archived public messages ("heard here earlier") + func purgeArchivedPublicMessages(from peerID: PeerID) { + gossipSyncManager?.removePublicMessages(from: peerID) + } + func collectArchivedPublicMessages(completion: @escaping @MainActor ([ArchivedPublicMessage]) -> Void) { guard let sync = gossipSyncManager else { Task { @MainActor in completion([]) } diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index 9f125291..f2b007dd 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -365,6 +365,9 @@ final class CommandProcessor { ) identityManager.updateSocialIdentity(blockedIdentity) } + // Scrub their carried public messages now, while the peerID is + // resolvable, so they can't resurface as archived echoes. + meshService?.purgeArchivedPublicMessages(from: peerID) return .success(message: "blocked \(nickname). you will no longer receive messages from them") } // Mesh lookup failed; try geohash (Nostr) participant by display name diff --git a/bitchat/Services/Gateway/BoundedIDSet.swift b/bitchat/Services/Gateway/BoundedIDSet.swift index 8509c295..5cb61744 100644 --- a/bitchat/Services/Gateway/BoundedIDSet.swift +++ b/bitchat/Services/Gateway/BoundedIDSet.swift @@ -32,4 +32,14 @@ struct BoundedIDSet { } return true } + + /// Releases a previously inserted ID so it can be re-added later. Used + /// when a tentatively-recorded item is later abandoned (e.g. a queued + /// drop evicted before it was ever published) and must become retryable. + mutating func remove(_ id: String) { + guard members.remove(id) != nil else { return } + if let index = order.firstIndex(of: id) { + order.remove(at: index) + } + } } diff --git a/bitchat/Services/Gateway/BridgeCourierService.swift b/bitchat/Services/Gateway/BridgeCourierService.swift index 164249d0..8e777897 100644 --- a/bitchat/Services/Gateway/BridgeCourierService.swift +++ b/bitchat/Services/Gateway/BridgeCourierService.swift @@ -9,7 +9,6 @@ import BitFoundation import BitLogger import Foundation -import Security /// Courier delivery over the internet bridge: sealed courier envelopes are /// parked on relays as kind-1401 "drops" tagged with their rotating @@ -111,8 +110,21 @@ final class BridgeCourierService: ObservableObject { guard bridgeEnabled?() ?? false else { return false } guard !publishedDropKeys.contains(messageID) else { return false } guard let envelope = sealEnvelope?(content, messageID, recipientNoiseKey) else { return false } + // An envelope that can't encode within the drop size caps fails the + // same way on every attempt (size is a function of the content, not + // of the sealing); consume the dedup slot so the retry sweep stops + // re-running Noise sealing on a drop that can never ship. + guard let encoded = envelope.encode(), encoded.count <= Limits.maxDropEnvelopeBytes else { + publishedDropKeys.insert(messageID) + return false + } + // Only consume the sender-side dedup slot once the drop is durably + // accepted (published, or safely queued for the next relay + // connection). If the compose fails, leave the slot open so the + // router's retry sweep can attempt a fresh deposit rather than + // marking the message "carried" and blocking retries forever. + guard publishDrop(envelope, messageID: messageID) else { return false } publishedDropKeys.insert(messageID) - publishDrop(envelope) return true } @@ -125,18 +137,27 @@ final class BridgeCourierService: ObservableObject { } } - private func publishDrop(_ envelope: CourierEnvelope) { + /// Publishes a drop, or queues it when relays are down. `messageID` is the + /// sender-side dedup key (nil for held/relayed envelopes we don't track); + /// it rides the pending queue so an evicted drop can release its slot. + /// Returns false only when the drop could not be made durable (bad + /// encode/expired/compose failure) so callers can keep it retryable. + @discardableResult + private func publishDrop(_ envelope: CourierEnvelope, messageID: String? = nil) -> Bool { guard let encoded = envelope.encode(), encoded.count <= Limits.maxDropEnvelopeBytes, - !envelope.isExpired else { return } + !envelope.isExpired else { return false } guard relaysConnected?() ?? false else { - pendingDrops.append((envelope, nil)) - if pendingDrops.count > Limits.maxPendingDrops { - pendingDrops.removeFirst(pendingDrops.count - Limits.maxPendingDrops) + pendingDrops.append((envelope, messageID)) + while pendingDrops.count > Limits.maxPendingDrops { + let evicted = pendingDrops.removeFirst() + // The oldest queued drop is being dropped before it ever + // published; release its dedup slot so it stays retryable. + if let key = evicted.dedupKey { publishedDropKeys.remove(key) } } - return + return true } - guard let identity = Self.makeThrowawayIdentity(), + guard let identity = try? NostrIdentity.generate(), let event = try? NostrProtocol.createCourierDropEvent( envelope: encoded, recipientTagHex: envelope.recipientTag.hexEncodedString(), @@ -144,10 +165,11 @@ final class BridgeCourierService: ObservableObject { senderIdentity: identity ) else { SecureLogger.error("📦🌉 Failed to compose courier drop", category: .encryption) - return + return false } publishEvent?(event) SecureLogger.debug("📦🌉 Published courier drop for tag \(envelope.recipientTag.hexEncodedString().prefix(8))…", category: .session) + return true } /// Drops queued while relays were unreachable publish on reconnect. @@ -155,8 +177,10 @@ final class BridgeCourierService: ObservableObject { guard bridgeEnabled?() ?? false, relaysConnected?() ?? false, !pendingDrops.isEmpty else { return } let queued = pendingDrops pendingDrops.removeAll() - for item in queued { - publishDrop(item.envelope) + for item in queued where !publishDrop(item.envelope, messageID: item.dedupKey) { + // Compose failed with relays up: release the slot so the router's + // retry sweep can attempt a fresh deposit. + if let key = item.dedupKey { publishedDropKeys.remove(key) } } } @@ -267,18 +291,10 @@ final class BridgeCourierService: ObservableObject { // MARK: - Helpers - /// A fresh random Nostr identity for signing one drop. + /// A fresh random Nostr identity for signing one drop. Delegates to the + /// canonical generator (Schnorr key that can't fail validity) instead of + /// hand-rolling SecRandom + retry. static func makeThrowawayIdentity() -> NostrIdentity? { - for _ in 0..<10 { - var bytes = Data(count: 32) - let status = bytes.withUnsafeMutableBytes { ptr in - SecRandomCopyBytes(kSecRandomDefault, 32, ptr.baseAddress!) - } - guard status == errSecSuccess else { return nil } - if let identity = try? NostrIdentity(privateKeyData: bytes) { - return identity - } - } - return nil + try? NostrIdentity.generate() } } diff --git a/bitchat/Services/Gateway/BridgeService.swift b/bitchat/Services/Gateway/BridgeService.swift index eb84944d..fed06020 100644 --- a/bitchat/Services/Gateway/BridgeService.swift +++ b/bitchat/Services/Gateway/BridgeService.swift @@ -652,7 +652,7 @@ final class BridgeService: ObservableObject { let messageID = (meshID?.trimmedOrNilIfEmpty) ?? event.id return .message(InboundBridgeMessage( messageID: messageID, - senderNickname: nickname?.trimmedOrNilIfEmpty ?? "anon#\(event.pubkey.prefix(4))", + senderNickname: nickname?.trimmedOrNilIfEmpty ?? "anon#\(event.pubkey.suffix(4))", senderPubkey: event.pubkey, content: content, timestamp: Date(timeIntervalSince1970: TimeInterval(event.created_at)) diff --git a/bitchat/Services/GeohashChatActivityTracker.swift b/bitchat/Services/GeohashChatActivityTracker.swift index 8d8f71a8..def9d59f 100644 --- a/bitchat/Services/GeohashChatActivityTracker.swift +++ b/bitchat/Services/GeohashChatActivityTracker.swift @@ -15,12 +15,6 @@ struct GeohashChatPreview: Equatable, Sendable { let senderName: String let content: String let timestamp: Date - - init(senderName: String, content: String, timestamp: Date) { - self.senderName = senderName - self.content = content - self.timestamp = timestamp - } } /// The liveliest nearby conversation, resolved against the user's regional diff --git a/bitchat/Services/MeshSightingsTracker.swift b/bitchat/Services/MeshSightingsTracker.swift index 1a5a9d80..12bd7255 100644 --- a/bitchat/Services/MeshSightingsTracker.swift +++ b/bitchat/Services/MeshSightingsTracker.swift @@ -51,6 +51,14 @@ final class MeshSightingsTracker: ObservableObject { defaults.set(Array(seenHashes), forKey: Keys.hashes) } + /// Re-evaluates the day boundary for the UI. `recordSighting` handles + /// rollover when peers are seen, but an idle app open across midnight + /// would otherwise keep showing yesterday's tally until the next sighting; + /// the empty-state view calls this on its periodic refresh tick. + func refreshForDisplay() { + rollOverIfNeeded() + } + func clear() { seenHashes.removeAll() todayCount = 0 @@ -76,8 +84,10 @@ final class MeshSightingsTracker: ObservableObject { defaults.set(today, forKey: Keys.dayKey) defaults.set(Self.randomSalt(), forKey: Keys.salt) defaults.removeObject(forKey: Keys.hashes) + defaults.removeObject(forKey: Keys.lastSeenAt) seenHashes.removeAll() todayCount = 0 + lastSightingAt = nil } private func saltedHash(_ value: String) -> String { @@ -92,12 +102,16 @@ final class MeshSightingsTracker: ObservableObject { return digest.finalize().map { String(format: "%02x", $0) }.joined() } - private static func dayKey(for date: Date) -> String { + private static let dayKeyFormatter: DateFormatter = { let formatter = DateFormatter() formatter.calendar = Calendar.current formatter.timeZone = TimeZone.current formatter.dateFormat = "yyyy-MM-dd" - return formatter.string(from: date) + return formatter + }() + + private static func dayKey(for date: Date) -> String { + dayKeyFormatter.string(from: date) } private static func randomSalt() -> Data { diff --git a/bitchat/Services/MessageRouter.swift b/bitchat/Services/MessageRouter.swift index f8474776..bfbba094 100644 --- a/bitchat/Services/MessageRouter.swift +++ b/bitchat/Services/MessageRouter.swift @@ -92,6 +92,10 @@ final class MessageRouter { bridgeSweepTask = Task { @MainActor [weak self] in while !Task.isCancelled { try? await Task.sleep(nanoseconds: UInt64(interval * 1_000_000_000)) + // Expire stale outbox entries in-session too — otherwise a DM + // to a peer that never reconnects sits on "sending" until the + // next relaunch instead of surfacing as failed. + self?.cleanupExpiredMessages() self?.retryBridgeCourierDeposits() } } @@ -354,13 +358,20 @@ final class MessageRouter { outboxStore?.wipe() } - func sendReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) { + /// Returns true only when the receipt was handed to a reachable transport. + /// A false result means it was dropped (no route) and must NOT be recorded + /// as sent, or the sender's message would stay unread forever — the receipt + /// is retried on the next read scan (chat open / foreground / reconnect). + @discardableResult + func sendReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) -> Bool { if let transport = reachableTransport(for: peerID) { SecureLogger.debug("Routing READ ack via \(type(of: transport)) to \(peerID.id.prefix(8))… id=\(receipt.originalMessageID.prefix(8))…", category: .session) transport.sendReadReceipt(receipt, to: peerID) + return true } else if !transports.isEmpty { - SecureLogger.debug("No reachable transport for READ ack to \(peerID.id.prefix(8))…", category: .session) + SecureLogger.debug("No reachable transport for READ ack to \(peerID.id.prefix(8))… — leaving unsent for retry", category: .session) } + return false } func sendFavoriteNotification(to peerID: PeerID, isFavorite: Bool) { diff --git a/bitchat/Services/NotificationService.swift b/bitchat/Services/NotificationService.swift index cc75bcef..4b437798 100644 --- a/bitchat/Services/NotificationService.swift +++ b/bitchat/Services/NotificationService.swift @@ -153,7 +153,7 @@ final class NotificationService { private func registerCategories() { let wave = UNNotificationAction( identifier: Self.waveActionID, - title: "wave 👋", + title: String(localized: "notification.action.wave", comment: "Title of the notification action button that sends a friendly wave back to a nearby person"), options: [] ) let nearby = UNNotificationCategory( diff --git a/bitchat/Services/PrivateChatManager.swift b/bitchat/Services/PrivateChatManager.swift index 513acebb..977bdcb3 100644 --- a/bitchat/Services/PrivateChatManager.swift +++ b/bitchat/Services/PrivateChatManager.swift @@ -256,8 +256,6 @@ final class PrivateChatManager: ObservableObject { return } - sentReadReceipts.insert(message.id) - // Create read receipt using the simplified method let receipt = ReadReceipt( originalMessageID: message.id, @@ -268,11 +266,21 @@ final class PrivateChatManager: ObservableObject { // Route via MessageRouter to avoid handshakeRequired spam when session isn't established if let router = messageRouter { SecureLogger.debug("PrivateChatManager: sending READ ack for \(message.id.prefix(8))… to \(senderPeerID.id.prefix(8))… via router", category: .session) - Task { @MainActor in - router.sendReadReceipt(receipt, to: senderPeerID) + let messageID = message.id + // Claim the receipt synchronously so a second read scan in the + // same runloop pass (chat open triggers two) can't route a + // duplicate; release the claim on a failed route (no reachable + // transport) so a later read scan retries instead of permanently + // losing the receipt. + sentReadReceipts.insert(messageID) + Task { @MainActor [weak self] in + if !router.sendReadReceipt(receipt, to: senderPeerID) { + self?.sentReadReceipts.remove(messageID) + } } } else { - // Fallback: preserve previous behavior + // Fallback: preserve previous behavior (best-effort mesh send). + sentReadReceipts.insert(message.id) meshService?.sendReadReceipt(receipt, to: senderPeerID) } } diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 43ece9ea..35a794cb 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -216,6 +216,9 @@ protocol Transport: AnyObject { // this device is carrying for gossip sync, decoded for display as // "heard here earlier" timeline echoes. func collectArchivedPublicMessages(completion: @escaping @MainActor ([ArchivedPublicMessage]) -> Void) + /// Drops any carried public messages from a (newly blocked) sender so + /// they can't resurface as archived echoes on a later launch. + func purgeArchivedPublicMessages(from peerID: PeerID) } /// A carried public mesh message from the store-and-forward window, decoded @@ -291,6 +294,8 @@ extension Transport { func collectArchivedPublicMessages(completion: @escaping @MainActor ([ArchivedPublicMessage]) -> Void) { Task { @MainActor in completion([]) } } + + func purgeArchivedPublicMessages(from peerID: PeerID) {} } protocol TransportPeerEventsDelegate: AnyObject { diff --git a/bitchat/Services/UnifiedPeerService.swift b/bitchat/Services/UnifiedPeerService.swift index 84a4843f..f54523ec 100644 --- a/bitchat/Services/UnifiedPeerService.swift +++ b/bitchat/Services/UnifiedPeerService.swift @@ -275,6 +275,12 @@ final class UnifiedPeerService: ObservableObject, TransportPeerEventsDelegate { return nil } identityManager.setBlocked(fingerprint, isBlocked: blocked) + if blocked { + // Purge while the fingerprint↔peerID mapping is still known: the + // archived-echo seed filter can't resolve offline strangers, so + // scrub their carried messages now rather than at relaunch. + meshService.purgeArchivedPublicMessages(from: peerID) + } updatePeers() return fingerprint } diff --git a/bitchat/Sync/GossipSyncManager.swift b/bitchat/Sync/GossipSyncManager.swift index b619e75d..62f6394e 100644 --- a/bitchat/Sync/GossipSyncManager.swift +++ b/bitchat/Sync/GossipSyncManager.swift @@ -716,6 +716,23 @@ final class GossipSyncManager { } } + /// Block-time hygiene: drop the carried public messages from a blocked + /// sender and persist immediately, so nothing of theirs can resurface as + /// an archived echo on the next launch. Narrower than `removeState(for:)` + /// — the peer's announcement and in-flight fragments are untouched. + func removePublicMessages(from peerID: PeerID) { + queue.async { [weak self] in + guard let self else { return } + let countBefore = self.messages.packets.count + self.messages.remove { PeerID(hexData: $0.senderID) == peerID } + guard self.messages.packets.count != countBefore else { return } + self.archiveDirty = true + // Persist now rather than waiting for maintenance: a relaunch in + // the gap would restore the purged messages from disk. + self.persistArchiveIfDirty() + } + } + private func removeState(for peerID: PeerID) { // Deliberately keeps the peer's prekey bundle: bundles exist to reach // owners who left the mesh, and they age out on their own schedule. diff --git a/bitchat/ViewModels/ChatLifecycleCoordinator.swift b/bitchat/ViewModels/ChatLifecycleCoordinator.swift index 05831407..9b0fab0d 100644 --- a/bitchat/ViewModels/ChatLifecycleCoordinator.swift +++ b/bitchat/ViewModels/ChatLifecycleCoordinator.swift @@ -53,7 +53,8 @@ protocol ChatLifecycleContext: AnyObject { // MARK: Routing & receipts func routePrivateMessage(_ content: String, to peerID: PeerID, recipientNickname: String, messageID: String) - func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) + @discardableResult + func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) -> Bool func sendMeshMessage(_ content: String, mentions: [String], messageID: String, timestamp: Date) func sendGeohashReadReceipt(_ messageID: String, toRecipientHex recipientHex: String, from identity: NostrIdentity) @@ -248,8 +249,12 @@ final class ChatLifecycleCoordinator { ? peerID : (context.unifiedPeer(for: peerID)?.peerID ?? peerID) - context.routeReadReceipt(receipt, to: recipientPeerID) - context.markReadReceiptSent(message.id) + // Only record the receipt as sent when it actually left via a + // reachable transport; a dropped receipt stays unmarked so the + // next read scan retries it instead of burning it forever. + if context.routeReadReceipt(receipt, to: recipientPeerID) { + context.markReadReceiptSent(message.id) + } } } diff --git a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift index bfaaab90..0bfca931 100644 --- a/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPrivateConversationCoordinator.swift @@ -83,14 +83,14 @@ protocol ChatPrivateConversationContext: AnyObject { // MARK: Routing & acknowledgements func routePrivateMessage(_ content: String, to peerID: PeerID, recipientNickname: String, messageID: String) - func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) + @discardableResult + func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) -> Bool func sendMeshReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) func sendGeohashPrivateMessage(_ content: String, toRecipientHex recipientHex: String, from identity: NostrIdentity, messageID: String) func sendGeohashDeliveryAck(for messageID: String, toRecipientHex recipientHex: String, from identity: NostrIdentity) func sendGeohashReadReceipt(_ messageID: String, toRecipientHex recipientHex: String, from identity: NostrIdentity) // MARK: System messages - func addSystemMessage(_ content: String) func addMeshOnlySystemMessage(_ content: String) /// Appends a local-only system line into a specific private thread — /// errors about a DM belong in that DM, not on the active timeline. @@ -161,7 +161,8 @@ extension ChatViewModel: ChatPrivateConversationContext { messageRouter.sendPrivate(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID) } - func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) { + @discardableResult + func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) -> Bool { messageRouter.sendReadReceipt(receipt, to: peerID) } @@ -329,8 +330,12 @@ final class ChatPrivateConversationCoordinator { func sendGeohashDM(_ content: String, to peerID: PeerID) { guard case .location(let channel) = context.activeChannel else { - context.addSystemMessage( - String(localized: "system.location.not_in_channel", comment: "System message when attempting to send without being in a location channel") + // The failure happened inside a geoDM thread — surface it there, + // not on the public timeline (matches the sibling blocked/unknown + // errors routed into the thread by #1415). + context.addLocalPrivateSystemMessage( + String(localized: "system.location.not_in_channel", comment: "System message when attempting to send without being in a location channel"), + to: peerID ) return } diff --git a/bitchat/ViewModels/ChatViewModelBootstrapper.swift b/bitchat/ViewModels/ChatViewModelBootstrapper.swift index 4d761d8f..c331fe00 100644 --- a/bitchat/ViewModels/ChatViewModelBootstrapper.swift +++ b/bitchat/ViewModels/ChatViewModelBootstrapper.swift @@ -210,11 +210,19 @@ private extension ChatViewModelBootstrapper { DispatchQueue.main.asyncAfter(deadline: .now() + TransportConfig.uiArchivedEchoLoadDelaySeconds) { [weak viewModel] in guard let viewModel else { return } viewModel.meshService.collectArchivedPublicMessages { [weak viewModel] allArchived in + guard let viewModel else { return } // A previous /clear dismissed everything heard up to its - // watermark; only newer archive entries come back. + // watermark; only newer archive entries come back. Blocking a + // peer purges their carried messages from the archive at + // block time (when the fingerprint↔peerID mapping is known); + // the filter here is defense-in-depth for entries that slip + // past the purge (e.g. re-synced from a nearby peer), and it + // only resolves connected peers or favorites. let clearedThrough = MeshEchoSettings.clearedThrough ?? .distantPast - let archived = allArchived.filter { $0.timestamp > clearedThrough } - guard let viewModel, !archived.isEmpty else { return } + let archived = allArchived.filter { + $0.timestamp > clearedThrough && !viewModel.isPeerBlocked($0.senderPeerID) + } + guard !archived.isEmpty else { return } // Seed only an untouched timeline: with live rows already // present (or after /clear) splicing history back in would // be wrong. diff --git a/bitchat/Views/Components/MeshEmptyStateView.swift b/bitchat/Views/Components/MeshEmptyStateView.swift index fad25b21..ef6e6219 100644 --- a/bitchat/Views/Components/MeshEmptyStateView.swift +++ b/bitchat/Views/Components/MeshEmptyStateView.swift @@ -100,7 +100,11 @@ struct MeshEmptyStateView: View { } } .frame(minHeight: compact ? 0 : fillHeight, alignment: .top) - .onReceive(refreshTimer) { _ in refreshTick += 1 } + .onReceive(refreshTimer) { _ in + refreshTick += 1 + // Roll the tally over if the local day changed while idle. + sightingsTracker.refreshForDisplay() + } } /// The radar with today's tally as its caption — the stat belongs to diff --git a/bitchatTests/ChatLifecycleCoordinatorContextTests.swift b/bitchatTests/ChatLifecycleCoordinatorContextTests.swift index f8b0de66..1ed083a0 100644 --- a/bitchatTests/ChatLifecycleCoordinatorContextTests.swift +++ b/bitchatTests/ChatLifecycleCoordinatorContextTests.swift @@ -106,8 +106,10 @@ private final class MockChatLifecycleContext: ChatLifecycleContext { routedPrivateMessages.append((content, peerID, recipientNickname)) } - func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) { + var routeReadReceiptResult = true + func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) -> Bool { routedReadReceipts.append((receipt.originalMessageID, peerID)) + return routeReadReceiptResult } func sendMeshMessage(_ content: String, mentions: [String], messageID: String, timestamp: Date) { diff --git a/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift b/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift index a92d1e9c..59516b9a 100644 --- a/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift +++ b/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift @@ -181,8 +181,10 @@ private final class MockChatPrivateConversationContext: ChatPrivateConversationC routedPrivateMessages.append((content, peerID, messageID)) } - func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) { + var routeReadReceiptResult = true + func routeReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) -> Bool { routedReadReceipts.append((receipt.originalMessageID, peerID)) + return routeReadReceiptResult } func sendMeshReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) { @@ -223,13 +225,8 @@ private final class MockChatPrivateConversationContext: ChatPrivateConversationC } // System messages - private(set) var systemMessages: [String] = [] private(set) var meshOnlySystemMessages: [String] = [] - func addSystemMessage(_ content: String) { - systemMessages.append(content) - } - func addMeshOnlySystemMessage(_ content: String) { meshOnlySystemMessages.append(content) } @@ -657,7 +654,6 @@ struct ChatPrivateConversationCoordinatorContextTests { #expect(context.routedPrivateMessages.map(\.content) == ["hello bob"]) #expect(context.privateChats[peerID]?.first?.deliveryStatus == .sent) #expect(context.privateChats[peerID]?.first?.recipientNickname == "bob") - #expect(context.systemMessages.isEmpty) } /// Same as above, but the conversation is keyed by the SHORT mesh ID — @@ -683,7 +679,6 @@ struct ChatPrivateConversationCoordinatorContextTests { #expect(context.routedPrivateMessages.map(\.content) == ["hello again"]) #expect(context.privateChats[shortID]?.first?.deliveryStatus == .sent) #expect(context.privateChats[shortID]?.first?.recipientNickname == "bob") - #expect(context.systemMessages.isEmpty) } /// Field-found: pre-judging reachability here marked the message failed @@ -701,6 +696,5 @@ struct ChatPrivateConversationCoordinatorContextTests { #expect(context.routedPrivateMessages.map(\.content) == ["hello?"]) #expect(context.privateChats[peerID]?.first?.deliveryStatus == .sending) - #expect(context.systemMessages.isEmpty) } } diff --git a/bitchatTests/ChatViewModelDeliveryStatusTests.swift b/bitchatTests/ChatViewModelDeliveryStatusTests.swift index 7d68a3dc..f6d3d974 100644 --- a/bitchatTests/ChatViewModelDeliveryStatusTests.swift +++ b/bitchatTests/ChatViewModelDeliveryStatusTests.swift @@ -67,6 +67,105 @@ struct ChatViewModelDeliveryStatusTests { }()) } + @Test @MainActor + func deliveryStatus_noDowngrade_carriedToSent() async { + // Regression: the optimistic `.sent` stamp the send path writes after + // routing must not clobber the `.carried` the router already set when + // it handed a copy to a courier/bridge (store-and-forward), or the + // offline-favorite flow shows "sent" instead of 📦 carried. + let (viewModel, transport) = makeTestableViewModel() + let peerID = PeerID(str: "0102030405060708") + let messageID = "test-msg-carried" + + let message = BitchatMessage( + id: messageID, + sender: viewModel.nickname, + content: "Test message", + timestamp: Date(), + isRelay: false, + isPrivate: true, + recipientNickname: "Peer", + senderPeerID: transport.myPeerID, + deliveryStatus: .carried + ) + viewModel.seedPrivateChat([message], for: peerID) + + viewModel.didUpdateMessageDeliveryStatus(messageID, status: .sent) + + let currentStatus = viewModel.privateChats[peerID]?.first?.deliveryStatus + #expect({ + if case .carried = currentStatus { return true } + return false + }()) + } + + @Test @MainActor + func deliveryStatus_noDowngrade_carriedToSending() async { + // Regression: a pre-handshake resend stamps `.sending`; it must not + // wipe the 📦 carried indicator (nor a delivered/read ack). + let (viewModel, transport) = makeTestableViewModel() + let peerID = PeerID(str: "0102030405060708") + let messageID = "test-msg-carried-sending" + + let message = BitchatMessage( + id: messageID, + sender: viewModel.nickname, + content: "Test message", + timestamp: Date(), + isRelay: false, + isPrivate: true, + recipientNickname: "Peer", + senderPeerID: transport.myPeerID, + deliveryStatus: .carried + ) + viewModel.seedPrivateChat([message], for: peerID) + + viewModel.didUpdateMessageDeliveryStatus(messageID, status: .sending) + + let currentStatus = viewModel.privateChats[peerID]?.first?.deliveryStatus + #expect({ + if case .carried = currentStatus { return true } + return false + }()) + + #expect(Conversation.shouldSkipStatusUpdate(current: .delivered(to: "Peer", at: Date()), new: .sending)) + #expect(Conversation.shouldSkipStatusUpdate(current: .read(by: "Peer", at: Date()), new: .sending)) + // A late async `.sending` (pre-handshake resend) must not visibly + // downgrade a truthful "Sent" either... + #expect(Conversation.shouldSkipStatusUpdate(current: .sent, new: .sending)) + // ...but a retry after a real failure stays visible. + #expect(!Conversation.shouldSkipStatusUpdate(current: .failed(reason: "no route"), new: .sending)) + } + + @Test @MainActor + func deliveryStatus_upgrade_carriedToDelivered() async { + // A delivery ack must still promote a carried message. + let (viewModel, transport) = makeTestableViewModel() + let peerID = PeerID(str: "0102030405060708") + let messageID = "test-msg-carried-delivered" + + let message = BitchatMessage( + id: messageID, + sender: viewModel.nickname, + content: "Test message", + timestamp: Date(), + isRelay: false, + isPrivate: true, + recipientNickname: "Peer", + senderPeerID: transport.myPeerID, + deliveryStatus: .carried + ) + viewModel.seedPrivateChat([message], for: peerID) + + viewModel.didUpdateMessageDeliveryStatus(messageID, status: .delivered(to: "Peer", at: Date())) + + let currentStatus = viewModel.privateChats[peerID]?.first?.deliveryStatus + #expect({ + if case .delivered = currentStatus { return true } + return false + }()) + } + @Test @MainActor func deliveryStatus_upgrade_sentToDelivered() async { let (viewModel, transport) = makeTestableViewModel() diff --git a/bitchatTests/ChatViewModelExtensionsTests.swift b/bitchatTests/ChatViewModelExtensionsTests.swift index dc0bdaa4..0097a368 100644 --- a/bitchatTests/ChatViewModelExtensionsTests.swift +++ b/bitchatTests/ChatViewModelExtensionsTests.swift @@ -761,9 +761,11 @@ struct ChatViewModelGeoDMTests { viewModel.sendGeohashDM("hello", to: convKey) - #expect(viewModel.privateChats[convKey] == nil) - #expect(viewModel.messages.count == 1) - #expect(viewModel.messages.last?.sender == "system") + // The failure is surfaced inside the geoDM thread, not on the public + // timeline (matches the sibling in-thread errors from #1415). + #expect(viewModel.messages.isEmpty) + #expect(viewModel.privateChats[convKey]?.count == 1) + #expect(viewModel.privateChats[convKey]?.last?.sender == "system") } @Test @MainActor diff --git a/bitchatTests/GossipSyncManagerTests.swift b/bitchatTests/GossipSyncManagerTests.swift index de1fa209..2d39ea88 100644 --- a/bitchatTests/GossipSyncManagerTests.swift +++ b/bitchatTests/GossipSyncManagerTests.swift @@ -91,6 +91,47 @@ struct GossipSyncManagerTests { #expect(manager._messageCount(for: PeerID(str: peerHex)) == 0) } + @Test func removePublicMessagesPurgesOnlyThatSender() throws { + // Block-time archive hygiene: purging a blocked sender's carried + // public messages must not touch other senders' messages or the + // blocked sender's announcement. + let requestSyncManager = RequestSyncManager() + let manager = GossipSyncManager(myPeerID: myPeerID, requestSyncManager: requestSyncManager) + let blockedHex = "00112233445566aa" + let otherHex = "00112233445566bb" + let blockedData = try #require(Data(hexString: blockedHex)) + let otherData = try #require(Data(hexString: otherHex)) + let nowMs = UInt64(Date().timeIntervalSince1970 * 1000) + + manager.onPublicPacketSeen(BitchatPacket( + type: MessageType.announce.rawValue, + senderID: blockedData, + recipientID: nil, + timestamp: nowMs, + payload: Data(), + signature: nil, + ttl: 1 + )) + for (index, sender) in [blockedData, blockedData, otherData].enumerated() { + manager.onPublicPacketSeen(BitchatPacket( + type: MessageType.message.rawValue, + senderID: sender, + recipientID: nil, + timestamp: nowMs + UInt64(index), + payload: Data([UInt8(index)]), + signature: nil, + ttl: 1 + )) + } + #expect(manager._messageCount(for: PeerID(str: blockedHex)) == 2) + + manager.removePublicMessages(from: PeerID(str: blockedHex)) + + #expect(manager._messageCount(for: PeerID(str: blockedHex)) == 0) + #expect(manager._messageCount(for: PeerID(str: otherHex)) == 1) + #expect(manager._hasAnnouncement(for: PeerID(str: blockedHex))) + } + @Test func ignoresAnnounceOlderThanStaleTimeout() throws { var config = GossipSyncManager.Config() config.stalePeerTimeoutSeconds = 5 diff --git a/bitchatTests/Mocks/MockTransport.swift b/bitchatTests/Mocks/MockTransport.swift index 6c617249..62ced6c9 100644 --- a/bitchatTests/Mocks/MockTransport.swift +++ b/bitchatTests/Mocks/MockTransport.swift @@ -45,6 +45,7 @@ final class MockTransport: Transport { private(set) var emergencyDisconnectCallCount = 0 private(set) var broadcastAnnounceCallCount = 0 private(set) var triggeredHandshakes: [PeerID] = [] + private(set) var purgedArchivePeers: [PeerID] = [] // MARK: - Configurable Mock State @@ -107,6 +108,10 @@ final class MockTransport: Transport { triggeredHandshakes.append(peerID) } + func purgeArchivedPublicMessages(from peerID: PeerID) { + purgedArchivePeers.append(peerID) + } + // Noise identity wrappers backed by a mock-keychain encryption service // (mirrors the previous `getNoiseService()` placeholder behavior: a real // identity, but no peer sessions). Exposed so tests can assert against diff --git a/bitchatTests/Performance/PerformanceBaselineTests.swift b/bitchatTests/Performance/PerformanceBaselineTests.swift index 74246df2..2b038b88 100644 --- a/bitchatTests/Performance/PerformanceBaselineTests.swift +++ b/bitchatTests/Performance/PerformanceBaselineTests.swift @@ -225,8 +225,9 @@ final class PerformanceBaselineTests: XCTestCase { /// `ConversationStore`'s message-ID → conversation map: 2000 public /// (split mesh + geohash to stay under the per-conversation cap) + 50x40 /// private messages, 500 status updates per pass. Statuses alternate - /// sent <-> delivered so every call performs a real update (never the - /// skip path). + /// between two `delivered` timestamps so every call performs a real update + /// (never the skip path). A sent <-> delivered alternation would now hit + /// the store's no-downgrade guard on the delivered -> sent half. func testDeliveryStatusIncrementalUpdates() { let context = PerfDeliveryContext.makeCorpus(publicCount: 2000, peerCount: 50, messagesPerPeer: 40) let coordinator = ChatDeliveryCoordinator(context: context) @@ -234,12 +235,13 @@ final class PerformanceBaselineTests: XCTestCase { XCTAssertEqual(targetIDs.count, 500) let fixedDate = Date(timeIntervalSince1970: 1_700_000_000) + let fixedDate2 = Date(timeIntervalSince1970: 1_700_000_001) var toggle = false var samples: [TimeInterval] = [] measure { toggle.toggle() - let status: DeliveryStatus = toggle ? .delivered(to: "peer", at: fixedDate) : .sent + let status: DeliveryStatus = toggle ? .delivered(to: "peer", at: fixedDate) : .delivered(to: "peer", at: fixedDate2) let start = Date() var updated = 0 for id in targetIDs where coordinator.updateMessageDeliveryStatus(id, status: status) { @@ -267,13 +269,16 @@ final class PerformanceBaselineTests: XCTestCase { let targetIDs = context.makeTargetIDs(publicTargets: 250, privateTargets: 250) XCTAssertEqual(targetIDs.count, 500) + // Alternate two delivered timestamps so every update is real; a + // sent <-> delivered swing would hit the no-downgrade guard. let fixedDate = Date(timeIntervalSince1970: 1_700_000_000) + let fixedDate2 = Date(timeIntervalSince1970: 1_700_000_001) var toggle = false var samples: [TimeInterval] = [] measure { toggle.toggle() - let status: DeliveryStatus = toggle ? .delivered(to: "peer", at: fixedDate) : .sent + let status: DeliveryStatus = toggle ? .delivered(to: "peer", at: fixedDate) : .delivered(to: "peer", at: fixedDate2) let start = Date() var updated = 0 for id in targetIDs where store.setDeliveryStatus(status, forMessageID: id) { diff --git a/bitchatTests/Services/BridgeCourierServiceTests.swift b/bitchatTests/Services/BridgeCourierServiceTests.swift index 13bcbda0..ebd25bf1 100644 --- a/bitchatTests/Services/BridgeCourierServiceTests.swift +++ b/bitchatTests/Services/BridgeCourierServiceTests.swift @@ -133,6 +133,48 @@ struct BridgeCourierServiceTests { #expect(fixture.service.pendingDrops.isEmpty) } + @Test func evictedPendingDropStaysRetryable() { + // Regression: a drop queued while relays are down but then evicted + // (oldest-out at capacity) before it ever published must release its + // sender-side dedup slot, or the router marks it "carried" and can + // never re-deposit it. + let fixture = Fixture() + fixture.relaysConnected = false + let key = Fixture.randomKey() + fixture.sealResult = makeEnvelope(recipientKey: key) + + let firstID = UUID().uuidString + #expect(fixture.service.depositDrop(content: "0", messageID: firstID, recipientNoiseKey: key)) + // Fill past capacity so the first drop is evicted. + for i in 1...BridgeCourierService.Limits.maxPendingDrops { + fixture.service.depositDrop(content: "\(i)", messageID: UUID().uuidString, recipientNoiseKey: key) + } + #expect(fixture.service.pendingDrops.count == BridgeCourierService.Limits.maxPendingDrops) + + // The evicted first drop is deposit-able again (slot released). + #expect(fixture.service.depositDrop(content: "0-retry", messageID: firstID, recipientNoiseKey: key)) + } + + @Test func oversizeDropConsumesSlotInsteadOfChurning() { + // An envelope that encodes over the size cap fails identically on + // every attempt; the dedup slot must be consumed so the retry sweep + // doesn't re-run Noise sealing forever. + let fixture = Fixture() + let key = Fixture.randomKey() + fixture.sealResult = makeEnvelope( + recipientKey: key, + ciphertext: Data(repeating: 7, count: BridgeCourierService.Limits.maxDropEnvelopeBytes + 1) + ) + let messageID = UUID().uuidString + + #expect(!fixture.service.depositDrop(content: "big", messageID: messageID, recipientNoiseKey: key)) + #expect(fixture.publishedEvents.isEmpty) + + // The retry sweep must not seal the same payload again. + #expect(!fixture.service.depositDrop(content: "big", messageID: messageID, recipientNoiseKey: key)) + #expect(fixture.sealRequests.count == 1) + } + @Test func distinctDropsUseDistinctThrowawayKeys() { let fixture = Fixture() let keyA = Fixture.randomKey() diff --git a/bitchatTests/Services/BridgeServiceTests.swift b/bitchatTests/Services/BridgeServiceTests.swift index 0dc62552..31107310 100644 --- a/bitchatTests/Services/BridgeServiceTests.swift +++ b/bitchatTests/Services/BridgeServiceTests.swift @@ -494,7 +494,7 @@ struct BridgeServiceTests { "kind": event.kind, "tags": event.tags, "content": event.content + " (tampered)", - "sig": event.sig ?? "", + "sig": event.sig ?? "" ] let forged = try NostrEvent(from: dict) diff --git a/bitchatTests/Services/PrivateChatManagerTests.swift b/bitchatTests/Services/PrivateChatManagerTests.swift index a986570d..69b49aaf 100644 --- a/bitchatTests/Services/PrivateChatManagerTests.swift +++ b/bitchatTests/Services/PrivateChatManagerTests.swift @@ -108,6 +108,76 @@ struct PrivateChatManagerTests { #expect(transport.sentReadReceipts.first?.receipt.originalMessageID == "pm-fallback") } + @Test @MainActor + func markAsRead_calledTwiceSynchronously_routesOneReceiptPerMessage() async { + // Regression: opening a chat runs two read scans in the same + // synchronous MainActor stretch (beginPrivateChatSession and + // markPrivateMessagesAsRead). The receipt must be claimed before the + // routing task gets a chance to run, or both scans route a copy. + let transport = MockTransport() + let router = MessageRouter(transports: [transport]) + let (manager, store) = Self.makeManager(transport: transport) + manager.messageRouter = router + + let peerID = PeerID(str: "00000000000000DE") + transport.reachablePeers.insert(peerID) + + store.append( + BitchatMessage( + id: "pm-double", + sender: "Peer", + content: "Hi", + timestamp: Date(), + isRelay: false, + isPrivate: true, + recipientNickname: "Me", + senderPeerID: peerID + ), + to: .directPeer(peerID) + ) + store.markUnread(.directPeer(peerID)) + + manager.markAsRead(from: peerID) + manager.markAsRead(from: peerID) + try? await Task.sleep(nanoseconds: 100_000_000) + + #expect(transport.sentReadReceipts.count == 1) + #expect(manager.sentReadReceipts.contains("pm-double")) + } + + @Test @MainActor + func markAsRead_failedRouteReleasesClaimForRetry() async { + // No reachable transport: the receipt is not sent, and the eager + // claim must be released so a later read scan retries. + let transport = MockTransport() + let router = MessageRouter(transports: [transport]) + let (manager, store) = Self.makeManager(transport: transport) + manager.messageRouter = router + + let peerID = PeerID(str: "00000000000000DF") + + store.append( + BitchatMessage( + id: "pm-unroutable", + sender: "Peer", + content: "Hi", + timestamp: Date(), + isRelay: false, + isPrivate: true, + recipientNickname: "Me", + senderPeerID: peerID + ), + to: .directPeer(peerID) + ) + store.markUnread(.directPeer(peerID)) + + manager.markAsRead(from: peerID) + try? await Task.sleep(nanoseconds: 100_000_000) + + #expect(transport.sentReadReceipts.isEmpty) + #expect(!manager.sentReadReceipts.contains("pm-unroutable")) + } + @Test @MainActor func consolidateMessages_mergesStableNoiseKeyHistoryAndMarksUnread() async { let transport = MockTransport() diff --git a/bitchatTests/Services/UnifiedPeerServiceTests.swift b/bitchatTests/Services/UnifiedPeerServiceTests.swift index 17b30def..a81003ec 100644 --- a/bitchatTests/Services/UnifiedPeerServiceTests.swift +++ b/bitchatTests/Services/UnifiedPeerServiceTests.swift @@ -53,17 +53,22 @@ struct UnifiedPeerServiceTests { let fingerprint = "fp-target" transport.peerFingerprints[peerID] = fingerprint - // Blocking resolves and persists by the peer's fingerprint. + // Blocking resolves and persists by the peer's fingerprint, and + // scrubs the peer's carried public messages from the gossip archive + // while the fingerprint↔peerID mapping is still known (the + // archived-echo seed filter can't resolve offline strangers). let resolved = service.setBlocked(peerID, blocked: true) #expect(resolved == fingerprint) #expect(identity.isBlocked(fingerprint: fingerprint)) #expect(service.isBlocked(peerID)) + #expect(transport.purgedArchivePeers == [peerID]) - // Unblocking clears it against the same identity. + // Unblocking clears it against the same identity, without purging. let unresolved = service.setBlocked(peerID, blocked: false) #expect(unresolved == fingerprint) #expect(!identity.isBlocked(fingerprint: fingerprint)) #expect(!service.isBlocked(peerID)) + #expect(transport.purgedArchivePeers == [peerID]) } // MARK: - Offline-favorite dedup (updatePeers phase 2) diff --git a/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift b/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift index 01cc0769..cf7039fa 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/BitchatMessage.swift @@ -367,4 +367,3 @@ extension BitchatMessage { Self.timestampFormatter.string(from: timestamp) } } - diff --git a/localPackages/BitLogger/Sources/SecureLogger.swift b/localPackages/BitLogger/Sources/SecureLogger.swift index e12fda0f..1a82f437 100644 --- a/localPackages/BitLogger/Sources/SecureLogger.swift +++ b/localPackages/BitLogger/Sources/SecureLogger.swift @@ -275,4 +275,3 @@ private extension SecureLogger { return "[\(timestamp)] [\(fileName):\(line) \(function)]" } } - From 84d315e62d4eab7c466d43e9cefcf4c883630d59 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:44:47 +0200 Subject: [PATCH 069/158] Bridge dedup: content-derived stable mesh message ID (#1419) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Bridge dedup keys on a content-derived stable mesh message ID Public mesh messages carry no message ID on the BLE wire, so every non-origin device minted a fresh UUID and the bridge's m-tag dedup only matched on the origin device: duplicate bridged rows, misattributed "across the bridge" counts, redundant downlink rebroadcasts, and an m-tag spoof vector (an attacker could claim a victim's message ID). Every device now derives the same stable ID from the signed wire fields (sender ID + ms timestamp + trimmed content, SHA256/32 hex) via the new MeshMessageIdentity — zero BLE wire change. The bridge event's m tag carries the origin coordinates ["m", senderIDHex, timestampMs] and receivers recompute the key from those plus the event's own content instead of trusting a claimed ID; old-format/absent tags fall back to the event ID as before. Co-Authored-By: Claude Opus 4.8 * Fix mixed-version message loss: m tag leads with the derived stable ID The previous layout (["m", senderIDHex, timestampMs]) broke v1.7.0 receivers: their parser takes m[1] unconditionally as the timeline dedup key whenever the tag has >= 2 elements, so every bridged message from a new-version sender keyed on the CONSTANT sender hex and inject-dedup dropped all but the first. The tag is now ["m", , senderIDHex, timestampMs]: old parsers get a per-message-unique m[1] (exactly today's semantics), while the new parser recomputes the ID from elements 2-3 plus the event's own content and never trusts element 1, keeping the recompute-don't-trust property. Also: - Soften the overstated security claim in MeshMessageIdentity and the BridgeService classify comment: forging a chosen ID onto different content is infeasible, but all three hash inputs are cleartext on the radio, so identical-content front-running by a radio-local attacker remains possible (no worse than the unbridged mesh). - Fix the stale archivedEchoKeys rationale: re-synced copies of others' messages now carry the derived stable ID (insert-by-ID catches them); the content key remains for echo--prefixed archive rows + self echoes. - Tests: old-parser semantics on the new tag (m[1] per-message-unique and equal to the derived ID) and a forged-m[1] event that cannot pre-poison a genuine message's dedup slot. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Opus 4.8 --- bitchat/Nostr/NostrProtocol.swift | 23 ++- bitchat/Protocols/MeshMessageIdentity.swift | 35 ++++ .../BLE/BLEPublicMessageHandler.swift | 14 +- bitchat/Services/Gateway/BridgeService.swift | 45 ++++- .../ViewModels/ChatOutgoingCoordinator.swift | 11 +- .../ChatPublicConversationCoordinator.swift | 9 +- .../ChatOutgoingCoordinatorContextTests.swift | 6 +- .../Protocols/BridgeWireFormatTests.swift | 47 +++++ .../BLEPublicMessageHandlerTests.swift | 8 +- .../Services/BridgeServiceTests.swift | 174 ++++++++++++++++-- 10 files changed, 328 insertions(+), 44 deletions(-) create mode 100644 bitchat/Protocols/MeshMessageIdentity.swift diff --git a/bitchat/Nostr/NostrProtocol.swift b/bitchat/Nostr/NostrProtocol.swift index 39417883..41565fc9 100644 --- a/bitchat/Nostr/NostrProtocol.swift +++ b/bitchat/Nostr/NostrProtocol.swift @@ -264,22 +264,33 @@ struct NostrProtocol { /// Create a mesh-bridge public message (kind 20000) for a geohash-cell /// rendezvous. The distinct `r` tag keeps bridge traffic out of geohash - /// channel subscriptions (which filter on `#g`); `m` carries the original - /// mesh message ID so receivers dedup the bridged copy against the radio - /// copy by timeline ID. + /// channel subscriptions (which filter on `#g`); `m` is + /// `[stable ID, mesh sender ID, wire timestamp in ms]`. Element 1 is the + /// content-stable mesh message ID (`MeshMessageIdentity`) for v1.7.0 + /// parsers, which key their dedup on `m[1]` unconditionally and need it + /// per-message-unique; current parsers ignore it and recompute the ID + /// from the origin coordinates (elements 2-3) plus the event's own + /// content to dedup the bridged copy against the radio copy by + /// timeline ID. static func createBridgeMeshEvent( content: String, cell: String, senderIdentity: NostrIdentity, nickname: String? = nil, - meshMessageID: String? = nil + meshSenderID: String? = nil, + meshTimestampMs: UInt64? = nil ) throws -> NostrEvent { var tags = [["r", cell]] if let nickname = nickname?.trimmedOrNilIfEmpty { tags.append(["n", nickname]) } - if let meshMessageID = meshMessageID?.trimmedOrNilIfEmpty { - tags.append(["m", meshMessageID]) + if let meshSenderID = meshSenderID?.trimmedOrNilIfEmpty, let meshTimestampMs { + let stableID = MeshMessageIdentity.stableID( + senderIDHex: meshSenderID, + timestampMs: meshTimestampMs, + content: content + ) + tags.append(["m", stableID, meshSenderID, String(meshTimestampMs)]) } let event = NostrEvent( pubkey: senderIdentity.publicKeyHex, diff --git a/bitchat/Protocols/MeshMessageIdentity.swift b/bitchat/Protocols/MeshMessageIdentity.swift new file mode 100644 index 00000000..1696c001 --- /dev/null +++ b/bitchat/Protocols/MeshMessageIdentity.swift @@ -0,0 +1,35 @@ +// +// MeshMessageIdentity.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitFoundation +import Foundation + +/// Content-derived identity for public mesh messages. +/// +/// The BLE wire carries no message ID for public broadcasts, so every device +/// recomputes the same stable ID from the signed wire fields (sender ID, +/// millisecond timestamp, content). That gives the mesh bridge a +/// cross-device-consistent dedup/attribution key with zero wire change — and +/// because receivers derive the key themselves instead of trusting a claimed +/// ID, forging a bridge tag that binds a chosen ID to *different* content is +/// infeasible. The inputs are cleartext on the radio, though: an attacker in +/// radio range can re-sign the identical sender/timestamp/content under +/// their own Nostr key and win first-wins injection on remote islands — +/// duplicate-content spoofing the unbridged mesh already permits, so no +/// worse than before. +enum MeshMessageIdentity { + /// Matches the wire truncation in `BLEService.sendMessage`. + static func millisecondTimestamp(_ date: Date) -> UInt64 { + UInt64(date.timeIntervalSince1970 * 1000) + } + + static func stableID(senderIDHex: String, timestampMs: UInt64, content: String) -> String { + let input = senderIDHex.lowercased() + "|" + String(timestampMs) + "|" + content.trimmed + return String(Data(input.utf8).sha256Hex().prefix(32)) + } +} diff --git a/bitchat/Services/BLE/BLEPublicMessageHandler.swift b/bitchat/Services/BLE/BLEPublicMessageHandler.swift index 49699c81..7ff786be 100644 --- a/bitchat/Services/BLE/BLEPublicMessageHandler.swift +++ b/bitchat/Services/BLE/BLEPublicMessageHandler.swift @@ -122,10 +122,18 @@ final class BLEPublicMessageHandler { SecureLogger.debug("💬 [\(senderNickname)] TTL:\(packet.ttl) (\(pathTag)) chars=\(content.count) bytes=\(packet.payload.count)", category: .session) let ts = Date(timeIntervalSince1970: Double(packet.timestamp) / 1000) - var resolvedSelfMessageID: String? = nil + let messageID: String? if peerID == env.localPeerID() { - resolvedSelfMessageID = env.takeSelfBroadcastMessageID(packet) + messageID = env.takeSelfBroadcastMessageID(packet) + } else { + // The wire carries no message ID; derive the stable one every + // device agrees on so bridged copies dedup against the radio copy. + messageID = MeshMessageIdentity.stableID( + senderIDHex: peerID.id, + timestampMs: packet.timestamp, + content: content + ) } - env.deliverPublicMessage(peerID, senderNickname, content, ts, resolvedSelfMessageID) + env.deliverPublicMessage(peerID, senderNickname, content, ts, messageID) } } diff --git a/bitchat/Services/Gateway/BridgeService.swift b/bitchat/Services/Gateway/BridgeService.swift index fed06020..7f5d64c6 100644 --- a/bitchat/Services/Gateway/BridgeService.swift +++ b/bitchat/Services/Gateway/BridgeService.swift @@ -47,9 +47,11 @@ import Foundation /// already holds the radio copy (`isMessageSeenLocally` on the event's /// mesh message ID) — remote islands' traffic is the only thing worth /// airtime. -/// Receivers additionally dedup by timeline message ID: a bridged copy -/// carries the original mesh message ID in its `m` tag, so the store's -/// insert-by-ID absorbs radio/bridge duplicates in either arrival order. +/// Receivers additionally dedup by timeline message ID: the wire carries no +/// public message ID, so every device derives the same content-stable one +/// (`MeshMessageIdentity`) from the origin coordinates in the event's `m` +/// tag — recomputed locally, never trusted — and the store's insert-by-ID +/// absorbs radio/bridge duplicates in either arrival order. /// /// All dependencies are closure-injected (repo convention) so the policy /// layer is unit-testable without relays, radios, or CoreLocation. @@ -292,22 +294,32 @@ final class BridgeService: ObservableObject { /// Composes and ships the bridged copy of an outgoing public mesh /// message. Call after the radio send; no-op when the bridge is off, /// no cell is known, or the message was flagged nearby-only upstream. - func bridgeOutgoing(content: String, messageID: String) { + /// `senderPeerID`/`timestamp` are the origin coordinates of the radio + /// send — they (with the content) derive the cross-device-stable mesh + /// message ID that receivers dedup on. + func bridgeOutgoing(content: String, senderPeerID: PeerID, timestamp: Date) { guard isEnabled, !nearbyOnly, let cell = activeCell ?? currentCell() else { return } guard content.utf8.count <= Limits.maxContentBytes else { return } + let timestampMs = MeshMessageIdentity.millisecondTimestamp(timestamp) + let stableID = MeshMessageIdentity.stableID( + senderIDHex: senderPeerID.id, + timestampMs: timestampMs, + content: content + ) guard let identity = try? deriveIdentity?(cell), let event = try? NostrProtocol.createBridgeMeshEvent( content: content, cell: cell, senderIdentity: identity, nickname: myNickname?(), - meshMessageID: messageID + meshSenderID: senderPeerID.id, + meshTimestampMs: timestampMs ) else { SecureLogger.error("🌉 Bridge: failed to compose rendezvous event", category: .session) return } publishedEventIDs.insert(event.id) - injectedMessageIDs.insert(messageID) // our own timeline already has it + injectedMessageIDs.insert(stableID) // our own timeline already has it if relaysConnected?() ?? false { publishToRelays?(event, cell) } else if let carrier = NostrCarrierPacket(direction: .toBridge, geohash: cell, event: event), @@ -648,8 +660,25 @@ final class BridgeService: ObservableObject { let content = event.content guard !content.trimmed.isEmpty, content.utf8.count <= Limits.maxContentBytes else { return nil } let nickname = event.tags.first(where: { $0.count >= 2 && $0[0] == "n" })?[1] - let meshID = event.tags.first(where: { $0.count >= 2 && $0[0] == "m" })?[1] - let messageID = (meshID?.trimmedOrNilIfEmpty) ?? event.id + // Recompute — never trust — the mesh message ID: the `m` tag is + // `[stable ID, sender ID, wire timestamp ms]`. Element 1 exists + // for v1.7.0 parsers; we ignore it and derive the ID from the + // origin coordinates (elements 2-3) plus the event's own content, + // so a forged tag cannot bind a chosen ID to different content + // (see `MeshMessageIdentity` for the exact property and its + // limits). + let m = event.tags.first(where: { $0.count >= 2 && $0[0] == "m" }) + let messageID: String + if let m, m.count >= 4, m[2].count == 16, m[2].allSatisfy(\.isHexDigit), + let timestampMs = UInt64(m[3]) { + messageID = MeshMessageIdentity.stableID( + senderIDHex: m[2], + timestampMs: timestampMs, + content: content + ) + } else { + messageID = event.id // old-format or absent tag + } return .message(InboundBridgeMessage( messageID: messageID, senderNickname: nickname?.trimmedOrNilIfEmpty ?? "anon#\(event.pubkey.suffix(4))", diff --git a/bitchat/ViewModels/ChatOutgoingCoordinator.swift b/bitchat/ViewModels/ChatOutgoingCoordinator.swift index d0638ebd..1bb3e213 100644 --- a/bitchat/ViewModels/ChatOutgoingCoordinator.swift +++ b/bitchat/ViewModels/ChatOutgoingCoordinator.swift @@ -44,7 +44,10 @@ protocol ChatOutgoingContext: AnyObject { func sendGeohash(context: ChatViewModel.GeoOutgoingContext) /// Ships the bridged (rendezvous) copy of a just-sent public mesh /// message; no-op when the bridge is off or the send is nearby-only. - func bridgeOutgoingPublicMessage(_ content: String, messageID: String) + /// Takes the origin coordinates (sender + wire timestamp) — the bridge + /// derives the cross-device-stable mesh message ID from them, not from + /// our local timeline UUID (which no other device can recompute). + func bridgeOutgoingPublicMessage(_ content: String, senderPeerID: PeerID, timestamp: Date) // MARK: Geohash identity (shared with the other contexts) func deriveNostrIdentity(forGeohash geohash: String) throws -> NostrIdentity @@ -66,8 +69,8 @@ extension ChatViewModel: ChatOutgoingContext { lastPublicActivityAt[key] = Date() } - func bridgeOutgoingPublicMessage(_ content: String, messageID: String) { - BridgeService.shared.bridgeOutgoing(content: content, messageID: messageID) + func bridgeOutgoingPublicMessage(_ content: String, senderPeerID: PeerID, timestamp: Date) { + BridgeService.shared.bridgeOutgoing(content: content, senderPeerID: senderPeerID, timestamp: timestamp) } } @@ -147,7 +150,7 @@ private extension ChatOutgoingCoordinator { messageID: message.id, timestamp: message.timestamp ) - context.bridgeOutgoingPublicMessage(trimmed, messageID: message.id) + context.bridgeOutgoingPublicMessage(trimmed, senderPeerID: context.myPeerID, timestamp: message.timestamp) } /// Geohash sends mine a NIP-13 nonce tag first (off the main actor, see diff --git a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift index b6623f3a..2cd1b4a9 100644 --- a/bitchat/ViewModels/ChatPublicConversationCoordinator.swift +++ b/bitchat/ViewModels/ChatPublicConversationCoordinator.swift @@ -417,9 +417,12 @@ final class ChatPublicConversationCoordinator: PublicMessagePipelineDelegate { /// rate limit; low/no-PoW events keep the strict limits so old clients /// still get through at normal rates. /// Identity keys of the archived echoes seeded into the mesh timeline at - /// launch. The mesh wire format carries no stable message ID, so a - /// re-synced copy of an already-rendered echo arrives with a fresh UUID — - /// this content identity is the only way to recognize it. + /// launch. Re-synced copies of others' messages now arrive with the same + /// derived stable ID (`MeshMessageIdentity`), so the store's insert-by-ID + /// catches those — but the archive-restored rows themselves carry + /// `echo-`-prefixed IDs, and self echoes get fresh UUIDs, so this content + /// identity remains the way to recognize a live copy of an + /// already-rendered echo. private var archivedEchoKeys = Set() func registerArchivedEcho(senderPeerID: PeerID?, timestamp: Date, content: String) { diff --git a/bitchatTests/ChatOutgoingCoordinatorContextTests.swift b/bitchatTests/ChatOutgoingCoordinatorContextTests.swift index 28dabfa9..34963f0a 100644 --- a/bitchatTests/ChatOutgoingCoordinatorContextTests.swift +++ b/bitchatTests/ChatOutgoingCoordinatorContextTests.swift @@ -87,9 +87,9 @@ private final class MockChatOutgoingContext: ChatOutgoingContext { sentGeohashContexts.append(context) } - private(set) var bridgedMessages: [(content: String, messageID: String)] = [] - func bridgeOutgoingPublicMessage(_ content: String, messageID: String) { - bridgedMessages.append((content, messageID)) + private(set) var bridgedMessages: [(content: String, senderPeerID: PeerID, timestamp: Date)] = [] + func bridgeOutgoingPublicMessage(_ content: String, senderPeerID: PeerID, timestamp: Date) { + bridgedMessages.append((content, senderPeerID, timestamp)) } // Geohash identity diff --git a/bitchatTests/Protocols/BridgeWireFormatTests.swift b/bitchatTests/Protocols/BridgeWireFormatTests.swift index 95e56920..d4eddd0c 100644 --- a/bitchatTests/Protocols/BridgeWireFormatTests.swift +++ b/bitchatTests/Protocols/BridgeWireFormatTests.swift @@ -111,6 +111,53 @@ struct BridgeWireFormatTests { } } +@Suite("Mesh message identity") +struct MeshMessageIdentityTests { + @Test func stableIDIsDeterministicHex() { + let id = MeshMessageIdentity.stableID( + senderIDHex: "0011223344556677", + timestampMs: 1_750_000_000_123, + content: "hello mesh" + ) + // Pinned vector: first 32 hex chars of + // SHA256("0011223344556677|1750000000123|hello mesh"). Any drift + // breaks cross-device (and cross-version) dedup. + #expect(id == "b83f94d81dcdd1b0c0048f6645995dd4") + #expect(id == MeshMessageIdentity.stableID( + senderIDHex: "0011223344556677", + timestampMs: 1_750_000_000_123, + content: "hello mesh" + )) + } + + @Test func senderIDIsCaseInsensitive() { + let lower = MeshMessageIdentity.stableID(senderIDHex: "aabbccdd00112233", timestampMs: 1, content: "x") + let upper = MeshMessageIdentity.stableID(senderIDHex: "AABBCCDD00112233", timestampMs: 1, content: "x") + #expect(lower == upper) + } + + @Test func contentWhitespaceIsNormalized() { + // Senders bridge the trimmed content while the radio carries the + // original; both must derive the same key. + let raw = MeshMessageIdentity.stableID(senderIDHex: "aabbccdd00112233", timestampMs: 1, content: " hello mesh \n") + let trimmed = MeshMessageIdentity.stableID(senderIDHex: "aabbccdd00112233", timestampMs: 1, content: "hello mesh") + #expect(raw == trimmed) + } + + @Test func anyCoordinateChangeChangesTheID() { + let base = MeshMessageIdentity.stableID(senderIDHex: "aabbccdd00112233", timestampMs: 5, content: "x") + #expect(base != MeshMessageIdentity.stableID(senderIDHex: "aabbccdd00112234", timestampMs: 5, content: "x")) + #expect(base != MeshMessageIdentity.stableID(senderIDHex: "aabbccdd00112233", timestampMs: 6, content: "x")) + #expect(base != MeshMessageIdentity.stableID(senderIDHex: "aabbccdd00112233", timestampMs: 5, content: "y")) + } + + @Test func millisecondTimestampTruncatesLikeTheWire() { + // Must match `BLEService.sendMessage`'s UInt64(seconds * 1000). + #expect(MeshMessageIdentity.millisecondTimestamp(Date(timeIntervalSince1970: 1_000.9996)) == 1_000_999) + #expect(MeshMessageIdentity.millisecondTimestamp(Date(timeIntervalSince1970: 1_000)) == 1_000_000) + } +} + @Suite("Courier store bridge publish") struct CourierStoreBridgePublishTests { private func makeStore(now: @escaping () -> Date = Date.init) -> CourierStore { diff --git a/bitchatTests/Services/BLEPublicMessageHandlerTests.swift b/bitchatTests/Services/BLEPublicMessageHandlerTests.swift index 74a4441d..4e9b027b 100644 --- a/bitchatTests/Services/BLEPublicMessageHandlerTests.swift +++ b/bitchatTests/Services/BLEPublicMessageHandlerTests.swift @@ -83,7 +83,13 @@ struct BLEPublicMessageHandlerTests { #expect(recorder.deliveries.first?.nickname == "Alice") #expect(recorder.deliveries.first?.content == "hello mesh") #expect(recorder.deliveries.first?.timestamp == now) - #expect(recorder.deliveries.first?.messageID == nil) + // No message ID on the wire: the handler derives the stable one + // every device agrees on for the same sender/timestamp/content. + #expect(recorder.deliveries.first?.messageID == MeshMessageIdentity.stableID( + senderIDHex: remotePeerID.id, + timestampMs: timestamp(now), + content: "hello mesh" + )) } @Test diff --git a/bitchatTests/Services/BridgeServiceTests.swift b/bitchatTests/Services/BridgeServiceTests.swift index 31107310..dd813636 100644 --- a/bitchatTests/Services/BridgeServiceTests.swift +++ b/bitchatTests/Services/BridgeServiceTests.swift @@ -117,21 +117,35 @@ struct BridgeServiceTests { // MARK: Event helpers + private static let remoteMeshSenderID = "feedfacecafef00d" + private static let remoteMeshTimestampMs: UInt64 = 1_750_000_000_000 + private func makeRemoteEvent( cell: String = BridgeServiceTests.cell, content: String = "hi \(UUID().uuidString.prefix(8))", - meshMessageID: String? = UUID().uuidString + meshSenderID: String = BridgeServiceTests.remoteMeshSenderID, + meshTimestampMs: UInt64 = BridgeServiceTests.remoteMeshTimestampMs, + identity: NostrIdentity? = nil ) throws -> NostrEvent { - let identity = try NostrIdentity.generate() - return try NostrProtocol.createBridgeMeshEvent( + try NostrProtocol.createBridgeMeshEvent( content: content, cell: cell, - senderIdentity: identity, + senderIdentity: identity ?? NostrIdentity.generate(), nickname: "remote", - meshMessageID: meshMessageID + meshSenderID: meshSenderID, + meshTimestampMs: meshTimestampMs ) } + /// The dedup key receivers derive for an event built by `makeRemoteEvent`. + private func stableID( + content: String, + meshSenderID: String = BridgeServiceTests.remoteMeshSenderID, + meshTimestampMs: UInt64 = BridgeServiceTests.remoteMeshTimestampMs + ) -> String { + MeshMessageIdentity.stableID(senderIDHex: meshSenderID, timestampMs: meshTimestampMs, content: content) + } + private func makePresenceEvent(cell: String = BridgeServiceTests.cell) throws -> NostrEvent { try NostrProtocol.createBridgePresenceEvent(cell: cell, senderIdentity: NostrIdentity.generate()) } @@ -201,28 +215,64 @@ struct BridgeServiceTests { // MARK: - Outgoing - @Test func outgoingPublishesSignedRendezvousEventWithMeshMessageID() throws { + @Test func outgoingPublishesSignedRendezvousEventWithOriginCoordinates() throws { let fixture = Fixture(enabled: true) fixture.service.refreshRendezvous() - let messageID = UUID().uuidString + let sender = PeerID(str: "0011223344556677") + let timestamp = Date() - fixture.service.bridgeOutgoing(content: "hello hill", messageID: messageID) + fixture.service.bridgeOutgoing(content: "hello hill", senderPeerID: sender, timestamp: timestamp) let published = try #require(fixture.published.last) #expect(published.cell == Self.cell) #expect(published.event.isValidSignature()) #expect(published.event.content == "hello hill") #expect(published.event.tags.contains(["r", Self.cell])) - #expect(published.event.tags.contains(["m", messageID])) + let timestampMs = MeshMessageIdentity.millisecondTimestamp(timestamp) + #expect(published.event.tags.contains([ + "m", + MeshMessageIdentity.stableID(senderIDHex: sender.id, timestampMs: timestampMs, content: "hello hill"), + sender.id, + String(timestampMs), + ])) #expect(published.event.tags.contains(["n", "tester"])) } + @Test func newMeshTagStaysPerMessageUniqueForOldParsers() throws { + // v1.7.0 parsers take m[1] unconditionally as the dedup key whenever + // the tag has >= 2 elements. A constant m[1] (e.g. the bare sender + // ID) would make old receivers inject-dedup away every message from + // a sender after their first — so element 1 must be the + // per-message-unique stable ID itself. + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let sender = PeerID(str: "0011223344556677") + let timestamp = Date() + + fixture.service.bridgeOutgoing(content: "first", senderPeerID: sender, timestamp: timestamp) + fixture.service.bridgeOutgoing(content: "second", senderPeerID: sender, timestamp: timestamp) + + // Old-parser extraction: m[1] of the first `m` tag with >= 2 elements. + let oldParserKeys = fixture.publishedMessages.compactMap { + $0.event.tags.first(where: { $0.count >= 2 && $0[0] == "m" })?[1] + } + #expect(oldParserKeys.count == 2) + #expect(oldParserKeys[0] != oldParserKeys[1]) + // And old and new receivers key the same message identically: m[1] + // equals the ID the new parser recomputes from elements 2-3. + let timestampMs = MeshMessageIdentity.millisecondTimestamp(timestamp) + #expect(oldParserKeys == [ + MeshMessageIdentity.stableID(senderIDHex: sender.id, timestampMs: timestampMs, content: "first"), + MeshMessageIdentity.stableID(senderIDHex: sender.id, timestampMs: timestampMs, content: "second"), + ]) + } + @Test func nearbyOnlySuppressesTheBridgedCopy() { let fixture = Fixture(enabled: true) fixture.service.refreshRendezvous() fixture.service.nearbyOnly = true - fixture.service.bridgeOutgoing(content: "just us", messageID: UUID().uuidString) + fixture.service.bridgeOutgoing(content: "just us", senderPeerID: PeerID(str: "0011223344556677"), timestamp: Date()) #expect(fixture.publishedMessages.isEmpty) #expect(fixture.uplinkSends.isEmpty) @@ -234,7 +284,7 @@ struct BridgeServiceTests { fixture.relaysConnected = false fixture.bridgePeers = [PeerID(str: "abcdef0123456789")] - fixture.service.bridgeOutgoing(content: "no internet here", messageID: UUID().uuidString) + fixture.service.bridgeOutgoing(content: "no internet here", senderPeerID: PeerID(str: "0011223344556677"), timestamp: Date()) #expect(fixture.publishedMessages.isEmpty) let sent = try #require(fixture.uplinkSends.first) @@ -255,7 +305,8 @@ struct BridgeServiceTests { cell: Self.cell, senderIdentity: fixture.identity, // == deriveIdentity(cell) nickname: "tester", - meshMessageID: UUID().uuidString + meshSenderID: "0011223344556677", + meshTimestampMs: Self.remoteMeshTimestampMs ) fixture.service.handleRendezvousEvent(ownOldEvent) @@ -268,7 +319,7 @@ struct BridgeServiceTests { @Test func ownEventComingBackFromSubscriptionIsIgnored() { let fixture = Fixture(enabled: true) fixture.service.refreshRendezvous() - fixture.service.bridgeOutgoing(content: "echo me", messageID: UUID().uuidString) + fixture.service.bridgeOutgoing(content: "echo me", senderPeerID: PeerID(str: "0011223344556677"), timestamp: Date()) let ownEvent = fixture.published[0].event fixture.service.handleRendezvousEvent(ownEvent) @@ -343,9 +394,10 @@ struct BridgeServiceTests { @Test func locallySeenMessageIsNeitherInjectedNorDownlinked() throws { let fixture = Fixture(enabled: true) fixture.service.refreshRendezvous() - let messageID = UUID().uuidString - fixture.locallySeenMessageIDs = [messageID] - let event = try makeRemoteEvent(meshMessageID: messageID) + let content = "heard on the radio" + // The radio copy's timeline row keys on the same derived stable ID. + fixture.locallySeenMessageIDs = [stableID(content: content)] + let event = try makeRemoteEvent(content: content) fixture.service.handleRendezvousEvent(event) @@ -357,6 +409,96 @@ struct BridgeServiceTests { #expect(fixture.service.bridgedPeerCount == 0) } + @Test func radioConfirmedSenderStaysLocalForLaterEvents() throws { + // Sticky local attribution keyed on the derived stable ID: one + // radio-confirmed message marks the pubkey as an islander, so their + // later events never inflate the bridged count. + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let identity = try NostrIdentity.generate() + let content = "island echo" + fixture.locallySeenMessageIDs = [stableID(content: content)] + + fixture.service.handleRendezvousEvent(try makeRemoteEvent(content: content, identity: identity)) + #expect(fixture.service.bridgedPeerCount == 0) + + fixture.service.handleRendezvousEvent(try makeRemoteEvent( + content: "not on the radio yet", + meshTimestampMs: Self.remoteMeshTimestampMs + 1, + identity: identity + )) + #expect(fixture.service.bridgedPeerCount == 0) + } + + @Test func spoofedOriginCoordinatesCannotSuppressTheGenuineMessage() throws { + // Attack: sign an event claiming a victim's origin coordinates in the + // `m` tag to pre-poison the dedup key. The key is recomputed from the + // event's own content, so the spoof lands under a different ID and the + // genuine message still renders. + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let spoof = try makeRemoteEvent(content: "impostor payload") + let genuine = try makeRemoteEvent(content: "the real message") + + fixture.service.handleRendezvousEvent(spoof) + fixture.service.handleRendezvousEvent(genuine) + + #expect(fixture.injected.count == 2) + #expect(fixture.injected.map(\.messageID) == [ + stableID(content: "impostor payload"), + stableID(content: "the real message"), + ]) + } + + @Test func forgedStableIDElementIsNeverTrusted() throws { + // Element 1 of the `m` tag exists only for old parsers. An event + // claiming the genuine message's stable ID there — over different + // content — must still key on its own derived ID, so it cannot + // pre-poison the genuine message's dedup slot. + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let genuineID = stableID(content: "the real message") + let identity = try NostrIdentity.generate() + let forged = try NostrEvent( + pubkey: identity.publicKeyHex, + createdAt: Date(), + kind: .ephemeralEvent, + tags: [ + ["r", Self.cell], + ["m", genuineID, Self.remoteMeshSenderID, String(Self.remoteMeshTimestampMs)], + ], + content: "impostor payload" + ).sign(with: identity.schnorrSigningKey()) + let genuine = try makeRemoteEvent(content: "the real message") + + fixture.service.handleRendezvousEvent(forged) + fixture.service.handleRendezvousEvent(genuine) + + #expect(fixture.injected.map(\.messageID) == [ + stableID(content: "impostor payload"), + genuineID, + ]) + } + + @Test func oldFormatMeshTagFallsBackToEventID() throws { + // A 2-element `m` tag from an old sender carries an ID no other + // device can recompute; the event ID keeps today's behavior. + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let identity = try NostrIdentity.generate() + let legacy = try NostrEvent( + pubkey: identity.publicKeyHex, + createdAt: Date(), + kind: .ephemeralEvent, + tags: [["r", Self.cell], ["m", UUID().uuidString]], + content: "legacy copy" + ).sign(with: identity.schnorrSigningKey()) + + fixture.service.handleRendezvousEvent(legacy) + + #expect(fixture.injected.map(\.messageID) == [legacy.id]) + } + @Test func duplicateSubscriptionEventInjectsOnce() throws { let fixture = Fixture(enabled: true) fixture.service.refreshRendezvous() From c8479c15e316f53ee5a6f8ccccd4be607f5be011 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:45:45 +0200 Subject: [PATCH 070/158] PTT hardening: per-peer burst keys + live-capture storage quota (#1420) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * PTT hardening: burst-ID collision hijack + live-capture quota bypass Fix C — burst-ID collision hijack: inbound live-voice assemblies and the finished-burst registry were keyed by the sender-chosen burst ID alone, so an attacker who observed a public burst ID could race a START and capture the real talker's frames (packets from the true sender were dropped as "collisions"). Assemblies now key on (peerID, scope, burstID): a colliding START from another peer opens its own capped assembly and can never divert the victim's frames; finalized-note absorption matches on the same triple, preserving the sender/scope binding. Live capture files also gain the peer ID in their name so colliding bursts land on distinct paths (still rejected by burstID(fromVoiceFileName:), so live names remain unabsorbable). Fix B — live-burst files bypassed the incoming-media quota: progressive voice_live_*.aac captures were written via raw FileHandle without ever touching BLEIncomingFileStore.enforceQuota, growing disk unbounded outside the 100 MB LRU accounting. The coordinator now takes an injected BLEIncomingFileStore, reserves pttMaxBurstBytes before opening a capture, and sweeps orphaned voice_live_* partials from previous sessions at startup. enforceQuota gains an `excluding:` set so in-flight partials are never LRU-evicted mid-stream; existing callers are unaffected. Co-Authored-By: Claude Opus 4.8 * Review fixes: pattern-guard live captures in quota, scope in capture names Quota-eviction gap: BLEFileTransferHandler enforces the quota for every finalized arrival via enforceQuota(reservingBytes:) with no exclusion set, so a file landing at quota could LRU-evict an in-flight live capture — unlinking the inode under the coordinator's open FileHandle and leaving a dead bubble. Protection is now layer-independent: enforceQuota itself skips voice_live_* names (they still count toward usage), and the excluding: parameter is gone since the pattern guard covers its only caller. Orphaned partials are still reclaimed by the coordinator's startup sweep, which the quota deliberately never touches. Same-peer cross-scope truncation: makeIncomingURL omitted the scope, so one peer running a DM burst and a public burst with the same burst ID mapped both assemblies onto one path — and FileManager.createFile truncates, so each START corrupted the other capture. Names now mirror the assembly key: voice_live___.aac. The sweep and quota guard match on the voice_live_ prefix and burstID(fromVoiceFileName:) still rejects every live name, so live captures remain unabsorbable; sameBurstIDCoexistsAcrossScopes now asserts both files survive with intact contents. Nits: the coordinator's file operations route through the store's injectable FileManager instead of FileManager.default, and the TestEnvironment.isRunningTests branch in init is replaced by a sweepsOnInit parameter (tests sharing the real application-support directory pass false for hermeticity). Co-Authored-By: Claude Fable 5 * Promote kept live captures off the voice_live_ name at finalize Codex P1 follow-up: when a burst finalizes with frames but its .m4a note never arrives, the voice_live_*.aac capture stays behind as the bubble's replayable audio — yet the startup sweep deletes every voice_live_* file and the quota guard skips them forever, so a kept fallback was both quota-immune for the rest of the session and doomed at the next launch. finalize now promotes the capture to a plain voice_ name (same suffix) and republishes the row pointing at it; the finished-burst registry tracks the promoted URL so a late note still absorbs and deletes it. voice_live_ is thereby scoped to genuinely in-flight captures: the sweep never touches a referenced fallback, and promoted files age out of the quota like any finalized media. If the move fails the live name is kept — exactly the pre-promotion behavior. Premise correction, verified while tracing the reference model: chat rows are NOT persisted across restarts (ConversationStore is in-memory; the gossip archive replays MessageType.message packets only), so today's sweep never orphaned a persisted row — the fix removes the in-session quota immunity and makes the invariant hold if row persistence ever lands. Crash case stays deliberate and documented: a mid-burst partial from a dead process is swept because no surviving row can reference it. Tests: finalize-as-fallback promotes the file, repoints the row, and survives a later coordinator's startup sweep; promoted fallbacks are LRU-evictable by the quota; the sweep still removes true orphans while sparing promoted names; existing burst tests updated for the promoted paths. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Opus 4.8 --- .../Services/BLE/BLEIncomingFileStore.swift | 25 +- .../ViewModels/ChatLiveVoiceCoordinator.swift | 201 +++++++--- .../ChatLiveVoiceCoordinatorTests.swift | 355 ++++++++++++++++-- .../BLEFileTransferHandlerTests.swift | 28 ++ 4 files changed, 534 insertions(+), 75 deletions(-) diff --git a/bitchat/Services/BLE/BLEIncomingFileStore.swift b/bitchat/Services/BLE/BLEIncomingFileStore.swift index 3379cfe5..214c3ba2 100644 --- a/bitchat/Services/BLE/BLEIncomingFileStore.swift +++ b/bitchat/Services/BLE/BLEIncomingFileStore.swift @@ -5,7 +5,16 @@ import Foundation struct BLEIncomingFileStore { private static let quotaBytes: Int64 = 100 * 1024 * 1024 - private let fileManager: FileManager + /// Name prefix of in-flight live voice captures (progressively written by + /// `ChatLiveVoiceCoordinator`). Quota eviction skips them by pattern — + /// deleting one mid-stream unlinks the inode under an open `FileHandle` + /// and kills playback — and the coordinator's startup sweep deletes any + /// orphans a previous session left behind. + static let liveCapturePrefix = "voice_live_" + + /// Exposed so callers that write progressively into the store's + /// directories (live voice captures) share the same file manager. + let fileManager: FileManager private let baseDirectory: URL? private let dateProvider: () -> Date @@ -15,6 +24,14 @@ struct BLEIncomingFileStore { self.dateProvider = dateProvider } + /// Resolves (and creates) an incoming-media directory for callers that + /// write progressively instead of via `save` (live voice captures). + func incomingDirectory(subdirectory: String) throws -> URL { + let directory = try filesDirectory().appendingPathComponent(subdirectory, isDirectory: true) + try fileManager.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil) + return directory + } + func save( data: Data, preferredName: String?, @@ -39,6 +56,11 @@ struct BLEIncomingFileStore { } } + /// Frees least-recently-modified incoming files until `reservingBytes` + /// fits under the quota. Files named `voice_live_*` (in-flight live + /// captures) are never evicted regardless of who triggers enforcement — + /// a finalized transfer can arrive at quota while a burst is still + /// streaming — but they still count toward usage. func enforceQuota(reservingBytes: Int) { do { let base = try filesDirectory() @@ -72,6 +94,7 @@ struct BLEIncomingFileStore { var freedSpace: Int64 = 0 for file in allFiles.sorted(by: { $0.modified < $1.modified }) { guard freedSpace < needToFree else { break } + guard !file.url.lastPathComponent.hasPrefix(Self.liveCapturePrefix) else { continue } do { try fileManager.removeItem(at: file.url) freedSpace += file.size diff --git a/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift b/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift index 62f13653..8f4baded 100644 --- a/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift +++ b/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift @@ -59,7 +59,7 @@ extension ChatViewModel: ChatLiveVoiceContext { } /// Where a live voice burst lives: a Noise DM or the public mesh timeline. -enum VoiceBurstScope: Equatable { +enum VoiceBurstScope: Hashable { case directMessage case publicMesh } @@ -72,6 +72,16 @@ enum VoiceBurstScope: Equatable { /// bubble so nobody sees a duplicate. @MainActor final class ChatLiveVoiceCoordinator { + /// Burst IDs are sender-chosen, so they only identify a burst *within* + /// an authenticated (peer, scope) pair: keying assemblies by the full + /// triple stops an attacker who observed a public burst ID from racing + /// a START to capture the real talker's frames. + private struct AssemblyKey: Hashable { + let peerID: PeerID + let scope: VoiceBurstScope + let burstID: Data + } + private final class Assembly { let burstID: Data let peerID: PeerID @@ -97,6 +107,8 @@ final class ChatLiveVoiceCoordinator { var idleTimeout: Task? var gapRedrain: Task? + var key: AssemblyKey { AssemblyKey(peerID: peerID, scope: scope, burstID: burstID) } + init(burstID: Data, peerID: PeerID, scope: VoiceBurstScope, nickname: String, message: BitchatMessage, fileURL: URL, fileHandle: FileHandle) { self.burstID = burstID self.peerID = peerID @@ -123,11 +135,26 @@ final class ChatLiveVoiceCoordinator { private static let finishedBurstsCap = 32 private unowned let context: any ChatLiveVoiceContext - private var assemblies: [Data: Assembly] = [:] - private var finishedBursts: [Data: FinishedBurst] = [:] + private let fileStore: BLEIncomingFileStore + /// Captures live in the store's directories, so file operations go + /// through the store's (injectable) file manager. + private var fileManager: FileManager { fileStore.fileManager } + private var assemblies: [AssemblyKey: Assembly] = [:] + private var finishedBursts: [AssemblyKey: FinishedBurst] = [:] - init(context: any ChatLiveVoiceContext) { + /// `sweepsOnInit` exists for tests whose coordinator shares the real + /// application-support directory: they pass `false` so parallel test + /// runs never sweep each other's in-flight capture files. + init(context: any ChatLiveVoiceContext, fileStore: BLEIncomingFileStore = BLEIncomingFileStore(), sweepsOnInit: Bool = true) { self.context = context + self.fileStore = fileStore + // Orphaned partial captures from a previous session (live-only bursts + // whose finalized note never arrived) are dead weight the quota can + // never reclaim (eviction skips voice_live_* by design) — sweep them + // on startup. + if sweepsOnInit { + sweepStaleLiveCaptures() + } } // MARK: - Inbound frames @@ -160,11 +187,12 @@ final class ChatLiveVoiceCoordinator { return } - if let assembly = assemblies[packet.burstID] { - // The sender is authenticated (Noise session or packet - // signature); a different peer or scope reusing the same burst - // ID is a collision or a replay — drop it. - guard assembly.peerID == peerID, assembly.scope == scope else { return } + // The sender is authenticated (Noise session or packet signature), + // and the key binds the burst ID to that (peer, scope): a colliding + // START from another peer opens its own assembly instead of + // capturing this one's frames. + let key = AssemblyKey(peerID: peerID, scope: scope, burstID: packet.burstID) + if let assembly = assemblies[key] { apply(packet, to: assembly) return } @@ -178,7 +206,7 @@ final class ChatLiveVoiceCoordinator { return } guard let assembly = makeAssembly(burstID: packet.burstID, peerID: peerID, scope: scope, nickname: nickname, timestamp: timestamp) else { return } - assemblies[packet.burstID] = assembly + assemblies[key] = assembly updatePublicTalkerIndicator() apply(packet, to: assembly) case .end, .canceled: @@ -203,17 +231,25 @@ final class ChatLiveVoiceCoordinator { let burstID = Self.burstID(fromVoiceFileName: String(message.content.dropFirst(prefix.count))) else { return false } + // Bind the note to the burst's authenticated sender and scope: an + // attacker's burst reusing the same ID lives under its own key and + // never matches the real sender's note (registry is capped at + // `finishedBurstsCap`, so the linear scan is cheap). + func matches(_ key: AssemblyKey) -> Bool { + key.burstID == burstID + && (message.senderPeerID == nil || key.peerID == message.senderPeerID) + && message.isPrivate == (key.scope == .directMessage) + } + // The note usually lands after END, but a lost END or a fast transfer // can beat it — close out the live assembly first. - if let assembly = assemblies[burstID] { + if let assembly = assemblies.first(where: { matches($0.key) })?.value { finalize(assembly) } pruneFinishedBursts() - guard let finished = finishedBursts[burstID] else { return false } - // Bind the note to the burst's authenticated sender and scope. - guard message.senderPeerID == nil || message.senderPeerID == finished.peerID else { return false } - guard message.isPrivate == (finished.scope == .directMessage) else { return false } + guard let entry = finishedBursts.first(where: { matches($0.key) }) else { return false } + let finished = entry.value let replacement = BitchatMessage( id: finished.messageID, @@ -237,8 +273,8 @@ final class ChatLiveVoiceCoordinator { // The complete .m4a replaces the partial live capture. WaveformCache.shared.purge(url: finished.fileURL) - try? FileManager.default.removeItem(at: finished.fileURL) - finishedBursts.removeValue(forKey: burstID) + try? fileManager.removeItem(at: finished.fileURL) + finishedBursts.removeValue(forKey: entry.key) context.notifyUIChanged() SecureLogger.debug("PTT: absorbed finalized note for burst \(burstID.hexEncodedString())", category: .session) @@ -248,14 +284,19 @@ final class ChatLiveVoiceCoordinator { // MARK: - Assembly lifecycle private func makeAssembly(burstID: Data, peerID: PeerID, scope: VoiceBurstScope, nickname: String, timestamp: Date) -> Assembly? { - guard let fileURL = Self.makeIncomingURL(burstID: burstID) else { + guard let fileURL = makeIncomingURL(burstID: burstID, peerID: peerID, scope: scope) else { SecureLogger.error("PTT: cannot resolve incoming media directory for burst \(burstID.hexEncodedString())", category: .session) return nil } - FileManager.default.createFile(atPath: fileURL.path, contents: nil) + // BCH-01-002: live captures share the incoming-media quota with + // finalized transfers; reserve the burst's worst case up front. + // Eviction skips voice_live_* names, so partials still streaming in + // are safe no matter which caller triggers enforcement. + fileStore.enforceQuota(reservingBytes: TransportConfig.pttMaxBurstBytes) + fileManager.createFile(atPath: fileURL.path, contents: nil) guard let handle = try? FileHandle(forWritingTo: fileURL) else { SecureLogger.error("PTT: cannot open capture file for burst \(burstID.hexEncodedString())", category: .session) - try? FileManager.default.removeItem(at: fileURL) + try? fileManager.removeItem(at: fileURL) return nil } @@ -413,13 +454,13 @@ final class ChatLiveVoiceCoordinator { } try? assembly.fileHandle?.close() assembly.fileHandle = nil - assemblies.removeValue(forKey: assembly.burstID) + assemblies.removeValue(forKey: assembly.key) updatePublicTalkerIndicator() guard assembly.deliveredFrames > 0 else { // Nothing audible ever arrived — drop the empty bubble. removeBubble(of: assembly) - try? FileManager.default.removeItem(at: assembly.fileURL) + try? fileManager.removeItem(at: assembly.fileURL) context.notifyUIChanged() return } @@ -427,16 +468,22 @@ final class ChatLiveVoiceCoordinator { assembly.player?.finishAfterDrain() // The bubble's waveform may have been computed from a partial file. WaveformCache.shared.purge(url: assembly.fileURL) - // Republish so the row re-renders without its LIVE treatment even if - // no finalized note ever arrives to swap in. - republishBubble(of: assembly) + // The capture is the bubble's replayable audio from here on (unless a + // finalized note arrives to swap in): move it off its voice_live_ + // name so only genuinely in-flight files match the startup sweep and + // the quota's live-capture guard — a kept fallback is never swept, + // and it ages out of the quota like any finalized media. + let fileURL = promoteToFallback(assembly.fileURL) + // Republish so the row re-renders without its LIVE treatment — and + // points at the promoted file — even if no note ever arrives. + republishBubble(of: assembly, fileURL: fileURL) pruneFinishedBursts() - finishedBursts[assembly.burstID] = FinishedBurst( + finishedBursts[assembly.key] = FinishedBurst( messageID: assembly.messageID, peerID: assembly.peerID, scope: assembly.scope, - fileURL: assembly.fileURL, + fileURL: fileURL, messageTimestamp: assembly.messageTimestamp, expiresAt: Date().addingTimeInterval(TransportConfig.pttFinishedBurstRegistrySeconds) ) @@ -453,12 +500,48 @@ final class ChatLiveVoiceCoordinator { } } - private func republishBubble(of assembly: Assembly) { + private func republishBubble(of assembly: Assembly, fileURL: URL) { + // Same row (same ID), content re-pointed at `fileURL`; the delivery + // status is carried over because the inbound pipeline may have + // updated it on the shared original. + let message = BitchatMessage( + id: assembly.messageID, + sender: assembly.nickname, + content: "\(MimeType.Category.audio.messagePrefix)\(fileURL.lastPathComponent)", + timestamp: assembly.messageTimestamp, + isRelay: false, + isPrivate: assembly.scope == .directMessage, + recipientNickname: assembly.scope == .directMessage ? context.nickname : nil, + senderPeerID: assembly.peerID, + deliveryStatus: assembly.message.deliveryStatus + ) switch assembly.scope { case .directMessage: - context.upsertPrivateMessage(assembly.message, in: assembly.peerID) + context.upsertPrivateMessage(message, in: assembly.peerID) case .publicMesh: - context.upsertPublicMeshMessage(assembly.message) + context.upsertPublicMeshMessage(message) + } + } + + /// Moves a finished capture off its `voice_live_` prefix (onto plain + /// `voice_`), so the in-flight patterns — the startup sweep and the + /// quota's eviction guard — only ever match captures still streaming in. + /// On failure the live name is kept: worst case the file is reclaimed at + /// the next startup, exactly the pre-promotion behavior. + private func promoteToFallback(_ liveURL: URL) -> URL { + let liveName = liveURL.lastPathComponent + guard liveName.hasPrefix(BLEIncomingFileStore.liveCapturePrefix) else { return liveURL } + let fallbackName = "voice_" + liveName.dropFirst(BLEIncomingFileStore.liveCapturePrefix.count) + let destination = liveURL.deletingLastPathComponent().appendingPathComponent(fallbackName) + do { + // A leftover from an earlier burst that reused the same + // (peer, scope, burstID) triple would block the move. + try? fileManager.removeItem(at: destination) + try fileManager.moveItem(at: liveURL, to: destination) + return destination + } catch { + SecureLogger.warning("PTT: keeping live-capture name for finished burst — promotion failed: \(error)", category: .session) + return liveURL } } @@ -468,11 +551,11 @@ final class ChatLiveVoiceCoordinator { assembly.player?.stop() try? assembly.fileHandle?.close() assembly.fileHandle = nil - assemblies.removeValue(forKey: assembly.burstID) + assemblies.removeValue(forKey: assembly.key) updatePublicTalkerIndicator() removeBubble(of: assembly) WaveformCache.shared.purge(url: assembly.fileURL) - try? FileManager.default.removeItem(at: assembly.fileURL) + try? fileManager.removeItem(at: assembly.fileURL) context.notifyUIChanged() } @@ -480,10 +563,10 @@ final class ChatLiveVoiceCoordinator { private func rescheduleIdleTimeout(for assembly: Assembly) { assembly.idleTimeout?.cancel() - let burstID = assembly.burstID + let key = assembly.key assembly.idleTimeout = Task { @MainActor [weak self] in try? await Task.sleep(nanoseconds: UInt64(TransportConfig.pttBurstEndTimeoutSeconds * 1_000_000_000)) - guard !Task.isCancelled, let self, let assembly = self.assemblies[burstID] else { return } + guard !Task.isCancelled, let self, let assembly = self.assemblies[key] else { return } // Talker went silent/out of range without an END. self.finalize(assembly) } @@ -491,10 +574,10 @@ final class ChatLiveVoiceCoordinator { private func scheduleGapRedrain(for assembly: Assembly) { assembly.gapRedrain?.cancel() - let burstID = assembly.burstID + let key = assembly.key assembly.gapRedrain = Task { @MainActor [weak self] in try? await Task.sleep(nanoseconds: UInt64((Self.gapSkipSeconds + 0.05) * 1_000_000_000)) - guard !Task.isCancelled, let self, let assembly = self.assemblies[burstID] else { return } + guard !Task.isCancelled, let self, let assembly = self.assemblies[key] else { return } self.drainInOrder(assembly) self.finalizeIfComplete(assembly) } @@ -521,21 +604,37 @@ final class ChatLiveVoiceCoordinator { return Data(hexString: hex) } - private static func makeIncomingURL(burstID: Data) -> URL? { - guard let base = try? FileManager.default.url( - for: .applicationSupportDirectory, - in: .userDomainMask, - appropriateFor: nil, - create: true - ) else { return nil } - let directory = base - .appendingPathComponent("files", isDirectory: true) - .appendingPathComponent("\(MimeType.Category.audio.mediaDir)/incoming", isDirectory: true) - do { - try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil) - } catch { - return nil + private static let incomingSubdirectory = "\(MimeType.Category.audio.mediaDir)/incoming" + + /// The peer ID and scope in the name mirror the assembly key: colliding + /// burst IDs from different senders — or from the same sender across DM + /// and public — land on distinct files instead of truncating each other. + /// `burstID(fromVoiceFileName:)` still rejects every `voice_live_*` name, + /// so live captures can never absorb a note. + private func makeIncomingURL(burstID: Data, peerID: PeerID, scope: VoiceBurstScope) -> URL? { + guard let directory = try? fileStore.incomingDirectory(subdirectory: Self.incomingSubdirectory) else { return nil } + let scopeTag = scope == .directMessage ? "dm" : "mesh" + return directory.appendingPathComponent("\(BLEIncomingFileStore.liveCapturePrefix)\(burstID.hexEncodedString())_\(peerID.id)_\(scopeTag).aac") + } + + /// Deletes partial live captures left behind by a previous session. + /// In-session cleanup needs no sweep: absorb, cancel, and empty-finalize + /// delete their capture file, and finalize promotes keepers off the + /// `voice_live_` name. So anything the sweep matches was orphaned by a + /// crash mid-burst — safe to delete, because chat rows are in-memory + /// only (ConversationStore never persists; the gossip archive replays + /// `MessageType.message` packets only), so no row from a previous + /// process can reference the file. + private func sweepStaleLiveCaptures() { + guard let directory = try? fileStore.incomingDirectory(subdirectory: Self.incomingSubdirectory), + let contents = try? fileManager.contentsOfDirectory( + at: directory, + includingPropertiesForKeys: nil, + options: [.skipsHiddenFiles] + ) + else { return } + for url in contents where url.lastPathComponent.hasPrefix(BLEIncomingFileStore.liveCapturePrefix) && url.pathExtension == "aac" { + try? fileManager.removeItem(at: url) } - return directory.appendingPathComponent("voice_live_\(burstID.hexEncodedString()).aac") } } diff --git a/bitchatTests/ChatLiveVoiceCoordinatorTests.swift b/bitchatTests/ChatLiveVoiceCoordinatorTests.swift index 52f5172b..18e25ef4 100644 --- a/bitchatTests/ChatLiveVoiceCoordinatorTests.swift +++ b/bitchatTests/ChatLiveVoiceCoordinatorTests.swift @@ -63,20 +63,57 @@ struct ChatLiveVoiceCoordinatorTests { coordinator.handleVoiceFramePayload(from: peerID, payload: packet.encode(), timestamp: Date()) } - private func incomingFileURL(burstID: Data) -> URL? { + private func captureSuffix(burstID: Data, peerID: PeerID, scope: VoiceBurstScope) -> String { + "\(burstID.hexEncodedString())_\(peerID.id)_\(scope == .directMessage ? "dm" : "mesh").aac" + } + + /// Name of a capture still streaming in. + private func liveCaptureName(burstID: Data, peerID: PeerID, scope: VoiceBurstScope = .directMessage) -> String { + "voice_live_" + captureSuffix(burstID: burstID, peerID: peerID, scope: scope) + } + + /// Name a finished capture is promoted to when it becomes the bubble's + /// replayable fallback. + private func fallbackName(burstID: Data, peerID: PeerID, scope: VoiceBurstScope = .directMessage) -> String { + "voice_" + captureSuffix(burstID: burstID, peerID: peerID, scope: scope) + } + + private func incomingFileURL(named name: String) -> URL? { guard let base = try? FileManager.default.url( for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false ) else { return nil } return base .appendingPathComponent("files/voicenotes/incoming", isDirectory: true) - .appendingPathComponent("voice_live_\(burstID.hexEncodedString()).aac") + .appendingPathComponent(name) + } + + private func incomingFileURL(burstID: Data, peerID: PeerID, scope: VoiceBurstScope = .directMessage) -> URL? { + incomingFileURL(named: liveCaptureName(burstID: burstID, peerID: peerID, scope: scope)) + } + + private func fallbackFileURL(burstID: Data, peerID: PeerID, scope: VoiceBurstScope = .directMessage) -> URL? { + incomingFileURL(named: fallbackName(burstID: burstID, peerID: peerID, scope: scope)) + } + + /// Fresh store rooted in its own temp directory so quota/sweep tests + /// never touch the shared application-support media directories. + private func makeTempStore() throws -> (store: BLEIncomingFileStore, incoming: URL, cleanup: () -> Void) { + let base = FileManager.default.temporaryDirectory + .appendingPathComponent("ptt-store-\(UUID().uuidString)", isDirectory: true) + let store = BLEIncomingFileStore(baseDirectory: base) + let incoming = try store.incomingDirectory(subdirectory: "voicenotes/incoming") + return (store, incoming, { try? FileManager.default.removeItem(at: base) }) + } + + private func setModificationDate(_ date: Date, at url: URL) throws { + try FileManager.default.setAttributes([.modificationDate: date], ofItemAtPath: url.path) } @Test func burstCreatesBubbleAndPersistsFramesInOrder() throws { let context = MockChatLiveVoiceContext() - let coordinator = ChatLiveVoiceCoordinator(context: context) + let coordinator = ChatLiveVoiceCoordinator(context: context, sweepsOnInit: false) let burstID = makeBurstID(0xA1) - defer { incomingFileURL(burstID: burstID).map { try? FileManager.default.removeItem(at: $0) } } + defer { fallbackFileURL(burstID: burstID, peerID: peer).map { try? FileManager.default.removeItem(at: $0) } } let frame1 = Data(repeating: 0x01, count: 60) let frame2 = Data(repeating: 0x02, count: 60) @@ -86,7 +123,7 @@ struct ChatLiveVoiceCoordinatorTests { let bubble = try #require(context.handledPrivateMessages.first) #expect(bubble.isPrivate) #expect(bubble.senderPeerID == peer) - #expect(bubble.content == "[voice] voice_live_\(burstID.hexEncodedString()).aac") + #expect(bubble.content == "[voice] voice_live_\(burstID.hexEncodedString())_\(peer.id)_dm.aac") #expect(coordinator.isLiveVoiceMessage(bubble)) // Deliver out of order: seq 2 buffers behind the seq-1 hole, then @@ -95,21 +132,26 @@ struct ChatLiveVoiceCoordinatorTests { send(try #require(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames([frame1]))), to: coordinator, from: peer) send(try #require(VoiceBurstPacket(burstID: burstID, seq: 3, kind: .end(totalDataPackets: 2, durationMs: 128))), to: coordinator, from: peer) - let url = try #require(incomingFileURL(burstID: burstID)) + // The finished capture is promoted off its voice_live_ name. + let url = try #require(fallbackFileURL(burstID: burstID, peerID: peer)) let written = try Data(contentsOf: url) var expected = ADTSFramer.frame(frame1) expected.append(ADTSFramer.frame(frame2)) #expect(written == expected) + let liveURL = try #require(incomingFileURL(burstID: burstID, peerID: peer)) + #expect(!FileManager.default.fileExists(atPath: liveURL.path)) - // Burst ended: no longer live, bubble republished for re-render. + // Burst ended: no longer live, bubble republished pointing at the + // promoted file. #expect(!coordinator.isLiveVoiceMessage(bubble)) - #expect(context.upsertedMessages.contains { $0.message.id == bubble.id }) + let republished = try #require(context.upsertedMessages.last { $0.message.id == bubble.id }) + #expect(republished.message.content == "[voice] \(fallbackName(burstID: burstID, peerID: peer))") #expect(context.removedMessageIDs.isEmpty) } @Test func absorbsFinalizedNoteIntoLiveBubble() throws { let context = MockChatLiveVoiceContext() - let coordinator = ChatLiveVoiceCoordinator(context: context) + let coordinator = ChatLiveVoiceCoordinator(context: context, sweepsOnInit: false) let burstID = makeBurstID(0xB2) let hex = burstID.hexEncodedString() @@ -134,7 +176,8 @@ struct ChatLiveVoiceCoordinatorTests { #expect(replacement.message.id == bubble.id) #expect(replacement.message.content == note.content) #expect(replacement.peerID == peer) - let url = try #require(incomingFileURL(burstID: burstID)) + // The promoted partial capture is deleted in favor of the note. + let url = try #require(fallbackFileURL(burstID: burstID, peerID: peer)) #expect(!FileManager.default.fileExists(atPath: url.path)) // Absorption is one-shot. @@ -143,7 +186,7 @@ struct ChatLiveVoiceCoordinatorTests { @Test func absorbIgnoresUnrelatedVoiceNotes() throws { let context = MockChatLiveVoiceContext() - let coordinator = ChatLiveVoiceCoordinator(context: context) + let coordinator = ChatLiveVoiceCoordinator(context: context, sweepsOnInit: false) // A classic voice note (date-stamped name) and a live-capture name // must both pass through untouched. @@ -167,7 +210,7 @@ struct ChatLiveVoiceCoordinatorTests { @Test func canceledBurstRemovesBubbleAndFile() throws { let context = MockChatLiveVoiceContext() - let coordinator = ChatLiveVoiceCoordinator(context: context) + let coordinator = ChatLiveVoiceCoordinator(context: context, sweepsOnInit: false) let burstID = makeBurstID(0xC3) send(try #require(VoiceBurstPacket(burstID: burstID, seq: 1, kind: .frames([Data(repeating: 9, count: 40)]))), to: coordinator, from: peer) @@ -175,14 +218,14 @@ struct ChatLiveVoiceCoordinatorTests { send(try #require(VoiceBurstPacket(burstID: burstID, seq: 2, kind: .canceled)), to: coordinator, from: peer) #expect(context.removedMessageIDs == [bubble.id]) - let url = try #require(incomingFileURL(burstID: burstID)) + let url = try #require(incomingFileURL(burstID: burstID, peerID: peer)) #expect(!FileManager.default.fileExists(atPath: url.path)) #expect(!coordinator.isLiveVoiceMessage(bubble)) } @Test func emptyBurstLeavesNoBubble() throws { let context = MockChatLiveVoiceContext() - let coordinator = ChatLiveVoiceCoordinator(context: context) + let coordinator = ChatLiveVoiceCoordinator(context: context, sweepsOnInit: false) let burstID = makeBurstID(0xD4) send(try #require(VoiceBurstPacket(burstID: burstID, seq: 0, kind: .start(codec: .aacLC16kMono))), to: coordinator, from: peer) @@ -195,7 +238,7 @@ struct ChatLiveVoiceCoordinatorTests { @Test func ignoresBlockedPeersAndUnknownControlPackets() throws { let context = MockChatLiveVoiceContext() - let coordinator = ChatLiveVoiceCoordinator(context: context) + let coordinator = ChatLiveVoiceCoordinator(context: context, sweepsOnInit: false) context.blockedPeers = [peer] send(try #require(VoiceBurstPacket(burstID: makeBurstID(0xE5), seq: 0, kind: .start(codec: .aacLC16kMono))), to: coordinator, from: peer) @@ -210,12 +253,12 @@ struct ChatLiveVoiceCoordinatorTests { @Test func concurrentAssemblyCapDropsExtraBursts() throws { let context = MockChatLiveVoiceContext() - let coordinator = ChatLiveVoiceCoordinator(context: context) + let coordinator = ChatLiveVoiceCoordinator(context: context, sweepsOnInit: false) var cleanup: [Data] = [] defer { for burstID in cleanup { - incomingFileURL(burstID: burstID).map { try? FileManager.default.removeItem(at: $0) } + incomingFileURL(burstID: burstID, peerID: peer).map { try? FileManager.default.removeItem(at: $0) } } } for i in 0.. Date: Thu, 9 Jul 2026 16:46:33 +0200 Subject: [PATCH 071/158] Close forged-directness link-rebind DoS on DM routing (#1421) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Gate connected-link trust on a secure session; deny forged direct announces the connected shortcut Residual gap after the rotation-heal containment (#1401): "verified direct" announces prove the signature but not directness — TTL is unsigned — so a malicious connected peer can replay a victim's fresh announce with its TTL restored. When the victim has no live link, the replayer's link rebinds to the victim's ID and reads as "connected", and MessageRouter's connected fast-path then trusts it outright: every DM stalls on a Noise handshake the replayer can never complete and is silently lost while showing "sent". Router-level trust gate (no wire change): - Transport gains canDeliverSecurely(to:) — BLE answers with an established Noise session; Nostr keeps its prompt-delivery predicate; the protocol default forwards to canDeliverPromptly for transports without a forgeable link layer. - MessageRouter.sendPrivate only trusts a connected link outright when it can deliver securely; otherwise it still sends (kicking the handshake on a genuine link) but retains a copy and hands a sealed copy to couriers, like the reachable path. flushOutbox gets the same gate so a flush over an insecure link resends instead of dropping the retained copy. Presence hardening (defense in depth): a "direct" announce arriving on a link already bound to a different peer no longer shortcuts the claimed peer into "connected" — only real link state does. Genuine first-contact and direct announces are unaffected; only the ambiguous heal path loses the forgeable shortcut. Co-Authored-By: Claude Opus 4.8 * Harden the insecure-link outbox bound; document the second-replay presence gap and the courier metadata tradeoff Review follow-ups on the canDeliverSecurely gate: - flushOutbox no longer counts connected-but-insecure flushes toward the maxSendAttempts drop: the message was actually transmitted over a live link, so a peer whose Noise handshake stalls across reconnect flapping must not burn through the cap and lose the store-and-forward copy the gate exists to preserve. Retention stays bounded by the 24h outbox TTL and the per-peer FIFO cap; acks still clear it. Attempt-counting stays for reachable-only (heuristic) sends. Regression test: >8 connected- insecure flushes keep the retained copy, drop callback never fires. - Document the known second-replay presence gap: linkBoundToOtherPeer reads the binding before rebindLinkAfterVerifiedDirectAnnounce steals the link, so once a first replay has rebound a link to an absent victim's ID, a second replay marks the victim connected. Presence display only — DMs stay on the retain+courier path via the router gate. Not closed at the announce layer because the post-rebind state is indistinguishable from a legitimate rotation/reconnect heal (a supported, field-verified flow). Covered by a two-announce test. - Note the accepted courier-spray metadata tradeoff at the connected- insecure send: nearby verified peers receive a sealed copy (they learn a DM exists, never its content), cleared on ack. Co-Authored-By: Claude Fable 5 * Promote a healed rotation to connected; normalize the secure-delivery probe; retain Codable properties in Periphery Codex review follow-ups on 5017c232: - P1: a legitimate rotation announce necessarily arrives on a link still bound to the OLD peer ID, so the linkBoundToOtherPeer denial stored the new identity as disconnected — and the rebind only fixed link state, never the registry. A healed rotation then read as disconnected until the peer happened to announce again. rebindLinkAfterVerifiedDirect- Announce now promotes the rebound identity to connected after the containment checks pass (registry markConnected + topology/snapshot/ peer-list refresh; the .peerConnected UI event already fired from the announce path). This consciously moves the forged-presence residue from second-replay to first-successful-rebind — bounded by the rebind containment (never steals a live identity, one rebind per link per cooldown) and still display-only: DMs stay gated on canDeliverSecurely. Comments and the pinned tests updated; new regression test covers rotate-on-open-link -> rebind -> isPeerConnected(new) == true. - P2: BLEService.canDeliverSecurely probed the Noise session with the peer ID as given, but sessions are keyed by the short wire ID — a send keyed by the full 64-hex Noise key (favorites resolution) misread an established session as insecure and needlessly retained + couriered every DM until ack. Normalize with toShort() like isPeerConnected. Test drives a real XX handshake and asserts both ID forms pass. - Periphery: the PrekeyBundleStore.StoredBundle.noiseKey "assign-only" flake fired again and slipped past its baselined USR (read exists in loadFromDisk; the indexer intermittently misses it). Replace the baseline entry with retain_codable_properties: true — deterministic, and a truly-dead Codable field is a persisted-format change anyway. Local periphery scan --strict: no unused code detected. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Opus 4.8 --- bitchat/Services/BLE/BLEAnnounceHandler.swift | 25 +++- bitchat/Services/BLE/BLEPeerRegistry.swift | 10 ++ bitchat/Services/BLE/BLEService.swift | 72 +++++++++ bitchat/Services/MessageRouter.swift | 53 ++++++- bitchat/Services/NostrTransport.swift | 9 +- .../Services/Prekeys/PrekeyBundleStore.swift | 9 +- bitchat/Services/Transport.swift | 12 ++ bitchatTests/BLEServiceCoreTests.swift | 138 ++++++++++++++++++ bitchatTests/Mocks/MockTransport.swift | 8 + bitchatTests/ProtocolContractTests.swift | 3 + .../Services/BLEAnnounceHandlerTests.swift | 101 +++++++++++++ .../Services/MessageRouterTests.swift | 102 +++++++++++++ 12 files changed, 530 insertions(+), 12 deletions(-) diff --git a/bitchat/Services/BLE/BLEAnnounceHandler.swift b/bitchat/Services/BLE/BLEAnnounceHandler.swift index e33248e3..306831ce 100644 --- a/bitchat/Services/BLE/BLEAnnounceHandler.swift +++ b/bitchat/Services/BLE/BLEAnnounceHandler.swift @@ -20,6 +20,12 @@ struct BLEAnnounceHandlerEnvironment { let verifySignature: (_ packet: BitchatPacket, _ signingPublicKey: Data) -> Bool /// Direct link state for the peer (BLE-queue read). let linkState: (PeerID) -> (hasPeripheral: Bool, hasCentral: Bool) + /// Whether the link this packet arrived on is already bound to a + /// different peer ID (ingress-registry + BLE-queue read). Directness + /// rides on the unsigned TTL, so a replayed announce can look "direct" + /// on the replayer's link; that link must not shortcut an absent peer + /// into "connected". + let linkBoundToOtherPeer: (_ packet: BitchatPacket, _ peerID: PeerID) -> Bool /// Runs the registry mutation phase under the collections barrier. let withRegistryBarrier: (() -> Void) -> Void /// Upserts the verified announce into the peer registry. @@ -135,6 +141,23 @@ final class BLEAnnounceHandler { var isReconnectedPeer = false let directLinkState = env.linkState(peerID) let isDirectAnnounce = packet.ttl == env.messageTTL + // A "direct" announce arriving on a link that another peer already + // owns is either a rotation heal or a replay with its TTL restored; + // both are ambiguous, so only the rebind (which containment-checks + // the claimed identity) may promote it — never this shortcut. + // + // Known limitation: denying the shortcut cannot prevent forged + // presence outright. A rebind that passes the containment checks + // promotes the claimed peer to connected — it must, or a legitimate + // rotation on an open link would read as disconnected — so a replay + // that wins the rebind (absent victim, cooldown clear) still forges + // presence. That residue is presence display only: DMs stay gated on + // canDeliverSecurely (no Noise session means retain + courier, see + // MessageRouter.sendPrivate). What this check buys: the ambiguous + // announce alone never flips presence — forging requires winning the + // containment-checked rebind (never steals an identity that owns a + // live link; at most one rebind per link per cooldown window). + let linkBoundToOtherPeer = isDirectAnnounce && env.linkBoundToOtherPeer(packet, peerID) env.withRegistryBarrier { let hasPeripheralConnection = directLinkState.hasPeripheral @@ -152,7 +175,7 @@ final class BLEAnnounceHandler { let update = env.upsertVerifiedAnnounce( peerID, announcement, - isDirectAnnounce || hasPeripheralConnection || hasCentralSubscription, + hasPeripheralConnection || hasCentralSubscription || (isDirectAnnounce && !linkBoundToOtherPeer), now ) isNewPeer = update.isNewPeer diff --git a/bitchat/Services/BLE/BLEPeerRegistry.swift b/bitchat/Services/BLE/BLEPeerRegistry.swift index 9195d147..792107d8 100644 --- a/bitchat/Services/BLE/BLEPeerRegistry.swift +++ b/bitchat/Services/BLE/BLEPeerRegistry.swift @@ -158,6 +158,16 @@ struct BLEPeerRegistry { peers[peerID] = info } + /// Flips an already-known peer to connected. Returns false when the peer + /// is unknown or already connected (nothing changed). + @discardableResult + mutating func markConnected(_ peerID: PeerID) -> Bool { + guard var info = peers[peerID], !info.isConnected else { return false } + info.isConnected = true + peers[peerID] = info + return true + } + mutating func updateLastSeen(_ peerID: PeerID, at date: Date) { guard var peer = peers[peerID] else { return } peer.lastSeen = date diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 9b18ed77..2152f316 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -674,6 +674,19 @@ final class BLEService: NSObject { } } + func canDeliverSecurely(to peerID: PeerID) -> Bool { + // A live link binding alone is forgeable: the rotation heal rebinds a + // link on a signature-verified "direct" announce, but directness rides + // on the unsigned TTL, so a replayed announce can bind an absent + // peer's ID to the replayer's link. An established Noise session + // proves the other end of the link holds the peer's private key. + // + // Sessions are keyed by the short wire ID, so normalize like + // isPeerConnected does — a send keyed by the full 64-hex Noise key + // must not misread an established session as insecure. + noiseService.hasEstablishedSession(with: peerID.toShort()) + } + func peerNickname(peerID: PeerID) -> String? { collectionsQueue.sync { peerRegistry.nickname(for: peerID, connectedOnly: true) @@ -2083,6 +2096,16 @@ extension BLEService { } } + /// Handshake plumbing for tests that need a real established Noise + /// session (e.g. canDeliverSecurely) without Bluetooth in the loop. + func _test_noiseInitiateHandshake(with peerID: PeerID) throws -> Data { + try noiseService.initiateHandshake(with: peerID) + } + + func _test_noiseProcessHandshakeMessage(from peerID: PeerID, message: Data) throws -> Data? { + try noiseService.processHandshakeMessage(from: peerID, message: message) + } + static func _test_shouldRediscoverBitChatService( invalidatedServiceUUIDs: [CBUUID], cachedServiceUUIDs: [CBUUID]? @@ -4388,6 +4411,16 @@ extension BLEService { } SecureLogger.debug("🔄 Rebinding link after peer-ID rotation: \(previousPeerID.id.prefix(8))… → \(peerID.id.prefix(8))…", category: .session) self.refreshLocalTopology() + // The announce that triggered this rebind was upserted as + // disconnected: the registry ran while the link still belonged + // to the previous ID (the ambiguous state BLEAnnounceHandler + // denies the connected shortcut). The rebind has now + // containment-checked the claim and the identity owns a live + // link, so promote it — otherwise a healed rotation leaves a + // live link that reads as disconnected until the next announce. + self.messageQueue.async { [weak self] in + self?.promoteReboundPeerToConnected(peerID) + } // Retire the rotated-away ID only once its last link is gone; a // remaining stale link heals the same way or ages out. guard self.linkStateStore.links(to: previousPeerID).isEmpty else { return } @@ -4397,6 +4430,26 @@ extension BLEService { } } + /// After a successful verified rebind the new identity owns a live link, + /// but its announce was stored disconnected (the link was still bound to + /// the rotated-away ID when the registry upsert ran). Flip it to + /// connected and republish so routing and the peer list see the healed + /// link. The `.peerConnected` UI event already fired from the announce + /// path (new/reconnected + direct), so only list state needs refreshing. + private func promoteReboundPeerToConnected(_ peerID: PeerID) { + let promoted = collectionsQueue.sync(flags: .barrier) { + peerRegistry.markConnected(peerID) + } + guard promoted else { return } + refreshLocalTopology() + publishFullPeerData() + notifyUI { [weak self] in + guard let self else { return } + let currentPeerIDs = self.collectionsQueue.sync { self.peerRegistry.peerIDs } + self.deliverTransportEvent(.peerListUpdated(currentPeerIDs)) + } + } + /// Rotation is an implicit leave of the old identity: drop it immediately /// instead of letting a ghost duplicate linger for the reachability /// retention window. @@ -4434,6 +4487,25 @@ extension BLEService { linkState: { [weak self] peerID in self?.linkState(for: peerID) ?? (hasPeripheral: false, hasCentral: false) }, + linkBoundToOtherPeer: { [weak self] packet, peerID in + // Reads the CURRENT binding — i.e. the state before + // rebindLinkAfterVerifiedDirectAnnounce (which runs after the + // handler) may steal the link and promote the new owner to + // connected. See the caller in BLEAnnounceHandler for why the + // residual forged-presence window this leaves is accepted. + guard let self else { return false } + guard let link = (self.collectionsQueue.sync { self.ingressLinks.link(for: packet) }) else { return false } + let boundPeerID: PeerID? = self.readLinkState { store in + switch link { + case .peripheral(let peripheralUUID): + return store.peerID(forPeripheralID: peripheralUUID) + case .central(let centralUUID): + return store.peerID(forCentralUUID: centralUUID) + } + } + guard let boundPeerID else { return false } + return boundPeerID != peerID + }, withRegistryBarrier: { [weak self] body in self?.collectionsQueue.sync(flags: .barrier) { body() } }, diff --git a/bitchat/Services/MessageRouter.swift b/bitchat/Services/MessageRouter.swift index bfbba094..819c30c7 100644 --- a/bitchat/Services/MessageRouter.swift +++ b/bitchat/Services/MessageRouter.swift @@ -165,14 +165,38 @@ final class MessageRouter { // MARK: - Message Sending func sendPrivate(_ content: String, to peerID: PeerID, recipientNickname: String, messageID: String) { - if let transport = connectedTransport(for: peerID) { - // A live link is a strong delivery signal; trust it outright. + if let transport = connectedTransport(for: peerID), transport.canDeliverSecurely(to: peerID) { + // A live link that can complete an encrypted delivery is a + // strong delivery signal; trust it outright. SecureLogger.debug("Routing PM via \(type(of: transport)) (connected) to \(peerID.id.prefix(8))… id=\(messageID.prefix(8))…", category: .session) transport.sendPrivateMessage(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID) return } let message = QueuedMessage(content: content, nickname: recipientNickname, messageID: messageID, timestamp: now(), sendAttempts: 1) + if let transport = connectedTransport(for: peerID) { + // "Connected" without an established secure session is forgeable: + // link bindings heal on signature-verified "direct" announces, but + // directness rides on the unsigned TTL, so a replayed announce can + // bind an absent peer's ID to the replayer's link — where the send + // stalls on a handshake the replayer can never complete. Send now + // (a genuine link finishes the handshake and delivers), but retain + // a copy and hand a sealed copy to couriers so nothing is silently + // lost; receivers dedup resends by message ID. + // + // Deliberate metadata tradeoff: every pre-handshake first DM to a + // connected peer hands nearby verified peers a sealed copy, so + // they learn a DM to this recipient exists (never its content — + // the envelope is opaque). Accepted for delivery robustness; the + // deposit is cleared on ack. Don't "optimize" the courier call + // away. + SecureLogger.debug("Routing PM via \(type(of: transport)) (connected, no secure session) to \(peerID.id.prefix(8))… id=\(messageID.prefix(8))…", category: .session) + transport.sendPrivateMessage(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID) + enqueue(message, for: peerID) + attemptCourierDeposit(messageID: messageID, for: peerID) + return + } + if let transport = reachableTransport(for: peerID) { // Reachability without a connection is a freshness heuristic (e.g. // the mesh retention window), so the send can silently go nowhere. @@ -397,14 +421,31 @@ final class MessageRouter { continue } - if let transport = connectedTransport(for: peerID) { - // Live link: send and stop retaining. + if let transport = connectedTransport(for: peerID), transport.canDeliverSecurely(to: peerID) { + // Live link with a secure session: send and stop retaining. SecureLogger.debug("Outbox -> \(type(of: transport)) (connected) for \(peerID.id.prefix(8))… id=\(message.messageID.prefix(8))…", category: .session) transport.sendPrivateMessage(message.content, to: peerID, recipientNickname: message.nickname, messageID: message.messageID) metrics?.record(.outboxResent) + } else if let transport = connectedTransport(for: peerID) { + // "Connected" without a secure session — possibly a stolen + // binding from a replayed announce: send (a genuine link + // finishes the handshake and delivers) but keep retaining + // until an ack clears it. These flushes do NOT count toward + // the attempt-cap drop: the message was transmitted over a + // live link, so a peer whose handshake stalls across + // reconnect flapping must not burn through the cap and lose + // the store-and-forward copy this retention exists to + // preserve. Retention stays bounded by the 24h outbox TTL + // and the per-peer FIFO cap. + SecureLogger.debug("Outbox -> \(type(of: transport)) (connected, no secure session) for \(peerID.id.prefix(8))… id=\(message.messageID.prefix(8))…", category: .session) + transport.sendPrivateMessage(message.content, to: peerID, recipientNickname: message.nickname, messageID: message.messageID) + metrics?.record(.outboxResent) + remaining.append(message) } else if let transport = reachableTransport(for: peerID) { - // Weak signal: send but keep retaining until an ack clears it, - // bounded by attempt count for peers that never ack. + // Reachability without a connection is a freshness heuristic, + // so the send can silently go nowhere: send but keep retaining + // until an ack clears it, bounded by attempt count for peers + // that never ack. guard message.sendAttempts < Self.maxSendAttempts else { SecureLogger.warning("📤 Dropping unacked PM for \(peerID.id.prefix(8))… id=\(message.messageID.prefix(8))… after \(message.sendAttempts) attempts", category: .session) dropMessage(message.messageID, for: peerID) diff --git a/bitchat/Services/NostrTransport.swift b/bitchat/Services/NostrTransport.swift index dc8418a8..2d1c380b 100644 --- a/bitchat/Services/NostrTransport.swift +++ b/bitchat/Services/NostrTransport.swift @@ -230,7 +230,14 @@ final class NostrTransport: Transport, @unchecked Sendable { // instead of waiting for internet that may never come. isPeerReachable(peerID) && queue.sync { relaysConnected } } - + + func canDeliverSecurely(to peerID: PeerID) -> Bool { + // Nostr has no link bindings to forge; a known recipient key plus a + // connected relay is the strongest delivery signal it has. The router + // already retains + couriers for Nostr sends, so keep that behavior. + canDeliverPromptly(to: peerID) + } + func peerNickname(peerID: PeerID) -> String? { nil } func getPeerNicknames() -> [PeerID: String] { [:] } diff --git a/bitchat/Services/Prekeys/PrekeyBundleStore.swift b/bitchat/Services/Prekeys/PrekeyBundleStore.swift index 18d6ea00..83527ef9 100644 --- a/bitchat/Services/Prekeys/PrekeyBundleStore.swift +++ b/bitchat/Services/Prekeys/PrekeyBundleStore.swift @@ -23,10 +23,11 @@ import Foundation final class PrekeyBundleStore { struct StoredBundle: Codable { // noiseKey is read in loadFromDisk (dictionary keying), but the - // Periphery indexer intermittently misses that read and flakes CI - // with "assign-only" — its USR is baselined (an in-source ignore - // can't work: strict mode flags it as superfluous on the runs where - // the indexer gets it right). + // Periphery indexer intermittently misses that read and flaked CI + // with "assign-only" — even past its baselined USR. Covered + // deterministically by retain_codable_properties in .periphery.yml + // (an in-source ignore can't work: strict mode flags it as + // superfluous on the runs where the indexer gets it right). let noiseKey: Data var generatedAt: UInt64 var prekeyIDs: [UInt32] diff --git a/bitchat/Services/Transport.swift b/bitchat/Services/Transport.swift index 35a794cb..c7094bc1 100644 --- a/bitchat/Services/Transport.swift +++ b/bitchat/Services/Transport.swift @@ -116,6 +116,14 @@ protocol Transport: AnyObject { /// npub as reachable even with no relay connection, where a send only /// joins a queue waiting for internet that may never come. func canDeliverPromptly(to peerID: PeerID) -> Bool + /// Whether a send to this peer can complete an end-to-end encrypted + /// delivery right now (e.g. an established Noise session). Distinct from + /// connectivity: a "connected" link binding alone is forgeable — link + /// bindings heal on signature-verified "direct" announces, but directness + /// rides on the unsigned TTL, so a replayed announce can wear an absent + /// peer's ID on the replayer's link. Routers must not trust a connected + /// link outright without this. + func canDeliverSecurely(to peerID: PeerID) -> Bool func peerNickname(peerID: PeerID) -> String? func getPeerNicknames() -> [PeerID: String] @@ -247,6 +255,10 @@ extension Transport { // straight to the radio; queue-backed transports override this. func canDeliverPromptly(to peerID: PeerID) -> Bool { isPeerReachable(peerID) } + // Transports without a forgeable link-binding layer (everything but the + // BLE mesh) have no stronger delivery signal than prompt delivery. + func canDeliverSecurely(to peerID: PeerID) -> Bool { canDeliverPromptly(to: peerID) } + // Noise identity hooks default to inert for transports that do not carry // Noise sessions (e.g. NostrTransport). func noiseSessionPublicKeyData(for peerID: PeerID) -> Data? { nil } diff --git a/bitchatTests/BLEServiceCoreTests.swift b/bitchatTests/BLEServiceCoreTests.swift index 6f7d181b..c7065f6d 100644 --- a/bitchatTests/BLEServiceCoreTests.swift +++ b/bitchatTests/BLEServiceCoreTests.swift @@ -253,6 +253,144 @@ struct BLEServiceCoreTests { #expect(ble.currentPeerSnapshots().map(\.peerID).contains(attackerPeerID)) } + @Test + func replayedDirectAnnounceForAbsentPeerNeverYieldsSecureDelivery() async throws { + // Residual heal-path gap: the victim has NO live link, so the + // identity-owns-a-link containment cannot refuse the rebind. The + // replay steals the link binding, and because a successful rebind + // promotes its new owner to connected (a legitimate rotation heal + // requires that), the absent victim may read as connected. That + // forged presence is display-only and accepted — the invariant that + // holds is that the stolen link can never produce an established + // Noise session, so MessageRouter's canDeliverSecurely gate routes + // DMs through retain + courier instead of trusting it outright. + let ble = makeService() + let attackerPeerID = PeerID(str: "1122334455667788") + let attackerLink = "central-attacker-absent-victim" + ble._test_seedConnectedPeer(attackerPeerID, nickname: "attacker") + ble._test_bindCentral(attackerLink, to: attackerPeerID) + + // The absent victim's fresh signed announce, replayed on the + // attacker's bound link with its direct TTL restored. + let victimSigner = NoiseEncryptionService(keychain: MockKeychain()) + let announcement = AnnouncementPacket( + nickname: "victim", + noisePublicKey: victimSigner.getStaticPublicKeyData(), + signingPublicKey: victimSigner.getSigningPublicKeyData(), + directNeighbors: nil + ) + let payload = try #require(announcement.encode(), "Failed to encode announcement") + let victimPeerID = PeerID(publicKey: announcement.noisePublicKey) + let unsigned = BitchatPacket( + type: MessageType.announce.rawValue, + senderID: Data(hexString: victimPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: 7 + ) + let packet = try #require(victimSigner.signPacket(unsigned), "Failed to sign announce packet") + + #expect(ble._test_recordIngressIfNew(packet: packet, linkID: attackerLink)) + ble._test_handlePacket(packet, fromPeerID: victimPeerID, preseedPeer: false) + + // The rebind steals the link (no live link owns the victim's + // identity, so containment cannot refuse) … + let rebound = await TestHelpers.waitUntil( + { ble._test_centralBinding(attackerLink) == victimPeerID }, + timeout: TestConstants.longTimeout + ) + #expect(rebound) + // … and the promote marks the absent victim connected: the accepted, + // display-only forged-presence residue (documented at + // BLEAnnounceHandler's linkBoundToOtherPeer check) … + let forgedPresence = await TestHelpers.waitUntil( + { ble.isPeerConnected(victimPeerID) }, + timeout: TestConstants.longTimeout + ) + #expect(forgedPresence) + // … but secure delivery stays impossible — the DM gate holds, and + // MessageRouter retains + couriers instead of trusting the link. + #expect(!ble.canDeliverSecurely(to: victimPeerID)) + } + + /// A legitimate rotation announce necessarily arrives on a link still + /// bound to the OLD ID, so its registry upsert stores the new peer + /// disconnected. The successful rebind must promote it: a healed + /// rotation with a live link has to read as connected again for routing + /// and outbox flushes. + @Test + func rotationHealPromotesRotatedPeerToConnected() async throws { + let ble = makeService() + let oldPeerID = PeerID(str: "1122334455667788") + let centralUUID = "central-rotation-promote" + + ble._test_seedConnectedPeer(oldPeerID, nickname: "alice") + ble._test_bindCentral(centralUUID, to: oldPeerID) + + let signer = NoiseEncryptionService(keychain: MockKeychain()) + let announcement = AnnouncementPacket( + nickname: "alice", + noisePublicKey: signer.getStaticPublicKeyData(), + signingPublicKey: signer.getSigningPublicKeyData(), + directNeighbors: nil + ) + let payload = try #require(announcement.encode(), "Failed to encode announcement") + let newPeerID = PeerID(publicKey: announcement.noisePublicKey) + let unsigned = BitchatPacket( + type: MessageType.announce.rawValue, + senderID: Data(hexString: newPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: 7 + ) + let packet = try #require(signer.signPacket(unsigned), "Failed to sign announce packet") + + #expect(ble._test_recordIngressIfNew(packet: packet, linkID: centralUUID)) + ble._test_handlePacket(packet, fromPeerID: newPeerID, preseedPeer: false) + + let rebound = await TestHelpers.waitUntil( + { ble._test_centralBinding(centralUUID) == newPeerID }, + timeout: TestConstants.longTimeout + ) + #expect(rebound) + + let connected = await TestHelpers.waitUntil( + { ble.isPeerConnected(newPeerID) }, + timeout: TestConstants.longTimeout + ) + #expect(connected) + } + + /// Noise sessions are keyed by the short wire ID, but routers may key + /// sends by the full 64-hex Noise key (favorites resolution does). The + /// secure-delivery gate must normalize like isPeerConnected, or an + /// established session is misread as insecure and every DM needlessly + /// retains + couriers until an ack. + @Test + func canDeliverSecurelyNormalizesFullNoiseKeyPeerIDs() async throws { + let ble = makeService() + let remote = NoiseEncryptionService(keychain: MockKeychain()) + let remoteKey = remote.getStaticPublicKeyData() + let shortID = PeerID(publicKey: remoteKey) + let fullKeyID = PeerID(hexData: remoteKey) + #expect(fullKeyID.toShort() == shortID) + #expect(!ble.canDeliverSecurely(to: shortID)) + + // Full XX handshake; the local side keys the session by the short + // wire ID, exactly as packets present it in production. + let m1 = try ble._test_noiseInitiateHandshake(with: shortID) + let m2 = try #require(try remote.processHandshakeMessage(from: ble.myPeerID, message: m1)) + let m3 = try #require(try ble._test_noiseProcessHandshakeMessage(from: shortID, message: m2)) + _ = try remote.processHandshakeMessage(from: ble.myPeerID, message: m3) + + #expect(ble.canDeliverSecurely(to: shortID)) + #expect(ble.canDeliverSecurely(to: fullKeyID)) + } + @Test func ingressRejectsSelfLoopbackBeforeSpoofChecks() async throws { let ble = makeService() diff --git a/bitchatTests/Mocks/MockTransport.swift b/bitchatTests/Mocks/MockTransport.swift index 62ced6c9..ad01a1c4 100644 --- a/bitchatTests/Mocks/MockTransport.swift +++ b/bitchatTests/Mocks/MockTransport.swift @@ -51,6 +51,10 @@ final class MockTransport: Transport { var connectedPeers: Set = [] var reachablePeers: Set = [] + /// Peers with an established secure session. `nil` mirrors the protocol + /// default (prompt delivery), so connected peers stay "secure" for tests + /// that never care about the distinction. + var securePeers: Set? var peerNicknames: [PeerID: String] = [:] var peerFingerprints: [PeerID: String] = [:] var peerNoiseStates: [PeerID: LazyHandshakeState] = [:] @@ -88,6 +92,10 @@ final class MockTransport: Transport { reachablePeers.contains(peerID) || connectedPeers.contains(peerID) } + func canDeliverSecurely(to peerID: PeerID) -> Bool { + securePeers?.contains(peerID) ?? canDeliverPromptly(to: peerID) + } + func peerNickname(peerID: PeerID) -> String? { peerNicknames[peerID] } diff --git a/bitchatTests/ProtocolContractTests.swift b/bitchatTests/ProtocolContractTests.swift index 73609823..d295ff4e 100644 --- a/bitchatTests/ProtocolContractTests.swift +++ b/bitchatTests/ProtocolContractTests.swift @@ -103,6 +103,9 @@ struct ProtocolContractTests { #expect(probe.sentMessages.count == 1) #expect(probe.sentMessages.first?.content == "hello") #expect(probe.acceptPendingFile(id: "pending") == nil) + // Secure delivery defaults to prompt delivery (itself defaulting to + // reachability) for transports without a forgeable link layer. + #expect(probe.canDeliverSecurely(to: peerID) == false) } @Test diff --git a/bitchatTests/Services/BLEAnnounceHandlerTests.swift b/bitchatTests/Services/BLEAnnounceHandlerTests.swift index d53a50b3..9623573a 100644 --- a/bitchatTests/Services/BLEAnnounceHandlerTests.swift +++ b/bitchatTests/Services/BLEAnnounceHandlerTests.swift @@ -8,6 +8,7 @@ struct BLEAnnounceHandlerTests { var existingNoisePublicKey: Data? var signatureValid = true var linkState: (hasPeripheral: Bool, hasCentral: Bool) = (false, false) + var linkBoundToOtherPeer = false var upsertResult = BLEPeerAnnounceUpdate(isNewPeer: false, wasDisconnected: false, previousNickname: nil) var dedupSeenIDs: Set = [] var shouldEmitReconnectLogResult = true @@ -41,6 +42,7 @@ struct BLEAnnounceHandlerTests { return recorder.signatureValid }, linkState: { _ in recorder.linkState }, + linkBoundToOtherPeer: { _, _ in recorder.linkBoundToOtherPeer }, withRegistryBarrier: { body in recorder.barrierCount += 1 body() @@ -334,6 +336,105 @@ struct BLEAnnounceHandlerTests { #expect(recorder.afterglowDelays.count == 1) } + /// TTL is unsigned, so a replayed announce with its TTL restored looks + /// "direct" — but it arrives on a link another peer already owns. That + /// link must not shortcut the (possibly absent) claimed peer into + /// "connected". + @Test + func directAnnounceOnLinkBoundToAnotherPeerDoesNotMarkConnected() throws { + let now = Date(timeIntervalSince1970: 1_000) + let noiseKey = Data(repeating: 0x88, count: 32) + let peerID = PeerID(publicKey: noiseKey) + let packet = try makeAnnouncePacket( + noisePublicKey: noiseKey, + peerID: peerID, + timestamp: timestamp(now), + signature: Data(repeating: 0xEE, count: 64) + ) + + let recorder = Recorder() + recorder.linkBoundToOtherPeer = true + recorder.upsertResult = BLEPeerAnnounceUpdate(isNewPeer: true, wasDisconnected: false, previousNickname: nil) + let handler = makeHandler(recorder: recorder, now: now) + + let result = handler.handle(packet, from: peerID) + + #expect(result?.isDirectAnnounce == true) + #expect(result?.isVerified == true) + #expect(recorder.upsertCalls.count == 1) + #expect(recorder.upsertCalls.first?.isConnected == false) + } + + /// A peer with its own live link stays connected even when a copy of its + /// announce arrives on someone else's link. + @Test + func directAnnounceOnForeignLinkKeepsPeerWithOwnLinkConnected() throws { + let now = Date(timeIntervalSince1970: 1_000) + let noiseKey = Data(repeating: 0x99, count: 32) + let peerID = PeerID(publicKey: noiseKey) + let packet = try makeAnnouncePacket( + noisePublicKey: noiseKey, + peerID: peerID, + timestamp: timestamp(now), + signature: Data(repeating: 0xEE, count: 64) + ) + + let recorder = Recorder() + recorder.linkBoundToOtherPeer = true + recorder.linkState = (hasPeripheral: false, hasCentral: true) + let handler = makeHandler(recorder: recorder, now: now) + + handler.handle(packet, from: peerID) + + #expect(recorder.upsertCalls.count == 1) + #expect(recorder.upsertCalls.first?.isConnected == true) + } + + /// Documents the handler's contract around the rebind: the + /// linkBoundToOtherPeer read reflects the binding BEFORE the rebind runs, + /// so a replayed "direct" announce on someone else's link is denied the + /// connected shortcut — presence only flips via the rebind itself + /// (BLEService promotes the new owner after a successful, containment- + /// checked rebind) or via a later announce arriving on the now-rebound + /// link, as simulated here. Either way the residue is presence display + /// only — DMs remain gated on canDeliverSecurely, so without a Noise + /// session they take the retain + courier path (see MessageRouterTests + /// .sendPrivate_connectedWithoutSecureSessionRetainsAndDepositsWithCourier). + @Test + func secondReplayedDirectAnnounceAfterRebindMarksAbsentPeerConnected() throws { + let now = Date(timeIntervalSince1970: 1_000) + let noiseKey = Data(repeating: 0xA1, count: 32) + let victim = PeerID(publicKey: noiseKey) + let packet = try makeAnnouncePacket( + noisePublicKey: noiseKey, + peerID: victim, + timestamp: timestamp(now), + signature: Data(repeating: 0xEE, count: 64) + ) + + let recorder = Recorder() + let handler = makeHandler(recorder: recorder, now: now) + + // First replay: the link still belongs to the replayer and the victim + // has no live link of its own — the connected shortcut is denied. + recorder.linkBoundToOtherPeer = true + recorder.linkState = (hasPeripheral: false, hasCentral: false) + handler.handle(packet, from: victim) + #expect(recorder.upsertCalls.count == 1) + #expect(recorder.upsertCalls.first?.isConnected == false) + + // The rebind then binds the replayer's link to the victim's ID (the + // rotation-heal path, containment-checked in BLEService). A second + // replay now finds the link owned by the claimed peer … + recorder.linkBoundToOtherPeer = false + recorder.linkState = (hasPeripheral: false, hasCentral: true) + handler.handle(packet, from: victim) + + // … and the absent victim reads as connected: the residual gap. + #expect(recorder.upsertCalls.count == 2) + #expect(recorder.upsertCalls.last?.isConnected == true) + } + @Test func announceBackIsSkippedWhenAlreadyMarked() throws { let now = Date(timeIntervalSince1970: 1_000) diff --git a/bitchatTests/Services/MessageRouterTests.swift b/bitchatTests/Services/MessageRouterTests.swift index 78a9caec..ea8ba4da 100644 --- a/bitchatTests/Services/MessageRouterTests.swift +++ b/bitchatTests/Services/MessageRouterTests.swift @@ -316,6 +316,108 @@ struct MessageRouterTests { #expect(couriers.contains(favorite)) } + /// Residual gap after the rotation-heal containment: a replayed "direct" + /// announce (TTL is unsigned) can bind an absent victim's peer ID to the + /// replayer's link, leaving the victim "connected" on a link whose Noise + /// handshake can never complete. The connected fast-path must not trust + /// that outright: the send still goes out (a genuine link finishes the + /// handshake), but a copy is retained and a sealed copy goes to couriers + /// so nothing is silently lost. + @Test @MainActor + func sendPrivate_connectedWithoutSecureSessionRetainsAndDepositsWithCourier() async { + let victim = PeerID(str: "00000000000000aa") + let victimKey = Data(repeating: 0xBB, count: 32) + let courier = PeerID(str: "00000000000000cc") + let courierKey = Data(repeating: 0xCC, count: 32) + + let transport = MockTransport() + transport.connectedPeers.insert(victim) + transport.connectedPeers.insert(courier) + transport.securePeers = [] // no established Noise session with anyone + transport.updatePeerSnapshots([Self.snapshot(courier, key: courierKey, verified: true)]) + + let router = MessageRouter( + transports: [transport], + courierDirectory: Self.directory(recipient: victim, recipientKey: victimKey) + ) + router.sendPrivate("Hello", to: victim, recipientNickname: "Peer", messageID: "cs1") + + // The send is still attempted (it kicks the handshake on a genuine + // link) but not trusted outright: a courier gets a sealed copy now … + #expect(transport.sentPrivateMessages.map(\.messageID) == ["cs1"]) + #expect(transport.sentCourierMessages.count == 1) + #expect(transport.sentCourierMessages.first?.messageID == "cs1") + #expect(transport.sentCourierMessages.first?.recipientNoiseKey == victimKey) + #expect(transport.sentCourierMessages.first?.couriers == [courier]) + + // … and the retained copy keeps flushing until a delivery ack — a + // flush over the insecure link must resend without dropping it. + router.flushOutbox(for: victim) + router.flushOutbox(for: victim) + #expect(transport.sentPrivateMessages.count == 3) + router.markDelivered("cs1") + router.flushOutbox(for: victim) + #expect(transport.sentPrivateMessages.count == 3) + } + + /// Flushes over a connected-but-insecure link never count toward the + /// attempt-cap drop: the message was actually transmitted over a live + /// link, so a peer whose Noise handshake stalls across reconnect flapping + /// must not burn through the cap and lose the store-and-forward copy the + /// secure-session gate exists to preserve. Retention stays bounded by + /// the 24h outbox TTL and the per-peer FIFO cap; an ack clears it. + @Test @MainActor + func flushOutbox_connectedInsecureFlushesNeverDropTheRetainedCopy() async { + let peerID = PeerID(str: "00000000000000ac") + let transport = MockTransport() + transport.connectedPeers.insert(peerID) + transport.securePeers = [] // handshake never completes + + let router = MessageRouter(transports: [transport]) + var dropped: [String] = [] + router.onMessageDropped = { messageID, _ in dropped.append(messageID) } + + router.sendPrivate("Hello", to: peerID, recipientNickname: "Peer", messageID: "ci1") + + // Well past maxSendAttempts (8): every flush resends, none drops. + for _ in 0..<10 { + router.flushOutbox(for: peerID) + } + #expect(dropped.isEmpty) + #expect(transport.sentPrivateMessages.count == 11) + + // The copy is still retained and an ack still clears it. + router.markDelivered("ci1") + router.flushOutbox(for: peerID) + #expect(transport.sentPrivateMessages.count == 11) + } + + /// With an established secure session the connected fast-path stays + /// exactly as before: trusted outright, no retained copy, no courier. + @Test @MainActor + func sendPrivate_connectedWithSecureSessionIsTrustedOutright() async { + let peerID = PeerID(str: "00000000000000ab") + let peerKey = Data(repeating: 0xAB, count: 32) + let courier = PeerID(str: "00000000000000cc") + + let transport = MockTransport() + transport.connectedPeers.insert(peerID) + transport.connectedPeers.insert(courier) + transport.securePeers = [peerID] + transport.updatePeerSnapshots([Self.snapshot(courier, key: Data(repeating: 0xCC, count: 32), verified: true)]) + + let router = MessageRouter( + transports: [transport], + courierDirectory: Self.directory(recipient: peerID, recipientKey: peerKey) + ) + router.sendPrivate("Hello", to: peerID, recipientNickname: "Peer", messageID: "cs2") + + #expect(transport.sentPrivateMessages.map(\.messageID) == ["cs2"]) + #expect(transport.sentCourierMessages.isEmpty) + router.flushOutbox(for: peerID) + #expect(transport.sentPrivateMessages.count == 1) + } + @Test @MainActor func courierBecameAvailable_retriesDepositOnceWithoutDoubleBurn() async { let recipient = PeerID(str: "00000000000000aa") From 304460ee8376bc3bec8524ff6c2872a5a4eccb66 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:47:08 +0200 Subject: [PATCH 072/158] Nearby notes: tap-to-reveal (consent-gate the location subscription) + subscription hygiene (#1422) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Nearby notes: tap-to-reveal before any relay REQ, plus shared subscription pool The nearby-notes counter used to open a live building-precision (precision-8) geohash REQ to the closest geo relays whenever the mesh public timeline was visible — a passive location side-channel with no opt-in. Now nothing subscribes until one explicit act reveals the counter for the session: tapping the new "check for notes left here" line on the empty mesh timeline (static, no network), opening the notices sheet's geo tab, or a successful /drop. The app-info setting stays the default-ON kill switch and still gates /drop. Subscription hygiene alongside: - LocationNotesManager.deinit now unsubscribes its live REQ (hopping to the main actor like the timer teardown) instead of only invalidating timers. - New refcounted LocationNotesPool dedupes the counter's and the notices sheet's identical 9-cell kind-1 REQs into one shared manager per geohash; both callers release-and-reacquire instead of retargeting in place, and the sheet releases its ref on dismissal. The reveal affordance is localized across all 29 catalog locales, and new NearbyNotesCounterTests cover the no-REQ-before-reveal contract, the 9-cell filter, NIP-40 expiry handling, single unsubscribe on deactivate, and pool refcounting. Co-Authored-By: Claude Opus 4.8 * Review fixes: permission-gate the hint, exclude building cell from pre-reveal sampling, explicit-act reveal only Fixes the verified review findings on the tap-to-reveal PR: - Permission dead-end: the "check for notes left here" hint now renders only when location permission is already authorized (it never prompts). Previously a location-denied install could tap it, flip the sticky revealed flag, and get nothing for the rest of the session because retarget() guards on authorization. Predicate lives on NearbyNotesCounter.offersRevealHint(permissionState:) and is reactive to the published permission state. - Building-cell sampling: background geohash sampling subscribed geo-sample- for every regional level including the precision-8 building cell, pre-reveal — contradicting the claim that nothing building-precision hits a relay before the explicit act. GeoChannelCoordinator now excludes the building level until NearbyNotesCounter.revealed (injectable publisher for tests); coarser levels keep the nearby-conversation hint and participant counts working, and bookmarks stay exempt (bookmarking is explicit). - Implicit reveal: opening the notices sheet no longer reveals — the sheet auto-lands on the geo tab whenever a location channel is selected, so browsing a remote geohash and opening notices revealed the LOCAL building subscription. reveal() now fires only on the person actively picking the geo segment, and only when the sheet has a geo scope (the empty-mesh hint tap and /drop stay as before). - Subscription hygiene: switching the sheet geo → mesh releases the pooled notes manager (the REQ was left streaming behind the mesh board); switching back re-acquires from the pool. The dismissal release stays balanced — liveGeoManager is nil after the tab-switch release. - VoiceOver: the hint button exposes the plain localized action text instead of the decorated "* 📍 … *" label. - Removed LocationNotesManager.setGeohash: zero callers, and calling it on a pooled instance would corrupt the pool's keying and refcounts. New tests: hint permission gate, explicit-geo-tab reveal contract, building-cell sampling exclusion before/after reveal, pool release/re-acquire round trip. Full suite (1467) green; iOS simulator build green. Co-Authored-By: Claude Fable 5 * Deflake peer-snapshot binding waits: longTimeout for the multi-hop pipeline CI failed once on initialization_bindsPeerSnapshotsIntoAllPeers: the snapshot -> allPeers binding crosses the mock transport's unstructured Task, UnifiedPeerService.updatePeers, a receive(on: main), and another Task { @MainActor } in bindPeerService — all contending with every parallel worker. On the failing runner the whole suite took 10.1s (usually ~4.4s locally), so the positive 5s defaultTimeout wait lost the race. That's exactly the case TestConstants.longTimeout documents; passing runs return as soon as the condition holds and never pay it. Not caused by the tap-to-reveal changes: nothing on that pipeline was touched, and 20 full parallel-suite loops each on the branch and on origin/main reproduce zero failures locally. The two sibling waits on the same pipeline in this file get the same timeout. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Opus 4.8 --- bitchat/App/NearbyNotesCounter.swift | 52 ++- bitchat/Localizable.xcstrings | 180 ++++++++++ bitchat/Services/CommandProcessor.swift | 4 + bitchat/Services/LocationNotesManager.swift | 34 +- bitchat/Services/LocationNotesPool.swift | 61 ++++ .../ViewModels/GeoChannelCoordinator.swift | 41 ++- .../Views/Components/MeshEmptyStateView.swift | 33 ++ bitchat/Views/MessageListView.swift | 4 +- bitchat/Views/NoticesView.swift | 48 ++- bitchatTests/ChatViewModelTests.swift | 12 +- .../GeoChannelCoordinatorContextTests.swift | 39 +++ bitchatTests/LocationNotesManagerTests.swift | 21 -- bitchatTests/NearbyNotesCounterTests.swift | 309 ++++++++++++++++++ 13 files changed, 771 insertions(+), 67 deletions(-) create mode 100644 bitchat/Services/LocationNotesPool.swift create mode 100644 bitchatTests/NearbyNotesCounterTests.swift diff --git a/bitchat/App/NearbyNotesCounter.swift b/bitchat/App/NearbyNotesCounter.swift index 3c1f630a..abe9c18b 100644 --- a/bitchat/App/NearbyNotesCounter.swift +++ b/bitchat/App/NearbyNotesCounter.swift @@ -17,6 +17,12 @@ final class NearbyNotesCounter: ObservableObject { static let shared = NearbyNotesCounter() @Published private(set) var noteCount = 0 + /// Whether an explicit notes act (the empty-timeline "check for notes" + /// tap, opening the notices sheet's geo tab, or a successful /drop) has + /// unlocked the counter this session. Until then nothing subscribes: + /// merely looking at the mesh timeline must not open a building-precision + /// relay REQ that leaks location passively. + @Published private(set) var revealed = false private var manager: LocationNotesManager? private var managerCancellable: AnyCancellable? @@ -24,9 +30,38 @@ final class NearbyNotesCounter: ObservableObject { private var settingCancellable: AnyCancellable? private var activeHolders = 0 private let locationManager: LocationChannelManager + private let managerFactory: @MainActor (String) -> LocationNotesManager + private let releaseManager: @MainActor (LocationNotesManager?) -> Void - init(locationManager: LocationChannelManager = .shared) { + init( + locationManager: LocationChannelManager = .shared, + managerFactory: @escaping @MainActor (String) -> LocationNotesManager = { LocationNotesPool.shared.acquire($0) }, + releaseManager: @escaping @MainActor (LocationNotesManager?) -> Void = { LocationNotesPool.shared.release($0) } + ) { self.locationManager = locationManager + self.managerFactory = managerFactory + self.releaseManager = releaseManager + } + + /// Whether the empty-timeline "check for notes" hint should render. + /// The permission gate matters: `retarget()` never subscribes without + /// location authorization, so offering the hint to an unauthorized + /// install would be a silent dead-end — tap, `revealed` flips, the hint + /// vanishes, and nothing else happens for the session. The hint never + /// prompts; it simply stays hidden until permission exists. The caller + /// passes its own observed permission state so the hint re-renders when + /// authorization changes. + func offersRevealHint(permissionState: LocationChannelManager.PermissionState) -> Bool { + !revealed && LocationNotesSettings.enabled && permissionState == .authorized + } + + /// Marks the one explicit act that lets the counter subscribe. Sticky for + /// the rest of the session (the singleton's lifetime); `deactivate()` + /// deliberately does not reset it. + func reveal() { + guard !revealed else { return } + revealed = true + retarget() } /// Begins (or keeps) the notes subscription for the current building @@ -53,31 +88,36 @@ final class NearbyNotesCounter: ObservableObject { channelsCancellable = nil settingCancellable = nil managerCancellable = nil - manager?.cancel() + releaseManager(manager) manager = nil noteCount = 0 } private func retarget() { guard activeHolders > 0, + revealed, LocationNotesSettings.enabled, locationManager.permissionState == .authorized, let geohash = locationManager.availableChannels .first(where: { $0.level == .building })?.geohash else { managerCancellable = nil - manager?.cancel() + releaseManager(manager) manager = nil noteCount = 0 return } if let manager { - manager.setGeohash(geohash) - return + guard manager.geohash != geohash.lowercased() else { return } + // Pooled managers are shared; never retarget one in place — + // release the old cell and acquire the new one. + managerCancellable = nil + releaseManager(manager) + self.manager = nil } - let fresh = LocationNotesManager(geohash: geohash) + let fresh = managerFactory(geohash) manager = fresh managerCancellable = fresh.$notes .receive(on: DispatchQueue.main) diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index 797af0ef..80c3c11d 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -31595,6 +31595,186 @@ } } }, + "content.empty.check_notes" : { + "comment" : "Empty mesh timeline action that starts looking for notes left at this place; before tapping, no lookup runs", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تحقّق من الملاحظات المتروكة هنا" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "এখানে রাখা নোট আছে কি না দেখুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "nachsehen, ob hier notizen hinterlassen wurden" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "check for notes left here" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "buscar notas dejadas aquí" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "tingnan kung may mga note na naiwan dito" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "vérifier s'il y a des notes laissées ici" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בדיקה אם הושארו כאן פתקים" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "देखें कि यहाँ नोट छोड़े गए हैं या नहीं" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "periksa catatan yang ditinggalkan di sini" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "controlla se ci sono note lasciate qui" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ここに残されたメモを確認" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "여기 남겨진 쪽지 확인" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "semak nota yang ditinggalkan di sini" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "यहाँ छोडिएका नोटहरू छन् कि हेर्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "kijk of hier notities zijn achtergelaten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "sprawdź, czy zostawiono tutaj notatki" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "ver se há notas deixadas aqui" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ver se há notas deixadas aqui" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "проверить, есть ли здесь заметки" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "kolla om anteckningar lämnats här" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "இங்கே விடப்பட்ட குறிப்புகள் உள்ளதா எனப் பார்க்கவும்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ดูว่ามีโน้ตทิ้งไว้ที่นี่หรือไม่" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "buraya bırakılan notlara bak" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "перевірити, чи залишено тут нотатки" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "دیکھیں کہ یہاں نوٹ چھوڑے گئے ہیں یا نہیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "kiểm tra ghi chú để lại ở đây" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看这里留下的留言" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "查看這裡留下的留言" + } + } + } + }, "content.empty.location_intro" : { "comment" : "First line of an empty geohash timeline naming the channel", "extractionState" : "manual", diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index f2b007dd..a68bf65b 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -200,6 +200,10 @@ final class CommandProcessor { LocationNotesManager.postDrop(content: content, nickname: nickname, geohash: geohash) else { return .error(message: "no geo relays reachable — note not left") } + // Leaving a note is an explicit notes act: it unlocks the passive + // nearby-notes counter (tap-to-reveal) so the sender sees their own + // drop counted on the timeline. + NearbyNotesCounter.shared.reveal() return .success(message: "📍 note left here — it fades in 24h") } diff --git a/bitchat/Services/LocationNotesManager.swift b/bitchat/Services/LocationNotesManager.swift index a85a32bc..4657a7b3 100644 --- a/bitchat/Services/LocationNotesManager.swift +++ b/bitchat/Services/LocationNotesManager.swift @@ -173,6 +173,15 @@ final class LocationNotesManager: ObservableObject { deinit { expiryPruneTimer?.invalidate() connectivityRetryTimer?.invalidate() + // A live REQ must not outlive its manager: relays would keep + // streaming events nobody consumes. deinit is nonisolated, so hop to + // the main actor with just the captured closure and id. + if let sub = subscriptionID { + let unsubscribe = dependencies.unsubscribe + Task { @MainActor in + unsubscribe(sub) + } + } } /// Drops notes whose NIP-40 expiry has passed. Their ids stay in @@ -190,27 +199,10 @@ final class LocationNotesManager: ObservableObject { } } - func setGeohash(_ newGeohash: String) { - let norm = newGeohash.lowercased() - guard norm != geohash else { return } - guard Geohash.isValidGeohash(norm) else { - SecureLogger.warning("LocationNotesManager: rejecting invalid geohash '\(norm)' (expected 1-12 valid base32 chars)", category: .session) - return - } - if let sub = subscriptionID { - dependencies.unsubscribe(sub) - subscriptionID = nil - } - // Set loading state before clearing to prevent empty state flicker - state = .loading - initialLoadComplete = false - errorMessage = nil - geohash = norm - ownPubkey = (try? dependencies.deriveIdentity(norm))?.publicKeyHex - notes.removeAll() - noteIDs.removeAll() - subscribe() - } + // A manager's geohash is fixed for its lifetime: instances are pooled + // per geohash (`LocationNotesPool`), so retargeting one in place would + // corrupt the pool's keying and refcounts. Release the manager and + // acquire the new cell instead. func refresh() { if let sub = subscriptionID { diff --git a/bitchat/Services/LocationNotesPool.swift b/bitchat/Services/LocationNotesPool.swift new file mode 100644 index 00000000..9a6f2ec5 --- /dev/null +++ b/bitchat/Services/LocationNotesPool.swift @@ -0,0 +1,61 @@ +// +// LocationNotesPool.swift +// bitchat +// +// Refcounted pool of LocationNotesManager instances keyed by geohash, so +// surfaces watching the same place (the nearby-notes counter and the notices +// sheet's geo tab) share one relay subscription instead of opening two +// identical 9-cell REQs. +// This is free and unencumbered software released into the public domain. +// + +import Foundation + +@MainActor +final class LocationNotesPool { + static let shared = LocationNotesPool() + + private var entries: [String: (manager: LocationNotesManager, refs: Int)] = [:] + private let makeManager: @MainActor (String) -> LocationNotesManager + + /// The factory is injectable so tests can pool managers built over stub + /// dependencies; live use derives one real manager per geohash. + init(makeManager: @escaping @MainActor (String) -> LocationNotesManager = { LocationNotesManager(geohash: $0) }) { + self.makeManager = makeManager + } + + /// Returns the shared manager for `geohash` (case-insensitive), creating + /// it on first acquire and reviving a cancelled one on re-acquire. + /// Callers must never `cancel` a pooled manager — release it and acquire + /// the new geohash instead. + func acquire(_ geohash: String) -> LocationNotesManager { + let key = geohash.lowercased() + if let entry = entries[key] { + entries[key] = (entry.manager, entry.refs + 1) + if entry.manager.state == .idle { + entry.manager.refresh() + } + return entry.manager + } + let manager = makeManager(key) + entries[key] = (manager, 1) + return manager + } + + /// Balances `acquire`: the last release cancels the subscription and + /// drops the entry. Releasing an instance the pool doesn't own (a + /// test-injected manager) degrades to a plain `cancel()`. + func release(_ manager: LocationNotesManager?) { + guard let manager else { return } + guard let entry = entries[manager.geohash], entry.manager === manager else { + manager.cancel() + return + } + if entry.refs <= 1 { + entries[manager.geohash] = nil + manager.cancel() + } else { + entries[manager.geohash] = (entry.manager, entry.refs - 1) + } + } +} diff --git a/bitchat/ViewModels/GeoChannelCoordinator.swift b/bitchat/ViewModels/GeoChannelCoordinator.swift index 51af663a..68536d01 100644 --- a/bitchat/ViewModels/GeoChannelCoordinator.swift +++ b/bitchat/ViewModels/GeoChannelCoordinator.swift @@ -37,25 +37,34 @@ final class GeoChannelCoordinator { private weak var context: (any GeoChannelContext)? private var cancellables = Set() - private var regionalGeohashes: [String] = [] + private var regionalChannels: [GeohashChannel] = [] private var bookmarkedGeohashes: [String] = [] + /// Mirrors `NearbyNotesCounter.revealed` (injectable for tests): the + /// session's one explicit notes act. Until it happens, background + /// sampling must not include the building-precision cell — see + /// `sampledRegionalGeohashes`. + private var notesRevealed = false + private let notesRevealedPublisher: AnyPublisher init( locationManager: LocationChannelManager? = nil, bookmarksStore: GeohashBookmarksStore? = nil, torManager: TorManager? = nil, + notesRevealed: AnyPublisher? = nil, context: any GeoChannelContext ) { self.locationManager = locationManager ?? Self.defaultLocationManager() self.bookmarksStore = bookmarksStore ?? GeohashBookmarksStore.shared self.torManager = torManager ?? Self.defaultTorManager() + self.notesRevealedPublisher = notesRevealed + ?? NearbyNotesCounter.shared.$revealed.eraseToAnyPublisher() self.context = context start() } func start() { - regionalGeohashes = locationManager.availableChannels.map { $0.geohash } + regionalChannels = locationManager.availableChannels bookmarkedGeohashes = bookmarksStore.bookmarks locationManager.$selectedChannel @@ -72,7 +81,18 @@ final class GeoChannelCoordinator { .receive(on: DispatchQueue.main) .sink { [weak self] channels in guard let self else { return } - self.regionalGeohashes = channels.map { $0.geohash } + self.regionalChannels = channels + self.updateSampling() + } + .store(in: &cancellables) + + // Revealing the nearby-notes counter is the session's explicit notes + // act; it widens sampling to include the building cell (below). + notesRevealedPublisher + .receive(on: DispatchQueue.main) + .sink { [weak self] revealed in + guard let self, self.notesRevealed != revealed else { return } + self.notesRevealed = revealed self.updateSampling() } .store(in: &cancellables) @@ -102,8 +122,21 @@ final class GeoChannelCoordinator { updateSampling() } + /// Regional geohashes eligible for background sampling. The + /// building-precision (precision-8) cell identifies a single address, so + /// sampling it passively would leak the same location signal the + /// nearby-notes tap-to-reveal exists to gate — it joins only after the + /// session's explicit notes act. The coarser levels (block and up) keep + /// the nearby-conversation hint and channel participant counts working. + /// Bookmarks are exempt: bookmarking a geohash is itself explicit. + private var sampledRegionalGeohashes: [String] { + regionalChannels + .filter { notesRevealed || $0.level != .building } + .map { $0.geohash } + } + private func updateSampling() { - let union = Array(Set(regionalGeohashes).union(bookmarkedGeohashes)) + let union = Array(Set(sampledRegionalGeohashes).union(bookmarkedGeohashes)) Task { @MainActor in guard !union.isEmpty else { context?.endGeohashSampling() diff --git a/bitchat/Views/Components/MeshEmptyStateView.swift b/bitchat/Views/Components/MeshEmptyStateView.swift index ef6e6219..a244d5f1 100644 --- a/bitchat/Views/Components/MeshEmptyStateView.swift +++ b/bitchat/Views/Components/MeshEmptyStateView.swift @@ -24,6 +24,7 @@ struct MeshEmptyStateView: View { @EnvironmentObject private var peerListModel: PeerListModel @ObservedObject private var activityTracker = GeohashChatActivityTracker.shared @ObservedObject private var sightingsTracker = MeshSightingsTracker.shared + @ObservedObject private var nearbyNotes = NearbyNotesCounter.shared @ThemedPalette private var palette @@ -38,6 +39,7 @@ struct MeshEmptyStateView: View { static let meshIntro = String(localized: "content.empty.mesh_intro", comment: "First line of the empty mesh timeline explaining what the mesh channel is") static let switchHint = String(localized: "content.empty.switch_hint", comment: "Empty timeline hint pointing at the channel switcher and the help screen") static let sightingsOne = String(localized: "content.empty.sightings_one", comment: "Empty mesh timeline stat when exactly one device came within range today") + static let checkNotes = String(localized: "content.empty.check_notes", comment: "Empty mesh timeline action that starts looking for notes left at this place; before tapping, no lookup runs") static func sightingsMany(_ count: Int) -> String { String( @@ -80,6 +82,9 @@ struct MeshEmptyStateView: View { if let conversation = nearbyConversation { conversationHint(conversation) } + if showsCheckNotesHint { + checkNotesHint + } } else { // The radar + tally already say "scanning, nobody yet", so // the narration stays to two lines with the live hint after @@ -89,6 +94,9 @@ struct MeshEmptyStateView: View { if let conversation = nearbyConversation { conversationHint(conversation) } + if showsCheckNotesHint { + checkNotesHint + } // The radar centers in whatever space is left below the // text — the flexible spacers split it evenly. @@ -127,6 +135,31 @@ private extension MeshEmptyStateView { activityTracker.mostActiveConversation(among: locationChannelsModel.availableChannels) } + /// Tap-to-reveal: the nearby-notes counter never subscribes on its own — + /// looking at the mesh timeline must not open a building-precision relay + /// REQ (a passive location side-channel). This static line is the one + /// explicit act that unlocks it; nothing touches the network until the + /// tap. It only renders when location permission is already granted + /// (the tap never prompts, so without permission it would dead-end + /// silently). Once revealed it yields to today's live strip and count, + /// and the app-info setting stays the kill switch. + var showsCheckNotesHint: Bool { + nearbyNotes.offersRevealHint(permissionState: locationChannelsModel.permissionState) + } + + var checkNotesHint: some View { + Button { + NearbyNotesCounter.shared.reveal() + } label: { + actionLine("📍 \(Strings.checkNotes)") + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + // The visual label carries decorative asterisks and an emoji; expose + // just the localized action text to assistive tech. + .accessibilityLabel(Strings.checkNotes) + } + var sightingsText: String { sightingsTracker.todayCount == 1 ? Strings.sightingsOne diff --git a/bitchat/Views/MessageListView.swift b/bitchat/Views/MessageListView.swift index 605599ea..2742aebd 100644 --- a/bitchat/Views/MessageListView.swift +++ b/bitchat/Views/MessageListView.swift @@ -334,8 +334,10 @@ private extension MessageListView { .buttonStyle(.plain) } - /// The nearby-notes counter runs whenever the mesh public timeline is + /// The nearby-notes counter is held whenever the mesh public timeline is /// showing — the strip needs a live count before it can decide to exist. + /// Holding is not subscribing: nothing hits the relays until an explicit + /// act reveals the counter (tap-to-reveal). func updateNotesCounterHold() { let shouldHold = privatePeer == nil && locationChannelsModel.selectedChannel.isMesh guard shouldHold != holdsNotesCounter else { return } diff --git a/bitchat/Views/NoticesView.swift b/bitchat/Views/NoticesView.swift index 9093e171..8b3e7d90 100644 --- a/bitchat/Views/NoticesView.swift +++ b/bitchat/Views/NoticesView.swift @@ -40,8 +40,10 @@ struct NoticesView: View { /// Injected notes manager for tests; live use derives one per geohash. private let notesManager: LocationNotesManager? - /// Live manager owned by the sheet so the composer can post pure Nostr + /// Pooled manager held by the sheet so the composer can post pure Nostr /// notes (∞ expiry has no mesh-board copy) and the list can render them. + /// Acquired from `LocationNotesPool` (shared with the nearby-notes + /// counter, one REQ per geohash) and released on dismissal. @State private var liveGeoManager: LocationNotesManager? init( @@ -61,19 +63,33 @@ struct NoticesView: View { notesManager ?? liveGeoManager } - /// Creates (or retargets/revives) the sheet-owned notes manager for the + /// The one explicit act inside the sheet that unlocks the passive + /// nearby-notes counter: the person actively picking the geo segment + /// while the sheet has a geo scope. Landing on the geo tab via the + /// sheet's initial selection (auto-derived from the current channel — + /// e.g. browsing a remote geohash) is not an act toward the LOCAL + /// building cell and must not reveal it. + static func revealsNearbyNotes(onSwitchingTo tab: Tab, geoGeohash: String?) -> Bool { + tab == .geo && geoGeohash != nil + } + + /// Acquires (or retargets/revives) the pooled notes manager for the /// current geo scope. private func ensureGeoNotesManager() { - guard notesManager == nil, tab == .geo, let geohash = geoGeohash else { return } + guard tab == .geo else { return } + guard notesManager == nil, let geohash = geoGeohash else { return } if let manager = liveGeoManager { if manager.geohash != geohash.lowercased() { - manager.setGeohash(geohash) + // Pooled managers are shared; never retarget one in place — + // release the old cell and acquire the new one. + LocationNotesPool.shared.release(manager) + liveGeoManager = LocationNotesPool.shared.acquire(geohash) } else if manager.state == .idle { - // Cancelled on a tab switch; returning re-subscribes. + // Revived after a cancel elsewhere; returning re-subscribes. manager.refresh() } } else { - liveGeoManager = LocationNotesManager(geohash: geohash) + liveGeoManager = LocationNotesPool.shared.acquire(geohash) } } @@ -180,9 +196,19 @@ struct NoticesView: View { .onChange(of: tab) { newTab in if newTab == .geo { beginGeoLocationIfNeeded() + if Self.revealsNearbyNotes(onSwitchingTo: newTab, geoGeohash: geoGeohash) { + NearbyNotesCounter.shared.reveal() + } ensureGeoNotesManager() } else { locationChannelsModel.endLiveRefresh() + // Leaving the geo tab must take its REQ down with it, not + // leave the geohash subscription streaming behind the mesh + // board. The pool makes the return trip cheap (re-acquire + // revives the manager), and the dismissal release below is + // safe: `liveGeoManager` is nil until re-acquired. + LocationNotesPool.shared.release(liveGeoManager) + liveGeoManager = nil } // Each tab keeps its natural default: geo notes stay until // deleted (∞), mesh board posts fade within a week. @@ -196,7 +222,11 @@ struct NoticesView: View { .onChange(of: geoGeohash) { _ in ensureGeoNotesManager() } - .onDisappear { locationChannelsModel.endLiveRefresh() } + .onDisappear { + locationChannelsModel.endLiveRefresh() + LocationNotesPool.shared.release(liveGeoManager) + liveGeoManager = nil + } } /// The geo tab tracks the device's building geohash while on mesh; keep @@ -417,10 +447,6 @@ private struct GeoNoticesList: View { board: board, notesManager: notesManager ) - .onChange(of: geohash) { newValue in - notesManager.setGeohash(newValue) - } - .onDisappear { notesManager.cancel() } } } diff --git a/bitchatTests/ChatViewModelTests.swift b/bitchatTests/ChatViewModelTests.swift index 5a50f0ac..8b9afcef 100644 --- a/bitchatTests/ChatViewModelTests.swift +++ b/bitchatTests/ChatViewModelTests.swift @@ -85,9 +85,14 @@ struct ChatViewModelInitializationTests { ) ]) + // The snapshot → allPeers binding hops the transport's unstructured + // Task, UnifiedPeerService, a receive(on: main), and another Task — + // all contending with every parallel worker, so a loaded CI runner + // can exceed defaultTimeout (observed: one 5s miss on a run where + // the whole suite took 10s instead of the usual ~4s). let updated = await TestHelpers.waitUntil({ viewModel.allPeers.contains { $0.peerID == peerID && $0.nickname == "Alice" } - }, timeout: TestConstants.defaultTimeout) + }, timeout: TestConstants.longTimeout) #expect(updated) } @@ -119,9 +124,10 @@ struct ChatViewModelIdentityTests { ) ]) + // Same multi-hop snapshot pipeline as above: longTimeout for load. let oldPeerBound = await TestHelpers.waitUntil({ viewModel.connectedPeers.contains(oldPeerID) - }, timeout: TestConstants.defaultTimeout) + }, timeout: TestConstants.longTimeout) #expect(oldPeerBound) let existingMessage = BitchatMessage( @@ -155,7 +161,7 @@ struct ChatViewModelIdentityTests { let newPeerBound = await TestHelpers.waitUntil({ viewModel.connectedPeers.contains(newPeerID) && !viewModel.connectedPeers.contains(oldPeerID) - }, timeout: TestConstants.defaultTimeout) + }, timeout: TestConstants.longTimeout) #expect(newPeerBound) viewModel.updatePrivateChatPeerIfNeeded() diff --git a/bitchatTests/GeoChannelCoordinatorContextTests.swift b/bitchatTests/GeoChannelCoordinatorContextTests.swift index 9345b341..271ff402 100644 --- a/bitchatTests/GeoChannelCoordinatorContextTests.swift +++ b/bitchatTests/GeoChannelCoordinatorContextTests.swift @@ -14,6 +14,7 @@ // import Testing +import Combine import Foundation import CoreLocation import Tor @@ -168,6 +169,44 @@ struct GeoChannelCoordinatorContextTests { #expect(await waitUntil { context.endSamplingCount > endCountBeforeRefresh }) } + @Test @MainActor + func buildingCellJoinsSamplingOnlyAfterNotesReveal() async { + TorManager.shared.setAppForeground(true) + let locationManager = makeLocationManager() + let context = MockGeoChannelContext() + let revealed = CurrentValueSubject(false) + let coordinator = GeoChannelCoordinator( + locationManager: locationManager, + bookmarksStore: locationManager, + torManager: TorManager.shared, + notesRevealed: revealed.eraseToAnyPublisher(), + context: context + ) + defer { withExtendedLifetime(coordinator) {} } + + // A location fix yields all six channel levels… + locationManager.locationManager( + CLLocationManager(), + didUpdateLocations: [CLLocation(latitude: 21.2850, longitude: -157.8357)] + ) + #expect(await waitUntil { + locationManager.availableChannels.contains { $0.level == .building } + }) + let building = locationManager.availableChannels.first { $0.level == .building }!.geohash + + // …but pre-reveal sampling must exclude the building-precision cell: + // a passive precision-8 REQ identifies a single address. + #expect(await waitUntil { + (context.beginSamplingCalls.last?.count ?? 0) == GeohashChannelLevel.allCases.count - 1 + }) + #expect(context.beginSamplingCalls.allSatisfy { !$0.contains(building) }) + + // The explicit notes act widens sampling to include it. + revealed.send(true) + #expect(await waitUntil { context.beginSamplingCalls.last?.contains(building) == true }) + #expect(context.beginSamplingCalls.last?.count == GeohashChannelLevel.allCases.count) + } + @Test @MainActor func releasedContext_isHeldWeaklyAndSafelyIgnored() async { let locationManager = makeLocationManager() diff --git a/bitchatTests/LocationNotesManagerTests.swift b/bitchatTests/LocationNotesManagerTests.swift index 80b8713d..abd16e3d 100644 --- a/bitchatTests/LocationNotesManagerTests.swift +++ b/bitchatTests/LocationNotesManagerTests.swift @@ -122,27 +122,6 @@ struct LocationNotesManagerTests { #expect(manager.notes.first?.content == "hi") } - @Test - func setGeohash_invalidValueIsIgnored() { - var subscribeCount = 0 - let deps = LocationNotesDependencies( - relayLookup: { _, _ in ["wss://relay.one"] }, - subscribe: { _, _, _, _, _ in - subscribeCount += 1 - }, - unsubscribe: { _ in }, - sendEvent: { _, _ in }, - deriveIdentity: { _ in try NostrIdentity.generate() }, - now: { Date() } - ) - - let manager = LocationNotesManager(geohash: "u4pruydq", dependencies: deps) - manager.setGeohash("not-valid") - - #expect(manager.geohash == "u4pruydq") - #expect(subscribeCount == 1) - } - @Test func refreshAndCancel_manageSubscriptions() { var subscribeIDs: [String] = [] diff --git a/bitchatTests/NearbyNotesCounterTests.swift b/bitchatTests/NearbyNotesCounterTests.swift new file mode 100644 index 00000000..36a31a61 --- /dev/null +++ b/bitchatTests/NearbyNotesCounterTests.swift @@ -0,0 +1,309 @@ +import Combine +import CoreLocation +import XCTest +@testable import bitchat + +/// Tap-to-reveal privacy contract: the nearby-notes counter must not open a +/// building-precision relay REQ until one explicit act calls `reveal()`, and +/// the pooled subscription must come up exactly once and go down exactly once. +@MainActor +final class NearbyNotesCounterTests: XCTestCase { + private var previousNotesEnabled: Any? + + override func setUp() { + super.setUp() + previousNotesEnabled = UserDefaults.standard.object(forKey: "locationNotes.enabled") + UserDefaults.standard.set(true, forKey: "locationNotes.enabled") + } + + override func tearDown() { + if let previous = previousNotesEnabled as? Bool { + UserDefaults.standard.set(previous, forKey: "locationNotes.enabled") + } else { + UserDefaults.standard.removeObject(forKey: "locationNotes.enabled") + } + super.tearDown() + } + + func test_counterOnlySubscribesAfterReveal_countsUnexpiredNotes_andUnsubscribesOnDeactivate() async throws { + let relays = SubscriptionRecorder() + let locationManager = try await makeAuthorizedLocationManager() + let buildingGeohash = try XCTUnwrap( + locationManager.availableChannels.first(where: { $0.level == .building })?.geohash + ) + + let counter = NearbyNotesCounter( + locationManager: locationManager, + managerFactory: { LocationNotesManager(geohash: $0, dependencies: relays.dependencies) }, + releaseManager: { $0?.cancel() } + ) + + counter.activate() + // Let the availableChannels replay and any queued retargets land: + // being active is not consent, so still no REQ. + try await Task.sleep(nanoseconds: 50_000_000) + XCTAssertEqual(relays.subscribeCount, 0) + XCTAssertFalse(counter.revealed) + + counter.reveal() + + XCTAssertTrue(counter.revealed) + XCTAssertEqual(relays.subscribeCount, 1) + let gTags = try XCTUnwrap(geohashTagFilter(of: XCTUnwrap(relays.lastFilter))) + XCTAssertEqual(gTags.count, 9) + XCTAssertEqual( + Set(gTags), + Set([buildingGeohash] + Geohash.neighbors(of: buildingGeohash)), + "REQ must cover the building geohash plus its 8 neighbors" + ) + + // An expired NIP-40 note must never count. + let identity = try NostrIdentity.generate() + let now = Date() + let expired = NostrEvent( + pubkey: identity.publicKeyHex, + createdAt: now.addingTimeInterval(-3600), + kind: .textNote, + tags: [["g", buildingGeohash], ["expiration", String(Int(now.timeIntervalSince1970) - 60)]], + content: "gone" + ) + relays.lastHandler?(try expired.sign(with: identity.schnorrSigningKey())) + try await Task.sleep(nanoseconds: 50_000_000) + XCTAssertEqual(counter.noteCount, 0) + + // A live matching kind-1 note drives the count to 1. + let live = NostrEvent( + pubkey: identity.publicKeyHex, + createdAt: now, + kind: .textNote, + tags: [["g", buildingGeohash]], + content: "still here" + ) + relays.lastHandler?(try live.sign(with: identity.schnorrSigningKey())) + let counted = await waitUntil { counter.noteCount == 1 } + XCTAssertTrue(counted) + // Still exactly one REQ after all the async retarget re-entries. + XCTAssertEqual(relays.subscribeCount, 1) + + counter.deactivate() + + XCTAssertEqual(relays.unsubscribeCount, 1) + XCTAssertEqual(counter.noteCount, 0) + } + + func test_checkNotesHint_requiresAuthorizedLocationPermission() { + let relays = SubscriptionRecorder() + let counter = NearbyNotesCounter( + locationManager: makeBareLocationManager(), + managerFactory: { LocationNotesManager(geohash: $0, dependencies: relays.dependencies) }, + releaseManager: { $0?.cancel() } + ) + + // An unauthorized install must never see the hint: the tap can't + // subscribe (retarget requires authorization) and must not prompt, + // so offering it would be a silent dead-end for the session. + XCTAssertFalse(counter.offersRevealHint(permissionState: .notDetermined)) + XCTAssertFalse(counter.offersRevealHint(permissionState: .denied)) + XCTAssertFalse(counter.offersRevealHint(permissionState: .restricted)) + XCTAssertTrue(counter.offersRevealHint(permissionState: .authorized)) + + // The app-info kill switch hides it too. + LocationNotesSettings.enabled = false + XCTAssertFalse(counter.offersRevealHint(permissionState: .authorized)) + LocationNotesSettings.enabled = true + + // Once revealed, the hint yields to the live strip and count. + counter.reveal() + XCTAssertFalse(counter.offersRevealHint(permissionState: .authorized)) + XCTAssertEqual(relays.subscribeCount, 0, "reveal without authorization must not open a REQ") + } + + func test_noticesSheet_revealsOnlyOnExplicitGeoTabSelectionWithScope() { + // The sheet reveals the local counter only when the person actively + // picks the geo tab and the sheet actually has a geo scope — + // auto-landing on geo (initial tab) never calls this path at all. + XCTAssertTrue(NoticesView.revealsNearbyNotes(onSwitchingTo: .geo, geoGeohash: "u4pruydq")) + XCTAssertFalse(NoticesView.revealsNearbyNotes(onSwitchingTo: .geo, geoGeohash: nil)) + XCTAssertFalse(NoticesView.revealsNearbyNotes(onSwitchingTo: .mesh, geoGeohash: "u4pruydq")) + } + + func test_pool_sharesOneManagerPerGeohash_andCancelsOnLastRelease() { + let relays = SubscriptionRecorder() + let pool = LocationNotesPool( + makeManager: { LocationNotesManager(geohash: $0, dependencies: relays.dependencies) } + ) + + let first = pool.acquire("u4pruydq") + let second = pool.acquire("U4PRUYDQ") + + XCTAssertTrue(first === second, "same geohash (case-insensitive) must share one manager") + XCTAssertEqual(relays.subscribeCount, 1) + + pool.release(first) + + XCTAssertEqual(relays.unsubscribeCount, 0, "first release keeps the shared REQ live") + XCTAssertNotEqual(first.state, .idle) + + pool.release(second) + + XCTAssertEqual(relays.unsubscribeCount, 1) + XCTAssertEqual(first.state, .idle) + + // An instance the pool never owned (test-injected) degrades to cancel. + let stray = LocationNotesManager(geohash: "u4pruydp", dependencies: relays.dependencies) + pool.release(stray) + XCTAssertEqual(relays.unsubscribeCount, 2) + XCTAssertEqual(stray.state, .idle) + } + + func test_pool_reacquireAfterFullRelease_bringsSubscriptionBackUp() { + let relays = SubscriptionRecorder() + let pool = LocationNotesPool( + makeManager: { LocationNotesManager(geohash: $0, dependencies: relays.dependencies) } + ) + + // The notices sheet's geo → mesh → geo cycle: switching to mesh + // releases (REQ goes down), switching back re-acquires (fresh REQ), + // with exactly one live REQ at any point. + let first = pool.acquire("u4pruydq") + XCTAssertEqual(relays.subscribeCount, 1) + + pool.release(first) + XCTAssertEqual(relays.unsubscribeCount, 1) + XCTAssertEqual(first.state, .idle) + + let second = pool.acquire("u4pruydq") + XCTAssertEqual(relays.subscribeCount, 2) + XCTAssertNotEqual(second.state, .idle) + + // Dismissal after the round trip releases once more — no double + // unsubscribe from the earlier tab-switch release. + pool.release(second) + XCTAssertEqual(relays.unsubscribeCount, 2) + } + + // MARK: - Helpers + + /// A LocationStateManager that never touches CoreLocation; for tests + /// that don't need channels or authorization. + private func makeBareLocationManager() -> LocationStateManager { + let suiteName = "NearbyNotesCounterTests-\(UUID().uuidString)" + let storage = UserDefaults(suiteName: suiteName)! + storage.removePersistentDomain(forName: suiteName) + addTeardownBlock { + storage.removePersistentDomain(forName: suiteName) + } + return LocationStateManager( + storage: storage, + locationManager: MockLocationManager(authorizationStatus: .denied), + geocoder: MockLocationGeocoder(), + shouldInitializeCoreLocation: false + ) + } + + /// An authorized LocationStateManager whose availableChannels carry a + /// real building-level geohash (Honolulu), built over CoreLocation mocks. + private func makeAuthorizedLocationManager() async throws -> LocationStateManager { + let suiteName = "NearbyNotesCounterTests-\(UUID().uuidString)" + let storage = UserDefaults(suiteName: suiteName)! + storage.removePersistentDomain(forName: suiteName) + addTeardownBlock { + storage.removePersistentDomain(forName: suiteName) + } + + let manager = LocationStateManager( + storage: storage, + locationManager: MockLocationManager(authorizationStatus: .authorizedAlways), + geocoder: MockLocationGeocoder(), + shouldInitializeCoreLocation: true + ) + let authorized = await waitUntil { manager.permissionState == .authorized } + XCTAssertTrue(authorized) + + manager.locationManager( + CLLocationManager(), + didUpdateLocations: [CLLocation(latitude: 21.2850, longitude: -157.8357)] + ) + let channelsLoaded = await waitUntil { + manager.availableChannels.contains { $0.level == .building } + } + XCTAssertTrue(channelsLoaded) + return manager + } + + /// The filter's `g` tag values, read through its NIP-01 wire encoding + /// (the stored tag filters aren't visible outside the Nostr layer). + private func geohashTagFilter(of filter: NostrFilter) throws -> [String]? { + let data = try JSONEncoder().encode(filter) + let json = try XCTUnwrap(JSONSerialization.jsonObject(with: data) as? [String: Any]) + return json["#g"] as? [String] + } + + private func waitUntil( + timeout: TimeInterval = 1.0, + condition: @escaping @MainActor () -> Bool + ) async -> Bool { + let deadline = Date().addingTimeInterval(timeout) + while Date() < deadline { + if condition() { + return true + } + try? await Task.sleep(nanoseconds: 10_000_000) + } + return condition() + } +} + +/// Stub relay layer: counts REQs, captures the last filter/handler, and never +/// touches the network. +@MainActor +private final class SubscriptionRecorder { + private(set) var subscribeCount = 0 + private(set) var unsubscribeCount = 0 + private(set) var lastFilter: NostrFilter? + private(set) var lastHandler: ((NostrEvent) -> Void)? + + var dependencies: LocationNotesDependencies { + LocationNotesDependencies( + relayLookup: { _, _ in ["wss://relay.one"] }, + subscribe: { [weak self] filter, _, _, handler, _ in + self?.subscribeCount += 1 + self?.lastFilter = filter + self?.lastHandler = handler + }, + unsubscribe: { [weak self] _ in + self?.unsubscribeCount += 1 + }, + sendEvent: { _, _ in }, + deriveIdentity: { _ in try NostrIdentity.generate() }, + now: { Date() } + ) + } +} + +private final class MockLocationManager: LocationStateManaging { + weak var delegate: CLLocationManagerDelegate? + var desiredAccuracy: CLLocationAccuracy = 0 + var distanceFilter: CLLocationDistance = 0 + var authorizationStatus: CLAuthorizationStatus + + init(authorizationStatus: CLAuthorizationStatus) { + self.authorizationStatus = authorizationStatus + } + + func requestWhenInUseAuthorization() {} + func requestLocation() {} + func startUpdatingLocation() {} + func stopUpdatingLocation() {} +} + +private final class MockLocationGeocoder: LocationStateGeocoding { + func cancelGeocode() {} + + func reverseGeocodeLocation( + _ location: CLLocation, + completionHandler: @escaping ([CLPlacemark]?, Error?) -> Void + ) { + completionHandler(nil, nil) + } +} From f8ab0a7dc0223a7fc277a25d804d17d0d24b6c58 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Thu, 9 Jul 2026 18:23:46 +0200 Subject: [PATCH 073/158] =?UTF-8?q?Fix=20restore-path=20main=E2=86=94bleQu?= =?UTF-8?q?eue=20deadlock=20and=20courier=20drop=20amplification=20(#1425)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix restore-path main↔bleQueue deadlock and courier drop amplification A device froze permanently in a two-phone test. Debugger stacks showed an ABBA deadlock: the main actor was in bleQueue.sync (delivery-ack send → broadcastPacket → readLinkState) while bleQueue was in main.sync (captureBluetoothStatus reading backgroundTimeRemaining). The load that lined the two edges up came from a courier-drop amplification storm: drop dedup was in-memory only while the outbox driving 120s re-deposits is persisted, so every relaunch republished the same undelivered DM as a fresh 24h relay drop and every gateway relaunch re-fetched the whole backlog — ~20 copies of one DM delivered in 40ms, each triggering decrypt + delivery + ack + handshake work. Fixes, in rank order: - Edge B (P0): captureBluetoothStatus no longer main.syncs from bleQueue; backgroundTimeRemaining is sampled on main and cached behind a lock. Invariant documented: bleQueue must NEVER sync-dispatch to main. - Edge A (P0, defense in depth): sendDeliveryAck / sendReadReceipt / sendPrivateMessage / sendNoisePayload / triggerHandshake hop to messageQueue like sendMessage, so no main-actor call path reaches readLinkState's bleQueue.sync. - Drop dedup (P1): publishedDropKeys and seenDropEventIDs persist across relaunches (new BridgeDropDedupStore, entries expire with the 24h NIP-40 drop window; wiped on panic) — one drop per message ID per 24h regardless of relaunch count. - Receiver dedup (P1): openCourierEnvelope dedups on the inner private message ID before delivery, so a duplicate copy costs one decrypt and never re-delivers, re-acks, or re-triggers a handshake. - Handshake gating (P2): queued acks initiate a Noise handshake only for reachable peers; mail from absent/rotated identities no longer turns each copy into a mesh-wide handshake flood (the ack stays queued and flushes when a session eventually establishes). - Outbox (P3): re-enqueueing a queued message ID carries over its depositedCourierKeys so resends stop re-burning the same courier slots. Co-Authored-By: Claude Fable 5 * Review fixes: offline-drop durability, gateway handoff retry, restore-log freshness, coalesced persist Adversarial review of the storm/deadlock PR surfaced four issues: - Offline blackhole (must-fix): a deposit made while relays were down persisted its dedup key even though the drop only sat in the in-memory pending queue — app killed before reconnect meant the relaunch lost the drop but the persisted key blocked every re-deposit for 24h. The persisted snapshot now excludes keys still pending; they become durable only when flushPendingDrops actually publishes them. - Gateway handoff: seen-event IDs were consumed before the deliverToPeer handoff; a failed handoff (peer walked away) permanently dropped the event for a single-gateway island. deliverToPeer now reports whether the handoff was attempted, and a failure releases the seen slot so a relaunch or backlog redelivery retries. - Restore-path logs: central/peripheral-restore captures logged the init sentinel bgRemaining=∞. The cache is now seeded in init's main-thread branch and restore captures route through the sampler, which refreshes the cached budget before logging. - Persist cost: the dedup record was a full JSON encode + atomic write on the main actor per mutation (once per event during a backlog re-fetch). Writes now coalesce behind a 1s window, flushed immediately on background/terminate; panic wipe stays immediate. Co-Authored-By: Claude Fable 5 * Remove BoundedIDSet.remove, orphaned by the ExpiringIDSet migration The drop-dedup sets that needed slot release moved to ExpiringIDSet; remaining BoundedIDSet users only insert and check. Periphery caught it. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Services/BLE/BLEService.swift | 159 +++++++++++++++--- bitchat/Services/Gateway/BoundedIDSet.swift | 10 -- .../Gateway/BridgeCourierService.swift | 128 ++++++++++++-- .../Gateway/BridgeDropDedupStore.swift | 137 +++++++++++++++ bitchat/Services/MessageRouter.swift | 10 +- bitchat/Services/TransportConfig.swift | 3 + bitchat/ViewModels/ChatViewModel.swift | 1 + .../ChatViewModelBootstrapper.swift | 2 +- .../EndToEnd/CourierEndToEndTests.swift | 64 +++++++ .../EndToEnd/PrekeyEndToEndTests.swift | 11 +- .../Services/BridgeCourierServiceTests.swift | 138 ++++++++++++++- .../Services/BridgeDropDedupStoreTests.swift | 118 +++++++++++++ .../Services/MessageRouterTests.swift | 28 +++ 13 files changed, 754 insertions(+), 55 deletions(-) create mode 100644 bitchat/Services/Gateway/BridgeDropDedupStore.swift create mode 100644 bitchatTests/Services/BridgeDropDedupStoreTests.swift diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 2152f316..56fee0b6 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -129,6 +129,15 @@ final class BLEService: NSObject { // Application state tracking (thread-safe) #if os(iOS) private var isAppActive: Bool = true // Assume active initially + /// Last `UIApplication.shared.backgroundTimeRemaining` sampled on the + /// main thread, cached so bleQueue status logs can read it without ever + /// dispatching to main (see `captureBluetoothStatus` for the invariant). + private let backgroundTimeLock = NSLock() + private var _cachedBackgroundTimeRemaining: TimeInterval = .greatestFiniteMagnitude + private var cachedBackgroundTimeRemaining: TimeInterval { + backgroundTimeLock.lock(); defer { backgroundTimeLock.unlock() } + return _cachedBackgroundTimeRemaining + } #endif // MARK: - Core BLE Objects @@ -176,6 +185,13 @@ final class BLEService: NSObject { // Ingress link tracking for duplicate and last-hop suppression private var ingressLinks = BLEIngressLinkRegistry() + // Inner message IDs of recently opened courier envelopes. Redundant + // copies of one message ride different envelopes (each seal uses a fresh + // ephemeral key, and bridge drops multiply across relays/couriers), so + // envelope-level dedup can't catch them; dedup on the inner ID before + // delivery so a duplicate costs one decrypt instead of a delivery + ack + // + handshake each. Owned by collectionsQueue barriers. + private var openedCourierMessageIDs = BoundedIDSet(capacity: TransportConfig.courierOpenedMessageIDCap) private let logRateLimiter = BLELogRateLimiter(defaultMinimumInterval: 5) private var pendingPeripheralWrites = BLEOutboundWriteBuffer() @@ -265,12 +281,18 @@ final class BLEService: NSObject { // Set up application state tracking (iOS only) #if os(iOS) - // Check initial state on main thread + // Check initial state on main thread. The background-budget cache is + // seeded here too: a background-restore launch captures Bluetooth + // status before any lifecycle notification fires, and the init-time + // sentinel would log a meaningless bgRemaining=∞ for exactly the + // wake window that matters. if Thread.isMainThread { isAppActive = UIApplication.shared.applicationState == .active + refreshCachedBackgroundTimeRemaining() } else { DispatchQueue.main.sync { isAppActive = UIApplication.shared.applicationState == .active + refreshCachedBackgroundTimeRemaining() } } @@ -777,7 +799,11 @@ final class BLEService: NSObject { } func triggerHandshake(with peerID: PeerID) { - initiateNoiseHandshake(with: peerID) + // Callers are on the main actor; the handshake broadcast sync-waits + // on bleQueue for link state, so hop off main first. + messageQueue.async { [weak self] in + self?.initiateNoiseHandshake(with: peerID) + } } // MARK: Noise identity/session access (narrow Transport wrappers) @@ -932,6 +958,15 @@ final class BLEService: NSObject { func sendReadReceipt(_ receipt: ReadReceipt, to peerID: PeerID) { + // Hop like sendMessage: callers are often on the main actor, and the + // send path sync-waits on bleQueue for link state — the main thread + // must never block on bleQueue (see captureBluetoothStatus). + if DispatchQueue.getSpecific(key: messageQueueKey) == nil { + messageQueue.async { [weak self] in + self?.sendReadReceipt(receipt, to: peerID) + } + return + } let payload = BLENoisePayloadFactory.readReceipt(originalMessageID: receipt.originalMessageID) if noiseService.hasEstablishedSession(with: peerID) { @@ -942,11 +977,15 @@ final class BLEService: NSObject { SecureLogger.error("Failed to send read receipt: \(error)") } } else { - // Queue for after handshake and initiate if needed + // Queue for after handshake; initiate only while the peer is + // around to answer (see sendDeliveryAck — absent senders must + // not turn queued acks into handshake floods). collectionsQueue.sync(flags: .barrier) { pendingNoiseSessionQueues.appendTypedPayload(payload, for: peerID) } - if !noiseService.hasSession(with: peerID) { initiateNoiseHandshake(with: peerID) } + if !noiseService.hasSession(with: peerID), isPeerReachable(peerID) { + initiateNoiseHandshake(with: peerID) + } SecureLogger.debug("🕒 Queued READ receipt for \(peerID.id.prefix(8))… until handshake completes", category: .session) } } @@ -1395,6 +1434,15 @@ final class BLEService: NSObject { } func sendDeliveryAck(for messageID: String, to peerID: PeerID) { + // Hop like sendMessage: callers are often on the main actor, and the + // send path sync-waits on bleQueue for link state — the main thread + // must never block on bleQueue (see captureBluetoothStatus). + if DispatchQueue.getSpecific(key: messageQueueKey) == nil { + messageQueue.async { [weak self] in + self?.sendDeliveryAck(for: messageID, to: peerID) + } + return + } let payload = BLENoisePayloadFactory.delivered(messageID: messageID) if noiseService.hasEstablishedSession(with: peerID) { @@ -1404,11 +1452,18 @@ final class BLEService: NSObject { SecureLogger.error("Failed to send delivery ACK: \(error)") } } else { - // Queue for after handshake and initiate if needed + // Queue for after handshake; initiate only while the peer is + // around to answer — couriered/bridged mail routinely arrives + // from absent (or rotated) identities, and every duplicate copy + // initiating a handshake broadcast turns one undeliverable ack + // into a mesh-wide flood. The queued ack flushes whenever a + // session eventually establishes. collectionsQueue.sync(flags: .barrier) { pendingNoiseSessionQueues.appendTypedPayload(payload, for: peerID) } - if !noiseService.hasSession(with: peerID) { initiateNoiseHandshake(with: peerID) } + if !noiseService.hasSession(with: peerID), isPeerReachable(peerID) { + initiateNoiseHandshake(with: peerID) + } SecureLogger.debug("🕒 Queued DELIVERED ack for \(peerID.id.prefix(8))… until handshake completes", category: .session) } } @@ -1680,7 +1735,10 @@ extension BLEService: CBCentralManagerDelegate { recentPeripheralCache.record(peripheral, peripheralID: identifier, at: Date()) } - captureBluetoothStatus(context: "central-restore") + // Via the sampler (not a direct capture): it refreshes the cached + // background budget on main first, so the restore log shows the real + // wake window instead of the init sentinel. + logBluetoothStatus("central-restore") if central.state == .poweredOn { startScanning() @@ -2439,7 +2497,8 @@ extension BLEService: CBPeripheralManagerDelegate { } } - captureBluetoothStatus(context: "peripheral-restore") + // Via the sampler for a fresh background budget (see central-restore). + logBluetoothStatus("peripheral-restore") if peripheral.state == .poweredOn && !peripheral.isAdvertising { peripheral.startAdvertising(buildAdvertisementData()) @@ -2720,19 +2779,37 @@ extension BLEService { } private func logBluetoothStatus(_ context: String) { - bleQueue.async { [weak self] in - guard let self = self else { return } - self.captureBluetoothStatus(context: context) - } + scheduleBluetoothStatusSample(after: 0, context: context) } private func scheduleBluetoothStatusSample(after delay: TimeInterval, context: String) { - bleQueue.asyncAfter(deadline: .now() + delay) { [weak self] in - guard let self = self else { return } - self.captureBluetoothStatus(context: context) + #if os(iOS) + // Sample the main-actor background budget first (async hop, never a + // sync wait), then log from bleQueue off the cache — bleQueue must + // never block on main (see captureBluetoothStatus). + DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in + guard let self else { return } + self.refreshCachedBackgroundTimeRemaining() + self.bleQueue.async { self.captureBluetoothStatus(context: context) } } + #else + bleQueue.asyncAfter(deadline: .now() + delay) { [weak self] in + self?.captureBluetoothStatus(context: context) + } + #endif } + #if os(iOS) + /// Main thread only (reads main-actor UIApplication state). + private func refreshCachedBackgroundTimeRemaining() { + dispatchPrecondition(condition: .onQueue(.main)) + let seconds = UIApplication.shared.backgroundTimeRemaining + backgroundTimeLock.lock() + _cachedBackgroundTimeRemaining = seconds + backgroundTimeLock.unlock() + } + #endif + private func captureBluetoothStatus(context: String) { assert(DispatchQueue.getSpecific(key: bleQueueKey) != nil, "captureBluetoothStatus must run on bleQueue") @@ -2750,11 +2827,15 @@ extension BLEService { } #if os(iOS) - var backgroundDescriptor = "" - var backgroundSeconds: TimeInterval = 0 - DispatchQueue.main.sync { - backgroundSeconds = UIApplication.shared.backgroundTimeRemaining - } + // INVARIANT: bleQueue must NEVER sync-dispatch to the main thread. + // The main actor sync-waits on bleQueue along the send paths + // (readLinkState), so a main.sync here completes an ABBA deadlock — + // field-verified as a permanent freeze when a courier-drop storm put + // an ack send (main → bleQueue.sync) up against a status capture + // (bleQueue → main.sync). backgroundTimeRemaining is main-actor + // state, so it is sampled on main and cached. + let backgroundSeconds = cachedBackgroundTimeRemaining + let backgroundDescriptor: String if backgroundSeconds == .greatestFiniteMagnitude { backgroundDescriptor = " bgRemaining=∞" } else { @@ -3044,6 +3125,15 @@ extension BLEService { private func sendNoisePayload(_ typedPayload: Data, to peerID: PeerID) { + // Hop like sendMessage: the Transport-facing wrappers (verify/vouch/ + // group payloads) call this from the main actor, and the send path + // sync-waits on bleQueue for link state. + if DispatchQueue.getSpecific(key: messageQueueKey) == nil { + messageQueue.async { [weak self] in + self?.sendNoisePayload(typedPayload, to: peerID) + } + return + } guard noiseService.hasSession(with: peerID) else { // No session yet - queue the payload SYNCHRONOUSLY before initiating handshake // to prevent race where fast handshake completion drains empty queue @@ -3291,6 +3381,23 @@ extension BLEService { SecureLogger.warning("⚠️ Courier envelope carried unsupported payload type", category: .session) return } + let payload = Data(typedPayload.dropFirst()) + guard let innerMessageID = PrivateMessagePacket.decode(from: payload)?.messageID else { + SecureLogger.warning("⚠️ Courier envelope carried undecodable private message", category: .session) + return + } + // Redundant copies of one message arrive as distinct envelopes + // (fresh seal each: mesh couriers, bridge drops across relays), + // so dedup here on the inner message ID — before delivery, ack, + // and handshake work. A duplicate costs only the decrypt above + // and at most one ack ever goes out per message ID. + let firstOpen = collectionsQueue.sync(flags: .barrier) { + openedCourierMessageIDs.insert(innerMessageID) + } + guard firstOpen else { + SecureLogger.debug("📦 Dropping duplicate courier envelope for message \(innerMessageID.prefix(8))…", category: .session) + return + } // Couriered mail arrives while the sender is absent, so the UI's // block check can't resolve their fingerprint from a live session. // Gate here, where the full static key is in hand. @@ -3306,7 +3413,6 @@ extension BLEService { let shortID = PeerID(publicKey: senderStaticKey) let isKnownOnMesh = collectionsQueue.sync { peerRegistry.info(for: shortID) != nil } let senderPeerID = isKnownOnMesh ? shortID : PeerID(hexData: senderStaticKey) - let payload = Data(typedPayload.dropFirst()) SecureLogger.debug("📦 Opened courier envelope from \(senderPeerID.id.prefix(8))…", category: .session) sfMetrics?.record(.courierOpened) notifyUI { [weak self] in @@ -3745,6 +3851,7 @@ extension BLEService { #if os(iOS) @objc private func appDidBecomeActive() { isAppActive = true + refreshCachedBackgroundTimeRemaining() // Restart scanning with allow duplicates when app becomes active if centralManager?.state == .poweredOn { centralManager?.stopScan() @@ -3758,6 +3865,7 @@ extension BLEService { @objc private func appDidEnterBackground() { isAppActive = false + refreshCachedBackgroundTimeRemaining() // Restart scanning without allow duplicates in background if centralManager?.state == .poweredOn { centralManager?.stopScan() @@ -3851,6 +3959,15 @@ extension BLEService { // MARK: Private Message Handling private func sendPrivateMessage(_ content: String, to recipientID: PeerID, messageID: String) { + // Hop like sendMessage: the Transport-facing wrappers call this from + // the main actor (router sends, favorite notifications), and the send + // path sync-waits on bleQueue for link state. + if DispatchQueue.getSpecific(key: messageQueueKey) == nil { + messageQueue.async { [weak self] in + self?.sendPrivateMessage(content, to: recipientID, messageID: messageID) + } + return + } // Sessions and wire recipient IDs are keyed by the short 16-hex form; // callers may pass the full 64-hex noise key (mirrors sendFilePrivate). let recipientID = recipientID.toShort() diff --git a/bitchat/Services/Gateway/BoundedIDSet.swift b/bitchat/Services/Gateway/BoundedIDSet.swift index 5cb61744..8509c295 100644 --- a/bitchat/Services/Gateway/BoundedIDSet.swift +++ b/bitchat/Services/Gateway/BoundedIDSet.swift @@ -32,14 +32,4 @@ struct BoundedIDSet { } return true } - - /// Releases a previously inserted ID so it can be re-added later. Used - /// when a tentatively-recorded item is later abandoned (e.g. a queued - /// drop evicted before it was ever published) and must become retryable. - mutating func remove(_ id: String) { - guard members.remove(id) != nil else { return } - if let index = order.firstIndex(of: id) { - order.remove(at: index) - } - } } diff --git a/bitchat/Services/Gateway/BridgeCourierService.swift b/bitchat/Services/Gateway/BridgeCourierService.swift index 8e777897..1f8bb1f9 100644 --- a/bitchat/Services/Gateway/BridgeCourierService.swift +++ b/bitchat/Services/Gateway/BridgeCourierService.swift @@ -9,6 +9,11 @@ import BitFoundation import BitLogger import Foundation +#if os(iOS) +import UIKit +#elseif os(macOS) +import AppKit +#endif /// Courier delivery over the internet bridge: sealed courier envelopes are /// parked on relays as kind-1401 "drops" tagged with their rotating @@ -48,6 +53,10 @@ final class BridgeCourierService: ObservableObject { /// Encoded envelope cap for a drop (16 KiB ciphertext + TLV slack). static let maxDropEnvelopeBytes = 20 * 1024 static let maxTrackedIDs = 512 + /// Coalescing window for dedup-record writes: a backlog re-fetch + /// mutates the seen set once per event, and each snapshot save is a + /// full JSON encode + atomic write on the main actor. + static let dedupPersistCoalesceSeconds: TimeInterval = 1.0 } static let shared = BridgeCourierService() @@ -70,7 +79,9 @@ final class BridgeCourierService: ObservableObject { /// Opens a drop addressed to us (tag verified inside). var openEnvelope: (@MainActor (CourierEnvelope) -> Void)? /// Hands a drop to a matching local peer as a directed courier packet. - var deliverToPeer: (@MainActor (CourierEnvelope, PeerID) -> Void)? + /// Returns false when the handoff could not even be attempted (peer no + /// longer reachable), so the drop event stays retryable. + var deliverToPeer: (@MainActor (CourierEnvelope, PeerID) -> Bool)? /// Held envelopes eligible for (re)publish, honoring the cooldown. var heldEnvelopes: (@MainActor (TimeInterval) -> [CourierEnvelope])? /// Timer injection for tests; nil arms a real `Task`. @@ -81,21 +92,90 @@ final class BridgeCourierService: ObservableObject { private(set) var myTagsHex: Set = [] private(set) var watchedPeerTags: [(peerID: PeerID, tagsHex: Set)] = [] private(set) var pendingDrops: [(envelope: CourierEnvelope, dedupKey: String?)] = [] - /// Message IDs already published as drops (sender-side dedup). - private var publishedDropKeys: BoundedIDSet - /// Drop event IDs already handled (multi-relay dedup). - private var seenDropEventIDs: BoundedIDSet + /// Message IDs already published as drops (sender-side dedup) and drop + /// event IDs already handled (multi-relay dedup). Both persist across + /// relaunches: relays hold drops for the full 24h NIP-40 window and the + /// persisted outbox keeps re-depositing, so in-memory-only dedup meant + /// every relaunch republished the same message as a fresh drop and every + /// gateway relaunch re-delivered the whole backlog (field-verified + /// amplification storm). Entries age out with the 24h drop window. + private var publishedDropKeys: ExpiringIDSet + private var seenDropEventIDs: ExpiringIDSet private var subscriptionOpen = false private var lastSubscribedTags: Set = [] private var refreshTimerArmed = false private var lastAnnounceRefresh = Date.distantPast private let now: () -> Date + private let dedupStore: BridgeDropDedupStore - init(now: @escaping () -> Date = Date.init) { + private var dedupPersistScheduled = false + + init(now: @escaping () -> Date = Date.init, dedupStore: BridgeDropDedupStore? = nil) { self.now = now - self.publishedDropKeys = BoundedIDSet(capacity: Limits.maxTrackedIDs) - self.seenDropEventIDs = BoundedIDSet(capacity: Limits.maxTrackedIDs) + self.dedupStore = dedupStore ?? BridgeDropDedupStore(persistsToDisk: !TestEnvironment.isRunningTests) + let snapshot = self.dedupStore.load() + let date = now() + self.publishedDropKeys = ExpiringIDSet( + capacity: Limits.maxTrackedIDs, + lifetime: CourierEnvelope.maxLifetimeSeconds, + entries: snapshot.publishedDropKeys, + now: date + ) + self.seenDropEventIDs = ExpiringIDSet( + capacity: Limits.maxTrackedIDs, + lifetime: CourierEnvelope.maxLifetimeSeconds, + entries: snapshot.seenDropEventIDs, + now: date + ) + // A coalesced dedup write scheduled just before a background kill + // would be lost; flush when the app backgrounds or terminates. + #if os(iOS) + let flushNotifications = [UIApplication.didEnterBackgroundNotification, UIApplication.willTerminateNotification] + #else + let flushNotifications = [NSApplication.willTerminateNotification] + #endif + for name in flushNotifications { + NotificationCenter.default.addObserver(forName: name, object: nil, queue: .main) { [weak self] _ in + MainActor.assumeIsolated { self?.flushDedupSnapshot() } + } + } + } + + /// Schedules a coalesced write of the dedup record (see + /// `Limits.dedupPersistCoalesceSeconds`); lifecycle notifications flush + /// any scheduled write before a background kill could drop it. + private func persistDedup() { + guard !dedupPersistScheduled else { return } + dedupPersistScheduled = true + Task { @MainActor [weak self] in + try? await Task.sleep(nanoseconds: UInt64(Limits.dedupPersistCoalesceSeconds * 1_000_000_000)) + guard let self else { return } + self.dedupPersistScheduled = false + self.flushDedupSnapshot() + } + } + + /// Writes the dedup record now. Sender keys still sitting in the + /// in-memory `pendingDrops` queue are excluded: their drop is not durable + /// until it actually reaches a relay, and persisting the key early would + /// turn "app killed before relays connected" into a silent 24h blackhole + /// (the relaunch loses the queued drop but the persisted key blocks every + /// re-deposit). `flushPendingDrops` re-persists once they publish. + func flushDedupSnapshot() { + let pendingKeys = Set(pendingDrops.compactMap(\.dedupKey)) + dedupStore.save(BridgeDropDedupStore.Snapshot( + publishedDropKeys: publishedDropKeys.entries.filter { !pendingKeys.contains($0.key) }, + seenDropEventIDs: seenDropEventIDs.entries + )) + } + + /// Panic wipe: forget queued drops and the persisted dedup record. + func wipe() { + pendingDrops.removeAll() + publishedDropKeys = ExpiringIDSet(capacity: Limits.maxTrackedIDs, lifetime: CourierEnvelope.maxLifetimeSeconds) + seenDropEventIDs = ExpiringIDSet(capacity: Limits.maxTrackedIDs, lifetime: CourierEnvelope.maxLifetimeSeconds) + dedupStore.wipe() } // MARK: - Sender role @@ -108,14 +188,15 @@ final class BridgeCourierService: ObservableObject { @discardableResult func depositDrop(content: String, messageID: String, recipientNoiseKey: Data) -> Bool { guard bridgeEnabled?() ?? false else { return false } - guard !publishedDropKeys.contains(messageID) else { return false } + guard !publishedDropKeys.contains(messageID, now: now()) else { return false } guard let envelope = sealEnvelope?(content, messageID, recipientNoiseKey) else { return false } // An envelope that can't encode within the drop size caps fails the // same way on every attempt (size is a function of the content, not // of the sealing); consume the dedup slot so the retry sweep stops // re-running Noise sealing on a drop that can never ship. guard let encoded = envelope.encode(), encoded.count <= Limits.maxDropEnvelopeBytes else { - publishedDropKeys.insert(messageID) + publishedDropKeys.insert(messageID, now: now()) + persistDedup() return false } // Only consume the sender-side dedup slot once the drop is durably @@ -124,7 +205,8 @@ final class BridgeCourierService: ObservableObject { // router's retry sweep can attempt a fresh deposit rather than // marking the message "carried" and blocking retries forever. guard publishDrop(envelope, messageID: messageID) else { return false } - publishedDropKeys.insert(messageID) + publishedDropKeys.insert(messageID, now: now()) + persistDedup() return true } @@ -153,7 +235,10 @@ final class BridgeCourierService: ObservableObject { let evicted = pendingDrops.removeFirst() // The oldest queued drop is being dropped before it ever // published; release its dedup slot so it stays retryable. - if let key = evicted.dedupKey { publishedDropKeys.remove(key) } + if let key = evicted.dedupKey { + publishedDropKeys.remove(key) + persistDedup() + } } return true } @@ -180,8 +265,13 @@ final class BridgeCourierService: ObservableObject { for item in queued where !publishDrop(item.envelope, messageID: item.dedupKey) { // Compose failed with relays up: release the slot so the router's // retry sweep can attempt a fresh deposit. - if let key = item.dedupKey { publishedDropKeys.remove(key) } + if let key = item.dedupKey { + publishedDropKeys.remove(key) + } } + // Flushed keys just became durable (published, so no longer excluded + // as pending) or were released above; either way the record changed. + persistDedup() } // MARK: - Subscription (recipient + gateway watch) @@ -265,7 +355,8 @@ final class BridgeCourierService: ObservableObject { func handleDropEvent(_ event: NostrEvent) { guard bridgeEnabled?() ?? false else { return } guard event.kind == NostrProtocol.EventKind.courierDrop.rawValue else { return } - guard seenDropEventIDs.insert(event.id) else { return } + guard seenDropEventIDs.insert(event.id, now: now()) else { return } + persistDedup() guard let data = Data(base64Encoded: event.content), data.count <= Limits.maxDropEnvelopeBytes, let envelope = CourierEnvelope.decode(data), @@ -285,7 +376,14 @@ final class BridgeCourierService: ObservableObject { } if let match = watchedPeerTags.first(where: { $0.tagsHex.contains(tagHex) }) { SecureLogger.info("📦🌉 Courier drop fetched for local peer \(match.peerID.id.prefix(8))…", category: .session) - deliverToPeer?(envelope, match.peerID) + if deliverToPeer?(envelope, match.peerID) != true { + // The best-effort handoff never left this device (the peer + // walked away between the relay fetch and the mesh send). + // Release the seen slot so a relaunch or backlog redelivery + // retries — a single-gateway island has no other carrier. + seenDropEventIDs.remove(event.id) + persistDedup() + } } } diff --git a/bitchat/Services/Gateway/BridgeDropDedupStore.swift b/bitchat/Services/Gateway/BridgeDropDedupStore.swift new file mode 100644 index 00000000..76a0fe28 --- /dev/null +++ b/bitchat/Services/Gateway/BridgeDropDedupStore.swift @@ -0,0 +1,137 @@ +// +// BridgeDropDedupStore.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import BitLogger +import Foundation + +/// ID set with per-entry timestamps: entries expire after `lifetime` and the +/// oldest are evicted past `capacity`. The bridge's dedup caches use this +/// instead of `BoundedIDSet` because their contents persist across relaunches +/// and must age out with the 24h drop window they guard. +struct ExpiringIDSet { + private(set) var entries: [String: Date] + let capacity: Int + let lifetime: TimeInterval + + init(capacity: Int, lifetime: TimeInterval, entries: [String: Date] = [:], now: Date = Date()) { + self.capacity = capacity + self.lifetime = lifetime + self.entries = entries + prune(now: now) + } + + func contains(_ id: String, now: Date) -> Bool { + guard let recorded = entries[id] else { return false } + return now.timeIntervalSince(recorded) <= lifetime + } + + /// Returns false when the ID was already present (and unexpired). + @discardableResult + mutating func insert(_ id: String, now: Date) -> Bool { + guard !contains(id, now: now) else { return false } + entries[id] = now + prune(now: now) + return true + } + + /// Releases a previously inserted ID so it can be re-added later (e.g. a + /// queued drop evicted before it ever published must become retryable). + mutating func remove(_ id: String) { + entries.removeValue(forKey: id) + } + + private mutating func prune(now: Date) { + if entries.contains(where: { now.timeIntervalSince($0.value) > lifetime }) { + entries = entries.filter { now.timeIntervalSince($0.value) <= lifetime } + } + let overflow = entries.count - capacity + guard overflow > 0 else { return } + for (id, _) in entries.sorted(by: { $0.value < $1.value }).prefix(overflow) { + entries.removeValue(forKey: id) + } + } +} + +/// Disk persistence for the bridge courier's drop-dedup record. Relays hold +/// drops for the full 24h NIP-40 window and redeliver them on every launch, +/// and the 120s outbox sweep re-deposits anything undelivered — so with +/// in-memory-only dedup every relaunch republished the same message as a +/// fresh drop (fresh throwaway seal, undeduplicatable downstream) and every +/// gateway relaunch re-delivered the whole backlog. Field-verified: ~20 +/// copies of one DM delivered in 40ms fed the storm behind a permanent +/// device freeze. Persisting both sides caps this at one drop per message +/// ID per 24h regardless of relaunch count. +/// +/// Contents are opaque IDs (message UUIDs, relay event IDs) — no plaintext, +/// no peer identities — so until-first-unlock protection matches +/// `NostrProcessedEventStore`, and the file must load during a +/// locked-background restoration relaunch. Wiped on panic with the rest of +/// the courier state. +final class BridgeDropDedupStore { + struct Snapshot: Codable { + var publishedDropKeys: [String: Date] + var seenDropEventIDs: [String: Date] + } + + private let fileURL: URL? + + /// - Parameter fileURL: Overrides the on-disk location (tests). Ignored + /// when `persistsToDisk` is false. + init(persistsToDisk: Bool = true, fileURL: URL? = nil) { + self.fileURL = persistsToDisk ? (fileURL ?? Self.defaultFileURL()) : nil + } + + func load() -> Snapshot { + guard let fileURL, + let data = try? Data(contentsOf: fileURL), + let snapshot = try? JSONDecoder().decode(Snapshot.self, from: data) else { + return Snapshot(publishedDropKeys: [:], seenDropEventIDs: [:]) + } + return snapshot + } + + func save(_ snapshot: Snapshot) { + guard let fileURL else { return } + guard !(snapshot.publishedDropKeys.isEmpty && snapshot.seenDropEventIDs.isEmpty) else { + try? FileManager.default.removeItem(at: fileURL) + return + } + do { + try FileManager.default.createDirectory( + at: fileURL.deletingLastPathComponent(), + withIntermediateDirectories: true + ) + let data = try JSONEncoder().encode(snapshot) + var options: Data.WritingOptions = [.atomic] + #if os(iOS) + options.insert(.completeFileProtectionUntilFirstUserAuthentication) + #endif + try data.write(to: fileURL, options: options) + } catch { + SecureLogger.error("Failed to persist bridge drop dedup record: \(error)", category: .session) + } + } + + /// Panic wipe: forget which drops we published or handled. + func wipe() { + guard let fileURL else { return } + try? FileManager.default.removeItem(at: fileURL) + } + + private static func defaultFileURL() -> URL? { + guard let base = try? FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) else { return nil } + return base + .appendingPathComponent("courier", isDirectory: true) + .appendingPathComponent("bridge-drop-dedup.json") + } +} diff --git a/bitchat/Services/MessageRouter.swift b/bitchat/Services/MessageRouter.swift index 819c30c7..ff2656df 100644 --- a/bitchat/Services/MessageRouter.swift +++ b/bitchat/Services/MessageRouter.swift @@ -351,9 +351,15 @@ final class MessageRouter { } private func enqueue(_ message: QueuedMessage, for peerID: PeerID) { + var message = message var queue = outbox[peerID] ?? [] - // Re-sending an already-queued ID replaces the entry (keeps attempt count fresh) - queue.removeAll { $0.messageID == message.messageID } + // Re-sending an already-queued ID replaces the entry (keeps attempt + // count fresh) but must not forget which couriers already carry it, + // or the replacement re-burns the same courier slots. + if let existing = queue.firstIndex(where: { $0.messageID == message.messageID }) { + message.depositedCourierKeys.formUnion(queue[existing].depositedCourierKeys) + queue.remove(at: existing) + } queue.append(message) // Enforce per-peer size limit with FIFO eviction diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index ac42aa9f..8a80afee 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -345,6 +345,9 @@ enum TransportConfig { // Cooldown between speculative multi-hop handovers of the same envelope // toward a recipient heard only via relayed announces. static let courierRemoteHandoverCooldownSeconds: TimeInterval = 10 * 60 + // Recently opened courier inner message IDs kept for receiver-side dedup + // (redundant copies ride distinct seals, so only the inner ID matches). + static let courierOpenedMessageIDCap: Int = 512 // One-time prekey bundles (forward-secret courier sealing) // Own gossip-sync round for bundles: modest cadence, bounded peer count, diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 082cfb63..49bed683 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -1173,6 +1173,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele // our own queued outbox, the carried public history, and the // counters describing all of it CourierStore.shared.wipe() + BridgeCourierService.shared.wipe() messageRouter.wipeOutbox() GossipMessageArchive.wipeDefault() StoreAndForwardMetrics.shared.reset() diff --git a/bitchat/ViewModels/ChatViewModelBootstrapper.swift b/bitchat/ViewModels/ChatViewModelBootstrapper.swift index c331fe00..40794ddc 100644 --- a/bitchat/ViewModels/ChatViewModelBootstrapper.swift +++ b/bitchat/ViewModels/ChatViewModelBootstrapper.swift @@ -567,7 +567,7 @@ private extension ChatViewModelBootstrapper { bleService?.openBridgedCourierEnvelope(envelope) } courier.deliverToPeer = { [weak bleService] envelope, peerID in - bleService?.deliverBridgedEnvelope(envelope, to: peerID) + bleService?.deliverBridgedEnvelope(envelope, to: peerID) ?? false } courier.heldEnvelopes = { cooldown in CourierStore.shared.envelopesForBridgePublish(cooldown: cooldown) diff --git a/bitchatTests/EndToEnd/CourierEndToEndTests.swift b/bitchatTests/EndToEnd/CourierEndToEndTests.swift index 00f210f3..af0af7a9 100644 --- a/bitchatTests/EndToEnd/CourierEndToEndTests.swift +++ b/bitchatTests/EndToEnd/CourierEndToEndTests.swift @@ -556,6 +556,70 @@ struct CourierEndToEndTests { #expect(!stored) } + /// Regression for the relaunch amplification storm: redundant copies of + /// one message arrive as *distinct* envelopes (every seal uses a fresh + /// ephemeral key), so only the inner message ID can dedup them. The first + /// copy delivers; duplicates must stop right after the decrypt — no + /// second delivery, no second ack/handshake trigger downstream. + @Test func duplicateCourierCopiesDeliverInnerMessageOnce() async throws { + let alice = makeService() + let bob = makeService() + let bobDelegate = NoiseCaptureDelegate() + bob.delegate = bobDelegate + + let bobKey = bob.noiseStaticPublicKeyData() + let first = try #require(alice.sealBridgeCourierEnvelope("once", messageID: "dup-1", recipientNoiseKey: bobKey)) + let second = try #require(alice.sealBridgeCourierEnvelope("once", messageID: "dup-1", recipientNoiseKey: bobKey)) + // Distinct seals: envelope-level dedup can never catch this pair. + #expect(first.ciphertext != second.ciphertext) + + #expect(bob.openBridgedCourierEnvelope(first)) + #expect(bob.openBridgedCourierEnvelope(second)) + + let delivered = await TestHelpers.waitUntil( + { !bobDelegate.snapshot().isEmpty }, + timeout: TestConstants.defaultTimeout + ) + #expect(delivered) + // Give a duplicate delivery a chance to surface, then confirm the + // second copy never reached the delegate. + let duplicated = await TestHelpers.waitUntil( + { bobDelegate.snapshot().count > 1 }, + timeout: TestConstants.shortTimeout + ) + #expect(!duplicated) + #expect(bobDelegate.snapshot().count == 1) + } + + /// Acks for mail from absent senders (the usual couriered/bridged case) + /// queue for a future session instead of initiating a handshake + /// broadcast — otherwise every duplicate copy of every drop turns into a + /// mesh-wide handshake flood at an identity that cannot answer. + @Test func deliveryAckForAbsentPeerQueuesWithoutHandshake() async throws { + let ble = makeService() + let outbound = PacketTap() + ble._test_onOutboundPacket = outbound.record + + // Nobody by this ID on the mesh (not connected, not reachable). + ble.sendDeliveryAck(for: "msg-1", to: PeerID(str: "00000000000000ee")) + + let initiated = await TestHelpers.waitUntil( + { outbound.count(ofType: .noiseHandshake) > 0 }, + timeout: TestConstants.shortTimeout + ) + #expect(!initiated) + + // Control: a peer that is actually around still gets the handshake. + let present = PeerID(str: "00000000000000ef") + ble._test_seedConnectedPeer(present, nickname: "present") + ble.sendDeliveryAck(for: "msg-2", to: present) + let initiatedForPresent = await TestHelpers.waitUntil( + { outbound.count(ofType: .noiseHandshake) > 0 }, + timeout: TestConstants.defaultTimeout + ) + #expect(initiatedForPresent) + } + private func makeUnsignedAnnounce(from service: BLEService) throws -> BitchatPacket { let announcement = AnnouncementPacket( nickname: "Unsigned", diff --git a/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift b/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift index 456932a7..79bd28b5 100644 --- a/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift +++ b/bitchatTests/EndToEnd/PrekeyEndToEndTests.swift @@ -190,7 +190,11 @@ struct PrekeyEndToEndTests { #expect(message.content == "burn after reading") // 6. Redelivery tolerance: the same envelope arriving via another - // packet (spray-and-wait) still opens inside the grace window. + // packet (spray-and-wait) still decrypts inside the prekey grace + // window (asserted at the crypto layer in NoisePrekeyTests), but + // the duplicate is absorbed before delivery — the receiver dedups + // on the inner message ID, so redundant courier copies never + // re-deliver (or re-ack) the same message. let redelivery = BitchatPacket( type: MessageType.courierEnvelope.rawValue, senderID: Data(hexString: carol.myPeerID.id) ?? Data(), @@ -203,9 +207,10 @@ struct PrekeyEndToEndTests { bob._test_handlePacket(redelivery, fromPeerID: carol.myPeerID) let redelivered = await TestHelpers.waitUntil( { bobDelegate.snapshot().count == 2 }, - timeout: TestConstants.defaultTimeout + timeout: TestConstants.shortTimeout ) - #expect(redelivered) + #expect(!redelivered) + #expect(bobDelegate.snapshot().count == 1) } @Test func withoutBundleSealingFallsBackToStatic() async throws { diff --git a/bitchatTests/Services/BridgeCourierServiceTests.swift b/bitchatTests/Services/BridgeCourierServiceTests.swift index ebd25bf1..7a71170e 100644 --- a/bitchatTests/Services/BridgeCourierServiceTests.swift +++ b/bitchatTests/Services/BridgeCourierServiceTests.swift @@ -24,6 +24,7 @@ struct BridgeCourierServiceTests { var localPeers: [(peerID: PeerID, noiseKey: Data)] = [] var held: [CourierEnvelope] = [] var sealResult: CourierEnvelope? + var deliverResult = true private(set) var publishedEvents: [NostrEvent] = [] private(set) var openedSubscriptions: [[String]] = [] @@ -35,8 +36,8 @@ struct BridgeCourierServiceTests { let service: BridgeCourierService - init() { - service = BridgeCourierService() + init(dedupStore: BridgeDropDedupStore? = nil) { + service = BridgeCourierService(dedupStore: dedupStore) service.bridgeEnabled = { [weak self] in self?.bridgeOn ?? false } service.relaysConnected = { [weak self] in self?.relaysConnected ?? false } service.publishEvent = { [weak self] event in self?.publishedEvents.append(event) } @@ -49,7 +50,10 @@ struct BridgeCourierServiceTests { return self?.sealResult } service.openEnvelope = { [weak self] envelope in self?.openedEnvelopes.append(envelope) } - service.deliverToPeer = { [weak self] envelope, peer in self?.delivered.append((envelope, peer)) } + service.deliverToPeer = { [weak self] envelope, peer in + self?.delivered.append((envelope, peer)) + return self?.deliverResult ?? false + } service.heldEnvelopes = { [weak self] cooldown in self?.heldCooldowns.append(cooldown) return self?.held ?? [] @@ -175,6 +179,134 @@ struct BridgeCourierServiceTests { #expect(fixture.sealRequests.count == 1) } + @Test func publishedDropDedupSurvivesRelaunch() throws { + // Regression (field-verified amplification storm): the outbox that + // drives re-deposits is persisted, but the sender-side drop dedup was + // in-memory only — every relaunch republished the same undelivered + // message as a fresh drop, and relays hold each for 24h. + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("bridge-dedup-\(UUID().uuidString).json") + defer { try? FileManager.default.removeItem(at: fileURL) } + let recipientKey = Fixture.randomKey() + let messageID = UUID().uuidString + + let fixture = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + fixture.sealResult = makeEnvelope(recipientKey: recipientKey) + #expect(fixture.service.depositDrop(content: "hello", messageID: messageID, recipientNoiseKey: recipientKey)) + #expect(fixture.publishedEvents.count == 1) + // Persistence is coalesced; a real launch flushes within a second or + // on backgrounding — tests flush explicitly. + fixture.service.flushDedupSnapshot() + + // "Relaunch": a fresh service over the same store must refuse to + // publish the same message ID again (before even re-sealing it). + let relaunched = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + relaunched.sealResult = makeEnvelope(recipientKey: recipientKey) + #expect(!relaunched.service.depositDrop(content: "hello", messageID: messageID, recipientNoiseKey: recipientKey)) + #expect(relaunched.publishedEvents.isEmpty) + #expect(relaunched.sealRequests.isEmpty) + } + + @Test func seenDropEventDedupSurvivesRelaunch() throws { + // Same storm, gateway side: relays redeliver the whole 24h drop + // backlog on every launch; a relaunch must not re-open (and re-ack) + // events it already handled. + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("bridge-dedup-\(UUID().uuidString).json") + defer { try? FileManager.default.removeItem(at: fileURL) } + + let fixture = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + let myKey = try #require(fixture.myKey) + fixture.service.refresh() + let event = try makeDropEvent(for: makeEnvelope(recipientKey: myKey)) + fixture.service.handleDropEvent(event) + #expect(fixture.openedEnvelopes.count == 1) + fixture.service.flushDedupSnapshot() + + let relaunched = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + relaunched.myKey = myKey + relaunched.service.refresh() + relaunched.service.handleDropEvent(event) + #expect(relaunched.openedEnvelopes.isEmpty) + } + + @Test func offlineQueuedDropStaysRedepositableAfterRelaunch() throws { + // A deposit made while relays are down only joins the in-memory + // pending queue. Its dedup key must NOT be durable yet: if the app is + // killed before relays connect, the relaunch loses the queued drop — + // a persisted key would then block every 120s re-deposit for 24h and + // the message would silently never reach a relay. + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("bridge-dedup-\(UUID().uuidString).json") + defer { try? FileManager.default.removeItem(at: fileURL) } + let recipientKey = Fixture.randomKey() + let messageID = UUID().uuidString + + let fixture = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + fixture.relaysConnected = false + fixture.sealResult = makeEnvelope(recipientKey: recipientKey) + #expect(fixture.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey)) + #expect(fixture.publishedEvents.isEmpty) + // Even a flush while the drop is still pending must exclude its key. + fixture.service.flushDedupSnapshot() + + // "App killed before relays connected": pendingDrops were memory-only. + let relaunched = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + relaunched.sealResult = makeEnvelope(recipientKey: recipientKey) + #expect(relaunched.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey)) + #expect(relaunched.publishedEvents.count == 1) + } + + @Test func publishedPendingDropBecomesDurableAfterFlush() throws { + // Counterpart: once the queued drop actually publishes on reconnect, + // its key becomes durable and a relaunch must not republish. + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("bridge-dedup-\(UUID().uuidString).json") + defer { try? FileManager.default.removeItem(at: fileURL) } + let recipientKey = Fixture.randomKey() + let messageID = UUID().uuidString + + let fixture = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + fixture.relaysConnected = false + fixture.sealResult = makeEnvelope(recipientKey: recipientKey) + #expect(fixture.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey)) + fixture.relaysConnected = true + fixture.service.flushPendingDrops() + #expect(fixture.publishedEvents.count == 1) + fixture.service.flushDedupSnapshot() + + let relaunched = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + relaunched.sealResult = makeEnvelope(recipientKey: recipientKey) + #expect(!relaunched.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey)) + #expect(relaunched.publishedEvents.isEmpty) + } + + @Test func failedGatewayHandoffReleasesSeenSlot() throws { + // A gateway's deliverToPeer handoff is best-effort: when it fails + // (the peer walked away between relay fetch and mesh send), the drop + // event must stay retryable — for a single-gateway mesh island this + // gateway is the recipient's only carrier. + let fixture = Fixture() + let peerKey = Fixture.randomKey() + let peer = PeerID(str: "aabbccdd00112233") + fixture.localPeers = [(peer, peerKey)] + fixture.service.refresh() + let event = try makeDropEvent(for: makeEnvelope(recipientKey: peerKey)) + + fixture.deliverResult = false + fixture.service.handleDropEvent(event) + #expect(fixture.delivered.count == 1) + + // Redelivery (relaunch/backlog re-fetch) retries the handoff … + fixture.deliverResult = true + fixture.service.handleDropEvent(event) + #expect(fixture.delivered.count == 2) + + // … and a successful handoff consumes the event for good. + fixture.service.handleDropEvent(event) + #expect(fixture.delivered.count == 2) + } + @Test func distinctDropsUseDistinctThrowawayKeys() { let fixture = Fixture() let keyA = Fixture.randomKey() diff --git a/bitchatTests/Services/BridgeDropDedupStoreTests.swift b/bitchatTests/Services/BridgeDropDedupStoreTests.swift new file mode 100644 index 00000000..e1507621 --- /dev/null +++ b/bitchatTests/Services/BridgeDropDedupStoreTests.swift @@ -0,0 +1,118 @@ +// +// BridgeDropDedupStoreTests.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +@testable import bitchat + +@Suite("Bridge drop dedup persistence") +struct BridgeDropDedupStoreTests { + + // MARK: - ExpiringIDSet + + @Test func entriesExpireAfterLifetime() { + let start = Date(timeIntervalSince1970: 1_700_000_000) + var set = ExpiringIDSet(capacity: 8, lifetime: 60) + + let inserted = set.insert("a", now: start) + #expect(inserted) + #expect(set.contains("a", now: start)) + let duplicate = set.insert("a", now: start.addingTimeInterval(30)) + #expect(!duplicate) + + // Past the lifetime the slot is free again. + let later = start.addingTimeInterval(61) + #expect(!set.contains("a", now: later)) + let reinserted = set.insert("a", now: later) + #expect(reinserted) + } + + @Test func capacityEvictsOldestFirst() { + let start = Date(timeIntervalSince1970: 1_700_000_000) + var set = ExpiringIDSet(capacity: 2, lifetime: 3600) + + set.insert("oldest", now: start) + set.insert("middle", now: start.addingTimeInterval(1)) + set.insert("newest", now: start.addingTimeInterval(2)) + + let check = start.addingTimeInterval(3) + #expect(!set.contains("oldest", now: check)) + #expect(set.contains("middle", now: check)) + #expect(set.contains("newest", now: check)) + } + + @Test func removeReleasesSlot() { + let now = Date() + var set = ExpiringIDSet(capacity: 8, lifetime: 3600) + set.insert("a", now: now) + set.remove("a") + #expect(!set.contains("a", now: now)) + let reinserted = set.insert("a", now: now) + #expect(reinserted) + } + + @Test func initPrunesExpiredPersistedEntries() { + let now = Date() + let set = ExpiringIDSet( + capacity: 8, + lifetime: 3600, + entries: [ + "stale": now.addingTimeInterval(-7200), + "fresh": now.addingTimeInterval(-60), + ], + now: now + ) + #expect(!set.contains("stale", now: now)) + #expect(set.contains("fresh", now: now)) + } + + // MARK: - Store round trip + + @Test func snapshotRoundTripsThroughDisk() { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("bridge-dedup-store-\(UUID().uuidString).json") + defer { try? FileManager.default.removeItem(at: fileURL) } + let recorded = Date(timeIntervalSince1970: 1_700_000_000) + + let store = BridgeDropDedupStore(fileURL: fileURL) + store.save(BridgeDropDedupStore.Snapshot( + publishedDropKeys: ["msg-1": recorded], + seenDropEventIDs: ["event-1": recorded] + )) + + let reloaded = BridgeDropDedupStore(fileURL: fileURL).load() + #expect(reloaded.publishedDropKeys["msg-1"] == recorded) + #expect(reloaded.seenDropEventIDs["event-1"] == recorded) + } + + @Test func wipeRemovesTheRecord() { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("bridge-dedup-store-\(UUID().uuidString).json") + defer { try? FileManager.default.removeItem(at: fileURL) } + + let store = BridgeDropDedupStore(fileURL: fileURL) + store.save(BridgeDropDedupStore.Snapshot( + publishedDropKeys: ["msg-1": Date()], + seenDropEventIDs: [:] + )) + store.wipe() + + let reloaded = BridgeDropDedupStore(fileURL: fileURL).load() + #expect(reloaded.publishedDropKeys.isEmpty) + #expect(reloaded.seenDropEventIDs.isEmpty) + } + + @Test func nonPersistingStoreStaysEmpty() { + let store = BridgeDropDedupStore(persistsToDisk: false) + store.save(BridgeDropDedupStore.Snapshot( + publishedDropKeys: ["msg-1": Date()], + seenDropEventIDs: [:] + )) + #expect(store.load().publishedDropKeys.isEmpty) + } +} diff --git a/bitchatTests/Services/MessageRouterTests.swift b/bitchatTests/Services/MessageRouterTests.swift index ea8ba4da..5144fba8 100644 --- a/bitchatTests/Services/MessageRouterTests.swift +++ b/bitchatTests/Services/MessageRouterTests.swift @@ -446,6 +446,34 @@ struct MessageRouterTests { #expect(transport.sentCourierMessages.count == 1) } + @Test @MainActor + func enqueueReplacementCarriesOverDepositedCourierKeys() async { + // Re-sending a queued message ID replaces the outbox entry; the + // replacement must inherit which couriers already carry the message, + // or the deposit retry re-burns the same courier slots (duplicate + // sealed copies to the same peer). + let recipient = PeerID(str: "00000000000000aa") + let recipientKey = Data(repeating: 0xBB, count: 32) + let courier = PeerID(str: "00000000000000cc") + let courierKey = Data(repeating: 0xCC, count: 32) + + let transport = MockTransport() + transport.connectedPeers.insert(courier) + transport.updatePeerSnapshots([Self.snapshot(courier, key: courierKey, verified: true)]) + + let router = MessageRouter( + transports: [transport], + courierDirectory: Self.directory(recipient: recipient, recipientKey: recipientKey) + ) + router.sendPrivate("Hello", to: recipient, recipientNickname: "Peer", messageID: "ck1") + #expect(transport.sentCourierMessages.count == 1) + + // Same message ID re-sent (e.g. a resend while still queued): the + // courier already carrying it must not receive a second copy. + router.sendPrivate("Hello", to: recipient, recipientNickname: "Peer", messageID: "ck1") + #expect(transport.sentCourierMessages.count == 1) + } + @Test @MainActor func courierBecameAvailable_ignoresTheRecipientThemselves() async { let recipient = PeerID(str: "00000000000000aa") From b205a55523b0bc35e02ab1265487b4e66a254d40 Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Thu, 9 Jul 2026 19:35:18 +0200 Subject: [PATCH 074/158] Consolidate duplicate BLE links after restore; duplicate fragment-stream suppression; onChange coalescing (#1426) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Consolidate duplicate BLE links after restore; suppress duplicate fragment streams; onChange coalescing Field evidence (two-phone test after BLE state-restoration relaunches): both phones held 2-3 simultaneous same-role connections to each other — one side received every packet from three distinct centrals all bound to the same peer — so every PTT voice frame arrived 3x, and a 41KB voice file went out as TWO complete independent 89-fragment streams (different assembly ids), both fully reassembled and the duplicate only dropped at the very end by messageID dedup. 2-3x airtime/battery on all traffic plus doubled reassembly memory. Root causes and fixes: - Duplicate links stayed unbound forever: announces (the only packet that binds a link to a peer) went through the per-peer duplicate-link collapse, so a peer's second/third link never received the announce it needed to become bound — and unbound links pass the collapse untouched, so every broadcast sprayed down all of them. Direct announces now bypass the collapse and reach every live link (relayed announces keep it); once bound, the existing collapse dedups all traffic. - Same-role link retirement: a verified direct announce now consolidates our central-role connections to that peer — keep the link the announce arrived on (or the most recently bound one), cancel other connected links bound to the same peer. One connection per role per peer is the normal dual-role topology; only same-role duplicates are touched, only links already announce-bound are retired (never pre-announce links), at most one retirement per peer per rebind-cooldown window, and the peer keeps a live link either way. Directness stays forgeable (TTL is unsigned), so a replay could nominate the survivor — bounded by the cooldown and by DM routing's existing canDeliverSecurely gate. A rotation rebind now also cancels other stale links still bound to the rotated-away ID, so the ghost identity retires promptly. - Deterministic preferred-link collapse: when several bound links to one peer are candidates, collapse now keeps the peer's most recently bound link (the reverse-mapped one) instead of dictionary order; links without a discovered characteristic are excluded from fanout (they cannot be written to, and could silently eat a peer's collapsed copy). links(to:) now reports all bound peripheral links, and removing one duplicate no longer clobbers the reverse map of the survivor. - Duplicate fragment streams: a transferId-less resend (gossip-sync replay, spool) of file content already being fragmented out to a covering audience is dropped at the outbound scheduler (broadcast covers everyone; directed covers its recipient). App-initiated sends carry an explicit transferId the progress UI tracks and always run. A peer that asks after the stream completes still gets a resend. - didUnsubscribeFrom no longer flaps a peer that is still live on other links (the far side retiring its duplicate arrives as an unsubscribe); didDisconnectPeripheral bookkeeping is skipped for self-retired links by removing the store entry before cancelling. Also: guard the DeliveryStatus onChange state write in TextMessageView/ MediaMessageView (unconditional per-row writes under a message storm tripped SwiftUI's "tried to update multiple times per frame" warning). The restore-path bgRemaining=∞ log was already fixed on main (#1425 review follow-up 07b5ac31: init-time seed + sampler-routed restore captures); verified, no change needed. Co-Authored-By: Claude Fable 5 * Review fixes: multi-link disconnect guard, characteristic-aware retirement Adversarial review of the duplicate-link PR (merge-with-nits): - didDisconnectPeripheral gets the same multi-link guard as the unsubscribe path: when a duplicate link drops naturally while the peer stays live on another (dual-role central link, or a second bound link during the post-restore consolidation window), peer-disconnect bookkeeping (markDisconnected + disconnect notify) no longer runs — a UI blip until the next announce re-marked the peer connected. The reverse map was just repaired onto a connected survivor, so directLinkState is the accurate probe. Scan restart and connect-slot refill stay unguarded: they respond to the physical drop regardless of remaining logical links. (No unit test: driving the CBCentralManager delegate requires CBPeripheral instances, which cannot be constructed in tests; the policy pieces backing the guard are covered.) - Retirement is now characteristic-aware: the policy snapshot carries characteristic presence, and keptPeripheralUUID selects anchors only among writable links while any exist — consolidation must not keep a link mid-service-rediscovery (didModifyServices cleared its characteristic) and cancel the writable duplicate, stranding outbound traffic on the central link until rediscovery finishes. When neither anchor is writable but a writable duplicate exists, consolidation defers to a later announce instead of guessing. The reverse-map survivor repair in removePeripheral prefers writable links for the same reason. Three new policy tests cover charless-vs-writable. Deferred with code comments per review: central-side collapse keeps the oldest subscription (no recency signal; remote consolidates within its cooldown), and the extra preferred-bindings bleQueue hop in sendOnAllLinks (fold into a combined snapshot if profiling flags it). Co-Authored-By: Claude Fable 5 --------- Co-authored-by: jack Co-authored-by: Claude Fable 5 --- bitchat/Services/BLE/BLEFanoutSelector.swift | 54 +++++-- bitchat/Services/BLE/BLELinkStateStore.swift | 28 +++- ...BLEOutboundFragmentTransferScheduler.swift | 86 +++++++++-- .../Services/BLE/BLEOutboundLinkPlanner.swift | 7 + .../Services/BLE/BLERedundantLinkPolicy.swift | 73 +++++++++ bitchat/Services/BLE/BLEService.swift | 146 ++++++++++++++++-- .../Views/Components/TextMessageView.swift | 9 +- bitchat/Views/Media/MediaMessageView.swift | 9 +- .../Services/BLEFanoutSelectorTests.swift | 69 +++++++++ ...tboundFragmentTransferSchedulerTests.swift | 119 +++++++++++++- .../BLEOutboundLinkPlannerTests.swift | 44 +++++- .../BLERedundantLinkPolicyTests.swift | 134 ++++++++++++++++ 12 files changed, 735 insertions(+), 43 deletions(-) create mode 100644 bitchat/Services/BLE/BLERedundantLinkPolicy.swift create mode 100644 bitchatTests/Services/BLERedundantLinkPolicyTests.swift diff --git a/bitchat/Services/BLE/BLEFanoutSelector.swift b/bitchat/Services/BLE/BLEFanoutSelector.swift index 6cabcdd2..dadb9df1 100644 --- a/bitchat/Services/BLE/BLEFanoutSelector.swift +++ b/bitchat/Services/BLE/BLEFanoutSelector.swift @@ -15,6 +15,8 @@ enum BLEFanoutSelector { excludedLinks: Set = [], peripheralPeerBindings: [String: PeerID] = [:], centralPeerBindings: [String: PeerID] = [:], + preferredPeripheralPerPeer: [PeerID: String] = [:], + collapseDuplicatePeerLinks: Bool = true, directedPeerHint: PeerID?, packetType: UInt8, messageID: String @@ -31,7 +33,8 @@ enum BLEFanoutSelector { to: directedPeerHint, links: rawAllowed, peripheralPeerBindings: peripheralPeerBindings, - centralPeerBindings: centralPeerBindings + centralPeerBindings: centralPeerBindings, + preferredPeripheralPerPeer: preferredPeripheralPerPeer ) { return directedSelection } @@ -46,11 +49,20 @@ enum BLEFanoutSelector { return BLEFanoutSelection(peripheralIDs: [], centralIDs: []) } - let allowed = collapseDuplicateLinksPerPeer( - rawAllowed, - peripheralPeerBindings: peripheralPeerBindings, - centralPeerBindings: centralPeerBindings - ) + // Direct announces are the packet that binds a link to its peer + // (BLEService's raw bind and verified rebind). Collapsing them per + // peer starves duplicate same-peer links of the announce they need to + // become bound — the duplicates then look "pre-announce" forever and + // every broadcast sprays down all of them. Announces are small and + // throttled, so they go on every live link. + let allowed = collapseDuplicatePeerLinks + ? collapseDuplicateLinksPerPeer( + rawAllowed, + peripheralPeerBindings: peripheralPeerBindings, + centralPeerBindings: centralPeerBindings, + preferredPeripheralPerPeer: preferredPeripheralPerPeer + ) + : rawAllowed guard shouldSubset(packetType: packetType, directedPeerHint: directedPeerHint) else { return BLEFanoutSelection( @@ -97,7 +109,8 @@ enum BLEFanoutSelector { to peerID: PeerID, links: (peripheralIDs: [String], centralIDs: [String]), peripheralPeerBindings: [String: PeerID], - centralPeerBindings: [String: PeerID] + centralPeerBindings: [String: PeerID], + preferredPeripheralPerPeer: [PeerID: String] ) -> BLEFanoutSelection? { let directLinks = collapseDuplicateLinksPerPeer( ( @@ -105,7 +118,8 @@ enum BLEFanoutSelector { centralIDs: links.centralIDs.filter { centralPeerBindings[$0] == peerID } ), peripheralPeerBindings: peripheralPeerBindings, - centralPeerBindings: centralPeerBindings + centralPeerBindings: centralPeerBindings, + preferredPeripheralPerPeer: preferredPeripheralPerPeer ) guard !directLinks.peripheralIDs.isEmpty || !directLinks.centralIDs.isEmpty else { @@ -140,7 +154,8 @@ enum BLEFanoutSelector { private static func collapseDuplicateLinksPerPeer( _ links: (peripheralIDs: [String], centralIDs: [String]), peripheralPeerBindings: [String: PeerID], - centralPeerBindings: [String: PeerID] + centralPeerBindings: [String: PeerID], + preferredPeripheralPerPeer: [PeerID: String] ) -> (peripheralIDs: [String], centralIDs: [String]) { guard !peripheralPeerBindings.isEmpty || !centralPeerBindings.isEmpty else { return links @@ -148,13 +163,30 @@ enum BLEFanoutSelector { var seenPeers = Set() var keptPeripheralIDs: [String] = [] + // When a peer has several bound peripheral links (duplicate + // connections after a restore), collapse onto its preferred one (the + // most recently bound) instead of dictionary order — an arbitrary + // pick could route a peer's single collapsed copy down a stale link. for id in links.peripheralIDs { - if let peer = peripheralPeerBindings[id], !seenPeers.insert(peer).inserted { - continue + guard let peer = peripheralPeerBindings[id], + preferredPeripheralPerPeer[peer] == id, + seenPeers.insert(peer).inserted else { continue } + keptPeripheralIDs.append(id) + } + for id in links.peripheralIDs { + if let peer = peripheralPeerBindings[id] { + if preferredPeripheralPerPeer[peer] == id { continue } + if !seenPeers.insert(peer).inserted { continue } } keptPeripheralIDs.append(id) } + // Known limitation: centrals collapse in subscription order (oldest + // first) — there is no recency signal like the peripheral reverse + // map. A central-only peer with duplicate subscriptions rides the + // oldest one until the remote side (which owns those connections) + // consolidates on its next verified announce (bounded by its + // retirement cooldown). var keptCentralIDs: [String] = [] for id in links.centralIDs { if let peer = centralPeerBindings[id], !seenPeers.insert(peer).inserted { diff --git a/bitchat/Services/BLE/BLELinkStateStore.swift b/bitchat/Services/BLE/BLELinkStateStore.swift index cbb75fa2..31914092 100644 --- a/bitchat/Services/BLE/BLELinkStateStore.swift +++ b/bitchat/Services/BLE/BLELinkStateStore.swift @@ -164,7 +164,11 @@ final class BLELinkStateStore { guard let peerID else { return [] } var links: Set = [] - if let peripheralUUID = peerToPeripheralUUID[peerID] { + // Scan all states rather than the 1:1 reverse map: after a state + // restoration the same device can hold several live peripheral links + // bound to one peer (it reappears under a fresh UUID while the + // restored connection lives on). + for (peripheralUUID, state) in peripherals where state.peerID == peerID { links.insert(.peripheral(peripheralUUID)) } for (centralUUID, mappedPeerID) in centralToPeerID where mappedPeerID == peerID { @@ -173,6 +177,13 @@ final class BLELinkStateStore { return links } + /// The peer's most recently bound peripheral link, per peer. Used to keep + /// duplicate-link fanout collapse deterministic (see BLEFanoutSelector). + var preferredPeripheralBindings: [PeerID: String] { + assertOwned() + return peerToPeripheralUUID + } + func peerID(forPeripheralID peripheralID: String) -> PeerID? { assertOwned() return peripherals[peripheralID]?.peerID @@ -221,8 +232,19 @@ final class BLELinkStateStore { func removePeripheral(_ peripheralID: String) -> PeerID? { assertOwned() let peerID = peripherals.removeValue(forKey: peripheralID)?.peerID - if let peerID { - peerToPeripheralUUID.removeValue(forKey: peerID) + // Only clear (or repair) the reverse map when it points at the removed + // link: with duplicate links to one peer, removing a stale duplicate + // must not strand the peer's surviving bound link. + if let peerID, peerToPeripheralUUID[peerID] == peripheralID { + // Prefer a writable survivor: repairing onto a link that is + // mid-service-rediscovery would strand directed sends until the + // characteristic comes back. + let survivors = peripherals.filter { $0.value.peerID == peerID && $0.value.isConnected } + if let survivorUUID = survivors.first(where: { $0.value.characteristic != nil })?.key ?? survivors.first?.key { + peerToPeripheralUUID[peerID] = survivorUUID + } else { + peerToPeripheralUUID.removeValue(forKey: peerID) + } } return peerID } diff --git a/bitchat/Services/BLE/BLEOutboundFragmentTransferScheduler.swift b/bitchat/Services/BLE/BLEOutboundFragmentTransferScheduler.swift index 3e9d7fe7..4284cfb9 100644 --- a/bitchat/Services/BLE/BLEOutboundFragmentTransferScheduler.swift +++ b/bitchat/Services/BLE/BLEOutboundFragmentTransferScheduler.swift @@ -12,6 +12,14 @@ struct BLEOutboundFragmentTransferRequest { guard packet.type == MessageType.fileTransfer.rawValue else { return nil } return transferId ?? packet.payload.sha256Hex() } + + /// Content identity independent of the caller-chosen transfer ID: the + /// same file resent through another path (gossip-sync replay, retry) + /// arrives with a different explicit transferId but identical payload. + var contentKey: String? { + guard packet.type == MessageType.fileTransfer.rawValue else { return nil } + return packet.payload.sha256Hex() + } } struct BLEOutboundFragmentTransferScheduler { @@ -23,6 +31,11 @@ struct BLEOutboundFragmentTransferScheduler { enum SubmitResult { case start(request: BLEOutboundFragmentTransferRequest, reservedTransferId: String?) case queued(request: BLEOutboundFragmentTransferRequest, transferId: String?, position: QueuePosition) + /// The same file is already being (or waiting to be) fragmented out + /// to an audience covering this request; sending it again would just + /// double the airtime (field-verified: one 41KB voice file went out + /// as two complete fragment streams). + case droppedDuplicate(request: BLEOutboundFragmentTransferRequest, activeTransferId: String?) } enum CancelResult { @@ -38,14 +51,34 @@ struct BLEOutboundFragmentTransferScheduler { } private struct ActiveTransferState { - let totalFragments: Int + var totalFragments: Int var sentFragments: Int var workItems: [DispatchWorkItem] + var contentKey: String? + var directedPeer: PeerID? } private var activeTransfers: [String: ActiveTransferState] = [:] private var pendingTransfers: [BLEOutboundFragmentTransferRequest] = [] + /// A transfer of the same content whose audience covers `directedPeer`: + /// a broadcast covers every peer; a directed transfer covers only its + /// recipient. A directed resend to a peer NOT covered by what's in + /// flight (different recipient of a private file) is never a duplicate. + private func coveringDuplicate(contentKey: String, directedPeer: PeerID?) -> String? { + for (transferId, state) in activeTransfers where state.contentKey == contentKey { + if state.directedPeer == nil || state.directedPeer == directedPeer { + return transferId + } + } + for request in pendingTransfers where request.contentKey == contentKey { + if request.directedPeer == nil || request.directedPeer == directedPeer { + return request.resolvedTransferId + } + } + return nil + } + var activeCount: Int { activeTransfers.count } @@ -69,6 +102,16 @@ struct BLEOutboundFragmentTransferScheduler { return .start(request: request, reservedTransferId: nil) } + // Only requests without an explicit transferId are dropped as + // duplicates: those are resend paths (gossip-sync replay, directed + // spool) with no UI waiting on them. An app-initiated send carries a + // transferId whose progress events the UI tracks, so it always runs. + if request.transferId == nil, + let contentKey = request.contentKey, + let coveringId = coveringDuplicate(contentKey: contentKey, directedPeer: request.directedPeer) { + return .droppedDuplicate(request: request, activeTransferId: coveringId) + } + guard activeTransfers.count < maxConcurrentTransfers else { pendingTransfers.append(request) return .queued(request: request, transferId: transferId, position: .back) @@ -79,7 +122,13 @@ struct BLEOutboundFragmentTransferScheduler { return .queued(request: request, transferId: transferId, position: .front) } - activeTransfers[transferId] = ActiveTransferState(totalFragments: 0, sentFragments: 0, workItems: []) + activeTransfers[transferId] = ActiveTransferState( + totalFragments: 0, + sentFragments: 0, + workItems: [], + contentKey: request.contentKey, + directedPeer: request.directedPeer + ) return .start(request: request, reservedTransferId: transferId) } @@ -88,12 +137,11 @@ struct BLEOutboundFragmentTransferScheduler { totalFragments: Int, workItems: [DispatchWorkItem] ) -> Bool { - guard activeTransfers[transferId] != nil else { return false } - activeTransfers[transferId] = ActiveTransferState( - totalFragments: totalFragments, - sentFragments: 0, - workItems: workItems - ) + guard var state = activeTransfers[transferId] else { return false } + state.totalFragments = totalFragments + state.sentFragments = 0 + state.workItems = workItems + activeTransfers[transferId] = state return true } @@ -149,13 +197,25 @@ struct BLEOutboundFragmentTransferScheduler { while availableSlots > 0, !pendingTransfers.isEmpty { let request = pendingTransfers.removeFirst() - availableSlots -= 1 guard let transferId = request.resolvedTransferId else { + availableSlots -= 1 results.append(.start(request: request, reservedTransferId: nil)) continue } + // A queued duplicate of content that started while it waited + // must not resend the whole file once the slot frees up (same + // explicit-transferId exemption as submit). + if request.transferId == nil, + let contentKey = request.contentKey, + let coveringId = coveringDuplicate(contentKey: contentKey, directedPeer: request.directedPeer) { + results.append(.droppedDuplicate(request: request, activeTransferId: coveringId)) + continue + } + + availableSlots -= 1 + guard activeTransfers.count < maxConcurrentTransfers else { pendingTransfers.insert(request, at: 0) results.append(.queued(request: request, transferId: transferId, position: .front)) @@ -168,7 +228,13 @@ struct BLEOutboundFragmentTransferScheduler { continue } - activeTransfers[transferId] = ActiveTransferState(totalFragments: 0, sentFragments: 0, workItems: []) + activeTransfers[transferId] = ActiveTransferState( + totalFragments: 0, + sentFragments: 0, + workItems: [], + contentKey: request.contentKey, + directedPeer: request.directedPeer + ) results.append(.start(request: request, reservedTransferId: transferId)) } diff --git a/bitchat/Services/BLE/BLEOutboundLinkPlanner.swift b/bitchat/Services/BLE/BLEOutboundLinkPlanner.swift index 4462ecc8..5f86ebea 100644 --- a/bitchat/Services/BLE/BLEOutboundLinkPlanner.swift +++ b/bitchat/Services/BLE/BLEOutboundLinkPlanner.swift @@ -20,6 +20,8 @@ enum BLEOutboundLinkPlanner { excludedLinks: Set, peripheralPeerBindings: [String: PeerID] = [:], centralPeerBindings: [String: PeerID] = [:], + preferredPeripheralPerPeer: [PeerID: String] = [:], + directAnnounceTTL: UInt8 = TransportConfig.messageTTLDefault, directedOnlyPeer: PeerID? ) -> BLEOutboundLinkPlan { if let minLimit = minimumLinkLimit( @@ -36,6 +38,9 @@ enum BLEOutboundLinkPlanner { } let directedPeerHint = directedPeerHint(for: packet, explicitPeer: directedOnlyPeer) + // Direct announces bypass the per-peer duplicate-link collapse so + // every live link gets bound (see BLEFanoutSelector.selectLinks). + let isDirectAnnounce = packet.type == MessageType.announce.rawValue && packet.ttl == directAnnounceTTL let selectedLinks = BLEFanoutSelector.selectLinks( peripheralIDs: peripheralIDs, centralIDs: centralIDs, @@ -43,6 +48,8 @@ enum BLEOutboundLinkPlanner { excludedLinks: excludedLinks, peripheralPeerBindings: peripheralPeerBindings, centralPeerBindings: centralPeerBindings, + preferredPeripheralPerPeer: preferredPeripheralPerPeer, + collapseDuplicatePeerLinks: !isDirectAnnounce, directedPeerHint: directedPeerHint, packetType: packet.type, messageID: BLEOutboundPacketPolicy.messageID(for: packet) diff --git a/bitchat/Services/BLE/BLERedundantLinkPolicy.swift b/bitchat/Services/BLE/BLERedundantLinkPolicy.swift new file mode 100644 index 00000000..6a053b5a --- /dev/null +++ b/bitchat/Services/BLE/BLERedundantLinkPolicy.swift @@ -0,0 +1,73 @@ +import BitFoundation +import Foundation + +/// Decides which central-role connections (peripheral links we own) are +/// redundant duplicates of a peer's live link. +/// +/// One connection per role per peer is the normal dual-role topology (each +/// device is both central and peripheral). After a BLE state-restoration +/// relaunch, though, the same phone can reappear under a fresh peripheral +/// UUID while the restored connection lives on — leaving several live +/// central-role connections to one peer, each carrying every packet +/// (field-verified: 2-3x airtime on all traffic). Only same-role duplicates +/// are retired; the peer's central-role subscription on our peripheral +/// manager is its own connection to manage, and it runs the same policy. +enum BLERedundantLinkPolicy { + struct PeripheralLink: Equatable { + let uuid: String + let peerID: PeerID? + let isConnected: Bool + /// Whether the link has a discovered characteristic (is writable). + /// A link mid-service-rediscovery (didModifyServices cleared it) + /// must never be kept over a writable duplicate. + let hasCharacteristic: Bool + + init(uuid: String, peerID: PeerID?, isConnected: Bool, hasCharacteristic: Bool) { + self.uuid = uuid + self.peerID = peerID + self.isConnected = isConnected + self.hasCharacteristic = hasCharacteristic + } + } + + /// The link to keep when a peer has several connected bound peripheral + /// links, or nil when there is nothing to consolidate. Prefers the + /// ingress link of the verified direct announce that triggered the check + /// (the strongest liveness proof available), falling back to the peer's + /// most recently bound link — but only among writable links while any + /// exist: keeping a characteristic-less link and cancelling the writable + /// duplicate would strand outbound traffic on the central link until + /// rediscovery finishes. When neither anchor is a viable candidate, + /// consolidation waits for a later announce rather than guessing. + static func keptPeripheralUUID( + ingressPeripheralUUID: String?, + mostRecentlyBoundUUID: String?, + links: [PeripheralLink], + peerID: PeerID + ) -> String? { + let bound = links.filter { $0.peerID == peerID && $0.isConnected } + guard bound.count > 1 else { return nil } + + let writable = bound.filter(\.hasCharacteristic) + let candidates = writable.isEmpty ? bound : writable + + if let ingressPeripheralUUID, candidates.contains(where: { $0.uuid == ingressPeripheralUUID }) { + return ingressPeripheralUUID + } + if let mostRecentlyBoundUUID, candidates.contains(where: { $0.uuid == mostRecentlyBoundUUID }) { + return mostRecentlyBoundUUID + } + return nil + } + + /// Connected peripheral links bound to the peer other than the kept one. + static func peripheralUUIDsToRetire( + links: [PeripheralLink], + peerID: PeerID, + keeping keptUUID: String + ) -> [String] { + links + .filter { $0.peerID == peerID && $0.isConnected && $0.uuid != keptUUID } + .map(\.uuid) + } +} diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 56fee0b6..2ef8aba6 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -41,6 +41,10 @@ final class BLEService: NSObject { // store): entries older than the cooldown are pruned on insert. private var lastLinkRebindAt: [String: Date] = [:] + // Redundant-link retirement cooldown per peer (bleQueue-owned): bounds + // how often a replayed announce could flip which duplicate link survives. + private var lastRedundantLinkRetirementAt: [PeerID: Date] = [:] + // BCH-01-004: Rate-limiting for subscription-triggered announces. private var subscriptionAnnounceLimiter = BLESubscriptionAnnounceLimiter() @@ -1190,8 +1194,13 @@ final class BLEService: NSObject { let outboundPriority = BLEOutboundPacketPolicy.priority(for: packet, data: data) let states = snapshotPeripheralStates() - let connectedStates = states.filter { $0.isConnected } - let subscribedCentrals = characteristic == nil ? [] : snapshotSubscribedCentrals().centrals + // A link without a discovered characteristic cannot be written to + // (the write loop below skips it); offering it to the planner only + // wastes fanout slots — and a peer's single collapsed copy would be + // silently dropped if its bound link is still mid-rediscovery. + let connectedStates = states.filter { $0.isConnected && $0.characteristic != nil } + let centralSnapshot = snapshotSubscribedCentrals() + let subscribedCentrals = characteristic == nil ? [] : centralSnapshot.centrals let connectedPeripheralIDs = connectedStates.map { $0.peripheral.identifier.uuidString } let centralIDs = subscribedCentrals.map { $0.identifier.uuidString } let peripheralPeerBindings = Dictionary(uniqueKeysWithValues: connectedStates.compactMap { state in @@ -1207,7 +1216,12 @@ final class BLEService: NSObject { ingressRecord: ingressRecord, excludedLinks: excludedPeerLinks, peripheralPeerBindings: peripheralPeerBindings, - centralPeerBindings: snapshotSubscribedCentrals().peerIDsByCentralUUID, + centralPeerBindings: centralSnapshot.peerIDsByCentralUUID, + // Perf note: this is a third bleQueue hop per send; if send-path + // profiling ever flags it, fold it into snapshotPeripheralStates + // as a combined snapshot. + preferredPeripheralPerPeer: readLinkState { $0.preferredPeripheralBindings }, + directAnnounceTTL: messageTTL, directedOnlyPeer: directedOnlyPeer ) @@ -1925,7 +1939,17 @@ extension BLEService: CBCentralManagerDelegate { // Clean up references and peer mappings _ = linkStateStore.removePeripheral(peripheralID) - if let peerID { + // A duplicate link can drop while the peer stays live on another + // (the dual-role central link, or a second bound link after a + // restore): peer-disconnect bookkeeping only runs once the peer's + // last live link is gone. removePeripheral just repaired the reverse + // map onto a connected survivor, so directLinkState is accurate + // here. The scan restart and connect-slot refill below stay + // unguarded — they respond to the physical drop regardless of + // remaining logical links. + let remainingLinks = peerID.map { linkStateStore.directLinkState(for: $0) } + let peerStillLinked = (remainingLinks?.hasPeripheral ?? false) || (remainingLinks?.hasCentral ?? false) + if let peerID, !peerStillLinked { // Do not remove peer; mark as not connected but retain for reachability collectionsQueue.sync(flags: .barrier) { peerRegistry.markDisconnected(peerID) @@ -1933,7 +1957,7 @@ extension BLEService: CBCentralManagerDelegate { refreshLocalTopology() } - + // Restart scanning with allow duplicates for faster rediscovery if centralManager?.state == .poweredOn { // Stop and restart scanning to ensure we get fresh discovery events @@ -1944,15 +1968,15 @@ extension BLEService: CBCentralManagerDelegate { } // Attempt to fill freed slot from queue bleQueue.async { [weak self] in self?.tryConnectFromQueue() } - + // Notify delegate about disconnection on main thread (direct link dropped) notifyUI { [weak self] in guard let self = self else { return } - + // Get current peer list (after removal) let currentPeerIDs = self.collectionsQueue.sync { self.peerRegistry.peerIDs } - - if let peerID { + + if let peerID, !peerStillLinked { self.notifyPeerDisconnectedDebounced(peerID) } self.requestPeerDataPublish() @@ -2565,6 +2589,13 @@ extension BLEService: CBPeripheralManagerDelegate { // Find and disconnect the peer associated with this central if let peerID = removedPeerID { + // The remote side retiring a redundant duplicate connection + // arrives here as an unsubscribe while the peer stays live on + // its other links; only the peer's last link disconnecting + // counts. If every link truly dropped, the surviving-link + // callbacks (didDisconnectPeripheral, or this one again) run + // the bookkeeping. + guard linkStateStore.links(to: peerID).isEmpty else { return } // Mark peer as not connected; retain for reachability collectionsQueue.sync(flags: .barrier) { peerRegistry.markDisconnected(peerID) @@ -4114,6 +4145,12 @@ extension BLEService { } else { SecureLogger.debug("🚦 Queued fragment transfer waiting for slot", category: .session) } + + case let .droppedDuplicate(_, activeTransferId): + SecureLogger.debug( + "🔁 Skipping duplicate outbound transfer — same content already in flight as \(activeTransferId?.prefix(8) ?? "?")…", + category: .session + ) } } @@ -4446,9 +4483,11 @@ extension BLEService { } // A verified direct announce proves the sender owns the link it came - // in on: heal any stale binding left by a peer-ID rotation. + // in on: heal any stale binding left by a peer-ID rotation, and + // consolidate duplicate same-role connections onto that link. if let result, result.isVerified, result.isDirectAnnounce { rebindLinkAfterVerifiedDirectAnnounce(packet, to: result.peerID) + retireRedundantPeripheralLinks(packet, to: result.peerID) } // Bridge courier watch: a verified announce may add a peer whose @@ -4538,6 +4577,12 @@ extension BLEService { self.messageQueue.async { [weak self] in self?.promoteReboundPeerToConnected(peerID) } + // Any other peripheral links still bound to the rotated-away ID + // are stale duplicates of the same physical device (its restored + // connections outlived the relaunch that rotated the ID): cancel + // them now instead of leaving ghost links that spray duplicate + // traffic until the inactivity timeout. + self.cancelBoundPeripheralLinks(to: previousPeerID, keeping: linkUUID) // Retire the rotated-away ID only once its last link is gone; a // remaining stale link heals the same way or ages out. guard self.linkStateStore.links(to: previousPeerID).isEmpty else { return } @@ -4547,6 +4592,87 @@ extension BLEService { } } + /// After a restore relaunch the same phone can reappear under a fresh + /// peripheral UUID while its restored connection lives on, leaving + /// several live central-role connections to one peer that each carry + /// every packet (field-verified: every voice frame arrived 2-3x). A + /// verified direct announce is the consolidation point: keep the link it + /// proves live (or the peer's most recently bound one) and cancel the + /// rest. Only same-role duplicates are touched — one connection per role + /// is the normal dual-role topology — and only connections we own as + /// central: the peer's central subscriptions on our peripheral manager + /// are its connections to cancel, and it runs this same policy. + /// + /// Directness is forgeable (TTL is unsigned), so a replayed announce + /// could nominate the replayer's link as the survivor. Containment + /// mirrors the rotation rebind: only links already BOUND to the peer are + /// retired (announce-evidenced, never pre-announce links), at most one + /// retirement per peer per cooldown window, and the peer keeps a live + /// link either way. + private func retireRedundantPeripheralLinks(_ packet: BitchatPacket, to peerID: PeerID) { + let ingressLink = collectionsQueue.sync { ingressLinks.link(for: packet) } + bleQueue.async { [weak self] in + guard let self else { return } + let now = Date() + self.lastRedundantLinkRetirementAt = self.lastRedundantLinkRetirementAt.filter { + now.timeIntervalSince($0.value) < TransportConfig.bleLinkRebindCooldownSeconds + } + guard self.lastRedundantLinkRetirementAt[peerID] == nil else { return } + + var ingressPeripheralUUID: String? + if case .peripheral(let uuid) = ingressLink { + ingressPeripheralUUID = uuid + } + guard let keptUUID = BLERedundantLinkPolicy.keptPeripheralUUID( + ingressPeripheralUUID: ingressPeripheralUUID, + mostRecentlyBoundUUID: self.linkStateStore.preferredPeripheralBindings[peerID], + links: self.peripheralLinkPolicySnapshot(), + peerID: peerID + ) else { return } + + self.lastRedundantLinkRetirementAt[peerID] = now + // The survivor becomes the peer's reverse-mapped link so directed + // sends follow the consolidation. + self.linkStateStore.bindPeripheral(keptUUID, to: peerID) + self.cancelBoundPeripheralLinks(to: peerID, keeping: keptUUID) + self.refreshLocalTopology() + } + } + + /// Cancels our central-role connections whose link is bound to `peerID`, + /// except `keptUUID`. bleQueue only. Each entry is removed from the link + /// store BEFORE cancelling so didDisconnectPeripheral sees no peer + /// binding and skips its peer-disconnect bookkeeping — the peer is still + /// live (on the kept link, or under its rotated identity). + private func cancelBoundPeripheralLinks(to peerID: PeerID, keeping keptUUID: String?) { + let retiring = BLERedundantLinkPolicy.peripheralUUIDsToRetire( + links: peripheralLinkPolicySnapshot(), + peerID: peerID, + keeping: keptUUID ?? "" + ) + for uuid in retiring { + guard let state = linkStateStore.state(forPeripheralID: uuid) else { continue } + _ = linkStateStore.removePeripheral(uuid) + SecureLogger.info( + "🔗 Retiring redundant link \(uuid.prefix(8))… bound to \(peerID.id.prefix(8))…\(keptUUID.map { " (keeping \($0.prefix(8))…)" } ?? "")", + category: .session + ) + centralManager?.cancelPeripheralConnection(state.peripheral) + } + } + + /// bleQueue only (reads the link store). + private func peripheralLinkPolicySnapshot() -> [BLERedundantLinkPolicy.PeripheralLink] { + linkStateStore.peripheralStates.map { + BLERedundantLinkPolicy.PeripheralLink( + uuid: $0.peripheral.identifier.uuidString, + peerID: $0.peerID, + isConnected: $0.isConnected, + hasCharacteristic: $0.characteristic != nil + ) + } + } + /// After a successful verified rebind the new identity owns a live link, /// but its announce was stored disconnected (the link was still bound to /// the rotated-away ID when the registry upsert ran). Flip it to diff --git a/bitchat/Views/Components/TextMessageView.swift b/bitchat/Views/Components/TextMessageView.swift index 497b4280..2e1009d7 100644 --- a/bitchat/Views/Components/TextMessageView.swift +++ b/bitchat/Views/Components/TextMessageView.swift @@ -131,9 +131,14 @@ struct TextMessageView: View { } // Collapse the revealed caption when the status advances (e.g. // sending → sent → delivered) so a detail opened for one state - // doesn't linger and silently morph into another. + // doesn't linger and silently morph into another. Guarded write: + // under a message storm many rows change status within one frame, + // and an unconditional state write per change trips SwiftUI's + // "tried to update multiple times per frame" re-entrancy warning. .onChange(of: deliveryStatus) { _ in - showDeliveryDetail = false + if showDeliveryDetail { + showDeliveryDetail = false + } } } } diff --git a/bitchat/Views/Media/MediaMessageView.swift b/bitchat/Views/Media/MediaMessageView.swift index dd3b79b0..2b12ee24 100644 --- a/bitchat/Views/Media/MediaMessageView.swift +++ b/bitchat/Views/Media/MediaMessageView.swift @@ -121,9 +121,14 @@ struct MediaMessageView: View { .padding(.vertical, 4) // Collapse the revealed caption when the status advances (e.g. // sending → sent → delivered) so a detail opened for one state - // doesn't linger and silently morph into another. + // doesn't linger and silently morph into another. Guarded write: + // under a message storm many rows change status within one frame, + // and an unconditional state write per change trips SwiftUI's + // "tried to update multiple times per frame" re-entrancy warning. .onChange(of: deliveryStatus) { _ in - showDeliveryDetail = false + if showDeliveryDetail { + showDeliveryDetail = false + } } } diff --git a/bitchatTests/Services/BLEFanoutSelectorTests.swift b/bitchatTests/Services/BLEFanoutSelectorTests.swift index deec44f5..5832b676 100644 --- a/bitchatTests/Services/BLEFanoutSelectorTests.swift +++ b/bitchatTests/Services/BLEFanoutSelectorTests.swift @@ -192,6 +192,75 @@ struct BLEFanoutSelectorTests { #expect(selection.centralIDs == Set(["c-unbound"])) } + @Test + func duplicateBoundLinksToOnePeerCollapseToItsPreferredLink() { + // After a restore the same phone can hold several live links bound to + // one peer; broadcasts must go down exactly one — the most recently + // bound (preferred) one, not dictionary order. + let peer = PeerID(str: "1122334455667788") + let selection = BLEFanoutSelector.selectLinks( + peripheralIDs: ["p-stale", "p-preferred", "p-stale-2"], + centralIDs: ["c-bound"], + ingressLink: nil, + peripheralPeerBindings: [ + "p-stale": peer, + "p-preferred": peer, + "p-stale-2": peer + ], + centralPeerBindings: ["c-bound": peer], + preferredPeripheralPerPeer: [peer: "p-preferred"], + directedPeerHint: nil, + packetType: MessageType.fragment.rawValue, + messageID: "message-1" + ) + + #expect(selection.peripheralIDs == Set(["p-preferred"])) + #expect(selection.centralIDs.isEmpty) + } + + @Test + func directedSendCollapsesDuplicateBoundLinksToPreferred() { + let peer = PeerID(str: "1122334455667788") + let selection = BLEFanoutSelector.selectLinks( + peripheralIDs: ["p-stale", "p-preferred"], + centralIDs: [], + ingressLink: nil, + peripheralPeerBindings: [ + "p-stale": peer, + "p-preferred": peer + ], + preferredPeripheralPerPeer: [peer: "p-preferred"], + directedPeerHint: peer, + packetType: MessageType.noiseEncrypted.rawValue, + messageID: "message-1" + ) + + #expect(selection.peripheralIDs == Set(["p-preferred"])) + #expect(selection.centralIDs.isEmpty) + } + + @Test + func uncollapsedSelectionReachesEveryLinkOfADuplicatelyLinkedPeer() { + // Announce fanout (collapse bypassed by the planner): the announce is + // the packet that binds links, so every live link must receive it. + let peer = PeerID(str: "1122334455667788") + let selection = BLEFanoutSelector.selectLinks( + peripheralIDs: ["p1", "p2"], + centralIDs: ["c1"], + ingressLink: nil, + peripheralPeerBindings: ["p1": peer, "p2": peer], + centralPeerBindings: ["c1": peer], + preferredPeripheralPerPeer: [peer: "p1"], + collapseDuplicatePeerLinks: false, + directedPeerHint: nil, + packetType: MessageType.announce.rawValue, + messageID: "message-1" + ) + + #expect(selection.peripheralIDs == Set(["p1", "p2"])) + #expect(selection.centralIDs == Set(["c1"])) + } + @Test func broadcastWithTwoLinksKeepsBothAfterIngressExclusion() { let selection = BLEFanoutSelector.selectLinks( diff --git a/bitchatTests/Services/BLEOutboundFragmentTransferSchedulerTests.swift b/bitchatTests/Services/BLEOutboundFragmentTransferSchedulerTests.swift index 91b54399..c57c8922 100644 --- a/bitchatTests/Services/BLEOutboundFragmentTransferSchedulerTests.swift +++ b/bitchatTests/Services/BLEOutboundFragmentTransferSchedulerTests.swift @@ -62,6 +62,114 @@ struct BLEOutboundFragmentTransferSchedulerTests { } } + @Test + func resendWithoutTransferIdOfActiveBroadcastContentIsDropped() { + // Field bug: a gossip-sync replay re-fragmented a 41KB voice file + // that was still being broadcast, sending two complete fragment + // streams. The resend path has no explicit transferId; drop it while + // a covering transfer of the same bytes is in flight. + var scheduler = BLEOutboundFragmentTransferScheduler() + let original = makeRequest(type: MessageType.fileTransfer.rawValue, transferId: "app-id", payload: "voice-file") + let resend = makeRequest(type: MessageType.fileTransfer.rawValue, transferId: nil, payload: "voice-file") + + _ = scheduler.submit(original, maxConcurrentTransfers: 2) + let result = scheduler.submit(resend, maxConcurrentTransfers: 2) + + if case let .droppedDuplicate(_, activeTransferId) = result { + #expect(activeTransferId == "app-id") + #expect(scheduler.activeCount == 1) + #expect(scheduler.pendingCount == 0) + } else { + Issue.record("Expected the transferId-less resend of in-flight broadcast content to be dropped") + } + } + + @Test + func directedResendToAnUncoveredAudienceStillRuns() { + // The in-flight copy is directed to one peer; a resend of the same + // bytes to a different peer is not redundant. + var scheduler = BLEOutboundFragmentTransferScheduler() + let toFirstPeer = makeRequest( + type: MessageType.fileTransfer.rawValue, + transferId: "app-id", + payload: "shared-file", + directedPeer: PeerID(str: "1122334455667788") + ) + let toSecondPeer = makeRequest( + type: MessageType.fileTransfer.rawValue, + transferId: nil, + payload: "shared-file", + directedPeer: PeerID(str: "8877665544332211") + ) + + _ = scheduler.submit(toFirstPeer, maxConcurrentTransfers: 2) + let result = scheduler.submit(toSecondPeer, maxConcurrentTransfers: 2) + + if case .start = result { + #expect(scheduler.activeCount == 2) + } else { + Issue.record("Expected a resend directed at an uncovered peer to start") + } + } + + @Test + func explicitTransferIdSendIsNeverDroppedAsDuplicate() { + // App-initiated sends carry a transferId the progress UI tracks; + // only transferId-less resend paths are deduplicated. + var scheduler = BLEOutboundFragmentTransferScheduler() + let first = makeRequest(type: MessageType.fileTransfer.rawValue, transferId: "send-1", payload: "same-bytes") + let second = makeRequest(type: MessageType.fileTransfer.rawValue, transferId: "send-2", payload: "same-bytes") + + _ = scheduler.submit(first, maxConcurrentTransfers: 2) + let result = scheduler.submit(second, maxConcurrentTransfers: 2) + + if case let .start(_, reservedTransferId?) = result { + #expect(reservedTransferId == "send-2") + } else { + Issue.record("Expected an explicit-transferId send to run despite identical content") + } + } + + @Test + func duplicateOfPendingContentIsDroppedAtSubmit() { + // A duplicate must not queue behind a pending copy of the same + // content and resend the whole file when the slot frees. + var scheduler = BLEOutboundFragmentTransferScheduler() + let active = makeRequest(type: MessageType.fileTransfer.rawValue, transferId: "active", payload: "file-a") + let queuedContent = makeRequest(type: MessageType.fileTransfer.rawValue, transferId: "waiting", payload: "file-b") + let queuedDuplicate = makeRequest(type: MessageType.fileTransfer.rawValue, transferId: nil, payload: "file-b") + + _ = scheduler.submit(active, maxConcurrentTransfers: 1) + _ = scheduler.submit(queuedContent, maxConcurrentTransfers: 1) + + if case .droppedDuplicate = scheduler.submit(queuedDuplicate, maxConcurrentTransfers: 1) { + // Dropped immediately: the pending "waiting" transfer covers it. + } else { + Issue.record("Expected the duplicate of pending content to be dropped at submit") + } + #expect(scheduler.pendingCount == 1) + } + + @Test + func resendAfterCompletionIsAllowed() { + // Duplicate suppression only covers in-flight transfers: a peer that + // requests the file after the stream completed must get a resend. + var scheduler = BLEOutboundFragmentTransferScheduler() + let original = makeRequest(type: MessageType.fileTransfer.rawValue, transferId: "app-id", payload: "voice-file") + let resend = makeRequest(type: MessageType.fileTransfer.rawValue, transferId: nil, payload: "voice-file") + + _ = scheduler.submit(original, maxConcurrentTransfers: 1) + let didActivate = scheduler.activateReservedTransfer(id: "app-id", totalFragments: 1, workItems: []) + #expect(didActivate) + #expect(scheduler.markFragmentSent(transferId: "app-id") == .complete(sentFragments: 1, totalFragments: 1)) + + if case .start = scheduler.submit(resend, maxConcurrentTransfers: 1) { + #expect(scheduler.activeCount == 1) + } else { + Issue.record("Expected a resend after completion to start") + } + } + @Test func cancelActiveTransferReturnsScheduledWorkItems() { var scheduler = BLEOutboundFragmentTransferScheduler() @@ -128,20 +236,25 @@ struct BLEOutboundFragmentTransferSchedulerTests { #expect(scheduler.pendingCount == 0) } - private func makeRequest(type: UInt8, transferId: String?) -> BLEOutboundFragmentTransferRequest { + private func makeRequest( + type: UInt8, + transferId: String?, + payload: String? = nil, + directedPeer: PeerID? = nil + ) -> BLEOutboundFragmentTransferRequest { BLEOutboundFragmentTransferRequest( packet: BitchatPacket( type: type, senderID: Data([0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77]), recipientID: nil, timestamp: 0x0102030405, - payload: Data((transferId ?? "payload").utf8), + payload: Data((payload ?? transferId ?? "payload").utf8), signature: nil, ttl: 3 ), pad: false, maxChunk: nil, - directedPeer: nil, + directedPeer: directedPeer, transferId: transferId ) } diff --git a/bitchatTests/Services/BLEOutboundLinkPlannerTests.swift b/bitchatTests/Services/BLEOutboundLinkPlannerTests.swift index 9d10e218..74bcb9ba 100644 --- a/bitchatTests/Services/BLEOutboundLinkPlannerTests.swift +++ b/bitchatTests/Services/BLEOutboundLinkPlannerTests.swift @@ -113,6 +113,45 @@ struct BLEOutboundLinkPlannerTests { #expect(!plan.shouldSpoolDirectedPacket) } + @Test + func directAnnounceBypassesDuplicateLinkCollapseButRelayedAnnounceDoesNot() { + let peer = PeerID(str: "1122334455667788") + let bindings: [String: PeerID] = ["p1": peer, "p2": peer] + + let direct = BLEOutboundLinkPlanner.plan( + packet: makePacket(type: .announce), + dataCount: 32, + peripheralIDs: ["p1", "p2"], + peripheralWriteLimits: [128, 128], + centralIDs: [], + centralNotifyLimits: [], + ingressRecord: nil, + excludedLinks: [], + peripheralPeerBindings: bindings, + preferredPeripheralPerPeer: [peer: "p1"], + directedOnlyPeer: nil + ) + // A direct announce is the link-binding packet: it must reach every + // live link, including a peer's duplicate connections. + #expect(direct.selectedLinks.peripheralIDs == Set(["p1", "p2"])) + + let relayed = BLEOutboundLinkPlanner.plan( + packet: makePacket(type: .announce, ttl: TransportConfig.messageTTLDefault - 1), + dataCount: 32, + peripheralIDs: ["p1", "p2"], + peripheralWriteLimits: [128, 128], + centralIDs: [], + centralNotifyLimits: [], + ingressRecord: nil, + excludedLinks: [], + peripheralPeerBindings: bindings, + preferredPeripheralPerPeer: [peer: "p1"], + directedOnlyPeer: nil + ) + // Relayed announces keep the per-peer collapse (relay hygiene). + #expect(relayed.selectedLinks.peripheralIDs == Set(["p1"])) + } + @Test func minimumLinkLimitUsesTheSmallestPresentRoleLimit() { #expect(BLEOutboundLinkPlanner.minimumLinkLimit(peripheralWriteLimits: [80, 120], centralNotifyLimits: []) == 80) @@ -123,7 +162,8 @@ struct BLEOutboundLinkPlannerTests { private func makePacket( type: MessageType, sender: PeerID = PeerID(str: "8877665544332211"), - recipient: PeerID? = nil + recipient: PeerID? = nil, + ttl: UInt8 = TransportConfig.messageTTLDefault ) -> BitchatPacket { BitchatPacket( type: type.rawValue, @@ -132,7 +172,7 @@ struct BLEOutboundLinkPlannerTests { timestamp: 1234, payload: Data([0x01, 0x02]), signature: nil, - ttl: TransportConfig.messageTTLDefault + ttl: ttl ) } } diff --git a/bitchatTests/Services/BLERedundantLinkPolicyTests.swift b/bitchatTests/Services/BLERedundantLinkPolicyTests.swift new file mode 100644 index 00000000..db23a5e8 --- /dev/null +++ b/bitchatTests/Services/BLERedundantLinkPolicyTests.swift @@ -0,0 +1,134 @@ +import BitFoundation +import Foundation +import Testing +@testable import bitchat + +struct BLERedundantLinkPolicyTests { + private let peer = PeerID(str: "1122334455667788") + private let otherPeer = PeerID(str: "8877665544332211") + + private func link(_ uuid: String, _ peerID: PeerID?, connected: Bool = true, writable: Bool = true) -> BLERedundantLinkPolicy.PeripheralLink { + BLERedundantLinkPolicy.PeripheralLink(uuid: uuid, peerID: peerID, isConnected: connected, hasCharacteristic: writable) + } + + @Test + func singleBoundLinkNeedsNoConsolidation() { + let kept = BLERedundantLinkPolicy.keptPeripheralUUID( + ingressPeripheralUUID: "p1", + mostRecentlyBoundUUID: "p1", + links: [link("p1", peer), link("p2", otherPeer)], + peerID: peer + ) + #expect(kept == nil) + } + + @Test + func ingressLinkOfVerifiedAnnounceWinsOverReverseMap() { + let kept = BLERedundantLinkPolicy.keptPeripheralUUID( + ingressPeripheralUUID: "p-ingress", + mostRecentlyBoundUUID: "p-reverse", + links: [link("p-ingress", peer), link("p-reverse", peer), link("p-stale", peer)], + peerID: peer + ) + #expect(kept == "p-ingress") + } + + @Test + func centralIngressFallsBackToMostRecentlyBoundLink() { + // The announce arrived on the central link (a write), so no ingress + // peripheral exists; the peer's reverse-mapped link survives. + let kept = BLERedundantLinkPolicy.keptPeripheralUUID( + ingressPeripheralUUID: nil, + mostRecentlyBoundUUID: "p-reverse", + links: [link("p-reverse", peer), link("p-stale", peer)], + peerID: peer + ) + #expect(kept == "p-reverse") + } + + @Test + func noLiveCandidateAmongBoundLinksRetiresNothing() { + let kept = BLERedundantLinkPolicy.keptPeripheralUUID( + ingressPeripheralUUID: nil, + mostRecentlyBoundUUID: "p-disconnected", + links: [link("p-disconnected", peer, connected: false), link("p1", peer), link("p2", peer)], + peerID: peer + ) + #expect(kept == nil) + } + + @Test + func characteristicLessAnchorLosesToWritableDuplicate() { + // The ingress link is mid-service-rediscovery (no characteristic): + // keeping it and cancelling the writable duplicate would strand + // outbound traffic on the central link, so the writable + // reverse-mapped link wins. + let kept = BLERedundantLinkPolicy.keptPeripheralUUID( + ingressPeripheralUUID: "p-charless", + mostRecentlyBoundUUID: "p-writable", + links: [link("p-charless", peer, writable: false), link("p-writable", peer)], + peerID: peer + ) + #expect(kept == "p-writable") + } + + @Test + func writableDuplicateThatIsNoAnchorDefersConsolidation() { + // Both anchors are characteristic-less but a writable third link + // exists: never keep a charless link over it — wait for a later + // announce instead of guessing which link to keep. + let kept = BLERedundantLinkPolicy.keptPeripheralUUID( + ingressPeripheralUUID: "p-charless-1", + mostRecentlyBoundUUID: "p-charless-2", + links: [ + link("p-charless-1", peer, writable: false), + link("p-charless-2", peer, writable: false), + link("p-writable", peer) + ], + peerID: peer + ) + #expect(kept == nil) + } + + @Test + func allCharacteristicLessDuplicatesStillConsolidateOnIngress() { + // No writable link exists at all (all mid-rediscovery): the ingress + // anchor still consolidates — no writable duplicate is at risk. + let kept = BLERedundantLinkPolicy.keptPeripheralUUID( + ingressPeripheralUUID: "p-ingress", + mostRecentlyBoundUUID: "p-stale", + links: [link("p-ingress", peer, writable: false), link("p-stale", peer, writable: false)], + peerID: peer + ) + #expect(kept == "p-ingress") + } + + @Test + func retirementSparesKeptLinkUnboundLinksAndOtherPeers() { + let retiring = BLERedundantLinkPolicy.peripheralUUIDsToRetire( + links: [ + link("p-kept", peer), + link("p-dup-1", peer), + link("p-dup-2", peer), + link("p-gone", peer, connected: false), + link("p-unbound", nil), + link("p-other", otherPeer) + ], + peerID: peer, + keeping: "p-kept" + ) + #expect(Set(retiring) == Set(["p-dup-1", "p-dup-2"])) + } + + @Test + func rotationCleanupWithNoSurvivorRetiresEveryBoundLink() { + // Rotated-away identity: the rebound link now belongs to the new ID, + // so every link still bound to the old ID is a stale duplicate. + let retiring = BLERedundantLinkPolicy.peripheralUUIDsToRetire( + links: [link("p-stale-1", peer), link("p-stale-2", peer)], + peerID: peer, + keeping: "" + ) + #expect(Set(retiring) == Set(["p-stale-1", "p-stale-2"])) + } +} From 820c933958bdce73b2ba22b932f3e1594b177d2c Mon Sep 17 00:00:00 2001 From: jack <212554440+jackjackbits@users.noreply.github.com> Date: Fri, 10 Jul 2026 14:04:09 +0200 Subject: [PATCH 075/158] Harden PTT audio and the 1.7.1 release (#1423) Centralize PTT and voice audio-session ownership, harden courier/bridge/outbox delivery and recovery, correct location and delivery-state races, add privacy/release metadata, and ship reproducible universal Arti slices with Release CI coverage. Validated by the full iOS suite, repeated audio/fragment/performance regressions, BitFoundation tests, strict lint and dead-code analysis, universal iOS Release builds, and iOS/macOS archives. --- .github/workflows/swift-tests.yml | 25 +- PRIVACY_POLICY.md | 224 +++-- bitchat.xcodeproj/project.pbxproj | 14 +- bitchat/App/AppRuntime.swift | 18 +- bitchat/App/ConversationStore.swift | 8 +- bitchat/App/NearbyNotesCounter.swift | 9 + .../voice/AudioSessionCoordinator.swift | 472 +++++++++++ bitchat/Features/voice/PTTBurstPlayer.swift | 429 +++++++++- bitchat/Features/voice/PTTCaptureEngine.swift | 215 ++++- .../Features/voice/VoiceCaptureSession.swift | 69 +- .../voice/VoiceNotePlaybackController.swift | 184 ++++- bitchat/Features/voice/VoiceRecorder.swift | 281 +++++-- bitchat/Info.plist | 6 +- bitchat/Nostr/NostrProtocol.swift | 7 +- bitchat/Nostr/NostrRelayManager.swift | 139 +++- bitchat/PrivacyInfo.xcprivacy | 41 + bitchat/Protocols/MeshMessageIdentity.swift | 13 +- bitchat/Services/BLE/BLEFanoutSelector.swift | 4 + ...BLEOutboundFragmentTransferScheduler.swift | 46 ++ .../Services/BLE/BLEOutboundLinkPlanner.swift | 40 +- .../BLE/BLEOutboundNotificationBuffer.swift | 12 + .../Services/BLE/BLEOutboundWriteBuffer.swift | 29 +- bitchat/Services/BLE/BLEService.swift | 508 ++++++++++-- bitchat/Services/Courier/CourierStore.swift | 332 +++++++- .../Services/Courier/MessageOutboxStore.swift | 768 +++++++++++++++++- .../Gateway/BridgeCourierService.swift | 323 ++++++-- bitchat/Services/Gateway/BridgeService.swift | 294 +++++-- bitchat/Services/KeychainManager.swift | 13 +- bitchat/Services/LocationStateManager.swift | 19 +- .../MessageDeduplicationService.swift | 10 + bitchat/Services/MessageRouter.swift | 81 +- bitchat/Services/TransportConfig.swift | 3 + .../ViewModels/ChatLiveVoiceCoordinator.swift | 19 +- bitchat/ViewModels/ChatViewModel.swift | 28 +- .../ChatViewModelBootstrapper.swift | 40 +- .../ViewModels/GeoChannelCoordinator.swift | 61 +- .../ViewModels/PublicMessagePipeline.swift | 15 + .../ViewModels/VoiceRecordingViewModel.swift | 45 +- bitchat/Views/NoticesView.swift | 242 ++++-- bitchatShareExtension/Info.plist | 2 - bitchatShareExtension/PrivacyInfo.xcprivacy | 23 + .../ShareViewController.swift | 71 +- .../AudioSessionCoordinatorTests.swift | 510 ++++++++++++ bitchatTests/BLEServiceCoreTests.swift | 125 +++ ...eConversationCoordinatorContextTests.swift | 2 +- ...tVerificationCoordinatorContextTests.swift | 2 +- .../ChatViewModelDeliveryStatusTests.swift | 8 + bitchatTests/ChatViewModelTests.swift | 34 + bitchatTests/CourierStoreTests.swift | 131 +++ .../EndToEnd/CourierEndToEndTests.swift | 46 +- .../Fragmentation/FragmentationTests.swift | 176 +--- .../GeoChannelCoordinatorContextTests.swift | 85 +- .../MessageDeduplicationServiceTests.swift | 24 + bitchatTests/Mocks/MockKeychain.swift | 11 + bitchatTests/NearbyNotesCounterTests.swift | 157 ++++ bitchatTests/NoiseEncryptionTests.swift | 2 +- bitchatTests/PTTBurstPlayerTests.swift | 470 +++++++++++ .../PerformanceBaselineTests.swift | 7 +- .../Protocols/BridgeWireFormatTests.swift | 7 +- bitchatTests/PublicMessagePipelineTests.swift | 14 + .../Services/BLEAnnounceThrottleTests.swift | 2 +- ...tboundFragmentTransferSchedulerTests.swift | 33 +- .../BLEOutboundLinkPlannerTests.swift | 49 ++ .../BLEOutboundNotificationBufferTests.swift | 15 + .../BLEOutboundWriteBufferTests.swift | 34 + .../Services/BridgeCourierServiceTests.swift | 319 +++++++- .../Services/BridgeDropDedupStoreTests.swift | 2 +- .../Services/BridgeServiceTests.swift | 230 +++++- .../Services/GatewayServiceTests.swift | 2 +- .../Services/LocationStateManagerTests.swift | 40 + .../Services/MessageOutboxStoreTests.swift | 204 +++++ .../Services/MessageRouterTests.swift | 323 ++++++++ .../Services/NostrRelayManagerTests.swift | 153 +++- bitchatTests/ViewSmokeTests.swift | 2 +- bitchatTests/VoiceCaptureSessionTests.swift | 207 +++++ .../VoiceNotePlaybackControllerTests.swift | 145 ++++ bitchatTests/VoiceRecorderTests.swift | 402 +++++++++ docs/ARTI-BINARY-PROVENANCE.md | 34 +- docs/privacy-assessment.md | 156 ++-- .../Frameworks/arti.xcframework/Info.plist | 6 +- .../ios-arm64/libarti_bitchat.a | Bin 7290456 -> 7290456 bytes .../Headers/arti.h | 0 .../libarti_bitchat.a | Bin 7279944 -> 14098232 bytes .../macos-arm64/libarti_bitchat.a | Bin 7306872 -> 0 bytes .../Headers/arti.h | 0 .../macos-arm64_x86_64/libarti_bitchat.a | Bin 0 -> 15146088 bytes localPackages/Arti/build-ios.sh | 94 ++- .../KeychainManagerProtocol.swift | 15 + .../BitFoundationTests/MockKeychain.swift | 2 +- .../BitFoundationTests/TestConstants.swift | 2 +- .../BitFoundationTests/TestHelpers.swift | 2 +- 91 files changed, 8382 insertions(+), 1084 deletions(-) create mode 100644 bitchat/Features/voice/AudioSessionCoordinator.swift create mode 100644 bitchat/PrivacyInfo.xcprivacy create mode 100644 bitchatShareExtension/PrivacyInfo.xcprivacy create mode 100644 bitchatTests/AudioSessionCoordinatorTests.swift create mode 100644 bitchatTests/PTTBurstPlayerTests.swift create mode 100644 bitchatTests/VoiceCaptureSessionTests.swift create mode 100644 bitchatTests/VoiceNotePlaybackControllerTests.swift create mode 100644 bitchatTests/VoiceRecorderTests.swift rename localPackages/Arti/Frameworks/arti.xcframework/{ios-arm64-simulator => ios-arm64_x86_64-simulator}/Headers/arti.h (100%) rename localPackages/Arti/Frameworks/arti.xcframework/{ios-arm64-simulator => ios-arm64_x86_64-simulator}/libarti_bitchat.a (51%) delete mode 100644 localPackages/Arti/Frameworks/arti.xcframework/macos-arm64/libarti_bitchat.a rename localPackages/Arti/Frameworks/arti.xcframework/{macos-arm64 => macos-arm64_x86_64}/Headers/arti.h (100%) create mode 100644 localPackages/Arti/Frameworks/arti.xcframework/macos-arm64_x86_64/libarti_bitchat.a diff --git a/.github/workflows/swift-tests.yml b/.github/workflows/swift-tests.yml index c82ade66..81856b24 100644 --- a/.github/workflows/swift-tests.yml +++ b/.github/workflows/swift-tests.yml @@ -131,10 +131,10 @@ jobs: echo "No coverage data found; skipping summary." fi - # SPM tests above only compile the macOS slice; this job covers the - # iOS-conditional code paths (UIKit, CoreBluetooth restoration, etc.). + # SPM tests do not link the shipping app targets. This job covers the + # iOS-conditional paths and both universal Release link configurations. ios-build: - name: Build iOS app (simulator) + name: Build Release apps (universal) runs-on: macos-latest timeout-minutes: 15 @@ -143,14 +143,29 @@ jobs: uses: actions/checkout@v5 - name: Build iOS (simulator, no signing) - # arm64 only: the vendored arti.xcframework has no x86_64 simulator slice. + # Build both simulator architectures so CI validates every vendored + # Arti simulator slice and the configuration that ships. run: | set -o pipefail xcodebuild -project bitchat.xcodeproj \ -scheme "bitchat (iOS)" \ + -configuration Release \ -sdk iphonesimulator \ -destination 'generic/platform=iOS Simulator' \ - ARCHS=arm64 \ + ARCHS='arm64 x86_64' \ + ONLY_ACTIVE_ARCH=NO \ + CODE_SIGNING_ALLOWED=NO \ + build + + - name: Build macOS (universal, no signing) + run: | + set -o pipefail + xcodebuild -project bitchat.xcodeproj \ + -scheme "bitchat (macOS)" \ + -configuration Release \ + -destination 'generic/platform=macOS' \ + ARCHS='arm64 x86_64' \ + ONLY_ACTIVE_ARCH=NO \ CODE_SIGNING_ALLOWED=NO \ build diff --git a/PRIVACY_POLICY.md b/PRIVACY_POLICY.md index 03d770de..93edc3b6 100644 --- a/PRIVACY_POLICY.md +++ b/PRIVACY_POLICY.md @@ -1,165 +1,155 @@ # bitchat Privacy Policy -*Last updated: June 2026* +*Last updated: July 2026* ## Our Commitment -bitchat is designed with privacy as its foundation. We believe private communication is a fundamental human right. This policy explains how bitchat protects your privacy. +bitchat is designed for private, account-free communication. This policy describes what the app keeps on your device, what it sends when you use mesh or optional internet features, and how long local data can remain. ## Summary -- **No personal data collection** - We don't collect names, emails, or phone numbers -- **No accounts or company servers** - Mesh chat works peer-to-peer; optional Nostr features use public or user-selected relays -- **No tracking** - We have no analytics, telemetry, or user tracking -- **Open source** - You can verify these claims by reading our code +- **No project-operated accounts or messaging servers** — Bluetooth mesh is peer-to-peer; optional internet features use public or user-selected Nostr relays. +- **No analytics, advertising, telemetry, or tracking** — the app does not contain an analytics or advertising SDK. +- **No sale of data** — the project does not sell user data or build advertising profiles. +- **Open source** — the storage, networking, and cryptography described here can be inspected in the source code. -## What Information bitchat Stores +## What bitchat Stores on Your Device -### On Your Device Only +1. **Identity and cryptographic keys** + - Noise, signing, group, prekey, and optional Nostr identity material is generated locally. + - Secret keys are stored in the system keychain. Public keys are shared when required for messaging, verification, groups, or Nostr events. + - Keys remain until they are rotated, removed by the relevant feature, erased with panic wipe, or removed with the app. -1. **Identity Keys** - - Cryptographic private keys generated on first launch or when optional Nostr identities are created - - Stored locally in your device's secure storage - - Allows you to maintain "favorite" relationships across app restarts - - Private keys never leave your device; public keys are shared when needed for messaging +2. **Nickname, preferences, and relationships** + - Your nickname, settings, favorites, petnames, read-receipt identifiers, and bounded operational metadata are stored locally. + - The share extension briefly places content you choose to share in the app-group preferences so the main app can import it. -2. **Nickname** - - The display name you choose (or auto-generated) - - Stored only on your device - - Shared with peers you communicate with +3. **Private group state** + - Group names, rosters, creator identity, and key epoch are stored as protected files in Application Support. + - Current group keys are stored in the keychain. Group state remains until you leave or remove the group, panic-wipe the app, or remove the app. -3. **Message History** (if enabled) - - When room owners enable retention, messages are saved locally - - Stored encrypted on your device - - You can delete this at any time +4. **Queued and carried private messages** + - An outgoing private message that has not been acknowledged may remain for up to 24 hours in a bounded, encrypted outbox. The outbox is sealed with ChaCha20-Poly1305 and its key is stored in the keychain. + - A device acting as a courier may store a bounded opaque end-to-end encrypted envelope for another user for up to 24 hours. The courier cannot read its message content. + - A panic wipe deletes both stores. -4. **Favorite Peers** - - Public keys of peers you mark as favorites - - Stored only on your device - - Allows you to recognize these peers in future sessions +5. **Recent public mesh messages and notices** + - Signed public mesh messages may be kept in a protected local gossip archive for up to 15 minutes so they can cross mesh partitions and survive a short relaunch. + - Public bulletin-board posts and deletion tombstones persist until the post's author-selected expiry, at most seven days. Both stores are bounded and panic-wipeable. + - These items are public to the mesh or board where they are posted; they are not confidential messages. -5. **Optional Location Channel State** - - Your selected geohash channel, bookmarked geohashes, teleport flags, and bookmark display names - - Stored locally on your device so the location-channel UI can restore your choices - - Per-geohash Nostr identities are derived locally from a device seed stored in secure storage - - Exact latitude and longitude are not persisted by bitchat +6. **Media attachments** + - Voice notes and images you send or receive can be stored under Application Support so they remain playable while referenced by the app. + - Incoming media is subject to a 100 MB quota with oldest-file eviction. Media is deleted by panic wipe or app removal; some outgoing media can otherwise remain on disk. -### Temporary Session Data +7. **Optional location-channel state** + - Your selected geohash channel, bookmarks, teleport flags, and bookmark display names are stored locally so the UI can restore them. + - Per-geohash Nostr identities are derived locally from a device seed stored in the keychain. + - bitchat does not persist exact latitude or longitude and does not include exact coordinates in mesh or Nostr messages. -During each session, bitchat temporarily maintains: -- Active peer connections (forgotten when app closes) -- Routing information for message delivery -- Cached messages for offline peers (12 hours max) -- Your current location while optional location channels are enabled, used locally to compute geohash channels and friendly place names +## Temporary Session Data -## What Information is Shared +While running, bitchat maintains active connections, routing state, deduplication state, and bounded in-memory conversation timelines. Closing the app clears the in-memory timelines and active connections, but it does not erase the persistent stores listed above. -### With Other bitchat Users +## What Is Shared -When you use bitchat, nearby peers can see: -- Your chosen nickname -- Your ephemeral public key (changes each session) -- Messages you send to public rooms or directly to them -- Your approximate Bluetooth signal strength (for connection quality) +### With Nearby Mesh Users -### With Room Members +Depending on the feature you use, nearby peers can receive: -When you join a password-protected room: -- Your messages are visible to others with the password -- Your nickname appears in the member list -- Room owners can see you've joined +- Your chosen nickname and public Noise/signing identity material. +- Announce metadata such as supported capability flags and a bounded list of short direct-neighbor identifiers. When the bridge is enabled, an announce can also include its coarse rendezvous geohash cell. +- Public mesh messages, public notices, and group-control packets you intentionally send. +- Private ciphertext addressed to them, or opaque courier ciphertext they agree to carry. +- Radio metadata available to the receiver, such as approximate Bluetooth signal strength. -### With Nostr Relays (Optional Features) +Noise identity keys can persist across sessions; do not treat them as anonymous identifiers. Panic wipe rotates local identity state. -If you enable Nostr-backed features: -- Private fallback messages to mutual favorites are sent as encrypted NIP-17 gift wraps. Relays can see event metadata, but not message content. -- Public location-channel messages, location notes, and presence are scoped with geohash tags. Relays and other participants can see the geohash tag, event kind, timestamp, and public key used for that geohash. -- Exact GPS coordinates are not included in Nostr events by bitchat. The geohash precision you choose can still reveal an approximate area, from region-level to building-level. -- Automatic presence heartbeats are limited to low-precision geohashes (region, province, and city). More precise geohash posts happen only when you use those channels or location notes. +### With Private Group Members -## What We DON'T Do +Private group members receive the group's name, roster, key epoch, and encrypted group traffic needed to participate. Group messages are confidential to devices holding the current group key, subject to the security of those devices and members. -bitchat **never**: -- Collects personal information -- Sells or shares your exact GPS location -- Stores data on servers we operate -- Sells your data to advertisers or data brokers -- Uses analytics or telemetry -- Creates user profiles -- Requires registration +### With Nostr Relays and Internet Gateways -## Encryption +Internet-backed features are optional. When enabled or used: -All private messages use end-to-end encryption: -- **X25519** for key exchange -- **AES-256-GCM** for message encryption -- **Ed25519** for digital signatures -- **Argon2id** for password-protected rooms +- Private fallback messages use encrypted NIP-17 gift wraps. Relays can observe event and network metadata but not the message plaintext. +- Public location-channel messages, notes, notices, and presence include a geohash tag, event kind, timestamp, and a public key. A geohash reveals an approximate area; finer precision reveals a smaller area. +- The optional mesh bridge publishes bridge-enabled public mesh messages and presence to a neighborhood rendezvous cell. Those messages are public to participants and relays for that cell. A per-message “nearby only” choice prevents that message from crossing the bridge. +- Bridge courier drops contain opaque end-to-end encrypted envelopes and a rotating recipient tag. Relays still observe timing and network metadata. +- A device with gateway features enabled may relay signed bridge/location traffic or opaque courier envelopes for nearby mesh devices. -## Your Rights +Nostr relays are operated by third parties. Their retention, logging, availability, and privacy practices are outside the project's control. Public events and encrypted events may remain on relays according to each relay's policy. -You have complete control: -- **Delete Local State**: Triple-tap the logo to instantly wipe local keys, sessions, caches, and preferences -- **Leave Anytime**: Close the app and local presence stops; relay-backed presence ages out -- **No Account**: No account record exists for you to delete from us -- **Portability**: Your local state stays on your device unless you send messages, use optional relay-backed features, or export it +## Location and Apple Services -## Bluetooth & Permissions +Location permission is optional and requested as when-in-use access. It is used to compute geohash channels, bridge rendezvous cells, and nearby place labels. -bitchat requires Bluetooth permission to function: -- Used only for peer-to-peer communication -- Bluetooth is not used for tracking -- You can revoke this permission at any time in system settings +- Exact coordinates are not included in bitchat mesh or Nostr payloads and are not persisted by bitchat. +- A selected geohash can still reveal an approximate area to peers and relays. +- When bitchat asks the operating system for a friendly place name, Apple's `CLGeocoder` service may process the location under Apple's privacy terms. +- Revoking location permission stops live location sampling. Saved bookmarks remain until you remove them, panic-wipe the app, or remove the app. -## Location Permission +## Microphone, Camera, and Media Permissions -Location permission is optional and is used only for location channels: -- Used to compute local geohash channels and display names -- Requested as when-in-use permission -- Exact coordinates are not shared in messages or stored by bitchat -- Selected and bookmarked geohashes may persist locally until you remove them, use panic wipe, or delete the app -- You can revoke this permission at any time in system settings +- Microphone access is used only while you record a voice note or actively hold live push-to-talk. The resulting audio is sent to the mesh conversation you selected; public-conversation audio is public to that mesh, while private-conversation audio uses the private transport protections described below. +- Voice-note and live-audio files can remain in Application Support under the media retention rules above. +- Camera access is used to scan peer-verification QR codes. Photo-library access is used when you choose an image to send. +- These permissions can be revoked in system settings. bitchat does not record microphone or camera input while the related capture UI is inactive. + +## Cryptography + +Private and public features use different protections: + +- Mesh private sessions use Noise XX with X25519, ChaCha20-Poly1305, and SHA-256. +- Private group messages use ChaCha20-Poly1305; group state and relevant mesh packets use Ed25519 signatures. +- Nostr events use secp256k1 Schnorr signatures. NIP-44 v2 private payloads use secp256k1 key agreement, HKDF-SHA256, and XChaCha20-Poly1305. +- The persistent private-message outbox uses ChaCha20-Poly1305 with a key held in the keychain. Some other protected local identity state uses AES-GCM. +- Public mesh, bridge, geohash, and board content is signed or authenticated as appropriate but is intentionally not confidential. + +No cryptographic system can protect content after a recipient reads, copies, screenshots, or exports it. + +## Data Retention Summary + +- **In-memory chat timelines and active connections:** until the app closes or state is cleared. +- **Queued outgoing private messages:** until acknowledged, dropped by bounded policy, or 24 hours, whichever comes first. +- **Opaque courier envelopes:** until handed off, evicted by bounded policy, or 24 hours, whichever comes first. +- **Recent public mesh gossip:** up to 15 minutes. +- **Public board posts and tombstones:** until expiry, at most seven days. +- **Groups, favorites, preferences, identity keys, bookmarks, and media:** until removed by the feature, panic wipe, quota eviction where applicable, or app removal. +- **Nostr data:** according to the policies of the relays that receive it. + +## Your Controls + +- **Panic wipe:** Triple-tap the logo to clear local keys, sessions, preferences, groups, queues, carried mail, public archives, board data, and media managed by the app. +- **Feature controls:** Location channels, mesh bridge, internet gateway, and related internet behaviors can be disabled in the app. Some already-published relay data cannot be recalled. +- **System permissions:** Bluetooth, location, microphone, camera, and photo-library access can be revoked in system settings. +- **No account:** The project operates no account record for you to request or export. + +## What the Project Does Not Do + +bitchat does not: + +- Operate an account database or project-owned messaging backend. +- Include advertising, analytics, or tracking SDKs. +- Sell user data or create advertising profiles. +- Include exact GPS coordinates in bitchat mesh or Nostr message payloads. ## Children's Privacy -bitchat does not knowingly collect information from children. The app has no age verification because it collects no personal information from anyone. - -## Data Retention - -- **Messages**: Deleted from memory when app closes (unless room retention is enabled) -- **Identity Key**: Persists until you delete the app -- **Favorites**: Persist until you remove them or delete the app -- **Location channel choices**: Selected/bookmarked geohashes persist locally until removed, panic-wiped, or the app is deleted -- **Nostr relay data**: Public geohash events and encrypted gift wraps may be retained by relays according to each relay's policy -- **Everything Else**: Exists only during active sessions - -## Security Measures - -- All communication is encrypted -- No accounts or company servers -- Optional Nostr relays receive only the events needed for Nostr-backed private fallback or public location channels -- Open source code for public audit -- Regular security updates -- Cryptographic signatures prevent tampering +The project does not knowingly operate a service that collects children's personal data. The app has no account registration or age-verification system. Users and guardians should understand that public mesh, board, bridge, and location-channel posts are visible to other participants and may be relayed. ## Changes to This Policy -If we update this policy: -- The "Last updated" date will change -- The updated policy will be included in the app -- No retroactive changes can make us collect data already held only in your app +Material behavior changes will be reflected in this document and its “Last updated” date. Updating this policy cannot retroactively retrieve data that remained only on a user's device. ## Contact bitchat is an open source project. For privacy questions: -- View our source code: [https://github.com/permissionlesstech/bitchat/tree/main](https://github.com/permissionlesstech/bitchat/tree/main) -- Open an issue on GitHub -- Join the discussion in public rooms -## Philosophy - -Privacy isn't just a feature—it's the entire point. bitchat proves that modern communication doesn't require surrendering your privacy. No accounts, no company servers, no analytics. Just people talking freely. +- View the source: [https://github.com/permissionlesstech/bitchat](https://github.com/permissionlesstech/bitchat) +- Open an issue on GitHub. --- -*This policy is released into the public domain under The Unlicense, just like bitchat itself.* +*This policy is released into the public domain under The Unlicense, like the project itself.* diff --git a/bitchat.xcodeproj/project.pbxproj b/bitchat.xcodeproj/project.pbxproj index 137f6ab7..fe3543c2 100644 --- a/bitchat.xcodeproj/project.pbxproj +++ b/bitchat.xcodeproj/project.pbxproj @@ -92,7 +92,8 @@ A6E32D232E762EAB0032EA8A /* Exceptions for "bitchatShareExtension" folder in "bitchatShareExtension" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( - ShareViewController.swift, + Info.plist, + bitchatShareExtension.entitlements, ); target = 57CA17A36A2532A6CFF367BB /* bitchatShareExtension */; }; @@ -258,9 +259,13 @@ buildConfigurationList = E4EA6DC648DF55FF84032EB5 /* Build configuration list for PBXNativeTarget "bitchatShareExtension" */; buildPhases = ( 0A08E70F08F55FD5BA8C7EF3 /* Sources */, + 7E9B64F63F93443FB7BA12DF /* Resources */, ); buildRules = ( ); + fileSystemSynchronizedGroups = ( + A6E32D212E762EAB0032EA8A /* bitchatShareExtension */, + ); name = bitchatShareExtension; productName = bitchatShareExtension; productReference = 61F92EBA29C47C0FCC482F1F /* bitchatShareExtension.appex */; @@ -388,6 +393,13 @@ E0A1B2C3D4E5F6012345678E /* relays/online_relays_gps.csv in Resources */, ); }; + 7E9B64F63F93443FB7BA12DF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/bitchat/App/AppRuntime.swift b/bitchat/App/AppRuntime.swift index abd1e49f..4c1e20a0 100644 --- a/bitchat/App/AppRuntime.swift +++ b/bitchat/App/AppRuntime.swift @@ -313,21 +313,29 @@ private extension AppRuntime { } func checkForSharedContent() { - guard let userDefaults = UserDefaults(suiteName: BitchatApp.groupID), - let sharedContent = userDefaults.string(forKey: "sharedContent"), + guard let userDefaults = UserDefaults(suiteName: BitchatApp.groupID) else { return } + let clearSharedContent = { + userDefaults.removeObject(forKey: "sharedContent") + userDefaults.removeObject(forKey: "sharedContentType") + userDefaults.removeObject(forKey: "sharedContentDate") + } + + guard let sharedContent = userDefaults.string(forKey: "sharedContent"), let sharedDate = userDefaults.object(forKey: "sharedContentDate") as? Date else { + // A partial or malformed handoff must not linger in the shared + // app-group container indefinitely. + clearSharedContent() return } guard Date().timeIntervalSince(sharedDate) < TransportConfig.uiShareAcceptWindowSeconds else { + clearSharedContent() return } let contentKind = SharedContentKind(rawValue: userDefaults.string(forKey: "sharedContentType") ?? "") ?? .text - userDefaults.removeObject(forKey: "sharedContent") - userDefaults.removeObject(forKey: "sharedContentType") - userDefaults.removeObject(forKey: "sharedContentDate") + clearSharedContent() switch contentKind { case .url: diff --git a/bitchat/App/ConversationStore.swift b/bitchat/App/ConversationStore.swift index 0a1b8cb8..8128cd38 100644 --- a/bitchat/App/ConversationStore.swift +++ b/bitchat/App/ConversationStore.swift @@ -229,15 +229,17 @@ final class Conversation: ObservableObject, Identifiable { // sending < sent < carried < delivered < read. A late `.sent` write // (e.g. the optimistic stamp after routing) must not clobber the // `.carried` the router already set when it handed a copy to a - // courier/bridge, nor a `.delivered`/`.read` ack. Same for the + // courier/bridge, nor a `.delivered`/`.read` ack. A late asynchronous + // failure is weaker than a confirmed recipient receipt too, so it may + // not replace `.delivered`/`.read`. Same for the // `.sending` stamp a pre-handshake resend emits asynchronously: it // can land after the message already reached `.sent`, and "Sent" was // already truthful. (`.failed` → `.sending` stays allowed so a real // failure retry is visible.) switch (current, new) { - case (.read, .delivered), (.read, .carried), (.read, .sent), (.read, .sending): + case (.read, .delivered), (.read, .carried), (.read, .sent), (.read, .sending), (.read, .failed): return true - case (.delivered, .carried), (.delivered, .sent), (.delivered, .sending): + case (.delivered, .carried), (.delivered, .sent), (.delivered, .sending), (.delivered, .failed): return true case (.carried, .sent), (.carried, .sending): return true diff --git a/bitchat/App/NearbyNotesCounter.swift b/bitchat/App/NearbyNotesCounter.swift index abe9c18b..ae173bbd 100644 --- a/bitchat/App/NearbyNotesCounter.swift +++ b/bitchat/App/NearbyNotesCounter.swift @@ -27,6 +27,7 @@ final class NearbyNotesCounter: ObservableObject { private var manager: LocationNotesManager? private var managerCancellable: AnyCancellable? private var channelsCancellable: AnyCancellable? + private var permissionCancellable: AnyCancellable? private var settingCancellable: AnyCancellable? private var activeHolders = 0 private let locationManager: LocationChannelManager @@ -73,6 +74,13 @@ final class NearbyNotesCounter: ObservableObject { channelsCancellable = locationManager.$availableChannels .receive(on: DispatchQueue.main) .sink { [weak self] _ in self?.retarget() } + // CoreLocation can revoke authorization while the view remains + // mounted. `availableChannels` deliberately retains its last value, + // so permission must be an independent invalidation signal or the + // building REQ survives on stale coordinates. + permissionCancellable = locationManager.$permissionState + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in self?.retarget() } // The app-info kill switch must take effect immediately, not on the // next location change or remount. settingCancellable = NotificationCenter.default @@ -86,6 +94,7 @@ final class NearbyNotesCounter: ObservableObject { activeHolders = max(0, activeHolders - 1) guard activeHolders == 0 else { return } channelsCancellable = nil + permissionCancellable = nil settingCancellable = nil managerCancellable = nil releaseManager(manager) diff --git a/bitchat/Features/voice/AudioSessionCoordinator.swift b/bitchat/Features/voice/AudioSessionCoordinator.swift new file mode 100644 index 00000000..b92b1549 --- /dev/null +++ b/bitchat/Features/voice/AudioSessionCoordinator.swift @@ -0,0 +1,472 @@ +// +// AudioSessionCoordinator.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import AVFoundation +import BitLogger +import Foundation + +/// The raw audio-session calls the coordinator makes, abstracted so the +/// state machine is unit-testable with a mock (and compiles on the macOS +/// test host, where `AVAudioSession` doesn't exist). +/// +/// Calls arrive on the coordinator's private serial queue — never the main +/// thread. `setCategory`/`setActive` block on IPC to the audio server +/// (observed >1 s under contention on device, tripping the system gesture +/// gate), and Apple explicitly recommends activating the session off the +/// main thread. +protocol SessionApplying: Sendable { + func setCategory(_ category: AudioSessionCoordinator.Category) throws + func setActive(_ active: Bool, notifyOthersOnDeactivation: Bool) throws +} + +/// Sole owner of `AVAudioSession` category/activation for voice features. +/// +/// Talk-over means capture (push-to-talk) and playback (inbound bursts, +/// voice notes) can be live simultaneously; letting each engine configure +/// the shared session directly made them stomp each other's category and +/// route mid-flight (the AURemoteIO -10851 dead-input class). Instead every +/// client acquires a `Token` and the coordinator: +/// +/// - reference-counts activation: `setActive(true)` only on the first +/// holder, `setActive(false, notifyOthersOnDeactivation:)` only when the +/// last one releases — no client can deactivate another's session; +/// - keeps one escalating category: playback-only holders get `.playback`, +/// any capture holder escalates to `.playAndRecord`, and the category is +/// never downgraded while anyone still holds a token (capture ending must +/// not yank the route out from under live playback); +/// - fans out `onInterrupted` on system interruptions and when the active +/// route's device disappears (no auto-resume: bursts are transient, the +/// next press or burst simply re-acquires). The escalating category change +/// fans out separately as `onCategoryEscalated` — the session stays live, +/// so holders that can rebuild their engine against the new configuration +/// keep playing (talk-over is bidirectional); holders that don't provide +/// it fall back to `onInterrupted`. +/// +/// Threading: all state lives on a private serial queue, which both +/// serializes rapid acquire/release pairs and keeps the blocking session IPC +/// off the main thread (`acquire` is `async` for exactly that hop; `release` +/// is fire-and-forget onto the queue). Holder callbacks always run on the +/// main actor. +/// +/// Microphone *permission* queries stay with their callers; this type owns +/// only category and activation. +/// +/// `@unchecked Sendable`: every mutable property is confined to `queue`. +final class AudioSessionCoordinator: @unchecked Sendable { + enum Use { + case playback + case capture + } + + /// The session category the coordinator has applied (the `SessionApplying` + /// adapter maps these to concrete `AVAudioSession` category/mode/options). + enum Category { + case playback + case playAndRecord + } + + /// Opaque handle for one client's hold on the session. Release exactly + /// once when done (extra releases are ignored). + /// + /// `@unchecked` because the stored callbacks are `@MainActor`-isolated + /// closures (non-Sendable as stored types). Lifecycle state is protected + /// by `stateLock`, and callbacks are only ever invoked on the main actor. + final class Token: @unchecked Sendable { + fileprivate enum CallbackKind: Sendable { + case interrupted + case categoryEscalated + } + + /// A callback snapshot is only valid for the lifecycle epoch in which + /// it was captured. `release` advances the epoch synchronously before + /// its queue work, so a callback already headed to the main actor can't + /// reach a client that has since released this token and reacquired a + /// different one. + fileprivate struct CallbackTicket: Sendable { + let token: Token + let kind: CallbackKind + let lifecycleEpoch: UInt64 + } + + private enum Lifecycle { + /// Registered on the session queue, but `acquire` has not yet + /// returned into the client's main-actor call frame. + case acquiring + case ready + case released + } + + fileprivate let onInterrupted: @MainActor () -> Void + fileprivate let onCategoryEscalated: (@MainActor () -> Void)? + private let stateLock = NSLock() + private var lifecycle = Lifecycle.acquiring + private var lifecycleEpoch: UInt64 = 0 + /// A terminal event that lands while the token is registered but not + /// yet handed off invalidates the acquire before its caller can start. + private var terminalEventPendingHandoff = false + + fileprivate init( + onInterrupted: @escaping @MainActor () -> Void, + onCategoryEscalated: (@MainActor () -> Void)? + ) { + self.onInterrupted = onInterrupted + self.onCategoryEscalated = onCategoryEscalated + } + + /// Records an event at the same linearization point at which the + /// coordinator snapshots its holders. An acquiring token cannot safely + /// receive a callback yet: terminal events invalidate the acquire, + /// while category escalation needs no callback because its engine will + /// start against the already-escalated configuration. + fileprivate func record(_ kind: CallbackKind) -> CallbackTicket? { + stateLock.withLock { + switch lifecycle { + case .acquiring: + switch kind { + case .interrupted: + terminalEventPendingHandoff = true + case .categoryEscalated: + break + } + return nil + case .ready: + return CallbackTicket(token: self, kind: kind, lifecycleEpoch: lifecycleEpoch) + case .released: + return nil + } + } + } + + /// Completes the main-actor ownership handoff if no terminal event + /// invalidated it. Because `acquire` itself is main-actor isolated, a + /// successful handoff returns directly into the caller without another + /// actor hop; no callback can interleave before the caller stores the + /// returned token. + fileprivate func completeHandoff() -> Bool { + stateLock.withLock { + guard lifecycle == .acquiring, + !terminalEventPendingHandoff + else { return false } + lifecycle = .ready + return true + } + } + + /// Marks the token dead synchronously, before the asynchronous holder + /// removal. Returns false for an already-released token. + fileprivate func markReleased() -> Bool { + stateLock.withLock { + guard lifecycle != .released else { return false } + lifecycle = .released + lifecycleEpoch &+= 1 + terminalEventPendingHandoff = false + return true + } + } + + /// Revalidates a queue snapshot at the main-actor delivery boundary. + /// The lock is deliberately released before invoking client code: real + /// callbacks commonly call `release` on this same token. + @MainActor + fileprivate func deliver(_ ticket: CallbackTicket) { + let isLive = stateLock.withLock { + lifecycle == .ready && lifecycleEpoch == ticket.lifecycleEpoch + } + guard isLive else { return } + switch ticket.kind { + case .interrupted: + onInterrupted() + case .categoryEscalated: + (onCategoryEscalated ?? onInterrupted)() + } + } + } + + /// Deterministic suspension points for lifecycle race tests. Production + /// instances use the nil defaults; the hooks never move session calls off + /// the coordinator queue or callback execution off the main actor. + struct TestingHooks: Sendable { + let beforeAcquireHandoff: (@Sendable () async -> Void)? + let beforeCallbackDelivery: (@Sendable () async -> Void)? + + init( + beforeAcquireHandoff: (@Sendable () async -> Void)? = nil, + beforeCallbackDelivery: (@Sendable () async -> Void)? = nil + ) { + self.beforeAcquireHandoff = beforeAcquireHandoff + self.beforeCallbackDelivery = beforeCallbackDelivery + } + } + + static let shared = AudioSessionCoordinator(session: SystemAudioSession()) + + private let session: SessionApplying + private let testingHooks: TestingHooks + /// Confines all mutable state, serializes whole acquire/release + /// operations (two rapid presses can't interleave their category and + /// activation calls), and hosts the blocking session IPC off main. + private let queue = DispatchQueue(label: "chat.bitchat.audio-session", qos: .userInitiated) + + // Queue-confined state. + private var holders: [ObjectIdentifier: Token] = [:] + private var currentCategory: Category? + private var sessionActive = false + /// Written once in init, read in deinit — never touched concurrently. + private var observers: [NSObjectProtocol] = [] + + init(session: SessionApplying, testingHooks: TestingHooks = TestingHooks()) { + self.session = session + self.testingHooks = testingHooks + observeSystemNotifications() + } + + deinit { + for observer in observers { + NotificationCenter.default.removeObserver(observer) + } + } + + /// Configures + activates the session for `use` and registers the caller + /// as a holder. The blocking `AVAudioSession` calls run on the session + /// queue — the caller suspends instead of stalling its thread (a PTT + /// press used to block main >1 s in `setActive`, tripping the system + /// gesture gate). `onInterrupted` fires (on the main actor) when the + /// client must stop using the session: a system interruption began or + /// its route's device went away. The client should stop its engine, + /// finalize any artifacts, and release — resuming means acquiring again. + /// + /// `onCategoryEscalated` fires instead when the session category + /// escalated underneath the holder (a capture client joined): the session + /// stays active, so a holder that can rebuild its engine against the new + /// configuration should restart and keep going. Holders that pass `nil` + /// get `onInterrupted` for escalation too. Escalation is delivered before + /// `acquire` returns, so the new holder starts its engine strictly after + /// existing ones were told to rebuild. Main-actor isolation is also the + /// ownership handoff boundary: if interruption or route loss lands after + /// queue registration but before that boundary, the provisional holder is + /// removed and `acquire` throws `CancellationError` instead of returning a + /// token whose callback already fired. + @MainActor + func acquire( + _ use: Use, + onInterrupted: @escaping @MainActor () -> Void, + onCategoryEscalated: (@MainActor () -> Void)? = nil + ) async throws -> Token { + let token = Token(onInterrupted: onInterrupted, onCategoryEscalated: onCategoryEscalated) + let reconfigured: [Token.CallbackTicket] = try await withCheckedThrowingContinuation { continuation in + queue.async { + do { + continuation.resume(returning: try self.activateOnQueue(use, registering: token)) + } catch { + continuation.resume(throwing: error) + } + } + } + + // Escalating playback -> playAndRecord reconfigures the hardware + // route; engines started against the old configuration must restart. + if !reconfigured.isEmpty { + SecureLogger.info("AudioSession: category escalated to playAndRecord with \(reconfigured.count) live holder(s)", category: .session) + await deliver(reconfigured) + } + if let beforeAcquireHandoff = testingHooks.beforeAcquireHandoff { + await beforeAcquireHandoff() + } + guard token.completeHandoff() else { + // A call/Siri interruption or route loss landed after registration + // but before ownership handoff. Remove the provisional holder and + // fail instead of starting a client engine after the stop event. + release(token) + throw CancellationError() + } + return token + } + + /// Drops one holder. Deactivates the session (notifying other apps) only + /// when the last holder releases. Safe to call more than once, from any + /// thread (including `deinit` paths): the work is fire-and-forget onto + /// the session queue, so the blocking deactivation IPC never runs on the + /// caller. + func release(_ token: Token) { + guard token.markReleased() else { return } + queue.async { + self.releaseOnQueue(token) + } + } + + // MARK: - Queue-confined core + + /// Returns callback tickets for pre-existing live holders whose engines + /// must restart because this acquire escalated the category. + private func activateOnQueue(_ use: Use, registering token: Token) throws -> [Token.CallbackTicket] { + let target: Category = (use == .capture || currentCategory == .playAndRecord) ? .playAndRecord : .playback + let categoryChanged = target != currentCategory + let previousCategory = currentCategory + if categoryChanged { + try session.setCategory(target) + currentCategory = target + } + if !sessionActive { + do { + try session.setActive(true, notifyOthersOnDeactivation: false) + } catch { + // Activation failed (e.g. a phone call owns the hardware): + // with no holder registered, an escalated category recorded + // here would stick and pin later playback-only acquires to + // .playAndRecord. Existing holders keep the category the + // hardware really has. + if categoryChanged, holders.isEmpty { + currentCategory = previousCategory + } + throw error + } + sessionActive = true + } + + let reconfigured = categoryChanged + ? holders.values.compactMap { $0.record(.categoryEscalated) } + : [] + holders[ObjectIdentifier(token)] = token + return reconfigured + } + + private func releaseOnQueue(_ token: Token) { + guard holders.removeValue(forKey: ObjectIdentifier(token)) != nil else { return } + guard holders.isEmpty else { return } + currentCategory = nil + guard sessionActive else { return } + sessionActive = false + do { + try session.setActive(false, notifyOthersOnDeactivation: true) + } catch { + SecureLogger.error("AudioSession: deactivation failed: \(error)", category: .session) + } + } + + private func onQueue(_ body: @escaping @Sendable () -> T) async -> T { + await withCheckedContinuation { continuation in + queue.async { + continuation.resume(returning: body()) + } + } + } + + @MainActor + private func deliver(_ tickets: [Token.CallbackTicket]) async { + guard !tickets.isEmpty else { return } + if let beforeCallbackDelivery = testingHooks.beforeCallbackDelivery { + await beforeCallbackDelivery() + } + for ticket in tickets { + ticket.token.deliver(ticket) + } + } + + // MARK: - System events (internal so tests can drive them directly) + + /// A system interruption began: the session is already deactivated by the + /// OS, so just mark it inactive and tell every ready holder (on the main + /// actor) to stop. A provisional acquiring holder is invalidated instead. + /// No auto-resume — the next acquire re-activates. + func handleInterruptionBegan() async { + let tickets = await onQueue { () -> [Token.CallbackTicket] in + self.sessionActive = false + return self.holders.values.compactMap { $0.record(.interrupted) } + } + await deliver(tickets) + } + + /// The active route's input/output device disappeared (e.g. BT headset + /// off): ready holders' engines are wedged against a dead route — stop + /// them; invalidate a holder whose acquire has not returned yet. + func handleRouteDeviceUnavailable() async { + let tickets = await onQueue { + self.holders.values.compactMap { $0.record(.interrupted) } + } + await deliver(tickets) + } + + /// Test hook: suspends until every session operation enqueued before this + /// call — including fire-and-forget `release`s — has completed. + func drain() async { + await onQueue {} + } + + private func observeSystemNotifications() { + #if os(iOS) + let center = NotificationCenter.default + observers.append(center.addObserver( + forName: AVAudioSession.interruptionNotification, + object: AVAudioSession.sharedInstance(), + queue: .main + ) { [weak self] note in + guard let raw = note.userInfo?[AVAudioSessionInterruptionTypeKey] as? UInt, + AVAudioSession.InterruptionType(rawValue: raw) == .began, + let self + else { return } + SecureLogger.info("AudioSession: interruption began", category: .session) + Task { await self.handleInterruptionBegan() } + }) + observers.append(center.addObserver( + forName: AVAudioSession.routeChangeNotification, + object: AVAudioSession.sharedInstance(), + queue: .main + ) { [weak self] note in + guard let raw = note.userInfo?[AVAudioSessionRouteChangeReasonKey] as? UInt, + AVAudioSession.RouteChangeReason(rawValue: raw) == .oldDeviceUnavailable, + let self + else { return } + SecureLogger.info("AudioSession: route device became unavailable", category: .session) + Task { await self.handleRouteDeviceUnavailable() } + }) + #endif + } +} + +// MARK: - Production adapter + +#if os(iOS) +private struct SystemAudioSession: SessionApplying { + func setCategory(_ category: AudioSessionCoordinator.Category) throws { + let session = AVAudioSession.sharedInstance() + switch category { + case .playback: + try session.setCategory(.playback, mode: .spokenAudio, options: [.mixWithOthers]) + case .playAndRecord: + // allowBluetoothHFP is not available on iOS Simulator + #if targetEnvironment(simulator) + try session.setCategory( + .playAndRecord, + mode: .default, + options: [.defaultToSpeaker, .allowBluetoothA2DP, .mixWithOthers] + ) + #else + try session.setCategory( + .playAndRecord, + mode: .default, + options: [.defaultToSpeaker, .allowBluetoothA2DP, .allowBluetoothHFP, .mixWithOthers] + ) + #endif + } + } + + func setActive(_ active: Bool, notifyOthersOnDeactivation: Bool) throws { + try AVAudioSession.sharedInstance().setActive( + active, + options: notifyOthersOnDeactivation ? [.notifyOthersOnDeactivation] : [] + ) + } +} +#else +/// macOS has no app-level audio session; the coordinator still runs its +/// bookkeeping so client code is identical across platforms. +private struct SystemAudioSession: SessionApplying { + func setCategory(_ category: AudioSessionCoordinator.Category) throws {} + func setActive(_ active: Bool, notifyOthersOnDeactivation: Bool) throws {} +} +#endif diff --git a/bitchat/Features/voice/PTTBurstPlayer.swift b/bitchat/Features/voice/PTTBurstPlayer.swift index 4834c2e8..272906f4 100644 --- a/bitchat/Features/voice/PTTBurstPlayer.swift +++ b/bitchat/Features/voice/PTTBurstPlayer.swift @@ -6,10 +6,142 @@ // For more information, see // -import AVFoundation +@preconcurrency import AVFoundation import BitLogger import Foundation +/// The engine operations behind live-burst playback, abstracted so the +/// player's lifecycle (jitter start, category-escalation restart, stop) is +/// unit-testable without real audio hardware. +@MainActor +protocol PTTPlaybackEngine: AnyObject { + /// The object `AVAudioEngineConfigurationChange` notifications are posted + /// for (nil for mocks — no observer is registered). + var configChangeObject: AnyObject? { get } + func start() throws + func play() + func stop() + func schedule( + _ buffer: AVAudioPCMBuffer, + completionType: PTTPlaybackCompletionType, + completionHandler: @escaping @Sendable (PTTPlaybackCompletionEvent) -> Void + ) +} + +/// The lifecycle point requested from `AVAudioPlayerNode` for a scheduled +/// buffer. `dataConsumed` only means the node no longer needs the bytes; it +/// may arrive before the render pipeline has made the audio audible. +enum PTTPlaybackCompletionType: Equatable, Sendable { + case dataConsumed + case dataPlayedBack +} + +enum PTTPlaybackCompletionEvent: Equatable, Sendable { + case dataConsumed + case dataPlayedBack + /// AVAudioPlayerNode invokes the requested callback when the node is + /// stopped too. That is not audible completion and must remain replayable. + case playbackStopped +} + +/// One `AVAudioEngine` + `AVAudioPlayerNode` pair. Created fresh per (re)start: +/// an engine instantiated against an earlier audio-session configuration keeps +/// rendering to the stale route (same class of failure as the capture side's +/// fresh-engine-per-press rule). +@MainActor +private final class SystemPTTPlaybackEngine: PTTPlaybackEngine { + private let engine = AVAudioEngine() + private let node = AVAudioPlayerNode() + + init(format: AVAudioFormat) { + engine.attach(node) + engine.connect(node, to: engine.mainMixerNode, format: format) + } + + var configChangeObject: AnyObject? { engine } + + func start() throws { + engine.prepare() + try engine.start() + } + + func play() { + node.play() + } + + func stop() { + node.stop() + engine.stop() + } + + func schedule( + _ buffer: AVAudioPCMBuffer, + completionType: PTTPlaybackCompletionType, + completionHandler: @escaping @Sendable (PTTPlaybackCompletionEvent) -> Void + ) { + let callbackType: AVAudioPlayerNodeCompletionCallbackType = switch completionType { + case .dataConsumed: .dataConsumed + case .dataPlayedBack: .dataPlayedBack + } + let scheduledEngine = engine + node.scheduleBuffer(buffer, completionCallbackType: callbackType) { [weak scheduledEngine] callbackType in + // The API invokes this callback when the player is stopped as + // well. A configuration change can stop the engine before its + // notification reaches MainActor, so do not misclassify that + // flushed tail as audible playback. + guard scheduledEngine?.isRunning == true else { + completionHandler(.playbackStopped) + return + } + switch callbackType { + case .dataConsumed: + completionHandler(.dataConsumed) + case .dataRendered: + completionHandler(.dataConsumed) + case .dataPlayedBack: + completionHandler(.dataPlayedBack) + @unknown default: + completionHandler(.playbackStopped) + } + } + } +} + +/// Completion callbacks arrive off the main actor, while engine rebuilds are +/// serialized on it. This small lock-backed latch lets a rebuild atomically +/// claim only buffers whose completion has not already fired — even when the +/// callback's hop back to the main actor is still queued. +private final class PTTPlaybackCompletionState: @unchecked Sendable { + private enum State { + case scheduled + case completed + case retired + } + + private let lock = NSLock() + private var state: State = .scheduled + + /// Returns true exactly once when playback completion wins the race with + /// an engine rebuild or stop. + func complete() -> Bool { + lock.withLock { + guard case .scheduled = state else { return false } + state = .completed + return true + } + } + + /// Returns true exactly once when a rebuild or stop claims this + /// still-pending schedule. Later callbacks from that engine are stale. + func retireIfPending() -> Bool { + lock.withLock { + guard case .scheduled = state else { return false } + state = .retired + return true + } + } +} + /// Plays one inbound live voice burst with a small jitter buffer. /// /// Frames are decoded and scheduled back-to-back on an `AVAudioPlayerNode`; @@ -17,27 +149,77 @@ import Foundation /// buffer arrives, which self-heals timing without explicit silence /// insertion. Playback starts once `TransportConfig.pttJitterBufferSeconds` /// of audio is queued or `pttJitterDeadlineSeconds` has elapsed. +/// +/// Talk-over is bidirectional: when push-to-talk capture starts while this +/// burst plays, the session category escalates underneath the engine — the +/// player rebuilds a fresh engine against the new configuration and keeps +/// streaming instead of dying. Real interruptions (phone call, route device +/// gone) still stop it; the burst keeps assembling to file either way. @MainActor final class PTTBurstPlayer { - private let engine = AVAudioEngine() - private let node = AVAudioPlayerNode() + /// Restart-on-reconfigure ceiling: a burst is at most ~2 minutes, so a + /// handful of category/route changes is plenty — beyond it something is + /// thrashing and stopping cleanly beats an engine-rebuild loop. + private static let maxEngineRestarts = 8 + + private let makeEngine: @MainActor () -> PTTPlaybackEngine + private var engine: PTTPlaybackEngine private let decoder: PTTFrameDecoder + private let coordinator: AudioSessionCoordinator + /// Injectable so tests don't fight over the app-wide exclusive-playback + /// slot (a parallel test's `play()` would stop this player mid-test). + private let exclusivity: VoiceNotePlaybackCoordinator private var queuedBuffers: [AVAudioPCMBuffer] = [] private var queuedDuration: TimeInterval = 0 - private var scheduledCount = 0 + private struct ScheduledBuffer { + let id: UInt64 + let buffer: AVAudioPCMBuffer + let completionState: PTTPlaybackCompletionState + } + /// Buffers handed to the current engine whose completion has not yet + /// been processed on the main actor. Keeping the buffers themselves lets + /// a category-escalation rebuild replay the unfinished tail in order. + private var scheduledBuffers: [ScheduledBuffer] = [] + private var nextScheduledBufferID: UInt64 = 0 + /// Bumped on every engine rebuild or stop so completion tasks from a + /// torn-down engine cannot mutate the current generation's pending list. + private var engineGeneration = 0 + private var engineRestarts = 0 private var engineStarted = false private var finished = false - private var stopped = false + /// Latched off (internal read so tests can await the async failure path). + private(set) var stopped = false + /// A session acquire is in flight (it suspends off-main for the blocking + /// session IPC); gates `startIfReady` against double acquisition. + private var acquiringSession = false private var deadlineTask: Task? + private var sessionToken: AudioSessionCoordinator.Token? + /// Reserved before the session acquire suspends. Activation succeeds only + /// if no newer playback request claimed the floor in the meantime. + private var playbackReservation: VoiceNotePlaybackCoordinator.Reservation? + private var configChangeObserver: NSObjectProtocol? private(set) var isPlaying = false - init?() { + /// Fires exactly once when the player stops for good (drain-out, cancel, + /// interruption, failure). `ChatLiveVoiceCoordinator` uses it to unpark + /// the draining player it keeps alive after the assembly — the player's + /// only long-lived owner — is discarded on burst END. + var onStopped: (() -> Void)? + + init?( + coordinator: AudioSessionCoordinator? = nil, + exclusivity: VoiceNotePlaybackCoordinator? = nil, + makeEngine: (@MainActor () -> PTTPlaybackEngine)? = nil + ) { guard let format = PTTAudioFormat.pcmFormat, let decoder = PTTFrameDecoder() else { return nil } self.decoder = decoder - engine.attach(node) - engine.connect(node, to: engine.mainMixerNode, format: format) + self.coordinator = coordinator ?? .shared + self.exclusivity = exclusivity ?? .shared + let factory = makeEngine ?? { SystemPTTPlaybackEngine(format: format) } + self.makeEngine = factory + self.engine = factory() deadlineTask = Task { [weak self] in try? await Task.sleep(nanoseconds: UInt64(TransportConfig.pttJitterDeadlineSeconds * 1_000_000_000)) @@ -45,6 +227,21 @@ final class PTTBurstPlayer { } } + deinit { + // Backstop for an owner dropping the player before it stopped: the + // session coordinator retains registered tokens strongly, so a token + // leaked here would keep the session active (and pin any escalated + // category) for the app's lifetime. `release` is fire-and-forget + // onto the coordinator's queue, so it is deinit-safe. + if let token = sessionToken { + coordinator.release(token) + } + if let observer = configChangeObserver { + NotificationCenter.default.removeObserver(observer) + } + deadlineTask?.cancel() + } + /// Decodes and queues frames (in burst order). Starts playback when the /// jitter buffer fills. func enqueue(_ frames: [Data]) { @@ -64,49 +261,119 @@ final class PTTBurstPlayer { /// The burst ended: stop once everything scheduled has played out. func finishAfterDrain() { finished = true + // The complete burst is queued — no jitter left to wait for. This + // also matters when END lands while the async session acquire is + // still in flight: the queued audio must play out, not be treated + // as already drained. + startIfReady(force: true) stopIfDrained() } - /// Immediate stop (cancel, another playback taking over, teardown). + /// Immediate stop (cancel, another playback taking over, interruption, + /// teardown). func stop() { guard !stopped else { return } stopped = true deadlineTask?.cancel() + removeConfigObserver() queuedBuffers = [] + retireScheduledBuffers() if engineStarted { - node.stop() engine.stop() } isPlaying = false - VoiceNotePlaybackCoordinator.shared.deactivate(self) + releaseSessionToken() + exclusivity.deactivate(self) + onStopped?() } private func startIfReady(force: Bool) { - guard !engineStarted, !stopped, !queuedBuffers.isEmpty else { return } + guard !engineStarted, !acquiringSession, !stopped, !queuedBuffers.isEmpty else { return } guard force || queuedDuration >= TransportConfig.pttJitterBufferSeconds else { return } - #if os(iOS) - do { - let session = AVAudioSession.sharedInstance() - try session.setCategory(.playback, mode: .spokenAudio, options: [.mixWithOthers]) - try session.setActive(true, options: []) - } catch { - SecureLogger.error("PTT playback session activation failed: \(error)", category: .session) + // Acquiring the session suspends for its blocking IPC (off the main + // actor); frames arriving meanwhile keep queueing and are flushed + // onto the engine once it starts. + acquiringSession = true + playbackReservation = exclusivity.reserve(self) + Task { [weak self] in + await self?.acquireSessionAndStart() } - #endif + } - engine.prepare() + private func acquireSessionAndStart() async { + let token: AudioSessionCoordinator.Token + do { + token = try await coordinator.acquire( + .playback, + onInterrupted: { [weak self] in self?.stop() }, + onCategoryEscalated: { [weak self] in self?.restartEngine() } + ) + } catch { + acquiringSession = false + SecureLogger.error("PTT playback session activation failed: \(error)", category: .session) + // Playing unregistered would leave the engine exposed: another + // holder's last release deactivates the session mid-play, and no + // interruption/escalation fan-out ever reaches us. Bail like the + // engine-start failure below; the burst still assembles to file. + // (stop() also fires onStopped so a parked draining player is + // unparked instead of leaking.) + stop() + return + } + acquiringSession = false + // stop() (cancel, exclusivity, teardown) may have landed while the + // session was activating: hand the token straight back. + guard !stopped else { + coordinator.release(token) + return + } + sessionToken = token + guard let playbackReservation, + exclusivity.isCurrent(playbackReservation, for: self) + else { + // The request was superseded while audio-session activation was + // suspended. Do not even start the retired engine. + stop() + return + } + + // Observe reconfiguration before starting so nothing lands between. + registerConfigObserver() do { try engine.start() } catch { - SecureLogger.error("PTT playback engine failed to start: \(error)", category: .session) - stopped = true - return + // A capture racing this start can reconfigure the session while + // the engine spins up (its escalation fan-out no-ops on a player + // that never started): rebuild once against the settled + // configuration — counted against the restart cap — before + // giving up. + SecureLogger.warning("PTT playback engine failed to start (\(error)) — rebuilding once", category: .session) + removeConfigObserver() + engineRestarts += 1 + engine = makeEngine() + registerConfigObserver() + do { + try engine.start() + } catch { + SecureLogger.error("PTT playback engine failed to start: \(error)", category: .session) + // stop() removes the observer, hands the token back, and + // fires onStopped for any parked draining owner. + stop() + return + } } engineStarted = true + guard exclusivity.activate(self, reservation: playbackReservation) + else { + // A newer user-initiated playback reserved the floor while this + // older PTT request was suspended in audio-session activation. + // Never let the late completion steal playback back. + stop() + return + } isPlaying = true - VoiceNotePlaybackCoordinator.shared.activate(self) - node.play() + engine.play() let buffered = queuedBuffers queuedBuffers = [] @@ -116,21 +383,119 @@ final class PTTBurstPlayer { } } - private func schedule(_ buffer: AVAudioPCMBuffer) { - scheduledCount += 1 - node.scheduleBuffer(buffer) { [weak self] in + /// The audio session was reconfigured underneath the running engine + /// (category escalation for talk-over, or an engine configuration + /// change): rebuild a fresh engine against the new configuration and + /// keep streaming. Buffers already completed stay completed; the + /// unfinished scheduled tail is replayed in order on the fresh engine, + /// and frames still arriving continue scheduling after it. + private func restartEngine() { + guard engineStarted, !stopped else { return } + engineRestarts += 1 + guard engineRestarts <= Self.maxEngineRestarts else { + SecureLogger.warning("PTT playback: engine reconfigured \(engineRestarts) times in one burst — stopping", category: .session) + stop() + return + } + + removeConfigObserver() + // Claim the unfinished tail before stopping the old engine. Stopping + // a player node may itself invoke its completion handlers; retiring + // the claimed entries first makes those callbacks unambiguously stale. + // A completion that fired just before this rebuild wins the latch and + // is excluded even if its MainActor task has not run yet. + let buffersToReplay = scheduledBuffers.compactMap { scheduled in + scheduled.completionState.retireIfPending() ? scheduled.buffer : nil + } + scheduledBuffers = [] + engineGeneration += 1 + engine.stop() + engine = makeEngine() + registerConfigObserver() + do { + try engine.start() + } catch { + SecureLogger.error("PTT playback engine failed to restart after session reconfigure: \(error)", category: .session) + stop() + return + } + engine.play() + for buffer in buffersToReplay { + schedule(buffer) + } + SecureLogger.info("PTT playback: engine restarted after session reconfigure", category: .session) + // If every old buffer completed before the rebuild, a finished burst + // can stop now. Otherwise the replayed tail keeps it alive until its + // new-generation completions arrive. + stopIfDrained() + } + + private func registerConfigObserver() { + guard let object = engine.configChangeObject else { return } + configChangeObserver = NotificationCenter.default.addObserver( + forName: .AVAudioEngineConfigurationChange, + object: object, + queue: .main + ) { [weak self] _ in Task { @MainActor [weak self] in - guard let self else { return } - self.scheduledCount -= 1 + self?.restartEngine() + } + } + } + + private func removeConfigObserver() { + if let observer = configChangeObserver { + NotificationCenter.default.removeObserver(observer) + configChangeObserver = nil + } + } + + private func schedule(_ buffer: AVAudioPCMBuffer) { + let id = nextScheduledBufferID + nextScheduledBufferID &+= 1 + let completionState = PTTPlaybackCompletionState() + scheduledBuffers.append(ScheduledBuffer( + id: id, + buffer: buffer, + completionState: completionState + )) + let generation = engineGeneration + engine.schedule(buffer, completionType: .dataPlayedBack) { [weak self, completionState] event in + guard event == .dataPlayedBack else { return } + // Mark completion before hopping to MainActor. A rebuild can then + // distinguish already-completed audio from an unfinished tail + // even when this task has not run yet. + guard completionState.complete() else { return } + Task { @MainActor [weak self] in + guard let self, self.engineGeneration == generation else { return } + self.scheduledBuffers.removeAll { $0.id == id } self.stopIfDrained() } } } + private func retireScheduledBuffers() { + engineGeneration += 1 + for scheduled in scheduledBuffers { + _ = scheduled.completionState.retireIfPending() + } + scheduledBuffers = [] + } + private func stopIfDrained() { - guard finished, scheduledCount <= 0 else { return } + guard finished, scheduledBuffers.isEmpty else { return } + // Started: everything scheduled has played out. Never started with + // nothing queued or in flight (e.g. no decodable frames): nothing + // will ever play. Otherwise the engine start is still pending (the + // async session acquire) and the queued audio must play out first. + guard engineStarted || (!acquiringSession && queuedBuffers.isEmpty) else { return } stop() } + + private func releaseSessionToken() { + sessionToken.map(coordinator.release) + sessionToken = nil + } } extension PTTBurstPlayer: ExclusivePlayback { diff --git a/bitchat/Features/voice/PTTCaptureEngine.swift b/bitchat/Features/voice/PTTCaptureEngine.swift index e98f2458..4d29181d 100644 --- a/bitchat/Features/voice/PTTCaptureEngine.swift +++ b/bitchat/Features/voice/PTTCaptureEngine.swift @@ -10,12 +10,85 @@ import AVFoundation import BitLogger import Foundation +/// Owns one capture token and returns it even when the capture engine's owner +/// disappears without reaching its normal stop/cancel path. The coordinator +/// retains registered tokens strongly, so relying on `Token.deinit` cannot +/// reclaim an abandoned hold. +final class PTTCaptureSessionLease: @unchecked Sendable { + private let coordinator: AudioSessionCoordinator + private let lock = NSLock() + private var token: AudioSessionCoordinator.Token? + + init(coordinator: AudioSessionCoordinator) { + self.coordinator = coordinator + } + + func install(_ token: AudioSessionCoordinator.Token) { + let previous = lock.withLock { + let previous = self.token + self.token = token + return previous + } + previous.map(coordinator.release) + } + + func release() { + let token = lock.withLock { + let token = self.token + self.token = nil + return token + } + token.map(coordinator.release) + } + + deinit { + release() + } +} + +/// Monotonic capture identity shared by main-actor lifecycle code and queued +/// engine callbacks. Removing a notification observer does not cancel a block +/// already enqueued on the main queue, so every callback must also prove it +/// still belongs to the current hold before mutating capture state. +final class PTTCaptureGeneration: @unchecked Sendable { + private let lock = NSLock() + private var value: UInt = 0 + + func begin() -> UInt { + lock.withLock { + value &+= 1 + return value + } + } + + func invalidate() { + lock.withLock { value &+= 1 } + } + + func invalidate(ifCurrent generation: UInt) -> Bool { + lock.withLock { + guard value == generation else { return false } + value &+= 1 + return true + } + } + + func isCurrent(_ generation: UInt) -> Bool { + lock.withLock { value == generation } + } +} + /// Captures microphone audio for a live push-to-talk burst, producing both: /// - live AAC frames via `onFrames` (called on the capture queue), and /// - a finalized `.m4a` voice note on `stop()` — the same artifact /// `VoiceRecorder` produces, so the existing voice-note send pipeline /// handles delivery to receivers that missed the live stream. -final class PTTCaptureEngine { +/// `@unchecked Sendable`: every mutable property is confined to one executor — +/// the capture `queue` (resampler/encoder/file/counters) or the main actor +/// (`engine`, `engineStarted`, `sessionLease`, `configChangeObserver`) — so +/// weak references may cross the `@Sendable` tap/notification closures, which +/// immediately hop back to the owning executor. +final class PTTCaptureEngine: @unchecked Sendable { /// Hard cap matching `VoiceRecorder.maxRecordingDuration`: past it the /// engine keeps running (the UI owns the gesture) but stops encoding. private static let maxCaptureDuration: TimeInterval = 120 @@ -26,6 +99,9 @@ final class PTTCaptureEngine { /// enable the mic (AURemoteIO -10851, observed on iPhone field tests). private var engine = AVAudioEngine() private let queue = DispatchQueue(label: "chat.bitchat.ptt.capture", qos: .userInitiated) + private let coordinator: AudioSessionCoordinator + private let sessionLease: PTTCaptureSessionLease + private let captureGeneration = PTTCaptureGeneration() // Capture-queue-confined state. private var resampler: PTTInputResampler? @@ -35,10 +111,10 @@ final class PTTCaptureEngine { private var encodedFrameCount = 0 private var running = false private var captureStart = Date() - /// Whether `engine.start()` succeeded for the current capture (main-actor - /// callers only; see `stopEngineIfStarted`). - private var engineStarted = false - + /// Whether `engine.start()` succeeded for the current capture + /// (see `stopEngineIfStarted`). + @MainActor private var engineStarted = false + @MainActor private var configChangeObserver: NSObjectProtocol? /// Called on the capture queue with each batch of encoded AAC frames. var onFrames: (([Data]) -> Void)? @@ -47,11 +123,41 @@ final class PTTCaptureEngine { case audioSetupFailed } - func start(outputURL: URL) throws { - #if os(iOS) - try Self.configureAudioSession() - #endif + init(coordinator: AudioSessionCoordinator = .shared) { + self.coordinator = coordinator + self.sessionLease = PTTCaptureSessionLease(coordinator: coordinator) + } + deinit { + sessionLease.release() + } + + /// Async because acquiring the session hops its blocking IPC off the main + /// actor (a PTT press used to stall main >1 s in `setActive`); the engine + /// itself still starts back on main once the session is configured. + @MainActor + func start(outputURL: URL) async throws { + let generation = captureGeneration.begin() + let token = try await coordinator.acquire(.capture) { [weak self] in + self?.handleInterruption(for: generation) + } + // The hold ended (stop/cancel) while the session was activating: + // starting the engine now would leave a hot mic after release. + guard captureGeneration.isCurrent(generation) else { + coordinator.release(token) + throw CancellationError() + } + sessionLease.install(token) + do { + try beginCapture(outputURL: outputURL, generation: generation) + } catch { + releaseSessionToken() + throw error + } + } + + @MainActor + private func beginCapture(outputURL: URL, generation: UInt) throws { // Fresh engine per capture so its input unit binds to the session // that is active *now* (see `engine` doc comment). engine = AVAudioEngine() @@ -83,13 +189,30 @@ final class PTTCaptureEngine { } engine.inputNode.installTap(onBus: 0, bufferSize: 4096, format: inputFormat) { [weak self] buffer, _ in - self?.queue.async { self?.process(buffer) } + self?.queue.async { self?.process(buffer, generation: generation) } + } + // Route/category changes reconfigure the engine underneath the tap; + // stop and finalize cleanly — the .m4a captured so far still sends. + // Registered before start() so no reconfigure lands unobserved + // (handleInterruption also validates this capture generation). + configChangeObserver = NotificationCenter.default.addObserver( + forName: .AVAudioEngineConfigurationChange, + object: engine, + queue: .main + ) { [weak self] _ in + Task { @MainActor [weak self] in + self?.handleInterruption(for: generation) + } } engine.prepare() do { try engine.start() } catch { SecureLogger.error("PTT: capture engine failed to start (input: \(Int(inputFormat.sampleRate)) Hz, \(inputFormat.channelCount) ch): \(error)", category: .session) + if let observer = configChangeObserver { + NotificationCenter.default.removeObserver(observer) + configChangeObserver = nil + } engine.inputNode.removeTap(onBus: 0) queue.sync { self.teardown(deleteFile: true) } throw error @@ -100,7 +223,9 @@ final class PTTCaptureEngine { /// Stops capture and finalizes the `.m4a`. Returns the file URL and the /// number of encoded AAC frames (each `PTTAudioFormat.frameDuration` long). + @MainActor func stop() -> (url: URL?, encodedFrames: Int) { + captureGeneration.invalidate() stopEngineIfStarted() let result: (URL?, Int) = queue.sync { let url = fileURL @@ -108,34 +233,70 @@ final class PTTCaptureEngine { teardown(deleteFile: false) return (url, frames) } - #if os(iOS) - Self.deactivateAudioSession() - #endif + releaseSessionToken() return result } + @MainActor func cancel() { + captureGeneration.invalidate() stopEngineIfStarted() queue.sync { teardown(deleteFile: true) } - #if os(iOS) - Self.deactivateAudioSession() - #endif + releaseSessionToken() + } + + /// Audio session interrupted (call, Siri) or the engine was reconfigured + /// mid-capture: behave like `stop()` — finalize the `.m4a` container but + /// keep `fileURL`/`encodedFrameCount` so the caller's pending `stop()` + /// still returns the note for delivery. + @MainActor + private func handleInterruption(for generation: UInt) { + // Also invalidate a start whose acquire has registered its token but + // has not returned to this actor yet. Without this bump the callback + // is lost while `engineStarted == false`, and the resumed start can + // open the mic after the stop signal. + guard captureGeneration.invalidate(ifCurrent: generation) else { return } + guard engineStarted else { + releaseSessionToken() + return + } + stopEngineIfStarted() + queue.sync { + running = false + // Releasing the AVAudioFile finalizes the .m4a container. + file = nil + encoder = nil + resampler = nil + } + releaseSessionToken() + SecureLogger.info("PTT: capture interrupted — burst finalized early", category: .session) } /// Touching `inputNode` on an engine that never started instantiates its /// input unit against whatever session is active and spams AURemoteIO /// errors — a canceled-before-start hold must not touch the engine. + @MainActor private func stopEngineIfStarted() { + if let observer = configChangeObserver { + NotificationCenter.default.removeObserver(observer) + configChangeObserver = nil + } guard engineStarted else { return } engineStarted = false engine.inputNode.removeTap(onBus: 0) engine.stop() } + @MainActor + private func releaseSessionToken() { + sessionLease.release() + } + // MARK: - Capture queue - private func process(_ buffer: AVAudioPCMBuffer) { - guard running, + private func process(_ buffer: AVAudioPCMBuffer, generation: UInt) { + guard captureGeneration.isCurrent(generation), + running, Date().timeIntervalSince(captureStart) < Self.maxCaptureDuration, let resampled = resampler?.resample(buffer) else { return } @@ -162,22 +323,4 @@ final class PTTCaptureEngine { } fileURL = nil } - - // MARK: - Audio session (iOS) - - #if os(iOS) - private static func configureAudioSession() throws { - let session = AVAudioSession.sharedInstance() - #if targetEnvironment(simulator) - try session.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetoothA2DP]) - #else - try session.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetoothA2DP, .allowBluetoothHFP]) - #endif - try session.setActive(true, options: .notifyOthersOnDeactivation) - } - - private static func deactivateAudioSession() { - try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation) - } - #endif } diff --git a/bitchat/Features/voice/VoiceCaptureSession.swift b/bitchat/Features/voice/VoiceCaptureSession.swift index 556a37f3..d2f4f8c3 100644 --- a/bitchat/Features/voice/VoiceCaptureSession.swift +++ b/bitchat/Features/voice/VoiceCaptureSession.swift @@ -31,25 +31,45 @@ protocol VoiceCaptureSession: AnyObject { /// The classic record-then-send backend, wrapping the shared `VoiceRecorder`. @MainActor final class VoiceNoteCaptureSession: VoiceCaptureSession { + private let recorder: VoiceRecorder + private let owner = VoiceRecorder.RecordingOwner() + var isLive: Bool { false } + init(recorder: VoiceRecorder = .shared) { + self.recorder = recorder + } + func requestPermission() async -> Bool { - await VoiceRecorder.shared.requestPermission() + await recorder.requestPermission() } func start() async throws { - try await VoiceRecorder.shared.startRecording() + try await recorder.startRecording(owner: owner) } func finish() async -> URL? { - await VoiceRecorder.shared.stopRecording() + await recorder.stopRecording(owner: owner) } func cancel() async { - await VoiceRecorder.shared.cancelRecording() + await recorder.cancelRecording(owner: owner) } } +/// Testable surface of the live capture engine. Production uses +/// `PTTCaptureEngine`; tests can supply captured-frame counts without opening +/// real audio hardware. +@MainActor +protocol PTTCapturing: AnyObject { + var onFrames: (([Data]) -> Void)? { get set } + func start(outputURL: URL) async throws + func stop() -> (url: URL?, encodedFrames: Int) + func cancel() +} + +extension PTTCaptureEngine: PTTCapturing {} + /// Live push-to-talk backend: streams `VoiceBurstPacket`s to one peer while /// recording, then finalizes the same audio as a standard voice note whose /// file name carries the burst ID (`voice_.m4a`) so receivers that @@ -60,7 +80,8 @@ final class PTTLiveVoiceSession: VoiceCaptureSession { let burstID: Data private let sendPacket: (Data) -> Void - private let capture = PTTCaptureEngine() + private let capture: any PTTCapturing + private let now: () -> Date /// Capture-queue-confined stream state: packetizes frames and lazily /// emits START so packet order is guaranteed by queue serialization. private final class StreamState { @@ -79,10 +100,17 @@ final class PTTLiveVoiceSession: VoiceCaptureSession { /// - Parameter sendPacket: delivers one encoded `VoiceBurstPacket` to the /// target peer; must be safe to call from any queue (BLEService hops to /// its own message queue internally). - init(sendPacket: @escaping (Data) -> Void) { - self.burstID = VoiceBurstPacket.makeBurstID() + init( + sendPacket: @escaping (Data) -> Void, + capture: (any PTTCapturing)? = nil, + now: @escaping () -> Date = Date.init, + burstID: Data? = nil + ) { + self.burstID = burstID ?? VoiceBurstPacket.makeBurstID() self.sendPacket = sendPacket - self.stream = StreamState(burstID: burstID) + self.capture = capture ?? PTTCaptureEngine() + self.now = now + self.stream = StreamState(burstID: self.burstID) } func requestPermission() async -> Bool { @@ -117,7 +145,15 @@ final class PTTLiveVoiceSession: VoiceCaptureSession { } } do { - try capture.start(outputURL: outputURL) + try await capture.start(outputURL: outputURL) + } catch is CancellationError { + // The hold was released/canceled while the session acquire was + // in flight: the engine never started and the capture already + // handed its token back — nothing to retry. A coordinator-side + // interruption during handoff also cancels acquire, but that is + // not a successful start and must propagate to the view model. + guard completed else { throw CancellationError() } + return } catch { // The HAL can briefly report a dead input right after the audio // session (re)activates while the route settles; one retry after @@ -131,9 +167,9 @@ final class PTTLiveVoiceSession: VoiceCaptureSession { capture.cancel() return } - try capture.start(outputURL: outputURL) + try await capture.start(outputURL: outputURL) } - startDate = Date() + startDate = now() SecureLogger.info("PTT: live burst \(burstID.hexEncodedString()) capture started", category: .session) } @@ -141,11 +177,16 @@ final class PTTLiveVoiceSession: VoiceCaptureSession { guard !completed else { return nil } completed = true - let elapsed = startDate.map { Date().timeIntervalSince($0) } ?? 0 + let elapsed = startDate.map { now().timeIntervalSince($0) } ?? 0 let (url, encodedFrames) = capture.stop() // stop() drained the capture queue, so touching `stream` is safe now. - guard elapsed >= VoiceRecorder.minRecordingDuration, let url else { + let capturedDuration = Double(encodedFrames) * PTTAudioFormat.frameDuration + + guard elapsed >= VoiceRecorder.minRecordingDuration, + capturedDuration >= VoiceRecorder.minRecordingDuration, + let url + else { sendControlPacket(.canceled) if let url { try? FileManager.default.removeItem(at: url) @@ -156,7 +197,7 @@ final class PTTLiveVoiceSession: VoiceCaptureSession { for packet in stream.packetizer.flush() { sendPacket(packet) } - let durationMs = UInt32((Double(encodedFrames) * PTTAudioFormat.frameDuration * 1000).rounded()) + let durationMs = UInt32((capturedDuration * 1000).rounded()) sendControlPacket(.end(totalDataPackets: stream.packetizer.dataPacketCount, durationMs: durationMs)) SecureLogger.info("PTT: live burst \(burstID.hexEncodedString()) finished — \(stream.packetizer.dataPacketCount) data packets, \(encodedFrames) frames, \(durationMs) ms", category: .session) return url diff --git a/bitchat/Features/voice/VoiceNotePlaybackController.swift b/bitchat/Features/voice/VoiceNotePlaybackController.swift index ad520b6f..3818128c 100644 --- a/bitchat/Features/voice/VoiceNotePlaybackController.swift +++ b/bitchat/Features/voice/VoiceNotePlaybackController.swift @@ -9,6 +9,9 @@ final class VoiceNotePlaybackController: NSObject, ObservableObject, AVAudioPlay @Published private(set) var duration: TimeInterval = 0 @Published private(set) var progress: Double = 0 + /// Internal lifecycle visibility for deterministic acquisition tests. + var isPlaybackStartPending: Bool { sessionAcquireInFlight } + /// rounded so 4.9s shows "00:05" var roundedDuration: Int { guard duration.isFinite else { return 0 } @@ -24,9 +27,24 @@ final class VoiceNotePlaybackController: NSObject, ObservableObject, AVAudioPlay private var player: AVAudioPlayer? private var timer: Timer? private var url: URL + /// Test seam; `AudioSessionCoordinator.shared` when nil. + private let sessionCoordinatorOverride: AudioSessionCoordinator? + /// Injectable so tests don't fight over the app-wide exclusive-playback + /// slot (a parallel test's `play()` would pause this controller mid-test). + private let exclusivity: VoiceNotePlaybackCoordinator + private var sessionToken: AudioSessionCoordinator.Token? + /// A session acquire is in flight (it suspends off-main for the blocking + /// session IPC); gates against double acquisition on rapid play taps. + private var sessionAcquireInFlight = false - init(url: URL) { + init( + url: URL, + sessionCoordinator: AudioSessionCoordinator? = nil, + exclusivity: VoiceNotePlaybackCoordinator? = nil + ) { self.url = url + self.sessionCoordinatorOverride = sessionCoordinator + self.exclusivity = exclusivity ?? .shared super.init() // Don't load anything eagerly - wait until user interaction or view is fully displayed } @@ -51,6 +69,16 @@ final class VoiceNotePlaybackController: NSObject, ObservableObject, AVAudioPlay deinit { timer?.invalidate() + player?.stop() + // A per-row @StateObject can be discarded mid-playback (navigating + // away). Leaking the token here would hold the session forever — + // never deactivating it, and pinning any escalated category for the + // app's lifetime. `release` is fire-and-forget onto the coordinator's + // queue, so it is deinit-safe: only the Sendable token crosses. + if let token = sessionToken { + sessionToken = nil + (sessionCoordinatorOverride ?? .shared).release(token) + } } func replaceURL(_ url: URL) { @@ -68,11 +96,15 @@ final class VoiceNotePlaybackController: NSObject, ObservableObject, AVAudioPlay func play() { guard ensurePlayerReady() else { return } - VoiceNotePlaybackCoordinator.shared.activate(self) - player?.play() + exclusivity.activate(self) + isPlaying = true startTimer() updateProgress() - isPlaying = true + // Acquired here (not in ensurePlayerReady): scrubbing a paused note + // must not hold the session while nothing is audible. The session + // calls block on audio-server IPC, so they run off the main thread; + // the player starts once the session is configured. + startPlayerAfterAcquiringSession() } func pause() { @@ -80,6 +112,7 @@ final class VoiceNotePlaybackController: NSObject, ObservableObject, AVAudioPlay stopTimer() updateProgress() isPlaying = false + releaseSession() } func stop() { @@ -88,7 +121,8 @@ final class VoiceNotePlaybackController: NSObject, ObservableObject, AVAudioPlay stopTimer() updateProgress() isPlaying = false - VoiceNotePlaybackCoordinator.shared.deactivate(self) + releaseSession() + exclusivity.deactivate(self) } func seek(to fraction: Double) { @@ -96,8 +130,11 @@ final class VoiceNotePlaybackController: NSObject, ObservableObject, AVAudioPlay let clamped = max(0, min(1, fraction)) if let player = player { player.currentTime = clamped * player.duration - if isPlaying { - player.play() + // While the session acquire is still in flight, don't start + // audio pre-activation — the pending acquire's completion starts + // playback (from the new position) once the session resolves. + if isPlaying, !sessionAcquireInFlight { + startPreparedPlayer() } updateProgress() } @@ -112,18 +149,20 @@ final class VoiceNotePlaybackController: NSObject, ObservableObject, AVAudioPlay self.stopTimer() self.updateProgress() self.isPlaying = false - VoiceNotePlaybackCoordinator.shared.deactivate(self) + self.releaseSession() + self.exclusivity.deactivate(self) } } // MARK: - Private Helpers private func preparePlayer(for url: URL) { - // Prepare player synchronously (only called when playback is requested) + // Load metadata synchronously, but do not call prepareToPlay here: + // paused scrubbing reaches this path and must not acquire playback + // hardware outside the AudioSessionCoordinator token lifetime. do { let player = try AVAudioPlayer(contentsOf: url) player.delegate = self - player.prepareToPlay() self.player = player duration = player.duration currentTime = player.currentTime @@ -141,18 +180,81 @@ final class VoiceNotePlaybackController: NSObject, ObservableObject, AVAudioPlay if player == nil { preparePlayer(for: url) } - #if os(iOS) - let session = AVAudioSession.sharedInstance() - do { - try session.setCategory(.playback, mode: .spokenAudio, options: [.mixWithOthers]) - try session.setActive(true, options: []) - } catch { - SecureLogger.error("Failed to activate audio session: \(error)", category: .session) - } - #endif return player != nil } + /// All entry points (SwiftUI actions, `pauseForExclusivity`, the + /// delegate's main-queue hop) run on the main thread; the acquire itself + /// suspends while the blocking session IPC runs on the coordinator's + /// queue, and the player starts when it resolves. An acquire failure + /// leaves playback stopped: starting without a registered token would + /// bypass interruption fan-out and the coordinator's refcount. A + /// pause/stop landing mid-acquire hands the token straight back. + private func startPlayerAfterAcquiringSession() { + if sessionToken != nil { + startPreparedPlayer() + return + } + guard !sessionAcquireInFlight else { return } + sessionAcquireInFlight = true + let coordinator = sessionCoordinatorOverride ?? AudioSessionCoordinator.shared + Task { @MainActor [weak self] in + var token: AudioSessionCoordinator.Token? + do { + token = try await coordinator.acquire(.playback) { [weak self] in + self?.pause() + } + } catch { + SecureLogger.error("Failed to activate audio session: \(error)", category: .session) + } + guard let self else { + // The row was discarded while acquiring; deinit had no token + // to release yet. + token.map(coordinator.release) + return + } + self.sessionAcquireInFlight = false + guard self.isPlaying else { + // Paused/stopped while the session was activating. + token.map(coordinator.release) + return + } + guard let token else { + self.failPlaybackStart() + return + } + self.sessionToken = token + self.startPreparedPlayer() + } + } + + @discardableResult + private func startPreparedPlayer() -> Bool { + guard let player, + player.prepareToPlay(), + player.play() + else { + SecureLogger.error("Voice note player refused to start " + url.lastPathComponent, category: .session) + failPlaybackStart() + return false + } + return true + } + + private func failPlaybackStart() { + player?.pause() + stopTimer() + updateProgress() + isPlaying = false + releaseSession() + exclusivity.deactivate(self) + } + + private func releaseSession() { + sessionToken.map((sessionCoordinatorOverride ?? .shared).release) + sessionToken = nil + } + private func startTimer() { if timer != nil { return } timer = Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true) { [weak self] _ in @@ -197,21 +299,59 @@ extension VoiceNotePlaybackController: ExclusivePlayback { final class VoiceNotePlaybackCoordinator { static let shared = VoiceNotePlaybackCoordinator() + struct Reservation: Equatable { + fileprivate let generation: UInt64 + } + private weak var activeController: (any ExclusivePlayback)? + private weak var latestReservedController: (any ExclusivePlayback)? + private var latestReservation = Reservation(generation: 0) - private init() {} + /// Internal so tests can isolate their own exclusivity slot; the app + /// uses `shared`. + init() {} - func activate(_ controller: any ExclusivePlayback) { + /// Records playback intent without interrupting audio that is already + /// audible. Async starters reserve before suspension, then activate only + /// after their audio resource is ready. + func reserve(_ controller: any ExclusivePlayback) -> Reservation { + latestReservation = Reservation(generation: latestReservation.generation &+ 1) + latestReservedController = controller + return latestReservation + } + + /// Immediate activation for synchronous/user-initiated playback. + @discardableResult + func activate(_ controller: any ExclusivePlayback) -> Reservation { + let reservation = reserve(controller) + _ = activate(controller, reservation: reservation) + return reservation + } + + /// Commits an earlier reservation only when it is still the newest + /// playback request. This prevents an older async acquire from stealing + /// the floor after a newer play gesture. + @discardableResult + func activate(_ controller: any ExclusivePlayback, reservation: Reservation) -> Bool { + guard isCurrent(reservation, for: controller) else { return false } if activeController === controller { - return + return true } activeController?.pauseForExclusivity() activeController = controller + return true + } + + func isCurrent(_ reservation: Reservation, for controller: any ExclusivePlayback) -> Bool { + latestReservation == reservation && latestReservedController === controller } func deactivate(_ controller: any ExclusivePlayback) { if activeController === controller { activeController = nil } + if latestReservedController === controller { + latestReservedController = nil + } } } diff --git a/bitchat/Features/voice/VoiceRecorder.swift b/bitchat/Features/voice/VoiceRecorder.swift index 586e8fdf..eb1b6af2 100644 --- a/bitchat/Features/voice/VoiceRecorder.swift +++ b/bitchat/Features/voice/VoiceRecorder.swift @@ -1,21 +1,95 @@ import Foundation import AVFoundation +/// The small surface of `AVAudioRecorder` that `VoiceRecorder` owns. Keeping +/// it behind a protocol lets lifecycle races be tested without opening the +/// microphone on the test host. +protocol VoiceAudioRecording: AnyObject { + var isRecording: Bool { get } + var isMeteringEnabled: Bool { get set } + func prepareToRecord() -> Bool + func record(forDuration duration: TimeInterval) -> Bool + func stop() +} + +extension AVAudioRecorder: VoiceAudioRecording {} + +protocol VoiceAudioRecorderCreating { + func makeRecorder(url: URL) throws -> any VoiceAudioRecording +} + +private struct SystemVoiceAudioRecorderFactory: VoiceAudioRecorderCreating { + func makeRecorder(url: URL) throws -> any VoiceAudioRecording { + let settings: [String: Any] = [ + AVFormatIDKey: kAudioFormatMPEG4AAC, + AVSampleRateKey: 16_000, + AVNumberOfChannelsKey: 1, + AVEncoderBitRateKey: 16_000 + ] + return try AVAudioRecorder(url: url, settings: settings) + } +} + /// Manages audio capture for mesh voice notes with predictable encoding settings. actor VoiceRecorder { - enum RecorderError: Error { + enum RecorderError: Error, Equatable { case microphoneAccessDenied case recordingInProgress + case failedToStartRecording } static let shared = VoiceRecorder() - private let paddingInterval: TimeInterval = 0.5 - private let maxRecordingDuration: TimeInterval = 120 static let minRecordingDuration: TimeInterval = 1 - private var recorder: AVAudioRecorder? + /// Identity of one press/hold. Every lifecycle mutation must present the + /// same owner that started the recorder, so a stale finish or cancel from + /// another hold cannot stop or delete the current recording. + final class RecordingOwner: @unchecked Sendable {} + + /// Test-only scheduling seams for lifecycle boundaries that otherwise rely + /// on wall-clock sleeps. Production uses the real padding delay. + struct TestingHooks: Sendable { + let waitForStopPadding: (@Sendable (TimeInterval) async -> Void)? + + init(waitForStopPadding: (@Sendable (TimeInterval) async -> Void)? = nil) { + self.waitForStopPadding = waitForStopPadding + } + } + + private let sessionCoordinator: AudioSessionCoordinator + private let recorderFactory: any VoiceAudioRecorderCreating + private let permissionGranted: () -> Bool + private let paddingInterval: TimeInterval + private let maxRecordingDuration: TimeInterval + private let outputDirectory: URL? + private let testingHooks: TestingHooks + + private var recorder: (any VoiceAudioRecording)? private var currentURL: URL? + private var sessionToken: AudioSessionCoordinator.Token? + private var activeOwner: RecordingOwner? + /// True only while `startRecording()` is suspended in session acquire. + /// A second start is rejected instead of superseding the first one. + private var startInFlight = false + + init( + sessionCoordinator: AudioSessionCoordinator = .shared, + recorderFactory: any VoiceAudioRecorderCreating = SystemVoiceAudioRecorderFactory(), + permissionGranted: (() -> Bool)? = nil, + paddingInterval: TimeInterval = 0.5, + maxRecordingDuration: TimeInterval = 120, + outputDirectory: URL? = nil, + testingHooks: TestingHooks = TestingHooks() + ) { + self.sessionCoordinator = sessionCoordinator + self.recorderFactory = recorderFactory + self.permissionGranted = permissionGranted ?? Self.hasSystemPermission + self.paddingInterval = paddingInterval + self.maxRecordingDuration = maxRecordingDuration + self.outputDirectory = outputDirectory + self.testingHooks = testingHooks + } // MARK: - Permissions @@ -41,82 +115,130 @@ actor VoiceRecorder { // MARK: - Recording Lifecycle @discardableResult - func startRecording() throws -> URL { - if recorder?.isRecording == true { + func startRecording(owner: RecordingOwner) async throws -> URL { + if activeOwner != nil { throw RecorderError.recordingInProgress } - #if os(iOS) - let session = AVAudioSession.sharedInstance() - guard session.recordPermission == .granted else { + guard permissionGranted() else { throw RecorderError.microphoneAccessDenied } - #if targetEnvironment(simulator) - // allowBluetoothHFP is not available on iOS Simulator - try session.setCategory( - .playAndRecord, - mode: .default, - options: [.defaultToSpeaker, .allowBluetoothA2DP] - ) - #else - try session.setCategory( - .playAndRecord, - mode: .default, - options: [.defaultToSpeaker, .allowBluetoothA2DP, .allowBluetoothHFP] - ) - #endif - try session.setActive(true, options: .notifyOthersOnDeactivation) - #endif - #if os(macOS) - guard AVCaptureDevice.authorizationStatus(for: .audio) == .authorized else { - throw RecorderError.microphoneAccessDenied + + activeOwner = owner + startInFlight = true + + // The acquire suspends while the blocking session IPC runs on the + // coordinator's queue (never this actor's thread or main). + let token: AudioSessionCoordinator.Token + do { + token = try await sessionCoordinator.acquire(.capture) { [weak self] in + Task { await self?.handleSessionInterruption(for: owner) } + } + } catch { + guard activeOwner === owner else { + throw CancellationError() + } + startInFlight = false + activeOwner = nil + throw error } - #endif - let outputURL = try makeOutputURL() - let settings: [String: Any] = [ - AVFormatIDKey: kAudioFormatMPEG4AAC, - AVSampleRateKey: 16_000, - AVNumberOfChannelsKey: 1, - AVEncoderBitRateKey: 16_000 - ] + // Actor reentrancy: release/cancel may have ended this hold while the + // blocking session activation was still in progress. + guard activeOwner === owner, startInFlight else { + sessionCoordinator.release(token) + throw CancellationError() + } + startInFlight = false + sessionToken = token - let audioRecorder = try AVAudioRecorder(url: outputURL, settings: settings) - audioRecorder.isMeteringEnabled = true - audioRecorder.prepareToRecord() - audioRecorder.record(forDuration: maxRecordingDuration) + var outputURL: URL? + do { + let newURL = try makeOutputURL() + outputURL = newURL + let audioRecorder = try recorderFactory.makeRecorder(url: newURL) + audioRecorder.isMeteringEnabled = true + guard audioRecorder.prepareToRecord() else { + throw RecorderError.failedToStartRecording + } + guard audioRecorder.record(forDuration: maxRecordingDuration) else { + throw RecorderError.failedToStartRecording + } - recorder = audioRecorder - currentURL = outputURL - return outputURL + recorder = audioRecorder + currentURL = newURL + return newURL + } catch { + releaseSessionToken() + recorder = nil + currentURL = nil + activeOwner = nil + if let outputURL { + try? FileManager.default.removeItem(at: outputURL) + } + throw error + } } - func stopRecording() async -> URL? { - guard let recorder, recorder.isRecording else { - return currentURL + func stopRecording(owner: RecordingOwner) async -> URL? { + guard activeOwner === owner else { return nil } + + // `finish()` can race a still-suspended start on a direct caller even + // though the UI normally routes quick releases through cancel(). + if startInFlight { + activeOwner = nil + startInFlight = false + return nil + } + + guard let activeRecorder = recorder else { + let sessionURL = currentURL + releaseSessionToken() + currentURL = nil + activeOwner = nil + return sessionURL } let sessionURL = currentURL - try? await Task.sleep(nanoseconds: UInt64(paddingInterval * 1_000_000_000)) - - recorder.stop() - - // A new session may have started during the sleep — don't touch its state - if self.recorder === recorder { - cleanupSession() - self.recorder = nil - currentURL = nil + if activeRecorder.isRecording, paddingInterval > 0 { + if let waitForStopPadding = testingHooks.waitForStopPadding { + await waitForStopPadding(paddingInterval) + } else { + try? await Task.sleep(nanoseconds: UInt64(paddingInterval * 1_000_000_000)) + } } + // Cancellation or interruption may have run during the padding sleep. + // Only the recorder whose stop began here may be finalized by it. + guard activeOwner === owner, + let recorder = self.recorder, + recorder === activeRecorder + else { return nil } + + if activeRecorder.isRecording { + activeRecorder.stop() + } + releaseSessionToken() + self.recorder = nil + currentURL = nil + activeOwner = nil + return sessionURL } - func cancelRecording() { + func cancelRecording(owner: RecordingOwner) async { + guard activeOwner === owner else { return } + + // Invalidate ownership before cleanup. An actor-reentrant start whose + // session acquire resumes later will observe the mismatch and release + // its token without opening the microphone. + activeOwner = nil + startInFlight = false if let recorder, recorder.isRecording { recorder.stop() } - cleanupSession() + releaseSessionToken() if let currentURL { try? FileManager.default.removeItem(at: currentURL) } @@ -124,14 +246,45 @@ actor VoiceRecorder { currentURL = nil } + /// The audio session was interrupted (call, Siri) or reconfigured: stop + /// the recorder but keep `recorder`/`currentURL` so the caller's pending + /// `stopRecording()` still returns the partial note. + private func handleSessionInterruption(for owner: RecordingOwner) async { + // A callback captured for a released token must never stop a newer + // recording. Conversely, an interruption delivered while acquire is + // still suspended invalidates that acquire before it can open the mic. + guard activeOwner === owner else { return } + if startInFlight { + activeOwner = nil + startInFlight = false + return + } + startInFlight = false + if let recorder, recorder.isRecording { + recorder.stop() + } + releaseSessionToken() + } + // MARK: - Helpers + private static func hasSystemPermission() -> Bool { + #if os(iOS) + AVAudioSession.sharedInstance().recordPermission == .granted + #elseif os(macOS) + AVCaptureDevice.authorizationStatus(for: .audio) == .authorized + #else + true + #endif + } + private func makeOutputURL() throws -> URL { let formatter = DateFormatter() formatter.dateFormat = "yyyyMMdd_HHmmss" - let fileName = "voice_\(formatter.string(from: Date())).m4a" + let fileName = "voice_\(formatter.string(from: Date()))_\(UUID().uuidString).m4a" - let baseDirectory = try applicationFilesDirectory().appendingPathComponent("voicenotes/outgoing", isDirectory: true) + let baseDirectory = try outputDirectory + ?? applicationFilesDirectory().appendingPathComponent("voicenotes/outgoing", isDirectory: true) try FileManager.default.createDirectory(at: baseDirectory, withIntermediateDirectories: true, attributes: nil) return baseDirectory.appendingPathComponent(fileName) } @@ -146,9 +299,11 @@ actor VoiceRecorder { #endif } - private func cleanupSession() { - #if os(iOS) - try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation) - #endif + /// Fire-and-forget: the coordinator hops the blocking deactivation IPC + /// onto its own queue. + private func releaseSessionToken() { + guard let token = sessionToken else { return } + sessionToken = nil + sessionCoordinator.release(token) } } diff --git a/bitchat/Info.plist b/bitchat/Info.plist index f949ecee..57ddfa11 100644 --- a/bitchat/Info.plist +++ b/bitchat/Info.plist @@ -31,6 +31,8 @@ CFBundleVersion $(CURRENT_PROJECT_VERSION) + LSApplicationCategoryType + public.app-category.social-networking LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSBluetoothAlwaysUsageDescription @@ -40,9 +42,9 @@ NSCameraUsageDescription bitchat uses the camera to scan QR codes to verify peers. NSLocationWhenInUseUsageDescription - bitchat uses your approximate location to compute local geohash channels for optional public chats. Exact GPS is never shared. + bitchat uses your location to compute optional geohash channels, bridge cells, and nearby place labels. Exact coordinates are not included in bitchat messages. NSMicrophoneUsageDescription - bitchat uses the microphone to record voice notes that relay across the mesh. + bitchat uses the microphone while you record voice notes or hold live push-to-talk, then sends that audio to your selected mesh conversation. NSPhotoLibraryUsageDescription bitchat lets you pick images from your photo library to share with nearby peers. UIBackgroundModes diff --git a/bitchat/Nostr/NostrProtocol.swift b/bitchat/Nostr/NostrProtocol.swift index 41565fc9..72144e9e 100644 --- a/bitchat/Nostr/NostrProtocol.swift +++ b/bitchat/Nostr/NostrProtocol.swift @@ -268,10 +268,9 @@ struct NostrProtocol { /// `[stable ID, mesh sender ID, wire timestamp in ms]`. Element 1 is the /// content-stable mesh message ID (`MeshMessageIdentity`) for v1.7.0 /// parsers, which key their dedup on `m[1]` unconditionally and need it - /// per-message-unique; current parsers ignore it and recompute the ID - /// from the origin coordinates (elements 2-3) plus the event's own - /// content to dedup the bridged copy against the radio copy by - /// timeline ID. + /// per-message-unique. Current parsers key bridge rows by the authenticated + /// event ID and recompute elements 2-3 only as a radio-copy hint; the mesh + /// coordinates are public and cannot authenticate the Nostr signer. static func createBridgeMeshEvent( content: String, cell: String, diff --git a/bitchat/Nostr/NostrRelayManager.swift b/bitchat/Nostr/NostrRelayManager.swift index 88da5dff..9f295a69 100644 --- a/bitchat/Nostr/NostrRelayManager.swift +++ b/bitchat/Nostr/NostrRelayManager.swift @@ -216,6 +216,15 @@ final class NostrRelayManager: ObservableObject { } private var messageQueue: [PendingSend] = [] private let messageQueueLock = NSLock() + /// Non-queued sends whose callers require relay durability. A WebSocket + /// write only proves bytes left this process; NIP-20 OK is the relay's + /// accept/reject acknowledgment. + private struct ConfirmedSendState { + let token: UUID + var awaitingRelays: Set + let completion: (Bool) -> Void + } + private var confirmedSends: [String: ConfirmedSendState] = [:] // Total pending sends dropped at the queue cap; drives the sampled // overflow warning (first + every Nth drop). private var pendingSendDropCount = 0 @@ -312,6 +321,9 @@ final class NostrRelayManager: ObservableObject { for (_, tracker) in trackers { tracker.callback() } + let confirmed = confirmedSends.values.map(\.completion) + confirmedSends.removeAll() + confirmed.forEach { $0(false) } pendingTorConnectionURLs.removeAll() awaitingTorForConnections = false torReadyWaitAttempts = 0 @@ -345,6 +357,7 @@ final class NostrRelayManager: ObservableObject { duplicateInboundEventDropCountBySubscription.removeAll() inboundEventLogCount = 0 Self.pendingGiftWrapIDs.removeAll() + confirmedSends.removeAll() messageQueueLock.lock() messageQueue.removeAll() @@ -419,6 +432,97 @@ final class NostrRelayManager: ObservableObject { } } + /// Attempts an event only on currently connected target relays and + /// reports whether at least one relay explicitly accepted it via NIP-20 + /// OK. A successful WebSocket write alone is not durable acceptance. + /// Unlike `sendEvent`, this never enters the process-local pending queue; + /// callers use it when success unlocks durable state or user-visible + /// delivery progress. + func sendEventImmediately( + _ event: NostrEvent, + to relayUrls: [String]? = nil, + completion: @escaping (Bool) -> Void + ) { + guard dependencies.activationAllowed() else { + completion(false) + return + } + guard !(shouldUseTor && dependencies.torEnforced() && !dependencies.torIsReady()) else { + completion(false) + return + } + + let requestedRelays = relayUrls ?? Self.defaultRelays + let targetRelays = allowedRelayList(from: requestedRelays) + let connectedTargets = targetRelays.compactMap { relayUrl -> (String, NostrRelayConnectionProtocol)? in + guard let connection = connectedConnection(for: relayUrl) else { return nil } + return (relayUrl, connection) + } + guard !connectedTargets.isEmpty else { + completion(false) + return + } + + let token = UUID() + let eventID = event.id + if let replaced = confirmedSends.removeValue(forKey: eventID) { + replaced.completion(false) + } + confirmedSends[eventID] = ConfirmedSendState( + token: token, + awaitingRelays: Set(connectedTargets.map(\.0)), + completion: completion + ) + dependencies.scheduleAfter(TransportConfig.nostrConfirmedSendAckTimeoutSeconds) { [weak self] in + Task { @MainActor [weak self] in + self?.timeoutConfirmedSend(eventID: eventID, token: token) + } + } + + for (relayUrl, connection) in connectedTargets { + sendToRelay(event: event, connection: connection, relayUrl: relayUrl) { [weak self] succeeded in + guard let self else { return } + // Success only means the bytes reached the socket; wait for + // the matching relay OK. A failed write settles this target + // as rejected because no OK can arrive for it. + if !succeeded { + self.resolveConfirmedSend( + eventID: eventID, + relayURL: relayUrl, + accepted: false, + token: token + ) + } + } + } + } + + private func resolveConfirmedSend( + eventID: String, + relayURL: String, + accepted: Bool, + token: UUID? = nil + ) { + guard var state = confirmedSends[eventID], + token == nil || state.token == token, + state.awaitingRelays.remove(relayURL) != nil else { return } + if accepted { + confirmedSends.removeValue(forKey: eventID) + state.completion(true) + } else if state.awaitingRelays.isEmpty { + confirmedSends.removeValue(forKey: eventID) + state.completion(false) + } else { + confirmedSends[eventID] = state + } + } + + private func timeoutConfirmedSend(eventID: String, token: UUID) { + guard let state = confirmedSends[eventID], state.token == token else { return } + confirmedSends.removeValue(forKey: eventID) + state.completion(false) + } + private func enqueuePendingSend(_ event: NostrEvent, pendingRelays: Set) { messageQueueLock.lock() messageQueue.append(PendingSend(event: event, pendingRelays: pendingRelays)) @@ -923,6 +1027,7 @@ final class NostrRelayManager: ObservableObject { // Send initial ping to verify connection task.sendPing { [weak self] error in DispatchQueue.main.async { + guard self?.connections[urlString] === task else { return } if error == nil { SecureLogger.debug("✅ Connected to Nostr relay: \(urlString)", category: .session) self?.updateRelayStatus(urlString, isConnected: true) @@ -932,7 +1037,11 @@ final class NostrRelayManager: ObservableObject { SecureLogger.error("❌ Failed to connect to Nostr relay \(urlString): \(error?.localizedDescription ?? "Unknown error")", category: .session) self?.updateRelayStatus(urlString, isConnected: false, error: error) // Trigger disconnection handler for proper backoff - self?.handleDisconnection(relayUrl: urlString, error: error ?? NSError(domain: "NostrRelay", code: -1, userInfo: nil)) + self?.handleDisconnection( + relayUrl: urlString, + error: error ?? NSError(domain: "NostrRelay", code: -1, userInfo: nil), + connection: task + ) } } } @@ -990,18 +1099,20 @@ final class NostrRelayManager: ObservableObject { Task.detached(priority: .utility) { guard let parsed = ParsedInbound(message) else { return } await MainActor.run { + guard self.connections[relayUrl] === task else { return } self.handleParsedMessage(parsed, from: relayUrl) } } // Continue receiving Task { @MainActor in + guard self.connections[relayUrl] === task else { return } self.receiveMessage(from: task, relayUrl: relayUrl) } case .failure(let error): DispatchQueue.main.async { - self.handleDisconnection(relayUrl: relayUrl, error: error) + self.handleDisconnection(relayUrl: relayUrl, error: error, connection: task) } } } @@ -1055,6 +1166,7 @@ final class NostrRelayManager: ObservableObject { } } case .ok(let eventId, let success, let reason): + resolveConfirmedSend(eventID: eventId, relayURL: relayUrl, accepted: success) if success { _ = Self.pendingGiftWrapIDs.remove(eventId) SecureLogger.debug("✅ Accepted id=\(eventId.prefix(16))… relay=\(relayUrl)", category: .session) @@ -1071,7 +1183,12 @@ final class NostrRelayManager: ObservableObject { } } - private func sendToRelay(event: NostrEvent, connection: NostrRelayConnectionProtocol, relayUrl: String) { + private func sendToRelay( + event: NostrEvent, + connection: NostrRelayConnectionProtocol, + relayUrl: String, + completion: ((Bool) -> Void)? = nil + ) { let req = NostrRequest.event(event) do { @@ -1084,17 +1201,20 @@ final class NostrRelayManager: ObservableObject { DispatchQueue.main.async { if let error = error { SecureLogger.error("❌ Failed to send event to \(relayUrl): \(error)", category: .session) + completion?(false) } else { // SecureLogger.debug("✅ Event sent to relay: \(relayUrl)", category: .session) // Update relay stats if let index = self?.relays.firstIndex(where: { $0.url == relayUrl }) { self?.relays[index].messagesSent += 1 } + completion?(true) } } } } catch { SecureLogger.error("Failed to encode event: \(error)", category: .session) + completion?(false) } } @@ -1158,9 +1278,20 @@ final class NostrRelayManager: ObservableObject { eoseTrackers[id] = tracker } - private func handleDisconnection(relayUrl: String, error: Error) { + private func handleDisconnection( + relayUrl: String, + error: Error, + connection: NostrRelayConnectionProtocol? = nil + ) { + if let connection, connections[relayUrl] !== connection { return } connections.removeValue(forKey: relayUrl) subscriptions.removeValue(forKey: relayUrl) + let awaitingConfirmation = confirmedSends.compactMap { eventID, state in + state.awaitingRelays.contains(relayUrl) ? eventID : nil + } + for eventID in awaitingConfirmation { + resolveConfirmedSend(eventID: eventID, relayURL: relayUrl, accepted: false) + } updateRelayStatus(relayUrl, isConnected: false, error: error) settleEOSETrackers(droppingRelay: relayUrl) // If networking is disallowed, do not schedule reconnection diff --git a/bitchat/PrivacyInfo.xcprivacy b/bitchat/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..00a28dfb --- /dev/null +++ b/bitchat/PrivacyInfo.xcprivacy @@ -0,0 +1,41 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + 3B52.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + 1C8F.1 + + + + + diff --git a/bitchat/Protocols/MeshMessageIdentity.swift b/bitchat/Protocols/MeshMessageIdentity.swift index 1696c001..1256697f 100644 --- a/bitchat/Protocols/MeshMessageIdentity.swift +++ b/bitchat/Protocols/MeshMessageIdentity.swift @@ -14,14 +14,11 @@ import Foundation /// The BLE wire carries no message ID for public broadcasts, so every device /// recomputes the same stable ID from the signed wire fields (sender ID, /// millisecond timestamp, content). That gives the mesh bridge a -/// cross-device-consistent dedup/attribution key with zero wire change — and -/// because receivers derive the key themselves instead of trusting a claimed -/// ID, forging a bridge tag that binds a chosen ID to *different* content is -/// infeasible. The inputs are cleartext on the radio, though: an attacker in -/// radio range can re-sign the identical sender/timestamp/content under -/// their own Nostr key and win first-wins injection on remote islands — -/// duplicate-content spoofing the unbridged mesh already permits, so no -/// worse than before. +/// cross-device-consistent radio identity with zero wire change. Bridge events +/// carry this value only as a hint for detecting a radio copy that is already +/// present: sender/timestamp/content are public, so a different Nostr signer +/// can copy them and must never be allowed to reserve the genuine event's +/// authenticated dedup slot. enum MeshMessageIdentity { /// Matches the wire truncation in `BLEService.sendMessage`. static func millisecondTimestamp(_ date: Date) -> UInt64 { diff --git a/bitchat/Services/BLE/BLEFanoutSelector.swift b/bitchat/Services/BLE/BLEFanoutSelector.swift index dadb9df1..8cc8aefe 100644 --- a/bitchat/Services/BLE/BLEFanoutSelector.swift +++ b/bitchat/Services/BLE/BLEFanoutSelector.swift @@ -18,6 +18,7 @@ enum BLEFanoutSelector { preferredPeripheralPerPeer: [PeerID: String] = [:], collapseDuplicatePeerLinks: Bool = true, directedPeerHint: PeerID?, + requireDirectPeerLink: Bool = false, packetType: UInt8, messageID: String ) -> BLEFanoutSelection { @@ -38,6 +39,9 @@ enum BLEFanoutSelector { ) { return directedSelection } + if directedPeerHint != nil, requireDirectPeerLink { + return BLEFanoutSelection(peripheralIDs: [], centralIDs: []) + } if let directedPeerHint, hasBoundLink( to: directedPeerHint, diff --git a/bitchat/Services/BLE/BLEOutboundFragmentTransferScheduler.swift b/bitchat/Services/BLE/BLEOutboundFragmentTransferScheduler.swift index 4284cfb9..882e4978 100644 --- a/bitchat/Services/BLE/BLEOutboundFragmentTransferScheduler.swift +++ b/bitchat/Services/BLE/BLEOutboundFragmentTransferScheduler.swift @@ -7,6 +7,26 @@ struct BLEOutboundFragmentTransferRequest { let maxChunk: Int? let directedPeer: PeerID? let transferId: String? + let requireDirectPeerLink: Bool + let requireNoiseAuthenticatedPeerLink: Bool + + init( + packet: BitchatPacket, + pad: Bool, + maxChunk: Int?, + directedPeer: PeerID?, + transferId: String?, + requireDirectPeerLink: Bool = false, + requireNoiseAuthenticatedPeerLink: Bool = false + ) { + self.packet = packet + self.pad = pad + self.maxChunk = maxChunk + self.directedPeer = directedPeer + self.transferId = transferId + self.requireDirectPeerLink = requireDirectPeerLink + self.requireNoiseAuthenticatedPeerLink = requireNoiseAuthenticatedPeerLink + } var resolvedTransferId: String? { guard packet.type == MessageType.fileTransfer.rawValue else { return nil } @@ -22,6 +42,21 @@ struct BLEOutboundFragmentTransferRequest { } } +/// Transactional admission for strict fragment trains. Durable callers may +/// commit only when every fragment was accepted; the first rejection stops +/// the train and reports failure so the original remains retryable. +enum BLEStrictFragmentAdmission { + static func admitAll( + _ fragments: [Fragment], + accepting: (Fragment) -> Bool + ) -> Bool { + for fragment in fragments where !accepting(fragment) { + return false + } + return true + } +} + struct BLEOutboundFragmentTransferScheduler { enum QueuePosition { case front @@ -31,6 +66,11 @@ struct BLEOutboundFragmentTransferScheduler { enum SubmitResult { case start(request: BLEOutboundFragmentTransferRequest, reservedTransferId: String?) case queued(request: BLEOutboundFragmentTransferRequest, transferId: String?, position: QueuePosition) + /// Strict direct-link requests are transactional: returning false to + /// their durable owner must mean no process-local copy remains that + /// can transmit later. They are therefore start-or-reject, never + /// admitted to `pendingTransfers`. + case rejectedStrict(request: BLEOutboundFragmentTransferRequest, transferId: String?) /// The same file is already being (or waiting to be) fragmented out /// to an audience covering this request; sending it again would just /// double the airtime (field-verified: one 41KB voice file went out @@ -113,11 +153,17 @@ struct BLEOutboundFragmentTransferScheduler { } guard activeTransfers.count < maxConcurrentTransfers else { + if request.requireDirectPeerLink { + return .rejectedStrict(request: request, transferId: transferId) + } pendingTransfers.append(request) return .queued(request: request, transferId: transferId, position: .back) } guard activeTransfers[transferId] == nil else { + if request.requireDirectPeerLink { + return .rejectedStrict(request: request, transferId: transferId) + } pendingTransfers.insert(request, at: 0) return .queued(request: request, transferId: transferId, position: .front) } diff --git a/bitchat/Services/BLE/BLEOutboundLinkPlanner.swift b/bitchat/Services/BLE/BLEOutboundLinkPlanner.swift index 5f86ebea..9f729834 100644 --- a/bitchat/Services/BLE/BLEOutboundLinkPlanner.swift +++ b/bitchat/Services/BLE/BLEOutboundLinkPlanner.swift @@ -22,21 +22,9 @@ enum BLEOutboundLinkPlanner { centralPeerBindings: [String: PeerID] = [:], preferredPeripheralPerPeer: [PeerID: String] = [:], directAnnounceTTL: UInt8 = TransportConfig.messageTTLDefault, - directedOnlyPeer: PeerID? + directedOnlyPeer: PeerID?, + requireDirectPeerLink: Bool = false ) -> BLEOutboundLinkPlan { - if let minLimit = minimumLinkLimit( - peripheralWriteLimits: peripheralWriteLimits, - centralNotifyLimits: centralNotifyLimits - ), packet.type != MessageType.fragment.rawValue, - dataCount > minLimit { - return BLEOutboundLinkPlan( - directedPeerHint: directedPeerHint(for: packet, explicitPeer: directedOnlyPeer), - fragmentChunkSize: BLEOutboundPacketPolicy.fragmentChunkSize(forLinkLimit: minLimit), - selectedLinks: BLEFanoutSelection(peripheralIDs: [], centralIDs: []), - shouldSpoolDirectedPacket: false - ) - } - let directedPeerHint = directedPeerHint(for: packet, explicitPeer: directedOnlyPeer) // Direct announces bypass the per-peer duplicate-link collapse so // every live link gets bound (see BLEFanoutSelector.selectLinks). @@ -51,10 +39,34 @@ enum BLEOutboundLinkPlanner { preferredPeripheralPerPeer: preferredPeripheralPerPeer, collapseDuplicatePeerLinks: !isDirectAnnounce, directedPeerHint: directedPeerHint, + requireDirectPeerLink: requireDirectPeerLink, packetType: packet.type, messageID: BLEOutboundPacketPolicy.messageID(for: packet) ) + // Fragment only for links that this packet can actually use. Looking + // at every connected link before directed-peer selection lets an + // unrelated peer's MTU make an oversized directed send look routable, + // even though every resulting fragment will select zero target links. + let selectedPeripheralLimits = zip(peripheralIDs, peripheralWriteLimits).compactMap { id, limit in + selectedLinks.peripheralIDs.contains(id) ? limit : nil + } + let selectedCentralLimits = zip(centralIDs, centralNotifyLimits).compactMap { id, limit in + selectedLinks.centralIDs.contains(id) ? limit : nil + } + if let minLimit = minimumLinkLimit( + peripheralWriteLimits: selectedPeripheralLimits, + centralNotifyLimits: selectedCentralLimits + ), packet.type != MessageType.fragment.rawValue, + dataCount > minLimit { + return BLEOutboundLinkPlan( + directedPeerHint: directedPeerHint, + fragmentChunkSize: BLEOutboundPacketPolicy.fragmentChunkSize(forLinkLimit: minLimit), + selectedLinks: selectedLinks, + shouldSpoolDirectedPacket: false + ) + } + return BLEOutboundLinkPlan( directedPeerHint: directedPeerHint, fragmentChunkSize: nil, diff --git a/bitchat/Services/BLE/BLEOutboundNotificationBuffer.swift b/bitchat/Services/BLE/BLEOutboundNotificationBuffer.swift index 6ccb4346..43c94a9a 100644 --- a/bitchat/Services/BLE/BLEOutboundNotificationBuffer.swift +++ b/bitchat/Services/BLE/BLEOutboundNotificationBuffer.swift @@ -44,4 +44,16 @@ struct BLEOutboundNotificationBuffer { guard !pending.isEmpty else { return } notifications.insert(contentsOf: pending, at: 0) } + + /// Removes a disconnected target from target-specific retries. Broadcast + /// entries (`targets == nil`) remain valid for the surviving subscriber + /// set; an entry with no targets left is discarded entirely. + mutating func removeTarget(where matches: (Target) -> Bool) { + notifications = notifications.compactMap { notification in + guard let targets = notification.targets else { return notification } + let remaining = targets.filter { !matches($0) } + guard !remaining.isEmpty else { return nil } + return BLEPendingNotification(data: notification.data, targets: remaining) + } + } } diff --git a/bitchat/Services/BLE/BLEOutboundWriteBuffer.swift b/bitchat/Services/BLE/BLEOutboundWriteBuffer.swift index f1bbbee7..44dfcbf1 100644 --- a/bitchat/Services/BLE/BLEOutboundWriteBuffer.swift +++ b/bitchat/Services/BLE/BLEOutboundWriteBuffer.swift @@ -46,8 +46,25 @@ struct BLEOutboundWriteBuffer { priority: BLEOutboundWritePriority, capBytes: Int ) -> EnqueueResult { + enqueueReportingAcceptance( + data: data, + for: peripheralID, + priority: priority, + capBytes: capBytes + ).result + } + + /// Enqueues while also reporting whether the newly offered write survived + /// priority trimming. `EnqueueResult.enqueued` alone cannot express that: + /// a full queue may immediately trim the new lowest-priority item. + mutating func enqueueReportingAcceptance( + data: Data, + for peripheralID: String, + priority: BLEOutboundWritePriority, + capBytes: Int + ) -> (result: EnqueueResult, accepted: Bool) { guard data.count <= capBytes else { - return .oversized(bytes: data.count) + return (.oversized(bytes: data.count), false) } var queue = writesByPeripheralID[peripheralID] ?? [] @@ -65,7 +82,8 @@ struct BLEOutboundWriteBuffer { } writesByPeripheralID[peripheralID] = queue.isEmpty ? nil : queue - return .enqueued(trimmedBytes: trimmedBytes, remainingBytes: total) + let accepted = insertIndex < queue.count + return (.enqueued(trimmedBytes: trimmedBytes, remainingBytes: total), accepted) } mutating func takeAll(for peripheralID: String) -> [BLEPendingWrite] { @@ -74,6 +92,13 @@ struct BLEOutboundWriteBuffer { return items } + /// Drops link-specific ciphertext when that physical link is gone. Keeping + /// the dictionary entry would let rotating peripheral UUIDs accumulate a + /// fresh per-link byte cap indefinitely. + mutating func discardAll(for peripheralID: String) { + writesByPeripheralID[peripheralID] = nil + } + mutating func prepend(_ items: [BLEPendingWrite], for peripheralID: String) { guard !items.isEmpty else { return } var existing = writesByPeripheralID[peripheralID] ?? [] diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 2ef8aba6..1f919a4a 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -37,6 +37,12 @@ final class BLEService: NSObject { // 1. Consolidated BLE link tracking for both central and peripheral roles. private var linkStateStore = BLELinkStateStore() + // A peer ID can retain an established Noise session after its physical + // link disappears. Courier handover therefore needs the stronger fact + // that the session was established *on this current ingress link*, not + // merely that some session exists for the claimed ID. bleQueue-owned. + private var noiseAuthenticatedLinkOwners: [BLEIngressLinkID: PeerID] = [:] + // Rotation-rebind cooldown per link UUID (bleQueue-owned, like the link // store): entries older than the cooldown are pruned on insert. private var lastLinkRebindAt: [String: Date] = [:] @@ -680,6 +686,7 @@ final class BLEService: NSObject { // Clear peripheral references (synchronized access to avoid races with BLE callbacks) bleQueue.sync { linkStateStore.clearAll() + noiseAuthenticatedLinkOwners.removeAll() connectionScheduler.reset() subscriptionAnnounceLimiter.removeAll() } @@ -1188,9 +1195,91 @@ final class BLEService: NSObject { } } - private func sendOnAllLinks(packet: BitchatPacket, data: Data, pad: Bool, directedOnlyPeer: PeerID?) { + /// Synchronously admits a notification to the link-specific retry queue. + /// Destructive courier handoff uses this result as its commit point, so a + /// full process-local queue must be reported as rejection, not success. + private func enqueuePendingNotificationIfAccepted( + data: Data, + centrals: [CBCentral], + context: String + ) -> Bool { + let result = collectionsQueue.sync(flags: .barrier) { + pendingNotifications.enqueue( + data: data, + targets: centrals, + capCount: TransportConfig.blePendingNotificationsCapCount + ) + } + switch result { + case let .enqueued(count): + SecureLogger.debug("📋 Queued \(context) packet for retry (pending=\(count))", category: .session) + return true + case let .full(count): + SecureLogger.warning("⚠️ Rejecting \(context) packet: notification queue full (pending=\(count))", category: .session) + return false + } + } + + /// Serializes the final authenticated-link check with CoreBluetooth's + /// notification admission on `bleQueue`, closing the rebind/disconnect + /// race between fanout planning and the actual handoff. + private func notifyOrEnqueueIfAccepted( + data: Data, + centrals: [CBCentral], + characteristic: CBMutableCharacteristic, + context: String, + requiredAuthenticatedPeer: PeerID? + ) -> Bool { + let accept = { [self] in + let eligible: [CBCentral] + if let peerID = requiredAuthenticatedPeer { + eligible = centrals.filter { central in + let link = BLEIngressLinkID.central(central.identifier.uuidString) + return noiseAuthenticatedLinkOwners[link] == peerID + && linkStateStore.peerID(forCentralUUID: central.identifier.uuidString) == peerID + } + } else { + eligible = centrals + } + guard !eligible.isEmpty else { return false } + if peripheralManager?.updateValue(data, for: characteristic, onSubscribedCentrals: eligible) == true { + return true + } + return enqueuePendingNotificationIfAccepted( + data: data, + centrals: eligible, + context: context + ) + } + + if DispatchQueue.getSpecific(key: bleQueueKey) != nil { + return accept() + } + return bleQueue.sync(execute: accept) + } + + /// Returns true only when the packet was accepted by at least one current + /// physical link (including its link-specific backpressure queue). A + /// process-local directed spool is deliberately not success: callers + /// that own a durable upstream copy must keep it retryable. + @discardableResult + private func sendOnAllLinks( + packet: BitchatPacket, + data: Data, + pad: Bool, + directedOnlyPeer: PeerID?, + requireDirectPeerLink: Bool = false, + requireNoiseAuthenticatedPeerLink: Bool = false + ) -> Bool { let ingressRecord = collectionsQueue.sync { ingressLinks.record(for: packet) } - let excludedPeerLinks = links(to: ingressRecord?.peerID) + var excludedPeerLinks = links(to: ingressRecord?.peerID) + if requireNoiseAuthenticatedPeerLink { + guard let directedOnlyPeer else { return false } + let boundLinks = links(to: directedOnlyPeer) + let authenticatedLinks = currentNoiseAuthenticatedLinks(to: directedOnlyPeer) + guard !authenticatedLinks.isEmpty else { return false } + excludedPeerLinks.formUnion(boundLinks.subtracting(authenticatedLinks)) + } let outboundPriority = BLEOutboundPacketPolicy.priority(for: packet, data: data) let states = snapshotPeripheralStates() @@ -1222,12 +1311,22 @@ final class BLEService: NSObject { // as a combined snapshot. preferredPeripheralPerPeer: readLinkState { $0.preferredPeripheralBindings }, directAnnounceTTL: messageTTL, - directedOnlyPeer: directedOnlyPeer + directedOnlyPeer: directedOnlyPeer, + requireDirectPeerLink: requireDirectPeerLink || requireNoiseAuthenticatedPeerLink ) if let chunk = plan.fragmentChunkSize { - sendFragmentedPacket(packet, pad: pad, maxChunk: chunk, directedOnlyPeer: directedOnlyPeer) - return + guard !plan.selectedLinks.peripheralIDs.isEmpty || !plan.selectedLinks.centralIDs.isEmpty else { + return false + } + return sendFragmentedPacket( + packet, + pad: pad, + maxChunk: chunk, + directedOnlyPeer: directedOnlyPeer, + requireDirectPeerLink: requireDirectPeerLink || requireNoiseAuthenticatedPeerLink, + requireNoiseAuthenticatedPeerLink: requireNoiseAuthenticatedPeerLink + ) } // If directed and we currently have no links to forward on, spool for a short window @@ -1236,36 +1335,73 @@ final class BLEService: NSObject { spoolDirectedPacket(packet, recipientPeerID: only) } + var acceptedByPhysicalLink = false + // Writes to selected connected peripherals for s in connectedStates { let pid = s.peripheral.identifier.uuidString guard plan.selectedLinks.peripheralIDs.contains(pid) else { continue } if let ch = s.characteristic { - writeOrEnqueue(data, to: s.peripheral, characteristic: ch, priority: outboundPriority) + if requireDirectPeerLink || requireNoiseAuthenticatedPeerLink { + acceptedByPhysicalLink = writeOrEnqueueIfAccepted( + data, + to: s.peripheral, + characteristic: ch, + priority: outboundPriority, + requiredAuthenticatedPeer: requireNoiseAuthenticatedPeerLink ? directedOnlyPeer : nil + ) || acceptedByPhysicalLink + } else { + writeOrEnqueue(data, to: s.peripheral, characteristic: ch, priority: outboundPriority) + } } } // Notify selected subscribed centrals if let ch = characteristic { let targets = subscribedCentrals.filter { plan.selectedLinks.centralIDs.contains($0.identifier.uuidString) } if !targets.isEmpty { - let success = peripheralManager?.updateValue(data, for: ch, onSubscribedCentrals: targets) ?? false - if !success { - // Notification queue full - queue for retry to prevent silent packet loss - // This is critical for fragment delivery reliability - let context = packet.type == MessageType.fragment.rawValue ? "fragment" : "broadcast" - enqueuePendingNotification(data: data, centrals: targets, context: context) + if requireDirectPeerLink || requireNoiseAuthenticatedPeerLink { + acceptedByPhysicalLink = notifyOrEnqueueIfAccepted( + data: data, + centrals: targets, + characteristic: ch, + context: "directed", + requiredAuthenticatedPeer: requireNoiseAuthenticatedPeerLink ? directedOnlyPeer : nil + ) || acceptedByPhysicalLink + } else { + let success = peripheralManager?.updateValue(data, for: ch, onSubscribedCentrals: targets) ?? false + if !success { + // Notification queue full - queue for retry to prevent silent packet loss + // This is critical for fragment delivery reliability + let context = packet.type == MessageType.fragment.rawValue ? "fragment" : "broadcast" + enqueuePendingNotification(data: data, centrals: targets, context: context) + } } } } + if requireDirectPeerLink || requireNoiseAuthenticatedPeerLink { return acceptedByPhysicalLink } + return !plan.selectedLinks.peripheralIDs.isEmpty || !plan.selectedLinks.centralIDs.isEmpty } // Directed send helper (unicast to a specific peerID) without altering packet contents - private func sendPacketDirected(_ packet: BitchatPacket, to peerID: PeerID) { + @discardableResult + private func sendPacketDirected( + _ packet: BitchatPacket, + to peerID: PeerID, + requireDirectPeerLink: Bool = false, + requireNoiseAuthenticatedPeerLink: Bool = false + ) -> Bool { #if DEBUG _test_onOutboundPacket?(packet) #endif - guard let data = packet.toBinaryData(padding: false) else { return } - sendOnAllLinks(packet: packet, data: data, pad: false, directedOnlyPeer: peerID) + guard let data = packet.toBinaryData(padding: false) else { return false } + return sendOnAllLinks( + packet: packet, + data: data, + pad: false, + directedOnlyPeer: peerID, + requireDirectPeerLink: requireDirectPeerLink, + requireNoiseAuthenticatedPeerLink: requireNoiseAuthenticatedPeerLink + ) } // MARK: - Directed store-and-forward @@ -1938,6 +2074,10 @@ extension BLEService: CBCentralManagerDelegate { #endif // Clean up references and peer mappings + collectionsQueue.sync(flags: .barrier) { + pendingPeripheralWrites.discardAll(for: peripheralID) + } + noiseAuthenticatedLinkOwners.removeValue(forKey: .peripheral(peripheralID)) _ = linkStateStore.removePeripheral(peripheralID) // A duplicate link can drop while the peer stays live on another // (the dual-role central link, or a second bound link after a @@ -1988,6 +2128,10 @@ extension BLEService: CBCentralManagerDelegate { let peripheralID = peripheral.identifier.uuidString // Clean up the references + collectionsQueue.sync(flags: .barrier) { + pendingPeripheralWrites.discardAll(for: peripheralID) + } + noiseAuthenticatedLinkOwners.removeValue(forKey: .peripheral(peripheralID)) _ = linkStateStore.removePeripheral(peripheralID) SecureLogger.error("❌ Failed to connect to peripheral: \(peripheral.name ?? "Unknown") [\(peripheralID)] - Error: \(error?.localizedDescription ?? "Unknown")", category: .session) @@ -2088,6 +2232,10 @@ extension BLEService { SecureLogger.debug("⏱️ Timeout: \(candidate.name)", category: .session) central.cancelPeripheralConnection(peripheral) + self.collectionsQueue.sync(flags: .barrier) { + self.pendingPeripheralWrites.discardAll(for: peripheralID) + } + self.noiseAuthenticatedLinkOwners.removeValue(forKey: .peripheral(peripheralID)) _ = self.linkStateStore.removePeripheral(peripheralID) self.connectionScheduler.recordConnectionTimeout(peripheralID: peripheralID, at: Date()) self.tryConnectFromQueue() @@ -2134,6 +2282,23 @@ extension BLEService { handleReceivedPacket(packet, from: fromPeerID) } + /// Waits until fragment ingress already submitted by a test has finished + /// reassembly/reinjection and any resulting transport event has crossed + /// the MainActor delivery hop. This is a deterministic pipeline fence, + /// avoiding wall-clock sleeps that become flaky under a parallel suite. + func _test_drainFragmentPipeline() async { + await withCheckedContinuation { continuation in + messageQueue.async(flags: .barrier) { + // Reassembled packets are reinjected synchronously on + // `messageQueue`; their UI delivery task is therefore already + // enqueued before this later MainActor marker. + Task { @MainActor in + continuation.resume() + } + } + } + } + func _test_hasGossipPrekeyBundle(for peerID: PeerID) -> Bool { gossipSyncManager?._hasPrekeyBundle(for: peerID) ?? false } @@ -2164,6 +2329,13 @@ extension BLEService { bleQueue.sync { linkStateStore.peerID(forCentralUUID: centralUUID) } } + func _test_markNoiseAuthenticatedCentral(_ centralUUID: String, to peerID: PeerID) { + bleQueue.sync { + guard linkStateStore.peerID(forCentralUUID: centralUUID) == peerID else { return } + noiseAuthenticatedLinkOwners[.central(centralUUID)] = peerID + } + } + func _test_seedConnectedPeer(_ peerID: PeerID, nickname: String) { collectionsQueue.sync(flags: .barrier) { peerRegistry.upsert(BLEPeerInfo( @@ -2578,7 +2750,12 @@ extension BLEService: CBPeripheralManagerDelegate { } func peripheralManager(_ peripheral: CBPeripheralManager, central: CBCentral, didUnsubscribeFrom characteristic: CBCharacteristic) { - SecureLogger.debug("📤 Central unsubscribed: \(central.identifier.uuidString.prefix(8))…", category: .session) + let centralID = central.identifier.uuidString + SecureLogger.debug("📤 Central unsubscribed: \(centralID.prefix(8))…", category: .session) + collectionsQueue.sync(flags: .barrier) { + pendingNotifications.removeTarget { $0.identifier.uuidString == centralID } + } + noiseAuthenticatedLinkOwners.removeValue(forKey: .central(centralID)) let removedPeerID = linkStateStore.removeSubscribedCentral(central) // Ensure we're still advertising for other devices to find us @@ -3118,6 +3295,45 @@ extension BLEService { private func links(to peerID: PeerID?) -> Set { readLinkState { $0.links(to: peerID) } } + + private func boundPeerID(for link: BLEIngressLinkID, in store: BLELinkStateStore) -> PeerID? { + switch link { + case .peripheral(let peripheralUUID): + store.peerID(forPeripheralID: peripheralUUID) + case .central(let centralUUID): + store.peerID(forCentralUUID: centralUUID) + } + } + + /// Marks the exact physical ingress link that completed a fresh Noise + /// handshake. An old session keyed only by peer ID is insufficient: a + /// replayed announce can rebind an attacker's link to that ID. + private func markNoiseAuthenticatedIngressLink(for packet: BitchatPacket, peerID: PeerID) { + guard let link = collectionsQueue.sync(execute: { ingressLinks.link(for: packet) }) else { return } + readLinkState { store in + guard boundPeerID(for: link, in: store) == peerID else { return } + noiseAuthenticatedLinkOwners[link] = peerID + } + } + + private func isNoiseAuthenticatedIngressLink(for packet: BitchatPacket, peerID: PeerID) -> Bool { + guard let link = collectionsQueue.sync(execute: { ingressLinks.link(for: packet) }) else { return false } + return readLinkState { store in + noiseAuthenticatedLinkOwners[link] == peerID && boundPeerID(for: link, in: store) == peerID + } + } + + private func hasCurrentNoiseAuthenticatedLink(to peerID: PeerID) -> Bool { + !currentNoiseAuthenticatedLinks(to: peerID).isEmpty + } + + private func currentNoiseAuthenticatedLinks(to peerID: PeerID) -> Set { + readLinkState { store in + Set(noiseAuthenticatedLinkOwners.compactMap { link, owner in + owner == peerID && boundPeerID(for: link, in: store) == peerID ? link : nil + }) + } + } private func configureNoiseServiceCallbacks(for service: NoiseEncryptionService) { service.onPeerAuthenticated = { [weak self] peerID, fingerprint in @@ -3299,22 +3515,32 @@ extension BLEService { guard CourierEnvelope.candidateTags(noiseStaticKey: myKey, around: Date()).contains(envelope.recipientTag) else { return false } - openCourierEnvelope(envelope) - return true + return openCourierEnvelope(envelope) } /// Hands a bridge-fetched envelope directly to the matching local peer /// as a directed courier packet. Delivery-only by design: the recipient's /// tag matched, so this never lands in a stranger's carry quota. + /// Returns true only if a current Noise-authenticated physical link + /// accepted the packet; a stale peer-level session, reachability record, + /// replay-rebound link, or process-local spool is not delivery. @discardableResult func deliverBridgedEnvelope(_ envelope: CourierEnvelope, to peerID: PeerID) -> Bool { - guard isPeerConnected(peerID) || isPeerReachable(peerID) else { return false } + guard hasCurrentNoiseAuthenticatedLink(to: peerID) else { return false } guard let payload = envelope.encode() else { return false } let packet = makeCourierPacket(payload, to: peerID) - messageQueue.async { [weak self] in - self?.sendPacketDirected(packet, to: peerID) + let send = { [weak self] in + self?.sendPacketDirected( + packet, + to: peerID, + requireDirectPeerLink: true, + requireNoiseAuthenticatedPeerLink: true + ) ?? false } - return true + if DispatchQueue.getSpecific(key: messageQueueKey) != nil { + return send() + } + return messageQueue.sync(execute: send) } /// Our own Noise static public key (for computing our courier tags). @@ -3385,7 +3611,8 @@ extension BLEService { } } - private func openCourierEnvelope(_ envelope: CourierEnvelope) { + @discardableResult + private func openCourierEnvelope(_ envelope: CourierEnvelope) -> Bool { do { let typedPayload: Data let senderStaticKey: Data @@ -3410,12 +3637,12 @@ extension BLEService { let payloadType = NoisePayloadType(rawValue: typeRaw), payloadType == .privateMessage else { SecureLogger.warning("⚠️ Courier envelope carried unsupported payload type", category: .session) - return + return true // decrypted but deterministically unsupported } let payload = Data(typedPayload.dropFirst()) guard let innerMessageID = PrivateMessagePacket.decode(from: payload)?.messageID else { SecureLogger.warning("⚠️ Courier envelope carried undecodable private message", category: .session) - return + return true // decrypted but deterministically malformed } // Redundant copies of one message arrive as distinct envelopes // (fresh seal each: mesh couriers, bridge drops across relays), @@ -3427,14 +3654,14 @@ extension BLEService { } guard firstOpen else { SecureLogger.debug("📦 Dropping duplicate courier envelope for message \(innerMessageID.prefix(8))…", category: .session) - return + return true } // Couriered mail arrives while the sender is absent, so the UI's // block check can't resolve their fingerprint from a live session. // Gate here, where the full static key is in hand. guard !identityManager.isBlocked(fingerprint: senderStaticKey.sha256Fingerprint()) else { SecureLogger.debug("🚫 Dropping courier envelope from blocked sender", category: .security) - return + return true } // A present sender resolves to their live mesh thread via the // derived short ID. An absent sender — the usual courier case — @@ -3454,9 +3681,11 @@ extension BLEService { timestamp: Date() )) } + return true } catch { // Tag collision or stale key: not addressed to us after all. SecureLogger.debug("📦 Courier envelope failed to open: \(error)", category: .encryption) + return false } } @@ -3498,13 +3727,23 @@ extension BLEService { /// Hand over any carried envelopes addressed to a peer we just heard from. private func deliverCourierMail(to peerID: PeerID, noiseKey: Data) { - let envelopes = courierStore.takeEnvelopes(for: noiseKey) - guard !envelopes.isEmpty else { return } - SecureLogger.debug("📦 Handing over \(envelopes.count) courier envelope(s) to \(peerID.id.prefix(8))…", category: .session) - for envelope in envelopes { - guard let payload = envelope.encode() else { continue } - sendPacketDirected(makeCourierPacket(payload, to: peerID), to: peerID) - sfMetrics?.record(.courierHandedOver) + let metrics = sfMetrics + let accepted = courierStore.handoverEnvelopes(for: noiseKey) { [weak self] envelope in + guard let self, + let payload = envelope.encode(), + self.sendPacketDirected( + self.makeCourierPacket(payload, to: peerID), + to: peerID, + requireDirectPeerLink: true, + requireNoiseAuthenticatedPeerLink: true + ) else { + return false + } + metrics?.record(.courierHandedOver) + return true + } + if accepted > 0 { + SecureLogger.debug("📦 Handed over \(accepted) courier envelope(s) to \(peerID.id.prefix(8))…", category: .session) } } @@ -3534,13 +3773,23 @@ extension BLEService { private func sprayCourierMail(to peerID: PeerID, noiseKey: Data, isVerifiedPeer: Bool) { let store = courierStore let metrics = sfMetrics - let sendSpray: ([CourierEnvelope]) -> Void = { [weak self] envelopes in - guard let self, !envelopes.isEmpty else { return } - SecureLogger.debug("📦 Spraying \(envelopes.count) envelope copy(ies) to courier \(peerID.id.prefix(8))…", category: .session) - for envelope in envelopes { - guard let payload = envelope.encode() else { continue } - self.sendPacketDirected(self.makeCourierPacket(payload, to: peerID), to: peerID) + let sendSpray: () -> Void = { [weak self] in + guard let self else { return } + let accepted = store.transferSprayCopies(to: noiseKey) { envelope in + guard let payload = envelope.encode(), + self.sendPacketDirected( + self.makeCourierPacket(payload, to: peerID), + to: peerID, + requireDirectPeerLink: true, + requireNoiseAuthenticatedPeerLink: true + ) else { + return false + } metrics?.record(.courierSprayed) + return true + } + if accepted > 0 { + SecureLogger.debug("📦 Sprayed \(accepted) envelope copy(ies) to courier \(peerID.id.prefix(8))…", category: .session) } } let policy = courierDepositPolicy @@ -3548,7 +3797,7 @@ extension BLEService { // Same trust gate as deposits: don't hand mail to a peer who // would reject it from us. guard policy(noiseKey, isVerifiedPeer) != nil else { return } - sendSpray(store.takeSprayCopies(for: noiseKey)) + sendSpray() } } @@ -3829,6 +4078,62 @@ extension BLEService { } } + /// Writes immediately or synchronously admits the packet to this + /// peripheral's bounded retry queue. Unlike `writeOrEnqueue`, the return + /// value distinguishes a retained queue item from one rejected or trimmed + /// immediately, which lets durable courier state commit truthfully. + private func writeOrEnqueueIfAccepted( + _ data: Data, + to peripheral: CBPeripheral, + characteristic: CBCharacteristic, + priority: BLEOutboundWritePriority, + requiredAuthenticatedPeer: PeerID? + ) -> Bool { + let accept = { [self] in + let uuid = peripheral.identifier.uuidString + guard let state = linkStateStore.state(forPeripheralID: uuid), + state.isConnected, + state.characteristic?.uuid == characteristic.uuid else { + return false + } + if let peerID = requiredAuthenticatedPeer { + let link = BLEIngressLinkID.peripheral(uuid) + guard state.peerID == peerID, + noiseAuthenticatedLinkOwners[link] == peerID else { + return false + } + } + + if peripheral.canSendWriteWithoutResponse { + peripheral.writeValue(data, for: characteristic, type: .withoutResponse) + return true + } + + let attempt = collectionsQueue.sync(flags: .barrier) { + pendingPeripheralWrites.enqueueReportingAcceptance( + data: data, + for: uuid, + priority: priority, + capBytes: TransportConfig.blePendingWriteBufferCapBytes + ) + } + switch attempt.result { + case .oversized(let bytes): + SecureLogger.warning("⚠️ Rejecting oversized write chunk (\(bytes)B) for peripheral \(uuid)", category: .session) + case let .enqueued(trimmedBytes, remainingBytes) where trimmedBytes > 0: + SecureLogger.warning("📉 Trimmed pending write buffer for \(uuid) by \(trimmedBytes)B to \(remainingBytes)B", category: .session) + case .enqueued: + break + } + return attempt.accepted + } + + if DispatchQueue.getSpecific(key: bleQueueKey) != nil { + return accept() + } + return bleQueue.sync(execute: accept) + } + private func drainPendingWrites(for peripheral: CBPeripheral) { let uuid = peripheral.identifier.uuidString bleQueue.async { [weak self] in @@ -3976,6 +4281,10 @@ extension BLEService { guard age > TransportConfig.bleConnectTimeoutSeconds else { continue } let peripheralID = state.peripheral.identifier.uuidString central.cancelPeripheralConnection(state.peripheral) + self.collectionsQueue.sync(flags: .barrier) { + self.pendingPeripheralWrites.discardAll(for: peripheralID) + } + self.noiseAuthenticatedLinkOwners.removeValue(forKey: .peripheral(peripheralID)) _ = self.linkStateStore.removePeripheral(peripheralID) cancelled += 1 } @@ -4119,25 +4428,37 @@ extension BLEService { // MARK: Fragmentation (Required for messages > BLE MTU) - private func sendFragmentedPacket(_ packet: BitchatPacket, pad: Bool, maxChunk: Int? = nil, directedOnlyPeer: PeerID? = nil, transferId: String? = nil) { + @discardableResult + private func sendFragmentedPacket( + _ packet: BitchatPacket, + pad: Bool, + maxChunk: Int? = nil, + directedOnlyPeer: PeerID? = nil, + transferId: String? = nil, + requireDirectPeerLink: Bool = false, + requireNoiseAuthenticatedPeerLink: Bool = false + ) -> Bool { let request = BLEOutboundFragmentTransferRequest( packet: packet, pad: pad, maxChunk: maxChunk, directedPeer: directedOnlyPeer, - transferId: transferId + transferId: transferId, + requireDirectPeerLink: requireDirectPeerLink, + requireNoiseAuthenticatedPeerLink: requireNoiseAuthenticatedPeerLink ) let result = collectionsQueue.sync(flags: .barrier) { outboundFragmentTransfers.submit(request, maxConcurrentTransfers: TransportConfig.bleMaxConcurrentTransfers) } - handleFragmentTransferSubmitResult(result) + return handleFragmentTransferSubmitResult(result) } - private func handleFragmentTransferSubmitResult(_ result: BLEOutboundFragmentTransferScheduler.SubmitResult) { + @discardableResult + private func handleFragmentTransferSubmitResult(_ result: BLEOutboundFragmentTransferScheduler.SubmitResult) -> Bool { switch result { case let .start(request, reservedTransferId): - startFragmentedPacket(request, reservedTransferId: reservedTransferId) + return startFragmentedPacket(request, reservedTransferId: reservedTransferId) case let .queued(_, transferId, _): if let transferId { @@ -4145,16 +4466,29 @@ extension BLEService { } else { SecureLogger.debug("🚦 Queued fragment transfer waiting for slot", category: .session) } + return false + + case let .rejectedStrict(_, transferId): + SecureLogger.debug( + "🚫 Strict directed fragment transfer \(transferId?.prefix(8) ?? "?")… rejected while scheduler busy", + category: .session + ) + return false case let .droppedDuplicate(_, activeTransferId): SecureLogger.debug( "🔁 Skipping duplicate outbound transfer — same content already in flight as \(activeTransferId?.prefix(8) ?? "?")…", category: .session ) + return false } } - private func startFragmentedPacket(_ request: BLEOutboundFragmentTransferRequest, reservedTransferId: String?) { + @discardableResult + private func startFragmentedPacket( + _ request: BLEOutboundFragmentTransferRequest, + reservedTransferId: String? + ) -> Bool { let releaseReservedSlot: (String) -> Void = { [weak self] id in guard let self = self else { return } TransferProgressManager.shared.cancel(id: id) @@ -4174,7 +4508,7 @@ extension BLEService { if let id = reservedTransferId { releaseReservedSlot(id) } - return + return false } // Lightweight pacing to reduce floods and allow BLE buffers to drain @@ -4200,6 +4534,42 @@ extension BLEService { return id }() + let sendFragment: (BitchatPacket) -> Bool = { [weak self] fragmentPacket in + guard let self else { return false } + if request.requireDirectPeerLink, let directedPeer = request.directedPeer { + return self.sendPacketDirected( + fragmentPacket, + to: directedPeer, + requireDirectPeerLink: true, + requireNoiseAuthenticatedPeerLink: request.requireNoiseAuthenticatedPeerLink + ) + } + self.broadcastPacket(fragmentPacket) + return true + } + + // Strict courier handoff is transactional at the fragment-admission + // boundary: every fragment must enter the intended authenticated + // link or its bounded retry queue before the durable owner may commit. + // A partial train is harmlessly abandoned and the envelope stays + // retryable with a fresh fragment ID on the next encounter. + if request.requireDirectPeerLink { + let admitted = BLEStrictFragmentAdmission.admitAll(plan.fragmentPackets) { fragmentPacket in + guard sendFragment(fragmentPacket) else { return false } + if let transferId = transferIdentifier { + markFragmentSent(transferId: transferId) + } + return true + } + guard admitted else { + if let id = reservedTransferId { + releaseReservedSlot(id) + } + return false + } + return true + } + var scheduledItems: [(item: DispatchWorkItem, index: Int)] = [] for (index, fragmentPacket) in plan.fragmentPackets.enumerated() { @@ -4212,7 +4582,7 @@ extension BLEService { if fragmentPacket.recipientID == nil || fragmentPacket.recipientID?.allSatisfy({ $0 == 0xFF }) == true { self.gossipSyncManager?.onPublicPacketSeen(fragmentPacket) } - self.broadcastPacket(fragmentPacket) + _ = sendFragment(fragmentPacket) if let transferId = transferIdentifier { self.markFragmentSent(transferId: transferId) } @@ -4232,6 +4602,7 @@ extension BLEService { let delayMs = index * plan.spacingMs messageQueue.asyncAfter(deadline: .now() + .milliseconds(delayMs), execute: workItem) } + return true } // MARK: - Fragmentation (Required for messages > BLE MTU) @@ -4503,15 +4874,32 @@ extension BLEService { let result, result.isVerified else { return } let noiseKey = result.announcement.noisePublicKey - if result.isDirectAnnounce { - // Established link: destructive handover is safe, and the peer is - // close enough to become a courier for other carried mail. + let authenticatedIngress = result.isDirectAnnounce + && canDeliverSecurely(to: result.peerID) + && isNoiseAuthenticatedIngressLink(for: packet, peerID: result.peerID) + if authenticatedIngress { + // The session was established on this still-bound ingress link. + // A peer-level Noise session alone is not enough: it can outlive + // its physical link while a replay rebinds an attacker's link to + // the victim's ID. deliverCourierMail(to: result.peerID, noiseKey: noiseKey) sprayCourierMail(to: result.peerID, noiseKey: noiseKey, isVerifiedPeer: true) } else { - // Relayed announce: recipient is multi-hop away. Push a copy - // toward them speculatively; the carried copy stays put. + // Relayed announce, or a direct-looking announce that has not yet + // proved link ownership with Noise: push a speculative copy while + // retaining the durable carried original. deliverCourierMailRemotely(to: result.peerID, noiseKey: noiseKey) + if result.isDirectAnnounce, + !hasCurrentNoiseAuthenticatedLink(to: result.peerID) { + if noiseService.hasEstablishedSession(with: result.peerID) { + // A session with no surviving authenticated link is stale; + // force the current link to prove possession again. + noiseService.clearSession(for: result.peerID) + } + if !noiseService.hasSession(with: result.peerID) { + initiateNoiseHandshake(with: result.peerID) + } + } } } @@ -4559,6 +4947,10 @@ extension BLEService { } self.lastLinkRebindAt[linkUUID] = now + // A Noise proof belongs to the old physical binding. Never carry + // it across an announce-driven rebind, whose direct TTL is + // replayable; the new owner must complete a fresh handshake. + self.noiseAuthenticatedLinkOwners.removeValue(forKey: link) switch link { case .peripheral(let peripheralUUID): self.linkStateStore.bindPeripheral(peripheralUUID, to: peerID) @@ -4652,6 +5044,10 @@ extension BLEService { ) for uuid in retiring { guard let state = linkStateStore.state(forPeripheralID: uuid) else { continue } + collectionsQueue.sync(flags: .barrier) { + pendingPeripheralWrites.discardAll(for: uuid) + } + noiseAuthenticatedLinkOwners.removeValue(forKey: .peripheral(uuid)) _ = linkStateStore.removePeripheral(uuid) SecureLogger.info( "🔗 Retiring redundant link \(uuid.prefix(8))… bound to \(peerID.id.prefix(8))…\(keptUUID.map { " (keeping \($0.prefix(8))…)" } ?? "")", @@ -5029,7 +5425,11 @@ extension BLEService { } private func handleNoiseHandshake(_ packet: BitchatPacket, from peerID: PeerID) { + let wasEstablished = noiseService.hasEstablishedSession(with: peerID) noisePacketHandler.handleHandshake(packet, from: peerID) + if !wasEstablished, noiseService.hasEstablishedSession(with: peerID) { + markNoiseAuthenticatedIngressLink(for: packet, peerID: peerID) + } } private func handleNoiseEncrypted(_ packet: BitchatPacket, from peerID: PeerID) { diff --git a/bitchat/Services/Courier/CourierStore.swift b/bitchat/Services/Courier/CourierStore.swift index b765edc5..77c7d100 100644 --- a/bitchat/Services/Courier/CourierStore.swift +++ b/bitchat/Services/Courier/CourierStore.swift @@ -10,6 +10,9 @@ import BitFoundation import BitLogger import Combine import Foundation +#if os(iOS) +import UIKit +#endif /// Trust level of a courier deposit, decided by the caller's policy. /// Favorites get the larger quota and are never evicted to make room for @@ -120,13 +123,45 @@ final class CourierStore { private let queue = DispatchQueue(label: "chat.bitchat.courier.store") private let fileURL: URL? private let now: () -> Date + private let readData: (URL) throws -> Data + /// A protected file can be present but unreadable during an iOS + /// background restoration before first unlock. Keep that distinct from + /// an absent file: mutations may proceed in memory, but must not replace + /// the unreadable durable snapshot until it can be merged. + private var diskLoadDeferred = false + #if os(iOS) + private var protectedDataObserver: NSObjectProtocol? + #endif /// - Parameter fileURL: Overrides the on-disk location (tests). Ignored /// when `persistsToDisk` is false. - init(persistsToDisk: Bool = true, fileURL: URL? = nil, now: @escaping () -> Date = Date.init) { + init( + persistsToDisk: Bool = true, + fileURL: URL? = nil, + now: @escaping () -> Date = Date.init, + readData: @escaping (URL) throws -> Data = { try Data(contentsOf: $0) } + ) { self.now = now self.fileURL = persistsToDisk ? (fileURL ?? Self.defaultFileURL()) : nil + self.readData = readData loadFromDisk() + #if os(iOS) + protectedDataObserver = NotificationCenter.default.addObserver( + forName: UIApplication.protectedDataDidBecomeAvailableNotification, + object: nil, + queue: nil + ) { [weak self] _ in + self?.retryDeferredPersistence() + } + #endif + } + + deinit { + #if os(iOS) + if let protectedDataObserver { + NotificationCenter.default.removeObserver(protectedDataObserver) + } + #endif } // MARK: - Depositing (courier side) @@ -154,10 +189,16 @@ final class CourierStore { return queue.sync { pruneExpiredLocked(at: date) - // Identical ciphertext is the same envelope; accept idempotently, - // keeping the larger spray budget (bounded by maxCopies either way). + // Identical ciphertext is the same envelope. Before any spray, + // a carry-only copy may legitimately arrive ahead of the original + // higher-budget copy, so keep the larger initial budget. Once a + // branch has sprayed, however, replaying the depositor's original + // packet must never replenish spent copies: that would defeat + // spray-and-wait and let `sprayedTo` grow without bound. if let existing = envelopes.firstIndex(where: { $0.ciphertext == envelope.ciphertext }) { - envelopes[existing].copies = max(envelopes[existing].copies, envelope.copies) + if envelopes[existing].sprayedTo.isEmpty { + envelopes[existing].copies = max(envelopes[existing].copies, envelope.copies) + } persistLocked() return true } @@ -207,20 +248,52 @@ final class CourierStore { // MARK: - Handover (on encountering a peer) /// Remove and return all envelopes addressed to the given peer, matching - /// the rotating recipient tag across adjacent days. Envelopes are removed - /// optimistically: handover happens over a live link, and the depositor's - /// outbox still retains the original for direct delivery. + /// the rotating recipient tag across adjacent days. This compatibility + /// helper accepts every offer; transport callers should use + /// `handoverEnvelopes(for:accepting:)` so failed sends remain durable. func takeEnvelopes(for noiseStaticKey: Data) -> [CourierEnvelope] { + var handedOver: [CourierEnvelope] = [] + handoverEnvelopes(for: noiseStaticKey) { envelope in + handedOver.append(envelope) + return true + } + return handedOver + } + + /// Attempts direct handover without retiring the durable carried copy + /// until the transport accepts it onto the intended peer's physical link. + /// A failed encode, stale binding, or backpressure rejection leaves the + /// envelope unchanged for the next authenticated encounter. + @discardableResult + func handoverEnvelopes( + for noiseStaticKey: Data, + accepting: (CourierEnvelope) -> Bool + ) -> Int { let date = now() let candidates = CourierEnvelope.candidateTags(noiseStaticKey: noiseStaticKey, around: date) - return queue.sync { + let offered = queue.sync { pruneExpiredLocked(at: date) - let matched = envelopes.filter { candidates.contains($0.recipientTag) } - guard !matched.isEmpty else { return [] } - envelopes.removeAll { stored in matched.contains(stored) } - persistLocked() - return matched.map(\.envelope) + return envelopes + .filter { candidates.contains($0.recipientTag) } + .map(\.envelope) } + + var acceptedCount = 0 + for envelope in offered where accepting(envelope) { + // Do not hold the store queue while the acceptance closure enters + // BLE/collections queues. Commit in a second short critical + // section, rechecking that another handover did not win first. + let committed = queue.sync { + guard let index = envelopes.firstIndex(where: { $0.ciphertext == envelope.ciphertext }) else { + return false + } + envelopes.remove(at: index) + persistLocked() + return true + } + if committed { acceptedCount += 1 } + } + return acceptedCount } /// Envelopes addressed to a recipient we heard from via a *relayed* @@ -247,27 +320,33 @@ final class CourierStore { } } - /// Envelopes to park on relays as bridge courier drops. Non-destructive - /// like remote handover — the relay copy is speculative, so the carried - /// copy stays until direct handover or expiry. The per-envelope cooldown - /// keeps relay churn from republishing the same mail; publishing relays - /// dedup identical events by ID anyway. + /// Envelopes eligible to park on relays as bridge courier drops. Merely + /// offering one does not start its cooldown: the caller commits that only + /// after a relay explicitly accepts the event via NIP-20 OK. func envelopesForBridgePublish(cooldown: TimeInterval) -> [CourierEnvelope] { let date = now() return queue.sync { pruneExpiredLocked(at: date) - var matched: [CourierEnvelope] = [] - for index in envelopes.indices { - if let last = envelopes[index].lastBridgePublishAt, + return envelopes.compactMap { stored in + if let last = stored.lastBridgePublishAt, date.timeIntervalSince(last) < cooldown { - continue + return nil } - envelopes[index].lastBridgePublishAt = date // The relay copy carries no spray budget. - matched.append(envelopes[index].envelope.withCopies(1)) + return stored.envelope.withCopies(1) } - if !matched.isEmpty { persistLocked() } - return matched + } + } + + /// Starts the bridge-publish cooldown only for a relay-confirmed copy. + func markBridgePublished(_ envelope: CourierEnvelope) { + let date = now() + queue.sync { + guard let index = envelopes.firstIndex(where: { $0.ciphertext == envelope.ciphertext }) else { + return + } + envelopes[index].lastBridgePublishAt = date + persistLocked() } } @@ -278,25 +357,60 @@ final class CourierStore { /// deposited, envelopes addressed to them (those ride the handover path), /// carry-only envelopes, and couriers already sprayed. func takeSprayCopies(for courierNoiseKey: Data) -> [CourierEnvelope] { + var sprayed: [CourierEnvelope] = [] + transferSprayCopies(to: courierNoiseKey) { envelope in + sprayed.append(envelope) + return true + } + return sprayed + } + + /// Offers binary-spray copies one at a time and commits the reduced local + /// budget plus `sprayedTo` marker only after the directed transport accepts + /// that copy. A false result is a rollback: retrying the same courier sees + /// the original budget and eligibility. + @discardableResult + func transferSprayCopies( + to courierNoiseKey: Data, + accepting: (CourierEnvelope) -> Bool + ) -> Int { let date = now() let courierTags = CourierEnvelope.candidateTags(noiseStaticKey: courierNoiseKey, around: date) - return queue.sync { + let offered = queue.sync { pruneExpiredLocked(at: date) - var sprayed: [CourierEnvelope] = [] - for index in envelopes.indices { - let stored = envelopes[index] + return envelopes.compactMap { stored -> CourierEnvelope? in guard stored.copies > 1, stored.depositorNoiseKey != courierNoiseKey, !stored.sprayedTo.contains(courierNoiseKey), - !courierTags.contains(stored.recipientTag) else { continue } - let given = stored.copies / 2 - envelopes[index].copies = stored.copies - given - envelopes[index].sprayedTo.insert(courierNoiseKey) - sprayed.append(stored.envelope.withCopies(given)) + !courierTags.contains(stored.recipientTag) else { return nil } + return stored.envelope.withCopies(stored.copies / 2) } - if !sprayed.isEmpty { persistLocked() } - return sprayed } + + var acceptedCount = 0 + for copy in offered where accepting(copy) { + // As with direct handover, BLE acceptance runs outside the store + // queue. Revalidate and commit the exact budget that left this + // device; a competing successful transfer makes this a no-op. + let committed = queue.sync { + guard let index = envelopes.firstIndex(where: { $0.ciphertext == copy.ciphertext }) else { + return false + } + let stored = envelopes[index] + guard stored.copies > copy.copies, + stored.depositorNoiseKey != courierNoiseKey, + !stored.sprayedTo.contains(courierNoiseKey), + !courierTags.contains(stored.recipientTag) else { + return false + } + envelopes[index].copies = stored.copies - copy.copies + envelopes[index].sprayedTo.insert(courierNoiseKey) + persistLocked() + return true + } + if committed { acceptedCount += 1 } + } + return acceptedCount } // MARK: - Maintenance @@ -305,6 +419,7 @@ final class CourierStore { func wipe() { queue.sync { envelopes.removeAll() + diskLoadDeferred = false if let fileURL { try? FileManager.default.removeItem(at: fileURL) } @@ -312,6 +427,16 @@ final class CourierStore { } } + /// Retries a protected-data read and merges any envelopes accepted while + /// the file was unavailable. Internal so persistence tests can drive the + /// same transition as iOS's protected-data notification. + func retryDeferredPersistence() { + queue.sync { + guard diskLoadDeferred, resolveDeferredLoadLocked() else { return } + persistLocked() + } + } + // MARK: - Internals (call only on `queue`) private func pruneExpiredLocked(at date: Date) { @@ -332,6 +457,12 @@ final class CourierStore { private func persistLocked() { publishCountLocked() guard let fileURL else { return } + // Never turn a transient protected-data read failure into an + // authoritative empty/new file. Once readable, resolve first by + // merging the durable and in-memory snapshots. + if diskLoadDeferred, !resolveDeferredLoadLocked() { + return + } do { if envelopes.isEmpty { try? FileManager.default.removeItem(at: fileURL) @@ -344,7 +475,7 @@ final class CourierStore { let data = try JSONEncoder().encode(envelopes) var options: Data.WritingOptions = [.atomic] #if os(iOS) - options.insert(.completeFileProtection) + options.insert(.completeFileProtectionUntilFirstUserAuthentication) #endif try data.write(to: fileURL, options: options) } catch { @@ -355,16 +486,135 @@ final class CourierStore { private func loadFromDisk() { guard let fileURL else { return } queue.sync { - guard let data = try? Data(contentsOf: fileURL), - let stored = try? JSONDecoder().decode([StoredEnvelope].self, from: data) else { + guard FileManager.default.fileExists(atPath: fileURL.path) else { + diskLoadDeferred = false return } - envelopes = stored + do { + let data = try readData(fileURL) + do { + envelopes = try JSONDecoder().decode([StoredEnvelope].self, from: data) + diskLoadDeferred = false + pruneExpiredLocked(at: now()) + publishCountLocked() + Self.migrateFileProtectionIfNeeded(at: fileURL) + } catch { + // The bytes were readable, so this is corruption/schema + // failure rather than protected-data unavailability. + diskLoadDeferred = false + SecureLogger.error("Failed to decode courier store: \(error)", category: .session) + } + } catch { + diskLoadDeferred = true + SecureLogger.warning("Courier store unavailable; deferring load until protected data is available: \(error)", category: .session) + } + } + } + + /// Must be called on `queue`. + private func resolveDeferredLoadLocked() -> Bool { + guard diskLoadDeferred, let fileURL else { return true } + guard FileManager.default.fileExists(atPath: fileURL.path) else { + diskLoadDeferred = false + return true + } + do { + let data = try readData(fileURL) + let durable = try JSONDecoder().decode([StoredEnvelope].self, from: data) + envelopes = Self.merge(durable: durable, inMemory: envelopes) + diskLoadDeferred = false pruneExpiredLocked(at: now()) publishCountLocked() + Self.migrateFileProtectionIfNeeded(at: fileURL) + return true + } catch let error as DecodingError { + // Readability returned but the snapshot is corrupt. Do not pin + // persistence forever; retain the valid in-memory snapshot. + diskLoadDeferred = false + SecureLogger.error("Failed to decode deferred courier store: \(error)", category: .session) + return true + } catch { + SecureLogger.warning("Courier store still unavailable: \(error)", category: .session) + return false } } + private static func merge(durable: [StoredEnvelope], inMemory: [StoredEnvelope]) -> [StoredEnvelope] { + var merged = durable + for candidate in inMemory { + if let index = merged.firstIndex(where: { $0.ciphertext == candidate.ciphertext }) { + // Union progress before deciding the budget. Once either copy + // has sprayed, the lower remaining budget is authoritative; + // an older durable/original snapshot must not replenish it. + let durableHasProgress = !merged[index].sprayedTo.isEmpty + let memoryHasProgress = !candidate.sprayedTo.isEmpty + let combinedSprayedTo = merged[index].sprayedTo.union(candidate.sprayedTo) + switch (durableHasProgress, memoryHasProgress) { + case (false, false): + merged[index].copies = max(merged[index].copies, candidate.copies) + case (true, false): + break // durable progress owns its remaining budget + case (false, true): + merged[index].copies = candidate.copies + case (true, true): + // Concurrent progress can only spend budget; choosing the + // lower branch prevents a merge from minting copies. + merged[index].copies = min(merged[index].copies, candidate.copies) + } + merged[index].sprayedTo = combinedSprayedTo + if candidate.tier == .favorite { merged[index].tier = .favorite } + merged[index].lastRemoteHandoverAt = [merged[index].lastRemoteHandoverAt, candidate.lastRemoteHandoverAt] + .compactMap { $0 } + .max() + merged[index].lastBridgePublishAt = [merged[index].lastBridgePublishAt, candidate.lastBridgePublishAt] + .compactMap { $0 } + .max() + } else { + merged.append(candidate) + } + } + + // A long locked wake can accept new mail alongside a full durable + // store. Re-apply deposit quotas: existing per-depositor mail keeps + // its slot, while total-cap eviction sheds oldest verified mail first. + merged.sort { $0.storedAt < $1.storedAt } + var perDepositorCounts: [Data: Int] = [:] + merged = merged.filter { envelope in + let limit = envelope.tier == .favorite + ? Limits.maxPerFavoriteDepositor + : Limits.maxPerVerifiedDepositor + let count = perDepositorCounts[envelope.depositorNoiseKey, default: 0] + guard count < limit else { return false } + perDepositorCounts[envelope.depositorNoiseKey] = count + 1 + return true + } + while merged.filter({ $0.tier == .verified }).count > Limits.maxVerifiedEnvelopes { + guard let victim = merged.firstIndex(where: { $0.tier == .verified }) else { break } + merged.remove(at: victim) + } + while merged.count > Limits.maxEnvelopes { + if let victim = merged.firstIndex(where: { $0.tier == .verified }) { + merged.remove(at: victim) + } else { + merged.removeFirst() + } + } + return merged + } + + private static func migrateFileProtectionIfNeeded(at fileURL: URL) { + #if os(iOS) + do { + try FileManager.default.setAttributes( + [.protectionKey: FileProtectionType.completeUntilFirstUserAuthentication], + ofItemAtPath: fileURL.path + ) + } catch { + SecureLogger.warning("Failed to migrate courier store file protection: \(error)", category: .session) + } + #endif + } + private static func defaultFileURL() -> URL? { guard let base = try? FileManager.default.url( for: .applicationSupportDirectory, diff --git a/bitchat/Services/Courier/MessageOutboxStore.swift b/bitchat/Services/Courier/MessageOutboxStore.swift index b38616a2..5543a8d0 100644 --- a/bitchat/Services/Courier/MessageOutboxStore.swift +++ b/bitchat/Services/Courier/MessageOutboxStore.swift @@ -11,6 +11,9 @@ import BitLogger import CryptoKit import Foundation import Security +#if os(iOS) +import UIKit +#endif /// Disk persistence for the MessageRouter outbox, so private messages queued /// for an offline peer survive an app kill instead of silently evaporating. @@ -60,76 +63,550 @@ final class MessageOutboxStore { private static let keychainService = "chat.bitchat.outbox" private static let keychainKey = "outbox-encryption-key" + typealias Snapshot = [PeerID: [QueuedMessage]] + + private enum DiskState { + case unknown + case loaded + case deferred + } + + private enum DiskReadResult { + case missing + case loaded(Snapshot) + case deferred(Error?) + case corrupt(Error) + } + + private enum EncryptionKeyReadResult { + case available(SymmetricKey) + case missing + case invalid + case unavailable(Error?) + } + + private struct RecoveredSnapshot { + let snapshot: Snapshot + let generation: UInt64 + let unseenDurable: Snapshot + } + private let fileURL: URL? private let keychain: KeychainManagerProtocol + private let readData: (URL) throws -> Data + private let writeData: (Data, URL, Data.WritingOptions) throws -> Void + private let beforeRecoveryNotification: () -> Void + private let lock = NSLock() + private var diskState: DiskState = .unknown + private var cachedSnapshot: Snapshot = [:] + /// Mutations made after a protected-data load failed. They are merged + /// with the durable snapshot once it becomes readable, never written on + /// top of an unreadable file. + private var pendingSnapshot: Snapshot? + /// True after a write failed after the durable baseline was already + /// loaded. That full-router snapshot includes removals and must replace, + /// rather than union with, the older disk contents on retry. + private var pendingSnapshotIsAuthoritative = false + /// Delivery/read acknowledgments received before a deferred cold-load + /// reveals the durable queue. Applied to every merge before persistence. + private var pendingRemovalMessageIDs = Set() + private var recoveryHandler: (@MainActor (Snapshot) -> Void)? + /// Recovery loaded durable state that MessageRouter has not merged yet. + /// While true, router saves must union with `cachedSnapshot` instead of + /// replacing unseen durable messages. + private var recoveryDeliveryPending = false + /// Recovery read durable state and classified the unseen subset, but the + /// merged snapshot could not yet be persisted. Preserve that classification + /// across retries instead of treating the cached union as router-known. + private var unseenRecoveryPendingPersistence = false + /// MessageRouter's latest authoritative in-memory snapshot while a + /// recovery classification is awaiting persistence or delivery. This is + /// deliberately separate from `pendingSnapshot`, which may contain the + /// union of router-known and unseen durable work after a failed write. + private var recoveryRouterSnapshot: Snapshot = [:] + /// The durable messages absent from MessageRouter's locked-wake snapshot + /// when recovery completed. Only this subset is unioned into authoritative + /// router saves before the recovery callback is claimed. + private var unseenRecoveredSnapshot: Snapshot = [:] + /// Covers the narrow launch race where protected data becomes available + /// after `load()` returned but before MessageRouter installs its handler. + private var unreportedRecoveredSnapshot: RecoveredSnapshot? + /// Invalidates recovery callbacks already queued onto the main actor when + /// panic wipe begins. + private var lifecycleGeneration: UInt64 = 0 + #if os(iOS) + private var protectedDataObserver: NSObjectProtocol? + #endif - init(keychain: KeychainManagerProtocol, fileURL: URL? = nil) { + init( + keychain: KeychainManagerProtocol, + fileURL: URL? = nil, + readData: @escaping (URL) throws -> Data = { try Data(contentsOf: $0) }, + writeData: @escaping (Data, URL, Data.WritingOptions) throws -> Void = { + try $0.write(to: $1, options: $2) + }, + beforeRecoveryNotification: @escaping () -> Void = {} + ) { self.keychain = keychain self.fileURL = fileURL ?? Self.defaultFileURL() + self.readData = readData + self.writeData = writeData + self.beforeRecoveryNotification = beforeRecoveryNotification + #if os(iOS) + protectedDataObserver = NotificationCenter.default.addObserver( + forName: UIApplication.protectedDataDidBecomeAvailableNotification, + object: nil, + queue: nil + ) { [weak self] _ in + self?.retryDeferredLoad() + } + #endif + } + + deinit { + #if os(iOS) + if let protectedDataObserver { + NotificationCenter.default.removeObserver(protectedDataObserver) + } + #endif } // MARK: - API (call from the router's actor; IO is small and atomic) - func load() -> [PeerID: [QueuedMessage]] { - guard let fileURL, - let sealed = try? Data(contentsOf: fileURL), - let key = encryptionKey(createIfMissing: false), - let box = try? ChaChaPoly.SealedBox(combined: sealed), - let plaintext = try? ChaChaPoly.open(box, using: key), - let decoded = try? JSONDecoder().decode([String: [QueuedMessage]].self, from: plaintext) else { - return [:] + func load() -> Snapshot { + lock.lock() + defer { lock.unlock() } + + if case .loaded = diskState { + return cachedSnapshot } - var outbox: [PeerID: [QueuedMessage]] = [:] - for (peerID, queue) in decoded where !queue.isEmpty { - outbox[PeerID(str: peerID)] = queue + // Once a deferred recovery has classified the durable baseline, + // `cachedSnapshot` is the only safe synchronous view. Re-reading via + // the generic load path would confuse its durable+router union with a + // fully router-known authoritative snapshot. + if unseenRecoveryPendingPersistence || recoveryDeliveryPending { + return cachedSnapshot + } + + let wasDeferred = diskState == .deferred + switch readSnapshotLocked() { + case .loaded(let durable): + cachedSnapshot = applyingPendingRemovalsLocked(pendingSnapshotIsAuthoritative + ? (pendingSnapshot ?? [:]) + : Self.merge(durable, pendingSnapshot ?? [:])) + diskState = .loaded + if pendingSnapshot != nil || !pendingRemovalMessageIDs.isEmpty { + if persistSnapshotAndClearRemovalsLocked(cachedSnapshot) { + pendingSnapshot = nil + pendingSnapshotIsAuthoritative = false + } else { + pendingSnapshot = cachedSnapshot + pendingSnapshotIsAuthoritative = true + diskState = .deferred + } + } + // The recovery callback is driven by `retryDeferredLoad`; `load` + // itself returns the recovered value synchronously to its caller. + return cachedSnapshot + + case .missing: + cachedSnapshot = applyingPendingRemovalsLocked(pendingSnapshot ?? [:]) + diskState = .loaded + if pendingSnapshot != nil || !pendingRemovalMessageIDs.isEmpty { + if persistSnapshotAndClearRemovalsLocked(cachedSnapshot) { + pendingSnapshot = nil + pendingSnapshotIsAuthoritative = false + } else { + pendingSnapshot = cachedSnapshot + pendingSnapshotIsAuthoritative = true + diskState = .deferred + } + } + return cachedSnapshot + + case .deferred(let error): + diskState = .deferred + if !wasDeferred { + SecureLogger.warning("Outbox unavailable; deferring load until protected data is available: \(String(describing: error))", category: .session) + } + return pendingSnapshot ?? [:] + + case .corrupt(let error): + diskState = .loaded + cachedSnapshot = applyingPendingRemovalsLocked(pendingSnapshot ?? [:]) + SecureLogger.error("Failed to decode encrypted outbox: \(error)", category: .session) + if pendingSnapshot != nil || !pendingRemovalMessageIDs.isEmpty { + if persistSnapshotAndClearRemovalsLocked(cachedSnapshot) { + pendingSnapshot = nil + pendingSnapshotIsAuthoritative = false + } else { + pendingSnapshot = cachedSnapshot + pendingSnapshotIsAuthoritative = true + diskState = .deferred + } + } + return cachedSnapshot } - return outbox } - func save(_ outbox: [PeerID: [QueuedMessage]]) { - guard let fileURL else { return } - let flattened = outbox.filter { !$0.value.isEmpty } - guard !flattened.isEmpty else { - try? FileManager.default.removeItem(at: fileURL) - return + func save(_ outbox: Snapshot) { + var recovered: RecoveredSnapshot? + + lock.lock() + let recoveryWasPending = recoveryDeliveryPending + let unseenClassificationWasPending = unseenRecoveryPendingPersistence + let recoveryStateWasPending = recoveryWasPending || unseenClassificationWasPending + let flattened = applyingPendingRemovalsLocked(outbox.filter { !$0.value.isEmpty }) + if recoveryStateWasPending { + // `save` is the router's complete current view. Keep it separate + // from the durable union retained for disk retry. + recoveryRouterSnapshot = flattened } - guard let key = encryptionKey(createIfMissing: true) else { - SecureLogger.error("Outbox not persisted: no encryption key available", category: .session) - return - } - do { - let keyed = Dictionary(uniqueKeysWithValues: flattened.map { ($0.key.id, $0.value) }) - let plaintext = try JSONEncoder().encode(keyed) - let sealed = try ChaChaPoly.seal(plaintext, using: key).combined - try FileManager.default.createDirectory( - at: fileURL.deletingLastPathComponent(), - withIntermediateDirectories: true + switch diskState { + case .loaded: + cachedSnapshot = applyingPendingRemovalsLocked( + recoveryStateWasPending + ? Self.merge(unseenRecoveredSnapshot, recoveryRouterSnapshot) + : flattened ) - var options: Data.WritingOptions = [.atomic] - #if os(iOS) - options.insert(.completeFileProtection) - #endif - try sealed.write(to: fileURL, options: options) - } catch { - SecureLogger.error("Failed to persist outbox: \(error)", category: .session) + if !persistSnapshotAndClearRemovalsLocked(cachedSnapshot) { + // Retain the latest complete router snapshot. Because its + // durable baseline was already loaded, it replaces the older + // disk file after protected data returns (preserving removals). + pendingSnapshot = cachedSnapshot + pendingSnapshotIsAuthoritative = true + diskState = .deferred + } + + case .unknown, .deferred: + let wasDeferred = diskState == .deferred + // A non-authoritative deferred snapshot means the initial cold + // load never completed. An authoritative deferred snapshot with + // no recovery state is merely an ordinary post-load write retry. + let isRecoveryAttempt = recoveryStateWasPending || + (wasDeferred && !pendingSnapshotIsAuthoritative) + switch readSnapshotLocked() { + case .loaded(let durable): + // `save` before a successful `load` is not authoritative over + // an unreadable snapshot. Union by message ID so neither the + // durable queue nor work accepted during the locked wake is + // lost. + let newlyUnseen = recoveryStateWasPending + ? unseenRecoveredSnapshot + : (isRecoveryAttempt + ? applyingPendingRemovalsLocked(Self.excludingKnownMessages(from: durable, known: flattened)) + : [:]) + if isRecoveryAttempt && !recoveryStateWasPending { + unseenRecoveredSnapshot = newlyUnseen + recoveryRouterSnapshot = flattened + unseenRecoveryPendingPersistence = true + } + let preservesUnseenRecovery = recoveryStateWasPending || unseenRecoveryPendingPersistence + let merged = preservesUnseenRecovery + ? Self.merge(unseenRecoveredSnapshot, recoveryRouterSnapshot) + : (pendingSnapshotIsAuthoritative ? flattened : Self.merge(durable, flattened)) + cachedSnapshot = applyingPendingRemovalsLocked(merged) + diskState = .loaded + if persistSnapshotAndClearRemovalsLocked(cachedSnapshot) { + pendingSnapshot = nil + pendingSnapshotIsAuthoritative = false + if isRecoveryAttempt && !recoveryWasPending { + recovered = RecoveredSnapshot( + snapshot: cachedSnapshot, + generation: lifecycleGeneration, + unseenDurable: newlyUnseen + ) + } + } else { + pendingSnapshot = cachedSnapshot + pendingSnapshotIsAuthoritative = true + diskState = .deferred + } + + case .missing: + if isRecoveryAttempt && !recoveryStateWasPending { + unseenRecoveredSnapshot = [:] + recoveryRouterSnapshot = flattened + unseenRecoveryPendingPersistence = true + } + let preservesUnseenRecovery = recoveryStateWasPending || unseenRecoveryPendingPersistence + let merged = applyingPendingRemovalsLocked( + preservesUnseenRecovery + ? Self.merge(unseenRecoveredSnapshot, recoveryRouterSnapshot) + : flattened + ) + cachedSnapshot = merged + diskState = .loaded + if persistSnapshotAndClearRemovalsLocked(merged) { + pendingSnapshot = nil + pendingSnapshotIsAuthoritative = false + if isRecoveryAttempt && !recoveryWasPending { + recovered = RecoveredSnapshot( + snapshot: merged, + generation: lifecycleGeneration, + unseenDurable: unseenRecoveredSnapshot + ) + } + } else { + pendingSnapshot = merged + pendingSnapshotIsAuthoritative = true + diskState = .deferred + } + + case .deferred: + // `save` receives MessageRouter's complete current in-memory + // snapshot. Replace prior locked-wake state so delivery acks + // and expiry removals become tombstones for that state; only + // the still-unknown durable snapshot is unioned on recovery. + pendingSnapshot = applyingPendingRemovalsLocked( + recoveryStateWasPending + ? Self.merge(unseenRecoveredSnapshot, recoveryRouterSnapshot) + : flattened + ) + diskState = .deferred + + case .corrupt(let error): + SecureLogger.error("Failed to decode encrypted outbox: \(error)", category: .session) + if isRecoveryAttempt && !recoveryStateWasPending { + unseenRecoveredSnapshot = [:] + recoveryRouterSnapshot = flattened + unseenRecoveryPendingPersistence = true + } + let preservesUnseenRecovery = recoveryStateWasPending || unseenRecoveryPendingPersistence + let merged = applyingPendingRemovalsLocked( + preservesUnseenRecovery + ? Self.merge(unseenRecoveredSnapshot, recoveryRouterSnapshot) + : flattened + ) + cachedSnapshot = merged + diskState = .loaded + if persistSnapshotAndClearRemovalsLocked(merged) { + pendingSnapshot = nil + pendingSnapshotIsAuthoritative = false + if isRecoveryAttempt && !recoveryWasPending { + recovered = RecoveredSnapshot( + snapshot: merged, + generation: lifecycleGeneration, + unseenDurable: unseenRecoveredSnapshot + ) + } + } else { + pendingSnapshot = merged + pendingSnapshotIsAuthoritative = true + diskState = .deferred + } + } } + if let recovered { + unseenRecoveryPendingPersistence = false + recoveryDeliveryPending = true + unseenRecoveredSnapshot = recovered.unseenDurable + } + lock.unlock() + + if let recovered { + beforeRecoveryNotification() + notifyRecovered(recovered.snapshot, generation: recovered.generation) + } + } + + /// Installs the router-side merge hook used when a cold, locked launch + /// initially received an empty snapshot and protected data later becomes + /// readable. + func setRecoveryHandler(_ handler: @escaping @MainActor (Snapshot) -> Void) { + lock.lock() + recoveryHandler = handler + let unreported = unreportedRecoveredSnapshot + unreportedRecoveredSnapshot = nil + lock.unlock() + if let unreported { + Task { @MainActor [weak self] in + guard let latest = self?.claimPendingRecovery(generation: unreported.generation) else { return } + handler(latest) + } + } + } + + /// Records an ack even when a locked cold-load has not revealed the + /// matching durable message yet. The next `save`/recovery applies this + /// tombstone before writing or notifying MessageRouter. + func recordRemoval(messageID: String) { + lock.lock() + pendingRemovalMessageIDs.insert(messageID) + cachedSnapshot = Self.removing([messageID], from: cachedSnapshot) + unseenRecoveredSnapshot = Self.removing([messageID], from: unseenRecoveredSnapshot) + recoveryRouterSnapshot = Self.removing([messageID], from: recoveryRouterSnapshot) + if let pendingSnapshot { + self.pendingSnapshot = Self.removing([messageID], from: pendingSnapshot) + } + lock.unlock() + } + + /// Retries a deferred protected-data load. The returned snapshot includes + /// both durable messages and any messages queued during the locked wake. + @discardableResult + func retryDeferredLoad() -> Snapshot? { + var recovered: RecoveredSnapshot? + lock.lock() + guard diskState == .deferred else { + lock.unlock() + return nil + } + let recoveryWasPending = recoveryDeliveryPending + let unseenClassificationWasPending = unseenRecoveryPendingPersistence + let recoveryStateWasPending = recoveryWasPending || unseenClassificationWasPending + // `pendingSnapshotIsAuthoritative` alone means a normal write failed + // after the router had already loaded its baseline. It must retry, but + // must not masquerade as cold-load recovery or schedule a callback. + let isRecoveryAttempt = recoveryStateWasPending || !pendingSnapshotIsAuthoritative + switch readSnapshotLocked() { + case .loaded(let durable): + let known = recoveryStateWasPending ? recoveryRouterSnapshot : (pendingSnapshot ?? [:]) + let newlyUnseen = recoveryStateWasPending + ? unseenRecoveredSnapshot + : (isRecoveryAttempt + ? applyingPendingRemovalsLocked(Self.excludingKnownMessages(from: durable, known: known)) + : [:]) + if isRecoveryAttempt && !recoveryStateWasPending { + unseenRecoveredSnapshot = newlyUnseen + recoveryRouterSnapshot = known + unseenRecoveryPendingPersistence = true + } + let preservesUnseenRecovery = recoveryStateWasPending || unseenRecoveryPendingPersistence + let merged = applyingPendingRemovalsLocked(preservesUnseenRecovery + ? Self.merge(unseenRecoveredSnapshot, recoveryRouterSnapshot) + : (pendingSnapshotIsAuthoritative ? known : Self.merge(durable, known))) + cachedSnapshot = merged + diskState = .loaded + if (pendingSnapshot == nil && pendingRemovalMessageIDs.isEmpty) || + persistSnapshotAndClearRemovalsLocked(merged) { + pendingSnapshot = nil + pendingSnapshotIsAuthoritative = false + if isRecoveryAttempt && !recoveryWasPending { + recovered = RecoveredSnapshot( + snapshot: merged, + generation: lifecycleGeneration, + unseenDurable: newlyUnseen + ) + } + } else { + pendingSnapshot = merged + pendingSnapshotIsAuthoritative = true + diskState = .deferred + } + case .missing: + let known = recoveryStateWasPending ? recoveryRouterSnapshot : (pendingSnapshot ?? [:]) + if isRecoveryAttempt && !recoveryStateWasPending { + unseenRecoveredSnapshot = [:] + recoveryRouterSnapshot = known + unseenRecoveryPendingPersistence = true + } + let preservesUnseenRecovery = recoveryStateWasPending || unseenRecoveryPendingPersistence + let merged = applyingPendingRemovalsLocked(preservesUnseenRecovery + ? Self.merge(unseenRecoveredSnapshot, recoveryRouterSnapshot) + : known) + cachedSnapshot = merged + diskState = .loaded + if (pendingSnapshot == nil && pendingRemovalMessageIDs.isEmpty) || + persistSnapshotAndClearRemovalsLocked(merged) { + pendingSnapshot = nil + pendingSnapshotIsAuthoritative = false + if isRecoveryAttempt && !recoveryWasPending { + recovered = RecoveredSnapshot( + snapshot: merged, + generation: lifecycleGeneration, + unseenDurable: unseenRecoveredSnapshot + ) + } + } else { + pendingSnapshot = merged + pendingSnapshotIsAuthoritative = true + diskState = .deferred + } + case .deferred: + break + case .corrupt(let error): + SecureLogger.error("Failed to decode encrypted outbox after protected-data recovery: \(error)", category: .session) + let known = recoveryStateWasPending ? recoveryRouterSnapshot : (pendingSnapshot ?? [:]) + if isRecoveryAttempt && !recoveryStateWasPending { + unseenRecoveredSnapshot = [:] + recoveryRouterSnapshot = known + unseenRecoveryPendingPersistence = true + } + let preservesUnseenRecovery = recoveryStateWasPending || unseenRecoveryPendingPersistence + let merged = applyingPendingRemovalsLocked(preservesUnseenRecovery + ? Self.merge(unseenRecoveredSnapshot, recoveryRouterSnapshot) + : known) + cachedSnapshot = merged + diskState = .loaded + if (pendingSnapshot == nil && pendingRemovalMessageIDs.isEmpty) || + persistSnapshotAndClearRemovalsLocked(merged) { + pendingSnapshot = nil + pendingSnapshotIsAuthoritative = false + if isRecoveryAttempt && !recoveryWasPending { + recovered = RecoveredSnapshot( + snapshot: merged, + generation: lifecycleGeneration, + unseenDurable: unseenRecoveredSnapshot + ) + } + } else { + pendingSnapshot = merged + pendingSnapshotIsAuthoritative = true + diskState = .deferred + } + } + if let recovered { + unseenRecoveryPendingPersistence = false + recoveryDeliveryPending = true + unseenRecoveredSnapshot = recovered.unseenDurable + } + lock.unlock() + + if let recovered { + beforeRecoveryNotification() + notifyRecovered(recovered.snapshot, generation: recovered.generation) + } + return recovered?.snapshot } /// Panic wipe: drop the queued mail and the key that could ever read it. func wipe() { + lock.lock() + diskState = .loaded + cachedSnapshot = [:] + pendingSnapshot = nil + pendingSnapshotIsAuthoritative = false + pendingRemovalMessageIDs.removeAll() + recoveryDeliveryPending = false + unseenRecoveryPendingPersistence = false + unseenRecoveredSnapshot = [:] + recoveryRouterSnapshot = [:] + unreportedRecoveredSnapshot = nil + lifecycleGeneration &+= 1 if let fileURL { try? FileManager.default.removeItem(at: fileURL) } keychain.delete(key: Self.keychainKey, service: Self.keychainService) + lock.unlock() } // MARK: - Internals private func encryptionKey(createIfMissing: Bool) -> SymmetricKey? { - if let data = keychain.load(key: Self.keychainKey, service: Self.keychainService), data.count == 32 { - return SymmetricKey(data: data) + switch readEncryptionKey() { + case .available(let key): + return key + case .missing: + break + case .invalid: + guard createIfMissing else { return nil } + keychain.delete(key: Self.keychainKey, service: Self.keychainService) + case .unavailable: + return nil } guard createIfMissing else { return nil } + let key = SymmetricKey(size: .bits256) let data = key.withUnsafeBytes { Data($0) } // After-first-unlock so queued mail can flush from background BLE wakes. @@ -139,9 +616,222 @@ final class MessageOutboxStore { service: Self.keychainService, accessible: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly ) + // The protocol's generic save predates result-bearing writes. Verify + // the item before sealing a file: otherwise a locked/full Keychain + // could drop the key while we successfully write unrecoverable mail. + guard case .success(let stored) = keychain.loadWithResult( + key: Self.keychainKey, + service: Self.keychainService + ), stored == data else { + keychain.delete(key: Self.keychainKey, service: Self.keychainService) + SecureLogger.error("Outbox encryption key was not retained by Keychain", category: .session) + return nil + } return key } + private func readEncryptionKey() -> EncryptionKeyReadResult { + switch keychain.loadWithResult(key: Self.keychainKey, service: Self.keychainService) { + case .success(let data): + guard data.count == 32 else { return .invalid } + return .available(SymmetricKey(data: data)) + case .itemNotFound: + return .missing + case .deviceLocked, .authenticationFailed: + return .unavailable(nil) + case .accessDenied: + return .unavailable(NSError(domain: NSOSStatusErrorDomain, code: Int(errSecNotAvailable))) + case .otherError(let status): + return .unavailable(NSError(domain: NSOSStatusErrorDomain, code: Int(status))) + } + } + + /// Must be called with `lock` held. + private func readSnapshotLocked() -> DiskReadResult { + guard let fileURL, + FileManager.default.fileExists(atPath: fileURL.path) else { + return .missing + } + let sealed: Data + do { + sealed = try readData(fileURL) + } catch { + return .deferred(error) + } + // A locked Keychain is transient; a genuine item-not-found next to an + // existing sealed file is permanent (notably after restoring onto a + // new device, because the key is ThisDeviceOnly). Remove that + // unrecoverable ciphertext before allowing a replacement key/file. + let key: SymmetricKey + switch readEncryptionKey() { + case .available(let availableKey): + key = availableKey + case .missing: + return discardOrphanedSnapshotLocked(reason: "encryption key is missing") + case .invalid: + keychain.delete(key: Self.keychainKey, service: Self.keychainService) + return discardOrphanedSnapshotLocked(reason: "encryption key has an invalid length") + case .unavailable(let error): + return .deferred(error) + } + do { + let box = try ChaChaPoly.SealedBox(combined: sealed) + let plaintext = try ChaChaPoly.open(box, using: key) + let decoded = try JSONDecoder().decode([String: [QueuedMessage]].self, from: plaintext) + var outbox: Snapshot = [:] + for (peerID, queue) in decoded where !queue.isEmpty { + outbox[PeerID(str: peerID)] = queue + } + Self.migrateFileProtectionIfNeeded(at: fileURL) + return .loaded(outbox) + } catch { + return .corrupt(error) + } + } + + /// Must be called with `lock` held. A ciphertext whose ThisDeviceOnly key + /// is definitively absent can never become readable; removing it is safer + /// than deferring forever or overwriting it while pretending it loaded. + private func discardOrphanedSnapshotLocked(reason: String) -> DiskReadResult { + guard let fileURL else { return .missing } + do { + try FileManager.default.removeItem(at: fileURL) + SecureLogger.warning("Removed unrecoverable encrypted outbox because its \(reason)", category: .session) + return .missing + } catch { + SecureLogger.error("Could not remove unrecoverable encrypted outbox: \(error)", category: .session) + return .deferred(error) + } + } + + /// Must be called with `lock` held. + @discardableResult + private func persistSnapshotLocked(_ snapshot: Snapshot) -> Bool { + guard let fileURL else { return true } + do { + if snapshot.isEmpty { + if FileManager.default.fileExists(atPath: fileURL.path) { + try FileManager.default.removeItem(at: fileURL) + } + return true + } + guard let key = encryptionKey(createIfMissing: true) else { + SecureLogger.error("Outbox not persisted: no encryption key available", category: .session) + return false + } + let keyed = Dictionary(uniqueKeysWithValues: snapshot.map { ($0.key.id, $0.value) }) + let plaintext = try JSONEncoder().encode(keyed) + let sealed = try ChaChaPoly.seal(plaintext, using: key).combined + try FileManager.default.createDirectory( + at: fileURL.deletingLastPathComponent(), + withIntermediateDirectories: true + ) + var options: Data.WritingOptions = [.atomic] + #if os(iOS) + options.insert(.completeFileProtectionUntilFirstUserAuthentication) + #endif + try writeData(sealed, fileURL, options) + return true + } catch { + SecureLogger.error("Failed to persist outbox: \(error)", category: .session) + return false + } + } + + /// Must be called with `lock` held. + private func persistSnapshotAndClearRemovalsLocked(_ snapshot: Snapshot) -> Bool { + guard persistSnapshotLocked(snapshot) else { return false } + pendingRemovalMessageIDs.removeAll() + return true + } + + /// Must be called with `lock` held. + private func applyingPendingRemovalsLocked(_ snapshot: Snapshot) -> Snapshot { + Self.removing(pendingRemovalMessageIDs, from: snapshot) + } + + private static func removing(_ messageIDs: Set, from snapshot: Snapshot) -> Snapshot { + guard !messageIDs.isEmpty else { return snapshot } + var filtered: Snapshot = [:] + for (peerID, queue) in snapshot { + let remaining = queue.filter { !messageIDs.contains($0.messageID) } + if !remaining.isEmpty { filtered[peerID] = remaining } + } + return filtered + } + + private static func excludingKnownMessages(from durable: Snapshot, known: Snapshot) -> Snapshot { + let knownIDs = Set(known.values.flatMap { $0.map(\.messageID) }) + return removing(knownIDs, from: durable) + } + + private static func merge(_ durable: Snapshot, _ pending: Snapshot) -> Snapshot { + var merged = durable + for (peerID, pendingQueue) in pending { + var queue = merged[peerID] ?? [] + for var candidate in pendingQueue { + if let index = queue.firstIndex(where: { $0.messageID == candidate.messageID }) { + candidate.sendAttempts = max(candidate.sendAttempts, queue[index].sendAttempts) + candidate.depositedCourierKeys.formUnion(queue[index].depositedCourierKeys) + queue[index] = candidate + } else { + queue.append(candidate) + } + } + queue.sort { $0.timestamp < $1.timestamp } + if !queue.isEmpty { merged[peerID] = queue } + } + return merged.filter { !$0.value.isEmpty } + } + + private func notifyRecovered(_ snapshot: Snapshot, generation: UInt64) { + lock.lock() + guard lifecycleGeneration == generation else { + lock.unlock() + return + } + let handler = recoveryHandler + if handler == nil { + unreportedRecoveredSnapshot = RecoveredSnapshot( + snapshot: snapshot, + generation: generation, + unseenDurable: unseenRecoveredSnapshot + ) + } + lock.unlock() + guard let handler else { return } + Task { @MainActor [weak self] in + guard let latest = self?.claimPendingRecovery(generation: generation) else { return } + handler(latest) + } + } + + private func claimPendingRecovery(generation: UInt64) -> Snapshot? { + lock.lock() + defer { lock.unlock() } + guard lifecycleGeneration == generation, recoveryDeliveryPending else { return nil } + let latest = cachedSnapshot + recoveryDeliveryPending = false + unseenRecoveryPendingPersistence = false + unseenRecoveredSnapshot = [:] + recoveryRouterSnapshot = [:] + unreportedRecoveredSnapshot = nil + return latest + } + + private static func migrateFileProtectionIfNeeded(at fileURL: URL) { + #if os(iOS) + do { + try FileManager.default.setAttributes( + [.protectionKey: FileProtectionType.completeUntilFirstUserAuthentication], + ofItemAtPath: fileURL.path + ) + } catch { + SecureLogger.warning("Failed to migrate outbox file protection: \(error)", category: .session) + } + #endif + } + private static func defaultFileURL() -> URL? { guard let base = try? FileManager.default.url( for: .applicationSupportDirectory, diff --git a/bitchat/Services/Gateway/BridgeCourierService.swift b/bitchat/Services/Gateway/BridgeCourierService.swift index 1f8bb1f9..f1f72c31 100644 --- a/bitchat/Services/Gateway/BridgeCourierService.swift +++ b/bitchat/Services/Gateway/BridgeCourierService.swift @@ -65,8 +65,11 @@ final class BridgeCourierService: ObservableObject { var bridgeEnabled: (@MainActor () -> Bool)? var relaysConnected: (@MainActor () -> Bool)? - /// Publishes a signed drop event to the default (DM) relays. - var publishEvent: (@MainActor (NostrEvent) -> Void)? + /// Publishes a signed drop event directly to connected default (DM) + /// relays. Completion is true only after at least one relay explicitly + /// accepts the event via NIP-20 OK; this must never mean "queued in RAM" + /// or merely "written to a socket". + var publishEvent: (@MainActor (NostrEvent, @escaping @MainActor (Bool) -> Void) -> Void)? /// (Re)opens the drop subscription for the given hex tags. var openSubscription: (@MainActor ([String]) -> Void)? var closeSubscription: (@MainActor () -> Void)? @@ -76,14 +79,21 @@ final class BridgeCourierService: ObservableObject { var localVerifiedPeers: (@MainActor () -> [(peerID: PeerID, noiseKey: Data)])? /// Seals content into a carry-only envelope for a recipient key. var sealEnvelope: (@MainActor (String, String, Data) -> CourierEnvelope?)? - /// Opens a drop addressed to us (tag verified inside). - var openEnvelope: (@MainActor (CourierEnvelope) -> Void)? + /// Opens a drop addressed to us. True means the inner envelope was + /// delivered, deduplicated, or intentionally rejected after decryption; + /// false leaves the relay event retryable after a transient crypto/key + /// failure. + var openEnvelope: (@MainActor (CourierEnvelope) -> Bool)? /// Hands a drop to a matching local peer as a directed courier packet. - /// Returns false when the handoff could not even be attempted (peer no - /// longer reachable), so the drop event stays retryable. + /// Returns true only when the transport accepted the packet onto a live + /// physical link or its link-specific backpressure queue. Stale + /// reachability and process-local directed spooling return false so the + /// drop event stays retryable. var deliverToPeer: (@MainActor (CourierEnvelope, PeerID) -> Bool)? /// Held envelopes eligible for (re)publish, honoring the cooldown. var heldEnvelopes: (@MainActor (TimeInterval) -> [CourierEnvelope])? + /// Commits a held envelope's cooldown after confirmed relay acceptance. + var markHeldEnvelopePublished: (@MainActor (CourierEnvelope) -> Void)? /// Timer injection for tests; nil arms a real `Task`. var scheduleTimer: (@MainActor (TimeInterval, @escaping @MainActor () -> Void) -> Void)? @@ -91,7 +101,11 @@ final class BridgeCourierService: ObservableObject { private(set) var myTagsHex: Set = [] private(set) var watchedPeerTags: [(peerID: PeerID, tagsHex: Set)] = [] - private(set) var pendingDrops: [(envelope: CourierEnvelope, dedupKey: String?)] = [] + private(set) var pendingDrops: [( + envelope: CourierEnvelope, + dedupKey: String?, + operationID: UUID? + )] = [] /// Message IDs already published as drops (sender-side dedup) and drop /// event IDs already handled (multi-relay dedup). Both persist across /// relaunches: relays hold drops for the full 24h NIP-40 window and the @@ -104,7 +118,27 @@ final class BridgeCourierService: ObservableObject { private var subscriptionOpen = false private var lastSubscribedTags: Set = [] private var refreshTimerArmed = false + private var announceRefreshTimerArmed = false private var lastAnnounceRefresh = Date.distantPast + private struct ActiveDropOperation { + let id: UUID + let completion: @MainActor (Bool) -> Void + } + /// Sender operations queued locally or awaiting relay confirmation. + /// The per-attempt ID prevents a stale pre-wipe callback from completing + /// a newer attempt for the same message. + private var activeDropOperations: [String: ActiveDropOperation] = [:] + /// Held-envelope publishes have no sender message ID, but still need an + /// in-flight identity: repeated refreshes inside the NIP-20 wait window + /// must not mint duplicate relay events for the same opaque envelope. + private var heldDropOperations: [Data: UUID] = [:] + /// Deterministically invalid envelopes are suppressed for this process, + /// but never persisted as if a relay accepted them. Bound and age them so + /// rotating oversize IDs cannot grow process memory forever. + private var rejectedDropKeys = ExpiringIDSet( + capacity: Limits.maxTrackedIDs, + lifetime: CourierEnvelope.maxLifetimeSeconds + ) private let now: () -> Date private let dedupStore: BridgeDropDedupStore @@ -156,23 +190,23 @@ final class BridgeCourierService: ObservableObject { } } - /// Writes the dedup record now. Sender keys still sitting in the - /// in-memory `pendingDrops` queue are excluded: their drop is not durable - /// until it actually reaches a relay, and persisting the key early would - /// turn "app killed before relays connected" into a silent 24h blackhole - /// (the relaunch loses the queued drop but the persisted key blocks every - /// re-deposit). `flushPendingDrops` re-persists once they publish. + /// Writes the dedup record now. `publishedDropKeys` contains only drops + /// a relay explicitly accepted; queued and in-flight keys + /// live in `activeDropOperations` and are intentionally process-local. func flushDedupSnapshot() { - let pendingKeys = Set(pendingDrops.compactMap(\.dedupKey)) dedupStore.save(BridgeDropDedupStore.Snapshot( - publishedDropKeys: publishedDropKeys.entries.filter { !pendingKeys.contains($0.key) }, + publishedDropKeys: publishedDropKeys.entries, seenDropEventIDs: seenDropEventIDs.entries )) } /// Panic wipe: forget queued drops and the persisted dedup record. func wipe() { - pendingDrops.removeAll() + cancelActivePublishes() + rejectedDropKeys = ExpiringIDSet( + capacity: Limits.maxTrackedIDs, + lifetime: CourierEnvelope.maxLifetimeSeconds + ) publishedDropKeys = ExpiringIDSet(capacity: Limits.maxTrackedIDs, lifetime: CourierEnvelope.maxLifetimeSeconds) seenDropEventIDs = ExpiringIDSet(capacity: Limits.maxTrackedIDs, lifetime: CourierEnvelope.maxLifetimeSeconds) dedupStore.wipe() @@ -182,32 +216,41 @@ final class BridgeCourierService: ObservableObject { /// Parallel-deposit a sealed copy of an outbound private message as a /// relay drop. Called by the message router alongside physical courier - /// deposits; idempotent per message ID. Returns true when a fresh drop - /// was sealed (published now or queued for the next relay connection) — - /// the router marks the message "carried" so the sender sees progress. - @discardableResult - func depositDrop(content: String, messageID: String, recipientNoiseKey: Data) -> Bool { - guard bridgeEnabled?() ?? false else { return false } - guard !publishedDropKeys.contains(messageID, now: now()) else { return false } - guard let envelope = sealEnvelope?(content, messageID, recipientNoiseKey) else { return false } + /// deposits; idempotent per message ID. Completion becomes true only + /// after a real relay acceptance arrives, which is when the router may + /// show "carried". + func depositDrop( + content: String, + messageID: String, + recipientNoiseKey: Data, + completion: @escaping @MainActor (Bool) -> Void = { _ in } + ) { + guard bridgeEnabled?() ?? false else { + completion(false) + return + } + guard !publishedDropKeys.contains(messageID, now: now()), + activeDropOperations[messageID] == nil, + !rejectedDropKeys.contains(messageID, now: now()) else { + completion(false) + return + } + guard let envelope = sealEnvelope?(content, messageID, recipientNoiseKey) else { + completion(false) + return + } // An envelope that can't encode within the drop size caps fails the // same way on every attempt (size is a function of the content, not - // of the sealing); consume the dedup slot so the retry sweep stops - // re-running Noise sealing on a drop that can never ship. + // of the sealing); suppress it in-memory so the retry sweep does not + // churn, but never persist it as a published drop. guard let encoded = envelope.encode(), encoded.count <= Limits.maxDropEnvelopeBytes else { - publishedDropKeys.insert(messageID, now: now()) - persistDedup() - return false + rejectedDropKeys.insert(messageID, now: now()) + completion(false) + return } - // Only consume the sender-side dedup slot once the drop is durably - // accepted (published, or safely queued for the next relay - // connection). If the compose fails, leave the slot open so the - // router's retry sweep can attempt a fresh deposit rather than - // marking the message "carried" and blocking retries forever. - guard publishDrop(envelope, messageID: messageID) else { return false } - publishedDropKeys.insert(messageID, now: now()) - persistDedup() - return true + let operationID = UUID() + activeDropOperations[messageID] = ActiveDropOperation(id: operationID, completion: completion) + publishDrop(envelope, messageID: messageID, operationID: operationID) } /// Publishes held envelopes (mail we carry for others) as drops, @@ -215,32 +258,59 @@ final class BridgeCourierService: ObservableObject { func publishHeldEnvelopes() { guard bridgeEnabled?() ?? false, relaysConnected?() ?? false else { return } for envelope in heldEnvelopes?(Limits.heldEnvelopePublishCooldown) ?? [] { - publishDrop(envelope) + let key = envelope.ciphertext + guard heldDropOperations[key] == nil else { continue } + let operationID = UUID() + heldDropOperations[key] = operationID + publishDrop(envelope) { [weak self] succeeded in + guard let self, self.heldDropOperations[key] == operationID else { return } + self.heldDropOperations.removeValue(forKey: key) + if succeeded { + self.markHeldEnvelopePublished?(envelope) + } + } } } /// Publishes a drop, or queues it when relays are down. `messageID` is the /// sender-side dedup key (nil for held/relayed envelopes we don't track); - /// it rides the pending queue so an evicted drop can release its slot. - /// Returns false only when the drop could not be made durable (bad - /// encode/expired/compose failure) so callers can keep it retryable. - @discardableResult - private func publishDrop(_ envelope: CourierEnvelope, messageID: String? = nil) -> Bool { + /// it rides the pending queue so an evicted or failed drop can release its + /// in-flight slot. Completion reports actual NIP-20 relay acceptance. + private func publishDrop( + _ envelope: CourierEnvelope, + messageID: String? = nil, + operationID: UUID? = nil, + untrackedCompletion: (@MainActor (Bool) -> Void)? = nil + ) { guard let encoded = envelope.encode(), encoded.count <= Limits.maxDropEnvelopeBytes, - !envelope.isExpired else { return false } + !envelope.isExpired else { + finishPublish( + messageID: messageID, + operationID: operationID, + succeeded: false, + untrackedCompletion: untrackedCompletion + ) + return + } guard relaysConnected?() ?? false else { - pendingDrops.append((envelope, messageID)) + // Held mail remains in CourierStore and has no sender operation to + // recover after an in-memory queue loss. Leave its cooldown unset + // and let the next connected refresh offer it again. + guard messageID != nil else { + untrackedCompletion?(false) + return + } + pendingDrops.append((envelope, messageID, operationID)) while pendingDrops.count > Limits.maxPendingDrops { let evicted = pendingDrops.removeFirst() - // The oldest queued drop is being dropped before it ever - // published; release its dedup slot so it stays retryable. - if let key = evicted.dedupKey { - publishedDropKeys.remove(key) - persistDedup() - } + finishPublish( + messageID: evicted.dedupKey, + operationID: evicted.operationID, + succeeded: false + ) } - return true + return } guard let identity = try? NostrIdentity.generate(), let event = try? NostrProtocol.createCourierDropEvent( @@ -250,10 +320,62 @@ final class BridgeCourierService: ObservableObject { senderIdentity: identity ) else { SecureLogger.error("📦🌉 Failed to compose courier drop", category: .encryption) - return false + finishPublish( + messageID: messageID, + operationID: operationID, + succeeded: false, + untrackedCompletion: untrackedCompletion + ) + return } - publishEvent?(event) - SecureLogger.debug("📦🌉 Published courier drop for tag \(envelope.recipientTag.hexEncodedString().prefix(8))…", category: .session) + guard let publishEvent else { + SecureLogger.error("📦🌉 Courier drop publisher is not configured", category: .session) + finishPublish( + messageID: messageID, + operationID: operationID, + succeeded: false, + untrackedCompletion: untrackedCompletion + ) + return + } + publishEvent(event) { [weak self] succeeded in + guard let self else { return } + guard self.finishPublish( + messageID: messageID, + operationID: operationID, + succeeded: succeeded, + untrackedCompletion: untrackedCompletion + ) else { return } + if succeeded { + SecureLogger.debug("📦🌉 Published courier drop for tag \(envelope.recipientTag.hexEncodedString().prefix(8))…", category: .session) + } else { + SecureLogger.warning("📦🌉 No relay accepted courier drop", category: .session) + } + } + } + + @discardableResult + private func finishPublish( + messageID: String?, + operationID: UUID?, + succeeded: Bool, + untrackedCompletion: (@MainActor (Bool) -> Void)? = nil + ) -> Bool { + guard let messageID else { + untrackedCompletion?(succeeded) + return true + } + // Missing/mismatched means this callback was duplicated, invalidated + // by panic wipe, or belongs to an older attempt for the same key. + guard let operationID, + let operation = activeDropOperations[messageID], + operation.id == operationID else { return false } + activeDropOperations.removeValue(forKey: messageID) + if succeeded { + publishedDropKeys.insert(messageID, now: now()) + persistDedup() + } + operation.completion(succeeded) return true } @@ -262,16 +384,13 @@ final class BridgeCourierService: ObservableObject { guard bridgeEnabled?() ?? false, relaysConnected?() ?? false, !pendingDrops.isEmpty else { return } let queued = pendingDrops pendingDrops.removeAll() - for item in queued where !publishDrop(item.envelope, messageID: item.dedupKey) { - // Compose failed with relays up: release the slot so the router's - // retry sweep can attempt a fresh deposit. - if let key = item.dedupKey { - publishedDropKeys.remove(key) - } + for item in queued { + publishDrop( + item.envelope, + messageID: item.dedupKey, + operationID: item.operationID + ) } - // Flushed keys just became durable (published, so no longer excluded - // as pending) or were released above; either way the record changed. - persistDedup() } // MARK: - Subscription (recipient + gateway watch) @@ -281,7 +400,15 @@ final class BridgeCourierService: ObservableObject { /// (tags rotate daily); idempotent. func refresh() { armRefreshTimerIfNeeded() - guard bridgeEnabled?() ?? false, relaysConnected?() ?? false else { + guard bridgeEnabled?() ?? false else { + cancelActivePublishes() + if subscriptionOpen { + closeSubscription?() + subscriptionOpen = false + } + return + } + guard relaysConnected?() ?? false else { if subscriptionOpen { closeSubscription?() subscriptionOpen = false @@ -323,11 +450,37 @@ final class BridgeCourierService: ObservableObject { /// Announce-driven refresh, debounced — a newly verified peer should be /// watched promptly, but announce storms must not thrash subscriptions. + /// Calls inside the window coalesce into one trailing refresh so peers + /// learned after the leading edge are not omitted until the 30-minute + /// periodic timer. func refreshAfterVerifiedAnnounce() { guard bridgeEnabled?() ?? false else { return } - guard now().timeIntervalSince(lastAnnounceRefresh) >= Limits.announceRefreshDebounceSeconds else { return } - lastAnnounceRefresh = now() - refresh() + let date = now() + let elapsed = date.timeIntervalSince(lastAnnounceRefresh) + if elapsed >= Limits.announceRefreshDebounceSeconds { + lastAnnounceRefresh = date + refresh() + return + } + + guard !announceRefreshTimerArmed else { return } + announceRefreshTimerArmed = true + let delay = max(0, Limits.announceRefreshDebounceSeconds - elapsed) + let fire: @MainActor () -> Void = { [weak self] in + guard let self else { return } + self.announceRefreshTimerArmed = false + guard self.bridgeEnabled?() ?? false else { return } + self.lastAnnounceRefresh = self.now() + self.refresh() + } + if let scheduleTimer { + scheduleTimer(delay, fire) + } else { + Task { @MainActor in + try? await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000)) + fire() + } + } } private func armRefreshTimerIfNeeded() { @@ -355,8 +508,10 @@ final class BridgeCourierService: ObservableObject { func handleDropEvent(_ event: NostrEvent) { guard bridgeEnabled?() ?? false else { return } guard event.kind == NostrProtocol.EventKind.courierDrop.rawValue else { return } - guard seenDropEventIDs.insert(event.id, now: now()) else { return } - persistDedup() + // A resubscribe can still deliver an event from the old watch set. + // Do not durably consume it until it actually belongs to us/current + // local peer and is opened or accepted for physical delivery. + guard !seenDropEventIDs.contains(event.id, now: now()) else { return } guard let data = Data(base64Encoded: event.content), data.count <= Limits.maxDropEnvelopeBytes, let envelope = CourierEnvelope.decode(data), @@ -371,17 +526,16 @@ final class BridgeCourierService: ObservableObject { if myTagsHex.contains(tagHex) { SecureLogger.info("📦🌉 Courier drop for us arrived via bridge", category: .session) - openEnvelope?(envelope) + if openEnvelope?(envelope) == true { + seenDropEventIDs.insert(event.id, now: now()) + persistDedup() + } return } if let match = watchedPeerTags.first(where: { $0.tagsHex.contains(tagHex) }) { SecureLogger.info("📦🌉 Courier drop fetched for local peer \(match.peerID.id.prefix(8))…", category: .session) - if deliverToPeer?(envelope, match.peerID) != true { - // The best-effort handoff never left this device (the peer - // walked away between the relay fetch and the mesh send). - // Release the seen slot so a relaunch or backlog redelivery - // retries — a single-gateway island has no other carrier. - seenDropEventIDs.remove(event.id) + if deliverToPeer?(envelope, match.peerID) == true { + seenDropEventIDs.insert(event.id, now: now()) persistDedup() } } @@ -389,6 +543,19 @@ final class BridgeCourierService: ObservableObject { // MARK: - Helpers + /// Cancels queued and in-flight sender operations after bridge disable or + /// panic wipe. Invalidate first, then resolve false so callback re-entry + /// cannot be mistaken for an active operation; late relay callbacks no-op. + private func cancelActivePublishes() { + let invalidated = activeDropOperations.values.map(\.completion) + pendingDrops.removeAll() + activeDropOperations.removeAll() + // Untracked held publishes are invalidated too. Their late relay + // callbacks compare operation IDs and no-op after this reset. + heldDropOperations.removeAll() + invalidated.forEach { $0(false) } + } + /// A fresh random Nostr identity for signing one drop. Delegates to the /// canonical generator (Schnorr key that can't fail validity) instead of /// hand-rolling SecRandom + retry. diff --git a/bitchat/Services/Gateway/BridgeService.swift b/bitchat/Services/Gateway/BridgeService.swift index 7f5d64c6..2138a397 100644 --- a/bitchat/Services/Gateway/BridgeService.swift +++ b/bitchat/Services/Gateway/BridgeService.swift @@ -47,11 +47,15 @@ import Foundation /// already holds the radio copy (`isMessageSeenLocally` on the event's /// mesh message ID) — remote islands' traffic is the only thing worth /// airtime. -/// Receivers additionally dedup by timeline message ID: the wire carries no -/// public message ID, so every device derives the same content-stable one -/// (`MeshMessageIdentity`) from the origin coordinates in the event's `m` -/// tag — recomputed locally, never trusted — and the store's insert-by-ID -/// absorbs radio/bridge duplicates in either arrival order. +/// Receivers key bridge rows by the signed Nostr event ID. The event's `m` tag +/// is only a radio-copy hint: its mesh sender/timestamp fields are public and +/// cannot authenticate the event signer, so letting them own the timeline ID +/// would allow a different signer to front-run the genuine event's dedup slot. +/// When the radio copy is already present the hint avoids duplicate rendering +/// and downlink airtime. If the bridge copy wins the race, a later +/// authenticated radio copy replaces every bridge row that claimed the same +/// hint; the untrusted hint can therefore merge a duplicate but can never +/// suppress the radio-authenticated origin. /// /// All dependencies are closure-injected (repo convention) so the policy /// layer is unit-testable without relays, radios, or CoreLocation. @@ -71,11 +75,25 @@ final class BridgeService: ObservableObject { static let maxEventAgeSeconds: TimeInterval = 15 * 60 /// Bounded loop-prevention ID caches (oldest evicted). static let maxTrackedEventIDs = 512 + /// Keep radio-replacement aliases for every bridge row that can still + /// be visible in the bounded mesh timeline. Retiring an alias earlier + /// would let valid high-volume ingress delete otherwise visible + /// history merely to preserve the radio-wins invariant. + static let maxTrackedRadioAliases = TransportConfig.meshTimelineCap /// Presence heartbeat cadence while the bridge is active. static let presenceIntervalSeconds: TimeInterval = 4 * 60 /// A rendezvous participant counts toward "via bridge" for this long /// after their last event. static let participantFreshnessSeconds: TimeInterval = 10 * 60 + /// Relay ingress is adversarial: bound both accepted work and the + /// people-sheet state even when an attacker rotates signing keys. + static let inboundEventsPerMinute = 600 + static let inboundEventsPerMinutePerSigner = 120 + /// Cheap pre-crypto gate for both valid and invalid ingress. Without + /// it, invalid carrier events could force unbounded Schnorr work while + /// never reaching the accepted-event limiter below. + static let signatureVerificationAttemptsPerMinute = 720 + static let maxParticipants = 128 /// Content cap, matching the public-message pipeline's own limit. static let maxContentBytes = 16_000 /// Geohash-cell precision of the rendezvous (neighborhood, ~1.2 km). @@ -91,7 +109,11 @@ final class BridgeService: ObservableObject { /// A validated rendezvous message ready for the timeline. struct InboundBridgeMessage { let messageID: String + /// Unauthenticated mesh coordinates can only be used to notice that a + /// verified radio copy is already present; they never own bridge dedup. + let radioMessageIDHint: String? let senderNickname: String + let participantNickname: String? let senderPubkey: String let content: String let timestamp: Date @@ -116,10 +138,9 @@ final class BridgeService: ObservableObject { /// The user toggle. While true this device publishes its own public mesh /// messages to the rendezvous and subscribes to it when online. @Published private(set) var isEnabled: Bool - /// Distinct remote rendezvous participants seen within the freshness - /// window. Approximate by design: local participants are subtracted by - /// matching their events' mesh message IDs against the local timeline, - /// which cannot attribute silent (presence-only) local peers. + /// Distinct rendezvous participants seen within the freshness window. + /// Radio-copy hints never alter signer locality: their public coordinates + /// can suppress a duplicate row but cannot authenticate a Nostr signer. @Published private(set) var bridgedPeerCount: Int = 0 /// The people behind the count, newest activity first. @Published private(set) var bridgedParticipants: [BridgedParticipant] = [] @@ -159,6 +180,13 @@ final class BridgeService: ObservableObject { var broadcastToMesh: (@MainActor (Data) -> Void)? /// Delivers a validated inbound bridge message to the mesh timeline. var injectInbound: (@MainActor (InboundBridgeMessage) -> Void)? + /// Removes a previously injected bridge row when an authenticated radio + /// copy arrives later. The UI hook also discards a not-yet-flushed row. + var removeInjectedInbound: (@MainActor (String) -> Void)? + /// Exact liveness check for a bridge row in either the pending UI pipeline + /// or bounded conversation store. Alias pruning may discard proof only + /// after the corresponding row is already gone. + var isInjectedInboundPresent: (@MainActor (String) -> Bool)? /// True when the mesh timeline already holds this message ID (the radio /// copy) — used to skip pointless downlink airtime. var isMessageSeenLocally: (@MainActor (String) -> Bool)? @@ -185,32 +213,56 @@ final class BridgeService: ObservableObject { private var rebroadcastEventIDs: BoundedIDSet /// Timeline message IDs already injected (either arrival path). private var injectedMessageIDs: BoundedIDSet + /// Signed relay/carrier events already accepted. Kept separate from the + /// loop caches so a mesh arrival can still mark loop suppression even when + /// the relay copy won the race. + private var receivedEventIDs: BoundedIDSet + /// Authenticated radio IDs observed this session. These close the + /// bridge-first race even before the UI pipeline flushes its radio row. + private var observedRadioMessageIDs: BoundedIDSet + /// event ID -> untrusted radio hint. Event IDs own bridge + /// dedup; this bounded reverse index is used only to replace bridge rows + /// after the genuine radio packet has authenticated successfully. + private var injectedRadioAliases: [String: String] = [:] + private var injectedRadioAliasOrder: [String] = [] /// Cells the rendezvous subscription covers (own + neighbor ring). private(set) var subscribedCells: Set = [] private(set) var queuedUplinks: [QueuedUplink] = [] private var uplinkDepositTimes: [PeerID: [Date]] = [:] private var downlinkSendTimes: [Date] = [] + private var inboundEventTimes: [Date] = [] + private var inboundEventTimesBySigner: [String: [Date]] = [:] + private var signatureVerificationTokens = Double(Limits.signatureVerificationAttemptsPerMinute) + private var signatureVerificationLastRefillAt: Date? private var pendingDownlinks: [(event: NostrEvent, cell: String)] = [] private var downlinkDrainScheduled = false private var presenceTimerArmed = false private var lastPresenceAt = Date.distantPast - /// pubkey -> (lastSeen, attributed-to-local-island, last known nickname). - private var participants: [String: (lastSeen: Date, isLocal: Bool, nickname: String?)] = [:] + /// pubkey -> (lastSeen, last known nickname). + private var participants: [String: (lastSeen: Date, nickname: String?)] = [:] private let defaults: UserDefaults private let now: () -> Date + private let verifyEventSignature: (NostrEvent) -> Bool private static let enabledKey = "bridge.userEnabled" - init(defaults: UserDefaults = .standard, now: @escaping () -> Date = Date.init) { + init( + defaults: UserDefaults = .standard, + now: @escaping () -> Date = Date.init, + verifyEventSignature: @escaping (NostrEvent) -> Bool = { $0.isValidSignature() } + ) { self.defaults = defaults self.now = now + self.verifyEventSignature = verifyEventSignature self.isEnabled = defaults.bool(forKey: Self.enabledKey) self.meshBroadcastEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) self.publishedEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) self.rebroadcastEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) self.injectedMessageIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + self.receivedEventIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) + self.observedRadioMessageIDs = BoundedIDSet(capacity: Limits.maxTrackedEventIDs) } // MARK: - Toggle & lifecycle @@ -223,6 +275,8 @@ final class BridgeService: ObservableObject { queuedUplinks.removeAll() pendingDownlinks.removeAll() uplinkDepositTimes.removeAll() + inboundEventTimes.removeAll() + inboundEventTimesBySigner.removeAll() participants.removeAll() bridgedPeerCount = 0 bridgedParticipants = [] @@ -301,11 +355,6 @@ final class BridgeService: ObservableObject { guard isEnabled, !nearbyOnly, let cell = activeCell ?? currentCell() else { return } guard content.utf8.count <= Limits.maxContentBytes else { return } let timestampMs = MeshMessageIdentity.millisecondTimestamp(timestamp) - let stableID = MeshMessageIdentity.stableID( - senderIDHex: senderPeerID.id, - timestampMs: timestampMs, - content: content - ) guard let identity = try? deriveIdentity?(cell), let event = try? NostrProtocol.createBridgeMeshEvent( content: content, @@ -319,7 +368,7 @@ final class BridgeService: ObservableObject { return } publishedEventIDs.insert(event.id) - injectedMessageIDs.insert(stableID) // our own timeline already has it + injectedMessageIDs.insert(event.id) // our own timeline already has it if relaysConnected?() ?? false { publishToRelays?(event, cell) } else if let carrier = NostrCarrierPacket(direction: .toBridge, geohash: cell, event: event), @@ -388,7 +437,6 @@ final class BridgeService: ObservableObject { subscribedCells.contains(cell) else { return } - guard let kind = classify(event, cell: cell) else { return } // Events we published come back from our own subscription; they are // presence-neutral (we never count ourselves) and never re-injected // or rebroadcast. Two layers: the published-ID cache (this session) @@ -401,18 +449,23 @@ final class BridgeService: ObservableObject { publishedEventIDs.insert(event.id) // never downlink it either return } - guard event.isValidSignature() else { return } + guard allowSignatureVerificationAttempt(), verifyEventSignature(event) else { return } + guard receivedEventIDs.insert(event.id), allowInboundEvent(from: event.pubkey) else { return } + guard let kind = classify(event, cell: cell) else { return } switch kind { case .presence: - recordParticipant(event.pubkey, isLocal: false, nickname: nil) + recordParticipant(event.pubkey, nickname: nil) case .message(let message): - let isLocalRadioCopy = isMessageSeenLocally?(message.messageID) ?? false + let isLocalRadioCopy = message.radioMessageIDHint.map(radioCopyAlreadyPresent) ?? false if isLocalRadioCopy { - SecureLogger.debug("🌉 Bridge: radio copy of \(message.messageID.prefix(8))… already present; sender counted as local", category: .session) + // The public m-tag proves only that identical radio content is + // already present, not that this Nostr signer authored it. + // Skip the duplicate row without changing signer locality. + SecureLogger.debug("🌉 Bridge: authenticated radio copy already present; bridge alias skipped", category: .session) + } else if inject(message) { + recordParticipant(event.pubkey, nickname: message.participantNickname) } - recordParticipant(event.pubkey, isLocal: isLocalRadioCopy, nickname: message.senderNickname) - inject(message) // Serving duty: carry remote islands' messages onto the radio for // mesh-only peers. Local-origin events are skipped — the island // already heard them (loop rule 3). The drain is jitter-delayed: @@ -431,6 +484,33 @@ final class BridgeService: ObservableObject { } } + /// Called only after the BLE public-message signature has authenticated. + /// A bridge hint is not trusted enough to drop this radio row. Instead, + /// the radio row wins and any earlier bridge aliases are removed, which + /// gives both arrival orders one timeline row without restoring the + /// origin-spoof vulnerability. + func handleAuthenticatedRadioMessage(messageID: String) { + guard !messageID.isEmpty else { return } + observedRadioMessageIDs.insert(messageID) + + let matching = injectedRadioAliases.filter { $0.value == messageID } + guard !matching.isEmpty else { return } + let eventIDs = Set(matching.keys) + for eventID in matching.keys { + removeInjectedInbound?(eventID) + injectedRadioAliases.removeValue(forKey: eventID) + } + injectedRadioAliasOrder.removeAll { eventIDs.contains($0) } + + // A relay event can already be waiting inside the multi-gateway jitter + // window. Remove it now so it cannot consume BLE airtime after the + // authenticated radio packet proved this island already has a copy. + pendingDownlinks.removeAll { item in + guard case .message(let message)? = classify(item.event, cell: item.cell) else { return false } + return message.radioMessageIDHint == messageID + } + } + // MARK: - Mesh carrier ingress (both roles) /// Entry point for received `nostrCarrier` packets with bridge @@ -467,7 +547,7 @@ final class BridgeService: ObservableObject { SecureLogger.debug("🌉 Bridge: rate-limited deposit from \(depositor.id.prefix(8))…", category: .session) return } - guard event.isValidSignature() else { + guard allowSignatureVerificationAttempt(), verifyEventSignature(event) else { SecureLogger.debug("🌉 Bridge: rejected deposit from \(depositor.id.prefix(8))… (bad signature)", category: .security) return } @@ -523,6 +603,52 @@ final class BridgeService: ObservableObject { return true } + /// Bounds relay/carrier work independently of the downlink airtime budget. + /// A valid signature proves control of one key, not that the sender is + /// entitled to unbounded main-actor state or CPU. + private func allowInboundEvent(from signer: String) -> Bool { + let date = now() + let cutoff = date.addingTimeInterval(-60) + inboundEventTimes.removeAll { $0 < cutoff } + guard inboundEventTimes.count < Limits.inboundEventsPerMinute else { return false } + + var signerTimes = inboundEventTimesBySigner[signer, default: []] + signerTimes.removeAll { $0 < cutoff } + guard signerTimes.count < Limits.inboundEventsPerMinutePerSigner else { + inboundEventTimesBySigner[signer] = signerTimes + return false + } + + inboundEventTimes.append(date) + signerTimes.append(date) + inboundEventTimesBySigner[signer] = signerTimes + if inboundEventTimesBySigner.count > Limits.maxTrackedEventIDs { + inboundEventTimesBySigner = inboundEventTimesBySigner.filter { entry in + entry.value.contains { $0 >= cutoff } + } + } + return true + } + + /// Bounds expensive signature checks before signer identity is trusted. + /// Kept independent from accepted-event accounting so invalid events do + /// not create signer state or poison any dedup cache. + private func allowSignatureVerificationAttempt() -> Bool { + let date = now() + if let lastRefillAt = signatureVerificationLastRefillAt { + let elapsed = max(0, date.timeIntervalSince(lastRefillAt)) + let refillPerSecond = Double(Limits.signatureVerificationAttemptsPerMinute) / 60 + signatureVerificationTokens = min( + Double(Limits.signatureVerificationAttemptsPerMinute), + signatureVerificationTokens + elapsed * refillPerSecond + ) + } + signatureVerificationLastRefillAt = date + guard signatureVerificationTokens >= 1 else { return false } + signatureVerificationTokens -= 1 + return true + } + // MARK: - Downlink (gateway role: internet -> mesh) private func drainPendingDownlinks() { @@ -533,9 +659,15 @@ final class BridgeService: ObservableObject { let (event, cell) = pendingDownlinks.removeFirst() guard isFresh(event) else { continue } // Suppression recheck at send time: another gateway may have - // broadcast this event during our jitter holdoff. + // broadcast this event, or the authenticated radio copy may have + // arrived, during our jitter holdoff. guard !meshBroadcastEventIDs.contains(event.id), !rebroadcastEventIDs.contains(event.id) else { continue } + if case .message(let message)? = classify(event, cell: cell), + let radioMessageID = message.radioMessageIDHint, + radioCopyAlreadyPresent(radioMessageID) { + continue + } guard let carrier = NostrCarrierPacket(direction: .fromBridge, geohash: cell, event: event), let payload = carrier.encode() else { continue } broadcastToMesh?(payload) @@ -584,36 +716,90 @@ final class BridgeService: ObservableObject { guard let event = structurallyValidEvent(from: carrier), !publishedEventIDs.contains(event.id), !isOwnRendezvousEvent(event, cell: carrier.geohash), - event.isValidSignature() else { + allowSignatureVerificationAttempt(), + verifyEventSignature(event) else { return } // Mark after verification (a forged copy must not poison the cache), - // and use the marking as multi-path dedup. - guard meshBroadcastEventIDs.insert(event.id) else { return } + // even when the relay copy won the injection race: pending gateway + // downlinks consult this cache and must stand down. + let firstMeshArrival = meshBroadcastEventIDs.insert(event.id) + guard firstMeshArrival, + receivedEventIDs.insert(event.id), + allowInboundEvent(from: event.pubkey) else { return } guard case .message(let message)? = classify(event, cell: carrier.geohash) else { return } - recordParticipant(event.pubkey, isLocal: false, nickname: message.senderNickname) - inject(message) + if inject(message) { + recordParticipant(event.pubkey, nickname: message.participantNickname) + } } // MARK: - Injection & participants - private func inject(_ message: InboundBridgeMessage) { - guard injectedMessageIDs.insert(message.messageID) else { return } - guard !(isMessageSeenLocally?(message.messageID) ?? false) else { return } + @discardableResult + private func inject(_ message: InboundBridgeMessage) -> Bool { + guard injectedMessageIDs.insert(message.messageID) else { return false } + guard !(message.radioMessageIDHint.map(radioCopyAlreadyPresent) ?? false) else { + return false + } SecureLogger.info("🌉 Bridge: injected bridged message \(message.messageID.prefix(8))… from \(message.senderNickname)", category: .session) injectInbound?(message) + if let radioMessageID = message.radioMessageIDHint { + recordRadioAlias( + eventID: message.messageID, + radioMessageID: radioMessageID + ) + } + return true } - private func recordParticipant(_ pubkey: String, isLocal: Bool, nickname: String?) { + private func radioCopyAlreadyPresent(_ messageID: String) -> Bool { + observedRadioMessageIDs.contains(messageID) || (isMessageSeenLocally?(messageID) ?? false) + } + + private func recordRadioAlias( + eventID: String, + radioMessageID: String + ) { + guard injectedRadioAliases[eventID] == nil else { return } + injectedRadioAliases[eventID] = radioMessageID + injectedRadioAliasOrder.append(eventID) + guard injectedRadioAliasOrder.count > Limits.maxTrackedRadioAliases, + let isInjectedInboundPresent else { return } + + // Arrival order and signed event timestamps are independent. The + // conversation cap trims by timestamp, so blindly evicting the oldest + // alias could discard the proof for a still-visible row and then + // actively delete that history. Prune only aliases whose exact row is + // already absent; temporary overflow is safer than losing radio-wins + // reconciliation for any visible bridge message. + var overflow = injectedRadioAliasOrder.count - Limits.maxTrackedRadioAliases + var retained: [String] = [] + retained.reserveCapacity(injectedRadioAliasOrder.count) + for candidate in injectedRadioAliasOrder { + if overflow > 0, !isInjectedInboundPresent(candidate) { + injectedRadioAliases.removeValue(forKey: candidate) + overflow -= 1 + } else { + retained.append(candidate) + } + } + injectedRadioAliasOrder = retained + } + + private func recordParticipant(_ pubkey: String, nickname: String?) { + let cutoff = now().addingTimeInterval(-Limits.participantFreshnessSeconds) + participants = participants.filter { $0.value.lastSeen >= cutoff } + if participants[pubkey] == nil, participants.count >= Limits.maxParticipants, + let oldest = participants.min(by: { $0.value.lastSeen < $1.value.lastSeen })?.key { + participants.removeValue(forKey: oldest) + } let previous = participants[pubkey] - // Local attribution is sticky: one radio-confirmed message marks the - // pubkey as an islander for as long as they stay fresh. Presence - // events carry no nickname, so a known name is never forgotten. + // Presence events carry no nickname, so a known name is never + // forgotten. Radio hints deliberately do not mutate this record. participants[pubkey] = ( lastSeen: now(), - isLocal: (previous?.isLocal ?? false) || isLocal, nickname: nickname?.trimmedOrNilIfEmpty ?? previous?.nickname ) recomputeBridgedCount() @@ -628,7 +814,7 @@ final class BridgeService: ObservableObject { private func recomputeBridgedCount() { let cutoff = now().addingTimeInterval(-Limits.participantFreshnessSeconds) let visible = participants - .filter { $0.value.lastSeen >= cutoff && !$0.value.isLocal } + .filter { $0.value.lastSeen >= cutoff } .map { BridgedParticipant(pubkey: $0.key, nickname: $0.value.nickname, lastSeen: $0.value.lastSeen) } .sorted { $0.lastSeen > $1.lastSeen } if visible.count != bridgedPeerCount { @@ -660,28 +846,30 @@ final class BridgeService: ObservableObject { let content = event.content guard !content.trimmed.isEmpty, content.utf8.count <= Limits.maxContentBytes else { return nil } let nickname = event.tags.first(where: { $0.count >= 2 && $0[0] == "n" })?[1] - // Recompute — never trust — the mesh message ID: the `m` tag is - // `[stable ID, sender ID, wire timestamp ms]`. Element 1 exists - // for v1.7.0 parsers; we ignore it and derive the ID from the - // origin coordinates (elements 2-3) plus the event's own content, - // so a forged tag cannot bind a chosen ID to different content - // (see `MeshMessageIdentity` for the exact property and its - // limits). + // The `m` tag is `[stable ID, sender ID, wire timestamp ms]` for + // radio/bridge duplicate detection. Those coordinates are public + // and not cryptographically bound to this Nostr signer, so they + // are never allowed to own bridge dedup. A copied tag can at most + // make the attacker's own event look like a radio duplicate; it + // cannot reserve the genuine signed event's timeline ID. let m = event.tags.first(where: { $0.count >= 2 && $0[0] == "m" }) - let messageID: String + let radioMessageIDHint: String? if let m, m.count >= 4, m[2].count == 16, m[2].allSatisfy(\.isHexDigit), let timestampMs = UInt64(m[3]) { - messageID = MeshMessageIdentity.stableID( + radioMessageIDHint = MeshMessageIdentity.stableID( senderIDHex: m[2], timestampMs: timestampMs, content: content ) } else { - messageID = event.id // old-format or absent tag + radioMessageIDHint = nil } + let baseNickname = nickname?.trimmedOrNilIfEmpty ?? "anon" return .message(InboundBridgeMessage( - messageID: messageID, - senderNickname: nickname?.trimmedOrNilIfEmpty ?? "anon#\(event.pubkey.suffix(4))", + messageID: event.id, + radioMessageIDHint: radioMessageIDHint, + senderNickname: baseNickname + "#" + String(event.pubkey.suffix(4)), + participantNickname: nickname?.trimmedOrNilIfEmpty, senderPubkey: event.pubkey, content: content, timestamp: Date(timeIntervalSince1970: TimeInterval(event.created_at)) diff --git a/bitchat/Services/KeychainManager.swift b/bitchat/Services/KeychainManager.swift index cbd61f18..98f5fa9e 100644 --- a/bitchat/Services/KeychainManager.swift +++ b/bitchat/Services/KeychainManager.swift @@ -542,6 +542,15 @@ final class KeychainManager: KeychainManagerProtocol { /// Load data from a custom service func load(key: String, service customService: String) -> Data? { + guard case .success(let data) = loadWithResult(key: key, service: customService) else { + return nil + } + return data + } + + /// Load custom-service data without collapsing `itemNotFound` and + /// protected-data/keychain failures into the same nil result. + func loadWithResult(key: String, service customService: String) -> KeychainReadResult { let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: customService, @@ -551,9 +560,7 @@ final class KeychainManager: KeychainManagerProtocol { var result: AnyObject? let status = SecItemCopyMatching(query as CFDictionary, &result) - - guard status == errSecSuccess else { return nil } - return result as? Data + return classifyReadStatus(status, data: result as? Data) } /// Delete data from a custom service diff --git a/bitchat/Services/LocationStateManager.swift b/bitchat/Services/LocationStateManager.swift index 36fb4bc4..5f6ac61a 100644 --- a/bitchat/Services/LocationStateManager.swift +++ b/bitchat/Services/LocationStateManager.swift @@ -367,16 +367,16 @@ final class LocationStateManager: NSObject, CLLocationManagerDelegate, Observabl } func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { - updatePermissionState(from: status) - if case .authorized = permissionState { + let newState = updatePermissionState(from: status) + if newState == .authorized { requestOneShotLocation() } } @available(iOS 14.0, macOS 11.0, *) func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { - updatePermissionState(from: manager.authorizationStatus) - if case .authorized = permissionState { + let newState = updatePermissionState(from: manager.authorizationStatus) + if newState == .authorized { requestOneShotLocation() } } @@ -393,7 +393,8 @@ final class LocationStateManager: NSObject, CLLocationManagerDelegate, Observabl // MARK: - Private Helpers (Permission) - private func updatePermissionState(from status: CLAuthorizationStatus) { + @discardableResult + private func updatePermissionState(from status: CLAuthorizationStatus) -> PermissionState { let newState: PermissionState switch status { case .notDetermined: newState = .notDetermined @@ -402,7 +403,15 @@ final class LocationStateManager: NSObject, CLLocationManagerDelegate, Observabl case .authorizedAlways, .authorizedWhenInUse, .authorized: newState = .authorized @unknown default: newState = .restricted } + // Do not rely on a mounted SwiftUI consumer to stop high-accuracy + // updates. Authorization can change while the app is backgrounded, + // and stopping here also closes the gap before the published state is + // delivered on the main actor. + if newState != .authorized { + endLiveRefresh() + } Task { @MainActor in self.permissionState = newState } + return newState } // MARK: - Private Helpers (Channel Computation) diff --git a/bitchat/Services/MessageDeduplicationService.swift b/bitchat/Services/MessageDeduplicationService.swift index 3d20e227..66d7e57b 100644 --- a/bitchat/Services/MessageDeduplicationService.swift +++ b/bitchat/Services/MessageDeduplicationService.swift @@ -246,6 +246,16 @@ final class MessageDeduplicationService { ContentNormalizer.normalizedKey(content) } + /// Removes the near-duplicate marker for a row that is being replaced, + /// not merely deleted. Bridge-first/radio-second reconciliation needs the + /// authenticated radio copy to pass the next pipeline flush after its + /// unauthenticated bridge alias is removed. + func forgetContent(_ content: String, ifRecordedAt timestamp: Date) { + let key = ContentNormalizer.normalizedKey(content) + guard contentCache.value(for: key) == timestamp else { return } + contentCache.remove(key) + } + // MARK: - Nostr Event Deduplication /// Checks if a Nostr event has already been processed. diff --git a/bitchat/Services/MessageRouter.swift b/bitchat/Services/MessageRouter.swift index ff2656df..fbc6d694 100644 --- a/bitchat/Services/MessageRouter.swift +++ b/bitchat/Services/MessageRouter.swift @@ -56,11 +56,15 @@ final class MessageRouter { /// relays as a courier drop, so delivery stops requiring a physical /// courier encounter. No-op unless the bridge is enabled. Runs alongside /// (not instead of) mesh couriers; receivers dedup by message ID. - /// Returns true when a fresh drop was sealed, so the sender's message - /// can show the "carried" state instead of sitting on "sending" forever - /// (the delivery ack has no radio route back until the peers next share - /// a transport). - var bridgeCourierDeposit: ((_ content: String, _ messageID: String, _ recipientNoiseKey: Data) -> Bool)? + /// Completion is true only after at least one default relay explicitly + /// accepts the event, so a socket write followed by rejection cannot + /// falsely show the sender's message as "carried". + var bridgeCourierDeposit: (( + _ content: String, + _ messageID: String, + _ recipientNoiseKey: Data, + _ completion: @escaping @MainActor (Bool) -> Void + ) -> Void)? /// Re-attempts bridge drops for retained messages whose recipient no /// transport can promptly reach anymore. Covers sends that raced the BLE @@ -77,9 +81,7 @@ final class MessageRouter { } guard !promptlyDeliverable else { continue } for message in queue where now().timeIntervalSince(message.timestamp) <= Self.messageTTLSeconds { - if bridgeCourierDeposit?(message.content, message.messageID, recipientKey) == true { - onMessageCarried?(message.messageID, peerID) - } + requestBridgeCourierDeposit(message, for: peerID, recipientKey: recipientKey) } } } @@ -102,6 +104,7 @@ final class MessageRouter { } private var bridgeSweepTask: Task? + private var bridgeDepositsInFlight = Set() private var outbox: [PeerID: [QueuedMessage]] = [:] @@ -127,6 +130,9 @@ final class MessageRouter { self.outboxStore = outboxStore self.metrics = metrics self.outbox = outboxStore?.load() ?? [:] + outboxStore?.setRecoveryHandler { [weak self] recovered in + self?.mergeRecoveredOutbox(recovered) + } // Observe favorites changes to learn Nostr mapping and flush queued messages NotificationCenter.default.addObserver( @@ -237,9 +243,7 @@ final class MessageRouter { let entry = queuedMessage(messageID, for: peerID) else { return } // The bridge drop needs no connected courier — only the recipient // key — so it runs before the courier-slot bookkeeping. - if bridgeCourierDeposit?(entry.content, messageID, recipientKey) == true { - onMessageCarried?(messageID, peerID) - } + requestBridgeCourierDeposit(entry, for: peerID, recipientKey: recipientKey) let remainingSlots = Self.maxCouriersPerMessage - entry.depositedCourierKeys.count guard remainingSlots > 0 else { return } @@ -324,6 +328,23 @@ final class MessageRouter { outbox[peerID]?.first { $0.messageID == messageID } } + private func requestBridgeCourierDeposit( + _ message: QueuedMessage, + for peerID: PeerID, + recipientKey: Data + ) { + guard let bridgeCourierDeposit, + bridgeDepositsInFlight.insert(message.messageID).inserted else { return } + bridgeCourierDeposit(message.content, message.messageID, recipientKey) { [weak self] succeeded in + guard let self else { return } + self.bridgeDepositsInFlight.remove(message.messageID) + // A direct delivery may have cleared the outbox while the relay + // relay confirmation was in flight; do not regress its UI state. + guard succeeded, self.queuedMessage(message.messageID, for: peerID) != nil else { return } + self.onMessageCarried?(message.messageID, peerID) + } + } + private func recordCourierDeposit(messageID: String, for peerID: PeerID, courierKeys: [Data]) { metrics?.record(.courierDeposited) guard var queue = outbox[peerID], @@ -344,10 +365,14 @@ final class MessageRouter { outbox[peerID] = filtered.isEmpty ? nil : filtered cleared = true } + // The durable snapshot may still be hidden by protected data. Record + // the ack even when this cold-load view cannot find the message, then + // persist the current view so the store retains a removal tombstone. + outboxStore?.recordRemoval(messageID: messageID) if cleared { metrics?.record(.outboxDelivered) - persistOutbox() } + persistOutbox() } private func enqueue(_ message: QueuedMessage, for peerID: PeerID) { @@ -382,6 +407,38 @@ final class MessageRouter { outboxStore?.save(outbox) } + /// A cold BLE restoration can launch before protected files are readable. + /// The store initially returns an empty snapshot in that case, then calls + /// back after first unlock. Merge by message ID instead of replacing work + /// accepted during the locked wake, persist the union, and immediately + /// resume normal delivery attempts. + private func mergeRecoveredOutbox(_ recovered: MessageOutboxStore.Snapshot) { + for (peerID, recoveredQueue) in recovered { + var queue = outbox[peerID] ?? [] + for var recoveredMessage in recoveredQueue { + if let index = queue.firstIndex(where: { $0.messageID == recoveredMessage.messageID }) { + recoveredMessage.sendAttempts = max(recoveredMessage.sendAttempts, queue[index].sendAttempts) + recoveredMessage.depositedCourierKeys.formUnion(queue[index].depositedCourierKeys) + queue[index] = recoveredMessage + } else { + queue.append(recoveredMessage) + } + } + queue.sort { $0.timestamp < $1.timestamp } + if queue.count > Self.maxMessagesPerPeer { + let overflow = queue.count - Self.maxMessagesPerPeer + for dropped in queue.prefix(overflow) { + dropMessage(dropped.messageID, for: peerID) + } + queue.removeFirst(overflow) + } + outbox[peerID] = queue + } + persistOutbox() + flushAllOutbox() + retryBridgeCourierDeposits() + } + /// Panic wipe: forget queued mail on disk and in memory. func wipeOutbox() { outbox.removeAll() diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index 8a80afee..f8e4f8c3 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -215,6 +215,9 @@ enum TransportConfig { // Fallback deadline for treating a subscription's initial fetch as complete // when a relay never sends EOSE (generous to cover Tor circuit setup). static let nostrSubscriptionEOSEFallbackSeconds: TimeInterval = 10.0 + // A bridge drop is durable only after NIP-20 OK. Relays that omit OK must + // not pin the router's in-flight state indefinitely. + static let nostrConfirmedSendAckTimeoutSeconds: TimeInterval = 10.0 // After this long, a relay marked permanently failed gets another chance. static let nostrRelayFailureCooldownSeconds: TimeInterval = 600.0 diff --git a/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift b/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift index 8f4baded..6c4c483c 100644 --- a/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift +++ b/bitchat/ViewModels/ChatLiveVoiceCoordinator.swift @@ -141,6 +141,12 @@ final class ChatLiveVoiceCoordinator { private var fileManager: FileManager { fileStore.fileManager } private var assemblies: [AssemblyKey: Assembly] = [:] private var finishedBursts: [AssemblyKey: FinishedBurst] = [:] + /// Players still draining after their assembly — the sole strong owner — + /// was discarded on burst END. Without this hold the player deallocates + /// mid-tail (or mid session-acquire, killing the whole burst's audio) + /// and its registered session token would only be reclaimed by the + /// deinit backstop. Entries remove themselves via `onStopped`. + private var drainingPlayers: [ObjectIdentifier: PTTBurstPlayer] = [:] /// `sweepsOnInit` exists for tests whose coordinator shares the real /// application-support directory: they pass `false` so parallel test @@ -465,7 +471,18 @@ final class ChatLiveVoiceCoordinator { return } - assembly.player?.finishAfterDrain() + if let player = assembly.player, !player.stopped { + // Park the draining player: this method just dropped the + // assembly, and nothing else holds the player strongly. It may + // still be playing out its tail — or still acquiring the audio + // session off-main — so it must stay alive until it stops. + let id = ObjectIdentifier(player) + drainingPlayers[id] = player + player.onStopped = { [weak self] in + self?.drainingPlayers.removeValue(forKey: id) + } + player.finishAfterDrain() + } // The bubble's waveform may have been computed from a partial file. WaveformCache.shared.purge(url: assembly.fileURL) // The capture is the bubble's replayable audio from here on (unless a diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 49bed683..24caaa86 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -698,12 +698,30 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele conversations.conversationsByID[conversationID]?.containsMessage(withID: messageID) ?? false } + @MainActor + func bridgeInjectedPublicMessageIsPresent(withID messageID: String) -> Bool { + publicMessagePipeline.containsMessage(withID: messageID) || + publicConversationContainsMessage(withID: messageID, in: .mesh) + } + /// Removes a message by ID from whichever public conversation contains /// it. Returns the removed message, if any. @MainActor @discardableResult func removePublicMessage(withID messageID: String) -> BitchatMessage? { - conversations.removePublicMessage(withID: messageID) + publicMessagePipeline.removeMessage(withID: messageID) + return conversations.removePublicMessage(withID: messageID) + } + + /// Replaces an unauthenticated bridge alias with a later authenticated + /// radio row. In addition to both storage layers, clear the content-window + /// marker written by an already-flushed alias or it would suppress the + /// genuine row during the next public-message batch. + @MainActor + func removeBridgeInjectedPublicMessage(withID messageID: String) { + publicMessagePipeline.removeMessage(withID: messageID) + guard let removed = conversations.removePublicMessage(withID: messageID) else { return } + deduplicationService.forgetContent(removed.content, ifRecordedAt: removed.timestamp) } /// Removes every message matching `predicate` from a geohash @@ -1755,6 +1773,14 @@ final class ChatViewModel: ObservableObject, BitchatDelegate, TransportEventDele /// Handle incoming public message @MainActor func handlePublicMessage(_ message: BitchatMessage) { + // Bridge hints are unauthenticated and may never suppress a genuine + // BLE sender. Once the radio packet has passed BLE signature checks, + // replace any earlier bridge alias before this row is enqueued. + if !message.isBridged, + let senderPeerID = message.senderPeerID, + !senderPeerID.isGeoChat { + BridgeService.shared.handleAuthenticatedRadioMessage(messageID: message.id) + } // A finalized voice note whose burst already streamed in live swaps // into the existing bubble instead of appearing twice. if liveVoiceCoordinator.absorbFinalizedVoiceNote(message) { return } diff --git a/bitchat/ViewModels/ChatViewModelBootstrapper.swift b/bitchat/ViewModels/ChatViewModelBootstrapper.swift index 40794ddc..1f67f3d5 100644 --- a/bitchat/ViewModels/ChatViewModelBootstrapper.swift +++ b/bitchat/ViewModels/ChatViewModelBootstrapper.swift @@ -464,6 +464,12 @@ private extension ChatViewModelBootstrapper { isBridged: true )) } + bridge.removeInjectedInbound = { [weak viewModel] messageID in + viewModel?.removeBridgeInjectedPublicMessage(withID: messageID) + } + bridge.isInjectedInboundPresent = { [weak viewModel] messageID in + viewModel?.bridgeInjectedPublicMessageIsPresent(withID: messageID) ?? false + } bridge.isMessageSeenLocally = { [weak viewModel] messageID in viewModel?.publicConversationContainsMessage(withID: messageID, in: .mesh) ?? false } @@ -532,11 +538,17 @@ private extension ChatViewModelBootstrapper { let courier = BridgeCourierService.shared courier.bridgeEnabled = { BridgeService.shared.isEnabled } - courier.relaysConnected = { NostrRelayManager.shared.isConnected } - courier.publishEvent = { event in + // A geo/custom relay does not make a global courier drop durable. + // Require an actually connected default (DM) relay so `sendEvent` + // writes to at least one intended relay instead of only entering its + // process-local pending queue. + courier.relaysConnected = { NostrRelayManager.shared.isDMRelayConnected } + courier.publishEvent = { event, completion in // Default (DM) relays: drops need the standing global relay set, // not geo relays — sender and recipient share no cell. - NostrRelayManager.shared.sendEvent(event) + // This confirmed path never falls back to the volatile relay + // queue; bridge dedup is committed only after NIP-20 OK. + NostrRelayManager.shared.sendEventImmediately(event, completion: completion) } courier.openSubscription = { tagsHex in NostrRelayManager.shared.unsubscribe(id: Self.courierDropSubscriptionID) @@ -564,7 +576,7 @@ private extension ChatViewModelBootstrapper { bleService?.sealBridgeCourierEnvelope(content, messageID: messageID, recipientNoiseKey: recipientKey) } courier.openEnvelope = { [weak bleService] envelope in - bleService?.openBridgedCourierEnvelope(envelope) + bleService?.openBridgedCourierEnvelope(envelope) ?? false } courier.deliverToPeer = { [weak bleService] envelope, peerID in bleService?.deliverBridgedEnvelope(envelope, to: peerID) ?? false @@ -572,12 +584,20 @@ private extension ChatViewModelBootstrapper { courier.heldEnvelopes = { cooldown in CourierStore.shared.envelopesForBridgePublish(cooldown: cooldown) } - - viewModel.messageRouter.bridgeCourierDeposit = { content, messageID, recipientKey in - BridgeCourierService.shared.depositDrop(content: content, messageID: messageID, recipientNoiseKey: recipientKey) + courier.markHeldEnvelopePublished = { envelope in + CourierStore.shared.markBridgePublished(envelope) } - // (depositDrop's Bool flows back so a dropped message shows the - // "carried" state — a drop's delivery ack can't return over radio.) + + viewModel.messageRouter.bridgeCourierDeposit = { content, messageID, recipientKey, completion in + BridgeCourierService.shared.depositDrop( + content: content, + messageID: messageID, + recipientNoiseKey: recipientKey, + completion: completion + ) + } + // The completion flows back only after a default relay accepts the + // event, so a rejected or unacknowledged write never becomes carried. viewModel.messageRouter.startBridgeDepositSweep() bleService.onVerifiedPeerAnnounce = { _ in Task { @MainActor in @@ -588,7 +608,7 @@ private extension ChatViewModelBootstrapper { // Relay connectivity gates everything; refresh (re)opens or closes. // Deduped: refresh() resubscribes, and the raw publisher re-emits on // every relay state recompute (6x in 300ms in field logs). - NostrRelayManager.shared.$isConnected + NostrRelayManager.shared.$isDMRelayConnected .removeDuplicates() .receive(on: DispatchQueue.main) .sink { _ in BridgeCourierService.shared.refresh() } diff --git a/bitchat/ViewModels/GeoChannelCoordinator.swift b/bitchat/ViewModels/GeoChannelCoordinator.swift index 68536d01..64a8db5d 100644 --- a/bitchat/ViewModels/GeoChannelCoordinator.swift +++ b/bitchat/ViewModels/GeoChannelCoordinator.swift @@ -39,25 +39,38 @@ final class GeoChannelCoordinator { private var cancellables = Set() private var regionalChannels: [GeohashChannel] = [] private var bookmarkedGeohashes: [String] = [] + private var permissionState: LocationChannelManager.PermissionState + private var locationNotesEnabled: Bool /// Mirrors `NearbyNotesCounter.revealed` (injectable for tests): the /// session's one explicit notes act. Until it happens, background /// sampling must not include the building-precision cell — see /// `sampledRegionalGeohashes`. private var notesRevealed = false private let notesRevealedPublisher: AnyPublisher + private let locationNotesSettingsPublisher: AnyPublisher init( locationManager: LocationChannelManager? = nil, bookmarksStore: GeohashBookmarksStore? = nil, torManager: TorManager? = nil, notesRevealed: AnyPublisher? = nil, + locationNotesEnabled: Bool? = nil, + locationNotesSettings: AnyPublisher? = nil, context: any GeoChannelContext ) { - self.locationManager = locationManager ?? Self.defaultLocationManager() + let resolvedLocationManager = locationManager ?? Self.defaultLocationManager() + self.locationManager = resolvedLocationManager self.bookmarksStore = bookmarksStore ?? GeohashBookmarksStore.shared self.torManager = torManager ?? Self.defaultTorManager() + self.permissionState = resolvedLocationManager.permissionState + self.locationNotesEnabled = locationNotesEnabled ?? LocationNotesSettings.enabled self.notesRevealedPublisher = notesRevealed ?? NearbyNotesCounter.shared.$revealed.eraseToAnyPublisher() + self.locationNotesSettingsPublisher = locationNotesSettings + ?? NotificationCenter.default + .publisher(for: LocationNotesSettings.didChangeNotification) + .map { _ in LocationNotesSettings.enabled } + .eraseToAnyPublisher() self.context = context start() @@ -97,6 +110,18 @@ final class GeoChannelCoordinator { } .store(in: &cancellables) + // The location-notes preference is a live privacy kill switch. It + // removes the device-derived building cell even if the session was + // previously revealed. Explicit bookmarks remain eligible below. + locationNotesSettingsPublisher + .receive(on: DispatchQueue.main) + .sink { [weak self] enabled in + guard let self, self.locationNotesEnabled != enabled else { return } + self.locationNotesEnabled = enabled + self.updateSampling() + } + .store(in: &cancellables) + bookmarksStore.$bookmarks .receive(on: DispatchQueue.main) .sink { [weak self] bookmarks in @@ -109,10 +134,15 @@ final class GeoChannelCoordinator { locationManager.$permissionState .receive(on: DispatchQueue.main) .sink { [weak self] state in - guard let self, state == .authorized else { return } - Task { @MainActor [weak self] in - self?.locationManager.refreshChannels() + guard let self else { return } + self.permissionState = state + if state == .authorized { + self.locationManager.refreshChannels() } + // Cached channels outlive authorization by design. Recompute + // regardless of direction so revocation tears down regional + // sampling instead of continuing from stale coordinates. + self.updateSampling() } .store(in: &cancellables) @@ -130,23 +160,22 @@ final class GeoChannelCoordinator { /// the nearby-conversation hint and channel participant counts working. /// Bookmarks are exempt: bookmarking a geohash is itself explicit. private var sampledRegionalGeohashes: [String] { - regionalChannels - .filter { notesRevealed || $0.level != .building } + guard permissionState == .authorized else { return [] } + return regionalChannels + .filter { (notesRevealed && locationNotesEnabled) || $0.level != .building } .map { $0.geohash } } private func updateSampling() { let union = Array(Set(sampledRegionalGeohashes).union(bookmarkedGeohashes)) - Task { @MainActor in - guard !union.isEmpty else { - context?.endGeohashSampling() - return - } - if torManager.isForeground() { - context?.beginGeohashSampling(for: union) - } else { - context?.endGeohashSampling() - } + guard !union.isEmpty else { + context?.endGeohashSampling() + return + } + if torManager.isForeground() { + context?.beginGeohashSampling(for: union) + } else { + context?.endGeohashSampling() } } diff --git a/bitchat/ViewModels/PublicMessagePipeline.swift b/bitchat/ViewModels/PublicMessagePipeline.swift index 289e1d75..9d30f83e 100644 --- a/bitchat/ViewModels/PublicMessagePipeline.swift +++ b/bitchat/ViewModels/PublicMessagePipeline.swift @@ -60,6 +60,21 @@ final class PublicMessagePipeline { scheduleFlush() } + /// Discards an uncommitted row by ID. Bridge-first/radio-second dedup uses + /// this before inserting the authenticated radio copy, so the ~80 ms UI + /// batch cannot resurrect the replaced bridge alias after store removal. + func removeMessage(withID messageID: String) { + buffer.removeAll { $0.message.id == messageID } + if buffer.isEmpty { + timer?.invalidate() + timer = nil + } + } + + func containsMessage(withID messageID: String) -> Bool { + buffer.contains { $0.message.id == messageID } + } + func flushIfNeeded() { flushBuffer() } diff --git a/bitchat/ViewModels/VoiceRecordingViewModel.swift b/bitchat/ViewModels/VoiceRecordingViewModel.swift index 97d54ad2..4e3d4c6e 100644 --- a/bitchat/ViewModels/VoiceRecordingViewModel.swift +++ b/bitchat/ViewModels/VoiceRecordingViewModel.swift @@ -63,6 +63,10 @@ final class VoiceRecordingViewModel: ObservableObject { /// live push-to-talk session when the current DM peer can hear it now. var sessionProvider: () -> VoiceCaptureSession = { VoiceNoteCaptureSession() } private var activeSession: VoiceCaptureSession? + /// Monotonic press identity. A slow permission/start/finalize task from an + /// older hold may still deliver its file, but it must never mutate the UI + /// state of a newer hold. + private var holdGeneration: UInt64 = 0 func formattedDuration(for date: Date) -> String { let clamped = max(0, state.duration(for: date)) @@ -75,13 +79,18 @@ final class VoiceRecordingViewModel: ObservableObject { func start(shouldShow: Bool) { guard shouldShow, state == .idle else { return } + holdGeneration &+= 1 + let generation = holdGeneration let session = sessionProvider() SecureLogger.info("PTT: mic hold began (backend: \(session.isLive ? "live" : "classic"))", category: .session) activeSession = session state = .requestingPermission Task { let granted = await session.requestPermission() - guard state == .requestingPermission, activeSession === session else { return } + guard generation == holdGeneration, + state == .requestingPermission, + activeSession === session + else { return } guard granted else { state = .permissionDenied activeSession = nil @@ -90,16 +99,36 @@ final class VoiceRecordingViewModel: ObservableObject { state = .preparing do { try await session.start() - guard state == .preparing, activeSession === session else { + guard generation == holdGeneration, + state == .preparing, + activeSession === session + else { await session.cancel() return } state = .recording(startDate: Date()) isLiveStreaming = session.isLive + } catch VoiceRecorder.RecorderError.recordingInProgress { + // The previous classic hold may still be in its intentional + // finalize-padding window. This press owns no recorder, so + // its owner-scoped cancel is harmless; return to idle instead + // of surfacing a false capture failure while the prior note + // finishes and delivers normally. + SecureLogger.info("Voice recording start deferred while the previous hold finalizes", category: .session) + await session.cancel() + guard generation == holdGeneration, + state == .preparing, + activeSession === session + else { return } + activeSession = nil + state = .idle } catch { SecureLogger.error("Voice recording failed to start: \(error)", category: .session) await session.cancel() - guard state == .preparing, activeSession === session else { return } + guard generation == holdGeneration, + state == .preparing, + activeSession === session + else { return } // The live engine and the classic recorder are separate // capture stacks: when the live one hits an audio-route // glitch, fall back within the same hold so the user still @@ -109,7 +138,10 @@ final class VoiceRecordingViewModel: ObservableObject { activeSession = fallback do { try await fallback.start() - guard state == .preparing, activeSession === fallback else { + guard generation == holdGeneration, + state == .preparing, + activeSession === fallback + else { await fallback.cancel() return } @@ -120,7 +152,7 @@ final class VoiceRecordingViewModel: ObservableObject { } catch { SecureLogger.error("Voice recording fallback failed to start: \(error)", category: .session) await fallback.cancel() - guard state == .preparing else { return } + guard generation == holdGeneration, state == .preparing else { return } } } activeSession = nil @@ -142,6 +174,7 @@ final class VoiceRecordingViewModel: ObservableObject { state = .idle isLiveStreaming = false let session = activeSession + let generation = holdGeneration activeSession = nil guard case .recording(let startDate) = previousState, let completion, let session else { @@ -159,7 +192,7 @@ final class VoiceRecordingViewModel: ObservableObject { isValidRecording(at: url, duration: finalDuration) { completion(url) } else { - guard state == .idle else { return } + guard generation == holdGeneration, state == .idle else { return } state = .error( message: finalDuration < VoiceRecorder.minRecordingDuration ? "Recording is too short." diff --git a/bitchat/Views/NoticesView.swift b/bitchat/Views/NoticesView.swift index 8b3e7d90..51edd184 100644 --- a/bitchat/Views/NoticesView.swift +++ b/bitchat/Views/NoticesView.swift @@ -34,6 +34,9 @@ struct NoticesView: View { /// Days until the notice fades; `permanentExpiry` (geo default) means no /// NIP-40 tag — the note stays until its relay drops it. @State private var expiryDays: Int + /// Mirrors the app-info kill switch so its notification produces an + /// immediate presentation update as well as tearing down subscriptions. + @State private var locationNotesEnabled = LocationNotesSettings.enabled /// Sentinel picker tag for the ∞ option (geo tab only). private static let permanentExpiry = 0 @@ -45,6 +48,10 @@ struct NoticesView: View { /// Acquired from `LocationNotesPool` (shared with the nearby-notes /// counter, one REQ per geohash) and released on dismissal. @State private var liveGeoManager: LocationNotesManager? + /// Tracks only this sheet's high-accuracy refresh ownership, so repeated + /// Combine/SwiftUI invalidations do not restart CoreLocation and a + /// revocation or kill-switch transition balances the begin call once. + @State private var ownsLiveGeoRefresh = false init( senderNickname: String, @@ -73,24 +80,127 @@ struct NoticesView: View { tab == .geo && geoGeohash != nil } - /// Acquires (or retargets/revives) the pooled notes manager for the - /// current geo scope. - private func ensureGeoNotesManager() { - guard tab == .geo else { return } - guard notesManager == nil, let geohash = geoGeohash else { return } - if let manager = liveGeoManager { + struct GeoSessionState { + let manager: LocationNotesManager? + let ownsLiveRefresh: Bool + } + + enum GeoPresentationState: Equatable { + case disabled + case locationUnavailable + case available(String) + } + + static func geoPresentationState(notesEnabled: Bool, geohash: String?) -> GeoPresentationState { + guard notesEnabled else { return .disabled } + guard let geohash else { return .locationUnavailable } + return .available(geohash) + } + + static func composerGeohash(tab: Tab, notesEnabled: Bool, geoGeohash: String?) -> String? { + switch tab { + case .geo: + guard case .available(let geohash) = geoPresentationState( + notesEnabled: notesEnabled, + geohash: geoGeohash + ) else { + return nil + } + return geohash + case .mesh: + return "" + } + } + + /// Reconciles both privacy-sensitive resources owned by the sheet: the + /// high-accuracy CoreLocation refresh and the precise notes REQ. Kept as + /// a callback-driven function so permission and kill-switch transitions + /// can be regression tested without presenting SwiftUI. + @MainActor + static func reconcileGeoSession( + tab: Tab, + needsDeviceLocation: Bool, + permissionState: LocationChannelManager.PermissionState, + notesEnabled: Bool, + geohash: String?, + manager: LocationNotesManager?, + ownsLiveRefresh: Bool, + beginLiveRefresh: () -> Void, + endLiveRefresh: () -> Void, + acquire: (String) -> LocationNotesManager, + release: (LocationNotesManager?) -> Void + ) -> GeoSessionState { + let geoTabActive = tab == .geo && notesEnabled + let wantsLiveRefresh = geoTabActive && needsDeviceLocation && permissionState == .authorized + + if wantsLiveRefresh != ownsLiveRefresh { + if wantsLiveRefresh { + beginLiveRefresh() + } else { + endLiveRefresh() + } + } + + // A selected location channel is an explicit remote/teleported scope + // and remains usable without device permission. Only device-derived + // scope requires current authorization. + let mayUseNotes = geoTabActive && + (!needsDeviceLocation || permissionState == .authorized) + guard mayUseNotes, let geohash else { + if manager != nil { + release(manager) + } + return GeoSessionState(manager: nil, ownsLiveRefresh: wantsLiveRefresh) + } + + if let manager { if manager.geohash != geohash.lowercased() { - // Pooled managers are shared; never retarget one in place — - // release the old cell and acquire the new one. - LocationNotesPool.shared.release(manager) - liveGeoManager = LocationNotesPool.shared.acquire(geohash) - } else if manager.state == .idle { - // Revived after a cancel elsewhere; returning re-subscribes. + // Pooled managers are shared; never retarget one in place. + release(manager) + return GeoSessionState( + manager: acquire(geohash), + ownsLiveRefresh: wantsLiveRefresh + ) + } + if manager.state == .idle { manager.refresh() } - } else { - liveGeoManager = LocationNotesPool.shared.acquire(geohash) + return GeoSessionState(manager: manager, ownsLiveRefresh: wantsLiveRefresh) } + + return GeoSessionState( + manager: acquire(geohash), + ownsLiveRefresh: wantsLiveRefresh + ) + } + + private func reconcileGeoSession(notesEnabled: Bool? = nil) { + let notesEnabled = notesEnabled ?? locationNotesEnabled + let next = Self.reconcileGeoSession( + tab: tab, + needsDeviceLocation: geoTabNeedsDeviceLocation, + permissionState: locationChannelsModel.permissionState, + notesEnabled: notesEnabled, + geohash: geoGeohash, + manager: liveGeoManager, + ownsLiveRefresh: ownsLiveGeoRefresh, + beginLiveRefresh: { + locationChannelsModel.enableLocationChannels() + locationChannelsModel.beginLiveRefresh() + }, + endLiveRefresh: { locationChannelsModel.endLiveRefresh() }, + acquire: { geohash in + notesManager ?? LocationNotesPool.shared.acquire(geohash) + }, + release: { manager in + guard notesManager == nil else { return } + LocationNotesPool.shared.release(manager) + } + ) + // A test-injected manager is owned by the caller, not by the pool or + // this view's lifecycle state. + liveGeoManager = notesManager == nil ? next.manager : nil + ownsLiveGeoRefresh = next.ownsLiveRefresh } private var maxDraftLines: Int { dynamicTypeSize.isAccessibilitySize ? 5 : 3 } @@ -101,6 +211,9 @@ struct NoticesView: View { if case .location(let channel) = locationChannelsModel.selectedChannel { return channel.geohash } + guard locationChannelsModel.permissionState == .authorized else { + return nil + } return locationChannelsModel.currentBuildingGeohash } @@ -112,10 +225,11 @@ struct NoticesView: View { } private var activeGeohash: String? { - switch tab { - case .geo: return geoGeohash - case .mesh: return "" - } + Self.composerGeohash( + tab: tab, + notesEnabled: locationNotesEnabled, + geoGeohash: geoGeohash + ) } enum Strings { @@ -141,6 +255,8 @@ struct NoticesView: View { static let nostrSource = String(localized: "notices.source.nostr", defaultValue: "net", comment: "Source badge for notices seen on internet relays") static let locationUnavailable = String(localized: "content.notes.location_unavailable", comment: "Shown when the device location is unavailable for geo notices") static let enableLocation = String(localized: "content.location.enable", comment: "Button enabling location for geo notices") + static let locationNotesTitle: LocalizedStringKey = "app_info.location.notes.title" + static let locationNotesDescription: LocalizedStringKey = "app_info.location.notes.description" static let loadingNotes: LocalizedStringKey = "location_notes.loading_notes" static let connectingRelays: LocalizedStringKey = "location_notes.connecting_relays" static let noRelaysNearby: LocalizedStringKey = "location_notes.no_relays_nearby" @@ -190,55 +306,48 @@ struct NoticesView: View { #endif .themedSheetBackground() .onAppear { - beginGeoLocationIfNeeded() - ensureGeoNotesManager() + reconcileGeoSession() } .onChange(of: tab) { newTab in if newTab == .geo { - beginGeoLocationIfNeeded() if Self.revealsNearbyNotes(onSwitchingTo: newTab, geoGeohash: geoGeohash) { NearbyNotesCounter.shared.reveal() } - ensureGeoNotesManager() - } else { - locationChannelsModel.endLiveRefresh() - // Leaving the geo tab must take its REQ down with it, not - // leave the geohash subscription streaming behind the mesh - // board. The pool makes the return trip cheap (re-acquire - // revives the manager), and the dismissal release below is - // safe: `liveGeoManager` is nil until re-acquired. - LocationNotesPool.shared.release(liveGeoManager) - liveGeoManager = nil } + reconcileGeoSession() // Each tab keeps its natural default: geo notes stay until // deleted (∞), mesh board posts fade within a week. expiryDays = newTab == .geo ? Self.permanentExpiry : 7 urgent = false } - // Catches permission granted from the geo tab's enable button. + // Catches both grant and revocation. Revocation must balance the live + // refresh and release a device-derived building REQ immediately. .onChange(of: locationChannelsModel.permissionState) { _ in - beginGeoLocationIfNeeded() + reconcileGeoSession() } .onChange(of: geoGeohash) { _ in - ensureGeoNotesManager() + reconcileGeoSession() + } + .onChange(of: geoTabNeedsDeviceLocation) { _ in + reconcileGeoSession() + } + .onReceive(NotificationCenter.default.publisher(for: LocationNotesSettings.didChangeNotification)) { _ in + let enabled = LocationNotesSettings.enabled + locationNotesEnabled = enabled + reconcileGeoSession(notesEnabled: enabled) } .onDisappear { - locationChannelsModel.endLiveRefresh() - LocationNotesPool.shared.release(liveGeoManager) + if ownsLiveGeoRefresh { + locationChannelsModel.endLiveRefresh() + ownsLiveGeoRefresh = false + } + if notesManager == nil { + LocationNotesPool.shared.release(liveGeoManager) + } liveGeoManager = nil } } - /// The geo tab tracks the device's building geohash while on mesh; keep - /// location fresh only in that case (a selected location channel already - /// fixes the scope). - private func beginGeoLocationIfNeeded() { - guard tab == .geo, geoTabNeedsDeviceLocation, - locationChannelsModel.permissionState == .authorized else { return } - locationChannelsModel.enableLocationChannels() - locationChannelsModel.beginLiveRefresh() - } - private var headerSection: some View { VStack(alignment: .leading, spacing: 8) { HStack(spacing: 12) { @@ -288,21 +397,56 @@ struct NoticesView: View { notesManager: nil ) case .geo: - if let geohash = geoGeohash { + switch Self.geoPresentationState( + notesEnabled: locationNotesEnabled, + geohash: geoGeohash + ) { + case .disabled: + locationNotesDisabledSection + case .available(let geohash): if let manager = activeNotesManager { GeoNoticesList(geohash: geohash, board: board, manager: manager) } else { // Manager is created on appear; visible for one frame. Color.clear .frame(maxWidth: .infinity, maxHeight: .infinity) - .onAppear { ensureGeoNotesManager() } + .onAppear { reconcileGeoSession() } } - } else { + case .locationUnavailable: locationUnavailableSection } } } + private var locationNotesDisabledSection: some View { + ScrollView { + Toggle( + isOn: Binding( + get: { locationNotesEnabled }, + set: { enabled in + locationNotesEnabled = enabled + LocationNotesSettings.enabled = enabled + } + ) + ) { + VStack(alignment: .leading, spacing: 4) { + Text(Strings.locationNotesTitle) + .bitchatFont(size: 14) + Text(Strings.locationNotesDescription) + .bitchatFont(size: 12) + .foregroundColor(palette.secondary) + .fixedSize(horizontal: false, vertical: true) + } + } + .toggleStyle(.switch) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 16) + .padding(.vertical, 12) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .themedSurface() + } + private var locationUnavailableSection: some View { ScrollView { VStack(alignment: .leading, spacing: 12) { diff --git a/bitchatShareExtension/Info.plist b/bitchatShareExtension/Info.plist index a9c29c8d..62d9b453 100644 --- a/bitchatShareExtension/Info.plist +++ b/bitchatShareExtension/Info.plist @@ -28,8 +28,6 @@ NSExtensionActivationRule - NSExtensionActivationSupportsImageWithMaxCount - 1 NSExtensionActivationSupportsText NSExtensionActivationSupportsWebURLWithMaxCount diff --git a/bitchatShareExtension/PrivacyInfo.xcprivacy b/bitchatShareExtension/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..d773e0ef --- /dev/null +++ b/bitchatShareExtension/PrivacyInfo.xcprivacy @@ -0,0 +1,23 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + 1C8F.1 + + + + + diff --git a/bitchatShareExtension/ShareViewController.swift b/bitchatShareExtension/ShareViewController.swift index bd83b678..6867d1d4 100644 --- a/bitchatShareExtension/ShareViewController.swift +++ b/bitchatShareExtension/ShareViewController.swift @@ -107,38 +107,46 @@ final class ShareViewController: UIViewController { private func loadFirstURL(from providers: [NSItemProvider], completion: @escaping (URL?) -> Void) { let identifiers = [UTType.url.identifier, "public.url", "public.file-url"] - let grp = DispatchGroup() - var found: URL? - - for p in providers where found == nil { - for id in identifiers where p.hasItemConformingToTypeIdentifier(id) { - grp.enter() - p.loadItem(forTypeIdentifier: id, options: nil) { item, _ in - defer { grp.leave() } - if let u = item as? URL { found = u; return } - if let s = item as? String, let u = URL(string: s) { found = u; return } - if let d = item as? Data, let s = String(data: d, encoding: .utf8), let u = URL(string: s) { found = u; return } - } - break + for provider in providers { + guard let identifier = identifiers.first(where: { provider.hasItemConformingToTypeIdentifier($0) }) else { + continue } + provider.loadItem(forTypeIdentifier: identifier, options: nil) { item, _ in + let result: URL? + if let url = item as? URL { + result = url + } else if let string = item as? String { + result = URL(string: string) + } else if let data = item as? Data, + let string = String(data: data, encoding: .utf8) { + result = URL(string: string) + } else { + result = nil + } + DispatchQueue.main.async { completion(result) } + } + return } - grp.notify(queue: .main) { completion(found) } + DispatchQueue.main.async { completion(nil) } } private func loadFirstPlainText(from providers: [NSItemProvider], completion: @escaping (String?) -> Void) { - let id = UTType.plainText.identifier - let grp = DispatchGroup() - var text: String? - for p in providers where p.hasItemConformingToTypeIdentifier(id) { - grp.enter() - p.loadItem(forTypeIdentifier: id, options: nil) { item, _ in - defer { grp.leave() } - if let s = item as? String { text = s } - else if let d = item as? Data, let s = String(data: d, encoding: .utf8) { text = s } - } - break + let identifier = UTType.plainText.identifier + guard let provider = providers.first(where: { $0.hasItemConformingToTypeIdentifier(identifier) }) else { + DispatchQueue.main.async { completion(nil) } + return + } + provider.loadItem(forTypeIdentifier: identifier, options: nil) { item, _ in + let result: String? + if let string = item as? String { + result = string + } else if let data = item as? Data { + result = String(data: data, encoding: .utf8) + } else { + result = nil + } + DispatchQueue.main.async { completion(result) } } - grp.notify(queue: .main) { completion(text) } } // MARK: - Save + Finish @@ -170,10 +178,13 @@ final class ShareViewController: UIViewController { } private func finishWithMessage(_ msg: String) { - statusLabel.text = msg - // Complete shortly after showing status - DispatchQueue.main.asyncAfter(deadline: .now() + TransportConfig.uiShareExtensionDismissDelaySeconds) { - self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil) + DispatchQueue.main.async { [weak self] in + guard let self else { return } + self.statusLabel.text = msg + // Complete shortly after showing status. + DispatchQueue.main.asyncAfter(deadline: .now() + TransportConfig.uiShareExtensionDismissDelaySeconds) { [weak self] in + self?.extensionContext?.completeRequest(returningItems: [], completionHandler: nil) + } } } } diff --git a/bitchatTests/AudioSessionCoordinatorTests.swift b/bitchatTests/AudioSessionCoordinatorTests.swift new file mode 100644 index 00000000..b9627c1a --- /dev/null +++ b/bitchatTests/AudioSessionCoordinatorTests.swift @@ -0,0 +1,510 @@ +// +// AudioSessionCoordinatorTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import Foundation +@testable import bitchat + +/// Thread-safe: the coordinator invokes it on its private serial queue (that +/// the calls happen off the main thread is itself under test) while the test +/// reads from the main actor. +private final class MockAudioSession: SessionApplying, @unchecked Sendable { + enum Call: Equatable { + case setCategory(AudioSessionCoordinator.Category) + case setActive(Bool, notifyOthers: Bool) + } + + private let lock = NSLock() + private var _calls: [Call] = [] + private var _callsOnMainThread: [Bool] = [] + private var _nextError: Error? + private var _nextActivationError: Error? + + var calls: [Call] { lock.withLock { _calls } } + /// Whether each recorded call ran on the main thread — the coordinator's + /// whole point is that none ever does (the real calls block on IPC to the + /// audio server). + var callsOnMainThread: [Bool] { lock.withLock { _callsOnMainThread } } + var nextError: Error? { + get { lock.withLock { _nextError } } + set { lock.withLock { _nextError = newValue } } + } + /// Fails only the next `setActive` (so `setCategory` can succeed first). + var nextActivationError: Error? { + get { lock.withLock { _nextActivationError } } + set { lock.withLock { _nextActivationError = newValue } } + } + + func setCategory(_ category: AudioSessionCoordinator.Category) throws { + try lock.withLock { + if let error = _nextError { + _nextError = nil + throw error + } + _calls.append(.setCategory(category)) + _callsOnMainThread.append(Thread.isMainThread) + } + } + + func setActive(_ active: Bool, notifyOthersOnDeactivation: Bool) throws { + try lock.withLock { + if let error = _nextError { + _nextError = nil + throw error + } + if let error = _nextActivationError { + _nextActivationError = nil + throw error + } + _calls.append(.setActive(active, notifyOthers: notifyOthersOnDeactivation)) + _callsOnMainThread.append(Thread.isMainThread) + } + } + + var categoryCalls: [AudioSessionCoordinator.Category] { + calls.compactMap { if case .setCategory(let category) = $0 { category } else { nil } } + } + + var activationCalls: [Bool] { + calls.compactMap { if case .setActive(let active, _) = $0 { active } else { nil } } + } +} + +private struct MockSessionError: Error {} + +/// Async suspension gate used to force lifecycle races without sleeps. The +/// production operation announces that it reached the gated boundary, then +/// stays suspended until the test opens it. +private actor AsyncGate { + private var isOpen = false + private var hasWaiter = false + private var arrivalWaiters: [CheckedContinuation] = [] + private var gateWaiters: [CheckedContinuation] = [] + + func wait() async { + hasWaiter = true + let arrivals = arrivalWaiters + arrivalWaiters = [] + for continuation in arrivals { + continuation.resume() + } + guard !isOpen else { return } + await withCheckedContinuation { continuation in + gateWaiters.append(continuation) + } + } + + func waitUntilEntered() async { + guard !hasWaiter else { return } + await withCheckedContinuation { continuation in + arrivalWaiters.append(continuation) + } + } + + func open() { + isOpen = true + let waiters = gateWaiters + gateWaiters = [] + for continuation in waiters { + continuation.resume() + } + } +} + +@MainActor +struct AudioSessionCoordinatorTests { + // MARK: - Reference-counted activation + + @Test func activatesOnFirstAcquireAndDeactivatesOnLastRelease() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + let first = try await coordinator.acquire(.playback) {} + let second = try await coordinator.acquire(.playback) {} + #expect(session.activationCalls == [true]) + + coordinator.release(first) + await coordinator.drain() + #expect(session.activationCalls == [true]) + + coordinator.release(second) + await coordinator.drain() + #expect(session.activationCalls == [true, false]) + #expect(session.calls.last == .setActive(false, notifyOthers: true)) + } + + @Test func releasingOneOfTwoClientsDoesNotDeactivate() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + let playback = try await coordinator.acquire(.playback) {} + let capture = try await coordinator.acquire(.capture) {} + + coordinator.release(capture) + await coordinator.drain() + #expect(session.activationCalls == [true]) + + coordinator.release(playback) + await coordinator.drain() + #expect(session.activationCalls == [true, false]) + } + + @Test func doubleReleaseIsIdempotent() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + let first = try await coordinator.acquire(.playback) {} + let second = try await coordinator.acquire(.playback) {} + + coordinator.release(first) + coordinator.release(first) + await coordinator.drain() + // The stale second release must not tear the session out from under + // the remaining holder. + #expect(session.activationCalls == [true]) + + coordinator.release(second) + coordinator.release(second) + await coordinator.drain() + #expect(session.activationCalls == [true, false]) + } + + // MARK: - Off-main session calls + + @Test func sessionCallsNeverRunOnTheMainThread() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + // The real setCategory/setActive block on IPC to the audio server + // (>1 s observed under contention, tripping the system gesture gate + // on PTT press) — every call must land on the coordinator's queue. + let token = try await coordinator.acquire(.capture) {} + coordinator.release(token) + await coordinator.drain() + + #expect(session.calls.count == 3) // setCategory + activate + deactivate + #expect(session.callsOnMainThread == [false, false, false]) + } + + @Test func failedActivationDoesNotRegisterAHolder() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + session.nextError = MockSessionError() + await #expect(throws: MockSessionError.self) { + try await coordinator.acquire(.playback) {} + } + + // The failed acquire left no holder behind: the next one is 0->1 + // again and activates. + let token = try await coordinator.acquire(.playback) {} + #expect(session.activationCalls == [true]) + coordinator.release(token) + await coordinator.drain() + #expect(session.activationCalls == [true, false]) + } + + @Test func failedActivationRollsBackEscalatedCategory() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + // setCategory(.playAndRecord) succeeds, setActive throws (e.g. a + // phone call owns the hardware). + session.nextActivationError = MockSessionError() + await #expect(throws: MockSessionError.self) { + try await coordinator.acquire(.capture) {} + } + + // With no holder registered the escalated category must not stick: + // the next playback-only acquire runs under .playback, not the + // leftover .playAndRecord. + let token = try await coordinator.acquire(.playback) {} + #expect(session.categoryCalls == [.playAndRecord, .playback]) + // And the failed acquire left no holder behind: this one was 0->1. + #expect(session.activationCalls == [true]) + coordinator.release(token) + await coordinator.drain() + #expect(session.activationCalls == [true, false]) + } + + // MARK: - Category escalation + + @Test func captureWhilePlaybackEscalatesExactlyOnceAndNeverDowngrades() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + let playback = try await coordinator.acquire(.playback) {} + #expect(session.categoryCalls == [.playback]) + + let capture = try await coordinator.acquire(.capture) {} + #expect(session.categoryCalls == [.playback, .playAndRecord]) + + // More clients of either use don't touch the category again. + let secondCapture = try await coordinator.acquire(.capture) {} + let secondPlayback = try await coordinator.acquire(.playback) {} + #expect(session.categoryCalls == [.playback, .playAndRecord]) + + // Capture ending must not downgrade the route under live playback. + coordinator.release(capture) + coordinator.release(secondCapture) + await coordinator.drain() + #expect(session.categoryCalls == [.playback, .playAndRecord]) + + // Even a fresh playback acquire stays on playAndRecord while held. + let thirdPlayback = try await coordinator.acquire(.playback) {} + #expect(session.categoryCalls == [.playback, .playAndRecord]) + + coordinator.release(playback) + coordinator.release(secondPlayback) + coordinator.release(thirdPlayback) + await coordinator.drain() + } + + @Test func categoryResetsAfterAllHoldersRelease() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + let capture = try await coordinator.acquire(.capture) {} + coordinator.release(capture) + await coordinator.drain() + #expect(session.categoryCalls == [.playAndRecord]) + + // With no holders left the next playback-only session downgrades. + let playback = try await coordinator.acquire(.playback) {} + #expect(session.categoryCalls == [.playAndRecord, .playback]) + coordinator.release(playback) + await coordinator.drain() + } + + @Test func escalationNotifiesExistingHoldersSoEnginesCanRestart() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + var playbackInterruptions = 0 + var captureInterruptions = 0 + let playback = try await coordinator.acquire(.playback) { playbackInterruptions += 1 } + let capture = try await coordinator.acquire(.capture) { captureInterruptions += 1 } + + // The pre-existing playback holder was reconfigured underneath (the + // fan-out is delivered before acquire returns); the newly acquiring + // capture client was not. + #expect(playbackInterruptions == 1) + #expect(captureInterruptions == 0) + + // A second capture doesn't change the category — nobody is notified. + let secondCapture = try await coordinator.acquire(.capture) {} + #expect(playbackInterruptions == 1) + #expect(captureInterruptions == 0) + + coordinator.release(playback) + coordinator.release(capture) + coordinator.release(secondCapture) + await coordinator.drain() + } + + @Test func escalationPrefersCategoryChangeCallbackOverInterruption() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + var escalations = 0 + var interruptions = 0 + let playback = try await coordinator.acquire( + .playback, + onInterrupted: { interruptions += 1 }, + onCategoryEscalated: { escalations += 1 } + ) + + // Escalation reaches the dedicated callback (the holder restarts and + // keeps playing) — not onInterrupted (which would stop it for good). + let capture = try await coordinator.acquire(.capture) {} + #expect(escalations == 1) + #expect(interruptions == 0) + + // A real interruption still stops it. + await coordinator.handleInterruptionBegan() + #expect(escalations == 1) + #expect(interruptions == 1) + + coordinator.release(playback) + coordinator.release(capture) + await coordinator.drain() + } + + // MARK: - Interruptions and route changes + + @Test func interruptionDuringAcquireHandoffCancelsAcquire() async throws { + let session = MockAudioSession() + let handoffGate = AsyncGate() + let coordinator = AudioSessionCoordinator( + session: session, + testingHooks: .init(beforeAcquireHandoff: { + await handoffGate.wait() + }) + ) + + var interruptionCount = 0 + let acquireTask = Task { @MainActor in + try await coordinator.acquire(.capture) { + interruptionCount += 1 + } + } + + // The session-queue registration is complete, but the caller has not + // received its token. An interruption here used to invoke the callback + // immediately, when capture clients could not release the token yet. + await handoffGate.waitUntilEntered() + await coordinator.handleInterruptionBegan() + #expect(interruptionCount == 0) + + await handoffGate.open() + await #expect(throws: CancellationError.self) { + try await acquireTask.value + } + await coordinator.drain() + #expect(interruptionCount == 0) + // The OS already deactivated the interrupted session; removing the + // provisional token must not issue a redundant setActive(false). + #expect(session.activationCalls == [true]) + + // The canceled acquire left no holder behind and the now-open test gate + // does not affect a subsequent ownership handoff. + let replacement = try await coordinator.acquire(.playback) {} + #expect(session.activationCalls == [true, true]) + coordinator.release(replacement) + await coordinator.drain() + #expect(session.activationCalls == [true, true, false]) + } + + @Test func releasedSnapshotCannotInterruptReacquiredToken() async throws { + let session = MockAudioSession() + let deliveryGate = AsyncGate() + let coordinator = AudioSessionCoordinator( + session: session, + testingHooks: .init(beforeCallbackDelivery: { + await deliveryGate.wait() + }) + ) + + // Model a single client whose callback acts on whichever token it owns + // now. If the old snapshot is delivered after reacquisition, it would + // incorrectly release the new session. + var activeToken: AudioSessionCoordinator.Token? + var interruptionCount = 0 + let onInterrupted: @MainActor () -> Void = { + interruptionCount += 1 + activeToken.map(coordinator.release) + } + + let first = try await coordinator.acquire(.playback, onInterrupted: onInterrupted) + activeToken = first + let interruptionTask = Task { + await coordinator.handleInterruptionBegan() + } + + // The queue snapshot contains `first`, but main-actor delivery is held. + await deliveryGate.waitUntilEntered() + coordinator.release(first) + activeToken = nil + await coordinator.drain() + + let second = try await coordinator.acquire(.playback, onInterrupted: onInterrupted) + activeToken = second + #expect(session.activationCalls == [true, true]) + + await deliveryGate.open() + await interruptionTask.value + await coordinator.drain() + #expect(interruptionCount == 0) + // A stale callback would have released `second` and appended false. + #expect(session.activationCalls == [true, true]) + + coordinator.release(second) + activeToken = nil + await coordinator.drain() + #expect(session.activationCalls == [true, true, false]) + } + + @Test func interruptionFansOutToAllHoldersAndResetsActiveState() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + var playbackInterruptions = 0 + var captureInterruptions = 0 + // Capture first so no escalation fan-out muddies the counters. + let capture = try await coordinator.acquire(.capture) { captureInterruptions += 1 } + let playback = try await coordinator.acquire(.playback) { playbackInterruptions += 1 } + #expect(session.activationCalls == [true]) + + await coordinator.handleInterruptionBegan() + #expect(playbackInterruptions == 1) + #expect(captureInterruptions == 1) + // The OS deactivated the session; the coordinator must not issue its + // own setActive(false) on top of it. + #expect(session.activationCalls == [true]) + + // The active state was reset: the next acquire re-activates even + // though holders never released. + let resumed = try await coordinator.acquire(.playback) {} + #expect(session.activationCalls == [true, true]) + + coordinator.release(playback) + coordinator.release(capture) + coordinator.release(resumed) + await coordinator.drain() + #expect(session.activationCalls == [true, true, false]) + } + + @Test func interruptedHoldersReleasingDuringFanOutStaySafe() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + // Real clients release from within onInterrupted (stop() paths); + // release is fire-and-forget onto the coordinator's queue, so it is + // safe from inside the main-actor fan-out. + var tokens: [AudioSessionCoordinator.Token] = [] + for _ in 0..<2 { + var token: AudioSessionCoordinator.Token? + token = try await coordinator.acquire(.playback) { + token.map(coordinator.release) + } + tokens.append(token!) + } + + await coordinator.handleInterruptionBegan() + await coordinator.drain() + // Every holder released mid-fan-out; the session was already + // deactivated by the OS, so no redundant setActive(false). + #expect(session.activationCalls == [true]) + + // All holders are gone: a fresh acquire is 0->1 again. + let token = try await coordinator.acquire(.playback) {} + #expect(session.activationCalls == [true, true]) + coordinator.release(token) + await coordinator.drain() + #expect(session.activationCalls == [true, true, false]) + } + + @Test func routeDeviceUnavailableNotifiesHoldersButKeepsSessionActive() async throws { + let session = MockAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + + var interruptions = 0 + // Capture first so no escalation fan-out muddies the counter. + let capture = try await coordinator.acquire(.capture) { interruptions += 1 } + let playback = try await coordinator.acquire(.playback) { interruptions += 1 } + + await coordinator.handleRouteDeviceUnavailable() + #expect(interruptions == 2) + // Unlike an interruption, the session itself is still active — the + // last holder's release performs the deactivation. + coordinator.release(playback) + coordinator.release(capture) + await coordinator.drain() + #expect(session.activationCalls == [true, false]) + } +} diff --git a/bitchatTests/BLEServiceCoreTests.swift b/bitchatTests/BLEServiceCoreTests.swift index c7065f6d..a1d62cae 100644 --- a/bitchatTests/BLEServiceCoreTests.swift +++ b/bitchatTests/BLEServiceCoreTests.swift @@ -219,11 +219,54 @@ struct BLEServiceCoreTests { ) let payload = try #require(announcement.encode(), "Failed to encode announcement") let victimPeerID = PeerID(publicKey: announcement.noisePublicKey) + let courierStore = CourierStore(persistsToDisk: false) + ble.courierStore = courierStore + let carriedEnvelope = CourierEnvelope( + recipientTag: CourierEnvelope.recipientTag( + noiseStaticKey: announcement.noisePublicKey, + epochDay: CourierEnvelope.epochDay(for: Date()) + ), + expiry: UInt64(Date().addingTimeInterval(3600).timeIntervalSince1970 * 1000), + ciphertext: Data(repeating: 0xA5, count: 128) + ) + #expect(courierStore.deposit( + carriedEnvelope, + from: Data(repeating: 0xC0, count: 32), + tier: .favorite + )) + let sprayRecipientKey = Data(repeating: 0xB4, count: 32) + let sprayEnvelope = CourierEnvelope( + recipientTag: CourierEnvelope.recipientTag( + noiseStaticKey: sprayRecipientKey, + epochDay: CourierEnvelope.epochDay(for: Date()) + ), + expiry: UInt64(Date().addingTimeInterval(3600).timeIntervalSince1970 * 1000), + ciphertext: Data(repeating: 0xB5, count: 128), + copies: 4 + ) + #expect(courierStore.deposit( + sprayEnvelope, + from: Data(repeating: 0xC0, count: 32), + tier: .favorite + )) ble._test_seedConnectedPeer(victimPeerID, nickname: "victim") ble._test_bindCentral(victimLink, to: victimPeerID) ble._test_seedConnectedPeer(attackerPeerID, nickname: "attacker") ble._test_bindCentral(attackerLink, to: attackerPeerID) + // Preserve the hard case: a valid victim session still exists on the + // victim's own physical link when the announce is replayed elsewhere. + let message1 = try ble._test_noiseInitiateHandshake(with: victimPeerID) + let message2 = try #require( + try victimSigner.processHandshakeMessage(from: ble.myPeerID, message: message1) + ) + let message3 = try #require( + try ble._test_noiseProcessHandshakeMessage(from: victimPeerID, message: message2) + ) + _ = try victimSigner.processHandshakeMessage(from: ble.myPeerID, message: message3) + #expect(ble.canDeliverSecurely(to: victimPeerID)) + ble._test_markNoiseAuthenticatedCentral(victimLink, to: victimPeerID) + // The victim's fresh signed announce replayed on the attacker's bound // link with its direct TTL restored (TTL is excluded from signing, so // the signature still verifies). @@ -249,6 +292,16 @@ struct BLEServiceCoreTests { #expect(!stolen) #expect(ble._test_centralBinding(attackerLink) == attackerPeerID) #expect(ble._test_centralBinding(victimLink) == victimPeerID) + // A valid signature authenticates the announce contents, not the + // unsigned direct TTL. Without a Noise-authenticated session on the + // ingress link, the replay must not retire mail or consume spray state. + #expect(!courierStore.isEmpty) + await Task.yield() + await Task.yield() + let stillEligibleForSpray = courierStore.takeSprayCopies(for: announcement.noisePublicKey) + #expect(stillEligibleForSpray.map(\.copies) == [2]) + #expect(courierStore.takeEnvelopes(for: announcement.noisePublicKey) == [carriedEnvelope]) + #expect(ble.canDeliverSecurely(to: victimPeerID)) // And the replay must not retire the link's real bound peer. #expect(ble.currentPeerSnapshots().map(\.peerID).contains(attackerPeerID)) } @@ -315,6 +368,78 @@ struct BLEServiceCoreTests { #expect(!ble.canDeliverSecurely(to: victimPeerID)) } + @Test + func replayedDirectAnnounceWithStaleVictimSessionCannotBridgeThroughForeignLink() async throws { + let ble = makeService() + // Keep announce handling out of the carried-mail path: the regression + // is specifically BridgeCourierService's direct delivery preflight. + ble.courierStore = CourierStore(persistsToDisk: false) + let attackerPeerID = PeerID(str: "1122334455667788") + let attackerLink = "central-attacker-stale-victim-session" + ble._test_seedConnectedPeer(attackerPeerID, nickname: "attacker") + ble._test_bindCentral(attackerLink, to: attackerPeerID) + + let victim = NoiseEncryptionService(keychain: MockKeychain()) + let announcement = AnnouncementPacket( + nickname: "victim", + noisePublicKey: victim.getStaticPublicKeyData(), + signingPublicKey: victim.getSigningPublicKeyData(), + directNeighbors: nil + ) + let victimPeerID = PeerID(publicKey: announcement.noisePublicKey) + + // Establish a real peer-level victim session without associating it + // with the attacker's physical link. This is the stale-session case + // that a plain `canDeliverSecurely` check cannot distinguish. + let message1 = try ble._test_noiseInitiateHandshake(with: victimPeerID) + let message2 = try #require( + try victim.processHandshakeMessage(from: ble.myPeerID, message: message1) + ) + let message3 = try #require( + try ble._test_noiseProcessHandshakeMessage(from: victimPeerID, message: message2) + ) + _ = try victim.processHandshakeMessage(from: ble.myPeerID, message: message3) + #expect(ble.canDeliverSecurely(to: victimPeerID)) + + let payload = try #require(announcement.encode(), "Failed to encode announcement") + let unsigned = BitchatPacket( + type: MessageType.announce.rawValue, + senderID: Data(hexString: victimPeerID.id) ?? Data(), + recipientID: nil, + timestamp: UInt64(Date().timeIntervalSince1970 * 1000), + payload: payload, + signature: nil, + ttl: 7 + ) + let replay = try #require(victim.signPacket(unsigned), "Failed to sign replayed announce") + #expect(ble._test_recordIngressIfNew(packet: replay, linkID: attackerLink)) + ble._test_handlePacket(replay, fromPeerID: victimPeerID, preseedPeer: false) + + let rebound = await TestHelpers.waitUntil( + { ble._test_centralBinding(attackerLink) == victimPeerID }, + timeout: TestConstants.longTimeout + ) + #expect(rebound) + #expect(ble.canDeliverSecurely(to: victimPeerID)) + + let outbound = OutboundPacketTap() + ble._test_onOutboundPacket = { outbound.record($0) } + let envelope = CourierEnvelope( + recipientTag: CourierEnvelope.recipientTag( + noiseStaticKey: announcement.noisePublicKey, + epochDay: CourierEnvelope.epochDay(for: Date()) + ), + expiry: UInt64(Date().addingTimeInterval(3600).timeIntervalSince1970 * 1000), + ciphertext: Data(repeating: 0xA5, count: 128) + ) + + #expect(!ble.deliverBridgedEnvelope(envelope, to: victimPeerID)) + // Reject before even entering the outbound pipeline: otherwise a + // real attacker CBCentral could accept the opaque courier packet and + // cause the relay drop's persisted seen ID to be consumed forever. + #expect(outbound.count(ofType: .courierEnvelope) == 0) + } + /// A legitimate rotation announce necessarily arrives on a link still /// bound to the OLD ID, so its registry upsert stores the new peer /// disconnected. The successful rebind must promote it: a healed diff --git a/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift b/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift index 59516b9a..5fad9fd0 100644 --- a/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift +++ b/bitchatTests/ChatPrivateConversationCoordinatorContextTests.swift @@ -80,7 +80,7 @@ private final class MockChatPrivateConversationContext: ChatPrivateConversationC @discardableResult func setPrivateDeliveryStatus(_ status: DeliveryStatus, forMessageID messageID: String, peerID: PeerID) -> Bool { - guard var chat = privateChats[peerID], + guard let chat = privateChats[peerID], let index = chat.firstIndex(where: { $0.id == messageID }) else { return false } diff --git a/bitchatTests/ChatVerificationCoordinatorContextTests.swift b/bitchatTests/ChatVerificationCoordinatorContextTests.swift index 6034c890..326ab453 100644 --- a/bitchatTests/ChatVerificationCoordinatorContextTests.swift +++ b/bitchatTests/ChatVerificationCoordinatorContextTests.swift @@ -268,7 +268,7 @@ struct ChatVerificationCoordinatorContextTests { context.verifiedFingerprints = ["fp-verified"] coordinator.setupNoiseCallbacks() - let callbacks = try? #require(context.installedCallbacks) + let callbacks = context.installedCallbacks // Authenticated with a verified fingerprint -> verified status and a // cached stable peer ID derived from the session key. diff --git a/bitchatTests/ChatViewModelDeliveryStatusTests.swift b/bitchatTests/ChatViewModelDeliveryStatusTests.swift index f6d3d974..fca755f2 100644 --- a/bitchatTests/ChatViewModelDeliveryStatusTests.swift +++ b/bitchatTests/ChatViewModelDeliveryStatusTests.swift @@ -130,6 +130,14 @@ struct ChatViewModelDeliveryStatusTests { #expect(Conversation.shouldSkipStatusUpdate(current: .delivered(to: "Peer", at: Date()), new: .sending)) #expect(Conversation.shouldSkipStatusUpdate(current: .read(by: "Peer", at: Date()), new: .sending)) + #expect(Conversation.shouldSkipStatusUpdate( + current: .delivered(to: "Peer", at: Date()), + new: .failed(reason: "late transport failure") + )) + #expect(Conversation.shouldSkipStatusUpdate( + current: .read(by: "Peer", at: Date()), + new: .failed(reason: "late transfer failure") + )) // A late async `.sending` (pre-handshake resend) must not visibly // downgrade a truthful "Sent" either... #expect(Conversation.shouldSkipStatusUpdate(current: .sent, new: .sending)) diff --git a/bitchatTests/ChatViewModelTests.swift b/bitchatTests/ChatViewModelTests.swift index 8b9afcef..5682cdfa 100644 --- a/bitchatTests/ChatViewModelTests.swift +++ b/bitchatTests/ChatViewModelTests.swift @@ -760,6 +760,40 @@ struct ChatViewModelRateLimitingTests { struct ChatViewModelPublicConversationTests { + @Test @MainActor + func bridgeAliasReplacementDoesNotContentDedupAwayAuthenticatedRadioRow() { + let (viewModel, _) = makeTestableViewModel() + let content = "same bridge and radio payload" + let timestamp = Date() + let bridgeMessage = BitchatMessage( + id: "bridge-event-id", + sender: "remote#beef", + content: content, + timestamp: timestamp, + isRelay: false, + senderPeerID: PeerID(bridge: String(repeating: "a", count: 64)), + isBridged: true + ) + viewModel.handlePublicMessage(bridgeMessage) + viewModel.publicMessagePipeline.flushIfNeeded() + #expect(viewModel.publicConversationContainsMessage(withID: bridgeMessage.id, in: .mesh)) + + viewModel.removeBridgeInjectedPublicMessage(withID: bridgeMessage.id) + let radioMessage = BitchatMessage( + id: "radio-stable-id", + sender: "remote", + content: content, + timestamp: timestamp, + isRelay: false, + senderPeerID: PeerID(str: "1122334455667788") + ) + viewModel.handlePublicMessage(radioMessage) + viewModel.publicMessagePipeline.flushIfNeeded() + + #expect(!viewModel.publicConversationContainsMessage(withID: bridgeMessage.id, in: .mesh)) + #expect(viewModel.publicConversationContainsMessage(withID: radioMessage.id, in: .mesh)) + } + @Test @MainActor func addPublicSystemMessage_persistsAcrossTimelineRefresh() async { let (viewModel, _) = makeTestableViewModel() diff --git a/bitchatTests/CourierStoreTests.swift b/bitchatTests/CourierStoreTests.swift index 23829b0e..ea90b6a7 100644 --- a/bitchatTests/CourierStoreTests.swift +++ b/bitchatTests/CourierStoreTests.swift @@ -66,6 +66,52 @@ struct CourierStoreTests { #expect(store.takeEnvelopes(for: Data(repeating: 0xB0, count: 32)).count == 1) } + @Test func rejectedPhysicalHandoverRetainsEnvelopeUntilAcceptedRetry() { + let store = makeStore() + let recipientKey = Data(repeating: 0xB0, count: 32) + let envelope = makeEnvelope(recipientKey: recipientKey) + #expect(store.deposit(envelope, from: depositorA)) + + var rejectedOffers: [CourierEnvelope] = [] + let rejected = store.handoverEnvelopes(for: recipientKey) { offered in + rejectedOffers.append(offered) + return false + } + + #expect(rejected == 0) + #expect(rejectedOffers == [envelope]) + #expect(!store.isEmpty) + + var acceptedOffers: [CourierEnvelope] = [] + let accepted = store.handoverEnvelopes(for: recipientKey) { offered in + acceptedOffers.append(offered) + return true + } + #expect(accepted == 1) + #expect(acceptedOffers == [envelope]) + #expect(store.isEmpty) + } + + @Test func midTrainFragmentRejectionRetainsDurableEnvelope() { + let store = makeStore() + let recipientKey = Data(repeating: 0xB0, count: 32) + let envelope = makeEnvelope(recipientKey: recipientKey) + #expect(store.deposit(envelope, from: depositorA)) + + var attemptedFragments: [Int] = [] + let accepted = store.handoverEnvelopes(for: recipientKey) { _ in + BLEStrictFragmentAdmission.admitAll([0, 1, 2]) { fragment in + attemptedFragments.append(fragment) + return fragment != 1 + } + } + + #expect(accepted == 0) + #expect(attemptedFragments == [0, 1]) + #expect(!store.isEmpty) + #expect(store.takeEnvelopes(for: recipientKey) == [envelope]) + } + @Test func duplicateDepositIsIdempotent() { let store = makeStore() let recipientKey = Data(repeating: 0xB0, count: 32) @@ -174,6 +220,46 @@ struct CourierStoreTests { #expect(second.takeEnvelopes(for: recipientKey) == [envelope]) } + @Test func protectedDataReadFailureDoesNotOverwriteDurableMailAndMergesOnRecovery() { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("courier-protected-data-\(UUID().uuidString)", isDirectory: true) + .appendingPathComponent("envelopes.json") + defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) } + + let durableRecipient = Data(repeating: 0xE1, count: 32) + let wakeRecipient = Data(repeating: 0xE2, count: 32) + let durableEnvelope = makeEnvelope(recipientKey: durableRecipient) + let wakeEnvelope = makeEnvelope(recipientKey: wakeRecipient) + let seed = CourierStore(persistsToDisk: true, fileURL: fileURL, now: { Self.baseDate }) + #expect(seed.deposit(durableEnvelope, from: depositorA)) + let durableBytes = try? Data(contentsOf: fileURL) + + var protectedDataUnavailable = true + let restored = CourierStore( + persistsToDisk: true, + fileURL: fileURL, + now: { Self.baseDate }, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + } + ) + #expect(restored.deposit(wakeEnvelope, from: depositorB)) + + // The locked wake accepted new work in memory but did not replace the + // unreadable file with that partial view. + #expect((try? Data(contentsOf: fileURL)) == durableBytes) + + protectedDataUnavailable = false + restored.retryDeferredPersistence() + + let afterUnlock = CourierStore(persistsToDisk: true, fileURL: fileURL, now: { Self.baseDate }) + #expect(afterUnlock.takeEnvelopes(for: durableRecipient) == [durableEnvelope]) + #expect(afterUnlock.takeEnvelopes(for: wakeRecipient) == [wakeEnvelope]) + } + // MARK: - Tiers (open couriering) @Test func verifiedTierGetsSmallerPerDepositorQuota() { @@ -282,6 +368,29 @@ struct CourierStoreTests { #expect(store.takeEnvelopes(for: recipientKey).count == 1) } + @Test func rejectedSprayTransferPreservesBudgetAndCourierEligibility() { + let store = makeStore() + let recipientKey = Data(repeating: 0xB0, count: 32) + let courier = Data(repeating: 0xC1, count: 32) + #expect(store.deposit(makeEnvelope(recipientKey: recipientKey).withCopies(4), from: depositorA)) + + var rejectedOffers: [CourierEnvelope] = [] + let rejected = store.transferSprayCopies(to: courier) { offered in + rejectedOffers.append(offered) + return false + } + + #expect(rejected == 0) + #expect(rejectedOffers.map(\.copies) == [2]) + + // The same courier remains eligible and receives the original half + // budget, proving neither `copies` nor `sprayedTo` changed on failure. + let acceptedRetry = store.takeSprayCopies(for: courier) + #expect(acceptedRetry.map(\.copies) == [2]) + let nextCourier = store.takeSprayCopies(for: Data(repeating: 0xC2, count: 32)) + #expect(nextCourier.map(\.copies) == [1]) + } + @Test func carryOnlyEnvelopesAreNeverSprayed() { let store = makeStore() #expect(store.deposit(makeEnvelope(), from: depositorA)) @@ -300,6 +409,28 @@ struct CourierStoreTests { #expect(sprayed.first?.copies == 2) } + @Test func duplicateReplayCannotReplenishSpentSprayBudget() { + let store = makeStore() + let recipientKey = Data(repeating: 0xB0, count: 32) + let original = makeEnvelope(recipientKey: recipientKey).withCopies(8) + #expect(store.deposit(original, from: depositorA)) + + let courierX = Data(repeating: 0xC1, count: 32) + let courierY = Data(repeating: 0xC2, count: 32) + let courierZ = Data(repeating: 0xC3, count: 32) + let courierW = Data(repeating: 0xC4, count: 32) + #expect(store.takeSprayCopies(for: courierX).map(\.copies) == [4]) + + // Replaying the original signed deposit still accepts idempotently, + // but it cannot reset the local branch from 4 copies back to 8. + #expect(store.deposit(original, from: depositorA)) + #expect(store.takeSprayCopies(for: courierY).map(\.copies) == [2]) + #expect(store.deposit(original, from: depositorA)) + #expect(store.takeSprayCopies(for: courierZ).map(\.copies) == [1]) + #expect(store.deposit(original, from: depositorA)) + #expect(store.takeSprayCopies(for: courierW).isEmpty) + } + // MARK: - Remote handover (relayed announces) @Test func remoteHandoverIsNonDestructiveAndCooledDown() { diff --git a/bitchatTests/EndToEnd/CourierEndToEndTests.swift b/bitchatTests/EndToEnd/CourierEndToEndTests.swift index af0af7a9..ac68c145 100644 --- a/bitchatTests/EndToEnd/CourierEndToEndTests.swift +++ b/bitchatTests/EndToEnd/CourierEndToEndTests.swift @@ -96,6 +96,20 @@ struct CourierEndToEndTests { service._test_handlePacket(packet, fromPeerID: peer.myPeerID) } + /// Establishes the Noise session that proves the direct link's peer owns + /// its announced static identity. CoreBluetooth is disabled in this suite, + /// so the handshake is ferried in-process just like courier packets. + private func establishNoiseSession(between initiator: BLEService, and responder: BLEService) throws { + let message1 = try initiator._test_noiseInitiateHandshake(with: responder.myPeerID) + let message2 = try #require( + try responder._test_noiseProcessHandshakeMessage(from: initiator.myPeerID, message: message1) + ) + let message3 = try #require( + try initiator._test_noiseProcessHandshakeMessage(from: responder.myPeerID, message: message2) + ) + _ = try responder._test_noiseProcessHandshakeMessage(from: initiator.myPeerID, message: message3) + } + // MARK: - Tests @Test func courierCarriesMessageAcrossDisjointConnectivity() async throws { @@ -141,7 +155,9 @@ struct CourierEndToEndTests { ) #expect(carried) - // 3. Later, Bob announces near Carol → handover fires. + // 3. Later, Bob proves link ownership and announces near Carol → + // handover fires. + try establishNoiseSession(between: carol, and: bob) bob.sendBroadcastAnnounce() let announced = await TestHelpers.waitUntil( { bobOut.first(ofType: .announce) != nil }, @@ -156,7 +172,10 @@ struct CourierEndToEndTests { timeout: TestConstants.defaultTimeout ) #expect(handedOver) - #expect(carol.courierStore.isEmpty) + // With CoreBluetooth disabled there is no physical link for the send + // planner to accept, so Carol truthfully retains the durable copy even + // though the packet tap lets us ferry the attempted handover below. + #expect(!carol.courierStore.isEmpty) let handoverPacket = try #require(carolOut.first(ofType: .courierEnvelope)) #expect(PeerID(hexData: handoverPacket.recipientID) == bob.myPeerID) @@ -222,6 +241,7 @@ struct CourierEndToEndTests { ) #expect(carried) + try establishNoiseSession(between: carol, and: bob) bob.sendBroadcastAnnounce() let announced = await TestHelpers.waitUntil( { bobOut.first(ofType: .announce) != nil }, @@ -309,7 +329,7 @@ struct CourierEndToEndTests { timeout: TestConstants.defaultTimeout ) #expect(handedOver) - #expect(carol.courierStore.isEmpty) + #expect(!carol.courierStore.isEmpty) } @Test func relayedAnnounceTriggersNonDestructiveRemoteHandover() async throws { @@ -395,7 +415,11 @@ struct CourierEndToEndTests { #expect(!refloodedInCooldown) #expect(!carol.courierStore.isEmpty) - // A later *direct* announce still performs the destructive handover. + // A peer-level Noise session is still insufficient without a physical + // ingress link that completed that handshake. This CoreBluetooth-free + // harness deliberately has no such link proof, so restoring the + // unsigned direct TTL cannot authorize destructive handover. + try establishNoiseSession(between: carol, and: bob) try await Task.sleep(nanoseconds: 1_100_000_000) bob.sendBroadcastAnnounce() let announcedAgain = await TestHelpers.waitUntil( @@ -408,12 +432,12 @@ struct CourierEndToEndTests { ) carol._test_handlePacket(directAgain, fromPeerID: bob.myPeerID, preseedPeer: false) - let handedOver = await TestHelpers.waitUntil( - { carolOut.count(ofType: .courierEnvelope) == 2 }, - timeout: TestConstants.defaultTimeout + let handedOverWithoutLinkProof = await TestHelpers.waitUntil( + { carolOut.count(ofType: .courierEnvelope) > 1 }, + timeout: TestConstants.shortTimeout ) - #expect(handedOver) - #expect(carol.courierStore.isEmpty) + #expect(!handedOverWithoutLinkProof) + #expect(!carol.courierStore.isEmpty) } @Test func sendCourierMessageRejectsInvalidRecipientKeyBeforeQueueing() async throws { @@ -755,9 +779,9 @@ struct MessageRouterCourierTests { ) let router = MessageRouter(transports: [transport], courierDirectory: directory) var drops: [(content: String, messageID: String, key: Data)] = [] - router.bridgeCourierDeposit = { content, messageID, key in + router.bridgeCourierDeposit = { content, messageID, key, completion in drops.append((content, messageID, key)) - return true + completion(true) } var carried: [String] = [] router.onMessageCarried = { messageID, _ in carried.append(messageID) } diff --git a/bitchatTests/Fragmentation/FragmentationTests.swift b/bitchatTests/Fragmentation/FragmentationTests.swift index 5b64bfeb..ba0f82b7 100644 --- a/bitchatTests/Fragmentation/FragmentationTests.swift +++ b/bitchatTests/Fragmentation/FragmentationTests.swift @@ -35,19 +35,15 @@ struct FragmentationTests { // Use a small fragment size to ensure multiple pieces let fragments = fragmentPacket(original, fragmentSize: 400) - // Shuffle fragments to simulate out-of-order arrival - let shuffled = fragments.shuffled() + // Reverse deterministically to simulate out-of-order arrival without + // making a failure depend on a random permutation. + let outOfOrder = fragments.reversed() - // Send fragments sequentially with small delays (no fire-and-forget Tasks) - for (i, fragment) in shuffled.enumerated() { - if i > 0 { - try await Task.sleep(for: .milliseconds(5)) - } + for fragment in outOfOrder { ble._test_handlePacket(fragment, fromPeerID: remoteShortID, signingPublicKey: signingKey) } - // Wait for delegate callback with proper timeout - try await capture.waitForPublicMessages(count: 1, timeout: .seconds(5)) + await ble._test_drainFragmentPipeline() #expect(capture.publicMessages.count == 1) #expect(capture.publicMessages.first?.content.count == 3_000) @@ -73,16 +69,11 @@ struct FragmentationTests { frags.insert(dup, at: 1) } - // Send fragments sequentially with small delays (no fire-and-forget Tasks) - for (i, fragment) in frags.enumerated() { - if i > 0 { - try await Task.sleep(for: .milliseconds(5)) - } + for fragment in frags { ble._test_handlePacket(fragment, fromPeerID: remoteShortID, signingPublicKey: signingKey) } - // Wait for delegate callback with proper timeout - try await capture.waitForPublicMessages(count: 1, timeout: .seconds(5)) + await ble._test_drainFragmentPipeline() #expect(capture.publicMessages.count == 1) #expect(capture.publicMessages.first?.content.count == 2048) @@ -126,14 +117,11 @@ struct FragmentationTests { let fragments = fragmentPacket(packet, fragmentSize: 4096, pad: false) #expect(!fragments.isEmpty) - for (i, fragment) in fragments.enumerated() { - if i > 0 { - try await Task.sleep(for: .milliseconds(5)) - } + for fragment in fragments { ble._test_handlePacket(fragment, fromPeerID: remoteID, signingPublicKey: signingKey) } - try await capture.waitForReceivedMessages(count: 1, timeout: .seconds(5)) + await ble._test_drainFragmentPipeline() let message = try #require(capture.receivedMessages.first, "Expected file transfer message") #expect(message.content.hasPrefix("[file]")) @@ -173,15 +161,11 @@ struct FragmentationTests { corrupted[0] = p } - for (i, fragment) in corrupted.enumerated() { - if i > 0 { - try await Task.sleep(for: .milliseconds(5)) - } + for fragment in corrupted { ble._test_handlePacket(fragment, fromPeerID: remoteShortID) } - - // Allow async processing - try await sleep(0.5) + + await ble._test_drainFragmentPipeline() // Should not deliver since one fragment is invalid and reassembly can't complete #expect(capture.publicMessages.isEmpty) @@ -207,10 +191,6 @@ extension FragmentationTests { private let lock = NSLock() private var _publicMessages: [(peerID: PeerID, nickname: String, content: String)] = [] private var _receivedMessages: [BitchatMessage] = [] - private var publicMessageContinuation: CheckedContinuation? - private var receivedMessageContinuation: CheckedContinuation? - private var expectedPublicMessageCount: Int = 0 - private var expectedReceivedMessageCount: Int = 0 private func withLock(_ body: () -> T) -> T { lock.lock() @@ -227,139 +207,11 @@ extension FragmentationTests { } func didReceiveMessage(_ message: BitchatMessage) { - lock.lock() - _receivedMessages.append(message) - let count = _receivedMessages.count - let expected = expectedReceivedMessageCount - let continuation = receivedMessageContinuation - lock.unlock() - - if count >= expected, let cont = continuation { - lock.lock() - receivedMessageContinuation = nil - lock.unlock() - cont.resume() - } + withLock { _receivedMessages.append(message) } } func didReceivePublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date, messageID: String?) { - lock.lock() - _publicMessages.append((peerID, nickname, content)) - let count = _publicMessages.count - let expected = expectedPublicMessageCount - let continuation = publicMessageContinuation - lock.unlock() - - if count >= expected, let cont = continuation { - lock.lock() - publicMessageContinuation = nil - lock.unlock() - cont.resume() - } - } - - /// Waits for the specified number of public messages to be received - func waitForPublicMessages(count: Int, timeout: Duration = .seconds(2)) async throws { - let isAlreadySatisfied = withLock { () -> Bool in - if _publicMessages.count >= count { - return true - } - expectedPublicMessageCount = count - return false - } - if isAlreadySatisfied { - return - } - - try await withThrowingTaskGroup(of: Void.self) { group in - group.addTask { - // withCheckedContinuation itself is not cancellable, so hook - // group.cancelAll() to resume the parked continuation — - // otherwise a timeout leaves the group awaiting this child - // forever and the test run hangs instead of failing. - await withTaskCancellationHandler { - await withCheckedContinuation { continuation in - let shouldResumeImmediately = self.withLock { - // Recheck count after acquiring lock to avoid race condition - // where message arrives between initial check and continuation install - if self._publicMessages.count >= count { - return true - } - self.publicMessageContinuation = continuation - return false - } - if shouldResumeImmediately { - continuation.resume() - } - } - } onCancel: { - let continuation = self.withLock { - let parked = self.publicMessageContinuation - self.publicMessageContinuation = nil - return parked - } - continuation?.resume() - } - } - group.addTask { - try await Task.sleep(for: timeout) - throw CancellationError() - } - try await group.next() - group.cancelAll() - } - } - - /// Waits for the specified number of received messages - func waitForReceivedMessages(count: Int, timeout: Duration = .seconds(2)) async throws { - let isAlreadySatisfied = withLock { () -> Bool in - if _receivedMessages.count >= count { - return true - } - expectedReceivedMessageCount = count - return false - } - if isAlreadySatisfied { - return - } - - try await withThrowingTaskGroup(of: Void.self) { group in - group.addTask { - // withCheckedContinuation itself is not cancellable, so hook - // group.cancelAll() to resume the parked continuation — - // otherwise a timeout leaves the group awaiting this child - // forever and the test run hangs instead of failing. - await withTaskCancellationHandler { - await withCheckedContinuation { continuation in - let shouldResumeImmediately = self.withLock { - // Recheck count after acquiring lock to avoid race condition - // where message arrives between initial check and continuation install - if self._receivedMessages.count >= count { - return true - } - self.receivedMessageContinuation = continuation - return false - } - if shouldResumeImmediately { - continuation.resume() - } - } - } onCancel: { - let continuation = self.withLock { - let parked = self.receivedMessageContinuation - self.receivedMessageContinuation = nil - return parked - } - continuation?.resume() - } - } - group.addTask { - try await Task.sleep(for: timeout) - throw CancellationError() - } - try await group.next() - group.cancelAll() - } + withLock { _publicMessages.append((peerID, nickname, content)) } } func didConnectToPeer(_ peerID: PeerID) {} diff --git a/bitchatTests/GeoChannelCoordinatorContextTests.swift b/bitchatTests/GeoChannelCoordinatorContextTests.swift index 271ff402..ac6b135f 100644 --- a/bitchatTests/GeoChannelCoordinatorContextTests.swift +++ b/bitchatTests/GeoChannelCoordinatorContextTests.swift @@ -41,12 +41,17 @@ private final class StubLocationManaging: LocationStateManaging { weak var delegate: CLLocationManagerDelegate? var desiredAccuracy: CLLocationAccuracy = 0 var distanceFilter: CLLocationDistance = 0 - var authorizationStatus: CLAuthorizationStatus = .denied + var authorizationStatus: CLAuthorizationStatus + private(set) var stopUpdatingLocationCallCount = 0 + + init(authorizationStatus: CLAuthorizationStatus = .denied) { + self.authorizationStatus = authorizationStatus + } func requestWhenInUseAuthorization() {} func requestLocation() {} func startUpdatingLocation() {} - func stopUpdatingLocation() {} + func stopUpdatingLocation() { stopUpdatingLocationCallCount += 1 } } private final class StubLocationGeocoder: LocationStateGeocoding { @@ -62,7 +67,11 @@ private final class StubLocationGeocoder: LocationStateGeocoding { // MARK: - Helpers @MainActor -private func makeLocationManager(storage: UserDefaults? = nil) -> LocationStateManager { +private func makeLocationManager( + storage: UserDefaults? = nil, + authorizationStatus: CLAuthorizationStatus = .denied, + shouldInitializeCoreLocation: Bool = false +) -> LocationStateManager { let suiteName = "GeoChannelCoordinatorContextTests-\(UUID().uuidString)" let defaults = storage ?? UserDefaults(suiteName: suiteName)! if storage == nil { @@ -70,9 +79,9 @@ private func makeLocationManager(storage: UserDefaults? = nil) -> LocationStateM } return LocationStateManager( storage: defaults, - locationManager: StubLocationManaging(), + locationManager: StubLocationManaging(authorizationStatus: authorizationStatus), geocoder: StubLocationGeocoder(), - shouldInitializeCoreLocation: false + shouldInitializeCoreLocation: shouldInitializeCoreLocation ) } @@ -172,14 +181,21 @@ struct GeoChannelCoordinatorContextTests { @Test @MainActor func buildingCellJoinsSamplingOnlyAfterNotesReveal() async { TorManager.shared.setAppForeground(true) - let locationManager = makeLocationManager() + let locationManager = makeLocationManager( + authorizationStatus: .authorizedAlways, + shouldInitializeCoreLocation: true + ) + #expect(await waitUntil { locationManager.permissionState == .authorized }) let context = MockGeoChannelContext() let revealed = CurrentValueSubject(false) + let notesEnabled = CurrentValueSubject(true) let coordinator = GeoChannelCoordinator( locationManager: locationManager, bookmarksStore: locationManager, torManager: TorManager.shared, notesRevealed: revealed.eraseToAnyPublisher(), + locationNotesEnabled: true, + locationNotesSettings: notesEnabled.eraseToAnyPublisher(), context: context ) defer { withExtendedLifetime(coordinator) {} } @@ -205,13 +221,66 @@ struct GeoChannelCoordinatorContextTests { revealed.send(true) #expect(await waitUntil { context.beginSamplingCalls.last?.contains(building) == true }) #expect(context.beginSamplingCalls.last?.count == GeohashChannelLevel.allCases.count) + + // The app-info kill switch must narrow the already-live sampling set + // immediately, without waiting for another location update. + notesEnabled.send(false) + #expect(await waitUntil { + context.beginSamplingCalls.last?.contains(building) == false && + context.beginSamplingCalls.last?.count == GeohashChannelLevel.allCases.count - 1 + }) + } + + @Test @MainActor + func permissionRevocationEndsCachedRegionalSampling_butBookmarksRemainEligible() async { + TorManager.shared.setAppForeground(true) + let locationManager = makeLocationManager( + authorizationStatus: .authorizedAlways, + shouldInitializeCoreLocation: true + ) + #expect(await waitUntil { locationManager.permissionState == .authorized }) + let context = MockGeoChannelContext() + let revealed = CurrentValueSubject(true) + let coordinator = GeoChannelCoordinator( + locationManager: locationManager, + bookmarksStore: locationManager, + torManager: TorManager.shared, + notesRevealed: revealed.eraseToAnyPublisher(), + locationNotesEnabled: true, + locationNotesSettings: Empty().eraseToAnyPublisher(), + context: context + ) + defer { withExtendedLifetime(coordinator) {} } + + locationManager.locationManager( + CLLocationManager(), + didUpdateLocations: [CLLocation(latitude: 21.2850, longitude: -157.8357)] + ) + #expect(await waitUntil { + context.beginSamplingCalls.last?.count == GeohashChannelLevel.allCases.count + }) + let cachedChannels = locationManager.availableChannels + let endCountBeforeRevocation = context.endSamplingCount + + locationManager.locationManager(CLLocationManager(), didChangeAuthorization: .denied) + + #expect(await waitUntil { + locationManager.permissionState == .denied && + context.endSamplingCount > endCountBeforeRevocation + }) + #expect(locationManager.availableChannels == cachedChannels) + + // A bookmark is an explicit remote scope and does not derive from + // the now-revoked device location. + locationManager.addBookmark("u4pru") + #expect(await waitUntil { context.beginSamplingCalls.last == ["u4pru"] }) } @Test @MainActor func releasedContext_isHeldWeaklyAndSafelyIgnored() async { let locationManager = makeLocationManager() var context: MockGeoChannelContext? = MockGeoChannelContext() - weak var weakContext = context + let weakContext = { [weak context] in context } let coordinator = GeoChannelCoordinator( locationManager: locationManager, bookmarksStore: locationManager, @@ -223,7 +292,7 @@ struct GeoChannelCoordinatorContextTests { // The coordinator must not keep the owner alive (it is owned by it). context = nil - #expect(weakContext == nil) + #expect(weakContext() == nil) // Events after the owner is gone are safely dropped. locationManager.select(.location(GeohashChannel(level: .city, geohash: "u4pru"))) diff --git a/bitchatTests/MessageDeduplicationServiceTests.swift b/bitchatTests/MessageDeduplicationServiceTests.swift index 251fe808..971c17f0 100644 --- a/bitchatTests/MessageDeduplicationServiceTests.swift +++ b/bitchatTests/MessageDeduplicationServiceTests.swift @@ -312,6 +312,30 @@ struct MessageDeduplicationServiceTests { #expect(service.contentTimestamp(forKey: key) == now) } + @Test func forgetContent_allowsAuthenticatedReplacementThroughNextBatch() { + let service = MessageDeduplicationService(contentCapacity: 100, nostrEventCapacity: 100) + let content = "bridge alias payload" + let timestamp = Date() + service.recordContent(content, timestamp: timestamp) + + service.forgetContent(content, ifRecordedAt: timestamp) + + #expect(service.contentTimestamp(for: content) == nil) + } + + @Test func forgetContent_doesNotEraseNewerSameContentMarker() { + let service = MessageDeduplicationService(contentCapacity: 100, nostrEventCapacity: 100) + let content = "repeated payload" + let old = Date(timeIntervalSince1970: 1_000) + let newer = Date(timeIntervalSince1970: 2_000) + service.recordContent(content, timestamp: old) + service.recordContent(content, timestamp: newer) + + service.forgetContent(content, ifRecordedAt: old) + + #expect(service.contentTimestamp(for: content) == newer) + } + @Test func normalizedContentKey_consistentWithNormalizer() { let service = MessageDeduplicationService(contentCapacity: 100, nostrEventCapacity: 100) let content = "Hello World" diff --git a/bitchatTests/Mocks/MockKeychain.swift b/bitchatTests/Mocks/MockKeychain.swift index cb974bae..c12f2109 100644 --- a/bitchatTests/Mocks/MockKeychain.swift +++ b/bitchatTests/Mocks/MockKeychain.swift @@ -17,6 +17,7 @@ final class MockKeychain: KeychainManagerProtocol { // BCH-01-009: Configurable error simulation for testing var simulatedReadError: KeychainReadResult? var simulatedSaveError: KeychainSaveResult? + var simulatedGenericReadError: KeychainReadResult? func saveIdentityKey(_ keyData: Data, forKey key: String) -> Bool { storage[key] = keyData @@ -82,6 +83,16 @@ final class MockKeychain: KeychainManagerProtocol { serviceStorage[service]?[key] } + func loadWithResult(key: String, service: String) -> KeychainReadResult { + if let simulatedGenericReadError { + return simulatedGenericReadError + } + if let data = serviceStorage[service]?[key] { + return .success(data) + } + return .itemNotFound + } + func delete(key: String, service: String) { serviceStorage[service]?.removeValue(forKey: key) } diff --git a/bitchatTests/NearbyNotesCounterTests.swift b/bitchatTests/NearbyNotesCounterTests.swift index 36a31a61..b1036778 100644 --- a/bitchatTests/NearbyNotesCounterTests.swift +++ b/bitchatTests/NearbyNotesCounterTests.swift @@ -91,6 +91,62 @@ final class NearbyNotesCounterTests: XCTestCase { XCTAssertEqual(counter.noteCount, 0) } + func test_permissionRevocation_releasesBuildingSubscriptionDespiteCachedChannels() async throws { + let relays = SubscriptionRecorder() + let locationManager = try await makeAuthorizedLocationManager() + let counter = NearbyNotesCounter( + locationManager: locationManager, + managerFactory: { LocationNotesManager(geohash: $0, dependencies: relays.dependencies) }, + releaseManager: { $0?.cancel() } + ) + + counter.activate() + counter.reveal() + XCTAssertEqual(relays.subscribeCount, 1) + + locationManager.locationManager(CLLocationManager(), didChangeAuthorization: .denied) + + let denied = await waitUntil { locationManager.permissionState == .denied } + XCTAssertTrue(denied) + let released = await waitUntil { relays.unsubscribeCount == 1 } + XCTAssertTrue(released) + XCTAssertTrue( + locationManager.availableChannels.contains { $0.level == .building }, + "the privacy boundary must not depend on cached channels being cleared" + ) + XCTAssertEqual(counter.noteCount, 0) + + counter.deactivate() + XCTAssertEqual(relays.unsubscribeCount, 1, "revocation already released the manager") + } + + func test_locationNotesKillSwitch_releasesAndCanReacquireBuildingSubscription() async throws { + let relays = SubscriptionRecorder() + let locationManager = try await makeAuthorizedLocationManager() + let counter = NearbyNotesCounter( + locationManager: locationManager, + managerFactory: { LocationNotesManager(geohash: $0, dependencies: relays.dependencies) }, + releaseManager: { $0?.cancel() } + ) + + counter.activate() + counter.reveal() + XCTAssertEqual(relays.subscribeCount, 1) + + LocationNotesSettings.enabled = false + + let released = await waitUntil { relays.unsubscribeCount == 1 } + XCTAssertTrue(released) + XCTAssertEqual(counter.noteCount, 0) + + LocationNotesSettings.enabled = true + + let reacquired = await waitUntil { relays.subscribeCount == 2 } + XCTAssertTrue(reacquired) + counter.deactivate() + XCTAssertEqual(relays.unsubscribeCount, 2) + } + func test_checkNotesHint_requiresAuthorizedLocationPermission() { let relays = SubscriptionRecorder() let counter = NearbyNotesCounter( @@ -127,6 +183,107 @@ final class NearbyNotesCounterTests: XCTestCase { XCTAssertFalse(NoticesView.revealsNearbyNotes(onSwitchingTo: .mesh, geoGeohash: "u4pruydq")) } + func test_noticesGeoPresentation_disabledOverridesSelectedScopeAndHidesOnlyGeoComposer() { + XCTAssertEqual( + NoticesView.geoPresentationState(notesEnabled: false, geohash: "9q8yyk8y"), + .disabled, + "a selected remote channel must not leave a blank manager-less notes view" + ) + XCTAssertNil( + NoticesView.composerGeohash( + tab: .geo, + notesEnabled: false, + geoGeohash: "9q8yyk8y" + ), + "the dead geo composer must be hidden while the notes kill switch is off" + ) + XCTAssertEqual( + NoticesView.composerGeohash(tab: .mesh, notesEnabled: false, geoGeohash: nil), + "", + "the location-notes setting must not disable mesh notices" + ) + } + + func test_noticesGeoSession_revocationEndsLiveRefreshAndReleasesDeviceScope() { + let relays = SubscriptionRecorder() + let manager = LocationNotesManager(geohash: "u4pruydq", dependencies: relays.dependencies) + var beginCount = 0 + var endCount = 0 + var releaseCount = 0 + + let next = NoticesView.reconcileGeoSession( + tab: .geo, + needsDeviceLocation: true, + permissionState: .denied, + notesEnabled: true, + geohash: "u4pruydq", + manager: manager, + ownsLiveRefresh: true, + beginLiveRefresh: { beginCount += 1 }, + endLiveRefresh: { endCount += 1 }, + acquire: { _ in XCTFail("revocation must not acquire"); return manager }, + release: { + releaseCount += 1 + $0?.cancel() + } + ) + + XCTAssertNil(next.manager) + XCTAssertFalse(next.ownsLiveRefresh) + XCTAssertEqual(beginCount, 0) + XCTAssertEqual(endCount, 1) + XCTAssertEqual(releaseCount, 1) + XCTAssertEqual(relays.unsubscribeCount, 1) + } + + func test_noticesGeoSession_killSwitchClosesLocalScope_butDeniedRemoteScopeRemainsUsable() { + let relays = SubscriptionRecorder() + let localManager = LocationNotesManager(geohash: "u4pruydq", dependencies: relays.dependencies) + var endCount = 0 + var releaseCount = 0 + + let disabled = NoticesView.reconcileGeoSession( + tab: .geo, + needsDeviceLocation: true, + permissionState: .authorized, + notesEnabled: false, + geohash: "u4pruydq", + manager: localManager, + ownsLiveRefresh: true, + beginLiveRefresh: {}, + endLiveRefresh: { endCount += 1 }, + acquire: { _ in XCTFail("disabled notes must not acquire"); return localManager }, + release: { + releaseCount += 1 + $0?.cancel() + } + ) + + XCTAssertNil(disabled.manager) + XCTAssertFalse(disabled.ownsLiveRefresh) + XCTAssertEqual(endCount, 1) + XCTAssertEqual(releaseCount, 1) + + let remoteManager = LocationNotesManager(geohash: "9q8yyk8y", dependencies: relays.dependencies) + let remote = NoticesView.reconcileGeoSession( + tab: .geo, + needsDeviceLocation: false, + permissionState: .denied, + notesEnabled: true, + geohash: "9q8yyk8y", + manager: remoteManager, + ownsLiveRefresh: false, + beginLiveRefresh: {}, + endLiveRefresh: { endCount += 1 }, + acquire: { _ in XCTFail("matching remote manager should be reused"); return remoteManager }, + release: { _ in XCTFail("device permission must not release an explicit remote scope") } + ) + + XCTAssertTrue(remote.manager === remoteManager) + XCTAssertFalse(remote.ownsLiveRefresh) + XCTAssertEqual(endCount, 1) + } + func test_pool_sharesOneManagerPerGeohash_andCancelsOnLastRelease() { let relays = SubscriptionRecorder() let pool = LocationNotesPool( diff --git a/bitchatTests/NoiseEncryptionTests.swift b/bitchatTests/NoiseEncryptionTests.swift index 66996dfc..a1cb5780 100644 --- a/bitchatTests/NoiseEncryptionTests.swift +++ b/bitchatTests/NoiseEncryptionTests.swift @@ -70,7 +70,7 @@ struct NoiseEncryptionTests { } } -// TODO: Reuse +// Local error type for the keychain failure cases in this suite. private struct KeychainTestError: Error, CustomStringConvertible { let message: String init(_ message: String) { self.message = message } diff --git a/bitchatTests/PTTBurstPlayerTests.swift b/bitchatTests/PTTBurstPlayerTests.swift new file mode 100644 index 00000000..00881f75 --- /dev/null +++ b/bitchatTests/PTTBurstPlayerTests.swift @@ -0,0 +1,470 @@ +// +// PTTBurstPlayerTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import AVFoundation +import Foundation +@testable import bitchat + +/// Thread-safe: the coordinator invokes it on its private serial queue. +private final class StubAudioSession: SessionApplying, @unchecked Sendable { + private let lock = NSLock() + private var _setCategoryError: Error? + + var setCategoryError: Error? { + get { lock.withLock { _setCategoryError } } + set { lock.withLock { _setCategoryError = newValue } } + } + + func setCategory(_ category: AudioSessionCoordinator.Category) throws { + try lock.withLock { + if let error = _setCategoryError { + _setCategoryError = nil + throw error + } + } + } + + func setActive(_ active: Bool, notifyOthersOnDeactivation: Bool) throws {} +} + +private struct StubSessionError: Error {} + +private final class StubExclusivePlayback: ExclusivePlayback { + private(set) var pauseCount = 0 + + func pauseForExclusivity() { + pauseCount += 1 + } +} + +/// Blocks activation until released, so a test can land events inside the +/// window where the (off-main) session acquire is still in flight. +private final class GatedAudioSession: SessionApplying, @unchecked Sendable { + private let gate = DispatchSemaphore(value: 0) + private let lock = NSLock() + private var _categoryCallCount = 0 + private var _activationCalls: [Bool] = [] + + /// Non-zero once the acquire has reached the session queue (setCategory + /// runs just before the gated setActive). + var categoryCallCount: Int { lock.withLock { _categoryCallCount } } + var activationCalls: [Bool] { lock.withLock { _activationCalls } } + + func open() { gate.signal() } + + func setCategory(_ category: AudioSessionCoordinator.Category) throws { + lock.withLock { _categoryCallCount += 1 } + } + + func setActive(_ active: Bool, notifyOthersOnDeactivation: Bool) throws { + if active { gate.wait() } + lock.withLock { _activationCalls.append(active) } + } +} + +@MainActor +private final class MockPlaybackEngine: PTTPlaybackEngine { + private(set) var startCount = 0 + private(set) var stopCount = 0 + private(set) var scheduledBuffers: [AVAudioPCMBuffer] = [] + private struct HeldCompletion { + let type: PTTPlaybackCompletionType + let callback: @Sendable (PTTPlaybackCompletionEvent) -> Void + } + private var heldCompletions: [HeldCompletion] = [] + private(set) var requestedCompletionTypes: [PTTPlaybackCompletionType] = [] + var startError: Error? + + // No object -> the player registers no configuration-change observer. + var configChangeObject: AnyObject? { nil } + + func start() throws { + if let error = startError { throw error } + startCount += 1 + } + + func play() {} + + func stop() { + stopCount += 1 + } + + func schedule( + _ buffer: AVAudioPCMBuffer, + completionType: PTTPlaybackCompletionType, + completionHandler: @escaping @Sendable (PTTPlaybackCompletionEvent) -> Void + ) { + // Completions are held, not fired automatically: most tests exercise + // lifecycle, not drain-out. The mock models the important distinction + // between the node consuming bytes and audio actually playing out. + scheduledBuffers.append(buffer) + requestedCompletionTypes.append(completionType) + heldCompletions.append(HeldCompletion(type: completionType, callback: completionHandler)) + } + + /// Advances the node only to the point where it has consumed each + /// buffer. A `.dataPlayedBack` request must remain pending here. + func fireDataConsumedCallbacks() { + for completion in heldCompletions { + completion.callback(.dataConsumed) + } + } + + /// Advances all scheduled audio through audible playback. + func fireDataPlayedBackCallbacks() { + let completions = heldCompletions + heldCompletions = [] + for completion in completions { + completion.callback(.dataPlayedBack) + } + } + + /// Models AVAudioPlayerNode flushing its callbacks because an external + /// engine reconfiguration stopped the node before MainActor rebuilt it. + func firePlaybackStoppedCallbacks() { + let completions = heldCompletions + heldCompletions = [] + for completion in completions { + completion.callback(.playbackStopped) + } + } + + /// Plays only the oldest scheduled buffer, leaving the rest as an + /// audible tail that an engine rebuild must preserve. + func fireNextDataPlayedBackCallback() { + guard let index = heldCompletions.firstIndex(where: { $0.type == .dataPlayedBack }) else { return } + let completion = heldCompletions.remove(at: index) + completion.callback(.dataPlayedBack) + } +} + +@MainActor +struct PTTBurstPlayerTests { + private func makePlayer( + coordinator: AudioSessionCoordinator + ) throws -> (player: PTTBurstPlayer, engines: () -> [MockPlaybackEngine]) { + final class EngineBox { var engines: [MockPlaybackEngine] = [] } + let box = EngineBox() + // Fresh exclusivity slot: parallel tests must not steal this player's + // app-wide playback slot mid-test (the async session acquire opens + // suspension windows the old synchronous start never had). + let player = try #require(PTTBurstPlayer( + coordinator: coordinator, + exclusivity: VoiceNotePlaybackCoordinator(), + makeEngine: { + let engine = MockPlaybackEngine() + box.engines.append(engine) + return engine + } + )) + return (player, { box.engines }) + } + + /// Enough encoded audio to cross `TransportConfig.pttJitterBufferSeconds` + /// so playback starts without waiting for the deadline task. + private func encodeSineFrames(seconds: Double = 1.0) throws -> [Data] { + let encoder = try #require(PTTFrameEncoder()) + let format = try #require(PTTAudioFormat.pcmFormat) + let totalFrames = AVAudioFrameCount(seconds * PTTAudioFormat.sampleRate) + let buffer = try #require(AVAudioPCMBuffer(pcmFormat: format, frameCapacity: totalFrames)) + buffer.frameLength = totalFrames + let channel = try #require(buffer.floatChannelData?[0]) + for i in 0.. Bool, + sourceLocation: SourceLocation = #_sourceLocation + ) async { + let deadline = ContinuousClock.now.advanced(by: .seconds(5)) + while !condition(), ContinuousClock.now < deadline { + await Task.yield() + try? await Task.sleep(nanoseconds: 1_000_000) + } + #expect(condition(), sourceLocation: sourceLocation) + } + + // MARK: - Talk-over (bidirectional) + + @Test func burstDrainWaitsForAudiblePlaybackNotDataConsumption() async throws { + let coordinator = AudioSessionCoordinator(session: StubAudioSession()) + let (player, engines) = try makePlayer(coordinator: coordinator) + + player.enqueue(try encodeSineFrames()) + await waitUntil { player.isPlaying } + let engine = try #require(engines().first) + #expect(engine.requestedCompletionTypes.allSatisfy { $0 == .dataPlayedBack }) + + player.finishAfterDrain() + engine.fireDataConsumedCallbacks() + await Task.yield() + #expect(!player.stopped) + #expect(player.isPlaying) + + engine.fireDataPlayedBackCallbacks() + await waitUntil { player.stopped } + #expect(!player.isPlaying) + } + + @Test func olderPTTSessionAcquireCannotStealNewerPlaybackReservation() async throws { + let session = GatedAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + let exclusivity = VoiceNotePlaybackCoordinator() + final class EngineBox { var engines: [MockPlaybackEngine] = [] } + let box = EngineBox() + let player = try #require(PTTBurstPlayer( + coordinator: coordinator, + exclusivity: exclusivity, + makeEngine: { + let engine = MockPlaybackEngine() + box.engines.append(engine) + return engine + } + )) + + player.enqueue(try encodeSineFrames()) + await waitUntil { session.categoryCallCount == 1 } + + // A user taps a voice note while the older inbound burst is blocked + // in audio-session activation. Its immediate play intent is newer. + let voiceNote = StubExclusivePlayback() + exclusivity.activate(voiceNote) + session.open() + + await waitUntil { player.stopped } + #expect(box.engines.count == 1) + #expect(box.engines[0].startCount == 0) + #expect(voiceNote.pauseCount == 0) + #expect(!player.isPlaying) + } + + @Test func categoryEscalationRestartsEngineAndKeepsStreaming() async throws { + let coordinator = AudioSessionCoordinator(session: StubAudioSession()) + let (player, engines) = try makePlayer(coordinator: coordinator) + + let frames = try encodeSineFrames() + player.enqueue(frames) + await waitUntil { player.isPlaying } + #expect(engines().count == 1) + #expect(engines()[0].startCount == 1) + #expect(!engines()[0].scheduledBuffers.isEmpty) + + // Push-to-talk pressed while the burst plays: capture escalates the + // session category. The playback engine must restart under the new + // configuration, not die. (Escalation fan-out is delivered before + // acquire returns, so no waiting is needed here.) + let capture = try await coordinator.acquire(.capture) {} + #expect(engines().count == 2) + #expect(engines()[0].stopCount == 1) + #expect(engines()[1].startCount == 1) + #expect(player.isPlaying) + + // Frames arriving after the restart keep playing on the new engine. + player.enqueue(frames) + #expect(!engines()[1].scheduledBuffers.isEmpty) + + coordinator.release(capture) + player.stop() + #expect(!player.isPlaying) + } + + @Test func categoryEscalationReplaysOnlyUnfinishedTailAfterBurstEnd() async throws { + let coordinator = AudioSessionCoordinator(session: StubAudioSession()) + let (player, engines) = try makePlayer(coordinator: coordinator) + + let frames = try encodeSineFrames() + player.enqueue(frames) + await waitUntil { player.isPlaying } + + let originalEngine = engines()[0] + let originallyScheduled = originalEngine.scheduledBuffers.count + try #require(originallyScheduled > 1) + + // One buffer has played, but deliberately do not yield for its + // MainActor completion task. The completion latch itself must keep + // the rebuild from replaying this already-completed prefix. + originalEngine.fireNextDataPlayedBackCallback() + player.finishAfterDrain() + + // A real AVAudioPlayerNode also invokes requested callbacks when its + // engine is stopped by a configuration change. Those callbacks must + // leave the unheard tail pending for the fresh engine. + originalEngine.firePlaybackStoppedCallbacks() + + // Capture joins after END while the remaining tail is still handed + // to the old engine. The fresh engine must replay that tail instead + // of looking empty and stopping immediately. + let capture = try await coordinator.acquire(.capture) {} + try #require(engines().count == 2) + let restartedEngine = engines()[1] + #expect(restartedEngine.scheduledBuffers.count == originallyScheduled - 1) + #expect(player.isPlaying) + #expect(!player.stopped) + + // Only the fresh engine's audible completions may stop this finished + // burst; the stop callbacks above did not drain it. + #expect(player.isPlaying) + #expect(!player.stopped) + + restartedEngine.fireDataPlayedBackCallbacks() + await waitUntil { player.stopped } + #expect(!player.isPlaying) + + coordinator.release(capture) + } + + @Test func realInterruptionStillStopsPlayback() async throws { + let coordinator = AudioSessionCoordinator(session: StubAudioSession()) + let (player, engines) = try makePlayer(coordinator: coordinator) + + let frames = try encodeSineFrames() + player.enqueue(frames) + await waitUntil { player.isPlaying } + + // A system interruption (phone call) is not an escalation: stop. + await coordinator.handleInterruptionBegan() + #expect(!player.isPlaying) + #expect(engines().count == 1) + #expect(engines()[0].stopCount == 1) + + // A stopped burst stays stopped. + let before = engines()[0].scheduledBuffers.count + player.enqueue(frames) + #expect(engines()[0].scheduledBuffers.count == before) + } + + // MARK: - Burst END racing the async session acquire + + /// Models production ownership (`ChatLiveVoiceCoordinator.finalize`): the + /// assembly — the player's sole strong owner — is discarded on burst END, + /// and only the parked draining reference keeps the player alive. The + /// audio must still play out and the session token must come back once + /// the drain finishes. + @Test func burstEndDuringSessionAcquireStillPlaysWithOnlyDrainOwner() async throws { + let session = GatedAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + final class EngineBox { var engines: [MockPlaybackEngine] = [] } + let box = EngineBox() + var owner: PTTBurstPlayer? = PTTBurstPlayer( + coordinator: coordinator, + exclusivity: VoiceNotePlaybackCoordinator(), + makeEngine: { + let engine = MockPlaybackEngine() + box.engines.append(engine) + return engine + } + ) + try #require(owner != nil) + let weakPlayer = { [weak owner] in owner } + + let frames = try encodeSineFrames() + owner?.enqueue(frames) + // END lands while activation is still blocked on the session queue. + // With nothing scheduled yet, the drain check must not mistake the + // not-yet-started burst for a played-out one and drop all its audio. + var draining: PTTBurstPlayer? = owner + owner?.onStopped = { draining = nil } + owner?.finishAfterDrain() + #expect(owner?.stopped == false) + owner = nil + + session.open() + await waitUntil { weakPlayer()?.isPlaying == true } + #expect(box.engines.count == 1) + #expect(box.engines[0].startCount == 1) + #expect(!box.engines[0].scheduledBuffers.isEmpty) + + // Play the tail out: the drain must stop the player, hand the token + // back (deactivation reaches the mock), and unpark the drain owner. + box.engines[0].fireDataPlayedBackCallbacks() + await waitUntil { session.activationCalls == [true, false] } + #expect(draining == nil) + #expect(weakPlayer() == nil) + } + + /// Backstop: if every owner drops the player before it stopped, `deinit` + /// must hand the registered session token back — the coordinator retains + /// tokens strongly, so a leaked one would keep the session active (and + /// pin any escalated category) for the app's lifetime. + @Test func ownerlessPlayerDeinitReleasesSessionToken() async throws { + let session = GatedAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + var player: PTTBurstPlayer? = PTTBurstPlayer( + coordinator: coordinator, + exclusivity: VoiceNotePlaybackCoordinator(), + makeEngine: { MockPlaybackEngine() } + ) + try #require(player != nil) + + let frames = try encodeSineFrames() + player?.enqueue(frames) + // Make sure the acquire is in flight (holding the player alive + // through its call frame) before the last external reference drops. + await waitUntil { session.categoryCallCount == 1 } + player?.finishAfterDrain() + player = nil + + session.open() + // The acquire task keeps the player alive just long enough to start; + // when it deallocates, deinit must release the freshly stored token. + await waitUntil { session.activationCalls == [true, false] } + } + + // MARK: - Session acquire failure + + @Test func sessionAcquireFailureDoesNotStartUnregisteredPlayback() async throws { + let session = StubAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + let (player, engines) = try makePlayer(coordinator: coordinator) + + // Playing without a registered holder would leave the engine exposed + // to another holder's last-release deactivating the session under it. + session.setCategoryError = StubSessionError() + let frames = try encodeSineFrames() + player.enqueue(frames) + await waitUntil { player.stopped } + + #expect(engines().count == 1) + #expect(engines()[0].startCount == 0) + #expect(!player.isPlaying) + + // The failed start latched the player off; later frames are ignored. + player.enqueue(frames) + #expect(engines()[0].scheduledBuffers.isEmpty) + #expect(!player.isPlaying) + } + + // MARK: - Engine start failure + + @Test func engineStartFailureRebuildsOnceBeforeGivingUp() async throws { + let coordinator = AudioSessionCoordinator(session: StubAudioSession()) + let (player, engines) = try makePlayer(coordinator: coordinator) + + // A capture racing the start can reconfigure the session while the + // engine spins up (its escalation fan-out no-ops on a never-started + // player): the player must rebuild once against the settled + // configuration instead of latching off. + engines()[0].startError = StubSessionError() + let frames = try encodeSineFrames() + player.enqueue(frames) + + await waitUntil { player.isPlaying } + #expect(engines().count == 2) + #expect(engines()[0].startCount == 0) + #expect(engines()[1].startCount == 1) + #expect(!engines()[1].scheduledBuffers.isEmpty) + player.stop() + } +} diff --git a/bitchatTests/Performance/PerformanceBaselineTests.swift b/bitchatTests/Performance/PerformanceBaselineTests.swift index 2b038b88..0cfb6f92 100644 --- a/bitchatTests/Performance/PerformanceBaselineTests.swift +++ b/bitchatTests/Performance/PerformanceBaselineTests.swift @@ -791,6 +791,10 @@ private final class PerfPipelineFixture { let identityManager = MockIdentityManager(keychain) let transport = MockTransport() let conversations = ConversationStore() + let locationSuite = "PerformanceBaselineTests.\(UUID().uuidString)" + let locationStorage = UserDefaults(suiteName: locationSuite) ?? .standard + locationStorage.removePersistentDomain(forName: locationSuite) + let locationManager = LocationChannelManager(storage: locationStorage) self.conversations = conversations self.viewModel = ChatViewModel( @@ -798,7 +802,8 @@ private final class PerfPipelineFixture { idBridge: idBridge, identityManager: identityManager, transport: transport, - conversations: conversations + conversations: conversations, + locationManager: locationManager ) self.privateInbox = PrivateInboxModel(conversations: conversations) self.publicChat = PublicChatModel(conversations: conversations) diff --git a/bitchatTests/Protocols/BridgeWireFormatTests.swift b/bitchatTests/Protocols/BridgeWireFormatTests.swift index d4eddd0c..1dc42e9a 100644 --- a/bitchatTests/Protocols/BridgeWireFormatTests.swift +++ b/bitchatTests/Protocols/BridgeWireFormatTests.swift @@ -186,7 +186,12 @@ struct CourierStoreBridgePublishTests { // eligible again after the cooldown. `carriedCount` publishes // asynchronously, so it is not asserted here.) - // Within cooldown: nothing to publish. + // Merely offering the envelope does not start the cooldown; a relay + // rejection/timeout must remain immediately retryable. + #expect(store.envelopesForBridgePublish(cooldown: 600).count == 1) + store.markBridgePublished(first[0]) + + // A confirmed publish starts the cooldown. #expect(store.envelopesForBridgePublish(cooldown: 600).isEmpty) // After cooldown: eligible again. diff --git a/bitchatTests/PublicMessagePipelineTests.swift b/bitchatTests/PublicMessagePipelineTests.swift index da26d80e..4ab270a4 100644 --- a/bitchatTests/PublicMessagePipelineTests.swift +++ b/bitchatTests/PublicMessagePipelineTests.swift @@ -128,4 +128,18 @@ struct PublicMessagePipelineTests { #expect(delegate.messages(in: .mesh).isEmpty) #expect(delegate.recordedContentKeys.isEmpty) } + + @Test @MainActor + func removeMessage_discardsBridgeAliasBeforeBatchFlush() { + let pipeline = PublicMessagePipeline() + let delegate = TestPipelineDelegate() + pipeline.delegate = delegate + + pipeline.enqueue(makeMessage(id: "bridge-event", content: "same radio payload", timestamp: Date()), to: .mesh) + pipeline.removeMessage(withID: "bridge-event") + pipeline.flushIfNeeded() + + #expect(delegate.committed.isEmpty) + #expect(delegate.recordedContentKeys.isEmpty) + } } diff --git a/bitchatTests/Services/BLEAnnounceThrottleTests.swift b/bitchatTests/Services/BLEAnnounceThrottleTests.swift index 3ca46203..96dde95c 100644 --- a/bitchatTests/Services/BLEAnnounceThrottleTests.swift +++ b/bitchatTests/Services/BLEAnnounceThrottleTests.swift @@ -45,7 +45,7 @@ struct BLEAnnounceThrottleTests { let now = Date(timeIntervalSince1970: 100) var throttle = BLEAnnounceThrottle(normalMinimumInterval: 10, forcedMinimumInterval: 2) - throttle.shouldSend(force: false, now: now) + _ = throttle.shouldSend(force: false, now: now) #expect(throttle.elapsed(since: now.addingTimeInterval(3)) == 3) } diff --git a/bitchatTests/Services/BLEOutboundFragmentTransferSchedulerTests.swift b/bitchatTests/Services/BLEOutboundFragmentTransferSchedulerTests.swift index c57c8922..722f3e33 100644 --- a/bitchatTests/Services/BLEOutboundFragmentTransferSchedulerTests.swift +++ b/bitchatTests/Services/BLEOutboundFragmentTransferSchedulerTests.swift @@ -44,6 +44,33 @@ struct BLEOutboundFragmentTransferSchedulerTests { } } + @Test + func strictDirectTransferIsRejectedWithoutBeingQueuedWhenSlotsAreFull() { + var scheduler = BLEOutboundFragmentTransferScheduler() + let active = makeRequest(type: MessageType.fileTransfer.rawValue, transferId: "active") + let strict = makeRequest( + type: MessageType.fileTransfer.rawValue, + transferId: "strict", + requireDirectPeerLink: true + ) + + guard case .start = scheduler.submit(active, maxConcurrentTransfers: 1) else { + Issue.record("Expected active transfer to reserve the only slot") + return + } + + let result = scheduler.submit(strict, maxConcurrentTransfers: 1) + + if case let .rejectedStrict(request, transferId) = result { + #expect(request.requireDirectPeerLink) + #expect(transferId == "strict") + #expect(scheduler.activeCount == 1) + #expect(scheduler.pendingCount == 0) + } else { + Issue.record("Expected strict transfer to reject instead of entering the pending queue") + } + } + @Test func submitQueuesDuplicateActiveTransferAtFront() { var scheduler = BLEOutboundFragmentTransferScheduler() @@ -240,7 +267,8 @@ struct BLEOutboundFragmentTransferSchedulerTests { type: UInt8, transferId: String?, payload: String? = nil, - directedPeer: PeerID? = nil + directedPeer: PeerID? = nil, + requireDirectPeerLink: Bool = false ) -> BLEOutboundFragmentTransferRequest { BLEOutboundFragmentTransferRequest( packet: BitchatPacket( @@ -255,7 +283,8 @@ struct BLEOutboundFragmentTransferSchedulerTests { pad: false, maxChunk: nil, directedPeer: directedPeer, - transferId: transferId + transferId: transferId, + requireDirectPeerLink: requireDirectPeerLink ) } } diff --git a/bitchatTests/Services/BLEOutboundLinkPlannerTests.swift b/bitchatTests/Services/BLEOutboundLinkPlannerTests.swift index 74bcb9ba..e57d0140 100644 --- a/bitchatTests/Services/BLEOutboundLinkPlannerTests.swift +++ b/bitchatTests/Services/BLEOutboundLinkPlannerTests.swift @@ -46,6 +46,33 @@ struct BLEOutboundLinkPlannerTests { ) #expect(plan.fragmentChunkSize == BLEOutboundPacketPolicy.fragmentChunkSize(forLinkLimit: smallestLimit)) + #expect(plan.selectedLinks.peripheralIDs == Set(["p1"])) + #expect(plan.selectedLinks.centralIDs == Set(["c1"])) + #expect(!plan.shouldSpoolDirectedPacket) + } + + @Test + func oversizedDirectedCourierDoesNotUseUnrelatedPeersMTUAsHandoffSuccess() { + let recipient = PeerID(str: "1122334455667788") + let unrelated = PeerID(str: "8877665544332211") + let packet = makePacket(type: .courierEnvelope, recipient: recipient) + + let plan = BLEOutboundLinkPlanner.plan( + packet: packet, + dataCount: 512, + peripheralIDs: ["unrelated-link"], + peripheralWriteLimits: [64], + centralIDs: [], + centralNotifyLimits: [], + ingressRecord: nil, + excludedLinks: [], + peripheralPeerBindings: ["unrelated-link": unrelated], + directedOnlyPeer: recipient, + requireDirectPeerLink: true + ) + + #expect(plan.directedPeerHint == recipient) + #expect(plan.fragmentChunkSize == nil) #expect(plan.selectedLinks.peripheralIDs.isEmpty) #expect(plan.selectedLinks.centralIDs.isEmpty) #expect(!plan.shouldSpoolDirectedPacket) @@ -93,6 +120,28 @@ struct BLEOutboundLinkPlannerTests { #expect(plan.shouldSpoolDirectedPacket) } + @Test + func bridgeCourierPacketDoesNotTurnProcessLocalSpoolIntoHandoffSuccess() { + let recipient = PeerID(str: "1122334455667788") + let packet = makePacket(type: .courierEnvelope, recipient: recipient) + + let plan = BLEOutboundLinkPlanner.plan( + packet: packet, + dataCount: 32, + peripheralIDs: [], + peripheralWriteLimits: [], + centralIDs: [], + centralNotifyLimits: [], + ingressRecord: nil, + excludedLinks: [], + directedOnlyPeer: recipient + ) + + #expect(plan.selectedLinks.peripheralIDs.isEmpty) + #expect(plan.selectedLinks.centralIDs.isEmpty) + #expect(!plan.shouldSpoolDirectedPacket) + } + @Test func publicBroadcastDoesNotSpoolWhenNoLinksAreAvailable() { let packet = makePacket(type: .message) diff --git a/bitchatTests/Services/BLEOutboundNotificationBufferTests.swift b/bitchatTests/Services/BLEOutboundNotificationBufferTests.swift index 4dced392..f440ba3c 100644 --- a/bitchatTests/Services/BLEOutboundNotificationBufferTests.swift +++ b/bitchatTests/Services/BLEOutboundNotificationBufferTests.swift @@ -67,4 +67,19 @@ struct BLEOutboundNotificationBufferTests { #expect(buffer.isEmpty) } + + @Test + func unsubscribeRemovesTargetSpecificCiphertextOnlyForThatCentral() { + var buffer = BLEOutboundNotificationBuffer() + _ = buffer.enqueue(data: Data([1]), targets: ["gone"], capCount: 4) + _ = buffer.enqueue(data: Data([2]), targets: ["gone", "live"], capCount: 4) + _ = buffer.enqueue(data: Data([3]), targets: nil, capCount: 4) + + buffer.removeTarget { $0 == "gone" } + let remaining = buffer.takeAll() + + #expect(remaining.map(\.data) == [Data([2]), Data([3])]) + #expect(remaining[0].targets == ["live"]) + #expect(remaining[1].targets == nil) + } } diff --git a/bitchatTests/Services/BLEOutboundWriteBufferTests.swift b/bitchatTests/Services/BLEOutboundWriteBufferTests.swift index f8e64080..801de777 100644 --- a/bitchatTests/Services/BLEOutboundWriteBufferTests.swift +++ b/bitchatTests/Services/BLEOutboundWriteBufferTests.swift @@ -72,4 +72,38 @@ struct BLEOutboundWriteBufferTests { #expect(buffer.peripheralIDs.isEmpty) } + + @Test + func acceptanceReportsWhenNewLowPriorityWriteIsTrimmed() { + var buffer = BLEOutboundWriteBuffer() + let peerID = "peer-1" + _ = buffer.enqueue( + data: Data(repeating: 0x01, count: 8), + for: peerID, + priority: .high, + capBytes: 8 + ) + + let attempt = buffer.enqueueReportingAcceptance( + data: Data(repeating: 0x02, count: 8), + for: peerID, + priority: .low, + capBytes: 8 + ) + + #expect(!attempt.accepted) + #expect(buffer.takeAll(for: peerID).compactMap(\.data.first) == [0x01]) + } + + @Test + func disconnectDiscardRemovesOnlyThatPeripheralQueue() { + var buffer = BLEOutboundWriteBuffer() + _ = buffer.enqueue(data: Data([1]), for: "gone", priority: .high, capBytes: 100) + _ = buffer.enqueue(data: Data([2]), for: "live", priority: .high, capBytes: 100) + + buffer.discardAll(for: "gone") + + #expect(buffer.takeAll(for: "gone").isEmpty) + #expect(buffer.takeAll(for: "live").map(\.data) == [Data([2])]) + } } diff --git a/bitchatTests/Services/BridgeCourierServiceTests.swift b/bitchatTests/Services/BridgeCourierServiceTests.swift index 7a71170e..6464c12b 100644 --- a/bitchatTests/Services/BridgeCourierServiceTests.swift +++ b/bitchatTests/Services/BridgeCourierServiceTests.swift @@ -25,6 +25,9 @@ struct BridgeCourierServiceTests { var held: [CourierEnvelope] = [] var sealResult: CourierEnvelope? var deliverResult = true + var openResult = true + /// nil leaves the simulated relay confirmation in flight. + var automaticPublishResult: Bool? = true private(set) var publishedEvents: [NostrEvent] = [] private(set) var openedSubscriptions: [[String]] = [] @@ -33,14 +36,28 @@ struct BridgeCourierServiceTests { private(set) var delivered: [(envelope: CourierEnvelope, peer: PeerID)] = [] private(set) var sealRequests: [(content: String, messageID: String, key: Data)] = [] private(set) var heldCooldowns: [TimeInterval] = [] + private(set) var markedHeldEnvelopes: [CourierEnvelope] = [] + private(set) var scheduledTimers: [(delay: TimeInterval, fire: @MainActor () -> Void)] = [] + private(set) var pendingPublishCompletions: [@MainActor (Bool) -> Void] = [] let service: BridgeCourierService - init(dedupStore: BridgeDropDedupStore? = nil) { - service = BridgeCourierService(dedupStore: dedupStore) + init(now: @escaping () -> Date = Date.init, dedupStore: BridgeDropDedupStore? = nil) { + service = BridgeCourierService(now: now, dedupStore: dedupStore) service.bridgeEnabled = { [weak self] in self?.bridgeOn ?? false } service.relaysConnected = { [weak self] in self?.relaysConnected ?? false } - service.publishEvent = { [weak self] event in self?.publishedEvents.append(event) } + service.publishEvent = { [weak self] event, completion in + guard let self else { + completion(false) + return + } + self.publishedEvents.append(event) + if let result = self.automaticPublishResult { + completion(result) + } else { + self.pendingPublishCompletions.append(completion) + } + } service.openSubscription = { [weak self] tags in self?.openedSubscriptions.append(tags) } service.closeSubscription = { [weak self] in self?.closedSubscriptions += 1 } service.myNoiseKey = { [weak self] in self?.myKey } @@ -49,7 +66,10 @@ struct BridgeCourierServiceTests { self?.sealRequests.append((content, messageID, key)) return self?.sealResult } - service.openEnvelope = { [weak self] envelope in self?.openedEnvelopes.append(envelope) } + service.openEnvelope = { [weak self] envelope in + self?.openedEnvelopes.append(envelope) + return self?.openResult ?? false + } service.deliverToPeer = { [weak self] envelope, peer in self?.delivered.append((envelope, peer)) return self?.deliverResult ?? false @@ -58,7 +78,17 @@ struct BridgeCourierServiceTests { self?.heldCooldowns.append(cooldown) return self?.held ?? [] } - service.scheduleTimer = { _, _ in } // timers driven manually + service.markHeldEnvelopePublished = { [weak self] envelope in + self?.markedHeldEnvelopes.append(envelope) + } + service.scheduleTimer = { [weak self] delay, fire in + self?.scheduledTimers.append((delay, fire)) + } + } + + func resolveNextPublish(_ succeeded: Bool) { + guard !pendingPublishCompletions.isEmpty else { return } + pendingPublishCompletions.removeFirst()(succeeded) } static func randomKey() -> Data { @@ -121,6 +151,115 @@ struct BridgeCourierServiceTests { #expect(fixture.sealRequests.isEmpty) } + @Test func missingRelayPublisherDoesNotConsumeDurableDedupSlot() { + let fixture = Fixture() + let key = Fixture.randomKey() + fixture.sealResult = makeEnvelope(recipientKey: key) + fixture.service.publishEvent = nil + let messageID = UUID().uuidString + var results: [Bool] = [] + + fixture.service.depositDrop(content: "retry", messageID: messageID, recipientNoiseKey: key) { results.append($0) } + fixture.service.depositDrop(content: "retry", messageID: messageID, recipientNoiseKey: key) { results.append($0) } + #expect(fixture.sealRequests.count == 2) + #expect(fixture.publishedEvents.isEmpty) + #expect(results == [false, false]) + } + + @Test func relayRejectionDoesNotPersistDedupAndRetryCanSucceed() { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("bridge-dedup-\(UUID().uuidString).json") + defer { try? FileManager.default.removeItem(at: fileURL) } + let key = Fixture.randomKey() + let messageID = UUID().uuidString + + let failed = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + failed.sealResult = makeEnvelope(recipientKey: key) + failed.automaticPublishResult = false + var failedResults: [Bool] = [] + failed.service.depositDrop(content: "retry", messageID: messageID, recipientNoiseKey: key) { + failedResults.append($0) + } + failed.service.flushDedupSnapshot() + #expect(failedResults == [false]) + #expect(failed.publishedEvents.count == 1) + + // A relaunch over the failed attempt must be allowed to send again. + let retry = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + retry.sealResult = makeEnvelope(recipientKey: key) + var retryResults: [Bool] = [] + retry.service.depositDrop(content: "retry", messageID: messageID, recipientNoiseKey: key) { + retryResults.append($0) + } + retry.service.flushDedupSnapshot() + #expect(retryResults == [true]) + #expect(retry.publishedEvents.count == 1) + + // Only confirmed relay acceptance consumes durable dedup. + let confirmed = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + confirmed.sealResult = makeEnvelope(recipientKey: key) + confirmed.service.depositDrop(content: "retry", messageID: messageID, recipientNoiseKey: key) + #expect(confirmed.publishedEvents.isEmpty) + #expect(confirmed.sealRequests.isEmpty) + } + + @Test func panicWipeInvalidatesInFlightPublishCompletion() throws { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("bridge-dedup-\(UUID().uuidString).json") + defer { try? FileManager.default.removeItem(at: fileURL) } + let key = Fixture.randomKey() + let messageID = UUID().uuidString + let fixture = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + fixture.sealResult = makeEnvelope(recipientKey: key) + fixture.automaticPublishResult = nil + var results: [Bool] = [] + + fixture.service.depositDrop(content: "in flight", messageID: messageID, recipientNoiseKey: key) { + results.append($0) + } + let staleCompletion = try #require(fixture.pendingPublishCompletions.first) + fixture.service.wipe() + #expect(results == [false]) + + // The pre-wipe relay completion cannot resurrect durable dedup or + // complete the caller a second time. + staleCompletion(true) + fixture.service.flushDedupSnapshot() + #expect(results == [false]) + + let relaunched = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) + relaunched.sealResult = makeEnvelope(recipientKey: key) + relaunched.service.depositDrop(content: "retry", messageID: messageID, recipientNoiseKey: key) + #expect(relaunched.publishedEvents.count == 1) + } + + @Test func bridgeDisableCancelsPendingAndInFlightPublishes() throws { + let fixture = Fixture() + let key = Fixture.randomKey() + fixture.sealResult = makeEnvelope(recipientKey: key) + fixture.automaticPublishResult = nil + var results: [Bool] = [] + + fixture.service.depositDrop(content: "in flight", messageID: "in-flight", recipientNoiseKey: key) { + results.append($0) + } + let staleCompletion = try #require(fixture.pendingPublishCompletions.first) + + fixture.relaysConnected = false + fixture.service.depositDrop(content: "pending", messageID: "pending", recipientNoiseKey: key) { + results.append($0) + } + #expect(fixture.service.pendingDrops.count == 1) + + fixture.bridgeOn = false + fixture.service.refresh() + #expect(results == [false, false]) + #expect(fixture.service.pendingDrops.isEmpty) + + staleCompletion(true) + #expect(results == [false, false]) + } + @Test func depositQueuesWithoutRelaysAndFlushesOnReconnect() { let fixture = Fixture() fixture.relaysConnected = false @@ -148,15 +287,18 @@ struct BridgeCourierServiceTests { fixture.sealResult = makeEnvelope(recipientKey: key) let firstID = UUID().uuidString - #expect(fixture.service.depositDrop(content: "0", messageID: firstID, recipientNoiseKey: key)) + var firstResults: [Bool] = [] + fixture.service.depositDrop(content: "0", messageID: firstID, recipientNoiseKey: key) { firstResults.append($0) } // Fill past capacity so the first drop is evicted. for i in 1...BridgeCourierService.Limits.maxPendingDrops { fixture.service.depositDrop(content: "\(i)", messageID: UUID().uuidString, recipientNoiseKey: key) } #expect(fixture.service.pendingDrops.count == BridgeCourierService.Limits.maxPendingDrops) + #expect(firstResults == [false]) // The evicted first drop is deposit-able again (slot released). - #expect(fixture.service.depositDrop(content: "0-retry", messageID: firstID, recipientNoiseKey: key)) + fixture.service.depositDrop(content: "0-retry", messageID: firstID, recipientNoiseKey: key) + #expect(fixture.service.pendingDrops.last?.dedupKey == firstID) } @Test func oversizeDropConsumesSlotInsteadOfChurning() { @@ -170,13 +312,45 @@ struct BridgeCourierServiceTests { ciphertext: Data(repeating: 7, count: BridgeCourierService.Limits.maxDropEnvelopeBytes + 1) ) let messageID = UUID().uuidString + var results: [Bool] = [] - #expect(!fixture.service.depositDrop(content: "big", messageID: messageID, recipientNoiseKey: key)) + fixture.service.depositDrop(content: "big", messageID: messageID, recipientNoiseKey: key) { results.append($0) } #expect(fixture.publishedEvents.isEmpty) // The retry sweep must not seal the same payload again. - #expect(!fixture.service.depositDrop(content: "big", messageID: messageID, recipientNoiseKey: key)) + fixture.service.depositDrop(content: "big", messageID: messageID, recipientNoiseKey: key) { results.append($0) } #expect(fixture.sealRequests.count == 1) + #expect(results == [false, false]) + } + + @Test func rejectedOversizeDropKeysExpireAndStayBounded() { + var date = Date(timeIntervalSince1970: 1_750_000_000) + let fixture = Fixture(now: { date }) + let key = Fixture.randomKey() + fixture.sealResult = makeEnvelope( + recipientKey: key, + ciphertext: Data(repeating: 7, count: BridgeCourierService.Limits.maxDropEnvelopeBytes + 1) + ) + + let firstID = "oversize-0" + fixture.service.depositDrop(content: "big", messageID: firstID, recipientNoiseKey: key) + for index in 1...BridgeCourierService.Limits.maxTrackedIDs { + date = date.addingTimeInterval(1) + fixture.service.depositDrop(content: "big", messageID: "oversize-\(index)", recipientNoiseKey: key) + } + let afterCapacityFill = fixture.sealRequests.count + date = date.addingTimeInterval(1) + fixture.service.depositDrop(content: "big", messageID: firstID, recipientNoiseKey: key) + #expect(fixture.sealRequests.count == afterCapacityFill + 1) + + let newestID = "oversize-\(BridgeCourierService.Limits.maxTrackedIDs)" + let beforeExpiry = fixture.sealRequests.count + fixture.service.depositDrop(content: "big", messageID: newestID, recipientNoiseKey: key) + #expect(fixture.sealRequests.count == beforeExpiry) + + date = date.addingTimeInterval(CourierEnvelope.maxLifetimeSeconds + 1) + fixture.service.depositDrop(content: "big", messageID: newestID, recipientNoiseKey: key) + #expect(fixture.sealRequests.count == beforeExpiry + 1) } @Test func publishedDropDedupSurvivesRelaunch() throws { @@ -192,8 +366,10 @@ struct BridgeCourierServiceTests { let fixture = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) fixture.sealResult = makeEnvelope(recipientKey: recipientKey) - #expect(fixture.service.depositDrop(content: "hello", messageID: messageID, recipientNoiseKey: recipientKey)) + var publishResults: [Bool] = [] + fixture.service.depositDrop(content: "hello", messageID: messageID, recipientNoiseKey: recipientKey) { publishResults.append($0) } #expect(fixture.publishedEvents.count == 1) + #expect(publishResults == [true]) // Persistence is coalesced; a real launch flushes within a second or // on backgrounding — tests flush explicitly. fixture.service.flushDedupSnapshot() @@ -202,9 +378,11 @@ struct BridgeCourierServiceTests { // publish the same message ID again (before even re-sealing it). let relaunched = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) relaunched.sealResult = makeEnvelope(recipientKey: recipientKey) - #expect(!relaunched.service.depositDrop(content: "hello", messageID: messageID, recipientNoiseKey: recipientKey)) + var relaunchResults: [Bool] = [] + relaunched.service.depositDrop(content: "hello", messageID: messageID, recipientNoiseKey: recipientKey) { relaunchResults.append($0) } #expect(relaunched.publishedEvents.isEmpty) #expect(relaunched.sealRequests.isEmpty) + #expect(relaunchResults == [false]) } @Test func seenDropEventDedupSurvivesRelaunch() throws { @@ -245,7 +423,7 @@ struct BridgeCourierServiceTests { let fixture = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) fixture.relaysConnected = false fixture.sealResult = makeEnvelope(recipientKey: recipientKey) - #expect(fixture.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey)) + fixture.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey) #expect(fixture.publishedEvents.isEmpty) // Even a flush while the drop is still pending must exclude its key. fixture.service.flushDedupSnapshot() @@ -253,7 +431,7 @@ struct BridgeCourierServiceTests { // "App killed before relays connected": pendingDrops were memory-only. let relaunched = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) relaunched.sealResult = makeEnvelope(recipientKey: recipientKey) - #expect(relaunched.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey)) + relaunched.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey) #expect(relaunched.publishedEvents.count == 1) } @@ -269,7 +447,7 @@ struct BridgeCourierServiceTests { let fixture = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) fixture.relaysConnected = false fixture.sealResult = makeEnvelope(recipientKey: recipientKey) - #expect(fixture.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey)) + fixture.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey) fixture.relaysConnected = true fixture.service.flushPendingDrops() #expect(fixture.publishedEvents.count == 1) @@ -277,8 +455,10 @@ struct BridgeCourierServiceTests { let relaunched = Fixture(dedupStore: BridgeDropDedupStore(fileURL: fileURL)) relaunched.sealResult = makeEnvelope(recipientKey: recipientKey) - #expect(!relaunched.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey)) + var relaunchResults: [Bool] = [] + relaunched.service.depositDrop(content: "later", messageID: messageID, recipientNoiseKey: recipientKey) { relaunchResults.append($0) } #expect(relaunched.publishedEvents.isEmpty) + #expect(relaunchResults == [false]) } @Test func failedGatewayHandoffReleasesSeenSlot() throws { @@ -307,6 +487,30 @@ struct BridgeCourierServiceTests { #expect(fixture.delivered.count == 2) } + @Test func staleWatchSetDeliveryIsNotConsumedBeforePeerBecomesCurrent() throws { + let fixture = Fixture() + let peerKey = Fixture.randomKey() + let peer = PeerID(str: "aabbccdd00112233") + let event = try makeDropEvent(for: makeEnvelope(recipientKey: peerKey)) + + // A callback from the previous relay subscription can land after its + // peer was removed from the bounded watch set. Ignore it without + // poisoning the persistent event-ID dedup record. + fixture.service.refresh() + fixture.service.handleDropEvent(event) + #expect(fixture.delivered.isEmpty) + + fixture.localPeers = [(peer, peerKey)] + fixture.service.refresh() + fixture.service.handleDropEvent(event) + #expect(fixture.delivered.count == 1) + + // Once the current peer's physical handoff succeeds, normal durable + // dedup applies. + fixture.service.handleDropEvent(event) + #expect(fixture.delivered.count == 1) + } + @Test func distinctDropsUseDistinctThrowawayKeys() { let fixture = Fixture() let keyA = Fixture.randomKey() @@ -328,6 +532,50 @@ struct BridgeCourierServiceTests { #expect(fixture.publishedEvents.count == 1) #expect(fixture.heldCooldowns == [BridgeCourierService.Limits.heldEnvelopePublishCooldown]) + #expect(fixture.markedHeldEnvelopes == fixture.held) + } + + @Test func rejectedHeldPublishDoesNotStartCooldown() { + let fixture = Fixture() + fixture.automaticPublishResult = false + fixture.held = [makeEnvelope(recipientKey: Fixture.randomKey())] + + fixture.service.publishHeldEnvelopes() + + #expect(fixture.publishedEvents.count == 1) + #expect(fixture.markedHeldEnvelopes.isEmpty) + } + + @Test func heldPublishIsSingleFlightAndRetryableAfterRejection() { + let fixture = Fixture() + fixture.automaticPublishResult = nil + fixture.held = [makeEnvelope(recipientKey: Fixture.randomKey())] + + fixture.service.publishHeldEnvelopes() + fixture.service.publishHeldEnvelopes() + #expect(fixture.publishedEvents.count == 1) + + fixture.resolveNextPublish(false) + fixture.service.publishHeldEnvelopes() + #expect(fixture.publishedEvents.count == 2) + #expect(fixture.markedHeldEnvelopes.isEmpty) + + fixture.resolveNextPublish(true) + #expect(fixture.markedHeldEnvelopes == fixture.held) + } + + @Test func bridgeDisableInvalidatesHeldPublishOperation() throws { + let fixture = Fixture() + fixture.automaticPublishResult = nil + fixture.held = [makeEnvelope(recipientKey: Fixture.randomKey())] + + fixture.service.publishHeldEnvelopes() + let staleCompletion = try #require(fixture.pendingPublishCompletions.first) + fixture.bridgeOn = false + fixture.service.refresh() + staleCompletion(true) + + #expect(fixture.markedHeldEnvelopes.isEmpty) } // MARK: - Subscription management @@ -364,6 +612,32 @@ struct BridgeCourierServiceTests { #expect(fixture.closedSubscriptions == 1) } + @Test func announceDebounceSchedulesTrailingRefreshForPeersLearnedInsideWindow() throws { + var date = Date(timeIntervalSince1970: 1_750_000_000) + let fixture = Fixture(now: { date }) + + // Leading edge opens the own-tag subscription immediately. + fixture.service.refreshAfterVerifiedAnnounce() + #expect(fixture.openedSubscriptions.count == 1) + + // A second peer learned inside the debounce window must not wait for + // the 30-minute periodic timer. + date = date.addingTimeInterval(10) + fixture.localPeers = [(PeerID(str: "aabbccdd00112233"), Fixture.randomKey())] + fixture.service.refreshAfterVerifiedAnnounce() + fixture.service.refreshAfterVerifiedAnnounce() // coalesces, not a second timer + + let trailingTimers = fixture.scheduledTimers.filter { $0.delay < 100 } + #expect(trailingTimers.count == 1) + let trailing = try #require(trailingTimers.first) + #expect(trailing.delay == 50) + date = date.addingTimeInterval(50) + trailing.fire() + + #expect(fixture.openedSubscriptions.count == 2) + #expect(fixture.openedSubscriptions.last?.count == 6) + } + // MARK: - Inbound drops @Test func dropForUsIsOpened() throws { @@ -378,6 +652,21 @@ struct BridgeCourierServiceTests { #expect(fixture.delivered.isEmpty) } + @Test func transientOwnDropOpenFailureRemainsRetryable() throws { + let fixture = Fixture() + let myKey = try #require(fixture.myKey) + fixture.service.refresh() + let event = try makeDropEvent(for: makeEnvelope(recipientKey: myKey)) + + fixture.openResult = false + fixture.service.handleDropEvent(event) + fixture.openResult = true + fixture.service.handleDropEvent(event) + fixture.service.handleDropEvent(event) + + #expect(fixture.openedEnvelopes.count == 2) + } + @Test func duplicateDropEventOpensOnce() throws { let fixture = Fixture() let myKey = try #require(fixture.myKey) diff --git a/bitchatTests/Services/BridgeDropDedupStoreTests.swift b/bitchatTests/Services/BridgeDropDedupStoreTests.swift index e1507621..9662798a 100644 --- a/bitchatTests/Services/BridgeDropDedupStoreTests.swift +++ b/bitchatTests/Services/BridgeDropDedupStoreTests.swift @@ -63,7 +63,7 @@ struct BridgeDropDedupStoreTests { lifetime: 3600, entries: [ "stale": now.addingTimeInterval(-7200), - "fresh": now.addingTimeInterval(-60), + "fresh": now.addingTimeInterval(-60) ], now: now ) diff --git a/bitchatTests/Services/BridgeServiceTests.swift b/bitchatTests/Services/BridgeServiceTests.swift index dd813636..24ffb54e 100644 --- a/bitchatTests/Services/BridgeServiceTests.swift +++ b/bitchatTests/Services/BridgeServiceTests.swift @@ -14,7 +14,7 @@ import Testing @Suite("Mesh bridge policy") @MainActor struct BridgeServiceTests { - private static let cell = "u4pruy" + nonisolated private static let cell = "u4pruy" /// Closure-injected harness around `BridgeService` recording every side /// effect, with a controllable clock, location, and connectivity. @@ -30,6 +30,7 @@ struct BridgeServiceTests { var bridgePeers: [PeerID] = [] var sendSucceeds = true var locallySeenMessageIDs: Set = [] + var injectedPresenceOverride: ((String) -> Bool)? var nickname = "tester" private(set) var published: [(event: NostrEvent, cell: String)] = [] @@ -41,6 +42,7 @@ struct BridgeServiceTests { } private(set) var broadcasts: [Data] = [] private(set) var injected: [BridgeService.InboundBridgeMessage] = [] + private(set) var removedInjectedMessageIDs: [String] = [] private(set) var uplinkSends: [(payload: Data, peer: PeerID)] = [] private(set) var openedSubscriptions: [[String]] = [] private(set) var closedSubscriptions = 0 @@ -54,13 +56,20 @@ struct BridgeServiceTests { let defaults: UserDefaults let service: BridgeService - init(enabled: Bool = true) { + init( + enabled: Bool = true, + verifyEventSignature: @escaping (NostrEvent) -> Bool = { $0.isValidSignature() } + ) { let suite = "BridgeServiceTests-\(UUID().uuidString)" defaults = UserDefaults(suiteName: suite)! defaults.removePersistentDomain(forName: suite) identity = try! NostrIdentity.generate() let clock = clock - service = BridgeService(defaults: defaults) { clock.now } + service = BridgeService( + defaults: defaults, + now: { clock.now }, + verifyEventSignature: verifyEventSignature + ) service.publishToRelays = { [weak self] event, cell in self?.published.append((event, cell)) } @@ -86,6 +95,14 @@ struct BridgeServiceTests { service.injectInbound = { [weak self] message in self?.injected.append(message) } + service.removeInjectedInbound = { [weak self] messageID in + self?.removedInjectedMessageIDs.append(messageID) + } + service.isInjectedInboundPresent = { [weak self] messageID in + guard let self else { return false } + return self.injectedPresenceOverride?(messageID) + ?? self.injected.contains { $0.messageID == messageID } + } service.isMessageSeenLocally = { [weak self] id in self?.locallySeenMessageIDs.contains(id) ?? false } @@ -117,8 +134,8 @@ struct BridgeServiceTests { // MARK: Event helpers - private static let remoteMeshSenderID = "feedfacecafef00d" - private static let remoteMeshTimestampMs: UInt64 = 1_750_000_000_000 + nonisolated private static let remoteMeshSenderID = "feedfacecafef00d" + nonisolated private static let remoteMeshTimestampMs: UInt64 = 1_750_000_000_000 private func makeRemoteEvent( cell: String = BridgeServiceTests.cell, @@ -233,7 +250,7 @@ struct BridgeServiceTests { "m", MeshMessageIdentity.stableID(senderIDHex: sender.id, timestampMs: timestampMs, content: "hello hill"), sender.id, - String(timestampMs), + String(timestampMs) ])) #expect(published.event.tags.contains(["n", "tester"])) } @@ -263,7 +280,7 @@ struct BridgeServiceTests { let timestampMs = MeshMessageIdentity.millisecondTimestamp(timestamp) #expect(oldParserKeys == [ MeshMessageIdentity.stableID(senderIDHex: sender.id, timestampMs: timestampMs, content: "first"), - MeshMessageIdentity.stableID(senderIDHex: sender.id, timestampMs: timestampMs, content: "second"), + MeshMessageIdentity.stableID(senderIDHex: sender.id, timestampMs: timestampMs, content: "second") ]) } @@ -340,6 +357,8 @@ struct BridgeServiceTests { #expect(fixture.injected.count == 1) #expect(fixture.injected.first?.content == event.content) + #expect(fixture.injected.first?.messageID == event.id) + #expect(fixture.injected.first?.senderNickname == "remote#\(event.pubkey.suffix(4))") #expect(fixture.service.bridgedPeerCount == 1) // Serving duty: after the jitter holdoff, the remote event rides out // as a fromBridge broadcast — one switch, no gateway toggle. @@ -401,18 +420,118 @@ struct BridgeServiceTests { fixture.service.handleRendezvousEvent(event) - // The island already heard this over radio: no duplicate render, no - // wasted airtime — but the sender still counts as a (local) - // participant, never a bridged one. + // The island already heard this over radio: no duplicate render or + // wasted airtime. The public hint cannot attribute the Nostr signer, + // so it does not mutate participant state either. #expect(fixture.injected.isEmpty) #expect(fixture.broadcasts.isEmpty) #expect(fixture.service.bridgedPeerCount == 0) } - @Test func radioConfirmedSenderStaysLocalForLaterEvents() throws { - // Sticky local attribution keyed on the derived stable ID: one - // radio-confirmed message marks the pubkey as an islander, so their - // later events never inflate the bridged count. + @Test func bridgeFirstThenAuthenticatedRadioReplacesAliasesAndCancelsDownlink() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let content = "bridge arrived first" + let radioMessageID = stableID(content: content) + let event = try makeRemoteEvent(content: content) + + fixture.service.handleRendezvousEvent(event) + #expect(fixture.injected.map(\.messageID) == [event.id]) + #expect(fixture.service.bridgedPeerCount == 1) + + // This entry point is called only after the BLE packet signature has + // authenticated. The radio row must win; the public m-tag hint is not + // trusted enough to suppress it. + fixture.service.handleAuthenticatedRadioMessage(messageID: radioMessageID) + fixture.fireScheduledTimers() + + #expect(fixture.removedInjectedMessageIDs == [event.id]) + #expect(fixture.broadcasts.isEmpty) + #expect(fixture.service.bridgedPeerCount == 1) + + // A different signer copying the same public mesh coordinates after + // radio authentication cannot put a bridge alias back into the row. + fixture.service.handleRendezvousEvent(try makeRemoteEvent(content: content)) + #expect(fixture.injected.count == 1) + } + + @Test func disablingBridgeDoesNotForgetAliasNeededByLaterRadioCopy() throws { + let fixture = Fixture(enabled: true) + fixture.service.refreshRendezvous() + let content = "radio arrives after opt-out" + let event = try makeRemoteEvent(content: content) + + fixture.service.handleRendezvousEvent(event) + fixture.service.setEnabled(false) + fixture.service.handleAuthenticatedRadioMessage(messageID: stableID(content: content)) + + #expect(fixture.removedInjectedMessageIDs == [event.id]) + } + + @Test func aliasPruningUsesExactRowLivenessWithoutDeletingHistory() throws { + let fixture = Fixture(enabled: true, verifyEventSignature: { _ in true }) + fixture.service.refreshRendezvous() + + func event(index: Int) -> NostrEvent { + let senderID = String(format: "%016llx", UInt64(index + 1)) + let content = "bridge overflow \(index)" + let timestampMs = UInt64(1_750_000_000_000) + UInt64(index) + var event = NostrEvent( + pubkey: String(format: "%064llx", UInt64(index + 1)), + createdAt: Date(), + kind: .ephemeralEvent, + tags: [ + ["r", Self.cell], + ["n", "remote"], + ["m", "unused", senderID, String(timestampMs)] + ], + content: content + ) + event.id = String(format: "%064llx", UInt64(index + 10_000)) + event.sig = String(repeating: "0", count: 128) + return event + } + + let oldest = event(index: 0) + fixture.service.handleRendezvousEvent(oldest) + for index in 1...BridgeService.Limits.maxTrackedEventIDs { + if index.isMultiple(of: 500) { fixture.advance(61) } + fixture.service.handleRendezvousEvent(event(index: index)) + } + + // The loop/dedup caches are intentionally smaller, but valid ingress + // through that boundary must not delete a still-visible bridge row. + #expect(fixture.removedInjectedMessageIDs.isEmpty) + + for index in (BridgeService.Limits.maxTrackedEventIDs + 1).. Void)? + let restored = MessageOutboxStore( + keychain: keychain, + fileURL: fileURL, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + }, + beforeRecoveryNotification: { gapAction?() } + ) + #expect(restored.load().isEmpty) + var deliveredRecoveries: [MessageOutboxStore.Snapshot] = [] + restored.setRecoveryHandler { deliveredRecoveries.append($0) } + gapAction = { restored.wipe() } + + protectedDataUnavailable = false + restored.retryDeferredLoad() + await Task.yield() + + #expect(deliveredRecoveries.isEmpty) + #expect(!FileManager.default.fileExists(atPath: fileURL.path)) + } + + @Test func deferredRemovalTombstoneFiltersUnseenDurableMessage() { + let fileURL = makeTempURL() + defer { try? FileManager.default.removeItem(at: fileURL) } + let keychain = MockKeychain() + let peerID = PeerID(str: "0000000000000001") + MessageOutboxStore(keychain: keychain, fileURL: fileURL) + .save([peerID: [makeMessage("durable")]]) + + var protectedDataUnavailable = true + let restored = MessageOutboxStore( + keychain: keychain, + fileURL: fileURL, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + } + ) + #expect(restored.load().isEmpty) + restored.recordRemoval(messageID: "durable") + restored.save([:]) + + protectedDataUnavailable = false + let recovered = restored.retryDeferredLoad() + #expect(recovered?.isEmpty == true) + #expect(MessageOutboxStore(keychain: keychain, fileURL: fileURL).load().isEmpty) + } + @Test func wipeRemovesFileAndKey() { let fileURL = makeTempURL() let keychain = MockKeychain() @@ -89,4 +228,69 @@ struct MessageOutboxStoreTests { store.save([peerID: []]) #expect(!FileManager.default.fileExists(atPath: fileURL.path)) } + + @Test func protectedDataReadFailureDefersWriteAndMergesOnRecovery() { + let fileURL = makeTempURL() + defer { try? FileManager.default.removeItem(at: fileURL) } + let keychain = MockKeychain() + let peerID = PeerID(str: "0000000000000001") + + let seed = MessageOutboxStore(keychain: keychain, fileURL: fileURL) + seed.save([peerID: [makeMessage("durable")]]) + let durableBytes = try? Data(contentsOf: fileURL) + + var protectedDataUnavailable = true + let restored = MessageOutboxStore( + keychain: keychain, + fileURL: fileURL, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + } + ) + #expect(restored.load().isEmpty) + restored.save([peerID: [makeMessage("during-wake")]]) + + // The unreadable durable snapshot was not replaced by the partial + // in-memory outbox from the locked restoration. + #expect((try? Data(contentsOf: fileURL)) == durableBytes) + + protectedDataUnavailable = false + let recovered = restored.retryDeferredLoad() + #expect(Set(recovered?[peerID]?.map(\.messageID) ?? []) == ["durable", "during-wake"]) + + let relaunched = MessageOutboxStore(keychain: keychain, fileURL: fileURL).load() + #expect(Set(relaunched[peerID]?.map(\.messageID) ?? []) == ["durable", "during-wake"]) + } + + @Test func lockedWakeRemovalDoesNotResurrectPendingMessageOnRecovery() { + let fileURL = makeTempURL() + defer { try? FileManager.default.removeItem(at: fileURL) } + let keychain = MockKeychain() + let peerID = PeerID(str: "0000000000000001") + MessageOutboxStore(keychain: keychain, fileURL: fileURL) + .save([peerID: [makeMessage("durable")]]) + + var protectedDataUnavailable = true + let restored = MessageOutboxStore( + keychain: keychain, + fileURL: fileURL, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + } + ) + #expect(restored.load().isEmpty) + restored.save([peerID: [makeMessage("wake")]]) + // A later delivery ack produces the complete empty in-memory view. + restored.save([:]) + + protectedDataUnavailable = false + let recovered = restored.retryDeferredLoad() + #expect(recovered?[peerID]?.map(\.messageID) == ["durable"]) + } } diff --git a/bitchatTests/Services/MessageRouterTests.swift b/bitchatTests/Services/MessageRouterTests.swift index 5144fba8..6c9d4ea1 100644 --- a/bitchatTests/Services/MessageRouterTests.swift +++ b/bitchatTests/Services/MessageRouterTests.swift @@ -493,6 +493,40 @@ struct MessageRouterTests { #expect(transport.sentCourierMessages.isEmpty) } + @Test @MainActor + func bridgeDepositCarriesOnlyAfterConfirmedSendAndRetriesFailure() async { + let recipient = PeerID(str: "00000000000000ba") + let recipientKey = Data(repeating: 0xBA, count: 32) + let transport = MockTransport() + let router = MessageRouter( + transports: [transport], + courierDirectory: Self.directory(recipient: recipient, recipientKey: recipientKey) + ) + var completions: [@MainActor (Bool) -> Void] = [] + router.bridgeCourierDeposit = { _, _, _, completion in + completions.append(completion) + } + var carried: [String] = [] + router.onMessageCarried = { messageID, _ in carried.append(messageID) } + + router.sendPrivate("Hello", to: recipient, recipientNickname: "Peer", messageID: "bridge-ack") + #expect(completions.count == 1) + #expect(carried.isEmpty) + + // Sweeps while the WebSocket write is pending must not duplicate it. + router.retryBridgeCourierDeposits() + #expect(completions.count == 1) + + completions.removeFirst()(false) + #expect(carried.isEmpty) + + // A failed socket write releases the in-flight slot for a real retry. + router.retryBridgeCourierDeposits() + #expect(completions.count == 1) + completions.removeFirst()(true) + #expect(carried == ["bridge-ack"]) + } + // MARK: - Outbox persistence @Test @MainActor @@ -547,6 +581,295 @@ struct MessageRouterTests { router2.flushOutbox(for: peerID) #expect(transport2.sentPrivateMessages.isEmpty) } + + @Test @MainActor + func protectedDataRecoveryMergesDurableAndLockedWakeMessagesIntoRouter() async { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("router-protected-data-\(UUID().uuidString).sealed") + defer { try? FileManager.default.removeItem(at: fileURL) } + let keychain = MockKeychain() + let peerID = PeerID(str: "00000000000000df") + + let durable = MessageOutboxStore.QueuedMessage( + content: "Before reboot", + nickname: "Peer", + messageID: "durable", + timestamp: Date() + ) + MessageOutboxStore(keychain: keychain, fileURL: fileURL).save([peerID: [durable]]) + + var protectedDataUnavailable = true + let restoredStore = MessageOutboxStore( + keychain: keychain, + fileURL: fileURL, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + } + ) + let transport = MockTransport() + let router = MessageRouter(transports: [transport], outboxStore: restoredStore) + router.sendPrivate("During wake", to: peerID, recipientNickname: "Peer", messageID: "wake") + + transport.reachablePeers.insert(peerID) + protectedDataUnavailable = false + restoredStore.retryDeferredLoad() + // Recovery is delivered to the main actor without blocking the + // protected-data notification callback. + await Task.yield() + await Task.yield() + + #expect(Set(transport.sentPrivateMessages.map(\.messageID)) == ["durable", "wake"]) + } + + @Test @MainActor + func ackWhileColdLoadIsLockedDoesNotResurrectUnseenDurableMessage() async { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("router-locked-ack-\(UUID().uuidString).sealed") + defer { try? FileManager.default.removeItem(at: fileURL) } + let keychain = MockKeychain() + let peerID = PeerID(str: "00000000000000e0") + let durable = MessageOutboxStore.QueuedMessage( + content: "Already delivered", + nickname: "Peer", + messageID: "acked-while-locked", + timestamp: Date() + ) + MessageOutboxStore(keychain: keychain, fileURL: fileURL).save([peerID: [durable]]) + + var protectedDataUnavailable = true + let restoredStore = MessageOutboxStore( + keychain: keychain, + fileURL: fileURL, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + } + ) + let transport = MockTransport() + transport.reachablePeers.insert(peerID) + let router = MessageRouter(transports: [transport], outboxStore: restoredStore) + + // The router's locked cold-load view is empty, but the ack still has + // to suppress the durable message hidden on disk. + router.markDelivered("acked-while-locked") + protectedDataUnavailable = false + restoredStore.retryDeferredLoad() + await Task.yield() + await Task.yield() + + #expect(transport.sentPrivateMessages.isEmpty) + #expect(MessageOutboxStore(keychain: keychain, fileURL: fileURL).load().isEmpty) + } + + @Test @MainActor + func ackAfterRecoveryCaptureBeforeMainActorMergeCannotResurrectMessage() async { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("router-recovery-gap-ack-\(UUID().uuidString).sealed") + defer { try? FileManager.default.removeItem(at: fileURL) } + let keychain = MockKeychain() + let peerID = PeerID(str: "00000000000000e1") + let durable = MessageOutboxStore.QueuedMessage( + content: "Captured then acked", + nickname: "Peer", + messageID: "recovery-gap-ack", + timestamp: Date() + ) + MessageOutboxStore(keychain: keychain, fileURL: fileURL).save([peerID: [durable]]) + + var protectedDataUnavailable = true + let restoredStore = MessageOutboxStore( + keychain: keychain, + fileURL: fileURL, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + } + ) + let transport = MockTransport() + transport.reachablePeers.insert(peerID) + let router = MessageRouter(transports: [transport], outboxStore: restoredStore) + + protectedDataUnavailable = false + restoredStore.retryDeferredLoad() // captures recovery and queues MainActor merge + router.markDelivered("recovery-gap-ack") // runs before that queued Task + await Task.yield() + await Task.yield() + + #expect(transport.sentPrivateMessages.isEmpty) + #expect(MessageOutboxStore(keychain: keychain, fileURL: fileURL).load().isEmpty) + } + + @Test @MainActor + func enqueueAfterRecoveryCapturePreservesUnseenDurableAndNewMessages() async { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("router-recovery-gap-enqueue-\(UUID().uuidString).sealed") + defer { try? FileManager.default.removeItem(at: fileURL) } + let keychain = MockKeychain() + let peerID = PeerID(str: "00000000000000e2") + let durable = MessageOutboxStore.QueuedMessage( + content: "Before unlock", + nickname: "Peer", + messageID: "recovery-gap-durable", + timestamp: Date() + ) + MessageOutboxStore(keychain: keychain, fileURL: fileURL).save([peerID: [durable]]) + + var protectedDataUnavailable = true + let restoredStore = MessageOutboxStore( + keychain: keychain, + fileURL: fileURL, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + } + ) + let transport = MockTransport() + let router = MessageRouter(transports: [transport], outboxStore: restoredStore) + + protectedDataUnavailable = false + restoredStore.retryDeferredLoad() // queues merge of the durable message + router.sendPrivate("During gap", to: peerID, recipientNickname: "Peer", messageID: "recovery-gap-new") + transport.reachablePeers.insert(peerID) + await Task.yield() + await Task.yield() + + #expect(Set(transport.sentPrivateMessages.map(\.messageID)) == ["recovery-gap-durable", "recovery-gap-new"]) + let relaunched = MessageOutboxStore(keychain: keychain, fileURL: fileURL).load() + #expect(Set(relaunched[peerID]?.map(\.messageID) ?? []) == ["recovery-gap-durable", "recovery-gap-new"]) + } + + @Test @MainActor + func removingKnownWakeMessageInRecoveryGapPreservesOnlyUnseenDurableState() async { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("router-recovery-gap-known-removal-\(UUID().uuidString).sealed") + defer { try? FileManager.default.removeItem(at: fileURL) } + let keychain = MockKeychain() + let peerID = PeerID(str: "00000000000000e3") + let durable = MessageOutboxStore.QueuedMessage( + content: "Unseen durable", + nickname: "Peer", + messageID: "recovery-gap-unseen", + timestamp: Date() + ) + MessageOutboxStore(keychain: keychain, fileURL: fileURL).save([peerID: [durable]]) + + var protectedDataUnavailable = true + let restoredStore = MessageOutboxStore( + keychain: keychain, + fileURL: fileURL, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + } + ) + let transport = MockTransport() + let router = MessageRouter(transports: [transport], outboxStore: restoredStore) + router.sendPrivate("Known wake", to: peerID, recipientNickname: "Peer", messageID: "recovery-gap-known") + + protectedDataUnavailable = false + restoredStore.retryDeferredLoad() // captures unseen durable + known wake + + // Secure direct flush removes the wake message before recovery's + // MainActor merge. It must remain removed, while the unseen durable + // message still arrives through the pending recovery claim. + transport.connectedPeers.insert(peerID) + transport.securePeers = [peerID] + router.flushOutbox(for: peerID) + await Task.yield() + await Task.yield() + + let sentIDs = transport.sentPrivateMessages.map(\.messageID) + #expect(sentIDs.filter { $0 == "recovery-gap-known" }.count == 1) + #expect(sentIDs.filter { $0 == "recovery-gap-unseen" }.count == 1) + } + + @Test @MainActor + func failedRecoveryWriteStillPreservesUnseenDurableStateAcrossGapRemoval() async { + let fileURL = FileManager.default.temporaryDirectory + .appendingPathComponent("router-recovery-write-failure-\(UUID().uuidString).sealed") + defer { try? FileManager.default.removeItem(at: fileURL) } + let keychain = MockKeychain() + let peerID = PeerID(str: "00000000000000e4") + let durable = MessageOutboxStore.QueuedMessage( + content: "Unseen before unlock", + nickname: "Peer", + messageID: "recovery-write-failure-unseen", + timestamp: Date() + ) + MessageOutboxStore(keychain: keychain, fileURL: fileURL).save([peerID: [durable]]) + + var protectedDataUnavailable = true + var failWrites = false + var injectedFailureCount = 0 + let restoredStore = MessageOutboxStore( + keychain: keychain, + fileURL: fileURL, + readData: { url in + if protectedDataUnavailable { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileReadNoPermissionError) + } + return try Data(contentsOf: url) + }, + writeData: { data, url, options in + if failWrites { + injectedFailureCount += 1 + throw NSError(domain: NSCocoaErrorDomain, code: NSFileWriteNoPermissionError) + } + try data.write(to: url, options: options) + } + ) + let transport = MockTransport() + let router = MessageRouter(transports: [transport], outboxStore: restoredStore) + router.sendPrivate( + "Known wake", + to: peerID, + recipientNickname: "Peer", + messageID: "recovery-write-failure-known" + ) + + // The first post-unlock save reads durable D and knows router state W, + // but its D+W write fails. A later retry must retain the original + // unseen-D classification instead of mistaking the cached union for + // a fully router-known snapshot. + protectedDataUnavailable = false + failWrites = true + router.sendPrivate( + "Known wake", + to: peerID, + recipientNickname: "Peer", + messageID: "recovery-write-failure-known" + ) + failWrites = false + #expect(injectedFailureCount == 1) + + restoredStore.retryDeferredLoad() // persists D+W and queues recovery + transport.connectedPeers.insert(peerID) + transport.securePeers = [peerID] + router.flushOutbox(for: peerID) // removes W before queued callback + + // The gap save may remove W, but it must leave unseen D durable until + // MessageRouter receives the pending recovery callback. + let gapSnapshot = MessageOutboxStore(keychain: keychain, fileURL: fileURL).load() + #expect(gapSnapshot[peerID]?.map(\.messageID) == ["recovery-write-failure-unseen"]) + + await Task.yield() + await Task.yield() + + let sentIDs = transport.sentPrivateMessages.map(\.messageID) + #expect(sentIDs.filter { $0 == "recovery-write-failure-known" }.count == 1) + #expect(sentIDs.filter { $0 == "recovery-write-failure-unseen" }.count == 1) + } } /// Mutable wall clock injected into `MessageRouter` so TTL expiry is testable diff --git a/bitchatTests/Services/NostrRelayManagerTests.swift b/bitchatTests/Services/NostrRelayManagerTests.swift index 125b252c..6deaa2b6 100644 --- a/bitchatTests/Services/NostrRelayManagerTests.swift +++ b/bitchatTests/Services/NostrRelayManagerTests.swift @@ -345,6 +345,121 @@ final class NostrRelayManagerTests: XCTestCase { XCTAssertEqual(context.manager.relays.first(where: { $0.url == relayURL })?.messagesSent, 0) } + func test_sendEventImmediately_allRejectsFailThenOKRetrySucceeds() async throws { + let relays = [ + "wss://confirmed-reject-one.example", + "wss://confirmed-reject-two.example" + ] + let context = makeContext(permission: .denied) + context.manager.ensureConnections(to: relays) + let connected = await waitUntil { + relays.allSatisfy { relay in + context.manager.relays.first(where: { $0.url == relay })?.isConnected == true + } + } + XCTAssertTrue(connected) + + let event = try makeSignedEvent(content: "confirmed reject then retry") + var results: [Bool] = [] + var completionsWereOnMain: [Bool] = [] + context.manager.sendEventImmediately(event, to: relays) { + results.append($0) + completionsWereOnMain.append(Thread.isMainThread) + } + try? await Task.sleep(nanoseconds: 20_000_000) + XCTAssertTrue(results.isEmpty, "socket writes alone must not confirm durability") + for relay in relays { + try context.sessionFactory.latestConnection(for: relay)?.emitOK( + eventID: event.id, + success: false, + reason: "rejected" + ) + } + let failedCompleted = await waitUntil { results.count == 1 } + XCTAssertTrue(failedCompleted) + XCTAssertEqual(results, [false]) + XCTAssertEqual(completionsWereOnMain, [true]) + XCTAssertEqual(context.manager.debugPendingMessageQueueCount, 0) + + // The explicit rejection leaves the same event retryable. + try? await Task.sleep(nanoseconds: 20_000_000) + context.manager.sendEventImmediately(event, to: relays) { + results.append($0) + completionsWereOnMain.append(Thread.isMainThread) + } + try context.sessionFactory.latestConnection(for: relays[0])?.emitOK( + eventID: event.id, + success: true, + reason: "accepted" + ) + let successfulCompleted = await waitUntil { results.count == 2 } + XCTAssertTrue(successfulCompleted) + XCTAssertEqual(results, [false, true]) + XCTAssertEqual(completionsWereOnMain, [true, true]) + XCTAssertEqual(context.manager.debugPendingMessageQueueCount, 0) + } + + func test_sendEventImmediately_mixedRelayOKUsesAcceptedResultOnce() async throws { + let relays = ["wss://confirmed-mixed-one.example", "wss://confirmed-mixed-two.example"] + let context = makeContext(permission: .denied) + context.manager.ensureConnections(to: relays) + let connected = await waitUntil { + relays.allSatisfy { relay in + context.manager.relays.first(where: { $0.url == relay })?.isConnected == true + } + } + XCTAssertTrue(connected) + + let event = try makeSignedEvent(content: "mixed confirmation") + var results: [Bool] = [] + context.manager.sendEventImmediately(event, to: relays) { results.append($0) } + try context.sessionFactory.latestConnection(for: relays[0])?.emitOK( + eventID: event.id, + success: false, + reason: "policy" + ) + try context.sessionFactory.latestConnection(for: relays[1])?.emitOK( + eventID: event.id, + success: true, + reason: "accepted" + ) + + let completed = await waitUntil { results.count == 1 } + XCTAssertTrue(completed) + XCTAssertEqual(results, [true]) + } + + func test_sendEventImmediately_timeoutFailsAndIgnoresLateWriteAndOK() async throws { + let relay = "wss://confirmed-timeout.example" + let context = makeContext(permission: .denied) + context.manager.ensureConnections(to: [relay]) + let connected = await waitUntil { + context.manager.relays.first(where: { $0.url == relay })?.isConnected == true + } + XCTAssertTrue(connected) + let connection = try XCTUnwrap(context.sessionFactory.latestConnection(for: relay)) + connection.deferSendCompletions = true + + let event = try makeSignedEvent(content: "confirmation timeout") + var results: [Bool] = [] + context.manager.sendEventImmediately(event, to: [relay]) { results.append($0) } + XCTAssertTrue(results.isEmpty) + XCTAssertEqual( + context.scheduler.scheduled.first?.delay, + TransportConfig.nostrConfirmedSendAckTimeoutSeconds + ) + + context.scheduler.runNext() + let timedOut = await waitUntil { results.count == 1 } + XCTAssertTrue(timedOut) + XCTAssertEqual(results, [false]) + + connection.flushDeferredSendCompletions() + try connection.emitOK(eventID: event.id, success: true, reason: "late") + try? await Task.sleep(nanoseconds: 30_000_000) + XCTAssertEqual(results, [false]) + } + func test_sendEvent_queueIsPrunedWhenDefaultRelaysAreRevoked() async throws { let context = makeContext( permission: .authorized, @@ -1158,6 +1273,38 @@ final class NostrRelayManagerTests: XCTestCase { XCTAssertEqual(firstConnection.cancelCallCount, 1) } + func test_staleSocketFailureCannotFailConfirmedSendOnReplacementConnection() async throws { + let relayURL = "wss://retry-stale-confirmation.example" + let context = makeContext(permission: .denied) + context.manager.ensureConnections(to: [relayURL]) + let initiallyConnected = await waitUntil { + context.manager.relays.first(where: { $0.url == relayURL })?.isConnected == true + } + XCTAssertTrue(initiallyConnected) + let oldConnection = try XCTUnwrap(context.sessionFactory.latestConnection(for: relayURL)) + + context.manager.retryConnection(to: relayURL) + let replaced = await waitUntil { + guard let current = context.sessionFactory.latestConnection(for: relayURL) else { return false } + return current !== oldConnection && + context.manager.relays.first(where: { $0.url == relayURL })?.isConnected == true + } + XCTAssertTrue(replaced) + let currentConnection = try XCTUnwrap(context.sessionFactory.latestConnection(for: relayURL)) + + let event = try makeSignedEvent(content: "replacement confirmation") + var results: [Bool] = [] + context.manager.sendEventImmediately(event, to: [relayURL]) { results.append($0) } + oldConnection.fail(error: NSError(domain: NSURLErrorDomain, code: NSURLErrorTimedOut)) + try? await Task.sleep(nanoseconds: 30_000_000) + XCTAssertTrue(results.isEmpty) + XCTAssertTrue(context.manager.relays.first(where: { $0.url == relayURL })?.isConnected == true) + + try currentConnection.emitOK(eventID: event.id, success: true, reason: "accepted") + let confirmed = await waitUntil { results == [true] } + XCTAssertTrue(confirmed) + } + func test_retryConnection_whenTorReadinessFailsDoesNotReconnect() async { let relayURL = "wss://retry-tor.example" let context = makeContext(permission: .denied, userTorEnabled: true, torEnforced: true, torIsReady: true) @@ -1643,7 +1790,7 @@ private final class MockRelaySessionFactory: NostrRelaySessionProtocol { private final class MockRelayConnection: NostrRelayConnectionProtocol { private let pingError: Error? - private let sendError: Error? + var sendError: Error? private var receiveHandler: ((Result) -> Void)? private(set) var resumeCallCount = 0 private(set) var cancelCallCount = 0 @@ -1687,7 +1834,9 @@ private final class MockRelayConnection: NostrRelayConnectionProtocol { func flushDeferredSendCompletions() { let pending = deferredSendCompletions deferredSendCompletions = [] - pending.forEach { $0(sendError) } + pending.forEach { + $0(sendError) + } } func receive(completionHandler: @escaping (Result) -> Void) { diff --git a/bitchatTests/ViewSmokeTests.swift b/bitchatTests/ViewSmokeTests.swift index e86b52e1..6c104e53 100644 --- a/bitchatTests/ViewSmokeTests.swift +++ b/bitchatTests/ViewSmokeTests.swift @@ -646,7 +646,7 @@ struct ViewSmokeTests { playback.stop() VoiceNotePlaybackCoordinator.shared.activate(playback) VoiceNotePlaybackCoordinator.shared.deactivate(playback) - await VoiceRecorder.shared.cancelRecording() + await VoiceRecorder.shared.cancelRecording(owner: VoiceRecorder.RecordingOwner()) #expect(bins.count == 16) #expect(WaveformCache.shared.cachedWaveform(for: waveformProbeURL)?.count == 16) diff --git a/bitchatTests/VoiceCaptureSessionTests.swift b/bitchatTests/VoiceCaptureSessionTests.swift new file mode 100644 index 00000000..40853f2c --- /dev/null +++ b/bitchatTests/VoiceCaptureSessionTests.swift @@ -0,0 +1,207 @@ +// +// VoiceCaptureSessionTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +@testable import bitchat + +@MainActor +private final class StubPTTCapture: PTTCapturing { + var onFrames: (([Data]) -> Void)? + var stopResult: (url: URL?, encodedFrames: Int) + var startError: Error? + private(set) var startCount = 0 + private(set) var cancelCount = 0 + + init( + stopResult: (url: URL?, encodedFrames: Int), + startError: Error? = nil + ) { + self.stopResult = stopResult + self.startError = startError + } + + func start(outputURL: URL) async throws { + startCount += 1 + if let startError { + throw startError + } + } + + func stop() -> (url: URL?, encodedFrames: Int) { + stopResult + } + + func cancel() { + cancelCount += 1 + } +} + +private final class CaptureLeaseSession: SessionApplying, @unchecked Sendable { + private let lock = NSLock() + private var _activationCalls: [Bool] = [] + + var activationCalls: [Bool] { lock.withLock { _activationCalls } } + + func setCategory(_ category: AudioSessionCoordinator.Category) throws {} + + func setActive(_ active: Bool, notifyOthersOnDeactivation: Bool) throws { + lock.withLock { _activationCalls.append(active) } + } +} + +@MainActor +private final class GatedVoiceCaptureSession: VoiceCaptureSession { + let isLive = false + private let startError: Error? + private(set) var finishStarted = false + private(set) var cancelCount = 0 + private var finishContinuation: CheckedContinuation? + + init(startError: Error? = nil) { + self.startError = startError + } + + func requestPermission() async -> Bool { true } + func start() async throws { + if let startError { throw startError } + } + + func finish() async -> URL? { + finishStarted = true + return await withCheckedContinuation { continuation in + finishContinuation = continuation + } + } + + func cancel() async { + cancelCount += 1 + } + + func resolveFinish(with url: URL?) { + let continuation = finishContinuation + finishContinuation = nil + continuation?.resume(returning: url) + } +} + +@MainActor +struct VoiceCaptureSessionTests { + private func waitUntil( + _ condition: () -> Bool, + sourceLocation: SourceLocation = #_sourceLocation + ) async { + let deadline = ContinuousClock.now.advanced(by: .seconds(5)) + while !condition(), ContinuousClock.now < deadline { + await Task.yield() + try? await Task.sleep(nanoseconds: 1_000_000) + } + #expect(condition(), sourceLocation: sourceLocation) + } + + private func isRecording(_ state: VoiceRecordingViewModel.State) -> Bool { + if case .recording = state { return true } + return false + } + + @Test func staleCaptureCallbackCannotInvalidateNewGeneration() { + let generations = PTTCaptureGeneration() + let old = generations.begin() + generations.invalidate() + let current = generations.begin() + + #expect(!generations.invalidate(ifCurrent: old)) + #expect(generations.isCurrent(current)) + #expect(generations.invalidate(ifCurrent: current)) + #expect(!generations.isCurrent(current)) + } + + @Test func coordinatorCancellationIsNotReportedAsAStartedCapture() async { + let capture = StubPTTCapture( + stopResult: (nil, 0), + startError: CancellationError() + ) + let session = PTTLiveVoiceSession( + sendPacket: { _ in }, + capture: capture + ) + + await #expect(throws: CancellationError.self) { + try await session.start() + } + } + + @Test func interruptedShortCaptureIsCanceledEvenAfterLongHold() async throws { + let url = FileManager.default.temporaryDirectory + .appendingPathComponent("ptt-interrupted-test-\(UUID().uuidString).m4a") + _ = FileManager.default.createFile(atPath: url.path, contents: Data([0x00])) + defer { try? FileManager.default.removeItem(at: url) } + + let capture = StubPTTCapture(stopResult: (url, 1)) + var sentPackets: [Data] = [] + var now = Date() + let session = PTTLiveVoiceSession( + sendPacket: { sentPackets.append($0) }, + capture: capture, + now: { now }, + burstID: Data(repeating: 0xA5, count: 8) + ) + + try await session.start() + now = now.addingTimeInterval(2) + let result = await session.finish() + + #expect(result == nil) + #expect(!FileManager.default.fileExists(atPath: url.path)) + let packet = try #require(sentPackets.last.flatMap(VoiceBurstPacket.decode)) + guard case .canceled = packet.kind else { + Issue.record("Expected a canceled control packet for a subsecond interrupted capture") + return + } + } + + @Test func droppingCaptureLeaseReturnsItsCoordinatorToken() async throws { + let rawSession = CaptureLeaseSession() + let coordinator = AudioSessionCoordinator(session: rawSession) + let token = try await coordinator.acquire(.capture) {} + var lease: PTTCaptureSessionLease? = PTTCaptureSessionLease(coordinator: coordinator) + lease?.install(token) + + lease = nil + await coordinator.drain() + + #expect(rawSession.activationCalls == [true, false]) + } + + @Test func rejectedNewHoldAndStaleFinalizeLeaveNewerGenerationIdle() async { + let oldSession = GatedVoiceCaptureSession() + let newSession = GatedVoiceCaptureSession( + startError: VoiceRecorder.RecorderError.recordingInProgress + ) + var sessions: [GatedVoiceCaptureSession] = [oldSession, newSession] + let viewModel = VoiceRecordingViewModel() + viewModel.sessionProvider = { sessions.removeFirst() } + + viewModel.start(shouldShow: true) + await waitUntil { self.isRecording(viewModel.state) } + viewModel.finish(completion: { _ in }) + await waitUntil { oldSession.finishStarted } + + viewModel.start(shouldShow: true) + await waitUntil { newSession.cancelCount == 1 && viewModel.state == .idle } + #expect(viewModel.state == .idle) + + // The older finalize now fails after the newer press has completed. + // It must not replace the newer generation's idle state with an alert. + oldSession.resolveFinish(with: nil) + for _ in 0..<20 { + await Task.yield() + } + #expect(viewModel.state == .idle) + } +} diff --git a/bitchatTests/VoiceNotePlaybackControllerTests.swift b/bitchatTests/VoiceNotePlaybackControllerTests.swift new file mode 100644 index 00000000..f7853f1d --- /dev/null +++ b/bitchatTests/VoiceNotePlaybackControllerTests.swift @@ -0,0 +1,145 @@ +// +// VoiceNotePlaybackControllerTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Testing +import AVFoundation +import Foundation +@testable import bitchat + +/// Thread-safe: the coordinator invokes it on its private serial queue (the +/// blocking session IPC runs off the main thread) while the test reads from +/// the main actor. +private final class RecordingAudioSession: SessionApplying, @unchecked Sendable { + private let lock = NSLock() + private var _activationCalls: [Bool] = [] + private var _categoryCallCount = 0 + private var _categoryError: Error? + + var activationCalls: [Bool] { lock.withLock { _activationCalls } } + var categoryCallCount: Int { lock.withLock { _categoryCallCount } } + var categoryError: Error? { + get { lock.withLock { _categoryError } } + set { lock.withLock { _categoryError = newValue } } + } + + func setCategory(_ category: AudioSessionCoordinator.Category) throws { + try lock.withLock { + _categoryCallCount += 1 + if let error = _categoryError { + _categoryError = nil + throw error + } + } + } + + func setActive(_ active: Bool, notifyOthersOnDeactivation: Bool) throws { + lock.withLock { _activationCalls.append(active) } + } +} + +private struct PlaybackSessionError: Error {} + +@MainActor +struct VoiceNotePlaybackControllerTests { + /// A short silent PCM file `AVAudioPlayer` can open on the test host. + private func makeTempVoiceNote(seconds: Double = 0.2) throws -> URL { + let url = FileManager.default.temporaryDirectory + .appendingPathComponent("voice-note-test-\(UUID().uuidString).caf") + let format = try #require(AVAudioFormat(standardFormatWithSampleRate: 16_000, channels: 1)) + let file = try AVAudioFile(forWriting: url, settings: format.settings) + let frames = AVAudioFrameCount(seconds * 16_000) + let buffer = try #require(AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frames)) + buffer.frameLength = frames + try file.write(from: buffer) + return url + } + + private func waitUntil( + _ condition: () -> Bool, + sourceLocation: SourceLocation = #_sourceLocation + ) async { + let deadline = ContinuousClock.now.advanced(by: .seconds(5)) + while !condition(), ContinuousClock.now < deadline { + await Task.yield() + try? await Task.sleep(nanoseconds: 1_000_000) + } + #expect(condition(), sourceLocation: sourceLocation) + } + + @Test func seekWhilePausedDoesNotAcquireSession() throws { + let session = RecordingAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + let url = try makeTempVoiceNote() + defer { try? FileManager.default.removeItem(at: url) } + + let controller = VoiceNotePlaybackController( + url: url, + sessionCoordinator: coordinator, + exclusivity: VoiceNotePlaybackCoordinator() + ) + controller.seek(to: 0.5) + + // The scrub position moved (the player is real and ready)... + #expect(controller.progress > 0.25) + // ...but nothing is audible, so the session must not be held: an + // acquired-while-paused token on a discarded row would pin the + // session (and any escalated category) forever. + #expect(session.activationCalls.isEmpty) + #expect(!controller.isPlaying) + } + + @Test func deinitReleasesSessionAndStopsPlayback() async throws { + let session = RecordingAudioSession() + let coordinator = AudioSessionCoordinator(session: session) + let url = try makeTempVoiceNote() + defer { try? FileManager.default.removeItem(at: url) } + + // Fresh exclusivity slot: a parallel test's play() must not pause + // this controller while its session acquire is in flight. + var controller: VoiceNotePlaybackController? = VoiceNotePlaybackController( + url: url, + sessionCoordinator: coordinator, + exclusivity: VoiceNotePlaybackCoordinator() + ) + controller?.play() + // The session acquire is asynchronous now (its blocking IPC runs off + // the main thread), so await the activation instead of asserting + // right after play(). + await waitUntil { session.activationCalls == [true] } + + // Navigating away discards the row's @StateObject mid-playback: + // deinit must release the session hold (a fire-and-forget hop onto + // the coordinator's queue). + controller = nil + + await waitUntil { session.activationCalls == [true, false] } + } + + @Test func activationFailureDoesNotStartUnregisteredPlayback() async throws { + let session = RecordingAudioSession() + session.categoryError = PlaybackSessionError() + let coordinator = AudioSessionCoordinator(session: session) + let url = try makeTempVoiceNote(seconds: 30) + defer { try? FileManager.default.removeItem(at: url) } + + let controller = VoiceNotePlaybackController( + url: url, + sessionCoordinator: coordinator, + exclusivity: VoiceNotePlaybackCoordinator() + ) + controller.play() + + await waitUntil { + session.categoryCallCount == 1 && !controller.isPlaybackStartPending + } + + #expect(session.activationCalls.isEmpty) + #expect(!controller.isPlaying) + #expect(controller.currentTime == 0) + } +} diff --git a/bitchatTests/VoiceRecorderTests.swift b/bitchatTests/VoiceRecorderTests.swift new file mode 100644 index 00000000..dfaa62d5 --- /dev/null +++ b/bitchatTests/VoiceRecorderTests.swift @@ -0,0 +1,402 @@ +// +// VoiceRecorderTests.swift +// bitchatTests +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +import Testing +@testable import bitchat + +private final class VoiceRecorderTestSession: SessionApplying, @unchecked Sendable { + private let lock = NSLock() + private let activationGate = DispatchSemaphore(value: 0) + private let shouldGateFirstActivation: Bool + private var gatedFirstActivation = false + private var _activationCalls: [Bool] = [] + private var _activationBegan = false + + init(gateFirstActivation: Bool = false) { + self.shouldGateFirstActivation = gateFirstActivation + } + + var activationCalls: [Bool] { lock.withLock { _activationCalls } } + var activationBegan: Bool { lock.withLock { _activationBegan } } + + func setCategory(_ category: AudioSessionCoordinator.Category) throws {} + + func setActive(_ active: Bool, notifyOthersOnDeactivation: Bool) throws { + let shouldWait = lock.withLock { () -> Bool in + _activationCalls.append(active) + guard active, shouldGateFirstActivation, !gatedFirstActivation else { return false } + gatedFirstActivation = true + _activationBegan = true + return true + } + if shouldWait { + activationGate.wait() + } + } + + func resumeActivation() { + activationGate.signal() + } +} + +private final class TestVoiceAudioRecorder: VoiceAudioRecording { + let prepareResult: Bool + let recordResult: Bool + + private let lock = NSLock() + private var _isRecording = false + private var _isMeteringEnabled = false + private var _prepareCallCount = 0 + private var _recordedDurations: [TimeInterval] = [] + private var _stopCallCount = 0 + + init(prepareResult: Bool, recordResult: Bool) { + self.prepareResult = prepareResult + self.recordResult = recordResult + } + + var isRecording: Bool { lock.withLock { _isRecording } } + var isMeteringEnabled: Bool { + get { lock.withLock { _isMeteringEnabled } } + set { lock.withLock { _isMeteringEnabled = newValue } } + } + var prepareCallCount: Int { lock.withLock { _prepareCallCount } } + var recordedDurations: [TimeInterval] { lock.withLock { _recordedDurations } } + var stopCallCount: Int { lock.withLock { _stopCallCount } } + + func prepareToRecord() -> Bool { + lock.withLock { _prepareCallCount += 1 } + return prepareResult + } + + func record(forDuration duration: TimeInterval) -> Bool { + lock.withLock { + _recordedDurations.append(duration) + if recordResult { + _isRecording = true + } + } + return recordResult + } + + func stop() { + lock.withLock { + _stopCallCount += 1 + _isRecording = false + } + } + + /// Models `record(forDuration:)` reaching its duration cap before the + /// caller invokes `VoiceRecorder.stopRecording(owner:)`. + func simulateAutomaticStop() { + lock.withLock { _isRecording = false } + } +} + +private final class TestVoiceAudioRecorderFactory: VoiceAudioRecorderCreating { + struct Plan { + let prepareResult: Bool + let recordResult: Bool + + static let success = Plan(prepareResult: true, recordResult: true) + } + + private let lock = NSLock() + private var plans: [Plan] + private var _recorders: [TestVoiceAudioRecorder] = [] + private var _urls: [URL] = [] + + init(plans: [Plan]) { + self.plans = plans + } + + var recorders: [TestVoiceAudioRecorder] { lock.withLock { _recorders } } + var urls: [URL] { lock.withLock { _urls } } + + func makeRecorder(url: URL) throws -> any VoiceAudioRecording { + let plan = lock.withLock { plans.isEmpty ? .success : plans.removeFirst() } + // AVAudioRecorder creates its output during initialization. A real + // byte on disk lets the tests distinguish preserve from delete. + try Data([0x01]).write(to: url) + let recorder = TestVoiceAudioRecorder( + prepareResult: plan.prepareResult, + recordResult: plan.recordResult + ) + lock.withLock { + _recorders.append(recorder) + _urls.append(url) + } + return recorder + } +} + +/// One-shot async gate that proves `VoiceRecorder.stopRecording` has reached +/// its actor-reentrant padding boundary, then holds it there until the test has +/// exercised a competing owner. Unlike `Task.yield()` plus a short real sleep, +/// this remains deterministic when the full test suite saturates the executor. +private final class VoiceRecorderPaddingGate: @unchecked Sendable { + private let lock = NSLock() + private var _entered = false + private var isOpen = false + private var openWaiters: [CheckedContinuation] = [] + + var entered: Bool { lock.withLock { _entered } } + + func wait() async { + await withCheckedContinuation { continuation in + let resumeImmediately = lock.withLock { () -> Bool in + _entered = true + guard !isOpen else { return true } + openWaiters.append(continuation) + return false + } + if resumeImmediately { + continuation.resume() + } + } + } + + func open() { + let waiters = lock.withLock { () -> [CheckedContinuation] in + isOpen = true + defer { openWaiters.removeAll() } + return openWaiters + } + waiters.forEach { $0.resume() } + } +} + +@MainActor +struct VoiceRecorderTests { + private func makeTemporaryDirectory() throws -> URL { + let url = FileManager.default.temporaryDirectory + .appendingPathComponent("voice-recorder-tests-\(UUID().uuidString)", isDirectory: true) + try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true) + return url + } + + private func waitUntil( + _ condition: () -> Bool, + sourceLocation: SourceLocation = #_sourceLocation + ) async { + let deadline = ContinuousClock.now.advanced(by: .seconds(5)) + while !condition(), ContinuousClock.now < deadline { + await Task.yield() + try? await Task.sleep(nanoseconds: 1_000_000) + } + #expect(condition(), sourceLocation: sourceLocation) + } + + @Test func cancelWhileSessionAcquireIsInFlightNeverCreatesARecorder() async throws { + let directory = try makeTemporaryDirectory() + defer { try? FileManager.default.removeItem(at: directory) } + + let session = VoiceRecorderTestSession(gateFirstActivation: true) + let coordinator = AudioSessionCoordinator(session: session) + let factory = TestVoiceAudioRecorderFactory(plans: [.success]) + let voiceRecorder = VoiceRecorder( + sessionCoordinator: coordinator, + recorderFactory: factory, + permissionGranted: { true }, + paddingInterval: 0, + outputDirectory: directory + ) + let owner = VoiceRecorder.RecordingOwner() + + let startTask = Task { try await voiceRecorder.startRecording(owner: owner) } + await waitUntil { session.activationBegan } + + await voiceRecorder.cancelRecording(owner: owner) + session.resumeActivation() + + do { + _ = try await startTask.value + Issue.record("The canceled session acquire unexpectedly started recording") + } catch { + #expect(error is CancellationError) + } + await coordinator.drain() + + #expect(factory.recorders.isEmpty) + #expect(session.activationCalls == [true, false]) + } + + @Test func prepareFailureCleansUpAndAllowsTheNextRecording() async throws { + try await verifyFailedStart( + firstPlan: .init(prepareResult: false, recordResult: true), + expectedPrepareCalls: 1, + expectedRecordCalls: 0 + ) + } + + @Test func recordFailureCleansUpAndAllowsTheNextRecording() async throws { + try await verifyFailedStart( + firstPlan: .init(prepareResult: true, recordResult: false), + expectedPrepareCalls: 1, + expectedRecordCalls: 1 + ) + } + + @Test func automaticStopReturnsAndPreservesFileThenNextRecordingWorks() async throws { + let directory = try makeTemporaryDirectory() + defer { try? FileManager.default.removeItem(at: directory) } + + let session = VoiceRecorderTestSession() + let coordinator = AudioSessionCoordinator(session: session) + let factory = TestVoiceAudioRecorderFactory(plans: [.success, .success]) + let voiceRecorder = VoiceRecorder( + sessionCoordinator: coordinator, + recorderFactory: factory, + permissionGranted: { true }, + paddingInterval: 0, + outputDirectory: directory + ) + let firstOwner = VoiceRecorder.RecordingOwner() + + let firstURL = try await voiceRecorder.startRecording(owner: firstOwner) + let firstRecorder = try #require(factory.recorders.first) + #expect(firstRecorder.recordedDurations == [120]) + firstRecorder.simulateAutomaticStop() + + let finishedURL = await voiceRecorder.stopRecording(owner: firstOwner) + await coordinator.drain() + #expect(finishedURL == firstURL) + #expect(firstRecorder.stopCallCount == 0) + #expect(FileManager.default.fileExists(atPath: firstURL.path)) + #expect(session.activationCalls == [true, false]) + + let secondOwner = VoiceRecorder.RecordingOwner() + let secondURL = try await voiceRecorder.startRecording(owner: secondOwner) + #expect(secondURL != firstURL) + #expect(FileManager.default.fileExists(atPath: firstURL.path)) + #expect(factory.recorders.count == 2) + let secondRecorder = try #require(factory.recorders.last) + + #expect(await voiceRecorder.stopRecording(owner: secondOwner) == secondURL) + await coordinator.drain() + #expect(secondRecorder.stopCallCount == 1) + #expect(session.activationCalls == [true, false, true, false]) + #expect(FileManager.default.fileExists(atPath: firstURL.path)) + #expect(FileManager.default.fileExists(atPath: secondURL.path)) + } + + @Test func rejectedNewHoldCancelCannotDeleteHoldFinishingDuringPadding() async throws { + let directory = try makeTemporaryDirectory() + defer { try? FileManager.default.removeItem(at: directory) } + + let session = VoiceRecorderTestSession() + let coordinator = AudioSessionCoordinator(session: session) + let factory = TestVoiceAudioRecorderFactory(plans: [.success, .success]) + let paddingGate = VoiceRecorderPaddingGate() + let voiceRecorder = VoiceRecorder( + sessionCoordinator: coordinator, + recorderFactory: factory, + permissionGranted: { true }, + paddingInterval: 0.05, + outputDirectory: directory, + testingHooks: .init(waitForStopPadding: { _ in await paddingGate.wait() }) + ) + let finishingHold = VoiceNoteCaptureSession(recorder: voiceRecorder) + let rejectedHold = VoiceNoteCaptureSession(recorder: voiceRecorder) + + try await finishingHold.start() + let firstURL = try #require(factory.urls.first) + let finishTask = Task { await finishingHold.finish() } + await waitUntil { paddingGate.entered } + + await #expect(throws: VoiceRecorder.RecorderError.recordingInProgress) { + try await rejectedHold.start() + } + // This is the view-model error path that used to globally cancel the + // shared recorder and delete `firstURL` during the padding sleep. + await rejectedHold.cancel() + paddingGate.open() + + #expect(await finishTask.value == firstURL) + await coordinator.drain() + #expect(FileManager.default.fileExists(atPath: firstURL.path)) + #expect(factory.recorders[0].stopCallCount == 1) + #expect(session.activationCalls == [true, false]) + } + + @Test func stalePreviousHoldCancelCannotStopNewRecording() async throws { + let directory = try makeTemporaryDirectory() + defer { try? FileManager.default.removeItem(at: directory) } + + let session = VoiceRecorderTestSession() + let coordinator = AudioSessionCoordinator(session: session) + let factory = TestVoiceAudioRecorderFactory(plans: [.success, .success]) + let voiceRecorder = VoiceRecorder( + sessionCoordinator: coordinator, + recorderFactory: factory, + permissionGranted: { true }, + paddingInterval: 0, + outputDirectory: directory + ) + let previousHold = VoiceNoteCaptureSession(recorder: voiceRecorder) + let currentHold = VoiceNoteCaptureSession(recorder: voiceRecorder) + + try await previousHold.start() + let firstURL = try #require(factory.urls.first) + #expect(await previousHold.finish() == firstURL) + + try await currentHold.start() + let secondURL = try #require(factory.urls.last) + let secondRecorder = try #require(factory.recorders.last) + await previousHold.cancel() + + #expect(secondRecorder.isRecording) + #expect(FileManager.default.fileExists(atPath: secondURL.path)) + #expect(await currentHold.finish() == secondURL) + await coordinator.drain() + #expect(secondRecorder.stopCallCount == 1) + #expect(FileManager.default.fileExists(atPath: firstURL.path)) + #expect(FileManager.default.fileExists(atPath: secondURL.path)) + } + + private func verifyFailedStart( + firstPlan: TestVoiceAudioRecorderFactory.Plan, + expectedPrepareCalls: Int, + expectedRecordCalls: Int + ) async throws { + let directory = try makeTemporaryDirectory() + defer { try? FileManager.default.removeItem(at: directory) } + + let session = VoiceRecorderTestSession() + let coordinator = AudioSessionCoordinator(session: session) + let factory = TestVoiceAudioRecorderFactory(plans: [firstPlan, .success]) + let voiceRecorder = VoiceRecorder( + sessionCoordinator: coordinator, + recorderFactory: factory, + permissionGranted: { true }, + paddingInterval: 0, + outputDirectory: directory + ) + let failedOwner = VoiceRecorder.RecordingOwner() + + await #expect(throws: VoiceRecorder.RecorderError.failedToStartRecording) { + try await voiceRecorder.startRecording(owner: failedOwner) + } + await coordinator.drain() + + let failedRecorder = try #require(factory.recorders.first) + let failedURL = try #require(factory.urls.first) + #expect(failedRecorder.prepareCallCount == expectedPrepareCalls) + #expect(failedRecorder.recordedDurations.count == expectedRecordCalls) + #expect(!FileManager.default.fileExists(atPath: failedURL.path)) + #expect(session.activationCalls == [true, false]) + + let nextOwner = VoiceRecorder.RecordingOwner() + let nextURL = try await voiceRecorder.startRecording(owner: nextOwner) + #expect(FileManager.default.fileExists(atPath: nextURL.path)) + #expect(await voiceRecorder.stopRecording(owner: nextOwner) == nextURL) + await coordinator.drain() + #expect(session.activationCalls == [true, false, true, false]) + } +} diff --git a/docs/ARTI-BINARY-PROVENANCE.md b/docs/ARTI-BINARY-PROVENANCE.md index a13240ba..9f44db3c 100644 --- a/docs/ARTI-BINARY-PROVENANCE.md +++ b/docs/ARTI-BINARY-PROVENANCE.md @@ -18,7 +18,9 @@ The crate declares `rust-version = "1.90"` and uses `arti-client` / `tor-rtcompa - `aarch64-apple-ios` - `aarch64-apple-ios-sim` +- `x86_64-apple-ios` - `aarch64-apple-darwin` +- `x86_64-apple-darwin` It builds release static libraries with size-oriented flags (`opt-level=z`, fat LTO, one codegen unit, `panic=abort`, stripped symbols), normalizes static-archive metadata with `xcrun libtool -static -D`, then packages them with `xcodebuild -create-xcframework`. @@ -29,30 +31,34 @@ From the repo root: ```sh cd localPackages/Arti rustup toolchain install 1.96.0 -rustup default 1.96.0 -rustup target add aarch64-apple-ios aarch64-apple-ios-sim aarch64-apple-darwin -cargo install cbindgen +rustup target add --toolchain 1.96.0 aarch64-apple-ios aarch64-apple-ios-sim x86_64-apple-ios aarch64-apple-darwin x86_64-apple-darwin +rustup run 1.96.0 cargo install cbindgen --version 0.29.4 --locked ./build-ios.sh ``` +`build-ios.sh` defaults to the audited `1.96.0` toolchain and refuses a rustc +version other than `1.96.0`; it likewise requires cbindgen `0.29.4`. Set +`RUST_TOOLCHAIN`, `RUSTC_VERSION`, or `CBINDGEN_VERSION` explicitly only when +intentionally updating the binary provenance and hashes below. + After rebuilding, verify that: - `Cargo.lock` changes are intentional and reviewed. - `Frameworks/include/arti.h` still matches the exported FFI functions used by `TorManager`. -- `Frameworks/arti.xcframework` contains iOS device, iOS simulator, and macOS arm64 slices. +- `Frameworks/arti.xcframework` contains iOS device arm64, universal iOS simulator arm64+x86_64, and universal macOS arm64+x86_64 slices. - The main app still passes iOS tests and the macOS build. ## Audited Rebuild -The June 2026 artifact below was rebuilt from source on this host with: +The July 2026 artifact below was rebuilt from source on this host with: ```text rustc 1.96.0 (ac68faa20 2026-05-25) cargo 1.96.0 (30a34c682 2026-05-25) rustup 1.29.0 (28d1352db 2026-03-05) -cbindgen 0.29.3 -Xcode 26.5 -Build version 17F42 +cbindgen 0.29.4 +Xcode 26.6 +Build version 17F113 ``` Rust 1.86.0 was also checked during the audit and no longer builds this lockfile because `typed-index-collections@3.4.0` requires Rust 1.90.0 or newer. @@ -70,13 +76,13 @@ find localPackages/Arti/Frameworks/arti.xcframework -maxdepth 3 -type f -print0 Current hashes: ```text -2083d44eafc765db1ffa2691a5c5fabe60b4edbb82b574169ca0c6b98e245e3a localPackages/Arti/Frameworks/arti.xcframework/Info.plist -551655904834748c9dc36034fdbc9465e7533aef1e4a6514b4fcc75875b93058 localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/Headers/arti.h -85febff37b751df667a3cab8222de2e1450cefe44b5b62c419adcbce48b9663f localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/libarti_bitchat.a +cac99db408280bbef15cae8ce64c8ccdbf2e8863c205168d59f83fe8ab680f94 localPackages/Arti/Frameworks/arti.xcframework/Info.plist 551655904834748c9dc36034fdbc9465e7533aef1e4a6514b4fcc75875b93058 localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/Headers/arti.h -fd25ee379d709a794733fc3c052746d1e6f7b25fec23e5f5234008a3434ce879 localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/libarti_bitchat.a -551655904834748c9dc36034fdbc9465e7533aef1e4a6514b4fcc75875b93058 localPackages/Arti/Frameworks/arti.xcframework/macos-arm64/Headers/arti.h -8c426a41dc3eb76cc3e3e22e3356b9d11dbebdf0a0f248c5ac892e1839352c75 localPackages/Arti/Frameworks/arti.xcframework/macos-arm64/libarti_bitchat.a +5461a231a786812e91e7965290031ea3479fdc5c6459553e46988ecafbbc2a3d localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/libarti_bitchat.a +551655904834748c9dc36034fdbc9465e7533aef1e4a6514b4fcc75875b93058 localPackages/Arti/Frameworks/arti.xcframework/ios-arm64_x86_64-simulator/Headers/arti.h +af8f5f636eb6affb309b3e44f13e48498eb2540c77af44ddcd7fdf9241b1e317 localPackages/Arti/Frameworks/arti.xcframework/ios-arm64_x86_64-simulator/libarti_bitchat.a +551655904834748c9dc36034fdbc9465e7533aef1e4a6514b4fcc75875b93058 localPackages/Arti/Frameworks/arti.xcframework/macos-arm64_x86_64/Headers/arti.h +7c9afe98227f1767567ddcd4e35d9dfffe70309c302c4dbc9a6c9d6aeefab007 localPackages/Arti/Frameworks/arti.xcframework/macos-arm64_x86_64/libarti_bitchat.a ``` ## Review Checklist diff --git a/docs/privacy-assessment.md b/docs/privacy-assessment.md index bcb5c178..645e5df7 100644 --- a/docs/privacy-assessment.md +++ b/docs/privacy-assessment.md @@ -1,79 +1,99 @@ -BitChat Privacy Assessment -========================== +# bitchat Privacy Assessment -Scope -- Mesh transport (BLE) behavior and metadata minimization -- Nostr-based private message fallback (gift-wrapped, end-to-end encrypted) -- Nostr-backed public geohash channels, presence heartbeats, and location notes -- Optional CoreLocation use for geohash channel discovery -- Read receipts and delivery acknowledgments -- Logging/telemetry posture and controls +Last reviewed: July 2026 -Summary -- No accounts and no project-operated servers. Mesh traffic is peer-to-peer; Nostr is used for mutual-favorite private fallback and public geohash features. -- BLE announces contain only nickname and Noise pubkey. No device name, no plaintext identity beyond what the user broadcasts. -- Discovery and flooding incorporate jitter and TTL caps to reduce linkability and propagation radius of encrypted payloads. -- UI and storage remain mostly ephemeral; message content is not persisted to disk by default. Minimal local state (e.g., read-receipt IDs, favorites, selected/bookmarked geohashes) is stored for UX and is bounded or user-wipeable. -- Logging defaults to conservative levels; debug verbosity is suppressed for release builds. A single env var can raise/lower threshold when needed. +## Scope -BLE Privacy Considerations -- Announce content: Unchanged — nickname + Noise public key only. -- Local Name: Not used (explicitly disabled). Avoids leaking device/OS identity. -- Address: iOS uses BLE MAC randomization; BitChat does not attempt to set static addresses. -- Announce jitter: Each announce is delayed by a small random jitter to avoid synchronization-based correlation. -- Scanning: Foreground scanning uses “allow duplicates” briefly to improve discovery latency; background uses standard scanning parameters. -- RSSI gating: The acceptance threshold adapts to nearby density (approx. -95 to -80 dBm) to reduce long-distance observations in dense areas and improve connectivity in sparse ones. -- Fragmentation: Fragments use write-with-response for reliability (less re-broadcast churn = fewer repeated signals). -- GATT permissions: Private characteristic disallows .read; we use notify/write/writeWithoutResponse to avoid exposing plaintext attributes over GATT. +- BLE discovery, mesh routing, gossip sync, private delivery, and courier behavior +- Nostr private fallback, bridge courier drops, mesh bridging, geohash channels, and notices +- CoreLocation and reverse geocoding +- Local persistence, panic wipe, logging, and App Store privacy manifests -Mesh Routing and Multi-hop Limits -- Encrypted relays permitted with random per-hop delay (small jitter) to smooth floods. -- TTL cap: Encrypted payloads are capped at 2 hops, limiting metadata spread and path reconstruction risk while enabling close-range relays. +The user-facing contract is `PRIVACY_POLICY.md`. This document records implementation-level behavior and residual risks that should be re-audited when storage or transport semantics change. -Nostr Private Messaging Fallback -- Usage criteria: Only attempted for mutual favorites or where a Nostr key has been exchanged (stored in favorites). -- Payload confidentiality: Messages embed a BitChat Noise-encrypted packet inside a NIP-17 gift wrap; relays see only random-looking ciphertext. -- Timestamp handling: Gift wraps add small randomized offsets to reduce exact timing correlation. -- Read/delivery acks: Also encapsulated in gift wraps, preserving content secrecy and minimizing metadata. -- Relay policy variance: Some relays apply “web-of-trust” policies and may reject events; BitChat tolerates partial delivery and still prefers mesh when available. +## Current Posture -Location Channels and Geohash Public Chats -- Location permission: Optional when-in-use CoreLocation access computes local geohash channel options. Exact coordinates are held in memory only and are not included in BitChat or Nostr payloads. -- Local state: Selected channel, teleported geohashes, bookmarks, and bookmark display names are stored in `UserDefaults`; the panic action clears location presence state along with identity/session state. -- Geohash precision: User-selected channels can range from region-level to building-level. Public geohash messages and location notes expose the selected geohash tag to relays and participants. -- Presence minimization: Automatic presence heartbeats are restricted to low-precision region/province/city geohashes and use randomized timing. -- Per-geohash identities: Public geohash Nostr identities are derived from a device seed stored in the keychain, reducing cross-channel linkability compared with a single stable public key. -- Relay metadata: Relays can observe event kind, geohash tag, public key, timestamp, and network metadata. Content in public geohash channels is intentionally public to that channel. +- The project operates no account system, analytics pipeline, advertising SDK, or project-owned messaging backend. +- Mesh transport is peer-to-peer. Optional internet features use third-party Nostr relays and can expose public content, coarse geohashes, timing, relay, and network metadata. +- Private payloads are end-to-end encrypted, but public mesh, board, bridge, and geohash content is intentionally visible to its participants. +- Local storage is bounded where practical and included in panic wipe, but it is not wholly ephemeral. The app persists the stores listed below. +- The app and share extension each bundle a privacy manifest declaring their actual required-reason API use. -Read Receipts and Delivery Acks -- Routing policy: Prefer mesh if Noise session established; otherwise use Nostr when mapping exists. -- Throttling: Nostr READ acks are queued and rate-limited (~3/s) to prevent relay rate limits during backlogs. -- Coalescing (optional future): When entering a chat with many unread, only send READ for the latest message, marking older as read locally to reduce metadata. +## BLE Discovery and Metadata -Data Retention and State -- Messages: Ephemeral in-memory only; history is bounded per chat and trimmed. -- Read-receipt IDs: Stored in `UserDefaults` for UX continuity; periodically pruned to IDs present in memory. -- Favorites: Noise and optional Nostr keys with petnames; can be wiped via panic action. -- Location channels: Exact coordinates are not persisted by BitChat. Selected/bookmarked geohashes, teleport flags, and bookmark display names persist locally until removed, panic-wiped, or the app is deleted. -- Geohash identities: Device seed is stored in the keychain and used to derive per-geohash Nostr identities deterministically. -- Relay persistence: Public geohash events, location notes, and encrypted gift wraps may be retained by relays according to each relay's policy. -- Panic: Triple-tap clears keys, sessions, cached state, and disconnects transports. +Signed announces can expose: -Logging and Telemetry -- Centralized `SecureLogger` filters potential secrets and uses OSLog privacy markers. -- Default level: `info`; release builds suppress debug. Developers can set `BITCHAT_LOG_LEVEL=debug|info|warning|error|fault`. -- Transport routing, ACK sends, subscribe/connect noise were downgraded from info→debug. -- OS/system errors (e.g., transient WebSocket disconnects) may still appear in system logs; BitChat avoids re-logging those unless actionable. +- Nickname, persistent Noise public key, and Ed25519 signing public key +- Capability flags +- A bounded set of short direct-neighbor identifiers +- A coarse rendezvous geohash when the bridge capability is enabled -Residual Risks and Mitigations -- RF fingerprinting: BLE presence is observable at the RF layer; mitigated by minimal announce content and platform MAC randomization. -- Timing correlation: Announce/relay jitter reduces but does not eliminate timing analysis. Avoids synchronized bursts. -- Relay metadata: Nostr relays can see that an account posts gift wraps; content remains end-to-end encrypted. Favor mesh path when in range. -- Geohash inference: Public location-channel tags reveal approximate area. Mitigated by explicit channel selection, low-precision automatic presence, and per-geohash identities. -- Bookmark persistence: Locally stored geohash bookmarks may reveal places of interest on a seized/unlocked device. Mitigated by panic wipe and local-only storage. +The app does not advertise the device's user-assigned name. iOS manages BLE address randomization; bitchat does not attempt to create a stable MAC address. RSSI, timing, traffic volume, and radio fingerprints remain observable to nearby receivers. -Recommendations (Next) -- Add optional coalesced READ behavior for large backlogs. -- Expose a “low-visibility mode” to reduce scanning aggressiveness in sensitive contexts. -- Allow user-configurable Nostr relay set with a “private relays only” toggle. -- Add a user-facing precision warning before posting in block/building-level geohash channels. +Ingress validates announce structure, sender binding, signatures, payload sizes, and freshness. Current-link Noise authentication is required before destructive courier handoff or strict directed delivery. Floods, queues, fragments, ingress work, and per-peer state are bounded. + +## Private Messaging and Courier Delivery + +- Direct mesh sessions use Noise XX with X25519, ChaCha20-Poly1305, and SHA-256. +- Undelivered outgoing private messages remain in a bounded, ChaChaPoly-sealed outbox for at most 24 hours. Its key is stored in the keychain. +- Physical couriers store opaque Noise-sealed envelopes, not plaintext. Deposits have trust-tier quotas, per-depositor caps, a global cap, and at most a 24-hour lifetime. +- Spray-and-wait copies are bounded and progress cannot be replenished by replaying a deposit. +- Delivery status advances only after real transport admission or explicit relay acceptance; late failure cannot downgrade a delivered/read message. +- Panic wipe deletes the outbox, courier mail, keys, dedup state, and active transport state. + +Residual risk: private-message metadata such as timing, radio adjacency, ciphertext size, rotating recipient tags, and relay connections remains observable. A compromised recipient device can disclose plaintext. + +## Public Gossip, Boards, and Media + +- Recent signed public mesh messages are archived in Application Support for up to 15 minutes so gossip sync survives a relaunch and can cross mesh partitions. +- Signed public board posts and tombstones persist until author-selected expiry, at most seven days. Stores are bounded by global and per-author quotas. +- Group metadata (name, roster, creator, epoch) persists as protected JSON; group keys live in the keychain until leave/removal/wipe. +- Voice notes and images are stored in Application Support. Incoming media has a 100 MB oldest-first quota; outgoing media does not have an equivalent automatic lifetime and remains until cleanup, panic wipe, or app removal. + +Public archives contain content already intended for public mesh/board distribution, but a seized unlocked device can reveal it. Group metadata and media can reveal relationships or content even when the in-memory chat timeline has gone away. + +## Nostr and Mesh Bridge + +- NIP-17/NIP-44 v2 private fallback protects plaintext with secp256k1 key agreement, HKDF-SHA256, and XChaCha20-Poly1305. Relays still see event and network metadata. +- Bridge courier drops use a throwaway publisher key, an opaque Noise-sealed envelope, and a day-rotating recipient tag. Only a party already holding the recipient's Noise static key can compute candidate tags. +- Relay publication is considered successful only after an explicit NIP-20 `OK true` from at least one target relay. Rejected, disconnected, timed-out, or merely socket-written events stay retryable. +- When mesh bridge is enabled, public mesh messages not marked “nearby only” are signed under a per-cell Nostr identity and published to a neighborhood rendezvous geohash. Presence and public bridge traffic therefore expose a coarse area to relays and participants. +- A bridge gateway can carry signed bridge/location events and opaque courier drops for nearby mesh-only peers. It cannot validly publish a neighbor's radio-only message because the author must first sign the bridge event. + +Residual risk: Nostr relay retention and logging are outside project control. Public events may be copied indefinitely. Timing, coarse location, and participation can be correlated even when content is encrypted or per-cell identities are used. + +## Location + +- When-in-use CoreLocation access computes geohash choices and bridge cells. Permission revocation stops live sampling and releases subscriptions. +- Exact coordinates are not persisted by bitchat or placed into mesh/Nostr payloads. +- Selected/bookmarked geohashes, teleport flags, and display names persist in local preferences; a fine geohash can identify a small area. +- Friendly place names use `CLGeocoder.reverseGeocodeLocation`. Apple may process the supplied location under its own privacy terms, so this operation is not accurately described as wholly on-device. +- Automatic presence is limited to lower-precision geohashes; precise posts occur through user-selected channels, notes, notices, or the bridge behavior presented in the UI. + +## Logging and Telemetry + +- `SecureLogger` uses OSLog privacy markers and filters likely secrets. Release builds suppress debug verbosity. +- No project analytics or telemetry endpoint exists. +- Apple system logs, Nostr relays, network providers, and nearby radios can still observe operational metadata outside the project's logging layer. + +## Privacy Manifests + +`bitchat/PrivacyInfo.xcprivacy` declares: + +- UserDefaults: `CA92.1` for app-only preferences and `1C8F.1` for the shared app group +- File timestamps/metadata: `C617.1` for app-container files and `3B52.1` for user-granted files +- System boot time: `35F9.1` for elapsed-time deadlines and timers + +`bitchatShareExtension/PrivacyInfo.xcprivacy` declares app-group UserDefaults reason `1C8F.1`. Both manifests declare no tracking domains and no data collection by the app developer. They must remain bundled in their respective executable bundles. + +## Panic Wipe Coverage + +The panic action clears identity/session state, preferences, location state, groups, prekeys, outbox mail, courier mail, bridge dedup state, gossip archive, board data, managed media, and active subscriptions/transports. New persistent stores must add an explicit wipe hook and a regression test. + +## Release Review Checklist + +- Reconcile every new Application Support, UserDefaults, keychain, cache, or relay write with this assessment and `PRIVACY_POLICY.md`. +- Re-scan required-reason APIs and validate both bundled `PrivacyInfo.xcprivacy` files before archive submission. +- Verify panic wipe reaches any newly added persistent store. +- Treat geohash precision, bridge-cell changes, new relay tags, and announce fields as privacy-surface changes. +- Re-run real-device Bluetooth, background/locked-device recovery, location revocation, and audio-route checks; simulators cannot validate the physical side of those behaviors. diff --git a/localPackages/Arti/Frameworks/arti.xcframework/Info.plist b/localPackages/Arti/Frameworks/arti.xcframework/Info.plist index 2cfc3283..42143638 100644 --- a/localPackages/Arti/Frameworks/arti.xcframework/Info.plist +++ b/localPackages/Arti/Frameworks/arti.xcframework/Info.plist @@ -26,12 +26,13 @@ HeadersPath Headers LibraryIdentifier - ios-arm64-simulator + ios-arm64_x86_64-simulator LibraryPath libarti_bitchat.a SupportedArchitectures arm64 + x86_64 SupportedPlatform ios @@ -44,12 +45,13 @@ HeadersPath Headers LibraryIdentifier - macos-arm64 + macos-arm64_x86_64 LibraryPath libarti_bitchat.a SupportedArchitectures arm64 + x86_64 SupportedPlatform macos diff --git a/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/libarti_bitchat.a b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/libarti_bitchat.a index 86b0de10ac7f7420cd52879a4d7358c8f10d880b..ba2f35832a347fc60cd3fc28ebc31bf4261ae272 100644 GIT binary patch delta 13030 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 delta 13030 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 diff --git a/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/Headers/arti.h b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64_x86_64-simulator/Headers/arti.h similarity index 100% rename from localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/Headers/arti.h rename to localPackages/Arti/Frameworks/arti.xcframework/ios-arm64_x86_64-simulator/Headers/arti.h diff --git a/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/libarti_bitchat.a b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64_x86_64-simulator/libarti_bitchat.a similarity index 51% rename from localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/libarti_bitchat.a rename to localPackages/Arti/Frameworks/arti.xcframework/ios-arm64_x86_64-simulator/libarti_bitchat.a index 9ab40ec71a2e9d9f877d08a41ebd86ffc66aa8aa..18c0372b6c03b68967b461656bb557642dd10ce4 100644 GIT binary patch delta 4571840 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ą(oYRoBdz8oShtG4$ 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 uD@Y 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

uN(|=$v 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

-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%0Db*Kh`k>+E_*;F*0uI$?6Qv7WAudy}gW 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

gj68+ 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%0D3{>;KJ=tTg{7#$;`l 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

T6lHulIqi< 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%0D;gmB|OFULFQObBQ}0f?#TAE_I-0=JG85 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

ct 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

rw^L)5{g;0}vgT2TALEgsKAd_YRx?AkA^ z=DH9oh{J2@IX15W{?BbkX-_=X!qVz@WnSoMG|1^}u;UwFXl>31=E)t({~B+PI&pO_trNG{!^ah4Fp$)%@)90Ml%zQsEj>KRz!)sX zq-I;nAOd-vvvvCPc^O5Zg?AIW6q>D7c{;yP@P~`2taNHRanZAglI3?~3qxb1Fqv#! zMRPv{#WgIJZgZhG)9s)@UcnFM*KBk~OENitzUIT#m=S%dUixfDxe}B{fKriK_|7d{ z5Z`Elzm;1c{A=5|^4zaSuA`P54G0P4aPr_W7ky2siKrkv+jSP66DqTYs9cfVRaVOJ zjG#Wt7Czos$4>Xh8*6LID4$}c$;j?M8UHQQ^0&e32gO#XqvFWRpyT=05) zH{yV1#j`v}2CtKS!Enh?DdVZ^_^aXcW2JMeQC68OvxP4*{@LJMdA=QFnS+%ph;{sU zCazs1t;il_Ru7stiZ~$JE!Nsy@V;E&-bE}?%j*4SkOU2fMLhG7O>AEx`_E-7UNL&#ID+7P+-L9xy~S(d;r*7Fz>5jO+M4dkjfiQ16hh=#aB zhqx{D%&lr7b=WGk;55Z%rD#VMlb;i-I*fEBj=+xEP8LHC%p^>Le>IgRECEAjfZ=Fa zq7%-A14?CM#Q-wA)j_EPMAOz4mkOM4{b6NKn-fzm58L>#r_OdR3O1XvavgSM!V>6T z#VD$U!RkQ}i3Twq(8p!lvEjqX@LJP?MI3?wvG(~fk{4!sF(Z_p5g=dJ@E^{a)l zId*)SH z&cY%RvulfE^sYV|Mtiv$jVjh#8;UhAkXaH`Sgduo{TxoKm+79J${b~+egM|j)aKTH zw(f*{3cX)`i&UFE|3Zdr)P4dPfC9RNX*=76ZvNSt5C&kGX;Bdpm*XaX8Xq^g2t?0u zlOK#aPjA3-y&=Ki@Ci?pi4@`3znH%;7)v<9c*OHt#;>&wOv`B-#LV(aNVI?KjT>(loD$(7EA|I2`>hXIJ?0Sm_DWKFo+}8WG7rAp2 z=a!R?{F>>0KINb&*hzmD(u%O_W=qN7*egwlDSSeyejLA~Y0!3g!hDAVh62LA6~Y7@ zRW1Bic{$|J;XsMhxT43s$goN>{sRuT^cik((j1sX61jaK8gOaHiV7|e`z@H$1wo7p zvma?e$_y(wzt$`KO&x%3LZhKovwG^78%&PDF<=6mvl3B3l7BYhB~ zSy02TO!}y$`h#dx`9=(BFkv;@#asu`UQ(U(ge)R4Sy;n4>^hg|!tEQ3HQ3FWkP3ix`}b>k9w#NqZhCE~G9L5Uk2$>TNCE z>M&T?3~NRrq9kR7^W9UedosOYXgYr0iHQR@c$CQ8Eak!k2+WuO8(JeZW>4Y(oeI+XeET3#D7BZK%%$u&fdqlg>=QQPd|^rI0BlTG#!qHS62Q}P=2e+9TmB$I zsccPS99pvhOIJ2~VM@z>>dIpijt=|84P^`-ha4*I>c-=kym8ZGzAX{l831IP7j}W! z{^j>n@?V&J^_Art`~=^Ljt!X=_9ZnNY-4ajg9P8>ov=W=+P_cRi@ryzaB!3*qPt90N5!p*OJ{!}*aOcVG@x}eCz5Ej!GCIlRuH0G^+=~T`kHt}A5B9lAI z>~~E6di|Bjmwwf!zj~EVIZgABPrc;RKlLT75XfW87TP)f>9Trh&;5G-=j7QBwu~y_ zhf0_p2<)Ou-S|yUJ>8`yTJ&Vc#KYVjS6JL(zoH6r;k~LS7v81P*+&}GW+w~?+s%n@ zts-}Y{@*LR7lz92g#~42^JNRt#a3v?HV_@k&F8z`l5P26*Bi4f-|w17+-J^%FHAe6 z$Kz~wj|1MU#Yx-b;8U{lWbg-st`Y>sYhk|hcA*+rWXMe!fXY*%WqUje3{ML)P^hmenVBxlhQ zk|tGs%CWgOG+TH%d}rE%`>b-E+sF}*i83m9Xu-pq4q6%Mw)@yrSnxt|cWb(D7ZLx8 z!$ip%!4RmmXOcHah(3G5?PEcHAMZAtORUvVhH;D)yx`$v8^vjVz1S%>Au7R+j-xJh zc8pCAu`R~3dl2*J!u`#a?I6(m9cR`;7$_7X7B@H6CdcLZ39^8){mB9=6T7q$V^6`~ zRrVt`6zq9rgE?6{m9C;t$_7Nuv|Yl=PRx|8rq2OhhBmu~Ee^t6!#15?8RY^{mCUbE z_8Gsh3bNsioApL=?%J;lW>1a7djYKMcK)yI+MlxeU&^ojw%{5!ZtNCs-zrobd%b5z z+8T$c5nz`Mw%^t`nh!qNxQ9n}9NQY%9=oJ*jHf|8?aK$(HSSj|_6f&|)CgTc*Mz78 zd~dSR-|nF>tt!;u>u~9Sm6Wl6sawg>z&ovOpxiMlneGqFzy~@s4+wC#;Xmsd#s-|c z!~W*@F&dEQR@Fh{tw!mUp0sRUI1@#B$K=HTkBpCx;6NdiAh=RyF6%h;BP^gqktZ8* zSHCQcbS{|}VbBxv2P5u?As@7@isI!c!-44bKR^q!ff<>(u3F9ALrR~~`4KG1wsyYp zoM;i&c|WFI;_(rVHxdW`fm6%7DRG~Mr|MIvmL*Nz*D;CVCwdVaXlN?_pBE>Qz;m2J zR3-q&kYsdTP!%MzH~}Ba1b+KFUZixMU}*1y0q+tO~Rx zBP0OGxz3i~41c0&m$s;uYb|w=RHr0SpQQE3^$(7JMi6On-X6CR*;UXU6yUwFr0!c9 z7*(sRik@mIdu%`$|3~ghn5x(fYuZ7)(<#s~F9b60D3=Rg8tHVrSTn2if` zvhv~vTn(`{H&=A)dEsfeQ+AmPenX8#Z4B1c1xxF9wKh)Q~wRp z^Nt$m1KYn^a(6S=1S z=^Nfe@#Mf2ugKD?5grcK|ypsutZL44wjWYyDxU5G~(w=phM-he}msZUAe+?$hNY zb|MFV^4aMZ)usPo7((DYU2J|}B-m+i38J%RXOY3xH~4`LC4CY8VmKGfZbKTw@4^S` zIGmNyVHTWfT0VZk?zWb$F;_#&%Dt`zx{}yZRQxVu7_NZuLTs3F;a|sY=6KC7c-V!m z-U>D0ZAd>^vQHv9@t8HJ<=H4q4;XL40i@rjO31rzg}8*`+^=oXJYx z>V53S@5=w3x>@__(%*5P{n#yydo1nYbgA1C?r0SJ>C4h*EaB$Hy_T>$UAoi~?r9ve zgvoR%&rSYgJ&nK86-X#8vV@x(h5z$KK6w{6*^hm(@oBDJ(SIym(gMv>?|#cdy>gJv zljRSVKn^uM|FJt7e`pCb}mWd88~R~h#iaJJJ-CBytujX zetS`O{5D>Y;X!5pV&kaJ-{A2lIW&CP;Bzv|(fLX@?d2vL+&ji4AKbLhE}s(u$Od1U z;G#^Qt6>~<^CcOOXM>ySxMT`nsprDuKQy?<`R?(qX7{*IkNMyqTHT}Xx#uq}b-QG~blJ5VIIjR^)M{@4l#xV}a?lHYW1_sMv3tI5`4&q_xtXR&AE-L59qeUDGbbGamsizMo)dMR(I6dV zBGj0U@;$U(B~{QrR^!0iHpoJM&JSHn-468l)mGyn*-eoPi#1sJ%6&Bc7R$YIaQsT+ z9g`6$jenHqw%)Es+k0L>lIZUG3wE)O_(3ZhU~g{g{fZ#T3%?|2823L2Eq~z~6)z+lv?PVMEm>+V>5fneZJbm3`+EgVd*GKtX@(>9RYY|8D=*teIV$2NEgm*b{r1h7^grC+zVJyb1cE=5=d_iqeYwai z72A7$h4~|cewRQv+w!F`nwu{ElE2yTroCK{YFi#p_dE_5>X6s92cS;Nn(MNsFFUm^ zUHk?)a?z~jT#A9X9%iK#v-RB^oSbWUINeha{mliBEJ@!vulDTs&r5f0$P`|j)!D$` znO$ct>0MTvI{W?0(y6XhOTuNfGtNGJS$am-vhrV6y*c~2#p%zq)y`0Kv|M@yM;;T( zY~hK!yWYJdeb=(uH(aid-q3YYF1j#vcKWVM((^7~(sD`dynK{BA>DJ8&lKu_8bqaQ zaCLhmUHEHFYRiw)g=6VbTgkL0o3qhP67zt|ZBoP%;y0!(=KFzvgRScPC;}XL`kihq zb>%s^mW`vG?T8>K^si!p4SUe#`e}dW3&Ku;&c81Ze?zg0zHsjc(1D@;IFp=Z1 z7MGh!gr&_uR)03QQSHhHU)NkXsrAM&ZhPB@Go>4)kxZ~cKK%Nqvf{3Q)xwR#+|yJa zeZvaHbC=D2(_ZY5Z>TIj$~UNGtf5S94BOJcV`=pDhc)vPMKhcRfPf-zVZd?)@lBUdCkC4QVGhs#p%)P}z_mameO zO?y8hJfHk;<&0rD*+0xT@!bR}?fO`y4V6%{1m$dh@v^cngyac~s}XOKKRet~9-8Wp2SoFkF7em3531 z-hwwNF!%T(#t(`^K{&_B!1cfnvZN2z@KmfCAfQP%FQNAU*cTu%smjXFZjpv@EQ z8!gi&sqyyXklBSW39CVW(f>}%sh4}zHg!P8Qb4!{G)+)cLHVd4Ttj6L&QNtK81QRA zIHPr)MoS+M{XsCT8-`1|#!dnFytzKdtua^W!dAfnr(-vbST(8d5*}@Q9ty8R*PD#3 zY`ulKS+oRhEu70*Tc)+fFyQ5Cd|Wo1=h{attTmP*5n=eiEj2aCCeEiRIkj?DWBIMD zi_}$buBx!Cy%~nGVh53kA5a`^OPU+yHpaKx1{yQ;TzD;N5F+S>7a&8Kcp`_SiX?O` zk$0|%>lQE*e;86i=#(50^c6aVT{`CY!iI_xzT$@9MUKH?r5q~zIIrX2T)rkm(&3^| ztTrJWnA2iQU+qA{cL|j@+U7+OXfNeIW04@sd+aEenTMWiv($Vp2>`Qp7ZI9<_ko;1 z1SX4v8?px;m+w8RHPIxYgphOISkLYavl&u6{Lb;C+&g62A`=-Dri$c`ZEn|hj95&$ zVEiZQH$3KgdwBiCAJ|#XDXP|n*Q+15niIXXJFsHh|0jKFZ14`1KDQa3+b{2HY)G^t zB%43Z{{VgO6yb^58X-9MrF$L|K`FwXwF5rcO)sZ-UjGJD3|+o`Zq4Nfo^4CtHCjF) zA3UMAH8X0~&(7``pIzplUL5pTxD@!MmKX$I^wn8B>{M6#PvZ?X@q}+nU6|dhPSfvC}~I3~#`cY~_~n z9Hwgv3VHJMv)H$J(IvHEc0U2O{E%XDG6r3kmUMTw&*w3=y?r>At~cjayET%_bG_A+hv2ImcGLr=30K4 zF1)Pl>WA~vw~DAidE_k*7nvrI8D+2iS-sK0R9P!C@xPKe*2Zn=(iOt4#Q3qc{MyQV z9J*4jT15)L%gkZCLdMPMK*|a1n!!D6=p^CeAW~)}hR!KOMSKAm_Sh`Zp)m9#1>zUz zP5ZDf;zZajaNo@Fe@_~EhBXwRQ~zOV-J~Q~lzC~S3)t1rC#e;(YhST`CwPVo1Ymn5 zyB0kbq!oH_1g&F#iW{1`>|JVKO$4{U$RT1$r^Gcun* z=M?u{!=?V?Z|@ZhG1FQXkAj$Mn5;3U$ofbRGkLEC;(3Mkk{%2g#*fw}Pw4+2j$75R zB`q5Nv?_^rwopynP-HGS5-NSubw)BLnMaf%c9=RFLgFj-UFOTS#8wVT;w9WN2{ChP z*^};Bz?WAYt0i;eMdTcpHp`1P0Q@YXf8`F3l_xHqMAIB4?SX`gUKP zS?Nc`=~b(9Dy2L>zAyiITq!uFd~=fMcmeqDsxe94;dA2%f5I@p7LQt6gSS zR=doueR@^wFRM|g@|V3E0E08A@|X2B3)4#XsfL1Xl2QQi4O8VZM-8n$w ziEc0AJRn0nJ1;97`!c!c?#J#NLh|f-hQ(+~ zqM4Tr@D$W+o2o#W#!BL-1!ET867k0?t0Aa#g z`+Jbob*FK#%&gP$VeYirT)@)R7Tg9}PSjS;Gz(^(1|mGIR^%9rcN%5=7cYgY!Z`}c z2mgg&A}!36Pp+MRoYc-Zx&|axJfhsMT5~EFWU2WYYChK0JU6KsdK%=c=HY#FvQ?fGRw{zJo_%C3EZiz6I8!w`BFJr3pG z0R>`MYcSigcm1cu6_7i(cEWryVx0|h_g2K*^&i1Z8M5U&zx$*x=4_8jQ}7WRs4D5p zKvP)vT?uwPDZUZ9J|VsrrcBUsmFP1ak~ckFQ^)cjnbqj@ADf=mwndQtq8IduabO%e z&O^r;$NfWR*}5Ma5e1C|lgLJ7XvH50rXc-dHkvz!f$H9_BD|eox8uJl_4XhB8_N{xWAGpL_OIoyj4NrZQhlp@8X=`G=p;LUBN8?MT5^> z#cjR2y@FxtSGhsoAeZgxKrR~C@{CwM3FX-R`ARhQ0W%`{HTXN_e;n%AZ>wY4R#fHbJ;-&W9$2y5g!=`B#mPaEYcQ1BUpSCTO{VYc8^vz6_;Bp<)*cB! z3%^gL9=5?iQ~%ja`p%xlO?=Gep@C&_7*HAOn87lB)N2|^-&q`|3~EJ8*ryh!+eW=6 z|Gq?MrI2^C&~5oj$4Wq+S5jSbtb+0pcEQ<8uQ>^95=^jt8*R)*eWeMF)1wUPD#p=< zt6nuZc^p?F9-ww@VbrK(43XVii6NnH?jJ$>{cU0K6!+R$3!BK|e6~;&hJ9`BrFnn3 zy+_<9NekM)8y1(@%Yk8aD?~-?++xfbiVajv=yib*oncqZCh>0Rp%x!Ilma_@v5wzr7m72G0Tu4m8-;2l%>V zU+>k|#|DvLsQ27irRd+dY4dxB{z$#O(IkIM`A2%A8c<*<|7ct9?J4ehqZ#)6BO7hz zr;bOq%$~a~jJHzFP)W9-jO zTM*sPg}j=4-i}KC3-k8}k$edV+4)2F+T>Ln0PO8(5RGvY^!>`c)I#IiefILZ;7GkJ z{=r_x%A4YZUbgQ6PivG*L;qc)-u_6b_$9k}v}E3BZ6*Kqf3}1lm5TquO^o!VzKRA6 zr9^$|kAZ)(wqxoy{w-c4$ifIiG@#`HR@*A177b~n;>?Cf(svHkGDgKo^G*P757hef zC0XNRxQA4&@fy9VTI1=SepVgpxJl!zb!<*d!V=Z1JO$jjRoTUH1VMkA6C60G90!Hi>u7H##A0y z9`FDPpn!EQd4mRWYu8kqMd$*{G~;YsxtgXNo` zNs>ey$u(R_ioPWZ>t1iN*u0{%Q`^1MnO|gY?HdGL{p^eSh}&DTg?H3sN0!vqQcAY) zi8|KqU7P8*3C^+kNj^Sj>|_*gTNNODbw8?KcCgr=!5ZyFs~sA8wgQ9~M%L+&v0oq{ zZgJ~t*xqxLFtX8A%(j~q^lu+XI2zjPO=+m4WN;l~!zdSRU>UB|!DQ5k_~dD?eS?;Fb&*&tu`*<{FNIF6?ZcJ`HY0Y&+a?d*PY! z`R9kvmNwU4!o8_Kb>ot=^rwODai*2Dw%4-R!=WJycHekT1DLLJ=H$}awj0+k#M;KP z%qL4TS?05iVQ=df4BxmIxwmRBJ{CD&@QLCSerSGduz4E#gob3~z&oJyX(krq;B+DIm|xIx}0!hXf~tW8#06jX)UeG0I^=H}Ui`Kg-VlNe)E}=T6keXe z_{x(4Wq~Xj;ajo4v1Wq|{%2W-M$hQ{stgN+=BO6!vJ_%1yRd);+sv<;)af)JF~WJy zH~n439BMeX)~uv(9D2a3_!{l;!oS_d2*UG^=GK0>pIb6~H@EgqK@PV%h_9634JgSd z5X<_LEz=Ta<1>4?ALV{5AADk;H8EI%mCMx=9lk<4S@e98Q6$>Ij4Q4_1-8Vor}IKSsE^ey|i@OlStZ|;i=g7YR5h~eWwM_5Zj##@7cAV50JL^zU+&= zcs!8-HFJ@L(n&Y*-aOvZP1r^CZG}ZhH_f1}k|5Ge?4Pe)hdytE7ZkeH*&r-&;h?3> z_GE5_*oJM+1^>F$QogAX%mv@l=p`6&(Ja5~twguD49TQU3}9$ck!*@tu=qmlAvdT8 z_|hIIzD_c~tNXC!K%Q`LVM|xCr#voQ%1o$+a$a za?QC-)G~lLR42BJj&QMN!im{O@jfdXhwM{vChIKh%3J)=&cDudFG@4o*}AU%#BA$) z7iKTP!R{99EVr{_MXd`v>as2Oca>!an8p~GY{bCarQ@_6PG|LCrKQc{&TPzO*@AIz zv2jTk{++TEcCSfQXL|p9&bNih{p?KbCqzR(PMVt;ngwzlFYuCLaTXR+%fCg8W@I&awM+I8O&mWEIwbrOLiuih9rh#>DR?RU8z<+B0 zp^swQgq3#Lkj13;r^IW^aF|$l`-B09JCs>qE2v$J$ZN5P8CdRV75sdGkJHSLyXN zLshtV5MiGLVdh&agxTN5g;4uDKWTpuU%XSAEzrsCnl~N{rkX#y&RIbmm^k+ zT}*62e^k#?_S?cH{Oe9|vHY^@F7~udo>1#(KojVE_viBwQ4Kb|qKQlwALLV_j{qE7 z?R^}k#0ihSFb*s&>y(DN!C};6ir~ebOYcCK8*#vl27=LtiCuv;>#8{LT=Hr@uafP9 zOt%3Tgu6roveBK=Y%Oq00{c@v;kxOs5uC-RCL`xF&%FGsOWfz42lTfI$#|iK&xXbZS|1d^s z0@1k;L-Gq)x5X#uq4~O_P~G+1ZN1*vrC9sr;Tpdb@gmmfM*@qs@QNjEp?6Lmla1oP zQlJk?nKo4FFU45EQa8r>jxlbo9^>E#9jC5Dgx2L)IHe&pCO@3Mla(BqvPWi~z`tux zRjZeiQL#NZ#4WmBEza4Nqt1euN-d@c<>dr3BUOFp=?w!L&A?fx|FKKBxcx2SU! z^Pv?*$9Ft2E0;P5LO1h;bEUNOqx0*!uR-Dr9_oU@!SU`1RB7)8kFuM#EX|)&(wK3S zcf?qob(kzLaRi(2Uty82=hUPsfz7QDi?5s<^P={xUa*jpm$mcE z9K4?uw$vaGF2wj()42ra*KvgaQ097;!SPh<6ac}_acRkOq2FrF6X%Fx5!&cDM=z45 zGbJ`b#;ZPa5U^hs7kw6~*5V4UN{eXKtF<9o&gjJLh?X--=Qq%%`LrAOIlr0vg~R-3F_CeSIybkj$-1BO=Zbei^ zeW+VZmqww#K-V@PjdOkOBZTdaCve8d4-zVQY0&;dF3XT4IQpcN?r9T3hDpwbm&}>3 z5MO`op4#Tn{&sfXSB=3A>5w&~%Y>svwrrKl6V?R325-RV2#;l>tLxB%&`ukF8rssn zE#31RZPt!?NX@~LrHB$-mX$YQ?=EE4uXC{!8!7b%Syr)$d;TG{DHAn50cjqV|Fh1o z!ioa6BR89YHutXFY*ec3I|SVIdJ9MGQsnirXOAP9+sPx$oapuBa7!Y(2cg> z7sQ$^KNOvp`oS1X>w@8?2h(Tm2`-php4;?$F2S>wj%noIOSVLdQ`wuZ^k=y{bZsHh zmCj|*ejk?pIyjtYYG>DG*L;7gfH;~bbwpuN?aZ8?ZvTbY_+NQ0sCdHSC0DVoZx6k? zAnFttguWb=+}zJ+Y|U<g9Qe@@ zKNT@r{0iP52@Nm%ZTAW!T{r{u)_Ej8rY(5HGQ>L zSOxd6>3+dn6-XxRf{V+u&B{L%Of@>_Ke4&_D@mjW_I~zl9knai@Rvj)8vuzUwdzmd zc8MiuT+6^8&dwOEw)I|*WzOzZa1QkA3SM&*H@3rc-hxoeMZiW+E^oJLpCUn7h0~di zXUQr5R-X^sN*f)x4qFa}eHJ0;NWiCrJ>!>>9RHPM!*+5LhA+uA$ewakI?zg%K z5E?pxE8gx7kWPacoNmt^pPHi+Xo8pMKMa+&P4t-!Q^9ssBpxWv$y>6~b$>xqpCyZ$ zRta{3MqpK$&;;_dA&`mG0i0N8C1Ay~t;{i4)}^*ydKa3^TSh6qdMhK_zReBm>VECN znE5&Zu4i>M5q6IW?g#c*vgY;WKw28KO*v$j?5Ntjo->2`#O%cX@#hazCCI(JIdB_cfy-9^YDV}n-R>_UIcTsHy4QixxRty zzCmsry)icZkNug$Sf>QM+n##7wS0EH7rezw7{;>~dLw7I5~CRqiLKTki!7|FwWxK6 z#b*OpZ$iv%l;5W)JXQqrZ+nOz@L>O{`B+FyLzU|ws$VnEW4R`bcOI5cY>?azYh`Gr zS3hxcnfhryxSZhAhZ9QEA-6il5whbGZY0(rnKrfAh?Zm`S5R`EIzkU9mCfHep;@ks z0xqU^q=@oR>A95tiXib#hunFl+_sC=~f8^5%h4meY z1!Hx0=KiB(mYLCM%AXnpll4F?HR{{L=q( zrT-8GuaMW*C|cyzik?nhlP#s!B(Hyxy88cF@;dAx5|!#r?qUOXjW9tu32qh$PJuJy3O|Myr*)}vGQm;WTpOFxltl)hsrNB=V{rG*$; z>PSjyIVPII&Qj@;#wId=K(<}Qpt_h)C+ zq}w0NA{a^-|m*9b#%w$jF z3W`YxUu96`iIa$%?7-fxQIxnjiMaW4GWXEJ!|;MzC^8Rti~MhLM?RPC+sSuu?Bb;3 z&AiU@6jlvjGUnFg&Wd+_vWTZkp2*RMh=otmw_MAM>Eh40nT8-7!;Jn7BKf))B0&&` z7cQ>^D|{0-@Y!3O%$bNxP+*CiN=4*+4gBB_=>4H0XBC2Y9sHp6QN`xIuE@FU0t=g( zjjfuDkC_B2d|Ud5fyI*A3~|<&-h{<7k3CV?3znkgX$zOk>X^CWz&kRLmugLK9wA`+ zl2Ok8u(+xZWm@*Ef2Zg6uHbLm;(e`P=JtK)p1;uqIU~VXGR48swjN!DP!Lt?AE?z;+QT z25yV!j%_3DAhveS%8|v%&5gs#PjJ*xt`!U#eXWL)RR{dPBwz<7F3MLTEudFe!K+=I zXIDY9I6@{ER|>vGynihPU-y*skw_)4qTllcK@|m`TJ^dLK1jM;_#_)5H;%N6k&dO0 z!xenP#*J+OfvenD0)YcFZmgS9fF(b{kk`{g`-vj@|B?hk{4u5yMf7Xxp(_Fb z;G4kSAz=6)&@)dL2d31_{{K&U=Ju_xE)@8$DitI&UtXnvVU-&DP%xCj_&=g&o(_ik z%7LNTfBb)}XRh$kuObMW|9jPbNEH|wD;7_AGWAomX{tQ1nw>aY8C}Z?I;{fr*Dv&5)}N- zQT^FLa6W?4z2}%~o}E*3)hDu1k7W(LTJ(>tLQNrb!ql-;N)SL(o&pZzPR&bbj6iL zLkSyw=&sFSZ1fabKTN#V+*R~RVs&2&t4scRO$qq5#p{@R{tq+Huep%?%8pIUJs*nD zU!Q&cPjksNPP^U;s5?#wP=!vf?H%*?TwiP{uqTA{G7ZSVq)bS-?W8M67Y zg`7WI_*g4b@OVXrp5hffSmPwtuj#Nuq7NL4iNQ=AuMW(H3pu%i1+?tAi7D$7W6&Kx zQ7P(l=MO+Ts@*bRziWL3;S*a=FBkSMY3?N^?>lPH7xl=Bqcwf!_qL_r^s(mdJ~$)Y zzQYSIqm-5ViIgy(@CftW-cQadLqJl1)>w;kZqKL{;hz@zgO z>GzuVBYAiS9`TCL`kiNb(Ylm(!3 z=f}gpluA3AFSB~(wIs7BZL}3u&6k*Du@adkd_mfDH0$@=P?)}@FucK8B?UjJF1c#+ zLRxt$fYG6QAC~=k@DhB7!kzh7H7QcgL%%&Q>io-^?3zEy_RUK@?j_;17o|9H{mFdO z@5&El*WB;k5?g*MLqH(xp55pZcbY-o>+Q@Jo(4vqV+#f2g8A4wW3}xMXVOh`62k=y z(-&Z%I!3T7OgHk;Cuj2k7U>Sty^0lj=L2!2hn?4+_;oDJDSRJ$8#}!8-3QNPUI1q= z?Xhcm4EBiZ|9ouLCQN3reG1tG(&p-v+0>j5+t^nu4JOC3Q3hLy9Su1wj`C>n3QrS2 z`!5(Xq`kj5s|oM!#Fqbc6ExZ}vo3S{A&JW6(CF35bSW7Y+k3uFHqLfnsk zm3;Z={Ca9=&P6NtWU=s|bc$686x+0a4wp0B(_enV>Uy`HlFhKVu49tASY#JuF2KC| zLL^P<%Ph+*cW{Hot$YUEsKx#b^PT_`VfDkTxN@=F9+!6HhdX9gxBNp^!o`OS%+AgC zv+ws!*7-Qsv$;Bib>CxD=Tv|TfkOAgztyUAxfyAX^( zvn_hKdwH>4MD4ZFN2=y-xEB4 zkzXG_O__cp{I27tw88kAd}FIXPD{W+l%Mc|me`UkaR%~dV@fs>*RBZn_61P5eb8%p z?>%??%4dk1d$F{a9MCUS{+k zU2PbQHHo`HK zY|b@3fkC5}daz^iQY!zwtYKPqU?G-y+Y)?khCSln#QazJER}MyY%n>6%>%oREUuOP zZ4Ei<%8GXjU^Glqcsr$Td z0~7X74b;BeeK;}#5WwYjtDnO03>ogMrvN@0E+54UCGrom*)m)DL^07ZAhO%MCFM<-ReV{#IMGp=Qy zfRzMmB(&nnJu!N@Ta8X8dRlwfZpH}7YH2HdOFguuTp`akBb9LhNp5iLMsCfEDl?lp zkh#YSk3O}HQ%5?x&_59niwMcV>VCLdXG4v^KUzz6H2Ol(2%+qqWuw0xC2b!+_-+@% zkFc+3k4mVUw!kiJ^;!qV?e%loq7o%%Gf(kS0Zqc%E1 z^|xWy1T(zrQWoT+R$(@PrzVQii()qa+-rI0s^hyCoiM!dIEO4?=Nv!S^*gWWAuq+e zv5+4;WHeAQqkM-89F{45Hh7s>>AA@N+OTvHYM|Vne)rs0Gv5{%ofBR6zMAcUB|rDo z>_|~L>iNa^t0RpUqqB+VXdqq(2EPPpwuqb7WVVA=z09WCu33#UnR(0LxVY`Bm^a{s zaeeN#w13esu8CU}DnFn41JMQsX-<3kPR_$kAPb(!eaT)+=TT?vnzgWo^RCLsSJ8Yj z?=p9dnzMHGysw$Z+1 zWr7lW29QLnMYg&S)$~=UrmtVf`M2v&B$QBXx;Tm^kQqM64F6Fx{3|rYYDr~4YA+SF zp$6b{;*A||#EdR|)wS+G#-@%sq=hJt2f4n^Kup{gm%tly~6A6a?cq6lgMREa# zO){X0Z1)>leKt9)IBq%7FFHcmxNpY#&(-G|U%0jwOTn*dnYjQ1yce{%fX29D2cxc& z&`=o__Iyq=8yQ5I$wDyXth=0j9OtCc8Rpem7Y~-tDIXhEji7>R_E0|6xbIvua^c6I zPmAmD1Mi)8Y^Fp!C|vR;IehJ4L)X(F)L>_C+cBFnrCHduF6Nvuy_wOq57?Up3%zp& z`-#)aOB%os$NOKnQn538t~R`q4IMxLs$EojEIufV4#sV2UC^gN03)~T={%{m_mtzJ z>+fyto_v#b0$PWkI-<4qKx=8yao*&8<(~qh4z%Dy;~~$$-zK+p@ZZUO!r*GJ5OgwZ zLmNQrhg2OyqslE2+?XthK)woE*9ktUMkj`u%Q)@ZsJf||?%@3POa1A|uZ4jO(ZJQY zqX5M287rn_!?(_=&0$+B5esjkVT@3M{$fNo-m5zRaXPQ=q@ z&}EOXU~241VSu22tovlr1;#XMIS z7a*o<@3e{~`{N$|0-L`a>(4EwbZk~gKIVpNY|<1?10AzXn#$h8ROw$g6EVQmuXsOY3*Vhx z{x}XDbIX_Vx3;{3zekrp#NRpP9Dk1~pDjzvd1>!y{Qe()8fF_yNt;#j9w1vS!M%F6@LDvM>+4vWE&~e3kM*crcI-NcKsaOBNLRlW3|Jd;}lphbSM8vkHB#iWl77?YYbo>wAN8@Wcj+92P4j0h$Nj3A(;hn}3 z8{|5J>u0!rhU*vjy_ui1AYUSFfa?mbC4L3&-_7+=eh#!JdehzG0Odp59Z-Vd=5)>j z!xawB?mAvP99UZNXSs6D1RmX08j$OUQ$Jbso)54JqyhQz-OH}{+bh2O1=E12hW~Bd zl$3khZ$91{={pIPe?(_pad+1n<7TRr?2Jt5 zCa1UboGrh3{QcK#f2%7r+yCV)*S+=0znv;G(Eyn{6&&lPgGEa0O!v<7YfHBrBdP)0 zTHd!^$23R&h4F7TUvI^7Ug}$+x|CX*1zX&b4{O;d^bJ45H1Bp zKVn|@2afi>g{!mv`5iM>q>Jy+Y6*1u%j!LTKDrvPy}j-Q$u9_H4$r{Fj}av;j%tQ* zN8~}|VUIEr-U=b@Q!wwZ5Gv`5FreHKzw;oX5qGnRP)QnPgJ#|Fa?#v+=*!Vw%U+Xq zmgwx{nRp4WCd&M0Sw}q1N*9}E(`*ifZAce?bfoNvmehx};nJBw-))L07yYw>q=hTk zSwS}&EL%;RmGvwC%R){DR`koFE)a8i7uFn zw4UzSW%z8sv$VeXjCEpi;s*qL#zdc_xCVq!Dq$CFOR^=H>79M@Ot3kjQ&wiuXFZ_k zRJSlthTsVgbuz64)2EAmt(rUFQCNp3U)vHQgThO6Z6P-9TQvT7%~p*+=MNomR5JFb z<3&S+(SE*R_)k67p0xeS)6Hp~h^oO8UEF4ui|2%O;X0;9kP;01lE1ld-JD#wA>F(5 zq>>AJ5VkT$=KmC?!t-Ya#RY&+(02-diM5x;{^@*W(4-}EnTh98li2EbRicVedf2Br zn8EI0xO6Fjd5;$B$7b4Ve#6OHulT__yJNNE3=h zwMay7nEgwp|*tr!PYXHnA!g-x`E0VY9LGFN$A1+D%&sDGCs2KcI5 z4MBv9>5F~Dys-e0ZkazXoC*FthZraE*>%$vycE2zwcwrkxD5bZjCLZvxe1!8uX zbKEy@FJ?rGEbfEm3pP}v>#>hHwDmd0F7Qz?gkCdEpgCRxoA2{!8ciaKUtc%9+`fsD zSs{eB`D%Lp5zRcMo6Z{Jw!z)*;kM4*4s*+$GW26!z-50tg&hsT=?R8nt_88%$F%-T zn*w{o`-Dq|;4-Tx!USmzavTI9GtNDZ>v3F<zR;Q&>$($L%h&mY@*H4;ScTLQMvH8L!kziGLVdfb$XbbRD^eX?PcE{ z6aQ`Vmv_8Ro0rN;-NOG#CSTQ z{7@%!VC(Y)hadC~10stw=1lNF5dWxm(Lf9H)z*9NWXDCqOIj&Fsa6i!7!1Cmz6m-G zAUpx07-!vp;Xn8+YX|PrqmoGXNq8uY0R4zDcZ(HeuW6Y4|-wnzclgxYirmxLp z{$nJuYbNMoD$BS=q%Gi(u+@8}xWY?>#KQqGfUFM3Nw{4gZ27^AtLsqb6D+i6tzr9^ z<8`a8pDJB9A|q0{;G+}UeV6*EVTN4rU-wg&c+S>z@e8oHAVKk*CIiG649ApNnczHp z*q36PurA%PfRJ9dJ52Z#(E&KGhY>O9Kv;$6dc=cFX-UHZj^yPN<6daJNIL!>2se(j z(R+<_qD|DHpiSVSH|plC+_3oD8u^oJd?N*e29~7a5{HI0LkX{FG{X%u;R1 z3>_8?g9jr%wTnYh>GG>x0}ksV#5Win9;tvgQ{Uj_^6|SiFF%(GK}4>VTuO! z^A&-J_OXY&A7;dHPiIeXD-MdqFZ?TvH?{a{px%D<;%8yG@A@3q<qA zxSHTR90@DBYAZS>DiuXQbf!{`UI(aBvw+*p z6O!Ec6;Rd=V^{&GwCEV#w!jm!~e;lXt_=$gautk+p&j{pCeK>-i=#%M=X+Ux;XU7`j>WPDngj(_DV46MtID;c+7nUsd+d* zcNmS)kO6fytUj>3LPFll=p8o9hmW#}Z-1Qff2x4oCk^B(YnVmuVcd|+VsBBfV(N&t z^x}P)?pNkq-9Yf@2e#irlhXgXWBnTx3es2nZUqY5^S^0c|WwLX&bXy@6r@i`Y^JiJdTDp$$~AoG|Gfb9y)!9pcoP=}esw zf1Ocg;y|E9g9*hpG71G9EigjC5qr736c7lC?f>&#`<(ldq`W*c&p*#|a?U+xzpTCY z+H0@9_Ihd4x+|(qw{G&eYautZ9N4d0;Jow%w#q=i1PYB8(>%7b6qGONtX4Y9Tx)Xl zOlLXYGu^*u<1BpuI%|*BVWC@+&hjF^NPCRs;qcXs9Q+KUlsr#7_k}T4LX!mP9QShK z>u@h<`{%x{mf*;joNa!%XryD_GUkzMCZQwoaU9&Qh3s7T!wcuP1z%`l4m#-j_6i$< zw8z&aZ2{VR#3NAuL<2*BD=k;8`OF^aQSjE0#$ml0a0oigP%_siErV;^Yy1D;Mm3Y4 z`?(oqar+DTiG(>AvWbA|f@yRVHU%6RrLyapol-waHcD>8pi|pR#Q(D?v&<6qO}R>9 zH(TTIsGs-Gy_DDTF?p39m0kE}gC*`OKnIu<}3G>yXABENH9@;xp&;Xjbpp<(<| z{s-~8^3AsE z&OVab@H>^8B;sf~RM>DA@Eu6B6qL{_nm(dw1>PkitWuFvRCaz?4x^H{{r0x8va_Bj zs3T~aSV{5u8!gRm;FTcHA5r)QAUvyq1~JdYo_CFlv6CKOtwtAQTXCZuHYTL2(9f}M zPRERkO#ZBSpKGxdbK=Un2Q>vCB&`w$<3`%Xe4tA=C(vkcaiDA&vT$9=EP=|aW8Kgv zM4pCNu#{+X?`ys~@6kdBPgFSY;o|27Ym-?BB_o`SqpN{Ro-CBZk}lrB;z+s9o2X<; z_2aH0ZG1vBQNp-=bg)A%2@jJ)OGyr4IgWtgH-=!a#&IP|DZb!!y9@cl1m95@b3il0 z4ZRDMQJi&q_pSptBENGhDB@BEa>v!zBu*|sC9nI^UPh|Vr6v5^U;QmZ#{#UOLw{-| z!9M44oU;Z0&#nC(tCz7}%vWC2N+=S_u)e<{wV_)yD%z};aHwn*fog^BM$5sud(w%s zL&(JTpLwD6DnWlIIEP~PPdc`uW1d(pp*6(YcZEY~d$PTHWr4iZYS*qeEXQ~=nTqsS zOg>Eo+r&`#K(QFPm_LvpQMXMr#_WVi(0?~*HvQcqgjU||X72{PYu{n)#+A048=Pk_ zTL58$PToK4rRy48laTZ9B?`oONQ1l8uX^sHL7m?+>XCmIl}niXv$(o+lC{1N{3rmr8~ z3fg7jz-isB{kwDP!5^vXBpi9z+6%cCy0B6!HJgnt3hGG*H*Vo4Z*>gqmU|3V*_G-1_o@k;LyeY@M3gEzM6vx%6`P?owm>D?0AoOGz`@+5(Z zPM%eJ@+|o5S@mo2_rewX*`|y-S>b+o89_AArB7}vuw5ErytEBYhOy{q68E!GD8u%* zg!{q0biHkt2ehBJd>L(}+k$o5_~y2>iL#bw0pXL#*mA|_kRyVM|*eZ@st+tT4(d)+Jjv{$S-&E40{V}jfWgcRW`isIO! zfu@(&mV-1yB}veLYC?I*sn$p@l^;!(F!wQ%(GwC4vFVEi0SKN$?e6xrV_QC}Tu1a45Q!MTSJ%iupk8uLgpwS#Nn>-Y z;#U4W0)8kN0Fz_Ve23QZKN}yPm{N^OciJ(rDuB2BhmW`H{pvF_zu=Dc-+Adz8){}_ z%U7Z<5brDt>H}}-w?C%3rXOALRMY40yV_NE;b*}5;VSJ3c$^Wih z>E49j_kt=@WSsK{)M;B zcjc-6@cVOJ9r{!-k}8bAXU@9d>mA!FuW?;++?=O>bY=G||5qbG{AE)jbFCd0GRuIt zewW%ZW}tf07o2hL^{G!fs6PCOr>^+??Ppx}mIsRV9~yDC|HWmCrvBH!z7M)ej+yfO zkw={OeS!oRbyeOHvPl8PNhw{OG>Q5x4xB!1|JF%o%x*vTGb>zmH|_c2+pc+MAF;3g zkE*jeYIi<;>duQRBUi_3{-hZ%EUkKm3H*OlNl^&~Yg3e7(L^Q9^8#A)N?V zuCDWK;MtYSJeHSGldGK~Ags2W4u#ioK6CZ_cs3vi63~XFsc7px_706pQDCIaZ*a;uPyjE9z+qXN|1Pg6;+J< zR8R~grZ;+RE(ckWKQ2Xw{gv`L#5t1}oH>tm0O-z~%bgPxomuLn+t+cRj9zgQT&C4c z9k@(QI#3k0Xh4h2TFQIC+a^Hy>w;vj=k8r{(kR2S#6F_QcavsBp zp-K6}llR?2Rr$%hg3t5OZ>Aqmz^8r@B+&zG$Ag6c+Pa7C-AnfZ=t5d5C1+yDk%3{l zU@lzT9?Oyc0ZMC9M!SLQAGp57wTbI{Tu*Un8ppb#Kir}!!1h=6tj4z6x3EaA-lYEP zcZ^t?$EXp*Ytv6PLLeWqvcb2Z(_u_-FZ#{D$6EBqiWr^p%#!suFFJqJcEF7~+>PXI zHZi5kA5F6n>5{;G@{8Y`_|)XW`D4fBEcxo7r8i>A5u#+rKE;;JH)*C>&;azC>SC#j zcPGj#_JuOxET zU!E>EQLuOC5$+A6e!oIo1oyFZb)))c2mONw@1RxJaeb9bcDeU*{fbLS1jFRC8Ht|I zFw}keBrF%%h1eh!>Gt-{{ntG8g)jYbjw5Ox?0)&#fwv!qO&v5%2!qn@+u6!=o>%Dh zLa+NBZ_j_CfLy54dJ{M)2680pG1|GxOK@O(p&f@M_MO;9c0W~BVor#nd35f9?%!9f zk)z;a*?*0Ky`8fhS~}!Q&d5p{*zv`akN(Dd*Xvi8jWa|W+O7d{?R!kgM(zK9-2Ca;Rna@FCL}*e0?Uwz!}n>ut`b;2g)D{ z|GRfURu+hU7YKLnkE!@huKVM=fGAqp)OY#K6@8f|;?-dYT@}42RZ#RS7K$b4L%dkF72Y-aLLZmzAX2O-w$<{4sZL%~y zk%TqWlGnYywu1PVYvB44wF4Yiw;g{VJ^Wl_dvofF``c5`4YjA{SB$haJlLMP`ax6z z@of9z8L7`7+t8l+{BV0}?T+@A)GvqHTXo8EBLmT%@|X8!uyV}cz?2_tT{ueKD(8*O zsUHkwD))QG?)NtbU0j<&8CIE44xGVG{$x4bvEim^*~|GskV?Do_zcR&P=FG7F~6Tm;* z?%S76Ja&(!gWuxh@xM^f>{W9$l;(wzQ^xw={c>TrRPhPwdsSLgbY84kC;ap_AOq}(lBb>bJGxGUTWZ}yYdRyWHC*80=y}jrI=hgI`MISgX-~*=%>lu9C zfbR?G-K8)Rr9N;J%X!4@IE+K>?c&53;HV@6EP>M@u6L{y^ zdFkQb&d(-2m`hA@O0%by@vaEKReU#dvAES-ZK1e(ih8Csa`PR4f{jX_=4B4 z+iMtMcoO%JB^Dz44{0D`o`6pH1w<%g#vNymdLaQB!ZfTD8{Dxrdghzmm|_f0{@_)9 zlH;XU{7m?{CRuYYz)#5XwiABS*7y>^7SgFReu})Devd`JXGAl9L;qEHKiligSU4Yk zY<^qgvumbfw41*S=j~|aG{B-IEL2F628^aIX{x}h=1AKK*id(JobkJK_y3HxHU4JJ z(dUGxd@$3n1_wHcWVPXBS+(Y$$Vj!I`+ufVKllzs!|3~QH~iEJquoSDjb*MKcNe^J z5JUOL5?S^sm848u=eQKxAU68LE^BHh9Hd_~<}t)@^>pu8qGF2dpBG*0L@rS7c_2`{ zA1F(s$r3Y}r#lAo$|I81ptLCHe2mNlQuYaWT=G$6FrMb6q`H*CdfSji$AIrzU$zu= zonF<6zkYNr!&38}0^2HzJ;8Tp9$tulOoLe&e$i|;1DWXZpEq}3N@T3UxluF5$;9KF zBkf)^DL*@>mTk+Y=hU^LqcBHtZs%5--!p5>7>j)ESAOPUM9--Kk;TM-x!|^_`oEWA zR@AgN6UCv@Hvb97bd>80TGa$T!*!$ab8bz+I?6L27XwP_(kCyvaY(ly8bwCU zuR51R66;L#ZzeyAZj}6pB>OGNGDyu3o=e;zP7?3aB734_u%DGJ6Wp?oTU(e)H$JrX z9h}eTya)ZuscHO$WDl>E^xa8Z)4@BDOwLnni8V}kv;ACfvodvluuV#mjSrhSOnzo3Hkn2m;au=@UbtDHpkA>`1qJupfORZuUX~$< zVq%JZKT`A6_MKBFpOcqWbX-53!{ai}W>(Uzc8D8fCF=*uQM*|`=BBXCB*9)wkE&fT zxJ*@=$#AR}gUt9*hbm&qUZQKwLy4VFfsF;RZgvRH)ndBBqK%|B{F@Ca-pzg?F3d&m zVXFqZ<6t+&y{woj4whD{Qn{$pUl##-57%M5L2^EmaU_)u`M}vqKT(b>PjHLn3Cuw} z1H4U*3Ve4ezR`j%WBH)B*wh~H=-HxL-0nmAY z{0)$=Wuw_+;BGAUeM*Zz%kBWP5V(`UE)w}(a1EW95|mcgEvvbCKxwzQ;J9|)b5!h3 zf@9#UTR7W;pJo)*!uDO(N0pFEdjJgAFK6@Sf@zGMJ0JJ(@^5y3;N*}FVzV<=Vl8yx7$E{EYUC!eZAE9Xm_IAW!@J!4KxJm zIIMX&=1Vp>xOwn}I})c^u%BH9s#ZFhXE>Z-!NVNfs2Q%k4kb|-0n>TOHiw=>&-S@TATmi&?LugP^M=@n;!vVw_F4?3KY7p1MfHXWpJL}Z>czECjr-Uha z$y}+oZ_!-ca8Oj;HUERDn{Z?>AhZTuxcS`8mT0FTYjw}&zvUY^w250K(kq)05N~Ta z*uEQV*CgpY3a$^H@zca9TgGpCy&|Vs6UPp#YhGT^Mqu#|BW2=9en>ajqby}*k49ww zB=49&GtVA3&)032MZkg{RB#|@Xvs-ZTkxz-iNqg@H*^kO96~hStX{`Q)Ph@74365u z>=NFb6||hpdTIx|R40@_E6AK&b5=0<riy@y22zk zsPf;TBnPE6S?AlN@2I@UO}P&OZV|A8azJeEgrY%P_8D|D?PT1bOJDX9{BMNPZZO*L zU`O4B-YdlFaPYQ`FwIrEzm(7#4$#W{#Vw?nU}Mw6M&b!3YTBs=Otq5#jQWbYo{m%-gl{%@?N z-GDK+CU+d@JT)Z_WhAR-vOU=`+0A5x6yJ9{(B`+)(N%8%vu_=pqLaM?3balbu@mtSl2YaP)FJgO{vJuFwO|fEi6T|9EdC^ECi_y z|G-ppOGQ=gWuA>ti~Ex33ZGES!8YdL*~~#g+qyMhsEq%i%{J-eQ%5a%5**hopBTrX ze>N%6t~G|$&67e}b`{}(eRpvZeV4F^zb>$4Hxiyy_WNKIbZ*3Fyj3hN`0`%E5XV@}Y|o9cj$x`Pz{FNc zKa`E+>ES2qy>R{R7%tbTD9T&29UTqUGrDnLNDEQQvLo8gjN2x~9`J?u7t5?wkC*ai z9qXhb=Qc5@wlRQp6swxJSxvmEQAy4s#8qClQK91;139?YWvw8&r7PPH`E+R6hUg9V zL*6##mvyGsxMS_*-Zn9u{IToUfhz=fHdf)b;GVYNr&b-?N#s}Q=&m6WflBOCG@@!1 zyDndC=-X%8F$RWb9JKO@zy%og}%>D7X!)oE`|}jralvVel8sBJi-Hu7-A)3t~SIq^GfV5 zWw<@LBf6H4|C;& zgY(IfKSfl52YXpqw;zLY>a&!RVcXotSgM>3b{2$Ha;7I9*&UC8o!hkkVLlFN1j4}) zZgWTR@sXdbEFnIp-Oh0;RJL*LzwN-bXjH^ zzoyGLpj3?TwMKvke07E9A9b_p3lb)tW+v`2*da-l9}kx8Uc5Ngb7Y$^QHR7N3ajxb z-rAc(g~GXhw0Wf!{#e{=cF3CqtOx%q%H$~Q%*q-P+s$A`2;8~rl{_?Y0sF58BjRVv z3y0xT=wu4=wig^m*VXB}WFPwL@{p@x+D*sRw)C7CE3No%&~+e}h##Gx`WZ7r9fwbe zc&@a2i;}H3Cgd2$|G|$($9c>Q9@FFAFfAb`6ORtb1PVGX!D^YEm3fCxXzQsf;t`MEn&c{RS|!JYeIEh;-DK+Rz!|~Q z5WBxZWww#~&-nc@`r%Bjzv7a&JKaCQRXFMBsJqyzaJ~ew7iZv?)w=TxJ6|vfc*nAF zsiJkY@=y~zivDd$@|W+f?2L~+ya%3gg6U#qO%oP_Hoc3KP&nx+ik>;OYzua#gZrgk zWzi{68#OT@yqcY>`R=&U3`Ec7K(VbJlli*zT_U3Vb+rYZqnYUPZKOB*ir>dwD!+K5 ziK{(Mj+ewQEvlG3X9C0v_ho`LoPj%odW0O%i=`-&wK1g^&*ubf2}q;)2boy7j9%dI zuMmyI4nIoHe5PJicIG4XgYKuBILFIGodD;M4LiJQP5`EN{)tyS=L(RG%kL(NQ_|t; z9{xkagQv+;H|pq9+HC$`GP4)Q*|-`EJNH6C_vPpEG{n=0Tq&B$MMq^G9CeSAKE>J> zE7#aTf|YKk2<^Q;06%`qwVUe^E@@H}hS2pB>?(fyZMZu8nu{4edv8s?t41BdUvcmY z!->HgWBC&c1^AMVFym&kfHyKeR!ABFe<-oENtm3I7sXz=1ftDJo7Bqepd;yMA8j&> zNlkrtD#^(yVH7S73X8s-Uq4r#%^E9!gVFB2RY*W&I9kvF*?49xOV#jm_0gFJyGPru zIgtcUlqMj~(UJPzeb7H~+lhQhov|xlwed{!g}M*6cTVn~lYgoIg#7dU$K;>spOnw_ z&&dC#zbgND|K$9y`rnp+sQ>Nx|LQ+F|3Lro`JeW`EC1vEBl17$pPnD?e{X)UKb7C! ze_Vc`{~h`7^}jQJOaHs`|I%NdzZrF(Z}$I5eslkk`ET^k%=h(A&40E3SU(^2Ps<1W zhvl>Vhv%>FugiUr0qd{HtjJJM&BHwZtmJp{zWnYNGw8#Qxc-Ano$wPby_2`QPsPvr{jVj@|G={-;-7I{ z5x-X_?Teq4{%o$ROMdHJ;qv1ji?|o2$(tjq@_WfiViK-mvI|!cfx0-@yXFh50{0uv zC4NLMuI}LsW_!Jcp82TCw$Xz)DlctzN7y`J07GGsb=ZgRdT_bnBJfY zDAFqpPnasz6173PSL=B+`&eXYo?meDYI>m(P*%pYHCd^r=l)x~VniUJ$iq}~f(Rfq zjs&*MXQKDGUmwsdA=A;UsrRtu!TsdqX7(b(iU4w$;==d@hDj*`NbVCY11@N;k=}_CHdngXkEPj>Np~{cr06-cC`0C17;l# za$R`<1y!zDT%YCleO%A;Y#1v}U<~Fv#eitmmo%z{usGUcMy>n3V16>nasByEdl8!8 z-Mi+Yn>=FMijrjLO4_Eu3s5f#npq#ug=C;+fMpKMOXs;}lA(jay3 zn(L2&=a3oxMHy75l+_FBvuL_Pmzt#3t7TjctIML8Fr5J2Vdpp<+B{5`zl*LYX)2TN zP^nLP3++n=y@?2J5ySL3hAYoqtK?Shf6rYsWUK{elq^M`3RpthUxF#iE7~$d}?v^qXbp3{S87UO^qWoOctax=!rcL@4T)sK-RJ=1b&| zU~B63g*6gk*Fz^!Zb@bToQIZ;YcSY{lM9#5Wrw*Ms9ay88Hm(~xb~9PMy{q>I=@li7whippD!$WT1n@Nqi!9KKrN~U&KE=A`SS!{q>%Ri*sBzZo zB(&jGgxf_mr_=^>S7_KU#C%9cXQCR@x;u9dKi(KMJ6)JXk7tzmgpW6W`I&@ChXwhWMI4Cuv_W?vM z2Us)Ka&6*T!1XCAx{>QQJlhoB_Ipa?&*%ITIn9xknW$+-rg7NYUPBM*&r6+oFO*@S z9ut}axtPh$uzRRhYVAXZVLi}2l*%h)+YxzKrlDB`F6tgS+)R52QZO|M{nWdYy8eet z+|wQ|an?_9?HB+5C=Xb!I>=(xN2YijIWE@PlLO^&>PD~DJWBt#W9p~azou>%jIV)5 zMHtIgh>u;vs$849Unz(n=iGl6DZD(D`;OYjT0Jv!)0MWY5Oqf`obYu=b#Cp1A95E> z_`2h;T#G)?Nvyx4V)f$nH{tb;${kRbcMlyo5wK;jnyd0Z8xL#8?A%^g24u`t5>0uj ztJGcj-@5PW5Fb_P@*XLxWSqb9{1xMC%wIMB9q!6kl(y5Ys!21aluZ!pR9`Fwye1IP|E!a=N z_ZJth5{xVJVLm(dVSbEjgIj^+9h?q#Kgzv>Z|VEp8QY@wo#j@`)(<~=@CWxDVC|H} zqi+hoV=8{j<}?Y@a_3w|R)6ud2}a+@m$~FW3ZYrZ;BEi;^MfB>eD*1KJ8*yd#gk6` z?jPUvaA9#bkscBbi#O0Qb(x|KOkI1FIis%ZgwB_2CnYnw*6pM$2HE=1kjPhqQi9A=)DCKD$c(Oc66{{+kgGR zz0VGR`@ZvB$Xtf7ovJF5HdJY*-#xkbv38(HiP)bL|9tESCZylyB%K4>NbClB7+)lnooBeB z#`e|W*q9msV?WFs--#uC2K_Z~!6y(w;SW@+p*WL}I_IcPb{!?Axl*GpBCs0!#-D49 zYbr`mREx<8{5Ur6ekLjdcs>J|%HC-mcn-_*Cnbttcd9-A0=L^ePBj*y%qDw&?>2So zm_5Hzc1+Kom5B~nmge8M!d|=eP=!q@4Ix@JabVdwZl5G60)tV84Z`Tcc%$F`>1Kbq zGeC<6n}E~m^^1(d`zEk?;_$SsQ>^J|{XQ^|5QrdKVnGWNn+&;GNe1UKo02UY*~)gQ ze>tv1|9@Fz9!I66n>P` z>2F{CrJ)}@{H7Qx1--IOwqD+%nVA#a#cb=zu6%mlg!-677dzbI)mnD z_M_UvlrVwpFk%Ujb#pw^bH^!}#p#{kYscGi*G~A|PqJU6&*K=cjw5n^5XThZS)_Xi z;a3|I0jr)uwBoTOGbe>7Bsv&FnwV;SnV4$)-0?~L9#H%e6P_m!}*)V zQch65ENJeM+%1l)J4DZX_H|mo{G$o~0i&8w%$k^BH7AjlbMnS<=$@UPoAY|#bH5eN zmyOHQmltdEYjaO30Ub=Q%_HF{3T++B*2W6eN(UUFn(G$@vo6Tg>T~}*uD)MgU97Jr z|HU$39RHoPeP(|71UNuNWnwXeJ!S2o!b0y&HO_M4fk5i$AWr5V6v$5wf_C(t#P;X_ zyx?cJbPm6T-_q9nGS{R0mPBMB_wVW*-|pw?;Q7zFZ{dBKyUpfte54lCM?bOVjN8sy ziRvt8OxwTy*Z=tE-#Vx6T-Lvsvye2ujQg}jNUvgOi6K9peNxk{a~%KX@=y|<_YM(# z`Tr?LB4T0xH(t0ei{<~HqA!Qn;(v#;g}8}h4-$HHtWtXI<@eul-Ne-yU)o$=8^4n& zzrH1T+;B{tkov*hr*0?yT`A3(ow43YPE6e5mH$A2p)&j@NeM$$@Mn;4KHi;);0|tL z5MZ9>5|FYdkMW~On>l}w2{~m#{oYiB?ZVc0Tv?4r7=6 z1nguA5(lcdM3;mbmK1L;zDqJ-m+P{Q$`uU{9#oWs&LP?GHTU4FgkX*cNDgO9*||4E z;6l8Uc+ql1AH-<46)lkg#Xo(1CkMcVPu=&-b+&JAOE8up#K643>z$gus@N)#&H{Up z#L_OyT{_stnfMdAy>P=LdFA$kq$E0$gNI?fUW~Z-Id?N^FBrB=7$i*tn(MYv9VfG{ z&i!TKgYds7&7L|@G_a0T{(>?rHNZQj<(npWJ0*YO1aGUxZb1YdJnzB1j{i917G&xe zibH4!F+bTF&*ST>r==7c4qAmV9R%c211w{_Dh&e;rIO9aQ6^&s*Az2Ct${ zey;ZV16?$4&17^IW;9=aprVE!)kLGYIG@r_G`u*cxj5bZScMn(k0tV4=unMUwWhWu z5mHvZhT1@F!;sk2qVFBWDK|^%>z~$vR62M`At+1YTFMJq_zpbm)F8LrCOI>!6-OrW zJ-B>ZYJ;M0N!HvJtVcxZznd+yQ)-K;3_ORC!~91LB9lh1-(s&ajhEDQ!tFZ!|LD}q zw%SJ0QO|Jw7DTyQUBb|UAEPZQ*lt7u!Pr^68eV*9|kA9;E^KQ zwt9()m}&Ysca*o;x9F+7QfZZsJ>f85w6vHye|F*YAy&>`86-PYS26_ws2UpElVi_K5ol-;L*C_jT00^~1J) zh7CN4OzSKdn5V7`$;?{E1F-a~gw(r1F34X)6IMUPv*-kKTzSU!>nv;EkyCkg}!aFk{F4GRQz0Slz@ z2Dl~Ts@zdulH9N&$stWoNe-BX4lD9Qjwbz;nH+C-!VzD3+clkXhBLjOGzClbK04)0 zDE{Yak)RZDhCcW4+~=QKSlADiQB&u>CKFzx_2(M&qY``W1sru1ywIq> zETy85VoO1P3H zfqw2y`~2Ql_>C{3gKG({bIKg|ilf~;3R)kR-3CE~f=3ft>~vV*1Bj%`Q3KvP_QF~J z5^G`mVgp?s>UyqIhAaUx6JToW-)HJ%uX)iIAz25melKncq(?mb}JiGC)b?Gpa4qx+P!y^iS^b7n5iCMbaAb=JOkv6qq zSQ9uD(OSMcb;pfgRIbMVT=R2kU5hKS8y@Z9O(r}(9o;a;iaa>dxnCYTre>ncD*bfu zJ9z_A{|*1T+N*rg3x7~OWSjBZsuk(p)fS&UeXp_sXEgZ+sQHt*)1eT+O_XX(5~tzl>=D1_UIMnz<>Gh@Cj*XeOKz_v-DX5R@l}gUJ%NJ%>0-Kxt;I! zLB;V8|7x}Rf^K*lvDoPv#Ys2ek%CQ0qx+TRIg>vdQaFcqc1{h57eM_xVOzEFcOyQb zcTvsavB(dj%rfDa5f+h?z}^)dbp>Dc8N4*5gULA3I1iI0-#lrUh3f&Ur;Q*pwQZM; z)U{P*=CDd$2vOMrTg$u@9b~#L!O&@^0_+i5a_zfh%tb%|Y|0NaM|#1PEDzJt2XSCO zTnFjPKcv-(X7A4gt$P@i7<=@*kofb4Ig;2chET?;qNV(fe0RWAq5S>^bYh~JUvD#? zXxp0Vi{`I<*cRRyfC(SE1V2|e*1>@!Ybxd^D!e6i z$G?jXv_+RzdU!8o7BgQHvtW?g{gRoR;eT7So)hhblhVX0e^)xX(a1!!lug_zEJLRa zr%%Az>o*t%#bE&8$zfvSTwbR@qV!%U_wBbg4!V%8|zLQuy8saqgQ_cl`Yv z>)wMq($Np*7+o%g3os`O^z>6Ohi*}&=`Mrpt=oe4DVAPa@Og)ZrTy-XAC@kG{}7t5 z#+%IAdVFcEOT%n{bEt8=a&R~Pd1@-wVzQC22iGox(ylbjlqVYPC`vxUM>sthz8Og_ z`8K!Yn@2wIR)tFb8D86zeDtF4Z(}`ksDJ$q^Ys$zmKL4iOoadVYW=B=k~w^h;YBh0 zRF)ss^8|GhfTR$vPDB1?&PC^rK};`_gT6wxG0Nbtl&3B%Ii)*{RfdlQV1^Tdk;FZp zwuBl~r-~%UB$wlV`}#llTJ_l`roOE8Uw*Q%?30C=4e!om+V0$NoL&;=d;i)f6J%-(k!kmx~)?p;+5dVyw8$O`-6>^6V znR%wIMua4Cv%R_Nv^f=Po8rSIjP7@*B?9Ukv5FzvVm@)E%IQMqkiE+U`{2~o0VSL| zb}j3)#fZ6q?$Lv5r@)2y`G2!KE#X{94C}>DC*}XXzz(0!!nG?A58PR@)9kM(AuQwDV-cS_Ec}3WH##ZTsnJjpR*`dwKdjyD| z;8Z<6|BQ2X{K=;}rsN5BH*rz_y@H}p-L)f;ae_8?a?g>l6V8nlEKZ+DIM?lS_zih3 z&2-Y=6eW6`5Ra4SX_iSES%)Yx6MmS;0W~(7%yz17-J1#Km!DAOXHWRrjtl*QR5C#` z#s$W-j7YmPvP?)AP|o*?evo7LThXlN8M6|h`Z$T-;p0v)+M=`S($N|7IRDbwE{xaH z9P^DopJLj+M+i|k+cgn%GF-D zmj!*VKjv|%9@_NLxi#I5m7PaVjAf}russ(2j+_9Km|7+N_YJR>fQ>lfR7FMKa+UXb z!>{76?SZxD$**%N`}d3pBRE$*#{lka3y#nLW*jn=k0Y(?xM?cFqglV^hTaDloep+4 ze}eIqP&4B0@uZ z-nwIL>qIPK<4$ZgWPR5md(%%2`s)vwBu+85!%Icr@zBXSmGxeK1?$vkimA+AGPB2- z_>IwxiuE7I>&CB{pv&Jq;o-vDCp=u3qv5HSV!n}pRyti|8DvV3!O`EOqh<^0k~a2A zsHY=W>G0jcC4D_Z)1=|d(bVmgxYFo60$XXY52FO5gibi*3fAslDm)7@9H?W^RZG6P zfbIuL#dbVvwii0Sayaqsh`|R{pL@t2z#F`82V{rpokMlb z1Y=`{5bAH&N6bVRYmiXK5O>F3>W93$*b3SoMg=d>Yjxn?tP6RA$9B9o;k!TXBk#^R zamxHh3a{Ruyeeqp6@11|;BFmQSR?uwwj9?EF4-3tcv|t9BUjcSe>fKgVArA8on)-b z2ENe3bKtAV9;WAc2k-T|pWs;VOSLF*J#Hxu>9W08S;G+iSK=-~4xI9^!;Gg}OxCQB zl3CSw)Wja(PkHIVs*67U_`5wj-aqHLU;XDNj=AdLqVV-l<@kp8ab?b>X?)1c492DD z86&{6*aj#*mCk=WAsN_tXmzy`Wam-*fwD~T2Wv{<2fX_79YYL*X4YL?{(k;xT=YY> zAJ%m-F~>E#EW4#<7)|*{2SiLptjKs>H-Hn;J_}#}WgqkB6{v4VO+GyabtQl3IA%f$ z^0tJ)JCY5XP*%|dihaFO$53PBy8litscu+u>aX zi(`~9u+9|+%h)@#jD4t3y%CS3ozwF3CjM|#!hwwAcuH5^S#ZA3Ih-V%K@>n2{AEq#8K zYs&-+M80jJj>&zELJysX@FSuH#p3+(<@k^b&X{bklPk|Ac-(*$R;S)$=-n=^3>Q}A z{=o(wZs$sfk4aQJ=3Q*OK#60CkhnWbSIKV_LKPd2$Y6qLR>$YikSV%qfwwVId>$ zKkGf54yg-?GiN=S9igXay8`m@ZJB$y$6jt$FQ$Y4&V5TzL<4IzL{au9yzQ97;USKh zh*|f$mSFX3xlgg^(~8x<_v1ruI(BAj!^>>}e&pJM_s_{SOeF;_FjYtxt+U~dtBtzc zFRM0;dfczQ22#}Pe(mFz21hRg2X#2;nlhlK*ifTt;@d;I@xN2q5e;h?x3F~^kJd_Z za|X^Y*UHu&;#)Hf%-1iE%mVXq2^Oh;C1AqGoB0`2G>|7;`Qe{TlFF^<%8nfLFSA8;rTsQV8k;62j6tyvmNV@Li<>bj%g5M~)ZErs*gKK<&rzh}It)XF7nO5&LwK z${qgHdX>jfj0~r6-$R_X>QGeC8I^ygkmvzy#<(70aK|}M=g;lw~L{>T; zsoY1ytr)es7F47*bZT-HMubk?mTvq}Dtm)(NYvTGcw39np~;=Aw9#h$##46<{$xPL z$J}`T(2XgB8l8zOa3LKssCoDL*x-d`#OWncb2S4Hb3>EBKSs((NMtj7`zC5|-5o{_ zxBCpY18*M-ABY(_toBCbLCN7FMF=T4VIrC<#*`haE`r{=CFdbVRwu{h5d2V%MFCpt zPcYYu*40>PM$J{sx+U0`%Hxrn(<(s9Y(45ij`oHGWZ2fjn-Lzzp+9<`Gc_-A@3(V| zmpL}r)-ku4_+HVbS2VwkxF8GgO?AP<56)FD?gcWzl{EEAnusec|_^TlK|gzlVbXq*b`b6aCBmA%Q0;K&P_{*S5KV;X0}#MHNYOV1_PzsvPc z)C$G0u^b|cePrsfCSZPhc~|UNBlmZPaFC7o3>|eiqc+e=Jf1~~A9Tx}x*c>FeheV-(HdOXmh=8hEnu@_W~q}n<<;4i3@Xvkd9&Lcn3QMhj$&bFD}TZgB^s0 zr`=kGjNI!O0aHsuk(r~+cH}ogLy*e6RnCRyJlX2~W zwSw*~VK|oU&jd|i`@rb)s@5H##8^f3)@XiirDaJ)a#nr)Jz}Ct&Vf3-WpG34X4A{^ zf5|*Byp>Th=v)i>ZkMkSR%=IoNatep$^*EEtmd(nxV}udfRn}=hHoaU4^)0}9Y@#% zNpQoj(ZLZHVH#^#4@42QgvN|W+yvQw3~D$y<^kQU89XMPjfzlsx`=>%*zibdgIU8Q zSd7#u+Pq1C2MhOlA>Eu-ReSik8yq+EV7?lbETj_`gVR~h{TyWo>kqL0Y9(@@xlS}E zmF}^Ww!j3Ikba)Km`E;JcWYO5;{JtE%^gMiiQ)ZAnl-$)7Hxp+fAQEnZKx%TWbFzC zP4LnDuZPh--lm85at8N!P205L^t4xrMeTSk3x4bced;?nuf5!g3o+K|B0RQ8Ilh7p z>3ZX7=VslRRh+-tv|Cp;?PT@7KACp;57~h!@zsUzVf(04eXL^%7Ty$BL*;41O`GBM zX7x^C9+cXoG6LdKpk82ijh_itb4s@k4xmMSJt1I_z(K5UP zTJG2pJbYR_@e^v`CTwB;XBZ3oJ8H#h3GgHVzH-b?b&h!W#1FTQb=gD4=;?KJWkiRG zozNVAWA=D*?X-oyq9^-ffXNwoiZDp9aCi8k-m#-zZf+8l%av5;Kbghqg8t%TERBI2nB=RWi@ zBx#9w52Fz~n?|d0x51qhQ9E@t>Y{frIn$n(fcy<^1@ik5@h1=eGq{P)4xAqtQ!fG?dXbdSz*&r{;#W@PygJ=?{ii>;_!ieBMmc zn_v+IW-Hwz)ns3_t>z+X&OW5aFnZkHuudTj4zoG;9URO)@4IL4BfDMQEiFqnN;{hl zPRT7+wXoDGIULw$MfL5s3=Ug&E*!1Sy~m{*wa;tzvq=|ai}xa~C!kdZ^P}-k*GRaR zU>EZb^3Tvt&;3d(Wi((QM}vP(j#lY6p2usji#0N^1e-q!JW09tlB#1~ZiD+$99AQ$ zv0uTKjTW&QQZXVZ!ZoXaadkXK{;gexfq&hj8z^dky5_a?V9M@BB;m>uXlruwUcbs~ zS5e;Evo0E zHr#XJ7{P+>_WAnNRMFjjCJ);B*HorHImCjy8`Mjka7H~>ZR!NHy*5kfL-r2_z{aZ6 zrgml+<#l=+_I2ro_`(Q`OA>F-RzYms_N*06^EGvF*ZqXEzuHhVwmMkfoBu!kii`*KP)f$#-fzjA!@<+P&LpFP|ciVtvPjtWTbia-<{Eyyc zFQfl31j+s@H%twq%`15Aa48ymmX{r8Fn-eYa&w@i=ffbvHWFZmJvud&?X_AXV_FJ3CA83MP^AxI={mUuc0JHvtx|Cih9}$eZ_REbYY^ z_QLuuPsGyu!BodBw2lC%7)fMS!l?YW!F-#V!R``w&J807BRi^N&yZ8zIh)oN<<06f zpH>)ENnqdj_O3sGf_t4DLS!SJ_~z=|+0q}bCK>}^|MT8)Mff=FdyR%0I`gUH9$ z$^EoCgUEBgtlA)2qF;eU`(bHp7|Q*FDlKq)BFBY}t7_S}xbie6(h1PQ)(wPsIbm8w zMgNRkSkk`o9^m{@(uuyIsHJO?A`TJlRHh%{4YOU(-!|L0z~F}2Zi3%7+qLS3*?SGL z8)mzv-7wpbhIDFNZptB{Ox=#E(I~xlC+ipVTZ+q)wPB@J4q72$H$p88z61xZ(p7DL zRc=Ht57`ZCtQ+>)3fZT1W_y--CmV)ezWA@oRvc5`J{9{={kPj{9N1$>(6`qTmu;?% zdqp#~Vxu_+Z`nBT5MYIa5A#15?B~DsJhIttZwa!uaR)1`!@@r6Cp`Eo>H7Y5za?nB zE%%i}Hpi-3L`z&%lw(!(J+A!Lwy^Ji?0F6C+-Si%!oHln(dwDHqwg7hvH`2q;vUwWR5avDxu}R$?*&g@t zS~A*3;NF&Sz;?L9Pp}bqvL-!^bB0Kz&{}B2W?=!{uOiaZcJ@#8b5(TR1Um|E`0@I< zu=KS1sI>$XsE(U%twXsh1;-tcz-|xPZgcG*>|j!DEc1bXCPnT<8zPtp7X0)!Fmb z)E)kS8r&XqewRot0&Gy=1%odtfyLQK-7z4r+Jk{(DcWff2LpAgrV!S~YkVQK;oAZ+ zF#gY>C140IQHT!P{w~Ni@*G5`@xNztlfB;>Wc_BIQg^g|m)5uP*wQn2Cbvv*i>D;n z{lF1M295dM52B^K-zd!gBoB0*pd$09ExEvQ%f-glEj`&4{M={*(UZNHXB=wZTfTwy zlO3$^E!=FlJMBM{Wi4pkg215!XLHMFVy3EnJSt- zJZky~Y97HfBm2x6ex>eMe_MMn_yg*1!CD!TzKut>3ux&X&_028CvqdzpK>dJ-Z$TV z*{)${ww@p8IKLDufN9Q~2Lw{T{Z0q{7@7M?c0RIC?s_WJu&# z=MV(!jSo3 zT?HQ7)_En{*PUlHiT$V*;Er5%ARCLhZ|!AM*{4Bn_L>%gBP2EJsd>qjJTftXnPQSiN}_Wi}to`Jp1wR>?eY# zpGKzcINN`ckK#}=;RS4-R@mmL<6<4`sC6%Xi+vJbgQ&vNTT*gN=2y%7{izMJSv&iu z<{l$$%f?#{=N3k9<3DKkC)_YtjaO3F5s^BA#cVFObZ}pK*nhUBHOMswKTW2SVPnvz z+2jpB#TwqH8I^J2Iklv+Yy44W8k;a%(GdVQ@x6a)k4>-Kx8GtXy74b8r(oZR&Hn*0 z;4$+uXncD(&|mUOiyJt*#gYiD)a^SQRH9!%CECRd5dr9*Y8;0+9x#p<4pzf---tKD=)OeibkGG4lA(6 zCxyega^Y}-shE3d{*9<8^8w&Ydx_fSg$s}s)mZCVH@v*|?D)I~h_sR3-a|J-#Z3Ti zdrTKJlNq+P*h!n`s*|#htVI*8cu3h_o&SOp_fAEQFZnBfU9ljagax@l?t*>7l}P0i z%9#Jibofu~PXG=h=~o2NyA60duujVam6I^kGxU-p1KkSzW4iIjou~JhpgA;T3CT?V z2PSk5A}MOH+Qh0IRz$Lf*~w_`-+xPjs828e=RPHOrvii{voVpdr>8oc6rNQTEUFC7 z#w2_N$G6qk$O099IXL%r=TACsV5pFPxzW_AlSUJf0upB%%{miwmLEM8^nSw59vd5k z3~qbOIY3cn!s)(~@k=)eDRAS?R5nj9C)f~@I>4L~>4e$eqM^X}&ZWW(Q3+|DMVm>~ z6-==KqmLszbTB(1Sd8H!43LFewV}-8L&Th?UTy1*`#4ki7A!@aq8gN z`K3E$#LsgbM2H$^-2gjLa=Y zVMZE})OI$59T#i1dzv~xAsQ+?0Zqb4d5~iAAC^UhL5Yv#h7XUx;v1*#XoFLU#Hj$r zH#jM^%(x_J`DkZvDw{@xMporPPfvR^6SGI5vHs1$aPx4E ziG^E)r)t@(?IW+NqDj*W)i7662?e+}wc#I`Y7E~`-S*7CkB(YG#!T?ZJw0dA`g0x+ zKKX=OdOk^`&!o}UaQ5tvnjez^75(D3`X}c$QO-`=h)&IIA5B_pa^b=f;ih0R;mNz3beZsKq^;M%FtqPS;yT)~iht(+B~XNkC7yA0i>|X z304s(K-~~0Ri!pOh(B-BR=T;Cq`CIIWg9ymDQQeI{X|+@P=ZXF+9oa1L>o@xPFonF zK@|`~R|2WTrN}~aAAO>v;>{ui3D_+?YiOM7TnC1}*!lKSjx)i`E;*w zIJMz=@CzxdMMG-ueTpW(_Zf7Baqza2>v*mg`Q7{M!Gr5Lp#2Hh|0I`I%iFkD!vbE% z)qtk!xe&<9af$wGpMTqVaRV<7a82Wq@^MiO6(d&DL6u>1QOzY2T{>h7!7mOzkPc_E z21o%dxYv8-;VWlyx?YnBPRh+RJT;xptuXQZ?l^O5y5UD?>*2UKo$`D=uEkyeRZUJR zPMv+UOx4y8;Wj-0*_o(kB2Ak0pca+lNv_kURkBq6QVE<)M~dGzFvQhJB;%y0%P)+7 z;wrx6{jB^+{IveJ3gu6}hTM`q+6Zw~N&*}*f6RCfQ zlZ_B38m0`W^%gr^GrBGKe6;v?(ni+a=1Q&$xxT{n4_q1sQ%1(B$RXTzHVXRd@-Wn+ zkG;gvED}_i_B;LKCbu>zp%+eO?Vty@Id4PCiCg?)$)W$lElS5G3lr*@UU=(Pe!AL{ z!-VU1j98M#TpiB3spyz4JSr2-obE-<_@=uX)7($Br4}JNt8R;qMQL}4Uk|r6KGfOT zUzzTHwWjm*j_T%5Wh(JA@IV^1bU*uGTPl5TreU}(JCx>0T-q_DtX_)|;j2|^kKli0 z=k$$d)_inPO@2nh&?%KWHZH39=$SRCn}+f)s3|gV&zKinm_LgxjfBB@O)hn12nlztLlk8xLc9bH9eLcb15~%TbeSGep)X8?Bwx%|x zg)sTy3LF;&46<^CsLHkE{xe8zX?bxmtl$6q8!YCQ^EF zO6QECwA}6;XN;-o`W*&pS@rF`_dt>_Wq9Xt{&ldC2Z``S2NEmhf`2SSB=9q?Qtq*m z+E)U~s`!U_tzh;J0dyHEYi4hM@tmiw`t1`Rc+we(JbU(KH{A2;@!v5c5nmXlL{95J zwqSURzl)2-^-u2;ODr!i=tLHXPIxu#SgKRutwmn1Z-{63zwAmDD=9k3)dH-l7oLU4 z2SvN^tbJbiiT$Q^iuNhenA8bP{a*LV5tIv7?ylh1Ja!r${gw$%;8!oNw^TrbR=`z2 zpI1YaSMTBFUO>WkUUWVS>=Mrldeu+pj?S;t_!sub`^CM+WDljjm%YX+*?AA@y>)cM zBe+>#0C@z((sg;J^!hFMpEu}ZG(sqL@a~R-1n+9u&1Y0L z59m~IU9(duVw*IS?=Kt0aQQaQS9TZ2I@5TI2BhTnu7GzJ`EFn75w7hxlJt_XCP>q<#!?$%+|mj!5?3v@eiX4`xSlOe)a8FE+TDP z=7G=YWzcsqHyzE_E1-E@8mo<3=T8etZ+ge~Z~`h1crKj!w&S_|USLV(@G|4Kug4Z)L!KLi$jK)L*o0Jut zuxcKQ$Mo$w7b|RmJRQkD!a}QDyHaK0%~QA7 zFz6T=&{*NbCfp$XLW)|^7QB+%pghsdRzH#vV`*JVIdS38_pgP?;bs-eE=Yx9|H?c4 zb-_ZQS+XM&(xMH|@&=jEYDUrkr40soCgtr%odTeL!q!@f6{!u|-4j5M)(Gg>b^v7q zKm%H*dTt7~j(7_0Z;%u{7=K0XHlDzN)oNm3A?W#K4Gyw4>e%_{TNqhq1d(AxkTrCQ z`b@An-mpqNG0@9AED-Mr?5cL5f9l3bt>zpgcen;1I`x#pWVAY8~0mkcMNz1_QJ zXcn0@RPG~)nDtby22*1`>~^v1U^Z0b&e0&cnV(G7(2Zq~?V*JhZ#ni4#Ev7i;a7At z8Zo}8uV{kf7rpR^vVGU#@U-kph(yN8L%%3pCRznKyQP;hcV#65Q1xBw=A-F)X>aF= zJG0;5UFEHnL|cpo3{zO(Xn8@m9V3?9@4?uHM^v1jgso@ZIBY@A_G(+O-}<_NV?Nc9 z4)N937JimKi0nuq6Z~n zLQZxHB~z}^AL;yj61x~({nm=1%I2M|lkkx+XhljmR$^!aQ`HXXc8E}%x!uETaw11} zthHV^=vw1c{)OGh+4}9UJ9ZtbDHRR)s^!IRQj^AbhA{D#*-8a`ueyE-tKiJA3OM`lOn3=`DL8Oc7qZoY zAi&fIy$3c83ajuZd`>nTs@0!9i^TLZ*L7z+H0+=MI(Is}2?ai{F1odS? z$8&W>e`Rw|({!$BTsYaZfh^#SdJ@wbs~{a7<+p~Y;4CuiVDtU_ZLTd0 zH~|?L4jT}oN3(R)wX>ucSU7#~!dh35C^H4QHn{3>DlM%Klr3#6bLn7@gTTi_sYShx zR`bQh%Z}E$$2xGTi$`xkE8zVT<4G%AO{|JiHf)E(xSBaJsLTn#8o9L%1)vQ}I%eAW z9B{LHr;n47I>L7#|Cdyx!qzSHqmi(%=zdtJOzDaA+jDM(9kP|t3S{n=_L@~);Rv(e z!4wXxR5RQjg9%&G6UL_HhTgBwBEBO^Mhht>O388ZD zVI0L7#4@aempF1PFM_{fU^c!g%3&{7#$avb> zVVM0F_X`^XpXO%2p`T&&O?w-CMk`~Gy^ve}ya|fTpAI1U$~WbVPX%yPF@B<%w14dE zV=ibBY3Vsx_P<8c6-vW;6hzVXCpqA?T_fr1>>S~-1XI8c*Z*2QgP)-*hDG0Xu#?97 z)6+@9=8co*=rHFKBHoxZThs7Ql>0aypC@%xt?+Tu{L0IyHCL6`b$8$Wns@x&*mir{ zmYwhZ*pc2%`;0j6s-`pu(F&Lj856IEIlHco${imX?>OR`4<{{jh+XP{=^jKkZ=o#- zGPL>OUlcg2Xd7tabssNHMs<+QG#MFZw8M?p%;t^nL_wJnS(5I0n;6@8adg~BWQD*K zxb17fL^)P#zCk(UDB%{XE1G5a&jMdCWtQ`X&7c)rOAqqVXtSE!vv_KI_a##*x-Y4$ z=vh3S=Nj5Cz1gKm_b#cg=$Wx|;ruG#c1snYI|@M)l3{f%LI47r?UsM3*7*!hqb+`x zm0l9RX?f5^v7K-<>&$w(JCSdaq?EYD+s!Dlp^5Rrsld#v)u0d5IZ{}!+qh(^|2J4@ zl5Va`H*dmpB)iKco9~h}am!WnD%ipLqv;T4KgECCj&hi~f+r4Bznkoak`0|Pd)n#c zKWzDq*7_S}kKw<|_zs@pjHa^_X6N#T4S=}BdG2wWBUbB&awp;0lNqCxB_1iG!LIM| z?2I+n)pJW`%K4jki8a^N^OKi8f}ZoY@D^LHtDRs`t0uA~d6NyV!=CHvWiGMY#mZZ3 zNFat_@m%iYT|AFFY|G;LxRh-&zygG+!NMir2InAITgJ?u%jPncPE&LDxY;OMJ3pCJ z&Y)}9NRSzHZFi5<6B92p=rZX<7#YP1s$+vLN4OMsB&KX~b(a067SK|AuCrBbv{?`_ z+(wnKzbM*5R8*KjSFKCdqfQMA23A1lcyrHQ12T6<)1>Bipd zxstJ;miviFC!sEw1Ekm_{e#k#eB#wRcOl3SH!%B@Ax8EoYkT$y_v;Dw>p}erqlfKf zBz<^RGHF)l>zjWlDOINO4@p6qVy+wGcP-C4IYtL-!nI0yC7 zO3CfA);Q7?m1f#04TEIaN_O`x8&7WTIshp#Gn{a9{mZPsa2<0g59P>t+`?=F|Dgq8 z_7r>g4kTp0KJcpTJ1*vV5M8Tbb=1}XaatXry${;DgVruK+yWQ9Me#4FOp2Cc<_`Udbf5@8iC0uaDk`eOgAeD_?))t9i$q>!}MmQwcE!!-(Z58W16hm6WLOOTTn#Q?$TmEBvq zXaut+`&~xLTBNfICy9}H*fuqi+poA~PzBF+yX1xdY*s{;32!N(nlKz{UFV`*F0S>x zkUf4AoQw>XW)#_V^9z4H9Tz6!rnRDYRwdNzGkj$iZ$*f(B+7+iaFV;D9-+XCN~W{X#$n%5&{n+vly58^Hw(J|Gj!|XJ9j4b*vk6){iC)7#l{(L)Yi2hFZ4kD77yqV%T zEn>5oZ2C<8+W4QT?$eaJI5WG4UW0h=_KxS|^i@tmQS;h;uwzl26BoB`oI8$KA)Cd7 z4lbA;Ys2nNWnU1EU?#x&NMf-JLW)F89H-j^{na+Ab+^1N3OfF}2(${c24g;P``Fc_kn3d)MJx% z{C!^cfvHWYn|5*v+_d3^;Dxofpf-3uBBT=X;+N4EBt~yUUs`%@(Him=$&BWBacux8 zIE-7b&5Pgof>x)_SzrK0VLVcz!npvAV6_`-I9(kRTpRc zMd^(oqx($Xvgt7=Zo9dwuS=!u#NQjroer9@iPNlvf;^xZR8k11EpB7JepAKTOI~lk z4X|5~@Ag>T>_KVdeCD|4Hsx;kEdd*PHgRp6oc+B^nIdJpFV8HvyeIYLCxwxP(^Qr1 zj_g4YQIs_ReQRZ|&MJsE|MB_PV-0Qx=(fS{)(VG{AINmPN+o+`(8RY_Ig92O4Tvu! zspFrlF!y@#o*`I996)Xr%l?zu+52~eF%&SBlkk##Fa)~y^S z6Jt4X60*oG99bXBm;L~2GUnis-m_E;vf}a2Ix|}!6BN< z-PxtPWtV+-+0E`x-(`2}7WY?Z@GW*CNP>SbS}UlnptZ_$P@}dG6`A+@Jm=n-32NK- z_xbrT%*?&#o_o%7p7WgN|AVwb{DDeyvb#L!?o!HwwvH9hOU}Wm6H<+(^+7YXIo|YJ zAy}dH-xFLnhmv`oNE2V2&#l0@)my}_O8jpF2yss92ouWIiv8#o@&9A(9L@j@ifDyL z{|a4-R!1;h>!y90@m-D$p90EgN<%Ck5k5nZRY~YT9*DhohfJ9i_086ze=QF84_j;q zujpJ)ltS)5@fR$^Js-lkDXe&Sdu1M3S!l>e&J+1$dFuEGZy%Yf6i&=zFVYuPSax4) zP!IVsSJJ-L8e|8+YBZZpYpvDST6fm4OZ8l8l>4PtEnKodW)PneLSiO!4#88KWxG{w-lKfO$fP~Q5!u^W*3+t{&+KYG~$n0rtO~e@Nw`?V23odV+-$ebW(0b7e zLz9$5r5Dv!BxZ2@&wz26QNJzFMaCk(KFu7)I>V9~+1SuWRy6EOFG90A2ba!8L1BQ< zDzB{RI-_ewyXW=d!7LFHy{?Y1C|djy4q>c)VKN~l5>(7_!NiZ zU+hn1+tzt8_ns1dwa%*=qR3C+Z!la!2uf!dA-tItb#EIkHB9$D0fGS+P0G&n@|L!W z*e{!=6;RtEoD_)^PA}@bB7VQiY0RlAEP=O?i>r_e3EeJwux%Al#?8Dh8_CK1i}@v@ zBy`~&y|~F1cNK1akB_cSm3`cgtpSmpa>q<-Et{-kmuL-excZ^)xT4ezKfrYzZV?wA z*LC$Qhg-_Ppc_f>zt}V{O;ISwkcx8>CgWqBioD*jOXQhA>Q8B#<699LN&qC@_tc&G zH4xZ{jYU+1{)jF|{7z%;w_5NyweZjA3GJBGZu~UNh))$Ke?m{Fq)f4SIm{n z^xr_U6Y0)WJ*KGU(HnOxdJ?tYdaEmC>haC5PK>nCIY>ceDWWM_b8ST`w%Talj5-h= z&!>_z+eL?TD35WVR8QwlbU^dc7> zb!*Bua{hbVQKvyx!|6Gl23eK21A{#kfx%UMm&iYKyi~ZusqV5fior z{EHGUkUl(G+?J!0vA}0zO7xYYVZZYtf+8C(ll_;ny`Ay#I}3}G^2z%rY@O6JNRr{z zHW~lR;Vii~FL8TTT=S1paVLBy_ai{}M`(#u^9|&Ol*W{lRDS`*=J5-;Y!>bUnSXKR zgnKtD=kd+Lw0J8gxR{G8#oz7);FggIr8v18l?Z(5?P+owyOVT6hB@tPi~65^+6lWs zH;2hk>u%bpPk84|nILtlqkX^kww;qqZVXGu<8JEul$Wg6R-J~W_xFk+?EYRc zggqmKJ@<3|0n$P^3F=Va-W~hMy!Jj$I#08-Nuk>k%V7teDZC=Aqyi_ijE~&!nD&NF zSp)Pt?3ju!-E#RmX;*LBHA=gu1Uw$OR@F)mgsR&jxumW~NAqV=Q-QQ@!{&Jdq5FPd z=(`eMePFYR|IiG?_tRT=dmwiQl7V?I?5jBoaN8^GVcE{Y$+pq1_i&}p(|PFXjz_~V zkAYM{ax*f2E6^{IUY%jSOFT!XWv0+Bzt6C_u+d!DEFaK*E4{Gi1SPNcSxp=S>%RsZ z-0{KC;|)JUFI1J!@q{9Fb7Y`QR6JEiEOBO5Q(p=z>Tu1DzbWi8wM_1>iQMxz28AHt z@b+|D*B9HIHTakgS-qqd;$ma#b5&ji_|C8SmWn9m3Ke2?H$i3sSJc3SE)rGTqa*i(6^fN;$c&iIp}|B;l{h-FfE zk{D@^=+8J&D_T|e;9WPwGHd(eQf^`%4oqM3d33*shKh^gKE_ zOlQc&7pXa_DE}c1F*T#pl4yc;djx=Gj!&nCVu;o)>U>mk(lg-Qelv^g!-x=9AdK@V zx?ReaEK~_@FBF1vQG7fU+?)FO_Gu6wD(mf&ARb})%&Z6jJ1uAG+{Sz8U&bN6rg7K4 ztwua}b%L)Wh64Gm1`wWOYUU~;Su*k}&pEXMQ1KNVZ$^##P3W3M<3_Yc7OU-mkOvu< zyIopxd~M{;W?b~7HO@-itd4<$td8xwwT07bD^Q~Unw}s5i=~Im1JZ+9MiGyV%W8yJ z+eqlgS5FcZzC`pUzAzt-;J?^j8tPA;0DOccol(TGKA<{w`^mCkl4xJcyFi$+9?P`} zF?Q`t2d{!Ub;*abX^1D8*`R#D$C-O(A|^AE<7GxNlXo&l^Z`vFX7zQ-a>)yFLoyF^ zF?4`GdC&_fP4A}c#Da>PV#=?3jdl+^f+U zR{5K`Q4&=qu9v=5DcU!4NG7VeFJi<+S?=16ia1bFf&@$_O&6xl(&_uXgNS4Eb6MHd z07h08{|`2(K{>w>d$VoQU?3m?Mnh5OhDk?&q@avJOo#F-W;#)a@+;}xqXeeBzsKLB zCR|E3Vc8ya=KUy47(rv3^QB1)Kmd~%aifjvxy18uYD3_LJk*!KWpa8Lqx+I)>a749 zLw7Hn`!b&7mnPe70)A1$s!L}AD^O1@-TC4M5*$-)RS6sG`q1Vi1(kHWSy zQ?T?-ikokjU9U?DAh5xwZ+ll}wb63DTF;BZ>+F*i8`l!!vUEVe8W3=5EU34qc@P*B z0SadgH_#aZwWu9Kj5x$*(`bHy;RVJR-aFF{j-W<)t+#3UN*QUzMZS*Xt87}nem3e{ zIBW)t0O+5(5V8o0;3%G+Pb0aqW|F{sN0cQ+z=h*}GI_72gG1pAiC2TM)Vj74Dp=1v(|40U3W z3U3<`t{ZGPW_8+GDqE0~w{5SL{s13L_(J`U%74%F$PcoqXDw%f7Z{qEInm0@4a71t zKi7E-pUggFmEMMDI~psTccLM<5Pe2^utJeu^N<|8pE8wmqPBbGuzCFIQ|3`Ry~#&F zY@eRqA|LZ#hg3D!TwU{s5FNo;y%p)-hZsQ)v8Gqy2}mX)Se~cwBdG}R3?cn_HSs^s z`RAR~Xc!)!FDoIzvBe@?rod;3snDCXItrm&;$2yGlY(@MdIbq0Cl@*O#6bAegV%Tk z`0Uce)*Y>=rjx#^Nzxzcho5N-Bgi^vJ#)lz-mxb4{FK?G0Lj%;LjrsS)${@Vx07Lh12W%uo`C@j`3hM{6~pKa-;F-4DW;GUG;Q&*btZjFC#3GKj|+d}xv(1_*Z zJF}@X8nP|N_68&|?$nn22z2upT+Id8?wiG_3n7N`*=&^0l-|scCFWK ztvf2V!I%@@NOr)a(vf~-6Lu4Y-F>~S-QwB8KY*AWWUV{r3w>I5G9b7>w9tyrmajj? z@Rmdi@wwA`^Jjo>F=w}TC>(^-=vK_mSYL;}EtYQ5SuS_B^A#p%K|@wFn&LJ_;hf2Y zp+>f@v@f@o97H-{M+BscezLMz&EiqIb|7@m9`J#{P6@bN@i`Ov40h%Ijmr$%*_#N= zr~jMjKQ~b%N|zkhJ1iD_*<`ocU0tVRV}ZYFRc?_15s`2MG;$#P<3POW_2f0!A7>vV zmc+g4fV;*}LRwqV!X7AlUH<2%JQi*2i2$&uwGLkf6@Z4hbLrxPF=PkMs3 zW?~hA+(~B7OuK1>(p{^Q2KMD%<0_V^p2&I%VW>G*4NAMMXY$sPED(m<2@Hy#+3^=* zODGc&5T#t5&9G3(alNRLlaA2AaYO7Ka^LXhY>1DyQY+^$ap`YO9qQ|5a-;UiwvcF&stX&<`mg`@>!ewIysaOYa&; zzdOxZvfsluAl_-~*eWxEqhPJ2AIR_N!idm4Cpae?zkkKAIZQ+Myv+~GUH?(Pu)2k( zg~~m1RFWt?^VZzV)G6_%zEx*By=`N1c(|m3@c;tENBJLv>sw=!-?x_RtFtQO+hFhe zw+2#Qgf_{Nlh)~VU2~_G95+nNuy8O!(xq51(7c9^Jr+n^CL1EU`fnTKLaj&Ox&8s}x->wpEwMgx!0Aat)pm4GAyu2^Qp!FXmN+i3O+?o|gNj49~i z+JoNSi-#hwEBTa#eeeFzj{Yg^&#dBP=7vi9ptYp84w5?Zpw+yfKlvFJ`yl=g+0<5H z>Ee@r2NamEKL}ZTnV$eA=C19So4I3JAlJ?c5j_-ddMo)t!EnL~!*bNF1v z=QJIV^JvGrf%U-c80^CFM4c^KdKuQ^vP99qes65i0QGMm0T0HUAAB^xl6QUoir0my z!h~xzMY>jAV3EtfeNgbvL&gAixSP8KJ&vx~WCqGXFU8f&O0i5FT|$+MCxC5^>r*e2 z#Kl)At!0Ibk<7oOs;hpTjxq=j2U!jI&)QjMzElin0)&F6`vYu%YGDrNG#*ht#Rt4k!t|LHj&ow zHBW}_xrtduq$tmWe4+BsMqo1_B4Tf@GIsm>-Siv}JRP%d&(*N8;(@2&4O><$W3lcE zAelwn2EI<KJZ^xXc)d2h(|9S8z<_yLrXB(asw)yxwoJv^>flpT& z=l(*RJRfVjE0UjM42oe)t(!9^;5Pc5NQD1fB^XQ^5+Lcb?)ir*mPlwZXJ9NdsWQ^= zX52;x26g~R20tBYp7TP2*$LBFXs`inTvQ-5S3VjJSu0%#Lk{R4jn@cuf{vyBrF>NOF<+dt^=nSZNx!CZlYP>1B1^p{n)$M^VwDSfIJH-_0>`-!0YRvhd|s*3gc#WG!l69|ROxpcB;he@$%jC-&j%HZ zmlfEp0E6Bv9Ede7%qB08N3>z(+HHPIt6-XS#+JNS2WbMV3|6>46IvU0-j7cHMLa+z z!Ug@Y$^~8ED)gUJRZF+Ze52_jf#qk@8!1>~nk*%~8)@p%x;zP{WI109-E*@rIen3C z*$1*@IY$m7@l#B{&w2Hyayt{QmeP**{F(efwUJX@bJjb~JjR{*_a~ zecPD9Wt+py89D=~6IJ=I8NC$#!s3CaMmuzb3b)*2pmw4T-U}uU>bxJeRt_R4A^Ss3 z{OJeeY+#V=9m4_YFoo-jZ;meM11ZM__-=O@zOTE1HCwwipJ1?%iuI4_(X!-l9rh@Z zDkYCVsBJ-ZPUcIsblNp1Go_Zr?Uv1Q5ou*~6(sBr{gXtqnbZ?FywrjCb$L3V+XAb+ z0AC<==+3on{pnuSgITOiHJ7I4pE_4~n|Li5&SmV45()?CdjRQ%O=jaJ%4wENALl{zX*addWVzSYD=p{}kO2h0DHu|U1?{qF` zAoR)px;dF-!$DM(g6L+4AI#kZa6!VlW03)>%trc?Uxc}SHrA96{Y^IX*N>8Z3>N)8 z9oE_&R%glMAoUZbhb+xfmkDU%O@nso^PD|fnPu@vTCh7r9Dr)wg#&S(*SYFHzGlD( z80n)mupwkx0;7V<7e$>XqrFE-Gq-dge*4jGx8TtXM6Zpsqe2CDcsQ1c|G`Hl?mdrgV(HX1?MBGb4JI)aj z+~&N|<{X2BI`JoUoO(t?!0Dv}G+pX7Ag{3VXq%JMCXKsO=fi>7ZtBT4=UxA5J-igD z^gw1I+XX-H>fMq04oK1tFSS}n%$5Dtl4saC$+Ownss4_4 z=wzQT^K&!FixEB+r}xaS-W4K zrK~3B;@cf-55U_klr!=ue{b-2lDNqY<|h?{g)G?IULO$#?H z>>ceIFgaX%)^TMZg={zj89Z{B&vAT0%4VQXn?ogI=sptjwt)B=b=*BMkUH0$^Jh+c zh`SgXulWMR23W+8JR~jlbXihtFtmZ}Nun>@{4`e-dKY0abW`cpBUp|TpXoJK1XKO%|9eC>G{xRMo>Y;J}- z&R_CJHZ%*B-c##Mf_#j;kUVjAjO?B1X@S%jZG!ZF7Q_g$&H!tRne06O@@Qs8Fq~#h z(C5!%U?UhG;2T#yK5t;Pf2f5wBHO%Wwuwv)pMV2|yTn znJ!pIT0C>aqrzpXXM%q+Q4~@)hHo-YXh!erf%E0)F{x)s1ej5b$XsJi)5qs(;H4uN zUM`lkFZQiFP(_QYWh^cJSj7IwNG244-Xa9II2s)I8IVc0TaQTv(bt66N8KC5J|J0{ zP!6p+CwZ=?zetP_iOwSs9cxDX^zPTeksiybvHDsxR}&N2T0|=LzZ73KtER`00g&dP zSDlPbjQk$Vr8u_TlEV_3F{IOKD0u$%N+uN6^=5v8SZ8Vnl7gLivLT+%R}ohoG$>YY zpNeCP(oKO>7%mRu(>(Sh-ooMYW0}ZXi^2}fozx{M$G4aht}ZP}jlVCZ(E-@$cR+RA zPwBu8esT{!LeG&l zzcOv=p_MIMt2EcbBf`C}j0&d@Pm7G{pE|hwGHwApdI(qA>DNd1zJ6x7_wXq0w~fh; z8O(nc<>a`E-Mz1mY8$iP8O)FAeSK_r%wU@X`$ksN$@{GUIkQ%I8f-=HGJ>SxI6l`B zb%qlpFy2ri=G&RD3PYVl#K$1RBNU4f#nynUWbWvKH{z9-9u6LtLA%pZ+-qH z1(8CgeA^A%gJK488;9>nWuk00!|IrOSEC%^S$C_7A`SY|0z9 zS!mfI=~~XHo7oGZeH}(~J(@P9xJ}F+)P41bo+{f@5?&$7E5njK$Oit`T0HUbvA3p+I{^Vy#h1We_kl*2}Z> z3il%-6`CtQ;ROU>`$GX_GO|p1e5DQDMb}fl;`0Wa-uz37PjW^H=IEIh+QGWMU%859 zFt2c{`n?tL(&Cy8{~1fI%yNSJlmcCSMt*;MRc#-t#iNnaBCIsJ)|k1-v0lwlz`A+o zK+hNf3udoq)97Rs{-I!=a1pKY340-2$!zEwVR>@68ES4gFqzNr1I_-lqunP!-ia;e zqkw@z7I?~ZGzL=RJ*Zg^OQ@v$w*XHv&u#r-VyE;!t`#9U{LSXY$iG7Vy*1~8}TqGUI zu$Ddy>diR3(YPTDrw@a+`k%2BksK({kI46E%Z@<)Esx33bAR2@AqM3wWoB0k5BVz@ z?wD3#CoLDIc2 zEUs-Nsuc}s`VtSPB&6JjY-_dJYAO*nWju!A04Z#8sQS#-$I`+{N2C?2U zSs?wVL@JY9?Wz9ccZ&4$xW_OYtFYns?&rym-Ll*Yrx#NKMhVfCZKd5-+A%Q5wwPj> zSJo=@lW`2HFfDYSIyr=Xn6)zP@cB4|gno$A1fPL@`Cqa&{j817gAvb1_hH6vH|pSj zCt(+45EccS0S^%NHCF)4xUo<*P4#yMU}U`$WXe1s+V@0#c!5P(8?J~}NVFleBkCYn3YB@ zhb9Q&nGY&15Z{+tK|_C){YlSc%}N8SlP2y0_FvNrE62B3HtOV#KL=CmvFYFn zHn{28dAXRZYFAb<$)k+Dzarh?0}2&0h2n(3HZk;=3F#X=K-lWCWF21sZ^Jvi*GR7b zr1+W#Wbyn%h|ki!MDbp3d1KZg*$eu` z_UEE5MI8z4HmIJ_e5@uZHfy0uHQ#xF4h=eZvnD=5M+eBYYx?`6`%2hnTrWIU=$^l4 z$FqIFcj6Q?4+>79$TJ9Ap#J0oLZdJ_&6f{_u6WBCHI->4dV4_}3CJ$HuIfPiH6G<; zf;r+?_Gc;6v&~G=7^s1tB^JeFajH_6XMtRBcgg#~e|f*xJ(ja=7H&ygDX!FZGjI+P zlh74R)rBov%2CB z%L-=LIrxGt0!SrHzJux^ChRwmbU_Bv-rZt*ZIQ6+zrlX$Qf!wkulZ|aKzf_8fMJI` zz<8HD3^ik*dl|R6l~Ho!f0tdU-*b&3JeXa}bc^l9NM#R-3586-LUGJM^ckP#o9=z8 z=I=}4Yqgnlu~~7;ptH~>?-(hk=c14=l0ToGD|N8}7LGMOfC1^h>RSE^9}0}?*wBmM zLHV~yhH1v*7`$cBX8nHjLOO)6gr**}%Vzs=ISkun~u@1TfvS#&tt;PAI6T-7GPTIff z{O1w@`+8Ylzv_;&cQ32a*C~&(W)SgTn!Tkji#sRclaFF18CWqYac20YJbp^Mq^Z9e zRz{yBr8A5fmZ!jh z9Q1pvNs5&%+$sPF-Lr}@dSKWC>FUPc=d@_ko)xDH`y|bB5|4|4Ya13qHY3RLRfdD= z_)3ofirVRq;A|SWsyh3-1Bt+m+GQ;c1w;Ccm4$S7MV? zva>Sh!*l_}{g$h2o<7x9J5=nT>8;Rx|85>I**Y4Id1mi6yVR_UB#VXp_z;BBKcX>v zFFQT7W9pZ2N@#zXaF1W0POSuv1AnAq7n5v&m@qSYIIdWy~x|oC}*V z3_eoO#Wecjw%S3z7vTSaXqpO-;*kUojo~I|O@0Aq`xPTGJLVrHU05J7e!jvp)P@KI zKZj{iXUO7j^tS^^s}li1C2yqUTOXes6HVVb3IBZOWeNI*^A?V{%${M+Ki&G}=uW?K zzWeWxZIat1u_?y9;c=>o3(Y#6a&?k_RdwP*4#;=xYh!ryT8fQ&1U?bCN&K&ixaD0| zgnwPCA9-D{<%*QudwFq1{K3$bN0GcMW!pyN0wkT}Ia(Ko&3SrRaUAwP@^`w>vg-6i z%XQY|53B%sYR_QcJR{dU1DH5bz?C)~ScUHDT~G0+KvKa2A!gmt0hSrp9;ihfJH{t! zA|fC#RfjvStVoW8Vb3GGZf{ZQWUr~&xs9jZyPtR;5ttkis!n6Eq_1Iejp$8RGX(WC zU4W-)YjtQcIX6o|BdnsKHf-~kb!ZBPllm1>{r#-bJcxSL6PIkH{dpqquRChVNq}8= z!zje;36OE)i$8k;KQTPa#vOSMlEvK^9@g+TJFsESg_DLlUYXXhucfQ9Yxadq`>;|Y z5u-iyQNdaaLd5mRggqk=qAx0xZ`P9kF#XM%3jV=hkp8A9dM3(ICE@{XS$RDW>xVsx zpAFjF^v$&HYpIs-YCgrnDADCNuocAlsq;y>o>{w92Qrm{4Zq+*xPC9x=Ok7zy^Q?} zdEr4B8N3ZsHt+Rdmw8}-{iVmzTWCN!eD4V6xm9l%uE)4cFz6nouP?I-GTu__2RpR2 zBvJP-@~Vy6TFyVC596`<+KwlEUP0p*%wsXfBrcTR{bqRG7`GKpo1k8Vnjhnsl#%EJ zWl3-mFlgXs&0)qpdXZz_TQ~b>?4rzn81@3e_g0*78;rRqI8;Gm@O@8G<_7o z;bN{&9g)iA&gY9PuD7xSz*tc(v)!!fA-%CT^1N`rW=zN7|5F`$9k}|llVvg^usG(5 zhb#1x9a2U=PgOXSyHB&9jtBxeYrDi&aI0u!Qwuq+x?*l)Tr0-iR2|Ly*ggo_vU~&7 z83faGC{nD1P#ihAIgt;V^4y2D{I2=sWb{{Gr#vNiPu8O4=W05j{?7^4ciybPs;!`U zj_O6zH?zMoTCrI4ykZKG=cvD8Zd7~ii;Y!VBNg*f-8fYKj<&oc(Snel*(7gem!W`w zO^9!eG`yxdgo!#|{5`}y!<~AV*~#Q2ycn*d-vmR5>n38ngb6i2(0H<77gB!$;_%HN ztk*sBmet_7ZTQ~Q(B-ySnW^~F@a*%rW#g+&FrwC|-qBNf zCCwb~M{nC#DcF!}u4TCd+~msOo$j2Rd(BZR)A?`E7N`BFW94G*oIxse4<#mF7t3@W z9+H8H^!?3IdHMj~ ztIg#sU->3iw`swx>4T6Ng@CWnF-ifIMa^Dk`wUWQcIRQ9Gt`>lWF8zGM}YDPx-y{UlMneqK94N}ME;=* z#403SII~N}?Ufu=cxX-YvZoqP*wSu$9nFnDm5x#ZSGn4*LC3vv$rK<(OyQ0$;Rc1$ zRQxMfT`0J+B}-%PBDCWW%gy`y38m#>9b9HpwRG#{-p(CCUBE80OBh|;acEg&qu`!M zzY33jpeQSN=)M2&Fih${DZ5!Dl^(n1D|{uVh2XaHjzKwdJ8`D?3itXHZT1G6KoP09 zJ30qJ&f*5q?WcRBvzBMr1+rGU0la;oib4Z^=+!KD%C=eV)!TypoCK?}e`gfMee9Oa z#Kxgb5l?ZshWOU8Z{SscV*wE|{a6c>qQxU}(7UQ!tuSe>2c}4umAT;VJ)`8T6}VC+ zg2;>bW^omTQT$GeSx5HYt5C-II!HRrqCv|4LI`5C_ci#?IAp(Sq8uN7KO@68C2GS9 zVDXZlw=&;oAtt_7`tn#3=YzO&#OrMj82bW29A*TeAK%*#Q>A`o%!!MJ7(^vk9=a{>Y1B*P2NRGQUL;S3Dg+A%< zzP~uXqGI}n^RNw=ynRFG=HIgaPfC#`noj*+DGo|Qp`(Sp`5qx4f@mK03oZ*5 zcW#q?ET=fS95#5&`MexOnhRZuy!!`+>8Ya`axg>aS!Vk)yp$q$u$s3R1RG3Vg#CRls8wr7vJ6kq3ul-u6%cAXH(T;Mfr1&&%VO$q9xtK` zxF!{!^Z(o1x*nk`29Fr%QOnP#%RM40JX~N5JLMnz72$tAfP^mRoRo8`(BJWsvjtl# zLY>#kwanKG9X~l;7C~Ak_vhq9?bsy?P?4P7KvdI>RJd?;fd1txfg<`w;jqack>x{S zKq7AC|bNjhe)H#lWogpzv$ zo4{vPMc|BMwvBhPj1vF7us^w&4K)(Y4@NEsJKba7V_CpI|0&=pr@k1&VYoVFn4V$W z5C}IT6DXR;S)JP1nW{^pg{PDfNUhTcW0RL+i18SM&Uz?<88>(hD~a4zQqUNpZqwng zIrxhua}Z7o--~Lg3Zua+nzZ{tS|vRh%Vvu3XfG_ZvzsGUxOUE%RWkNkPNnIk-8v4EC?Zu?czh@ggdV&^cQs&lOLt>=iWd+Rxfy#?yO75eaD4t0K6 zsHb|%jj}3*@iyu@QnK?dGISs2N~5%C0+Mtcntq6xd(?p1qv!%EC{sUDP8{zfXnHTS zzDJ-W#6L4d7*!5{w!0eXYKS4qce|b+Lg?g2?JPHTSDi&ry-dK-WfVq=5h%N5Xho<_ zDNv{`BgoAeCA2IwS!ELTzJa|@wG=#hCiz0-gN9}aOI9xb$)57*g?QfNrpaW5dB$qj z`^re7rvRd+y%|0L7CFlzhbCj3Rx&7=C22lyBiOcCIPE5}jQ1m|^oJ&ovTl!bX9Xyg z>bGHc8$9IQMuUxOPju&-uTQ*fmlXoP2BXKJjGkR{lL(Sne}i%7-DuBsuif^8?GIO) zMl28RtuQYK<$=Hu&(z2S#y!p`s^zi&ecrFXLREOL(_eY*ZF%4@lvXs!fkJfL{o1tmgTSp4s;F_yE-V}6maUD%Agq#Jw0bY5FLkgfaiW?hLF|gUbPuRzYak_ zqR`~{L6SMZv*r!ko6qQV~?OSU%_*lV4Y3EF_$3jJXJ6yl<$M0?gPeCj)w{pNJjlI2r~RPIt# zI%|vKQQ){W?g{K7yx=!+;{7Im5OW61*acz6y?~3M6}rE7tkwJWl!xDcdAxLHF&V+J z-LxfO5a`7!w+Lq0)>)b-BuaR~xaXt92#h-!hgkO%XB7J35b=oCPZck~yXeHBn3MHi zc+eX6jtH*ig>Oxve|;w}lnU$e!mI_%D>Vo-c2-7_jEI_X&+xM7IQyNL^HS+;I4vB6 zX|pE2&+36V9^lOIV}XOQar-68J#_zGogVQ9*zU8#->6UefRu6czW$|H<#xrnvmOw9 ziw9ngk9#s2*vtE$iw2HG$DObq@h2P&{SbL@`)XO39)Hr-L|je;lgkHmAQl*mje7%E zK?c+}Hro5vlxXj7#v=oKi7|wKBCwAhf6c%_A1@mfS>OeA?bunH1aaemU&hBhF5w;H zo@Ix{$6=H?AS)OT-T#}h-mV1t@rh4GdynvrH+Tn__*$%Tm!k4nor1=MEk?%;!~+MS z<7Ab1cnClpVObuJPkb628_yZ>CBm8&sn5#vNa~}QtbMP5jh0O1g|V@TPguQgjfb;Q zFv!a)P05?Hws-RcVQ1DjQjC8<>yy+a(<30})KP0WNZsXXs?pV0&azsosKbzR6iO{e zh0o(E%MSljBETgve9OORGOR55`bgt%#B&#KYQY1^mJC+oF8s0ksok<*?rSttyY=hqob&Ta!)1WDG z6FRr?t8TyrM^P(>y^0Ao=jkf^3m=f4e8Dv8wt2~4(8?L+KO?L@ zFBG{TG11Eh@!tL64Wq+^CQJ>a&f>iyKzQPUw;;H+ASfbmDkBKjiz{b|O-}dK!hb!P zItp4z$22osHBuD0B;}3dAmW2emxwlaQL7+>kVgR7(v6B;MD2y{xf5-S3aKjd_!{+L zuX?Oj80P#F2JArne0c`@S2+e*xbR*f1u@C?gK+kWm42bZy5hI2R$`PST>zQY8%#p% zqCa~>;;xeCJNwu5iag`=H$1!O__5HB#Vrg_iGeBl41AX60s<~Qq$*1+#%QeXR8ex! zep5iEa^%i_L2{GcXp`>O^uM;~c1i!Mco2XJkpp22)I00>1#7`6ri!*@yeQ`Uhg^+0 z_o&I&APoTE)X^DB*aT`R=8Qfh3m`?7026Fw7Y*E%$28UltsVR+#q0m~VaD>X{G&Z{ zz5K{8wk6vVI1W_9(wMrD##_LY%_WpzYL+}vp~z2wEw z%+&MsJw`|-lu-1@e!7g^GMxMlfV@%nyXg(GBtJ_v?ZZ9Nj#kpAMb3hR9sGvQLf+*$ zIpsHzTYxr7E2+}X#?U6p?(gbh2ZbijJi^~WyrPHbjiG`d8g!*g!n22!ED4{XD^x3} zjLAuMU#XbyoX{gbu`d>RSCU3-?hXBOwyr<9Lc$I+TZA8nQo)joV0WpG0Du|h9d(P6 za^IX~I`vh7`Fd>~K6WS?dgK6*HxCJ($(&4AIt;OY>rWZV#UgW+jU=>w8jHnfO0V@s z^96mTe2~7v3vB1`Hp<+b(5kYLFld$By@xd&RLn+T5v7I*BgWb zLNChXZ@@z`Fv%mj@I3SuUK`vK0Q#@e<;LVItCHDNK}&xIw#Y6b9aG3%*UW4e zeKo2>106va#nbXD%k)94joYPnf0Q)c?A`F@3o%{mtmqm^CNqK2Dwmd3u`{4ANnTN;o)xhKl<}_qfvOkj;Z=1{eY-NQ1ADJ?i)=wfhc}6okMzT zZ4tXx^!As#1+;;mMQ=YK-w;<(P(h~sP_#Ny+Zl6dtm%W~4X8>~_ean4BHDdV|F%zr zXeHIozL?Nls5br$%TN>DyjcFZS^k+X|Fl=IcFk&2iissOx~@-No&RUHxt`f@5U!X9 zHz~~_$iSHu^w=wL2dZJZ%d4Z#_(@C#fZM9$qrGNORDB=HOJN=2PI6MMk72^s;BDYj z$amQdg5%yegrgF?-7d=>bG}V{lw|NDj>a-II)$M_D4FGo3$M9PGKa8e6(PLCY*yj4Yp}_X#G2a z{|(vP83GG)ycl>n#?!>`mJrTiMhn3&&4&Z5JzqpueV+JjGFWlHP8O8>C#FBxS(pm* z-Nh${q&)h==B>hk>W_w(_$5>K+U*jCiyc|RhwRoYgY|C-gT}2ExfQq$1CoD3Su

g)C#p{Q7y=T2#=%%9oGDQXRytNOnfZsq^4sg}<)Hy-H7@a&45eOO+uJ_T5~ z#JmMwiQU+&y(Bqc$8V0gOR94}C(X5ogOBw4(7=q&SJqGU4v_wXP$&+>eFh}H4rZ6A zA|w(J%fGJnGJXU95>r0hms6T*LJJ@1FS@b3!`ye70_T8G0Z#sKPdB|nmu2LJZIvJ~ zQY=^Jq$;mCOA%CFoZ;i9FMB7LC;xSzrcaH)7gId|^k(sq>$LwYt;|Dz=otb-c8-@$ z`48pfCxqR$TTS~@m!n^`O^(a(k8r;wn_lt~Qo#f^jI9j++1Sxe|FMG&g;%q~$h*xIwiW~#TQX1GN6o+3LOc_KSEFw?m6 zn1pydb0pS8f;*2}sjPDix8{*< z?3$4dC6EZ^7?v{AN8pklNpb6<0YLnFw1_>K89$vmYQ?CQj=lTxr)6gRGe4^N@$W5N ztE&1&%XsVsyE8KerhaC{$gY`H`J==xwuE-Zwp)OnxcJb0g*n-t-}R zdbPKcq3?SM2U)w-r?$jT-VD_)?qdn39FGOp$f^mciGE1VAL&5&y*-Od$aG3DWBRDY zLgI1eg&GhVgmn~G=5qw8e1yW@qWdjB5&h7OTrG}7;|hod%0fu`B~{y;%%rc9xG+B1 z{;eMhK>Bu0C5{r`Whd%hNPcpdM+5?qah7tQqeR%iQWFBr+!UT~`y1d~kK;&PNY+N1 zo=!%hO~+RJj}7BbYuixO*w$5bTG#kSsli!zI{%`<^?4|Cr&rs88Xy8lI14gISnVFG z3=G~{>%a`$yeq{eE{5xCHd1rW31mj9@3f4`(^d{&%5_Iq%aP~U?*Z72c=rNDbL@z7 zX576EKMJLj3PvNZh`{$9bh@XsOYg4dd6u0c{bd~&QT%jqr{6^x-%91iQV-J1mUhvf z`b01hyy=m{KwG;}9}jVJMy*~=UJJ*nYk0P+{Yzc#e~L*P9eaJuS=LC*ehY$u3Ja@g z+S9@FPSx zTypnW?$@mJ+aq98hpbzsK4Jxq7jWwTb3}$~>#fd03SXG~LU&em{^rE!{Pl^N{I!X* z^H(L#%g;@W&CgDJCO`7b9XU`oSVNW zF)DvyqB?(G;+*`1#JK!fiL>${cUE2gw8Wp}M8%}@v@X7R$$+fJZ%y8Y< zv+Tpp+@a9-XP($Q^P>v&CDBsIo-!;`%?7hFq+v|gmU+I4Wzq4?M)G z2bz1!7_W%C3xmX7o+;*{~z_{6s(&RgO1>(fZ*7wvs>6r(mXWEZQ~w)lT3 z_n^LR#m#a`x0o1>8y|sIFbvW~Ti3U5R%Nn+fn;UZX44A?V3Y})ql`JAA@kPVEphkT zhuzj8b(w8Ff@nGj6t{^4Gaa{zdgRYSM>Jz|vUt1A>|iN=@_2I0-YR_j3%z*=j(CLq zdd!T>q>sSPiujnL(a@9O;|B<}X-xeYA>u5+As_B~?y8P1Gg{sqO@K;xWA~8 zhWRs42`m=0;QT8R?7bTFO0?8Xi7H}g%wCqzuEa=!7(>&KgnNHIg0ny7`I?!G^6{o$ zCnwL!eD~t)bhqu|t)YGr63e2ivp=>>viBNnO7E%4KdZ<5yp6KilE$oO-xmHl`FobX=lR>k-(&p!JAdo=Tg%^z{7K%y+xT0}-&6eko_six zg`i!6V#LnVe0lOx$>u{KYceG3ZkK6Z#gc>L8%eT?>7gV!h9~3Y`-OsQSD4KJ--;S< z^Wg%W&W#X?6>60T?{inp1F63Snv}}*39Ck5?wUp(gkH+e94)~A^lm|k(j~5}X{<<+ zko03W+%+vcZk4s&_-|m*r~UmG_vG)>?sMHP-t48J{C!g6pK<*~{saP6kAGN5VIMf= z5__w_@qp6IK!ari^?>JI=)=>@+4kU2k)BqW(g-QZI#8MU`pNVMBbJZEhL{Q{GeX~) z`AA%=`CB&Hykr>EbZlgtmxTYPXNLp74}>KxnbYKPY94t>oRPPekVvEIlkc9EpQAZH zV0GM<8qa9U;c=tM5cWwOj?SO=={Lu6WO1kX874J6ZuNpe)a1AuBG-<~p?Eg;40exqALo{Tv`u z_W(g&Z=KH*B(ya_8L!IdxRuzB(72`(O0Ckm)v95Lqef4UkQl*GjYjv z`c@SBoyX)&o{jwq^Ri#*C1Vpewg!$(ba~7XGiiE}oSvE$0!~T$L9Q8*8t-nuLm*Xl zN^+(*O2n!;j`flE?zgEDb`A}x$414K?IIS3$LvjOqY@h9dCGVnL24i zc*A!mRZ&HW|F8q#wYi^v$wKvZWc{0=t`q!-z_Oa>6Jy}LB~N7O@lfZ5HnVGUhD^S2 zchk+hzu}nk^yC8+I6(88Uc>#sK+}K}To;mC9VWwOV(g7laJ{DKnb6E<%%ZG1jRmbG z%W@?MhFtb!?m-#Qj?4s^+$%Mq9h++S=60UXzfAPA^08yrc{ZQnb=1@?RD{Ru?|q|s z%yFytjXEigY>oLKI_CNOw}8-{+}DbAo0jrz%%dCB3e1fa{*CQ-$&J0PCi?Gq|Mb*Y z)aMsCL&px@m3U}m@2f$?nu0av0Kj<#Pte*hxiouUuZ!DbUXPABDb)$dP(lo=r0t=+ z60B6}nDlV>yeTorF)M$6>Gi9DJ6E&HRPkoyH6 z;dKRCRb;&_nmE`=Ek$%O|us@2}%v2~>b5 z>qxs$sCa07#|zjeBvgJW{e3NdfG??SIt9!zcX2T0-V8K$&F3oIk*}Ene06%|IOlIs zLPa;Jk0Hopwwou6UNH(yC-YTk{UL^pu$HyF+EY$uv%F57b4-30SKqA?wG}`U)DtX@zb&A8t5&} zjJWi+6H0pxuWm=(bBzh5wVlm(#ZeE81y4)t0oz?6{` zq4f-w!~FE~QWAV-RTFqC$@iNhW!v=rqhPydBC_VZM^h@BS0|{$sk9_g845%He7@O_=Ft&05=^_#*lg zv;I=XNlLLLYDLAOW0PZF@}?d{f&;6BIF=_t^U`ZV$v)1s+ZBm31h)*KQgDBaBe5Pn zQ%1>u3krveD^koo#vzaRq)M7kPa#%HWd^U{XD#DNk-YxMM;)}PwK@!0vNElzvYjnt zDoBk?RL;+nCut4a3GJlO@ru|hdQ4%!W%R=mHe!D^DH(i6q4ID5Ng?~OjEx^l*eFXy zBI<$vFByX8*$k+RZ63zacG$HelBgn~80l;^&iv(!nkTR(#v7T-at#!z&SUsx1_j~u z7Tg24NgU_N@CNKQ@eu}xiY1wjJsL=jGEBYo%x_NN?%{5$z4jMXNcBaD87RS4-zpsV zTDWbGOD}dTThhx>Kt4}5AhGtg;BI{fK6(_%$;?OF=cg_xvR-r{EMdd5X1bDSZ=AvOKC}J* zTiU}mZ@9MFtb#jw&?*E|luPqc-3~{t4?FB?_`$yiUqMGBDR!(`Jt7&yp0b!nt(Mfq zh=cZGdX*e#-wFBNz6E>Gn#i?upJnD|9?*BKS!^z4)-2O6F?U5h@@!)?{dQpa1>s{e ztU!`Fnxlx|Sr+uk1B&5xQn0z?eWp2vEVAl(Q2Wp>BtOe&W(QLsx)DN4)&zx`{xlnh z^+O79?HcrM$TWkHf)cJEc+sp+vaJbA~qAvza&<@7` zWrX=)MRJVLBm*B$oj@Tb$=qsti352tqOm!Id^pzfCbR0b{-rt@jzBY*!l%V7sNb!@ zafPkSUCA8#5tjNxCK_5_B@BVP#@oJ7;E-86;D0&nL&kij_sj?9G~cN%o&F;K_b`ZgsYk=klVOP@5gUth zz}c@okR0mPHs_US)12ziy+6*I`!CGN*kgk6QAN?@Pi2 zB0$73vr#A@T9{EQX;#R8PJ215TRF1eNIAswbG?_WjA;;>|AN#Nl4H{ihTUswoa%_P zs3u&PbAGtc*XFDSP4^-BOOIrsb=!FnjIQKz5zPge-}6|pE@E}dGNLLGh5ztRl2&sN z2=3^S=DbT_L1w{G5M8J5HoMnXd0NTzuTG{vJYf>LNY;DFVPEN|ttmfwhUo_<4d-G7 zLv7!lIKR!kEYkTVStbqNDmpf^Zi1=n^kQVdAZkK>8AR>=G(?q!5&UX%Z>fqm-BuU6_qV#zc5QUY9#;B}(X8|< zT%t&e5RlON=j4Y=l7sXugw(;A31;?!nYh1R3o)Jp!oKeztX>v`ZF9e)?ott_0zv{cm{%dkVY}CDiG=u%J3p`^l zA+4krZew$P;xI)2+->^91m%A*J1CEf)~VNq?O!ut-B!L4y2N9uIvpO>>(gUI%vCQ* zlRLUIYbS$+erGh8^hwOknI)9eL&CE?3$7$aUJtq?ziG+<#N69zB+O{?;ELH2v1#54 zt(*Zw`qQhc1F0FF0uPk#N?eXAPO)0-4`xt}H~A`e+@Ddv=OznII5TSWOT$Yj-g6gn z2~z;%NT{UBKqV?^SZJtZDwwFeKKC108fp@D&D+Y39jn2^Z1kpf$fZOgDr`d*YKXB(Jm0Q?2F$_fjd%f()_k`JN*!TUNF}1{3U)<(Ma8P*!}1X$c${ov zkmVlf!KcjO^t6$wXsmK!7Qf4AsCAD3B_C##;D?7iF1bT}+dLd0h9F1{1h#}15I*|P z=AWQlkB?~GM^yePKAQU*#Cbiq@lzvXl?5k*02bq8SYgr3$nyjYw~Xzv0=uY6Kk)Yuf1Uj4 zJ2G>F4Ouu>*jaSDinE4ip&;$2-0|*zfX%&|iy{qacNJTY~$A1)fzM3%s*}TxKT_1@M^XtH+U;X7O+%fp zF=op|qoO9$;>qsxMk{kyfDS^=V{#i`A)?xvo(`=a&>6M_qGJXJW1)wpH>O^|h#!nL ze|J*-^0i*>p{-VC83SI*fQ^MWoVKOv`TA$%>0u-O*g$2R)O@Z*UiN%oFxG8_6C4%# z%PfymWNlKd0#}?}8wsVG7Ver^BZDB(oq;+PaPNzWBdk<~wG?Wy|1fxwWT8?Pj9uGU zzH5B}(k#~ukDBAWvjHWXS?R7>tnkMb3l({?Lj2)&ydT|$4li_?AfMsDeZ>Z5jQdU# z{X$8^)CTw|B&xm92(RVLhvzDC;8(RfAD+^pYghxta3qfOQM<;&;Dxv%g(0`z)dDL zvX!XqyC9-gkpq!ZpvsuEb4Umt$@=r{psoN8>_z1Aula{O>Z!6!`Xv&v?r0ZXXq2;Y zNb(L}&cWn`#8XqiP8_->GQ6NTJo&kvpqaMTx+y?v7UjoR=D1D0xsK z?w2N!u_d%#%pg+ixQb&m+H@^P=t8c5+#I3rwnv)oAa1nte{d-p_^mK;Rg*#;DP7PM z)My@ulS%()9K&?7>JuKdn`qiu;Psxrcsv_TPnuK_r38JjN@j-BI-VMxS=Oy5w0bS7KHZ&ic)EM_VXTMVF(@kbe(8$(z2JVV>2Qje=RLVEbB(fjLL*2KcvD%eYT>^) zsv&jQ?4-toXuhHN>CacB7u8niK=mJ{S{ugfC)s}PeMrXT&SmZc?e3IuZSEa#5YDPP zD?JHSXkXhn9XUB3#?hhH|D^n-lN^U6@ZE8>T!CLqj;oWFwnWXb2DgrD#8&cDfJ+*4 z*XC%SdvZ^5o6rWViXIi$@g=5|DN}t~?vwIF6|Q9>ev~qMoy}W%INOOSC0kJi@PNAz zIopmkUy>T>Ey&E8=#nSfnMF`$5%gyflv%*f;@oRFR|lCzGRQ0>6VlZ|nMKf_M6gj( zFfL&5!4~-k8h4ngdlay*4QD8Z9d>5ciMSOm%={7p)9vUVCFmHBv6;0Ppth~N0FN^x z8#Kj6Td6aAnIINw8Ol>I6U&4FgD17(tW_OvzFabKcw#I%q8ZMY24^_84p!kz5O?r8 zzzcaWDui12$2Mn4u+6z;tZ_525z2h@LBrJrw9DwP!L$Jx9`o&Ac@YOm4P0Nfm8!AC zye0p2SOFAQR#VUlMFy}1JnJ*M5+Uj5uveupMvG;h76SAH5dG9Yzzz@rxx-B1n<9S> zh#@gH<_P#ckh>b&1!ri704FXEw0O%?If*+Giq zI`1IAyePUT3^uczs#hdQ$)f@bPP&fV#UKOchR6RI6bktVfuu{V{O=Je5~wUHnNQPu zIcT)}nxe}F5pG+h{#pu+@7lxcqONPr?EYKSy;_V7Jyo$x5?NDu;pY~Ns_>5v&Kuh} z1&fDoqTR~_W&HvFULk&0wR_5W#MD^xw6e@eOA1s`T@y4KDLnBh(@POHJ)KIbGTAe^Y&PUC`(D$;RWY^IYtngx+#DoP)*5QtVooSW9z$mBh zM$n-`h__W!BIx+)o06R4?^7Ykw$M1)srgo@u_4BtT#7nWn10TQJQsFxfEA4lDjZms zE}wPrKSkadcM5UOi`3QAH7~0u#w=G}fGv=HwXYo)+i=s>r(3DhqJgIx_C@XHc*R{` zR&RGSAn9A!>L}|=B0|Z%6$q{_+Zu2mU47GQ4E6dJk7bsz+i_0%bHs&~M$eYGv!X>w zjYmT-5r@)f`ozeTBm?V0Ah9=s&znViaxLf2HV_;Y)7rX-yS6^oR9JbH);nTJ+uW)v z+uYcdwc+%>K*WjETh7=kW6rHt1|#C++;$~g)zw$lv^g}9yx42I^p#Q((Yd9Z6z1=G zMChQ^bbM8c(v@~JvliD9k=O7ETSQBo8k}ot`exM1)U=auW+s#?QZLzM(d7oig$M~1 zjOhnT0ySAP7O!SiAI1B{o{7STX>H@PR@FW}Jaaq6T4Y$!#!u)bG>_5YW-pc2UaC!Z1L>4>v8>^$e; zY`2fA{-@w9rlRZfYoUM2jX5t!QZm8RZ~5D?t?5?w<5m8CTo%Q$o){sG>Q-J6b5Xfb zi8Ioa99^5bRMK9c3rb$>9|J%iD=s?l2$mt7ZG5(hA?D96{vxE$F5$X}&F=!%at2&r zmL_ZS=|a5N;GTKnHrc6{kU3iJmnksOJc|c3R_0=*Jv@Qb3K9*q?G=K8v%S&0^CXs0 z>_1BTs{csZ2jQYF4k|``wWx)paf4+8C<_oka>NApp|#{uRyZ~qxo0i4t>%JXV}VQC zXc8LC3`T7yL=rZDv`P+O%Eli{PLF54P2zwz<4b;B6AkGhyFI38spBWZk}1qSF;L<7Ej269AhgI z@uS5YXT$NHyu6?&JKsW@jPBI)j|&}E^Yr@Az2^&O?`A3YotV9%3b` z<|ml?REi%Z&%gv6J43cjKdK=X6_rirOTy`rZefT`9$G(vry;}Lf?(tg^oc$yWggS$ zKhEZ;t*dAvlO2sy7AD78&_z|05mAzSkz#Gy+{~@h0#X}hdUVN&niv^?mSk&YWs>#v zN}r-jp02@VW=MQ|m-I2j@uL{xC>D798Bs^a+BS;q&~`?3p6rB=eH3dtlKMRARM$m4m|^MtUl(i*1<;f=`vH;NTC?l|tIcD;19JT!I`WU(0U zAjvjd1xB>QDoG`47oemIc>J6z{%4je^?T4XEP16J>4BpFM&L%u&Awx0W;K$Xht&3U zH{nGaZ#ta3J)T+C9zND$1-OuWGu||3Tk^HId(A-HopUe_L5K&y;eD}CZl-I28Bn8A412 z{}ScYlsze2>*cwnyh1dGVJcl#M{sQ-X}pU0y5^QwbT(rOsylNIb0tV;C>)RQ6+u+K z4)PTT4f#6cX(S~9WDtd>rhPK{KdFcl?V*|c*MZRJaF8xT)|(%t4qn{(t`x*;Lvdjo zeQH>7j_!WZ!>pgmj)BI-GB+0@?j3z6;P~TBw^y%xm2p2k6o)g7E_te*tKp^_&ahHX zL<9S^$*3gU$*#pVeOay+0dQVy^XpKgRa!*9ZiIdVXV=>$`z0Au?~$fOp>Jmwh2Gw` zDAZWd+d#V7m);BAIrh&Mh3*_!6iPm`s4aBh@kJ3hi*~jreA9yNxHt*)MM6Iz_td-5 ziI308oNxbJ=4_D_Yx2Ri=EWycpNSrSaeDI&&kiLQhcn?q+r<8`1bUJK3*LD_w?*(` z{y#w9KnY+1zT}yULI>XG_`I+!^pgXo`$eIZ&oYw7&7IU7L{CnD0vq>Fs-x-M)z-xQ zIeV4>ldNS$@JnyG`;|{HX+r!Zj&yq~AL-8hhWnD%ar%ZSXSS?A_MPvvbi5wG#qXFk zS>?lMW;sUe{nNXu&g^OeVbR`KaZhBb3$ zO+IWj?Oruiyf4l{n0I53Rm^tAz9CX|AIRSUWd5m3-j7`_y7=hZ0eSk#SjC_Ecl{{Z-&KU>~B3R2nuKUjPeWGf_p z9nM@!8v36cZ<|PIj|080QxN?(*5r4ig~#3NPDr(}9(VarY{{?Mr#In}W~cr`l5(O2 zN&buFD7P)AYpoorbw-oubOxDG7_DNx6Im~xQz$^GEPJL_V6A_Heg^R6Orw#M#zHlxgJCN&REY*;3E9n6s%)dZjxd z)U3EkC1g1`;<260TCnvy|5bL58j39-D)BT*-BHpC?@FQ8ex>^;yf`FhHM+axg&ZaZ zk40IN6Z!|*$pp=t*r(EMIwtGbP~M5I`LJ zZa^5GKy|c`jX9=k_}Je!La&OLyocj}5D|LhEAek$3L$p{hakO{vjT2py~E{5cNmD& zyOEAUKPxXkrWB^vTIKQWGy*wtFUWjN*0$U%an?+)?E=xWpV6JYH6V%-wY$l}^;_;H zTbLD%{W2N}CN85Gfi6U#UncMg8zs7c`BqPA;fiGom)^O;Y8Z<4EWPvAZ+~<7owr6C z2BSN_xqRWb7vA=rJE9HmM;~6XF!`Nt-MTOtZ9wps03Ei%YzEL;9doV%2y1GQ|5wx@ zb=Jd9-_j`mw2;K~)mp@xG3X3csKL9$vlUhpKgG6%m8tAM868hnT9cpmSY)!)yK_$b zJ`Ne3-II3F&A-9${$y?+OU#6eNK zF7QDZg$`8BgQRvu?NVZT@Rx7u$I6K8sL^R_H;Z0EJP;~vqD;)i)aLwBuV+i#-sQiJ zm0up#e`*pw9rPWhBByi4Fc*ZoE!ZWP#C{5+I%iQBy?CJTmVAxXG=PhusBjSPy;qXX z{eIqmO2FkXOL3V`LP_PEKDtR)Hd*cj!F?R=T}1W7@rtT@$SJ9MNm?RKK1|v?~e-Dk0w8+ z^O9&RZo_Rau8uoLIc~Npu|P*g6|nq$;9D04udS#dWQ^o%xPkR$K(MFgG)b@BT9G`P z{5P*4l`={k+`OGZfa=F%ajydE6h9E%MsE8y$*#hn+Uh29uB;-m&8 zD(UkqZr9<*m;42X{aJM}cScPN9Vnlm{>&QesoEFPn9c8Co7)1zHOjGS3fB4Hg)_mK zTa~Xw!t`7wtujBVv5Fa(4s-HF@m{qC2z9HGEY=S3lF-A4KfC;F{ylg3XMxR-A*4oQ zAph#4%(8lcUF=1?1Dy}C!%>3kCcl~z9vpisDzI{$R?@I}IsjtLRggV48h6FLqlup{ z_aM+W>fk=X`sv5!pT~rm# ztO5nqQ%YavYh=XmVSzqk@C>7*ZbNw>A+O=B5JtSD@ zb*vVmC4pDJb{L_2c2H1HqN&@QFQe+ILX{X~VNeU-LoZa|^_8N6o1Cv5axb!MI-f0Ud`L}jvWkG#K(@DIB!ZZhcYN&T-dLNK4h z=3!{n(Ouq@I=rnf{Jim%i8o!AoK5Hv%$bayec!=mg9c_+Qh(Mzko->{{vIPaj2``7 zf0k2GiLQ&NBnb)7DxgqxXW#}&6g-J3$kdPj0|YqrqAHeC%GHi3pVEn>}$ z%PwWH>Q>g#1V5)I#j_+>oBAvbtTeHRAZbkzNo$B{DiS=tWOXIrJ&V|Slf1LdX%>ui zBhNXlL1(sS@4!XM$6wWR*(Q0#ZXbc~8w;R3v~6Bhy=qu|p?Gjez?(b9I{vb?C2=aS5f#Rw0@wO5TgERB}Z`#;2;3wTx4mH2b>fCMNfC~CAihKd?mAEa7M3TQ4Qa4y^nvA)n2 zW&UbPLv1NZfU0MIrl;E(fQ{42EHWcvG+dvvG&^Qy|jMRy+CBUBHfR=%PZ3O;FVP9a*6a+ z6UwLx%quB1PwBXC6j79BIxq&JMK zSd@tdj>a#>nO5Wk67M6q2NLD&_-+d;H}v#_!jP3*|7mg0c-tms)XEbLlYC=Yla=m= zA1WhdMtPdp_eUl*mpc$w&tp_{gkZCXo1VkH-z*M?t9XK<85MUQLa?V`9b!Ar_!q!8R$2Pf>$25gqWUKN1Lf&Ila*E(O%B-iz`pILvCXWesO&FUh;<0oul4#gx zJ5wH=*ERJ#Jgn$n1%Qm7bXzwl8a6HU188$Cb;cZ^Y5Y&gNHBRC7hSL(;>s#{1z@?f z^XWbtZJeF3L%LMUcZ$mvD#_XX_NQ>I66Hj`MVP?%l9b?opNJT-T5uSQ50x@+{EQUm zP#u{0ra`B}K-;Xg8F(lb*$)#FPyg{)huHu2s$*x_UZ>QWzrENyy(B z61Ocj?GLfqchQ6b*}pRQ#n1gPJ2Bx8(jnV2thoQ}>A@gU;xLD{<>E$HIfMTu& zjRa?sN0Dj>=Nsw@0Q>&fG@Ry;mJ{DS{^~Fh09sC7c>zG8H)ou8c4O3lu+8ywdWDPqKd@N<#UUE+%s++mVgE zlkhyrmQ(D+gp+WboiH&m;aw>ad1iOCjH*u-Mr(Jp9EabQwPo^2NFk{6%*$|92Dgij z>FQ!{^#t@E4g1_uyt<0r6%(>6PDuB}Z71yWtlB57d4zYLi?QuCY?u$1x4r6plmjC9 zT8SJIiPq|&V;vA1WRRREj^J0x*8q+MzfyKIekF5{91?CanJSL&Miti^-nAzjA1Vx& z^(Xg?iw_mom-Qz3ZEgA1ItqrxeHA@_QiOk#y@eNs!Hlir8>)96m^(cbw(571puyTA zdiu{O{d2?Q?=Vp#FGGhHr!9V$rpx#}Azf7O6}UU=31M&jB)R@u?KEpYvuDYp*69V} zvimGQFYq(OPs+cSXLjw|E$C;8pJF?Txf>>f{m9*Li1JBfRiY86-`M}?RK)jAw;n2N zB1|%-1&J8Q5WTOr3R>lBV8l?}mQcFXTUhAE2o2`VFRbfod$EZFltgv$ZDW$D@+KGi zM-?KB0l#8+6dNXnR0&T3m_+QYu8_55H9wc4xP8$_ciX2gaUNYCYX5Ag?Kb?k)`^pI zUB__iZFzgF5jh1$3b&Nm7KsJG+}DJn-q*?^7GUv2-GLVoJvvPN5wJ6Us@k;T^Isc8 z9z2UyzYzr%$_9+px*s{qQHKEhg{Rb6|A0B;zSbfb2|j4`dzXc*$LkKfqpc|t4tVogy+v!Ho&$^Z)hYsolq^VGc)sv439-SxWe-2YP4Q0@G`aJ~xU&n< zQdbh}rV9DPE&EJ2wcmsRQyo{lZ%7hVor?8$CA)aY6bTG?A$oUulZJctyID zs0!U-F)_W^p0T>LwN4&h-Y5rm;?4~MLZX<2@Ib8${+m-if-nTy=v2u*;gROgy9I2& z5)5wwS*1&u5f(9PUza5g*6kH`I07C5iMo*02`p7q>2y^c*L8AM^Q}6h2u#(LhE$|s zQm)rxhF{6~3pVpsRUu4APW=`F^_l{SBaY}gI%VH}#GI#&g`jv8Id)Q{yiJ`4>a2}@ ztzUtVxTjKJ-MzA#>(~ZlxIOOLXX!;3qTn}4We}SJ?tO!u9bNu%)q+Ip*@I;8;M6s} zV4~;IwOAKY_9^`YLnNv?UlJjsv?!wUulipYOuKyl1-`$(^MKX)hD0Sw)R%LjZ7WY* zMJHmRKS!27R)x)n{XP5OA-3JV=#;mm_r(@Xp(4=U59kxdDt`fMSJ8MLNCPpw&D{;pW#Z$YBLX>2hW354fT zNSmicS(7j+UlIwC_9A~Fk>=NtZ_^8J)nY#~2kT~9@fJ1;o!+*D=s~sCmf}hAp-^Pn z+@*G6_P)p&a~IcloinMv>&qevox4m4N>{%Qn0UW=uhCQ;}$KkaWN&L-fV_& z%dlcraX6n3oicl06_d~3VWVXeqWsfQn8c`y0#K}2+*{bavst_ADuLo60Jrxb!U)NM zzCm0CtviNjp$TVE=L8DO0g@jrH>E%~<>}W@uCj@SrXfUwvytV0 zs^a{GJuUiLrI6|<5>PI)i-@>Oywxk10N|pM1>w7fw-W7v8wU1${wiF~WvNVuI&qh9 z#bro)l)lJ7WL*s(=@y?HGwl$gVBR^?K?R$jKNMKBLa@m2tcW25v*l1laJubU3KDX+ zZE`GAIkTw{CaefnK6RSNzKyL)8m|NYyfq+{MaSN}DttYCAHOQo1!2v+mdfCU;br0s z-Aa#JYJxXQxmo7l#ASzSOSlXFTyD$@@x45O=Xm42kG~@D=bsH3$KFK7lQTY)+pOG} zW)nY`zy7y>F2kM^-kt zF!9wS`3t#RuDnmW5DtH}Ce&SYR zTwy0}%`Ex*LB@wpRYo$Ru!pd~4wNX4YEkTm11*YO{dS}$t3?@(Je<{{U=Xnc+=3Pb zMh}J#Z3^s$Xi@T%D43lJpAvXe1)EAKl|Uc~0b=Ah&W8wc=(*0QNPa$45Mt+gvDkfM z%g+Wfd&U8)BJs7w5UWQ*8Qf^@%I%&;p}%i1w-u)7(l@kdrMZ*JRIIXlI1CEDKp0={ zrrSLya|fu(U5(vy8&{t;cXf8p>DhP8v)qBm*l6<_?H(!Rw}~RFQ1p*}Z_`vRwEH3gx z6*=O~gOg?aJlUjAWQco&l5p?ZED!qb>gLb%HYqJLNNss1h|%s@!|$2qL9afLFZvJq z^?_6|6Mxr$KA`EKjY0nb-zPJVv^u0uq!GW4Y&^S1TKpYoof7->!Kr5!6jYs|4~F$Y z_eBK-r3eEkA+6gz|H+JzwFjRG-{c zsSh^sO;hA9#b!Oy`C?N-FlA)Tt(N2C?-dhCgdX?EcBp-n=EClE6HFhAp) z$H|D|@7>URgUk;D!nIZNuLYCSd7jwD2MZ?^ThB0!$OIpwfm2f{br3lA!e{I7t;*Cd zMirfOjj?}V4f4uPP5r~Dvg3npNzn{EU00P_HmazVDLN(o-o#bMcmB3Vpw?Q*;3qau z^ap>A24-^dma}s4s)d9nGxIh*^(O(9VA__Rn>%f-XRdn>x7vbLle6FLkp}?) zT$tLDt?l^R<@nqW-WT=-ly{Boz9f7)n|?2S8gkZ`C4vgqN&-+&+k$NPz&Vo;k!Tvt8;RF#0sW2;a z)Cfk78o}b!*K?c6nNIoiiShS}1XMF${X%N~sN&=NHFScfa>5Qd34Xk%jkTHgQx7t*MuWj~@T~cftWHWe*v@6KhiU{1r_ctA*QA zpC8r25xWt;fl7r%pJ!O7q0bM2@QQZK?6ffuqNptufuF z5`v>W1OFMMYhd8syQQUn9Mw`5eIMOYu#t{#==;*pWuqGM5uVULw6uCJdvXoGauKJn zA~}fj-c8a{>8O@C#d#r^=aWh-+>=L*`P7C#svk-dkG-3nAD{lo9@(_2qZETh{?#OAwkWc|e)A1+ht{^$ULGLc(kqk6cLTm6i(gTcV+CXFh5}+hzQzhe>~vk08#- z3~SU9^h=GqM%BoYL8EH?Qfgc|s>Uhu4Zd#x_d}*%7}(TtquThJ_wVPkQe%j~Bl#mc zF~5eRjFAsrgHq)`MpZd2ze;Y6-${+zM%BnJ#Hh&_k{a_fHIRQAU_9&nKk}+nsmN3b zYJ9*N2|`G{1`y?s{p`#)GVtMi2&C{mJnmQlC7^Kpy0R{GX(i6GpX?r5is=Bg4|jz`mS$5%@1?&Qcg3 zrIkNRD_(9Z+DLXAf0RZLY?UMM{spMNn_aeJXu1Lh4|2Q%->*xFulr*b(rZOoa zDap3v-Ye1VQfp}F1HR@;nJe->CiCB%J$-=7e?9>O_#=MF*LCrJ+>Ssz%p!q{&aEEr4lq-i^GnuyOmm4sS6xkhOI6a+>A5XEaatZ% z1R8oPKD;mQ055MY&p|^X_DlT^5-V?hoSeOX9-t0e6d!KSJ$sLyXAwT8HXhy1U){`w z(#*oWqxOFmwniNtBIQh-I_k?=a*0WJH$HqIZxY6d*eQdHXG#;lNoOa)r~f{Yfs$hq zP<2x6UvjD)eP)f`2lY~A#i%N0Wawo{4Huromr#mWDmO0pNUG9aigkSnEA}8 zSrid)YVZwz3Y?6<^x{mFDr9u|5}OvM{j2iY*sqqR{N_pVl>}2u7s46!~mHS6k`G6YBq=qx9#s_rE z`La}rjjHki9}&@e>f?V+jaI3V+H>^Sg_o1_2Lkk%P%k3=)B~fcWzWV@Gj^NQSeIL4 z*2#HjYSecG|KHgz)fVJdqgMn5&p_m;YEr91YMnqW+rzDR#*)oMf(!g$P`r0X-E#&t zv-6T3fxFZjuS-#hJ9FhGtP{{|qj_*NQonKe8twIx(O5J_F+q;GJ2Wf_#zue9Oe)U_ zomt>Ms=*D7TMg++_0D+xgeAx6>)0b08`ZG8gy0ZsiyPdwQUYpBKqX23nQV|k(KKd0 ziIx>H-^A7%H1Yv@qKeG&i8S6e@ivD1=n96Wz#haR=3Jb{a= z+Ak6bAnG2nr|m)~LkKX8T_XE1aG)DzDlm6iC^3-mC>{#CyC^7CAUxLVT}qj({cLv&I4=4OA^K& zM=VCtYCdl(;70Z>x}ph$M+z8CSF z=>$8h$(TgB+c7(;B_JX8SgR`lCXDI>!#V8dRy~ai@svO9pN;9=Gv1Y&ZU&$!;P*X7IA1WaUc4S%~y~6Eb^$<3WI?I4ig8+>&n3J#~ z?h6V>Z8*GRI49p0kmF{_ru5(W!1M$uoUVx_Zk&mcQD1rL{{T2RR$yg?Puh$gM~=gm zNbF0mi?A(Pv`NljiDkG{44Hz=5n#xfSOQ@swyIo{%pKAW`SY4<0GS_mrukz&ED;_W z8}A;im1hir{fTdoA**75iQT=iH@nb2h_TA2k}SH5Zer4av8iv$4cwvK%vs{x<&}W< zgSwRX6ucKrJSduyj8O?egZX}!eAV_g2%jo8$RXyBpXc`-d=7`kyD{o-or;n91cJ6E ziIYKAbAn|^FogC3ZMk03q~FX&H>o#X)OQrDw8Xq|LG!0)d zRYI>6({e8@*GtRzMM{t{xue;&y;!i`tw**&BN6Xn0MazeYzR~H@HhCylo%(*b=zgU z$3Uv1rs7nY3j815uZxUd%x9Y`UT7aHJ~ z?n(S@!f;z}{w^9Szw7T{9eCf3RVaJDzEW_?}V z)Z*SfxJ=0t>mkKoZt~!+1IY^O+sWjfQj8}n`^{_La*F&Hk8Gl)qlb`KQ~t2*NKhF0 z#l<6L$FV&i8g1`-tO4g$MH8(>0$oKxB!g(;1}y!)S`$o=?N*R06l3xgL@aREaI=i~ z14jI$bCZ7%XZ@S9S9(C0WnepsZw#|+tm^#P)y;>o7j9cXjaY_dcAK6jBTuxwNt$nW zP>sW||HWRJ7uT6N#4BNSsrAs+72;6X#3^_>1Dd>PrUlq;JQ5Z6>k>`QSD4QPx{ zr|zVP_C{U01UwdDs(s}?*#j)g!q2zM7yup-(|_FbSk*Rh;KXyush;`ps*v4 zdBlN{@QyK;sG#nb!B!fZGfb$?O4=?ks33^{bF5Mn!rE96Mo`K*RxujGL_fEf#srmb z;rrC)q2o;v) zl#um*zrg`gS8@bPYX++POs$g0F7q&6Q%I0?A?3v|@K&}rW|f)~M*TZ|_fBz?ZXSQF zL|LrT4CK{5%65Vr?Qh7o$_pCT+-45%JYZ|Y+seeFu3z7LhBtdE9I*eyB=MqD}PaLwEx z@m3peGb_GrAbz-Pb$EI2IGjC+HS==y&ZaPSpqXM*n!*Q%r05Fg3@tsbWikbuLIW)? z_Jla_)8j~Ym@es&-Yt2wecJ$iI6Th!d)&NAOXOiX6)ch_uwX)-05Zcall*6>v1h~a zo4~8Z*Gj;LH+6Z!9@(7T3#UfhF9ev2OJ^$X)VEEY8t$r}S`~)+GGs#jQFwXdx)GU* zmJ*^ArcalIfFT;kBY&`fn^L|+U_xuopk4dIN=v_HwxIA%!D0ktZ?Fh_h(&OwunIp7 z=?X}IgKjR*ZJU@%a9#a$O7!<1vH(RbXXB0gv@A|2+1hArnJ_k<9Ecw(Tg_rTz5MBM z1-o#4a34?qzItc4dz_TqhhKT?S?)miz>s)uO|Vu}x!c0j>JH&5HxA#mkz{?r<1Nqq zv@lI*`*iV7L*1bzkNz~2J{)dO66`kIerR0#)1jjmAxg?N30F_z79%5IOA_rX>+s0d z!A)5yIvJx2+Yuvcpkq%8@90wft#rSK4j4iIi#c3IXPt07Ee5(*N z5v}c8^|2kZOYutoL_umb+Zu|bKSMbI8QbvxN&5SR;1$o?J!ll+18esgocuUm2JI#mo!QvFK+vkacFTH{u5u@VSQ4lWsv0X zWS>4MGPT6{##85^#DtCV>2UI`;&9nh^<9^EYyZXY?dt3nPjGLpN; zlqI_s66q<{Q+Bw%Y^ZF&@Cs!O&*Bb**X@p?RG9IAKfQZoib?7f0wGJ%nZ(vBc+fXC z%s+Jkd{MjM`*CriNhUt;%Jx7O7WPl8u=`k;1no{RvR)aPJc07spF1{d%dKW)?xV94 z#X>;)BkF@myRW|MQo>8S{kY$nQSGSjS{=eMlJv%9gI)6&=dbF^Ua2ojC)1_zS3=`O z7^!iC3{?aDgWF@!TNAm8H^G6{G=9mm(5E=K;TsAaTUn647!k*2M2cN3=?0O25KcX? zx}8}lX}R!*6IN$MX&OE-*53t*PNuuj(Y<9;I2q_}%soP~!Ayt`910{&k-lP4X>p8v zd1^%ru|TC9CRO1bMCU5QvubK%K63L36V7QRjCJ(i2bs2yBNO8+pInLd8ObwsT zE4sGYII`*P4SZ%XEId>S`6&!T( zH|TkgWvU8B1t)T==q%&f&aobdC|CbNInIh}ut#j@i!#!8!cs8;G3N_D5?E zSskT7<>&|;Opiq1h*&?_Aptlf4TFaqj;I?FbYnBlf`tBkG3uRRqHes-n_%B*)Qv-w zJ4V!vm2E7fV4utIM0hee)328hn#+e9OY+y1o4% zD%v2|q@B=o(3}MlluK@K5;`|DN^7qE)-!l zqViG0ASPcfwnHrFF&RXk4|1TvKPik*h7Y=jri2DRF(u*0vaw4(lokhAp}K_~@|mFp zIm}RlFhkoQ3EhG8knlnxi=m+Nb~LoJ^%Jl|ZW1b@*jjN$ymtV3P0M6r%7yw{esB08 zO)sBeh>8*4%!D0ECU=)25|h5$Zh!hUMYrl|Ib8@Lk$ATaMo4B7MCdb|W&#qWZ*F;I zLBUcd>XP@>98VI!&Ib>oNgE*0Xw`F&_`*rb>jnG>wPeh$@jt^w~6V*5VO9<@2LIeQykn0KjZ%+f@aqV_j?Bg#wS|tDOnmyd(`Tc?f@v5IRoIY7g zPunH;VN^Jm%I9?MSdyxo4WLt;cbXr4D(gf}v>iTAteJ>>zQB)c74hmgH(uaWp9BnT z%Q^P0y4+_TL?CU@t*j^`zP!A7O!`!mO657(JMd54F=u+&jya9THJ5OdlSyih2uHFE z+J49Me#YYRmg6;dX7Uxno)n+V$4@R*rOwDWAv=_3d(&mW^@D?7DYGb=YIzOSY<_nFb z^p#Udm}GvMssf^eQxGvn>&MpN;4-P8^}_h!%C_IertOV{ei zz((2F-lY-)Oa~-e=_C%l@X&4?!EB5Ra4a|^?8 zFT~=xw4toO{qVk()9l1m#kPBrwdJZJqK74S9~Xubh`)Skec86M$J57Cy1r~D(ulI; z?g_;2f&bZd)V4*$2>nm6l-nx^B+3sF2;4vGNd2iME675EE3B#{x?X&wv~@zbcJd{5 z!YOXsmmUutByphJ*VCZaZPC!-Na)?@v^S7W3G^wXh87zn1}r*(AOamh`i)?U{VcSm zBM_QT1Zy5{hqgY&YxteX@bOCyCL*4QerZlA8(?NcY`o=PyXa6uQ6o?dVve#TkefHa zo8YwFH>c|3f`9xSay*uArdI@kJ1Wzc2s78%iR&xYt8?+p32kR9M$_1)bS)4NH?Lun zy~Nk{|1iA%&MvyaF)<#s`ELxdzlOah`FC}gW-mKB(d9b3vX%d)ea(t-#7Oo;cgDCp zq4SwFnYr=lDG~1?l_=)O2?TG*Ym>k(ySwQ#yA*m@kUrrL2s&$ep^1TnnsX~yvn%(A zV#S<5!I=@dj$vq*(mSQErgxe}lwc=BXUfC%qS)NbSOc)}j~@-ss5METS=e?CG)1?> zuTN~1kP!ejSYyXLXCh9zUz}j{Z;(O;kzJ!nU+iTM&wN~KN0Oh!y?dWzji-z0TC6@*c%{)qmVyty(6ju>H`mb%(ITWQ3g5zP1N^C29Qn z8pK-yWk5#w3aZ#zgN7jz9~p0Tyu-_I`^Y$}qmT0!rF){5cV5VgAV=CLk`8x%kz3fj z!ho}C4a};+K*%vk#1sXOL8mN%6;qn7|+V*3CLI4|elM zT5$~I`EMJUdH|oG!Hhr1dJ^^YmadPnIyAXM;=wh%H#Be$hOqm8m>Lr4R^q_{sps83 zocm5Ic0M8nynE#H2tf4niLC=i9Qh7Qg@ZRi24TC%YoVQqak$GDJ5Qk^VT@%dP~S*l zVc_1$FC@N>L7}quD>OhM0;5YFINM7|7a)i>%Gwi|N9QF-Yh@m~{zFsL)rwG^9aWWl z%=>pUl>4L|YYWl`5#yS9WT#?66VhTUO2h59uK+NvVH|QEBJ}eT3ZIB2TxVk)OK;ur z)+xL#5?$=ZE*gv`W{!*24qJCU&vPFTRlyH-BlMo3zih9FAR@>QhMA_%N%QgB>-g}b zQh~j#wzlIhC9~{nygW+`C?K35YOk+wV&2u9>Q0r&W3A2_StUK_fXjBJMd3uSY3^*p z%`oiUzQT-^v`_979#}Iao*=q!r#g%b~&-h=2WepGacK6Y6O;> zMB(N+m)CN=S+6e-bJ=Y!Z7v_;a{c9vUdv@huYbn$nXzZ=+pw^lVzC*Tn1c>^f3lD}PwI!(xa z4%qhKfQ3T0`!v)Jt0eL~L3=qwZ*Vx7l?jdzpacsL0PAuVoQOoA$iA_H!^MIC`SU!m z^dhkI)m1y@L95PdJdL;;VtOGTNo_6D`5ltk5@AQ;mU03a3m=V~bS0K zTQ2?l10r5^O%yMW54aCr&r6SLUhK!nxv2dBwR&UjWtA~ETt!P-+v{wkT*UoaHBX7h zt1WOF=2BYV(k8rVz1Q$S*!|jN4Q|-EBI1@s2tXEduOX8A*DJzZ;pyS7%Niqn>oPMt zLpL<&(f5^_$hi9^gj<&+=+Muq;_TFDtK z5fjWyoTC>%W~>~usn5vgy-q;`R5H-IagW|<79+lGx}d2n>ep{9l}~tE%N+S@@{Vw8 z`mmNhY&CsYOCPpYYMHg)s$YLk6_?&t?Zn#6-d63z+8=YEDNO}wrJnt(SMX#yMVWva z`QtjvqVDRYJe9#B_<>+D5aYO81!NHTb@6Dix%?KF*K=8~5V!Wn^$K!pAF$oi;rmM2 zuTWPQ18LGSET7y()9bsgu3-YC7DXDll(x8xa4E3Kw8)333znT%TiEFjMw+(5~IPK=Nd&d?t;A!u34B3mcV)^3K=ycjv4;%hK$uc2uB+BXROrHJlD z1`asu0(!Ud;W>P?(+qOX3NB^XQA6?Cj|96bbJ_(~U|;|UCTAe?XEANz;w-Vw* zL=&C+K+z;N*L*OxqHBrfUBjDRI!L0Hs4rt-JKQZ@cJCRcSb7x;DO)_sLPjtY)B`Ev z(yPU#sfj`mWGNW)6+mV{n?!8$qHi~gOe^MH=MZK6DiH5;k>r~-Fw=B7#p3cs(+B+` zDS_nsYJi`m@;ZBcA}gS~5xm!N#x8`dL;KyQBnC;$0ILUO_E`k!gza8p$D2^*iHyc| zM3h4~Lw9Z!nLnoUrlz2&Z*Co;?ZiFGh4_%wJ_8zZ5pyVkmqk)dQikTqSVH+^9oZ%m zTeX6>2r1#!94e$H#KN}JTQo@wJ0R;5N^?oT%fAgI*~I^_Wn)MOWovEyI=d7dGhY`} zCA6K{Zo0(nnxKh}ysUFX1_?cGThApmbom^&{!Ee~s;Tb+H+tr&3wVH83r-WrGxUf? zx;;7lV>&7wQF_*Sym@kv9Sf^C?>;%V)Az$E?31}NC&zj{IKW^Mx&tiJP8sg>0C5vt z=FZ^m#0GO$VM>0NyY+gAcw49N$lbbvX1%Rb^}6NAh%=JD`u^j(%M_L}d3V!D@lRvr z3L-f>oiD!_bDxd5zc>3ROYq0sLy?i4%_Y}0|IM}CW%nPidH43S0SaT*>=&C$u1B|b z#D_8cQ1Z1J`xkTp_#YW5h)j7WR))T#CI$e<+(y9B#sGS8WyEc)3U}2(F?X6FZJ*S;bGvSUDk>tz0UqoZ(AJBcR1 zbSr4$fY>@y0W7o_>zg9sAU&Um%apJ>_Xw`c?lC0RwcD)D=O=(=QG!%IjV8bqVL|5# zMriv<2f!VjH-fX6*;46*foq9B=4)gUv&wm{z1j?j-7RI^djv4MHVR&gdgoSBKvPqS z+b#`HmxjEL;VfBT|16u8X`B6vY&^jy?MH%mf_8OZq$e9s5PIq!N5}0RPaHwc)fU7K zBDH`FcNf4CXV__fZ^HXQ%!8bLL?}^yHSM4zx9~nAy^gx~^)u(>vhIh- z>50|;#p?Ju&z)#(+KSifSg|G{nY%YLgqe!Lv)Cz-xVSVrRi+F80&5`jY})op}PKs zz0f;1$=`~~b+tw$YZRDecOWT!-zZ|m59+zj^_FId4`6+2D7(<2AWd5)YG!>pm zpTzXryWVhrLo9T=Y?sv7Nok~=og3)$e(SoVbzaFV>RNZYKq@xBz>!Qqr1nLt<3zRq zLI&Hcixa6mV8y@55MzlI;7yJ48kKwxyJaa##bSs|4-JO8mf5GfhI!1H;Pk&TVKUgL zH%oeJL>hh_HyLwDIXY~`Kh9@>hYCuFBU$qG;ss88<|VM~OMvG^iK&;6x0Do6rV-#| zz^pkL5hZeTtt=Q-&03KU)#^BtdZc8Xst|Jo2F!6%r%q*d-ip?~X~lm)WJIxKOTJpXC~?kN z3%r?U`Tc3@U*Mj4R;pdvr^&w$n*5G5`5$OIVK!uxnT=v5Tj%-$TJWR1w!K|4cQk;Pg z_%oSW#o`BDlKJorWkGw6ZVY3QliCdq1q7<3=b)=DA$0`2dQ(5*N`eq4d~V|QJrKnE zSRwZ3SB9Hw25QA&n%E8fqUCIWs2V#jCJ zuv4QxZl$meK6L@xJ~r(wtT~D$wDn5FYioURy6E!LBE2rZ#`cWl)_|w!Eb}oS@ehT_ z@-_)>|ED0m9uM!lFfh~RYcZsq0YMdZhz z2-aT6pkm(nB#Mh9omYz&c(MJU%R6uE{P@gDW?{}z zvp{#{pf;m}F40k`_$DJLRhch#PAVwP@Don!I2AeLBZ5|Ar({2dgkXb4tomos+$8hq zXeD412|1f=Ns@6xE zC>;k``prsDlQFd_e0>lLJ>veF&2Dz|A@;3oS|h2*Hw1z5>JhAA_PDTTJTcNJcpR@& zJ8Yy;z5xdvm8puMSY_QE!;|X7wd))fwuYlK?i1p>^^^sP+h);A5C>jR#zLeEC)cX< zV@$Xd0iBox>VeoCjM$zA_Zj<76>J&yKM-t*bWvpkVk3s77Rm%qH;a+BPvCTy`c| zUnX8MqmzG()JZ63IVA}t!S<1x>R!o{YQD?SpD2|Uta>E;8yi__zi-l5^H@5>ED9$e zN|}Ha+a6v1#+s<_wLLa`y^^dlvy$X7zI_b~A8^zL|D(^qd0K%0eAtCV?^oDj1h6b; zQO7K*zaQJp_Gce7Y>IlzfjI)WE9*Td^Bf<6^=^bGj(AJh^le~)1`r5Grq>|o&{@oo zB#%#WZw)wVQ{XLt{qd%l`)+ESG-6IYBeOQ*3U97|0Q%Alm2EWFd_IuPkhID@D0@az zI0tB!rIxF=~CC!yksZ1)(c;>O$U0TmG)qLTKNJnxc(d|Yl zurH^n<{E_7QTP9Fii*5JGN7pNIwSuHzi%Bmc|T|BAo0xkOc7PcKt>|5LbQOy=2EUF zK70ZmAn^T>#22Pc)}?QQj}q>|HMYs9f+w@gd($tY|5e`}ISJ@&^Z4tU$B8&bCrsox zMpUKS-_9~{sV^%m-M2von1^`<&L5O*qb;OvQ>jqa^uw2ffHGJf?T(B;CdN%-G}5pM z`wqCzKL|8LbQg(bWoEOoR~vfPcRoz}q6d42x@f)t8-9HGvm$dG>^puf$W~P6%XhA^ z6JIDL@9A%?jz@T!Cya5lqtYAi!FCyr(SI3;!LY;X?3W(EA&ewbA5&n=4(BK-fy#D) z6(c3+T&mPur;!qLE;DyVO3=B&+*Jtw%`RBY?fOoU^P+7KIf3XN=nZ!wDd287cj@T; zW!=Z6zYHbGFw7b6%L%d)!OSA(Y^LUqUyE>{`}q6IkgR|zHZf&AA|3$$GUwK8OdK0F zpN}7XsHouGSQ*Z?65at*fVG=!_x94L`xUmmmgW{ny^fu8 zRaMu*>1;ML3mbL#?m~o)S3z4Qbo}nZF!INQ3?3Pj-8C1%fs7g@3BTRBm$?hCu=_M+ z4-?O7ZdDBGJy^mi9Zsk zHEOQUqR<`d>uS2lZ)=z=qxIEBd;yce@h<`!IzbtX9+~nO6XY9G&|`rqtU!UTF0O#C zI!0?6l60ZZICN09UT~DmPZVE({gCw!Nqa`8%?s;0y_NmemR>-g-rQ%X!-l)nYaNA# zHZRPRr>B*;t%ELJ_rCyVuCh$Ow9K2jx${_#60RMQ%ctH^>$Zvw%wmsl*fE@oZG z@AVRTDWMzRosTH^7M6N;6|{*C!o!+rHme?HGtUN}he7qT>-Y;$%(nTe$WOU!wV_&QZ8+CxeU|;aLrx;*Re)eEZe=KU4fueP7Ln4^iHH6ssfCRR~3|<67`rZf+_Hy9Y+|1N!W z-Wb3-*q_ko?A6y|wMQ_b)@iwptlKYX14QW%>woZI`XxBG$nw6)k;G(d;;!tEB=#|LGV-5)lTdL(mq&}-_Bp$T!sxUg3gs26y(O}Cia0_WW{bMmpCv9bF zE0M3n7)UIR-QoK6cM1&d(BBin?ZXqWxF$!Ih{)XMjG?2QSXpI1yh4V}Kj;sP!t1;0 zR(R{b$G!LW-{-e$f6Z-dHFjdwmU$~MM{dO>jvUZSd~->gfCE@5O{e7?`$@GtuJkSF zG4+TK7qwmzA1;9t5ehAF;Uom5b=G(L?Ajf5)^~8}IpVaHVEURq&G2;%dot{(c-c1$ zrtxEunrjCcfS6AP?qVKAU74YVLF5CJUBKKFK{A+wT?7i-F{JZNO|y3Knt5R-;kmJ; ziPY}0oV&zeDb~3&Y<+th55mZY8cGM+#?Nk_IkDIJ#;{D1%K;zQNJBO}hh80O*Ek!i z_mW96J`U?)HcCUc*tkH*D>#6!WAKpJnv|2%7Ch9j*$y$9hD~;&VMD!RZK*4bB&ch}HgS^>T*Ri|bj*2A~2`)E5$qt!JYe0X!QC{SHzk`l*|HSJvR^5e@ZX z5FV}FXMMM~w7>04mcPV`uao|J4V&jDW`ZT#HsEuo-J%I(c^4A@ z8=IC&|A#+&aK8wIeWu0OusPwYjIH*%y^94Wi2>a0<=x|>wYQgA9Ty^qs*FKD$O}pT1%WTc@puriW$h8fek6>4&M6L%=bXl zYH)@kiQ>uj!d~Td7u?_zX(WO&1oj9Mm&l57pveWzBrvuUR~4FH&1j_IAI8B zpxshDDq+;&opDZ#uN^3msSr_|1jRC5$cU#qg!T5n15Yl43N|~)K8&`9ae7W3us8d2jl;KA;ROvnVHLmS4RC62G z$d%X7PIEo{?c#6udPl5o8V0N_4d2D%8Xv%hjp4H12vt$O|6QzXM`{WK^et<$>kx2j zv7DudLGOp|pOU^VTUyRQQS(Sh7(Zu4AS@KSq z512GIC-e31H4F{|ZPbs*kR=$0IcNM?3=B)h!(0d|40b_BuVZ!Wk(SJ|D-mb7*qC<` zX8pj}7kwCeR*7#tC@{Lfc}iE+SiH%qp03=GB&v>1#qUC_L`bp#mB$R2QtEI8;7Jb@ zVyNbHoTl}}m+j_mLJR02g9ztt(m zVT{bot#l)Rs<=Kw*A;QR6NUE?#FFvp$<*|&1sA&OmMfRf=uC8}mE<;CMN$8rED>0%5Q;Di&!BW~?CXv^)*jMY_ zTfc-TQi|Pra~FmS>$VGC$-!R4dsA>?zCpMSA-0llmV#s1rN}T0rm-LXUQywedtV&; zvOuqQpFme2T7`fge7ppY|7+D8)1V}`k7UbMyjoXdD7yUhifH0ofdGW|=PdAA&*2MK z@`a?o?yU@PqqOQEY{YhTZFziTTsNk%3wVZ&Y~*37%)fTNKAmS)=L_6b@9Z8I)rOvr zdN*%M4f3qH?pm@*GV!ki7^b5J)l4X@-WhYv2yWh#+v1YVqJ`C#9WvK0VpTawzytk0 zh7mHHk77n97zX1Zl~BD83JEYs+jo<%fqm9)EIWw2Sn)@s?1%sm6Wk5izP3O0DztM3 zJ&4he!@NS8rP3FgaqW_ELEN}ckzgF3ZRu$0Cr8(kN&+GNaR3P4&QASGd3Q;;yG#I7 z*0b%5?lQ*I+YM6y$@L4FP9_wraWf!>RoFzv4gJYG(L~C>_Q=Si-Q!ZiBjJqJpL$E+ zUF;-QfunRsQ}J%LC963A(6Lv04eqBE+ubND73@PX%#wW>toV&EzL;yoGPps)xV-KJ zB@9}iU2t=(+plDG4A3hC2D<%a%x!m51h@?lYIf*jQN!RRw=-nq@3Qd!zK2Jw|2}<_7}h%#DX{*fGB9srx&G;_kUx5gsLX)N?)9Bj z<{?MPgXeRpu(0)9t^#m)P|U_se`IdaT(L(>nc};hC^TO~pSl9OnjEJ$POU)?9w@l&>c{P01WNG;kw5HT z1d8wozT3oFgI9ILM5IEhR&s7fr&h&?1~Of6a3ucvFyaa{H7%zs@J>C?u3o}?8qSt$ zzDsuR-9Ys~{BZtQbG*stK{%16n}8g62ki{i9%?yxL1Myr)K_F`QT7{3VoU-Fe2 zyX+aB-fdS8QlNqjp{pFJ{+n?7s?w}B37?`1t}EpShZ)+be$@WV@9Bj!Ds`0q3G*g= z!I?*E z{iOK05b59#zU>b9j#vJ+LG#B+Vu(*!TQ~?tWjO>bv6H=c?PJeZ-ESw8d>55V=s7zH z<5Epj8RXIyHz&w?iq#*HXOg{>?CO0`W#x8qN2M6@8fL{bdXjiMYn!WS6FO)cZQ>#p z;w;%go4D}4!_^7$X-Atf->rTwsOVQZR)vpT-aSdbL8F8wGoz%_oB`5lMv40god*Bp zg*;vCd$C9~uvKsk@c20%3Ya^v4VuT{7cQr?t~gv)s4XJ;nvrcVO6>vB0DI9csyh{9 z-YI|=&_rM*(6XT~`9Ay=UN6{!BeN|?uaG^Zn2Q))hYd_g05F4|`*pb7fIj(q|d zk4lJ_5?Gb=9~u(&fW)?0`F6N{=%sLb?;~(gC$D-X*J3>{tO)I zv|UKZoM15SGmJ%i2?@dJ5-#93W@6)KiU0L=rFe6T$(!=4;+TAGfc-R#m0_qmo^Cx? z&U%@5BS%L~@^ODrb0pfjxka?seC|<&B_8ahc=ts^`=fBwG52Ep|E~uP8-bvkMA9+| zo~5_-6da&iUw0pmzx+~s+kNrFe^~uOJh>x&=-t)uHQOt4-N=Hl6l^_P)?=EEQk;A7 zHMR=`$Izn!>^E5Yk$&)wjY9|_EXp+upp(-c>5>7hypWQ(ZiU+Z3rsW!t{Vc%rU$_+ z=1xy1WtRMK7`5{$4c z&wCo6-JVa)J9xR1+33xS7u$)Al~RNQN;JWdgagXp`Z=!q#tH+RzVyS3##~Gzi?OxQ z2&(gzM%+cq;6FHoBV<^G%%anf>oT$|I>^jsPUy*FgmKD8qRY&V!AjKjktD2FUqOif z3{ywT8QM1&tGxp&1s$0o>%Ft)GI zrZa~B@>&+7A}Lu3G~Ze$iKo-Wpv@ZSxlQ>0=<_SPxNDc^SGH@1HL$eV%?%x|wk}2S zyfm^^0Fr<063XT%kJOmsHZdk_y}bo1geHK%AhHdP&hG711Pz!znTj|k*Oc*V@#IL~ z7@Z(r)R`WS$EiU`Dsamc63GtG_<7nf`~4ie9Z++whj)PZ@W54qk2qr32?RI{0V)@zdZul_!e;9=pTqg*TUVMVW?DrvUa4JtjOj8w1bE-P6vE(dIS5n& z!!fEN5%Ve|gK!Fn(H=gq14ZN0^aMLczqI?pu`3jaZR)>KlyFbw$vx%i(@h0!H`A8T z8&aU&-4{+Q9BHaeTJe{peQ!y>1Ue*+HHwVH756%SmVn(CBOAWgdT7;=rg||)yn+!m z)jru)X+8AWVALZ-T3;euuKyr)Kr!9x_3i0&S_|v}j zdE{p|cUzsCcmoBqLE~aLU;(oPP364DIZS$(e5H`E=>P*=y^x457fv1NYpOl6YSPG) zI!+eI?*=b#n_7rb1NKpm{yF{R1EG}2(VOC!ubec}_X~8E2A6>JBU{z-24*gY%ve`V%p-(7T{+z#12 zUwo~sx${51_;a}(lnpz~IdS;X)udfgxtj>KjhN5hH^4}+Wizq^BYQlIR7>XxGkfRf zy{sqyoamJO4eq<)_#ZBfhTcOaHHNLfRAC%q-MIVuEh`n6@x#b#9D`GYDcX2UM1l`W z3&fdQCce~IO7NlmKeVpywWgt5m`08W?5{*-#PtS#+M#N$t3$3gyrbhZc@EWZYsepA zz*u0VR{MBs*^Xj-I1uu`gOy`hePXI`l?Ab~KS!)z9(?A&qcv@x5lb)HfHVrK@@4uY zs#+)94R9cvnTqNeGf$EF%erYHK{MC`sasJ25Xl!E5U>zj)ub+m6ihsdqDH2j6A zHG3$We6>)$HcpdXAOw+b#A^4po-;pj+qvzty^eFGD^`DCIWEi%%Mfw=h?8*h#p$Q4 zs)lx}D#ldAbb8p7vIE(iB88t1XDmi-LJ5epQq^%#ECOjqZG&7=O?H&Xo9rA%fUl0_ znK%Ln{o$XcU~jW~j&cO}j+AxpSwa81REQrnW~~^sS{+~K+cZ2~zVY921aNM=sWk#u zno!q1`-2<-L#_{tnwVy7Rt1Ry*+tx{Hr z1OxDYQYv{e@^}#2X4Yzx zzUJWVydP2kfD+l1J_Ex;t^tomEQkDexA6l2S6H+A)CFK4t2?mrET&vVT4J{IJ(^MT z!y$<}xj!O4Jm(UfrmaC|?24{`%|a)5Yo z88-k9hwdC#fI)lL9^VxpnQ;a1jhVkkMeEL|5K5~Lz>-bs03e2V83zFPPjvubfFJAt z;G5zz|Cb>UU4n88<9V?N zl#s#HjMlzp#ebxl$9E&iKVbVm^*qG*=NXt|VA%ejmueS~9A*3elMlB2uc1|c3Kn_i zi0QwRXZ!yrwNL(pemmFpe;~*9{~Y0yq?_JNjE!z{AO*8#x+t<}(Px;MOsxhLVo^~c z9j5nz)CNLlli0s*PNfmaf*=Ln|t7qI?fT7U3YzG?j@c%WkeqO{*`zG;11emUQTu2*y3*f3MVgwr*A*+cR4`fM_bN6#<~QS^SOre=komh4Cnt*-enBuE$%WS zW||#2*0h6quCCiIr)ADzs)q#eSaM2%U26oX&R3%9Km_}8g zBkZ44Yrk$-wurHQN+cBRyO2G|!=$$jkZo9$!DQR+xPZDd!kr+NVd_$C!B>KOkikgd_R;72Vm`<8h(b4;)wQ>SUnT|RL04F)2kgG*KV$C_o5IB~^8|K#v z%A6Q{U+_;tEJP&5m#-CqeI(CM#e8q_1@pbu3rgp^#e`vN+dSWmUVtav(^iM%>p=*B zqW>mUf5jZ}riq-zX zil3!z?=gf^Y!e}L@aI!!%GQ-y5h2CR;?ENFR~mBE3sR|{?RMhS5ER0yX>3>B7C&I_ zHE|I_uL$}K6haXf-VF06IyI0c2;6=e3#ci{d^SR?&lgiS%bpua7X=86y-foM%ZQOE z0UVepxXvDqFsC~*(vY3uJM@c7z>}Cs#b*{3w4N(z)`%SzblSuavvW{HJ_67^tHWgj z9CK&1uz*`tjAo6fVNm`wZWR$6q>c>$>3L1{M7sb#*#t;_9 z+^Z@Oxm6-GtU}s99YGfE`~0c{XwlPpw{SKB*51m>fQ5xC*3m<+Bb+S7{tUnlc!V8l z9)1(7)e@q#-`rz$6a&*Sp~of(aC>K9yDIRF%V)8AY<*kcCA2+OOKO_7IsUv#Jea`u zI>y((#+Waw4A`rv`yNROIePR=f&YR!?qF1$olAP#TIED9)vmesNeS`6yFoW)r1m*E zoP<%>F2U%h4Mc1AtUM8BfL@srBS_(%OUDi_Z9LkAoiIMZE09F4p(9|fz@W}i zVPy5wX|xe1T=_sgxaxdoAl5&PbcLJGyv__ZK=KF-ed$B()s=1YWbx5`F#WsigTJvK zp-1{JnkcSCv_H~Xg{fDxrx^Z!UZ|;lM)ViOZ70j4UyMNn7ws9tVbl6ddJNhkbiF8f zF^lxIS%M?401H3k>mJF=GC(vtwQ<_N^ehP;jNcN+x7x9s{i-4)a)=l>|)jn_C^-oak^=`v2iFG2z7(V%DL>?QL@kG}bctzWTefQKqD-6 zXzg~8z2cW_cjV&Ric-RLum`+*WQsG{E4uOj(il=7mcByMX#`qxh>mO$iyfq=2*%nY zBjY}Iq+}V&O<(b#8Qvcm9xkM7@2PjX&PSH#=daky2)EaFeUT9kXY*G)Szq>EecApX ze+A~wCUjLGhRjW0A*%?991!`WulQx_iAbD*xGXp_X`9mXg$RPAP!k_atJcWGcq-)! z209b}sH5v)nI}NkHUZhgs%haJ;nGmLn3!pt$5Uvr-9Y0gHi{E34tw)LYaKS~AL8_pj?ts&WI_)o9L+?wpl-l9e3$X{gVwPwZDp!xOt$*3IvP677 zUX3KK4ncG*NL(>1g!2!5np>{PeOn(+TeyIS>K+PV)&pggenU;*|CMHqtiRow<~tdm zu=_{Yu1XwH2;U>V{~1*0VkESz>IOTZ=H$(lk|hp=O?6onk1^KKF&4>=I&W|l`ljM(zZQYni#CJ@G)e?PBLVZ)wm75$1+&eN1ithj6j-og)lL-M{H~M5fWtC*4#t(x{+To)Rpzf zCkT>d=3LT!Jj+1{`VEIA50WUToEMoeea~`3L(&ELN&wNi`Eu$o??X5-KKx5s*ZPL6 zJE~T;+ZvzvgP3WNzy8m0(|H}_`&OQy<=5b&pEAIP}$!M z%N=}O5+jpun1C^UsvxXskn4?+RHo1{#419>IT)>drL~f*KmBdw*)lT#r!g=;KJ~MR zi2BHWvOWDg{`Z)6)?V4a>P!yX{^oKRSPZ6(nRrenk=p*Y6R1516(HNbGBX~-c7cp-C=&3^}dQ3^LttcTmc z3Al2>SN0+%*qkv5suRQub$*z*Sc4E+CacuCBOxVA+PYd!&LvAQ=&5V2TMSi_#Hd3i z`B7aaa(sgK?`A$W+X>sj@7aXOi}$h=n(0x4DE5j$jhaMtA?>Edrd8+L%LmDm-GDLA z%nEykxPPr3u6~o zqj!ySfnB6bS92k>ojSDQ+gqDzB@04J?pC7g9Q?ImKGTDlDvN^};RlfxBwOzkvF6eB zzK)6dFxFI3^(kCm#7-snkn2EU&X6Dy^!=Lltuplmt+N;oTkMJEN~Uklpc3LF*~9P0 z6A#|EA;_Su&CZ7qq%r0+5iJO%_Q_m`S4eG=n*DZYXX-aRYUubQxfaYj2z)-Odp^UhO)p-jm)N0-C^O@s-ss>1dw z5x@Ki&h96oi7%J3KTu7(2$x7&3VvNX(0YMrJFPp$0e$qn$F9W)CvK@^2^e@YAYf@g zqQ-zbCZ`E7340(z#zBlJ8B%H(LTXpahPx&J?L}hkohT;WxH8OSsoTX*5`U0phg^eO z2jcHsYA=5h_!B_HqCix&Me6njL@w5jU)hbSn%Fjyk+|mDv;GLFZrvei)NQZhF9YJU zH1d?0O^|G4*P9CyGcSnM_N_k7P1cveG>6(sVzhcL$$q22QLXhHd8;naglkC`=cUydQz z66g}MmDgEu@rLMlkqa;sx)X%gJ0i8c)*Vmq2$_~65({ZJO1tP|dSW3AAojBXQUvg$fa^xbqq2C*n{*ryiLo?vZlPb2 z6dDDB_c?lY1*lpUDfC3PUy)EB7M_#S|2OLX@GlZ?uIt;g-jojsZ(7^Xwdxd`V_uyw z6%a!_=2c1phwI9nNnbYum|gyQ!7mA}5so|XoU z;7?CJ5J9{@6t%YYBICTYAtZlp2TkM)ssroDE?xfEW~V`n*~OZT69?($Y>7{?0n{&h zl%w{&DWFxrtay8o3Y;0$F|70=rRb5T2i<1Qs z=8ue>!-f6w|A~7S_`0ep@jq$$NGNav6pTDmTOb95l$WU#$Zc=hbLkBPX_+Dvsz@w1 zpaqf|#d1<_uH@wWuV$1ub;dgR&B)J=kC`Z@1hkUS(xx~1{qe>NY(vEsRG5m=~M! zm#9z7YAn{l$;DGJeUD8Ma>w81Y3Y^Vczx6FS){Tg!99t%_KZRkz$6WdhL@wmlX3730p#9lT29aV?)Y3R-bg)inBz~PaSiV(ir=@?!cfZJ)l-a0kFG48OOpJ(U5#7IbP~q3+$%fWTCtO zDiR=#jNVcb*+fH86v%slx*SlK2cRw|2ih+c$bF0pATu_$7eE-mS>WcyCd1k(s9l+^ z#gqBx;K^+73h5gZ(tj?5w6VaA&C1jl?}7UC#!6(Fus6TvBz6_wd_vf7DEBU(S))WN zN0^G5AO9O1BfUlZl^D)el<}6ctp{Q12x)xl=H7sAN`C8cwhM0r?!ZEY`Gp8ai&#;rq)v@O4_|_FkNtSxv=V7pG3E zj+L~m=V)}x862C!1nLVT;#AXgU;3i1uLVo+0piGQnU*098_kRj2=sJ$;6pAWh5(WM zKq9)!=HxWh4Ra>@R0&(v7pE{UH})2X+%K(DN|^PS%3|9evwOrB&%tpv=&5k1*jyT?#np}256twI(qzxPxo#KRk zu3I6g`~+>&y1g>SSL=q0n?I_NSJ-^NuAyE$x;XDw{>|mkxdC#*YV{vuD#b+OBX$?F zU1ZB{!6a_;G)zTWPGY0!VAy&4&n7Vl(zCE|95z0MVodhrB(l5)#MD;rn|Q7C=4Dau zzlqg`9mtKt^-a$=EE2@L{Jpg*U+dz( zI>m3WIjH^m&Rw3qgV|=oFo4`^_h=Q?Ja01zIe*5OPe_DnZL>!lyajLmfSI1%0u!8W z)d3e}uO5YoKdQICGd15a76X%N0Rf*n2 zVHO^EVG5@753wswgE-eW{VzX%Z3jW+0QfL${1BVno3W5X{#OY*p|V%~RD!=_De}CR#F!lOgVe-h zoqJ^VZsQN0U4-!jJT(lh36$e$pq${OnoxrdC@YFLBfB^HkHqSM;+A7|OA<-kQ{&rW zcQmy>m$h>@PBu}WaK~y91yNfv6!tGE$Dkd$L#nt=x`p-|5T?P|`)1XD(v305y7kNiAbsPiz0k-iG|!zp~s&jYKGx z@c14v+6C+!{Y>%k{4!fM+tZrY+jxD;p^4WIYB?7H5WvEDg@WgDCIT&(z2@9_*`vj1uRVD5?gxYQ9GD>4{ig_j|~B5HT~Gk~Uk z)*mp0fIEH~LKJAPV*YtTY4+^sypo;ay5W_FGYNxC!Vnyrc(X=kmO<5e0@@|MQ|M=j zQeUX9lq}WmRHx~F!ULeO+Gm<-k-3S)3fR37KZukkNZl$v4uvoP#MT6{lo;iiOxP*H zha^4(gE6lZATSZ1#H%ewMa8;=dD5NVEOF64lr(OgUvbburg!6|Q3!^Hzyfx*_24)@ z1jC`^x8P9fB^bdkWllk{)H<<_pbW4Q^(-`P&WMTHi6y#PHR`O+fLl~3N`X;x$l^Qjf z#J@3IXcR-M$4is^GYMV$)N9WF)*#HL+Y%;5xR-=`T^IRg>ed$HBJn=~UWyqW;CP)- zQ@Zae_mt7=N5+(7ntkPn{S20U;d$R=YknDT8mR#IiIw^;1K@xX}Xgs zlgs44OV1Jyw5FHH2!wUyn2q_PE_yfpIBS%OZkwSqDh6Arb)qqiA9A&v@vJOV$gi$2 z;$`zPGkfn(1U&IW_wz})ylfDyX*nOuk$4g+ZES1j#o)c40SkzXD1ztVa+eAAT3L!1kp0)U3>dk2Sftsy#dNKM>!c3H{aNH+w`KA zPh*jok6nniyW(YVJD>q#cCmjXFib0c{6e|KI#=Q@3%w(YaAtPfZIwmMGxICR20MUW zEHwslMtEU{ntO`R&daw5d8>L0^5$l((?}PLX_^YYiO%sXQDDmP#QEGwQH1K);GLcWUlGu3a8{Ic0G1W|JHI>_Bkgp;PBh#G;M8VcbCJGimjI+y$}Nj4*Z05 zRP%EvYnM_kPCJ~fWIJdz>=IHhV?)C89w9Me9v}MB`Sc?;M}y^u+N-$QiG5C;X7?A;Kr!h-K4jW=dI z@rp2{QG|or0}E?IJ}xa!e**zb0j@TPdIkz%llZBine`8Wz{>o*(wh#>nW$yX*I*a$ zvN4|obE@itWSC_n`#z$hvF0O1k~;XzL~Hh?Z!;yTw3-3GAewE70eEXgbd3DpVop2m zyx<0QXV5N$&?!j+8SpkYu2+}5crhN@%gVW~C<n&aZoyk%oAKBi41;2TOh9%b+s4nj9gy=J;UJ_+on(0f%y} zDg4PyP*6>A(Ukl$!aiK5|Cmt~6;I$m)zTqR?}YY29E~#+SU9Yt+ip;ZS@suOsS-qp zA9PLJWooMe0#dgF(lX*CuGH&p-HMnBu&8M=f44c!^mX)vXe~mI`E0m&rIQ0Bb%+!rs#px^MLl){GUk32WPp zop$|yhJL=}$BEbFb};nwy1Q7l692Q#^_~guc`_X8y1%Y+u&(`)=F^(SJ{9(c!+UnT zTDPe<5{ld(PTf(ndj~ZYkFI%r=a0A$8}zoi(EO3m-Aj7cyeW6Jq3*31mN)Vpl?}|L zp*sfaN(aNGueF@iwCz*gmOW3sTDQ446xp3>KUAvo_7p#S{!W+rel8V+=Iq&iZ=@0o}pxPa_@m+xZ>j_whP! zXL!#OG(XtLVPGnjign(z;XS{(=|V&qM7`KXIN(U>gUxg5+6Pdd3^(5pZgc-SMFMWc zy_fbpvGP+e^+E%?n2LxE;AF(gHgIcY+V1`I*HpW+R9-Wv0wi!_EuPAl%*ne7Smvf z1uE*-c1EsM4&3Mei5tP;B9QZO+L;h) z-^`t`CaH@Ko;}d^`oXk82A|M|Z4vLy_`%_8BB8q1YKi(o{PD=^5$};mMwK0*b}?=Px>1EFW^ zHJET~?=X3x{$L}`R=`eCD@>pYnY7m~zKeb>9Xv;R6^~_3(Z_{Pr)N;*UV!<0LD};^ zo?qSA2rfQ7cBf_wtp=nq|0BLzsz^7f`Ti%zoVCvNLv5E9GkV+zcU8hNyUySrt6&t^ zjH(mQo#0&mYWbmn{TXaS9-W&Qxlkh67w^VC1RE;!-=XgND<2G}zEX7Vb(`BC4TmBR zNgP4Kjiy>g9PcQY_C({sfLyiq(756F@!5Sfbocy&QSS`l9mCIMhdS3kT7D?}hgJE^ zl}M+>gJ|EJSwlBX;sBVr5Z|uQ+WV8+YD53JrMCTLHj%M`HG|SPPGC&HxAomONu;p7 zrOX){;@yM)d>(w*h*!T$q;f4I-hzW|cMxO_z!kwDDnzi#@E4Wh|Ndz6#M>rkN|77P zO>Vnwx;M0E2k};|=U~Wr5V;8sEe~2V@ywy9tM)u84^1_R&DF}w}8`=v#C}JnH(ACWewn1>dUep zpD%pLEoV8`;x~85jYOS6$>MCCUpi41$kzGgvODuzAsaMws*>0_RYmD<2>thl$A%iu zzp?n1!wD*8PKhE(hsI^TaQ#ENw++hP77tw$FIn2S=Jn4ITXW58veAXTfe2A+!pYsu zmzyWtP2W9x8)U;-^T>_tU7@?dO=CksY#(|w#rBAI^kk9Cs;4^v5rBejonL*pyc1q| z*`~&OKU16*jfD(2h<0F2l;Tsa_~xG1oNH-8nc&dfk?_I$5c}7Agv)tYtd+bsLU-e~ ze8`Vzoj{mtoMLxqY$V1(PEuar62%JlB+rnNHtSKOb54G^or-VubFM3ud?HwOps)~a zFQ@b204anh&8Kp3-z!Ot^e#zPaGlZhC|l(kV)8!UR8oDG)j=Lc<~|} z(1`G=i_iHT;qt4BlJM4rl^mnX7(WJNxex|KxvVHwnC2g$oqY%{L~h*bq^_yxyuAYq znfqak`5;cltz1vRgt}8j(GWbSS6& zz0#pP`~$qd^3$OZf2JTG%KM!T#bv?f=R*NL(xdk+9f~W8AU2X9ABq_Dyr1b%$bVuI z+1Pw2?{_+sApfSZxW{DkK+~ZN!6)0DWuNI#j(}W=S;*U@LvbI=v*4HJ57Y0&zV)4? zLz$;vBe>aDI+WAp7S1x4vL5)lW9 zQjNG_J80}V(hg1ge8S3P)@ zHJD3*;?^=+#64JCzGVuOpB8*&KVk2|C@17;`SEvhmU&)}|f^b8!H?h5J6{TH6;VuC*MWF}3$#n`+G+J9z($#?%96G|JwN(J*|*xKwM5|L>n`ZK^UF z<8rNmVB`1d47nNt%;0(u5;c>63|Ly>X^hjPhH&VcvxL*tWbV^%;uXS7%mw?HU3dF@z=>M z3o&#Takh{$u}gVf*);T?b=Y0iPiRz!l;f#X?2IMHf$o1Y-nxM;b&r*7soQ=8n&iwE z0v}q9e3Pu9N{V#xR9Js5*LG@>hmN|(I+IZzVbI0Pi_FU&E=^uek@6))k;f+|0POm3B44Gic5swTQxm{fszsUI{1N?%j z&br6K9Sf>4n&M|RPia{Mq6^MMwD(c&5zH-^$L|JyozA-L6l?HltNvkJdoB$l|6ANB zDmStD1p0Y%imuY{zJ(r%D)pkThF}SldTDGl`@KJ*=R5W_G zOpbVqP(_Jc^Hy+oensa01PCsSbrqQHq!u=ys2afjxImBQeV&;P)M`kJ-&zkgKbxeY z&6zX5qJ^}78B+gjLYq}LVia|>P|(0QjhG8Eg34J5pp&|!8jY=6UFL+aDL3V9B$T&! zW#T7>HiY=%7!e#^dvGWEq_Lf{A{Z$|eol7n>Hy=D($4~M+TTxs%wn8c_xWl1KV+fo z=Vg3~dVuctby;R*{yW#w6Vs>3`)@RUNTz1LeT^TUIcEPaOZEyUDXzO~Kq<*b=`P@( zL-||B-#z?Y$KQ7T1Z4!C`Fh7AzbgaJg4Wv6-FpmA<-hco_{TyyGb6Yl7=@0}x%Vh7 zg^p=i_R(Qx{qyXi?6V;1aR$k`{ql(5%bD3nGlEA%i?yYWw2zjJjf74p`Xqzstx%uW+#m z$BpWq$uB?n>l^wXM_?Knk+$X4; z7|h%qbBYqO6+!J`k`N9ag{;-b-#|1vpfq2}d3;BUb7Z3`N4R{JG?-{sGM zNFn6hGrRfW)Bo{%9jnaX=N+|q(W3wRYlQfA@IcYIr)TA@-K90R;y@z+`pe}XJon09 zZN@Gxzs%6DfBNG+=bpX5lyU##3qSrt=Gn6%*+Lp+#cEF>K}4WFUbOL=Jl+f^ehdhW zKIPZp4aLNCz6R|S){(0*&ST`_K2~LD+de3dQAOycB!TeG(fxtheV7nhrv{nNr_zxv1TiK$&M`~HQw72?<%*Q5&E*Q>wf%{WSRfr#h# zqEt5gov!nA3glVfDZ*F8kq_30h!%Sq_&s}Gh2M_ymg`Im3l5hAgy)9QX{e|2$ zszzJajNC)#-e9e!-LK_8HfxgFzL?A!c3%k?CFeg3eR7;{Dbd_8}Eh+syCd{C$?cL7sn!-(&fGgLjYf z_bh)xebmB70zDmas7#~TTE<55wrh+PWP@T3j zshg{udsbTXp)i##|j=sH5G% z$)Kz|Lg8AD#KX7~r(dHw`Pd}tlH>zFnwS<)*L5zKjfVbs{VmBHrN2`$hw3lUjP-X? zq~q3x7^*A8hDbaXRbZW3$vw)@MOF3wq4l^p#Js6Ig`2yWqv@jZ4tG&?q+|YUX19jp zYOMzka#>7Padu*LF#c_|VSknLqsi&1EMs(iH9C<$Dox8$m%zddVTXh5pr#!Y=BjQe zb0%I)6Eao&Tax(@AJrNfA%jh9o|56PxY`}kXBkXqHVd?2&#@IEB!l0w!(Z~-+1t|p zLIa_x94LOs#Zk2WCcl&UP4jy^zjCmU6O_>OpYtdCMHj!{;7?BO|HYqh)!*Vz>4PC3 zCNHwP@5IRB^eh4>R-E_&T8V@sj@O0xXL8)~n&;PI+opzQgs714eo!YfV6h6j6H`1a zwc1)&7B%CId9G20Y;;%9TclH3(8{DlBt;3amJ|FpewY}^F^kMj^_KZHWn1PiJuZDa zJXREtlT(mg$=RA5;zzy+7Cus_Q2X84hD%$BD7Wr2_= z8PGVXTPxy@c%>@+xurb)bzVw{q_Km zlG_F5INV3P8}A4w{#w$ql8;7FsKzIY^{p5PqE!y8&ry|&#o6n8xKsF_Tm!*gCX+SX8b|84yt6-8R996zS{bO`p6;OO9ZeiaVTCw@3$t%?N}@^MW%`t`R#56Jy7B zFUPcxfar>6EaYXnkRk`+XzukQ)7VPoqnR5+BB^R1nGXx3YxNGN&E+tltN3G>w3*|hKj z(}J9NgBB+2qXo7E95l2uF^ZDa3tIUPFdTskpY=RU$#9}-m#i+=G*aQEs(5HVp5I}%p4RzLAHQ%GYdjI5@IblZc<5vD_ z%d?0L_EpK85Ov4UH{4nYx2TrqCsS7T*Yp%98FlZq1zEE7A>N!OV@Tb4Y&>E&C)GYc z)Ua$8pTsP_WP6+5r1(k=`R9h}*_1Qyp2Qxc^~fCyxW z3RbulP0-%{pOmMorU7hL(Q!3#uWMVPosDhlESD%~o=t?H)7kd=M{y~#bBFo!)`jIF zv)Qt68ppZ53YX4lE2yT5$zh+XJ_8JsMZBi8x+-8)uZ2#~89_?L$zX7# z8ds|Fi&Bwl($3KvhM)pGf{m=%DSoQ!i~Eb=g|JQ9cMN~ob;?V6Mr)mf*tB?MC2tB<*7~Csa*_r@-WdC=Y2n*wt-Kum>7v0bdK_ zi;^xk6D9OCykwE>Z_;lF-+;zh|7#=U$bGTtBlurG zNA9l+!BGivJNP_|uQFF0_w#|FDd&aQXQ4D6CPueUh;%2FlpQ3}v3z-ah49Zxp(Ftd z*=PvM#4;`-Ax(oUXPbW>x9e54s5wS_hy7`{5Ncnr0>3OTxl3-nl<+h2wzQv91GL+s zsoS7miqYCnL>l9g(l1EO{IiVKB&84U*$x@4X_>>yG^~+~$CcW&29uj!*uEe)eST_s z)?tQl7wW6Vh@=8LLHco!p?=!l8R{p+Cxx#e64_{Y@DF6D{~ux$G=Jox)Xz?o(UX?m zJyEKXy!6sC#DznIxq8V$SnKC>J~6YIhHFQa;K`;IODPEXhO^IrgyJw5p&vLL;h9u( zo!VGKYXRk=7CERw%s5KA2zHG1qej(RGR#|hLJeL-rjKyAb3`IGMralm8H+ruTZIJCLtUr6vQ9Z}RmwuXXF#e?^+`wRol>iZmtyO_A8KVmSb97;=dC+-DMcZprTS`bGsd675 zF+7ZFXaj*Qwi?XzT;k@j$YEtBqSz~4wyE=y55C<;N*M@<({z6;-m6Y3QY@il?>Ay$ zBu8QIAxEV@P-`2|OB#Tb%oj2#;z;#aMUwcYYy0s?HmsGrN>fDDZ~5Y-^)kESeddA} z=SYd*BqJW%V+RQd8q9^z39V5>3_RX&b%VDfBpvHerW-Cym^%$b>U!{f-oi@Gx>Zi% z)71o{TgW7vUWxeV-)RR9kN{H%Q~Ki*ugS~1fk-9ho#}WVr)t?0@LWTQu{A7MRur!l z(%UKxnq7&7R2;sFh(VYi=yPdA{lA*2gWyry3B5ibC-l_=fu|>wWoVIi)fuCgctm!U zY-iUYJA9x#vynIbxxr=*Cu+=q1U4QjrB-f+!K-zqbx9-fbe0(T=SeVlGeE0<4B!}> zQ`vkt;*0fEQ6Roh%nf+4L$B741A(`M;F1rF5ZM;u#97P8^O9>?*&a+5j1KVyz4{%( zbGuxO2-nqeBa3*L&2Z#e7){((TSU-v+ThgHfF^0!**ZbUV9X;lFhoXS zEUck9eGwvXLd#`9eYw6Mac8ZZQLH#o4-%&ZZ`~}b;L{I1NU+UIrjxuQgx%XSA+h(j z?RigAWdJJUPoKAr1K_AdUqg^H%!)(LA1f&;T6MHWL33dRpQ0u)iOWT2BLD63=tf2; z|FPGuE{>VXgIN^AFq}D8fZ8iD?NVY|?|r5cW3j5})&=T8j4x$P8UHMu7Tr2oc@u(P z6|}=LgZ>14Eu2UjG(x93oVaju%MA7$*qOQ>I06U2VrXWgiD4M$)vt|D&Ya_<>Uxk? zvWH3uSX4MTq1l*VIJ^CeN z651oir72}AGK)1y-WG|!AxJ+&Fi)+CLr+!oJ~Qz}ZJ1yp>TV#KgKYI$fXLiHOv3aN zqpC^lF|DQtGA1w^;@dn-61e43y5|V1`p#3K>_7gk%OMFXw0dq@9sjO2YEfLteG$M~ z0xlR1-MkB;48BDWRc#C!WLjV=m?TjTUXTV{n|59m4w7_7lgguWvw{>tyk(x(-6B9! zG<{OczXqwhWWBt$I+}Q~_-4ZYe{trhZJ-wW7(})!gTYlwH73^zRioY)v0V=&w5$6b z#&$iB(5{Rh>0Mos@+N=h*sjVxzD;OX*AkPx`|$UO?Rp@gUETLEwyS95SFpC!N+I9` zvF2vawy|ATl)J643M<(V-jnFAyWTdqEBwcM7~NHo>n(%3y6-r;YnC1cwu${HL>b|@1t-*c{FU*kwCCT3!z13ansLXl);aeU5BWMpKU}kH0so`L9 z3SjagauDY@%~4n1$*T0fEC)c+7drlzMGoQkUn!LzJ#$VWYVC3k?b8e+;%1leJ2YUb z-9UOrB%=GZU&6fUE$o-vfGtuHLEC*|Y;&-VDJxgV_D~7Un&&%&Hx!vUX*ZFVaVqAd zxk53~a(J8qBnFMMwYIcW3MZDAb9DR9waV$VtgUbQc@LLMB@&QZx|Fp$5D29>+g6h+ zX1IRNo1ylvYeSq|4d;t>^nAl}b3QXdRarXcXo3v82J4_^^(@JPWK;ZJW96l*kC6eBlclMyFIyjr+!jryA#_2C><1o}ipw0D; zzfp(oYZ%XlV#EH5c)!GQy?T*<_FurQYCY>)c{@HLiA`0pIje_T zMkFT~!swXyLzN1siBz2UbG}I*mQWJdxK(g`|23U2#3XeEay7S$?^dEhtqPKRh`eQR*Bm{leYUhQ^qHZ? z(2E0&p_-zh+1naJs~)YN{=zHsLZ3bM%*N1XH#LTu2OC3=4>W=dOB+M(vH>P=mc1wXb@xM$^y$iyr$jmWhtyC%bv536vy)JEW zzic4$@3itHt!yGT&SB&kJrp~_!SZx714O*0cJh0B#O1hr9jP2{kX>SN56SOJJaHJf+AUuFhp|3>2&i4#*{ zaAzA43Ui-xB~LkQm`IO_{yR_X znoilOyeWeOE*qh?awfYC$RZ0EK`h3yDUNwJaooNDMg!K*$gizup5uzzb3xQUG&=a= zoY01|4@*2(9GxXGm2ci1ow2Gk(lPh2NXHjvV{Am&sy$B<7I2z>izIa;<=R=CR!b$* z8>jr{!=8V2m_YUFD4{1UtPMGOn{#AZ?3n}fGkj@(%XPP`yw271)3}b@_}Nc=<`Xx6 z_EXO6m!kcjxcR!zT=(hE-w>TW8olS1>zY6R$xmI^9G(3Vp|sjK)R~jKNGcF4qCLk# z4e7zP)lj-?YoLvf^IOaBQhr=x7MKTXA7%{(H`Ns zf?n63b-_JjfHHa(skeM%jukE5BY_GBw;U3i{iZW`e|dCpYo#;$L8tg79v&7ge%zV; z5YLZ{%_cVZVCCDCci;YlT;)=&;|)231GM-usXU$8sFEf4aQ0}ccDl$`{W53IQ%=)% zS#O6upEY>y;y;-NEp{mL>B@vUsl`%;jj~3}=n9YM#wm8q^ZljZl=q6`ZLCz~Po6Yg z1kx;dqpp&4H5+SDXDIOT2R%&H8NwfEP(oxmJ)@$%+1Nup@c){s2s$qG)=ZeleLu(| z^IKO27U9JvzBDElNtqF5D41SUXLpv zs&Bmj$!{FhQ{+YmSdp+n3m->!Vt$`A86)?nw47Qez!U;vZT%3VkwMi=fj`51CyEh* z6j4faW~T2hHQCqmYWkMS#w3{;CH~!G(OJI?edz^xQv$3?FbSITVCeSW$pcee?)zW!knO3n zcBNR`4AQB>BrIL@D1K0W)|Ptzq=+{nK}S)))q8({&{Z0C74? zM0Qo{j)=Eq`WAoD+1MmR{976#(|6khIz)T*Z>{y`lP6jR5%VwO`^Dr2LeY6e`f0%w z=8nlQ^Cs2`={8W2*H>9$X!6ULo{BT!(}6@2`06y;EK;eywE|ynay|;MP(*tP42Stq zz=)4gUo{Qom&-NJOM^WYYYi|{eY*r3U4Ov{Hq*OUoH~78YFK8GoGd)qVJ=6x9MQ{e zv-H2v5U&=AzHc6T^BgXU{XdG zmM>i`-}%X2nGCcfSU&aZyd($A6TVv~GZpdGJUS1nQorW07`tG2>S~F;-SQLQn76}X zYZNvKY>j%q^;P4Zxgp|j`~gMZeY;emb-MJgu=U(x@skolBf#_SUGh!xPx7d4y#@>W zRh{=I^5;s-(D2|$Da7)DSQ!C*{y=2Tt^Go$!_&8f%U%sn-yE50Ob4*9qJo&`RK>j3 zYSv%NkmIccMV5j%EdyLTF>h%@#9O%(4%utC3eClGuXTmVTH-l3#Jq-;5pQ{`s6U)9 za>Owxl}9Ji|A!Vpdf8=y0OWZDGVs^&2?9Ew_`j_DI&YN4Umiai<6f(s$5eqyp8e`p z-Ln{pL@c->J%uG7zPlL9Fp)XPW5Eurwk_&RFyzx{C4@o^2$tkZ%eRJBV>l@*-$kjD z%Un`|;;GcwK-~_mMkRl)SjVG2T_?lIVy>?xp-iyBVllNlPhmmMFCMOFv}K#wIo` zu?<>oZuyy>*Jxgwu8@~O zNC9P7@A7GKDFcZ4-MjSBpZGU@gzT!vusXbT!n9xqB-;&Kl_F&-DG&E)_HVHzz*{+^ z>axqOI`>NK|BXQmOD=!4rGG}t0NcP_><2A@?K5zPUE2@bBL?sh-McMuv!nMO9yEg& zKN%sdE(u(*(1a2*LFpcLIls@q-h|uWm@f@$SNaU>O~X7H2m7$MP5p1k$D7)r1qxvw z9!z6LivnJW`k=1;OVFtLhkMZg7EI7tvS-MB|zXLJA$wQKSqMTK&wh4J=r(YWOo=V@qaR3sL+(vX{ z2V)qLp78fbK)Oy7(q*|IR~h->EJ0=-Xo8Z2fEbVn(GmjG-BKqNO0~Amcz$JSo1d-g zkSpScs$>QVLzP)t3@o+<%~d9DLGkKqOaX6DfdL02`4XfB2_sPF(s-By@AZ|AcSRMnccrqN zDPiH_hmC`VNud@%#Q1RdNo9OIHF|_I3HTpj1Z8$TO-XOKAg`_itmmo598T`|EBFs6 z+9Lj)BRnnSIQk67A-oX*f3mDcx}9-R`MYQ}*Qns%0ksPAEHk3O6fZQSEki#QQjbC0 z^d07KFk@MVfEG(YS>cw6OH1naePE8kMwj7RTofiZhZsNw$}_(L@QE=gm&_1nYo8GH z7NYa31)THGHugFegMP2TQ4CV5Y%oa4wQp+jk~KoE)!Z-X*6OuR5%oIU`E?yMpcnmK zaxoW@0$q=mipG%D0O#mUsbX>#fu9sc#1eFtQg4tYAvwT`8HTSmYX>tFl|#i{VYasi z2O!~?WOn1nEM>;2rirKnEfCN0XDs$!dm3^4spH`DxKxaLdq8De8DMUg3@omJV6kMf z04EG+r-a&T8FFHE58U4Wn!&Hv!6&O_)6#Q@uCAZRaxwFnT_eKXWLIXg+T7{lbiHIX z=w(-DvR0RaF3@C+q8)2gK%A`NC;foTZvL4kScFCf|CUSt9$74&#_#erP5*@@11`2^ zoE^1|ylJ#+e)=E;iOu;pKWQ*e93d%UsdKHlGkZeP zF?Wi244XSQz`QPQEKVdV1RVmbNLJFdbO*}>A%Qmhw?6I zoYQ}iBMcay_6ku?OJEsnnt}!FEm>>8CNj(4$XfO`A@l5^Qq?JJv9tiSm`EdqTCUIS z&^H#d{?TscsULC$lO3`E1IpSiiN*GH{0|`g&X%B?MK6IlloY(;ssOK2(vkE>L4d7w z{q%w{+P*QCKnR#LLcqEn!bmqr$3brvm01GohUJnOHBSZ*AFL>|W z)|I~HMYBX@tOko*)4_KK!~=jK(uyJ5bEdS{@;m7ZT!9GY$Z)I*l$@weoRJM`rBd>m z4l69YHB}6U)!yTHYlM`?y#J^%PXOB*CH3AnWyofWUnA6o%Pw9n1cBriOKA0pH3g*iYam2!CDVJ?+yc;Ovf3eDi# z5kDye!wc`i|4&;$f1#9um%F(%Y;1TG#{@52&G6TI;j?)zsO*Jnc+l&G=SDi*jTiEH z+eQINQK)@=DcGG#R!A#}%0dl#{BT$g9i-;z)+XX*OU(v4PJgiuFT*_j#e|&xBEg&N zkw^A_HOcaqi-sV(4~6^iBHT+QB4!Vv4Yey1qenGQO^hBFYX2@zGQ^YlE3%J&;aarQ zsf}F%d?RC51PX0fS0o@$yn%wGnPP2kpda~}Eaa4%`X;6Q@CrZLw3n8InuLt8K&8T0 zzSFTzbS21JRWJSIUYe57hF3!EFW`3%_gk|RJ;{HbC-s{n5rP70GT7{IG{m4!iGk}C zRFtPI5$X__TQhNTt3s*v=jcWHBAFE z`sL2WsTrY)zNqgH-JRNOE(f^WVlKh|)R10k7GHQa^)zZ_|5Y;Wr$&Sl!JpCbm}m7_oHy8}&DfX9Pd;}fJDwk=4sR3c zn7K!Vk{6F}{HTJ)k?*gUdCZRN+b*AkI~VBZ7oMIs%vZBav;hWlsbA_O3(El+?ax(| zG~XJ05Sh&qb4USQ178jb_XaqPslq3OQ#bK{K_ta=ovAa=q!$5;Q`Z~Xkla9PF8yJQw$g1c$n6BYc=u>V~ zKR#R713B?@$v{es=Lddb>glAM1iri^t_#K$cssV~(j^h*d1f>^JYhYu1MBb9BZJ#f z*VeXr{e+gVtwQ=-67)Hx-(|m%&kgA7`nS}zAxl8%t8$B-XXQ^F0TuHH4dBe&ne~vJ z{4X*0?El(TX?9Y2}a1Q^hg+ui`bTU}AEI+~x(W2HS;zjRxrzjQRXcbk3Gg`zM$i zH#;Mm_TKT=34k*(bOyCtK%<3-YTvzJNfZtyJ11I!8QSSG9Y2NA%YSX4u%gxANR4w3 zxGMhv$ZkP9*O~sHQ+7WBenmpxOc4mq4%y|D4MhikUmY!bfYiWk9DsVnm7T8~7J)FP z>h{NaNLO+@0Bcqas#4IUWpvcT&nv=@+R}X@Em4|8k0`;zjJdjk3$T zEu@Fks{mswc^YkcxD^u8;dpqhiHC@{xKu7!?Tbsxx#*RP3JXKIu8es%lveR(z1+cY zpuAdK3ZJoLpplEYT(rr>1zhw1D@TzaY3T#BR0 zr%LfLX)aw(bHb9z*DDGhX-GDw}p)n#(HnDd`kEo%*@Ks z%8LF+9r+MIDCNwGqKv*s^gw=JrF^h;L6x8rHlDR)gmfJ5@&-Jc%C;@W{GM@RBT}XF2-FkFE7qG#+75K!(o-_#3-an3oEv_!$ ziiar8Fo4B;F|#hK7s3f zGvJsg^%XH;WTS)we-iu(x4j7qexKMsI+iSk4}b-abo8mcl1+N~vSS>n zr^%NfC+v6Q*j#4nDY#s$lHhWU#Dwpl0WLt15C2PXFWBgyjcWrI*OarxI>r~X>}^4@ zPbe67%{>b!jYF%a&LE2JM4G74j&%%f^q}i)X!ay(~6m4j0Z=aME$AdajT~ zMerd7>4bbB9P5@Lb44?<}Zcm6B?qN{diZ;Q^^+I&j5lZYPek2W6> z>ex|LR79?ZQ1SsTW^c<(_)&4k9g~zkj}2rV(O2K&m7kP4yySn;8VP@;0JTfk*eJ}8 za@%bGKbD7Hw_z^3g)BQ>U$rbCmtSr>k{{(?Z*XuYY_9TnWr!7PDA8!t1!7@4dPMU{ zo&Vn?`MiBw^D(JQhud~u(>8b?_StQ(A9V9mZLb}D^AqVRy4JQ)n&Lct3^!TGJ~xgT zUbkM({{;{`6_(e2p*ZvUE|v>~K?k-Mh&jW_z;tHrkna+&O$#ND1qUUh4rGY_<7O(< zLPQ8*JWh?&F=yi|>(64{bHx0%jjhuO-fKSJ08QsmcW$%P&?>fr-qZ0)%bw>d%resZ zt0;1P4T|j{`kj8j%Xj8stP{3*@>`$cpa;z{IFa4Nt;{ zgQTI*?U$Y_{H&E;8eyxc$-pI{kBVwTcWm(nYumTnTLj5NuS4`B5z495N8?}>b&W-n6d~z^b`$7%Hi3x>ONge&v z0mlxc*2a&g0-^s-(}S&K9*5fQ8hEaTF|MBavv8sm`hSyKrDXlX9_QYzByN1qqR=?Ffq&>TH zSc@7F=in|l6vfm=CWRNpMUDMM2ODM-AA$U3B!ZK}Q6r#A!v18t=5}YtBlhv*#EprD z=A#dNItA-T6dANT3x+{^Edds&uy z*){HE77Q(`3wuLXmH)%9BR=j8)zEqDOuc6TQM*KbZ|py~C=(&eO>H9w&df&}`zI7- z&Thn7EOUBe|HPt9RbxLv??2SoKe;G#Y-9hFqRdf^{iQ{j^2YwMqRc^!{Rb6gCN}m@ zE%KG^4}E{oH8C7)L+K|3v;2()w;@rLmc|LngaLJ4phkzHLdm?A4sl(Nmq1jWh*w%4 zIo=qWt*&tvTPP45>wi4v6O01dBBG*LNRazGa+GBWGaFWI`vhkUcgS_J7i8{jQziE#Wbrgbx30+>JC_1Q%|8;@^W~%{ z^msf({fz>+Kqha({@RU(kc+&^ws*0hYOXf)d2_TtsC~Y?NxV^Vb6eePKm`5wo|+v5 zv`|=f7Imm1hnKvAWz0XBL^><&^9cpdsd8e=#JbMUl|(vm1=0lsnjLi{tp&@ePY^Vq zo0dx58`_0i&{Byh;%ypumh=mP z{Yh_Hwp%Wuhx~ro(&>Ms$lfzn2!A_)a+p29`O7nla7<)-CrSSKpJa{I&)3x)Y+$1RnO3PB{=pN?Zn145*m)z?d1 zy{+IMK^=277X9NGI1= zCM1^Q1(sMY{$R_i=*Q{~_`RO2mCciOluz@^`d1<<0w`nkpaDrIRcOyevV2@6mz?YC z=e!VVe}wD$IeS8h2f`4_rmZkN;`cPS*kOBaze_$UAp;Sz1Y$`IwJZ~ND%)Cj4QrDA z>TIKb2!k$FO8>l#y8Qh^-?10|H_?n`)&GEgbxs9**yLvEm`lJMDEOh3y42Kfu*UAF~x2bt(Da88c5S`JcN8$6x_TbMwj2Uab2mU*l zAg1J4rbof$ncXLk2xq?P_~%zj!`|v4fD**~+d>D1LWv(;2p;+8OB?k~FH|f_%sm70 zBP!WTQZvs`3wZmz#fD920A#i}e}?9fd%KwYk~>1}alVN9b7v|#Z97|T2#}vefVsSm zF~C);V{={!eVtq#%Z5Y$G}u1aygG<~Ad4gFPbA?+OkyJhe5?#BnwU9L04G4B&!^I7 z$8B0RToFypJ;C(L=y#%C0mpVQ~V(Gh<$+wlO+(|6K5 z>%K~6JNX-f+M6;swCw;vy(e-gIv61LHl*5?3JNuO%D8o9}NsQq-`*>027-WQHp)dUd2>nW^{E*cY37tL^`tkxE*s&W-_AH4y zvXX8_o3;@C3183?Pv#CBO_`IT(KmZW)s7Pvdpe7Fm;Bh14(G2s2N*AOB{+VK=zk`)V@h-O*x!FwMr|Ht&xgEAdAS=>lQf@@0B+*0$bria_{X?R1cx*iYuHwFEOHM;)UXy;f29p>YEqS9HwIvc)g<(eMmtkSgAvS(M4xy=VS*TRq3 z3X-J)9&<2JafdRW5H#I;QB(*QZ!D5rinW~y((mKN430LoR zG_lU}<|}VdPHnFGv#tt!U;C)dHDjzfj4Y$lpnSht?bXljA1 z3SqX>Z8JI1!nXuIHgoRsc;Ho}ITO0y9Y zWFwSJ2~aT&G7Z*f6}El9&-B#_fzA96W(deJ@i5^XW*N)b)V$r!4BePJjy}K^Q0bV3d}BIPArmyE7h%p-mv zx9%tWYpj3!xsv=Rf=h(vRg2(SeWtS@!4Ce4a^jfj3N?LW#o2y$gOtOT`*l*O|4c(uWUw_^8{4l{ra$|kcyLafC>>GLAm6scLaU1DK?v@{K-Aj7cy@#L1 zh?n{^zk(X_19N9WALBh5U{T(~gX}}NmuSSFA>onO*76ZrT&^%>L<7s+N^|F! zyH@UuCAXJ!+qm&k?Y1~jMB&_F?mA54o#w9EeEc=;*b=!BgZlE088#v!WQo( zc$?UHeM|XRvO;f^3p4q?skr!A8+jjm=@alnvc|TsJ4k!!g};-wjVVBY^vNORwyYW{ zSxz~zzh%%~Qu6uu$^Vw?y5Uac06UTw@DTOABz`ppsE=`l?cLzcN_=l0;U-%45PR+p zu9*B0`7xG}yUb-zr!tWp$qP+Qdw6VW`ZHJ5g{PT7M_AhXKx-%>9F6H1aE z!#T?dgq|>i=VZ7?mdW~q(=kGbRPwvh4AxTuj+B*5SYf}iNro>FBIVd5DaMUa@gn^U zNqhmHer+Hrf(+_w1^B$M0!w2!W|6?Pc5T*G7SlGJdZ8*9Vu-^MmspM^x0}m0>e1OY znnmvHq+@C+bDlM|OmpKKQ%hlSjA0mtV{)cQ*E}gDg*|ZDvdwr5)8Xwqcb{xq>~jYH z?ey1N6EMkaP>iyHQ3_EEhwj)caUcZ*IV)B*7DM#JX!vVO&n^S-e$w41h^$k}0IgE7 zv8~$+LQwBOjay5xcM2?*PWwp#mN7~7lh5n5SesgCp_>~@x0k}o8xXxcz;ZjuUH}W& zSKNUuyjl3+X!Z*mX@-(QvhhH zd3(Aveqg{~mKtB@C>S&n|zrL4c zZD_x7@$gcD;vAa{MH8KevHwkL{XwH67CuCPIj{do$I+51RQiv;bcv z#fJLzkxpIrkv>D0vyC67*qK7 z9ziwzPHNI0AD)Q+g>e6*#|{E}y-F6pO5_*yWq-=&y3?a9pkM=JaH(~&d%lfvyUYZ+ ze8sdKD|3#-YSXTRG2tA#e0P483FG0g(%&Vk)F3k#+bP@=z2CWs7uFb+-V5Kvd6D%UuHu)e z2v-AB#TQT9YSl%6r?p%f-X!c$ka-I?@QX9317u;Tchg{Rmz;(D6*VqUHq=- zR0o5O@XDC?iB>W?1wq~_=$-))@`+JnWhFxo;u^LL9JP&s?=tdo%FJwZ}46L4hkR{s8Ke zdlqB?{gC?Pss∾MN3(=$|>HGB&zpB$EY|jPnFAQgO(P!{Ajy*ZziRrcA=IF6BujOV_)!0m}sM(#71jx;!9j8H+-E z$}U~bZwJ3C`0e3$C5s^+|Fc4f^q;}OdjCdXrvfo2F$3EOn@BxzZ8^`+5loIB{_(6% zP|jp#D>Y$hx^TCG|5C}r{Ap|ec(YSNmaW+%8Z6wScvr&OvTb}|}=BgYgmDK4XjPs07!e95e&cA3kbPLl`|vK`uxQptsQ zCv>ai;z4BBm43siy{z~4XgSkamroD8w|jT?K>C$8 zAb<BzE$a*5d5Z*iFw$xru05G}agKizz|O|WN{<`fp+o!6E4W#4{Z-k!3*w^r35 zG?NkNk55!z|MGIjUsVAZWSfCM=rHp4?l!$mwJM=lCqGP`JcQUvU*ji9%w|r{fsIDJ ze}?Jh^&E=hCku`T!U&{#q4ql@#)6I8mi9E@f+`yFfVfs0a~JHUJ3V^6Kq%CDE)9hm z;wmjsq~C_^qpQ+K>)NQ<(^y!V^w5$)6jR!O`Y{R#1Sk!_hIU-YO)WDlwgKY;`@%J$ z_)?;2d&Zq1tfodUr9C(5t6ZW@u&9 zi?(u0%=PF>{I8v=sK2s0>fN-02g{?W&)4W@+h6%ky?1?8y?0Y})b9W3Nm8}3Er1Q` z0c;Fvz5E1pE!nGgvMb2C33i2_$+d9T$pKSZ85VYqzd(Okg}uBPHeW)3k~_?050@ic zre9JBoN%J}v3;)kVS6&{cl7l3#4${BE-+ z8ZTm|krB99X*2rn5gm=#8)}?iu_*8CHe2En$Zxlj-)A7deM)|}JDigIZbN>tg%Qta zNb(;mGiY)0BEyeA6SQlowDQ;Kj9`w^$J`u^G5?q%V%*@GJ+6moAVJn2+~ znKxUGp{ORZotf?Q<&y06K)D6lH;7?C6NqZ}$1W(gSfRS`+X&~!iPZO&sM~I*KcmHzP`7UBj$>xcuO`={LFhKuCc)GIudJY7P*)6j_ zdtwT_-Mn?Ot)@S*8f-WVusv(0_OKdAK{7ibWTWSp@rgE57y*5qCVt{$4;tVkhpi zQ{&d(e&*@D=u{5`!KGKFU@NFp#7{cKvjd#E1Dd%_X5v);2iA#d0M*_W)hw2#f2;QI zL=(`*g}QWmQm{L!Dl3Cc)xgMZs-3#0W_6WYsmf>=AK(g6KjaV^GRTe5RSt0__%A>3 zzxn%Zr*5}dW#u0zVygN*SEedIxl=y0y2?CLPei6Gd6OZhgi*5^mH=rUM>QR8tV~!v zJCVVm#_cqq5s9F;O!$Cu<%8E0&IDsfR z^7UY4_9Uv+c7x+6>%nv{?QTF3X=4>%?S$%H$_rE+9Nc35sWJZ+>|=Gg<;+S06Pc|X zq2pCo!nJj2Z;joL_k`iv$OWu>JGb~B!HQYuE_i-;YW9CPt%6adG~f!a`5wD4eY;!E z`0_;32^*fA?uZ2Do(eEl9(MOj8KguCKQRC@Vboyy^oiO5QEb>0TdI&txy$wC1WkO! zS<`;JWu60FN=k|)1R=YG|4K~fbQCTvWruPSpD0I^QoW_FpUC^hfG$s}LeLo)#kqu9 z_!&B=xdd96%qan$w2H@J-?=I5H#F0Ik*~Pk_df7ZRcFF~CJ8VoIuTG~{TC(LP^(R>)ufB}TJnCM=iEDg zLQwm@`}_U!VVFDjo_qd0=Q+=L{vX3@ZV_J7M+1eb3E9H64W)SK?!TjN`k2)$kC6=8 z^y{%jd>MhI_5@kCnn-~zY!v;Y9~SSu1>oc@Fl2>nNMyFqUwFl;L)5=Yj|vsY`(E67 z{{06{tEvN*mlBEW`9Pq!Yknih|6{fiIl2{3m37QkLS0YtQb%QYNi6e;rw*fqH_H>j z%oiX1ew)+UkUWR&u{w2BpCBMh^AP-y*g-u2XjX|at3c(Lhuj13GKKf=Gw-W_g8!LJ zx?h9d^PQ}X*E}KsSOcZ%qrQFSa!4%0T$%|vF-U(3o<0)n7U@fV(tS*DNNd&uUv$bj z!P?JtOqAO2yCe2US>j{p-VV?Uc<)1ec|)Wq zV;aDS!tK8{w=KQ>Rer!YP~+FRGBy4!SE4HKcDw#wA8)b^45#R@N`lrsFF*XCL=S== zlz!bmBwxm3Y1mvMdUWmLk|?-6ddFb2)3wh$ALjW1F7YirWbSO{&b#K4^BfY?h#Gko;PqU{}$SUv1`@CsL+()}wTzo4q9Sm=Z12H?*Tj zko~kE&*=NYf1#GqdbdbTrmVVbdOAr%mpDeLnQrX^Y+RyUH0D-caW=1>yLGxZDEY^u zQl)VvL%v^hi8M}EKoFbS<~55r&UYiWi)gPF{lk(>weX&l62J_Efiey~P1GC7dHEYe;`D2nYkBL{AL5Ppy zTO_y{>RO4Fz@rYH?ziLkn>wak?{f=)wniYFSyLym#m>uY&V^HQ1S?IAF9Zek?2^Ly zT)f^3*&Yg&9#87O}ei z`^gc!0l?|*s^WhkO$BOqG;PYhpqu|ueg5z4vdt*pkA#lyGhIIxImKyTwsWx=W>2B_ zZr5i87y9?qDEC`{yFUinhmr~D|Nj>5{uszV%Vp`Fkev%dTio+Q-u7$uEiu&ow;_z! zKfCF{u{W^41o~>|^cX7P@gu|86w9@z>kza*kJ2OjFcbLacYwdY#l9{3Lw<`bQ}U>~ z2DdB757Wa*=C;{lr|RwAo~~*x@;H4uKTP$fapi&b3@wUDN%4cE5!jT!$+X)e**$7) zJozWvE8&shPT}DKON6@zEZzZZqe!YOO$k?uj|^%R0k%Z3`A{v*!!oyx}7#`vjfON#C(Sz>CX6`$NOHcbqv@qJWl^Etjr4F!ioS{}eCg7Nvuqj0 z$1sPWQFa?;SMZI~gtdk|=MTi4?i7u;n!KJ7XJa?NqM2=f&DVD6C6!5+-~2|{d7u%Y zja)oo$L^MxVl!J|r@NUSywl28$8FO5zaxRMfw-ANY#dRiyN@UQI$(YY*UK;2RCw0Q zukb)>h%e$3l(FWFM;<(-#W+LN>3+^!R&gn3Y!H8abv4&}x#ra@Ul^-XWvFYy&c+~L z46BMS##7B#_MbKizWn!*WV>j|{RLd@UqBRa2sb3Tb2uwGLM*ql&+_y14%oUAokZ>u zP-dbUe7q$Jq6nS|p)Lp);8^aH#gw|ZBOY5Ut#JuktQHTy7WM?%Rbvwi&hi$V*#FhT z1G9CV&{b_STu%k?&0+XV_6#T7Y$^;}0((=Wtw;OZEe;)$0csdSd3|?yiF3{MVhCt= zt`XbS8dG>FejT`Va6>2;72c)^*b_Zw{N3R-#Pj16@&$3}53hA2o1E}nlvYm0=U$HH zlUdz)hDNxf1c!?~)+Q|!lN6(`Fq9$ln5ZfI>)|7I;fE+2^g%X!FEv0MSS`?(piG(* z>?T^xm^M6`;{|$koKX4 z=rf!n|BL>>hMPOiFQ_NxJ{foUn|3|VJFdO zO0R8GH!WkN9H85DM{jKoB-)GZym>bw%b8m}&{ALCeRIP=OWTy()iDm7W_HNpnj@8f-vJ+zh6pm?73>^J$EcI)AHa)^!AL>Zq2yM&8Nx?7VKgo0Y#Y>V%@sb`m&-^oALa7utb5)D+p2xSaG4eMxHU>?9>O`KWw8rZh9`X;qR$AwDppz^uVwr0J&$7-^<@QE^x#edD3|^N9k^NMR;ZB3`v3%pu?ZuS4F28K3ynbn`GF;E{nqMO5Pm=~P{jor@Op&;+> zWJUar6;T>CFXxZrF2_Ebe94=*F2NN{FID=Lsn%KcqTlb5dlKR1EZ!*m_<#p>bbHb& zz!y(rn1Dt4mLV$yizmKlaf*(-?1mw|T~ev#5@~58pg0+A$}tTa1P0-}JT}?6umO*V z(|InWU)hiI@*@GHrk=9O;hD#66O6*~eOLBnFk2sFr9$+rvaWKmR=4x3tULK(7M*al z=UW-^!?5WF?(|o|8_(u*HKb}5%<=5%uyYe`=<8}(FuQnB#g*g(exP(4w_velsfiWn z-SNp!bkvLY%?cS9-bM19ZPs~7$o*r|w6Dt}njQcx7|KdcIpXiTgdysvhZrlLs%9af zQ^NI&@S{F_TsCuQz-HC6<1_+A1GbFL7ik};$4sH$AO@zlq#DD?YWnx1f={E)|=Uk2q7Ye3FhL1(C*Y7_hqk(rIz|)F4f8t0Hr$4p# ziqzXvldT|L;fMzESWr|P*5#k=Z|tEBm(xJ=)+x;om4idqXTK#C4pv|+D9g$=7JZce z*VH#CKkFD6}Oo(9*o4#`9;h*KIW_? z;_K%zahRD~6?1OpsL$mr-<5SyQ4wr?n)uIPY+^rr(n}gdIlrD=MYPKnbs!qF$(Pf@ zyv((lyH~d15bMStaayi%=3dLB2-J%vg+%9v*{XrJK?HHd`w>OpqVShC@OaJN1LN-0 zTKvCSB~2CQdAT>rS=X(#2*8I4Du0RBu&ULBx`a-L-HNa~m-P2H(;v@^(p@sHF6>G+(ECNc!luI92QLWrs@_t5_uc}B9Bg=jx~VGeyo|GHqZ~+|{6frG+?Rbv z#zoz15>mGfTas$->Fn-V;JA?<@)tzzWol}o6B&sZRX94<*Y$>hWl^z}E0II(uVG9%;vFpv=88i!#no*ZDwBhVJ!-%qd0q zVJAK%5i))>?KfpT(V~wd;q=Vf@+3g&686!}2x>#m1d}Xhf-^5TFz3Xw_Vlfjj2Hur zb6(7id%TSE4P}&t5RjO=xG#Fn4q)2rJQ;QRoWc0SH~U`?+EFA<*tJ2(;`J=Qxbt6O z=S>M^mJ^u})3c8uDR(rBvPfIaY%xn-`RM!i=<**sW>#o~zx?Cw`NI6iIc-Llx{#TP zG#9ZO`lQj{MV%jKucf8`E_8^wxA)ThzU)5cR0JYrZdKT+kGZRZn%D}a1Nk4K>5>Hj zX$QO4@mFQ8Z3wi7KF8;!0|#G>WjfI`g{*WxyV5*%sOzfQ!_I1SHgjsoPkCd!>(_~M z*}oM(0NbwU$TP4-yDWDNJmZRedO!Db35=&EQlxiOv0Q-5@AXO4PTRqJ;vMdY6R4Nsh$K>opCa-!v4X^I%Br#UrpL9&uG8B>sEnx0Jjskw3H zcq`K!NdCSzV2XscA_A+}ibUA&UD}9*>m_xX%PAA$q8zOT_ZE-rErOX54w0h}OwBrQ zUXXN0(WZkdr!i1SzLAC<<0K8csk`|gSqtGBCTse?sC#WK#Mi4}#Y|XV|tH5^mK&XQ1eW{)>*P-yoE; z6Un(L>Mlkk>kPJs?igwh{jRS))L2F|x;bdRJ+$ii_K?jXuIIdKzd0-PxihAL@H^T= ziT?K1&`bN;BVE5uTt$h+y^+wPe~JfQjh}NQ<{ZF`LYkeQlV{U%uh|Ex9AL8nb38Xh zQouHcGZBtM-xqd%WE%P0;@(^@75{?Ov;(Ee*$|-Nc;>T}RaUwWU`6at86;fcW_wz8#za8cJ5Sp7AcFa-&qD}LrY&}3baEWevM8)^yttz zJNoyIi#dC&=|j;Gv@1mm-PuJR(%hC~u69}M(uV|@;2U+p+v%Nkg|YZ+zUY=>MC!`2 z#7STRq~bVobp(r7{`@wjU^X;lWsSEycbo6@4!G3a(2(G#%^Rv2axY`c?g(BV-bOr_ zr~k4Fnw+MgWI5`tg3?FfyKp|O2w+8*m0!m047S4(y;GQi>HWEdK{@;4jCT9v>W9`<#ld1`YAJ(csKG>)Uq8^NK=sDhB-Za=BfPoLIrZXP&>L+U4t0GDi5;d^ zbCbmTcr+Am+R3>^l#OO$wSnmJ|E!BIx8JRf2M(rZo>iUq>O7NpDf>$)`ybu?@YPnstMriFqAj~*c8Qe{;RYmQLmg?2<^bFD2 z&S(kVxiYlXo_}sn%QSeyW-=32vGS8sRc-Ympw3N{%dW3;2}Z4nrU$!o-xQ`!4vN9R zlf94)BeZqxGzGRgnLQ{Ba>ogtM%>J&s!f;=@1Zk2r%&NTx9-!1UJO4Cq1;9 zy(T(1K{#Aw0U_tipt=j^8dB?O$`ZB3@8^v)bYziP#b&R!^Y#tz_71D*4=azimOoi% z1<=nNGF-p7Ew2Zq7}wu0B7SNz|gAA+oWQ+z7QXw27rz z6>ECcUd2L1^S1n%>R6^W7;|q6vR{2Pm<%F?nt?9=^O|S{xoA7qz_H>EP2%*p1M3t{ zt*b`nfSIl4a~dP7E&{QKSAH%2s7TXXGAet_VXfaE1eqLr&RyX&@IXxWS$wCg<%4U`dI(x}1eof@o00H) zp_YBIrURk0{WEPSxe*NO7M-vp9>UhM#>B1bSsy=(G%)RvO^A0?n+t@#B&xDllPY>c z8|wKH?rE)E(H(gy?p^}Is!B)oDsoMCG?qY>J6y}Mkol=$S=ZS7@Rpr=hIiD37fHcp zkw>dU8onxXNmI<}kEtq?%x}D4Ii7ck>f!h$N)fSR>(~8tT0{@kqbmdmp9MN+;zF7y?*x1Z}dc7YUyshd_^?9Q;7JQ>~tKMO=ExAin^o3&d(?Y7V2m;JK{}Ca=^Vl26e@153^1>rXIcN$t zF?~Mf<3RazAo&Pw(zU(0xH-iJPR=01(^1DOv^w^ zHHCN9C?f@Qc6D4JLWkftaPrjAA?M zzp;EpgXV51BgI3qKHl`&s&I7q&N?eIv!Y`fGzy)2Yxivx)7{%Vl~ zA!M6P|B?RYx|1%N>)v%yaGu+G5g3O4)amTTGJFv$_97_y?VIL0iHq<&z%V#b>#{}2 z!Jg#CDJzR2K8y$(cWp{{rsUAA4VO|7l~!*w(^?y7_+`WM(Srx0&QB@2O=vL$)5?h6 zc?B(cw9MIyl7MqKcE>UwJuTk!ZYX^Ml`u&x?Ks8H!1APLh9vBzh^;{#0s4da{1{cs zHju82ss>}3O9JtxKdm~$O3y$c;s`Rb@H5Fi|Ge(F^C#srUe)U4bg_{i<-SBA4?x(% z4W80jxCLdd?Fy)RFPh>^JYZN)i+W|89< zMiM8ZXq*?s4+i%Nc2hY~D!8%)SJh+20M|idAar2C0ok}FVwN{zo*XVkl33vljB?9L zqsthdS71PYjB3`SrE6r_yR-3rTv!u*#6LDC+OWfV+&?oX*6?ECyqsu5U-4l%l9)<% zw3u@`+#hfdbedbuyu%41vy0k+H34*PmLqa*ZWjG7TvFzXRovbt=r8Bk%cPehNj8TzRLeSP`c)_`X5_g0VQcvgR_@G7J z%(_*wD;iLv4wfBDd~Xb;6}O_OGd{{mXfS2SwxVkX=!qIVZ)lRg1&gqARl4?*2#$l* zD0p(X>nzx1H7yugbso4m)KR@i!0S9|n~5$_AaG(bWo6L1e|cUNlS4_MC z*8=)_Fy?;Da+iRLqK8~v6&-mtHluSW(GYFgy>dp}Uj7>Ay4-c1k-g@oKYJczjizJH z3NTUx3hf}~+T4JyBCG?R%Z>+1l}TRKQUx-BroZzL79uk`B?UfQ(JY|^L;aYpAsw(i zl9*`<>8W-c-)7o_eF+cD35sk3_kA5k$y;mqv4n&agvJzfRmFsFz0H9=Cza)0-?S!Z z5CY8vD}V%Jgqex%{@2xdmNdet*|<>TCqNxN{k-S`a=5bn#d)I&mgC-njc&5sH>UMT*%m z-T)3pspBzrI4UgIXi9nTl)Y)2cP;zHXqHT=C-hIuPc@K%Bxj#WIpb}Jp7gyv4z=do zGyb&Z=u zOGrvyo|qQtx%QH2aW{4eoNDVORhXtPsgCp{E~$z1+;z!0k)GQwIoEQ|xH#s-E`}(! zUJP_@ytulxJ8^MMYxi9jp9A-G@wu(t*IrCw>4Cc3*C8lXF8f80wj;Ee~whAS1^ z75_hlr2aP=mR#ixj1 zl~)d|I=l2a@qfhy=nW+HJu5ipy`J;FSR;!%K$o?+bnFAr^9@N>~FW|Ar7VjNV*>-m?(hR@m6 zSSTkB%x;@P_x07>Ddww^eQ6KV&uhL+gn2xihzKjyp*_$&x`nc$y@ubt#sW!P2jVXx}_)DN5;% z@=r&d#YGF3^*^-~Iiy%=nXS{Py3WpN2kB8js|$mH--mff@xcX^vGO z{~RsNdp@5~`ds>8`db9;vNHCIl3MK1-Y>*~{OzsNX-NH^LZksKz;z-WovMJiE ziua(nFwf$9Af~wevE{E$jpN0HL~tsnXAWhv8vL_EIfnc9Z%!FH9fR71ZS#8f!;i+2QAXb zUL^aaxlS>m<6*NBch9xQS)rd;p=YBZo6j?_@(q0-X$jQYp{>Ktf}eV8M!Xut{tD;y zmh0dBIH|Ti&XbA5iI3*4pz9NIwNmpqD#=~swv>m4!Xd0)m@PgsH}Jx~@C$FWHXTS# zZEtN_J~{NYzV_A`%cq7zUmFb947NIlpuZ&?$i|-|11;q9zxZt7b0Z&ROCYWvM>Cc_ z5|9jjzvq{$qxR+V)u`!r`!U{F~`Ut*bWs@H6K~WB)nD4$ zeY?;f4{yl*AR2IA+K==hq+&W5N3&%-83v?&K!}Y=(!Awr^_EFZ;Z@X`@{ti$ig;q= zy3t)$nMS(t=*X+0C2+O=nb-_mbUYZfhm_Z^A>N70Br;D8uSP4)`>kI_Ug?nceL zk&`FOSKi^P7>(aRQOZRtqx$if)0BrKni!)#K{Lb@CO0YAP=%mQ;%8qTist?zk)Ob zSAYyLCzxjE7k%*|ja!QE6Y<^0g|Ll;faljLe3sG7g5$%R>CB|@oFkp)+L8E=pR3#>Bx<+JE zqyHgx1AByMkMl$kpw`2^r3Wi%GpgsBsU}iowMNu)nFa4U>`|ge!T{$jIS|FU2CcFG z6MF6e-BvAh?g}I9{U21I@B5QckNhk(LrmP}YHy9BrDhQIi%0e-;1~hI5#9T}Na1#7 zF+APw{2^B@LCo`s7ESbiZ8XWq0NWI4n% zcU*Ww_6Ksie9?|r;LVPTMM^LJfm^top0eTjHREhlPq`(|bLqWjb8B57{o0kO!@E~~ zf*-5O`(GQMe)Yp5cZq_RXC+gfD~ zCB;B_|K9Nv-*%qP9nX)7{=JhXKI{A;bJahl-~LeOzW&UeM3)@b9J+6yIrwa-3x_j% zBz^e8(1vzaRQm9e(1yiafUW2TcUF}k+Y45}n1a{?oL?wb7|h4l;fn2>?hceWoGX3s z_YKcC{RC}w=zl($nRH)f<6E31nCbodkqKqzyqMWo{q6~6;|}cN$8f`e{(UC}hU_DK zxpLn_vv|jC46FaphUX=6=1D~~p|h<-uD5zjcEeLYEU$Z#r=eN>SbqEHS_;}&R4F{b8L z&yPjdm{&1Iw2I^~0e#MH|1s8`2KJ;s07bj8h#L9}*5`>o7z`@^Z(v{-cXbpDiYxwq z3kJ3TVKfXxpo4(E!(HUgxROi_ygr2Op!p_PjF8f`#b%zT_S`K!w`dG0yi< zve~)sKyR_GieSVCWE&MH3f$iO*K6W(0ylb~S{T?j2XFZ#wvdi? z_i@l)53m60FMuC9m~ND~%E@|>o~8pG<7|H-I6-$T`yn7KRBe3xAaPY$PMp7O-H1461^7TT`}+wgoI$;a?^ z&Fd}J?{9=Zi90y|M>Z17pjP9~O+w~G_ldc&DN>cdXJ%$)trwI@tm5m${|M{#;O2Kk z*Rva69$g#+C@sZ0RZ}MRD!fBkOv{_OVew;m+d#`AWCCJ}H4U1Pc!uCFhim>dyaqv_M6r2 zsprz28?n}4B6=W{mh&L6nq@`EBmQkcHwJyC;IS&APqZRYkZJ04I4JSxA9>nJzjDCJ z+;vjbNLvjD_hJ_vAG&uk%1XeiNnboonZ%VbOMOh+u+WZfrfwHAwuhVhWaXz! zZ<0tC4o#H&cith2#M8ta@yMp!<_BbU(wjE%g(#R3C=+fe%~`;SSrKsQ#G3(&KcG(W zo8L&U4VEWA0@2zeCOph_RsMm2LY!HHnz&2{n*9yu|4^wq>K$W(57Dfo%v5K?{5-2a z6Y9my_~YXqB(qJ#oO})Hmv%ONs3Lg=wI4OZ?6c)1^3(C9K}L^>lMhvK2>S}hRZ7u(BD`VqOFW^Ne2CVs)PLd{ z_QsCdB`QiD_HbOzL!Qa~sErj8&)4dB(~*@Y%u3Dt_!FUf|BmtI2m!oL#%*RtU-n#) zWTN4_{@~F~Q=?e#Ucz&}eC0>|SG+AIP{>-KI8yX#?!q3sB`~u#dFkkPjJ4I2C%xv; zO=YJs%G8Y7PITscMmRVD}%3$@j{1xY-QJDKamwW-dR$`YTon!=5%Zi+2GP#>!xX@44zp~O5qh6vSJRVT#C z*{jt=-7A#jI8Tzw$&NdFOy%%H=ejEnF%yDvlGa2o;NC40)~v+@@!2=A)~UMFijH7 z;VD3KpOPMq)l_~d`%SF?WYU56YD!x|1tS}EUg#kH3}GF-FnU$aw$w#z%KEISiEi`w zr)tBYdPKw^iZBT#ps&~-9y-31ja|QATttjNS%cYYh`(rr@vDnA4JI!l`AD7Y%Pg72 z!Z=(Y(aY>9Roy6n*YA{<^ZlmVSd8bGq6gxkAKX!wB1lk$YW;SV(z-7 zsVmBo+uV`jfy;dcMU;R{WxDjmW5vIt3t9Z&v z?>&J2C4s|r=60wO$st~eX0EOekF;47HB7l=x6sw0JK?|RuiJ^__)V0E!qq3>gN>{C z`1p)F>JpdxTR3=BBX|TiSO+>RV{%tu4_sqq?hHhoRckB<+nzW_5fN`YH&?@$)IdTr ztC003Ko95(llBVKDei}rbcmx9%X z2w=hkB5<|-* zvjH16Kz0%v3r7NPis!D%O#Lkbq`gDU;O zM8E|X)XwCrZSJtbORjP*nZcZ5-_5%l34XBdHj+nN0PXK)7Unq3F9T{!k*)gIvg840 zb|)94@p2bH!Xw?5gZ?wQaWp#E#nQhHSIsgmAHX*aK zS)XOklkL#Y!(m*NC8gy8&XqAQ=LsF_FX}uMo&MaNwL)q`;;a=+%{=u9yD~SK+*8EG zoPu}I%1~-%=m}dlG_4^?U>LfFLow%Rod=yUukN)=^&A^3XGHUJ_%(FPvxeflD)yb`V0;$Ts61=c8{()FiUpRDMU+ac}#5BvTe3Fflcw6YLNT{F(9&LrnZMD#`dlW_i zcGR$nHOAg|>mWQIeL->eHA<)dmGMQ6ZF;~!QIwAFJ6;HzH(GSG<0nHqb+;n_58<(# zubJKx$c;m1{=@R_`5LB8oh+lwX6 zuR7C`yS9$WwGQt3yl+=w{Pi8d8#=0th95j^HbvL(*mTt7=4%sQVgTn?3dZ^|%I?}m zel&~y)%TE*w?tWk?=`jGp z(yVp6%`17?{LS3=Fb;Jz7c`7S7qR|y`Hq~LT0?ZTI3R-ZRXupPo>PYM9aTUym^%r> z242?vx|E~<$F2skAp~+i8Ku9xu26fidKT^hZ&N(|sPF1vx=DA?&r}g{xwAf38FN2_ zI|C|Mm;E}=MI;C}m;)3dLwti0Vz)H{E(mm9Sb|FA9QES~b)!^ERjb5Tm+r%c}p?OB7eNWeF&~ zI3#0!Z+dby*m`{~HER5xU#}vk#DTl>YDl(w0CIXrsV-ZP)%4X`Fwf7_O-F_=VOtYrryJ#NVY%Ft0@13Bn*6jodctm zSjN`BLu`84>f4d0+LViBEBb|^)WC)_gqp z6bzWbaQ8wisN?hWMABP|_wQhpC^$X-i*;ILIF=GnRNVeW|0R~hA|04#N6ce)n?;nq z8;ZFTOZd zZ1{uNCdK~4IT{PY*Uj(ngBIF6khX>Aclh8f-1}4qD!g$|EU7HZ-!rQp;L<=58>5)% zP6%x^txF-uBxZUu*Fv1FrsEyV6s$Z z!WMHa%lBz3^zh*;AuSyh93pN#?V02&1Rs4j8a7C9{}TeSjt_}VcPVp$s)~pFB7b)7s{FkZ&8@N=sVlU+ z_3)|wE!?}kTW9#U@S^Z;o$TFWIyPqL+>iMDBcC7g`5K>Hd^qOF@3by1uhTY*D>G)V zt%uL`TUwlNiIY6_Pka6Hjg@7ER0&1Bp6r(@^xE%YuF&g~q?F7*-TpUvCq0+X0G~~K z#1m>i9|3iNIOG#dNT8drYKc=t6LC8FuBx)cRM8pewB;t|FAJ(DoMWfJTHzc!32snG zlC3nYK%6A}Nc_iI=~sRpA)6Nyfdm%oFmmS=|6l_tJUPDT$KoBKv&&v&0D?F2k!ksr z_kDnG85sNjl|C&rqUihIfY+7qFl7l1igKF$Q5<6no>_f5++gwqT;5ovD~&#&m=Om4 zd9nf>^(l)YmZxGOybZGGuLaNQrTn&Z)p;Ar@ivrWq+`+|C`UhY5?VbClKO20p=Ngy zGJzqO;JPAq3lFGZ&R&He5!B8TT1J@yJ7zA~k-RNstSa)nU3y1d?gGpGG^A|zz8e8< z@gRl9n&!Px?0_jS!hmfsYvcdmmEzAHet(_MSNSBpk09n+@7_b+xBrd@M5uoR+T3Vm zzMPWbdlWD|$YvDT7nKKbq}~D{w2yMlfr6D#E+H>sAX3!xXQ9orJwm}VCxlA?o%Yl7 zq@Iv21hzNw|2FY#$L}pSrMDs%>b*F3d~aorU3QKg>}hUPOx?$bhP;m~yXW}`mj02C zj82;_>#M9-yaSIe*khQ(p6jaeHqfYS!`zZQ9YXiZyHR5L`>c@x&n_^h27jD`c3!?_ znthcXQw|6e2Rn|t!Hl`Y!f#|Z=~bQ$fO)cLMLmK>(BKm&v1KDCk>(e_sW1Q291NGT zUkP+;!1@mYsWnw)p{`BrP%Pp}ysqw!q5&{_Y8bs+Vzmam8C8!9zw6Gg!7*~%ThfrH zQq6qRv@33-+V}9lhT0VHufXy)M3=;Rlbo~_*F%!GZ?=Z{6%wgyTG}@0(!_D2Y39Un9bC9<9(F-sledu>AXG<0D zk~p`TuL4|zWz_vQ(j%cGmxfa#xtUz2)KV z)>?SG*4pZh;368@=4bZ;96J8Y_dKZh>h!eU4pPDP>){jcGtfe*h2>EJ2Y@Ds-HKDhsWRk&dR_-+75<4n=*R)XA%S@0YCYcyc*;jmw_*78>VC$2Kk2&9yjt^+R z$9H#?zcVt@KBz|m2Czygs)+`jG75;4-XR@drVk|4^rJYqJ{RhGRj|PA8se_#O_L|K zuW!2OqU3}I@<88|`vh1m+ATZqEbN^`o(fQuU$%IEeqLo_m-Oqe|~ z5|Ctq_sgJjL@I8P^Q-wCl&_51;&q&yfPu`zg9Ci6e_Jw4Ca<7(`p|N{X)z0qpE7Aw z*2b5Xh#7R0-GOeGW&aBEl|a)L@MN|~H}yeU!5K(=AJ7Rvk#H{$%pO;US9QblbeLOZ zq5Ge-E-#attxu;&YyBn0I&95|Y)Zo1bZ+u`}zj} zI*Bp_q-)FIohKpFfit{9RIfKE%8EfQdl~;VJe8HO`DmtdqLKa>Y%O0rj9fMI zEEeOCXhyOvYE$r8+T z)-X)djrBWaHyABzq5Y7(h=t!g80hG3zeQ$mir_Y0LWM$DCkr5C}HEt zlQ5lz*^IRbGARaGkXxjbp+(MasK@%9QlBSH%MR6?I-<%h)3Vj{Z1Oa@EmAAQ!NvwG z2#EvKS2;kyJG8+#;AK`X@?r|jm^^mhLt#*DpXE$Qv4LF|>{(>AvKr^(`{$`(e3^;I zA1n-9D{FWPtI${bGj?lqT!EKJANt+usZM`-uds|6t4bpKL#6p4tZfGXviylc3hmq; zJO~d>7R^Nkz1dF^AePXHr0-JBl{ctohXMe0= z4-WkuQ$-#f>OC16^NV6>lr&c8CuD|2aiMH{@6=otCNtRZ6pBpg`-#cvB;teVJTj69 z!DL=dULjv)5p$Ad$~nDf=el~Q<<|GsWWPwy8~U;+Qg()XRc9}eub`$$>m8RpUw(Z! zd$xR?kQG*>cYM}9NxrMH$MJ=@^f8G0Z0{r2#h+RHmQV4$(buba{_LnS@>|~fCq563 zdiF8#|B*`i`1mib<+_T`U3}tvZs&77pFi>WXFjic-*WwQ(Y5@3h0lw8q`dr=j|^4D z_p0|>0Pzd1EBLnkLh>#7>mTPMaC?$($uIW?-{0rsmlJpku>Id34SQJHV?TOj7YGuHP%@O(6vUJZFnJ+6!j zyq>-7G;h_bd1ONNAdkuJqBdCeL3gVdap32XDjwV;n|7Z3seF+C$(aH;kq9-sUrwTo zyN`GCVl+L%(Z-RXO?j)8I#iM+$HQp&^!Gh@n&!oaQ5z1 zRiTIaNOlwY((}UgI#&Uw!do)@L@obUgu2qyYZaiK?mJG*cQ(Rk_HJH{KAN8hPLNRU z$OvE`^#riY7CEQSPkh(0h`s54+55yMEV;qL19!`$;>RK?=?}+9N*9y!Xh?veMM(OU zJ+q`CM5(CV|C>rYvo4rf9_o@DJs2FZ>u=pAoh_YkI1WfQqS?fr`D7#78S1)?@~Oi# zxOj-Oj|FV*O=}{dhrX4Px6udy3Q521ai;~TCL?##pQ$NpZ?&Dz)D?yvCB;w<_2D58 zhz!x-oPoPM{;ieC$gEgRfy5<#7c*Pr*7ij@0O0~W9FZ50AK6hJlX`UWqM3VTbfJd= z?de0$+S>cHB+E?qUEJ;j1Q>-5&8$cUeZbAJgMGc0LugvD_=^&(1rnP)wb zM{zMZlGW+SY{@D_yW~LPj$4iWtGf+$)ANYQzQluY>hV3iS(fMo-G{kg?exjljJtR7 z73%t}{BR%dll_+^G{jHSMHvUSq@ppf@m1hXEbo4) zK9-X#tM5_ZBj~kke^Y%u?i}b5r!X=~nIw1aT&!$f?m6*J$jpKIC8%_knkJ$QL(x5mVtH_8v+ic;=uvvxQC0Es>pSEv&5r{qNeMEaE9}dzT`A+_0 z7k>Od-c9-TuL}iDx#9eaN5AKnm3Q|Pl@pK@xd*t9bj#4)e-qm5(SJAnfZP+BY`KqY z;u?}{WggiqMfgCA)S19syN~qAE%)DsS=%PEh3-GTkb&N7QAv4jcvfz=WsNFHIbd(?8f~+{_7;A6$~e?GVn{BQcGQAY zNPFdjg#0Uh3W*PzIl@;odj>lrJQ#J}UsjjCW9xWH&s(0%Tlyu{nWvsDhz8;v|;-t8Y4#XR?V&iMzB}S9a_*|F5)IDj zvCL8$Yb5(z(2HRth3o-wo7#hbw%Kyd)&YjoSD@yA92wcsic}Zlbv~8Jt*qqmCzv%aZvUg<;+vM0!Uvcih#AMi?@%? z4x*42kxUG{BA08%>htg;Bi#e8!*V)df@}@1jj+$Np&ZecDOi>JSza^d5Vx^srGiPB7s93iFU884_+}aGJPa z^ogE0Of$&~sYIvAuIi{@@&+rUfvn4a{;bP!hy?Dk`{!1pcM(ut$9_{|fX56+sjU}& z5QDIu_2_H6WUVDu%aZ7c?Bdy`sB=ZQn~-FmJozoKKzj}S!GmpHqp(J}=hIjEY1~u6 zm*zZ5mu|sCY5B$tvn6|xgQ5%UiSM#9;%I)f4aB#pc^miw_-`W2VBt#DBBGmW6Ln){@cUP{t5oV%3ZkJFO*@v3$x z=;@|R_a**D`+uzQDC)l#q6?L9UL28h*Rncgc`4TF!q#zsh+-*3F{7pe(uM%t=|^y4 z>VLzoG+o3mOO|;PsdJ#GD`8@nkdf`>#5wAN)cVL(&8VwM< z0pB9~a3M~9)OPWbCr@%t15QtWE>HfIT61oW+Zk?TR^cC_AsfDHtcZXr6&^1V;nZm6 zrn(&ZN)yr`n3+4TgfI)@kQ#@sqxQw0HR{As=jySP@VB!W&eb)bD~J^z!i`r>RA!cL zsw4lxpDU6lGqJ2ql{fJ}`6=?|;#`G9R~Vw^lY2t!>f%m&J$xjjmmn)DRNq@1EJX4v zq5R4V__W+VVih+bg6eJ=%I|o#TZ?@7Zbk9}Z;i1x4q84@2jc8ahH4h+*~IHemvKJd zp`KluKQsWs(E{~GSQB#V=PxwNMWOu4SlLW@_&*HbN(x0mX`DVA&B!xr zE&sx>g}OtWMll>1NENYLfpAPdurT-avI6te&t1t7-U@9HVvGNeX?!7)PtE_q*;5z= zM!aF)l0SPYv*wWA%l(&l21{gg_2_e_^eh>f0W7^2c%q{Y?{qV~sb+Zj!>7!aJo+>$ ze~8L6R7al>D>r{BAtmR;-EXzAnZ=u~NPvuH>H6Ps=hfUV0DQeI_$51VqrU^6YB~T8 zgEK`)@Bb*p5!u|OwX+FfuVd#KKUP~ua{no99n}<5X@Bs!RGd^7@yn@gG-iHq+z@AO z>GH$jhXTEJAbj`i=3e=~hBQf!-$rt69$wr zb*7BsFJ*!(g%d+vq9z2SW~){Wu`GD)zv6{(prM;+-4^&Aku1x7{MZw#gQ&Rf{ zl57>Y*-nBc*fnOiMqJFx`|_#|3r_qpzcraz-f(9eO)#x(=X&eTYML;Lk%2Zl?{E%n zZ{Y4Zi{!sXuncCM85F>$?VAOK?w*^+pw_!rwsByrmT9JpMZ`t3ispiY4SjdFwB@1d zQ)wd;`PksLH2c_My)SmyrRY(jIT7yDs7xwD_dLlEQJaV|%k$F2sVN@}fwYpnPadf@ z0MUE5L7~iAqX3W%ESI4C8vnj01lXBJw(*{KR}~BX^-$4$Y1Z6#9}!I$%7;DjRZu=q zchGxt?Fw_Ten+>I8MPpGz$+A%2>TCamnIhMPClRF^H+T4^7%`#z?%&51WQaY9VlwY z@2jDniWQ1nwplLkfnE7};U7)4?pjCy;U0<;5+UXuQ4=Ck!t3J-?cO7h;S#q0o)njs`(>$J^86O-oW88j9DQb` zzpUVlN*>^EKcN1vg^tc$24!3Uleq?}w+8C28*vTFr`Ia4&eS#vxtBw#g}+4gw1S3V zB#Tr}gQ%VksOo7OHW(eI9CwAH+M^CQz|%v<;3ZwK(TTl`IHg5JdN1~j-kJ@<+Y)tP(mxf5OO#PEyS7R5 z4sSNX8Ras^s+ageD1UUVeZV>g9+`A~bg>U^wif|vSALMJky%J~yHpV&{WtplbZ1{6 zaVbiOp&oRUc=L3lS@7}Lhb>Z=(LdyVK)3U}F1q;0P!Adt&RF>%Is^viBkKD72G@YE zXnwH$iPi^=kK2Z_>3KOpWFB&Le`v!F01s?{e{T0c#pLWy_$`UnQ;m~DUC;BQwddS$ z>fOnq4L{?Dgzk3C5$8nN9^U-MKsoZqpu*OZ8$ZqHYV?LI!+0Jf05=Ii{j-pSn+m{C%6 zK99Vm8XMJkDE;+RARPr2&R+=r)Rj{TD(&HwG_mTFo92$#FQi%RofTkBK~Sn{luxhh_AUy z^aN|}V3_LpXe|nllN64fU$Mn-JG*MK)Iify#K)&|?YgHIHcYW1jrXRqS~F8?4w6|YZa zcNGmt6=b7iRr@~_F~;hTY}gkmLK4b`m`t+5IaA>R_F;0fP>lQQ7(jBMg|fSb1@TqV zqPgKs z9YeLu%bxz&L>Z_IRT4~fsp#(~8ac}voE`kLnCnDWH!!<8Ak1k;6&W3kN>hasuA3QTu;1bk948ajh8qw(l8S zQ#K;ihyJBMl>QX5T*F8>^bqOq)aBf|fOO(=%;n3J!7zT1lrRJZ=~Ri_6dkl@SD(%J zvK>;%dynj>zSFHA^RD+AX~K$1Xs4ekJS}=e|5lqpO_BU7?N0K$eifBRRU!Fwj)F^w zD)4S=$`WNkze5il7(L!7kQj5k-f%TNy(B=f$p{J$RV`ATDE@Ms5g*@R?v1Qr7mf8gcTkrptl9xIk}x>q(bRY^iL^owk#|sV_B#x)ok*3g&#B8A z$v=%im3M%{Y-W2-^(2<@>)2RS$A(YHt8V=70OF?HXZas+CYc)&T{#N@=heaXFo>KL z-(ENVj6*!KyMXjLSbyE*za!*4itzUUDF`-(ovY8_ovBf0-6Y2Y%UTt&Wh{(vZ+TC=r#t?`&_nU=c1Ko4+>JZ$M*H{I;Q5l>KpA<1a<+L({5->3 zSURS>d0XD(FlBkKZ{Z38E~V}kSbjY`8CZV*Uy7F_R(H zO8Tbl{`lY(LS2jKNjSt9e$6nl4i(UwZnl%cYxre|+4(xM0qqTS&8A19BFszU?uiln zz9Me>BrYGco*eF3b!x+i?aXNHZmA4C)Y;qatR2_f)A_^Z?zQ-D&JDIY zYssl{^Hf}VTf3K^(eBJYv$=ca*;$E%eJ|LA8HB>-kj#o4wHl&JAyT!(Q{q!Fs9Q77 zn6geA3gY3Srp*pY){Tb?5Fn6H&R=bHZu#r>R_FGO;r`!NaoERw;6}=ccgM^=pS_PI z9@-jzqWLHB7IC3XZn%GsAk~i}6Z_eJS{UeD z20DK#N2W7C2D{q1A?k$f-`+r?Srno+7IXdx~>;mpH_u13vu9-rke~Y?o>04z>X9AC-5XZxZ zx*p-8WTGd8IW-GZj<~l@ij$m65#)JFLGM!>j~VU%U3D-1!wTT6#GCk?$UXd9YI18i zwCjofSBNu6J~r`12DIJkf3*(C2BQ=IXn-3BxI1NLTb;c^V_Kcpqy4|F5iby(T5y;d za+aSlSfNZu5wBsBbLMDFLC;;4`&h@wA_no-5T)-z#5VTCzuz6duhlu+|2ilW@6KLF z^nttJ8(`RGFzh=r$q{EL+`lgvaekcr8|GN35GQoH9p{G^dp?)h1p=EqZrVO_#&|pI z^vTo!@Ma8wNwzwqv1bvi0-4>%6Ten3k>hwhq4#&F&6F0^(&4K8|L$WP~y=~F< zBWV47alQCV=+>CGWDib=IWuxox62c@YO^<{wKaM$) zj#=4nj`<)fVeKEdW32z|m1EY^F*O?*`$28?qhmifF*`*cj2`5BjL|!PH~Xk``lwmV z%{uyC_6?cBql$K%oc)_I>*)AMcAY%P2vaO-*<}X$pH#rxrE`CbQ*zWpGJBfVFX~Bb zD1QNl?$r*D{hs|^sQsN$$ohUL_Jy$_b6!?5iH(gCLjPfgM`L~c*flj|g&7zF_!nl+ z9Q(mZ*~(+KElt};x4lK~A3eWkW+f@~7!T^Q|11wa_)^R*?3sg@vEV>=xwrn0OwG97$G>GWyJruqIppI=g568Qg- z@9o@YL$gtRd668x*rDeF$HcO67Qxd-kxIrtl2}Fd#8^Q`W1;aNW^2gvlA?4q+XDPa zwa40%%SE=2{4>c!W{Y8Ve@)MXBYn)s2s4t2?|UzL@58vpNQNc7S91&*4oS!93>aOU z3`%!NgtW&cK2P8GwlX+Un?ol!=|DC!P)LQfza+bjGr1DVLZ$&iK!av)mb{hydn!{i z$CoE(OY<^5=TPXOy9OrqzXmDP{Yksg-rr{j+b=&7xU<^Y#&#lqDWk(SF7)Um^@KAo zEr4$MR98oA254DjV1e;j!d@5bNv|P_W*kS1=4NtUw}pFvTCBzT`U@=@buCKN;Eve`;#v+*YsZUE*o2IUVySkSTf~^?D_Y5mu=%eWO%FbObIC9d#=X*2?Km~5QECFB+G+6TFmI&*du zlP+9U*00Xzklr-!bgYmB$mTsV<6=U=*#P@zNd<}n1(#aw6%&dhT_HuDwY?~!?rC0E zPg+0eTLWnv5Iz~P_AB@M;vc^*{=s<(%)eibQ$G6q!Q>t*F4tT9<6nw@e69G0{r09N5Op|YgeC)c0iqh$wD|60YQF=K) zPaXul(kg4@w&%332#^3zW%GWB(kRy?ztRQy+>2ZpTCc_v_hS08_CR_f^le(=y|H$5G zhHQ+P1^c2-Iqwl@ai##xGGDR0{&n0nClry=8wi0|L;xeG5S}0YRLA)F;e}?w<0q5- zUsMoH_p@~3`(h4Txf&F5A3OSK{FziQ99ic>Q$-CHt*64e zF6`RS|56S_a7(m4V`d^84@A8UM-!YXu!=k7A*YF5RD^+ZA@^Q-~xC@m6)l zHhcHP8#=}b!Wlhuey%jhVhcp6xtNE^PrWwp_18VsbQxAs35Jh(q2a#SVbC@5I8BoX@(BORX)mBI23)Qv`mzU;cfzfGKhGD>3n zQH{YXa}dKHJpE((M|*O+;r#mi*@1n|$NnFM2FF4;K~mQ1LrhlZk#@&$ zmxAV=|F1uq0yM0nH>DyuA-{mh`WT&l=uYx!KTAICz+uZ7jyX?yIxC$`VVt}}^JE|e zc0lpo_6**Q;;87n8*?8Qtu+}-D(^gwUqj{tYGz_o`rcyL24|WMukKSdUeXgl0V%cK#zW z{Xe++MWkt0IP^FD$(jfZ^0b(Xlf~q)1aW*g-t=5J^pE|?@l8XkC**>W4NoQ5B}lH$ zIp?U)WcP3;EZ#w})%$W;nF6!W>*3*vzZmd^1cQ10%GRyIH(@YxPsFg??o9$+C%$j} zHt|L%7ue%oym6Qxq%nLRRXEw%pG%%^jgwoNYZzU#gnUBF@{)zRyFwK3|5JixWs>_4 z0Q=968zb|f#oo4(P65OzOZj8!L>e2rbpj-K^TAMCf_Tc7=9N!GQ zVwqd((8Pak8JYiM)3a97(<|rr7WQaGVXe)a zKkfHY=#SO^`uON$ePAqqcKn<_g*oy#9{97I#$j@SdXknW<;pP8sheSzG^9t2nNz4* zyH_qd8rOBF6XtQ5pdMOlP@nw&>#D~ z%@g{NN$_k&d_^H6$%w850QXjg-UawE|y8XNy&5^w|{rL zc6ZgSyRh4J7p;Fyn*xP|mL{M;MOMHEbXB0^1t}nH%A@!H{r%3&eI+f0ziU37-g{@x zoX79{&hLGGM{Drct>w8`N*ZZjM@A01O>3g2O*?Yb;aa)HIgwI)TbJ%;PMZY#SZre< zDsuMpH&TedE`rBpBv2y*GjB`yoajH&gS6i_UB=+wF+)Cr+ohx~gxyRT2ShArOy8F+~c~~Q{juS6Spd@&_`ImV&NnnK(qs?nD zjoD>oXdhU|FPq^MZ6w|n9_v7KJ(vua`F9tK8(>A#rfuPSCF3Qw7^0(Pe#_-A-8ia+ zU%9OuYdYRthAvn~@Jq6rnYk?bfCRNMy=2`tPQscR!ES-p}h63s75=uYiVqQWAo2C zjek^=V0nCXQ6MI#^E!%)_g4XyTgBY3 z=SZpW6O?dTp0;ki6GI~TvSbAG{A*GrVKUI8R4;)|a-56=0@%hg?6?MAB()N-@wn%U zEI`{2zQhMz6qkbIeQmkcl3LCk&wTCW>ngsIu}*pwPs28y1zKFhnkFYg?*1mgH$VwJ zEGIi42L*pmHhlp-Zo4%{Wt$xT9^D3(8=4;H%OY9rS?DW^LYZ*nw_!#vWir84lp*G6 zTPBhP&Z_NvFFbif5}`rbaAZG8YsqcnCf7kHMJ-)l7s^?u@Bp1QCs-lpONfZ)`~<2SaF4C7n>7k8)dG7K8YS64{RLaz#At3NOd;5P9mTmj(dypFw@{*kGTuYL zz1hTykUO@!Ugnfc=A;`e?*#|NNget`52~djT0jm;YU{nmjx~6qc1Ysuruwb!8XECa zKN{T8keoEcUbiOJ$J+EHv7<|%$eYe2%m~X?*>QGaboE8#$-bO+NrZllV5-3}oe~*N zwxMzniK$TY1)CDZ)kFS`AvB|91A;FJ^Dx-3j`5Z#ciOv4Zm>tbSILi8GgtbveQOLdGNZ>?+9ffaT@637*)e{G5c_27Gp~)J>!(4N0onFU`n4 z>99V}Ts+Ou6?K-jJ+rhWwB+Hn&u%*xHo8DF`z3)Ut(IAKB-oQ0hWrHwwy zJQrOVkhR#Yu}h+*Dc#F7R7vB zQ5;HaAzBBf_XIVu?E|0E6sPcTwok?oW^{$#BJnVj<1s|Tace>m{K$m^ot5A{av2aO zG8mr8;vX-X`IGhukCw)AU86nezS2-GGD9IvtEf-s#N9z^%_N?sM`>&3F8b1x@&4!( z9?CwQKbZqI6P(Vy4g{q;wQda7@EhDAEl9k^$OfBEydvEfNQYnL>9Xh&x2s%|&F~y9 zxqnIY89$Rxxi49AtMC1Wd-rn5rz`(G#8pBG*^#>Z`C)jH2Jb1m_a4!lxUU+8U_Ip{ z`XoNAF%*J&N-(mRFO?L6OBu~J5#%m43W3`#C=v8rZe(A1FRoc+UotHfBe&(PF97Kx zgn~YKt3)Ves~}O5yF=p3dh zx2!IBcv=5Ma*0(8>Wooaqzz0IU- z>Xr8IRjn?vf5(-J(tozy@(UL7FN&HkWM)hg#&2xzN$rM{c$%cgQXdAOU+S@man2|7 z9SI~LUPkzAu(;lyX4gwDa}txBUIQJ({;hSy=jRo>9&M0a2xb&FixO-ng8lupq}r^| zGiURu{N%68@jpfoF3S7n`GDB;EZFcGkDTD|NB98vYe57RANQK)zKeAw=o4xn;t?7u zuQH{weLyxro15|$rOdNr?w&55B(m&9?~%#GgY8UX^W9e-6ftu7wqBlcXoGYjCN6N* zdabHYsuGl$7XCfOoV(pp?+Fk>e6(^ZZ3SPR{FFoX;9X)l!y`-?~+q%=JM0p=+w0j4%S;6 zf4ciVOb>sz*p0;GM~P!X{2DFJb@l=D|F<)aA8q11X=yU2)L z0BoGK;`1Wh2Yp@itGG)76P2kIS@9BHjV)Fg?`qO%N~G@&c*Bm2>tW6}qh%4q@heh- z#Cu?DATYs0k@mjG^jy&ZiIJp(O&qk-s>k~h=8s^NY)l~dmLhD!uCm$agXhY-f_YF7`s*v_)!Kz^xXH*plzpG~VAtn|e z=*G4lS=$rBAIVbno^FPSybQ`n4@VIZtuMmE*6sq9k3l6oFO7Pku!BZzGFo9hp{9-m z$B09rOwG)HRn=5xbw8qgF83z$K5Y!;|4F<;ba~?O!4Oag`D8g?#=xmMb4kz=FR%B z>{Z~$EZj(QXRwW<)dWGBMH@a2jJ4~R({=Z%A-ZTf{yRE;f3p6esN-)Qu;W&4Gcbx~ ztkiucSTM;P$U7I75i|+<`>UtOhc_3NLH}p9=D$<~qFV+SO0Es{*4+)9%fc#KtYes+2wW;RcSwWDHe9n6cj>$l!!fh%+G? z0{TBknw5<~_6k*vVHabd_gl61c!-3N7&sXNv}EVd!M@jY{~1<9tBg4JM!nVjbw-d} z{zexdDWQqg{VZjWF$UKi34n!8p z1lc{>m9sF-LaXH-#8mh^I@zFf>1Nn-|#v%PY%ei(gb^1|DpNTVm?t?M zf}F9ip7GC^ti_LF-oU0;nT`g=2tplZ-TKRkF+$yb6d-bqs$ZI!!j4R^Y;Slz@m>dj zN1JC9odW@ccq*nKvjztW+gZ8Qr*j}Hm z1#h)rfBrMXzl~aF97MrkjHR(d()T3&R%z9aS{>wjD~F)`-0JxdZ8+rWcKpTCxGpNw zNV{2DUeG~PhDQb0@iqK+0bkG~B!c+&1*^z06$8!)l(Hft313-ec%#0N+J=X|sx-25 zS?PHBKvKiMsFzlhY?p3d#6C$jIC)A6Br%oC_xUs@$Cg_?x-H&YJww{BCKruz(^El@ zbF)4eeV8S zU1n9Z%}lbUQzIfKY!U=ivle5&510G&c5n5KwCcHm28)i{?03D0u9xzFa>7U9=II^wjZb?~gbj_zI8Gsdbq^d6gLhrzBP+wJPb)IfM;& zYvjfeeEGI~Y4B42$b+N!y;go7$CrPTFO6R6UwH5?ey@|?2uYdm$(JTC^<5sE%J22^ z8*wSK!At#L)R@Z|y5W27hl|}5UFIV|0EISE1#$Hzm?q+H^dLsZUy6;im84dRj8M#e+f!QrcTBx~(&qk_6v%42WYk69 zcszWwG`zq}QQtK>Q=4_(m`wfU2EFp>o7wdHqM}OEJf(1)3%Xc~_N>y6)ob`@^PX#q z6kPGeyb07grhhsza1;?((tUAK#q{zC&-iDN|10%|YE-rRT&6xqy{^BGC&{I?QOUm_ z$njsOfVa!pV`d}dPppl~h5bO3Icwu)IT4J6>`=i+tc`vB@`B$ZM}}D&13AV_C}eul zAR9?#LkpGl$XQ~};Etxuq~Q#Bo@w6e;#C#nTgI|qqQvR}N)Qs%%dDSwGYLg8r)kKPCQ+S5D+)%f>J%^8t}m~MWFu$+%DO#~a!tGXNH8}_Ik*~er1>KDQ8BU5Ln=09;i z;#nnXZuOY3sEB*H`({ ze;~IHNKaiQs6(k?S$MsH99#&J%c<7jbc1|I1dXpgBfsZ!-0*rn!wCHzDeCnIGV8{> zHcwAJ0@V7}s5t;PD;R|lT{AAiQurMalsxiTsEtIhJthGnhglmgsuw#-&yY}BcGh-p z2Q(nVo@g>LV}%d#Z2wiP#GE5FJW46fJ_V*Dq3F=WpGFKSmZUo;!=c(ZK*sBtK|ka> zY_+GA@5!#SCc~ptHTCr=%T^vhuIDSHlnGGzp77rf)E!9|AV!cgDC)kEKYhRbjtd?} z!8cRhv*9NN0)9$xV6kaYr`aoKa}i)=nG+;dIhr7~$MMrLBJDV<-nDxE2MHpcz3OpE z^$cGcBLo9H&}I?6J>NxePr-UzZoX zV3t&<(vRQMO8eAnZV8R>f@%EEW}-GeLGE2NHO zlEZ<$FSobuhGk-4m-DG1anLjwg~- zc_qI`!rSF-wlRj^*$-%cK4f?5nfN4&V zxCeWZ1T3z#CvC5k7+Jc4_>pKRh9<8^(mjM<6&c;nz#~+plR}hL9--?uyjBZTLL_kK zYdIsndRg(n*?K26j2BKG>RQm~ytXJ)2EoY0RL z-;rg;;O??Es!*Qptk+&C%IhRVJs_-PgdQM)WZC~qMBPnnC_DUGX(dka2K#~4ZVwMt zkVR)}<*$N>sr24JU<49;k4o^Xs|5IVW7!b?R7o!hRnZ<9D|oa9T!1(r{Vc5k;I4Pd z;8|J<(DU=q^)71SFmCW1MH+b=rzMz8vfy&b`oMzqxQur_v$4lj$c%OqRN8#myMf0) zb~}cj0WH#gAhRxkwFKxk2rwDobe`l-%Juwg#XSS!lDps77&5}rWDt(@gtcQg7sGw%b2srGkz9(%f>I%+x@ZGM)}hunZ=T9 zfiqMGjrSD$_eZUb>`twG;g6sp8BfxaevcQ4Y$r&#KQBpeFyq(4Wh1iEGvk^cO#_tj_w;&}1RE7QQ`X+(Qw?_g8Vr?@w`k z`wh2HxPu^qcU4{AMReXnJHMi0Su}TX-Nv<>tB!GtA|Y6^>P2(S*;Oc<#3jFPiaz6K z^0}4kZl>&v*Jzk)8rNsJZgBbU=x}uS#T0mi1F@2v1M=6E_CJf;;f;wmd`5!n{MwcC z$Mr7wxp+JOZVXs6dFgg@;W_h@jt zsG#cHj_{ix1Kxv{#m-N0Yia^;6T%>-Xt&H3jVW5ajd36sVP7n>n|4l`OK($9--3XB+ zMrkP!l{OhhBA?{6K*{$Q7D;6%#q6c&;ET1Pdp>+8DJl5##eo}Y#&}a$8yCpHGbL-| zf(8cG@AwO3fCEH@3P{fo3MWPjaudp!W$abscD!GQ-=$bpTdrwLrrN%jIgme6b~2Aj zHH{oAv>YyOprH0|xDE{w25m;uCGpGQyQLRF>c3$_f{N8<#bv#b{HaSJJV{D>uEcsV zq{t|?;P1W6*X^Oy8Zm{HC3+>@6XRJG{+`=1#YlS#hGm+W>o3b(FB>3rl}Ik|rTOw< zEQRUVL9AvTY&w@~$5vm%NB9eR;FiGF7d=}jMM{_j-2O|uYI^D$>m;YcFQ zWoEeBYTDQ?_z_uuz12@BwmitOb;x?VU?_IWKIR1d>j^q#>aN3VHDCC~m`QX7B58PhZG% z34IY2P0sPA=&96?|8mYgy+O`Kt|l`wU>C$OvP23oc5u$-c3l zSFHhXSSQyH%v7gVLI1=-Vj9w@Z(ZGBWGv zBS8>-`qb;Im+A5QOo7ej&CO=c`g8_;Q^f0AW#~_IH!8EaSKBi2ESU23SI-*#2-fPy z>UDgyd4=fYXaw?w8Sf7rGq3>OQ7*^0Qb78CD^rGJ>Eag#0)esc)!pj`w6#sY|UD5fP7(#yz-pV#fPC z2a8?N;CM-PJv#)@esN0D`=ZDn$2;B$VLx5-`Yxf<>_-@gjC+;BhhXg3!iSPg;|C}I ze=&J=pHSs^t~2Do2}L@@*xB$C=P^ML-w-pe=O_G% zwA}oO++Iu>q=u#P;RQ;EJhRtfNXdfnd8*@-*qRanBm}E7r2wr!_Bo z2M3BP$n}||Tij)C#ItN01Dh@bn-;=R1#b`TY$&i^`iLl4?T0LEKS{vN3qd0{!gS*53 zl&N0!7@D$R5yZ@(hk<;CP5Z|2m|8DhM-g4r}dH z41clTer5d6X}_}Ra+H$(ycV8l`cv#kX*9*Rj^i!2ViRiE= zda1wcvHTU_h}kBlst0%q*fQVgO|4bmvbXt`;;Vyv$Uw)ifX5}TZ~jkJlJEqS*% z=h@dM@LXAHgg)#LJT6;UB?1XI!)SyZSjMpuSPCsmBT$8BpiP34tJFbMLd(eiuYT{; z&#IUiZ47HuB^#1+Z;Thxj1#2KVPj%!QG$Dozv*Jg&DRBjF}Xqe3LiJqs-z-FpUFFs z9n2L&*q60Jp-I&DwRA?V+hOfbMBn3k@_9Y?U*tND>m~q`rpvAI z~an*rBVe3z{%3%OEUvIu**s@bxHO3FrzVsKE}zd~#S6KD!?`0}s zJVqyC-(=A?uv9?dxm+gVxXd_E&!DT~)UXX`L}$3p>c(9e$`*6n1qznvgI*xI{Y` z{1-!jDy-$hQ<1ntu9VdcscBWXG0ld1#KMdJLf-W?1Od@Z_g}!oWyORWL>D)FP@2zv zkm3zee3}U}9>oi-oTTbV_KgpH!HEEIIMDc?O5NAkDkI-ZN#PFvMfSfUvdiSaC=9sb z=L_Ii94H>`)Adurw7QJG-?Nb+L3LqTQD~iP=#3O}Rnujo9T8FctvpqeT$#bBvkU!G z+*--Ly70jRmPc)n^4S}uUD@LIPX{Qz|Gsz5spxaYUCXf6NQ{i`NAXvGTBj${#l_pb z;2(N3Yx2vO3ZXUprgUa){;v)=euD9PNh0l~R?^%QeJ|AyYZ1xDPkq%(4UsC^OKr`& zY`?8CL44c8I69PCYY1g(jT6k?)3)*pYw)djnXQB-dKtE(X4g8wJmY)3Na+D;V$3X4 z{mLm*6dv+2k9et{`26FGS}43=F1!+hlXES)ls;_>28w(*lGK-7@o zR*;o9!#g0D;Bjx8*EA+7^X%~|E(vv!)l-t`Oizk&xWJEq3QPd9z&;%xd~mA~qN3ow@H-T&xK#+hR()$vcr&-~gZ@i( zLnGl8JZWFm2Akd$T|WTBzQQHHcf9VF9>fLS%R@=O-cIko#wGmvJ6u2FI)&=0+3^^r zdS%CIs(%Cyd>~W3%MO7`TRmx46ng1Vw)%Hys^2C-8=l&DO165TNlbik|1<1W40L1b z%j5{tUn82iLqXATP^o2tNq&Qg~Y?(RVp%p z0+eo42&!ej(pK-j9b^3^A|L!|ZT0TkG1kYT!TxOZhOVov-ax^q@CUNhyO1WsAIo)g zyrp9q>#G>$|Cg;^NGG;>SH!U>$P#0HlT4l$asS9Hq7iN3Z-vPgT^wpEf-+w&9J6(wt54RK7$uUTfHl6mWovE@gv!7f5v*N=XmXfgg%H}{(!dn8dI^*eV9R$ zBH(CSy~H2)Op%8NVXPm^R{s~&|Bh_+2u36O3N8$y+|hCXdwpaQO^cHt?QP$$(SEUv zcI?Yl1Gj1RRKrz~DL&j*|sBM~h-j>ncEn4jxOciQd@MEjJ znY})pOTSNxh}B*O7~R}#io8>!z59-=_6IcDKPjf~*l0gRMpYHxUv9M5^Op#PeS22> z{Tl6OOWRdO`wwe>#xUCdWCZ&+a#$DeGy+S#zCPM&zYEp9+-hHLwEsK;^Z||b?KCsW zX#YuWV!cnep)KDI#%g~u1y}t$@ccPfKi5NC)xyX^B|on_v3(hneI$%rDkcFj2P|gW zUlwz~J_#LgIit3E+aJk;db87_=mApMDs0H}Knj-LQpHtP`}bvnYdELHq%$yk?&e}z zUNXg7!k)W<#wM`2WD_Wq z8GX~iHG9HaV93Tw@AYieRoU}bR0m0wElJ+D`uSfi_SeW=-^k*gVfiL_&4um??Jqak z(*dxum%9;AbTe~>*DZ+pIH5+dUHXS814xcRUms~#$qYtSbx6mFzA{A87|ru zG36I+__0UC*zi@=Dro|OZ)KW5WWC6q&0uxuPcv45QI?C?itpBRS-Ez=C^r0baNS7w z0d&STZyDR$)S6)iSuPw@8t@fFYQMjgg_t5IMx5N<7@uq@^b4sRZ zy7OB8L;HWjyl`B_3wtqnhr5Lk8Rt;ZbpK(1xxZn3P)6p)L#sC2&tssOey8PrtEZQW z_cPA4|Ak81{e!^7j_nZY?G{r6vC3QX*Mk$E*L4tcPOSE>G25Hq(bx;38$7}6Rw-Sg zWWhDB=8r40?Ar$awG`CZ{94Edh8B4yCJukItnV^w{w;t=%253PE6l~5ud-L!f-BKD zCun7B%KcXNRCGdKlsAatoWjQR-z`JDGT=YddGZ%4*^K2+jd^Z_Vl zyVbn0+PVQH5Gta|dYlup=mVfHAEGZiOFr!J#3ToY&y-mx+5aUiY<@|+BJ$^#ndV&y zBpuT>A5U%CyF)raB&CeLG`GX@tBiR08igCq1yZyG6Ba1z>dgNZIN)+f4P&0aknaFr zzGu8=^6ugMe%1WOXeNgG86_jU6WDCG$pF8X@+XzwZhcc;DYw^CncpWf3E_XU!dA~f zhQsUC4vyD?S@36FSkHB08a?@E@u=>RPG=C{X^-7$D_IaWvc zsQ=ekvdX{p(dv$20i|gKk^USk8Tl7rLM_;`9P?yh$yb)MSoDZ7ev%`CTwUyXsOgD?}?Ac-jACo19 zn*VZa0I8Q=7ereH3*7tGvcb_6FT93qkY~SyMt2ki0|~_xeyrm!s^f zKQ%v|cVK?(Rx{+c;>RO@8h(5O{CL&;*9vaoM|4oGL(#oo;By6RH@+vIXK{Zj_aq2P z*sZYI_>wRwN%eUp_hxc^lIx>ff6XPP`)XD^Eb~Ab{a7cS>$s{EtA$=uheGMVd05N=pi+61YGl;5LVK#tP%I&SmD-d1s)}%fh@zwXy7I}fEm~>loHcSrh-w%0xS0-$dC!<)rF7o z>e%=|&xz7Y;xet+szHJjc4XkJ2S+3sr$i6vM(Xa53o&qgV#j<5u@;Bwg5G>)?AkN9 zWB0cWB-8Se*{+~XMUGlRC#e$Miet*Z5^erik)IE@kr)kKH^OSlfiK;1PN6teSZGJ;*jqhMY_vRfE0H9JN0xDd9nr!k-ut>&AjC`$FX z)3vAS7O4UjGK8pJAcvGiq12*2P%3V!XwsK8Q3l1#uQ;JagL%n7LW9|PZz*Von`g1& zqa?I&8FG}-0%O7LLf;6B$as(F5|v%owV(;PEjV619o(Ua9Oq{txIN`vHNAXIXZ%IP z`n*ZV!FZ=-i`Cr(!gU!o9;JxOk??ne@<~Ho=AWWJc0Q{F2_0OmOis_+bYc>tg~liuh}k2NS+nZMtA3trtMYyS^j3 z9TZ8#-gL7|4@tmbj^maPd`?Iv1pgEb!G98UU3O_mCFO}N2IYQP)JeFW8}J_rNm-q` z@SAeaY!c0g&vX&{ME}4((JxOvl(jREKUKaaT(u({FW-+CJ$&*pgB07P{lTjS;!UE9 z2Eq@H6bfPo_zC!O8`mILtDGV;VerLzZ^Rs-A%|YYNyIf>VcKW`9q+po>#XUfDrQqi_YByZ$Wf(#wqL}V0HgHgXA|SiC8_2ye&y4Pvx_;VZ@&~Bki-* zcN^f^cTT2fpu_q!aC%taWOe_iF#O!!Lka3J-;S`luQ1=J@jMb7paE^SHlABg2r3fP zwQgOwgy%_*=%Ago_yLB=VL9Bka)O*=^;d{GgP^0;Ba%yTE*0nVi%NYGG9lRzZU5so z+a;Qxw83dB#_7YYTfa)f{tYwi;P9KtBNkcaq$dS;2c4)5|E9jWesXBq9rcd)t5B5u5-hZmk0X&r^8+Aseyok8U6u;EPm*|) z++NG-zNb#|U*+~PNju_+>vAoCF8HZ#%#+rZcinh1AFNwbi`9V|gdATNKg zKn1^b=U$dk*#sP7-D({YPry&%b!8La7Iyql(uRk_l#pS`K3f?Y8Kdtzs^fHazi$3( zS^u82@9l|FQ9CWa>gZa?k;_)wuGl}KIW1d$mA!)MxECE&!TaJOx4p}DBmQ5%Ppj;c zDs`)yD@-d+`>RCnUxBaWIdr_AWTw7BF5P|3a<~ZV;#M&R+{#%9<$O>b^2Q8 z?E3W75&P^n`C;8Ef>ijuiOAn+|5GyJi=z=Qj7A)u!#o*?bda$0+y+@OC7_JNKq2ux z?Bx;?C_R(!l=AWF;`lejtzd$T-aq#!zSfwp9MG&g3Bmk?i(NebiK^F{C~$-+`!2rL z@3#gvFoJzOV-`uPd|p?$qhC6q`lXH;m&GVY{uMlJvkt))CTz~}CJ?rYJ#xYNbcNRt zT~DR3n3o&w#cr%a!%VbbWfI3&v~09HGa)k3;G5?-r#zHDQx~_vjqmMq6*;i*ehLIJ zG1Q)JGIYGB^AKrKb8m*+U$uQ+@KN396DPA=rO$fL4L1uE zefG8a=Qh~>4bUFhHgN-_E4vmrNlC~11gVsu$nz*Mvr$U%n|+BlHt~B3Z%*g;6rN8v z4IO-^g#T?hTzVBAEjS<@5r<)L?SxSF4_OoF*!ZQPmid;n-@#CMKr4K@j92U;jEaqC=LT)lh^Ywe!M$ur9pp6gQh&y? zkf$Y*-cJVqr_Q0FEq&VA+*+E4uawQLqD|^ z^>v+`3d7NbD2e8TCs<);n-W+Rtjvt1z0!*Zc&|uYODnFLm9EeYQ7kz49|Doi@<9;S zKv1i4nI3q>y(Mi$|B%h>`ys9%##pP(CYj4Cw}thv@Oy-t+fzAj#4Jf%3W!h1!L7tB z9Onc#)ke}@yj~n{8=2&DuSs~v2t$$aGbB|{I!-mGDX=V055M#F>e){<`G)Eag6H`(h{rsId=V@keakcc8FI?y=X*cweT6QgEe6JDsZy-mzv69 zb%aOk+2E{L8kUDu#Z)!I#U|E}{>V=dj@lUJsOdgmnIeOnQc zI1nyc$Hoc;ctDvdlMEL)f%T#8rdX*-J-$xDr1CfX z{$AO=yZK(N_dh{zi8dtb5PH9J4-`uNy3o%!XA68UQ;}WE9>n5v$W4=te*974#wKzF zp^xK8zHm2Zeg&5%!UiF9g3u*C4Fgj?Jpcg}2 zf6DeRru)i!xAQ5i*JTXKdk4-9#{DHH8pW*lFSswFfE0|W7c3J!opasH6I!S{H#qDs zliou}yRPu%yARRD&EfAqLo_yhH1BpJfkokGdnYSF6~-(F zuJ|Z?#RY9PZYp2KqFEnCeA(D<59&RZ@a%dTj+QX#?Y)QG%+zPVS43g(PuB4LU`lZf zYp;|qo1v5`JshDkwI~Vy_vn{o30J(NN{<-?k}zGF1lH6;e?c4evRyAy@Y=NZ@iGY# z1EyM_W2MKiCeobU9U+3|l`*XtSvWFLuYcvX{N?bs`{BaJkHy|>Z;N5WZp4RWfmAQ> zHg8(_0ypj81w4hxK|Pxe$CH&-vI=c!U-e7Y{H=iUcYMnAFJ<2!=KD^rFLABrl4a|b zA9icjtt?vmuChg&4wlHGB^hz0S>>kpaR#bcwlgc1Z9kUO^*FkNC5cdSL~ z{|?se+gY}3R|(o?Rj%8=j@GR!ON@?|EnI$;EnLTYN*3;Z)*`k@%vzO8y11g9U>ref zFU2cbXp*jI8mM!E!%mWQ>lPO-0yXmVK`-3$b(`koZxMvvYTY7FSFBs!a}VZ45vZ#c z?!%d>&w`4qTlj~p+aHf!g2H<%mY^6bD%R~UMgFc@?QgMgMJJGj`}WtZtQy&DVsIf^ zy0nkwR8OgrwTp5L@{+eae+A2T+y0iX;|*0v(NanE>P>kc8@+lFS5A>OMByVS)L!mZ zFJbcXJi@yDGVAjRKEJ`|52Ek#TdrU8`#P?bT-B^s(1KOTnR~=Jl>E*m({7d3+{IYV zscLH36#*Eg3(a4I5$|I1@4T8v_BA&|Z!8%JF^ewydSnwVL^jb(%d2HJQ8V$vaJZkH z9rK$QZH;Ds({ALy%Z#Bd`}H!@OOe@_WSO%v7Fo4m zIR8w>q>}2}WqRklQ>IrYtGaJTSpENHdP~cM)rjZ0#=ayhu$t+;4c2xL!fH9wEAqTU z$Fcw7t(jh1HT6(Z{nkuxU7~ZA^1QosMX5Ad#Vg@|qlH}F`(I>v6&%k!hz0W}W_iG( z#PQreKg+A&crM{T?W-PztGRG9kzVEc$FlF+_`ZYdi(CO$)dGIL$nn@=@OsG^xL=N^ zequ2q!1NC7bWaukBh#%MFv|iVIH1G&j2mS}MjLKd=z}r^0gbY^JKu7Wy3EL}j zJvX-AlnPoamMN$IlQ6(lZ@~av!_p6y0nSpkT_(c{11j(Op`*KgKz8V=DtbsL`JToQ zP(ZMEBA=`}X!*q5Fah}_RV|<7FB9gxALaE=$(xbC_s^Uo-fTqKNnjIyU1~*|x5sYY zTcwR&T+~LdDlukcS#}RywGKD`I1vPomH9Dx81{{s4bXpeko2PmuBQNo;a6w{J8*C6 zafu9gArx_Jzjk4g`lwxaJ))P0R;aSc-Z|KX&l9`wP1uF!U>DxMJqrF`X^>i@Q&&S( zc7;7^zoKO=qGhaSg$p5Ik%9QJAC4yrQ_(=Iqb(n-F%Y||k`9Ok{Ds&;eD{Py>rh5n zy!$mGamuOHEg6`2jmAr!Re^!ncON%K;>RNM?m(oQLewP9VQeJcXXMXygq4VErGhfV zguz;Idc~TO77julPUMp)3vbySx2iw%q6W(M1s&HeRyVFV&5K)-sn?7mDQfkpG!h|F zuZsd=P4c05ij1x){Zf(I9aE+rE|;lwzy~BEN<$JwnfmQ4Ter&fV`S>#F=c8_Q@}#` z#AvhAf5Ec<7S_Cz&+=;nzr_G`PxMTb*DChyK0gA)Rb!PPv68VE{%!m3BFB}$$!>nc z?)hbhbt#cvlI;^0W^P}iGt2*0=T!bbqH`|)A8Pe{QaN~8AOc4^seVVm>O3M)g&35g z6qc=W^{H4<2_$g_-ylTcC;4VAWNgdd#>R|pCE*E@`766BPgws|Sa;{)C`}E|3nn+i z%!(l>_n5eZKU6Vh^Bn*Q${*zG5(dzDlkJuaeQM*`9j>PuS%}0R+5WNtr!odMC32U2wyV)dD=r*et6;owPDNJV1J)X7#tdDgWR%i$;gyPSl$qNI z6>-Hr_VF7^JSjC?vsvccH{xT~ig40HVf;3cFB>ePk`z{*q=^USeJQVO|^DEz?Q!*62-cw7ump%&|B|UdnB4SX36|nkuyRPVY#J^_(&K61l2BL|2gP7dW*Fzv6n1O9+Z|vmJ9C z9o^SXPix2Mi5R-ir(h#$0%t$skrC_y{u;NZr>HW0k%Pb|ByFFa+uHb<E6=ZHcNi@W$9^BN}(L~pt)*=}>KETC*DksO@ zaI_Pjn5GXq5)1R^P%=LANE1wJy5GcZcoWCBbsjy-+IYtM9L8`RYeZbu?{sRS4@z?&93G6teJOc<5e0n`4HdX8TlpXvEsXKT{Gu`ymE z8UMP5$Z2!abUaZQ3UM?2K|3!8hiOlKZ+_;s?hrHjT~InT*kCbVv|Soz|G$9+XW<;E zw=!*<|3;rVb1NnbD`%Z}R&BOEchxY5Kje>Q$zgdv|2?+9gq;&#M8!A~$~n|KAugZx zucXIs$R^Gkh=RJgUV7k4UfAM@e5gY>GsY9s zZIGmx#agk^+huJ8kWpxMj0)!~%!3;fU7tu~PwAK-$Iu)3r=vl?3zBs-2!0R+lb_l# zE_s<^Kx7ORWH4Wo{se~hJ8yz6NdrLxK0#K+PjdNzo97DJ#(4mWt0?~=Yr~ub6U}NC z`csoXx%7+#3(?BU69?he>I^myEZTx$`d*gXFSwrJdXNj(Z($c#Ji_D!=PO!~RBbs3 z1y%#+B?9Nm@~5dux)>oO_a$1{zl zz@y_f3shk*q4a~q9`BV<`gmhOaQKJEhQzz0`1g3sRn%tH^Q33}KHEyb|zc zVVV_fpbm)u=)X}2y8DMZ1mw(#)^b4*X*C{%^g4$0*pxjvHW*HgYsfd2hU<<7iJ8n* zf?U7m60mbHY~g2I!_lQsfSL;pgWdZVH2~EZa|{wexJy{E|J4Bgvm9bPm%ziA1HHSn zNCX6Mp}7BLtKq-t&<-x?tgMK5HS8ZpDiCo|sOzuP=>FJV5fNjE#4|7!uAfl>|I&aA zJW8Vw#_AS1E9+ZE^D>u==vl6~k+G-w9bmiZL20-zw7Un3?Xb}O1NHAJM$8Cf0+C;g zws6y7ZQN?}ug3WHbgZgItX1G&O=Qhl$$wP(S*&P^rmi)#HvevJ$J9w>gR&-@2jV9P zD^CE$&0KQ2hAinEmmsv{3XyApE7FTM;?JA!&6{FxI+gD5*JXQFw94e!l%5AV4=FrA z2{Lx&YnvbFwd>2v)|;|L=5E;K<8VxW_WS({r?Z76x4q!aet+(@MDEdocj5Gv$;BOo zK`8Pk>Hg&+7c^}8j%SkMA?hF5syKVjzcANK967KonKc3k+ zy}xy)Rb%hDqSf&R9PiQQ-FL~Zj5cpa^P_uSNhb!J+@m#)b=!SS&YoYKuzS+BHa|Hd z<^3YLd_>*eFyvL%~2h8gPFg=DD_BXcFz-!sVoJm`g-hEd0chT;=UCBM| z7bLCLEzOT6_q@!Jr;`~?_dxdeBF7llezZy*Q9#qU7{td?yoWy z9qQlng+rT$Q?7sA1pr`j%5Oh|v3udvL2KrNjDEfdJKloFtna_vmU#C6CfZv5u;i%Z zwU2#{`zI!?@4wpe@{$Skp!dRsPH@W%InAN-;*@{O`&&08QauH$=Q`vJ>Zxz}skK7z zGjU&X+J&u2@4^cxk@WsM{2&FEyQa_9>VdX;Qekv}6LjZ{<_D6~X3r-l2g5rf{GzGq zFsl07!M6GbI*+9?Dx#L;wuuSq3&s7O?7C%PBKv7Q(Y59N8^6qG+7hAF{S{v4*aYkQ zLv4wjfcPbEi(tghYVy}7-81Knv%VpXcfPlIAT{l}R`x&bqzb#OWoMf;XJ^X0PCBeH zJI%ZES4-!$ozCQ$M=ZHMRd-!$%9@$yjkLZoQ{Tv6$c?j1qq%_(cYN;Crrl)X*HU3D zC|cilwJl#I1Nwd0TimJ(;_usixB=8P#K&{aS=o)_)6uqNLy& zpWHTkA(CWj>KlMy2Z!aJVfUBTBVxq}vPQYA$Eg6?Rb`~f7Lsx=8!-O;h*lTn{%Q7 zatrFgsPg`K^C<>D1(El>#5vV}H!!M&nO7i2R&U7`zkQD_E(YdKaEi zPFx~Fqyt#ArR$ynrl_v7ev=#{{>p8p1@a+!52wdceT>5OGG|`e!DUT$aMNOu**Lw- z0L^o^rdHn4ghrF>DjellZNKI$DFS6gl;`~4FVz=K--t$Wq zay`4GP`rTEIY(tPQZiOOZP8(Tj+fd^Y`bWo%htKEJ_RycxxGhqHmy(O_8#5&KER|E zceIKDXdOQZO0k*;wv_ad)4^7nvW_T=`57G6X5?u**eIAy+KTT>y0%Td{76p??Uo0Z;1kyR?$mqHd2(?ZB{;)61)c_@u5$?xUsue3`LY&~R1nP4u;zM{>B^Yh^KzVIW!vfC zU!|L|vR~0A`|?>n83Sjv%Aimhp~ehH2#&qyCCB^kwEOuTGMY@{4X5Sd8#p?QqWfYn zRkdjcKa@7LrxgvttJyT7_uG2^Q?uOVw$6~5T~t!w%B7PMxQQM4v%)*dZB_)g`)7uC zHMreB3%r-A0cv0R^RLNdJBdBXyX6b#g1GC_Ew5up_ZF>7Cw_}%dp%$K?c7xZHDsC? zuBQ|W`f`>p`RLQ$%TDmM;TQ+(=v<^Y`-H!YtjHXh(XwaB(fHHrvmZ$N<3`fW<6g51 zL;0PKzd>G&=~sRQ%XX=*{|HOQUbWL?v;5;bc~jL;Q35#l#oEZpQn~vY+It?zp44t# zKXX^R_4x3fpSH7y$R2OpXRz#x>hn(qpDb8+zjVrj?cPO=gU^n$r|w#`WmWv=u8IjX zgaGo4rZA3-1f3s%aH27Atj@NExW~x4$WY0atv9{E0o+Y>bw%10m5P6>N+9*B(Zcrs zrWHy8L|SjaBz2b@nACkN1fchI=7QU zW+?67+-m2p(xe0rl=_1K~n;d_l zapKLIVtaF^V{gDL{27S;6VWK10Ed|ODKXCy{YRnHQGXd`u&7kyw$^$&Z#r(6seq)* zt*_~}FDxBec050t>CXd46#*S-*N0IwO_IkQQ ztqmv@g5=jIkDAzfk>M>shtop7X`Tr}rM;U*^j%HBEgl(@+tyFkr~NN6Ay+hj+{?P0 z!RN-YfO>224b32J=3=c^PwNxOLa^&ZlDs120CsnAeVZ3iqukIga(U*Tj{1`J-lyPD zkD)ouBQPg*dPB7CMZ7SQ6SmE&PaqD&=js(nZ@K&#qg8T&aJ}WvlVQQd_eO$-%z(&b zY}i04!nd{f7^ZBUwr*WCUDI;CU+TfHBa2G|9KR-2J;`$F#du8 zZJ4uG2ACtYBR>llGqAYk(<-Fwlg;?g#j8j<%lD3BOrhky`@_#lYn-{>ag4z!!gBhl z8mm7$Mv9rB&c**Pxl79A{8~T=T&f)*ilf>E%uAp=4oF$4#g$${#ByOG9bDanBys)a zNO6%6F(+cG9j*AcUWES}#vI)(6Q`;;Y`GYr+MdV|*QpFq&C~YB($c||O_i;C&$>FM zinb0QKFH!7{QU%H^8n!G&&{0jYBKliIhn+pcF&`oM3D$PGhm7w%Q8$%b7qtk?T{%K z|EH0S+Ip8<4nz+mGhBo7mAL7B>A)43UVVAm{}4wh>JAy%uR@FkJ76J_12ea^y|1ZD z{A_FtHai=o7p7m$4D6>8^vQCzrp|8SYOtnG;QY|(kn>Af>CffaUVJI}6F3YyY7L$8@|uogF2j~j za*k+gE2s2zj885~i=yogK2wX1VdPbomDKLE{JL`*NZM})XEpk5?-{U$y(oL5*lm#~ zGv0^+a&F7GJnrnR*Hj5xcH(%kUX6vH%b%aZ7HMGBCHbzve@T8dVh8`c7E;%B?;8H+ zDGKo!cF^A|KS+5%u#Ak$0=$T=#wglKU!d*i!`P8OE$ok;p|5^RlKYvs(V&iG6$5HW24i4)PkmG z3ZIm^H=Py%%EqXor?sX1W&Hr$0430-H^~o|o3Gp^2|PkcbX8u=8JdVuPeSP72Aj7t zZMHYD2vu0wCE+7HhqB@&EY+R{8Gr?L!LGGDwu8RnjNAS)oo&uE^SaE8yQ#H&mub&< z(X^-5aYv>eFI+xLE^h(L%5P2Q|MGUC?%Dk@QsB)#+G*LAJ*n&U3E2}OFq{4kr9^Sj z3XhSFmmXsO5gg%$fLTk+0Fqt(iq2M#Lr0Km5VycMi6d6Do{G%i`2B*XjzM0>Aa8_N z#W(=WFe;AZ?wUebgfux7&p~DN@3OgJyGR2aPS7=jA8CIIL_G?ox2@E!Vt1r z%anAmSt4^Hc?*OfyHdv6s;xUibDE?z_Jm(Q#n~Lgn*DMkyw?AkytZ0!Ls#=t=A9r_ z>$FVFemJ?Ud$NF$l`Wp+WdnI+_eI+|-WKnktit76T_Hwg#LEu8rI;4NC+UJgDk5 zzady3hbk112B7~r(nQpB9%1eoki+IYqjH3j5t1pMPDeUwFC)u%5i;I4C(E2>yt^mM zQ!}y`!_#=7sL7}V+tHLSB?2>dCL5__0sBwXI;0ZWd@&D+OY5AB|L--dJtT8tF#kq2 zYp4BbtmPY<9lvLlJYf{`xaSa@1}es^#qn>I_as+c%Z}`(^@;qnOwiXW?|a5n%KK8C zU4Vwo!UG%a|HkiGyS`Rsno6zR#`=Z2Md08RTfF~%Yg5{{GQQK`h^Me62Cf+biBolcHsfrql(-B%9owHy1pj=ib|ud#$>>{Ux(-H zOm0ZDt+>gCbv2r)&0X1u!G3pk5=?bxbZcva`1Xw9akRZ?K0d9+8jg{s#$q-8&4}lP zLg!(-?815V+3`_LuNOMqW4SfAUiw__N;c9R7A3VKb(|bem*#5Yje2_IpHptADi;73 zn#PUhkq+(>Hfj65`N*x6U%>^51Zr!-MQz=+hm?>g5Pohwj}SW6r_I+4rxpV8+&XT{ z_XfU8C28MZtGCF0nvvbeK8r}^IC?t1-uzlCAO83T^Gj;sSEKnQO*vlLo&1F3eR=W@ z$Gc$iP9j!2C+~7-X(YqVCiKN#wY$dH16^Nd7evTfmwz_R8HsSk&ZBG&{Bwc}kG!Wq zoe^jW%7Aes(39)zYX>HxOw~KqOf(JIRt!&$Pd7yV09EFL=A1`vdp5_hX#!X9$_&!R z5IZ9R4SlhC<|+DeGI6$-Unl9yW_Mxy z&QC-kOh|;p=Le*Nc5wFunIIiR>&8U$11N@art!1kMUWTiUuTP~x$!cFW9Sb(y8)Ec zZsuPSYdj;W>R{&t>0CZc2S4nUM*Li_?!RP_W^CVX0!&}B>`gQvf9@{(6uZgEeWIq5 zeF}zpw2OJ+M2GMbW};g%m0^nDy@Afdw5$1_xA#1n{b^hrW5=p^6wtEE&0Es6m+B(c zW^ty+Ep%Spk@z&B3k%zm*7f5iXM(?)+`yt3*t1=x{@ncWaz9n$EZ^FNZyNd^J#DAe z-?fpx-@1D^dCE3>&y)7&2W48F!Xr*__c+lvwNq^#YW3dy4={;#A@XCl5X8AhibDTP z87C*Eg~PFDEG!}q#tZl{)9Oo)#YjSn7ux>ZrgMV}nsxP>#Va*Bo@GN2+0BI);i3kK z{ca?*yGf)CiJf92a4cP1wazL01V+5h4wi0r4cvb16t-!{W?ZUB4Ldc8QK@51#g4({ z3!U#Vbn7@nw-%OIXh?6t)U9Q=VmhX6l^X=eKdS^z9}qTd2kAp(V6`z-;ut;;P2xV5 zCQN`h_IAc)GcJ8Y{}VE9SI}WG(E+NN@H9oa%LJQb{0Dly>TJCGNQ6rt*(0q zfMA^zDCti+4m!EibW#|KzogOp2yQmuu+e=Ow_s6Z9w=N6dn{V?w2tWgS*=oZBKePQ zwsB>#|8ssN2U4*56UXK?8v26qs8M1P4^R6a(^^?}`9FZD(@oX>%`>!SkmYEDEQisA z@J>Y$!$hIK&kz?$6++6dfN|jngZ9b{W+BF$d(<-0`F^cG|2xTg)hL-k+#x{w1PvLqzYjUIpM4lp6vr+x4j1MnwOSw|qY44*(_a^OF z+G|I8X>Y_JKf9@()-XIaNf|UNx`X^Jy^3ir&~J6boq1ssVVF~x%^7yfkQn4&tIsme zr-91yEi!Z+CFVuEkl#gW7r4a6?wGj5nvY4q)}dzm zrxkAml}qB$^5@sd7`&gs?i`Q(UsxQ+asr_WS>69vfGgg&A1^t(5~eR|)ppCztXt2c zH<8+IjDq;D$fTkL+G_HeCo6s)Y?h23s^dJ124dnLMZZHZk)U)whuO3a=3mxW)u0n> z5Kx$Qy`M%kBK!B& zgpfD1TA6@7OaMOA*dR*oBSF9=Gvfx-DvH-J27tck1oueS)lQM@{kCdV%eSuMR;B-? z=IC?-RSV{Gqb~1_iyEa8fwwV{l?_IQZgDjGyBSS^#)m2cXA);bsKu|2^}Xa z#J005IrwZHhNgkJ!MIP@XUmJ7X~{a7d!fFgUP_Dzd5+A`CS8yi>7YN-CL)ViahSvi zj@klL83)i-Wb7C7>qOjjf^SRBX3jSb^Hs~4IS-79+Z)1UwN6(gwii)14#XvV;FK-mc3GJA0mPCYXzq?Z?3q zzkFn)d}ETod?f4Ptm86%+i_5%wj-JQvyQY2eHfn_v$-9W61Es84w_4` zI;d)6Nj5PfL%SA^4*E>p2CtA@@FVI`W#U^?=1=w+I@7kCfi>M zJs*NL7A^6FM`$^5o7oa_vWPwzA{3id;-6k>r#REx1-op2;S~5|-7SQW$4Vv!8gWt) z^?YdVoJ1%3@0|LT7d4pvv)RBAwU}ENodas{YJ1PE3OeXGyqtZJsBSiuv_expB15z9 zJV8Dr{%BEQhxA#de$&3>H;>)DxraoTtglUzFWNnAZ*nfbq8OYw^i~B4ahNrkHf$e@ z#`%Doe*{1Ha~njHLNSMDl*Es665LDEf;Qwp6_$VZQQ8>}ULvZW$oK5^$u8vn&pQEu z{J|Xym1KfDuf@1igMFd%1bfrb(R-*l=mo*-`GN-d3yRDLhhZkTt|9+!`5*Mt_cf$N zkB3A4CW(H={{qV5jg1{Ma2+jM!wond8?5HDD`s+n^Y^kRVy@nWPu@DnT!vYitfSB(7LKKMAkpN18 z&gLR?f~(d*D0C1Re=?apQgm-?_5+Up36aDWf{u2)!VCum{>10R-ndY}g`B@O)AD>4 zJJz0v|A=3em=?Oo+v3_ft@6E?$7;)pE&XwyYz%EhNmYUnPb;nz8Fdl;M~l^p53Yv4 zv@%RYz1UU%H81A2whB}(P0IfNa*ad>SD{Vlor4mDk02PlHEuHh0%EvvOd}H8u}D0>N+fp2 zkcnfp#dNg-aMGFbb+nH8bnc1gBJF=rr4|V{gO5RbmJO>F1mOZ>wsY^1GXLVg@Keax z^U(p^M?2YhxS%oJGTrL=OW~3JyV5PMSlu6!@4*cQZI^WkQhYe}`R1|vW)RE=*>{s5 zXznTG4N`k!VA*QI0<`D(e-s)1SjBslI*22adRkt|euNIl3}uhO|4>FF5zsN`BhQEl zUwp##;n(OdIWxi)d~zSY%!`H2OF{J}10WWjEcDwdkHaRSzmZ!S4LH}JW3P9-jLAqyKf zoFWcGGe+N!mMWF4Xi%1Wj!^jnjF9R82m~Px9@ogYl`)E*no4}j*$&c z#pFUAAGlcim(~rrMRRC5X7&Q1h<@FD65sjjA{PES&YV#W1Qi+}Q;!=93lZ$f@(Lj= z8Nz@2eCU6BGWWtaZ@{h6cdujBB4pJuicOMlB|R3L9{oKsr~ifHQzDrjvDk(OoZnnpC_o?jXd znPV2@&kPxF-Jw9%2aMvNJ=7dUy<*Rf4`7xNU8mjX)6% zTgEI@TIGbLRsAlXhHF^H;(*j>Pnd_P9SLzMRl-Yv|2}PySgd}8G)fPp>UjzODH0ne zi8b*Ou~(*$xYFaV2(0F-$Z{%vBdVa;bN%4jUJ&Tb-J$t(2LodX9Gk*$l0cxRW zhy0W~E|%AMye)>;c?f-Ccg?Ipp;^l^X{C>t?V$rV2t8QGch-MqJ)ci>oPk{OxN5!J zTE(pqK708@GSXldD(T|Qo!r{NqhZ_Yl}YAnKXyneUDYM>4{a{(U^8=I4z!opmQAaq z9E4YNYIwB(u?)tb>d7CkgOBQxg{p1Gg!_O3Na?e>6q*1z4togF_N2J#`HxL=w=}4H zY_xGyIdh!-G2-tc}4v+?*uh zdJ_j5-^mYW(jyd*Q)*3t`^yUS4Qhdh!^w!&RQ@0Qq>dlx$Lfvpv7yi1#HYXchx`w9 z=#d5puFw<8+x*qiMB4wBR7AJda00|yZ`r@J_GZ_$dkg-p&0FvvZM~WAvlTjZ2M6q| zhr0L6sLkLN(y`a+IN1{_^4z41e8F zM;+sIGSk(2Rj)m`V@i6`6ZD-^xpp>@e=fCx0sReQ3%q3>F%d8bJ$xO>o&{@`SSDE3 zD&#@CN*v^C1bS^(jLQU9H8Jk_`oxSjdOtS$6yJ-mF34Vva4<}?5}eYF)-@0?k5v&h zUqu*>Z%0(SqfuVccZzg;v!GPR$wi_TQS#Uz5Zobi(s3f9WtsNJWU%E~oyq#cEw+|>;=M&~Sc6|NmqHQN_+hM{m~I1#mr zqiW!P%zbHexL}AGp|9S>|5d$t#P3R+l za|@+0qpk~KHg&`z48?SAC3w(>EI`NnRzAgtRXl)DkL|O~iG32g4K-2TDc>8*h=d6b z!9x|}m7G5}oNoDzIqj%8r8>%vqs!)6B?tq}2st1V5oSd&Q>4}J;zKz}x|si%5kvcg zn&1Z+O-0<8jBq#>qgpV`b+4*c8gZmCii_ib$gQW!u4n`ibvHsWo9v-kQ$(mmwBpTK z=$@(V@WzHV?`GV=BdoCLz0lXe7v=2Bn~!VrmXJhbm$`j1O|t&D$DZvH=M{Br`BtH^ ztUmR zv3Uqk_5vdXpS58`Kiir{;;*KJEdTwLAUNv%0z=5Lv|=DFxyy?5`aXU@uVr#h%^ypH z(m%8Q~OR?fuCzyt@zqVJYUT`yC{DGq zkwS;I0YM#M8cR*#PWgYdy$^gHWtIP*+oWv@g$YGdK6 z5gN*${NCq0Gjs1v(gOS4Utf@!JM+x*_dMr0&pDrS9;aG{L=Is|bI3?`O$}m=3Hce5 z*iJU!04I5VwK9;s5WEHyO@IdJ17$@D%Rpbr#;$dyogJuD_8Izt>4|p+ zi{Pgb8ITWg3;P8X)WMAiIFQyG&_4xkH!1&;7MAS)63Oq7VA=m4u(F5r{{Sr85~#of zsP1GKR-IpyyV|@xtgM;;#RW0uhXTunSlOSbe0+GgEcz>^MIZwAMj~*^U(>=?qnif_ zk%=9GV=F#4TukEw*GujwQn8jpr zwqpeCA|09ToC|Z9J)JB|v<7LOO84@A50tW|Neo9R@A8`Y0~M#Vk3;)vvE!|6lOcVb z5bEn`M3`{C8L00n)``iXz6S*AyRyNw(}*;F9= z*1(y3P&yZ#s^pC-#%Vq69RKPwdW4_O_bTcH>Z`8+ItxDf)wDZo`Y=0Ck-wj0vU!51 z&u0aMf4g!xK!VS8cUFle8kRYJLu#X*9It=YQ7zIxYmckZQvii*StI(P!}s!k)cIHv zo2=^wXa+o}L6*|^XT&n~m;nAGF6z!7v3G#(=t)20SNE+5VBy3g0Rzq*$bgChM3R+AhT(fWoqM~7V zBuD@7D$bzMPST_`0`|DH2SZ4P@yP5670J?FB`csh?bv?Bd+4Yd5i@WoPsoChi(T=N zME$*hmvKtnir@R)cB3=UTDj#!du$--zLe;CARX(U-*wScCeM>;cPRf$$>Iu-e*47)7x`;09PfU4RnB6XHgIh}g35>F}P-Td4})FVLYlRua9|Kwl0?cOT8 zP^2c+lw=QHWOaTX8BEc=zP`)M5|KMnK)@VsU}pA|JkqTePunw9G7F;hE9ve*5-57W z*WGB?>Hp#kxASRNsIu1G`>m@+<+SQK)0i^DuL*ImiHR5s1lZ1*B~Z_BSuqtB+)jk< z3O*|g!CGV%3spOj_wrZ4b}h4ZE_ z%Qc?8=_#R_*!=ABM`4mUi3D&$@yT7=a#zV$T7OLq4?lFg~r_>Le z0#)^vwrg(b*k7p{vqWo`==zb=A(_27sN~H-C2!VB+SyHAv#ich>MK0Li&rTE4+MV_ zW|7_j|AmX-;U}H3gJVkNAJi~ii^{}Sh7L4*-AfgA1V$!ALNPJz@`@vp2 zvs`>!n4aMVRYqA*-tOZ7-je|!BUAO+Ol5p!GW+@wR>#s9{Kxjs8!7sZK;fh2XR)7# zsbUEAd>ij6pmO~wX<;vHlL`(WWRz@t*vi&xvz~P{Y~mzo@E#hq8y~Z>g0GJMoXj`c2ZI0Xamv*EHStf^^P45>8%AYVf+Ibx6BYDj+><*Ut>P2Q8HJ zBr*cZkmZJK1+Xx-C-)z$hm5}rRLcKbK7~Jw*{zo*{gtS#g)4_$LjRjDbx!JS+P|dA zP>sZ3F{C{{P10Xhtr@|JjpMgjQZ*fOuqOYFa8mf&q#7Cf;!H~v`mT`JA>tWi6Zk(7 z8xo}Os@4xA{SBk61F}N9uTChOZAbnwc#KdgJVxoUk6}W8BNij9jI0snE1_{sq*N`5 zDEp-wjr?%^@D$p=b680MhQp=@@ppuuvg46yRm1=SX2hv#0hC7=F!Wu3yA<$!TliE; zdTL&*?Oj1d?v!b!_xS*SzWMGxDW7Dz%`NO;H6wfTpj0e$iXF(BdKK*XfE?hJi4ogv zAgyWIMwq(UNEf@M#oeZU^Tt}IIrCy+oRC0nS+PG{fa%D6T48TN zW&i%;v%|42(=H=wNZxC#hTkj%klXN^B{lN*f;#zoag+RA(;|Prv`YSNSSNq)YNrd< zG;?>I>@k|H+M^x*{8Nwqm}9N6oJC~joJ(HLGO}`3l9O`@89A4ek8>s2I6rSEIk`Bx zQE9g3d|SRRvIVIlH+!F3V)c-}LGV|_F9NrH?<>1wt+mWwb)yr)lK#&gv^L;xhw=)= zo^`Kn4GGlx+5AJgk^>rA0C!%jFqUE_&d7{|=9nJDEbwzGB>&nmKfp2Iz!1tWv@he{ zG@NR6M+rs5#OEk%Yyb><3e<2Y2=!&pp0ZxBLnWS$cfFfgQWTziC70|?)m&I>2CVCUJ59=cgw^vLzv3BkFSF;|o$UW3Q8k@cTHkZ7d-XGP)?f{+ z8_dQi{WhEj+!ExMz%Kau6f4_DE{px2L#EopBxIm+>4 zGw}uGTOycNr(>@OUZmFcmrt>7t7B`v3Y%82-IAD~h7;2$7M*>0HUWW%)!9ej zeCD70YqvV$WSjdo_hDUPL0z&pNxw=Zq+^3hXy;PR8tH3}gW{4uH!k%FJ`cuZTNByR zj#{ZSS=4b2vS^S;oIlz+n{GNEoxQ(JQbpV^lrg2dZjucqPL9#!;|CM_Mca?#f&o@C zVEFLa!9`UvVbKbLzH-0OC->eacIa)!p`MjR=rCAW9GSG^a>mC-l>559mpvZ)EU%8* ziGn(;9ed?rS>y{&@GO1ZY5&R^1T@i8BUT{y6?Vkiwu^*5L~Ud}0LHsxuhh)(=amQG z-j}|Ysa|foSxFOYBQvL59FjLS9zMfv0U-x{%P&z<=&$066ib|Hw#mG=u<{4|_~;;G z#-FCh@Ttfd?rLa+1b|c_%FqwIm@bfr0M?uZI9`{t@Ru=MYz@V{OUg`*$e%_7P}=&S z*<=ocRGOWNJsULI(N-tjj@iY{{s0;MuF%RTS|+p`N)}1n(8GJ1?T&VND0Jva_bHE! zM;yLxVmGk$;#POpUc8#yjY4eLKkG)L#-rT`2bk%v2~eAHt9x?~XBVLWStk}$2L1H{ z{UA9Y`v3;!0Vt=HvQWEr~B>}=l zExZuW!XkE89IB1S2=?Gw4%e>XcXitPkl?gsgXJx%(tRFL017KEPngNK>Rj<~>ICTE zcaDgl=-Lec9-3@}cd)rK3Xa`EYMC&0kQz9GfhI6*1sM^579??(NG%45Bps%bBwJt^ zdlpv`*z36RjlI_PBxpQ?-?ECI%Y#NnWpo)sYj=o zku3kkOZz_bnTp9UVO$ItsYvWnQLeKm?5YlU`h0kH+_9<>Wuo1Ta|2sRbTfzK3|u%2 z^P-Fo%rdVHz!h!Xv@sl{R`l`bzBShRS1Y)Ah?|3zYpfUc^5brPjLzgoKmYIMe;zoA z9{#|xwv8|-+_^`b?z5_a|qT21Cs;)CBxvH2H*0*Y6zCr}swCqFWJ9)NEMb&N5Y$g6#NDBce)V=d=5Ed9#w+t`Q zaowQR)v_m4*E!s*RXkRhZ{N%08_it94uVOhVo5l1!Uu-_F;!!)-79NezKyFuYTSoVAyN+8KS!+(V9Ujat84rHR z8pSW^MSk^|U($Gf$+|)%;8)JS_URi(+sG^7=RE%AFjv;?Ze1~-)Mm2k2*27nBCkYG zgi@R&($PDI5vEa`V#CZ4Fx*!`z`*i=rgj-Y>ed8lz*u#83;J6bI*rru8CT%;Js6-8Z<>{t0&DMDH_3B z*oe(Q95kCB|To(>gdg*j|R z-^Tktrrp=kBAR}~Z1`ekW}p&Gj-lAiYgicBvYPQ>d%d>xa;btt{Zt_P(;+l{DgUcM zUy4)NcP+5~>qKn3JkmbFLlc%boH^ zK@1T5z_la%LRRZs&Rjwm>$AOJlYGYzZ^qhAcK2n6EwtTse~tifL`lj%K4zCIjM2LG zCP0|U7-}GWopNtgcI`Rj<96;-Uf4OT7k@vOKto43XPPE;qQ3HlAx(c*J8M(ieS&k} zEvsXr)N{uO_2QpnpB(D<2!;0$^D@W*MjLwY9tlPD!z!sp z-3ty~o25`j*SEx$HF;>2SCKv!JQvV8Ikp>|I=)nQ^M79z!M3~=-GsH(;@EWM9+4cq6}@rysd)C;a^0q?UoN}Sx+3rZ zM|DJ+4~n$17c(;8U+%%K(qm_T|GM4(`wF{!1>~@zmj+8Oiy_tS|6K*wZZW+yuI_H# zh~}r8GL>xvJ!*I{Z8sg9{ah{ThtJi>A9N5Bw~s%>I};?2ze{>9=tt~dTcu~ifzel< zFXOS;KmUUeKPp34kor~mYwP=@ah}o(W;}wFq*)#^$)c{HhR}v&gUz^kcAfsk+RnY8T?mz;G!o9DzL%Y- zFEkgkEmcpmbMbuBX=Y+NOt)hz`cR#)UBV-+)!Op4sWJ!aW=;`o*KG~xdyn673_%u1~Hd3mF~Vb){xPALNIn6`wV z;LUqvCsbm#Pz88sqnjHj)j}JFL#IYYj35!7lR@FZr^?d0!T!XdX4yQ}rNhCNUYmCS2#0RdE$Wi_eXjzAn-fcr#RRaz|*>n+($dJ>1o-(z>5jg<*uyMSs2Td;(UtoL(1iv0b~Z9ZcB`9=>p z$j!HdqMZNJ7d-i{DQM2^!#pr{p~(WnA)m%szJpiWTl;g7p z!6GJhDbz|JafzNO$UMXF<5ul-Cop1UOO84-ro9)YLlVCgiyVJz^lzR1ZPLFj`gfK7 zT_=C9Z>KZ$raQdp32$_eBu!uVLY&b$><6~E{=9T!tkF&Ie z&<7hiCPhSjLASY`s=ilW9^;CyutSYA3*sC*9yqqz=`21~EE??4)Yf?UxiwbpGFIxX zO+4kciCbA!xNYH91&7*YtGHcfp049og^Sv6w^MU|b?b|7ORM?SV}A9RU%lp+w4Zl< z=2xHjwO9NPtlDo&SMYL}m$tjB61K*}Ve@c=ha#2vRjd*SXR?!HiR;FyP49Kq@S3Y% zC*L-%*lTsH6mK6r^_Fnn_Z#lSD#F)#FJjr|v34?7$xQYi#iE&H&st@35y|WZJ`>4I zJ{QUC9(I;;Z`Jx$lxQvMr#p3XS=%Y<67!%%ThQ4XJy>NP^hFQWnFo8{aDs2x>DG1* zhws@Nv*(R|_3*1KEH2S2tFSL)%^3R90UX_l2sUH_yR^QK#~o9pQbLPp;T-czTx1HS4>a2R(={5Pfcb2^UaLFg>obJP=pV*f@?<{$5 zNpj~chpMk6{aYsA`_7U(!|yEp$RUzHF`mxM_GS7x{^^YnoX!y;JTo=6nhAj@E%aZz z8sfhUl5d01H}%T2u7dVuTGz-Nn6tG`FWZ{*a#M?5ez;06x31HRN~$}BK$*{C3o>#^ z${h|_hwP93!~u*%;w#$kI9ncaXgZENpzf zEvkM`9n0DHU;;I!)?hoIsbsq&eqfPgC+D~bNNwp}&XcU*3~>pI_HhSD684%BV4Cz- zH?6Wg<%QwChF!=Ay~^&;3wZi4+w9@?l($uwK{B?RV7XG&WQ+)XsJU3S(1Poiw|X-KaZ=#m@3nv~Z7;uVs~WMCuUiL*OPOD`5X{1473z&ZG2VK|g}{ z`X&;rVucj!kz=&YnFw#?4l}L*YbeU!`F}6qt(|ccR$f*m>(WceAkxMM_S;y`=kz;2 z*Q3N5-vlMi!hgSQEqvA9JQibfd_}W1|507Gpckk|Vbrh1;~ZWTf-j6`33Mic^X5HL ziuAaEVYGjWK0&)P`~o`5GBOX1I%n^gXGzS>&xy_}Jd#ty zL)}|OIu;E}GB?zEj6cpY6gHjnS`5%0KdwK$!?btOZvB_ClJ_RXqNn($_TJbnu{5z3 zk4k1=jkQ(WQl2m0vJ9*9CzJJ~#Ck|t_K<{PJc<)6c-VUfNDSkE?XhY4SSKRSunf{_SC#hh1D?yilb-Eg8kH{FB3 z@LucM|D^TkA6}iZ{>1v!< zV!0=!NnU~@SvV4P!H^xhSJLMOdE7x<^Y6>}qaC&%$lC;YKgXZ>JbnvLNCz-AY4>(G zbAxa@wB+vNfd)X^6>$EPcdH0mVKOi-lO>ftGAuhtK6W2$jjeu`^{@3*P9Cy4ehuN+ z1U|_=#!b?jbw4|BNWbEK+nqHk2c(SMpWnOKPyH<+=4rAgn=&0!mN?}m4AKL+#r~|b z?K!&{`Kyo-*Gbi^|9XJ``|bL@83+8+uA%IUXVbJUss#BsD29bf)aeHLpJHA6-!kTe z3Yp)~an#E!_tv#TJUPef_?1M-PD&)>yXmpC`^V%1&!6MZ`gp4GPglOj?Qfp(boS|3 z+e|z5AgoGinEw&zRTdXjKg@Z6eftfzKNEMj^mb0J`VgbI-C-C-r^Fb_vGPP3OS`|) z9>yxd%ufM{rVoHiz{1c${Z>Bl3j+lEe$aY{hi|NNfOw14&eqp7*8x3_ZC=-s1fVuj(o z_)>l`T}TJ@rW&2sTIZ%4UvB+G(%VF@e_Zo)``cfPb@V|>Wc-Nj9h-D#&9-j4*Y;1i zPqY5wJ)qn6ROX=psx*g{(HJof2DGUJC%vBXKQCtzM8uLifdO6O-uNp;1vALb{H~6p zUg2S?aZ~q(cPEJt>#as?5t>TI26H=+aI#dyE;bXM3XEU6 zR{3?Pt<@)5Q;q*EOfNeWOIf@6;@Oe26EV45!*re;#CU^drx7+1;#EVm4j+G(09u52 z6)dvZ*G^^|*bYP7VO{$io5DorAFPf#Ko8CC>Yo}rL^b4=I@=3wv?&gX22T+p9hg*p7aI7gfDl)ed3y=uvGK3?(Vdec!nO#A8l5tPzN%W zrquq_9HJAWIPTA}Ay0Rsf2%|85=L%kbv~B?WNYW3wASO8p~AHBLD%90vvDSU&Pd&0 zUHcUp!lrL8MEaVr{y#B4y2)_}zP+7r$mKhgq~Ur*o%j_@Jke#(UD{=3@00%XK1OmB zX=$e?<(Z_HsBGdzf!|wJ!KfD`)$Q zM>;qkDslf3_w=VpH=2$;8>C~4E!l_Z_CwiLBE6S{uQog6$l+^2%Ie~j0?f(YJxs3H zJ*)&xbx;32PdX?lq)eeU^5yKd zAgPcLW4S%(bgUKGd!QjvVKXmZkXEMM)+fqzocCe>13nEQolHN;h@IClD5CtFCvoY0f^mw-29}j<{AKGgDGyw>OzDVZ8vklt z+bXN}pfU`hKB0iz>jGksBQdU>FK>Nt{Eb9rzjmRljqVf42mZ|Y7q3|x655;oEY=Yw zs_Ev%{=DZG`=`H<^v{2)Njo!BnZE#GbGdY|F4{_J`YQK(iln6J8)_trqM#>XHYSIP z{4DhUTADk3u~+f@V#lp`L5^t58d!D8RmWg}(y2N7g_9-yipPX^37FzCruWjG{2G4u z*J$!?wLl>jw|lr!{EvWS!iZJt8jX( zNHO06|A}_~!A=)P0NY;=AsK}&Rwjhy$v6JtE;3N?x51g;w7oN#U$5<{`pQ^f6vIcR;e z&-zD%Ursfj&l+&7Fgx3Q5B%?h`zUe`N!qH_%tvTY&JrlG_-M(c-N1Q=M+z5vObxED zr@TxhG00G*-CC(r;3GCJu!Ie-DjQf>jmOTm7S(V)rCGJljkPvo&64$ZF~+C!Xo~E< zecjBtTXlhTjp5qWNUcG>p*E_0Zkg3_r!YNsQIav{ZM|$2tt1)k7?sP`KE3z?@a9*q zUOIQkB`}CNZfBqT9PAw8qM?K&Tlv?H%P7UlM=5XNXl4~+!PeymBqtN^B<%=={`Zcl{HILiKckmhzhK%RI2>xNDqpu#L$|ml zNS(LU=>2w8)7Q4U*Pb(KUHfIcI^Zt7=smaF<*K?A6JpZe&_wqSiFjnpH#(jFBwXB_ zKb8W zzskyvre@VFma;ym=9bEY^6D9qAaiu|75ld|v713KH3%E_rl&mzVa6zl0~=iEti7v_ zb}0s(I2I#j7@~Jo^3Hib8AmT8M~xR=`d(Z;HSokgD~vuLxN39`QK5o^O1Qm1W|SPG zimS7VDbkY;3fr?wXgvDq2&WIenV0R33p9*tEN#Zr^u z3|y!|->Eyrwv9sONbR`XmyA6XxVtd)rEWgv{Ey5BSz|&swx^hMGHxt6Knk^>6p*Q~Nz5nY z0YQLn6OvJCH9K33a(2kuDTV^ECcn0((+Li#5ltvgR;|yPQ#QJwaC)SgFaB z#a%^tvmr}#{JB-)Bi2fRgvg>UII|*Fc4}(RS5IK~+!3Dcr}|N*Qq9gAr00VcY!pFI zJb+W|JK;2j{@e2(mLK}B9XSzqh|V7Q%G+fMP*-~G3S?GlAod&m$$f3neKc+<&zB6) zz_cN-vb91gL$K=2eVnJNq%@q(!E`+u@U@^DO#Fl!h@TKVfTuA4(k9W~q}`*{>qS^Q z$4gen3hX0PHmALh(uf&}EkyThyvOS7pkcBQ(kkVjglU9AIAda9p;KAb+;t7dYneAV z&ybyTSi~g!1;n_X-nI_!$ZpY(-cTvIWmorT1$Q%?-I!x)JYPBQ3{+&>WC6*Ypc48(reY=HPp0Ox zA$79evDD~*dRw)FU5oQ}So(C00jgEStt=VbR@**`U>9%1t8mMUSCOZzS3|U&9yfI6 zNc@~mU9CLdtX2l06^pN6Y=!C}9Z72@LZeOut7D2Vk-3+3x6b2pp-1+_CslJV)t7t8 zR=+kYBS&qW1U{tVBy_wi5(w8IV*efd-KK6B1UmrSWxy0IH>J>da^S$ORkGT7+t$j3 z!)(n<)1&MdDqjINb_?n)hN1uIN`$*Xdj_7N%CS2hY<+*RqiesFZ2Xl_VcV4|9Pbl7 zTty20w>{c)7&o&35$gG6X*0W+S=BnO3ULBtqkSbJQ|MT1HgR?~-!5EOj3uI9WB!kqtA@}q;rJ_i6!#I7 zX|jkjDb~S~1E#866cUn^Bsv*I!XFLJAFZZ}M6fePyj!b;e$lf|6K_gU}t|W-;A~4N_U+`2{^D< zOs_}9Ifd+Xi7f$KIbSY|P-DM!{W3I#@;c3NC&Ti2h-YG*Ha2DS_L~pB!FLC$?0~1Iql#$g;0c<^j;N0%sN| zGc#wqBL|PUm^1*u=bj=*9`-i72O=o5G;Si4StL@OVVLv4GQY{_qS8md$Z628a}-NO zs$A5G5}Od-gq$)r1QClpRK=wY~ku^h>G;9^<}{jRE!KZ0b& z;0mnn>?-KB`yb^eTyc2l9(}0)t-ZScL zSHa7QBnQ0gu{!p}UFWy)>>q&e-wfNx{vP>dMIVRE$i$0C9Z_4fQsEMqU!!F12dAS0 z-ZEXNWUjr45VlB=&x-{3yhw1*0EOvpBLOoPq*ey@Mf@#eGr`l8EpEC}`UDT-O4}_@ zm0t$nne#1LkJ>`G&bri8rZ+IdMAyyAS0;(eeHN{t|K2T^OawL7pQ>N^qZuOO1FoC} z{u?NFCj%BA2DoU%P@^e`jQzq50e-v#+@donaPf)jduV~dB#!5>V)lt3he9C|J6tsI z65|j>S_#r{6?6`qMUaLCpkcR6DFZa@k@L3#q+zeQT@}FumkH8PCwqi6R1Q!ZA`M6Q z0>Gd!MgW6SWj-k5mjVVw5@E1qBEfRR;3deGb$lbpBAM3!1|1NC-w}QI1jOJlpX+dq zLkvQW#ehMbr=H(HDFPVW&sXOF7?iI=z@Xd%7?i#+_(0{g2H@wEKnTmCBrVz|MQWN9 zLbJdCYoZkE%!9h{fg%W-qF;g_Y>9sL2xc%1wCZwSI-md;6!||u07|V2h(Ykmz#R@^21)e+}fv?U3X{Gnxc; z$GS8gb9bKDu#kNNz@4`I9Rlu>25&d4b$i9=zZnC?-pY2DZV6YEBEX&SwGeH$v{#{a zgr#{0IJ*F5C+q=puaqwRT{GrH>uA9XNZ!gqT0>nzoSoi#dN!gx5ocFwiVuzMp&yHI z@IZ{U@6tdmjF)}K4F2l=zhGwvbdIuKfGMvwwOUPET92q{>S{fTf#}cYZGU5py|YQa z;vWdQ9WULu<(ySr_9_kba0P27|FOuM5D*9s8WN&9Q1?%AD#f&T)?pW~0eFoHCC+L> zxG9W8lO06SPS9ocmjk^w;-=&PL~*sFCzyod@t zS!|hT5Pf~;y;jGENQ;^a9ep2abp+u%cL@Kry*nju+xy7~7cGW(p}J8TaF-gBwe4kx zcu6=VcCR2>p0}?13%{|;?nt}ONl2s4XEcv&pIjtn&%fyJpP=OAH^=yjH!ejDb4fKG zNLmZP8)E;p=8tNTn-9vdu&rzB@7;Vb$BJluvmdl z$`TXYoqNg4`^i4Z(cN8~%lp}`Z^uDPRTFJHyr31P46E}$`GU_!h5l%^V0H9sJNq4; zAv;a^Z2mH2a-qaM4TbHVf=trxUu6f2R?=2j!qetc5x*a$z7n5b_Vj1#G3)v+e=&fOKI1s z(M#RxhtlJFO`1|^4YOn1<&?yiZ79$Oq~e~*h=A3sZuY)fL(`i>`PY2_abCpNChMEK z>tE3W!w2lMsLR<_^P?RPTAk8i@g0IzO&%CVi;H8h1gTewaETZfKk%X)YMFhk%s%jx z0iPUyuRWt5gOeDm4zL|qjE<(epN-mq5&P$VzP0DTKo#_#=pf`=^Qbr%*|E{g*o8p# z_OgfOf~oGjDsB5tA0y5fH_dXoagLaC3ic}*9X(TA&NF{%j2MvD$Vu+p%lSJ>^wB{)a_afVcPeNYvnsuM z2Vy!eF&Wy!$x9GN(15JYwtEz?UkdRRk^pSimb3uWSG z2+csumY@$`IAzV?v@+B#W;Yl3kNTUwo2ke5+UyjF$aECCX^vr(BYaQ`F5!PxvV}(x zu!^U}i(0;Xpqz!n*@sR`#-PCDbal}-Yi!EG@@c^17*<0QOnqR2*%6-hMQO!Eqs#z0 zoABYsq7P;L;a~e?UlxVf?IMk#l4Nw68ahEyG3YwQ;%CA;a!lIUv9`15yLQ?v3Skj6 z(GG2ti@TV;qMYZphspZ^QE%${7aXK=3Wemh@+V>4{*j=K6e4mfC$)v09B!{0R)%sK zx-lsv<=!Oqk%QWPtp~MTAw`BKmQkJ_)YgFBM3QL-uZcUG-}r0n&?mK3a#Gtzs4j}R z4=_;D4dVu?c%k2Dd<>JjRJ5X3aW-K({D!X}D=9T_*HxiGZPSh#FgEp?Q}4A>P*19H zzt#CqP(|=r*mhnewp>!FuXpjfxob6XU^VCBB-ZU%BqfWVkcRWP{}9iryIYi@vwiQ<`ti4DM@|i=YWTr%e8@BzI!E4?YeN7dwGz~kJQrEa`KL|=L z3N8@lpwiCxuCd5r5jo_n&fk%Pbvx(pPHggg`r~j-{x7LqaEcoTtfI7Eg7$u4W&U$K z1p^P}%sf3to+i51ROKngocdOh{tK-Chxp)lKDeVODO~X41L}FYyEUatb`=l(O7cWgkD; zFvS_B+%j4AA{MFj#6tDgl)svueKzb?C*D49c3JBjN`LD=EGoGFiHF-vm2+0TWOxA5c+ z;eFZxDrew-5%~1V+HdrubP>BBy2vc`aXC;d?k0{+dclEXNjH52Pz{D*Fi|#fO}^~E zAh0H3EOji+MtnfO%hG&Z8!RwX^(Nh~uPdkhJQiUftZFDwSA2#_8*g>(5~GFITMS8( zky+IBl38;YPn@07nZ#ci zOwQS}a~~rs*x!G)58x^kLG_ZG2W#oZJLEMCCtPpy(+6}jS|Lke6m?l-=jHZ}w$U)_4uKYV_5tCOrJ zi0q2(qHjks5D6hgtZCc*Y7GK-Epc1wuy%Z|LH;zsE81RJmH=b!eqek5W2Y$zFf zAbB#_>|Z1g{CD~b4@$Gw%%A(UKbXKPJaKY=Le3@O>j(Jyu?G{K54HgSJ%5U^ zDgAr$z~jj;^lOL31}T-i0SFHUdj@~ui2VU#Zt|QR~WS_SmATTgJL()pwmAtFp(=4OK0X z;HI!sWV6@o*s?nO>{8w(O|mJSOW^z!={e7&8=aTgesXZ~uONT+gY^$8#mx6-iZ-Fl zerVV}asm2_1r6!O=hq*>(Hr?ov14&4Y(2tV*!Lbu>dSS6uz3xo=Kx!81E}%WWcCj@ zy*#u2_;bC}KbopvAAORl|F~fN^1pM~8}G#gG@bHc(rkt!VO>g1xu0tqw|$d&B)XUE zs})yRUd3_tU07`OU%sOL74+QrRc7zSAFY2q0b^z!$BCFTkM?K2EJ>0NJ)N4tr@x+( zY8+U9tR4Fc{s*&;>;GdpA3gLtd&XWfP$Ts0$Tc$qdB=7St^nq%6F56KQc&`kWJeHx zJ9ro-LJP$+c+bhErWpbjlW`q4J*PC z$kD;z+i+~u(63txL4AxZmn8Ru%9kEipmGY7}fdr0CHxhrz6F zh~b<;vax%?ukdmI@HE?-IW6g5Fk&}8V0C;;QsXTmVOkLzG&Js}8^A0m_zuCPdwfkg z(o~7%NmvTf#a_quzf#FQH2(>E=Le*4*)=o{wc&|{U3x^4LUa$?$BW2YNG*~(%OAm4&3-hTNf zh!bR16m&HcPn16nnqFMl234T8DDprKe}qJ6G$+L7wOZQVAM zeYL!8Cd4%>e>{KRC1Lb84cmj$WdqW+s8YLC0zPBRk5nUtt=Q)0mLp||iVjbvT~ZGJ z+R+%pdfVH%7d>GcWQG6x*#zIkCF|7`3sL7-#=^nW?w8;)*7c8&a%b5-q;2av{p%OU zy(??Xc>2Crh~yvujf5icg9AJ-vQ)HlRp4;gk-@e#e?I4X=2!0=mP(MTv%d9zBU?ST z+=yK8RZGqgWi<^&8t6m%qli9|-qo|~gy@|HZIPborM6bodaUz8R`VH?$MkK|PcaGb z+7u8JH&}f`6lZpHYTHF=0Q5}|q}ahy-UTCDE*J%UvqVl*zUGZ)507@gvzvD^KNNfD zwv2SOjB+CJ!%lOTJ;oWR8{d!OU~U; zXI(2SMh+XW>GmPpUk5(1q^)sIqO=s#gD>(bGTx#nHsHx(%IZ=Uhz6=kC?2iUHPvG+ z!0ZinvL+_+*Cm}HYt~=p@HFe|s=S6engm~MNWfdzfK+vMysLS3i=2BP4Q{8u%$MPM z5Vx7Fc1ZKRQ@r%U{ZCiLXWWln5`i?mBQ*m&Frlq%`Mg@=VeJ4O*POj&6#T(b+H zqi^uP!7e5g{Xc9LEVG)M;n~cRh>wtcuCCpwinX1~#z@?IyenDD23S~D z>`@CPqko#xmHGeb|;nW=Od;DR&h#VUS!H zI|a!#&{PAIxT&sE%IAq}Z&o$QAG<758|4vvoN_lJPYM9cU0xG)&7|WMW4vgj4P|ev zQVyv@r=w>3g4F4^uRoVq^Y^y?t@fVdAyj;t>~~k$-c{9v9&1Gl_^Dd#&bE62vg?vs z+l|){nrv`kgEXCMt+YQ{&4axwJ5}$zD!|NBk*dw```4iVUC*>X&qxh{tO)#5mTWVE z4pb-Ww#=jkqg-gerY_c2m-IK(2SLwZU-g)S8_mL#-ofuU_kCQG!WHAU$MWT%bmHyT ze2TCFeEI3ndO?y;^C{a!Fv4znANJ*ca1+BE0X?O@ueockod4X5RK;Xn9K+azM2_2( zyZ9KcLtKyVT5vM+XfHqav7)}8N2hv;VRymDAX5yJ(eAfc_ApYbT6M$Gf< z?g`uE-XrsDm18EFQcE~?5Dc5(Rn;kXEyT07RwzY`I8h{#_M|I^M4a2i!NxYK%JA6Z zk>uEP>+AQ+C`rK_Q_qn`Y&YeM`mRManCr9_(itfDy3mb)e+#9C)jeg2uGQOxXw&ZM z-ZTiuYmK5-Y0+dbL@R$q|!VYEu#Twc4s^9bV{e(uR3BksO2@m_imfOt8fubA>b)Ad%=nxt!-UUZ6F+xUlsKX{I_bZUiU12EHjrT?mIv zaeP3A~3F|NNaQH>YbG9s~#I4Uy4_R9!^{KZNrCu>y8cfMh zLe`N5<6^_hj9@-ud&gz}Zc5wnWHf5K$BgT?a&{q;z7Uxg5MTuwcR z^TM&=C|lXjStesVPIMK9|4GbDrOZ&5I`hKJ^hr&|;m)`PgL;x3i;pc|;Y{M{v4ZJ! zBtyuffX;Qbk4{|vTj{=WB^`UA6M$Rbz?rEG*ZJ}DD12$q)|U9EGv(oZcnv70*o+V@ z1_o4<@~otvq#{fAC)pZlo!)1Pf8VLk2~h^^Jww;uu-!*o7*^&y%B?srenD7N(?l8_ z*N>BQ<1rUzrcKt3C8Ok=vEV1n#ycvddi)Dwp@vgIDIFzu3FnZJA5ZBenVQz!Arh_p zJ6xXNj|@91AD1aQBF%F{Wp-o5SVWt3$cfp$3WU1XWz!ijhJZ%pu%%DINI71~NWfwL z)d_9FTKzKyaz#YRcst7ACg-B%Z-a|Y7o~qVIS;`^57(K{-?)a$Y!SYp2!)m;m>ie= z-MQ?0R_skmEZDwUp(xu|ih6s*e(=Y%8YD)gL@#*kJZO9>1uSdH9N|FmOT%tjUbI8z zY`r!_qwxoamrm%AJf?nyZVgAWVj^SEHfc{YIwNL!&>*IVGk$)&y1!(8KtAF0n0lc^ zUx4)DhnXH;pieB}IfvlbLdVVoLJp=dO`8CV`={^f!nLTE-mKEzoMa-H??ssQKUJA+ zjG+)JSugTO7ym~74f}1f1w;UeG7%c?60=cZ`JXs2_8srm$yS(d#a$6?Y#M@%O(-Zk zMpCXt_9{rqAqk35T5Hz+!4vPX;bNrK}%Y1b2Usz_aQMC)3VM$=no^LJX?7mXy7 zc#11qHc^$PQAQ>1*P|r~N1^(FDu?0xZIbr?}SSkBo0w z$YNPp*0o>;D`&nb?rku;bb9t#(Ml~vb}dy&A%GbsrnJtsD$ke54Nge=B?oAR)6eG2 zNcuf3!3RYGO704K0YrTjGM?I$FfbVKN77F`nQW|>-L}{^0cvf}Y_>i1%fL>IYz+#{ z97DnWqLTP4*U&dhU_cz=6tJ;{HL}SNU-;Z@lpg4D$x=!Tvy=#C91B37-VlG~x|yVl z5i4D;D1*;HY6XCF6u&a9pRw^O(=ETaz4|xRp|zlk5Pz|UIRRS8n}rUz8J9cVSBPqu zjfFg+W=PA8f3iAvlQm%IZtK^LXw{|H?szeX2uG>@Y(j6&|L(p7cu5_H~0`@EHTktW&NiyA& z^snpU`M^o zA;((JLVINz8K{>XGahR0l|6pYRHH!1tYhr-$P$FSmu_U+9xlY1N#;}*ACph0@exo^ zxS_e{^*{|u$MzI7RbrYIqBgwVQBgnT{!miXzmhvg2&EK#d5U2f%2CnQOfy`_-Vsg( zV6H{F06CMKRmE?yu0NZX^ux025lc7P#12jUXvK znfAU!9|vJ%q#ps7!Xwzqf-}tB%I89?vQ^;_`P_ENZjzBXD(CU0P=#rE=Nc)iQlM$% zbZq`|{vMJ40)K%MQJ~p927Pj3zNPSOO@0BX-jhFzzwgSQS$J_={?y_;PsqP_vZ}l< zU%`ie;3$HJ^w$!i+|xd z#Pe_|Hh9(Sb87>L-OuPp`PXhBb{go@H@ZY~B8JEdQTP{B0pk#MY5$9}XMmC8{NI0- zl;+z|fGx(^iRmD~*=?j!#YrNZUB3{Pb=$+)gQq2J6YF)I!=HPPDI%Oqye)?{DaGZR1I?o5*-zMJsxZ4 z@cNO$>!Q{{Ljtzr{rf2#upJAZb}%AvQ8G>O&B<~I!FEquoik}NU^`aNu(@G3IUIeQ z71nmBmV3NoEn>loV0Be=4X1&elHb6KN$_^eRQD4(tR6J&C>db54u`y~JvWt^&4AKd&Sbc}`=!375mjL$ z1htoRry+j{0k4)Js6(?@^mYip_nk}678T^Q3ey;f+xYrAi4RCr%!_aW@XCP zKS=M%IM4~0CKApNi4e{IY;|15YrHsW2sZ;D>~wj%GPr&)rS8{?KL!C5MJR>Cz}oER+E78 zG^rEVn}Lf??+`|vmG7!`y>})PH;K^BPGdq z%1g5`^tTl~c#27=B-krQSXRYX-qns}Dv}4>Jv-$$A1d{hybRyy&`{^SDfb^Loj|+A z4jOTKJ}SyU2{4~sPo}nbmo+7yrfGe)+i6ol(@Oe^pndYw?QGDCRyMPad9<~tIXayr zuoM)n@nnc8rQDA3FIvG%rAi(klxqsFnNpFWV zx(E~_3>m)MBo}WJtNryORF{qra^u&q{zBd2ePh4g8vKI^^&a1HeLMB-auVHuNkK3$ zv3lVNJK8Qwc$YUMyh~cr{*|*N0M#n9|0TXjX13@Gbo{cbX5&k;N^Fy-k$G8m)#?0R z+kgwyJba&;*|E$+dDR^E7J=(c;fB}J>|T1lSpSxHEx0Hc=6t<_ug{goQrxV}l$Dty zqN3IemhCSG7qo7Q{HdU*f_^B`C#Su7SDsH{7m0dC43XkcqTOT+?;Ji>i|rI;IWbe} z`!E8sQ-f!x-OFpase{v9(!d|*k|vCri|k51FBnqQ+c55)yO#eq#@%mp@s^7$OKJD^ z9xljLdz0=rw#$pI>wCE*-T$-0yy)XapLsFF#aLxmPy#eNWKT7uljwmo%$0nGKyH(g%G#$LD)s&6=d6P_(Br&c|vc0K@AJnILHmdij zmBGEmJ-7ONx{S5-V376Qnb>k=bPE`24*DEe08GOF>hYNmu?F3=oC1vyVNS+@Dx2Wx zrXCAyzHnL?m9r#wAm__%?+hsvwz3p{}*Pqok^k^EyV5CN9`WCfZCl+s>Pm z`;#tn>DF|2-k_JC^yuZA+x6lJkr)P+-C=G~usPX2xzB!Qh>KkJ$#pQhUoLoTLjB(# z;g%1p!3TNkX6l0^qVTtiwe34y{Il#u3xFW97O0eXF#}qwI&fzz*xl!FjXsi7n{JOzhk33n|o5*4DAE$0N|X;+c;JDX`J*V%=_o5frNV2 zEXb*+kW+A62a)A$%D1u`ME^#{-IHZ}Lvh9uk_o>GDbu8lSTS`+a%Z`+=}^!c?C7T9-m z_K_B+;}>FAd_>No5N9L~LphysN)XQegt~BFCr-Db;zBBi*R0JGIvAy~AGhoSkJ~3h zk*h^?fiG6fluwz*Ga*meLp9H=dPRK-!7BcZbeo(aEOi$CgKs4ZSXX{k*kx=pWYa+) zDstXupFAYcZ5U8$8ag7;$0uJA|)GSZUVTgfLYtJ-EFNNbHgjxk{SEN>djgkspf0i&Dk17{bny_QSB$c9r==u>2YQv*wia zS|EsnV^+t9MG=BO$bknkW6SM__5*Ii3urgH46DPEcg*ax9LiwLKalio_O(}X@+ugJ6;q2 zJ2Xpbgn+Xic-rdT{pBM$joJi-%YWP!EwkpxOgn&{Y{OJwO!@yHfh-$zx*>lB-y)pI zDYNE?@}%2iDa#>v8~)usO@fQyVtt@Tq(-kO})lf`8ct8IpM(# zdWdGny#PGjhjabXG~`q*K0M*;d5YBHzoTyvB?il+I0OP3wH8jyQ7CSg3{`FeNi6)5 z%*qy!*D)pJWrz;^XH9MkJBQ?@_nbdBqBA(cxMKYL)Qk8L+zc>0N_M1MNU+O`#!2gVSXxiM-{3fhy?K=@{bDUUxG10 zlYk|2x27%G2rwH)4BQ4M)N?Bg5J90f?+An-J(D@|!psqB#1|04wD<*b{@tf}bO;oJ z)T1{Dm|x!)z_i@afkid6O}l_-^0(v9>Yh8zTT1zu;A|0la{yC~XY#m%u8D zTa&Tk7pKh79~L}xi~u*1?p|6VU<#V>X@lC(9%RId;S}1T5dwnVq$j60yPnsZ8mBmVwZf|AzGj z?Ru!{{%_azJkEc6?gpt9*f9TGkYLLiZ2!vIl)vaS;9YgVyG{rE!hUJRNXk7j<*PiW zzzm(6NkaQ3-6Tt;&QWez7eB>X6#lGDx?ip<{A@_O@g`E)Y4=ktT$ej(_cN=wS(|h} zv#yYCqmAfMsl8P)qrsqnp<&!jUjKww+>hjl-`=CDGZN==EAl`H7w} zcRpp1t0dXEPVNofhOJQ(`cJlANaI6fIU;$OnClt=Thx_kb_J9p+EQYek{}eUIU;g) z1RV;2M+k61k1Itpp=_Ks*5h%+WF}Nij#Qs}yhK`lj^?70RE-_xrVB20A2LNa<9Z=<;WZ|4$V$9qAp} zI~^WZv~e^)9iWb8?r-YTawmZpC1qQCtE5UdeuRT+_@yUChaE?}3DX|*t#5+=|D9$O z#)&9Gapa5OM$)VA0B$6uYqn+^C==um+d$U8OcB6H9ASXj-E}0y$G>**V5&~~3ttup zhut`>jVZ63GBY=Cu?Igc56sd$m>rr{J|2OkBc_ay(S;W*Sz{rL2Vc-jy`#*(!{FYRX*miFKr@$%LXz!Mbbg4GDMTDT)b&3! zA26C?b^s`5b^J5MLKZC}LLK^1!6cz~S}wK-j1U(Ec80+E?A}viYAAUbz9G*#2=685 zMu0qUKb4oz@Kw=9)~$e#E~vq1hY=#`1A$(<<@woW(ic@On)@>8pVAJ&z95}mH1NuM zk&3(}YjI><*R*4w_cK~Hd+5h z%*($dy>HDP;uV1}t;FLgD>0IGe=1*L4EQ(wh_ZX7Es}Gx@e%B%kEGon%Fq z!s*_`CXJvK!b>yNg(M#%P5^F#C{N^%E z=2j&nvt#2l1w=Wf#!~@PGvYt|2cx#JH*lUW@e22mb(OLoJ-Mqw1)EY=sUsjDPRUGf(MK-z4`H)=C&c zBQM{f7h1Do?CI#)NBJ%Pcoz0;5CJeByFw17HM1f+(3F49i580pA|KlOPzT~gTA5kS ziaikg^ZbPXS~-@A~GJ3>|YM)0XYrJfCCRYtOq2;Gx0}o3WS!~frtR|WWlizFd#h0 zum$yjQ-T%e5ADccZnQU|x=!rY9fhG{`;IBn(K7!b^?*_*D@ziE9wJ9hR+fv0$l3N? zvm_z^ihV?id|^ySN=uCH32lNpr#Y0#=1#YBrP{o3IvLR*V_nFZ_oDew-P4pq>7FL^ zmDDM$|BQ+Ccb<8xMo;q5TYh6rEU4g9MS(Wd)a=!8BDQ07%#%f)2n1|IQr?#;f6Oxb zN-%uQ?(Yvgl)Q9+nbTagKbd`VigmppnDr>_Yq=pxO|!SLHs1M^wRLx*^I77<4m4Fh z3fHY>(QNyboNkQ;1KSnms>`Zh>5sL2P!!v6j6UsP9si{}@B)jEandu_HC(|w?d1f z>dGU<&y38*9&-D8V;%RlZ7|Q#f8%$gFXV6V@5FMSs&yIjnkD!ZM0{dG@NJ^ujDArvU zX2}1(U$VnaL=KD%I~&R=%c%SKJM~NcdOM#6#1;$#B1Q;AG-EW;H5vLlq;E0+OrwYn zbuBHEc|#)3y+d!vi?4#90&hsC)E$yxn$#Pz{p@4kfj8unI0%M3?=8F`ozNY!X;N?D z6`GSy;Gk=Rts3t8Z|x0PVEWLu!GEl=w17)XRqVvITfWdGD&q)TL{yYR55!n0Q0O6#57|h69lVD~Rk5 zSZcvqogmSDaJ;D1dH-ezY9^Y|J`NcVRaS6e0uO}I=*{@c9$uYIVgD(l8N-e;v5V^; zRF*Fw`HL&#U3i2Lc$QNykD>G1hEwh*@!_eVQv1Y>$B0~^d|&t(?$Dz*R1vXX*$etd zBTXQ(c`+nc+|>@MyIO^~tL-M2K8DTyT*b9^Z131GF?QhM64#K6Dow)SpOV{5!Z5ml z%(8GDoDe!;CgO?ga2O5fFMmcKth_A5tOouR4azN+ersx#LQSbW1Ifd_Z8Hq!_*s zLW+&X(Ns{g{`zu&^=s9CU6jPitg9#`m@S_j4^h5$u(KIEFDW_Om4&EaS%a}CnyuO=Z#QCvtlVjGqN|ktbQ2#iWTnQyDE$AlETN-%8_SZ? zU!aj<8bs@o1Oa(lv+YASA8NKC)r_BQ+KVNV%_*YANm%iNH|cB}Nw#CQMR;l}JdO!|}+7fQl3~(%x`B95IPbpb&pJBu^N|gcwDW zEKBfk)3-$=s96-RrXl%Mmq;~%98U{Hv~m14RuV#8;YU8OP~tzy9;uN;7u;ApmqXbl zyh1BTQBj<(l2tq`7dh-Lr735EIE8fkHt1G5_7G$n%5tGNN!(9#=cOxE7&~mA)0G$= zNIV^AqnUhxKq0}ylD=bn`orL1hC$v3=*KveZ zP`{Q)8d?S&k8=Mc;>$^Rxo{?g2SkNbXsG{86aeFiK-3HlveerMQ+IeBt>Kh)LU3}D zR7p)kN;^c9ItP{gA;Q#E{Kq7e7R8)9Oq9C&dWtCIEuz#xelRKI6ViqGm#OA-P5LH;(QmWoYl1-j`GE`ID9#l|R1R5E?YWQX#wv zsH9NW1YA)F3epw3rQ{HZr$8j@{{q)V+sYvji_sP@ z05)(Qtt~nP0tYR)A& zzw@Ij-s#B|f92o`5lTxa4F7Kd%1V5;>w0F;$CwrW&i2oV5j*?3?L0{HpmB-!wLbYF z=z!$dknQ4c=z>pk7h!-UlC6Zeb+4?;$NxXt-UdFZ>P-C4XTD)f#Hl#Fv&- ztclQ?fehRWGfG!btfK5sNhQ>(WCpN8Z*Y>D%iZbHR$Kb}uUoonceDL%Kbx)&pqck&w0-C{_ub9T#F0! zc(JeSY)W+hl;7jQ#>VBZ7dob<9S1b4>d2X+*roZWY)@d$%tVQhZyhTj* zfmWK3p`X{N>XKjJ3wsi&teV^bNqMW8EQRQfOf(WIcEP==f=N9pcO-tV=J&=u=Suty zAx{6Qnq$K!w!d9}U%y3GHvML4BtYr7r^Q7o{TdNIx+V+;h5pdvT{05_PKZ@u{+xR& z_K0zwwwvX$nS3m$nygsdC)X9eNZd!jsu`6E?(}Y(0d%zSPHS`zCPw9F<k4l3Os9Dfj>sviM2pxQ7wH;sRbO3d`sS6jnC0`-NOOqefUB3Lz1>qG6U_2 z*i+j_@{PpNoxmLWy~>$5qiLSAXa?IgN}%<+i346oJY*&AuEaVrXL@WE$cFuAE1(hM z3Pt=L?UKbw&N`Ezu+9a^$9^xrr6fnq`(*ZIa~{>yQNnP=T_HKEPr*;(?R}_Vdyq8i zZ{hwT$dQ-*GQ3CdJ8l--vX^Qm?il;)r?NASxpGPNGsj#xKMSj-)D51h%MX?ut1;N{ zcC{>>dwT_;rVlIRa!DEOg!_zbtv|JyAm8z4YaE9oq#*0lsyRwH9Dbd}9Ta;&FSfWF ztp0&UO|p);;tdhrl1JBrQXkk#&KhqeW8*pK=MHf{MQWdsCMQgK>|cW(o2}s&tN`A1 zuK`R@SyG#e{1aly0B34}6SE_uIxBKfd94N{dX?PK?J zn=4Y%ik+6SlJ}L#i$q~kFa(K(OfCt~Pp^;`EBTAwlzgUN2UA`HOFKLY&1QRr*=$lj zn?j@iC~zcDt9aFH^l$M_ia&P?rU3-D&a42RTg>Ej#L&mZ?AN^@IprPm!f2Nn(9s!C z1~!E06-pB5crO|e*lyS*3!cY294p3P$pwX!ET{h^p@vV&&Qql94@5ymTwAc_-(|e> zlcncr1gYSD#9bwH?w{pOq$X?JGgY2u$w7&Gk2re{KS=%8Lj+DnoioYUIs+SUyqke9GB|@@i>`QG zULFaIL;^njAQVdIjwA*XnHbeCX{ zm7MY%Si+kkPR1M0FWynOm7MZFLG?1v2L%oY+_U?bseaYyPNstC+j$8T5@g7uP=*H; z>6&}otz)t4Q`yfSgKwYDR*t=*0{>Kx$*D4bN%^jafbd%fS6 zl15uVZY1r0*sER+Q{zrBwtYvoj+qz?tUAd|>RZ`2%+aT@c66E!+(c85U3Lwg`Kt0f zCVD)B^lPKk#x%C!NttYaiM_yn`Va@t?Yb_IAg$Y>zPnv-Ffe1=2K6etzGqdrvF+z- z&aNX6$i7Y&MbgEJ{r>JVllM&)^o+PuWx6Uf&RS87&q*a#r5a9@)E^2NKj;m$ zzDgDHLvj0*rnxg4zd&JVea#x(A(C>abuo0=_&vMUpB1y)tfcYm>8 zCYSx+WQ*~*U4Y9L7%%%(X@qL`WnVv*2~d#%&f-p0sRAcc_dJ|k%EPv??H5&wh&zMc z5za9lEA@}?E&dT6akA#{^O3+|p$||m1s)E^K5NCV1WT-B+Z2T%N#&vLQCV15VY!mO zm?AXMBW}KqCzPB!YC~?@)BsrY95bibJ-nxbO~mT1iGc0mQ4XdTxKdl-W%H-0Rv~+_vJGg znH)$Qnb@qywry2UE&6;Q@!`Z49Q&#A>GXKz9jQ@@GS?t#{eqi;9UNQn!tptT|= zeQFIBqqcvzpU1&LCHYVTsMNUk|H#C>P2~Ci0w#f}ia)(5F;X16i7R?$Nez!ynUM#U zWMeP@bJ(&Zi~G`FZZ?gRMDHIcUHhHPJbMxT%JK7=b!SgeAp7a&vKu2cn4WCiE_;f9 z!Fx`4E8&8ipkfGhMGt7=!|w|P5JJX*?ra(0OT_7vcbU%SA^F&_OHe(3c4^C1fyh?J z?FgwXp_c!p_+N>DPJ9@kj-flZT9{&iX?@zbcbf1tT+^(qz7DS(O-9Nn{B{Ih`E+UF zEN(R&ufVg)b;L83JOk?-hII}TH1Y*5!A*xZfiT}z{Uf7A+@^BYKe~mwwu&W`5|o;a zro>uooWBQQ)HNF&ael)dGy~6gdr;iU6qrNl-wFrax4@bBIiG?4T%Li3M_JGLBG|JY zCK|9GQIEkG+p>4HB)K42`dQ6JZvinpBCdDuX(!mdrpHFhdl3)=vibExI%O^EQ*s+` z1kG23yX7^o(M8fqL^w4F@+#YEAd-zTfV}mF@X-sBzjz}hOOXBz$sAr%4LpvQdba8( zJhXx$401Pd?3;>LT@Ei($VaCN`Dpm(;j#QPghUt}pa1frX=+m+gj)l|%=DNgx&pMT z;!Q;%PjZf2aM*@jfQ#bv*twI?u0Bj#{FTygH$ zq8JxCf*G@rGwmB@DNpR2B}FMY7n;s9s%O}h`SiSJ^+nc-Ucuo=V8~o?M1MmFJ7Ny+ zH3NHmPRWn0&~2?ikJ=ClX1)h`-e#lJNVW>UB=)S|UtKAq<(1fFg`&>+)XCukKY=mpm7|EbyxUR-@iL99qMUKBMx!=l*7Te8 zJ*yW+TymuIi~n{=Hiz%0pu0$7pO4Zsk`6<6h!v4+&7UqU+C<`*cy2 zx-BG9_)7EC>%8gQ-M}Rim1lFgz7%mEN&z$rXJ7D>T1Ss|i~KQ))6zGC@a%Gd-}-SW zK6)x|rlcd09h7wRN;c&*t3IXxz$fJq$?ttuB>9kh_s>5vL>Y0Ce|$;znS69puK(nt z2l=k)pPBRvOC}#Jg0$$?ZeoBIDvOH@O@8PbGPFmVhKg4$o@8uy9y8+=Pk4^DlxY9H5V^2=Ah?@5{lhuI!C`@7FfXEM_>*t2!4LW43AF~J3@K&_r!%QBgnG+9WK zB{U)H8!zXsEi;<4EH@q9dv05yD=&_PS)0m&HJLsrQ>C{%q!S?$YZ-mMf!Z~?P4dxJ zn(FT-B&b4v^Dh^UN7qy|#gKdNChlUm@7BR-_jd4;ubfiz)*|D#s-MKusH8V+5R`CN ztu-BW!%V2Gh2$wBYVF^pqa0B-lM9wH`dcIJ-FFcGa`PS7W4_4_X{tnb`)28t$tp5b zP&|MrIHBpJV;Q5eTE6qu1gUc=6|KF3XE~=km4w-P%r7%6 zhhskBZ^W+u$yx^9auU~7FL>Y;7J&4{c!g$>tN{9L+X!sds}e``efERkLD>Spf75OSj-KEz%+7O-jBX2a8@|! zD{@y?|58{b^y#?gZI5RBg$~4zg2-a8l!V#sM?0xn#mPyMa~>C6T}Gm7YUZc>?)rS@ zU*)npFIc-f=RDmitc@|JFMX)Q?4J7hI(sVrqt5$a_8Zj2T-{ZdUDb6)_UkI6sk^2e zXzgF=8?wV@W!;#FRS$TG17exrVF3Tb#%nNR8sLM|8`egQ^Ry!Cl?oXu# zN+woiKizdn_Kb~J1zXccyUuPsGO1;fu{Evyhr$1irNN~;e+&{l&R-jU*L#19_>^+l z9sK#<<+rp+^C#cs?;pHBY2*LN^#Skq>)xl|Uiy>od-$`T;(z=2lLt5Prw|Up?EYwk z*>duitVZM~6F$)J@lIGODVy>tQdAxVDA`bm5`IVixm2glr5Y>w%>ji4d>PX67vDzI zCBJ_TtA*LUIkLdwpO6FiQ`d9YrrtO?*XxF!a>Vs)Cf6|yZ3s=o-PQ@yXC-1HppZ(+j>==f1m%F21YTNPk@c)?ZKEeMrgJ?n50k z$PL1MbglZS%W}ZKZsw=(B4ZnEDrl5Htsm{?vL3FRNb%i!Z}L(3p>Nn5c8>6ahjI%k z3nv}{YvmNcEuq7?q-V}T;{IRJk8CHXU;edH;Of-2lxc*iHY@eXwYdxOwbn0XFI>h5 zwPvO4e2jv|)2Z=WPL{d)VfNsDv*rNw=Y6vVN%a}C=6SYT;E1FS+>;$AvSIDZ5lF6C zgFN@%j##e9TaApbDU zg(@S-*#W5NU2`l-JP+@Uv_BoYE|N3@(Fy6Hi1Bl)GJc4yq8|2DUeKv~C65B;)Sc7) z)quF1A(6yM^jZ?L-qWxI)ljd_zuiSsDk(?^^cYLs+!Ih>&E3Jj&kwLEy?3e&ljrV~ z&j)t5hK}i4b*UFF7oVymPtIA+Slgun0DNO$KUoz?oj7D|I4Y$>*3>Ea_xGlIs^=lJ zT`sfXRbRf>kjgG6#!lymzK*m=l8l@tT5w5dH{NF)MJLO_bU|03x-Yw+YZPe58v!yV z3oIxmRmOjiI#ZV-rX1=_DC=js(7_hREAwsk=GvSL>76;ZT>aJpfuPzW{tD{=i#)HX zK*HdX@sII>$p`In{ug>68+%xxkDckNh0b@AZ=eJ|I;zmT_A!oT6Hn-Nm*^n|{?d!{ zp^5a&N$s1l@xRxnHg75P=QOsW+@A8R1Wx2|qU=8j9cDu^AXeEUi#EOQIqqJX<~ccdWGGbJGPC&Ru%l9i$36GL(vB^ z5O9EANV=5V!Ow1px^c3utS3Y2Vi;1*Zg4rXb)2a7x5m+xX)==ePr2eQwM#=h;$P*{ zc_s5Nc*GGti{?c7^ZF8vp@-s-CiRWI&BfZ6Gv8*NBFzjswDgjMS@hq^))7J%PTyyO$Mgx`g2Gt`xpwV|>qS@}cb0{jPUlelJ zRKn_4b6-Ol2mOqAiG((WOJ@}uZC}$1A9B~1g<14Y^6*|S?@zAZ5^}DfyvhVLa9~(? za>$t{S|o4OK#(8OC;sowXh!%~m7h1PuvZW$@?!5#Kg@Et+ z9-Xo))H-WC-f|6r_}iI_xFuN2VDnh3=b;fL^N0e?Fe4?y^+y`&@E7R4Bg^8@&Of27me_vRbG#JsZC;vKjV|(MA@6sPJVB}yr-~A-VZ%!gf?wqrKjp*P$1Bc$G*Sd-IPRe1Mu zAB9oUZ}{V2$*RknwwIsZ=nU5GYZ`vfNjv>bPuxOQp{C&vjBP2;-PqVxIv0nqUmDwX z=&yEoPjeu9F*O+ec#?6Cl!0v8ehZZp{9b72dAHGiHjnOUE?JUY=i^(!{4;OxFqBs8 zTzb|A6l{mx_`1M?)k)fbP#yGBq;f4Zmn~^@ zGEMEf*(Oq6puxDmr=e|sd}`v5pYda3WPYF{Queet+DC|o=*^R{vS(0YY*Fh?Pn6PA zG+n{d*8ZF*={N_}FuCke3B12h*Rr8~Um#q4Jf!mzY-S87Ln^7efIVZTB;vXA*PhrjEwt$vfbCUWg2oJYRG_eTNQANehxHT)j%t{HsF z^_O_=5Z~8*I68VAe>d}YE`LgjSO}*?fx6N7cr_IATEn9`+I+MW=iDob>|?{&2z@C# zi!e!#!&HnI9DgDEaXeo^tGuE?Jh%&U$WglOou+DqPBm`mW&Dhs7Ym_d0Lt9#I2-B997f%sHRX9HMe z289`xtZI{MREMR+fY7U1H|^|X`6>k{+5)Z0t@E6O1F#w~O;_t&!0l6`!KYM}c^qc9y zFUD=`GbPRA8A3m@+wgm!Hi_8#BoX^p%;(?28xDHa?dzYS?qxdnosIVFgV_1P6j;ec zRU(H!!N&7X^Gj4MC|ebUT3L}Ly}Xo$5*yJuP;ZH#@nghyD)1MG62mWGrncaIcnAKC-d2U(-Tp} zZtA2Hhv2d#muK2cXE0<(H=nCCDmW0-rfPSKQ%9u!J^YVF?zfz0g&%iMoqc)f1$Pe8 z8gfBic63$$h2I#qOB^SZA4`DQU{ZJ2Gn-d12ae*Q>+BL1&xPZ^UXFim=;UH@KD-#2 zc8F$X4KCz8X3ZY6cE3686*gtLanD1-f2hoTJ?8L!UKQ`hIWe?x$~Y_ic0KqoWKKI6 z?x;EiUz^5`TLR^+A3{7nGTI(w85sh4S?Hx_lgAF9;@rC#IuR*Z-^s7imQuuC>NhX$ zbBjZ+;hYq5#=~uX5biIIp^c8?*kDf_$B{o}e3LU}9M;Q;giG}m(?IGZ2(hNoMw)D# zGQMNVxKPK$@tG1X%kbcI8Q#u$9aW!&p=Ed#@OkKR;$1jK;X0D}F^rmObPjvaJ^8;! zXLn4g;Y-J&K)HyA;yd8li?!u6i%dl`Bzv`5D|a)Hks$R0`pgR#RLB+vCzll9WZ~8t zi<&F;DRn>rcHTF+nn54CC)HE77LIYKGQsMCXBJH!%44+NiSx$B~d|kcU zoc8`<SF_Ds|4nUT}`V&{gF z=4g0YI_%he*?l~>SDxD!Zr_I!Oma~%lTDRpAGC&Fv{t6;%s?+MqfZe%^EP-PUq<*e=KAI6J$d3zlgCI8GH zn!`s#rp?GN1tLX-{kD-EUSB7geoLz@kn=aw!J_LKZu4O{Iqzx=xSt$%sSJb{Fvo1(vPD&wRfIoLCiS zdcB!^{1*0%sF~e(KWLQxT|EMPX?bEGVAafnp+{A9&b(l_~BP|JmrQ`M7xz3b%)){)M=|hWmON%(CqHxmJxuUCs7Fi1=P;SszG8E50Mms8@oj z$4BmuIbU;tECBx!!0#5#Y@FPg2Y8NFwq3@HOE4HEWm9a;y`Nsx0?F+PF}|FIK(o{u9) zuE46bc_E5C&1)k)m&M2R%mKT|FA?u(HpMtXbU{ap@B(i1c?bRRg2)MGi2OTZZvV%J zH#zIhow!+L!rfkR-{FrlH$3Q=j^SxG$0*4bBLU|XoqkRg>Bc>M-Q^oMoIFo=(|-Fi zJ68`k{O^1>(q@_S!qA#eej~2ir0lcoYkso$|M~k|qnz#%?f{HGk~fKQ+<|Us?26=JP{uqW@=kxBuv&Ul&me4pjALtQFy!aER9UG);CZ z*`F)+HeA;--b}xBR<`UBsS#G-527D%V3#<@?j&2TS-;=-Zc4ZxIe2_C{SH5oTdx>S9x+x@{fs4N;_E%{otKCgCn zyS)#!7e!&~M~olrFv3q$fv5u485qPlD1LFCLCcPuhLDyWPhB3?M1+$uEDT4MZ`&AG zyAO^RbH}`(do9ZJ#1(-UCo^W@Ys+;|Dd{#W1P{4%72{uQ4X^W(nzhrPlBV9N441T6oUkCL^sh zXI@neM=x=x>K_Ki5N1cxVkGQ};#DNgwf(86nZjY3ZYi12h=B9x)$zxqFm6KDH6S&0~b4F3P5e`PBD;@*c?)sXWIE{WBgz1YkFyPq2+Gv zsfOop6;>g^#mR(uHwhi<}iv!W;lFZs<%PWWnZ>E<8mG&%2i zq2~fEJM;{G;w;n8t2eAYD1ThKXZ5118;2m0m3C5!vb4Lf8E8F82p z80EQ*4R2Qj(31NMhxPa=@@nNF(o+{n{v-w2^L2NUfnItnG1|pBoP5s=SB7k_u5NTb z)F4&#v)*z^<4i>>ca>-CAOSDcgei~}E0m_BxHqw!cT!I2h)0*4PqSElNk z=GLz(?u)HxOwJn(O&e)+db9hLTwxsekm3UEk~fx=w$sarf5$KI-x;k0jpRn#+gLRs z0D{%rVkVQ`Oh7b$tk?pkkXG7%AbV9Luw%nF6i`uqNv#GCUC!0$lD&`^9^DOZ(N+m8 zVZ^^loV!kqt)e)@${;-x#v#xx5V&E={5o`nFE~H@&$29H#;-Qb*gTOiaT zNnVHK9cUK@D6z9H7{o3Yx$x#{o2ZK!BJ#whQX?INxI!cFDAjCx%d>}gr@&y0Q?z2y zAPJ;8C~(Tbg9^xw;l>Jab%|JX1Xq8rhWE{7h-bs3qyn9X+)xuIt0H)`{I+-WI|K|kakiiK<-46 zKa&U}rL4B!@KGw%`gk8VOO5t>q%BTxs)1NEe2$$adK0xBq6wm1vG5h!uE9(H@z2ns z7Z=2hYJQo?_Ew32lt+}$1+9)sD}4d+gG`oolXEr4;Z6xHl0jv!^8z=sG*rUn4MZH=Kng4i ziUWXc>$BN%9tKSXPm7uhnYLc3DB*m_$yAWfg_FwtM?HrlY7S_3T&fnskf6UW8^VTT zuGp=H1iaxndd)KRYeQPytKT*R?!{j->wiF99=j<1VgWdhW5W~)futqgUIyKe{L^PZ z6eI4x$p}bcFnQI*!Y<2+g~34aWw@QXv*E|EaJa-|!rN*FIx_>9VHUwZr*ltIf8ga=4Xly5V`-HtYVj5MSGJhqwu*N%mQhav6bSfEFH^u2g``} zykp8TrvAh-N>H6o2lA_^`DRoF{RK&9)LJXJkrAOO7`5A9ClEyo7THhoMOZZwd+0Cn zu*QzWu4Vo?pmv(Xn1h|YLB0DurnA7h! z7rkmJbvNaXS&Uaq%qRERPs!l{TjfHe4wZac8{Q0e_M1nU&FY@ZVVZh@6I5adJi&K@5I(7Rf|xyp!jFU zi1*!`prjAhtHM#LB%j2tI*-Hi2N%-uS2-pw0%LZZE)%vf{T6(gk_O?+cI5do1p3vO za^5kg?Ge^&`mwCp`LJfsS%LSgX}d*zYdNWCOJnFfQ?Myye0^7bzRKo+^I9X-e9UPt9u66|FPenP z#4|n^2cB=DV%Pb`WA95;9CjvD(kng?dkB+myHv~|vC8DC(P{gg_p>r-dv6nl2kZ{4 zegwOW*d6{|pU{$IN9kg_DUaFcw5ns9NPRjh1OtA6$|5E?6}~51Jo&hUF?)T)c^E!I z*~+wM1X|=s8Lbv#J$fl@cid7|6z;fXYPnR}UXhZaCJqt$xVR6ckwq#gNfUDc<7UQ9 z&OFIq@S1e5Ly$%540hGAO*|8I>xaeh>7Zh&r!_@irJ4CW%k7*V+yg8Xv}N3OpOP%h ztGx^h0MFXe>YkhPg6j5T=l8;W}n@26OtuPvFNW`+7 zA?1V**?;M&LLTx~Uf{{2Nfp+>yvX=KwhfIuTBonRV+Mz+hL*-!z$Z~9dKG0*w?>@m zh;u7wy{x>a0j7nm+znfdGH1JcBv_hs>@`!&y-CzO~~6^LINaeh_-a82j_ zN$f@h*Oev8}NRmUCn@CZQij$414e zn1Lb7_<5u%7=JxmdU#Xz#gHc+!;y&pOQVA!aFA-E3QE`ANC#!{a>;usbw`Z*V89x! z;)wGT*;nc&T5dH~c{f{B4@NfHvJt`{95tn}%i`@yZ;{n-)pz2LRc;6G#`lU~A2NJ%No%ry;(=Df{ zOVc3y&k#GggU=B@H;Kj53FGC4IucJWhA2I#d8tuq!5Pt@ch15Rfq&*#YK>{?w2K=V z)MGPWZ`EHrIMX(fUtpR1blR8j;n@_zeNOZl*<00`G8Cxk6U)krdK%bUiDi{VxcwIy z-~PFJiHc|EgoH#ToTce${zk}mwEs~B9jRJaYdTek~r_r$glKR#-S@ zq%+mlBfv@A$BL|J`(zyBp)oRwrrx;_;zsA1Q>^q`l^j>sd;)idg`A&G!%3kIb0U6_ zla3$R)%HSIBgSW%$uElzF>#~>=bIfOd`uLrz^R&uBb2?Ww@6|qSamFE*IX8>_7NO1 zEb^)^=Xt4v&7aN@pyO>iw#uwA=A2QCmQQqrk!m82Bs;FjX+i92I)S&6c7m#Tzhzx@F~<;044l?__Bg@49*=Pf1qLdKwrg#Ny z`oo=D6dKBu?P&T z+@6F+qP2Qljv9YyMIO+M6kazL+Hea?hvi&@rr}y-j%%u|Y0M0P?fbgrz3I-kva zPQ5@K3lZ0(($d0_=FbW7?zYv8(Zw`wY#_JJtc^?0r?bsh_3)ik$v16B4v3K`{q z4FvW#b^wUQTg+p`b-@}jGt91l_+xv6$1U=X6a{O>Hw$`|_r=X}TH{EYc$6=eJ@f+2A4)9sY=RrO}r1kyTQ`~QS zg2zsyF;sP=(Vc&b`;A)(*Q$(6crHwwC|+JpD^pAyDkZ-~C_PxLl})|bl5lORq4lU8 zh|l&>i$LGzOLJ7iQ@J%4$bAL1c*P_)2e-=WGQSWACg<1H?xx}zuhR%hAj9;t#VcdjQ7qpjp4TZ#Am%^?l93C1k=-47*OrLEyCD zAOBjZaw}e|G#4pa(Niy(m@s&b_U#gk5pkY<4wT=MG=0gX!1q-zELvRXh=PuhNNMp9 zortX#$Pf91NoDgu?WYW;##&+qO`Ciw#?OuTJ1C*R>yez5)Tg3JdEBpG`sYl%Ic+@w z8)l-XqWM-0J(X0!y}Htxc};nIvN8*~cUSm&a+`39+zK$V69$?p$w{Ii^|t)$QccJ) zv zsNw&I+-rPihge$i#N3o>tlJTro~K&m!HRu`RIufyfbTP!7sIkf*q{Oi$EWy}ZJZap zd~T4hJ5eAj!je0Mm80=t;1D65fAgeV)Bx)P=GeXujnam>tJ$5e`g$JH!w~rqPl5Dc zd|#w~J!f?**ct_NwI76Qe;2L)Lxb@h(miVCh@W?y0|NIENmLiam90*?Q{(Ij9{{~x z#be+=_Ec#ydt+l=up?|Ey~@@71WKxgB0?e3?}E^g16JMZW?l3>icMu!3jrSMpR6XV z2q|YRW@%-D5`~nQrBOynZ7E5ni>1Li8N1DNW>yzDc}-oUR_y<@^hO!Eox1u?+l#xX~fV374Jbkjc;4NR5T=yRYB>S8R}^}|Nu zS5kkQSRvF3MgzsH-}a(<=O6puT^GTwkoc%Q9aL$Xw} zCasQY9JzNzk~0DlEtfb?^{o;k!a!|_sNB5d=fzaGN` zbq&0d2;^-)W^sjSf) zHaK!4?+{$Jen?*>&g(v8p}fb|akkk4^0HP`QiyF7h_19Ai7#)tWBF~jw^+41%qRTR z`|J>_JD++#Wo;+*zRJ9BTTs&E10o7XoKr>J%E1qZEI!|G&JMzH;^ygq2ra%!zn{3d zfnR6`liy%-!>#$w3*Ht+-6cVrN;Br|24^RviWGcZ5~UWYzpcw?`%oZN|B;cfB^^Bp znPd$l^`AQnL>V>O#P`Yy^hWEy8jR2MfRc*At7x@=(u?Xar>OHr$k_#(D|1jS!)>n< zOo%6Zcf18PBLa+!N8OivCO6B5AcfcSivKMF;d{-%LGofyHG0))pc`XRO$cA(z{y1D zSHj3iG8S=Qo4`0KAu##t;D-Mm7)@rS3O!{J*7m`@y)$ksraUYI%pr@%oZ8x6a<0~3 zcsw8E&_5OgS7f_QKy3SyrVd#TY!eX|;&KxUC@GQGzya+M{wOxXs{eJ%m!jliCb`Q3 zcik7Yl5|1h7RF#R9i~Ns7kQ_~Tb3}(4v~QDoVMK?nW7r6==C7+@F&&qFo=p0RP$8c zfq2|8sAHEU9twkA@?leedh2y6{%82`Ptj%!BI(T?3bO9}7@-2v5>#!UK#}K8+$mY+ z&Y6hm>K~pGO&EDYv#-IVa&LAeXj6uUPpAisVwX8H-XFUwlKf_+&jv)?n=2yjO4x&4 z15yr7N;THV35VTgz*fXY+g0G#UsuPU#GRZYs~qmbtSIZv_N1PbR?2x+7*;6zJ;+WM z9G=$N$(0RWD-9y@NHd=TFbceKeig!V*yHXzEzfO)HeMO*;ON8K4hps!*;0i*tIpta zWKSy2?HCrrhpos?+Q`Z(v@ev{aQBM}qOzsF%Wpj_uhHHCv)!iQx4BW9+Bm74v9|3t z+BfoB4uAKoN?8pFI$h2#rSIwT+nrP=A2~{69z$u&Cw)p|*7jQ6KBcj0`;f2eSU$@+ z&2otAc2<{1ZD%gr^xR4$h~Z-MCt(q2|Lnl>DW~&@@x*f7K0sj zN*;^Uzhfl!VAK$LM-J?0@*x;L_ocs|bLe0J(-73E zCJ)GF{b3`qly1HGFL2L1e}UV0zIye7L>0whoIj|Qm`5WCs2AuYOV4L${R`Y#=d1TG zaLzoReI>(mZ?l;h*%BPGCTNi9A<~{%_j%VccPj;$8j=EruRU~^wsOpNX5JO2i@yOE zoyi=H>U}Ey-`x8y2Q%ns85ca4{Y0ZPqVRV_5D}NZ93o!NW2;YDkeqb|k~B#@4isUN zPmE45?h)6D!$$d}FVaHX%fEFF7d&X6C6F{7g_5Q-wUS>jBYkojS^*nX^10`838wBR z4Qj_Pg>-yG>P8of{!U^ze;0$JdslS^3i)3pw(~%C93gjX3eV2&I|gv;E)T8I?G!F# zLg9KKPP#MA;M>{n=_3c0T*P9|VM!2BT4lKytiaz*tX+qsUQ_Y{rP@G8QUjA-G%>3V ztZx?VO|IXh#+RAH46K@0t@OL4O4L3DuQ&|`rjmVI1Z*@Q67A#dEaD&a2w?&>!Fv_n zyh}YJ3El7%d0fDvyBFV08p`2~u7k0Lw}{Sz&&_;}m_!};Blaaa_iip<&q=n18Gyb+ zj8{y+&aV}6+U~k@pN>t9f$~cKlYPdsIO`sgQ|FQEr;y24bbBo8=DiGJ#9&0U z*)jr9l4U{polI(2<}KObCsp;Vqy*yPYnL-P$op~BP`zbtR9zIz#p%s_g=^~Wj6mjA zb$^n6#r^sfCw1ThenNZsnLbacSWVT(G1KJTtiRL?(b86q$?MgvMfz9#srRt@&RLhm zhg*GzDfQ32+_RjS9)no$tU)-6dV=5p|It^aS6jKii;?|Lx_S$S$*Gz?R0cl;540#) zp&6q^LAWHmg~ii37UX|Z2yDiBa5sJwIX`e=xt`p_tMnu|dc0)Q>Y7@AX`&=~q}1ek zg!%EhZO&(3j}P@&gn;WrrAl=>XACeU8S{S3OX@+3GF_pbc|q`b9yS2%0*S9y^5drJ zC{?-&#)kiIesN?J-is1Pi(AC1Kk?i8RD^yO3DYXQoHZM-47_#JF1?5D{E_Ge2S1F1EgRm!H~u( zU@xwD9x;W*gy$Sb?JkS=1qsTC{vDeRW&~=;TU66qImocFfO=y?=A7C zAT9?j2L%~l&_3`6zNCaVupG#><&;(d`AQ)?xe#BmO==)}u|FuA$%hZbMe%483UAId zjPIoHIFned*qOM+LoCq)x>s`~FDTc5J6-OL!;z>jJ2A9zZt(IsL6!Ln{mUdJ7|fhg zp)RBbDT8sNc83$S?P0U#8CH^V=tyYVO~u^YE|JU!g|Xjkr;Q(_szs?)7{TCIcMHM} zH9GC<=K|8-vJHSjFWZ!Gqe8bUzpqLYHZTX~3(?=|9yA90^49cjHKNgVJ}xL2}R#(piJ@J-%u67sMAq z^H^ny@F!ok(?&od_Z`Y*u1$v6OdyS zk&#X{zX<#HIkV&e@kVGa4&4-bIDq!GKQ=d_Gr{^Kj%JOD;vCNYx}bTq{*SR~$2EcjiTA9B%ua(e{jh0KsN&7X7!V z&+ux0qfGRsN(qCXf4Cc0cg%ds2}QieUXnx#+H*l6WW-gnFpeVn6cQZ*ToOGT+ma^I z3zj?GGTLE|KEuemBgwA?2O_rc)>8fhqXJ;*i(O(R-U%4@l!1Bt?l9}a-A3XhenCVy zr%2AB20$kwzAKtXR1edp(gL^<-^7X|j}0iaWBz+HB$E4r%0p9nC!-K044EGArT(up z3SGO|zRolr?@PRQ1&GtF0tOFhTnd2j44}mGJW(zpf=b3ck_nK(bPEa zuFQAae%Ft~y*2u*1l7XRI&WBe-$5j~EK&S}UBOb=29VfD?5F z;HQnY*H~yJZOYPPa*sNHj2g4wiPjGq_w*a;V8Id|w~{wh4Md4WETH0TsfZCiY`LV)5L39J4hi>4 zsO?oyNuFHT>(?t6;e1w_Mb) z-g)F-f=P4Z9ctYb9|ILg^aUcuhYX5)c@7Ga9{jfwYr)QogVIs8sXofvJ@(r zLqB%asN{tik%SuQK~1N`-lR_nPV;iUDvZ?UIVXvr2N#vZl33qagc?uRfKdQzllqq~ zdpA-a?=tS$3^y;NkR@gH;+rU70d1DzjpRjR<`{y0!VUc>}RXg7E;s z2#c2ZEqrufR>3Jmx}fRIm~1-hCUdR}VmYzNYypzD$u}GPl0Btx>OT}+uV2~+=_mUQ z+d`y3LBnw)@(s+4j2p7tiS)Zj*o{Tw2IUfDu!p~0l^K~lf<24CZl-u5Y#0RAFL4(Q z{9bkm>_=gwh> zOAMBu!UMu|wM{`MhBIB|11Oj;2eJSN=ekCB`4&6u3{bsL)@QH@Ekb59|I@263EV1J z4RX2URzob4{3*@vL5?z6k89Ndp;639x4uV(B3Tq!OQ~pcf<<8|*4gE`RVmM{N;!*? z_7~+r5N5MkzrH(WN{@vLBd|4rKg^~8jc;_}Ee>MJI97h*IMM8}G~ycp)H01~h2BN` z0GcgL*}~VWEeupXR7eRukJP+lQI{6JGE%~U=?o$N0ArPrsoHYy0(I`|U5tiCkAb&Co%KyzvKM!2*k>Mry`t*@F*<}w)p zx!BP$fnYf8IAlL`smHwl{EABUUC9h6MrR_LJ+2+8DbKazVny1d0KQQ7tHV3-8D=zF z)Q?yS{ue%BoW$aqBrJ;~2WfN*1e@Z+C?mq1kwAtkn><`qL&B~Qh&Nl#3v3g+3?nKF z(S?f(dmLoBGI>!YpPee%XUTH-iS=6$2wI+idlOb$@&9~bA|hevs0i6L470SV!2Acc zRH|)FUaK&=@3jMbZdOPuc$2(g92e|pDw2!^ShCx?VS9ecq*x-(beJwr_lb3jBa46_ zI9U=;;)=&96;Fxpo4A>|QLuo0>jGZn9<>6RDuFa|*1@{r^Z!Dq_4fg&k{MXsCqLyY z!$AMN-%NzDZ@ZKAL8x@|ru${)hw(w3f>#QWlFgR9p<;kqH?j{h3qWLHzdi_W4#eiG zlwLUXeJ^EvH?0ttn$6?{i%3Y6;vy(jO;{8qrpqG|7WH=^?6u^-amLGH1@;KBBlZY| zZKVDv5d?{yl_r#sXpjxNcAZlL^-OE!@p`gy+xM){0*b&^?7ikr3d74h?RTi8;O8{VZ2Mtwg{>gOZ>gu7bJr zQ?l6%d?ZmX&P(#Zx74kt)Z?1VaCWL6`ZTNC8OP-ramPE{c5=4;fn6pC8S%G;F)f5# ztU5zE8~|*wX!K&CSNPA(SNFe2*H${CvmQdeAw@QoxRtH6#v~2v-=$7Hsqo2Kl^)iaPU{ z&hL>c_!#EzWB9&9kX@tk8Irp3<2UMQ4Hs#TFMfCz4RQFnssjE?NGSZE@)Z#@HgKc_ zH?HB2L&yZ7udL%!kbHVBd*Iw^epcp)1c=|j1yhj^ek@c3g)d9;c}M3iqs6WKrl+}g zc-v*Itu-Y%JEvlyPy^M^3*vQ~%ASTq8ZaFkSQhn`=W{S<0b5fOXNOAkS_};eYJ$`| zyCMiqVIr?=zT>*u6!uN0|JV>UYNyi%`BS#?h?!i2kDAgBV-_Wpz+KCJxua5RTtFZ1 zU8tE}fXbo0exnTD1Pa%$GNR8EcJ~W{(P*%?=*G~+1y18d?7wiAd|@|-w{Y-wQfT_3 z-~y-gBJw{zRhfN~>nwtbXdud=8g%ALA6Gz0xgx*7}-S zzGtk?qEq-1Ii=iIZ|evj02EwVQ@+4mbY5_Q8#zz!Cn&bNJcTBMF8w`v{Hk}4>YGo|;vHy7pUzpcfK@rk)|>#kPTYYNm6vcF z_HzSQ=2VKOwg%$bdT820WLXn*@A`KF#&v`?}`t2DPlcV`|TXI75|-A zQa(BLw6f#1-~R`U)Y|Wg|4+5wquXu8@hNS&f|ZE=C(wR-;j1Uq$9Df|eXJ-?&73~A z;{^Ix`&fl6Gu8UoPB0qFn%R)o#}0BNh=i&1u_^INRp&_uRs%Ls*Xmkx@=G5lMfuooluBK72XU`Kgr0nX^S6ao2LR-%)M33z2A0 zP=Xg8BCWkNuV!5;yqFv~7&OJmNcz{S2M{X;{k9gO7kp$zcKfXUh$~uJ()gEiyY%)uL}b7{O@-vL{MBS2AC} zSD>nmqM@NL=b)%9?Lg)*Z~$nXv?8(nSZyszyh3d)hw{o)MI?}drzbZ=WMu~TSdvY8 zj!8HIAFF=#6txjonJ{xLg>_XbU0WG2HR>I!soi9*e5L|Lt7vKmVLDn-fo#@_TGUVl z%GxTetlfkVx!Fk6!-F;uwI@*a!5N-RT=xEK+=d=dg z)=Jtdld~>~*7p`FX`=x&DIdd#ps9$|91%KemWYNpDtg+Bg~t{J9m?zK9oaSFE%aNy;BmA_!6laQDaguus=*g;fHg^)>Cm3<+MOPbgnKJ$RICF9K`m7oG2KI z7Po9rYjN3td_#--15tNaHU9(K2hcdvRqr-iX^WaLU_#Vxy()Rj6@g4hl&MHj_1W07 zk(ui^#Sp#q`838Z=8a8i{TkNu620Pn12H_O%l*4@QDLbOQZ+h1K0Hg|LMyUALjHX4 zkD|rxxbKTffh*nv_2G`yXPFq1-JgiU!Pnz*hr5}nh05G+aJEBjb9|kS)!P0=T`r5~ z@xNn~xtkPZn$LJzcIcJBlusJ*ITIVCz!Eg^$qWuJ1PPd76!CqsEmZ z*=RcrbsH0eX_a)0CD4{-Q3Tx;FLny11xSK6($MmaC@vYI@Fm4LT*P9KAPNTuH}(ch zN2h37)Zo=Bse%#<%0(EK2BLm4o%`3yndC%URlDi-K`O37)ltd<%1wmes{7dZ^!JGAaX!Msti)-+pYp%FX60;-es@#R`VD_k|nt{HU>Xq#c@{w4- zS!t|e)0pgL31g?$$OQ3}~Vln+cgTSN0*Ad@O`d=7}>r;Yhy&q)eNw zi5R!?74|k2G|)yaQkq|-@Ey}NG;mP(p(9l8!)m(Z znQDKGbRvIR39Nb)x$gy(z-m3+rJb?Grj9YxW-AWKF`8h{NQ6RIQFB-MVVk~Q82^7E zuv!Z&3p9AKXo0U&4rL&tf__TQ7Z3W9QXYH-`X~9&U-@zl>{t8dbFCm30BLLi8aZMy z05^^hIj2 z(ZDeF&u}VIBD)iw;fMmMq}_-AS;%-$!nynhilW@b(cDU;22t)-WJ#627&kQ(yq$8Y z^@e5Z7iFrHJqoKQWy2VCpK(uIZYS|pSAe`reqqQLlRWQTIaFa^m8`nV3g9qu1O;z= z^J+& zWo}B8xiUX7+By=93KzLDjg&)nd{O1%tPi*8A)Oipv?)Mz?8>)D`ykrfEuzf@Pr`lZ zudDgo#9>?=DY>l+cC3?=v?Wai1Q|B`zXXeT?jKPOk1)q7iV3Z(6P5+Rup;|Q9^4#F zetpnf8SZCvOToZfN(O-g%q(n>(pE`|NHnV-|7{hth*M?tIl49VOsgd!f z@q{|2p)0nabVfFwOj8OE#Aaz-Zr0P~Vsq<~OF(0ZSjKc>z0)D-CbMISY zO}|$!RAH3ENWRShIBJ=UR-#)v$QJK=tSYGLD6W1$hOQl~GUoSUR( zr;yW(@>)7HJbQ*e=SR*0*77flL+PdR#eAefK4ksTOVQBK#N;w_OR(w-QxVJfZBB7+K{T8~2u~N){dq?joo_cO~zVKT*?6 z5A`%w)diaD5V<}Z0!29)x|QRN1?zwaXdsJkXEDdWBoiaI6U;08jF_2v0ZsE4JqZT_ zWVBzan(fz4Nv{gz^opsDB#9&@r%{A7xh3X2?#leV#YD9Ww6VOs;ca#@-(9 z^SS)6oxdgUr?iiP^Uo(TmbQ;M&^ll;^4@yR;%-GRZUaPSLV1Y;i^nxrsU1)p zPZkwHnddqfkDPwLLnA!_3lb{S==7~sA`yrI#$oN z7)QA_;(yw{&W!c5>V^Q}dbyOup+-3O9M9dleiL=Sr%=4=e7Ai~Dha4$I-jBU}UCP-XKCCpOVn!v$)TOY8TxxT|_`)`3?`t=}U49-Q| zH0uu-Z3Airkf{Zx?gM@FjXtDbs7BfrGs-BwQL#(s*H4)ltGTlNYb4tF%zSs<%%Fm% zmQ(ZSAnQ~q@4>>BMHL?2qTIj#LtY{dcTQ4HQ|u^$AEZ1HQN+`mvEY&e*i1gGI9;9~ z{|QPDkA^Xm&P)>V@~@k8en^=j-Z5*Ek;u}cDAPzyPhXbtug^;N#yxwuZcPA9{^?nv zrxcr#x6%apN3>enYr-2w=42Uys%Z6&zq$qQ8WtWi`GA_pi7YR0e8Eu9xT0($)5!Hr z`fs?@ewlK%tSca9E8!+w+l#CMj$J^n!wisU-Gh_DMx^Rv5_@zN^E58#&VlT|%f%}JO>|E}dF zmSTZDf)gcfLJZy5I=OA%+A>O2Wp58T{h`Fb*%(j190(;|yQ1~OS69#CmsK1}zcwzE zICMpL!rs;ohgMxiixQfS52Xh_5lSB#N8`o`Pd853LB4;xXmU}E1jy;q?5FuZ&kl?W zPv~!Sc3>w;q)YfcF+3sN=sca+(UbU)AS)px*rQIOl!%(_4BswA0w+9iNj^bc;ZOI> zBWKZMW9zuY$i=a;#K?v5Nn8qa1v2+CkBubipLHQc{IEatk$zT{O6ZpifPpleA{92t z58F~rWE!^v{jo1IuhP>(i4;>FnXqPSWM$t;jZP|p_HA@W_9d(PBw1Mg;b$gBoWRqu zPg}zSvyH7&PPyaLi5>lk4^L`ob@o}*_zLv5{2H?=G24`&8*eY&*}9{@^}~~l#Endh zF&1YO-y_-E;U}(DY7h*v=pBr0*H++(R8ES;_@~LaICqHLiT%U-ny`(VWks^H2nZ*S zfA&REERuP0$F%)T&YB8fSQe>CnWK!2UNP-0l{5{?;79(W*me3Ha57`xarUwA*pOCO zk2P3ca&XK`$UJVX?4M$e_Axb3t8wz%>Mg48#M=#Ka&DlN(s<{f%*Hl2h|7l9Ic#O< zn2T`7a`#SGD@w^2v3n;)yu1=wL)pGn>wIIqHxj!Vjx{R_)@yfj&#aW^-gc>!nMND+ zIoSzI`z`m=Ol5CfxxvVSdLuXBT&wYfaglqR5o^9NI=7m6n z!XB}mQZ9=;o-9y|8d6KQAf2QloRj=OGXi@QG9F7u5R0baGlxwT1xZbhc##QBAZbU` z*`sDa{O5bZ07y2;5Sfu1r%~t!FOVZbpmcdbW8SI;3pZwS^k}@ z-!$VfP*J@LYXQTf5}4eG*GO_@=e;bcV}`)YtCC-vT5ge7)SC9JbQ{4*6#UPe1LDy) zDKSc6h3<-1iBGCkgNIMDfh3vfxgAv{jUBg~Ohh&AKWaJ$!6#N+i^9rRj)V*)%#QVP z%n{L{@Hr$ongmM5{V7FN@=UswTwTcls^gC`tH51mR>HVb;B87qq7rRvQs^VTIyL*v z{m(d6!f`yB2|+2jvn%|B4$>~iI{AxBHaVk z>aMI4ClAvpK@!AXax+2Ab(!l_lhxBB6c2*kQ0s5m$<@n564Jl?kmsaIVXCfi7Rc#_ z{S%$YHPz}`$o>8%25Kf%My=*$q>K?}{P2U$!eyD)xI=J?Z%h?+X5IM*mM%4Q}%H1OA%%`)B^@_!HCsY}6S6Eay0}G4G*Z>*UB0qF&fEmDuU46|e2kjY_pjW`pFlfk^VU zEu>I|Z%3d`dC0P!7hwT(my_Y)vz9Kg>8Wjo4~X+3{!LNBcQ*7(1e$T*cdN zK_ym^YW92GF+zEM*7-@Je=V4G;@DX)-_ksVStE4jW<9G)&-!asO#3`5xfsQ`=HD!4 zy>fU;B!CQ{YG<%#}NFlm06(r?5|zCCu+rtfFL@mLTbw7y0uvJ>IKZ~L&fz$KomPBE~1~@H02NFz~D-WMWW_Aab3BB!V0_S3PhEa=z z$Yi;yDn7o^T~r^)o~}L`-5csBHDVTt@P*V)OS>EGjc3+}-LHOv!JXFV-j-^_JrPXp zMu*VX*fH_)#*P~<4>UT9E-%(jm66NGHNq!1I+4pyX>@M6{1b2ur)ArG&5hn_)yE*- zpUGK9{HOcpla~2pKs!}N-1Eq|-Bu-$z@5R^sq9hQY$$gXTy;jM)t+7yJGJ&@Oxt5! zU-0UKEtINTS3qlJXjjeYU8{6s;gEgKddOyZ{NQ7D`sF*#V#tI$3s**>mZSPs5 zZ60_3-1D&)Gw0Eyv)E`qlTYXcyPjyZ#9hQBx1Y=Rxlj-51E%bCTfB%a=`7I?o&zty@Z_p@?` zie3jAKIjR=bl_^XOidjDeh|bk-L+7yJ1RXbo-)U&`?5^-u5uMGsLE#;ZQlo~UdLmY zNbgx~8`LFwR!fN745@iHvhu6tlW~Jq^%t)B zAbcPYI}4==_2nNkMG9U(#=*r;kn|G<5YNYK&<+2Rdq`~IM|pm7G`aj;ywA2u!g)TQ z_%5G3!Ja*$Pz!AS7fghj?>&|r`Ru1u&$T6+-&>KDZ=5Fn6YP=G`F&b6`Bhy0hJ95P zy&V#+;QmyOs~JO;5cQcfyfx=WR~I zO$on2@cZ`$_eH0@^Z)YpF7R>Hb>4rbO(6x!1Sk-YOMnVNKvM)s zEJ%hn?HQPXDpU|DbVUlLUMih|DwLBl3FLHkp6x!nb-TL{yK$9gyZfxqmcQE)&_dEe z8qmd{Sn8Fc2ptDCT%@6B^M8N7zjJ0LX}GwLYhSPQoH^%re%J5s`}^L%#t5AawZ08b z1NeWsevC#`JBqYs;vf$&>s^p4Z!rCmZT5mD?wdF* z?iO?q2>LEv^;^WdesksgDO1vsp?_Jspo3n?*BoJOIUu&rt3Jc|rQAc033I%I%OxQedb;Sn@^Nh*KoO_$kga$?j-J}{i11l|a#{Ix43TGZIkyf6sd zMP*gH8yN6qYlP$FXd34k)Z6uGiV%4R#XUKGQR1X2-H4=a11tb}+BTUul?``Zv>dY6 zKA8!E@fNu*VaX-*io@AVNb4{xMO=0+vUz<9(3mS)O$Pk{8Xn32Rl`|)xZighV?FKv z%od2W!T2((j#8(13BqG@xM%BA@|u-y(78Ay^ViHGXv}MwBa_Q^9EQ2qVacgzZN+QQ z6oxeHE=nk$7%bspA1WlmhYk7jO z013Y*EZh^8B~hR4A;ieRK=!}{c_R3PO4kX7l*doknmAffKCyQ_e{IizE5XbJ+A~7- zY%JsF-bfYhm?EzRZK$!3|3Ykorhk~kI6JX(+kWe%AT~Dv2pO8%;ntbZ-=j#R;U3 zs0gGh+~4XKg~Pl89#IAV?mntbK`5p^bzOZg_i1$LO8pgk5_=1hux*i|B1NoBB&I1e z`FK#lq+SO1dR-G4`<02{Jjo3#=enMW8bbEDglot^ z2irM+jNAU8*?zg$+H(qZd>!vPRnMfomi0)`?SwFhR|hJ(0B<%5n<~lB0s7?nS|mfm zW4kzn=`Y=|-q_5F2!9k?p5lncS-7=%_K$qb(P9Lj5;^Qbq}> z8Tp-s9emsVVSiZNKWUeAj6@UOeWmpY$twzdC?jI$=Hz?BP=v6+f0DnxpF*Xd;<#bw zHX>W#Z)al7Uub{#q`%Ldc71a7cHxnp^bWknER}$BtXBMn)@|{w$jIm_zm z2nG&HKb<*RBe?ey-u?FG0yuJ#JHXt1>m>}ibv=5qjgh_$y$FH2*a@?8OOS*oPA@f`NhD%!U zwaT7PgiU!`ZBjuxy1@o3rQwrwsdT&qe6fqMMxqGS`;~?I|9B7ZG?h5^Ev!ayv8$pC z!Z#ZTzbRli*q(Xn1OOfnAjlRl^sR}Y*e^p$_5;bnV#MQv0%ahDLV^|t%D}N>r_r7t zTEej17QT3ZK-i$V4Q&nwfDl{N0kHN6?D(dlFg%67JNPsD6k#_6lYIVtDY$Fj)OaqQ3C2!Y4*Q^_C)gtDTSHPQ}hhnY(4o57W8b+4XFN(dtC#1=*i+t~#ly3Ilq!5pm^AUQo|?sh zqYxf&zo8g@{mNH;?CUYZOvi||w0JoC1KS3t??k`8!4S5@kn+QDIcVy1vaNnZqpF%^ zj<-IJw?to9G4e00=dAmo86*c>@uT#`roV72;Qcq60p?g1V$he694CZgf62ycvcD>Q zp!31?x-~n9OcS;**x;~ZkKf*TMT%~&W}(%Mt110 zZrK@*@{Zm77_lEEk{jFsNib@)j9D!LwPO*oSWU;5-lGzHu*=bZ1QE1*I)EK9Ms|nt zGIJ zk^yb+K=~o@Jt4U~UPBlVr#cy2h~fi|LGi9GgQ&h0YD^58e`RwrxV1$Z`KJhEm@1r= zrJcy~ea^khsVUwyTWy25gaCE8ly`^l+DyI7LF3kBwu|nbAm~dznY=!=jy@O1o<%y= zR6~rL+{*fz>`@Tw_}?Dvd6~5x^;bb*edk`3)|Yjhtb4{*Q<}@1P~n@C9Me>cl-=0; z8Nn6mrO=L_5mjQi8+*~$+MkML!Q{_Gb3Enhu|-3^&W=thLD|!Xxd59TW8AV0-&!7R z;L-ZZqh3`Z|NF4TLb}HQ1`I~+;GMVIWE^Ebqrs`HItXKvTjg0~O*;hW_Nn+>bXuQ*T6*gDTIeIR5zN1+BT!shRrRXsvQe-qvPKl?byQ-ge&BQsZZUFLwkC z&TWCjoFopKS(Zvg8s9v>70|SRv5}H6F*v^^mfSAeCU(KnMsV2tCh!>BYJMAn5HB%! z*DkF+&X{dp{&0}>24fc;Kj)Ln+NXIwd)ysqKegqF|Gw)&f;@xKUSRlOJ=DF}ou=a%+-(cI9wY156tOR@z zBT_FpFH;mAoD1O~8NfpRmUD!HT7$VQxGgoCat3}K7ecE2oB6pXLjt7ow>8m5GoltMF%Ah-SVONnYOjNqvV~ABY&FicYm0Y@ z70O-TSi|8RX{Z4&LG{NGHP4c^P=*HDf% zAfxsrn2+bgNbuADAom(C_icQ+Quudp?#i0HO15`u&I6-{S&;W~>&WW4=kRi4e(w1} z`&Z}Xm$fm(+vXu1@|aFwcV4IwB@1Uv5*m|b+PYlDe9*B~gIEBnDj$X0Q~51Iwux|e zXc=SKIaHY*T$&gd0D{^(l_4(-VTb7<(K70j)1OFAAM7~p>WwEL4kC#74H&RJm0$JM z(k#9jtV6)D5v85Uy`bLOG4IZ2JA*wsWhoDvrq23U%Js~T(WOhL1b5V?f?L>oOY0F8 zV*1k_?3)*MiU{At3|3&68#b2SYv6{VD0)u2&F!5?5K8f`*R>oIQX;MsApqp-^k=C&f~+nCe(h&IOsY8d zD%N%h<{mf6WsYrESrGiXw8gEn#IKxw{!|1E>Z+f&zMMZLXc!P-IQg8{g@ zn%G{$eyVv$nFk*{us$?x&5`G`HFbTI*nxzo`4z|_)v>ut02Lu1Zs}F`E^Zk<(UJB| z&7NAkkIJks^Za}Z8o|b$#9(_3a)!jUj8ES&6;@MF7}c-9Y%-$4Mz05E z*Gqz2SwXS3z;6r$ZMDheIV(@&M*GRU3G;lVlZJ|q{0{zaUWjVdBGxn#le(Hp50t+u z%~hw+%dj`>vSF~MmS1bV?KO66OtrX{ssecqiL63$VPA zF4mLlWw_8hqg<*Om!)ej_4kgA{S)@4gZ$ma{TWYLC$cOj>rS6I;y9nl=!&H||X zzy$EsS$;c>-I|(Ja`5_UlE-R1MNV=geMikpwnOI zs&A~Wo|?}D^&TwL8+R{IFISgfG+CKu!GF2O8mAx1N1bdGVLIJ_UOS*;YT}yGES#9L z2(s>IfIvF%j#k$9niBDGZgHJP$%M-Qd9!%pG#koC3WPCV*r8l*yoxDP!X%0<%q+%h&{fMZ4nU+>Ww5E zUhDR3J2A|c)}u{L=C6WHy@`{L0CCvSwa4#I9Gf5{ z80ws6Bs(C%$PX&9rgql(M`dr9h=lXSz5S)Ms4{?HE+du%)A1%lqtDo^ivCDRqv+Kd$TIrMR}(!JvO29uWPv{#`qh{Qq905qXok4x{^2}c3C5gi^H7dp?j@EnNJc1xG#GnvOw*wQ0#2qFkA9*pX`tl*urGw z9!qPJvS1XhK&eD+sl$R)P}mf%u05i&48PyKwk<0lt2zNJ|8O-!a1-x=z>Pp)A8P2N z@&E1Xxq`addr9~WId_L3@l$9)(i>1Gf9%+K!EZvR7HJqHz`_I>Fx+$#eYFY0B5v=z zpqL1pz^HxAp^47dkBWEq8vlVxkb+2!ZxWUx8sk7J;#QU;Hi&E=_Dd zVETvfZZAH|Qd6v8!)c(HxM*z)?Z<#hn4TP>gy5SyK9Jw>ss+>{hHS#=@5+&Skc z4nqdL~e;cG2!)#6KnqWPaaHrr954kdw+T(Eb}8@JxKG|29* zwyc52q;@D-6?mRq7KuS*oFD}%q)Qr0mq(@~h-R@bn7JCaK9iM=J&}D8NZJVz3r=JF zDi|pZji+raA1P%*#2art&;WhVSVb2v%3UZN z!dkE5)Y;h@%aZ%beVHXhzOc&+FjiD5WyK!Y z6J`aN{aB*&Lw-$y!zJE6fO&Ks`n)F*Ua#K!F#x44{#S#u$GZF5;_J32`oy=TTDQjM z?Fsg@b?%9g>lPF9VLoi@nIl?9%b9zmxhys^a!>ib8$;gK*-UtWZ4sGFc!4MRt1{i8 z;c?Quj#<|+*%Ox5*@aMkB#AFj;WDuDqTNZ-cnHB4%(K;VmsB`S(Z!ah^8e#nCo4BwR72p3f=|MSg=r(B_DX^OLI>3Up(!Zhbt>D z^OsQgSs>pr?ljvM)TyE9sX|e1U(j$gkD>+|Lt4=UeqR1iX$P+M9tPRzpN|HvF-00m z1QTDFn+yh$d!9^nemQ z!A3AQXen&*!V>-e8g{%Kr(O zYQEX}{^5GFDES#Y!tM1)+OmCPA8vwV-WZvf7hj6Tez=ax{5R^|m>d3(F;@>+_FpE% z|D%psjKQR1MpC7vvmw{%-p@}uW)X6P4~9l{ru7eWG44LC6X8qmJ2Z2UmJ!Gt!;5gd z1zw2U!`;~z5)h$~U1E31@4F%P8IZKS&BdQxJhlYYXj$;>nFR(z z?G!#LWa^+Khr9=Em9+Zt1w;(qJ8cELY=#ZB_khf6qG23QEBf^XInvR&3YQCVYc%9$ z2x?7T=Rkeu>kYSJRpdYR;8@LAEdG_pSDZ8O?9>R&$0dx`j;Fyy)Z2xpdFs{ZlZ&%j@= z@TcpW{XNgS@MLa`Z)Uz`%-7C{xY(+LG(0amPAnd4dxyE0&-q)W^=m1{DsQS^oLtm! z2uZ~`FzP`!7Sg*XjCvgIFaDj1vnX#{-gkgn`phI9J*#xfBu|ekEt%x$yGj?oqxM{L zmBsP5O;Xu{s{zMGNQ|Xxw?X%IGR24TcL9Gt=C?Rmam2FE(X#xOXSM{Pk${pdl@Gn# zg|Y0hXc{?HVIdS%M>cbY;SQ@WY5qA$C0QbITb47^DuABoT1P?ipUI-pDo~xK2UF8BV-{Kz?!y0 z_6?nX$cj^OWqjcO;GP@*$^hXX9l;pCzcx|29R6|&@z2gEzM=Z^Uv!c+gsLu^Qh-0) zrfG=dkiph5%MXZo2*YrYrCp9XTWuXBhW%*#{_aC4gvJE@^QvA11iR^)5$2(D5>|HD zb>7;5-nkK7$PSD@7c?dO!3FOj5$2<%Yb}7mXVATTrk8WF4-RgqAJmqzvsQW!TKYzSZ4}so+ zm@q0bCzVcyNVe&Og_LOE{96IP6TY%hF9ZOkP-Tb>-sz)El(IZ=*bKT|t2mqEgr)jQ zRj+;+Tw|*##(9)%~vN}qzsE(*h`nkcD(oQ>lDk-z7hm2W6>v>Aq z<~D9-NqvmB?7y~1sE zCNL?@C^L$kiZtV!L67>%DqxE3ESMkxR=?OwpIM6uA|TadYAtv)OO6GR4tZLFS~Cfa zZPQo2DppgbLaL-p6o`?TP_NH`+*16JD}IOd`XOR@iyj-x%QRSiA%h=fKqIvfmfbyb z5wnFZOt$CXq8R#|13!O4RYV^JbHA3|C0ea5+67pQ&xidGnX{hWIeVh>g9GjB!l= z6d|O&RtAdQyFaHAKGA;691{tpLnVq~Df>)`EDa3EAAyON9+eH(o0UUikCNP@Xw~Uc z2`o^BhguJn|5fWjsD=~VCF=S!QyYgIKnW-1wkrMv0R=eDTA+dI;AYMr!x(%2nF1~1 zUL_CMRN=Ej=B4Z6;$WJ)pra*m4Y1yen=lJXy zSW1dTpJu<`;e%@J8A54B@>VX>P!8XBb`Ka|Nv?D&y?Q!w-6CLm-v-tzRXArVO77*( z;4-q2fz$X75lvgjM}_HfeDhph(LQ$}+1kdtA9u6>w@(5fJlrk=Q2(pR z!b-;Rq@6b0FSmQRx`%BvG2r(}o7D;H9ASdU(zOPycqOf;R?Fi4qwaeWR>2Z`PJi!| znhA+LbN<-HH(xGyjFw1Gj85_UME*bl9A@$alVkiekPLoc;K;;=;#!-TUvtQ~h~<$b zn^756HF$+}JINHRc{%)@0Wwp z^dV8qbF*5SBge}zGdvRfAv&dIMpRbjle*Dhw2qFvenhB^k}W2!~Mm5^ro9 zp><17jsGgy`jgDNtG@6npFn`RPj*VuR65*swPaydX-^`2oE6YbtzEISbBoraCNp0< zP|4A9Z$zQb`FMkeGZ(vv^5__pZ0xP#pPM*MwhU54RMJ&G!xUM%O4-eOVY*7>Y|Hvv z3&vced_cg(LP%U zgWd~_D-1d@&0!X#Qr~BbtuW{$KWyJ%6Ur&48in`si#ja``unsglFP=Z#1!$qV%-T$ z6!m9Y`Ad+evJf!G=AWe6(CWmy1QY~oBV1-V5W0kNgjs8|foo0D>>uo1(;L&vUTBdy zPCE7?DJuz!{v!Dam@L$PmRP{frJ{q51X~ zU=Zx6fBu!P5@+rl4iv>xZBf{BU}gaM%r#Soh|No1r z<60({vQqs@#t8lNXiMqqDWaVZvF=1W|0&fobf46AX1#$~V-I`(wxQ_qV2OUIt#)3#Lb zy%h_vbxA28<6i3znX!0aw1YeN0bq{0M9ZVubF3s#TYiyfCK*cm@6v()dg`V5;5K*RxZ4QYf{u?kYY!MPm1y8*4)iHGBie(OfuVuh}1YDB{FpB`i$&01e zr6Os>KVn_3G)d@w2blnciZ%ltXpy8tPom-MpNT2fQ98zA0R z5Fkcqth!=+$cDQ5g@l#xGP&$`;NnH6mY4^L>A zf`8U9-Dl}&bv!Vw@DJ?gN8Pk;w?RTy$2V`aY320z2DPr`^zWBPA18{YZ|bVys3Z}h z?2zdp}zf1-{NuTcjA{~2~`5a=gDZU#gMTLTk4^62J3Wex&ms zP*frjqY%H#cD2ASoecbod?2IVkNNCC01xzY!_X~rfjH3*!6G)I>oC}d`!bhAJn~i- zj~oJBNreEKXVbw;wz|b11MnR!5LQTFo^jN(&KInefD}GM7;tY3iz)pN+bXcs0NV1W z^Fg{Zxoof{j5glmqK&VYJmm-UueY>}0c_*|eN+{smW@iA!WcR&)@B)Zh$vQvU zLfG*bHXB6uEL_21W3-or9#`lVMoT^u$HqLbiDd>iL`RMG>rcm@6Ux8rjtZh*-!K#& zW1NNx52(7;Ih(>V14PF+L?_N3h6Mp=JD&LbEteKPNlcPGJKdRsWy{u~;&sfDhWA?g z+F14=PCLey9x9zpkn!*G%O``+s6`szs^_3K4)zh7E>1FU+2b5u9H~0P1}K?58zYXE zbnCO((>Y@L7;@#{sm=?@N&`K1!iRe5FuFK+YNR^4xc}C96}|j<9Wg{3A0sUIRSt7h z<`0$SFWpX8HZ~1iyJ`Q&QP@CNr#2Z zRjJ?({&q3*@zwH^Op&>rV;dc1qx95Wf3D3K+_gcdMm9O22C;QZ^BX=SVYj7y%`e6G z*UBX4C^AP){O%v{Kd3a`b)wK4W~XX|0Hx5b2lS)nk9Qrw3qrPf`Ir|u!XacGM%4Wv zZ}d+;O~yLx&6&R|-gS-6A}41RzVdB$BxuEoe(5N(QeePYP8-}+BGBd!E}f!Ka7u$v zxNM4ALHjs3WZo&a)d4Kp?FUzhR~5BY#$a9_G7#@h7&cnkXe0Bl(cFxE8)Z4e z*9f1*`~Co2$_}NmT3U&BwNiu(r6$M40fCtn+~Z}(omn~A;wPN{WGs6w-ajA(X6JBy zIQAII`WDurnVr_)<;RZ>`&B$2GR;P~&iDYh zt-=Z$D`?FvW3sS-$-tieFp3tJQms7+rdqfv+Fg>)fA%JN_xGBDc-N2lpU!I-;y=M= zpiU?4@CpTcoKMu{S}}C^GDTC^VNw)w*Bu`m8;{y}u{UU{!Oj5L6acZQP4yLSt2Yx% zg34iERVR!q`&$Bzn1Fkngn%BQrR4m}G$wQZTd+x6_o{uvkZy44*7Ij&4*-8m!NN>o z5I0!|k%3Fgg#=|z=?mU^+^-lmAdYb+2nI21Un)3R>f%(;fwfLl>+IJ;+L0L|P-X3` z>{-ZvZG2YwBFICqnL~JPkkRCB`MKl;t*--w~CiW8eIp zhoX?uoh>ZC`Q6}n1X|Y8`#6)WH>6M|Pj%Xm2BS$+$+aPkJ*#AN9Zgqxg>|DMd$iM- zs8pd_hLilXd}o}k$pQxK`l;YGLeKiw3EE2sGG&93+y^vhXd&MAqwq5*5Np+^&=-ny z2jm}SyBvWMt1cN3$Wxg#5kPQlWJfijKb+s(-t*bBD?6Tc#@Aj}sFa1i=!LZ5gB`?$ z^@6=gKeEv1#H93&rg_2WyK6?Uzr3KP7eQ#(UF+$8yek3tigQTkPh~R!RVGZpWUU_3 zdnld1PvGkn?pbKF!PX43Iuy3_F6%M*X6GB)kX-O$N8w0CW0 z=G*EtZO!1QHR-{gOXE1bJ+d^obOsU? z0Yy*utNdSv0%QV(EqZRvLyGN&nQKV3er7|wd!{<4lv>I()O`TIl&NM!;~wQJZ3O!Y zbUe(xI~#gA{~RIA1YI+0w9qbKjsU`uU4PHJAt-nPL#=Ac( z)R#ADi7*YKxA4S)&z6IP3I4bR8ry;0`HeE&V|>HOGWd(eO{{*wP)uU=SWTPnLY3&g z7fjQg6n4tpL4>;Q4{@95eBf`@&3Km#^bFaE+!Q8Sif6@VISB62%-WF!bL7r(wr;$; zNwARb?zgvC4i@flI~nX$E{Oft^-YjJ@Oa9gNhw9REo^$83F|ofD$u>{-U!_zroxMY z07L9ukbQz+9XLzgSX*NZSK9TAE{oELWpA}{WR^P=`6k^p{#V`~opTuE03TM6Nkrk; zApkYex;NhSPgY{n5;|y}AO%8p$f*OD5DZJ|idQgd%?&hI)!d}XL>|CzyQ4DIIw#)! zE)@(${d7<)7Bs{6cR#{ZMcBVh>&AO6SiF0)S`{a$I^Yu>Agh}1^M+z7t)kBC{`#%q zmx<0+M)gz5BwG`8*{15%a#i_Nb;(1v{NV#K;bH+74QI|z=0CPDIpyI2VS{UvpeQ*Fg3EOtK6@|SvWe4y3yW2x3XnU5%J4y=ee{eb5FToi)ms23o#I>n}C8tvqr-JvJF+`=e27eu=hICpmN(h+F zl`~`6V{%^o7*Pwd$CyOY5pcUT03OD>b+ccvncW;TrX(dZsG^lW+)F75GEX0k-pYwetPS6t73nq|yVbU-?RiFL5@O|tdCY#hD(b@&`3-YaVJ;ID4#zQi@Q9W;KN2-)+lmS-IW zTqumN!@MA7_T}3X^)yNx5zJ2uUmJN{%@K(ErxTh(lB{=`meib0`aFwkk;P%Ra-8HM zLN6(te;SZwq7VclK4gpt0I~I@e}xRthY~(2B2HwvDz!>L9C>Kp;5JCE>tWMYG;05Y zqx+Fw3A-7YpgjtC@i;nsYjlm65d5v*fBuy0Rq6acZ?JjSq>b7r#%SN+Oqr%(L)Mhe zpO;v(0E+XOsLsNs7*=B)r-|h|hTgHiDh5TlfqkXJ!iuXN7q$#gG8No-8m9Je+_&!O zS>USJcLt5|CpmBC-%gj`;; z=*`(wucN9<`@<{DZ{hURbH}fWR)^6(o5j{jAh$#Qc}Ft`vRl%Sv?`c4l+$@2Ky-_Y zx|2^zXL*GW0~YHHI^e*MVoo}FL6v=6KtN)jI3BEc1rlMrvu6T{i>o2RE3|Lm{Bu;?gbwKAp|wp5W>8Tua1_6C zZ<{(>kq3<7|D)(GVd~?`9AmE6GR{yen_-Sc2QbGAZH|9dnPWXSpnie*y@=XOsLUo! z$_}7Jpxw$O(|J)BZchY0!127Y&j%#NeFbzMX?+XoDI|@;+y(1w7*)Mv=8a?B;%Pjt z#%SjCA>{vZ^|dn6)`86VlisaLLjz0Nar6AsARodd{s)+3AowO;#LctU0;t z3C@_~D2kv!X;XtM>i8y8R}Ufsf3#TqygAp^+jsS@r}P>;o}7yFsQ}WPrEQLr!F8Na zetUErWRFhf@9tHnWKi3IAUGMg-<3ri1E3&@;h;Hc_CI}Hi@7(BTroGb?B^}oKIzuq z#k-a<=t~Nj3)ob@@d^e^Zcw@HeoN^m;c4i;t~SsvtaFH=jO&XhQ&S|U2&J4LkvlkY zC3+zrv~149!xrinzLf##Undl^yjdm~gC+bjXO20RC`Fl7kst=OFv>fRfP|_1t;BWwUQ5n*Dz@5LSPD%_44& z=gFT#AxA^M_{c4OwpW;;W4q!|kW&mY=kcD~#$+o3arnfkUMGD@XpAN#Da~bTPXbbK zGM4<7&f6Ml$kc9IZ{H}gi zzW3irp*Jb>4{!3kT=`qPSM+R^^P`)d@PVM))&x66iJsi9kg4?kKA-QjoRPq<$TT`P zh}j)R(T8IXJ(|pa!0G>Z+)&zGHq*5L-j~%&<@5yc+-|P-=Gp|XBq!XA!M{y3l zzOvIdbRL?BirI8oBfc;pN!P1@ShDO>fZ?PKDtPj>CtvdiPQ*O0Zs4^6SjJB9cS2C_ zD1i+;QqDtCo}Crn{BrczR0@lD-rlk=dk6$JK!~(1_b9PI&L}SA1)9ofKJ!T|jQHJW z@BkpbSeM8vCaS9IyMFv{UF(^DC{CeB^rmOg(`x=VfPVByzn^ixdlor`OWT_44m}>? zG5G;W(AgjF`iA{@oLqs3lU^HmzRsKegoQ_mDhlgXC}jK}+*qkm6?N)adHC53_dScg zZ_`Cv-^b$R&%$;xSH(A{cf>b;cVJh;z_az!2g;4@puN(2t7_3bZCWjB(u^y6T-Re6 z0$Odw|LG;`;NWTyD`U9x@3=CJ1lpflw={SCjGCUg@!a*(ITW1n6$zCRT zC)abhMrax5X&`OQfeNJw@q{VZbRvk<6?Lk@*wrJoY?uw9g;&?!%=>(0o{eul|3g@R z%!8g9*oAfZ3x0C?_O8cP{*-87jWwA#8EKnVoCpU|B4Tgpa#oYNoL)_m4+&~Z7f@&+ zlG@z%ogFbUZsoRbRJfAK$`VwpktD7rvxon_qmI!3SeHTIX@q4fc-sb`aX|j`N%C5; z4GiBIe-^xK?qzRMw68(^UT?@LPX+rE;T*f3%KO&P3Q;Ir5b@&*_bY5PtZa-Rg}S(nM;jKVXq>=%h*KPlNCRzd%XLs2=7y-O3kZ8lZ|ck1y&Y_aXALinx&05YKswC1vB4 zEzI>2BPw0f`ok{tb>4ctP1nxGpn-Dp48Ef>rH+wRv*?w83Bp}l!AWG^J1UpMS-H*mYt z6?e0+ZkPL2uS>9QxBJ!LevR0rd(gZ;>7c)Pm65m^VKUk?6z*27Iq1HF1^6SLrr1BQW0!f61iC8GV&KIm|AK`We=Ubh-V?9nelZBS5Fe9V{cXQRX7-z)7PUOmyyR1}@nh>>bmE2J1YwP_mFd+aszp zx4h6!VoEx7$=%z-#m5~Pm%cC45EdB2G^?lDWb@WE&I_L9h#ojGL#P3vh@%0Y+5Kth zUv3yK-mGrsyL)UZF~rN;va?5!h-_J}r}=KJH&6PCFH$Au9hGDGZ`Gs14F6PcWBFVL zhfj^)DVz|FpM7oPR|@IiMxGacufBr^+{`Sni8;ufv1x%xqCFc3yqZKiAiZd`lrWO(8Q) z1(!4-WNS_ZA8&yUfz{M`SVegl`~gxMfokn38qry2jp!_r28bZR)?JD1x(%b`+k5p? z<;~y3IQnP9y|DddO~6ESrh zshE3)=f#yQFyN+LRQ#H&SO`SB(~Cc}oTwYG#d|zq3MbZczz}R_8D;L;r@anBNp$|M zSx6<`{cf!sT3!L0-I~4&GD1j;$mfTvDign1stLlLyQn~R6g$QORu*eNr0;NzNiv-* zI-3L~@orzeh$2X~uXo@108l8*i#{H)j}^Gp zfm{_ZA{HJhzVe!;M|R8W9G=7+F28QAVMX~SZ1EkUT;~wwqQ2rLaG8Q1#_zg7)rWi0 zc4yZaZY8j{;jsh9eSqUk_xM&oqch&!=`(k4C zo5PCA)yKQO;vU@!^tG=ogI>Wsy>frZgE-fSK1~6A;Wiogrt4}ytf@RC1G#zb>4FIm zcNUL}C$rn(b)Hx~-~)7IIgH<()&4DrNw^HKOry(M65}J{Rke`7vH5rApDjlO1*>K&7AjBIoRO^3QgR{ zbC(%(%8r^H7i8DYTQiHKjW4vlMpnMEobDNaeC}n+*qC35ckkqVQWov#kGgl#Bw)Xbi?#<(hPj2f+im;R$>wwSj`B-e zwT1x<&aXRIM81dG8mnlE8y+W>7+I>C01BQ6C);&Uvvqddg z=eSqbT}O>qfU5rqy`;Rx21**?67O!%GNfK-ZlXf&4uy86zivd1p0Jxv=d%i3-=%e6kg5shg_f#)t zF|AWWTjyoXU12#jWFh@|@GKAFn{SUz;c0F8>9_1@CPpZkh2$Myw3Z+{@vcqwbY84> z-~}TK_7(qH)wS;M<2k9L$5k9y;qeu(xD_eMJk`3KTCE2wJ{jMfiPh2$WUIB4`H0F) z8+bt}=j#*GM>(+PO&=_sNkc0>P}RnY)AcDGU+B|wefwJGXsdtR5r5~aY=CfPwEML4 z*?m9Z!tQ&9OYYtu=m$XE%vIaY*y_R!CoqYcP`7==5I?VB=GS$KOwNbQV)t6XKa7&L z1p85^AWYH*yGT~BX(P8@p^^^PFoc5lq^m`)2`LbNX%8L+X zq(fsi7ZsWga6w4J*z6LGiWO;_tJ+Z(=mg2~3BSe7 zRt43uR-`G{T3IE@LW*d*K|xhqv}R^w&!Ua5efPDk94h}vp;YTj@!XfVQ87-Hu-Fxi zv99mNdnBYqa7#1lPGuxYk=40sBO|%p*M1AaNT=&0G1A{_WsdwiJW5XLgzzQn`!KftEN-x2S`aVIQF{#xbF& z_l!Na@rVy!r>P9SO<+cG6aT=k3&w;Ex^L%}Bq?U%RTKe*qO ztgd(c%rAMdm&bl)Yx8@?qO}2SmDgs9*5*d$xA=_mU$Mb8*~L973iaZ0E3ub#ST58w z!P3uLV}W4fo4c>$3D_lme_=6q)0HN$G2i_$m6PRU$Yh0~LE!vb8TEGSHv^ftc(s1C zdS?GYgDq4fl08~Irn-BlRtRS^2*$HH_KGe1XQNXljOx+Z!$Wv@QG9c%5qaqqFi62V z!EUPc<#Rj&AKr8-|dduheuNjtn^K98?ZXEW-o*;b@lUt94$8v|m~ z+h>9LT|^?Rvm30{X#>wT4E(Hq`r{hIj^gbayIWzQ@IF==6uyNEDE#4lw4b~80sVr4 zGF*`FZWBsy6qM&~dj$#ZRzPu;yA=hsM7I!K?uiH}!IHteh(ozwbsqu*fH{SWXhaik zqQ$$xq(%Ql)>0ax{5p>pplBLc=b&y;1?tva$4f>PzkkzW?xyb`*HB}AorAiUS;w37 zaoGkI@t_0*>Gj2aHU^uqnnw65-~$?AHuOsJdcT@T_@dyPB@pPD>}~+ zGfuJbVJia4FRtXHD)>fFrf{W|V&vp8t3Zku+th%NhwPc`Jodw6iF)`u04F+^1-9yg zLDbLf1*bntTHMYLtK&a)V+2VBDJgVbSj9@JFn3L__33!7*Iry90%9egf^R&}=D3c^GRr7kxN+puwhw^)#UdW_Gh!EM9=!|9_xfOx6>;4L0 z1)5r}$pZ??Q1~mxDOv2&)gN4ReCDXvtVGNw*cfX;O(z#+>FVX$H)6>AuV7dej&D93 zQlbHn)+s=hxxMks^`b7SA03ui$fLUIM@M8X;89EUqZ7y>MmX*2M<-_dqjP)T9e2Hr zVpm&3Ug+tZ`%q1$mF^t`FE49!0Xi8Y>d=rebnRFhIusB9FP=j3ulC;J7lduT#m--8 z4R$x$4lOk4lC$XPHJy9oSzi`Zdgp4fZL?^7>HKh7>9AfRTnSq#XtF~z9ZfI$uFYl} zZ3lK%pWt;fAF(;$kN{UIzdU(_&S|<<_I1F1QO2}11biPH!y&&kJuXt zfb0$U)(Hc5xfkPQKwI5+aAE@^%zstiT|58gKANPR{~1P=0%gXe^yvu^*9X;&U7y(N`-z;aF^n9uWEhF`N;qb1@+HgAn#LYZ0xdM z!Yc50_^-#t{*gJ{Mm6u|I;S``_Lu&z#>V#IEc?aO0h=kizJZx(}D42a#z zRpAP@!tYKQ9UJ=xS{TUMDU1_A7AA1TDLjz91~j59W@!#Cd$;Gd@8^6Bzckb@Y;$OO(LyJA`=A@#DOmo|si?_HZ2NyrX%_MEk zE?&V4)b$O}&vLgWMB3>+(wfdc22=QxIE(v17kyukMGZFHoaKy zZjLF+i&U;1#eLdvxouO5zjZfp(WJd&+Ecl0 z@3G9q+#FqefhS0o*W+w}!X(>EMu=t^RyWAs*MP+YcHcMul4aj&UAuSu^D8qbSfpbfhCkhDG4x3=!@tC)V9!KV#ghk`=%=^6KZHA3CKQZ4_#HyNCWCa8xYS80Nht=BeYPfZrE%0p5Q1+LzfEh$61Ubu>frI{F> zG+}tsyx;hIJ_*{tGk$!`6;3Yg56}LQJQ2*zZhRh$M9;O15O)<94*MAV0Z-yL!r%F) zbH#daezTdgLVDv5QPlCcbnP7epAGuIfFtoT{$AkTzn7a~{zO5S_&b@upYiu7FOT86 zoxgwOem+;79c#G$fWKA{(*NT65Pzp}e+hr*aDN7WvuWrq%3i^RA6%v5>4-;Yn9P1Tof1(b(qk1E6;q`nFh6X4b`eBU(+`v0a@E;OuRi=Mt`R9kG zf8PM*ndzS^AX_*gX-xl?nCYK;Y;rJ}03|w+_I7t#FIil;M&czQHd+PpY47BB4`vOS z!=!AYG|F}q@qfdeRLaiB(I%^SlkopIb3rF4p7GZ_FCWK|(JFG2&{{CwCF9MaOvn`3 zx2S0JQ7QFZ%tj)3s`}9ndBpF?5D#-cSs41=+f+2ZS*eEOU2^myeA0N^LAgv<*YubA zqEfk;6K4HNiR=n%r`kj@yCiHPb0ubjPgl$a{eiZ~NYU&D&#J2Ctg1#Z8a$!B>$%J^ zOcqtWI$lnE9XLYsfP|sFcWLg1duw{y|2cQVmu1rr3*qSWXC#OX)4NHp&nP~gsN|nb zVY(DGZfE7#xzwSBh#T)O*L89KapV>0(*?B?CNv!03v0!Kd%8iDnInopb z1En8LoK`PMl%70sJ8oe>pDj=83@uG!?E7w3zoKa=+^{y8n>7pa@IW)P!z}~aF*U1! z_}}wpH6p(M^*2o*vQ@Wajq12zR-6@8=OmV?#W*f~(_(8VZ~P4PJV z#NG>$U3S!d41VHqn)-KIFDDm>HUSO@QF8|rJ5?gr5A3@L{$c#V2&_*l{uZ`!|1XPX zl34Yf8)x*{`-=}v`dP=R#d6Z+tXfbg#3FDJYy zocq{&2y9$md~&}RfOJh!fnz2a`yG=$?l_^iX3}c>;*pboaANUlK1dZj*q44{m?-1W z6a{vElZ-l0|KoTKXMDKmXd4w~{2x_!(8THv zE^gH~`>)wS#d{|o&Wxgh5bghk-*I?x#iVbFxk;NSHcmc}w;9KCH!+SVD^_`04!WHD zhmKe!cU1Ause1n|b~F{gJNb*_%u{iaFAgsDPWnah;}akI4i6n!Tt4xQdvRFtO1*ef zXg{Q=_?MG(;ppNCZ~5V@qWmA&{}WL|$MMBqOj;#abN|9eIGcw3Uo;l~anf2k8q7p8 z8j-K#ef%ap7L=?Niq^$)!cUea`wjKXt9{NrYe30Hu11J- zF6`H*V6py|zo(FN{$GB75GqH^Vvg&{Tsyel!@KF+pTzw~xtCQ-6W1Flf4RzWuKo@8 zl1eK<$rb!wNExwpk8!`3wg@ZYkKMzM|3!gIDf~^YpP`b&_G@`u1fN3a?v{9su2JI++zSep^aJoxJG79-bl5NpqQNefvNlw z;vn4wYw6ZBI?h8v6EdPqXb$`WRfx3>eL*I@;H)-Y~Ut%hH zbqf^Hk%E(G*EdcKLcjXOodP3F0OcYIMYvvGZQqQ1;0Dc9;jnb!)3aVg%wNxr@Lck6 zFKAX)OfR>@%*vPW#`%p1#~A$M^B=jH$h0xsE9O8=g*m?I5kdU zSLuO$b}yer!mK&Qe-kW1h**Jv6tc!8u(45Mp}HRU+XGELoETfwQBb!eVZtFr90roiAZv05dV{S3Wb)!Ve(ab*__Nsic!l$lKHT%<0^%mQmeb4PboX9$WnWVQ&vZ z!eEn0AtL7UUTkkNHw^TKxfOyZ@mLE+yC3s2M|%&T0{Ps_cb$S-d5Hcl>py7h@zN`c zx2<*m!X4BGk2B&0EgmthA`BGfMcaN+9Uul?62Fdxr=tZG4KKhYyZn=_egVbGTa4r) zYyGvV-aMJvPMRbyxRUQKs~KH7<6Dj!{0^%0#3Wk!-9 z^r>C`bt)^381-nSd^O$ZYGJNiEs4zs%6j;cF@C_4HWsy|DIPo!^FJ5=+QH-7&Tseyv-k%# zFW#c5a7S{lIQL0;5TS-sGCZtNd&w9}7j}4K zgU&1v!3?49>e86ZDXzdkaVk;i4@~Ap>xeDdFI6a+23kq=zR2Hj%UOy!+)94a`6Rv_ zjmL8V`vjRrur>EHPEC@;zMdXBSaBS#alr1u@xQGd1K-zMX8 z_u(Ky&vv9@7P#F!s?r$5edUh^ z$f3lVE2h;X2Y%fOn=+C*X|%m3Goyz8rqy@u9m~9zmWHFG4yC}#73PNJj(6oa+xutt z7ftf&-rYBr=t&)4!++E2C6=`#eAwqGd#Vzfj+1qxcLrnv$}9pH)))Jka`kMWctN~- zNIwR4P3<@^%*i%3}v0Ozx2ko60=B6cC=g@!4DEm0*2N>_r|+c===OV zQpsTtrjs}6V~2Mb^YqXdpyWWl(B6r3wvpy{d)wPaS_EU;+eYiTB4Y-+IrEh!UtB>{GU9LH#P02577ErAZb0>tiUUs zZaVTL4ZygMtar{6s_@~M7yoy2>-Gv))Q>6N^+`nH8elX020B5+*6G{r+se8saB?Ja zFFWz8j9(MtCfC^81eeB^Jv+@x+J6qI84K2^KoKdOWe_ZdLm(xdAW z753Ol6vR)+$gJ55hAmAWv`^H6WVY{7-F<=}Tm(y}_o+ju5lbgNB>fLyRaP%$cX-?9 z8Z~3Z3B^y`uQ~LoTA`*qhZPaQ()Y$s?4lMlHz%4FZ~O`H&?&sJ&c{z|b6UP|#xz+z zWJc`=z;Kmm8i}SU8i7p_;)DICh{dkV&C>XZ^J-X5%@JopGxQqWY(Ww^;swNU$qr8> z&InQHD_mq1S@s8gT=};8wEKgq_-|-GI^8NqZuMzZkfj-LA}{67HQ;}`o8u?mC8#lV z!eu}xJ8a;W99iEbh{fw{wOmtWPx9$)Jf!Z6wwf!Zz_S)%>Njo~)V(T!ekHaHE;do{R?B-z0i>oK4p z0`hsnSqDUjjWcN#C|W9;UxC&B9RMrMR0*Z+9;|o847~ySFM!X$o4xbm-`p*v_Eb9d z3pQcDvD3fw4Kgtm0bh&hsbIC=w8C--s}0TTIe+TBp4$(u2bpe2?)iRl*>9J?GxjE@ zp6Bf$*w*M0FZN8w5<_fH6+gvvcv9!;UuOsyKwm#4BFdyRCo16+naLr*J`kWNmV!k) z#i|Eg-U5Kw?9Q#1(buAcCPik#W#K;q!f}*X$7~m5Q3dqY#i;R}sg@Bk6F}pS1Q`q8 z5;FWZ0gZ)B-k$<8{5J=U{~Ba090wT-1sMz90y2PqfyTl~K;yp&GR7@`!Z%C3|HkF_ z-g5boe@}`Tyg$+Mga6(PGyK<<-y665o|fNxi{&T&v6kQalP>=|+5bKS<*1zu|6wNs zAywb@WRM@BXyEZDL*1kRkhGJbz46WVf89F;fGi=9#~%%!36F-~a5QY7nzuX};6HIs z=WG}a&xRM=*#Hx?H-vyk_d6PXRdqC+$9SvlJAy9vE&(oX<7v~Roox=jc`H*e- z_NR)=-}FrI>sWdxU#T1l+W8nPD7HFh!uSJ0u62LVnNY^{#&~m}aK7eFsTuM19KisQ zze3XE>VRHT3E>>gi4k`_l32*mRee2B3LMRxQjNrAY*wg6D9w+EtW2W@Xe4MW=ex&2 zo!)8IhlqM5x?ns&N8sM{r5V7L#`n0)wP&0ql=UQ)Zt<|CQ&WOc61D>KaE9{gKYSm6O8# zM2d+0KaM0?`A*^fk3S*D*ce?QZj|gu9zVl;$VuUvV-E0e8HWPjtukQ%fPk0i%x zXWh}(QFmQOQ<%;`YFepm1Lz&7BJv7Kri{cE;(7@*3eIn#1T$@j$T!ca*#_s z{vQp*x5{9!zo4;H%TEL|cQn>yb=#O6o8JVjH>4Kee<$d5;s-|(y!uG1WICpCdew1~ z4eMzcAT)c3|Cq7y;y7809O9wY(NDrSKaygCPyr$2!i z#Be(HL`TDQ*0|!{R{S{eTb0`yN(-EWpg02{6 z<^u3Rz)DL3xLD=V&W|f&?hwU8I!S9RvDTIUXkzMjKd$pP{EA{>s*5@K_4i zOd^FXq6`I4l}6op zFuuVg4VtEFzwt*f6P35E_0VFMiKu+|M{Ah>cwMk_ z&+xy{;vv~XZIFA0Hyl9z#?qA8{cF-M_7|r$4h)oz%l$mo_^qDf)iq8u86jc+R2hpq zfL1w>zAr{^;~Qr*QaDq0{*=sludFS-$QjCfO>0mMd13HrQfhL$i{p~BWk#KT2DTjs zr=7?TZ1x|)meE?V2`d|Cng~Gh_x~30PxCwD2>tQmpJsLcPpJ^|_tS{k`u)KiVe>eS zuvr|TauK~XM@YIfKloFKe=q66ma?C7BVqSAIY2{s)k#$< zHK-*yUK$F!5rFmpr)#U^0OJ2g44lJNx5T+J>yQdm_JlXnL#aT=v4pdK1W&&~b|6W- z+2eOU4&3Z7=Y~lzvks>MtrBx5W6y{H$65#ZTUpL6D=abqVc$8CDNLR8EN?LHIJ36B z=hKH&OS_ZHp2jQ|QMWXq{qQR19OmV3KMWS&9EknfYax46hsoKjwqC$+=>$o*%fAa^ z8|r9yD@l0&A3+j69-o12>WM#6vFQwvq+rFpgWP#1mTiU|E2eGG_s;J04ahxj&$Hm# z_}YF?k%{!LGj;mwu#NG*A?-%un~FbHlR2nQXiEkeH_M9S&}97IUqbW_QPw_Of{Jh7 zDVOhNLV)e8!R=Woohf!KNq~Rvoa3Z%0YtBOs z@M5C~;}zxdmYMVOGvo8;%se!U$;Z~;VTSM5mYz@GYk14d`2F=u=Nv}3xm-UudtgeE zv{GsMU9aZX)O;|;d9rxh?EY;VW07TU*m!w&ho*(G9q~KAM+d#&TjsA$zS-L82y8LP z8JzvyAVJ4j1^Bg!(3-=&3=^s`_ zKTHxz>TkBzZN+GqMZuOPg?&k$g~D-3w|np3VByb{ZueD3n#YfDeI^_ieIET9+Qkx zS?P0+F?Cko!M2y-`Lk=Hn2h#~f(Lf@qw69VE~`?07V5gZ{K0$3CNMpFNn)^Tmedc# zLGiyjtJCg+Yi6xXZtt44mS3W25;*2Ak0m;9pY{2g>;d}qc}zW5*41QAk+v-rd|BU> zj)lOphN>Ga5eWeQoL~ua@7_j>p3Z-BRuA8mOAG%H06msDGZ zKx^%@`#Z)GSI-`s{iAuxUJjG{lLX9i_jBk`r1RBL-L4F?qXV;D_0-X)j@Wm}(op`C>Ocv&ovAP;> zDz*$`Q;Hv?wy+MAMnu287<}WIp=c5-(eD0KeBN+!Y-@_Vqr_i3i?=CqQ|PN;i>ZpG zZ&i0(N3hJr{m%Nq?RQ`b)^|w4x_AiF-EZ-;lX)d3Z+l<-&exa#kWAn76`!ffSuPGQ zx9a~V?ppwxD6{>Owm`zeDT-QO5D>L2imf8Hg3>?&6HE|ATzueTd8`yggaq+{6G$r^ z=VrHem4$Wx?(KSYZ&z2XyMjdp8^E@pLJ{O4s}@jbh++X3iX!>{&iQ7NNnbp~T{KN* z=9}+%&iT&kJEztrJ@pA@20%;c3@q}raiwJEM`r_z#ftIi6cNI*^0smOuLCNsl|p=| zS2MyFR05yqAGKT;orhn|S|k72!R|``R7`UvwsvfUQfcI2;Ksr#9H675If3%n09j!n zj%x}(hC}`1%H{A9Dk0~C(XT1Aji22a>Y_SoEOwEsf;Lsp9xj3JDBV-O#S8_--1@qur7z8 z7qvtVi)ktWH*;(8NK9pHl6>5uNelX*eXP0|RiGSabZA5vO*b%qWdO&z=w(y_6A#8w zADU=XD(Xg0YKmzsX*tmEQd!l9jee=c97C4Q3yG+tQ5hwj6^J$`0ABqZ`KN!d&xE#o z2?0ED4Hu)`3XckRkGWMuwGl6v=M%AkNk@-KB$*B+rG=5)j~x-j!l;63Z;NbSi2%*} zk;fdVDD5-PKpTuh8pp$wr)|%okSzmz;fD~Yrju8#C_#^r_Xqr^AjF=Uk?eK~?I_~6 ztimb1Z(|=(FZAVHNW;X+QLR{b!dT`in(QFEK52M8K5!rgc1y!+0XR$zxfDh7e95`47cJ3?B;m?qJ_nsTW zuIqt3O;&#&M0+o#j)Wd>N<)|xZ7}!J6R*J=S+UJN^(Zu=n85FW!+{EP=@1;{v*0#A zD(uR!-5B;>f{Kn<{XH=Lm#8K@l0$hol2VWrz+UsceI^nI-$7sq2PrWH^HvjaZJQ!@ z7Zf?6P-4YLp+mnr%^ie_i@{3{^|8Pt1qny!KXh%F5zL@}>y(|g1H>rVyX9hcPijecO}0BD)gGb=+o z(l$hk*7{w}>SCSwcqz#GFP}OWtVc0znqu1A#CXgF-_gNY?KaqsbH$wfHHcy{2op8D zNHOdm_haVnH?bPRoyq77#v8o=qio4h5SI%553>-rjV(;SCs&X1r-IF=p|YmPe-UY` zLXU&k_VE=V0tB{SrEeO(Q`}uT(G!cd}q?mh4?RrFvrZ{(Hw)r zOV07`XfE&#bjTCha}>gdGjy!8^t(t=t-lw3ri;M!g=yn)6lY_7r~y(q#k7Z(>fqD! zX)cE#4pIc)SSlh~fagsuAyRpmxJqKZJNs0@o8`jHw1qO~&hdnF&~~ZO(2jJkeTUJ% zK%OzZJ_N8UAU1J^HIU6Bp9stz1IM(5mk2VVGmg-y{iA0Ru&M9I&M;nv-lIQ-6ALjH z2K45c@?$*(AmP<0MSg@L5!hTbAEWVxIhZMAPhH7)@I}sqj8hjv=}1wIu;tKcU;F`A z6mmeN#dMo?slplHTyVq-QR@-h)qEf$^y3b;U8%E&5oor1})^G*&r!A$kZ{C-^hbYF#437Xd1)yErC- zV_lLmpYtHAkx)JIVU^RM5!fcQ7Gc$E2?fp#Y>N$0*M@eYRdEC1chv~JJF@{X6{zq| zh+X=#LVCvcjwd-1GpK$lW(NVzYT=AQtlF2m8fxZjU+iN?+X0k@J*J|Khh zexKTa{FmFr+Jaxfp{?NDN)W2Lz-y=sGK0es%a)37BowIWMCeOLXK^^0Vv*oE`FGO2 zF*fpR2(2D(f_NPOxN@-y0 z&~(6Cp%gZBC`pj6QT-*j)q5~immxabNKDfscs?0N7{9^vl=1W|7SrRx^b}xva4HV@ zU;I;ee#8#XwCRwc6vZH`z{tU27Hr-nFvw$SXs3NW<_Oqz=Ld?=iKF82Su{ zppclrN9I?X<5{&jA&RbRG#e?s!W?W^g@xybVSjhtQaIT(r>(#rO{-~EUrC+SKhdnd zfInhZ6#;!GH?1_KnAzsjIug@59Me@nu?NS?@wGI?1|!nO#462Z_HU;$vjV(Y0kSc2 z=mu-xK|W~=DnG&&8fx*MP02lR)PL4Z_@UU4^WwcHN5(v$?=(!ZPrFgj%@!uqFr{`0w)lLn(UpeP9gx@jnXtu+7dD9ll;W@q#M zFBQFoJ3jS881Arjf<_QZ8Vr*&IHa#7(8;Gw>T8Q3llvq-IG^Lu6i4tqI!~YGhjLj6 zu83|4$}_pj62rDYCul}O*#*WZ4(r#BMjV8dF;?j+Zk;ZPldn^K2E z>>!4Ng8$rzorprUI0!rVAdGq20L|~2qV7o`j=n#%bbxH#mrpUhh*S3Iu&*(B#?e-c zfV@wqU^Bl@dUvfi>^cLA?s)nmSx~%r^Vj=Fj(oa@ZNzmw5a+^U^?wuV=L>uDj(XIU zK5VXMy0t9#;PV4LV8_F@xH2Oab!%4FU{~Hz{~1%9mB->!oExiLO7E4iKUG-CuowG2 zu@N!$!w8!t{jv%Nmg=Q`KyV?D5Jz2b@zvVc3~jhg-7s$lt}|WX3{q@coROwpF73vy z&chp=c!Ep}xp61-Y@sa$uHH4}4u6k%>xpIcY8|+EjfKy@7awwxe6MbBLP_FOKXyj; z_Hc%FI-Ke%XC!u}bKWkC4M}45o$0c#i|jo!v@_FX|JZ)OsYa+3Jaeh*BKzzv`{(w} z_G2#l8foE5mu;oGf8LrP+CkW4*Sc~W{zz}v+h%5{>tYwpTVqM1CyM0W@5aP~dFL(( zj(Xm@t`15yO%mWW)KdTgh5boP5PtA7rP^e4A&W}!Q?(HR3uMVvlYEozo3~bFJZ*Ml z0&r(~@*~oGJFF2t@_7A#1FDRx^1NG*jX1bt9&W|L=LH7}4F z01ga;QfU-qqUBpjrUq)Tm-an2=!!ElxkJx8P;+4>thW?BIs7Wg>;}h4iupk}xDFVS z`f)-Pz>vwgLCVHW1w-qnYcyak-^b_>gG`Jl+K|O$4VvuRFiwu6FRKghrI8@>0`8Cs z8b7n}lZ`g8>u6%6P$x)5ltm3(1^^wUxCEl)1JQ*sjJ#1bREqYY^ru=mwz&$|tPxFe zWj${2lq2@2+`HQOuB9vBVY{xW^}N@J=lG{UJB+Rb>YzhH5-Cr=eD zSf{-_B2WG%X@P?mV+RFc2}4~&j-xvjUF*xGKzS(EhEybEhH*hz<2-Z*EhPD0RH}D` z-vUdKd1H9U5OP~Kd8vEzzn|%Y<-vx2V&XFK1+94&U6Gvx`GV-D0>@!di**<7BjU&& zGy$`DH-eSqK%*D(i|z`52ec~$wI;SfFOCZ8%%jG5!03bI--6<3F-U6x`w^nZL!$#) zJRztUbVUvg23Y{i77d}o%=U4DQ+CWpVX^?y($u1pVmkGvWc71yjeCss6emZaz&iM%C#=8{q|iG)2N!ZycY4t z&?16EF5W3bXKyp2BNgAkFwP+q41(hgKe*TvnhY9aqCB`kbS|JYiOoJx=}|!eRmAuU zFDIPENe6P;H<6k#yg*E9O3gIp>I99U5?BZmjR6AjO^pwE8h8`~Zn{hPxG>qIALOM}kQXy`LGZ-IJ__N>it7ljG?-*&z#_Gf09qhO0-~#Qc;wq&EkM*}U<+z6;*6gq?H5bTQ}Gl5E} z=n^I~imyx#i+swYLL;)n8Dva!hG8STgr=!Eoq3n22l%tc1dYk0!H1VOC8m&x(V_&2 zq35Y22J?@=N@FqcoLG%#7{o;m`%0yL2qE`8p#p<6qP`|c3$>6+T1qj++);zHP@J+9 z!ty%3)10u#N(uovRf0mwcGd#uOiVFAkvSNqC-0f)35^E~3Xb1b16@F~Ymo=;I!gPMRQj;mwGxL#SFdyz9 zE2j~DQJmS4vfV*lvJv!~XFLW+GI$Av1B-RZMv+fUv;mM-0zt8Ypcl&wf+`iQq>+Zh z4#p66Uh}Arf)nBG1V3S}(KDwlzn2I1D2z2$kLqlqc$9K)WrNNlfYSw(2xY8C>xqOW zi0@1%vtSz5aBdN^>wJ%-Ac`P9-k1NQa|K^X!~W&#_pj06zF@;JLn=lVnp{Rm1-2nT zyQz>+!HLoA0_3=_oNy}4VH?fcxK!lh z7nn0gcpS(RdfIW?$Pw`b!TwD00yp1$1OJ!c|2JY2mx}&|x#W$UWKUDdaK_IM@epfG z0s*#g%#^XvPAR)1O&$pZ0HFc_AXq0ND4AlEG|0q;4N*mRw16j;BJ#nEws|mML#CNf zYHaQ(A&eqI9VL22^UBba#MkjOwY2pkDjP81al%=&?-RmEb-D%26d_Uy`6E$+&flDk z?}QcPc(Owi%92-iGmMng^>XCf>kFiXH3haBsd%Y@kp?yz7-&XIU?b)K0y;wB2VU2V ziZ+JUW~lhm7~D-@qwc3fdWKXPAQckA}Wgs4G;P6_2nOPF4xg;pReCOpkaT3h7Y!hhC(4=@cRlY2B0{CEt(r8Y<$sK z-O(B)H*SH#t)iott0Y$~6^#(+D8|X?NYb{D-&>-i4Ks7_MbN*b;O^CU7Nrm+mqbWm z#>zkAw_vYxXlh%C@D!+?5tH*UGj5_yL4<*uoybNF+{E`w^}N@Sf8qc7E__oEe56!XFY{*$R_h*>2(Bn(R6p<+r__@BT-h4;tAw)k(y zL&c&a;(rJa6$26fLwKkdh}bqB4nJ8uyzV6MP!W2-)O|65hvXA!;NimK;2}i;Z3_=Q zngnAEP9iK9C`imGqo9F*z*wOuGvgnUQc%3!6zl`y1t1#JUYStkCAYzo!#zSh>6yxv6@h zr0}>paAgJGFSRbc|^_ZFi@`k-~{s!r({)F7*MuGU&BcSPfeg^G|`Ygf8 zl(b14?EE~cm6H?0)i)f0Z`6X3dKC-Fr{E6qq8XVyiXgH z65tW2>#M*6O!kANBC7edfYO$SUp-JsP)zeZ;V~S~e5E?B+-s#28$yUtKgA4`DT33X z_$}W;xe9|xLW1%{zQ*AX8FA&Kcv9*vnbZNXHr+I)28VBr$@2NDrNzSjMSaeW37%F-oCZFitL2=*XA3>4n%Rej?S+QKu zwIXWc@atTcTOZzwQ19?0NAySZx@s%SKh}D%b(nl#xr{L4@PA4wParN*K80fjLqpit zdmEmcWB3~({BMSa7x)k%06P4!JoNxi5n?9G)?-ii=p;vCMm+zL3#F2~I#Dox#Xl5H zR2E)v2QLI*G zoG~wgi0@x{@I^#NiPf3T;*g%CKR};aQe`DG_9%Yh68Vh!q3fLBTR$*Eap+l&WXRP! zC@g_6*}_83;y4(4nbtWDtWLoO;k1taE@%F~|J=rH4B3QLTquFx zCu+#o-y)2cmSTJAwuTUFV#Yj#r;68C*rNYS*CbKHWEr~(4wdkctjJKJ|0V9*Vy?u~ zn-5BNjL3-nN_uNVTI>qkwh5D`piLDWV|U_pI3G{M-%(GGu$GKOu!h(OY3T?MkCCUa=p1XR=o0&`qEoD~ z!XEp2O6hZ$;urA=;PYF2?#8DApAYbP7N2^2rsMN5J~!ht37@y{8Ho>_ktMm9K8Nr@ zrndM#d=9|Mfy1+63k!Wc29E2E92_0mcb4bJZRPy!B+Neox;zt~&R_t5E9dAG9ApYN zF{?%hm_&#rvDTs0V+^uQOT)W3utz<1Xr(pK1^d4q2L+o62y9rtO8zi{S0pGo99byW z2{2OEmC$K(;e}3TJxG_2W5%R+(CFwb9dm(d3E{@*FtMkmBkkw}Y+`R32l+?rhhvc4 zo4btD7RJeewko7-6LTCb_SaMCqtddIB>W|NC^jrv5`JG#X2-sSm|yg9 zzy`|H;g%&93ldBXw-Lijepuvw1Nu-8pZ7C}VkYxnP+WyV>-g9f(E-z#X~6wW1GYb6 z=VQOOp)F_V0~)H*#wd-Ipz!=enJ8Dr$ZVuSb4Z~u_H>WBnOIis#w=-RS8M1r? zOEo4zJwiwBgr7b)-Z^$z=*Z)NE5%ip*m?MYVJQi3?$}NAXbMgb@cD=XOblb!1tWFA zBb{gULNCiXV|hYV!_yGRA?_jeGvBM|3ilX+1KC)M*b6oD*{=-DmEPGQP+CNsbyRfooyBgSadx< zNvfL>SWFLd$N6`7GW0)Oi%<#k3h1>ufO`!__C0k>ra>B$QNr|ScZ4oP0c6cM?x%tD zHl@uzA7L{o6z1P(#38uW!QsdMDVniZMYu`? zp98zW>jj97zpWYNz{NM>P9wj>f0!nUI(h|-_fxKE|4)uRlxN{6E6E`<9ZF_6y30qg z27!;5UuZN3B0|U^L`*q^u&8je#L-*?dV3%PYN(u$^1H>N=ch2LLAQKSZIjV~AIZFt3o{ z`Kd0`;|b16P86w=ViF*mh&^XU;;<>494SF@@hNzG<@%XOSzey^hYdUXE z@t@tb`i(06yHfwI_`g?PzUsXKT!|_`-U5WHH3fO1L_v=JovnX6^zSVFo17%kRDn%= zTc|<<+C(rorKkTK?C(jMmEZ;h%ocE9xc8`n6$SXiJ&|w*Iq^!uXh)WGJ%GP)FF7Lu zEhBpza%eryHgd$fMgXh=Y+=V&{BB6q6(!I}!l5cqC>^kku5wRA13G~t;)9cr$E7@l z*Nb-t0IPWa6EPiAv2R>ru)SJlt-2OQUPLfz>fl^Kzz&bgMg!8Fl{8n*Wi<7M@vWT% zR>*%+4`rmVeKbQmbEG=3?Qm#;XHz+17s%?83VgwBSDQ!PvdHNtYx4-MAh>c!3~gS$ zxS~)8ct!)pvpfhr($aZ$yi-zKNskn59)TO4k#K~PRpN@YI$mw+{ZQpVBY=I?tIfK1 zRQSSI@z}Bgy}>I2RET*f>Tm(wps*Y@Cd)sJfmJa(D-r3TSNq=}UPM$EID(d;b*ONZ zTB+zD-9*qa?an!)!Wm!T3OvD(0+BY&FtU+#om%?q`Q#W4>8sa;^wxLKMZ`vd_9Oa) zE8T`eXKsX{a7K39@LlDzH@el$xXSd|5k6+CCsOagJ@}B-dDI~teX2|82+OCxVVx{~HhiTF? zW1qRCw~_^;Gckj%mTyMy;CbeW0i?kGNh8xji!o{p5aA$5ncyGg)&5b6TR7+=hc7Iq zIcYiTubsy$N1-lSPCSl^Lv2+X>$*&=R+x)vS_L-SU99BE_n|>P{I`57-tpz{^Jm`}9(cK-Ed?u7373a#=$OVY>w?O_VjPq) zpbr8YsV_P_5Q0#ZUhSP)!aoePj=!`<{(7bfU(U(__!}BLz&`@Ic4`jH6b@;yP7um1 z^%H_=K)_z8x3Hj9J{2+Qin(BTNj;ShFPHJPjCeBiLRuQi0NiWObiiM}NftSU3ofC8 z;6YK$t8yJ)_0=3Q9#ZN=HJrzWyH^YNj(#FMEb|oHG0%)Wy)>@z{*!^!!30S`Q7HN|9K5O>`K9JGrp7LVLz ze658Ujn#0eXot|4Rv1@=bNt1zUf>|gghEj{t`IJnQmEld@gh+QyjaC=glqY0VI97p zeO1F-@uQ^ppZKdT{0x7krQu49s3g1t7wB>$zPLX%#SO`yP56nqr!iSjJ^xf{*dDAG z&P{%Xa}i> zY)ak*$q{m}S6j$^508rbl<*x00P(ySOPER`qRw^22pUB=kDk+v7Ub1PA)<@no8qA( zU8DuWJD}I$>pwpiUlY6jR<<6A??5nZsc14cP-%MUgk|_SpBki?&PZL!E$dkxnFEg=*q6YojFTq5`hDt6nqu zpSvcxQBgQuP}(k)IBNsx6RkLdU<4O5b^{7aOSd`I&qKS=$Sz;_MytoZ)m?Px(J^Sm zhs}%{QC3C&h@z<#0-WkG>>>>4%^v7&b`3gQb7;S`^h4+s7k+_fvUS6p`{eX60a9$H zw_lAke_f`FOGj?wHz>k5`M7P>= z@Oxrc)oWc7-yzo2%7>(}denj(9@1Gpybao*Wf&%6c@0MtE^a%>?nIVA0J{ygAOjmH zXa>dixri1e2V;=a87XoOw*goE5JrRt!`Dds^pBUr6X8%^!gN=C1h#<5|^? zbh)MqorudD8$9_dr3G~M#jA2rueu&ELNKUz1ZOuu?{E-pZhKHqV-P^k=b!M~Ku8L! zQ$Qe2a8C}4^sjv!NFt@PlDLuR`+$XZFhVc&KPcrZRxm$Hu~i75or%~|1hXy+?dKx| z*pd=QS`Z}M!6ef@9I9758|%IHDmOqx{RI}1!4^?s08!P^(WsAMc0#j?lTbFLRIguQ zh@}R`w%NcBuwDNZX#5SuLZ6hf)4!BWD`!cDcMo+dO=ZKQm;g9a{d9S z=vu%%^j~X`q~a>D#5z4QXuuO!L8~(~@OB6$k|i*&z7Z`(2YFZ}Xg+nmg0xD_XY4`L z-};Q*l^l>FrmQEbG-2KEKqC&-VYUzLH{h!H8%%SnKrR*iHy#n7`|w&TfF6AU&x1>d zfLo(~!EZq$t=(kp{47U>)VZj%J}{Y=EUiR9_$oNI9u$XS&`I;XMEI;n=y%ag z_>F0{x``8g1ALVe(ZHnQ*YS&2WXIl16c0rwQh@9?sB21S`KRbk zhgpMo|LBU>J>eNY;z;FD3frS@3+7v-q6Z10kcp?h_!8*v~KShv$>uj9?4 z2xI2vBGhX{o_#+$4TS+j#2kd3adllmPIWAlopQ?giOqMO16Rt zcbCWO74Fc5099#edUP3jNcTM?zJR%?jnvylhh3KQqOVckYgPhMKn8af1mgwdunbB( zY;)*Hfh_qp%l108nug1^R*cw3q4}hecc`OQ-7~Xz1}cbNMz>Tx5~AqaM2lC|;!J8w zWicsw1awV*qwN=L;sxTXqO~XT0=N!^njqFIx`^M|;s=;dfHFb3*IH}dbfQ0C?ASG;WXDHPOvS5yfXKAP+ohrlh^)Z+ zD~BJ)p7beeK<@kEzM_C0<>b*8iC+Gbq|*9 z3%B}DC%7Wd#$Cw&{;1V!-;Q~c)W2X!c8ao23Vk1rXt{5V z?TBBqY!IOBo1NO&G&!<6TaN6s$#xj1{@V{%K zXEC5XSjU{|^Jonu-bz*C|8D>;XPW471+cd{J^qC1JPTGshMfow-v`!2yYPe;m+(A^ zsAhwU=in*;uchVmqk+K&=MQVeqG-iIDy%yzOj|!*uF0_VA{wjSYQrY77m9rZFsOFf zvIgK!FUyn~mkl~<{DoG4irr<)@v4(-d0zDaTY-%GGT+CKG5mwfY|FVv8q+rbPptyP zf@+`+psveq(LW-LI2hQ+Kp~)Y05u~Y7O0A#C2>RFg2SBJ1nd$oiN$Y25Y9)Y^3SMO z5eh;+upn_N1Ha$KgrmZ5Nj*pMACxRLv{e*W;CHmjSPu0oy%C(f1f_;DX9)qd_B_*h z(K&x#RO|s{BdGACl?{Qj(djDO!twVxjV^eWtK*Nx3gp4QQjRSx+~zTk#U!lK0F}i1 zYG0_NpIB*gss5Fj>Rl^)kV6TMsNquvq8NJ&!afVNI>R3wx}OLfyq5Ujop&%N3g_h= zk8X-*q>x_$yaR*h z=r5z)AgvC*OQ^C019WDHbwC6BkI3OLDS3$MFfdvClRy_4c7?*n8x~q1oLwh8)mUZ9 z(?NcveCzo!Jg8U4|ENIVewSP1xkZyf4^n#;Jxk;jh+@oS>|FB|N5ugLh7n>hgI+ZU z;q)-26d2+DOzJ#dw>a4l@lG~=f`Ixs008e=H_6xEg6gb>oX*f9|@p#)j$ z$Ak1|!6zUw_5l0B^& zjy{L_3`#|hq=EmQQmQM;urQ_x(`PYt-im47Fw8ncIv7ts&6DQ894*s?K~X0apG!YX z6G-z!6NHD+AAn5=IupdW6#wNE!O{l*JyOSGst}I~N3sEw>;2u4G_J|wZ}ez4a6e+u z5l^UNQV`;n;MM@G9X~_F@aWZ`x}LD>DyRV5bqs{j^{5Y=5OoX2O)m~cAo7>=R5w~) zqAf}h{nCj9WqQ-ki$LjW&7G=C=##iGB!T^hYWCJN_Z#x!4Dv>R1wHQ^tnAc!8O zA?iqR3Gvm=dDxyUmeJt{EXqJcA+L)bMG=fXs$#lQ`dUEk{(~y8!e6pEt|yzPv-Q#6 zqFg1ENCMk|mAw51a5tq+Wq6Xnuhhe7bOJTy>vf* zA}_)0(Xb=H2QRW4bZwU$+0}u`x=e>DjgW@IW)SF`x>$#4l2DA7PBBPc9r}?2xU~2Y z^KE$^e(`hMl@oWznC{-2xO>0pE^Vx$1|mp$4RcE&q)|8!w7OUT%ni5#^{hOL_8(qO zT87xIJfXydle#?SPR?)a8jlq@LDnblz=&2CyV$9}F`+{6z~Fd2k#91=wN-)8R8Uor zWY>q*N64ap!78&|igK+<>6W~W6Y$JHQ_B<`8*tZmpI_~g>A4ha0 zxa=Z1pz|_>>*HF@3@JV1EUGm4OI_@~sFnUqf61z}yLn@F+f0 zGqKeH6mHJ)s`okIWw{v3PNrHToq-iz&EH3rp+v?sKAeax>1-)fjcUXqJ$wYHNn081 zVzeO9H?gQVw+Kqldk`cV-W}Cf8@Lwoel2dqPgrr9=#DU4aBXs`c@c~gw?g^1;xXrY z=o~1BASVp2?45y|v71w##fIrmMZ~Gt)q1^Ro*-ghk9S1>W9N!tywVhpr@SO}iGGDb z2y%`6Uj%E8ZZ&QQppDkzI$A}4UKUREaR53y_DzJ27#8Zmor(s$B1r zu@9_9pNOKE>M*YZcQOHubpFshFj2{fFXQoF;q&z_IF;f%h!5Q}KE^ZS`qaObWTi$W zM&;Ca^AB}~$~C`lynEr^c)Wi@JpMm1*o?l8$FIhB1m7RwGZCM!@OcLJw&D9zlyxdm z*#6)PyXu>G{A_$bi_gvQi|vBXdH5LV@^B^t=5+@iT8baKcI z)wCf_Xiv{T9eiY2dn{YlhULiWa^^WzUB+5iO0+?k+E8N|Z3NVH(i9GaVgSrtm3D{h z)#lTQ8(CXXPfs=FHw315FB30#*#X^wU+T7bJ7|km!;QFNVQ}6L7E1?sksTSb_PfQ@4OLl4 z+ZzT$dmFSS_u^|*7|#0YLfY4)rCVs%=ORmT=nGL76XLZvGiKd@8+n*bX(=2Opw&@X zLW0(BqgR+tJz)=#%mTbmS``{Dp*#5G3flh=*h*dKr5oD9Ah*G~*xWDg*o zdo;(ZIrBW$I$wBTqn!R|wx{1QaETc*SPUp!t>CXytx}{O8)+!5NWEVNz66r9$$sFo zuXYzHYaTs^#Bs{pP#vGSHo6Su*Z`4O;3XyK6EPc)=-OdV*xMJZxSTobVR_n-8FKm@ zTTm&q22cyH`;?G!{{X3&6qHPZJnAQ`<=lxI;32UKXQ00T5>P2cKncViJY-1-jnU5< zHwAaGMAK=R;^8vf)-6(Vvfelo^9=1Ktc35OyRuf`kltE!6@)8@^1ER!ieNHHLxG63 zgI`=<5AM{7s0Gg8R?-t=piN{`@qZ33L8&YLIM5+>A5PB69K)WBfU@@P`aIMYds**4 zL~mXa?PeL|vYgh)h^7_cB0;_hMbA8}FQ$p6j793pso&XD=d{QS*;+#rB^7-_cemhA z1!7R?sc%G14={P(*<6sfS$b+ZZfi>j6JV-^iSlkPwvccO7RWR(a+{$;e}Ggw6MOt#wjPM@ zl=GQ?lZx&~S!wCeDCGz_&KMpBNQIg@F;A-C7e=#?)}ocsNb}1`K-br%`7mDLXB^1Q zG>UI=S6ePd5yvRL;8OZ12GS_DfOsz=K$+M>StMJ(Hw}YqhtkqPQ98fh>M+Fl9KA!K zBj@;Mg^pwefSSVJBA*GVH2-R9RC>LbNtYIOV0=9Ded&IB@%^}-M<+Oef9OcyF$4^T z>NAsDmpe&sjmd!7yd Xle+&w8-XaQpmQtu6LTR6*1>Hcm%V%+L(F9);{WfM;sW zfal`zxQY$}Q$x=n1RD?BB~b_IAJ8;(u)hbsp`~=Dz;9Sp-@B-Y>Wm(RK1`G;p)x~b zLqumE!xe}eI(rj3`^%1zotgHv+EA!xp`zV`&f=ul-)d~JZYU1*?2T0Xt)ZfW1W_u* zics)9w>nWijX_2m`P{|`v@sfO+@`lNNVKsVZEQvx)rmGba~p&7fvQ4!Qv)T@ zeAIu){Vq`dN?KT;f|#NL#9zl$6*pMKX$#EYeBD)1?DzGaP0qY(=g21L4`BZ9OI{;QxrDe>k{E|)@!ahwU-7189~ ztu;wyW3E07m*rT4Df|Wlrh+QVz2UxA^j->$Hdl25y{FEXx7qpF`A&7cGxDu1cmzAc zYS3^e62VJF4Uns#aBQFzf&58JNn4#f`1vdhl{J|3Lrh$F$aX+;x}46A7Rx~UKo^)c zvuD{Va2weu9DNp*Rv@$^=&_M5tcPq}sS`E*7EVe*=K%K>5>!|QP`DMyqQnkTimIW$ z@N`G4%M>V~-k0II<{#h*&8=r8)Z7Max&A%4ZnXG2@Qe5jS7QW@pWDROF+}?1C_b#2 z65exUsU=k(!um!pVDRC@TmT;cssivumm>{WdSp`Ltw--{bS!lV>7z(hO5K)1l%5u# zK(k|XSrg7K`G6r`?d;J|YWWB2`m8ELnT7SO(v{wbak@kF9PYYsZ&ohSMZ?{q|MwWK zyH551M8``>5w!#XNjTfXuaOwz9un+{ zyEhB=`t)IbiB?1<0y9lyjL|s1O;n>>q8Q|F?WH^_MZy@>JZ>wD%wtsss}vU zj4aRKoLTigO?LRSf^2a374){s1k|IhQATSnscE$8k}~O6!)WbRsd2P=t7IFkW=QbI z$nux?!p??KgZ&bWG?AI>J=Ufu9l|7d!=YwUHPyhnfW3gIR$cT3ka{R`Y*3DHN8ziC z7D1$mEJHCu%omWhmc9`Gi^?$QfhQ2KbT)mhxCnpvKL3e!#eiZXV9X^?aIRRuD+2tk zGJpx73plG4wHe;YT%HhyZvz*RjTK>?m*NaI5dkHk39!I5&A$efCkh*?iz%fu569y< zATS4;pfFF3j=6c*mgg5>Q~!>03M8stddbcInY>%ke1M z=sbuePkIojIv6Ku2gf;UJ^di)c$+d16vx-E7Lp!PB5m;XL$t!I(TaMjAVj*OHYNvwEea4TXK z+_Zj&=2_CJg|HR)fE8=89!lk4+$T(cE$h2jH=zorOVDbpmUG@7l7l^V__@`3?MFg` zK@<36 zuEt#kcteahwr$o%2cw=OT9k&G(*1KnO}SEWKRlpJn|QG&^FKmcm(rld$vL3F4Whns zSCgzFw8!b$;2S=eQ9|v*6UAQMA;nhwz(g&=JZ`z$KtlzC%Ct;!jVq%Tb!SjF2p{%vRXju-i|9yd6KGa>CiR%)^kD=(K=|A>I3=)v zM0Gw;utR~gUX8)Tr2)Q5U zt`QT@%3Lszzom9{MvaZftijS)>c&b@*I=oqZh7IW$JT!s7^R|Z^j@SMx}t#v$ZJkN z!4T;Ti$ZPyW{yZICYxpoQxv6P$kVEm`U^YuxTu6bXpj*G#!N7NgfYVUL!A-06IxFA zChpSY@Lf7*2?ZZY!T$l-rkbKXf8ff*AYS4@B+7^)UUhP1^e`B7CYI5?_=O-JCRR#k z*p^UxU_PiZOpAlQ^7qZYiQ*;>5$3Wec>@TBP*EqB^Wj@x757Z%+WJ6bC^tAa@kC0b zm(&gBfPT~+kEbJ`JPqM4^ayM!*r(Oe0^ElxpZXx!nqo{LHxTs^h=o>xian3{QfT9$ zdO(52sF`a6HRN}-VnNASTMLu}mI)6zk<~VbUNi?hZi9!=c?<4<=mojl5$mAn=3_ug zU?9R)AWsvL>LD|_zL=5$Svtdt2Vy<(fFn8@{IbC;i2eVBwdD%t#knj8e@{qVUJp9l zz#~Y~*5rXh$BC-vYjJ z!okh(T%D67sKe3AZ29okhp%D>1dR@~ejyq_d|`DJFch)#35NQ_V1pyx)#6+MvTTVV zP>AUg0~B%)h2T*?h5y~^Y>eD_&xBQpE}=(!An_zkE;-m?P9BC7)4}4CY>?!xlW(wD zd&)@|l}Hl$$qhDZPig%OC*~4pNgVU(Zm?N#npRlpeA-p!a$)}oSe|;hAH5m zrfjU5(tD+Ukf=H13~$(rgh^pnrymhCde$bNy0X-*okuy5Hh`t$oJgL0B{DM>TP6}9 zAvg@t@@6#aA&i}{rC$z)<5Aan zBD*u7B^V+ttdf^CVY|jZ`%xgsc<*!ktiRcyJMf7MwiCYNSiJc~gnrI%Of*Rl; z6~8`CkP3MDvqlc>(^-C_?qHq;33dWTlt$gw-sp*UeDYq}vM3#qn$ExUEt`kJp&u`U zZHgx(JonqT=}fnHL{3kU=6fX-msf>UmQuK zyDY+kK>mTcOOGRBIzcFaP}C@vi0VtWFCqo$&y^r`S*&T3DX33!y<4uCdC8!aJ8q1J zghW>3u6pN8LW4thi^U>`aW&uP8gg5$i@QJsG8e}?Fb!7qv#;IvZDlE0tlD`KO)5$zYRMC zSgZx89*5IQTVvRNfGBx)o17kw#f2r)IohTtyg(r^A3uT&Rg zS}Uwi4bK^Zoa(sUC9o;h9Zs&=%H|smDdBYuPQ*_<>Pv3Eq zv|mIU4Sk&l=n?VkE2MtzvVxL8q}p8tf(uFk1qe;e6*PWJF=EKL8=wvIh681>^9|aJ zi2>0DbV)_O0O&!kgrw?>e^PD@e1*uQouuDYIS;KSxGIWB#UG&}=y@vPYq^i=R_lr8 zyVM<_9d>FKI+`-TUpY01RE*uq=-q$<;HpkTP=N})v8w}%W3!AYNBIgaAFA$XJeOE? zhnF(~HyThBbE3~KG>TA`taEq)Z#6oP-IU|M%oqN3j!_>x8nbnMj{p(ie;}4y<$Nlm zFVrMeIQFpIt6hwlh@OR&=MC0Oi7W?8)s-&w$i}_#Dg>+8kFxL^kM1Fn8sV(C&S(bS z1V&NB2EPPow;==;`Xw3+tB(Td(RE!)2u|{H3q?$;pCwn41L8 zsm$GK_4hDy6$UTShAe1c0gGya-!#c-*b)zKd-x(lN^8z<#sine2Fa|pLnngRNErSo zkqwNl9`y{GvvcTe!uOCNn;D#^A*vaCXS^lfDQ2V@3pW9ciD|?3Yz#nf%?j9NL1=ZM zQzy*CJfkm{5(oVY1Em?8KS!`wV6)MOF9YYqF7%3>H+Gi(gI+LTGqG9gF&`5za_1H9 zmqCF96jKlRwrP#|D1&~Da64c;3NR>Q!K@--Xz1%4IZVk+^JJaisWO;JALtL6r^Z3t zO~bVCTcUuMhydol(0VsljQP%)0OBsDNO&85k2+BUg$81ZfuD_u$u%?~g2$uaKM4jT z{`TX>oQqf5ii(xo|A8so#FJS6>+!NBer|A%4XIz{IQA5qv4BB(l)8pu2~U9(J7QNU z$s-i{ym9guwbN-J$cY0LI#4#7Az-I@Lc z0j0Cl8e~mXeVd%>ex_N;qE2;-x(>7&&gwJA=C0w>0X~Xd_^I@Qcfm$g+2T}dS&-pJ zUUj=i-A<3_+pR)sI^Y6QBQ`O`-g4JMe+#9)x-r%}_v2_e7A!&1_0v%Xi;=tC6WQs= zjgvMvi11|UR;qPXF>0Am;qOk}#BH3v`GSV@gSy^lho9uQD)pe+7^=6z3QazkX{5G? zDOzoGMjATfJikqCj5OHQmGgF5pdFCyYcC=HAv$|}0Jkg!mdM^STz2rR6l>^GkZO;; z){X5q677cMvIS222A8@MCGk>ZZ-&dRtVQgaa*EI#`RW|Ey4OjySPJMBD2Qp-i|n|{ zXWx)`6vTyxoj~yrbo9Y8U+=wqj~PXa#o_C{QuOyc^cQCiakZ6BeBcrKbUtoG_FWj- zo#C-#YL#P1Ya80_zy&F!k*6xM<5G`(E!;NFg6*vew>wJB8Z(Ce2godN&-lc!U#BE)*ht#YYr@1(EuW>Jb{I0|tQ|m*Jgx${tz@kNrnj7}c$Z z>;8)Vbd`$FNjErjwOTzK+S8GrbcD@nF?AT$M78!3{7Og9&Y~I%sK#?qqZbD%U1}X3 zQX}=}p>-6mKp87u6s@AI(A>I<2#0w8u>@xiuI!2G7!eFmRjY`{9D{eRAb1N>!;zi+ z80NUH`dsu=pObJ#u%>}l|yT+K8B>6K+QK^m40PoS{9P zoRK{^_p;t&k9+J}F0o`<9J0MpDjtYgREQY}GRR_qfSZw>ofrkJ;S6wExa`1}8FpL& z2{N#-1r~c9J=)um9yu)fBO4xN8jrY=AReJbGCI-prFrr{L^OS@SD@Ub9>8oxb}Hw) z)cqg~03Q1W1S&hjId3%=n$}TS@I%3&nq!py z`tZlj!z(kQ#<;<*88gH%8YiKGpaDxWLBail4qF(7={1?&zAgkG@b%N!DZD*GzHMKpC`?Srl&oItQufUSK#Bx=1}g z1M#zPyg8Z<4|61}XrhD_*yJPfhA84S!Mn9~_7xP;iZUjQfYPE#g3Bb3iioQX>yOi1 zp{9(&j5`t4XO!s!LDa(u+#aF z*q2~X$~~cDdbS3SH2jz+e=|C@8Tlb_Y>LvSGi(q?1^Z*53bOj(pQh$#!1=jj znKK8|tUzxAnucH!p0NMydZ+UAtsOvA_UV}!>fI&&Zpd=s??A~J`~x6ya9?8!xJ-CB zGBHq@i$ocUyNAFS2;~tS0#uj9^Ecv1!*G!We>%X~h?0hl$P!7!$oWW5C`V!QJH}Qh zc)489#{iK<&Wuh^1HnT_Bhl-n;<UeZE^svKCq zI^?tW=OG4BV`1;x5w3#UE>v!(whOIjc~{%bPS5nI$9&d(-ta`A$W}ShknWw<)JYEg zV8^kYqcD9#&wO}A9EgW?67rWE=13JZk(dMIM=5A@(DRytCgSR#o+!l`b9eyMA(B6I z?{gO;zCfnTvE|Wgua-wSQaVkMwp1MkrGrw;SAkOS#z87SBo>k8zkzB*j+Bv^oEe3S zdSHJ{BuQ~e?>6?PEGa%K&RNd|zES>oh@}bFfcHr%rUZ~WwBe*FXGoDR_SLycE>Cxr zJkTW*8vhRTsti!JGhSOdI5qHcmHb7~IqdUBVbYqfHC$qYPY(1c6U94ZOL{dKaogccfpI<(N_M=kQI z8?vy-$Z?h|vf#=6myc0UPE^B!3uY-uXGQUCQj>526WEwE$V5AJ(pNyTYC#FaVA|}V zV;T!3*D4?zIZ5$@O)%8*ETxC<#uERC=rszX7HV*TE4w0gW zS1BB*DonfG@HdSOPL}X!ZrCj0WY{m_6-hWD$7g%gk-%DVrlYyi!AOTUkOlx6?SIW7 z&9v&R?uESQIaqWcJ{BF^WgJwDe8YL&Z^F9YjCJ3O9r0tV`w?1qoYC9BJ0gM~T!WIl z>?>tS8G*naV%@V6>yFe!wC?N%IVG{~f!5YN3;j3N-K+K?;aaRYG8U;bTU+zo?X=?L z%|t7%Nb}dCik3@GbW)^mYPRGa>lavZ2sPMA6H5-oFm_SUyu?mutU9(s+F#uzmuI+3 z9_R|jS}Z*6snfP(DYWR63~5>w)^8xrA3xFE=1~V`c+@8{Y_jI^H zTbR`zOjNZ86H049aSAYz;Ey)LV^AvkAIPt;4ji9DQeX%M$=6vVXxm4?nn^5@igho{ zxSfPLFi1F=0w#&zDEdb{pcv1QeJLE$=SXP99MTjh&zM8n*B*yN+fyyLB;^FyBy4CD z^_N5sB?46>e>bp1Rd|wMiOB7y4VLH*dE;I}?C|r{WMSUj#=eKVY+h}m z$jdg1-q)Tdf&>>fh4xEN_}0GNL8q80;Q?VQ3wpvgISg(j5B*AVBM1hhW)lVzHzH7e ze5O~Wv_M!??OZU*X$CLyjW~0Ig~5QB6?qzU#m=T(z|}WXp);PMEDqc-#sh_Y%0AJl7BheFMJP?8_rw1X^?;!uHkGEmA2?)eZmN4RB^E)lWicI;zYYur5|VHz z878pO>mpHa_}0ugI2*Y)+~Z;NKk_X_5J8-oel?=AiFGBDRCC@!(bIjkP3S>GbwW?O z`*y6}iS6z~X`KNK`H0k(+}s__h`b`GJe?5`yL+ot-oeW+cK1`E^3wcGwCFu((IEpM z%d1#&_`m)9R34HO5qNN+qqH9RU_kRh;Cq0;`!j5#6z$f0Q21LjGDm6Ne3+8wmJz+r zB6{xvY9x2~Bo9zq=s0D1&mdt)RS*v-|66O^X6sV0ncaH`?A|_UJ|&YQJ1}J7+n!U{iEz8|z(#62_9H@_bA*nCHV@o67dJ!}DS85-cC`FY`bQ zIpRb({5N^Ye>{OD&uVSS3vH$qSCSmQhnKuf4&Qd7OWusbZ^q!4rxF4sLHvI%4qq_% zqqMFR{R_KD*HwhuBt8;u6aU?e!MC-C+$YW8qxQsNo7URk@s))5NGi8RBf}9g2ths4 zhEfq4Q^y3u>Pk{49PDfg*g8-$955ppCPB=OE5js+8DyBG2$OAs>?B~fN6Qq* zuGv^4Lx%ZD#OxGknetPJS#}CB%a%dQvX4v4vQuc80;H#ZK~~i10_>?0vsU1{oqdd! zzY6l#>0AE1lV1KBWmu!&ZBIaTalF0k6qXMF4YY^;33yMwYRtqO7w`KRJ6a0f7qq(YV|hbslZPq5z!87or!M?IP|d0HFf{+9 zdp-#!Ch}EBU;34Tr3H~6l2urMHQh(RKvK=7=;Su}7%C{#PX-@D?f-1JukUTCrYcEz z`w)0wA7c2^S?j{oN9dX5XMY0w8$0{_>-Nm z1Lm;JHloDVkpL^iA86f3lu#X{z?E5bkQA_f!q%a*XB=!_b#PiV2TIa}-O@PNzUqMZ zlT_2-DQq3!KiaenqWb2lgH~w>nOoU6M%aG-*RcKk8s0H}MD{Yf#~da1nAK!VAorMc z@P8dw+0yv40OYS#I9~)cs^z%L@JYo9z zh%Q?9hDn%yCIq41Yt8QSIK2#i5U&Q_R!yJUeZ1l0wgd|*09xM|^AJ~4_ z=u?iA2PUJ>wJ`d0G#P!qV{IEL6xirfg1Qn$ACt{TF&TX-TNr&RQkIk~K6R~FeCnE6 zd~y*DK3zVHxN*q+0mF>u?TOQa-cC(q@}ay!CX0_!&L$s@R4_caWJ1uGY~fr2tCI*I+FuX-mt5TT>_4s0@p77e74h|i-&+-oIS7Y# z;>f+WrQcgiyjFCpu0ZTo{N8k{?uWf}#BSH`4F*92u}=`MDgJr8hz(DHQ$p+$#A_wR z-|aLab_=|&1YTDq@OqPu*9yD2{qqD6`*~7Xw}IQVuE6aeaJwXl+a}Z|sBIOs3I7FN zm+E+3X2xruHk1rFDV}9jSY!|Z1O;TweuglcEqke+WrjdEh7Gy!D|^#x-3818JQEfp zn}iR3kkr2J#i%`qE?})wExO*`QD`<6!=T%Nd=9(8H9Qr$;WDRr&m#oy&;%21rRIJ! zI+2kSN2oMknZR#$3sZ~9EsXG6_>f^%6x|y~3o|1OB)=9&Ucm1!WWzl>k zK`V6U_B!f|_?Kiav2R&dj{`p7*$$y4GgyWw1YiC~PfpfVw zI~zyVkoD55t|G?(ih^4WZId{c0&b1NJqw2fP+=4Z1_keRPZ8@QIeXqYTKSGT1=KQhSsK$Px+5}zYJ?s{-fS6>M`s; zr|8LfI=o-V{}lgz1_y}aFFc&yaBzptACgD^i4ivngVch!t=Nho7^q?P;k}dUZTrX; zy>?>$FYSAD(t-SzG%nSN*F@q{k8JV$drsoa7LM&qJfrunx?eE_ndAY&-P$J!D(Pwdn5}XZrRjdeR8lsd~1u%F4K7rA67iZ zB+m>H!XwJ;;;ST1@p;w98u4jjm2=AJJ@7$ooZce?T^SUQ(CI<9$?CwR?Lz~dCWV?m zaez+|-~h$3`8Zb#cc{cU(-b3J8J*yxgItk48NwebL%8^R^FhaZAQing-9{c!cek;- zRTe6l?QL BIHHvs44#I@vRz`vRSgJRPDwcvVA?MPqJ9rgrH^eHWma%K@-_(^)8 zlQ_|*&?(N-%JuLW4uXagI?)IIw{`aS)Q|L?lw?HyU(GKyKyigJO6X^vwaxXuvB@%6)tY6H%)fPD3G|o~6kzUnmO*7Jg`B|Y zT`~=Vl`u?$<$`w+@lCV`(SrOpzx5wiJ1yHae6RmBL_ZzQt{r539fgkok|hi4YX0YCX(8QS;%V?vpRO zNU@?x`ls+;d}E5~Uy%Rucg}E&CC9B_>tA$_{u%ch-xJr3L$AGH^@`sfE4+G5(b1PC zFAksoxApF;x?Xj~`5*t`;&&HZ`iI@Ylz&PvC|+zB`rIGr-?pLR8o{mbgFb*a{(xLr z=mYw}|0qZmJ*R6bL)Y}2{?Ro(qicjR?WBLw@tyuDuIWR+k4?g##&~?F{^^D9UPx;* zls@#EKIfwn`kbeK9L@gOoBeyT*+1)|?qkOG>TUEJweY`mi#4rNMu(1FZ1&Dl*KTK| zEt>cEB@P8Y)9|Px9(Bf}LCyXdZ|mQ|cPhg)aEtNXxK-rHF}@#%%E|ose{qY&{CV!Y z)c*<&SyKO#&gj;)OJ}>SQ^yV&>1kF=PP2b>kDgH(D*J!sUyZe98l{c5e_uB?s5pA{ zyy(IU&Oa~f+;h(Ean_kgahdvGrcqjd`@snxY`%OT+%q8MR^nPb@9z5Dgrjf&ee-^0^FD) zdBP=;_0RtJ`i=E}t=Kd4lBLm`e7E=S`O?~D&)+<=YR|aecY5*It~WyeUHAX0dUt53 zemu8ldjIKFf0v(f?O)gL*NTP}_FS+S$r>VIWi^Y(=9udhqrRsGF#%U`^2W4G7-u z>XiSkxozw3zyA8=G26cwGVthwJFYnM?t8K(4L)P)-yeJ}Fz?XYAO7wyL*~9d{fYb= z*8J_d{?9awoO}JHuN*BuZ_8iiJpTI8j5BUsKf2qjVQC}JJh$}0L6_b3i(j4Fb>pI4 z&pOWh>Mwu2u3OFLk*`91vZjA{_1U32=D#+4=jLl(D4G?Sd941Au`{lCYvkR|UlhM{ z(X7yG3+=0HyEZ-b&u{PO_Lqyt^t>zoUkzywJhj7pZ1A3VRavR!gU?5=Tp&*vb&30J zU(=Ssjq6nVQyZRM_3Oj8E?QjEXH4dU_swz4n)=ve$IQw1O}u~dq(ynPeaaR!)%J0W z8T_Yut!Ba7Tdx}?-#a?{p__k|_qRW;{%pgdJ4+7UG^yve6}d0%`f=e?XRooJ)-{CPn|ydz6YjGa?E;ky8pg8a|gWf$3HEs`A6h{^_5TLeb;5%;GOfMF%zViI z(8PxxxNY*xSyLaHK5O{onf|F$rcS)iKl#>2XG~tSXloZuZ(MbM8CXt?%-wTmO{z!;^=`ekc!Vdb!`B3w>wyRPG+Xz3<=N zs@uJ>f0yOi&tCn?rnKly|2p?i1s{HL=L_qu%zuB=s4EuV^NVM)7FEhmOUsVT8RX6X ze5tcb$%=1#7JT>Gzy2c4?K7u7ulnq}7iE3aCphNjGrezJJ3M;h-IqA0=0%EbnAyFg zyjRn|JgYBWvuJ^T>~HU?S~_X`e~(@I=IBkIezNiHL!F*GQ1isdf8JHIYs!5^k9FSv z`Pkda$3FXqSy#T;5uPx^l-P==eo+8Zts588PEOlpTB+16Zp+V+paHk1Rwjyi=#)3dwlNdz}4_)AQ5=kIU;p;~mp(6f@sbbIY94)9 z8kzUIjPAFto&P^QKVG!-(&8cE2@7ssb=~aeV*~Df^!#=A{eQB)1g^&Bd;FZ4Zr$pp zeW87!ED@3xOGzaW+GL56DB840#C`0AHsnT;RCdZz$r>S~kR^pSOJpfRS^Lk;`@Y}z z_x_*zdG73IX3orAE{r zk3?N}4SYrE_YCy(42HbwQsQs7_s5FFYh^y`%la$d>W(Y4Ju|^-*!k1D28kZCSi(NM zk1EO@=Q4vAJ4!t)d_CkRk^SUO-)ksbe>dX#TuiiZYYh!68n-yb*=yXb)$-E^Fm(G92^%2!oxztl9oG4;J5cKhSyN-?@= zKXM0-Q(Z94Z_fU+9)U@L`**G?#kx_0#|Yg&xGvsu^_%{Yjw!7XEzPE{c5KTE%AKMy zt==ti-06wF5)Kyi-RG-*$L&q~Jnl@Q@kGa2^XGTyC8exVjk!KeSR^Lc`>(6}Xu zp*J>vU0!}{;7ji*mt{0gj3reo4^8V8CtbR5%$u-Q`^FJ_huKRO44=~Wtir8NM4kDU zYC3C-u*on~Av$@$=VWb%i^tB)6j^?0cwDmWNlRDu{-trH=j(D$6&fy2J@Mhi&n*_! z&toRPOK4d>aKzDH26YcUUKr!zYJR28eXLpbyWXFZrudw`SmUDYT(CbqPXASsOL}XA zb!>_Liil-rZO@eSdOoD_!{z-|9!jqdn2c!MeDlg!Yok%hSa?Rem%%&flK0Mj%U!BQ zZ%Hl?#osqD6WzFPpr^1bR#5z+pO*<>bh^h3CF2jb#dAMpmu1~ox!Px z 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

w8$_!$P}kxIVUh9 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�p-SgjS>IKCaOD~pCeU9y=VHW= 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

    K) z+PBu^sFm($WqC@%+fH+Tl}1?gTwuYf{lW(F12wLF8$HXNjuQd3k?U#yE;Xni75MH* zJmegNUfizQ2D^~CtuglMwCRVOtJnG!wfxprDSlhR+n@MJOYEJTGab*i#D=Y{)#K!A zkUzp^Z;JgE?S#+Y99z?@R(7Osirt*PIachC!MP2ECy2#-Xsv%y*uQNqoW(f8(FN`O z@RrID>TROl>3N%C!xMg1_{;yh_0fnAjJW$6HKL+9y*YLt?-S?N#cJgITtv>#8da;% zX0MBl0*=S#ZzX0Tyy6!Ar{5yKgDX1d_Y>+7C$YtR*6fX=}FX=Si9UjPnyqcxpQIa{CJ}6xO}4=h2n6_hJiPMjzFsM64{G zm6@%D>3L4jJ$Vw~e|N0izU?$?axXqqcV1f6vkn?;(gmTRgU7Yk+h2Hr+@tSo`#O28 z1}q_|Dag&o(O35&M+m=f0j7_UPmd!*32$A&d;Ew}^S$N1uTDVUWRw+uZli1jcMX{22eB2Cnb0g*ZC+eR}%4&eQvph&82Y znQ|s(b0&(96h7M{Fq!?x804&wxVrH&sX0#G>pszSSNQMxA#)o%xmiZ!@I=&S2*6-SXyU=`_XYn1}<4PZr?^I$G#KwN?t{iY~8w#eSO`6{I?UaXZ@}b^I?Lh?a-nq8;?Le2Fp>W` z9q@q7_!u58%Xb_pi`so=!2jRRG+KMl1hJP2*h`X24_i`)^pigwer&ojBxi5m8#x!U zf1wQR$RH+YczAaR>vIM%2cc!FJKw7dX@BK%Ue6(D$szJ#y!U3%w$QQ}o#eXEbHdAQR1B~L=zPhZebA4T4`%>FM=X#fQ8~HEf z-uof?U(TJs7i0|zPkH_U;vp&Kdt!e&enZXh2Ja`d72zi%^vuirTD4OBo>16 zUH4%nXVIcq}OIb5HjS0$%}i zOJHkA+_jCh-6`u$#wk46L3p+Jo#Z8)iw`noldCg3C*zlT{sBEda5VWEBW^}9dUX3Y zD$3z?CeiLmeH~3{x3Z3`+rQDBLJk^q+FRqfXCov1dFNX<5I07yS7Y6T8SBPkuA30= zx(W5Jn;?DN^jU&CKCkz0?&XsRUPsp5bJ0fq2fX#4i!|!jM;Y~>3peW5M|Avgv9-CE zPmXW>uefeyOmv)SNu^`=0I{N)J{>BPb)8#xoUofIGJp9vL~_br}`Xg3C0}fvPP#7 zhw)5Tap(7#Uzu0#5Yp#$CAgPdt|IqO<6G9w@9Fywth<-c%}r$8eQueb`V6-77C)u( zxH9q9k6C*!Em1oE1znN&xB5+0=JzqLe!$B8#KcZa_T+eB=#LwPVLC9p2n;{;!mwAF zFam?1K ze(1tQ&Xi*8968uIbozu}_yF&PHl+$}1zw@8C@^*tf6_UVkJ!z`J|y@X_z8I$5?k(1 zxlwtv7F>$#W`}0Y0mf4N(uBUu=J&7`?a3uaLcgYXx{%{rHN~MyJ}b_nRNnUzuPJyF zyNwGwL>YeWQs*GH6S2{}L;rG@eJi?U(eDO*Qk+@yd-@W*VMh=it*tyYvtP4yo9#x@ z?tJ=47C%b-KPE;inG^ZnPhV2zJpS6!|0(u>&_$t%yBLG?E9>G{f;sLn-LGf+SU0y1-z)^V&CK$Fpk(?48NNJSFoF)xQD=il}C?X9Te;IOu=($Bs5xbzuJ`=g3AGyo$%`@#YlPDv(1r0ytB-Yqm z%C2J0rJkINTwahFt=Bhv09GPni*KK_E$zxZ?HBM15uE)Vo94&RGQ-wA5t-14^OoF= z4V+7+3=6-94qftKYMveZe!M&}GZB83If$0$Vi#%ye^GwKM1cp1TeGrOtn49a)BJ7h zc?BwiuWiI(vt-F%GP8=}0xSf2bUS8XidXw_z z%v;bWAcvj6SL@_d^mmEf&by{}J5S-0bW{!Y)Fr}yd*21~ZsW*1t7m%x@6d_7imrmV zV_hc_g8UeYPUL3MiDZSuJ%moAL)VGS+!lgPqywEu8}j{LbRrGY(23CI7@Y|EkO=af zi=N|QcB;?wASxNUU-}iW*Tc3)|F7 z)8BS_p7JXa{Yie}+s@lL*Iep^^)+67$uPMIJe;qR6Qc=zNd)?mt@yqS;~P^syE(Rq zdZND=-mF&s7=6WK>05PuNf7!H5Bic5Px%)`pf5>hj8W)ITF{rQrd~7k(&snFMxifx z1AR#}`jTjTX@*f7Jf8l1?1#L6bN-KFCnDqBgN!$>tNY0*-U@e-b;aL{)6% z|L)oHJE-Ev^gCzv^RdC4_0KC7?zb^?Cc6~1y8>SV@gYdlCagbaiAvprPUHo2B4@21 z#Xk7+iE)3oUy1m3>5Ri(_b z@7NA}5>J)Leys=Y6jeUqJPYMB*>STnx%&`$Q=yA<*z?j>e`4OnW6=FKCn(DV?hja} zWhTu<5uy<2zHpk8AT;67FJYuytEW}1ukQ1wdXNRW0@7#wTCZ{w#^JaJz zawmIi;74$==BbcvCmGXT>;NBwi_@y5`xx(AYx6JegrB($o5**8_lJyM^hN`WF6`QMWBi3v!2xk?o>lxG zW{ivJPi%YKqe8r-+AjELBgb1!pfV)yQjoc7G@HlG+&6*;ZJOc|-Mh$01KjT_ZRg@= z6iBRkF~2$ImJj;XZdpGwaGT&z^!7sAg+6JS2Hm<^zE-(!K+ZLjR`snK^+6Mw#pnMB z9&GzKUMPVx+Pq&0Iz5s<;H&AuCLSI}FE<048~klU7uLvkGBnqE4>@+!;9cwPk$Vhm z9?QMlKg3yu?e)UvQ?1RJrCnKr$YUa3%tIe`3VA^G*9r7t9nfP_AJ(CTbl;6mEDW8P z=)uC#i#>u~>=E>0Z{^I|Ci<`@ZS!HbRxa2mj}ORDqm+Ls-c>^R63UlQ-cETt z&=u%K(vb9{ct=UG0_@Tupsj!zw*+65=>RWFlV7vS-IcPF7!T!u5K~U?%-3uxTE)Oz6=(^}@&=U2h>$=dFk`HQ}u1mY{$9r=wWGiu=#M*7TEV*c* zQBL$8!oLnO{uGvQ_qJCEwZ@C8hOa#vR|&(j>zIA3uuS3$)+rhPEB$?ikvSv2*C#hm?KO)bWLDA zJU6Ao4W8Y*)C*k`SPRch>e#2Dx2>Pt(ZyYSz0bw)KZpMlJI)>mZ0_YFIt^K8di{WS zqrOEm>Id9t)VF-is2>n#)VJKwaiKm0{awh2{!Ooc6Kg4r^(Zhr;B8|P&*JJ93LL#t z`5j-kP=_Ue-$C*`r=vHD-(htNKVKYS{7a4 zqP@d2(9u1__o-bu7fv%jpRitJ?Qt94;eOT={+@@IFlVAKlH6Dq!Qn`I%yCkRvix)O z2cmN=MThXO*olv$hkDGb3lm;ObO`G>KLWs$>|@adsm$k1{C5NES=yF(*uTdwWeWPR z3zn?ZPm;8~U&S;3`HRmTT(6;Af-IhZOik`a>K1> zfng6Yps&zjD4J&I!;b4ZIjd(Md3I#Y??^y511@}Fc%PH70&}vGIT5@I z95Kv?uA5`dWj@X^Pu1YUgu~R$2`)r8SM7rf?y8$F`yPE|#L?TK2_h??n`re25FW4R3?l+bcNXK}Qwn_eGU-3QI;`x9uj z*a!Xw+?aH_1=`Sn&-8B?a};e~fJS`5n(ren=ePJirQc!iH0PciNBZ0!zC#h4gKm>J zi%mk>C_x9AF6)Q7=~W9le}=yA5^%Lx;yiWr28~XF&y=yMjI|Q|s6QXkk7jHBx_)nn zaV91SO}?q334KI-ePRW9AC`Ycc@=v1lH?9zJ}Q}u^a;P%Rteq{IrENtb(-7JM+hBO z7|*_{Q5p=Nr`Hc)Kb&P>e_8$b?bMG#X7%Qm53aS&QGA$n-+1k1pbFIPmSh*X|Nulw_WZuE2^8Gm76*PGVd1vfotn9LihK zSN=QsTI9@dTew5*e<`k*MA27H{0sG!F<0m-zg*vU!$^7H8^ceJ*C871OlnW^>Y&D# zzm`sO`!#fw*DAlyi`Vh(_j#Y2JoVM|l2_xsuhdmeYB%|F$*JUfH<@h)G4yIsdmC#$ z^?b*X{QviZGv$80XGCtPQR6R~`jjMOpF#YB@W&p~$j$u)^KJz`_g*FI9iH#x|Ng*D zM^+~N>P-KO@1EH)_xPEecWyYc_}!gn7N7m_%&HX^&kO~;e&n^p_s=x{arn&YwFkD% z_2p7L-l8861XQpxpaTeztZmUr=p5Zbxw#2xbMNL?8qSJl6Bb?av(9 z{KT#^-zxc+GoO6#V|*|^!2jiYJ#%F2Py5HcNFT0W&_@}4ShOlL7HD9qR@H)RJgmfD zlw3E1tnUGIbuzaWXp!e8@^=$c^i}SUs1;cnekaYmKjOtJ?~f3FdrR-=eNL?B>TERv zzqz1xiEqO9X5?;$GGLdxl2W)UDaCtNQd$T1CV?OEt3Ls34*hNhTYEQjPIR4C{~$ev zX@GZfAA_6qsQc3M|JuIvhMv`o`x$rS> zPc8Kn)>!Z_gY2g_5?QJz%Rzmk@JpBRxztu~zUesLBW5ayQlBRJCf5 zb6VEMBJ#X@;~<9G$W7gf?$xAC>J;N_@bxF|H}nM2zJ9!c_*L4VyJGVw#;0f%bS0T` zxofR)L2HAH8o*Jh%Nl3B(Y__Qy0oh8SiGJ~O>`%vz~Mp1UF;K2A-<>OQ)+rduO)fX z+QXE?dH4dCQFgj&?M6{^cpAP70+*bjNqj8u2GH6uzQ4XO29XzRHRVh=Ve;VXgWDg% zU#tRuSmQpi8JXz*4tub_&m10}CugRV+eN)EyCdw%euW$yZtnAzkyz(=Y@2m*o^M^$IncA{`~bS=fuhBo15=ef1JuVR z@#a7n_6f-iGS$9^yG!<@(B2^T$Cei==LhH5_mm$|I?FWfn}}38b$tQ#aw$_vZZy-T z$o<(yJZQbd<64PpvJu}DNSsp;@lM3zK55+1EdEMo(bWi#EO}I(47U@PthMK`H%rI` zVIRp0awqkcQon$9@@X%RIH_EGvW>XY&;MO>^&Vraj8|}XjyPj33fkSrJ)M`*xX+on z+)f_+$$Yyt)zLRqb$O7fM6Nnlq_`r%RqtAe1sLbPcGI46f7Om1cy~Q~N zed@U)a)c0bYb6eDvO3Y>fq#*Ew~lI7PXhL~gA=e(Rn^%x5U~W)wh69_H?h_o0D@nDb3#Ychwq zS0O?4)!eI4!W<0S$R*9Zg{nagse34WgYyuvNOC_xAkPa}UxUCM=6!#f_or3vEw3}~ zRychlepcSQ6^5Tx)8C`*TY=|_^81Xt6^?SR!amBJl6t>Y(`PadH&gx;cPkv_ZiOyj zN|paP+OnhM1e{9Quk-%{?pBDOtyI=CkB7Mb;3#(=sMH+>&UYvya9(W;gV3@9_QW2> zaEN;tjxyd{p6UHlcaZ+BTGwAq50-b-y`o*-ZD1`1gA?v#@1B7k-^RH??!0a*IqqyT zRF~-AMOUx;FxQX9BnEMAiC%c*ObGglX9DFasP`wG2?wry-?PNCi4SND_t1TteEoJm z@rP78en3v6kJPRVH?rM1XqV9XM$U|E=AdMP9lCsFo)57%uuh}P@5a~fl9+#&b2W(!Q=4!I1~GW+j|6P3PP^(}=R*!)7jwyp3K|AqeDjg1m}=Pqk{%YWpr!2bcC#aia~?z-Zt zS@^6CL+AD}k9Th`uKGj`3K~*_gTl3lz#%mxs81`8#ZFc7D1CVXzh0L{*^*M1zs6fi8o&CJB&l_dUORU zyW3b(fylCEu7-@nz-|A@-2NkTcxkHA+=;#PKJ$RNw zvt*r#f1|x(7dN{Jk1dw3mdwlY{r-N?Z*29IXCh-H)@DU zI0o$$oAyj%qE8YNJ?3sdVu*XmL7`wb@6+RB#Xj-Si{ySk;-T?( zJ`C;9BWwrujwo|~< zT{Z)`B80n-IKRBH(851g5DU$G;AV$L49Z+F9;$hh2*_%M2eL+B9>p+|THJ%Z>D z9$_rajA1Me4;l9(J{#t}A2Hl}KVn3j;BTk*eni3F4(>+;f6W~R4)yyHPgsKW`w>kX zHX(DHa_?8dAu#*k5dEofC!vAEnw}9HQciHVp7wPd@;?P1k3>}|ygCkj?g}1z-c|p% z$w18Ar+2HIQJU*=y+U3Q6`yANg}K;(C1=5a=oVRblC!{;u)VNRv!&)UzH)EQ0`kev zP9bMO8E4T6){Z&f_@aI3y_3oCS%Z`@au$rgNAmhP3$En{He4U6+qA`2y%jsEP5JuQ zlJ8R{)x;S)DIhazhu z(7AN$haz42@?u{Tn zi^wj(ufpTDSt6@izNtJa`JI_p-FGWT`h0G-Yj1s2)f<-R^KHnNe*;W^N*~2a#G@|S zDOYQ^1FPrFzAY7D=zHcR38WNaO+mLteQKV8sfDLUU~nQ~s_%8Aflk&k6O<~Yja|4Xx7 z0>9+26`eyWWm_%U;qAyB!Xr$jee*8g9hTo!6)Q0n;`i1XQ04lC4g)fn$bP^YOI@=M z!C3wN2hOjlb#mTNn(O8=~5 zbn{pDN4#1apXg`YSe^QI|-$OE34{*B(f zky{?h-pFTP%UTWnihCo^yEkrT&EL)5D8A0#Ko6zwjhERQ`QE+pHupxGdqd_^_C}+? z#u}FVLFKnyDy&*p2&WP5iUd>}lf_%lU&*RvZq%>HHk?w5@ICI7Xo`&Q=7x6Rgo zCtNF&?A0IBmw7hJ+U*j!`$E>pJW{%~Ktxqhsq=swu zEn+)OpV;i&%ky5&m0PsUPAPNRQXBh;$5lnUsE2f!%uB< z;!^#0BEKI=EYN@NBd^J~67vJ&zu;~{ev_|ZkGqI`AB$BVd?~J4WJwcO$H0}$n?JY^ zIMT_vbSH3~BInXf^gY>HxaV~GMqmv0g#WnNS;;%f4c)A5biT&fE6;m*FXbYByn(z- z#NbBMI>REHou{HUI!{j8;N0x36H1+5>UF|A&D4?j)K7l2!C6BcM?|ypM8xKiI_d*HaSmt`#I#T^Da58UeW6WdG02s*ikje^DuR? zsgp#sla}sayn&vjKWcKuQzwJ{{hf#==hi~I zD<1t)BYXQTWMwz=Dme+=Q`KhTTsLP~_di$Tp9=O zeTn%o<+IPz$gwAStAN@>p8~rt ztO~G}kl$U_+LzU}hbS3sk+knKPN`cPeEqs5LDY@CvTiGSj_dWyeZd)R?EUfmawpYw z>vH!)MqBEYb%`muZe7lijJDZV)>U|ZJ(zpR@7{Lnm37e}Ubn8IDf2|mlewMbALBUZ zU8kmQ)%~B>p5IZuegQN&AKIJ;jn0Ku-+^BLcJkU7bbasF@U=Wid=zW>9P3cl#M|)h zS*o@BqR*N>H*T&I&?#J`|EsNOJNdq)ExG?h*0kttkV`t5Doyx-HzV{49m1ZT{P(2Q&2Mj63P z0y)DiA)~ZJVs1*5_>acl7bfx@j%>RIu<^s!4$b*dOKcDKkxH%u-);h{uZH)LojTs|wjvJ?OH@j~RC?jXtXr3nUGRCGV z{RFA@|2BDDp+AA)OXu|G{{!aKJI24-oG$+IT-&~S+=q=0tp5K{judagM`^kjf z46%iNdbi@z@5*KG2oHW#Bj-WD3r^^&qZfM8XED}WFSMkDJ69#A_UG7uvul;1m73R38A2v7>@!hLK*Lf0pnqle9_|@OqT_(>V{rR@5+wc@+=q$WyBJKCn z{(0K}RM(|WH149{EUuytkq<<-D*LHca^hbOm=9wSEw!(baOc)hi4nr)dI31)?k#A3bPi>*$+en{UCwx}wsWpT%h>Rt zJTg~k1@_$Y-042nM$vMGjY8}Nzw)tDB*71kwNv1C=e1LaZ>;cgCVlt4zu7l$x!4~B zzfqhY_-^X{hUPkv`NR&R&*KGfyW3|T70%*4Bl8$FGLOm^0rUI7nfQm6eiOY3m?Px9v4^fhz6yAC8iR&=`J(;_z5D|}j_k(DBp-Jimr zPGVn+F618YFaV7^i$9L=7x9ZneNp0ld{HJrQ~n6Okn-cp9Gp$Q2(Pb-g>sG17-+Xn zs~^WNw;W&Hg3Ic%nzd^BRQ6eMBRTFiRtV?fjcd_M$5ucV4;z^RQ6COZE`#E{^xeRFc zuok1o^NAmhwd~x8&&s!HzYZEJzAxDp-!h}VFH0%20(v_zHOKW0*`w+t$2oL4;=dub zIg!7L1GLHm!YkqrCC|G!gA{DGw@`PH<%Vw2xvA<6*qw|zcH}OZhyEeCdzE-s=oR_= z9K)K$BmU55f%9H3++sg2D?dk0!b$Ct<90Rw(`i@ESJ9!#_c29zGluU^|I?0}h~!H` z7D0Eoikw6>N{mOI?+3oJ@?-j09D?mi;-xjpZs#1^p;^1%h90kAKE;li0PQL9+HvK4 zk!Lwxf2-@A0V8yYG02(R58TJR_Z7&vq)&Ft5U%; zG&wpu1s@V{n7URgs-V2lPDIgq%CDxKa>|+hkuM*Mhb2-lY#Vu-MR#M`9K~PMH~%sl z^|1Jiwoz7mM%(y*ZJ*K6T%qvX)uNYN!TgXTMR@pV#cF(ue$rPTDe~cnTqwRT=pi|e z_ONE=y6;u?^v>cxG30Hl;;P)MM)hrNFMY%1F7o}qz}1$f9yaM}+e-^a&K2foM1Q$+ zs-aJ{Pw?t5PY|QVUT{MvRpct+31rR|1GB)9EO0!a>}jo!J1=m!cPZ6vv|;w6-<{5_*vi}b3tTOJeG6!EtF1+V|fL!Pu<6lcI{8Bl4@P7b4y<_}q;qyyrx6e8D-|6%B z)qM%R|MTR_kN2d#XFqciyU$Y2t&RRov4JVdqsi})dqG|Lx)pmwTFTNh;!AKydpc=-?L88YZDy8_KSA>k z4S#}EEiecl*1{UypJ2U@KS5Kh$lIm#S;Kj|9)AYm8P@avFZ3xG(tQf>VfiogDY#}I z|G!Vc|G_>57C-JA493O~f~^6cf+xc`lP#RdTKnz;;#=_jpWE0g!QQ=6z*>CR-w~V2 zUa_%Pn%FBT*!zOV?Ufex%FFDP7WT@W@SNgzBl@D5>=p5&S;6n6?3s4@<8Bq)nkyW}ouk^so5Uy;-gX@kgLPgD1S3b#)i(>rQM~_#{~T z3?0Z~fBX+3cpl07DArvxchLDazp+>wS#v?&HJ4BOcj50f!@K5$KBuq-g2t^mU-~R- zPUv$9->IxQp|v^uZeq=eFPE$z;r$%re7DT?7BaHlLdLAO4Xn2g{|&L^iq(C>%=K30 zsnY6S-Y?lKjqR?{Bgccj0Mk2leia-ScmL=*zA#eM9+MRbyBvYt6FG)hc%HZ z^Nt-3yZulCGTFO{YO{y+j~;6CA#7-~cz-I}&n3DO&rW#jxBOjgJR_!L#81ZD8@_8y zd}I;XUtAa ztqKa$&Jakefe0E-tG&&55^Q@yynzS_67&1Kd+(JT0=AubzR&#r*w4PL^{(5y-u2$r zyNbZsh2ZW2?6Eg*F|2L_0Gl^#AJYkLdFLFZGbo z<^Er{^Z%keB@>DcUFpw_6nnoSc7-DJu$H|Po9Te;ioRUYi*UNjOc8uyUglxPkM<`E zv)3>BpXk%U9b|dVWOdv6YS|MY_*V$-&C^Ssz5bS4LTW85Wxbxmz5yRPJM0}|FM8$; zYmb)){g+YiCI;PhV$eyf6~W1)->6)0l>G?Fy0>IMbuW1*xS(Wd-GgzQ@3^@4!BAF= zccM%8&WncQCdOSl`xd_8z)1e*k(S^5@_*mBpm5l>2fgd+gSox;guKMhORM!xjLutu zZtGqrAO5IW(f?%bq;n~_az5%;osBBG>JP?i=AV<%+q@a`3VMN@2>Tev(kHG_+BJ2q zmcFhXKZ9lN{md=8QLI=G999RJk*yTPLS~P*YtewM&bNCUsQmPFv*?!?57{LJ; zKGxP1H~eV9hb4^;j7LL@E?|!e?Jc2P_CWMJYd`J|uqULRU%Jbk!&`cIEn-`;w>`lj~d@$1`yQ@;F0sFrqwbuBCT z-K&l@ayI8DQ_7Nlwk|h*)bD4Gov753VeLc0f~)MPe%hb@&^!a3v%2q%juQ z!xlWJ8}sVegC}}(*`tXM?KQGj5n7)R&X;}9wq81gcS~LY@80{Gz7RY4f`^w7r)0L+ zl4n@9WQmDwuwQ%YpuKq_TSUVuBfhrSq2G0lpJ&^mrs@p1S;*=f zWDQu|;1uh@GhEhs!=8A2+s{55_atkM&|P#*!i)CIW*)XvE-?`=IV~w8Tc<_SMp;kio|MW z%ZiF-af$LJAzUG0wULN{a@d^^7LTKbse5&TNziT=B zyZ)XSCKA(vvluux^q{@RtNh%3a@Lul&K@t9?2%)S7jaLjWuIKK7H{qGI_maXd%Rk} zTanK;F-KIq43zxVIn96b+)(Nsb#7??J}>AvcB|45aRBUCC!`a*RV8Iuu}*mZYP;1} z?(xbwznxxRSc2U7RdFuaPg4{6_`D4I$GTNRV9rvOZ8h8@l6ZZ1&h+zNN zPh5O2=OBwMYEdWqh*-ZwKhXzWE&wkg^YFc7Zbqg$=iaB=bJIgC59Z#=y`&d-V#@`m z#Qw_Jx7u{#F4%E3eq0dBBCWw0Ek}tlv3#i3b2Oir80%e`k0x=h&9&Os#=JIU##yi8HW~x_(YQlkd}4O8f;YeuYz?$Pp)22RzW{HTkvYR{Gnl-t_;@PMuj$6*4rl;)R2`vy-}$m{=VaJE7~smz<)XWsMM8c?$p66#6+re34H4ha~=p zwDWc1k<|U?10m}hW7sMG^X-@(_i8x>a%U_C+q9Mc zs*+i)ai=~yG$hsH>y3Js$L8guzb&zCdzPFEJ^9=IKv6aV==*L<4be)e#o)F>jIvfSNtLPrr?S!{uD5)fEg`| ze;5@PX8@+BRnh)A@CGU-Pd;!NpM*kixeM58Z*d_w_}A#=t_IZ{WZAS#tIU(rhJu zk>m6Bm9dd59DtTZkN+@aEYZhAkAE0kyUdA;^uJm!qUPBDZ~7Ser1SrvtFqiW_!BIz}4jMYTcC4^9AJzJnC~8-3u{&|FaSL z*V73cd-_XW1v}<}GcKt7dW7fx5@0V(^fzZ0P;9laj?bY;#KWk$GFK{lx zL!`gg72EJC=Op|S`Tv#g3)jX3{{oDKYkz6Ik69mYy^leTlK-J~Bdzxkars{5eaE`E z;IH1=Tk|JvNW(qky?1&|;0-MSn61IPf$_KnGv2Dl!nJMI`LT?H zQ4e{4m3_;9dFxj-Z)mX%_pXf(K7P&P0jblgoZqk#7*kwQPrDuut$jPVl;@kcU+Eed zh+pps9@F9*V%P5vexk<)-lTq0XycpIN8TTQ>x~*>);0WuIEOFFdBoG64y@3IHQeut z3FNQ!1UKvMhPi9^2Rn67VC4EZ-bXgX5!;TKIe}K{Ri(!@9H1UA9&D>24o6@)u^A_~ z_@0%Rd6@?f)MQ+41WkEASWso`=bXxmkU8Z2fIRDFfqZkuK7%pOx-8ecj4}P_;<9Hy z8W}#0?AZEI>)KaL-P2mHds`dyxK?Zytxxqn6dFO^E4jYOwUTQy*J5xdLRpPDTZ5iM zbE~or6;=&T(ag$&^Qt@WYrGs9=jyUJ%u{2y5#Iw_|R*z7Z|ntWBRc|&%t z$+-}%CA<@ZvUM}}%ce`HdfY_W4{%j;We%!`mpV*7G|#F>#=-ejUSbPr z%-g=^SZqg=;DIl|Zge60pkuLD;!9k%Z)T)|a}vup%uFe3o~e~r%*@C}UaMjs>qWkv zl*c8Wc5I_H=VFIgbFPT<4$UB?QsZ;ggmAH#QSTWiLez1Rr^)=sypEu3z{4L57m<=gD% zlS}pLFjsk=UM*{yq!k(=^q>iPuz$I~I}=;z{^d3;I4!im?W*2Desyk=y?ZEAD z%BWqcpY`6p-BrDfG?KQs1Dye7ZX=DAml)%6uXEqg?Y~6psjc|^%&irFm|6UUtFf-) zu5SOea>nN^RvQP?+_bP23(2ClWwc>2*An0>di(dLm-5TVx5R3febzeP5}ZCs5L$N` zF;_F8aYFMf+=9Nn#PtmGaV0cmG4v&!*p3&i8xc&^Vj8Bn+<_@y?yad{t}c$z8?JJV z3bZl*DwxlYGq*1$&n4t}TpQZ3R2vdldghlkzha*LBqpX|r4}DpO1ketSDt{zya^3G z1Pwi;jcE8+XyU(~IaG5GFb>6xXxOf~1ApTG6Tp6w{11`mVeM`(eQ3aQXm8C%;$~hp zy*h9ev|#hW{Wa{(Xt?j1iog}j9rNH@H6Q7ohL^7SZeSztA09kdGoSy=JbVOPa=u&kX2x&>I3Ve2({21}Cw&L$^YV%KBDYbUqj49xA-h*^(QKrLtFx1u1G%X>TS>f*4DBO`(~DJXr38 z%vw!4ncv%-xz^5mNArMhr|7VNk#Oez|DfD~*eZSQVQmV&v*4*o0K3aK>@Xj|?pKwJ?bvxfW_-6f2=Nt;Y<-vnn@6EjPt%GmY z`_iG+?R?w7oUq>AvA`cnJ#4xY-p)JU`t#=-)$M#!`D?dB+xV8}#7q`ix0P=ld=q%J zOR*vIZ38wH>%AHKEZ?^A&3aF_?X@bu^o8VAG&0P&w305e5L+{}g?@xK;=$1(C#mG>5auMt#K7{Exh|PTU=W8IPMa!ux|r& z5?eqI{{)sglMeYZ#~6-Y0v=uVs>(mPtnVVrU8-fD!cSXbZ-_2M{f{p1*Kyj8IO;Hr z3*Gl&57(w~zGpMQ9V7MEff2|{1aYq(iN5a>J)w0JXLzT0e=V^Ex?ISTe&VOB#x$=K)Bwjce5_<}soes!sD zvZfz%!$&LmQ~d4WLy?_z%da+*^8K9cNS)&RoQo-Oy6DRUm0ojnq3T_9Na|VmX3=-3 z_cCWrlD}U^tp3Sfva|8U_8pONV}D=uZIiSyqFa^sf=RJs@b7Ij%G2WTnW*l&)c!7G z%lh8fcb(Rgc)b(vvwD@<@3;!OuS7ZjE6Rv87 zuL^$enj)+J2K%n6|FzIh;T_Z-uUg;>?;!8ddwoftAbiB!N$`w%TC0q$m-Q2VZPR7f z_{`0^v57UO9)4}pi#)@d)_YkGyzrEEn%u8QqnloMy2)JlRBZB-mp+sEW0jX&PJeVQ@j_eAa4z z_lMN0lzG=gou5L7+Q@lv@YVGt$YjEYWv!-t%(c`Mt@;@6kxPB1_aOA4t)<4`-ZeGX zT()(8O(xG(D_d(yxO;`a7P|p_t>Wd+#%qIh&0ZVOF&<{$;$el?7*DJ?5%|(r@mW>; zi}%N28%9t2hkhD3-lAud?ES{jL_6Lpw6AAl=#Hvu;oliAz7t25d%@e_2r{bdACkSQ z@=aZ$E95yLlRbM`y#*m}40b;1?=|Fpd&oOX?!_T&-`xEnkH((v-UmY71n%)hmM2lm z@enu4GfD3AL!K157lk|*$^EX7CqwRc(;r%n(Yqof{GD-?mXkqQMz-9)8A3A9dxl`5ya;L0^mZc0Ymp~( zt)UUv$4C=iZv^-A-idwO-iWR!+y?q=ww}6##siP z*aeoY8x=%<+Y=9rILbBGQYP!8xz-5&l(sg~)>_*5GuqfryFR2{E$iP15?jZ7bN$fZ zpJ~qt+7ns-ZZI-~^=$pPUTw@!?u6r-I9XV{;&o&?4ne)=|&#(Wl<2yMk!nJN}(B*bDB(D1n z@>gQup?5+xdFW}Do_RR*IPz5f+Ht{$-ts-WYW;XC-KzEP1!LSXf$aB#3x4RTeQ?OS z#9*O5q`_GC+aR<(aR2(TypL>n`kj3>OV5^8@O&L31^H zK)ot8Bhc!OYk1r}F;Jo>H9W3O;6A+JDQ!gH+v^iKJ7Yw{x7YtRi2fq*G4+-AkEyS` zk7(Oh^KIS@{G{tBzjfWX;C;Z~2K*b55w`)q0Qeuo<(fC6Q|e$Y5V`obr?Y%-lh&8A_Kln9XioPeL}3VPq77#bd7BI6dTphm_)%497M$Xr!43!gV)wz=9APqqBg zz~REI|2SSh|M$nUz`2iKDlp$d-hLZ-yEC-q@c!4g9q(NA)^U@6Ey&~tk-Jy&{{jAw zat%j+K%X{!@33*-?&EcDy?4A0ygsXOhj;&F*YV%|^B<0{CU4Wa-=RmHK)x2vkOc<%RPqP50c$(3Qpu;0Z|V92 z!6oax!8GvH&0M%+%oB$L_isObZN^?;{2o0-66OCccsH=V2dJ9!9`Za_!%Yjt_te*m_7Fcl_`boy^+t8k3=tc>&N5<{j zrJRLZ>IoL3XUOHtzSoxi zhVNq;i;0XyQb6$cD%Y^UhvcgU&##3hTnBxSeBX4B3M75`aA@S=w`;B{{cSL(G?9P5 z3C@HryrE5K_*5H(Zg~ROrbt`S`znB+$RLCf(E*2$34JV4V)?N_=bIq#^Yk>9m&&D)tBhBOJsRhR4nhmp>GV&&19ReDU@isbtH9g|%wazp1}?au2ZBej+{bbs!#%zs9++jc^|Hfn)l8v% z?d0D^{_W&%e3>~4y=f%hA?W6d%;|&Bq3@CYCC1@J=IwCWQ26pF#&384y)XBXf%*Ku zkN?Y=lU2}+%$H*t{ERQU?FNH%S^TfPF55KP_Sd{PImfJXCw0sG45Ob>bF_EOLW{q| zpBmlM+4}-yZb$1(~l%%GYzENaD~Wxwy&0|tN8Bl zoPe&{%tAL;h(7*`7jw-O=*llAj<47OUgCO(tAwlb;M}VF(e(^JbVF6i!5gb8Q(p=W z!)Iqcy1mP|UgTOKdOq@R=HHDxXOYf4SXkvJFTQ*^Rq(rU@bOjfyK(UGRq(rU@bOjf zyK(UGRq(oT@b6Xd)vYTpm>LHU-->@+96Wq$?+u|ic=*=dTS9U0@U6Z77>a|3Z{r;Nj=>=7r+m&*$|PhT`Dm=k+cKaYhXHJ3?{r^7DF^gyP`k=k+cR z#lg!L?td^;IK-3Xg^$nb{YJAwXTZ-}at8dov42HBFMmEcTjWC7k07!vdVr#F$ass1 z6;Z||<2F_s>y6-lC;n`rTT=S03{4x*AzXldz}6uoWWXQGIA#|6x-);1AIfU-br-gO zJ%rt)yX0VQ=(1tHp3ObTE7*I)-Z2b)tYs^#6FVa3R#At!$nPEln?`Rw{=+fHI*>`d zz!iUlOb_zg#rp|)E50LIg0fjE92Gr_)LZsopS*1deDT0OZ22C2DZPSxQ_r&3nRnuc zo)Mqx?m$&GY;LKqpz$G`-`oQ6CFv1^*(sc z+)BP%u)Em0lK%c0FqO9uI(VrcbgbeUnd zqodu9PS<(v=T-92iLNMt#+yC zbkPwz-)qxd_Pg_6;B4ia1t*sCU1Ntgiq4$4g|>d2`sX>ixY}m)zohLTkEE}4$Dsdp zqpx@J3oO1_|41kG>rX51)I50%ec{7~7< z&KlZ}OxSrFvJP@myW35_6g1{?#LuO+{)V&BZ%isqS?9RYhn@+9rSGW67S>wP)e zI$Iwoy}&Lz!dUT7Yy{T-CvzJGwv-Wp*CnP!PhSb?tTTT(>pD%d z`a{xYFdpEDrDOBENS7bSnq#jWgU=?E^wHPAJf36EOBtJvG_FCS#ZY%JC;9k4&0p%T!ATN z(N_96-|DlobqKa?EKEBs9l|7AhtP#w{V{U&d+u~p+mTf@2+)|f_a+g5dL^x z9l{Xg(LcF{G>o@&2;&1wkp1DQqjU%t2LA~j`t`Mwf*meb!|QAR82kWVjTz_=et-^P zC~|V4J`^3odzKF2C3tA1L)ZpSEjk2rKm9s{qw6jV=E2j>0p8Qd5OaVhI)oB*2y@(` zJ4i%_Fs@&R@KgA9kyU>R4=*}{8-XwHHv-$%A-p|Ehj5{#LwJdHe@wcUXt(G#KG>6M ziX46nIUfHLWOQ4Hkm*9UM;^Cy2+eb>G@1ISfF+Z|&)-D(q9?eC^3SI?PjDZZ(e{s3LYF?1QW{$NbQG4u)p`h(a(`h)R~{@}g8OMh^XaX7@7 zd@|M7^NFKJ`1Cr?(s6kM(jSG$6qh55$hoH?|64kQhQFahxbpAQA;^5SWRq|BEE*1oAoiRH((R|n6vSc#qP&i5sy7^BzD1f zMvSZ)>7tz%w-CpBSXTx7+$i=oj7mEsa&G-6dfcW@u=71FaZlkt4*^qbV4U&VC9z*` zOnp9yKAHDD&KWlJF;#!zpIQ&j=1uH#1yvp8eryl2#`;6S%h!(x&aL|K;m*xFkDIr? zcYGOhE(5*6Wb_6f;z#i*eiU)8xCU%Rfy%ooo~^s*KaNMxm0X2>AO-zEJ9>+bejUiD zz^9>H(*;~NaAVMAT#PI__RGF!Q;@?`ub3a|Ku2)|9R+5{R;BxJQJ$Ofl0ZjFN z3Vdw`?#IBr1f6LtX+B=}Zt&O*MWHKQBU|ICpGN&OZB*+>=Jge>5rJx8mI3nRACvx&KECx3@IIk`MbFx4{U6`@F!XT?^zmWn;||8;wRH)>_s}owgg)+sKHdU- zyoK-G!0AE1ak+bVgV*g1+<^YWP6B z!2KcgYyx_gB=juvpku%a>~3qVX#~z>=wuai@-+J8Q|Ox~qCc91{^)USJU%c<=qx62 zpU8az_u+x3SnFN~UJvy;O}*y0V;U}Y4+-o>5Au_DepxewH71cY=QQ>Cg8JlXiI(3@ z9=eaEz?*~5&Qf$C8-Q~?bbA+cayK;dBH*~)?!YSGECtRl51~(S>h$kx4+MX{)*F1| zXX6?^K)?D1brU`A8^C-Vn9bm!=$G#S=9|Dg0nE>ViB7uVacJolU{<`-T=O{kke#fb z|H}G#5|~GUY3oyB(4Pzeuf_&8v91q;z89h=!PXw|(bi4qK15fwmHbD@-$nl6uM9^| zr3di8YZ#91dpY?U^kHY|OXi_3IrOrtp$k13IyXzNas%+b4J^^8v|9RqGZi_8M`Cjy{xxt}f;xjXF#;8RL#1`(>8+RNL-(}6V zf2RJwwSOK>CwBJaT+`#&KnqsdcG1rCA;k8~GrhS7Y6@vH`;L0N|1~F+(Qf~*PrsIY z`KIUP{WS&UEtdUM?5Sq@b*9+!>fDpMmAquzg6y_id~>Y$tbMDSy%PO88cDMiIxg*& zG_|p_tTX~g{p)aezO7b&*z%_IpPaEuKK#%A6FC)spnRKmPxIMjS}@TsiQk*`j4o)f z58L_q=nJj0jwH|L?g`bk`EILz!bc0w`o1f{vO6QQRBd(sy}Q9>*`39wsdmE#_~>Tt z6*DW*Nk#5-_f!%qp$t7$_=WOW?G5F#tp2Fs`3L2*HjXCEH{9$Oara1B?UX5Hv;VDH z!IyJPh#_A6{D$~rDcJa4b0t*SX%niq@ocA`(4RhBF%JIQhSNmd+Ig2WTX>eWN}lEF zb6?ocM@Nv4QqJUtW}nfI8Swg^kpp`z^bF`Lx(XNH$ajt&!-jQsj6nG&I>J|1@m|gqi`o^-MTBF3Z;~(O>#SbKa zAN9H&a{@ic*>#YA0!Ni8GM>CE7$Td_CjNZdGrrRREi$y9vG>&I+Q_q%fj&a=pB1}7 z^2-&0zakdz>e(NN_C+DT<$I*)i@=i@41?w1&+u83f1G=TFONO` z5>v3$rFF?3Y6VBqNUUM$m%)9`SxL|QEBmV~oq&U%f9lsO4Iz(xE|0{z4nL`x9Z&04 zER_$4$>U+1#Lmm!uj-@C_<2o^F>f(i0+9-ykFZzmQsS<>$sVP2)`@i9k^6Qa`<8O9 za2fSm%=r=>DA;=}gL7v`o zKu?{S=-Z7BIFqyz3#Lcjy}GAs8|6sMXb*eHz1n|{u43$0kVkaGn>aUTGS6`-TISqx zPravBv(Dnp&|PutK`Dt_H)&yUrth&XV%{yvP3y`7)@1e-W&uy~O{QG*_?gRi_Mq1{ z>hw(Mhd6XFSPo-x=iBzC(= zd8|V{W9WP7Kcx?DVjiaOu4tz8kGw;BMgPV44)}m)Ok$6uo>n6Jc{13qrH`Vo)*1^v z*eDEa6H+HHbuzdw!!{!Aa6O}~noC;oE7B9S)tT~)4MOUEu8qdp51V7ryJQ=8)fksU zUpkY0Imcv)p;(uS-d+Rcmh zvfm#$FbC!OdeRa*;4Cw)8_Khsj;H*caZq}+Pa zNxsRt+p158^Zfwd#dpkLEIo{+_~T07Rr1|n96i{W1RsTO5WhhKIhc93Ba?aSy}*~f zNY_?gWaOTfSme2!wUCOeEIfoYmn#NhD;waX2VYm(Vx0vGGc#)bvSryNo?%tR^gD2? zBhYW!Xq~G_+pIY)c)8DR(-y{zF4MNCbyTI5Z|Yh?z2#Z0)$%O;W8I~#&a?ETe3L$r zyYyvrT9yBNvb?ON89rzS`b;^qEe%?Mjc7+X`h@UO8-L}@f!UnrBXj19l6>>j(m7@i zI_AkvIZ8G-btKn}5I5lDrE|w~4eit8{-c_C zkax;FXWc$qXY1H#+@3b6Uk7^3JoasOH@mBa4^%$;m9P1749<@Wqnp>B9NHKj-!!Y- z%l;Vl5S0zhZFE%_jrvVxvlP!9 z$*cXV3O#XEKJZP_%3QgT{08g0y#MH1#BXpJUEx%%D6=GzEjT$Fda?q%mN+1CzQ^th zS<}a8J(6B`GjAWt&0(I*kaywrYNuPg$Ci(-)r!v0FV_F$f&XRv&-DAVv)J!$!7tZV z`X&@Uwj_r$KArTH7ue}5FUdETgR}AA%=hoG^x#|Q^TUta5o2ajpJjQv(6%jep#_{P zZsD)w*~CAE&+>kN_vLABb6J|!^BVmlb@C_KWz1-y!K_ zZ~Wd%?Ka832zDCQ-eakxHz>Dn`zW*TX>2z5w2}>zz1mg1(nk`DW1wDJv#D2wZq-Y3H_ZxT6X~p=PRQ_Y3eH>zzjFzD_kp{Sv*R`< z`FgVOIcAJ3ylSBAl1tpCpFUikrsv%4)T5GfGT5_vEX9+1`V?!to~#uKtjI=fMVc@+9ZV9A_M*Pb)by?)#*xzMze7 zDoy)??7=2YxWcwmo;tFCI4oo9J0&I!W8-EFvM%<4>rHnQt{b)R=wsQd67ivzeXN7= zsMNusOvbX7Hd*!K+&C$_=^`69%7|U1aKj63+~?p%0q4j`I>E)P2i`yIEjw{s=0M6s zcpPwi#p)#Dgz7inC$SweiA9=u$79W`JF*^5hDR*Xy_@d-k?(XF^G)W0<-;xg!+8Y) zS6~&>pYnWP%D{Z8Bus?M&Bp zyJ?dvs!i(uUim+f|Fp*y)gFQWbLugX_9pA&x`=U7bTp21SCVe>K)VGFKDWD*^@&!R z*)#B+&ee)$Pi3BQ2gW&VzxGT4dT4D+Dzshh#uTmX9>JNbwYIyt@4V5b2Q!FWCjb55 zKD4yw(GD$VG5^cG`KHn(y?)z6tS95T_Kw$zTC%h@^ULDUY-q*!_~!z9NGthkJr4d6 zb3@^87ISRNmwn?)Z`5*1N9(KLy>D`aOn?K5Wd;xV+Wz@1?N#&~tZ=WDvBsTXI z5HI1k$Xrdf&cqs5v6sj>Oj7P7?y{x{jg97`jP~5_jIiDvp>HDCHw&N%sw^Kdid0#f zD653B)W2f*3-xa~|L*4B9|n~lU5@m#Dog6~2J4rCg&n*fmX~_m997O<=BcDdUu4l` z_P1GU7QBIV?{j2lkbf(r_=tEtY7j^UA6oBiXu3ABcP|d2^a|i*`wV*@L9gcZyGkvlh-~ZQRP9G)*V=D>_5N zWADe4Jax2DWR1UBU-pJt^<`aCb+yWDp}uRP>I+XL-#;%sPkqUIc75@)aME{T_fu=6 z)E7Sgy!92?KyZFLG}3C%(6U)pdq#sV^r!z4%?$9*$iJ~WQls_kb{FlcYcARqnXK>L z#T<~jS@VLvm1owjEYYVdgGYIWe5?NK%9QoozYjc|oVy!%yT1eOKQda|{VnjMhkuD9 zv>hk^0)LDjN-AXvoZ1_;9XdSPF85S3NeeDGi5_JSXR>z>O{@}su?eh+nPbL|o~&rQU_Jf2XaCslNSm6Y(ICPgZB-_--bK{FHp&TR5{d^Wq0WnU~)4YL?b?_&VKN zwYu+{A(79n+w(wZw%fIm^`vN~;1Dv8$k(zzZ#L&6$##efhNgS3s=9!!)xfb2T1YOISMBYw`t1@1jy1ehs&;exk<)!1SxGG-$ zqnF4TLmG*{vi$yWQ%fkLi!>#DcZEubsS-yTFKIj;F4C1ec~@vf-;$8TR3Y|CPRZg4 zR}+^h$1DGbYdN{dd0XkX_g#ryx$ILGSytv|2RbmTpSM3`c0B1b-;?pD-{taBW>TNu z8e4gvu8*tlp>0Q@IV_+FiZ*0{JO9{g=Sz|AwB3(vQ49Yg`Fh6qdPL5z<-2+pIY*w= zoR??0bf^63`o#KOmp*LD-j0cVw}&L=kNj^~Sd=aI&X=^zUsM!zpJXjUIg+rIvQBa~ zko+qUT)x9?J_27S@9O#xnxmelvp3H(sD08l+0P+q{K>{bW0CLGjmg^R%vs+IWwwv6 zFO=u4#N?tqg~W5rEce!Dpc9jGpSFSJx3RBdG^eV6v5MUUkLZ+pxSEqeYF zZ6*9zQQybNcJyH~@lMNzbBAvZGhgd=_w9I$vQ|Z{d6kXdTTr*+rw@YnmK?a+>7QL! zK5TY5_!1X2wzslBQN~tyt&Q{tI{Dp`sFTnb(LcCnz++4u;4y5zZeo|js8794YnyZ( zYXW&9oXwRyg?dgTRxNE1eU|G-w>?(L+-48z?&ObXi#*5L&n>jSl0Du%%Z-Vg5w@e! zjU22eU!A<0*kr_FbL7tjKZcJ_MfY+C^l}_+vi4w)hPUQiwf5n5J`eo1oIACI^RA83 zq=|`oW?YzaB|98j!5Q=yr-&nYoc66bPhVwxs_#;3wc>{aKZL)Pd%c=h4O-?JU}R9& zBJ2dW;J`d1^sRRi{OsXnP{3fT_0=XO@nSy=>+g$M{o%GR4&y9 z)u-}q_3PffGgF$%XWmU6Z{sX08Glb)Vw_QGOw3%JyiojEy4=ZGeO_&)XUxW=!XeKm zahCeZ)9$LITgN`1l*pM4U-0~G$}<|Zo0I=TTPdv7-h3Aru_!(PNdBOXLf?^_l?|tELY}*gJ12e1K06i z^t0AC@TiRcf=9BRSAa(w96XYB#gK+%m7RvPB6Pvjv4|)Tg@sHMXgwFWKafinElej}) z{1@7KqKLz{&7i;i_qa0G5FgUY_aJe#CEueGUz_`5+$G<7Ek|UIwX8={58<^hCGXD} z-`c1#?#FA!RK`G%a(?E^xi*9Te1I6e z*h@Y~ZW0+?@{c6%jCX9AVlnT+ODf&5lo@#sy$|aSI+G&dB_4){k?(S?dQHn&{fd_J zSeCYX&4aeC^xa`_!ySMoCLSO)V>t;w6P1rT#BTj^#Myy7SF&#F&xhlXr7 zP(T0o^1JJ-b9~3t3+)>Gzj)}Jv+_r`S=C9}qsoi!tKKye*{3|zmZRXwUmKd+-R(w) z*6e~m(X0R6?Y87k1*cZ%5W2S}?izmTDfpFpD)PHCE8N|YJDEQfO?)exsZ~JpE6Qh9 zVq-I~qq@*9T7J{O6s07oL}nsqLX zzz=V*;fFVr&un5WRlX+tDTMaOyTp>Q%fVJoIa|RQc~|ylH*l5zb?=%x1xA7{`=GGj zBl|18J*jG=4@i+=h9}kK5oFCK^m!> zT%8S^NBk1;Ca|$=1`ii8_e|zqAvTSYOLTL&L!-o=6Q+-kVt-kdrg3&)*(~{|d^3S{ zj-BFco4=Pi<+9=$eSm#J%Jvf%(?H+jhh8w}t+i8pgr0*B>joE89igF?Zd@ZyjC?!V z*Y^Xt%UT;jXBm#Q>51spGo10r)Yrd~K%Ez3LuyB6^FxoAeA6DrR;}R5ScfT3y&p~Y znVpm+=L_icfqWNzzk(_9ckh})YwV;iiou8F^u;o-)+7D`lHQ30Zsn7*N|$IBuchiJ zc0lpFh~9f3bRtu8cP#@44ET#-lqvG6vOfvjBhI?TehRY_J8cPPxJdu|X|G+culDCZ zi64&GuV;X3k$tw$gurZXW)Dt<-Ts{qtulAJ|G`>Q%BjbX|4cj&7q~2aL>lp(kUWuj z@YUFWI?%;-&dALP^1f+yOjI*2i@1jmjssD@m(tQ!3wQQGO_A!0Vqo@EQg>okIb-kz>skQ&qpDBz zUC}z_GyeHQG3FOCW{a?)-aEwPKR$;u(Q~msMfD|hPu3GHSzOvxCbW}pG8g5p>Lz)_ zr$;XzXqWs~{UP}_f`3AHI=_Ma*MTKCxe<9@))%$jN7wn+_B=d?7M*WDWGb{_8*%Z~ z+FM6Fe1jNQ8|hnt8NJ@C=kvjlvGX7HMGI?!lp&YLk@E-h6u+VW9b>! zN!|A+Vw3V}yZz8dNfVB}-uyY^xi2cu2jr1HI^yh&l>fiU%7yme^SObw*IhPC`tu~| zPBd%P^V(O3z7y|l6&(H!>&WNWyTjNWo4}U{`-(be@J_n+?fCeSN6Lj4XN^tlYC>+` z34bMUJ1>=SFPn90pWb$=w{NE(yppubz%7`omWw_W~;Ow>YONnP8c@~pGU%*TJ&ZFa(YNZNMVA#G6j`7mkZ z`w=Ifi?NjX(URuN;e4Wb(f{Px&%ZL}=s$6naoV@UmiwiD6b$K`Fnj;PvB($XNkuLX z$BHh!Z00ihMf?QHg|<;gDerT9>|R?wBOAR+wZIViEA{bn9*VJ- zwIHe=Z-g(HOnt*o<~0_>n@N808?x|-_DP#A$$D9o;|wOdM)#CV?PbC>5$an zuhFwq=KeOB&&*3nTL?|2r_zn3cm+)WVSevi6>9u|K_sQGl%GlypL2Lx* zyYV<3jRp$wX~=E4?gqO zA=*v_JM6?#G<=qy-!Uz>OyqK_?7mWae#v_~efB~60G&-@4G81A9f6jQ=eY%6u^ypk zPW(3??`nUx@L8Tk9+N!OH9?gn_dZur*J5YBNSf~~(acA!Hru%HKN+WJx!BSL zcpcu9dZ{u8`bvDlEjgyYK7;-7RUUOO-k@;E_US*TJlZ2^6x_4d`2oBc=gZGAMq#%` zM!a1c-{oSSsxqSQJK3{=Zajg*53Y&+uJ(w?x6iQ~o}mA?alX`R|GoOzok_lDmpHhi z@<@8I6}u=?eS0L&oulxu&pm{*VMgJ{9}kX?2FLB#W-4t4dm`YI8o~F*Y1Dnj?Q={I zusqAAWlNe`)(W+6g0Zyvx*dH=%kST->3sLm&{6latjytK>!-1%jpJJ6S$kY)lf;{p zbCaxcteBek$yE&Dioy0=HcMg%6T_ie@Zz~!hndmoStAZVPa8U!i^%iGn!uq=#JDa5 zzKVA*GGaKEeJsTA>=>EPMf_LRsU;(H_GK)jtqW-L&73X!O^fa%Yp!F^ogx_<=x;0a zN>I8g;g@v2t3Gsi#ssUq#@@lc|JZ`Hdf;^x*tp#fN80L1nS(F7tHGF78Stc7^DRNn z=jmNz$7~e(=lKf$F9p8SJ)ERRe)s}=sFsq?Devg^p{Dqf8NAa6()Z6S)wJqARoJ*M z^&d@n2IYwCCF#7R6WLoGen=ZCp%4C{vX0qj-=4XD zLI1h8XVXaKTWhpQKIU!Db=094z1pk9;V?W#)ws?zArwDW{L)*IM-t0i)qC8dyIs(a zZE@L+r5j?p!|>peztk1mEwSg95G!H{u_8)0c!<>zW5H$*T$}h@j3Z7lJW|i3t(?R0 zU#mh>#~Q859;wPnq`XAhGJ$&z_lMwxpLglU_F>PgEIENc95&wfo=?iW`T09CITKMs zPc|Fec=NwKE;laVefxXJfm707HN7HYg&LM-*`)(JHE}L0Ax_oBjv)pd+ zyD+e8dEi9>m>{-D%7ss}%M{(D0nHR&C57V;FVF1$4rfC=>eAo~?0BbV?mu7L7CSc4 zw4cC>7w6~5{-qRfAel4LYq@){eP-&(3pOrs=lJpasl3NsO&JN5|2E(9FOG?ydpec2 z`KePSX(~5>pZE!E%vxa1W*?G^Ih6&!yy;o3M<45{s@w$ba*xbruJB#@NBn9$?7G9KR~kLX<`U(@KOnR`d?MfTPjn?@6Bd$h>m zdgF88_4}i-c~GzSN7(0OyzkYH6;MZGY-OO5@oq;KUVbaF58)*%?~px7w$3Mmb+qzU z`c}%KjFZm;i@aj1t&}#BxAI%~WD`4m;}X$}c)G%rb>~1)H|tO^dr)DR-ZR#(dRY|JG=h|VrQh%XPzN~Kb|gGC&qiwT~c?C z4ld-|cpAyi%{lqr^(HtoJpyhP(AE>IQ3>3;MK^$KSK#p32K2N4nKlTG>byfUKSze@ z#CCvQY^8d%rhuYY&i54H0B0b57`5Ku5Bg*+%nj2Pzn8zzLho!4GuFN(gu;UOR)`! zo>SrYSIOwp?qbdnk6mY6r!n4@jJKhWZS^EFx7o8R@PuF5N#Dw|x~fQ5Lb_q3EAhN# zrIYz3|CQXNo=@DwzNg!WcV&-XLIz`;Swy+mwf3@ZZ3K44?NY9%)gWdIJeHiV%Q?Nz zC+%k(v-rpU$W~**+$uGPfeqhvuHHe`tPE)H;Qomxz3kzVK1xk-{ATfiQ2v2ZSBasp z2tV_=Q=SV5&oWv3w_W(;40%4_kKYs+=u=xiF?ehQMkYG%j7i`x^j_LlN82`TyI$hq zi@dZ&)*JtzzTEuN>p9bDnDu|44{h2cdDNa}%9HU;$e@f&`cV2v%9tzt7o+;``jF`O ztbXI0)o)|Z?l%|fn!DEK6(aPPk2nE~W@^V;faQUQ&|^Gye1Jjx1a-4?Rl1{7J)iEO z3>bs;Lsof{?DC@dS>~l>V@?NurCmy9l)Ky3!F-DwZg--iy{g^!-{(V~YT=E*_ zo!tiOiTG`#fY;JbWzbp5ILi)G4sXx5Ef43x+w9xZT?_upyIiTz9vxVIbkrF!+O%TQ z$akgVkmq*lFL%NB!8jg02cY{q49YfiwN61h$;W!tBk|M9zWlreJUf{8oyt9VrA{4(=!m1+ezp!sw{*dpgFhO0 z3vX7RFkj15xTV39sXD5%qT3|j=o3pntJ*K$R2~CcHy6}QfOxCrJF_15fd7GtZm#;XHGfck6k7@O!)y zL+rp$`PRrYvDkR_1Wn#EdH%?)zry+K$B8$_`6$Ed$ye{aTtoLWynfilx+(n-jX%6^ zsd3hIc@9PSBn?g{|BFeh@Iv0t<~i(hkoqdTZPvN~|9{5q=Ded%4_9tuZ`x>WM&;G^ zJZK)v_{Osr8X0lpIIU+BF<#=J9hsSN!D;Z(d)WIE9;Fpsdytq4q^Z2xp5F?`)ZF`w zIo!mW{ewS~j&kH&7IAlX@GLOo64-M0K(CB5t3%H%!N+2_K4PMlxM~0LHD}~s(q8@9$B_L6 z-#>$f?WX@DE_`Y5S3Sy}N!pj-1=kDQw(ZW)6E}H~!;D@}@HZ}_s_x&`nLl8!M=NQ% zw!3qV&Wp*(@|7((n(kT+GVG8ulokzwRf&GCh4hi_F{B@olR^5(cGv3gQaS(2u5%fC z`wC*Uwj@1i)93U{Cv^8TvcJ^%G`7Dww>Bda-n!WBsd@`qTesm`77s4-TGGf>2A>&i z-txEP#N`Bd^)hRw1@Ua`o`x$jpeJcMeuVg)Ey~;&K zsKM^`{Vv^vXY8qD?4*o#+9T;KSd>-yzHa`Ae|0H&>J!ihpdY1xRIX5LhUP&jqC%H%0|GBq^m;vCPrp@v%x($MR(e+#ij*2bf zB!0bEld9Y4ch%=LOSGKl(zM;dLT$Cckqf$ntn_v1g9PbQwQgW%=o#GfM9=1&roj$Xm$&KkS7PJAt}A$CXG%~T#87*h6N8=UahoC8+B;|ZTNM{=Dx zQY$*e7_G6^i@&${2Ga&x{;=29TQ>X5ImN!5>&wKaWDI*02F{8TJ<*Aqa*+|5>!i%{ z#qkn&x7_YC3*b$JW{m#_Pf)%+hb;H~Z&_;v>*s(^O825)TCm^;l>BGeNC)?Y@E<}~ z!_X(yC(&!kXUGg5;)WaWnwZR;V&w+r*r`KGyF|aYs8}!5=n_`Dmu?>n{39V|~ ziH0TheHA*UaMybOD{ENtEbUk&{p)dfkWGX9XN#Y({dj@H7~6bZF|;6_ce%?q<>M=5 zMW?skw`tX)^FCkN=)BQwILAMja?a}?Z1Z^Mtlv_u&9mF}mGOzjzjAPPPmcRHnuC9W zqtWF{ez{7~tv1>CE&G^@-DyBjX?8{|C-KpVOm# zyH8^SHK2>03BKJMIb+_qz_)vm+bBtiTEhg+>3n-{nTl;8-!j<4CVI*;(aR@m4{oJ@ zj7!m<5)(DTxrSbF#PI#gf)qIi+nsr_Z+DzWV=tzpsZ7GAyWBUZPAzHL=*S`?Q`X4ndP&{nd@1e;l{2-`a%P># zEzy1kpV3#;@4T^QJf#1sf5t3rO!5W3DcI&LA8QZqvw5G#yD^+KFy6N^?BJEuBN9j5 z;1T6nE+yj(rjPP(G5OT`Z>P0sU^MMw%z)+2VaT-*)A&0IkE8+ zEV&CjxwB>@$X#?q$Z5!Bwq5>zQs?ve2&%Hi5o<|kN4rDIUjy&tAA69jei|tMQ>T1e zrxEQ_uJ&q3K76d}wb*@T9<;U@J)V5S|GNGp@z)IZqVBq(@RLWdr7qM=;SZGjM{KzM zHE}O|$A0pn*XwC=HO<<})s7!N&WN0ohR*NH)gghq`KLaUc%iMEkXN%(v^HXnZt^Tk z<(y7$)!bAq$MTs(H@*@7JDIzZN7MfqeK_lz{x37badLm&@+B2}RDYWC|DIXwDx2jg zU(_vr*tL|emH&%XzNb97yUF2e)E*HFF0f_KS@b%d%NPpn0M*% zQDu$Z#yXRs*}Qke;l06w1@M9kgr`bQt^STIC2kD+55v$653$|Yr@1n%{P}?3LnUj~{^d)u4UeZv z)05wAk1IgtVb4L_*G*Y-M8`u+OW|u0@~r11>^_cuH(mI>@m(qKZx1tWet7Ta@xv2Z z=10$4nU)v~kCFZ_o7IW08vC6sT=|{DYYS}YSJ7wp>rpH8Hg$dkd-dz(e`kYctpT0v z<&*c0bm2{89k*i+$~UF2#x>uq)mvpC`)S|xnQ2e0vuM;-`keL5l6N|t zKKD?UXx{~FE4I8spLf#dnLhN<^z(M|7Ls?ceA6)!J9@sJbF@p(>HJJvEp~u`eH+dh ze)y-Hxql>n8t3;>aWS7nKPdaox6+4|9mHAV+Vp2%P6?O9uk(5G9xLXe4Mk=2_hK$- zKmH)roR*kOVhbvU&kGa#wU~DV8_UitXD>)vxqRS)-0LcC&lcP$V?N5e*sfA}4nJ97 zZX3DUoQ=*|V|?dgUruJ7%C+@#TQ-3=UCUSX?-7!^rC^_cjwe`UAQQ{|h_m+ju+1ns z6aJ!annr(%Y!+Py;q65BOyQq82kGp26Llssde9E~pg>#qtbt6pkvxkyhjQAK%7EZ) z!I^a-e~h-X;L~*$9U1G`+@!oy$dx}p*Vlco#XD?~Zz;TsO>?%E*cAqDCANO~K8?Mb za+j+Ix#@LmzI9*bhm2$ELdNi0TK5oNru*v3z^{ozu?-rlc*cjnMQpD1a$dGA8z>lZ z7hWopOK>#0eF{G}&=%4qoR9uWT+{YAdmgav?+|$Gzuno#`NZxhTa)ZZOmW6|tK+X% z>0S5it+38NH|KWo+k6!GIZ3q1$|0}(|XJtQ^|VYx*K=f#_G0Ew2K^}bD6qm(cmB zQ~4)x9;B}=xK1C+bMb}fl+p(DwyYax$&|Tv9vPeS^79rvhhILso=NPn8p=L8SG}xB z|DfCZ!wY~fc|>*;KkF0kHko3#i_~M&Vt#XWbpLv;^v+_F4?BB)euU0h^3SI}(P`!E zbJ0EM;9JLS=pvx!8kf?`h(Gu#bW@Vo^23z>JpT@O-$9Q24(l}pB;ge0N4QS&-^Zmp zc2|kpE9G79o^{(9^afv`=SDZs7{<4* z489@kEt~bjX1naLBR7W~x%o$K&0Nzg`4a2bKpQLFNv*Cs z?Y&Cu=EQ)A-;~7n)obLOi4=5{ZtTdwRJ@e5F*21HI5FDvc6=lhZ(F;4z+PWhadY=B z_kvwgwhtQS%Rex)cwgB}Uw$ihc-;J=UCXXue+&K0`0rjuI|c4y==Ghz-AkYCyU~|( z7R=B}bLaaHqVJv1l}p?rsgvXpJ!tog+}%H?d`YkNW=kE^9NX$%&>fNV&is&kKI`nJ zy)*OJr`nFMYRBZVSxdnCVsL(rQ=jX(OaIE;TI|dv!PQ*#oX?!)UEsA)Uy)6PKWL%; zp2heNG6&`|m*L-b8>x2e!c_i8UU22eer{g{{Xuz;pcnElz|QWp=~Djf2gZRyUruY9 zZ?(WV+ThCRTBxs%yd?Yg7!S(*6Xi?Ua&@LJ#McphKXY(iYFw~x`xMiB>1tvvYCDd? zE6yE~-(8P?-E8_#)(O?O(*LU&2g7NzF_w9W?O++-R2o%=-1{m9;#r-In*+Q_#(cXk zQlXoBH~6}hj48Z8bROU#7bI9ZwqIgzQ00i8Ya6zM3Rk(sdxYIu^?NlDSer$tGX+Fz}dXjfKR)mW22@e zFRMJS|4n(>@iS<4vA@DVm&cxlH3R#WH-Li~j=WI|{9*`9?Nzc{2C`daS_{4pV~=iyf024B-rAUekE%8H_I~5@jr}QT zr|^-ozgM*}ToEwO+g{4tD)uVsB7FP@j*t6^J9Et$QNH|wuN%PEcfnU#Kde6F zF0u0KSRdqEi2~YJS21Z6eA3pP*wQ9!}aIMa<25d=!)$*fiTU#>H)IYAaMM8SqC)&>GNo3$|pWZZmP&tu0t+ zyGuseT@3aISZ#G}&7gJ@qP8Gl0%$(Z*L~l2m_)kW{XX{b{p0;O=Y4;kd+xdC{yw+s zG44e_2Aw;(`|Q&hfhLv3U!U^Jr1F}4ukpsAErgRU^v@NtuCU1ET$93R+$p%}>OrZk zbIO0DitO5o) zd1vD%xAqIA*G8N5Vx4<6ZmgeatRZ|J@w4-2A`d5gh9_)Y(G$+vjnfbJb;9^KEE{zBd?;_D@r3DPO;R>#V77CqZX3HP2`# zUD@0F9X99gfTyw@aO|2-QXkjwuI<&P-Sm|wZ!Vy;3!P~9bmkE)oC~`H-O{A-=kTcE ztKMgMhx3D7j8k+^U+&b4X`7NA#b>|diO|%oFBQ9Ea?0JY^-Jl0I;O2R?PwVF@;hWs zab3kl=G3kwYs$xW)B0mJeTCdXQQH2x0y03CKU+(sN;=^}bJ1@oFeZwP` zkMet-d1?h`7ECz*jNuDco;}<|8;<#f!dD#f`lgB-gY4g4$^Aaxt`&PD(4GCCJ?2(i zon0D3I&I51Pj1tZoyin;kaey;p?(fOh1FNXn9;`-PByXH;6;LS)^_-iTpW&CYlJUT;%;DYK{hE7~hxc#R8!0)+;!@6Ysy?;uKbgK#b;P-% zgW+QDO_uET;_r!w7T(-yZhCM*S5sD9HQKiw%E zM$Vk)kr!jrJl3unelqV&KQI4w^nzr{vEygCwJ|4d;e2;HwgdL94R&#traLYkBR5a; zDa?-G_^v}1H*r|k*4m2JKE3m4-r1Bj0dz5P?eA-3w?DMwE=)bpb zg7&_9sb2dnhR4O|JLOwEm_1$X9UwnyFJ)=g#Lr>=?MAz!iI&;1gm+)0ocXQp=;_=^ zI;*XzpDl(Koj=mt*QZf+=FKO(IgY~Mm#48$0cVt$H=4KEjhpq$E~~F=l-`=h+>%gD z&7$~Y1I_rV;y(5%CQH|Qy5=1PloR~12~t&eI93^v%OGu z6~i@GNDuqG3lm58C9~U;+K1YO((F%z%2<;nD>;PGzNh*E>5C|9;$d6g3hR)k)>V8u z`=?i7>fMvmih$K)YXg1Gq4d>XA7Fmt-Oo8bDcEqr>KoZo=|-35OPArEuxYj5B)Z0Q zx>~2gT{KB=tG%_b#w9oZ42~CeoVi1Cig>m3DGoB5vGFMPj5Wb=ofWiG^|^j}dQY!~ zc9^tnQMREH^h4SD@D%z`_KFIrm(%FO(bf4|YAlV9-WE!2`Aj&avK)|3r2M{4eD|); znR*c2@8TDZT0M9b^>$_7ddvBw)r08D+$Cq%gKfQigVUV&AL~PJO#=Jr2SkU_i9<{K z>cn%r_ip6BX0F#}{jqc9&~l>_vvp`8?>O|=QRl$W49-xc8BPuI|Jde98@J$||l zx|%&gqqC(qJ-hLq&gn0|N~bZaJ@|5dHr;u)xQg$`=_}{n8eSf4^I`O=!hMSI$=8rw z;bW2WTGpvGF46xBfpZS9pJl@3e|pvyjXR=)%pUW@(fhw)be!G+X=i^x;a%bjYEDHu zCZ0b>@nML&)r83lqXUaw!!vWI{={|X&>vtg)84IDIzE1wBR2}Cxrkt#aYQosxvuQ7g*TpH%wWeD9n2YZCL_aGKx=f0C;hK`-kQ@_p5t^& z|1_?985>J$XE&|;T$gO3DV&*a5?AASjpa2r^4CoI_Vpg0rSBEb#ASU%Ya{J;-dlt| z95t#ozY*I@$Kcm0lYh;@V;AbKIW}qOztpblm-DX4KzHHRDyRCYsax|o4?nqHZ$Pu( z`wne)EOPZofP0t7)Cu-#G$}DU{OkGa?`cM7om05H6pUgk^v`5IT`PWNl6+>%TIDeY-WN5fELU|MqaYkUL zeMAVq5O(%>BW^_DxX@(LQ=|KmyjL~O&9A>KIC{U_bS8uK9y2DXpe{beKNF!m#sOZx zN*Mo~di-~Kn;XK=s9gfZbLzuz9R!~6M;;#{oGjD(;m zL>mdE_prX`>{K6{y*KOocLbT6vQ|aCJhY5;8Rg-my?L^)2eS2q#w;}OhnQ5D`$mqP zgDGAFo`)>0eq7wmeI@zJ=8_GyOsN^nme%vw>x9?uw+DMD-UJq zWuNESyihv+=a*M{C%ZkzY}p8R*0GDuX)2A1bIiFi&TSgK&i}{F8jRxgpC4=O!6Ban zV;se;v1x2tG*52>G@PJ4Gr```c;6b6_Rbrf2EEn!E#`C(Z0E=Rc|H$@(2oUfz|13i z&-kG$mA=00b9;UF$Gx>6$%X6>Ds0E3`Kb2W@&i*r9_t*h}>Zw@7UpGCp(^<%2o1E<`2 z%S!f1Id7}?Ub`cf{*&;F#z0^3huLifyb*^T&&)jda=Gfk?W94nkLfl9EKSN+cRpP7 zb7o$&do*!<+oJMogchAeGxXW=pFsENU*9qGsNtdZ5(jy*=G#y8ZBZ(HtzUg@Vjvag z%@pQ=yDLB9?7jn=i(iHQ-`e)eys-qi7BBMrH5B3RKi7&(Ec0|q$F^8%J-VV}o0Dpq z?;PlugiK&}C0mDyPVO8VnZ@1Iv%e>$^i3Y?&b-qod#;V#4@`15P;vG7?XZ8Fkzckg zum0!tL-uT3@hEqHBtd$Nvz4E8RCasTymAUUWe)nJ3VovSMGXC+d%)^*ne!ddKkaFE zF(3Xbbau<7+AdgGj)y?x(BRvBFMDKcc*idQBN z_w7{lFZbJCUWPXcFBx1j(Yu3Lai6pOj%$P19oAVm#vRtyMRq@-IQo3P>KtJIv6kLz zHMDrTPIFE}pFh6w)A*m93GTaZ^?$SX*ms}r%su@>1gjKE1#5Lx{$@_i&I!W8QU$P#&cJ>|1 z*-N(Pll^r4yc9NDUP-Utp2}d(V+Xm{6W|UEcgfda0|`B+HH(flZmMIQ(=an;>^vPz z4Q)9}-+A!x;FhBu*aPes(sJ-HdYZP|{pp2H!)Ne2Nf>PQ9vpve%Tcv~8uZfy#+U6w zL-pZLM~hPzJd-ayJ1vaO9OmL0Q`f2wn#B4Z>kulh@QghR>GQRgG)qalox4w8gSIYo z+o_pO_qE7cXz$Wp*y~+hLw%w9cPqZ)jRmTo8;veko_Z&=jWZnbQ@%y4$Gm&jRjP+R zeQ_=8ykXjv<`i0+TR{6>O8Z_OtKH1tbl63_x$D3E>d+@@>@pI&PI;VjJVsd5lqz211}h5q*RbD+Q6 zn-lfwi0rY``Pdj?EZ)yHm)H0AraMpPi@i2C5E`32Iv@6VQ`hhAPE(=B_hQN-9{XcT z;d7yVx^>sT_BsVWXrbl>`o9S1r-NQIZgSUto?!MjmwM8gr5~QLt_hQ!ulh^%jfy9K zKdk<>U*Z4z^Hjfo@!b{f5cQ||LAKkC+9$-%4}Z41=knLL^XT2rjfB^?Ge%}|yW?Ao z$$I^e&Fpl1-W&O#-QfrAo_q*r@2@$`|72vc9val|l*Q^9$Lc+zv)>speNDvJg3EJ& zzFhh4eg2b9gOSz5e;+PPUjCdrn^xiBF#8T^?Hl>){EScCt(&v+=^y`p636F5c3j`B zXPwTI3}W8T*#>JT)6iw>z>m{kW@|6-$J=M_&ufogb>h=Ik+Ek2w_55=_m11QdG*(R z;Q;!|Gx28ii+3Yy7`H3lS@QUh-2ajHlP`2rwg2diaoXqk=??6Z?!hsP<^Q%ESCTCwy`yR)xDP_-bK6}^!vxl9{ zGqrC+7jwzP#OUth&?ehpk8$@(;Sv|{wmmeq@jYhsKC*4vh4`v4$0rR;9h-DcA71p* zaKG1o`eWArv|~}f&K{%PQ;B`*F+e^le>ROq}t%Gm#IV76cT&ol=bW9C(blRSDTd!93obH_Tnv6p!YVGR+O^FH5QuubQ3*RdDLXXv?~eYbPj&-(o}DUH>7E*z6$eqhdO=Ob6VFMIH(jE$NC z`Sqg{pQk+IJKKiJ_S71~_x^c*W|?!~r>wnd4fYnw*98BRPty;)Hx-hWH~yU7&|rC@ zyYLjF9ZJDy-|fV_@%hEgYfA5Q74xXwppl!xf$tdwBV%AZf~ zC8{&dW65uf-M<#DF>fJfcM6@FE1EP{XJ4%G{uwEqG1M8Xw)^L8cLwo7na+<43U8N; z_;sYWHgpE0g0X$mx@$S-;;pmljz#0T7iXu|d9uS@;s&Ml&W+yOpR=Hbj>cus4G%=e z&fs-jdehG5UE{hJ%$>WYb=P(2&N=OjJtuQM!04qK(o#Ix1<)DNP+W6GY+O+`-O2Ue ziB%X=&c)ZIPQXLq?UEt-XW?qEdysY3?UuC7JJTNhcuHUIt$1zA^ZzFQf9q`=?Y%S( zo!b@Xtiaj_J)NfWd&k&wQkwo9`F7;L{hEN$Rp_UO?qLr5>N<}mrD4{2;A<`Cm}4B;aBY#QU87SLp*utrGG$lBj*PW%wf%8 zKymbB%$6g2jdCRK{^Z>n?W!ej%DF>n)@GeS>3deD?_J%(M2LRhv$2q!rq=pG!=fck ztbzOcf>E1x1$PGg`AT*ih2O`S&w^ok|CKo#V+!8}SEJiC)BH204XBQw(Q&(e;=Ad; z#_5{r;P0m`=$`?=-}JqVW6e5z+>S4@^DiR*BHlGpT7~4Fw)wP>t~u8ea8^k^YDYLF z{@j55rj1(9af;`jjM82dH&63Y!i5rf&D!r#oXUV~-I@L_FYmPXj^x${og??;U-@;N zK@Jgy^}iCk{@sVx1Y-}St8sooRBzt$R-4Nid-xd{812?sDUI91QKzAtbS6(d+*OXB z+!TlTstGTeiiTqwn=wSp#_PWp1RV#Jj`q_h-`&1XWviiFr9o$>>QwWLBEB+YbvZIp zi2O1SW-qDqWE$BLU+_=4jQ2-@%U`tXt3l4EcKH)Vh19Fj~^io^CDW4NWa=4Sg}x8v1f+Yc1tTZQF8i{hO(y z#T);0G}ZLl(GYf`!r|vO7bZt;@z)(x2Vec?4F?~&_+O5GYQwWfcW!v==!r>A!>p?w zJhF|DkBcdOr3eC~>DZ)Y7n zl);_#75@xv`-Ry1!>#xO(SwISZ0>2AdJbVztMoMY9w~1TG%>d*`B(Y}$>QIV-Trc@ zd@p01e3|-v#vl6E7eoKUAJZOuS&@4i;nYV6*IwWw@15B93g>wXX5sYnzEEzGGxXGM zy?s&J`}T#QCC|#Bfqt02?_)$)kw#wc-pvm@K2|`3ufrYW$F=Ug;ePx#!dds8c|p$p z4oaQ8Da71?Ga=XIz>8ew++G{e+bG^!Xs)>*Ig>JUf2n-csT)T&%%XqIXa6I9F6Tx$ zr&5Kknc*#vtD@Yngx`*obs2!hf>bmG6$aLo#XDA z=NxF1-di2qa)@@N{Zx%PkmG|LwCf^tx!T=6!n6nN+9zXB;z>WTXX2Q-^xx<60Qeki z);(065s_{h`-SpV<0#wsijfT;VGk>Qt_z>X8a~s}b+=ePw^%;6SU#uw@p(cpub0nv z-ZdTj4qpBAk0(ASu7=OogtjP+{(P3dcw9>u$MV>*Ja#OPU3fe?*J-%(P+miAj??f8 zW9VmSXPKe-^DvFU&V1Q-kyW#&PrDcZ?aEX3Tl6k#-1Jx8*hlWA zj{C$iqYr8hs_*UJ|GaK&*#u3!xFP2IU2C2z80dC}66-hb88Ga~dh}ZHWm`Arkk=me zG|SxeX74Buf9WCJb@TFP?kn44&Abp zEdBMdWT|#_dJFd1J0s{|-G907JaEjrf{a)bL-Po>nsw~WpnZR|t^{5w31aV76x zUF)Q@mZZJTBFgKxgEiLvW_JH>)*|6+lsV`fFF7f_GkN+eKc#)Sw6g&1El4?8i@wXZ zOC37ETc*vkF5z4?calTs7R|q)VM#lEaTD#U?LO8);BU~DzYrSyd6cieyOz!+j~H$E z-;M1sl|6y(uVntxgl(2e&JHrJ+fgO^i1CpPgTGk5>H%ajhyCIQDElq!7Z(JFcE0uP zt@*!>Z2gSp9@`_%fnRfuqx!uLsRqUjk z9gKZ1e<0Sig>?e0%Ava*-?3?)>fucd z-Xp1^{Bu6!R0oi=_GNBEV=#EYjd31;b3uADLHX)zquNq4U+xE-0~Y~*#aA%SIno)d z-@Jjh#>?FYHe<)-NUmGI`HkR){2aG#^NDF2@<&ar-#mM&cLwCd<<9QooXt`>3ZTD| zygP!kn@i9m zvhr24;9+qJbLIb+Q(r za6czpm@t04(~Rk~Hv7VP$g>UeGGPuet~FJPEkQ(@~e`K6z3X+NZ~#~A8y zyph-0f2SVrgw_n}MXFDwe~2@Eq2Pr5Is+2J9;@n8?M3GZSH7CpFcF(AMdwbauK;)5 zQJxIJzvE+Q&v#XJT~41^M4zbj)A0GVo7YkY?YvnzNB{JVs&~n&sdMC2_1lEJs_rGL zr*0aRYOiN5>qfD`symq6ZMAa+BainD@Z|AgE05c(Jl+@Fe!BC@l##DC^11KI?H$A~ zOsu0F+%vo8V#ZquWbD3qv=#1TedSZBcI38?tZifbn>eRSvK2|Jo!u*6?Bz=KzJrec z6765|cN&?y16@5m%o$Ylr`i(t;Cf{s@6kZ_KJ4oq;x5j&mj}AH-k7uM&d0Dv3O}`m zm&9GVOXI!Mw*;4tEB)FMy5v zDDAtA{rC>})A3lKd#2_6zrWWrM!eITY1#a1!QCJCqYDpeP1fI6EJnt&{npZtsZ5h_ z2liPraP9gAbHTh5wCQ8;D?6^v0r}~&56K-5y&q=gS^gaQVY|lB`>!_FKb${bcJ0~R zLZ|R|`ZOj{zj;2;wYc(;yMNbQ;S}aG^nY#0kk&m#uiRcxUyY8DTXui#>pu18%r8xU zuKgQ7k9Nws&yS0|_l@hdH;t9dSO8nBef_<@Pvbp%R+2F~vS7zrp#ia!^o+}z#+JL8N;bUx#&t4D9iW&E|m4eZ|&$n9)mtRwz0 zUfxkb|6O!}vqH|y8@X#ciM_1a!039te^5k!8it;w*mkV|&#A&T z6n34c_a%%!8}wdYg0L-Chv=NSxA$3dP%?CgzM_!ywH}`&&WnLS{hZ*)&KczY7`FXu zDTi!G#lS_!M{w6!j#=P}FL;7+=1Fv0H?W8^)FIbBQ1Gtv&#E~I*`AXEZtGG-t1lE36~r* z4lP+qyJ}j(}15j9~2wDezV>O&|Y>npR(JH z=*^b(x#T7J&t6ZLO<~`bgx2YOn)}Di-XmuYb#M%H75$EP*xXU|djdI~ExZMFf_nkX zR~mA;3ve@UYd`R&yKv8Nr#i@Z<$-&hg?lLHHs)1Zk2}>Bf)6myLYB6^3m@1geW1Zv zSRWog;=y~}g|Beep|SY-uTP?W*0^qU8*(a}SzEi^>RND}ebm~scmJ^OzIYFPwnzWy z<`X?z7cF&0bsi%9_4G$R|8$ql$3Hl{{A4Wbtq~IMVfNI`cuF+$9JN)_tSSArY~9lUg>kXC$a+GRl>unjn1y3cW-^J@}o{k z(YqDTRUUL!ew97Aug!HD-&I=AzI5r#o!o zc;^eX-`T!*(2t7TnxmofpV^FmNipFFQ=;~&^U1N;kz%lN&cQ7~5yWdNwqe^TZg(yGcjfTp9 zbW&q-Ij59EpK&jC$*a^?diuIfXB$^lt}GAd)<@lf7uqK=4mjXe$3Ekg!v$7yF6?BE zcTPxjiKYRhcNm%;dGBM-6^~l7KQwAdeL3IZA9!mTviFeL=7rsft)HggXS)hUE$N)J z6n?OOuQLP1=)%;tkEDz}3DSJa<`KKW=51m6v)+Hg!kC4wg=tG`!oqCYMQi%gHok>1 z3tb>~|4It(b*q!tgD(YtfU*l`KSX%uIxlV#*uDa{H2%WB0uG-t*TNrU_D9fec>d zDPPyZ^rvk87RD@eEle-5{y=PJlob5Rt&Ui?%wn5Au>BhRo+o|bi@~2E|3%gxXv(6x z6Rxtnj{idI59D60N56G*<)(5xN%=nsemnT%#20=ixXOPG_+8+nl>o1#?O|)tD{IEB zZaj{TfhTR9KH@xJEWJt5tGf6jyc4dv*opl$Xg77S6JFEq3zGQDO?3i~GVrQ> z4LCgK4e2HA>%iehMELz)m~;%h9-R7#3;!lKGUkHsgD*k9K9Q}$P1K*{FG{!z33mYA z&au1&wtpBmWF%tUGSH+lB`u5tO+6CN6|VXt-{ciuxVVK83p29`BUwg<62h+oSKSI% z+azxKa&XBrX~w~oUqo)=A+)AH0y{DSR&Eo*t=vY0TOE@A5V-g)`4cXFQ&+BVE3e6m!0-3m zW5Ok`wEN5yaLKFcNBAai$)E6VgWpU2PX^xt4qb8KTfvbF7rY7iUf}bu*z(Up*TQs> z<)4Ky3tbD-7g~P{V-~s=rZ2Gm7RG=^b}3`#d~nHb2Kt3B1E(wzaMfw%gSbg{DQiNw zcnR$h;o>D_O-}+BFOjvlaPgAxu5j^^@X3kpl3MzqVZOW~r!6&}F3ybi@=975w=iO1 zCg1v77`HG2H0>9ilOAWw2sCm^T}G^1W-M-tp@Z@!gkJ})GJ+Su|IUz=-w$|c#4L0z zOi!?BTNty@wJ>ezOjsDR(6uma=}lM|6WyPMh8N+#r7{D847OOc|y2k^L6+qT(U_YmL3AGcCPj>+_rO9xY{}S zBnN}5ox}T>@J(KL?3#P+99k2?x8P2i5#eg*giq&yZv&^U;=+Fb4xO&>C%~a68K!-p zOG_>9!_T-2=Zs>$^J$Iky>YU}!nv!eddI@zl^Y<9DWvfo(r`WgMIAdn;UBwrrd(;< z6g~lDf6BN;gfo|!;@3Ac74Gu-kmwJA$Xwfxy*8SD&znzI{1^Yv!vp*80!^Pw8%(|n zuKdI!a6_Nmlpkp&PlL|^@4z42_*KYiph{)QJmVqu1{xsf4wl>isdV-~vdll)MYdI z741e|p*3RNGNSXdUY#X`F9oL#BH;Uw=c|004^U^#qz~T<8-ethHII9=r`w5lp;y*8 zxS`L&4DC_>Ng(G1&3Geb-CVh;y{T>f*$Wp3nlT+Z%C&Ck*FC=k&~I-M;kKVlzXq-{ zNIwc!8UB^J1y|nbS7mdyW)WweJozJB#X@MmmoR@Myl97i$(O+;ci=JMANJDWy*jT9 zz%3nLb0{$TxqA^Q8joO6aw z*ZQS@?}bTN7y}wz_B!dmVB-UgERttTxOj^^XP&qI7RG`87{moHrEfmy=lMM4_&jt| zztK+tk%3nLb04w9bgmaqwM@g^oW<^MSG57_t?#(}le2Wv21eZZ?iC&!smN5B%#%mnR3O1UxPdOigpuU^h%!OFI@6u zX*cqO{3oE>jDc{E2)~Ii)OY%~;48qxXJ|`5padg?Dt?2Xv#z##jKkv zw`GKHr#(zW`Sqpf_T|)whX%d%i=nvhPZ_h3o~iYJ!xUw!ia^L7VB?e+`@>3nLXCu!nlPIpeYl&DE)8X zDid_Yg{w@zq|la1-y4frN1JE=~P{8~Oh+ZsMEh z7cRaLFCtuggIDPvfs1eODlS}nBaACte1liXC&9%xcoh>azA677f{SnPDj{5aBd-W} z5xiOruN1DW)@wV76k#qT%#(xxH#9bRFlk{NX!Ple&|uxtKfsOjDoM}8r;MD8^ZF}f zJNZvu8gUCFK$8aarl0Wq5*EfRbS+HNulu?&4lbG^a$5|Y4-j88UkCm?{1GnQNO@gL zf7;TR5Z&TGei7l4UCM4~R~;bJag{@LKw7SF)d69W)TgNfco!3{IyeA-9|u<*sQ$o1 zyw`G}mA}YV{HEYX-KW22%Lp|3lzuNFd?xo?`1vma%aAWT~Wb=;kFL&3%^k$pCg)s|V3)9~r{yfs8-s9kg#};P(0l#bTla2zH zUrcV|IWn2~HsxmS)iJ={KU3ui7E}743#Ma$Di0k)#Z!9a0xD;gSKu zX1)b38KABc!hQWETr!}#djwoEp#D|3+97;&h1Y{ad-7rWUHYv?cx3qZprrw5c%wG_ z0QfY*lUGc*`13e4Z1BP+frdZi69eBzeQ&VorRyyZER0#`0{4;cTEA{YW1SZ^0&J(= z?(+S}E3w}5ivdfK4@;_hznoRqEl@ezGTy03w>Al^dS?X-EVIZ;gUJpWxCeOJ7HlAXxbXG zleyp0Z(-cR2+$w5r0)ZltRbs$aFrusVdh@^L>qFD5WW-~9!J1KIW>zu2z?5l{)VN& z!kC3F(ANRUyS*@Rpx+K$>y}<^;{%IWw;pQK%_KbcB+!&s{1+}cf{sj$O@Al!fs2-y z+*B_O_^+|?fu@~(hxo$P&Ln%5&ZOv6-4G|6c2hRdt8x?G(5`ky-lE;;TlkiQZeQQV zz$=m6KL)M7P#t|0f63M(qycVtEH{-yec&D7k}u>TE?m0uyW}BUWg%Yjc5vx1@{WNk z4Hvi%emzZI`j4;l+#^84uMBzL39fuzCv9+(x7?Hm`K7-Gt~}sv9NhTJP5KzwHnfXh z$Urvj3YQUmlH(5eFI=)hni1jR88V#~-QwBf#22nUinK(#;Th#g-UiQT$D9!`<%sZa z(y#Vl(!#if5eqZ7T7L`U7Dg=0e8u`(7`HG2G_=x2(zk$%R`g+9xM&r9!bK}(NPgK% zCk`}vlsb2X-|mG?-VA;x_>G4&h~z8HU%?t!q;tl-FeAdPX`h9B5y18-_Z?+TvGhVnj(C<@S z;gVg|!KcBc=O||k-0;}K^!46<0$7V2z7_D~(BWa!d_;t+J;AT^V)QLCwGX*)axcRiD z7uon0#(;)bJK^6#&o60V+`8r`fJ>H<-voFmefoWV{qV1POqbjE zKvOs3uXW3m+59bx1HHPT{;XTN)W!#ze8qp^$~Osp^O09{dZo=b#=qe`a-aFQO&@6T zrfy=wXA)QZ|Csd$8d*gL#H^buH??EQ*OlOs4R{{|H}WYr(LkK!JY*9Z=KE#OqTRF= z@`{V*X@sZzu5i(yxT073UTF(gn<39^+Ld2ibc+V!xWXl$YCED+bWq+tv`apBTiT^h z;G1YS`h@z*KywJ1c?37lq|d)##KO#6%Nq;h7Dg=0#H_!CaSJ0BW}?>L!Z^^hneEVT z-O_U`J+z}ZcoXgDgzM3h`KXO=Vcfz9(C`i(rLXY9BrJ>pd)xMG8{fh>(3cTrMVPV|Dh=rL;iL1ILZUVfLw)t;1 zuFJppot{b<=~MEJ3zv*M2@T-J{}P*q`atkn^5^nb?_4+iVf?3fdBnj@9a@;V7(Xj# z32^zvH3Dw}qke^Y)7 zGZ&DC_(}Uq2p2EzMSp-7(U*MI#!H@W^MV&Ka6`X^=?{AU31EmgSKBzQbx%(suIdk- z#lcPf7G@?=E_5RI1x(rF{2PCuiSr^d9I@$J7z2i=pXtOg{RzBC7Fzn?MNGJrmrMb; z%7<(uz?F7PZj!lQ(Z3qqtsj~{WMFFUSq@ew+c0dUnR z^%xT_K2nbv7hH8J8o(=&D=uQ>nL6a(@Yo@Y>JWP3;6?P29};h9#~qv>U(cEE9L~7s zoa0O{=59xr|I?fqHf1K=`{OL3P;cCS;fV)vT6N{Xv5#C;S0{BeZ)B095;O*iZ-yWD#Za2DIs zeJR2>gD2T(Dc+B5{D&uc@qXMt9(qdg`r113?EQ}7ZryS2YU=F& zXx?CY0Xvmk0xi450Y(?oChG*X~)7{8+_~>xoA)D6)h0c*i z$`Y=sm{sLCmpR-I)m!d__iVuI?fbq3@5q<1PqDCo`zUkK^Wm}45_IOmIa9rVl_B(j z=*ArMLpk>wO3@+MYwGD`WF*LZgG+Jbv$HwM2qTj7H6Y#BP$ z*Ef%$kNhH%U*n!>|2|?aZCLH**fsO8u`(B1E3p*x<&8c4(4twh z8*l5OZl--QnmV5Iht1ja-$Oi=qm4VKKl#(x@nbK!XVKV!jkgglKRev_ZMeokez>|t zvz+&b`+^Nu!8=_hy{8k4`lt0l!o2R?TYtEa`&muo8@j?7@d#szf#K)-z9L6RX_<-JQ~Xy@GoXrHdQKHasJ?iq$|&!$@=_jucH_r@@Pi*|*FmYLi)FToB7WgZPJ z#@-xv%!7=D&e$4Le%W6m^TiJJBOk6kSo_|dqospdj_U0zbn6n;#rNR@clr+UZu;)r zOX?O)K@KnC4bJtC=WfZ3-#dc4ytx-$d;g-VaR2g!yVcU zu?IJAzq>xS{`rPQ4-)U24@3|AB|Z7Tt)$(x_QX6 zn;+!=7I$dm_%eJN~c4Z{hoE&`JF@=%)TUFOX`R7fgNl#5bO6 zn>Qf!r2OU&OkDykM}pjuOt_}L3zskNYQbjXet1wGaTlZvZu zhg&z7qqh&Qb4%)=`)2)<_5;9wdNODH2KtIO?srS%F1PKtZO84+dbgy0d(QY3;GN%e zOLB+WKIYqQ$%-`Y>I=5GCHsf8ZZ>_-Hr#hx_a6`*9WjM^82oU+x80Jb zN&8<&+t7e*?~WDDZg69t#Mk3~Uwz2(xiR=hzdt`~IKNLfwjI)po6dKto2b81Y(3=g zzm)&={F`wtcV{)93n44weQ|N__%Qcvp&`#7>*05B%2m9p0RO)H&9#ee8C)|0dwuTu#z|F4s-<1ZI*qjT;5iJ)+1%4Rf&Dy0@6A}z1~co7u`L0{D!+n zF8(rkuRnjt__B``*UKir!Tf|G0E zqxi!;<%1s}&!$g2aIo~*ZAVMre*S1>{N&N%)%&)z=6v(u@`+C!J^c8yN1Lbr*U>4f zTen=aI%f+uoS(P~|I*c=EuX-x95?jPPoKE#fz9aiCu%R-u(=diby@x9qF?RXRQ&Gk z&mA80ql3+n-yE$w)pOJxn6oAHK}YQ@&qa;|v+Wo7@72$#aE_GHXN1PmS6&oNjUD3d z4;Owc)xo<1qbti(!!DVZ8ab>q73OW14s5%RD*QO_H8|Y^$1X^Pzc4p7eEOBC&?o2P zc1|jIYgy`Ff`J2}3T(&(gGZvQA-)HH!~DRWX)G( zqo*i1wDlcq+Avqber%|9A72+XsZvu`rb2GGH5|xoJ^7zbN_NwaamRRlAl!NiTMJdd zvS7HCd*ZF#x$}8fYg}szxAjiAHO2Q@(CL1gIImIfZ%zxPo|v{OH3hq^#eqO;7k8t> z#H}LSGkpIQ9M*h^JGk|Y6(3Kf-2B${*RguP37C$>ptoZZC&dIT7SJiQ}^rb`&!?^ zwp(cXzD<_|@>)Zm`fJ_AfpM+npZaa<;mdh1^V;8T;=#7o@`cCh-h0AL{m>oI8d~_f z*7lzTQnibIx2c?TL+(fGLeHd)ecF$b-z03<&U8n&%GOWB4YfYyj%@wDJ082X(eB;+ z4|?yno7(4N8w!55GynV$aB5&+>!z!IvFQ>P3OP&+tz1K|F!P7xBqF=eY?}GdLQhn zM_M;6y!E}h6)&EsyQ}(7t+|u_uxZ6F->h5q;tQ?yk*>OL{PI_=Ph9Z)rWxOAZ9RhR z$((N;uDj^ei<|U5_nX|SAL0&a{p;s{zlpIAc1eb`-VpgiYxzwtZ7M(ic-@dMoviyS zc3yU!|9tCl@J16Uqnu$-LG9ZKQ-WkZt6AcMRs6AI6NSb(tBFNE(y|B2BcnJJTNuzlf3D{ zm`*l6M$S4X^%m{v&*=AaJ~=4$Ha6164-TbdgW$Yd!>OFgoYd=@<4nj+{W&Nxwy5A|CFrFIN`x z@QM(4+=fxygms4}Wl0Zjgdb&T4|kMr#={FIg1h&a^lRATDvNk{h4PAdcry2lEHEdg zKMYL{BR|E=+w1zhY30kzXu^dE6S84)v7_YMhVa9r*`oP~!D~^mREkErS z>BD?Hsr{HNzmIwQR7UUS@@bPJlQV}i&MSye>V%a`z)r;znr0>Z}_oUcySh<=*Ke_D0<^)&&1C!)31D)ezFno=O5|EU$?(p z*f!^*8kv+c)hsm~8co;UMvA_2iWBxUPVCQ=JH`W6W zMxo<}fna@3AiRHQW3=Sl??+3V0nzQ9!IAr&z{veyKKhM~H=h&T_&{Jt{Sn65bFhzA z#NO@13fkjcO!eIJ0?0UFU=j+^3tT7 zx%CB3urtWs>D<$EpL>n*-RsN+whnfVbU@EPUK!nW6W=S&pcM(`m-h^F4s z_C##w#T>UTd8%jURNnQ_8)8L)QTt;~s9x)FKL2DlaLgC3DsF-osldqk!<2O?_OCRD zT)^J&%7J5ZHAl*KNA5p?Ur%7{ib804C6M3w^zk0P}zddxK`A$@>uL%n1zZ3>@oOGAuBBe?eem=QivgUlPb!P|Y0ol8L|FJh$qt z+4HLYGCK-?PXL$PrBz)Un8-Hm)AUpcg4kL7aj*b9^Ey^39N|2=cyyk@HtFbo`lcN1<{pr0?vv! z{}{DA&{WxR8p zL)cO$Sii>FfyDkUc7H>iYX>EMg9Lt>W{wcgET9xMgA#CE+Qik~YZ*2eKch+pr zemCx)Nb?Qemsvqry-Q#A#_Em5tdHcxym&>#i?BE4(=dhbE1487hO;E8HQk z%yv{i(5m;td|Hd4wHR8%;j;SC&`SO1RpK@rSVPzlVMC-Td9KL%ub`aDLt}<$mV2Ar z6WA5AJSYyA)<>|xs&tFePDA0D{5NKxFMD5+Fh>3=sJqIXmd&AGIa_%D?1}b4wJ))L zcqDS~*3A{Xhvx4wDosAquPbhLTIkb!$(73O?_w_nruP2)4~B)6f16t)ff znS%cNTN!LNFO>dt!Ye``2 z%*qSql~hffr+wDpRTl(H?wA}j`<=(w>r`0np9$`8hRvuXT&3eom;Fn*`F!)|r2X^e z?Cb&hfkodx*Gr@SI}A#LH)D4+l5Rm^@CfDOes#1YwY*|hksB&+T3$G-2|w2GhKI2a z+cYs)GUq!1bI!(p2S;zu>CC{}*unGp?$e|6v*k;?bPCC9Lh#5w@-k(&c~z2^%ID|h zu&+EP60AN%8>%Es$USe73G=Y=T7omF&dO+j<{Z2N?VSdR#fGra5bc5v*j#$u%p;($GIGP&AuJyt^Mpc*Js&rjs?B9G#=@- z;~X@0oNM9rGpxl{7#q$5{(rOK+_&ysc;GZ|f)2ml^sln|eEger@IkK*`pd86snWh9 zl15IH*4KL95DAz!L_)Y(v?Mt2AMHNfB!@pg-X!5?w z-NjD0z9ZL76~A1$dw+6LLnk(?r?ge>9-MdYqF<$#m0aWuu73kNmV+zSEo$QZ$Rhr= z{v4{fXHgMjD9&AU7oB(SqUH-PDK`JSfv~S(QiJU1Ke2A?t{%s^jl36a-#Zptoa8^# z+5P94thX(8y8mm9v-@rA=+_oFBMPt`+qA)~*DtC%FS?Qa;)gc4yf5cE!|JWwANo;a z$2t$l20#OINMqkR>K44PXYtss+HvRDdYwWnuhsy6@LMeKw8==99!?hf4kO#O7Q z{yJy4b7bB^XUXYpWvRMgXg~IfkL>*<`&1>)k!7^ErQrcbLN_=|ejdDj*VendcRwT( zwEM}S$jh5kyoEW|4L3g;9DgagBX1Y~ZGjMP5_op9$6uJ<{4@CUXwY5INcn#r9J?#} zrRdC)$e|a`vkA{5kj<5Z6;Epk+eEmwd3xI*-^lwve1X+8@;$XCy89rsZ<}}hu0xBX z-CNM{FEh_riY}RSg15#7m8JAA-Lj2w==axMziY8Gpngrj?QFl1eI+M|t?O}hAve$& zh+KJc9&WF*&abrJrVbuuUui4pxBsAwH~Ye!Ej8>9l9y;vm?qLo1+U+Q&Ry6UFkToBvJXCkgj++~%APR#!6q>`m_*&JsT@<#i8XkLN^ri}d(UFO8$)-suiU3M67LQ# z7F~O=`&!9-MrRE6T#W5n)`2I{rq`37%CK)W{lluZm8FBaX6%_;+^K$aF7}J%=X}|j zVIcTZ6P*U$%iXmn-#Map+fvwO);v|TC6+pvZuQRRg#LQZq737ufTwdFZlWCi7$X>o zZal;o#_$gJ6y@U`sN8(qKO1pI_-Palk8aGc&k|tHsjzE;`74%v%~`T6n7`jo>k#ke znsokcnK^US^ly_)e;;P7p?%fH+u#p!begs=IXMqn#Uss6INL)r;XLPT_!W8H$ZbAy z`&3}Ur9Ka9;h_r;9gnWOHY>xWRxbAiB$t;I^9E$~)7N=zbNxi-0n3YLab|XS3VBdn zVi*3l8tVK4@;t`>PpRA5mlpCyR%pds>ftHsbO&@jANatf`-VEzYpotGjC;J-{#_-q zQ~T2JRias6;mx#B%B8m!*1tFJIk_#p#;HDZia>$BG9I3o_Tr%;9s z-csHklbni<&;;kUM(k4~Kh-TS_bk!9w|2SjURJUi*)4jxXF6~7?&96|jm^-v7<JN-KjLaRnJlb9EUQ|t4m4+$;UfqX~h1@CQS=UGOcDZ+)wS2{r9^xh2bAk&|~ zi|d^k+AD7VbmP~v7l=E=( zQ_hT&@RxGrmGzVw{bp=dW_w&6RVMS4?ov@EuC94y-1{%iFc<43rJ zJxuu~hd3`VDrdoDCnvW|=MaWCBbH)=uP_|_dI$Yi=lQRf5^V8a~geW>I^@%$3s?^OExM4V;4v+^-d5r z(oG$z?NEYTa1gEoR*_{pQo1aP3y+(YT``R*j0Dz+QXX2L`!pYuE+P$ z?&#*Hpm*m)XZTKN7T-g(kx=9hoA(8Za$dOL51WlY{0Y;hi)quvtL|9I+#{pl_U5V&4L#E@ zm2#)V@0U6PA89CB)wge=@93-@;`L2i)i<#}oZUCI&-ePK%E4VTw)X3r3TOHC{=3bh zWc^zUmols@HwJa%GBfTr=TA)tmud=uF*5A3Ndv+WZIMov){vON{71 z-imflDyhwJ7Z?5Oq>|aRX}^A#|FEZzUGqngqi+zu7MYdKM29V0e;#v5#*{Ze*PZyK zF7SAuv1HSvl2j%6HU;y$Qrm7Vo)hC<3hPNZ&{|GEdlGx?44w>MnkgeXDOb8xFSYmjS>WBZjMp`WFBmf5NMZ5SC)d$N*L=;XMrV6% z6}m**DaJ&fVGMISJ{+Y^^%v-A0Ay@tLRbCx~IR6lNX0w;y zGvrsiV1hd#w~P70X?XZ*aKdEnFY$)&uo;{S>fFY8gVWdW1|#@9@HX`5Yr*l8)vxJY zLtj^h=3QRjj(&U$zU)F)eonnfPi{Kxjn_23X1}glbAShND?&Ck#$QJrY8*2GocB$} zgcv7>1~lGgbV5gHw?B5uV;tQU$g6khQvxGA`BeS+{>BgYK;aqLjgaR1!r&j6bS6v& zI^Gus{{VEzU0>sC&NbYPp>U)+v3;j2suRaa!1ioy7WScQ?V_naZ z(hB-Z&N0&e?F#W0dy2MKR8=`k^1T|`t|E?~$0M|*Jkrt_@Z-2QwK5<0^}yG!T1zg>pK_(JL$8X1S@$xnU8DbDYpd(6M|K^L<7Q}j9Vx%2m@NV@XlB1%UK{MM6 zY8Gh?ppbY?;Ixa90*CWyA*cJZxSd`a-EGzfG=`^b6&wkgdvkfn%w^=8Ll})+CWEh_ z&sf8Gngs(HPcn`<7A$D~6l2WQtUH`wJU>!l$%}Q@yi>^a?a*IJJkiooAKk4m&ji8? znuFKxTEMt}&XDpI(;4@d4ar-O3Xa{yotN8=(=Jc5R@X`YcKh%TmNcQOQd7`Xtwp;J z|EXxV`kTXtfat8{=}9Hh)n&BJkXu~Weq&zunxI>KBWrL)@K)_}O)#|lZO$oio_@*c zz^s{vXqQ3WwhBy|dy?^*?m~9Ay;Ql|T|I1Zz#VDkgKL7$ZH2RkO>29pXm``-t@#~{ z+Y6lViV$TjW}Qbe^XSO+x=WC!Je0oX(VXRDEg)}yn7zHj)1uusM4XaR*Xb?`>yF^! z6mpxl7`jv^Kcmf0vp9FD#w>y~={q-*~5=3boq6sG@r-bn6*EoOc082Wq^>um~C2pxW!HRm{~ zBoTh2^#Dq1`;xLGrhi+kP|oY#1LB&vW-AEu`rGk(eHzR*Pp0Fl-wjZv2J%igz4MC zChasP!%ZiBT@ubqNwV98}FPWqq4-S;%{0{x%brHzqC6)y62wZ;XA&( z?Mp9Wvz+q4wwqsk+n-fE2re)UE!yZ7_2K6c&8Pg;EA{b<2LPs=XNiP?zw5p&6|5k zGXT98URJU%MtF!`+u`TMkFVzcT3{vpitaJmC)%#(Cg^;S=cJ$YVv5zH`6azU=6e(A zuWtKfJabOTPef_oA#J8!-^ZL?0+_d&ZF zfO{qPT^rZGxNGD57ol^UJ#BZr3w{Qn8@urJxEuRNJ(oi-&_CA$>jrz;&^%XG=knTIs81ru)|GuVwcChtpz`Pqe-eL05#;5uBG-J@Z zv3_Z5KIfxNvD&29I0LQfhgP1L7~RACyQVK_)N<>ehfbk^c5GljhrypmfL|T>QKt4o z`znQJUcLQ#S6==dq;JYQA9`c*-lx3al=3njoUb#Q_aL&h$vY3s-~* zcYN7-&!n}ZK3;a0WZPMxXxm5O2^O!4#*gBYbmSxL?V~VqV??NZXGj}@t`}MbhvzY0 zhv!AlCZREAp8C*pnz`EPD>(Tw@>$(Hi#_uNCkH+n-4lifa%uHl4!>yX(7Dk*>ltUP zwAWm`$pAhL$Fb#hXphfV{rmcn2e8Sti8m{T?@ZF(7XE2nspL-k3UrM>*H``x6)s&a z;0)N?q8^idJxn=F`@TZoDj~wX(d_(z! z?JJ(}{wM6zk`|t!<<8lhP2Tqq-&LpJVAiKb*`xUX&_t_8yq*4EplscH`G>sXoYSax z*1NRE`wp)>*|=4f{yogUV!qevzEGg-gSTH*4`fh%iICpeSQM&=d`kK*e= zz5+de0BpwKyUqHkdgN1JaH#mJ(P!1im+6010686h8vdv7wMh-Lua@(T)18-&PGwI$ z-~D{|rPz}_BFEGIHsgb0{7uI5?dL}5zl}b2Ix?8c`vObH{&vxW6@Azg3f#4IF0{$` z&b7>#-YPw60({-M9shXFD{Y+--BNE)oq8U+QbMc;-G}}#e24hKhPm+l;K=r?e} zITsRNuyyd1N+aG$_%Nd>2bgPLuj>cIKHt~G&t<}8Bl;NOYqJ&5*uKU(v_$)v<%cDh zodjMB^E$qgyv2$SV?)=ty~4id68$@ObZW`XR=g~TOu^bPf@75D`F@P}=3L9Csg|-_ zytBLH534cL_%_ln+Oh&1>Jk0WcU{Fzfv(yyxa0OK(^tiex6)s7=bMvP?*}RO5_4TV zpkM**87cd9-^`)){8u{BHQjZs{g9P@be?2Kmln|8u7>NZv&~9dxBkVQw3B`lCq-k; z+2eNf2WxD<<5QXGuUdAEZ^GyCa542d?eNA;J{7zd4EwWAU3p+Ku>-DyruV#%=8M<0#u&0kSgV3Xzr=uyAw?XAK?Q(1oml)&mc}(6y zWXEg$lT2pPB*1_3Y|i05hOS$2m`b{PwBO4uV^>r9gE%=jQH?rgHG(&ZP}&fYZ9B zMrT~aFSzN950M|bHtK(w+3pDKmj9Xh`Ax>UsL;icZ-OIb{+UAo@V$lc7mua)7Vx@- z@tKi7tF?F1wAM#~VZcA@r0?uwr~5n{R$01)J3)Npb68_Ej+Kldx~A5h_}>^BLAo*U zKE}GNynzm@EeH&AfMqUn(#>2AlyNs@bmQBG{@}>&{QTD4jNAQs=KoEM>rGy|R?^h` zVfe^R^bdLe6iVf^XuZbbgWxBe77PviGWiY@TS9GfWff=}H@__Ak+oN$@^je=?dvpD^?`c<`#7b9m6sZLa|j zChf3N=tEAu1s-4v=wkgjG6?)BYtJs8e~KS2I+L?MeacFq=V-46Hg}_+2{Sg*uO7!xOF_ z@)(?&>*)?n9qVXIF>_fyvzf5FgP z@?3QL4Noxk{P)ZExjdlBpTu`rc-Hxc>?LcMyRt84{_D?p;%OCI}^L!{{y~fsd zM6!a~raW3_jE}CqTUXq;R}ax%`SB}_@YTdgp}o(54pN1}!po3ZMtS5Ox{m`>(tx@WWu0OWEjn8)pd8U89)u#1Lyx7ZK z?)p{U^o{oU)NjgMJC4^fv`{ijrtalDJn}il%+MP{OU#<-zzn#dyN@StiN*K(@`iR3 z%SH6?6VSm2Sl7b#q{H3BDEJTdgdsC+(}Qui2Z(DEbDzuj-oD0RI-AUR^pK{uH&3z4K-5=k#Kt|t06MhIj$zT7W zjDBtK`gIO`(LcdL*Mq#PeVP3lyN(j42^-0$3oRvXno4_bJFz*_YrOwC%;jCV))A9FO!^@4I$J*Mre8vOwM%6s!MBbI z|EXgBoA$0{uY1RiEshM(;r~Txf;d8*{?DY6_)9CT^cW*)**EW|ozU&1UFfC#g7g7? zZ24|%ox~YEyZ*Asv5QrXDZ@NFca6bj3jIW8+=pJ}Z@G?FL1f3<(u>!UOOcln{R!%=eC4 z-F#KFwe!RNc>JTTZbkpa2Y@GSSGRpEp1EG|ufT<|yQjjkmqIguIqi1x;Va*FJgcqW zqdyl;`{L*DKTjN==>9*H?cSSR8+l?w(0RX1{z~Y#^cxsm+e&$!hOFK9EPM@X`XS*^ zGdwapRuDf4KkX=kXW5CpOyA3pb@QP!1CN5k_qn{#WN1!;dHcN*^jh_XKl$`7G+u4pi$>Af^Za?GKr*=I-5&YhI-n(g6 z_uN;;^)5SCw0}?!INL|PiifrzZ;;x-?`p8@@3)~z1*F*@1NG??0fY~fqi>@)`|=G zWM0CTMYc!T5no^r6SBL{n`>H>ezmL6K zD=q@dKHzc*-m4Ryz|4mP^TWt=@UV{FG&lwSg84ZS#&LGCA{a4n5>KsqrAs)0d?EXB zlDY!_8r*k@y0zBn|9t+d{61hOxER>>GKV_-(^3P>+fY+)X{TsrQ)6kU=~$`N)WrQI z?%PY%rUM>59igSX_fclQna^I?)2L5%7(Pv7Yy%&CW3U{W?X)3doNAFDipiHe&Yn6C z2P9vt;@eEx{sMKm^v`bV_v%T^&jn8Ywu2e%>f>9#w+0;XuS_}pq29!ff^LhxB)-?U z%+PA(S36|4Ph@|*n>do)i936jg@TRC5<9B8Lru-4bDN$hO|0fy)03r%9jo}Zqm+2m z>Ec`qp?Mw+WSw4|0M`2F{P)_L@VjeFVvdWq3H*ii z-_T*6Mbk6s`2TOuqvIIp%CwJ|F*X0y-hb~|G0aRF(Q)%EIaBl@fG$S!KgQS_IWQ?c z7yhIOn!17ScF=*1qiYYqb81h0j>m6C;oBq!hxuN@_l104!<=2ue4o!8_W02E?HyIy z&87LP=Mnkf_}I9veb8F>|Fv|xZY)ewR-e0ubLP2Y?{Mb8CGahICK?~c=X`q8^CR+! zqw|AT5{(JLgBDrShr|O&54Z~%*8RS#9iQ|z<+YLR4x)!pU75VQ=8zNtT)AYmKO}=Z%=F%-FT{0V;1oUqJ{~B!FM{>t4 zQyXGgyV|L+T;JaufXB?e}v4hHYA!oehfb0061gnk_}L4jLuVOrAv&{Ug8L+wf^SZwzFM$ zm>bM#4cqKJxxtFBVI4sMvg(-d&yLFGqWM_Bv+64_`WgdIl{?%lTbLi+33Bo_m;cuH zMJ>^|?$^4+bMgI}_!$Zir#TneMi z^s|O5udXh2PhEX#zt(U3@9U8}!(4i=|bf<{6*H%)Rktdpu>q*!`K)k!iBp&a?0GqJJXx*DTgj#o2J>cf}ji ze!su1h(@kJXR%R_&|TvDryYKA4(n0&UC1HO{)H}l8=H@pHZ}i4sq7Pt&HvSrO$P4N zy5-6wiR@^1Vj}5tNuSfWED6m{A_JIxTZ!!QZcF9O>0M?qUYvQ54p5K!o_WpToP$nu zhjm<{c{j`|zbu`U+G*ya(yM)qs*mx56bhV_ry6w{ru1a<;M)y;K?nksX0G*ZW{1P~*Ipu!a z*>2_At-?(+S5$uH`0L%s)_Sf4PfZ&#=as%qgO4!!488Y{!#&Nt%y}nWjw#FB&0Ncr z<1_WmtHIadiI%g6UU{_kDTd3>Uy4S4j=gt3|BiWjKSLKEW$%zFKfyoERd~>mGbZ#; zdbdm1NKHE8caGqtDaV~lZmeUIPIt-0nwuX)TVk}ik@hLAvE}Od7(ThG$LK&z--j!F z(5Q*fDD_TAu1DxIF{Pb8?wnfjV%=2# zi#r!bd+HXuaVAuT=!Et~LO(M4?c(8dzSrUpXzH@4S1_}^`US)O<1UPHNULtSmgvT#xk6jKlvbE*Hb| zNw1_bt9Y*Vc)Tjf_TYpglS5-NX_aD{s9mNF%4^PG8O3?ghOzOU#`i(_%-WjC>-eaf zfA3qLwZ6^E^R+5pX5QiBvWHJ&&J-|rSg*Ft;OrKc|Nqe;`&6RY<@=RKbXK@$Z zDQQxo*Xy=F0Uq@(Tf6&RBlJ5jp^C|`MN{ejl&(KBhE=m7QW+k5zd z@5e8EJN#H88=TlNu{&`)JVzNkV1=i1qwm@;lnHOiOTIk2RcS`_?mIr--I4v#?nGJd zvJU?@N)yP?2mF3;%i{%*ciA7?Em=2FL;3VYdR5|}IBQe#XTas#s~z~=2_AeAcnI#= zM`iZetIe5L4B4gQIQj&>C$cMPf3Q1IL;0(b!Kquih=bn$j_j>Y{RjQOM9!}1?)Q`S zzTRbh{+w>LbwtOjcA~#^+KK-5Uswm+@lZQlKi1^)YU`(j*Ly2yr&B*|HEql6%RKrr zK8@4X>@2sfx4W=VUX4c^^*L?#Z0?zG_aQSFxSG29&=IVC$*o&D8pAv5+ps@)O&zQ9 z>c7@6lO~e}@xLIkqoTWG$DQ4Y1scz9l`2nSN7RM!WEaLx8NjX|dCas&`0Au(Y;`x~ z^X$yW%>MB0nmUH@HfQmA{T{EEgYSUmj(EUp@q1&}DA%Sd`>5K24)Qg}zXDz|2VOE4 z8-sX9>E2{tn#nwkU@zMOU-$^Lr?7qtHXWBI_j~%Kg5S>AXVphik@>__bNx27;isRo<@%*glKCq&jAbny=E(( zx@N=v7B9+)Vv)>_5gQ6C?k zVWn#w+1iz1`>0cC{uoT9CvT>F16%N~!1F!uVC4F=eGs1-yYlhV$WV?QE5~}Sy$TzZ zu}M{dKV|6h=ZT+0zB)E;T{3;2;^Dq{<7@G_N@wPU_)L>ecf(JkYk9X9*h&vPh<;}X z*dbH5z4gOrTsYhf4$C(t2fGIQgHKA{{tmc&6Zr9^y8Bb##TVjb;(|zTUsrciO8zwi z=!b8@kHpkx_}I)jBwbe(x~^(;T{W!Js%t~j_Vyd7&&0O6mW|bv>GnZ#``FlOV`Ip< zyt2|(vJXLb`DvIkqApLg_jkx(=9__2Vh8?yk{t_~gYYDVR~>uyjmK|P6r2*?sf-5V zD{Z;;$@b6Q`b7I9jZd~ekH1gZ4(sf8Y-O@r%$Yo^b(XiD&gTAk;9caOGt^k_@)&2l z*gDtmh^AgZKUC`a-s}}WrSj$X_XhM_&l)rN1|44VNWAm*N8_*i@`wKEBTu(0u6Q@& z^E3Q+{tDjU>|?*(_x5Agb0)!chpQLuYQM#ve7MS<(*6Lpdie*bjBaR7t23@SUAysd z!_nqQ9(i?+L6CG+D{$yMg|hHeLRGjQvitx~@Q9*i+s020YX6 zXkWe8rtxK)`u|uP1*bmdt@6G>nYzE||IE@(4_^|~fLCGDGT9J%_?DQ{w9Lsfxq`M7 zj^NS(@+fadcBDIm+}7dWTWa(|`o5N!DdKTMoNa5`rSIn2;PESe$$bg^c^leP3vE4t zO=miD?x=6p(47nLPw>wnUR-df^v0IC$Nd8^>5Pj))$MRhwIu7H2Y5- z^u{=pz1%4yRN<8|?3IyS#dq?r)OYe9cJU<9?AnhK8}evdfVO*f?d(svZE5w&nG(ZYx7s04q)HM7#R2`{BFCP_AtImW3B{k>f`@G z@|bVBUpoFtM@J_ezuuE`${kpLoO$yjWaDp4aCKAbSU24I+;+k+!;6p79N8><%rDs` zO!7lZivxbzz z7Z|uH|H1!ft7EI`Y+jZ6CGvRJx4$w*MpGJd9qivSlJigYjnb%5p@V{?9 z9m@WMi<8?toP1yuf7O<2!%>(Qb{%3pCygUB8GccD zM(LwVPxWos??cYOR=CZTfh02+o=N|8C0UOKJlV~$-!UHpSuL|=f9PjUODDe`p31es zxU!7wcjM3HGv)Ppb3}SMoqKt4^<8n&YitXQKJe4%a-|PE;OSnScARnb$;mUWj`Mob zpFnSzsk4+0wlo#jbh)H4dhPM`SJF3PYSpN|{&D{7Mvs`u_g>wWhpyUP z3yhv#wmIeRoJ~9`5V8)E8;5bkvdol%~Z?!=M(d&d}LoQ*_#Wz>}qvR{HwF zjK1lcnPXSC-ECw@XUtp~!ad9F;_7Pl!Bn9uciLIdh(0c{!|vXWJler?KXC>moAwcN zKxLY<%iQt{yR=VoynRIfbQxP4&+NGwi%a@1o;LIZ^zvn^!Dn1+yrd(^v?;7(9R8S10o@w$yj`1u;M=id zS$Cu0>;FF;oyfro+o6As?IFYFVr&csA2Rbw238+*x#L+w`>UBRjHQcnj*p+QJ!mXd zuf}qGy((iAS85zw8E%%%C7Uv_w`?1gt(4ZRV+KF(pe@p|egho-hG%D)n}M6jNNO(?af&~RHl*tgcq4OA^ImA3{7z7NGO23SlGA>U!IbV`8K*j z%PFIy`8TBpntzM@Vs&>k|0`>j(zyTJ@;w+=T-&ZSp2jMVY=^pMUV?w8qa$){M`Pt- z*T+MC;>uHrU0w0?PcU~b;&atSOwus&V0F_PXMa;QvghmUp&EcbnYF-TE*ZR#|5%Gt z#)PgUWyo)9*EPx*_DvWHGFD^D5TEYGb(bGsW*-!HQ}j&VM2p9duaVm`^Jol3@7A(D z>w7Wp=yZsmGdd^q{aShPRf`x}ovE)}N54fUw5O36nqNtHYlAZf6&sXy>Cjbgk>2rf zh7XfY9ojak6H~q8^Su<=KJ*3ko3P*)Nkn@->>Trhf!OuR^H zKNflvd?i*TpNhs!-w$A$Uq@b}t9k_A7TSsLAND5TH80OCQ|;9COLRg}_&eF63_oD< zO3&%!MIRKlXPgW`dzr5~ry*TKd`Zqk=*ngPS&X=(vUf0FUjU9rOny_xbNJ1P&ol2v zzij52zF)jNszZ|h%Xod9(#Y1f6PT;tj!ud9GW_UY244CvxSM&BS)cytJVD(@^r6Sc z`b+6wBjxmA*DyZ!`gV~1WR4&4&0dgyz<7Pt@bTS$M)l;2e!+%Bdfb(JH8$0_c>2AZG5Mb z73C3hg_~^lWG0tW&JtIiDnpODjfxIoa-U;pC2!^pv6pbLr3cwX357 zTI-Ex=YnnV4*zc*nYrth$Knn2_a=0h`|;y?lfAH=3zo#YZi&RdQwk$3g5H#F%vSDxLn% zJGM;4#iEX9xSYD=!?lz7t~nJbjyW;31Nd>}GN10}92D(`%e%pfS4kI#|Mo`ca|nEa zk3CXD+_;-UFSj?bw+|inDfn0i4=KCA_@iX{!9&N7n7yW%=b0$It`9o5-Oz1(^Pc%f zuieI1-uSX;ZeCpNV{IL4pQhZsx^_aF%0!!(Pdg7r(I5PEgnvoO$ibE)f8r`^u3`4_uXSmG z)5lC7o;CQlujgNYbC@Wl>ZtSa7xA~ffnKtIhaK<#x-b4a_BJdAhT1Fhx?>;z2LAh5 zL&UyWr8A#o$1TPl5ylRow&>qFV$#Sz?W^RgCEtGbDh8VVntaoSnutl0qVMP7g_M5X z<%ZM7uakJAj-P(uaBp07eXi-7?Q_tv#t&j6r;O=M&$Sm*j`YM0#2pEt@AxeG)Ae5L za)Wy+_X_39hM%B)vfrAuN&hA=UlN|K@QkO^HGV{y=>nvaYRc_aOK z@|L^e1Gj%H{ucEdW&iefZX<@7ojcTeTWfng`M$%Ruba``>-_RA{5Z9z?rZkVyLQ_* zckyjkwLPh;8u_N4IX?vMpLc1Bqi4>ntA7D&39{1~?3_)|%M&s8< zeT%ts)0tOhZ5S^XUQ5TIyvAOrXI*A4X@6fOw%8ih7Sa9yw7*JwSwfYUp%0F4pZndl z_4dKHj`#0Vc>%^sd+zJlbH5WfSF`6{bouVb{$XGBV-s|q^Wj#`aSpKOIsng8%URCi zpI>(Ew*{Fz!qsh)@SpLwsV@P=AY(qV$F^;F$He&XeCFn%Y|dv!uD#xBi?N4rV7c@F z?)rJ2wfq7&Wqgb;{pPN?cp1g%zi^QAq`=9&tO+kdgNN}a?x&CPEl?leqZc3Bx+HZ8 zTawO1`>~I5(Y?ygQ)`;iXdkuYH&dT@Ehini-NX*d@dr&HhbyhFtJ^-IaWBZ^m5u)) zek=|RK<9so@|PvmsP+R9m$~Ad&zTTWDRkB6N`aYpx2Q-3VJA5Sm_$`!C#@y4| zdV>7Ik)Xx7Wlh9l1YXiBBs|;^U#va))wH>feKE)$NANdTs@xME3KMy!m71rELh$8DaJa7GuUp>=pNmo59$Zrj(o zpZ!)h@qV{$pQ^F)PuAO3>z6nqZ3uht+WdblJus!A`){bvPkr;anz%Z+?z;ZaCvLpH z;}cI@|2Lm_;{Uqg%U`1%|Hk=hhspch7`ABO`8ss+W#XXJA0tLVjM#0wtB-3l+MiFp zZrUHC4fW(xnjkV+1F=`Or-oNWb=Dg7S)6s2OIn@D)_aLE>1#cGtq#_-N*}m^{~JA6 zNYA2k39G&L4#r(&L-Px|$S1wF&Y3Im{)b3k-z5E%3%`xPFUFoT`I;n}cRH~>HXdU> zjJ9D-cPa z6x^9ZOxNp)ThKyWxShn8DXFhr8fK3`$S(S23v@yIrE4D_I8kO75c4+Jbqv3)+o)S~ zMf0=e;^TXU4_T1}XOC_E!;eph#zc`bE>ND9H{6znHwvoKrOWMo)B?j+V7`;`6 zQTRCDM^m+d)Q^)d0XzF|mx_;1h~~f-!u#$~86C_q=YP}DrAgmcQ<6<=;3-%be;M(3 zN~?YLigA`~E}zwT1z%3D9S^;9H1&^sCk^XZG*0Y!VlV$ zEi~WwIq=U}6O~36wAwkRt&g!W-$GXC=X#F1bjlfLoApJ0CFQ_H<8FAuQ69+ElZ@p# zU7jnG=gjRZcRoQ53aIFBwqG?n+MR+-%I^^7LC*0@Ve$M9?A|y zBPQ-iW_{C$gW2$5V9mJIa$W@Uq^E&1TMkl|;BU=6joX9cmr|g6LkW05Oh{9<>v#G- zpVJW>ch=8FWL@y5k22kUe+IeZ)A1`0timpk<;3BrMQ_f2zSk6Y)aV`_+Fl-!Y-;%C zKEFF2qOWz^eIvf{!Z{d&9*o>>y+Hfa;6zbscSbkabCP!PKj@hI6)3 zrargLu5MO(S&j9zVrh16|N3i{1K)eMc*)P+P5$G#cc*_fu#Y{s&KXuqC=(s>GpE6K zWTzvwv!gvpf1sx0!zbF;X)hM*f_$a|z@Uz~c*iWO_4&t>CnT%J=wHAuez~Aa{JUtD z+OPSfyI`z6Z3ZuN#-;J&%3NzHdr!csO$9kapa?!I6pmhw(tq`ba>nezQJE^c_N7>) zlf8s%eX{qv`b+s`W#Vsuc~F@#FEa6Kq#XKGmlN&5PpW?4`Tettpsz_}raOphw;y{+ zlkjh9v?s7AP#ySKWp!YBpt^Rd>(|e|uGtj_f^&SpMs3oiz8V}HUtdwL9kDD=m*MT# zxK{tb^=AV1=p0ucRi=qS698|k7`I@f&%xgquu?gKSEKAaWzhTy*1f&M!;ADSb4|Fq z&6VR!9d}Yrz`j$w34Xg){Q9gwtMEbox~yT(%s75DHG?yBPY4(6>xb48SM%qniX%3|Ed(V zbZctM?u#5vMF_rA7I?|RVV6UFyhS@?iq_cAb7fBGt{wsXjjdT!{q zwpedi53Jq3qjc@|mePjxKJ>`R;yFO#m6$B<&@=ZLO8COWO=#J+`W51{# z@N|VAed`1+y*n3jvh?PhJN#ObwJ&jqGXz=B_QO9Xz<<-RExozX#S|l3RRPPOWw(aUu31_}Ou#<+G&g|ne(k!YWsBT>TAJ^3fm^V) z*7?>!8l|p$X_@8VZRdgV2;`TOz_f9-~AlsAt!^|D=#Pv6gX z=+yhZZ>OB8*Z5veyROyVgT#qLANjs=e0(=;_4wif@hj-MBdmR!lE`Oqu6e-K%xeRq zV!jE!W8=?^#_uxn?0INMFKbva^RjlH6;Zq{qkGVt{3_p#Z)c0Ia40^_TJ`ewia295 z1btt1hIj1&nuVUX*l!(P&-;maR{GdHyKTMZI%BfI<2TCu;3WT3;A52i7lsyRrqTE$ zJipQL-!pM|3I2&E;9Zl<-4m0rCDD(}JzEFT!<@}qI8?#?Wzv;!CU_wD+xDVh)zF;V zh;?`A@zcHAU0MRqe8jES__2?+S>M-YyMB7|!PNU3wEuU^F++=tpR4B83F7gHHWk{1 zhu3okrR0lpolWVj7rp1RmkiIbBAnB_MeQ#lhIat^r#_s(mZcc8s>5l|gI1ftbMq|| z2Bu8?o6DIKW#}MJaQ2}3)dK8c_fP7d;QgN3OL=|3c6^z}Co>b?uFvV5F?2)u*ZF6) zX6EO)z_d;9c!TpFL`VOU`klIg$x`%yX<$+|nfARoyz19~@W+K88t3siqCA;>B-T>l z3GBd})iHEtkhA5n2S2>Rim&E-ggUl>vnxgGE25E4aTo0y?T6^sEN9Fd8$zDS33h=i zF9bU(9Q#C~aK95fn0g&MXJ!mC(=Xjc=QOV1+Y#xMYd`FZN2#B-7KFG94v7s>)=YOl z!C1Yut1r9g?TwbrI_2%RP}%UTi*+B}Bln4TrmdTQ1ucIlKm8msY5?6zAh@bEj^CBV zdFn;h3@7H5nZH$}9qqr1N6h0DE$=?QM|B|gwn=saPR=^YnXu`vGCmiusXZ6OcK-JA zc%$F-XOIjWh1U}PG-i9>a;&oh#QIC?TdwzwIQ46Zsjl+(5&K1V3!K(H?A@6UB|3}! z^4sO{)P2r=g1yOltH50dED+5!mFX=opdud?ijFQfC zvzNB`XP3O}<2+iKP#=)WtEqSBbhqcH4~!mt_5G! zS7^60Ki8nYn9tfB@E5cy?>BsfCzs%xGMs}y7HRcOdRXC#;yuu}f=4-P-~@R0ixIs0 zOa|UfaO~0s@7#66g=qkqZ)6AW{Dr+I{sjD+ehvKV1+T{AU)?qEFTpqUVUCA?jb2R|gJvZ6$V91K+729#~aoW?QGCNIhk*;U@Q9u_LT7a!M23-^DSjtp@1Lz$h@!WO zVUszJu5QD(4Sh)QmB&vP6EjbFi_brPx{kB~VxI&!yTUsA_?{wSbili;l0HRgu5PPF zrmez07h(Ec|-nW6{k;&cU|b2oIGD%?yKZ` zm3-16THbk|Pm}j&^S+kzik*|YoAlaKrSnVHvc7OeZsfl(p2;=%!m`(` z@*J^GkV#VPDH*P@Bj{_lnE7GGB9lkZH+-HW$>p)gKurw&hP7Ay{vK`r&$Rvff28fE z--YNGa{X2$m-Bg*|K>l^e)ace+CR+t*ny0dlg+s$k4;<|%>U5s%3JT@F7akxfWDp` z0N;jLBQ4TuO^rLUWXtS8E`BGIt;k<|!2Hjo1)0yPBNHAU^qe_A#AlJO0Q(hj{6i(- zKcD%L1Tp(_z{_gnt&_+shv9?o24-&}58Mshp62|j-N?M(v2V(`$Bu4cP87)ga!*z? zvYUV1{KJl$!}}JVbH6ipcTOYcm)Fn2?{1dWcKE7mXZqiZPPqQBq7#+l=tK}YQNr9V zf-Z)#b`tx^KU4?J60Km-MfMt9*E9yY#?XXsXV8Sh&;<5pj-d(Ip9kmrU7E0PlqRSg z6H`F`!45sR9hqjDOAmS_V==d0o(etq_Wv9`2qJH(p8pwo(1y-9asZHbQK-cjvE{&i5;?mADUtDVX z`#(YlhBnxdh5rLIVDLUWlEd6DVeVID*;8`C5p0ERdC2;^p&?&lK7EyJHMtIdid7dr*m{hoao_Cp`Qcwb|i?7Q0>m7A;|~qi0OM`gVqmM_js-T>)X|B zqrTFqHI#sPJ!e><6FHoK?&sOT z*8S71@5kX!^b|GnovZ0sw>I9if_`$T5HQ8qqw4;W&Y2mq68|U2}RxIXD@(GUv z6RdP4`JmI{0j?>}OGhz}^lFc;Mu#WWoEhOsopxR;X53u(=egiu%hc$WG z3Z}_#6Vv{~R{WvQ*z8+y_0NGDqH*~N$K1XY1i>q0(sbZD`0A{f!^dax0-5Jwm^O~N z6O;7W`Idia*J1Sfc~)*~H+~mKeL064N%LJ_PV1}K zwmW>e=shM49cO+iPH;Ig-goOBUaI}yU#nZR6yK0j@+VWQcgYI@|MZhB`1!_tGY&Tc zqhi`1JQh5`#}zxV9qX(qcaFQU4o2IrI8p(0>Op6{F+70(b6Zm8*~haPOZD@DZ~EbW z&ZF1iwLTWh+!H>CXYQ!1z3&k-m%c@*oB3Xl0M89xj$Io@V=oqQmSd%8 zHsh@}FG5ZY*w#t4bp~xUFjc55>d`J{{eh6O1}~ab(af@L`bw=Kdh_-hq)r zW2bd(AfM`&9&!K}NM5~T%HG-1d5wjGd)BVfrp}-Pu}n!E!vZ&EPe08r}Ywg(9ca= zxA6p|+Uss#E2~_?O&qSG?rP7f8PAspa{;{>E>ks60ZM1W`)=@^8-?wQU>#pXm)(ik& zFz_B_wlX&FMYjx8SX&0pEl&;H?n@06l}84?XGQvc#U3K|Yhr&|HUJC<;J*jwM|%+V z3d*MWHg&Q-OZT-XH@at$C;ORkImR4I0?Wd=g(bwXIJF45F8TQND~ofjMadPjrWV=0 zO)>Tk-$efKb)0)gnTg{+DNR&7QEF8j`u$Rh#1+gjz{K1lk(N`x-yIHH%?nH$zbt83XdAO zJd*cpbn|ZBiJRS%+3&aL_gmy&gPl&eCLce+@D;1q**{bN=QCF>EQb9ZvPXhToJ@4*tCxC2Y{A3G<3AMm)9#N>iYcoKb}4#h{4{$nFL{knNpSZC-0^8(W@dz_X`#7e3Vy zvwvX1(j^)nty9I|;R$@~WS=)N=k%>*qV+-_bP?Ja2|Sj)QZP&UCfr-a7zG{+tQ;(l z-n-^l!zP{M+B&&$YWS1>{+wTN?G z>({ZSU8I~xe(A!glCq##Jw0A}&9{MPt;pYa?*shT`|y5r5PDwe+bsQcNnW(4(#l~B zaz@6WgE3eBV2E?&LsnQa!NP#XEVsUn`Bcmr6P%@d?%3tgu13aAw2--1KY07D+0~5e z8pgGTe{1r~dCFdwc67%g5 z{*3e99eUG59S$whnpEcUO5%+~iw^KFSq5)4mGj#ve+uwV9A|G)MHBJW*jrRV-1OuB z$i2CAKxf-8w|a;*-ZS_;;z|-5WbJm+5o>ns_U)zc`8^xIt93xOeRprA@NvAI9(?L4 znuYxpcm}Dn=a%cn+%>vX>n~)dbJvcw ztnVZK0erLhr*Z<+0p9n#!o7@o!?*34opa;Mvv*Oa$~ASGcGY_I1@KqX7^@G`(T=xm zwcwjC-)+@lBUjADPJ56#}%1Qw_Rz-lbKK7&&;>lUh@78 z+y`%rJuGAgO3*1faY;{bW~6Lr!K!HFWy_tvrrvV$$^MX8<~*-0e4A?c^Ra$J?jBI_ zNC9htvyRR{kM%tHKFc+nZS~aRQ})pI=&z?wkDWgHxT~+5%^AeSv?b>%-|qDPqOP2M z1zA-?7PbcVD7{j4)jIq6=iA#?u@0n}t6Tq&K2b&tKy=fqR90e|hl8xC=%)+K`|o(> zAj-C~1~<+XHr}2V>Tki`D7iy@6K+(!*RUstJy2RV!|0j9w5N8v_3OGn>_5@D;z#@D zAlnR2rtSXNugSZ_$hFG5m3U$*e;s2y3z{Szwieh2ZcC*)?duj7ul&)zz&hISD0XGq z8$5P2RmYi~!P_pS;#Od>{^4`pCSO9erxM;#_ZN7-*1l2W3*UroMsO~+M&o8{&#ZiQ z)YdJ&%3p8YUis@g3uC7nXrBcy(y&eE+E}Y*dU`hbxf+{w3Lo2c@LhV%OYkF~_tJ=l zgYU1^&GWT|u68;;etnej2=KW~I@a8_I-jrY3a~G}dga7^|EwYDRaLiv(?!Zovw!Aa z>67s>FzriG#;^3OePV5e6-Xs0U=<+h2w z25zfMAzKv$z_Z%=&VAEQ!J7k9^Uu_0Us6O4t`$_Y!q|Mm3uR3obu^f>(C>YUgs? z`RcTN%B!n`xh4HnjPK4j%6Qgi#V?GUAvY@5kKeN+d_G3G;vq)-Vffa_H;t3oA1Rz< zoqHkko9aTR6c^1}Oj?82kKmhNe0D}?yw_I2$LK^X$G7KLC*>4`#`!N@>zjOp)>=jE z*>L@%l%^PehA^^IHS;CMdgoo~0BGl`n{GbV8AcbPy#mDJT9tdN70<05GdgnFe z%^XYK_x=$0H9plK{>ytc=5Xv&4)Nd?U5d_>#4;_~Kim zJ;gVaYah33ZvbY4oE4liCD@vrZ^s7~`r^!ww)lPasU-RzN6!geQ$4bc&7s{z_8iA& zEx;JFzcxPX@WO5y8yMV9zpiIKG*Y(BU3s0cC4M|(w@k5Ki-AJ|y^`d@^UCkU>-2Xg z6t8mudy~&7&Veg`apr7Fb%vlX$@%OP#5NTIzMa17iRt#=O5@F+OR0{%(0rBk*Bh)h z`5o$;vv#Te1<|zj^_V?ODyI*gSN@&@&~V9DKCi9H7o&XrPm*uzf3o6R*W2+&*ZbnN z6aDc=%Egzg&=?gc?Qn+g+#BGqzWL~vANc55S0i|a59JX6tD&@ z3ck{gA@zvL*}L9qlkCGf!6)jW4nOJs6kPAcPfmOd`Tita-;VF)cw8TkuQp|>9fszZ zdDV!n(BLF}a$xmAdx4c7+TrX2_OEsENZ(9;p7G5vz8e0nN?@ru)C`RE?^^U(`Q=k; z=t)Z+`h;ifvom^I+7GaA;a5J}i67AkeTMfxDSKxpV=h}_@~Qppi?N0Oh`kLeN4ns( zKK6UGpo0@$@cv8oqssOzA6Cib+HZe@+n&8D-<;_kXtKKG%V|&F-_Dty?S{_3f&a)E za78*p>7Z_8Pl@(EbU<4&`5eE#-%STk3Y}<_6N$tO@(fn^oHf}9&7^d)mz~vWL@QZ zuYP&_PS)in^#6KKKDa!dgg!s=pM3GnU-rkh&YKYbY6<#~1<`Qbyxj0Ze__WTMwh4c z!_)hx6-(v{zI*7EoOz>i%$4%?*KNNa=n{9g4g1q^*`zLQ9N0aeL7li z&3*~-GVuMZ3GOnang^k*coDryulbz*LZ)~9`xuR zk(})ZKeT6}iZRgn=SlJJ6>hl@q=H~9dT$x>QVZz<;C#TwxA1dyBRb3g&mr0~A3s{j zr)FNWf4wIOuM`|zcc3xWGvyvnW726|M;19t+1i&gvTp+1_pyFMQL+bftAKm(?S@G%EJ_WLHBZTiS_?GUDuGw@GV8u43N zmjhm$9oi`U#HN8}>m$X#X!*Q&wq0D3*%MBj9ovZu;pCOA)Q%8wqpWD7;wU*|fBuuw`@8^ z6yn=5lk~ILH$PEpDZHpVkF+)`eG_e8D_Z1^-}g0sFEIvJw|$PhpT#d`HL-;zIzBNW z_IXuKuoj)4Z?$!7aNF0}{P`CJr(Seqo!+;`i2>)Fug2=eWug_T$6DypYm51J0hkaK1p?NNDGo?ftp8#)89(GW-9kzOydb zrY`E~JpTC?k#T$Q&l$ntmJd%8%pJbm;PL^l?Z6=-9I3=dBM8qm?~nLaYyQsj=w}rA z+0R;89C)dHr{zBx#@|@{Sn+MHA9f}$IF?r$cUF~fiMcXfE_Yx^e@uJLJ2JWh-vz>9 zKl`wGH{YIJ5sg2GUvVakI#^Faert)bw_f^@Kmp!Vzq)~@IL(c}!0$-TJm_q~EL%Sc5((xrLh@u-&8JYA}Z8Y;t&*S+Z(}$Ht zmLQFpPal*vyl5xq?1VNc&Pkc&+f;C)+TgA)>*>dI8=oS^M&Gvc-u3uIig)-9=iB|X zQ}2wc^NvlqwbohxM|mq^*P*+?ZzUt%o~c9kbJ0TACXGI%`u2ZPhHQ-i;^ zBgr8fy^tI0mi2MPz?sUpc+TL0oP7~!YZ5#YeKGP^=Wn(;G1S4$RX-+9jghezuPKXb z56~Su>{K!3)czrRaf&v<6FRtjb=#-t<0t9sC+PD%@yqwQaRLuGWw;on`{gYoch z`Iq3|f}C*i8{9uhIlX-Q2Ys6n{^&Q6tNyAyl6;Tv50yuXH}kx~>M8yz_XoMNPj6s; zZn*df-nUsjOIpe!ckV8al_}4MTandPIX62surNEKyaV(9EPnApD}C{dolgJWPN#Ni&U{1U6@{F#a5{Y-d3?aSu+_TAxuLhf@^W_5U=i2Hml zY*EDjaN3-FooCvA>A~#C<=@ynS02rd)NU(UnOse}FGPFL3)P&b&B^7wZ*bp}H9W8J zp1;8JgWmHed47-b)^Nujr@YCP*%8f|!HVoiF7qhaoZU9C4I9ci^d66LAO280$Q&3N zE{b11lixO+ZKsEF?ey?uJKee9ws?v-B}W&2Bz|!T@v@HlPYKTJR-uDA#~SyW7`CP5 zk-=@tBSQ}^k6=$u%O>^a4mVn(AN=o?(gDUJ#5t)ad^M@! zCSMBrl8!bvl{z?;wW>SXyuCEm+*~?*ly)Ddtv|8TiRKv&ekYrWo7*gTJUG<*A@I@r z9_X;{)p`_XJubR}-5lCebici+5j$bgo3_Ij7QJI{noBI9%zhwqVZU;Hz;?2SZ6kZw zOnidObkjY0FPfWUXg|-g`DUgwYey&llC4=i`gdl&+jhwrnQ6`Q#rNow1C!&WjoTZS z6*t`lOnl<0_cn#F1p|i^aJT{-&Yc7%KV$4q+v&#bz00Eh=F;R)dAia+A@yTN&YaxV z=fNc1dY5C@DfV@ICGcm~6jPt6Yi`p&lr~PB#`&!Ol`~uak>`SLwPmoVJdOUmez3tx zhh_oe<5Sz_LjQfi#ub;n`Cobb?o@K6FI`!2&x^wQTavCxzujN#+p^b^OL1>zG%f~{*@h{w#pZuG1E%hjZc*(8{lnAp=TC*<*8R~ z{?;qZm6he`mY4EU$-{T`wEPl#CUy1!WBEL2ew)5MA{co6FM5XfC-AxAor_+?{zE$P z{taKTH-*3ti+L+pHEgvvu?CIch2V23H}-=|zX$jH*F}UQrhNTdf==6!L3lQ>e(y{y zed+fxXUzKWzf?K^UZ6TN^O|zC{v|0J{(Vf@qPyq(6CAu5o_1X%H55x|Pxk@RTTc+W{HpIu6#2;YsII33SZho<>_f5 zUwj>Dm0$b#4IFeo#&@H8GvAx|h7b0bbmrf>zhoYq@ugG0_o4rA;f_AVsb4x$!M_2U z&w)D8gt2t%di3wp1K<@j5<6-fKOASAOxfnHe0o0TkEK}$@Ied=IcpxV1NA*QOc_(A zwHB_!=7pBPb4SbYW_@(#_8c(Mz;RWMpJ999v+s7RA zGY7X%%6H~qk~x@U{;6DFKILUi?v`(4=*jZ#!Q**tQRru^X?tn0y*yRfb90OF7pRJ*?p!p;GTKp^*1r!i^1>pGm*WJ_|)?5 zM$T7j;#{@Hr^v^-YA%hK-1Z)IY0io7xbimh;2gB>lAX4jo+`cg9{qqeB#T(DuoVoP z!!}$oq381Q2|XJ3x!}CuIb(-?DK4&PS8{gbSh{sPV>(D@IpY@sqQy`-3iv%6N~ z=kK(q*_Xb!!(C_2kY3*sx5v_boRi=@gJ-(ynl{N=V)Rgd39S(Q5)YCTFG3s4dapU8 zebXkNgNq;QUDmt3u{3#SEd6JU1NiaUPW03Jm%BE3@mJMze>=N+%CxC#9-jP_C^)0B z8e~kW856Vq4KXGU(|?W0AY+oe#+aaadEb~s1MeS`j_mi33BJB##$+w;|2vP#gUDTG zOfGn1Va5UZbVTRZSm(z2PGsNf%9z+oeLgy_vbQp!qK?DFx3ZtFmNcZ zO}wsjxf=I@=BbX2Q0sZ|5^U7Z!*4+2s-{%FSbcBh=Anw^kvG>Yj|_vC_?)Ekq1kV> z^89sQdax#E%fS4so}v8(kvI1hM1pgp@j>u*@F&!B61wm+(lLMEV*UPYsVv)#U9jHc2WqK*E^SY0?cm-*Il}E@ z^izJpnr8;r@iktRtf}6TnE$b!Kx3dQaJBNZ*42PFA6n4&BP$;%=3RF5PRbnNC3zMv z8Th-()4{8sJw325dyDnwGjC6v^!J?LpXyK_;Nwmy-c2#SdXLfv@vPMuF|{td#JcoK zw5N)(48!+@XIWFEZ@z?$S~iOW?e1*P_|Jwk{WtVeIuEBV>NNWI7O(z9Gv~`-!!SOW z$!Res=JPsuEYWxIxtae}&N0rXO#Tes<#a3^M5o#^FSu{|G3!)8o^=Fc&Z)nnPy2J( zLkA6hk^ZQT1LdAR%PYSRxQ>>8J@t?JC?6=WR=ogSI|5Cs0e%j>dGh1kA;k`)EVV(` zCDxV;zjtY`V$W!=!QZi-o(DHf9<8y-ee?-`(mx3v9(|ObgzT1As3S!kraZMlbrYkx zu#d5Cg0`PmAE{s86U51O+Qxe&<0W5n(N*Dw(%Y;7AC$h9bkad-P9>4yE+NAukl*@V z=kD>p;=9k$CYMkAq|+9~onGekd;KK0ezoBM`}&f{;V*x}IH5TGTiZpTOqEQvB=Fwas=)asuP;z&!bdawombx_mIBo*2HXY%D$X zAmcTK_Mc;pI{c;hf{9bQJN@^j9DiQ$Q1e7>Gjg-|_zUz$JcPdI(hub)4x99fdn6O8 zto0SpAbjcvpdSNYFHaBbvz=ILHs6Ua?edS_yiLM47FBWHUpfDz(|8gY242Sco8D!O zABTq$k2DuK!IMP_p@}*l!>!l-H`mkKsc!VN1rAOj3k<;P4Z^z*or7n`cWo|yYi?h& zyKic~EA?hQFr+VUQAY>7+<~U%((g1)NNG(UWKAEcfFJVcy5S{<*~7Aq{bgy^@pG)x z=UG!PaCXe4iWuvEEPc5q=B)jK&y~qB@k;6a@JH)_r{VLGx!zoyAKW+XUikGtx8pPG z*!zlZj=0z9%jkNv4z$4AsvNBqy%X?j5-fPvmH8~bMtp$2uSHiKV2udaR@-&JVkAF$ z>dZWu&tvlciECPKo*RQfYnfSxj84_T_nj`!(dl22I)Q#f0K6jh zkh6_^@5DEyah?;yqrmX1uVc?h2ro!K?4M0cE!QtS$=HUG1BG)#_**u5G)uk%N~>$$ zRp<+_zQ8zK%v~P2G#hdICc&ky8w<|Tuwg019?8N13AK* zNAmZ$6@EhbsdvRb;ErE=WDfIhuvg!Ow1c$nnLHT`7P)IT(({ zb8o|U37IIrD%vyYThT33{=PhZ-4xcmNGuX$4}9*ecKo`#eDTTX3ZzTOue5q5ebd?! zSZYT)n^&gf@6iN2JLbE3wjcRdrGByXj+Fd8j!^fddDf}bSB78cGGy+Q0wv=KV5yu@3ADj=jxh-&rwxBYed8q4}h>C~^a%NItv@mK8` zU9Uo?<)ff}iBF%zHO03){88WRlIhm;oGHG_aKtw&r_d@anNl6?S?ZfvavN!GNoOxn zTEWC(EtAi|I^v)@->`ALgI~e0ecjMIP0zG9Q19faUvGaKU$R@s^CI=3$D7*1HE<{x zmW}XCwl8kypzk5hm~c#M+rZ&iJos0f4@+4&A?@E~e9$?}0Y7H1$_~%^Vjw&d92q!N z6%O8NM~d#SBf=HO<~YM$Ti9IUti{q<2UP|->mX%FXB`ar9i4SBL>y{#*1=F#Tyu8t z(8uG!;)(IVQsi^yav)(dM?ZsGs4o(j;B$1yfdF@8)Ic70bjgA1xG%Un94sKsOg-0x zgV*yM;(0ayZ{UtDJ5cQ7{PNSK)(xB$#yMMoPvvl)0B7<+j};rIzgg!uj>>d`h2&qG zby?4y`Kcclc>J2y%R=-x`kom-O}L@h=!Sk=cId}!Cq9(u!WzocJTh~j4?HfmX0&2w zO&86@wtKG~|0O!!&$C{@6QqqEN4i62edD}{CY=`neQ4yoh^FoMb90Wh(NQET?&?WG zr!FtQtH;o8#p`nDHZgTCKwmnv_A+;ptcA{aeb^l@jeEz(v9ZfP47wD!+m4&{Ch%1s z&+oiOtTzWo)NfsdYwdUnzDI4Fb)8~gTU}qE|In;=6Zkjx0aKIq@85Ijw~>`Z%U*yE z+N^1FvD@Q6=)_a)pFg3EdPVOXyR^w~{`ZZ_&LjT~Je8L7IMe6o-?vy}Wv9>d<*5Yr zvV|JIrA(V>aR)wMdtLpvk2xQH2Hc0&De17%3%{xJY&nAVu()Km8th3d` zc%O$n!@hx`mnd6wK(dB-NczyDb-E}kcW6ETM5olR``J^PXXl-4rK~*bKTlOW*kEq91ClHXvX$;2AfdIhYgtYcjVNa~#S|;)KECzrn$R{C zPDnQCDI=MLkwug3O13q|WcKgBzHdn*Sx#wtp0iJ%bDqazeV6sE%e&t7uJ^XyciiW6 ze5{#p8TNhFtu5F3Obq&bQ|9;t8w+b&&cb%09W!75vYZkAn#in!SSx)E&assZ&fiHt zqq#J{$u`D`{984QJ-n|4^5SgycN2q z_#x=+UU-2Rsb9aVGWrJ(#>zDw;c?>Ws+Z7DzmzBhpWT)l&*nRQXYO{QV{18A0nAJc ztS~ek{$xF{ck%U!;MbZCIuD#BMvKa`?>}%X=&YH`85sGs>U-q82NV$308GW-8`y*r0Gy8WS z!~QOuYQPWcVQk{Hlvlgcop0y+g0HRd+E-nfzccufEk{lkJ(tY*V`P!9V`o>HKlJm} z?!~v@4EAdK-8EC{OFSKlr>};0I|1+RkK@eMe!cLsQ|oQZte5Ww_|C#iJd)aRp&2{2 zb3Sf^Q{JTj3o>XiWODPXbYN?qnm?Ysv~9l^4zv@O>+9e^3*+-}V8W-w=1;Wv zrL~gjFKWkb;aLw~W7ln_53Oyl1sG5Dna!+EPiEijSnFp_)Sda>j?vb^ zeZj?iTU2(l--qXbz4e6|L>B1A=O=TIQ9V`XE00fo=HR2FcZyYN&z-xM#maLE6zfy| zcsWg?Mae?WZbGB@JB~MMU%w!5tzxf~A1CMT%TL;}i@mbRtKqZwPO&DErS@4UUX*2W z^O$c{kBwtG9nO3CZt(qT@nV{)yxli8FwYjZ$#1cRb46wyNES(?1M$q*BkLAa@ zTxa^e#5KM~>_ zsh_{%g8lEPSJuKy-%aPU8YyC}`SZFL{YfkPODjH<+e^sV1dR3FVfwU}GRj|X^oV`R zp+i0p>;Fx;L3kbfU`+o8;F()_*Nl8CeTM3&MAm4hjd?vVX9& z5A$XPBH1qSeS6$VOf}9(*RwdFbBASJU{T zPPZ2D6aG#YYrX+E(9cuY;!^e8+qIdwRwCfD##EaHkMws{Tf#ktABNX-dc#ghM|7aF zyr{CcBTx=cMGW5U)Z<>q8rV{QKs=cB1DrHRtc|JprW6Z7bp{w`5%^ada+c?OtSVZ@ zdMPQsZ7X~9y6}IEr9MM$y8KUnp7SmqPHOCu-M908`xA1M(6OX@K=oSng;aLyz z^7>8ntKvL&I9u%EE6e%iVa9|XsMBHBh{Y}W0;^8_w9fczc(Tm?yF7E@VN_NrKqcdd z(4Or2=9$jnv!-0;Q@$VJ06O!avm!hLeyp-&m}_i?!LpqH%sS&dU@Q>ct-gl2ho*D{ z&|3(fSQmzG3xZGW)UP#AW5yXYd4G_r*C<}O?fay8`U!P_-<8a@#^-YOH{!Urh5rKG zFnHuR#z%Mx-=KJtI_u=&vh&#H19n|x);)Dy1+b6D#+r|-&l?z918b{*KKpqVp5MS8 zjC!X7pUGk7YMo%&2p>@tE+7tt{Lel9#Nwgd+cVqLH&Mo0G$Y7a2QUBGuUltR`{?}r z&E*=K`{m2lhHr4!Li-*BcNRI7%RAOz@4>s9zBR1y*01eTW*=PU-$7myJTrL-@!N%2 zS*P@UMDtVWl-d1LZC-3GRf0?I6_ruurKzN-cIz>|*Zc&PgYwDGVjnW=aU3_P>w@)| zDgVevnRAAn?g!Q7x!_eDGTUM5%*hfT<*jWuwqOpnE2AqK(mDDOl2a(1W-BQ zqRTj9{KCW@(Yam=4~-{Nwz9aV=XR|G@O9L=zwLqtw9|DAy(*y0_*f#~jElS({gX-) z&!!CCD*BtT_*bx_k(cWAk9OfF!B`^5+-1K{?kaK!HWhz=R|zsrGL&0Z7h5`vKI_>( zDgNtSvjQL8*|H;cj=g2wNB_f3JRf;01m+C z9PSbQn!vqr8h9bBLl>T_*0}Y97HXXt-(Fy+b0F01p97il-3TzQ?y8J81EWU1(>|I< ze`?^7BIK>CY{yqrduEYG6IJg3(rk-Tii6?bavx?WO)k<|_2ZPF(9u^@bS-bxnJoTy5z0>&88G4I*Q# zi$Duq#u#B9>llBDo-sde{TUhl=@%I13v-jNtGsmN>>KF{f|RFHMF55)435omoOa?6m`2{Lh{cEc*+AAH9eY;)z(S-S9#!OP&Wcm{nn z{9_sWh3Imb>zy4ct1VdtpD8|k6923=!t`S)a%H^K>Cf@??E#(@qYJWqLziIAZ_j`) zLQnC`ySx*>+U@&#Se|=2e7AL}E&H?Zn6A9aF#o?6)>C8b{D1D7jF<$-XGVTcK%2(r z;otdtx4t^%3}l(}uuh97_f4kvf!+e*Iu>=#jN zLDAVc9cAphtGSP`@9y|>o}ptAe-|b9bHi0L;yZh>Q$2o+e6P8~!`O^!9(Q*W>+Qv% zmBdiP7od?dxs6vL+oQ*eLmTP`C+oZ$t`aXjzHd&Frz-uJ4w9oY&pAiV*Nw;YFU+vT z3a3WztR!Z?HxE8MCe^8D=sB=AdvcYp&tfl}Y#;HzeZH|f7LOtmmO-=Xd_F+*s^Vtn z0J_0(KAsfWmJ|q4{*XcAdORjOuxqMPD1-G(-!c-HqN1kW_G5)XJC?& zFOhr(KL5?i`06hFZaD{;tZ-5_UBnH$&*@wGshd*rf&BAJZaonB)2h@!X)wP0@9*Rs zW2`Uv0(;7PpNvwTm@=N8TsE@^xI9c;7{zorf2ot|DGl}yy?9eRR>|J?^sVs|_-MX! ztMq9VZ}#9DFI`wMzHj?NpB-y<77dqjt(Y&#ug;8X&+2KLe<1noTjTN4Rq-U>{Y7bc zJb54TUue;)#KvIfUg{t8<3}V**$;tN*F58Vj08?TAlHcqIGODEdsIuY#m+VJK|HZpx%kB_R_=;pnRcS!vQBy-g(fBg@@6Y%W7 z(Yp_P_s&P+eVZSS_k`|VMcmN7x={Xb31`^qLQ95^(1((yt*e9w`YF!}`GlHWd_M|9 z#I4K!?AG9O>$c)Mvu+I8Ast-M)B~@ad;z-+=eZiVw%_Wn^k>&!_S~*_;eqY* zoa3z2xB4#lT+P;6>O1G#S|ykL0r4D(;fF0~K~oETlOM>N8FkpY^^NM+z0Ue;PUy!l zZKMX(=NZm-D)|fjDrgQa86Kpa@}|vZe1rJ9=(_R^p)3F_=mIZg^BMuite@UF z)-5?3RtmB2mLtEhTx~OF(BIFRHP3rPEB&#KUuWtu zOdTigD;I9H0vp}i_p%E`mfmaLRZe-AS*I5@sk&$TZ+AP+LxgQ*iVl2 z-c#P-+t_TqYD={6aFt@!PKP#1h)cQ`xv;xCR(`1a9;0t=do~sq4Q}lgPj2H6hobP!CZ46}p6Zg1 zoc@abCh3pW_1QJAxt-jM&y=H0rDCu`6io4P(tOYYlDx2x}MqMeWDHjR^Aj4q#3`UE`nBfo#8N%lff8 z;w=XAYR~PX9v9epYr*418n!fywWrhjp$Gl!>-~-0tV7y3%lfT|d2$YMdCJ1rB%{$- zlsKrbH)pLLuJv%NpiMl}j8I1)?DT6+INf%f{uE5k(G?~Ri;a7L&q(-|a_GPVt&BH3 z`<8NSd@E${i89{ine-j{>b_#=%BjQ9wRCeZE$@7U1HatnCRO(?6*Jj>25RUNNX66?VtMQnQug$Zhxt<>No+ zpT|f5dn@Oue3d`e%x8K&IoIAq4hrSjI}09-`RhsWj$?CM2(0y;{Wajf+RpPoWRKeb zu52XN@>pFETOe`hN}bN10Wb0Fik)S@srTufXrO(jzp9J1vr>GK%@@J?O%Z>_;HT|- zCLAXB-^&&F&I?)bI%MR!E1cBL_=VQ3<8K3Tap0GRN@tq0QH|i9>=oap4I~2ItXK3_(FA*t`aiJJ>C@j< z>Q=wCZ+(^e-)DW+LlcPgsdG*RJ?uSUXn7R*ycZv)I?l>R$e|Hlj~y|y zwbOSU)C0ZX$*(`KE8dIlal}cS6QE`i#`;1 zbrS3FYU%)Q=HB7N3-Y9^{bZcJYK=_V_tpP#-=H?-04Aba10mc>h zkCkRm(qH$X%06twO$q3dcn^0!^amZ|4%&486h7c{8>E{okPTYz0}HT=(?9tTs9z2` z$$%T^$mClr%+;6Vcq}RT7kF{EQlV`2h?%`3t`q}p`>r&spweKHoWc5*s=KY;?RvGu@uLs8AS2Elt)a1yN5mSPp^?_^kee9tKG{5kue zg|*6^1GYW+vA%TajHvD#$mx_M#@%A@c3a5lZ0D??@HnD9w1{&v@MaPAv}iUuojmMB z*tN9ZI7QC7B{Q^dI4kn~{XnvL=KQl>jeSP^>3}b{$DorQ9G94WYo5Wk%Qj`4fnD;= zShOZ|OL;VK=$>fap?lD6KSORWlcT%?d#BA&K6;KEUeLrPS+Tyk_=2Z{bBE*PesQ-w zJci#QI;fU4$-BLAGOo^^MV_5TGJx&pbN>9Puabe6bj6|;Hi}iP_1JSZy?-va&RN$! z_w*CT^T{8!f!s~Sz$k*Or?{fBqxXsoZ5{kUB3TgXTKE$Z7pI=P+==tpclpQ0VLQE-{_O2bHc|90+|^LJ>xU3>v4 zKg50?rCsq_dbcMS9!`+wI;eNF$$nsLmjk~@uiHVJ>QBorvR6LkUl;Qne{A!-=zpZw z4Wj4C>}!`|`Y@IOa#L^d%MJ2PE$ykUqW7{_Z07msaC-m1c;5oU-NgRcgI|>0cZgRq zUT*_&f1taZyKZbLkIMPPp^{_lE|>`+93b&n<1x^~r*bykKy+k-feC zEqE5@VpN}ea*pNIIZz~K>O^|R0)okiZDy^j9d?}*7$X1}FuU;WIg@j7k0 z0I4qt-E1I_jJLm$>xX)i@RMQMFJn!e*@ut#Mq+@FlUMO<1sDH!0be@qd)p&jMi_WS z4ZPex_IM<#L$ULxdejbkPv;=?wI<77=fFU|FcH=;WsUu_&i4tgZk3Bo&<(GM5^B*-Fzm__rTd$!`=`o|1J98=mp$9ff z&)FJ!U<30mIa>H#aX9oq3B1V$?$s~)ZScp!20gu@PpnNtD{=yd%4?}_b=KI59CE{JgW^~vaF)=CgT@G8{_M=V!-QH z1-YiX>0gBYIK`gMNHE#X{afJv(!52>hC;c$f?4Cob1)$j^ZoILPzFMhgQjMr2ge_PmbNSipA`Zx5~;dynCjK_2BbV z&u8-Msy|cauyNt-x0<63wCA`N@?BGLWNKZy*U#Fwm3z@Ga{9~u$K%I0fls*~C&wAS zf9zT7a<5~~ik;5Y*aA5}+(i83bpiM+zAw;ExEEvm6;6q<@dfbfl@6UavV3?J`?o{dM+K# z&y4-`CiIcj=yedNgC>+69rtqwe`T)5hSd%Wi zZx8b55NBlUS(+qqe0zMkHS?^+#jj9L-)mO(1b$QH%p>@KNVc8&Eqw6> zGHH5W(Dp%VCKKngU`FP zMb7uW^XN)e{!Px~C-HOZOyuj_Q#NCf$?jbHUTI)FoX}B};_tIxGupPl1$ZX>R?;?NP}saO4cAD>R` zE!(i+X^m{74Yd{FJm`7kesW^6|1W7`9@n*_x7R!LZQeW1h>pJ_mz>_k*|+{am+#QY z>RkhIecI=F?~nt9D+Y$LJ+8d$YrB-2R&#T)c~MS<6QRZEawq1dhu9yQn{;sT@R0UA z=BVLx`Z`;;og)_=q+tI|+8FN-eYgFIzn@+wd!6Cue4aUJ^kL3QTRt)05nfMx!}a^n z3bpYlF#CP#w(Z(6>0V_d&m4qD+Ri?GSJT6*Y&#m0$_zl4+XX{taWF5ob!5KrRa(~$ zETva@jqloL>Kc9@TW4ZEItXNgA$Zokz*%(&_v*pH-=Qt^mCKt$w1-_G27U|xH(O?i zx+4K6UOZ*IYE$(kpts}w2{`C{R_r=I0+@GfJ_H0LlwuhJ(=v#qo-6#FNpA0~O>W{{vw?mT> z#5B^GKJwi}-`mGo?2u@LXD_sES$$fNb^b(Gty_OBjCGAp+1Qhco%{~*%U95zzC))_K94g1Q@@wqM?Nf)T^-g(xMBUO ziom?4EArNDy&~^3TMvDZURR8cP&C)p^XuwJ08g)u0_xy<){VXwt#)X~!h*hDz?-Z8 z1NgxVLHnkApUF?L2bT}9ZqgwS=K9w1QkndsWE;J!m&`;Qi0R7cy(t5KZ{O?Q!p5A5 z0hZ#?4lzE>Nge!D3)dQ(a8YBEu1$OTnY#n;d8Fs) z=KETBhqA_pRz;~_G*$9~$`@YdnBW-;DEO=xuzsDJWZ2&RkFK|ynH8xpnXx^TR??(SO zejbZ|_o~Y1%O$bsP-#}QkXWTbY)9Lh9)s@AMStkoUlseK(8+IVr|mSc6RPs>-rC5V zy$bKbMp=-=wweyIkMT@K6URr$;al%@s{eemjV6cQOnPfwLYAVyS}$57FJ|`)^m7xcWtbd(Wxf zTE?I@l9Xv-oYoGjIgjxCBxPz^ow#T$`+v%()20tYOF5sU_Fu$CO>DBF0B8C+=g+>6 z9n{NrV(G5x)31(m9PPj*fRAu+mSggiTiHSHr=!bS7wgbJXl-oZ+tsX%)vOKO4_&>7 zQUp0RD(CFUc|HXVD9z$N%TA0h+9YnWP<;&HY1AVW( zIrvQNR`EUU8T;{G?&UKf{|?I++xG1@?ck0#mtHIl)2}DIJam@En`axmz0sqm-deZt zx4uM9i&-aA&U<20{Zw@-fFFX|zSy~isWAgaH8!ul=S5H3uk!d}@xO}6)pG78Q=j~K z+SlA<{Mfv?@a&8&Rf`Sp-4o33c#U(&oK5B|vNs>o!C7s%w^yeYd>S2Qy(ed>z5-~h zc!Y+G_SLugHTdl^9`&Vub+w7HpnLU4G*vN-8oqT;xoAua^U%;;HQq;;chcR}V}I2* zTJ!ZsW}9o*ncop6j#PMUcz17bUPldQ46z$`D3?Lz99r1xd$$KU4%=1~-F*qXEu8UU?~gwz<@sZTx!ORn##?te#_> zWBeiX@E!4EZbvO;&?WJk)!|UT_M6G_&n)gIxVwh`_~$%-65j#EM@fErW<0$yCwlS(akqG0 zLz(1#Sy8nmpBL*JrFW7;Y#($lJ*Ky|Zr3`V;+r!87vaAh^PVhsIIb}xTgj)((!?&t zt2*_Y4sI8W7kK=-@#>uTF(2n-7nPrzaB(l!Y9kYW1bffd&D(*uhR6VGY=R z>958tTGvB7IKeY>{CaXki;XBYAh)fdJy(6?G^ zqZjxgdvq+5C&={S6D-id^!51u$Ertu9hv3rbq+SSTKthj|7sp@ez}6U2HSxL=Ucrq zCyzzP6zf3G!t5JSZ2!^6B4b)3)6p2URmmE0zUle$9l|fd`tl`wU%mu*cevZb^Nabp zsh*4JumqD2<==?R@Gtdmoa}$?;kW#u)SpC~&sQzO#tz;b1}1~7L+k_Qy*GB~C_Ln- z*5_t&(Q!7f&M7cCIFtGw9ii|^didW2$I{E3)V2IgvQ{E9oa>Hly1hI}oX_O9@bBh) z-!QoL9=N78JosWZKFYJA@0AA26Gy3s`iL2B+SdG`qbCmw{6s#nklHF=V$XXi`P|J1 zlFtPXDA!8z8mA9`cxVD^Vf!rnD7`sI=H6obs}H5p>l)Cx$S+rQo!+R}R-7Y-KJCFi zu}^d=V+>Q;CP!%XOUS`5+1yFMV-lVRpw$MBe&2OHwTzx!Y~KIhq`SO8_lC^cVDxC? zIyQ~9U^1`n`KgWb>iAQ2wfQ;WLiZdH?P>+5$PYIrI2`5szUq4p^x>cMjls(J9{5|W z?e3QY{U884|O zmT5Q|FRA43O#W8!Hz)cKyqBBr^oxJanTB9h8fx!ra$vjlwGe?1G_{=xKPC zY-?X6SSFXn`bt8)r|tiaK1?wl3whr_-AVS-3Up;^Cy#GExx%yKCa~EVxq|%_e!QUAKb;DtJG;-d-;}?d4!)iN>4&eat z8)&b8=cdP2Y5bCb*JD2r4`9popbJ#l9P|yj=o=PDU&l9J;hR0!8x(us$-LED^?fnl zDo&XFHiG`ce*0NylfLWVJJ~LN+yADLZ!`ymoN*ZVrLnR1C7YZ+;oeX#^q`dAw`asH z?iqOb_E&hn{WZ`ZtKY)rSfDw_AEN;I#?+Hp$3o_Fz`!6d97Io6pCLEtEU@-`)n()% z=%^XpBj;G*9E zYe0Ng5?)RBnea%jWxs*O5&w%k0)g^l-FK9~_N_b0=LW(#ckiPuWP`zd+7CV5Km6e< z(qYDfZVt3#C2RPUbgTo|0_+*8M(CPs9tqa`eE6FynNM_Eo$?2@{$~7O3~4w_p?{BW{r<+D`S5$DEQ3nH94rk`=22*{~SH?yFToDa&9rav-;n6 z$t@<%@j}*E3*Tv6`ZYrvq|3Yy|6A3$eK643#@S2@hoAd(S^ryfD!r`r6?N!hx~Vt0 z=^W=P0w4bybf4;DD}NJa{yl&81^AVX&#!!=(EaqB&R(fLw9=0Hpt<_aMR@4Ryc>BM zkA~2zIjL1Y#7>6q@DBQ*HUGi3JI(xzfX9NpWZeinD{z0n#dhXmug?lsZA~)IvT-fO z)>RYXJ$uS}c%VmrgFOM8Oburb9s##3eBLI8SU2yFVNa58@59{zwS&*TXKT=PBfcIF zql15m@jr&|h44Ur@`FC?l1*Ma#o%88KI}(~m9|m~q0L(;U%@z%@M)rBXYY^orSO@4 zAKV*52liR)Uf*D!-|?mD=uY+7*4_$Yt+T(+ZyJ2IW@`<4JPYG1 z=!16#!h@;oJ>}T2)GwWHJNfO(cum-w6a3*jRwIL>Z|*F@#;7_@;HxD&R!lZV^rP*+ z%*HQtQSUkQqjl&j!{GN;>cYp)*c`|1C5N~4gm-h+l6=|et7k`()$reD-aNXM*eE(S zamHA(JT`}wXW_Y(Bj6l1llNK6^6j(NFL5oqlALsqqpQV>O;E46j{V2~=&f-Lb`vfx5Rs7A|4^$=` zBX%oiJ>(A&xI*!*ChXVS=_kBgXBa&xWi>7n-{9Y3XPRmcQXizl>A|krwcW!BD+|lU zr1$o>m;OvGBibyV4g1Z-WEIt+y|L%loW0vyHTmpaE9Lc_t$S))lj++;4&=LhdE5GY zwQw%vRrZr^hrZmV}+e@WGt_CdALgTGk3w=(`BICTaa8@X2FL(m7!VGlCwRws4e5&3#9AR#WFNELqI?eSm`Q}559T&aJY;r+g=cGi?&*$%C@bt;DH=$)KT z_x3?|x5S^CIg&27tL^`~p+2bi^}jXNkRyA77iT!qN!8y=JA7SQ|qY)p5C@E{%7>g+p!tlhRtX-Hlte3z8U>#K?;1!TxUt_BdkSF59;?x zybg41O$mPof&Cb?_!zoqt6!8(wHBBpwja77`JXu3Wpr^*-H`k$`jPv{*^!|i@%jf& zZ=4w&JUWga22RLl1t*v*#i6xwfUfO029{di|LMnLcxCFi7!9!T14L^sh#lb1q1qCD z89vU}De0NTnP%`x`=ZV+4}e>3^tZlbqK~%R#rmMRX{Y_nIujXf>-j%NcU*LYVPXpA z-srA98Jg9*hggSItb^O(NoHj^sgL24c@P;?a;KZdKN%lBoimdRTFX4vQC|E^SrNIm zD9>6V7pl9qjCVOjm|-4HT{OWZ`4?_0=}Ivz3h65#uqT;I|8Z2qFD{*S8rUp23L{|)o%%=mEg`sHcjOc!UwnGSsTIMb8n z^|6U~(Eqo=qxRnbk67@-!DC6~g?PR`IDzMt!G9f|FQ^>H^Kg+D)3qL4k08GwQ=}qS z5}zGAOfmGVq`2xFG(fsN6aUZPSQh>XmwEiN^$W0klKiI!{P>ZX_WFEiXEQeU1a&o3 z(N0#t<0WKoL_QX6mVdl=uHB2F@9%wv=7oPRHpW^ywO)M*uqG%Uj(D*^TX?3kq&f6m z^@OR%(ETeM(d$zQ&OBd?){p022~F?&Q`F++LAcH#CNXyOVrZ1sPy;cV8p~qw`t3(< z7ziD@v2}IJjb9tgDsSKAq;`}!@s^n_H}2`yI`nM()8U=!(JwPDh%JAi9p8&RaY*ok zuP$i3&d75a{Oa?bUtMr`BW1{|jT`dBxdm%K%A6DNduqQCeOEE_1I@9V6(or#`cNi#X13Nl~>qn;3KOA;{>LzIDMZ{2+&GOur}ktaq9FuS;C) z8vGX(ce(6?`r|v%xg>-}L;B>Xf6I!JoUL`Bk_o@O)38xe(}nw{TrPBymN;0 z>2%(9IS;&t9`GRFp2SybXCP-a3v;Dt+{dU>&!_hHb-&Ji=r_yYzv~#&)V{q2 z9RGL935HX@7YxPEOnojG)&aw*b%hzHa{bl#=iDmr5gPy&mi|xRt{0I)d9{;jzBaH$ zaB0{SEN^}yC;reAxp8;!$u$idc=v2zOY@r9@#ZHk;kPjU@Dq#T?&Fkwi+2x(wpcs% zRC=%W=YFa=j^8h`%)Hn4uy;cH){VleHXxsc;RO$oFR6WIK}Yb^d7-zH_=20)Q zxV2??{*_)lzB6|pWhqbS@*d%=prK3beVIP5`D#{dTp!Gm_-sr)O3KbRq3bM%|df%t$g2YUUO-nVsc*wX<_2Lqo*8QN_3lT4Y- z#^Ou2{YF3j#N;&f;sg-qAeB@9)S69B*MstNO=Ms4lKfl~+wgx3Wp}#pI>MVoMeB`; zPqf}Rbd(qeiXGOL->Ezm&J2As z4LtakWsHBcO?HZG!yk0P*F=_NuZ=En=4>i?ZC3^PFNX4W?pmF2XPx&d zKSns}#Q%x4b?lAG@^;qyy|h*TbdBlri0b4gIM-h-UMYkg!E1wk1DmpkulnYpSCR4m zfpa;;e0eX_zUW7PTUmY#{oiZdl}2`yOj!o+q`EqCQ?D-lWBfnzvr@zJvrmH0f zduHS3)J~fmbroavSbIgvwN$Nqq5_vwk5!NiD^?b zDf!}(a*ZkZ>XP!a>C4Mqd`k+4$RP{9uWX8}()g7-C&KuL_)a`$;THqueOY71`&k+9 z|M9~24I%7eoXyW#c*j=Nt-5-ttE@J%Y6MtvmI6N0H!{a@~p8wV~ua%1AQ)*A=zY`yW!zF=zX+vF%dihTjNt860sX3R(M zU(J`t)9*T|Gi_Cz1-`kj{?CYy_OdrGL;G%x5B->Y+doxqRmzNzb8$G(cLRMtPk#2) z(Lm}vd7IC@PX1N$Z;vWR`}ab9>7${(`Z?qnXRg#n{f6-P_%y%C`+}+DZfrEw`Q<|$ z*hn6~Y;CfM>zBh@srQdr3A|+2Y(lLD>@WktW)TOy4-iX7DGoUgen_ zhvDnM@CVS4eBgP!^~Q%^MAs+W_3a=@!E<23E_`ltFf~+K8&5tOOpR;{rU;~zI?3GK z)ymmZALi%V3d(B)hv8sq^p}*sG?Yq?1XGFE57XA+8xu{mc|UC)=X!Iip=ZhbPzrB^ zl<**ikE@+W;cxmZ@O(eWc?-&IgY_4-dsfKNpePQTiBXp9rz3C^ctp()E?82ws zy$pQ*AoM^?ej$%%ugzKL%oz?v%E0@)*VaTkK8l?9G5q>oB-hVZuKfP4rogP;D1Vjf zCz{u>EBdSKl^onCu&}c*)xGi2xmv!l*c*$n4@Mp0bD`fDa#CBv-nly3KGpt{G=9}? zZvks9{K2iq8|Q>O%4j!tVeHxW=!@D{UXj&T9@`~)8sTpC3dN3Sd6Lfp!J2D9EFDOzRHg6s3 zy?DSRImna5)}OoB>HqrNmNk`(2mh33HV4U(9Yk+Wd3S(wfzL6YyMg~6exb|pmGjoN z;IfzXFFBZe!*6_!?~8$-c%2rmEgThd3V)!!uIv?Y?K>}r=8sw2P?_XD=-KO81`q8w zhoJrPvF-`oHKu*Ni*~-Yb=d*Mi_-Txf7R6%?6>9jx7{_Sb3?D*_ek8}(9*0_@|vtv zdKrK7(UVu+UamD$Nxh>!&3LD}xKni3*0C4+p~{Na%q+uMs_`re0vtoMAt^i21y>`mS^ z`-KnxZW14*?wuJwdks2}-24v3y#;xn!QrIS&f^&CE4l2Z)UoRVh961-kD+UBO06VU z>KW{jXFmboQ-MzhFjgPlx+Qktdg6N}vC-BxyK7fhT)K7`U!qN)F6&tRG0v%$*BoC> z4x#r-x0Zd;$7RD8@T?F#j(~&hA7rmQQ_a47+o2n~LeJjd?nXBl${*8ujxgq=zm^5Z zfsv||`(L3!R~_3`$eE|XEdl%~*Oe#P+f%?Z`OB)*{5+>4{WA362haleh9vv0n|DjO z_QErF#o~vmCg{~+t~2A{2xj^zR@xGL%5HD^MHW8lJ{aBjZ?-Sq8&u@%}Mo1hs@ z#jh>e6v!zf=0Tp9XRqZAbTlT`K_l<*qc3wP3oXc>H=}m7=exRu^Pry3hT8aPaB;3v zE&I23*75V?_tx|Cw}Bh8J==rudl&1q23h5mpj*b=71UIaKZ?Ee5csZmD#F(!drCX< zm9eGy*NK_lxri9gUkNV0wuZUd!M@xZy!_gVK&0t2fv+vHWm@Drz;}|1P5so{Mg5Xx zZF}Nd@1ZZR1eaW^elFr0H$q%t`W60E%bIvFT*hAfAiT>W$$2#uHHL=|JML=P7{Zjz zp&T@5(RG2jWwf=@b>JMK)9$BZc^aSUrQH>8;m2gZZ=fALujko48PCHl+r2ia`?|cZ zEi!z%^LqwPDldO${dGwfP8^U;vIh#@_MPHdodx&b<}9uQ3=f0XMc__|{K)T=1PzX; ztZ0UrC!XnEIF>k3(z&-S)UW$?_M3ZwZQ<;XJQ$-M!MGyuiKYSI^%i4P8T}H$j~KYA zeBq2G4;E22n%G0Wy>O2DaT54{pRrd2mYccF1%`Sa<}dU0fa;s5Yss~GXWK9Q*rEr! zsPDV9XW<54_<+MR`;CQl0yx`mEj(f zqCnxBZ?O-$MVy6UoDI+f_X_Vi#PvLM5)u0RUDmkbdPzq$=;OG<-c`gql{vfdrqtMd z-dP>B6Pw|z{CbwNT(H&s81K*e?}N~+D)dUGKOxSI1`4lrIVWgs^hL-s`Yym4RGIl| zpFHjtw4cgep_pq4>K^dxMwivAvD$gJ{s21Pt-AEny0X`5$CeT86fDKtMb2ceNdBM- zI_B&@%^L36$~-eK^~{0rwwCq4y71#JHIf&RK4*~c*Px*D`fs# zn1A)75d3K6I`docNZJDieAsC`10~?FzYo~Gv@81)h6nEU_r=rS^Wc9lxL~-L^>KPz zZQq%Z-ziT(chBNSCHTt6>V(hx;n(+o#(bulxI90=4~;#_@`aC*4_q+v_NPT=f71Qg zcW-8>6MXC_^jb9C`U50}x#yY6jQ+SP^$>D-i!Wn|?`&f~H}xL8$=J1$M{i0E9rwz& z`0F`IpPXWEeJ0LQ-}~PCM2P((+dGe?F&@Szabzj65B?i+Bxmd!j#QTSyosH8ab;>~ zPh~2HJ&O3Er$TRf>t-(aw18g$zmxMTQ&IB34a4(%p_Sa&@VzJDdDXXrp?PBm;W?7< zzeDi9#H>v{0$=p1Pa~4gRi}Es?(8QH{hEdRhF+*njeO$PzJsAT#%7>#S{R|XS*N%! z@H9;^?15+2!c*NHN+n*N*(X`amaAv2wO}`{$c4{W>^J2VY~@TD*F&L2WhaBNKYI<` z%58IFtD4c5b*&62&rtskVz3QWm3KsDIOW%8J9*y?%~>UXEBTlAol7s@7g{r>{_OQ} zBp>-b`FdsF&=0`pKz`GPXKS}MfPXBCyw~_E5AY=2Y5#;&r}Qiix+-=8eSTXpJcv~)YGju5UZm9{a>YDskj?E4$n*sLipyyi^x65T_cNcf)~BX#G+lV zHQrWa<~ue2rc}f4F4?Vh?BJ(8M4jQV7aMhi@gE0XdY`$-3J3S;j8; z%#M97V-=37kHXCeG)p)+3Qn4SXX2yiJNT%ar_BFwcX42y`#Z1f4wK6=$IoS1#GW1q z$FO-g!%@9QU*;6OvfIk;(p5{oOnh(qjY*Ah+l-WO{~$b{+SC4H+AW3GWDbXz!;{RR zo}K+3^Lr4U^k`P<_@^N&I2o#z&MFVeDnr)(AKiZ(B2_m`l0T^Q97}bJLquTW&A! z-u-r9mWkDSj@VO|@~#QI{2TcEzw3*|-^O;?PoBz(;HAR}t*veM9|&x{|G+OP17B=t z1^XoX!zIJNz}NY2i}&2~1Nhcogl6}q;RTA2Lw*T=capUpCqKldOL98a_IWnnf1r;; z{<`RaW+lN5+1*FLnIyQQdC+eR{&gYGU#5)slSHYvN9bKQb$plSDaw!OyNq?F_wpCk z-^29Xy>wAWeq|PL^Uh%{MoxK|_0s?x3O~j?K?8-)qU!NblExbNBt#jw^7vkT; zH+rsLtl5d@kkh%2Z;#{#*3}@-yFUzWae;A7pl5gD6RexomK%n)RpCd6Y%nXQqhN=V z0{IG3x!~=5FCJKWH}V3$u7AkfFXWx{qLD(*J1%xkox$cR*~FcTu8?v)T)(DrfgQVK zYe}P<*Z9$IrqWNdH*}y2@nLb2wQk`dzQVR+`>$~ih02Kqo8P+(|J!`}9!AeB|A?}y zb9dj1%ovl8#EY#rHec(Us`{lT``&iy zIrPq%y`-bNDr?g7g+C5%G4$t7)+T&RA^h|RXH=5;&+UrO`GZ|U(Agw(HhCM*pfyHc z=hLOkInh|gm>1=T-pd@HVJzqI^*DWRtnVAZN9Ufu7g{iuxbw)3J)vN~=Hnsu_7uED z5`XNmTfMSN80+U}lb?_H6vX}*K0Ly?{r;*gyMJ7@rTH4?R2#WOB1?F;fPIfS8QOS7 z=MeUJ=@(z;w>r?VtD=Ay;ZFOm7f%HH8=0RnXXmcSZxSaQ{aVAv$=M9Nw7%zld?(_S zhePeuKNPxd9R53e`1fA*;_ln0!vBQE=k%Ubzro@6IAfRs=6#H(=;{}D7X%i*-frfC zc&y0JN6cIljL(JMIkOjb95Hh-@%(FcF3|HG11HqC?St6ILvvqOOqAAP;#?3%t^Lxu z9fyw0=nRmvTxAqzc9gzYe>}tEirzA(f6-PjmiQ|3mrdMC#?cMzPvo1ph0kj)5*6ET z)LI`x#;<_JXucAhAL(gZHf3i1mF7Sbq_+H*N(kSoc03j8Dsb=TiT?06X>@FUSRKMuh!o0 zG7lrj5%7m^jIqYk(7Q9xyR+~WWB&R-!}>q_)nIBKW1J6sN1vOZqv9=kpm#&?vSr2d zcE{K+3!V8!4y_E+=hwq7>|pVWB@c%P>IeCo4fH9X3AJ^8x}_%8N)p4{KE z)B9d}F!2qt35gdG9ZEn~2cX?%Y`XU0H@dkhb^6gN^tj^BCv+9^KWQMJdm(=3_3U{y zwAs70aqKqmi9PB&w*{Qk_6lq~xEre$#FfaJxTb__LAC{CyN&=X>BBbS$~; zX6Sh+HCh)+o!%Hqjoin3_WY!9l{MW1-l~7nftY?)dpM9_?YiRswo$GbexNNYwHTPZ zyqx_5nvtZPq5G@h&EadvwW0M_123+9O!K6%TllqH>#UOv!Jfs@8D729+!l1j;$P2k zJI+$i82ipSc&bSAWox78UpQm=;6n5qdpL`rJ)#}m!O;J~x6*Mr3x+o!Ke!Fw+wJj0 z3x{|7h#NLLUsKEBS7Lmibq+O*-xD!2JK;5+{V0D61Gz6I=<|Pir8#;K8+!}1 z`YSwV9{W+I&wnqJ`}#2cn;#43cKm|Bf6aXEk>3>ae&?1i9r#o7wdr{}a9L9k^2vV* zIDO(%biO4QeUi({Tzw|yo#NSABJ0IAb z%L#Y1GJi>a`0O+lG0tvaqPZ2W>z(|N(!oW;1MtG4ISF8|zNpMQbM848;CVyH(3<`R z=#$=Qel%vy=Q8$bJDvpktm(!az?UV$4|?^T2tNP8E8&5TmU{d@Yfz}%i(G1M!m&NUQ;NV@^&VG&0e)lFZx}oc@EN6`WQW*FAH)8*wUlyF> zT)zp7-vY)3!1x7VEdAPU1LMU_4sfmFmjFJ3)!V>UuvQuA+jO5`4s^dKIDfbj_>R7P zYh19DPVx*qti6}sZ&E$}cgmxyx-|#-YsdJZ;ZGd$arncVe46^~9A?5=aMGML1fA4| z`NY`s>6O~_apF6|iS5J?xAjdof8vkMLbsBet5fGM0dC;JIo5#krxg)5yyofHSRwIc zTNFQU3ht||mMOF%l8aA;=m36Wdx5QJIOm{KOWCXS3^=U&!j{GZckmO<-V>N@WC-a9 z!obwW#eU(U>*Kb|IC6L=KXrU`6zihDjQ2Ub*L4o>#Y1dh4&G$X>KDwmK4R$j$kr8O zN$D>Rd;I*_`)cBLeVk(tw)>6Nv5l9+PZ(Tr^08XOy7@6i6CI=Ax80^n1z&N;OK*eoR8 zWMuS-W}BM zewQJ)?`97%@4yKwZ;Su4x=+cf%15ZaFG81l%){6IW8kZvZMd3#?Li;9@21oVKPLMk zY;lU$zwCqbD`(+dhoIY$fWh}gU%L;Pw!FyMpV~Zwa~74ULH6%NXsH>a zbTZOk1OhYBrTccpM+>h_4s&i8S$sC<>!nvZmhCJbL7tx{9tk?P2i;LA_^!SskNyrm z3ZDMo+#g2|^%x`kc89#5XY~1c7d`%&;g!4zN zL1aOX|G>5h|Dk%v&n)@nivF`-4xLOAUP!i0l{K{&^{wE?}d9fSVrnQR8F{u;CS;>0gW7pQTc z@b_euCk|TEjttm~cN?PLC+WA|N71{p;3Z8~zoB|!@F1T&n_e#6htAoc zY~JsZU)HVlbQ>l%!jw6Y524O~-vKQhq0hp*alIw@GXXDeUIm*7HU{ao=jO%G2U!^B z0~2pU>1j{0Muw$_#m{n6>&``W_&C+J?pOqEZi=+FFG?N_^cfkz zUze80v^<#JZTEBJX5#0`qm_NN;HhZ*5psUiz=wa8erw*OSBEy3xf7o~t_w#Ol0+67 zLKc$#M0~jPOKIdGwWBfokUB=7l?|NbZ-kEy&_<%oqa*0v-)Pt#=xpr0CEmolk5Wem z{u!!gh;~jQ&kXzeTx-*|bX0X)7_oQlKig4jaB~n_@&wKE=GcWcDrVw(c#Q;d?*uLN z-mxL!;0sQxb z77qto(3x!e@&PmcZ8seF27Dv?asLYTEIl)I`(v?luIEAO*FJ1xOQ@|MGqwicZuS81 zv5`3v|4;*+Xt>_nL!|GtI#+Pvfc*8eZx6r^VLy38b10qK0Q0PNWH*t%F?k}ZZ#vxD zknPF1N$5Q|wOqEDGQM989UKO?YXa`;icu%}sCDmBe-HX(#h@5?n6u%OmA^^P)sMt` z*`v^DosyrT@<Jiq`z}4E*TioXCt%YA0U}s=a)XSp7ZL++Y6BE z&Ol2I{R6MGo+H5NU{z$easz8pYiwXkWofKOS1XL?_V z`*>_UW5{yy^lX6g-X8AZsc>!ub)AL2OTTZ|khK*U`_^0dcw%$RqzBW{fb=hkOHjSG zd`}MfeEofswoE^@cd0)m{(W=MX$l}u>RDCBGsSk$vke)~4#Pj`+4hWQ#s0JIjAz6ER=>gf zD>|IGn%rQ&?ZFJ6U1BjBduPEsa|{u7DWqALc{G^9AdvX$$mi$w$vzN z5^t!sjBUrlhVh7}YoYH0rJmhNwtT@){7PGiM^h8n(+04g>3hYtnOHANI%Nm9yqe$( z{T~i|2D(OU^M~%Kj!K5FAudECvBXcpyKb84qy_=uihtfy$%Wd6~x740& zLHeuu3ehc8fn)VKPG1A{>3#<^oIKinn!D#|CrKORsWg4v0WCSkZwPuN+g)b;c756U z;enPbw#s-Li)e$G_quOX8y|7{q(9U%==OEZykF0ma`lbabLOwLStT~J$FVo)U1B$| zLpCtizAj>1j`n#$tG^PBAGsTRLsur9=N@te2(MoFj-8<}yvH6B z9JgaPxQ!CwnX^Ic!{hP^J~GHBe|S$Uo5By;oTjl%MD$_?jnG#$6@}g?! zJ8MW~9Li+gFIY~V;G(mrHN;*E#`;?Pb)3m}d;Fgla}9={ zv}eT6ug)U>DS8lSi1mR<)S+iBMc!qLTRF?tr`?}$uVRVtYjesW(iF%dn# zn*{vi0KOLLFND5RInpg%Ijpu=f0}dgI%eF+hIXz-@~cztQ&&Cb2NO$ayMngw%}R-X zkS$&^K_mDk9wLftP=T+-5!Qr(jo`yCHGFgY8f<%W;e*pnz;d$(%h9#?1KsWQOJ%yS zwN3CGYYfkEi2Z4A+nNIdzjXTotcg+JnFLSaxqFwQ`~T?URpau+9lktK;an(Byp4}= zJ^kWrmys!YfO8a?BD&X;fpx|tQSIsGWIJ8Ycs4LbtKUi9dlP&-XRsObisB#bN~6p*E@vWJN*Of zZ#=i-PO>%&1B-@>$jNbbna|s1$Z3Wz+jvE1s8l|W9uL`-{fJqA15G!j@Q2wyct3N* z858BATFM&z=oe$-FtRe&o@r#RFF{9ij!ZIFJN9G)pUXY?7?}$`*vdx96RZ2&F#HH~ zH{nEeceLTH9-qSXBOyk;n zBG}*kwC95thv)3w_elIt+U_2^jqmpaa))b1UB;7)%`mOT% zHM5u1fS>cg&qvq~lJs+kKAvP8llWyHN0Z>_5I8#Q<6#n99RgQRf~%uGeUltWd;8^-K4X<1DwyX-`KOZ-A@Pl^XRw7BTe{; zshln2{xk2bzaTQzxW8rQ^#FVObp5e?neLr@D(`nli-(}~i3mh`_zwGS? zJy)*~eVx>X^`*Jq4h`ny1P9;&WE15W1{?~jPggk^LOnG>a zoX8O*J;(yeDfe>%nwMI$VE1*yvAFcf_^0oe?}+M>3<kG){{L=00Pb)YYdmI1c?RT!>DBx(YA%bIVPE^sA-&v_uGe%Su7p9i=< zhW+FiV>q%Yg|J)kXnDqNFW6WIJ zA8gAeuBW%YERM=|<)M43;`2EJs+fu`@XiO;%-=0vlZDs_x1`hi-AfrO`*|2#C<`p? zP}|pon0Z*xW#f)7f9*rD2PQBA_$}p#Tj~&O987d{-*!i@nNAH!#t)3X~x(@mA z&Fhaiz~@%Z#NR>;w3~^6b`vqss^jU9p$7$#FCX2V#&=QGioB7XyZ(bb;zFrZ?8Lsv4p&&^76xuA{yh1z&+vsZeT^_uW2`k@j zj9YN5{59<7NpK@TtR!ry<-}cVvUP2z&L}#%Fn-jk6TQwF@U~odnGVh9KYxE7W0?cZ z$p`jX!~iBI!7^kiej2yVTlbu}eAU6Dmp|6^oCmiS^oSAiUAAtDtWrM)RNm)tKG?RF z`qq#~=+kBl)5T4;I=hvOO}Yfx4qf;qov(|0#goCVLk3fP8oRdJzeQ}|Em30wX6_CD zyCcU*J&LUI<~*nK5$uE?_%UB1=j)Cqfmb_YEi7{4gpFeWQ2Y49=Ky zvjr7PoCgmHN3xtxhcC}w>vCSp(;ahujPqwn|IB*$Q_+s4{+acLfZH44%zBN^w==eA z@sVAt7m#28=vi;NF zIPe^dN7yPA-RUkv2-%5JuYwpVlJ zbSF4bfjlajDBZI7c==P?`ajra_BqkSabAVE(ex=qpV$Ys0q^R7i9v1S-N+6(Kprhy zhkUG%O*$3F8QM4IqUTl)o=+Y0!+ct@}2b2j{PEdJ83wj7_` zSiCAHkkfHTu~WX2b&d_Nb4M9*Er3PtcmB6{erw?YD~ssb(h{pXwf#~a>dEmFy<7nA zWJ7C&6Z|6Ih^3C;*L)D&@c?Vmm2U3v4E&u~=eq8n(dqivVa{DvR4yN`C0?)WaPD__ zulVxRvjAP_`DzcxLR!l_dmkT))Z$p*xy|IP4b2}u?CZbn`+IyF>ajnf9<}v2=NmZl zQ$)G<{kls1y3SJ9IqEu3U8-AabG>iNRhf6tvFiC>$Ug}Dwl3r9zuIqKm{GRX*TdUqQ_Hqxlr8q* zVxQTv=X@CK^UDebW56Jl0fT_wCzW}}mvzhJQ5hry%3U<>qV>$MIs zRlFGYQ{Qjp{g-)f&hKT6S>xZB(RbTtJ-7Wl#+h;5>r9O5t;}fmG3wnyy@TEwynxP4 z$CJQEESKMQBWt+*+1P<7GK1_ttFMzk9yX7_PGiR^;<@EftSq2sdwm%L{$Rfw1Ak_R z)@IV%AZx$MKOZ+E+I(wF6s=fa*ToZl6T z>YQd5=Mk@g&kATQMmgWRDPt|_ zd)XD1xSsy*v7b+jAO8eH6S|?HnRba-Xi1sAlP|+jWp1pbMzHaAO zeC8M_SCBqBqkpLMvM-9SK6l?7ZdQ0leX!-*SA{@7`|s z7M)edcNXrfZQ6WZ<(3={JbNBFs6BM(EyWCKxTJ<$cnf#BALQ)*EctxguRakER!+oxXoZ0C#+KYde_%f9N{?R4*C@YK*uc$h^U z?cefvtH|uJSD)Jst=$?k=MmLcXu!G_U;onn1m*McI~Fz);~tr@eLJ!If}U>1`p1|y z)DFJ@xc4>og%^c4m>~Db{9DJ8E|hMIJg#E z^klN3(ocPnz7*(;uW(0kOq$cgdl|(~Cw=Sj_I$S^TpWvUTC6j~pD3FJ&o4iw=#@X+ zrI=YRe*)g#v;Qz zfOj%PYzAUW%73mF-OMVF9*olqf)NXt(-hiX?{jIg8v?N55_MZF4`mD9)dyYBgm}87N z=9n$`K@7>~F=x91*L&x>zQnn%5NEjN+5PhI7qXL%k3Ew|@{PVl7b7M3-{YL4eDLeO zg9dmt#l7F`=y>za;Ri9rzQ4j=;2dU+{bCpL&e?3v{QV;MLSYts^e>jZQ22{Q?C;%@ z=+d2j%Q@qhx(R)V^i$;1qkieEUj=x)koGlj97L<}j|6v5UT02Q?hoyB&-{&tKedf>mWvLq-X9E{ z=*E|>?mQ6he+m6rDz~faSkBI_p(R;K?oeT0k24;?deHNe2VHtsKACj)@VN(L$>Nbw z?j~t@w|mCH)qkk{`6Vr@^Qc$8^S45$Kgqss2fEz4=E|mX%P4Ef!PP^Qr*n0(k+ZSg zECdD{I8Rx{-mzfv4)hA2^7xqQ=<2NsoH!HA>eV^QsI|SzIZL@DaAGs@FOcqQoS}?z zp0eJ7ZNOO{RYu5z>m9&#k;WakE(NX&fNAfi_w9Vpz;kKKYSy%~mH1cl(9YAqi+d{j zf9~nu4svJvz)dZy&!H1loyEvOZ$0*Oa^NPyfxm1l(S`Qw?jw!Ge}+z6B=33T*q2$W zm%)o@{Zn2&x!s(TMOWSC$-gZ#+%u9oA0?UC%%gLR=N{%?7~N0Un@eYCSD81T!px_Y z)7>#Ho{rB@%3iS>eH=3K(Psips{aPsqW_vrn6!G zFnvq5_Vdhf=%wUR;_@c@hn8+qa4}`1XxC9>3i*SNl;rKSymN~x)94#n&&onK9PC0! z*%yXpLw`SRv5xs=U&?dV9hK{Ei}9&6>3HiX>E&nRa$&$uc)8#M3ob%d8&~aVy z^mTq3QwANWfrg95oC)qIG;}6G_><6=3h2v~WjhKDJX4f66uhnXcKTRIA2)~|qvuM~ z$DvZIbB9AS+&(UEda^Iz^wHI+$!5*y)6Rc^G0=EIBLdiQ4b9F=)CKd77h?w!pr58b zy(R0U!Jl10_N3;%+NF6Qo5s`NuHtpZNp{zl;UhA@@h`w#&DSTH?|Im^Jms73d5hio zzR}aG)q3;2i1|JUUKw23!?!cn>7&-oJHQpywd(iaufdOwMyu&@>e0A4ZGjdlUiCH- zu5Z&k|KRS$=KceIoL(P?jqK%)Ve>TfsFgg5-IMs1^RL@U@!l!s zP64)C3z?S{L1-fD*#`P}kbddTFxiuBS@M&vi^2J2S01cF$M3e^@Rn+?WYVJeis52x z7e`pr0yq2wUJd^o(Cx8xR%v9fiM@{U$j6kw4B1H!0*}JhY;X^T8a%E z{;-EnL#vn4?#8gAw}bx?Pn6v&`YRirrP#YQvTimj4QnT~*V!9dOqswr?+@XHRrXu$ zpXA(p;qXz`tcPw`xYKRFODA@>#nTad#}Kz);ez#>@V)uKS9|7l(nV}^@oGQtH+$yd z0k&p1KL<|t1Q(_UDi5z3nA5WQP3*iv$ZCU?hgO}cJh-8W^@ibf9GCnx<&lK)mB((kPqLoow-Ku zY1kW-f6vFwdN+E+I`MvU03F2m95J|fD(Hr3PsZ%UkUtX!##x->8@m$eq+41LAPxgS zo(@9tpWn{Q$d!}jDz!~;H)CPSH#)w_XlEYkt~Kyg`Q#sc z94{yC!{udV??2?amY}Oq(ID4z@npeo!Rq$NYr8>>LGV}73 zH!u8f%KaFANT~;#*0LR}#Wm2dQf&3bW19RbOY6*b;-ka|un(;D>7NyE5pVF&kLMwD zEJg7T3?GwR9Go^m$AUhk4E#BxHNBp_eDp21t(oSYs| z`)iQBvwp!kiT-#y`Lam2?#st^E}drW-#jh-_S!FpcSfgYy&>K~cY?I>w$nO?h3$@if+rJl`LvgA;CW{bzak%a-ku)%h8n>Fo%1+dmu_t^+m70vek}~# zhg2Rqwg|TL=#9QwjcrAd6**JF7_Nzx4imrrOfZ6fqd-}W9on&(J0{EipSvn*IP(=< z&KzS6kp3q?S&rU^^h?qCd=Q<_2hsUR=VZ}8%|UcfCwkEv8+!Mf#w|qKQ^wBZ8sq98 zC;zv99to!A3HtUX;b*Wfmi@)aY}Tf`cR8qx5%TMuIuLWtJP(q$ z1v=2pcy!S24&LGFm_u*a5M9Aq{6Kv`dsz5T0=8RntaOAh<6}Z)O(pLtTu+Mr_rQ;t z^+L3MqiB67keDRPzA{mV=ibMhMu(S~q{G`I_#)FAepvN{kYz8R!^@zPJGX?r1Nu>a zJ$G&)gI0oLlXZBqbJm?9N^jcQExA?qbV+W-2ZkeyEVdn4qykum@W;fR_xOjy=P!I| z6x>W^x%VwPZIC@b@K&1b9-KNH*tz#dpU3y%h1VUO={05C$vV81K3P}&849j+@FK`I%~tb%k0GoS64S4 z_Vo33lhMx|&3PGF_-kD~H&r-z+Y>BI3+}tIXHtI2LVeWP1pX}K97G6STW2zC^lEj5 z@urnU@utxaTW6PWSMvz#rtw`C1%6Tal9RrTZ@=%dq2TsH>D=VE?836`g|{IKcaUb0 z4-OH^9SYvjyNdN>F>u%g98Mu?i#|qa-xf#apP$G@hZbQThMJnwvhRsBHTR+8=&vM= z_^s2P{G~M3toeyb-v01Aint4gx+E`GB5z0MEJ_Rp79B6H3v^aijni|%LSvx2!KFj6 z=Dvo!%pKh~$NEphPyC!YuQbRa*cl-wGA53`j4?R}ZU0l|tmwp>!0{Zi^FHuf>GkAR zyFSG#JzZJ1Cp$~7JOo}Fd_9l6u#ta1&O#^p%fMUt5j#UWICJ8ZyJD@UBP+CCRWie_S0 zI!-gIT$-6eR^<%I+1=0y=MKbx^h6(X=+A}IcIVI=&{1^9qwiT2Si_zbAA8ub2L4V(Kcv^a(>aQJtZmFuf(~((LraSmg zs|JodzpA_PuU1J9uKm8`wma~@wm7Z5%-vP?3DX|=8CE;GgF9CV)~WX<((4wFUe}9W zcf0uFlpl2Uptb19oqUX?@Jru%Mtyvx6`KhSb@xY#=6e1wkXa4i=kc8mKV^8w$-JlG zbyfCu(RHt$I=&5mJGox*6OJ4?%e5;ud5}q8`W}01`fp>-%TCVlz6#suowYUX(>hcZ zL(k5>%jb}*!|);B1|A=kuMBHe<1g_Ax))!dqSN^KIc7J)gPm-p!Q(rNF_Nl(Ac`L%4)Uu17x;pUO<;3E8o`5)mf@bl1D{im>> zJjI%zHWzB%FFN?OmgN;Ylx7afo(?>Y_oD<~OsdV!t*{*-(JnrM#$v8x; zMG37lZH#vxy2J(S-$Z)2Yh8wtrw9pFhvCG<0#o7f1Bwd$Kbb+F!t!L=>i zBUV3ik#mn&D`7^?*vZ->Kd2X3zpU`0L>u`wAwwJecOiLS+w|R?#qCyS8~OZk$`@+- zQeTv{YlwBcm_6VD?qpNFo1=w06X1OZ^sgGamujDujzb3r+uK*Ih33WBcN>JJ!josV zQzz%hPb_UJ>pRr;pI04iD{^qWfqmH!{IGb%eCBFLz|{@5dhZbHt_2-$^Zt$euDyfF zaA#h?YdUr-W8Y2!2x-!}F>tdOGz+ZcevP~1+is+6s#&#R>ID3if%lTi(c&Ln0 z&p*?n{I6o(CmE0G?8S*(XYQ}+-NM{IJmSv%9{QWxbX#8_ydYtDdwKF<+0mHm(gXB* z+Up%!Vr7oanD5NN9$>${^v#_Ea}KV?eroj@=1N%@I~~F-AI_UT>22;9sHRP_jzwXNDNI6)J4fKx5PDQM|t%Kj*FqUh=3kG`?9 zwY_E4cIc3NnpXnz7UI?37V1SdJJAMizs_4>qR(~N`D1CSp~vR#Jp+Rzcv%l#ejU84 zpG|qZ4GgQ#efi{}+2r?d61*6LX{Go5e)GDk@H6G$=Q@X%G4<$;96E-te%|0eLw1sAvSR-TREVm{|NL>KxAD+C`!A9}J16Z0K>yuJ4h@KJO^=|wl@H?4B; zvDSl){1sF`Jm1Af=Cp&4%<%?jh?7V7xa6&!12a8*gqL;k@vWUB%-34tmCigHfs4NV z_9Z>EO?cTu+uq~8E`yh~z|QvJr5}c-y!V?Of4vTD)^Jayc*2zU{AqR~>fV(&f!40! zuJ2Q%30-F=LeOrzDbQ3RJ&BEM$eJ#hQ{}Xpa_}ikT@%Xi^E7HlEo-fxmr>Y6J7ROr zU>df=<2EM?ktGXT?9S!XAIDJRKw#l;1ND}(KjW<-uY9t3MW1N5jr`%jZdSev_u2Ck z;BjVUw$=HKN>|npe`T|;9}Uhwt~S6s%*$6LP zyKub#Oh-IEbtP+c208dLvTQl{UI_lwWfvqi1YOv!0JhnTXKi+2VpXuMaK1-{37ji_{ER@d-z3n4wPVPpgxLUd=1!_ zTMH9Kti5fl0dK=Eju7@!@r(RlV!Xd0TxO1lPb?LmsBiL%)>yL$^XT*+Fn_KP_oKkV z<1N_>6K!6)%cQHF!#{7A7j*YEJDQ*AYiNGP;oGEROyCQw106#(dat$2q3z^1JYL5$ z%baxB_wPdwwlAN$Iy_p|>b+C5Ia`UYv(5V-=k46N=kjyzx7zQ2CejLbofJR!7O+Sm z_fFvFgir8uA@n#7KZjoD$M8WzfrW`R@ZDNVRdx;GXM$Enb1exBW7&C$#ol~-5IJe1 z;qB<>;-(cYZ`ba^HZ~_Ov4}bNCH#fk%t7hlRb~$`T-3B89he0l=)*%MLuWO4)PEbD zl1cB{Y@k01y7NRjD2J~ra_Rgg@VN(mTsR@oI#tUEd^p;~aP`-s0K({F*I(%}e)5@VAw< zQ0aWWB3@bR$r4`&pB$czcff;-!>{Sz8v{STQ3-CUenazJKJ99}yEdOTgFPPG;nThj zoE$!lw{R>KC~#yu>R6v2i6xVSpSj6OE&|82c6VnjN)$Rc=IS)fnx*+$=;4_0$<{r4 zkwfRZJUVY|qcyJ=f@2wQMtJ7u%Vaa%L%wl5D|GPE!GoDDj`h$chexA5+|P4XIMxA< zU83z(@Ef(j&EeHNSQ>b#4D;wbD&KkfpS+i1duN>$H?F_o{KemL-W(sDmDG0zy-;+T z)vvpBx}oKR*kPLZCG5eXGw2upHWlwR8q7ZN^Ep=kC3pqZF>te$(OXZ4$FoQWZ1e#G zd@C-+`V_{VZHPG^LPwNhZ@j-TaN;s!xt#Ux(oN`UNfQbeBvQy}^?`!nW8T^mq|MS{ zl(I&ldwSp!`i(PlWb>0Xyb+zp(41I5v~NXGt93TaKI8&yyYPu47`b^PR)vKJ)SZ(6B(U4OeSjxK;Fz|L)75&NR~%U-!t}*8N~ZpI}ncnkXE`j^P(8cNLcXby43V>pqB| z+@ zFM#hF)|ap3-g{|)b9~!_=-y>31AL;l>?k}#-NV$q_8zORqVo!GY(vs|KI% zuNGLhz5eT}ldUfR{2f(=>}*l6AhF6;PK+}gRVoB^;NZ^_x-rFm+20eo_N zyuivkzL;~4A<{CB`@7&<*8*eg4H`?q$M^8L_j)0|9MN4$movn8$?j_%e%6MUCAtz> z*@+@Md$H42dAL`qC!;4+B@#l2&EmMTgqAzhb{ByT%@A_lX|2gSHoPUz9heTGEQ?Gc?>(EQT zNZpLr3HhA=Jn6qpz0K6C{rU~8tp}l1iq9f#8F6Q@ulxaVhR^Q--$kcn&vpQtc%|RG zxt{em+NW^oy0vG#6P|0JYMj>>e9vQ#Gk}fv|M2$5e~!GE7#)4}WzswFgKlU~Pw+#J za&~Ch_O9*RU!b#ng4+(-o(H#huCD8V+lQ7Y{JO@^m%d29 zmi9F+Pjp=e+&;8yig4goQRRkjE`6=*UeZ59dIPuZS&N-|1vjT&;DP^nr(UIBN4<|w zui)m~-3c5NA0}PHGsHprt^m8gBfip;0e1%qkH3O$q#k>_P&hx4R1{v&U$o;A`wOTCx@- z>Uc`qUHBIuYv+Q`N@Jb~{|ByTUGVZM+~m{uH<-7Ql{8oC16DtKxqbD|tn4c%T=8aX zTUm>CX4#1?Jgl2%djboNUkPyE6LhyBs~}Mlwt?f~;Wp^oLU02b-KTxZ>U*p{qZ`(` zAit=_KbgumdY59(SvmE2d&X1w-cbCuV(yNlEnBW=zRyn_J=1)0LD;9EoIT1TJt`+$tn=96#uW5=2>O&AiAS%ijwGCQ1o*GJ zVMkZZ@*Q2XLRpE~TO0f4e6peMPnj2;JVk+djT^bE?uA=k?0V0h)A;>c{-iK^OIw%D zWwRNMEr&qSOvV(_k=*bAM|nrie>rW^w^OFFL)Uqct>g-_%y$8}+5pR|DcyB0`R zK)w?{Z2bE@gFf{&*6lUHg5jgUAdXxY!nR&IfE`S!UmJ!e_g6kn<<}i3B`?{#TIlacSiIA;x=u^O^ z1iKVqBbkUk=1th!r{A_`XKeQD4IGU86{fB-=J8}(zijd~+U%KI*4)oGY%YHRn$Thw zsgAKS;m=;$WR26%&j6E0X+s&ZRBwAxI*WMpVh)Wp?J)J<08PR6;iZ4|@_&GQin~@G z)F7nFa<1m`4EPtQm zBeE15hYwJH!KCsH?DSUq^wv4l{|MYPR?27WDGmKd1%qXQ8xD*2_KmIVfL$LPCY|!? zsbxNyI1@J2yg$dhzv!*K1)K|82u^EHM1De>-dr53pR^P9JbsTo5Asgl^YHIs8(OJ)r1$>`XTSat+UWQ-bLgRg z*#cm(;CQJ6GuM7&dGpFX!R4q26GIb4ugZY=Qu_42ZU2J4{O0|OahqqyPKJJ{PZ9Pk zG|tYq*`M&*tNn?L$1^Klx`!TcOgfgU_9yUle9SBJl*dC)*qo1i`K$d;w#-@i8jAGA;H*4{)1a9@dCfX-o}hjwgP=5yvydlNza z3m>zZUS+&@g44CxxnsDXeTc=tU~C_Pc$HbldTHbo?L8nLWO`+Li|t(*vSmc)NlCN0 z8GCWkuZ90j@ytKXUIVn_0&_;;t$gc!ko^Ykm36+2enEN={~RP;9&`yilB@N+u@tfj|qsrccy{V(~XFMy=OH_IGr)$ymzrz?DXAEkv zGhfFTtYr)u=#OmnrOz*w?FIiT2Yb~M(&L-H=&dmd$*zKNsOOQsx`nsmBIvapJ-zoI zpkF3$srPN@TFMzCm*$%^djBpudf};~qvxHPi4K%@FR}{~+q9=fU-SPkmh2}^HWfR; z*KXNVyuf{P!P|RRLBqy$^rh&I(V@@B*VYL7l$Detdmp2J*ST}!Z%A!(_MUnB?IRSv ziLsQvU1e8oGgKDOp)&5K-P&GW)1$~aToE);&LvPpAt5%!ht zTFp5}@Vkz+y4qW-YrVC4D{HmJJML@a!>rxk@N8qWcFS&It+#f|X5lq#LDUapvoLx7 zP3X^U*XWNIe$6$UKB$g-YYLeLyO7B;&BS@_&I!pZhIgreww7aKbvw3Pl385&#FO`c zi+B^Q$FXd8J(j)q!@x$g-H!w1*k?(0X~NFHFS|_MGkKG>&(J9K!++i_^nnMG#TMr~ zt6NqVeS@=T@Q#C=NhO_gcIW*4^3UR)%RFeO-#&+IQ4Ako&KXJ{BYD`Ie?#7I=Dy+$ zU#L0_FE~Ml@Z~Em=3Ln<_!@Y|5|^Jxhb()N@pFdnA93gKAoEORnn$`Eb54*vn&)|D z+$Z~O>mK7-UB7Kp>32c}tOr(TUAU>}!R24>s5uY_JpMYkw|nElTUF=&XJvt*4Yq!4bj)o+U9b#qla=$U6Kn` zMmPG(#k9%aPAlm8a@)34zA4e!lh)*`o^yT9ww2c7)55W5eq;TU+7=4t+-li#o%U_3 zWUhMsI;ASEOo}dj(G6RSqsfu?J_ng{xjAJkHyfX zICRI|4|UVJ{EUC^KWjSv;$D0<8ADDD@Q^OgA8*cWi+-$G#o9>UR8}eaN!jN|u6+6A zQQO)daqZ|>*I2i_y&k1|1sbNe9a>_elyKqPSXw%6x=yhHP_f$^! zGvS>j=!>F_wdGmG)`=R@L>h~krpVuL;MfK zrHI>nBV)~3%wha*uWMLY-as13N7NOMiBpJ{0q>b5d)#Cw>4t>hXAU-G{2YdgOOT?_D=qXCs{Xs()7N z*tlJRNf%-~hUUb-qrItW7bhLR_}9{bDWB0JnKFzX%%4Z)hM8|?C>y_U!`cJ87Tt9C zMvu<;*T;>}sfFP2gQl&1m>mXY z7~|zdpg}!enr!H|zy1ET!>>0}8tK}uRdyR?%f8}2TDHnBCjaE|+31Xq%Rl(r>F<}q z=aJVRuWvo29{REOT)0Lk@WqU|#thwWW}O{>SANYl;A3TT z{DrRnh%Q*|Gjr=(>;davI!5?GXH3leQTSB2bwk}my{__IE3GNtz-_AXOq!q529-0L z@}vjW_qEEs0lf3;mX+>zhBR>u^|VY8e#aDHm85-Yif|a(-wHeBT{K1B z!-UsP5#9!!cw~xjnAhK0m)0?j*UBmKPXzlRYCU%9Mn0}aK31Hc&Jgzs&sDOq z${)a=i2RE*i02DiSNV{*Doy^?Y5aN?(KOw&6hju&y-VGcTOG8P+xXg*AL9bSh`nH) zM{gyKeE1j|rFgHctZT7;`9d^lv6=XdX`!`wx#X8GHiHLOwcWnD?NjMJ;x7Lyn2oJj z6J0eZYn%e`Q~wKDLCh# zf4?n-e{M-$SNt*B;`ceYoBujsRErMO;J(sLlqtvW?RqG^?PSGufdq5kDQ|>!X7IB% z$T`J}_yQ~dXLoV74*7C@2YP7r?O>$~j{*5bzcCi=4TQ1ZS}F5oW{+zMeAS1_!z z@f`tt@cwHoiCx-)4sc#=5#I)WAD3;k_6CM##=p~mzP2t$KJxBKk|s~-yT*jK9?cd1-nl=W;1z)027Na3zbXB1D%U?As@L}JQZ((5e%Xux_l=>q z#qa6;$n)O4Y51lqlRvTZuj5}JUNU@$`K7$_d0AxV4G;2PU#j@P*nhs}4`a(X-xi*g zmw@*^QG-rp`JoMc4d@(3sB;Z@TRnIv?H0}the(_MkQFs;)4LwMj_fVf|Jsc%OzU%) zN5JMNw8cq_ufx2D0?DJIEA!p)K*#6kMpNyszYpE9CVwAJnKx2boU}J;-_#vT=Hg4= zLVrC7Zk?*a_KNW}ValVqYW@dbC(RMJtZU7axUX-adGizbAGeY!$MDsDTEEs!o9D-Y z$@)B}pHBYYO^3Gz`^Z7c^_S_^@7i+ko#&r#W4gEYabJzP8(DdV-f-JK^oH&9L3G01 zZ@5~wIB{=jTrZ?@bRT0i_e$uyfVJTdtob_{Ha9tTRfX796`~)i_U@F3%&AT+vge}@ zE7)1jTn(ceEM?4;R}Z?cmDTtgDnuVP_^&e`d&Ij}qK7jC7oh>A!37D0|0{DkL|yfx zA*Y-TL3|J5cSt%VKc6BxIn`L2aa5gV?EG+hzu9+A6FsHYPvNWdcgiE1?D|LWD@8cI zJXrHI-_|k5YOpt5i?7t`^jJ0fof_O1=g9of-`fYnmIHSNF`gTy z7k;staNU)#ow*S~cb2@>U5k5eWo?D7n)xC-R|Bse(uVR~`&-SEo*aw2i^t6o(`Bl{7%maLpc%3L~N*VoM`Vr1~*M+S>~`SCLr?-+3MH zS-dx3AMyr%@UcnF?7&a^2R|08n8mY;^xw8$DE!d+SjB9f1NfWyzWrk1hhwpdo9~QO z%;i0g_j{Z<__ukTg@0$yE&Ds$%E|hmm7E>3D(2j2RfMXoitxQw#dROEDrT*B?>L-{ zCtBz7reRyp*cy20{p1Y!_;tf-p>GNcE_Qj1CuiI>9tS;g;y&QTed3EB%@PzJUt@V7A2D99>wa-;Ut6d$`y}6%^CojNb{)n>7p7VZaA!kfZe4X-I zpuJAr&{I>+=n<_0A#fD`cFnFGk6Fu=_B^<9A)EWByt~5cz{{r&TYbWp+FPy8Lp)0N z6nONcgEy{i%0${Q3*VN(PVKKMt)6y#MQRPd6aM=s@CtKhi13U3mP>=|>EPeXDR+eW zFK&uQ-($_!T`x{uv)uii&9s5NCMVq`(y_M_)!Fbm&rauu-hS3yzH~;feVO!^NWYEr z;`J|k<>>yG5$fATcnLO2sxN=GTi;`phut%T{TX4k z%+Gk0+tw|FKfTe8zTu_4NS%W5D1F>bTl{^x_^8{b-Rw)4aQ~fAhkzA+B^?-;zNtNj zxcg6IBE1Rgj}xzX{-RfB+N-mOe(vTh$avWc#>QySqiZTpPYLNnFP`H5^(M+{_WD)l z_3KN7ZJ}S%UnqT*_jbmH{%LG%#>R}TIm@ZGs2y?mi}7~2XONXw`RY7gWcf@N_S(BN z?Go&te#DMGOql7bGaj@Rq0LFB@fM7?QI>zawP$0>5$wldS>S}5whaGOJx|@e z_kXkIm^wAy%c-xH`5a$@{}b=Kj&J1={H4Dz<*1EizJGicWp4ETCyb8|X3DF+q`kh_ zzPaMZ3x$vOB_CUCw?AX>q)ZcU+9TTj6yvwu*C(|}c=UerN5v0}wOw;v`|F|saqo=b>M7G=G-WKUZx>rZfAlpq~5MKTmu8guXt2Z@50y zu_x&IT-3MdFaF#o(BCaS`n%hsznYgW{dN5zP35Q44_{NS>d-Ujqs?YN)h|y>ZnyTc zH9jW4-eaIGgFN zAraR2BG!2PN){sL-GGzx0UuEl8ptEwmId8?r$6xvZ`R7%BoAE6{ zM$osO%%fRJ>yxqmMH^!M<_;0@dAkCk#v|a%KzqPR`}J(ytCiO)-R@$}j@Abk507M9 znIp`t14~vW=QGX+f(7N>Re=*KcaXdX{;529pnYN5V$Xl~X?N`9pI-Sdadx?ov#Cbr zR36D_McnVogj}zGQ@3=#7md^Xb!%0@xRO_CMO2Hg|;BUcWhid158J zfX;PvUSRR?A!wwr={0B7FJaev@zJ|jmlqG$5kDEO zg6X3^nCd=f!SopL>H?O|`ql1^gVs&a7Y5i_PfM!Ya6|t^Tla0dH44xAK+j{hLu%(yC2Q($=ur3LPm~;Zf;aq1 z@3rWj;>qWn`St4t3C}xO80$Z}IUYSZ*IKUgx3NX>XX;qje~2t`^oy~Ij&gT>RT$9xmAy?k(9J>Q!2m|3sE_YV&)~Ac03eI573Dvlz1^i0wzD$b98qJi=ge_@f`Uk_|k2`jU2 ztR1dyQ|)}y>#x4INk1{0b@GVS_ayKXe16Pb57JR^cIVv?eIACs`~n-j&rh#PBZr)= z$>%;P>6FnyhCdbFDH$eKQhn(Zde^uA>n+KB?K$Z^)H^``jE!Dc{X-ua#;&91rjI1| z1?Q#JuZ|-3+`QUynfecx#`=%s#FKyR@%Coi{WO%cc}H)IC$nf{l)K0LGIsWr%p4rrfmN@uCjl8Up#pZnPX^nu53_FbnqQP|5JpG%%1yP z8r4Vt)aHH@6@~ONh(92$gw|T;kLr$444!!N+&?xtUmVA61hvtJre>$DH3GdQsWSDI3MS~{v z560K zBc1Ps9_Mvqx2JQx3z$!8i)gI58%+Pus(m4Fa1Fi<8B6>F#}irjIjup5jXtz7#C}i7 zwD@tYE%Fmw=7sNO9l0GoYJhO|Dc;pOn0o`~ilN2t(f*En;I_`yHMDB2t8&-63-?1u zrJMUiXy2X z;;s%c(z+qN*v?H{E3fReMZc@Q<;ZXFkNS7@hX!x!S*vnqEyj*{@$h!qt}~jV$ATB@ zN&nM1Rt37H&U)79bFWucT!J2%vD^tfG%g0#{&pk7^cGP6LfZZf;O^+VSQGl`M|j@C zu|BM%5Arb)ej%P-6ATa6d24nxX+xx2P{(~})L)Hm`Qkm$P3qLU;(w0r=d85DJF9*@ z7Z`(7AoiUDj7cs0{mA_fMy1D*ERx1f*`W`fUk#-f&X~NH669qJ1fSTA*7^&J;{7lY z{Tra+CHyO$?pe}X^llsFDqKFR$Rx_`QqQxrtXr7ZEEFT zZ#wHy!Eh_^f6H4d6gThJqpym#z5VcKqMF04%=vzg=6#p& zx5&4F@VaFa`z87$KPH3F+PA&*rq3!*W$peWYrWP+)w7SVU8Ik9SnHp7)Q)bY-_O#Y z9^ysIlx7QIPe9AI5`G>Sw0QIlJk5L!p5%*!pCeqdo9*S1JTEz~kvNrMPvU>g`fP05 z)sDC6(=L1`l-vZZVa|`vv@?=pGD||qp=>)dI>(;Cw+5gQDtnN*bG|*qJ)0q?z4E)T zkoqd1pXaLLnbbXT=PuqDyjMMQHC1J2n$edkugkN#=Vr2)e+@aYipZxvc{2Lt+LQPP z-ygNH!Q2SHWxM`|b(ebTrg-M4{K~Kf+t5YsBFdze#4`aKzuUmg^htZVEp3NZ4gA-Z z)g5h>>C}Vtp~%jN-lvxEO+J@L$%5B$`9#f?KL-wKn|OoPBFO?F;@x$#<*+*@1NgR4 z8aK|>In>WtoVZNiQuo*y$;oQB&3>WMrDnz*TDDvCc8Lq8RJLHlx&nO&&u)1jhTZ8P zbp`lV9{Itz1kCjr=^>Ss%7o`zZf}$~W~_ zQ~zRMD4T&@&^GHSe6oBL84f?L@-3Q#XXy^Uw95LU_};*am3vS9NqFzT^P#;jzl5*V zIk|}tyh4QUEPOqw%{{@7r}2YDp1)t!($=!-O0J!`4BXEF_kriD_qIG|lYcGmz}_vi zTl4*CaQ!cXtmDuD+oJ`~5cbq(?Pwq2&b(OSjzRd>qYK2ZsV?!l@ap}Va|SNraTF*1 zw*S%3M2lE6Y}P&#rg2u-?g;Bmv(+yisq_o1jqUiwb9LPgo$%9L&F?<)NtTF{_A>NT z@S*+kbJF_xaoQ@{Bfl++NxPV|b^poGkpg%C zw@f$9;^Ef+!xx9Id(~&+c7F!CF~gcSl8E(Zz>y2^CGwjh_#LWr;nW2Do_^Sl)&oEJ zChGR+$6L^dRm>5sGefMGM`yXbqn}oYKN3%E!dlu~Ug4DHJmKO41#hE=(f9~o2JUHD zy`Mhz1RqSNUbc{}<_{m@Ze6u~e{h;Z`?|NXrj&Z~sVd8%9jU6CilTY=d1qdy*2TF; zZEkvKQ%yy(eQtT^_hMgl>Vod?VeJdTJE=UE=FT6M@22kuTzV%SQu{~#{=Q9r_dyeH zoCJq`guhKVe1d~tej58SaXX0{$c<+P7sMT0%fJV!Ud@}_R?d^cFRce99(~uG z*ut7{j_{5LpqcsB%8qyN&Hj|NA0F(h9q+*JZk*BC@gw&fZpRm^bpCK&#}|W5DZ6FG z=pBKkQRJghWTm#BdUVtCbKUaXA2@w*#?n5xx|Ta;d)gmJYY$9)GjgN8HO86`2her5 z-tUbsVSnL;l{~;WGG5f(nOb9Iu56keRX*p@Tx0yXd)6tp+rx{V;K#~^1GVtSe5X_E ztW2`~W937e0u{o65Oe(jDtjJMfPCp5?sD!biIv`BrFW$GhU?3KQXl zv8ElsP4*_O;A2?)wH0nG(Kogv2k-f$O$NEdbBi#use#`*#6IcCaU}HOFWp#|B%t?y8POr;f2tKh0uohN3Hd(^lw9uJC_=;d7w?l zKFu20y0};C;||(eLwnaE13eVRpXWlWX?R(6@&#bj$o=$7FOKdPyiYyt(hj$L#;b-q zPM?VN?_r)OUiSi|N%I>2hMySpXoc{wnR)QA@DTcI^dGN4gGZn#2iu_6?cQ9zhkJ>k z_oCCSH5v-TBmR=j6OHT+9+HZ!bV}C$3v)X z1GLq_74%`wf6+{rUKHKq(2JG|;+F(FLuc<#r)Jujp*8nZ3{{0H!r)6a>-`cQZ2TPi z+a1_LB{)N6>|g7NlZ+(3AQzjFL3sJdH14~do_pM^C8|@;+dqChX~N9jp zo@_whRx>>pJ0GO#i#!5bLQcJ2U9NNaYj)AA)U1-;?J-NwU{}=Q1oaOK=C4`-#oenIjW{$1@sdM1& zN01vSFGbp+f8%UTQ_A6iw07?~^0D#_++Di|zBO>0b=#ZmAM5L5zI`|MW97S-% zcy6p>5w>w_?Asetlpo5Y4R(2BJKtGF1rKI_s^Gyj{O^YMEFw*u@X^uf(du|%S=cVR zH9~)HV(e4gO&$7FK~8wOb?XQC*SY@Do0&`Tkdv<7o;EM^dj&Zm@`Y^cR`He}T{G7y zdpl{z%69UE%ibB?m6K&>W%rbX%ZBiU8KN%kQE>cQ-@CzW(;$BKlrPD9E#;PxMtvWB zeR@=Rs%cy5W-Aln?i1<8hq$9#v}ZC5|HXr$^0LpoVEE=(=8g7w>0~fxYvjvwAM9C@ zQ?B`SW*K`ce`am1R@j3%<@mzu`&ir)MYR!%}vFqT6M( zMPeDax7|28^hzvUXZ zZ?<{!rZgwHtBZLPw8!X;c$a}AGaa7()Ms5@H5KHJL+><_&3wM(I0uyv_f7%vrA_ z(?~y16f7L>#vhydG>(%Kbs+h)eKBp%1utJ_|H9BYgeM0U|HI?&+&1Kb(=NYf^vKhJ zwaOR&FF%C;0$-Ppyd$2$$RP%9~xcrRN^2 ziH`!o`=kj{@ZDX$`LMUK1F#Sqn@SIi)uuhX)uyP^_Yi$l-*0a`h3ujDByaWoxYPIS>?HkO>d}MLe|PCYJutq) zdiz6kQhr>}7?`Jp_?G7$baCM6gR8f*wiaW*t93!^tn?{?3ReFS&Y_#lz}n9s0F? zcN*6BL6G|axHI>>??PG!eFID>X6eq*+P14I2RpAb- zymC$w{=@%dM^&GAcF|Dr>qciq_yjq`zQyWnLvFa>(bAX6FTKytuDIg}-FWFMw8PL3 z^RM!|8G|}+93vfvwW1Z${peOlsu4_s}B^VsDdX zEm69TUiz8i@qWElX4hNzoBu9);(6Boj_>mSJ@~dg$qI49zN??yf7QKcc;hJi7ey_c)Wx{qNH6h-Ys(<=(B+aad!K zi|wLSv3R;wu?bq%PP-!bsy)hm18u|``BUY(`aJrHZnT3k>zS8YKRU=GI`~sytv(I% zZER!2OO;dJN#c|zk{KP#^F42DN_ji;r;Rzsqq+v*scSu+x*ncdbE?q8lL1d|>j0h( zE&)#m-oh(jy@oYQe1n07)?t0a4^O~hGiL|A@}xsdduf$k{JT>=y!%76QS-0haXY$@ zd3T@J_V?VkGp|j3#&%7%pce4)!u@H+z9-|Q`TxY#<&Nc{ys>YSUUfvcUq|O&x*20^ z|H~uT6_>Dv6Q^}6FUmP`@gq+B`y0w5(D;R{1t31&P|NrF&DIb1g8~X{xtj8mb4`EA38GLtFxw`88=yK%uEl$`4 z_;l?fXn$O`a4J(c`Sd63=xoZ?TQZ|#Gex}F+m}tzmd$olHrYLtTU+Ypm5r+D4`t<* zGBz9V!_>mqRUfoEBh&1(!u3oTw?o#6QjJ^8DaVPQXyaRey~&JD;|GTPuME5{KFYO^ zzQ7%k9l-T~`Mre4K4 zdW7tllTQC};xc1#vUhOhE5)%7=Zh=oz3j^;+spyZ{tR%hREoV7-JPC!ojpIE!76vm zF5&mQ12||8ig~?0z2R=hE@Y6s6qRqDLmpiHws{B9)j6Im zRF>emg>~=S3MZe!ZFB~LyZ-BzpcC}IjebITx=Fv~3w9LWo(nWK1{Y=1u@!sHZxGJh z9Xp@4o%V*=2epcmJ7rt$x5M|_U%cP!+Q^?H?`{7OORgxcO#V10#90^Dj!Jh1k8H5< z+Z{l5bz#V# zgawzl4{wc4mcPx@Je{M`YQ6KHT^T(xZo74=%1TGPwbzv6k5~TcN%2#)XG@#anNL3t zq7!ZN(jWBnqAG*6!_h|tfw8FvxjmC25AwXTwujj>Zs0$}eyi4W-7_w}-t>!cerXdt zk8}bmGsL>8bYbL_5`1zLBfDwr{5Ee&=YNcS+f;oBQGUpF$4v5~cpuq=i*6YCNM)J! zPoz1sxlhE^Z7EF}yd2=scLtstTHdd_;%(+h4|5CJysxLy@eel-ALUI)rJr5r`iUD| zV)gIA9;bT~c28azWqRux+e=f$7UVBg9X#NBFG5 zZ<2UiXU;IU{QHHPTkkjD=g_K&c<$PJt4uu?+UXBZ0GR9FwXH(GPk+8PgZ^Ca(hKd+ z?S?LN7f!TyQ=U+5tfGFpwbDt8?>hL36Fsy&N!mz0d;)2T$*c4C4u2VJUDX=E_ROpM zG<`Dmv1!)E3rjf*iVaE}9O=l3^*;rVuJy>+?Cyp>s7!y~{kqM`HnC&pg{V*Yc$_(C z_=}R6u8cl8Txln+_v3fYicVw$vz6fJP-zvsNpLuHOM6$e!RoBxjAN0VJ$#V%k07Hi z9o!&&%;Q>Lj>A8G@a%?i^o8a3-4H9kd3t5J?jRVj?|Y^eT?B2)(;Xh~1@eXuL+{lF z_+93PVC1*EW?veZnz^HNdRPbc3BLy!HyeMD=V|8({BaNX#?6$YaqF02t$YprWXZ&IGlGLS;xd*`0fjxFg{*=|Dmu}Z)~sSn@(pLTWNp5J8!AF z>fyCSgQ9aoi5-QprUd)jFR+*W;`~@eW9xOjjk{;{zJPt(hsbvTpNs*fDFY3FrK@>@@!) zjCIHLR!)*f`|PFI@F}g|X83#%It4!vLbg_%){Wn6r(EOEjmfn1Jg^dOsSLAD)k7nk zb9MARkG?C;&{64_-L=>*v%}~MV^Q}k(sY+^H}v1kL*?Co4!Y7^1M^J0!o|N&_GPy% z&pNvY{`H*Wm(6AmQ}AhdcL=M+_2g!AK1yY8r!SGF zm1)@|b+8s0xcuwbJv1}1-*(TkpF_tuLiraQ`){qMt_^q|<;xc4b;gIY437QRuCcmY z-aAD-3uhH1I!Fh?Ird-0jGb(nO&=rZji6DTDW@HGI(X^F7p0qOYz%%X-r%E)i>}{- zwbV!4*m(HM^y8hGn<_`+?dP{9r<>-ZA(PWixw zEW~DGH}t!RJ;KA#q6qZczn-#3iSE5{cz`up_dsh+E#}VM5Oy7rb~~;0+>bB%hgO)i z@0H7}v9h(^2H$e<3cNeO zI4QiZXU{mqp7B%ouUm_+yk7Q|YuH!b!M<`0`^xO|^=_x{pJRXc^X!3r;g4c{=&#?Y z`EqDyjXleI&vxEXY-EmM+j#IkO)`An%;pIboQJX$FOLi z9dKm%>!4F%=pf3+&ffXRUDkEOx~FS6cwMjI55yO=vbKDX{g{vP=-=l5Lw~lR?>?T- zv6j$=&KjNr_UuO4Ol+h4!=B96{krVyU0;TmmbiTD9w*G5f0v-LNoVb)%S zNzc*(-)i)w%8!1Td9c=*2Lr&^lsUMGbEuSIbRXT|zoYw@q_--u+_fXSkJ{HwpK7tw zs{d)+Iolft9`$?TW4>v$KN+#V-W95I&;F)n?kcSRsa>JGfw|*yo`2l@=dYI^j91L( ziF8vwWew6N`O=i{OqJ2%z2PbITAr)ii%h+jdz~JCC-Akxj_<`Q8hDDlGsmf=cC_Oi z!gv%`&N<|cpYhM*wzH!!HIp^`?+D{jnhK?Pmwz7p->&~3@z10GJM<4v#~F(+cI3R= zg%2HU*Q~u(7##_B!FK?c1`jr?losB3`zfn)Gw(*;lySDf-rltwI{XQ{qpPEo_)_j$ zerncTb!I*SFE4n+7)$lh;vEIIwAWi^ zm!;pa(r=f2n==a$E14a#G9hTFWa?t>l^Q)F-f9|W;qXE2=|R+1jiY#v5)W@QHrpA8 z9l$;TtX}}WF9Op)2A2N~dff6HaGYuH{V;VhZ}Vm|2mb^(zI1n0vSr4d$*1U_^d%1N z(a#3@xtTsS($~+?*U!_}FFb3ZV~LZ-+WQ#&{y*;yCTnNFYk2yTi8xn?Y(B$TM^~U@ zd=LJjn|+F-$cGW;*>ZRg8(LC=ZbAJCah|DqmbF~AZVMNS|M}CLHR!wAJRM$yc85Nb z9ksfVrTJDKJ%1g5f36C44)EwdNWb(>H*yE|gO6g1SU8NVwccNslb8B_@@bt(b8R;x z*x#l$S<%a0S?D5Ir(Ky&WsUrkF;^3Ucy9UUJ2Q;@69f<&`rV6ls`y3{$91O zHG!un3Ay7jaea4vrjG^}oX}ZD@wdpzz4iFBItuN^CigoL^mZEO2r{Y7*%7tL)6cKy z_=HQ};v0`m9dKLcgHGfz!jYVi_F_m80xt?op{-c;PLh{_C26CL&5D`n%n0* z+%orgxj3_ExDK2Ofwx28G79_7A;#q7Z0_FUT#xomT8MvVbA38N+umS*0sEg!&FWZx z4SmqM=lsX@Uz8Jq-`M=?(dACR2X;C0L~|##6xg)SMW^hJz3^9a=9I$Fw=r)XnC8tZ zwd=~mnmdaed{#b{H;=j`1DJiza>iBRU&Z!4g)i6$|9`@_nH!4pm$e(ZH*zy}$;<4_ z`IWA{^$2yddPbJUGB>EcDsZyW#b4F83j5kEvcvb}kjtNa)Y*fH!y`HQ zC{Oz!2tU%~*rlZfY`ekoFdKuf|cVkWAA58Cz z*yuNV;}xl3xMCETUjXK#zvNgoMZw(RTF$gp!)JHgXYG3s{<;BtPu^$kuc@;-^M3iIlNvX8ie&eZ@v{YQ zw?C9_X8d2Nv`+j1a7yFPeP2F$+|gZMg?9W(cjahJj}_y?KKMX-4Sth{+O74=unF#A zpS%zmwwm>M=!xrZ6%W_LIfDjtF6bTRRl}QLkG=2whG|KiRp0WkY~Ng-T=K{j$@%Pe z9rEyR-xDj7yW1ah>NwUWo7o4`VRY*S*zI7E=4tNYP2VxC|3YqM=G=nH%*e7k`-eyqiO1RNpP!B#iud)j&+qH5 z3Y;)wqO&>&!1Flv-nv)g{DwP|p904fA9*(Y_W38K;L=X=H_cJ?-|1RBj-XUJ%Hrt*5D1dPZoAWAC86Az;RxYiD=Ezw1By4P-PseEiI^ zyOQ7kb<@c(G(3v$?FKu%V^%{+d6@H;AHrvL7`TY0g*lI{d|7|?`^ntaqCU;V{m(z? zz*~FvMu(|1tnbbmei8U+e^6n{GvLuK_0{AR+$QH2Ju`4UzvRwjX!_#Bf=;WmKUe@P zA4tomS@=n8ik8Hp_?bH%#=cT*Otu%Kx6P;?jz59jN^oI%ckm(3py}-0#P)^YU3xfo zF8-vX5qSj~CH$-af7cI>?w35}-f80EQV(n9+wJ-3^wK!gPkG_3gr}<9JpMgE`!?v{7_A!D-;`|fhcB40 zXDNC&Nc<&}Z(Xe4)VT;<^v%s-K+i=tWK!*p40*+t7pYXkq_=+Gl4eX1=N|9IF=o|FpAoExC)jnjcs7DUbox0nx z3E#|}=(?M#*e?3fM$RZJ&5$?Gi`QE#)>sRMv2k2KD4Sf$uP3g7bRqHRH)TbYUXSqQ zABo$@zTL(-*1iqUr#kL^S6r%UdU_PQ=I51nPb@n0dRDZavN%`k)TcCt<{b6PD9v%p z;NJW78$y(YFQ8iVDRJ_Z@|g6>n}^M5?TmOb0B-ri(cAW)r>>rB)U}to>MLVu(>|5u zZ_Brc*MG~s)`}>1Tn4cDUV~4@?Z_2F9z2$L?X8^Ww)Y_OUhQq2H{RaK?K171+>hVZ z-d5_mG6l?<2@lc7LD?!3FWT(qqt8E_9Ua(Y^{4M2A1?!^&v|)={sVcnzNtO)c-JvD zW=%*fMHX1b8pZzgG3hik$2{1^tH34VWE-7&etJ?kH5DG*O_>^R|9I#-z?kYi)p+~U zF7eu?Fn{<*2-m;AP5M9ofHGYy2{cRcmE*;l^i_(#} z{~R>tJiN&aXp?9vXYcTF=hD}6tda7Mw-@^6&|Bm?g(W>3SkW09TKz2NQ^emmv<@C8 z_2cW@vn0^u)EfSw$=@W8vwlE>gs-YUMcqT>8-mVizq@!jYtOQHW{5Q>dsa9>KVNzx zfb6u0G&ec2vO}{LdbH^bbZr>kQG36|*vseHv3{L%mXFOL*2n8;TmJM|e+t?gZg{dh zg|0XG>zONmvBb(e@{jmz@%TdV0{-(T@I;T-fp2MOoAwja!Gf}LtQ}W4kE?c1<{cJz zxFo%SnGZ^bP~AU3-Gj7ga-8rLI9Isk$tRV2Mppl-e=uOJm)_(G^ugZ4$1KsB|LavFzMgC;!p3wY;yX4CjCZl4Kj5Wn>z7% z@bV>p8Lmy2Q^xbui4P6cd3=g8Oxx=5qq~v)X#Jb=$Kuep%YX9Z`p4qQE1$@xmR0uq z^P2b+vf8PY*N8)gJI7hd6lW)*+qT>lREj_k(qvuG*o8Y1iueSopP zMB8oVzV5uzcitblXHi72&7RsIG|Z(^qmP9bKVgXG@;3d|F?Sr(S|D>fC+AKA}A_m8mE0l`DTA;-OXk z&dVNu4d2bW@3egc*&wqiJF2>sMteWxpHheEl|3O&^4#R~yT|vFowQy)$e?>xVJ>+F zS&IZK#hGxE?f|mpSigdS6Y{t94(;-%D@Ols{vDe*)&}LDtY=l&XmGisXFYW?=%l$c zGuHV?`=ZV??}GO0I`R94zx7zf={JL!X7*Nlg4W7Zo838dDqf-dbwO|_r?Mgyux>k_ zRq2FnsG5Z?l=;1EMkcj#20GkDy(1^9&>_vp$nNm)b1~TpJ7Zzq`=N=lJJk93f%aQE zVeD^H+(&2PBgtLI^2%(tAH%m_dVA@&V#zaere%h6r?I|I%cPDJJ9USMyKcVPo|$u}GoPyMNcw2`rMDG6lzS(%?#|4azX@i}6j4@?X9?xawZ8wrAOE&D#+i}l`5-r z_HWMPGtcz%!tq-w)SsaxAMT9&+3c-pU~~x>o&WJI70z5ga!W<#Z*Fn=G6)<@KD~#I z+>@!#u{x#Oz4%^`Ijr??QE%#R?#ZOy2m%AQZCA3VWz_##PY$lX<e$A6o}nhz|`@t=KXrk?cb)03nhdZUW7ijj2aLzmtjIx-Vmlz4x*_PGZd ztnM%7+2PG+fOiXf)C0ggPEJ%dG*S%2jW|0J8&!~ z?$G;V4^(;oRo?$y-v3?R|2@wCr6b!aj^*6b7imRK{y{L48NJ6DQ&YZRTI$uY8yIT5 zQkR1n^+9%-&RFo>b0cu2pNcygh-K%S)|)@h z`ku4T{{7>5p8f1+?=Ai|cv|`n6ZR-itp_y#ZZkYBa%X}``*%tIeVewSKb!UBtC44? zJN_*Gy3YpVy~v|yZ)2`1^TUJUZ*F`Iw#_E(SH_x-)qblre>4`1uX$BJlzZdb?PcH5 z{JA$m?PVY68>4-M>E+)Pmtl4X<7F9yIXka~JBR(z%M!+Ihxtr}ac_)XAk29QGr}-W z5Qg=Z7gp>3=o#^!1Zz9v_xx(R9{=@LJ$|8DkAL>E9*^zS z;~&-P@sBs_@gDY%sk=y{GpVcT!MHCg#V|9;Q;7OqF|Wm&<@QHY_}5p=ztM*DBh$_Q zZ}Wcx{~O$XX*+KN?clVLFN<^fX(Mlz-A3Ll>hgSX+&m+3j4@QZ__C6$c42>d{0`Q* z%!|cwZM%=fG`(#7r_|}-M$8D#?^93VX8z2sO zztf0T<6a@}nTENZI5a(OZU;wzTR|`QGB^s{4Bie_f@$Cea3Z)CyaOx;v%pgDi{J_{ z7hDd030w+(1zZH)2QCC>fkChUECd7KY;Z1^50-#4!H2;a;Mc(E;4*M3_!yW2egn(| zL*Qian_xOv2Bw1F0>^;g22;SNK@YeQbb~K|eMPi6*b9CaL=N=UfXL$B?}NyM-d8|m zcJDS2`P};kh-~ToA$S&S0MCGb1)c_*z;^I0@Fe&*;0bU)cnmxQ9tD4_$J1MRUrvAe zU*J;kIJgM>2XG|;H_;=RX`=-)y5dJ<>qf7vfG-veXyL&qtPS@~uEamtgs zSl`H;mhpk#Uhp*74W6-OIpNisv%Z~sK7KHo;>cQKKzOy8s${LvRvxWhL(P--_`LySn+>B{#NTl8rns|SXvv&MUV}f1tht`Ca@NkDNm?;vhm!xU z-S?3*hduHW{FTn|Uqy~QwP{q{AHkayUll$(9B)-T*@t}fZ~4tdwlb0Jb8mdD-CUu^ zy~5j(ZSrqC)-EzyH}X#IGZ`nH@2Cw*Pk zp``DdtaXbH%bX3;N6dD&jJX!G)YBq;+I-v9B7NN43)1K1>^d0(<|2?WVJ-ye*CuP{ zR{OG!ZnZCK>Q?(s2a%V|MTDo{o5+FY1rRw=WF(O(MMe^t@;Wl1$(S&a6MHYh=(cdg5kG0bZ4WxgxG&ER^l65I}M0Jnl`!I!~ua5Gp6R)Q6v%#rgK9~c}1T(=I;AC(* zm<~<_Q^6c?444U~fRjNFm=3zZRIslIKVUDI0(OHQ@G|HIFM@qKeFE$Skul6}5E;X~ z44wrqf@i=OcpAI_wu9%vli*qK1b7BS#xPHV$QWijb}T1(UrrmG0GEQtz(wFua3Qz> zoChv>@CI* z*bSzFPk>{Fw5P{7bffxdEy%LhThsBbBx>e zbiW*opRZ-Ui9Rmwz8xEcJ1xE3XV?*c`UG>Fd9HXzMKB&4^NJd9ygbi% znz>;y&$+Gc_(RNbeoq&nAHS!Izo(18r;GpT=wip`(8U{_6WAG&>eq8E@G))&S5HYc_8z03Prcl`W%^syVDqZR0fD&6r*)$aJGo86X< zM|3@+^AX+8#h2ajPj;g3sYmbAsK+}i;WfMUcs;tfB02k3)>P0PS#mtGo2Bm&xeb|3 z^gWg?=-V3nTy!IDdtQR9C;FiQz0eq=Uk5a^2>yfq3LTIYC-R)=bOv-o*oz|LTe_nx zbTsGTJ7+`}GB!akUp2*^w(tiYv)16 z0Q1b`EZx#kdvB+&F)qAiAY;S(7Gp#7pIIaPs_%C?eLvah`<+hTPNr{n_7Pt%aijCJ z%I@^v&I`Do7k9hQcS@gk`n2@@WT)?UmfC$k8U1Xh)7O(luepM}FcxLrC1Y3O?sWQo zveWlFoxY#!^!-k!??pS15=dLXB--D(VM5xq}=%fH3a`*=5|z2ZI8`Tyd0u=)jb-Wzf=pP*g83GS6X zhtB73(D{^2_G{tEbsdZa83W?~$B&PQH=LVN*Fm4R!lz*K>q?3ro|5ZVV=Bs;`2D*E z#uYaA@kpt?&eO-3VokPxJzLg$Bp$WC)3;uSc9D-po}KRaqx^R{dthYU)JhXQlUDVQ z1zIpXr+fB8@$SjV%qlyJDUyARj0_CX!W zx`?ci$XZA@HWb&GtH?TutdXRlr;&V%e#*isZSeXrG)mTviq_Ii!R=2hbCWLBlbj*s`H8%wYWlk-%lU*oITuCrD>ZBiiq(*@Y*ZiP1vk!@zBK)w+8u9U$MVQ?2Ci1fjJ(g&;b!p4lKevz~V5sFlH%9&~0s6(BmZ zo(&*6vz~)R@t&o6yk{S{2z(n{2*L+@@z+Okn%&b2o&dXTommg%?78gd%+CK_U-o-_S@G}nWijZ*X=IlRLN~zk;7RZ-`2RzF z*>H2h;dEvd&RMQ%P2>0k)?&^l#bXze(9^LF6HAKMOky1ZS{`NXql|N<^wIG(yss&}&A%WJUef8l|GBc-+x+HH&%K;$R_Dj2 zCwHdjP~KU4@2Of>D!ZMsh^-d#wb*M}<$>P{U+Ot;+ajHFWDDV=0ru9%;DMp4?-i`7 zda)qD9{W($=7PZYikm}KFBMqpOeYKd-PJSdR#nv&L@zIDi7p-0678$>M=S5~&tEsM zXU(NiJyB$;yu0l3WMZ$>$(aOQDcC}d!DcKKOdlDKE@ho+`91#56?Q(Pj>JZ&gSb_F zbvQOdO8zmqJL*SXdp-&pZFWsDM^Dev5^ktJs{BSV=dJm`mQ zJE0hJxR2_C@sD?+b44Bt!Sl@%^H^)v4m4pqqSm--upLQTm15~%qs*Bu?uLIKD>7uQ z>k~@`O5Y=PD4#M1jW8cQzq2U*;o2hf1V!izim(wWLY^u@t}24hlO}VxE9FJVT}8-W zMe(i;Me%cE0xbo|A9kJGQ|J1oEkmiYM`(8~d|Q8gEu(*!rMK6m-6)iO`}`Ya&&}{7 zVUFLssOR{-o*r||0_cK|dCYBfnfNs?+?Egq`(DCk6ZRZf?1VK}jD(bjQqUxwHK z`H-dZkfmNicAEZN*+z9Ah05EJtL(MQf5?)nm0P-3i%$q4zdCEdUqx2RUF)m6LVt>) zSAYHP5p~g&N8(Xrz33QlId);G;8HLhTm()A7lN7KJTM0gf>S}(7^2g`+29N?ADju! z0Q14A;A}7lECeTmK`&;u?7(Wgb1gRC<|SAeWFL|1~WH~7W|{Kz!t%Y#`DXvH zZ*0)-JrZc~5|`P_e*e-((5>*4GruVZQ<+Pz1$R?l>%k4=snKhg74i?BRSAv(tHE?| zGgwR5T2ORrFM~ni*b1V1Gq;1xMa-Qb^AWQiWKLo>g6Qqc-C#Ai7es$&z71{w_kpG0 zL2y0zF8Bm^7_6WUkAla@Th2%$dV=?p^6oLB?Yy6sJl|nN&+vX$-oId&=XuW|Ul%~+ zTr&nD=b9Hm+yS@ zfAjQ~+za4BFa|EtTcQj3zX-oM*ljK4eV@d;z;CX_&lBK!upHcg-xd5{De+>*Rm%G@ ziI;!dC0=l+#0%Erx19fLCEg5dvUoou@h-7RJ<|JTxXFN5fN&8;9h-Q3cL$!`+zgB!qd5FM`?+vZH+1I#TN z*O8BP{!Vz{{Ka2&=8j*r=ZR;CSNO#fKxWe^> zd&mj*kR5J2;mYxsg1@z3A9b)Ebn|^!{FgZXOKksJr7Tb5zQA!`aL6yVvxmj)VaM%Z z+waTb_Zi&ndfD=-Q!jh<`00`!2Dpc||P`{;|C!CtTy z>;_*3FN0gbi{N%J2JQr9PE-%doTw2z3+@KbfP2By;M-t3xDPxD9t2N-?}Ep`!{AZ9 zUnYn+=R|#ktlQ1rz=+$HTSXSUguUP=m7gR3i7q`+{zHbeEtMV5|T=xAiCFW#}; z7w_BYi}%Z)*fGezD?8`M-{H(zbNl?boR9Iw6yMIDxzcJA_amr1Lt*aT(%j)WVGqa| z=wZ(3)>6WACLY!54!oz;of^r$X3pLfof&)6>%3K?EP1|*_XEg^4V-y*1=~3_XHYa= z%?-?yN8)ncsAZRitk}C=k5@5&FvmQ?InJ$f0`G^}VyJBsUD~bMQgm=b<$00ir46P1 zM0OW_UKa5N-fx`~C2x6Elk2joxSMT#O1!6HA^m${eEbou?mlEwsjmrc_MPT4j|t?m zXUje(Lh_O8oa-iYx@X-ePP#Z5Pe}+yF1>6zOV~@VHf(s zuD4z2nnCo1T?dQeT}$uHnw(RXD52Y81y~S)^4aRN%uU?I>CnZ zTiy1ZPC}=%pW)1<1f9VI^aV;+5OnlV;;)0VgicLKpEjI+VPe^Ueqq8_wC6aq&C*|4 z@jrFz_@^iM>-aWj4#g!Gd`9tI zOP}_6a#Z#3IyB);iU%*}>;pS=5X8qr4A@dlov@ez_%Sgyq-8nb7X4 zBL!1N+hMb+HWg%7RaFU_2_X@wU*iI2)dNY2B(MO=rcX_qdu zUY%IqB2%e47vBEw(O*j4C(1zD;l5>}ca?IhJeuwE;#pPiQO2VMA5)fQWViva_c0kAD$!6IfU*1KXaj#uRQil$lX?} zIAg=iM~+KjuC^3?D*Gj5ZNQv{UBDk``=ehTvNnLdfLa?czU1sZb!+kS*yD=)r-kiw z?RQ&e+n+Wv*0B2+b_b0pGS>f>dl<0WZ?Wbc$XK$E!9@PG<{9(@nP-^gd=HVgOy)k8 z9%UtdM31rpETU|m;9>A2=~VmGMHwDOdK~2J^vma0ZwPP6fw+IiLre4EECR z(!p*p6?_651Fi%;;1D@X_EVZqxX{7SzgH&gdr0LQ9%RX5@Sm&jev!wb$YY(Xp>@`} zH=K>H@W7E>*vi~3 z>#{|x%f2*dT~@8fiapj<)?%-+7F)(UXCT!rD9WuX*`@pE2jDTR$*z2#{nxC?&cDZV zsO10X{;NaQSo@B`o8T*&th2Ii6cSlM)>wV$9Au64d#+~hrH2lcT^f1F?3)*l-fgd; zb}eMhbP;Q(OTpzMSyP_rk1n0*&m$je7JD{cT{+Wlt{utQ0`?gTYRypiN8%cq$Zqz! zp1ppj{F|2_Vg7)v8fB8T>?5+CiXKA3&qm%5yP>XQ^WrU^1dOH$oY#X6NYXaZSBXv2 zOCz)gqO{dv?kI1atS$TT2La>2ChjM6drx$r>pF+O#Pf>0tlRmxui_=nWUc3X!dB#` zLhc;Q0vB@D)|b|-npLTfD(_(ZHIMUr7VvnJuzfDZ#@9FvR zt~2wgk1>{h#cF5dllg7)Eq(a>y7{(F4c!Df(-zb1ofc&cbtbx)D0a=!99iQD#JN9t zkF}>vY&s`nD_6@@($@6C;ZL#M+;@`x{0S-HEj~F@>?v z&e%Ct)MD*TJPM*WF%N_2P0Zbo8&UKo*1p7c(pbp5hcGE%J${bq=)A$B;CApZIQ22? zPFZ(3jQ@6xGUDHZ{|)@F=l^os9F{Up1mHYw_6bM~vw7+l|iM4;#@LV~p7Dg?!(}_X560^F5#MQHJdMG-t4O zHl1{4@JvlMto@#g$jd?gp+mClAkZUOb`aA+>>#Xtn!V(O^NHpBH;c!Lo?dvX=;xmbukUJgNO>ar9#25kCm6Vc)g27Ra7!SqBul@*y#7W+}X>YoY%nzf;(4K!n+4;w|sZTZJ9yqc${ z)XJIUl9z~Ev*?Pt15o@A^;?8rId3~l%RDvoehlj#p0ItEqtKD3Pt7;vjMG-~HUSzD ze!k2)gUCepe2p<5S|DYx=|hO~LnIHCBelO3|MD(n5>)pNDa^Icw?r-$S zd1P|FxvGzb)por!pvRT`DEH7vYmS}PQ2omSxrex^`cHb~9%A)h?gn_8xwN|1WN4ce zQ9ijlf;iLqj*g%#w^Np}lw}NRYgHYGE! zLH8aY&)#U@)h*<6T2gV(N-a579DZpB^!ZX%pM57DHq9SM8SHvpBK43q+L>h3NnD|(f*NRC}kWiC16Gc9KMaoiH`Ym+$abmo#y z(BPbNso$IKU6FbdzhTmn`z#ANKXo~xDs7u%raN3Ak`Zu?YA`Q`o$`>q6uvqbt7{i|kFc*%ThTFj}s zA@@tFG)>NYllN@tOO1A&h?~?&6>h2>M^WZzPSEg1E8359Zermo&5s>8>nEI>M}9An z-;R_Z=WnN4yi~eXUdLk|R^=QUa6f_Eu;1q+nlDj%`kCwie%u?f19nhab%tX()Hf@yhr4|Iv&j z;{^XkQ9nsxt!^~#%@S_<2m@V|Wh>3uV6XfWZk_q=em5PrY|f60O?4TH_Hp*pD?h=l zbGB}9Z~QA4c>l<4+wp&wG^C6-DoU(+NThY*uHsYl)AnnZUE10grQaY^6;UVr8$>I` z?{MLMn=}&BQS>;`zESm|zN6kY@hgwYtF-YZ>Mi0bJk`owFb`112y_I${reM|I1A3; zuJ-BU1FuThpNc_IXN0lme?DaNl)CCVX^$8(WVCXm@i_6l zQ|f9n?hLd{qCVv;=sj}g^4_F8Gm|qegZ$f5loy?>wKV;8G43Psx>De|Ih;Lulrt7{ zZ2I0in{yr0xFfSR&~m@%R%XgQK;z4^IgeS&pvohAn|(qP65J%ufjH+kIsJKxl#%i_ z^my{+{0HOi<2%sV*F|%D#(460z=eFd6nzY3k+ABVJ$cu<3A1~i@nnj(w(p{kJx0hD zE3xBuyZyP;Pjoi-%2F?rsS_>79)l7tB03^>(2q=Q(bULM$`>5fW7+1P2(+|vcZctK zsNK>h(LW-`w3bg9hn=MX?qRU~*4*gZzmRjsqUfh9iKhYCT*?~7&otak;*or;pbpw&o0nmN#E5 zc|Hm)L$6`EVTYL~Zsz9tj6(VY`)*n!jyGSO|NQ&-t3lVQ`o?n-mlKY5cl?z+@57(+ z^KJZ;a7L*5{ubZreNDpqpC!DP@-F$6v7_oS@+zbNPSJN+iywHAIV=78 z4*J;-84HK#{}XsWMW4GyUsq@1Hc*cpPXBAFUVcdKh>Fmb#@lQ2-U>c8tMhUo{)n_E zalYkFpY;*_xcshv*b$qm#edG(-wS;|-|?g|e&;l|b^!a~`#2YQ-7dAU|QsUMSinDj5uzZC6KsdH~rVts{v$+*Ig_P))-CL=dYBwac8^+(i27j>iREQ0>N z(yhg0O`ZEuEuJT7F>jp~r5?O@y}zTWI^B}}u3=lJ#_=`mD6IDRg(qL`9Dx4BTU{er z$FTF-i!3*RbZ1@pPWxlnD3nz^d&pdJLSor$XWZ?Ce%&j z4B5o~ob_}1#M&U|MQ7}hGRb+b$sKQ1GuTa&~?Vg`SJF7p(_7b?VkJ=$~D}- zzz25yc~_zDCR`r8&fI--99o-)BYp?&){?fCduOWcv$$WOek__N_wFXjUd++!lD*Jw z__E@uQkN<8m)LYyKTlQs^Vi(f(#d#GX(|5NIaTZDs}f!wC8NP3{VMNMo-6B7@A%<7 zdE`<0@DXTZ7I%iZM-RFq40(3o4t4K{z<^AIjAW-#EO-;oRrwo^_gXxAd|(!PzSb2n zc82oe;lg}g8j_FI&e^bP&ZGGC;5!oSyUXQ{8EKnysakv~_gSgD${F70;MpPCF2Fs| zm&af?S4?}ui`zFXGrY9P_=mkaCB4h1UB&yFcy0T$ zMg6>4^}pW6Vxy8fOj6h^o=6Be`NWz2YR73g<5L4cSLx}``p)@%bk1N z&rtq;iv4ab*IJP4rZrV(^jzaSd&$q0#*s$P1$*DEy05z7y61s>;mMpWrS3kzytc@A z_8so}V4kssJV;oLeTpm&e(=oS1>%Y}?4vB#$d{5W&brcL8vN=YXG z%Z*9KHS!_v=bSUmwd0 zD(ld4(nglwJ^vFq7=6j!9KQiCv*@rL&Sk}czTK)T&MY2OPt;{vf8F-ir9Q}y#3Q;2 z;YU)3iMkxo3E2EL{6P!n>Hi_J?X;}c58fdz#d9TmA$J&N$yw0w%e;AkLvj}@GSPir zmtx+IiFmmDdm)T&3R~INJFkg4$QLp&%-yB zJu%D_Xs6s~KeUha_36fS=*)8BxB|`OuxINogI=MbGxdJ@BV$X-CeJQ-m3QUDaTE2- zd!u6l2D~v%&OpyaZj(I^J>>U1w8fi=oQ=#L;Y{`@^CmjbehDxCB<}&}jJNXkrM^P% z(oDDZly~fw3`NVX=Oj^|_SjFPPcpaZZq)o&D&0m;P-_Y2*!fDigLwivfn+&nf-@&% z9+3^b6u&97qkOj_SDDj&d6oLK@+!(uhEBh*sHD7svzvR%lZ>n7Bm2`7`k6zyM!n!& zI-317hh@z`!u&<3-Meel9&a{}p0Y=DN2C9~tbHYSw|;r-UuKMc;r69t3Mh}JJ@xk3 zmoxq={+sb1a%uVh#67xa^)c4GLv-q1ee@nFugFWj8)fa@IfT>m%6IklS@}`rSM}b? z9Oi%F_bt+{CG8kt-{)J&VpC{CRkxvwefMwWp9(AWy@7Ax{a&3tD|+kW-m$HZD|$8M z>jQF0F7Jd(yGd3GAu9z2`oRhMq0&_(%1WIxZ!IG!IZEjuB!Ax|--7+}(ia29G+&W1 zAKhvmx>d#>)3m|*HA_bt%CP#RDt~B`{T(WHaFdbc9QYY!I6eauXDG@Fmkjul~#1G*HGhH$(~Yo!b84Dd)&=q z*X06++ixcq+Wr&tInNdUhv;*ZY?vt1O46aJpA8VPrpr_4vITr?j-JN49R;r<0XbnqS{4` zCDqUF%GT-U zpSzehsy=gbo6h~MX>dPntaihHMzhZ7w&hgSC`zh3tiyy#1pw7Ngg^*W{d zkG`uJGsfz5U&+?%?zx9MW{#lee^)oARdEi^{R4N@#WuT)k2brFk2jAnE^_zTr_8a2 zt~p$K+haubd5z9@*}M66@(|vWa?^N`dRtAseV6A&9{Ije@d)cT?mCgbrESq~Tv|0m z&*06n>HKhQCVfQO?dozD>q-M_Wiqc!``N%8@c?&4r!wB;4zvUGr`MU^Nc!>|V72n{Zjv!NLYsU@-0zO;*Dpo( zdN@zW%UZwB`1IXmimw!?e$(Gk$_k^OXhiE(}H zVuLl&fwuS^*J=7`iqM7Mksc|!pz3p2-Pi9(You=oZ4}I=yn^x!r5!`Zsv4vC-FB|O zpV~5y9fwWNb1A3Kr!C$?+@hDut>V6OvvD^KSumhR(*;+F6FE`@u%)8Q}H@?Jq?QYIBVhJx5?$Leg970p>tU}^G)2st2O_P zilD*!?^N$XCnWp;tsAhZ5O>vPzY9%}aOxSK6<(4^55!&eiyauLwcSJys)tWo(e}jt z@}}L-{>^+37golkdi{;;nPyP>$Be6W^ zJ||DZg-uM4cj<#^*Vq0%V*z`Z3dTeA0NwSC+p%N~_aaFcIU^>ks%A-l@^$T5{8 z^-CX4tw+Vcy@0pd^+LHNzWz2$d{_1#eVzbwG)K-KhA$+B(O45w-(g#Jvf>V-V-`?okQQzl(rAk<-Rueo=D0_LwK3QTjS(W^d|J5G;xdYuF{Ok`YO7WKJ0(o z!b7>c=NxWc+VC=ZWzoA-Vw3o$=&#bzL$b!#w@JI?MR(nOZ_SR#bg>Px?~PP(3eIrS znh8q$;x>)<4*X}q+vGcZo4uc-&y^a}oI8d=tA2aYC0v`qxdv|SfsLOPwM)3%wA9*+ z@e@xpoFCA^N<1y?8x3*mV0}ow6Q6pI_P4azvh>@u{gvq9&T$8F;(xhcRKDZbgr9dB|DVQ;=&mlDr2>EmnV-xmB_!|pC0nsW%-8I_L0zZ$pVS~hk?@-5}erESM2 zrE<=oZPRsya?3q=&s?i)m-`ZXsOw77o}2pEwGg^(6_23Ug9*+jOc95?vON?`=l@~AGG*@q?z~(XA33& z6&?I_{}>r5eIhOK`$mPW3q8MGGrFO7U5ptCdzCTsFVykb7qv@Vuoe%ZS3Et+?vLl_ zLu$QK^p7epQitdk%VnKQxq02%0-3AqNZq*uUX!NWuQ}nG7~_!?88>!+4UN$5JM5Ye zJ9@hv#}6iqudR1aioKaYUnCBxNAVYO+^_QeLad@)#b0L6dA4z1>w)WI0`Yg5^Cart z#ov_`4;m5AL&mR=FXX$M_52SRzlZwzwjXiguO20L?~dOyi8Z5M%J5UZVa z?kx#*s>-;9ev_O~r(fh-{@w4mMcA*^Fj8yIbKF(=JBVw;1iiLU(=Hu%Wt{ki+nOt) zo4+G=jy~>3j~?$;|KTX(=)I7dvIrn9HK%2oB& zfeFdA>#>to{sgn#hu;!>96Rj{*0s$|@M7Xc(0QPevOan5Ydd23^%);Id`sLKT=TDW z(8i)qCu~|4cBc}DlB?u>IC)Xr-Hgj;uLs+A-8rH5_`hy!Pai+wgt%X!eMLU2!d<>u zuiGwq|5eWSM|@j4PyWe&Sw9t&=d4RB-!-H!J~M9HjtG53$!R5;J64S!eUxV8rMV@I zv>O$NS#z-a*{$-c!3&gasY*}KhppZ;=JVTK$+hV1cWgsWRR0slpSUsp*7b~geaESB zH9MNdZQmj7bAbG9<6DIhd>=PKm1j+}Y&VC|v5c_vh2mGqH8;<_ZFxcBka_5><_E*c znteybMqngzjjbcL=HR=SgEQy;(kgonuJpVgO~+0pM{D~_WZVAvAaedi9UGRJ%(G{^ zjkoxx^a{$4=ogfXrsT#?&@&7z5Aj<%1}W<|`{n0{tbX^~%#kHrqD=hy>H%5pCYkti zWUB+8ywE?_{yB8xb!dUaeV|xt6Z_oPhRnBR?&m|-GXHnc>kO0r&^dq8$nmw~*~hBN zWaZ^OCok^}pO-$j*f%F3uhOO!9_DU#yGs5qvyR5vmcK7m-`KTC^Vi&M>la>Q{f+%= z%*S0u7xpwNy)@bu!@0U=gm#zO>B=2Tp511* zn0E}@4}XjL_?>hh)uK~zQxAjfZzX>?m3Jir^M2E~ zy_H{Ud>$RJa}j_4H~jubh zG~Tzni)V`dpLBv#F0OYXkA2dAOfEyhi$x?v?d7|5yLKl*@Ewq~uW-eJ)?Qw6&bE zDRuE4<(72c5ZR4=2W8j#4lKvN=(<&!RZe?qA8KpEoAl=Jgzy|Gf6Y&^Aw#x~Y+#H! z^L?4$L^fb^O@8k1YPGYydhG_}b#uZUCtSYv9bR|ZiIwajr0mOTa4$-~qgLksdHRGC zQRMac>62@t@U!`DZ|$rqSKT$2_e2eKH-4R~E(7^EpFSdWA~q!jVOQPk9|l?)o^rLh zQth@9UD?4;3iBpbySPW))plT$i#oky&*ShgX$z?fK~roy^og-B<=4qq#IZjWJwm2F zAtvn~=c>(M4D3UNO|9cDs<-^5)*CzwKeh`;x6*Rj2c(oXUpL1UScDebhwAKa)o z(j>G_xr1ryUHl}ztNe-kh=ejo`BXge&+84e)M(sMnWQcDdbJjbKOtE9E}kvW&CI84?;%2vDc!pu8EFS?o~eCW>b9QZ-n!DM^pr`$3Qv)|1>h?}vsIr@^snZj9gg1+b*g#gOgZUijvWcI zP!n}Cl&^$|SIRkDd?D;G`@?@Xz&`rWN=G{^=cp(@YaE@VTC1sdX~sK$su`k}!|vEfbLJl=^u7jN zBxA2l-lNduys_Te+@yfPIT?nO>7^&j`pcyDx=G&Tk^X=G#6a97_$52fyOIO!Gu5bf zdmPC8=51)K>|Z#3U2Ohs_Yh^2@KP2|s>t^hqTKORR60LnlX`lBm zv0tdX+Wv=^y)3!w!TKF0eNE&pp-~b}=vxRmSKdRbb@Y@8`}2^M)f%4sSLH&+uw+(| zSEY~MYTOq&X$Xz?j-60Dez9hyqsI2F!uiH(mX5?bR<}_3zm@JK|FM8^+?9SJ?Z(`8 z$!8g|+Zxh5G^NNmFizTAug%NGzEn#?&paX4K)z!49%-8Xw}nPtkya=A$S0voGFMHd z4KwxBSSx;f^p$M-O4iua+BcckOWaMa)LJk7NXh)-CeJGR^?BkMu1w<@<6W9Yzp!OH z_yK(%`nsvAplpI>@n4CE7gBKk6+$Owxs&xCGuOY@&5s2CY9%B z9#73f@5GR#kD=2HZ#r5KO19;@GGt4s7ir_fy|JoZRovoF^#lI(^UR^+KzG*5#CG1r zdq15dk3RM& zXHWMBUTiJ4ych8A`StVd3r3GWkwusoG&!02DkRR2J@pyiIuh{L^Zp6%|EP~%(9C*) ze1CD$yyw3=cK-8O@MaFVs9VsXwPho-EI>wCW3|68CcH`2rL@2B4=Ib((H7{YZ<1!w zQdK{R{BVThPy9+hQan+P zg>Oxyug2ZT^+&b3JK)#j=`XUUv&OZcCsX8c<^_@mc|z!~1><&mZ_E5X`!lhB4!eF@ z5aI0E8rQ-e&N#983j6uRuZkxCpOSB-V}>8DYml~rAE-H47x79Qxz(;7i8HIZszCUJ zxlqP^>zt12BLy8}xPJnf+|1G90sePX&utD=R~HmjZz_=Z)iYVfAmx>PIW|qO*DFo> zL@4KuogI`{{FceyHpZvCA0_=86^kX`Y0&F_dhTNn)s)47_&Mf5vd3M?wT>*oei^+s zlA{~So;@=#cU{QpKej!C#N9NtP~x@5BK+|cF{Cf^z41biSHsuMmF30QDh`|*nasx zp}))%?7DEu9Fn<>l-()w5yq^1w{H4r!I4dNnOipvF0=esk1D^6KjkK<>VbF5UA3$H zyA}VHxk(qg?Sr>1=-+ddcmEdFFS6Eou?xu5TR(7aR5 zIUJd}+PdQtUf&_~HZSRo9Stt{Bj-2op)Q{MQ{5=LTXc5)eXpPXldt~w!SumCH$wJW zy~Dk2sr2!)tm(?QfqpKLGcQH9J$TNt|K29)@8TbO!2Wg${A(6|L^fhy%HO*9mh#Ip zT)ABOgxWX%G}$=xxE2pH7S&i19;Cv__=!OKm0d+*z7yXE?{%@u(B~d)^|uK7z9%$ST;1M#8BAkmYjVO-`BZQUyBI@c5Qmn7NrPV!|= z#{YEoH&t`q6f#F7g?Li!Gq2gl9)CTdZ@?P*NoHs&yz;v zs53sRj~7I$w-k66LHk(Cw(^)`$0IaU!g{gc;N1I`h-Yqdgt@CGhJ*cu^%LJ zj*Q5DT59W@RU^Z5LdkmbnrWIrC8ZtyOkal#wyfzrZLu*@U%cl<%8{B#Et(B{!5r= zTv}ZAlto6;$49!FBO`;LyII>DLDE4GNq@eo z+Yoz42_tT0xJiF*eepr7Kes;6I_F{1m46a{9{nY#jn+N zf$)-&1V3x=v&Nz#PlD1Qy%C4c1ji;5pBHNJ<>RH^p+Qj6r2{mD{xn7B=SC$)^WE@2Zg=}EsShBUXbN}slfay>ss!Vp6R%$yg-Ak zykuU{*L5&9t+GP9;wh3}%Inato_`(KSF6&|sGH-|`73!SDuIJas^>&SWN`?TiPV#WbHK>E+q z^ovQLdyN8cDW-t=+&qjb0OcIfD^Bbc?F*uu})($EqtQ z&F3$q7|)*Oyguqr+r_$-Q>Rx-J^l`>UhO)SaN+5#bBv&?Evu@kpk@W-8*jIB_7?Qj zBlTuEqtDAdi8Y*m#vv_ za)#vpru-_7fKxWHzqkV#^E&fesp~helajO6Ct)M&y@R!|C%ijljbiq91MHFf^n*$_ z=VQ_zqMo9^llN@sma_3uI{D-1a%(csk8Cb(4kOn@GF#__9bPK(Q(w@wD@>GorF@Yb zyFYDA(e~G*p!cMo`N%{1fAKMYlJ!BmUVEq8Z7=i5g~$L>&Yq*R1-4@%%XFZp(L8!{ znO}4_&h>LwOFXhU01qA69NAn1dYWa8C4E)UpEV-Ttm4QT!9ORw&Yl~I{|?Ho zc>;uk|9gr+y}1{fVY;+&CA3|Dc5Z+UmC(jbQy2@(D1)4j&3Sb3duqZy`ryum`_-MBQuDZNoI^G39DvK3zt+$|!4ue1sUA z5%fm|q+ftuwxgQ9@AQ+`J=)^!$ZQjt^GtMWl*!gfH(9!|^jK)DBeT50yaKynk-;L+ zDM>qo-YoNJkp7?9LmMN@N?pkNF8oSds(r=1Ays=ILSE%v^hoDO#9EeF^W> z=ku()ir-Z^17pi7qxf<1j2)0&e(HJ`eS2v6Bgr?HU-BW(t5SBWKJE6q_HI#&l{c%b z6UxJmToC7sU`u!9r1_&KX68v->~eHiVd4o@|5L%L>XQYuZ?h@>JIu-+tkz@Gbm{JAKXmPu;5j<8YI@R^MgVo|L^e zs)ze+TFOpoE!VLrmpM!b-WP&qhTwf6c%LPoIAwVrc~sKr3(6d_-@bm3J~G)(dyt!x z-$8DYPk9n$f(?vWkgE`KnVrM=voZm>bUDr~dH!7C1 zmhvd;iGR#`;xgmf6HD3O$n@VmQraUeepJT2-M2O5c1cgluuFK6<35owMqQ+d9!%vY z03FRj7gHj07sii0E-2Rw@?L7wRZF)`IXc|M&AZ$M%@K6mlHUgR_JSs876(AI7}Xhv znmC6@#oMsC0($i#dhgBXYF}v1s{UTVgl}j@Hf}wQE`J1FiOAB*ezApWhry!9Kzf4?L2LZct+T5_gjR$+X<7!c`K5?ChDHExm$9Hm$ST)10RB~ zBsWJ2$>R#@yqY||OCE!I-L7hP+d0Z`KF1!PtC&%{ zhW##f9;$u@`E}cJh5YMtCnt`%ZJB>Fp!*AqwDTV&ZkhY)@Qt1owhhWI?9h5DU3qs< zwmcr;i(<2qD`lOk=gD}zPB`U%6}(3Nt1#lPFGtTSv*!DgVqx+v`H^%)K9KjYlfLw6 zk*mcmnQ&?^mwc;pzXp{LyA#)z{Z3+5Wjy1z2jW=x-j-H68?wKo;R?4c^7vn zLzFy(r}~8^Wb_{RY@CS2l)wqZtd*FC(;##N9`IzC{>$S8eE}KU?!8%3;lu$p828BW-0; z@8Varm(;1m^@7=Vzv$GuXe04g<=8aI{S-Ci>owYTF8@2oo05?NcDjS;jKn>d#(aTw zNss8};S<=-Aa}``;4&ZSuGZ`1Z16tL7f@@GeVn7K&iv#I@ef3X^ro<$jBasHf?Y~6 zb9SM}#bLcp<``;D-cr4!rx4x3u8G*;z-Ks%s|_2bOW1}k%V3@+@jS`?K4r7>b?9ix zi9k#A#^G^!cWGl~Pv$lHY!_#Gt@N@h)jpl14|Wr6*3y-D%qpcM^x# zyh?w~t*WtXJzXLTl@6?}nQNf|afZb`?MEcK!4Uh1nv(!p+PO+q^UMy>4)=5A5)#X;WO z-9(>Y{wrZ69zmId{fM&2d(iP`{de2_?ncF*NE=!0uz&e_L*~%$tbCffaMkI%Y(Jql zMdr43anC%i8ym)H@rosyagq4MzsQRcr`Rfr4soa*gZvA^s_SR3jJBX zJz*7doNVr6(E^%f7nEpAQp7*8gGqEN9ATgLR>E0ivY&uG`iA$5x*`5bunoG^UIURg zWc_Uy^;AOs%ZPhEx-#;fCS?>98nuABDWT36U_&qTY9;ha>Q-b2@spWFdeB(!3wD}5 z{9`Y$2RXtz_Z&dxRBcGlJf-{4GmtND(OhdSFaqt9ys{?zfu0nI%e$b& zJ)8{-b+C+o7EMs?H?-|Ku=3d8P~hm-nUPlV)mM}Z8JDn|6rfX zFX3mAKb`u_#x_H9#+vAx^1;|ETPV^D>{}z7OZTJLQKoth~D{JF^A&na`Z7gmYvpdc-=p zdrufWp4h8P7}kRx2xHeE^$>os7~Lm!)_3yFT1EqQ*Aa9%HRN6Drvp7s1NOqA$7#aG z%baS{4B-nZ{Tmhb*>%t&*3JX$Yw?v=$+-FxZJpF>rr%xz&U}z>>MHYoWOT`M7WzLP z;*q%0ydwzDBjE?egV4A{yWdd143QnO&T>l2j%amKciG4!lCSJ6i#Ob4drTVJ8nAyC zOtddm{a?`&b>^Av&#~S9qPAGdW0L4y?l!f z(92nrH7?FP$L_(RGgaEU0Oj`m^CtEm`O2e=`OL2qXX=&=;met$0_#L>7ag|uj=-yG zEaqY>$r|EP(H9JLCy!~v*~6@&--&)e=%Um$ZR5W$i@ib3||8fN1+=Mw);E#cJ_TI^qU^+P*glH-~7;Lo(CkJd@X%?BYVj23xt<^ z0Z=}pFJ*2bP0?+cLgWjxemRl z8qt==|4KbMhFrc(tNMVujM}lkVqKx?XVw~-^rITh=DT*E>emr%$A_X>!PHk-bt(i9zS1LL9poByk@jZB9Y z=EIMoBHxi_XLse_P1BQWW2{|#pL&x0l?$rAzhe*eymBYrecoM7N4S@NPgupZ_^fkkobM4w)mg;-XnF%UAGIf zkux^ESfEuMVV!t0_#RkOFpBsMcUsR|a*jV~Gn!-2`URrj~OFKA6p{_({kG~G>u7KYmZ*qF?(fif*wCWStOqwPM?r8n#fn{rk}8ebqxL3EY`D*W6QX; z;9%+6JoYliR$*geg&}{c9umVuJlJdyCK3$KdFP3>dEzIVFcHr@cu;clxgdERv#9x8 zbqYMFbTiUj&5#nGp06#=U_KqzJ)oQioe9E=ZI&KrJt2>QqRzu^!-En z@CN$M)2wUDd|JXcY~EJ2d6X~_@~Hei`)8g!`QL#) zQ^_@v%?p}C^rKbup~y<{TT`%M^{BjO|133cCVmIc(Vevw$F9zbU)FaSH#%*t%6O2m z8)Mx#9lGfJB%c2IbpDGU+eXW#ovQrsd&}O}N%tmN ziu)k9UCzEKu|XbsJ{Gqv%{WcxWn%WWCyoa_{;Ul*@I&qWre&;Nkfa4}Q|ICf(jG?dMKRiZz zU_7#~yl3J+q}(}2%ZZ9}r%? zl=>Lzo{#$@!?-WUecmwc8*ncg#(g{PvlHA8@-2C5<$j68G$Z8YH2=PWU-_T-FY#US z+>JlcX%BT5K9n_#dp_ZX@)d)Wqy5qiAUrT)$cS%{<7k?@?)?>kbfK5U#HUM z`=<6EP9BzU8haGWNYBL>SL4-kmw!A$I~$mzdg1BmJjRozb#6lUsqJ!?U|qfJfkMVp z^EPa>+fK_qX6yjeIKRI3=5r_e+@3ax-;&FmdAC^&{Y2(C=N6i7ms8b4*rDmNzx;Ae zlHXdJSSoWdo90SfVQ6y%JCqt|vxyywxdNLHcz9&UBuxjnsGQ;i<3U>WZSF{ z+b@FlI+Pch;MKLdERFWD_i|c%rNrSY>I^*LE$Q$Ule+AA)4mTFy(4SS*l0Pjs8!a4 zcU8Zt9b1`y3h$8hw+8nQ3e=vnhUy)xWlgr|n6yV?nPsl8`snNQ0a>F9V>8&`K2s3J zw&M-#1tpytWUR4HzX%~Sa$ih5?oO)9l0NC=si)E7&)Q9X|Jtt84*vJsVGxJJBTrvY z)|YHKSH2U+@o;*XRhGP)pl_qDR9u2eSEJ^d;x;0|kAzR$8|D3fsC)nLsIKeY`^*eN zGZJ7xg9HLs62!4a;5fv9G_ia&lI&OrV%M13iS1rVaNkx!c2eRWLB=T(a%zdOT`R_M zD(6-L`aaRfFU`|yNKo7RAmBE|Ax(oxoHXsdj3B)op|lAGg9aPx{d~_kTRIZLNq;=| zecnILbAIigYp=cb+TXqQ+FzT%i1g2jId~ZHuEB*axV$C0flbCnl* zAJ{e|WBWMM6q}bnckxWkJ%%**adpot`zA0Ho!6r>BuQK8nlhO^wk&dn9XULaw+W;B z$M`RwL5)7^px$l$Omfl9tB-Sr;IRP{rUP_=-MUBPmtTk z*{4y+zN^7C*d?`BjUN93*xAk(%a8xQ>@ktY)Lm%~&b-SW2L@+;YQJoF8n7X=W$Ml^ z+qBrRG?3V_)Jiv?cc$_kJ?e?70As-;_E<1o-L%G_w7vW+A2VmEm*3_I{1(6y#>dQ~ zJR={%L)@?DTgJ=N;u*{GOBcF^PnECsj~pQ_J&QNJdoJs%oO`k@v76(RipZ!b^(4U!?n8dAu@_X1${$usHsv zKR?d787G3iMRBb&Yj3l{oA?$s$-#iNVeCcrOb9pP{FO3aFspF}XRspc@ztJh`&W5? zY~$`gI6htZ?7ejRSVwisVtibQR$dycrCl5>diu7rX+s>XGy9;Y-gR|ghuEmOIL}7j zXdDVLFD+i#(fx|Y=UgLn()_sBogWKh)V$5XjVAMhMP8&iEgu!btFnc(^%QrXlWZgk zU3^0_Ot#G`ljc1O-1)k6D1CFjTQ;qqls@JuJJ0sqLEnBYS&zM-!kWv_z}qioc*01Y zdu6>BGglgW_%95`i&g4-JvOl3Z?&|+KPT|Cl8-~2ZJdby;RnX}H ze}x@2*cf|`QtT;etYVBo&Z_(hCtGFJThFTNL1>Z-O?vQCU~E^s<$uc0J|xyD>ak+PF?&e<7GjA+}8VXX}aVc`9Vhp%D9#Le?Dg-L``rbLwC4 z4P+#^&|k1tE}9m$@3LuHT!&7;xLJ%YZ1Wg<+=}8=`y1GsR)k%i_98TDKf~vIiKRE( zwSUu`!2Slmf4|OB6`hB$uTWl38alJ)*u=lW=V~0jyVv2nB;^yv^V9>r#CFzk8?f6} zS?d{h6~76+TKjVfMp(yy{!hJaCAQCDESHTSdjJY$Bk0=udugV)LDq5`p`Gk_O#6Dr zU~gMCvd&<)rMt$STs*m7C_Pt%u&89F(^eW+R3;o% zFy3Oz&$Dn3Y_2xi&ws)?hj~Uf9A(UGkj@rx^nLb}+x1JI^+oNuiu>N1X_bcQ3%voq z-50d)&&+s^*tv(-`gy>1iMnfVO3Wd`$)pOz;}Tkm+cJ>aATjqNh9_EPBLZWiY_ zCfRpy*NJ`j$qHnHTQ7x8Q6G(m$>+2Wiai#058iPn@BtbV;`tKt2Avp zO!)_JaRa5NYpi`jZlAcJ*KOP-$P6?B2)gi@k`^9Sk<)YmM#q<0s^3RcrZ? zsKdNR=M!@hou{om{<430;D*{!ty`bQ|GM}#763zmPLkh}^OdA?hB?dy&VqcG z@PF~ncN1D0;A3Bm^T@_SM-w&vvlGR?h7E4E?oN>%GWe`B^KF4HfZK zf6+(fxqvN@?z%cOhStf4CGOPpO z9Q`^!At{?d>}#(CG;RuK@Y}v8mByuCWF+1{i?4n5P+f>)Z+aWDexB@ITE9|!o0VS0 znWC4@-kHGA`#=tDvYPdb#jIuYa7N}@>hsLZjq#2L7r*9zVZwG<=|1lNdiU;`8&6z9 z{samC!~??k??=Ye_=^6=6N=)+dA0;!v5^GUEJB%)D|!AJ?6+7QWE`i%St=JlU}S5&5A z>e2h$)8l=#H}K5xcp+`jZ-C$XDs=s(fYv+XV&QY$nR<3d- z)o!X2WoLA_uh%UN_B#K z)$ZXAcfO$UUh{<%Yfs4l<7KupZ%}$Qj2*h0d4ZmYiBRpam%HnofbUb$~a#iXt(#8HZs1~Llf<>GW+^O2gzzX9qmt{ z?@3mFA37?o^6Fr0GIuK&c{sbjH$8u+Afc`Uu@ zhEFB_OWxfHt$Xfao`|0MXQItacnf=w@a4a^5^40(OU>2MZOjRt{@qU{p5))<&DGIw z1*}ptj;bt!^YFU|CR307v(nQyi}uN5jID^pw)U-grMto^+$uXc;S?3FpO}Tdg>hk% z*u0d=X7{5!D{hGVUjmc25EJz5GUO;M`%Zb<7;SOjW ztpUAt6ME~&=GZ{<8f&2Gj1?WqzH@)WF8T~}wJk>-Tv7R6-Tqm74rA6xy>#Pwk}Roo z>1AYskui!hogaJY+WKeqY?-us@MVI`*w}NA&mIeU{xkK{JHAblj0HX4cVutR|8nFf z{AT;wP}|vdVchjB-W1&=gEa=|Sz+M=dmLHIv+`^@YDF9E^+Lzb{efdk4)vYF7e4ii zumvzY6R%C!| zDed$s?>t{PulDI`vKXou_`^ z19qi6g74RyN*%VxSUaBScjIL|Y;{$-WAoHB6#shXUFaX}_|kX4;`F?CeB5(vWq-z+ z&slVuDsWJ(@1N0_-gtI=9mhMa3zHurys?KfzR8uY_X0b@#?-;vrn8gqhCQ;^iXMMp zM#QWyPUZ~(-sO}SMK2O1^A$D^@*E-WE697o+v!QZpFvNQPdd$4M8C=NO~(hI*?ay;`ht-M zv4At)Xr8F`Q|SpdehL5E_$4}x%9U*YYsa6)-4kPV%;-#vqbj4q>8f}4Rq0uC8sUN8 zcJaVH(8k6gnPb^F-u(jBU)n;jk*YljC%UBuoD{ZH00 z$I}?@o*z`k9u0l>yL_zvh0pr)N&3~`49i|)t6(3_X5N)%Z~GsWuLTQbpXI3bh$RAx zMkSYf17BmV(Q5CpYz5;cGKNXV#h=5t?e8aB8V}V47BwR$H@3L8%Y`1_X@#!t zsCuxsXrBB$>N$ygoZ3!=l^^o)cG}1IJ`7I`GcU7w1fO8e8tfmGhiJE9=8N^TlW3we z8)>5s%G^jBJ>|C1JWm@bjM_=#xLpQxPosB=*ECM)ySYSj^K5)~2M4YDLeKi{%fh}_ zK2guz%vzW2TkKO$$8K`=NO)!14A-7Z=`_$symPV1`=%XC=#sleex=&qRe`+OBbpF* zr@`rX9*jBPG!HiA(|!DV`-F}%>H9G!d|z#>C9#w<588tLedviM9og6@e22f%-mh=D z{R-W7t86>-RK>43R27SZR4ujF_)YW{ST37S^Us2Z@*}zlBBk-HbrR!$O zFciNh(HjVyG~di!<=o?b@6CL|mPKCPksMIiBxNvmNyhHQ;2rEGwd4J_56Q<)W176C zrW-?ERH9>cxcoXbk7TB8bG19$XN7;n{IKsUv1kw<`)ZH9^R11o_~bQpE5@E8_iE)S zGbieOE}A%ud^G?2+8-L#d4;X?_e9{K(a7vzJTea(Y4DpM{v8#rx$XJeo;(5x>>bKa{3ykL^2H#7D``(9Gmlw8)A3L-No+gDKhn zp_>V3r!k&ZxIf1&yT03e;GscVt`l!kUQ4f+mSgX0cB=cBC7 zH}O;jKC;GnDg&NE$H`(&81&^$@YMN&vgJ2fW!Sa-+C0_n^3=~fZD;7dNBe32oqQ#m zSZFwjuSC0$B_@l@?!08A|Kkovzgaj*opn#XGT*O0;5UR4W!q^E`SSPXf0R&(pp>5 z&CXm#GP=;y9@5`UK1Sw@%OLC;mB$e2%ipq{K5|IuN+u~E+2E?(l}8(ET}sRJ8`aJ@ZWQoirT#RIeS9Inz<=)eC+QOZ2gx+{rkI?6UVm??Y$Hs;oPd zeWdPCoiDrj2>Rcwwz@;JeX)Ta-|XhSjG@fG!<)F9??J{)_G&e6L7zJ8o7MdK%IEW& zS^HM}nyX_vPvHDf#xmB!52#%7^9nC)tVf@&u)-sqq!payi)UMT@vNJ6L>|2*7U?0q z7f5dh`xZa9vNQktq<7dir}<6KoXr=EMU-BM@+kbSl}`93&Zc57PV+kAt>roUri#dA z@J`M^?;3J-dBsbPx6kzWgk9DLtn;etw}{{I&X-Q*6|pBTJ!aQK|KH|2X`g(MZ|`~1 zmT!-#cFPLyy=3d`O`~dwARO9Jw zx=h^AZ1?<)*^|%Tm}-lqIZ2Sc$2pwo_cAz0nDd!lVLmKBtb?>cC-dDR^r*tw3*wug zi_&lOFNk-56BvHidPtSiUSaS2VrpKBTj^<66W`1GTIXC#ndC2J7)&}>SXF~oiho_sk8nCXD^IvuW%!K2qKzig3)Vl+6C4E zh4Y~konOj#a2Wis1pCkN|FA!6WG8)Z7~eO;U>^l-*7*?lS{}aJlQ+vo(HV1;zbTLI zw3}T%rF|FA%1hr-PQxR_YYK5jBQl`^Iu0@BH_hff!+CG#eK?an?3DMnC=2I?jBI)j zTJwLoD_2C*64Fqb%Q#O@eN(!(=Gr0V-{01G>f}>AYeD=1Yu*cI=S@0O{m=i&oTt7J ze_c8KDyPyiSMBV)cr7#>2`oB+4d?5c>+hhy4YIag;RDm-zP>aTxrcVY=Q(S1{p!QT zL7iVp{>79znBn*^S9&4)ob^XIXMLfq*Xf*fo#|k=2lmo922P(w#+}7h;5hpiBJP>% zn|arn>ow-g^+3QrbA1pQ8wxBwagH|q?CemSPHW=_rtIR0uZ>ln`s59H@xPqrUmkLF z6x>L2njFqx-(ls92p`hkl1JMAs9XKW_|A(=+KF3=IQ@1Z?{w9WI!9G=&=9-pEd|fr&ri#f6tirTUXkU z@9fVyktAJ}Uu75lmSimM9|aH6H?@s?sXPN6zs3FMw5xdH&YbmE3h7U41F?aAzr#Dj zZdumi%cp=-XR&dvQ3HNf=uafb*kU=?|FX8xV^v}JcVbfOOwGPlSXF>e%A6VzxmsuNMy~$d&?}O@7 zZMlKCyY9?dg0(RYJtN3Kjh`u(rXA2z@=mf(-|)Y||E%T__kW!K>-oO}p3pb@+<55# z&_w;*w2k};)N+|`D%V4E+w61XjXkK&k!Q|xUk&FqF1%WOYVEREWEkIG@3C)U3+=7( zSu&uBc4i!G-h`fi8ogkjJO5k9`ozd>@$UGX?05ltmp9R8q=T#{u6XvJ-7?Qcrrbjs z(hcZ(GVo=OANFdw6^na!TQQ2rnLgvHF(yEtS?u@%m%)U+BIeBbNSV z%g07%&x;M*Yv*;tL|zMG1HWnKHP`<3y~-8wk2N^?%?-uUKWJGoI%kpcyP^4C-15!2 zk#vY-zCB-gOFYtMojh&l*V%o;Y~{CN^y`%$iwE1RuD^n};&Za>Ixl4oF^f8XnsP|@ zGW~QGb^f$n2j?4d(=C5z_na@sM*oz0f4zD|Tz+!u-0@mrviMiRzjMsl@HdjT^MW&O z_aQGd-VD=+4`atw?~YSf3G|(OI--9qlO$Q!=YoacEQXtr&bgI?Q6a%?-#hD?M{2F z$RRH6TkFe?KkShkpZo#Eq+OCZ3+ZhOC`Qm=5OZT6^kv`irBD zPnV9C@m>E7U&{94wK=}{Q(P6CLEOiAaqnYultOQ4g3d+gx&^)^BRd&u7J<<;G9F_q z*I)CTHEJ-!A@-A`uus(5kJ8p<{KOPmg+H|O!=IS$*V_we)>=pD2MR}8_8tE=uWG)f zZ$=jPA!~PW8CkpqdF_?Ouk-IwF4Gr~fz6du(}^Oar(tNi zG=5eFvcePJg6kvk2z(vlF22rY4Qv)RGrQ0^vaGCl^StM~v#sp-dgO$ee;OIMp1vX3 zZ~ES2g!vek83!aA9^?PVxXic1qwTBu92=Z107v=)+LK|pXJOIg80$W zoUhVtj}W}b+%+AX6^zSwmA8!|?^m7*&I-k|kju+|`K42ja#ve)x@Sju$G zOMe{4Lfr4{MVJ-~QQxk1v5+ck=w)xKItmM^M>jWEh~y}KcpNN*G(+V5DET#KD9>v# zk<*mpjKfbhE&MZLQJ>|kjbuR+#knpnGE_kN1!b4B9Bkx&dSu_f3L7DQ$CVwYP?Ar6 z(Tk1nowQH>cyuy0a+G|ohmC{^+cqRJdx7Mw-4pmo;kEdP)n<;C78jPt3E3V zrWRHDlkks!t}6roh!)WH;#qY5=<;7WJlxK^@;l>TA5jK;BUx|NYfPWyv4gR5ZD&ZgWl8wSYmU2fQZu#{2x^17n+1j@Le8D#1AGOe4Whh3+ z`n50+wadR31IhRh3?%d4h=I`W#xanY(_kR*w~c{tKMbE6y&_0EJ&*mAcwgU~vEIf& zT8jU%U|R=c<|B83f!y^Uj)6q`{SFTqooa0+=g!WY_*O#R73dx=2GSCz-41>V4CL+! z3lzH;2PD{!%pC|F2z3KkNTT$GG-u@L@G!a|~8A$B!sNEA$j zZyro!(Ksg30w%HzOoaRNECW7v1VJZF$hL7z1dLL&>O+2LU#Y=F z2FYW~md0(no{ntOcl2Z1p7B@WBey&ADB&aPm5(OWDCnn(|QPtD% z!wF&r06ntd-oAQ2vOBjXP#>GckJow1AAnk4ABQq!ABjdC%b4hTY zDENp?pK*Kydeo7wjgQc-;3M0v!AA%a;ve|Pwn_Mi+wL|#G823Ry_NBAGCuN;b=%h6 zWNp*jXevJP5C2+xWG46s*HRZ-`?c{AH=cOZgO9X;kFf4T&iL5L<(1=ojE~?b<8mAvh5r+B92_MIjxye73gGQ&aFi%G$|M;+9gZU1 z**D8dL}mn3&R-u-VU4(fOLfyV4W1GOPoWNz@RTTc%J?_%lqh(LT~E^oz*C~&DdXRQ zce;2AclCofWAyj9romI9W)5rg9`KYXc*=NR1y6~Br;Lvw>d)XQQSg-UZ->d_L-3R+ zcuLe@CyEcA5(Q5g|EBmKf~T~A54M1(v=q;b8Guc?l46qX9 z^77Fgryk`lIybRKrh3kSwq`6;IaE(DlksmVhl`oC-18A@+vkXLFPC@B0y~L@2I$5rw@f zjbi*!7T^;`ekF6w;v=ITUk~dE*T(rk zy_fw?&2;Lwdd{M*p)V{@Id;Vo%I9mpQ@;d$p7vZNG8n-pc4jXeas|b7jK2)b}v^ zjrHH;dv*K$w9f|G=|0-)H#z6&UX=-QJLP&3JUr>9+XkJqzeNAuLBAMc?Oo4W|Cw6u zLU26Oc4MA$W3y?;{{eCI{d?TK_DV|62c3&-|22-y1vqdz1$Jl3WZy&VYh)i#fU?$r z=L)yicVo{4E|D%+iT`ZM%=fT&j}COUedS>{rLx$zVBYdixA#kFV@qVW{qQn}2BJqX z^$cFEIVB8Cep~ACX_w?Y%X)kzHsNbT-$Pe__Y@f&3|_@Q{89%;F?Jc^WvATEUM{=b zxBT16?WLnx2T$CkcPw)C#u!|Yp`+Q!G-Ha6unYhvbIcO!e`i-z}U`fUKez#-&W7UPZMFGu|;*fl|; zqhR1lOL8@}%!=wfcyz+F{N~7~#n0&D@+okZwMvCcVdG)v%^9?^NozoMCUxd)rhor< zJ&EUpan94xUTWwcPPXH-iTzR9AEvQs_-^c(J_@afukek2*|0f2cX+?1K2!Ne{M<=> z6xT;N#OED_vFL)?SRV83NmrIgwzP7F?nE9AZ%?+*ba+T~Fv;cfO$r`8fnw0Jg(&ZXY7yNWR*DW{2%I@J(`oC_vlX=GR zT^_7w%$;qOs_*-$$LQ6=8*Cj5Ihb#~wjqVSS4W)&u`ASi;Th~iP5X%Mxf^2kMXTOe|~Myw=f&O9|Ohs>ilfTDg}pX2Fu!b82|ri_Wak=-j|8b_%Uyo z@L7Svc@g4hUE?ft8mqc%?XzBE4mVKX%WJNry;kjsCBBZGie#hO?vc;8ZP-nj7r*=ar-X~P zeJXaymJhUx>bM=;YCE7`_cavJ_eJ1tA==*pM)r1Nk&b4-Ir#)cA}~I&<^s6 zwC%#zbj=CuGV+R}vtG+0|2n=Of&VJ73t0>@c73u4ALI-b&a*iL-!}VSs(Cv3+%C7hh40B!m_N$j(X24t-Z1kB zGf!dIq~Gbbb;Tn`QQWki2CQ``2#w|P52qQt)tt}aMzT%Vv;^%+6eiGTiPATj*S8HogVZWdv&o$DHYJtJZ0XUePcnQ|KW z&-j$)JG67|-gZ>@scCrYtpDTXKQ?*KjoN)V94&x;U7-$^+DDGa)|#peE%b4621`Z^bdj&UqoKMf;@7{bf@}4c)B$8Ka9S= z01QdbrhacVmoI#!F z%iA4aB95PVu(wuxdTZSEltF12A03=$+A>BT(f=@VFgb?bKFX0qzUiCr1KpW(+iCba zKlOCY%C`KzEvw4ZUyc2o{D&xhW?84M&QQL-u4^I4!?Y3nfY$$(M!5#DU0a?=KopJ^YXrQ zCfOq^Ju@Gb-eBZSm9vi`T!md7VX)1o@7}AkG5v|Fq@{S~GO|JY`h%Qr;qEaCUr$!a zzZLbK7Mq+ZdsPp^Tgq>`u}I^_3d(rBu}W!tg#Xuzf8&Sz)7W#pF-v2`_0puA*Zp_Y zl|iOn*OPxryN@;d1^81m?Q6@^qYnKK9=*OiHL_W0loVNA3C1WhKIz+|l!3AKrTxhM zpWo_Fn13UszJ%664BwdkKC;|O+|=OY>m3{ZWV|kpEN70L2B)#dDm^oAJ1}*uGV)2~ zFf`y9eU^Adww#0Ce2lY>EVk=#pVhUTdc6K2^)Nc~&u^WP_?OZ^;)JJ;=HJNjiGFSB z_Ak^~d6;_r{ATJ}Il<#b)>1zCDz^P1dg~Nq?xgtFtC#5qs$URYI_MjGC^&EMA=3wz zeztMcJQwpUT6`E!C@)>RSZnC`Xl0@fJ-$J6gY?9>`vi1ffF2TJ3=J}dMt*zY{hZGd z9bV4532}Eb7N?MZ7eCP1F;4l-c)05PgnV7ad5H_4d#H&0DEs`8vBw?UcQ^L%iqHRp ztUu;m*GCg`0p*u;_ht2RuSXv+va%KYvXFK%_ScQ9M~cQr+%Z?*jXfgi(5Kj|_hI=> z&1?RL0b+>Ef~=xc{#}b z`uC8(x8s|yaSWeb0gLqzM_<0O%$GP@?Fm26DiwXG`}p{-XI;W1o*4s+AN$=?O=Hcc zwv7GWDb_L1Zy|hb#;)!Pp4ajm@$Kp^;JI)?Pxo}`^ptYmCOSvs(tpSg4L-X8Jz&ca z`bt5@f-eXsT;j7c_XF0zboDsHzJfay?q=)! zv$w~tq%wQ**M4yNt>Lk;cbWpBc;xD)Qx)uA3NVhQu4a~&2dq_u-5SFdv1d8wwt{u4 zjEtund*asCLEU@sTde!zoKxq_2RC%ah*(X%*DKy{07wr!A$zUst3@q+Es&Q2@- zqW0Ogpbw6U=A0QG9WMQlcBTF5f04OnE@>rc?;$s@6qqvnz?tK*7WTci;AbE@{P|c^ z*rB1n+R(u~tg!gaJ8nyEcy)8|hXbV7AF>9cx7`@~$}spe<$de%KW;p=jJ)N;xP~+e zd5+v@&9CqUwzkvu6>Wj7o1ll<8o3s(I1<>Zy*Hb9*FNP&o>h+Vi}%#cm5Goqgx#q> zk!*K(xFB|?-CoKw=b6S+8Z#?~oU|+ETIctYM=@zyMbbT-F=Qw2@Wwbct~|!7t&_!; z^$A;UUadM6VO<4UN7>h0vhM1}Q~23>>3N^k6>n-T8@btvE?@tfr}WJECoPO!(dFgq z?e~#ed0tUtKi{(C&QmWmJyteCTm3U_RXaQOm0e9+%Ff+xMf;h1J>R@*Tk?gk`iHuZ;rR2ZkUt-2)`2f2 z`POZmV-0A|yz4D&J>HH*m(zxw{HyTI*jgWrJsk_(`E&!}Y1^DPX?w+KB978DV{h=k zf@>g$wRSMxo^IP-cG_V#cz^T)&mT4}X^)$qcBt~q8+*aqr+%~0i>H382ZL7GSR)Rb ze@}@o+;X&1KIm*?3iCZ-a-sEfVbn)WI^Xi7Gw4Z2@t(?>*jwH~IQUw+i#<2IcyBf9 z$mo!^S8j)mZqjr4(znY^>VEu?oauZ}GIu~BYl9$v#;c{Nh*cfnxI zTv)Wi2Oj#5wMJ)XP`|gdfAR>jL;g*K4QT)Olbng6b}@4iL$e1+SL2XmlG2hr!H?(n zbiYCQjV_0N@Rt7R0&7jbd&-x%#5rBVtnKNW31@V*Gn*YbWq3tle$}(u%Nxec&z>WB z=SQJ>NAHFg$1xUD7gG*1k2boen-=`%@SV{eD}vVfBlP1Mi?wJj*}Lkzdd<~|6P~Q2 zIBSNBz$5X;#~IvK{~Dg3n(3_nnt87&gYwimmKpE7-}SGuts{R2*uW|D`(h;YxbR=b@wl-KF_?Rx;pxRmp(yD^$Ipu!|T)icWAN5mf_RI zJ4*kWE}ow}eWb0iUFB6@<($X7g<$_b5`CsAi_?bJ=B4;GZW}hyhQfJj@aHgH8e#HW zLf-O$&}*OjaBX_3vuy2l{f0Haz_$u~eOLaj0_hIr%@KUcD1B_s#_8y-cRq0)URc%4 zn6q(5U{&)z`(EC>nR}4_yN34dAniK-)vyNFN!mLC<;_jEIc0y7a2*wM@9+4Hg|{I~ zJ`w!w*jFONQTR@qp7}P-w3gRNIu-a-UB0p-e}!m3I!BQ=BX3vMw2x z_IKR)dv7$}xb2OgFZSOIuZ916{i*!_-gt`oukm4X3`07uf(0SZlbhwP41TyvZ=)*o4)mLkWDo= z$0AuPVv#yz;lDvf4H*9S$f$u|S4O=p`uqpVs8<#_GU`F@lGmaei_b4TglrmuH&-F6 zjEvgJ{wISmo~4}?b`kai&-{y{zv&zqZ=a*T4pbncmLa2@_L%%%aZP&D#oG(7Oczi7 zq`dM;a$CG8+DsRo#aDRJ!MVNp6nolns+{U`ebG&=(~?JH5y_~SEoZJxlfA>72fqZ_ z^!5A--(uv_YmQv9&!@RIy!3R&+JQydzicgO-ud!ppWejPMBVisY$YAWsK{+jIuX8W zU07q;dpXv?N9c2UF6W!R7xJ!nYhBv)U=PxbJ;>Lw2T?j_>9_9_FG5(&0rhP!y4fdr zH~qc9THGA`_-pxDt*_Bn z+|j!uca|V`7WcRC&ntKQ(8DWtj88I+Z(46Qa>h;vdg^Y=9Q1&Hjm(*9bEI_4^)hP) z#s}BS=n+QO^0A&NTZNs_r5M~QsJ+_IMb~uc89h|#+G)CbSG{R^ecTvd=VR5gPk#GY z;ADDVpv$rG^Km|>&I@(sH=V4(X0>eE771m=3w@4n-5PYA)En4b{k4@oL3x7Ad&X|? zaTc8~4Kk3v)Sl6G06Y+^+Foz|j5{w%zrh)q>#Xy=%bY%}wELfK98bIVxoy~a&f{#W zQ{~B5Tkk**RekYm8{}L*zfFIQC!>pf>55ye^VQHs|5J-A)A&R_pDaWcJ$D~=WZCFZ(QowbPwS_ z_Pv|&uTjfc5O-SxvX3_Tj^CMYNN$4>U_a;3Kxqswdmy2^51+0z#nzf!#{XW@_t9=e zo_VwESc0Y2frM+P89HK}>|A3Vh=8qEK=-0GlzoqN(%3xCr~a*+W2&>@>@)H>3r_s- z{2#}n9o^_^&^ZpB*Fxj(p?7GGmU^(PbOo3~4>aHTAp5oO)3z(WwbbAYRjaIx-(3^? zcE7 z*IxJZwLsS7zE(Y@uT?vJt=>ILP<7~C@8R9M=xgqKa$g8KXW4!1@7+FT>TUg&+eT++ zj<=Edm)z({Z#C(;VLP_qr)0LZRhaSv=)pRRCIqiC{&g{6&RyR0RGEB$YY$b7KDm&4 zF4tc}w`5LbdMK~bZfmN)3GA4OD|0+EHD7XHpt=?6id2ZeQ`sXb8c|CV*(6Mp9 z;PRis_1@>!#lvsy@Y^WymDkT)*`=@-U4E;?54PdAV#?SD&nc|JsK{^8@)R zTq^GJL$$+GDx>VizDIcqGwPv)*iNDZ^C!NfEm(4+_(4Wvb1^S=l3|*_Wy?jZHH4y%|FIw<}8Ma)MoJ~QO_in~N z-re|v#NPVnjL*V$Q)mBkV&sjw#JTLMf#Dmf2GZG;>D1=j#K>)ViF56~f#K(T1L?m; zHrh1I>)#HIa-q=y((FV=?UIaQEJ);9r8SIUsc$nk`*tiXen@g&>+lKA3g8R{jXg&e zVv84;cS!ALZ1P15uPhZ^G_SJd=|XI_z4A2ABTwbu8+oeuhp9*XGW_?tb_Gv@6(lol zjA1tmqxL@^{}uKL&%bs26aP!LipRhDIdn%Ydk&NG$FpMvv0*-%rf zbS|px<-1#LU+T2|rN?~(qnmvLmw(qcaOG4+Gzl$&@IwfnT%BNOK``SQ&VxUVU!6nYoPW~X_)ep9T*^UujYdVGP ze^cHY=qkT_nl|73+ljuw{LxDn9QlnL7?;O(IuGkyjjr<4U*Lb9a6cx!-oVN7!azrP zUtq)NW%QTS*}TLh+W!xUYu3tC4%TF%$$Rq>cAMXun{fDJLI1;qtMh&4ong}I=UVIQ z#Me>lTa$ExrlvBZ6Z8cb=UJ~D8aw@#&+nX-`8Cq8bp?E&gsf*bH1V!HJAH%i^xeEV zaomUBwXxIh1PR|4$Q^x(eCoLrruVru_{Ps0?cMA@+2DTbTmHpFaCTNagl$(1HePSf zad0(kc@92K+Ldj!<7b(gGfki1JLR6gwry?PUT1+Xs^DM8{xla+YVB@KWdeOTGAQ>m zR>YP)f!svuFRb(h^%sqy+!aR8_8p(px@-KbhhM)#K1t31F3g;CI+kbQ(hzn3>CTaOG!Gbr_~CLuyOf_5tF?xb)rImX+?eNo~n``BTgd z6jp7i^Qv`DjNbbKi#X3<5$75BPugke++FrU3~?Uw;Xrs)eqIgl`I0?$esr+#@u8j# zeaG^)1@Y6<*tX{jeeHRNo+R&a{>ogHILuiI@_TOhOX)YlSI8Z^EUb4QWGy-D`)%uf z-;E1z8!v-f7X7o+A3AKOFFz{db@rrh>TIV^U7vL8s`PsUKm4`oDxU14zP-rY@$)gH zf5C5>Llg#fl^1e8aFX{z&fiILMgzX97%!bUxAv4YA~Tr-ji09;WM5g|53o^Yo$a_k zm=$Clqu~ESj{RV4qhv%OmnpmCMD7gMqUaYF=ojz)ihl71{i2tCVRX{R=m+A7JszF? z(!QBd=>>()&Dftr_7(=><(k9T?VRR(D7QX3&-)DZ+3XqX6=oCT{|SfpUgCYcfAMU; zGk>zz#7y6v`h7X=H}%^`r}Qo2RC(|=zuT^c#lhjsOzN$Jv=t|?bTc>4Ga z*C|`W{OQB*nNkkwzuVB@S3Hl0Gj#2D`@M;8zW>R!Z8F|IQ`gC5?^%pZM+kdp`QB_| z-Mj+3nmu5}^*aacv*H@D^AJ|d+JW81jp!`GYE|BP&Ly{kt#=f#=W!GBUbB`hEJV** zOC(Rl11EOo`4_N%pIT<6H67NV?~KO>bl24g4>z(-_9Xa4eeMK?;p8{P|Df!SsF&=# zb&g$%aUJrLMEX@gZ79I!q&2A<;V(VT22&)(_w8C?gl>r(k; z1E{#yD~D(ehIMcqWocwjC2bmRlPE*03|Se-r0SOPBc~ zYq_Eg`>2=`x85Pyl{&>d0(nFwZ7e)>13DGhbC5kPde)x4&`r78bCE7=8!RtsJ5nya zGqPYp?`*{$B~^`1$T+J!HO@Be^pCPP<&Z*nz-Azq);c_$lmd zAAMK3WRoJA7c8>QL)YuJziB(^5_-OP@6kS`Da>yCUzOD*{kEQVX=MyiTh+K@$<%lb zKTf2RvfDhCkpITDP8^%xrj}XdHgT1|mj|bYeS>t&_@a2M2Ol(L4YF=(>K=gxk)q?> zCERPc7i2v1PVtPM?uyy5cak|B-QsP}el`59V#o1}l?XoL*arr`X0;TQ`B-l}(xwEd|sQOxr$_F8-K!^vwW6Ltq>k8r-Lf8mKm zq~QzwoxPUYv^SP`<)O;N?)l>3MXyEB^|TK*Nqg%o+N>GXqjk)idU?-gZQSDQQ(yaF zc}ZKrD6(b$@_Fhy4eOrrTO%>IeoV3syg~b)_UG9C|NH2h zs?QP50uKNhPWx((TU5ndP&kmHqRgCwy{1-(P;fN?hVB zSv{LEBgkIwP@%Ked+pDjK6UGC{|WK%Tx8Z?g!?as ztdpO=I(F~|)+^^SPoMXth4=fuH1~f0mxA{n154Zy#21L~#r%El^QWyB@^=cy<@*Zj z`TPc+v0d1@+#k=sPtRG_)-3<7{Ezco!1FNkg~)Gz=9Jb=Bf=kV-;-0$9K z-Ii6z8VUJ^YHYhz{2$1^jds{RvF}Ryp`me+`^;Pm8@%d7=Lhwtg0pAEvze=Pz}pNG zrBD3d6_IB8hU7s1*uXJLEm8IKjW!R}`cpXt4ke%Rs1Ufw;& z)W|5KGng_va?Uw}oV;uuVY)o8ThCjo!Gp5nA?nxY)^Qd739*s;wd*)}tafc&S#u0B z?qNfmmM&DOaU&y^mY?F~?4gT%>ASCu1wtcRd_6yvY(00gFCo6c<}Mv7jzx%L+e&96 z>vs^}C%MDe{U~vNo@u3QP93DTKXUU|ojg7?AN=342T^_h{J^}$FE=}wFzj-E7G#yd9e8YkDV_aYCuxZ28l z?I$1P*>XgC`VHS)yw_Rp-Q#!8*|6*NU@Y+y_LU!Bn)g~RYX)iL-eqJzc+Q`-LjM7H zR=&@7@~rSj-TuPa11H~RKLH=Quo<#_S{l1|li%cWI{k0#SdcwkzWyX_E*}%d9!POI zm&OwP>|e;Amlc1QJq+0Xq=%aqBskBzYYAh_!{}XU>J!PV9<9*0B;TXU(07O{z6-Yd znP>W0S$xrnd|oVKKIG}oCTlmyT5eYmi6n$tgh|HWcR+P ze>>@(WPH5B+Ub>Vpq~Z6R!H+AdG=r@*UR|y1o~?d9ZlaE8^UAcWtTzyiTbvdIc-qH zKiT2x->bC8;kwme0=c7|jG<+e`?Gv|n(J%$XL=8MHHlv6@jm&<_`4Xq>EK7oM{5Kc zXI9U&O8Y**U&{y0r}{r|?80j^yKS5BNWifNFUB5Re(8^(&-Mj=Yjg+CZIoLyS6bh0 z|E`s^E&3B7>&FYf;dKAH{^N8v2&3cf{HBj0*6o$@!_hvpReRlT+;n$)Ic#h~2 z#Gl8L^MmoQ+7$l22v5sy@XeVHT`H+h2$>_9#axa3>awln+)1}y@HlnI?SF#34+q>j zB;lchfBz&lUJflM*TMM~q>U15}bW!&g{&>9-{;Qp6j&to;~-=|I9hFlf8%b`HH=PpMd+k;$mF6 zU|hLnhE6K8bVXD4A>r_D-r@oIJ`&&i7)upK--LrCGdJ4pCOK&0ntJcR&JMd*>YUTx z2p<`)KSJ9%DC+pTchPPCCd?XRNE;B{!DvVX^>L+yT@ z^E|}4tz)-?8yxd>eS|T?&?m_pFImxg2X-3ibi0+V$Ob#m+!7g9Y=^7epW5uq^+d-Z zp2K`MG&OhDCieHaye*pR?A6e(2q(;O4{?lqGWPn&^Ko46@(%D0Fph#E$G6x;=6M@) ztb?gzfiBBO*;!)_($7+lBmcn7lG&{NKh8UHPPVryUt$^fx$sT5eAw)szZmFw$h`Ne zJ%vvo6Z1kV+|d7vz`Xt!S>yf}WI_iRf%I*B9F7#?pZ;@utS%fGbp3$*9wW@`PgF*wd(0;8 zoP5pz2+Vo?r>v{ZL3cat%RASLT$lrbD+Wn zR{C?~rF4y*7dr1t&w`Dr{?mQeH?DDfPBa{)e)){ox7FppCcb`;aeXa&aU^GU1ad|O zk?rvXYy(zZFe$QT}U z+aXN5)KK;&&UuN1e%g&Kt8EVyd@TPp$?2c*FGxMdmd#6y?UGqpRj!WvvnVLja%z>$-7(c(7IjfWh?#AG4w*l{>#v+g*bl$9WG#d zc)_FlB=6Sx-^=An*I6T=KIHX|Vgnp8Z z&i#n=qwRdZb#7t=3^9z{E63*c3VgiQ)wu`Z!{NBYhbnjDc)1-OvFvis*x&bHi@o;S z7x>LlVaS^6e(Ut_jhD?wU!1ONtk>B6Jx2Jx_W7f!YIJ$E`DXZmHdUNGdN%c8t;KpS zbHDhm@4;w7--D!)B;HZam7kxjn z_)}LTKQ89bXK5R?Z{d0N@537kqkms^WtZfJ_;|d`0jJC+U;7STtMZCB`yO}7t2CY< z4V8IPSU3I0_;*ods8AW5Fs6;|JlhwH=V=9AbZE41qTPpYc68fbc;!vc97Fwg>}Ggt znLB5PM`N!2tjb~bQ0ydJn0o750J*0z?HqA}^nv0?@U`Xq`vv=gKF0myTpD+xT(Tz^ zLtnSxnIydOdyIc`Kkkg5bNT0gwkom5?|Xgq$9sP21HW2n&D*km?(^M$!#QznzS*y@ z;rpKwXU?k1=Eq|19$&>8$7z^6|7` zg+KNc;SjUHxqiOf8o-`s{?C_L1I^s&F9XXtXQ7!s6i26CPkn1i^MyNN1ApmTQu4xG zv4KDL<(Is$vNC}_aq=*FY-=cXr5C;NEPau2oxP=;eMtPZi$W(lNh7PRZZt^Pb(OJ! z$9*{^>(<5ww)+;Btcz48gt-bMiMeU0Z5BQPJ^}A80-s2MQv^TbPb^?u4l^$2GzKG! z8JFRkfgs~DZ9WiWY-SEQV2{t(0F95&@QdW8WS<$ImHybV%yC_h_wliJD!#6;x*8d$ zw4TzzWw3d(K5)G_2AjQhz0Fy#QM%rFg5EU`ZnSYTXFsSHlW&Kn&vKbEsr?NeuWw%2 zj~_(g0AcBuA!M!a(k-0h8sQxuJ?EQOKHrVM_z~d;)A_f^h9>Yr7y91Z$JiHYY)m?r zg0pdfRWM%!Z&>Ece_}za^f~fVo*ntIfhI2Pg{j2Wu;UA{XcL#-kKDj{z*(^Y*0lzh zqi!8y9#edSwW?zdakvzwo^MZ(j`WX8=7_B`D-)aMpxeMB4ai#6b#R7N3N9AzAe|;I z#Vcg~@H>2KWxZz8iw-{2ir+8j6z;(8sEJGA_FxC!ihi|;3)y^NDOVf%<7O_UouogJ ziR!YumHpok96I{@Qz7eMD|OdAO?|f!zi6#hymQ&{g4UW2_@s#|3k+{LmwfUUp|51E z=ABFLdzkZOMS174|MQOj{&Wd@W7Q9aXxCjctyNhWvGj5-wNpLcZY9s};)6?=VhMIo zCTvLtVZj!cbD6LoA?y}tlm(`^oJ;u#56GeqFXz&`XqiQST+U_xhZnNw+snD^|9YpN zF6XlUGbUs$A|Ec^Z9kfv0gx^!a>^o%^t;G7jip*MRQn}eeA9ye%$g81-=Om%Q^=$c z=MTaMwk#9Y3g3l8#g&|WmNn8#olB4nSwSlu*<*D{2BI6kCG0xuBNk!ML%=tMNy_(L zCE;lYwHp^_PIKvb>Kc^#g!(~PbmZ#c++!bgT|nAJ&|8>E4zj9;`8w^t@$sWp*P20{ zAMN1V@`-4V#bcSJePD;;1=UY?ona|`Nj?EheW&xY8)Cl&=isFy>^Uu<9v87;TSFS9 zT*#>dA@nliUlm2b_Mr>^ue|(YC!B0Uv~Tog<>`ixz(2Kouc(Y|ZRXy*I^L~0B74BL z)~@7y)SFoE^ZB>l&;3a*(NlG1JbbIh=cwGggr*EtH z_5hdWm<8n7$aC)Mj&6NdJ)r&W1_#$UCSSKjTV-rhB{ zy{v7jt*7(1q4ly7+O+s1j!%#yw43;9h;|Kwf6=DV9zT9Nd0*|8MdhR6qEGrATY}l- zuQ=jk3!fha`1w>{1k)cFy3Oh1ila-k)7`9;mvtpXqK z+PzbI=kPnuSzy|$ton;@)E|ceciOse7QR#J=<^oz3pO^5svlG#%lmSJ@qz{`8Yyz- zoT^jm-pWLncdcKy{=p8LPWrC(>v5kTStuoC)h6u#S9$sSC} zk^e&cikzvCVfK3s^8Y|?tW5R@qLnV$_BMiz3nyY;Jo}e z`@>jsuDT|y>Jof!?11b5h3SYl9=^G|+t5I3)fJ>w#W>ffwempghVo^h*Zv556ZU?M z1kkCkK&Os?-h(3z^f|LXu>;*NZ{Ff~G2uG-uC#E8=zV129;q!%PJc?rcZ_&_G0@DZrzk`+2zz8*(NZs;+E)W zA>p+av6(!=x`M;(H$Gx@i7q7>RihPF)=1IE#apaJAsZy0r>3hi>U*d+mIw}S zKgD^{2Pz~F+Sq5-W}W2yp!UB_M-$a8w7@-Qalx-XXHntn$)|cJ}8`K=Qj54mCHMI<`FTsCM85T?`!$M@3{6Go6G-c_rX3OJ&qrNg6ss zld#rQ-=p3GoJX5WJyqr)-<6kFz9~QLIk`kU`6pJ~4)B6i><>7OPInmp9{x!6mA&L0 z3~&Y;bSbzou(ghuon*;G_;D4P85g9gyE?)>__l(|dw% zN>k-9>Fa(Dy|9^fKXzRBwP7Ieu22V_sgfhJ^Rg)eWU5VQrl0h>tNAzKg6+23T`pznZ>@KTH_)vBF^0l}^&qn2eue zdptD%lkDrM_p??51}3|%T&3^!ksO{Ucx1wt3VGQ00QI$XgdsP)2`m2d$_-~Jb{)H@jFF*_NKHzy*hFXS{6g&lw@{&45-SHsh!MCG}b9?XAE=f_9UacvdhTk;GfWUD`_v}b0_jy zZ6n#fiE@I)N0D1;WVPKc5#-4_@BM zdBVsj>Ep&{-e}$bux%B+_4WEeRr|D&w(iE?PU#OE-OA7Y4t>{^4?RXd7=!(tcio@n zUFVjlJ*6voeN86=o%Wp6%M&JU<0kf`ZkjmD#XJ5Qzm@XaBKgw}J;h78jK!KyY0jy$ ze+HSiucDm`xs+}zx~_Cw`Mc0K+Un}bKY=c3YwAV$+URQrb4jw!)ImL)xZw5XdT883op*TZJz1Z2 z#!rj7)KE|QggsB{hey_dRb?}G6%KU^x~##W4l)L+u8K2sY+`PH7JlDLS@a#>POp9& z9I6j|s5IAFC0#p;u!?Vr|pT zBQSaXhs?VV*|8cw49y|p{CD!T_f=39g)gQasb$W&K*E~ZcE+M-s+~DiGS8Jkx3TY! zc_#AEvlGL^%g2ae0}QzUXa!d?}oT-aoUyEnxoa z*s-L4QJKIGgv}q9$y@$mzKz^y`J9z_8Xmu>7}fhjw5-Yucg2Z3m72kF7jX{Jd}W zy65p99rVqL*A`hP*?(ozp2anr_Q=(+>L~jw`LKP3_M-*VC_(fr+$~<}1hoeH${org0J<*(r1b=KpEo zoI9cES?KaJ!i_j}bD48f7Fu7o*HXlj z_5U=sQR@VQTVj#z;zujLxtR7Wu=1LNnXUPHUsBkS{~mma?byK3=7}<>ot37pw9A{C zFTQsb-dqa4;m8Gh%vP9dyp9YX_HfE9q3ilB9zcNWbFQlzU+Y`u#Ge9%@_t*H~oQW0~6)oydB9 zYa@-l9$ioA%y7e)G<7#NTw9PI$GPNZt`3=yd~a-{WP^3pSyz73&dcc&3rSmHwRYr9 z%lq6)ct@XFFw()Z{&{R9C+SCR?45M}A7)sn@QH979@k!_Bk;MtE6kSHsx7XIcaAg4^hy zt|WVLk~#D}Ri6h;_Y>h-%4Bj30)F|s_6kp3lXQ26dJd&|{k zn)|&E|9vg93frb%zEyzT@gVCci-u!~cYjfp$Zd#4wO_JvGqO^Cb?NKcv+MKa$Cbw$ zfrVvyH|1&oCo}I4ATJK{e-HnqlmAe2(`E8kvDl{35YLLYy&anobgXxoR|z{aX{G3Q zZ^Ji+exiry(sp@l_2ukqX_6|5CC+i?iD+WzF$_J1p~pk$yE)WP_-u+b*aBbv2zCRu z-N7@|y$8FOUa+D?Cu4~ab*68u$=w%ANk@FCno6( z!u09bB5f+uIMXB@Ur9K*lI*zHyy)`c`}=&)K3h7vh&Y{R{y5J$XTQI!z4lsbueCN~ z_7r=Y0|VFZ|1-R8a!xrV#7j=C=l@UOC!NBXh)u17!oW#Dlb zc+^~OL03oiD2n?GX)YkMst+$ZE_sFZzcvu|WaAzTDP0m?Meiu{qw!8%hdpqefgc;E zd(V{S3^FP1bUgfypQqDbx5L1M>Td*=Q!^4}FmGSVu4Afp)sSE9v2F6&a>xI~E&+f3brWzrk;a$p zT_MdlKi2?lE8Io-Wll)&R_L8g9FvX4#9bOHw-P-Y{KXv)F~{N+BH*ov>mJwrOzbu5 zw)$fx8J^@esU@+*8f0D272K=BdS~8}jLRF~fUhHSJHpu;_;lS>ocBqeD}U;#j{aIdL#2Xu`hotq4sKDk^Pa{C>gEpFskPqt(iW#(|@23Lw$^6~~ zZ?XI{$ehY2=G=bEPlodAIagcKnt}Hc-^;%Eig2Qh8`#WUwyZDxU#&Bi&*dgE(4G1p z^!Jamn{yJG&xI11_2C3(+FqQ^ulZ%~JY@g%9`M^^X{F0(m6+33LtR7uTHSZMli<#b zhb$Zh(`${Pcd^Ivb<$h!WNb9gHvLp*{q}qd81i7jYnNZ2m5VB$_3s)1FR+idt?Hb4 zsvP(o=4@=)ZQR#|uY>7>U%Bh+_{9CqPxjn()!fc6y~UpSpI!W%&vyDpqCalG^M6cV zRQ89?oZ84gF1+*aXDkZ+(WVDOd#-)(`ag{Anf=iA2WNlx+6Oc4Rio0usYjnA%=oKZ zd|h{Mc)xRM3vgcvuXF3o&YZ7N&$j4~7j8{VU$o}t*q(g+W4%FJp4d|P;7GWjo3(#v zgvXN=&e(Y(;^xCE#i~X~Q;$#U7Rn8=F7a31=F&#>+xB-de>!1%$QoiD8T!M{V?AeF zI`@bmtA8Xf((&~F!9EeXe*tvA_HpTbmqFXwJyQ98M!S;Wep`m_C=>l7UhtdSphwv+ zzO@;f3;1u%<6ErFGvtYbt6NyBijO1bQ@rTFIP{y<4@;smnG)RtPFMs^u(AzX*8t}i zKc&2>)?)>{eB~^&SJcpEoufRB|5xVW$<2=VY(q1uEba4pPZeivR)aKZoU^07&}qKF>b8 zito*=y+&ky;JcoU=qheOhpGYHQ`(xv16fyAoNMFPvE?D`j?G4uu`aR z*-Yu(RmM3qYpRPmNinXnY5&n^s9!wOnYH0WBRb3%m!ZcAEH3a>| z(i_t^a>v5T1?Yz`-jWx&_(-aJAODQ4{tx0Sd6+f!_>y@YYrQod89e}xwUj-18Dl8@ zm?rwYRQfWmWa$N?b(EpCtn)L;aV4{;w5OV#4zo};Z%RBY+lDgWGxq$Afw^TLw0VRj7{}C?7pC>b%s(#JC!eJ>xMpa z|BhqmjdIQ+Ij-U_E{mnlBahP9>;Lf!J5N;Re&%>2cX8_ow4=fzvwMFooq?9T#jW4N z25A@?vto9nRdR(5*l#o=cdDn%Eu58%sD9lA$ytSTZd1qHw#Y*dduNuJP~m6^zT11D z?KK9Ehvy&v$fxFYG(wN79z6>)H7EWH|0Va#>lpCyrJfbrdFpXp4VJmll%RSl^eg`q5DxZ<_jMB@R(qs zaodMizB6BIWbvqE3ZG@)7+Vrce=F}ZtxHIIU^sIbJPVipHh2yZAB5*h`g#pzX-zKX zt$$?a^FQOuQ0@B594qj2FN6F&b5&@=^{u%}(muWQ4A2L?L(nK;Usvc?_!f z{I_Sa>2NOcf}HM)zI;aZ2xq{hN4^TYvL1hMwR7Xack50>7R2w`_{m5|WU0Z?gN#ut zduk=?e<%1>=XZh)(R7-NVsL=M)_C#xqoaO&EAgKoo^whs?7XKBRIplf5SMt5vn762PF?5pp-^Cg2Fne|a`wjM?S%CHB|LuA3Mm z+wQ9HbZ?9#JNM-Bz=ZNFy~B)=&RR51x+^zHnwzkpc@bQuvDqKG`uN^C^I99(C%ek9 zZ{dH0xg3TjRD2C%6U%L`R(Ya#k%2#dgfstR$d1&nI?B_T(hzc^u3D#UAA7?wz7Mna zRDkOvxu0r%2AqCB&yj1n4~Vv@+~D&#>v^WXHZ_Lt<6rSx35#=HvGf zALRci|GoSR7u54)bnh*De+ByGna_n2k5gYGPYQiCs}Cogq>3E3^#Q`!hfk@mALdML z7`nBZ{bm>*Y$flV;Pp-5Owqt`*2gZ^2O1(h4s@|?x8OwnJak6;5@Q!-{f_`+&n=C1 zYz-9vUj?mI>?uEHt$%^X!n@}9$E@Wq@YpcH|3A)os=X6daQ*Lp}`bUpT+j;zh>s8S(l}geeU)^fTf+H~Rl?@-JHaImYsF zo*?e*Vl1EFvAA=q7e9eJpCj(`Ja$bLqoXW&P!MlEPW)CL8>TkgH)k)pW<~J0@2yiB zfu@W4G_=LVoZ+UU9!`&X_!%E0>HOa}?HuvvGqR4b>WMJfOjWqgbyPC1mAp4--NTPg z$LH4*&WsXqJ zaqaM59*p$Q&n+M`VbzjS|J{-6IxyHcY_-_zRr!b4uK!Cc}#nz z11-RrK_RmLFnfp5b=nvzI!=AtQhaIPvG`#k*iYxwf0a9i3_oF^!cP1}j?mC88>Eti6qNRjtdWdF$_ zw{3ub#hw3nEPXVza5M}(F8^C0Uzg!R9rAJhl}67GvB&#f__JflRgxVTd4IA_XQ=XD zZ+Lr~R^cu(fKp@twX{(>-@&k5e*Y9^^XM&Fzl<|c$wtn7I?^Gze@i-ZNaJy&yejby zxco?X;n?@s$86i6Df_?2{uKdU-uWBu4`Z#ZxGf)CHs8BP{2|Jy1TTulS6wrNPgMuMBJ-KJ>PHW9$ozx``XV#EBxF~dla9GYNOJ(lm5%#<%;lvR^221 zgUt^m4lp)eUrr;l_r}G@?SuXMCTWxM6-+tODXQ?~EuZw{tAvf8K_c6EveuKIm~*Dd z@-*-dy89(L^p$jLT<*I<-{BMZcHI`8-rC?6qf=>QZeBgc*Nj&l6%>|(yX@S&$XtIb zD@=EIKa&;qP}ct@&g`%opHvnLX41dT!-93OrYHShll6ZfH-1-kJ-hPacio$nZWCem zWQEnz578CD`pPKp&$GjTtA?zw5bz@V(O_OCXwv^K@-g|7!fwm@Kft)H&IHT=35(?7 zXB*j!8QizH|H9$D(}ueAC7AuY8naHmi59_DnuwH+NZSzX)N!I|eT&8I$xj>vKY_5p*;@+~Bk=+6Zk&TecLu z-2RP6qVPFxcb88af66U-?x1(Z3{UCfZ`GscD1PJYIlypvO=1Om!S_RvKi=%L{n04to6R`ZS)7NR!r2XV=*1Uy+c1@F@2AmS)93D zoDR+zyF&AhD{Y9e(fiU4bDxl{cM-a0+4U-&%CvQs`|bE$>iiLPYOj+GjbxaYj=@Kj zpobX4&dQ&&B=;SsmSH=>eZj&>w9UgcrhSISvhyap6vnCB?$tU|m(7>8OT2tfb-D}x zC6;))3^^?G(;Kk;cpeVF~AjVdyrC(>IYu zx)#~;lF99!IHTa)Y7XoE$tvLXCHBgSx#;4;6GC64U)I?xHeQ9FidD8hHe>CEMYQ*^ zg0;>!?|wK0{k1Ptw5<`IN_%hd^^RwozhYbC3-U{}FEoGK;GR!CT+3R5)|hS20?xoo z%b$n-U37djCTGz187AyVD75_`Hk=iq_@0+oL(z@S>}dJR$gm3YSGYy_8{GNZdYQw0 zp~|fTyer+JrRaoQuWxkK+gjl7+55m7l}n!qMV3l_pz^&skd4TuId$pCT^Z=4sMB%R z6QSsuH8r=~S>P7^0W#NZ&Bz}Ugyp*>vn$+40ldeyI>JO>S~-h+cnvV87B`&U?I!l2 zgUXrdx_$7>oyZRNUBz4DgAO;cl>HoGo1!t3nuG z^~PrIRo&oJ$qw(0Tb;JwaR2n1cW{og7JbU~{I7~t0aJx(>E#h8~Vr2o!+N?J2;yzh-ZSZerd-d@YFPH2*TbSaTl2{ z@eoz?J@dIpB6BPH5aqJJpl6>^N&3r-skSYU&7r^`UhqB+8U})yt5uZGuUHY#D~EF z*7}?1@eiWY=>i`OA@l-P;n#`pvBl`5V6Vl!V9=`0HrdB;c2QWm*x)SP4Xw6xE^?M% z0v0mJBtyuv8!1C)&{_i@rjK)oQ#w60_zQcR|6$-zzM8i}E041NB+Dyfzj~N;z5&0d zyUO4(bssRY^L=h)n?v0re~A5`o|#U%IE-uyI6jYzRefne{-t)}tHqn6@$+oxWsP(4 z-OTcTp z=sLJ=<$>n4W1YJnNF zZ}EAzx9SP}W_~_2cGKrM)BSo8em9%K+Yd4ypP22;`C>Fy^-qNTt-PccFnwajakWJwQaFNb~(;xAT8rHUqr1R6k6^5q^dVQoT_%dR{q7(uf6Y!&f?PBoyBFhyD{gB&Pw-o=Y{RJ#~-eE1f1Wd z^BuKAdRZA@1|E8y&YGn!zKgrCHf1t5Zk!u|-N4qwKj-;Y*jXxh*^aQ=_T`Yk`l z{0k1=LGIZYGVPOW^zYE!?A>~yx^&BhN$qjFe*cRV&Ihh-;S5Lh@2GRyq>rL@sxHBi zc+N0!7M8eYy!$L^BHwhs*5|1x_yBoMoA~b4 z}#&3}IZ|&VlRxTez>&8;xw-(NR~GQ990OpWN)@>I0uM z@`7N$l!kTl?6*GDRg?H2GPd7C*Qo+oM=@t1(WbApzlOZzuaIB;JN~8{ z-F#p?JUWOzUwvca%C7gn)LxJ7Vm)%RQ}{7k70Mm01-^#yXLhGMyLDBFwBW|;f$80i zTUO46H_kY7xAj7+)VtAE^stZT6Q{XepypcyNBie+{$F9Oei6&ck!>j3r{&C8<30W4h5(>wXCx&}L+;mi|;+ z0d2MQ##vXQTWvqH)7o(KB;hfvPuDQ@hPspBMh6%!{&(k;=63`-Oy$~s*ZTD=i}WoV z-RW{Rn!jxm^An_pHCDA={YHt=vMTC z@Ck9aY&!fWXVwD-UJAv3QCHz)eI=ulA-xFl9cDk?F4{zGs!Kk+NAH0R=nmiQ!Rg+? zcRzMw6R?DjFR$IHUp>615#QYR!!HDV64*IX{`aacY3uvtLzC)beRwoiEl)gwKe2^JrlWGiZ(F?~@!SeS zF6_PaZO<;WX3nn9LC0u9hxCju^Dudg?wQ(s)Ei^y-2%?La(H9sp)`85K405K8v1sG zcaz^os|)R%bnZcCxJPM2zI@pGrf+6#o3)j#^Q5+Cn)CXVR`8{_p3b~S@f-Y+p8erp zR;%pJ=9_!=H&=V*D~@%~9XY?O_S#B%WCmW}-!mWg(0Tcw=~a(xy=N4>nwMn_uTvVWZ_@BX?_|Dd1FYd81ec=ccBmr-Z-QkC)E^-nW- zKjPj~N5j(qM`F>?}JPs(p$?9z@ktS2K^o2(;Z zWQ(VL9g(vEy-uC=#GF;HsvKzL{vXh9m9H{;L#tl3Jg?VI{`I!9JA8}vU%Y1#x`KcJjeFh&M6=!8%mv;Oq_5KO< z|8e5tJ$HNf3K|ET7eN$Y&Ty!wPKPwj^< z_S;Z+@t*&|SYQ{h1O3is@Z7PPljg*hmu%*&jW$?Zs<{~;j4}4+ILZ38cuIa4fh7~( zoI|+(UB^AGY{^_P{!u8+T3~Z{d@O1Nk3_q2G9psVzmD1=r zNO*|z4lhrg3w{XoALI%7_FtWZ9pK;f_ZR)E{YRO5TZR`#J<@TvFxQhEkDR3D2-(L zCXaz3(e&2eVUUKaXFd6RBl>&zncZ+X-aBV#)V)REp65AppU3-EWa<`Q4NgzlT`!j!BwBCk@d!0w&e{aLX;kF^-veTbq9<>gKh<}|&c~0874Tt-O zh2&zWh$_5F;$H)_AQ$lf^U*LB7( zGq`tp@qV43^4ot|eAx8+r~WzhW$}J~?U^lh-vl2AzqOZ}J@l6z`~~-hu?=Q#$Q;XI zznaN@F^f5#4gNFtm8nlf-keD%&9p^fz3fZ-{k=(Zq%ggO|BexE?E-|86sNnnPTz4S z<$sd>=nii`()qXWF}!G7v5(7_Ha3ne-BK|Y@o{+)oh~QGLEo|0yI+p7*t7E3vlda_ zV%o{xT4(mvGwf|Czm4Pm)sKbxH~a1M+6ZjO@4LQ(X|$)0@1w-qbAU@b{)Bq|n0DWt z5bYs2pK2cs%22EihfG~Tzu~`3A4L-vyVFkf!YeH0j4{@Pz8<=a((5`8tf)=cqVYVXuce8yu9{#;|88@W^M3(eiE zC~QBE%9Oo}`etDF7Y28NlP$gqQ6GGlH$F;#CHy$(;~u54d9RdKX(pv>zMMW1K2;iv zyENWfm-b)lTJaP3)$ohLr-B{g&{NLo1`nZw8bY7Qwc#G^6r|67JuaKeL$}S`zm=&2 z{>iU8bOuu4+`?IoQ&kaz9^36Ceoz0y1Lp#Qr zfe)U6GBb`p05=bYZmE)taNtF7FL0!Ktju5fdq!?6y2WV=A0r?5CV7l?MV(5!A3UVG ze@&RRcgh7m6i3^~=P$^skN54^G}esM{b}gW^)Y-DJT*O$!+nH3eV2di3~~M zA=2(IxVdMb;Nv~}3qH~_P=}s#xVmS!{5H>b&qiQb_)hD6J zoyme)c;b)r9N;cpr8z(zd+ylj+w*5whZZ(fh92a`Y2k&bhI(k3g>xn@O<;Su_K&y#gU_3 zIEe2Eo|L2$4)S&bt@lg?A2Z$|BLp~ zu=pNRZ%Kr6K-yr^nDwB!5B{gvSJakH_`nG5*0)EyE1dPA{|IB?h5KQhc{_Tzw*b7Y zJ81S)kLRP_1H!rF^V00D^3!}{A`SH)r~|hBG)a80tDGb<0`VH+r7es#_-7!J-|8-b z&b*H>Hy`I+-7^@j2QF{!X<+?ZSk|802<#bN+xVcS-IMsbfpMAE<$Rj@2nI}h@+JIp zC7a{bOPS*lbRfYiJ(5uc{dZX2EE5j1uSeN$;pcZ0aNZkgtN8avPYmHhb?0<<^eF3D zw#K?&EmO={|8%#t9{=X2H-p3E&oq;l7+S$ST+}rW+Ai~P2U{0(pIOs7chj8)Nz$r) z>`g0%uft9PIO7~0UE+vmuMqwEhB0)c(2wZ-`5Anto;?^!==?0c%jAnA>ql08lg^fe zLuFT^^90#M5qA@Kq3WITk0+#~V11U_bMJw2(HN$jDEJK>hf_ycr_e0j^2N8ojgAU8 z)4oDI_;haLJOe&F+Ujn^uNPsHWv)i9PPlBHU{2tUcct>e;;dh&l9+SABkC-0XNHtkB!eF15U zUkq+SX5-_XWVxX!C&we_BR-i|*ONrP>ZL)x`ZM2OFm`oC54|nJV>19 ze~tW;(;2-h&N;UW7A;;^`=k@bnGe1kt!~&S=-aLIZB1fqgOSTAUG_PbXf4Tp#J>v0 zt=#BS$c-%hC)thl3t?%l*L@wo2F|f8udVW>cUa2aZQ)qBZUEX%@}M<5tKDdyFBj^^ zCk=M(PDKtZ?w2>I%ly`Z5^xPdG$)GnmG|3&2~;li|qV5Yb#4 z7~cqTnkcxv0^G5Wv&sR+>NIWDeknb6rOC!KE3)v6;M@8nRlD`*EJb?rvboZKgHQM9 ztjDGiy<_oANtXT_X$q&ZQL!|O$~Xg@3^JxeKE10tG#B}SI+X6G;P6f!ed{R}OmaSN z&tJgFhbk`Comdr#y&cKLMuPL<)&6`0=R9}^>jRAU0`{CDpI2UwKK{MHp5SXX^*5pS zR#D=dN^{@MP0rQFrK{$I=N;FcApXnR6zmFJ-D+v>6!b!beP{svo5rs?W9Q0@e?xGQ z=XYD@`@jxou!g?~!UJpNlKb z&FaF~%4nf?&!6YFS3Gg1E~o$e=ccokXRxNPVr|a^?-~0C@hbA!WXo=W?nBpNyM;B6 z_OpBj<0e^AF?WX9c)_B4z#at_MUyJd!eA$~i}1`!(sYKuS#5E`;bU&Uc*&rzCe<&w znt?-KkKgz4cWK8bY4aVl{dW3rTjKoZjPG8}pLkHwwEN+&RR;HQ_DEjQ3rsxD-GY^+ z*dlB*G7Hh`CcVy`eo-y@zXhDCe1p(z9?soe3^ zZjkZ|kYl66ING9bL$xL~9`>>HhGeJ;vpm_sxjPcyUi3(!$?}t`$Jgz>v|}yp zy^D6=$$Wh>K|eg%jGcd#18q23=dat~+L#KDDE$k_GSGk9-oTo$daa`8llbPhe5}$X z-_7=`YV@HcQ?Puj)bu+^M?ho!3 zpnbufNA-de)IU9pf%mO;dwpizOE+HjHcgD_z32usOf&Z#8@z4!gv-5a+JgVThsQ{i~K z>o&DVxj%cA>wGCX+vsn}@2cJJxg+y>`m`>hySAgD?XK_lt{0sk*$#O1^8MPi&X-E? zk6F4nw&&=z4}MR&@wUD33wbNJkZ|tE#mr4L*TnYxlDHr&^)fEnFCvmlfYYG2+l8Nj z!$PfPi+63F8Xxxku{h+iF9=4WMZGH#iry%_=Sc59YzKAE33{UFQthXF^vHET!1bwP zEnfMhl%ss2Cu|+^t*-ew!2IO1b_?Ji3L;Lr#`E)!|0rxlg*T>x|G&rnRr|c?E%jag zkRs3ljn2fnjZvrMx`U)s8ZVuX+w?8mY}dHb+BACGaJ#O8ar%xp^Uwtgof6L5hkT)v zd6SN^gMU-IFOzN(52}2@^&b45yiZT)#VZeTXYo?hY4)KCXr4;?S^}=J?F3J@mH9lb zmlk<|-gd9C>9TQ|(wMU2ue=8D=^&>{a5wH2a0q;&cRrcenp#=;Xx?1sXyrKnW%IoQ z{uG^6&-k@~GgmpGQ?>A~I~kJ(WG))xZ!j*l{wt5OImcJI7Qfm$I+4MO=RSSM$H1Q- z1%FP>yEU)t#V%vG65{1#pyKJDWPg~bTd_zyt4S-(xTjFx<71$b*t@u|>u z*#@XR%41b3+cP&|wIKn-doy{R{ zpH0Ef6=NIO1YFfqe#D)hukv-zNEczkQAdE`PS)gV{J98zE5pumov|y;F6G;H-%7@M z`$pmM@Z#fkUW4t@I6P0CwqE^rg+DzO{_~ou1IV3(69#f!&u@lj+}aa$=H&l(CoxitF5&zCabYXz3;xo z%@JhUIoK`W7m0aM+oT)5;LmERQU}9rS98|&J=VR#?K9}h5G$PCS9ap3!C|b6@qM}Y zhNs%U99n#QeRy%}z07Z8LGNc%H@JtjPY*!1?V=wlBgwaT3tL|50eA_cvcKj_qv3kK%>W78%ygn&BNLv`{Sognz`WUg)#kN(A^(NJ^K9|A zO4G2(ZF6TEy;XabJy}j<=FFDY_yKfaw|I9vdNMTSACLPY`r7Q@|C=>Z&ir)33nz2I zNk6epCa(vb8w7O-ZQb^*Hnc!n=-=|)`nK&o@NuVK|B}lFWwHw6juEdf&9p=P8sLAI zKQ^{p?V(C5-B!IjnJ?kyon;R6=dF-CCOo)?C-2)=p@S3VT!J&M3fV`8pBsUOk*u}~ z|7uTwD|Y@0*)aT517%fY9zD^5%m$z3-k7b#r-Qq#29#>_O_4pb{){|F=Vno7erts@ ze>8~=P3Kk4p%xy|g;no7dcp;VhLGzgXQ@k0u)EAj4!d-5yna~1|T*G`-)mjE!Al06Up2OR;}&BhN*+Q@wGi)~ewZ zgSbiKpy#P~IiK?F2Beo)f!=mKXARnuDrd=e5_%F%&^5r^vMr4-+`6U0v&qzc?4>Co zO*3g2vlwZDItfbS=~Bev)o!e*T4Tbx(0+H9&MBQZ;c?DtG_UbpeB(#RaSm&I@=I#* zU7LTr0Gr~I&Fz^d?Wd?O}l^CeaO;|*l0cZYoCTxUd#Wf?x}d4On4T1lc5#u zdfb^Gd%F=IU@r4+@sW+w{964bm9NLH5BpD<&?{zcgD_@k)ww!e5KKA^li?;_AZl40&5ZbM_mO6Jwmzqf7I+u|O5+kHkj z>g@(%90!|V z&;RpY=7jnR8^DwMeH)5+i)AEz18DYNo&t4*ng|=%lLv*8f8w5o}tEfe)L;D*Gc^_E?{<-{QSka*vU zi+^_FCG3#~kS(N;FP1p?=3zfQ35>;&$2D>XhW4t+>`%4ojqUQdJWXXyHUE;0ltMQ& zLxbq-wFLdEEc`xseCk9yO~}bquI<+#i?Ml8S$d#_4mU!> zGy*%CN5M{$4?7XU8h!YY-rU7|j6a#FU{qx#v0ZPv*6gWAurn0h5-sucDi#iUcI`%2 ztN|HQMWDU`;*>vFAOGlaUSTc7C)R@Ul~R`8|BvvsOdPaGIba>kum>r`dt;@_l>J%ch*&$A#u zxgO60?{I31FLzWKvhme>zfTJ{0f)AH*}$`w4wp1Z&NeP5nFK4Oy$r`?%Rw`B;sGb) z64l}QyzFUcarqb6$heH-5@?zIp+~=~bl{RSWw6JX^(+`(1-|bjeNab?w1okhWl}qB zo?b7{G;Hy#-KS@Fc*T5^b%l(+%2Hi$55PSCmiBDyL{P$#ARidHJtVim6 zJGIS8mm-t0VJU2d-GPVR)}G%L{-d!2;m?f4z>Rg~MsMJC`1W7a3b9A1bsn$G6k4gH}+4Esbf>G*e9eE4>+tyPSDc;mWj-31reG8HbmEw!X3(f9%J*@h-1yf7%| z(En6C$f|1ebcLHK$I=4Go)fyOJsYPfjULfQv~ivBb7$tHg)=*?+j_!R-GZNX=Eb%# z?w=W`kHPyvY5X~)9E;$Q%n+Y`B$`WY3TG=V(PNQSts* zq5xX`R;QqEsgvKg23~U;&nW(oR0cLR-g+7?_h`nwjenytHaIy*``Yt0`KeMq$-wI0 zXYve}2#w4VF(&$F|l*YFC9I$*2zI(h*Z(hw_q&+hG zOi%elS4zeabHKrQ#%|Ekj4J2x5cPy2eF;w%^V`d^?by60me6?Gf4d(}MfU|^&GJCX zHxF3#*db_}hJW-K!_Cy~o=olFae>eY@ue^QLqsKdDIr&eF428a%-_r8- z^+|Wnb&t*Jz`y4cZw$HLoj$AW?di_+C(0iC=Z+60!+Xk;p*{cPhWa)=(${gFJG1Z4 z9?9?c_M_7~5|944W3?0QdzrTXrIXwD8~3Wd|3*CrC_m@XSsl5L{&Pny;V0dkzUv-h6We%$evo7;DXGqbPkv3&lgd-1!R5M>^x%zy6q3hDp+k%ErDA^*3XX?@ck?dw?b z*pEB@!O83Uiua$-|8(zP@gI2Xc*o}+`DgEc*<%GA|M`(w9oyVlegB<&vuWR~(Cof{ zc4qa>c4ALmA99}v=hU7kzu5f5_0z(A(;{^zK5+4?Pjo+;-w~ld8pEv@cb@oQ{5uizn10KN4_*BF6N2A0XKw3joiU^D#{%Iof7Tp|PRo-XX}T6ijndt)HH zr_!C?{Waod47y%A{X5K8shi&?Ixq-Jz{C}87A*|D=h_cXLsw-k=U#=Je-(j)=COw7 zqxX=Dug+=EHAV;8>a19L#)C)h74UcuOUvNTOSDYIOx+*m(>w1%yUZ}Oi_T9PIfoMM zGW@pama0S-Z|SETS@L1%mPKPPY*=pSmhil>&SPfZo1j}(jMFOn3m!;Vn+ee^KY#{M zo054sJ?rzKTk>v!ZVC0ALpN68N_+6JNA}opdH(K)6Df3FEe!$8w{=oRnDd8|;K;v# zwt~NdhA=u>&);2@kY7%CG;C(f9-gZ6e3Tv%?UGysZ3pcly;|E2m7iJ*oq)ZL=m_Z| zDo%UEi}(Q59?^u3&yk%g(IuIP8${;ewK;71Z*-!+S*`JCQoEoD4*G3SnAP`Fp8W;) z!7m%Sqci+d=!$QmbBu1jpI+nAxx2atS{@o=kw-(Q%mc)Wzg8KdA=qCE^?hl_dSK$y zz{aP5k#*<-t@UU*(H9%p$28BXLo~+UP{yw*BS>ec4B4)XrvqnRDc$R&Q+oT@Jx=Fc z$b`qw)1{{&d1lDS!Y;Q{4KMc2L@l3r8hKQbN9Cr%w|IP}zCT1ClPALCe5PoS0sa+d z>sCI=6ch$uh<#RVdL*wlUCBPE{c!lXYtb{vIn@cBAX(O`M;-6pV96Lwy$i^1>gJxa zwt<7jKFgH5z$-T%;(W@lH#I~&Flh7aMAvPAFgvE1@Zxd4Cz}Qt=c}&7m;ML&D)FWR zqJQ8`gZ_|%{3+w&;h=1rX?W99HSngxzFwzz{nXBfzk38aC_*^$J5M)D<66N!h|R!Q z1^zrz*ExqXqz&zYF9F85{GRJvg_=eaETc$aOhrb*f z8^MPh-|4NjPE{i?Z0Q@-VdvA-7r#q)@zq3!T5<)qJY z=KVDE-vDFv4)G5>GPgtN^@w(hqdzLSP>rAWDRi#Ra-X~6E$!u^v%IRs{Vo1Sr0*ho z$;7N0{cZJ(F2F^;ACa7cSl?Cqne{nuJ zrHsGM_$Nu$nLVbnoIS(;?t1ot1hR!gXZ?S*t+V;(>>16~-OYE8jV#f9$LLUSA3>4i z+t_XPhQi!ofbB|im?zW|gg524yv-oE-sga!t8f*2Q715{vs7bKH_qox zTK7}&cv}wKl6d^U#931i&sn}D6VC4!E_lbsW$J^T64qRCGyX5}pP31{rv{KGux?*D zSC`w?Fs;V3EwbxvgfN{~HTdgGJfzYlcdzmG<3w|)f2uT!7Y>n5srG1FcSD}DTy=0h z(vzfYx6sHQ^=bnCVwlPm;6G0nR>UXO##q7)$2eX6TP0 zLw`uuLbj3z=)a|Dq`P7FyBIQBjWct=zGrx|DPcTpVB7`Ql?Kkg?05y=lh?MP?}GXi z+5VAi-g@wh&Uh?*i(YVj-wyh=>FmCfX_gIF0rV60DLZChn{CEa>Dc4o{mi^#qvqkB zjA%!VHET+1Rby-AI!D6Sj44ijggWc6dG_MWoT={pgsEJ+##1}dVYQeb4k+(eYgevY5Dve-W)=II+8d<{-+7Mcntc6XRuuN>`uU8>VnZ-i{s;x zF==ZmH)C9h-oy(V(BA@{QsmoTC)rk!r(-Zgp71Q^P~zYNp8n^4?sPf%+J?kfUJdp- zd2LNEN?+UTv*YFCk2g)6H-34Mo)X!{-U^IorB}Soll1lDkRO`#tckOXiSD*dHRsZw z98U*ac?KApLBfo_`yJRAv5t1b6Wn9{AZZ;1;`6RD@jK!-zs$a?J|^pA|IQdO4$`Ga z9?ORh$ZIibUi|JwCjQsh42Q%08-1HC!GPDtV>7VR4EL*#ro3xR`gbTVkY;dFnb(>$ z8NW>5_G>(S-ONd4cJ7va=)c0#JcTWRe9RQI4br!v=BwKN`WSUH)}0n#G|vHF7BY<;;q{m4b0u(J$(rZ}K4l}(5WxK!qfXDKl=}1ZxUGij)T6Qd zGuDjCxAt3|oC8kP#`sv~Mh6^uj6Fqpv-e~94?4S^yP5+&gls)Qyp;leTYUP;+Mz0) z#drFiOxGD(J}VoDNFN3K$l3juqUaIlqcgl3+q5TWo55>N&vCx*>CZ7 zSyqr&bcp6%W$S_efL1oPic{G?>fBelY@$0O@IT5UK1b_E-}`|d*%w+HK48#mui7aa zA*B(_C4s3`j`SpCvo+a9QfW8?IAqVjBnOrJ#>zf{nQ@(b(iUd(lU{yoo%FsRJoG$w zmvmBJqwt42&(rTy+)JUNR?%cu_8UA;SA6!KYq^$<*ZnuXBJ`>~D6M zd+x=bY=9rFffv)bWtS^^|FG{@DaBqTJxU7`$z#Yrphd^yIlmDtc2qhCABm+;uLq8D z;c<6E&(_J8mD$6T&(g{A8R(Ke&OKfYb9Pm4oYP#5&Bu6J=KikaZleb#K1J;t<}5=p zalwb-N5}6GzwBII^sMsOvntzmg-xk*7-qlqX+EV1QHS0GgzIf}3Ny{2{vdB#!Ckhx zQ@bSoVs&X8oiyxSE6@#0an@M!m0IxOANEwN6m3>Krm|$ydhnRjZ^|^h=5L$dGG9N* z&hb<*CEG-u0Z5Lca`jl=SNQHEbNRZbLo@kIL^7aI99@?g;8n*NEi0)#UvF?~p@nff zekyaaZ#%R8?HR<$`S1z_qQT5~^#Y5Gg?CP#+-$;i_rEazbw@!{H1bB zjUM3M*qA9-abCIS@R$B<%xhB<-`3{o?1%8C4JuwmEh{-uJn|>yL+G946orLuPgI?{|FDs zPOgFZ(7M;SHh_Cn1~|g=C1L#{PTos>S{!}6v+NC4C+Nefk2UMH0a{0I`=nZH(iNPC z4*yk6I5yN!q3|1lP-GUyA(0Pf-@%3f~AF zW7GEfFq|S@^=RMTB)OjImMs-937+uMTbL}lltFjc*o#=3HI>^r2ilyqqA}Bd_5*!0 zX^m*??3&Tq5-!ymH2Q@;ZRhtX&K+98HqzsDsdCy}Y}(v3hF@&%G>{+pCiW23T@StE zwL$bWKF}|yEO@Mj=3Uh(z8jeH2K;rLXAH+_Do-|R>}7*ETIHN$OvV_aG-IXzWL~sq z1@n{IJgw~_Pcm<{ryqQ7=;}oJXZXQxhR@|0AWrF1PtiVP83Tbe{EWAL(E+9Zy?m!M zw@pslMt@Djn~zpEiC@`0yXPG39AmE2%(eQ`z>JPkUC<~K{9m5o|NMCL!Jy6YtL4+j9{m^2M}83Pi7^ir4&+zS z`bV_&_0p~);NC^=KI*~ppX!=@n=YI7NDuiU&(_B4DIzPuGXhvco_U|cZp)uj{YTKTe{EX*wk}|G7+zB2 zSK@Ndpv&EZuG{0f^KJ#tjmzGw&B`ig?&vYrr^@Iot4TzPCSY7^vNMGJZlIq1%wq*| z4be+BTxAXTY0expG7H(v1Z5uwe4M6ww09eQtZ|*NNjeLqzOO*iP6}7vsbq2r*B%ma z71IWsc)c%aRq zg>~QfYG{w~GO62^ckinPr^_cXVTJRtJ8^uxEZe{&`oCivoJ1O$Re8?s4kwVcj=IQS zE)ak5R}ag#$6njV7Vbjd&wg|f-6-yJKb52{N&hZKo2E0zd0uz({F41yzBw*}Z#e61 zv*}bWdGCBAlUeT7%^g*ldqRnUMNaz2Jm=KQ=K!EOn3i^zdd+j&83Yeww}*C&)lp~ zxb_p>Y2xKugl$GyII++CU$#b-#_n~4s|;^6t^+nC9@T^?-S|Gq_hkOt=sU}233Uq-jcL@A5?!(P>mXE>HMKYf}(ZxBC@QsUXL3CCeSS?{5t!%hB z6F!B`EMq*cy9QcTX`D>n3O7@KLScf(;*9I9EB%Y!Rhs0bycPPFU8+aF>3>?xyTeXx z6+fc4?!qh$@YEjf?#A{gPLHK?`7XTDePk*eSs7JecI zeOfenl<+e4ca>%P*NdNwAT4a^AA8QBv~~^HHt21~cPgF7!I}6V$#WA;kyxTWC$?w9 zEbtF~Y>v^#%Gmh^+MzO-|H8>-n)5L`|2EFT?o@SYzRQ4Hn>Oy39nh(~;=S3*gUy?P zQNC>%dUpnV59vSd^CtQ(WNh`ebp+?@b@n;+w~qC41it_+yytT7>rU>;*$8aUWj^%n z@~tw=gMTX@-t7DecX;+-{{E?d|K7H}o^BQ zwvEGR06ry4D4veYi?PnO&zLORu;)0lymOq_X-Y#EdHCo3PCygwL`&(QzD~-W*GuM<%22p}~o8PqyMN z>`t*i=x(utjBRRKY)@m@c|H>gooa-Z*PYE9d7Hh);BC9N=uVv!`yAtNNd7-~W9J?j z1;?)&f+mvwy8K@a@)#MJ@3)C{qWO}HNA(Ud9;%Oac=ZkNo~k~_%V+jAE2|bvYR`!I z>q7rp2YUaScl{Oo2wfrkGFk$f^Gl7CmE_JV!L;Ul0vGyvT}B3lUeRQK8O*t7UuM^? z<|YW6qM78IYYV=)DzTxJZFDbdXAOR|N5V_H^BX7pQZ*qP(cT?#W8bBmLW>K7du22h ztAZ$9p*BXLQC0zCs}0^O+{L>RxQga_bgA&`W%6??r%sZ#5k9MM%kq_^0~d*2F*rc~ z!Z)`5GAHEA)s^OGm&Pc253+g)C)xjpXq(EAuQ$Ep|+_3x6U$-Bsk#T}mUmYv5hcT}2+=%vjyiM_YvBzHzZRS~ z%`0-0?=&#(%nyD)9Pd8~|ETd)eAEp+SF3p9Jb$N4Ok8k}QGbJvg}cdPXU_E_i(~1< z>78$vpaXIaTx;db;w9!bFb8pL(ed>v`r)0;p#-+ktY^D^IWKy)Hj&)TJx8zMyY<;= ziQ>H2+fG5<`P4J}7RpBG^lR+(Oldo|0!Gf$yEE}a6KPVaqr>qbsfM-tlV?9Xx%=~3E-{nAUo znA$QF*at*cXNRc_CPpuL<0oyklp{A0{j0<|5tSz zxV3ewU00$3rqtO8&-M0t*_~OP4V@+KFSrT4i1}lk&7ppkSu#`S8o7xKK6#Uy4WAYl zk4>EYclaMJ|CrI2KtDTi@P6;RhHo=o&fafx{-^ZTm*q)#>S@kb?)n^Kr!;AFo&Ob| zK<77nEHThr*E7)U_IUcxoGYbA-Nd>16ZL1XFHd1#F1dmHLLH4x)T6Ru*k0Ls8-TTi z;C0<)X~TwCH^?8-Cw+S^$sz_g%X#Tqr)}|@kM6O!z_fSqINg~BziAImBl}ZXL%v*~ z8Q+r@&g{4;zH7<-i67qcKmy&#L;2YDS7NITKYb%{m+fmw@RIgsmo9g3;2iH@wR`4P&YAF!*$*szE}CW*ndWrU=KWh8a>1W`Y~(sk zcTID4-Sz8chv6}M#b`lodJR7MQ|NrZad3KD-2F+l)AUuI7kPG9r;2OS-AisrbT!W# zdyYF(A7Q_3#74a$*ST@{y4=M1WjTopN8I$qV{ZBz_(6&gSD)kDIQEvCKJyNz8sSjd zW&BH#m5jr=uV3!qkLnEi=|;EQ=%u9ekG{Ij6_VU(oT7cn6K*>7Gs^k}WxnQKULN{1 z>Q4i5sN{*7^uW)|d4|I5-0uKiUJMs7rqS-__)gJRr|G5Y5#Dao|EgC1UF6djd8^Lh znYHPz=BvlF*SbZ{x)^EVOYqPBi<7ak#;{hk7_Hi!u1J1yHkei+Z#?Av{UVXsX1>h_*#QD^( z-Sp{E!m*Vp{&Q?0sYChhU@W{a_wq5XSKP-vTD>ZQ%=-d)8;i}@%SOkuwIp8mCl4Z{ zwK`c2>t1CqC;tF2sBg`!-Zv1IMDA(Nr%L>^OH~(RV)tTqqtkZaps!mQNbk)J^Ryq@ z>G>u2$0M%6$NQ`^Y<|qRUtrwN1jaom1JXK8wMG(_$Ndp9>m8C=GvCSG^@%~sw0&tf zo$+MWYP+6b+mrr!eT@141@m&jpBI(krQID#Q0|?q+2zB_>Jo|d+}S)omhLXUF)@6w zK5=Bpa&)h;w_<$_459O<^7BH8BzuDTISgz{-bG>FT;0qVDGd&Q3scMR)dG(SKLxB9 zohbQ)O%kp&qDhbscMo7IVfj3T>#=*T{ZBpzuK8~@>65go7q}?(Ec%(?BKZ$K2Y%NYI}eWc z)=Y-;`aDm6jJcSWh(Sk)M&r)lbP9MH1HMkPt~bCZ#4Mk1w{zHosm(Jz{y;cskTUJO ziDpnA{!gF}`aenf!I`y**O_bmOYb)c-G&`mdLU3&>Tc{;z+J&QlwObYm!=B0<*P4) zjE$waIQLChyjrTh5m)gSv9aOnm{&LUit^!iGM!q2jUIGYk}+0TssLDYA|tv(JVk#m z% z2blKgF@sNxO?o^4^G=}8N^jT7mHPW<+_lb_KUwSRalAl3l}}Gjo%lP8yG&gQ*WT^H zJbiU(`&ctHW?p`e=pv6+z`n!D!?vJ~yBYoc%$BLQ8(!1nG_&6q+{$}bbqM>Evy`F! zr%qg(aIwEU&A6S;a4rB&8!liS&1B!13oSJt8bE7jk=B-*?&VB)fO=H!xory*r+-17 z@;~xuY+!L+@>rSZBh@#`zMk(C`;BxX z^)LGr8`nTwwwzsbdF?MBJh35X)~ROjM=hFh3kFM}1$6D~~RI>RVx~-iD zS0-A}OFn|GK;jRY+7BJXe*4)ECpw3GT8@6GZF(d(UOfXFBV-Z1%xxb&s@J&DHGNz0 z4~P8FyN{5*+VrQ_f2uM?{!10PhmbN{{yxxaB>iyF=*G4`zK)mAa#eY?% zISPO7?NNma3(`NoO-Em8H==u@vjOSg94Hg47~E>%a%#V`1^vpaN3uC<7pCv=@Gy2I z{=e{xy+bzzEz6oeq;#3E?irl0sSCDyvTTZbE{=uqTWMrcI_I}{NE^S@vb{maoiary zi6A7t4kT{`N*7J3r+R|ZTqJ8xh3ceh8B*NB4fIU{KvN4)AP3H=A=7+5A`Fv0{4y6 zsSV+|-Win2xd`5o&Tj>Dv;I9BB4jfS&_j~pNe+?<-_ZRaK84?@GvhnRT31>;65MxR=L^# zcK=WucxwFo!n4cm`fYZ(@mI=Nf67;a&OmquG@mcyAPhU($^PfG2Pkc%>GAfm>Bi5n z{_Wbz9GmbjsBpUm?U~D!*4pyUSmF%#t0~V^k6mk}P7L|x|LiI8?Gr~Ez3UbK86`~2nMzxCV}|LV(gYu@wRRyb1UwtDN_wv6|2aP9}UG_3qFI9F}b z*|(if+n+0(F=Ep_dA^lC4jvzXMzV9Runhay*oNu!a|ZpzpYjfauRM5)n>Bmi&(|eh zn#Mh?Z$9FkTm1_-aDJ~@3wvLbuFd@Jz0h4dyPfoDWPsoIaU^kV=%Ms~pSZ>YlI28N zBb3oXJUV0ANBUnPPUj&lSFIi^j)ME>x5eWVePoS>B!e||YHun&8ak!^?DO{{omJGc zzPg$hk99Tw@mS*;_L@!X%YGiMZOWTu-*3y;+n!@ZbWTP)YJ7Soc=l!2n9?`UH}Ad6 zjFIY68CIwA^7Bbw7c)Cw*_uSOD1KMrqtOnHYf-1!gZCZ?F|I}4xHe2%li2xb>3B{) zuMD;=yDzpKA=X`(@`=B!?_XxU1;;u*X!;b#9#rMghPE#=fA8R1%8pO4PCFhAe!d3s z1;;>jPDRh#whF&PFCXUYE|Idb3vVvWz8b7cc^ViW+YbE;XH8|lXUn&^DW7^cGkqoc zwb)nzIv^40!GMDzP4V_h@QTjGhbg-c{x2VXyN0_ED#1s(lX462DSyvN|C}_4&m)WT z);g{;j?<^IX;WK-6Oqrf)kI>R-Fl4wLEUpnnBt3bVyCtMZ;i~=62`34hY{(t)u88~ zGjoLv`02qBDn4d@vtZ^Yb-QWzYo;9TmCPE(eA z0-H0x?EOsgF{QD(N&41f@n5j)90T88{6^}xyqHOUgu4~}aptT>^JwFPWkk5cNBl(c z*(=7kImpgzUf~I6zei_WrsH6B301$&p^8{%P3Wxl^4Nad$CygTYA*5OlPyjTj+4?h zkj{>g{lizhvzGw%qCe0`jUiel#ud<_%6-;a?-1v3RnF_nSB5 zCT!UM$9%oT^PB5(NE=QRkY*ccENy0KP_^~V>)eF(J^t3RP~xp6hK~9Q`4w;1kT;Le zJvvhjj)Cp3No&>#-{XD6ZV|stFRf^C{#mlD@o+l^Ub&^r<@8vhq(=C|(`EI>JA(aL z33HWC`|&N^R*N4T`>nFF+hO~swphRFQ}y?-x2M{Q?*O&(KC^E0;XCRPw`U&Q`Bqo1@le?Pg8{jbu&ub*d=sd4_Ahg zE8O0OYa=BM*Nz~E6j!zNxZpTOnLF(KtE5A1 zVX77U^a<=Ww?(J7Hh`ZjJb}Lo?YHW-->jqY@8G#T^;|K0vY$y0HVcC|KFEJ%(`RbG zp33EqbC+bv_6T8Zv&TCF}L2>?c%@tv1w}+XUFaH+~cKxaHE%| zB{Xl69e9K_r*orT@(wfirK}CcAidF9>91k#b;DP`!lJpcs-;EFoK^Ag_AtCEcRb7~ zm;nwWt{@t#+D6>gtMiwx>J4v~OtJtU?~04efF~x-C9X7j)eR%;GfQVJyg@wq06GDZ z)74xbU3!vm+FGc4V9u^b&*~0zB6dvN_Zk6bM!}i$fSFfA$XD)m#_>gJnVT2}r`@JA}Ivn+^#VrfHwYirwiYfD$F%!HR9|4Sk2jgmEG;e(v9zp`nLOYb{#4& zJL~{9UaB`(=TvYf8K?C_63ub$Ts7O--iZ7|e2(pF_WBWTVDmH}R}(GGnT!W>YNz+) zjIC(k9Ah5(6!7Cq??2!qW|Jl>?~E9uGT(K!ut zi2BVlN%yC8f*zX`?zd}F81j|N@^AF*hO=oQ+I267o$n{IXfo9u{kpMl94KTzi)&97?Pq*cP`+p@ zZyqcjyq16QE9$$R)U#pk)tp#!fBhcu-}1}Lt|LO9Ri0hDd$Q_%5qjtzm5r`oly(kd zYo>9M&olPa@5JySB%Mp!SGCKuFDH?z3x?-TYVU(8GeBQv_g{3T;^m)T_4H!Xrh07O zZ5_ce*i4yj1m1fH9L1wFc8@w;9-36Y;>5QmcY8eM-u2o2X3buo6*kEHe$Wrg9>;vf zr?dImu?S=}GY;(aZCn7B=-TY`E6qrGZekcZGuVeep#1DP`OyDQ z-kZlqbzFJh_jUv7me?ekP1unDJ5~$Z30^>oanzC=TZ@+sb2l+r+ByKBAo8(0-CFAyFmOblsqTN<2dfY-+^%wZae*e z?viDv70_9r*_9LZKAGN!Yzy;TxK>Xt>hJYvUi7K{iN1}U!_fLzwm5XG!_%>2>YIf2 z$k9J>EZyFcVl8@#I<<(uk3xmV-u6+75^8mg$S7R6bCjC`E)nD~h{UpxGVXd9Xw)J=E*HgSV z`m);6?>rdKa@%Ui6hC)$jL~J7r^WiV5x7_RWIr6zMK(t9XV*LJ2dzZ*Y4$mO#NuJ+ z*?v?`Kk-4q&<7mO*Y921&#UZ{a5Zab zDSWjimw0dRl$sw~`J!Fl?yJN4`)VzPTqG`NrUkyY{=Xige*) z(AMzxuHQS)p^BJ}`)&TXLea_~50shp;3Uv6%_mGKCL;KCZHYZ^1_zv^dD4%f3 z4V}~FyZ*&)KNWksqzOI-@4tidOc6hE75q(025#pY@4md=tMTJ&^7V87o-?*McDoLb z?*-OmWn{J4b(@)w*~n)F{^@;t8J`(La(XR%=-0qf^&%f`bL!1->kKhQmGx+Kqj zQ2jP%+vNmY zBXuX}9`=L0zG7#P?%{`zE8eKCX6$4aFIYV}}&a&gPx5DURe})4{v(ZCb0;hg18wCx)N? zA9vzDyXTS>t4lTx*;e9B|ID3=y5G^>ww4&9O~e>IHpS=6|H{esw%zK3;^ZmPCo=vGxi7wjIm9f}cR);Z9#b=k|7VF1s_YdAzl#^RGXf zmvzoxmyK?cb<(Qq!8Touywv&Ev-5fjzFkpr-}mqBY?`(68pbr2w$6Ox=?y=LZ+>US z>7(z=jC{M|cHXQ1KK>W+-_N?G=fK1N`fNCR=Cgr^XFf}tecV0q>r^|~)%v@Jrz+vK zC;Y9Ou$i=0+B5oIaCi~6e2?#NFHV0LzLY4o`+v!rsQT(?J47Fx7-z*kC$IOu$gZ4J z{PciPd|!0QneUgduUQ&90qy-6<sbWH)Sw*l8F_LSBFtx<)|n+`0zV?+4#r#A!|C$(}X zM(d8IJ9h4#U@eT`V~}9ZN-4kF7p!ezP6fMUxR!cwHRYsVp8iT?*J!wce|0OszrKg? zh1_>jKj+&Adht={on!4vhI1crPE)C4=e~c-%kujcZe~3Wf&-GbG><2k!_TBdH`Fk` z_&)AuDgHXVCb~rH;g`Q>#~#??i>>~MHQ>mlk5p}7-@mIRoSK_zeXFAESKIF8-pMrX z@yL~q5^v)BtSIYn6qj7BH-F^ts53`z4ga?IrvA<&;Ii$;`{FE3#cY1kfn&!%o7Xk} z&OGq$-pujMcjk<5xwC+B1ODdBoOi9Itce*}m-_0S!(Ts#GkK-_vQn(Nt?(gWUiXPV zYPqxC%3G99UB9yW7wdfi@JRzc-?sA>tBumEma?*}lxcU`!SXD=d691)#QvjxNY55L z%gGz?&n|y?inYkl7WX{Yu9zx+-pt&9KaiVsv30Nb-}bMjPQ(8t;}*WH9;`YNuxFR| zQeTk1rk=!}@P<`a(%77t00*@e2Toe)3GRnnJy?CD%+4$q+!B<}rThZQS5m&Fu_g0_ zS3XR6-E&<#_@yJY_N?+U@cabj%PD{J3TtV@=dHSRjq5Vs^vaj5u+rZgY_DhyJyEgs zrp@mTf>hBNf?@RWSw7u6`)1J6$(wuu3``h5#Q9G@6@>So+ zJR1Jy>K|MIo=<-w^Hyte?cfO~xvVg~C@w)aZ=fC#kxNmA#a4xuD&%9SWkaJs^$SAek_B_JiAb+zK<;8sSUa8_N4zS`6aCFGaTA+?YZch{rhRR7a9t{8w2Q^qN8u}djTEs za>`$u6+zwcHFK z$~Va}o9fjbx^PqfWiP@m8PdJJdX5q=(i&%NixR8b8pmA#UVp1RTa#o9qhpNT`TF5E8436jGUegKR^p8yXAREx@9cQaI>cIz+$Mj}arhUx>uXoj=lf$#f6`y6 z`wtjTDRNZ~<0<7={XI+jKcTJuKj~Lqb(a;Zg-=PJ3@|tHQK@>&V$Zjb)ZXTf%hd-i zWOKcSy@Z@*d>dJ3gVv8Kq8X(R_J9w$dENDub0Z6*{9o{5B!4|NvIckucz0*X+=+8e z^gNnza9>MCDzsb)4W#nz@`doMP-Iu``bd5y^;zj|UEw9&^$UJ6Tu0gXb$8~5C(h}k zju)w;9QtmsC)TD>$LfXaG7D%oV6V$mo$bEVTE(227m3s(LtUe1$)nO!7kwv^FW--A z|1N^xqg5B4-kurrTZ^vk)_n^F|EpPw?3-vON1B|2D7f4f^ zK2K(N`m2$rUg&vrLo0nv^gJql@9gv4#doz|^@Ue6cVA|WX~E8-`K)2BDWtxmU$*Mx zo0@DlJ?hJ@4U-qVD6+xSQ_DB<88G-PyL%2iuNR&dga;mg2R45+FsB8+7=tgarfeVd zWWHBltATgR3f<8hTAgFB-xL@>y*1ENxyH6%8}3Xa8Y((8@6H zJAE_C1CwT?!2`+#NA&D;!(&7{)!=Zvm>6$G#CR(v##<3F-lU66R-9|(`V4EA#xMD_ zhIYW)UB)J#)8XP~1RfafjN})9S0})S%b$ggh8 zw8^LM%e5x;GH30i)%YQvKo%)O7HP0kYlGbNV|Y>t@G8JW12^M}r zc&If|b^n}si>RJ))_|TR_oR|)%?Moo=_BliIM0eL-HseQ4_G9>4{Q#01sW%IF|Q-O zQ@-?ovC0PQw5~wJ(jM$C*_!+O!QB0{xf=d$V9`x`Ca*Oq|EJ^|oI9X?eixfP@3T7W zSTkt=n7u@q(L8#k$Dbvu2rtaD)>l1m_TGyJ;FGpG8yGqG!!zd+S9h|$2By1lmkqz( zOP=mF(pnY<_Y>fLD!BgwxF605&RGZUcY*t&mDibDY-+VF3pGdfYSCSIdJBB!;*8XZ zWo2cPvaVtssmq4<2qs4FQXlk7yNWZ3lMZHb_c*womez$V9eyPD*>%(%p7g?|uKK2m zuCl+s*L@#E#sQX-4rGQW1}zsQIdVmji>F0>4$I$q>^Sy0&K~Lyj@=<#!d%X7!s zOA8*h$-i?bf4=e`wU?T5l{Hpf)BB1?=6+Z3zFimKS$)&qhRxbD7rTh;VaHavaM!y| z?1RjuV69ic7FFe;of> z>=Lc^`XsPeXQv;$^zz8Sjo942Pu{!! zDP1T06T8~6g*Q@XS50kR*(EP*%4MBz@TK>yUfZ^5kbRq6-?~ke*zC&j^F7U;a|5=T zI6PJUq2IK11|iV5cAB;Po1E|bN%j4C@9{h8n_1fpzP@0ET606lWz>V5xI7KKx(Iyv zIC<;nlk&06I{A8@&O7Cu@;|ldgg?CtnWS$EYe*U6R3El*S4KH~*Lb&}KkcYqowt>K z@AjqDcF^7>)Z2&LcLKRj^;Cgh3ofz--sLQJxd*2vV&w+e|4NInw*$;((PmCHXP%Lt zOW-Sf6AD*x&JusXoGL4S9J(*-`bEzWlJ}&AdVE-_n7upq(sxa$gkueTlvvr~jh69P$Mp2R4+$_KDp)dU#^D z70c&cBe4uTy;063_1-KwdR|2MOW?NIvdGXRBl^WsS|7 zG_RN2)&MfdKnCw7re|K=3qG|F%SQUR)*$sQz`HCv+j%bG+0ly&BX!k!cWv{g0DaD3 zefA*-c;(R;rQiTER-Xk<`k+7fi0qOf^PhWsmoI7W?s|4&q0hiY+q@TPFA0`2Fnj_?)xY@Xa?x?l^3_-qvFF%*K5PzeUsn`+3%hzLzBC7j z`Iqoni+0;n`eKdW*i-grbk_9W5ODr;)%Bzx+?q5iXHtk~-v#rB~dV4(4L`akEa3svmp1c;UT z9QSLjoJAZn=(m!%z4J&rS0BsE0{>q}ZXBi?`9H9CZgX#O5{!<)_uc|VZvdm+z~e{2 z?6s4bzZ);99nJrQ^s;BzjkZ91D_ge60orx z*a#kii(-q#sV91tSf#+E0G>8)(J)Mk_`lMFNu?EZ>RDw?X*KXz#a`dl)UkrN+%cc8 zwbM5ZSO)q!pe5wLuDhmp=dFV#?}8>1;O1<~F7Rlv5?VZtJXQ`ZUXetLmC)jI3FAxQZvGXQ zyL~Gqe}+Acc?hgI!A zSFlE^A64M}|J(iGOwmd1CtCgf-X|4Be4Ay=(s`yB&IYJd-^k;0vB@(AuZEL=UQO1u}|L_9Jdt z)>fx%kg|fK^X^Lb-7PcRcVXTI#@kDY8B$jQZw)Zli@{%=+3Wy64y^8V&T7_7?q4il z^E1Rt8|0h?_pI%bOgwlsu@T_IHhmB;j!z~II{Rweq;UF}8oUUow`{&g!x99H5Kj0=y|PDh&CP6siq zdeRDGE0K5bwd@P>eSp1w(eaD)-|+h5-acHT)(FNJgjeTUzJoX#Z(o3)X~Qo309hv% z*r~0*U~lpD-?mr0?#JHDxZa!+J^a#??swh-zd!BITXYh9&IWh0*1EKqo?&J5fX{P7 zRz~(LD>rMeOS^A_&%*JknO5${Qzu`YRdj>1@AVcqj$RUa3tF`@GOvD{bzQp8ThQjz zkEiE~7rw>%neLmIx^RNM)Y@w;wI4%|SdFbKr|iM(oZB8e&e+mVkhjUILtb3|S91?- zD)3D{(M|rKoz^El{WjzJ(bzt8PZlC`aBX<9u2vag+UR zj=aOY0MEQ)$DaD0FLpI$*I~m_oKNQ0*_$;oh=J{vf3^;7#zvs|&tY8@uQ#&K`Ld8J z2US~>S_@eJv!l&Ja+JO|b-H%4X^vmBWb@JaKISmFyw;!5Ws2y#c=YJ}mE@cF!RDP} zMVkMn?X{HCdAYH4dFk8%WVzl;9G}!(@b&bXOlw!cFH;=8T}527Zg{@Y(dJ>7P=Bo{ z*5VNLYCkH66g@5fF8J>1@40ut%p*3O&gx7@23i0PV1ymmeU)8z1^jjQpV)QJBb)4A zWY6+j=+nq0#-L1;Sl4c6cqYhkW0ez*)DYRV{L!=cU4DZua>Vud(jOi?TbazoFC#05jK;qz@^wB1Rr2$;G?;6;4{Hmyn=Vg zcH7xIcjUV&?0$2A(e6~cE+RNgw(E$QuzdGN89)5gjNxh79Egz?!p~_m{DoOygcXmgT|McG`_Pbiyd5oSB!?2a9?#r(RaXU!EQK%@`j42>8vg7VZ3i z@%FGjoAE}0;pp*c{2F624AhUv>69V5c>tKU)5aqD^h@8G4eF2T$^m9UU`HJ%=hlNhR^L(yO>^$D-5Cs^CZ!s`;`3m2!YZ4Q1C+mW^0#m~1>7FW}U67sI) z7feUSoV0VX#km>$=!ec+55Wol$M_@{&yBxGZy9w#mPugzdi?yx|8~oTo1JD)U!u@@pw$+m{-U9oHGV~ z`*{~)4Aq&DU4ik|(rS3S)@9{sk7P6)wQgo-k33_)g|hP9mw!^SZ<1L%80&WNdf}1r zVeG|sZa?|LC)(X!#XhHeageDTADl*?_Gn!GBQUM_x%F zZx&$d=s@;SxiEFI=QJRDHQ(fGFTvRT6Tq9Zgt2yXC1kJsKl+L;L}-pP4c%xrdIx)A%hytV9_4rAN6`T<-+Xao!_DYV*rEC& ztWCFIBXP=KYSrzhy&~)aDu3m}FQQLP?t2qo;*YVx^cMP5kA20~Hx{>N-U@zR!F@vN zH+=VSC32FFZ*Qiq_D9@)ntIen`4Jae_SUtGe?E0LP#%4Ac~-WS4{l)7a{Utbg43!? z-ht?s^XT)E;+v&8oar*en|8 zlkQJJU!@*5?m)1{t!E;XZqKilZr32Z5nkJ+E^ zit{`ymuY|3^`~S1>+oDF^`P`;_GVf)bFW@-q7@5_vtvJ_{^4(Advon^!+8Ph4X*t7 z{yjg9o&AFD!to&okMtoNYziE5e5{?jqo;6J_+);Q_)X+TOsyvF-D(Q*3-C+fH-X=H ze&hK0`T6)kyG_=%5I+9fq34+|M`F*Tv(11Go?)#)H#@xFH?#FbG5-D73f{yp@Am8hKR}26Qj!k68@qsX=)2K5YSAxbSKT&yO771+9l92|@Q3Ko zZ(xHHJ=LOXynzmlU((4A^u|lT<6G*(I}_OX8o+mW=kos){skhjs(CJ710I~scX`U0 z+lzr&5wI(ay?@U?b&Ai8b6^_9=P%S6BwkZHcQ~wzwrpxW_0=P5=u;nK{MzmKF=D5A z9DkBqS+A#9&sMyBZg<60-}I|a7XHQI^p`ikv-IMZ-#Jux?j8A1uL_Q9ode!Ypl;!O zBj4ro{0S?i@9fo^HdPYW@y@TeZ>p>%z50nwe+$17j$6pZpTm#R$5?-hed^(_+e`lv zf0(1S?8Ado5AU;sYs%p2fWDaDkooM~C#|;Y=+nOgFLchWvNtx;*JyChrl1wvx&>Og z>|E86FHEp@TxL%x`%UDArGwVg+DEg?&UV8?tRLCW{sww_9oQq+^kE}h4j(!+K%A;i z{7dD|v+U>ohFDwe*iP};S+4oZ0=BYK*3@V3)Ocm*eKGKln;xajN3r#`XQ!N;PdyWX z+t(gG^z38YC-vR;KXqh%o7HwSC+lQ2^$0e4Z_(GUO&pi@zpnYnvPZvVr9ZmF%J^>J zXPIBO$F<&UMe=7&v)Wco#kU>W`xN8+4&z+o;e=Ul6o+pfeD64Z@Ksj9E8Xz0_n>d( z%O_oNbQEJ=?^uHto9`sUIp30+_ZIKn@22xzXz05t)&;jb_o96OE@~Yz^(WW;Y5Fak zTnk)Ifs4&IMs{`)hbAjQOMuj9%j#;Qiz(?EI{ELvhG}on!mA zOl$6}S`U^MI-!w+I*D7<8*KMw05$w}L--v9WuGwfM`7ZAOUsJ%$|R zC*~CP!u_k)GpRe zeRuFD2~NrVjiht0J9E2-yX;i13LCe@qAXXiNK>GT(vQ{>vk?Pb_N#(>+< z{Peo>^UCkABk^DK2#su?4h%=@P|B0uI~IR&bO^uBbJ*}6AAD{&PDwBDars^Ju=F|X zg3ev0hUV9@uBTx)YrqCC|FF+6M!`)qs(939j=Md6(Fs2^-#T_^zRkMAu4C=O|I5Xb z3-Jy3=;9vu#t_Vb5%T5G9CW}V1Ovsc3j9{*0om&x;z3Ds!Wk0T7||;ayL#pD{vHr z$CcFg^UvE$W$XSq_DLsC?;o(1nl^5I#MO&7Q}))^9z62G_|$`C=talbU!nbc=^%oo zDPO5QZq{k_vxI)4XK>cb%D)gE34el&6+iCntG7rm#dbOee^C0K#`m(f-i6MO{FQze z>s$MWtZyCI(}d50XAY@sNj>yWdi{&=`1Z}%=iw2Pm?y=7c>@2eAEHCP6r9r9ZD+kA z+wERp5XN>}unRqk{{dumtyLeyN37W{A2H|ss#qt4Z#lEhr@6nUKS#B`vYsAgeVxm> zapA4;=ZyR=Wzln#Nw!18u|rrNfo{NYi!}k*pIpISRN-9qS@>`B-{DEzt8RFbctHwl zyYf4@Ki%Xf^Q!pSlttgBEseX#jQgALQRdr>+t3uY$3>4&_8MsEgJ97y^+Vocb3gha z{Huy}Lj6?R;`?>17qZd)uQA{f$M%^Fm(8rb)4 zk8t`4k27WFk)Q0JBmPJ~M#xym<<7IazMRiXKMa?kg%8BF2>wV0Kf95WF8)1W*YVpA zuCs%BOr6>NZrP5W;rU6Xp9uE%m*Z}kXngE4-A7Xvb;H+BVb>E3;m7B#6Osi-+xy^A z*lGW8c`=I2G@ZE-50t#fnd+HpH~R0x{oBHO2WNhrvZ&d6AHRUSkxhLD9vvrA7Cr2h z?@lVe(yOln8OoHE4PEVa|LbtOMP9k8H&Pb=n0mmO^JI%@=xIm5MV;rCkCnkUgYUvS z^_}$=S)8-FxshEnI7cWyCR0{@FgRSL^9p?PVYrz5t=bq1w~wwSmL4><|1mqgH-)`+ zbaA7ribe!?=5nANxc@ifGj)#cdmJ1*gKm!AH}t*EaR1u{U?MmKSSKYT$p+@G4Q_1Y z)2t2Gf>UQ4`A0rfZj5NH5t~`-dN>cWk$JeE`+AbUtAd9}PL1*onf62J`dx5QWus%r zIpErP_^UaBrz}QKcVO}qFp=NA`VykQ1~!tj3|@d!;1B1MkPn^M!_-mb*}Nz6ZF8CY zG4qCSOns3KE#2AuF3=_aN3}V6{v?CYCuh%Gef$5@K0va)eJ=4ia{^B-1Iv3 z-Aa3+6BFP#wz)LqA!B#H8@cg|k{7YBcZY9$a34N^vM<}v0CeEki+%ie?8P>Iu*eOX zCu8f@UX#ko4!xguHTZbQ&ogj|g)ZUR!ISO4?z|`_Pk{G9&P)5+B)dsYG3=8ZyWnX~oVXRV8RIOMXg>j7HT!}GvkI+~HROXMhZmCH?h86+&e6*b zXH%bOLjS9=o7Uhrro6Fy_hbi7_T9tYKBn)U?7;HflP^`W|DIrTL7zS3@!I;#jM}i3 zelv4W`5I><8`o!67P8MleTC_ER{?TL{!zC-VGr~BD2 z_^}UviQ_LcD!$wKT)x%@6n29TU#sI*Wsf;fAKr0%f=4Yew9@> z5q%E&zoz}8_&i{5ZO_GbU-lu|dCzavOQ)&Ao~eEmdi}V@*HO_8&wL%)ZeL{8LHEns z|B{sN+VAz`biOB+L;Y;NS6wY>k5wdimcNRg2l$`C|MuUd)wMAH;upe~s&V)(dH*eR zcX;it0CvPMKS#IWTkMea;Ga{^S^nd1)n7{f33%@b&PJb@7O6jRwN-y=T4dMz{y^?& z&iY86-|h3&mC%-5`*5Bali*r~&Ez}SiFW%g>e~ZNX?!~vTO9ZqJ)k!Ye-?Om@70m| z-f32SZ!P{?_u#)Zs!hqW#pq+&pHdq>Z~i`L&LY|e-6!1OF19aBU`|t*+W>P6%{`PF zI|nX_=CtPIXs_L$yiT#+VEgE0z3F8Qo^iTi!!BatohAm{0I^d_fD8Q{kbcX!?$x(~ za~9hi9n5!D( z^i;^RXy$#s)wu}$Kf`}ROK15nT51@gCD(Qpb!f@`pA9X&yWo6UdXH}nE&Z1NgPh@Y zXbJzN6Wn`nVimO1WYxcWU1Zl8Xo>SS&=U7PdbBjR_RD!@ETW}2c0}wtZG*lU4lNnD z{*~wnm>T)4m$)mv_(=9PK~Jlor?kTS#FWDP6QkM{JIZF^NtT*0N9CMhwu$PjSUPxCD&(U1@%K$Lw+*Zo*kL_qs=7P zd3z}ac2S-sE2w{N+36;}?8XjH=bx2g9m*LP+>uQ=v&R4}Z~uMxUb3FqP5;Cjll{F$ z*C9RC(z@x{FlA>IuNJ>F^ErC$F>->LQ`yrTU(S7seeIs{3vj+Fi0+5qk>mT21McL& zC%;PlsnAck9c)d@wqgaG7qqcml;cl(7jn{i#5AU75Kdb{9Xcnw|TPY3yt5%tOUluV)>OPEA#$^ zGH+4lEz10YGDm^&n~hIq9tFm-<*WV|(o=KSO}B^_%vmTqZR=**kPjVxB5lyByknalWUm^N5+MZJXyqEujypBwh!?0arpEJ5tF(RKDP@2YFC7}~O|s{-lWcLvWD9bqhokpGaw?A-Em z%a1T0PRxN;Y{q?;S@{cY{`3+3$1lIWZvoFsZg!sgKF0scOPv2#Ty(>c$7}A+>$}>@ ze`B$gUp6VSVO`DYyc5@1`CU_xD+{Q9j@8zh7Og0+3FnmrOIo||{Y^cYmA9JrsWv#e zD$>u~>mJ4Wz*MWA`N}V0&p&WEcwFrIVkzF0P5O7~$3?jB&++961uk)8lIz(!Tj$(o zGkSmgG`gnj7g`4+_~#}2W6o3mSkF((E>g@GZnE<4gC7}wev0!4#D-~eY$nX7iRs6> za&j*HRKDgbc^^xAA0+YAm{u+%(#TuYQYeEbz+6NV->8 zxKxEb*5J~I(hYP9%{qFw`Nq&qw`U)fj%V=X68=lifN?uoZPG8C1)QJ77 zeD+OcL%7~{bXA?RD`dYLZcir9|ohchZM=kW`Bg)w`16y}KhGP+r z_OUtuEJwFt&JVT?z0Rn^Yu&l4);==) z!oXxL>yObBBk=O%`84AMKb?8#q^@lKJGLQk&H|6j7>DdF9{xyB(nW${^~Th0VW6?c{O z9 z_)DzC-z|*HRj`LWc>b3%#u~=BA9x6+5nyHXGWkdh!+G|Q{uS}`!)DgA^Z2>)E};8y z7T&?p4#uGPtV4ZAC)9lJr)@KC?Ke5|jW3KXS;L!)WSqCaInAG;y(l=P@e2Q1`dxjy z*Bh7H=CBS44moXdpKMzv_ph6=a(T7r>;@ktC;VP|B5}dobyepy zTwC>-+iwD2ZUk>Wh0RW9B3wIi2pkcglzgExj(RrZeft9IX%HN15zpA-`j2QI&^gm^ zDSO-K<^@5!j&mB$*#_b8=y@tZN7uSr0&Y}|vF_rN^Nd+{En*-^7f*(L2{6X5pIB_V zXKMJ2hv+6S##}{#_j$a7I)tws?3bB2RGpeXi#UXeJEm{q;6(ts2p}IC+3*B&@&V^X zu8B~G8#mZJvtsf5ieS0Vf9UKNQkjP|=yoD>I|1zbU6W=l zVlVaZXgD3?z2Jn+X7M+PV|$zC0{PO|Tuv{D3{0PjjLF%?85!897ehXYxr;J;h3)BjFvp?^nTOp6}wP3wNA7ki}U0G%nn_bIF1=onGjI7MB( zz$tm}QFTS3;ds;DB|T01mc+mA-`0B>GF>@%*R+ScZhk(F1Gv6&XXryOwx0p?CXK@x z8?+T*?Dfze`ys?A(%$B5XHRsV89z9r_5B*|(RA%+GwH`HM@Cegto7FlXJkV({63y+ zV`5Dh4O_#5qRt+yD{sOB9hqEhoO|e2aO4(ntxH z96t~B!SEiPSsC32vtCBu8!oGLau;Q3cWBS;>=*tP_?+(>9vD~X#1?}74oB#xXl%xx z7RF{)72!ubyU%*+_OpKcB&+vYZTBD39k`*^>DX2R{+S04a3)1DshfctvdiIKV3}L9 zBCpb(UfWIHT+R$+VLw@c9<2IpzJWi4_VAsL|K?nyx5gh9y=F6B`3Q&(dwq86OnB8- z@P|L^3-!rQP_fA1Gx&t#7Y$GC_GPxNpl>D)I=t!{`9J&EgH(NM_*S%1J;Bbe_7&#W zpzjuuCK5TXzej}c8yDW zV+I$J@6VD=BaYp`;JWz+U-~Ei3ERhO^O0Ynu`SU1qaH3vzM&4sJ|H}OYda+JgO1ISvOH`N`#D*xeoZSEaw zGuW5^Oqp}m@$etf*O~vwy(##u5f}NYUSciJ8yC$u$$n$IFTJm-%v%08w}}UZx@6;% zZR7>cG7(dUJ1%t2YG&83d}*z35GSFI#qV&eu7% zTX~n>ex6+T5C4)gMU(ng6k;D% z8yf4UXd~cn-NxBK+Sy7whnldlrueLoWZU<^!87pS<`ip35%tZbylfF_PxI9XZLiLV z>?)hEb5X%&WI3MYy9vKt9!vplw!JXzCi;pT7WCV#mC#P)I&1ms%;n?QmbU`WyNTnX z_&(a>c5K_sQ3LaNoO!s5`Mj06e2KiDGj9#drRKR@XVA#2C9jpaY$&{;E}BOyHT)4I z%V6(qyPLV~BSwvEePx_Q+q!UKu47xbeW_#F*2B>JZy7KAVSAPKMZt4Jdqtuz?0DT* zBUf@B48FfS=x0x_^-(7_WDny_0H@rGyWwB5Kg&u|Q; z*M0qqz((i7~t3P<~a%}2~^;F3iHUqaikTb>akD+sv)b=~EQEs_ncuYO?*;&gqp0Ksp zDFd8VQ~oa)TOKeF&Xj;NS>W&$*I3Jie}4?#1pIRjw)p3ay;i7CjOF~bVve&`H1eH~ z@1xr5M2;D2t(bcW-&=Et6*9}&qiL>Pk*7JTLMOjYYY^w~jxk0Y-&`LKhi7KG=Q|ls z_Izuxvo2jadc3o{gfsofIo3RD@pb-L2k-FDYL%~{8Rz4~bP7NNCDZa2m8QA(=w&f) z#mM+U=B<2+J8!x_FN=9Q&iSR1X=ZOFH8+PjQ(S>&KX3z{eT-!u`zF`qnyJ4f5m&G$0YN&Y;aX}h63WHHi;I&1>saVKK<9FS%>Zb#y|hv;LJSw zV7?QN(syzE;~kt9t`R2&e$cj;vg)t;`UHDvkF)07^TEX zcbGn}U=6A!mJDNEoXWY@G<@EP_gz+7c*D}yrx3T+THIPzeG^@csAUBPpIb|it$ z8-Dxf;l$wJJM6c%2KX-PYt~8P1TI%hRijTukEA$fnG8-%VGhiH?TeWIqG|JA^JM;O z&dq;wv?e?<0ScvPku7Pdmt6&I$Htk5yyc?h{$x7z^e0Zv9%YhetHg&20rrglETGnLcFQDCH)FYfyy~E{ZIC7!- zJ^Fja5Ri>!xa=&)_A~tKj#+CHw!4tYmtDyG7u?N%_ssAdXP%F z+ahN?dK{kfZ2=Pj2@1DlAo0hpG1C^K0@6g-5G6PLX7HcemoEE zn}F?h2D<7@boyE7_Or47WMcoB;MgJl#_vBg9lc2X>O?QI6nB9;(Bf-}G0z<=o&He& zjPb~Q_!}A;kI!@WQT2`CdmSnEp>7|151YhK{LB0GPIi$v_Zh`6i(bD7S&zFLo%mG8 zF6+Mj*qrF~_*-HxiDD~h?xf8_e+cU`E-@?z;;u|~D}iyr=GwQi z^&NK)tmc~)x?>EOR&8ipl6d#V{+bzXJ;nUi{tS*fxJnz83yt1m z)VJn$ANa2SPhmSU_jwKO6RmSzwP_e1qtJQ}a5QD~P4fPesjrIqOzeB*jhtU>q{V(` zK2I^ffhw0iG=~;e@7^hvQE%=Rzm83Gd`>%Jt+qU$i63+XxC&5_>Qs_eK za86;9{)_hEGq<>O(e$$=(FxJ(6$`Ef`wia^?cv}DAU}qlEUcftv9O*yYFr#IE_86bkazK>e*zExaS8b8j9=|mIreRL9P+=A zo%1wxw)@=pmci-=@;b3&)C>;lj^jhJ)$6-E?CZC`DPKuoQN?j7!(2FdS zK*mf1uC>5*J#f97y}tFt%8lAtugETE##qkx$+!e{gWbH)EAC zdGZ}Ivc;f(9Ore|H+pCaJi<@xS&t`rxFI{Y=FY%d`&;K8y3LuZ(fBY}95|%1;t8rJ zKHuYc<3UV&OTYhIwCqVxGp&j{5$OP{H)}sJo=oC+R*RV zeB#?P-_+soHRT!k)s!)*xo0-{J`Ar7eCx&o^J$DBL`?eePF-gI$b4_oa}Oao=GQmGs#e-4UOo(d~#I50rpPXtexShtj+hiXFph9^X)^Ff0we2YnNPT?1G2Q zcS$r98tcv!!$$BxAT|9WN&`Q~mK&2@4N7`-6IQNDE z1Kk^Xtk~_BzB91>jsGLgIDSWLHFH<+DgOj?q4DgcjO%(2I_js+0ptYnrNL!ZzhG|W zUof}5F{xhJaFn|L73*xK^UOMuFF5ENjo#^uOL84^y*|6&xn=Y}xy*_YW!$raDl;_K z%Od^N6;{7|K*$dz-^XOmTWVa2=_mO_-!?_8Lqqrje6+uK%#}Z!JCCt{om>G;y|=0` z)=NBR%kI8DJ|%knesEf_-Cq&u?_Fm1Kb=~rHEv@!cU3dC0m%=q?Q`M%U9aDag?Wu0 z9(^`Lef5E3*hBh!v^9F3O^nB(egbo~g>&A89J7;|?SO+QcFR)ow^h;8dFewx7S!bA>FknZx-vV^s^>!9uW)QSg-+Xvp|v8&TH)GZPO)yBX1!3X5UrIn|1=V- zK|U}rz%PXL&j;Th2b{-uY3)DjFU+s}9D6$0&34{X$i33w7qW_DtGExl8FBKHZ7Vt0 z9OU=xj6rrD#yg++zl6KkehaVFx?*FiQB2L(fZKlqv)_1dG~+h)Y5#;XWCOkL`mjl0 zkC^r|+QsIGtwc77-U8$XW0Od8Z4$lj7WG$SlX%csi(R`-?+`3>Mru4ZDOYaQ`l2>} z3hf2(S<(KL(PcFDR2jgd>NBt%bM8LBincNfB|59hIP%zChEg$ z_~g7cCpD%y(p>$fHZ9f*KfnjhnU^APw93LZ4D7P~?04fc%j9*fVSlQ?KdW!a)!*90 zSs;gh#8XmZy~5Gk(_*J;Cvv6>zdxs*nO!TX$FVV!r@puQi8sOgVl(TS<-h3QL%xd~ zd%|)5MP11})70JZ_54^bb!~pmKBT_PGxeFay*{h%xYx$J>}m9$9o%8+F!zyzbHnQw z<@v_h`!TXak7w7jvq#FYqiLsVLWH%|#eLmHmV5`9*&7JJn`~Qi?D0fs)}G<69b@Zp zuI{4m0(?i`La#y}TH}-Nw7it@E5@(hkCf3|{xRrJJ7nav_q=%*Y z)4OE6{e5)686*1O#spG55!N50hYl8x+hyvNPTI)4n|>sxBl|SAUaECc{AL|>NJk91 zvK#W9VmysQ|A$X`XMI(-_;vg;7f0Otxn17XiEJx>BFVlT$OF>-_t57Y>Xlr<8dA}M zFLa{G-{0s%*JQ6l`$W!t$J(D-hVSh%?m|9{J@=`I?7963?mE)`hGc~mhok71?j5G; zhoMVvyrE<|FmZkL&geSHuu#5%pZERnv;V6~(ZPcWy;{qMIn= z@@%c4k@A)st7S+RTsf=@hJlCSx6%a%(X;61kZsfOCez2g%yAR#s6RRC4|mI>qq=cM z=Afsc)9PLP8}7W&uQu*og;yu(klvU&{vaLFy(4|(xZF4+zqcH@%I(wp&kpky@sUPi za2cIbeK$WN0~j4b`9|hEJLuMNA-U7>@uzO?plb7>FPJ)&3Www;!2eKol_zgvBZv>J z$yQe>FqTb2WzMs4Ch-bWZ||JK0rpf*W`pPA0OosW(>%+EM` z?9i!=KgxTnielPdbad2d(d&gXs*5?=6(AlX{`2`iNzzlL#~-7Ob1Y5ySP=CY$N9W=bSxj1+V(|d6&FyYt0oMt9)QdU|G#SeCbH|;_40I#%WzSh3pqz zwC1l9!YA%lF>AZABkLP$T=$)3-{}8Dyg7rcpni%M<$xp2@PODneAqpm?{AnV(PYn! zF8swu8o?nG%PsEZE3UiNcw?{M{8%KvW36MG-x%MGtwwe1cI!Buf{gCjZPfOD?z4g> z^3UMQW9%LW*w04?XzS&h9@<0~qV5p3hM8T@F(0pivyy*%ce{G#9#79S_Ml$M$ah6+ zNL;w9_Nikp@`^JrwA)OX>LRPYS}FH93pZR|P~!4}8$4c6oPv!!ll5*6>)l1rTS}Xe z*HqUu;70p9R{Z(!euHU4=~(&FA2t{J51DfE7f}Dq^SOuqnD#!0ef>`C{3))TpMIRV zePlmW{txNP=yvt}h1x!I`*7PMWk#3JCp?>%aA#ezj}_{to~t?MQ8^A8AI9f6{tbG6x_H>uYuYhuk$EAz{~{rThD?n9SZ3=dHJ&H-#A zz373n(QRg7m$HMAn31{ii-{Ql-}x-M&3nZY@|E9HJi&=8qx$0f?;+3mPrZ7l|GnRj z49o_O#a}4QKkD;yjX5;ny-OZfJms^oQ=hvtwicX_eLwl#m$6BiKC9hE${h1-spNvt4c5*c#-ryie>F))2Zsjtr3~q^dY{}k zo=525Dd67dyvw{i!A5r6k@gukj;8w15aGNRzB%uCcC%CPTSW)XfE*$RKYh~>&$ z*rnjh0cYK09$Xo2nw778vjfyI1Y7WBuVfnf-HWZP_dfh>9DlU6OFGdNv_{4qTNZvc z@5-Mndi}>3Q!n+KIxK9dK75v(I;IuvOgt0GkFTQaO1@dOj}-lG)z3)L?`FcM@h$73 z?$y+dKUqHZv7PdPfNtBcYy9{C=X(mqTMJK6rjL48?^%~Q$l1TNsqL8y6bS^3$P)Pg*C#*g?L@I<0(- zc|T)sW)9jN8Qay14NqCYHD_VLi$p`Q!xm5!VTV-xUqJqJzCXN}PKjSS?h zHJ;7;Rpv$SqzlQWqO%Mm_7hX0*Z-TRmt|uMkY4s$v5Tj#!khH1>@J!EcC*xO6T zUgSg1u)B;MX$9}*yKRl)5$>M8>NWe>otB?7u|DocWv!bp`C*tp=(*81!?9a`g!UEN zFgU6E*9qo_Ut89E>!bxA&aGLKx0<`Ghym#O#MrYAI(3DI>*}2x&9LoR<;qw4hPHaB zNAqIvQ148c(f{>qeo6MT5w>l;AFa14FPj(;JG`~C+V1}wQ}mFuiKW%Q+?c9h%DrlIj%hpS1#<>$GvDgn=+eucK+kLV#=r<`LgT< zzx7VPj$+-X=GC_an-0%=(QBXE=YAi+Z%y*9+pgCiuT4{jYioDyz5)DygUEjH@bmmt zv$IFuxw_n==VV`OLno@+z<2a_i}`MJ9_7!=yK0QQ-?!ZSF}|HWMxJ!Y(S1oBBX6vB z|0j8h!!o*E)yG_QWk){PN1=-M!g=YGN;|R}-Dk^9vpd}PmhC=wnEa@l-|dyJ@}8@@ z-TW%=yQud*+sp6vzK?pTHPt<15`b>;NvPWoT?X*WHF!fjJLfLQZcFFm+`6?-lN_6z zv2N_ZuBx=t|M|SEI_v@P$t}g7-|6K!XGwGhL~EMzG%vAfpI?Kme@*P_&*#-#Y30W# z-_i7+j@(&24|$RE4Js@6Dh*g~ALfihj93on<*uE2^cpVNIm~*}n^O2=#a&;)czV(Q z;G>~rerfdO9Lgr^6pfV6A@08XduUVbp67#F2prTOc;$ATf9w&=ptV5I_5G-xVAVGx z%c|dIov-n}sYZ4(_QYg+r0UbJ1KBIU`cd_m6>FI6`gm1KHU}O#)WP@IHod(@|M`Ai zszd#W&vfQ>V-Wlz$?D*fA`ACL|=FpZ%>SqDu_i~E!O4MyXDX-DZE`s=jC+M;yyyu>_xC>ajPeb6_O6O?vnz9-`61r7%+ zVo;3ZYzVPp1D~I@EKnHC4XjAb6%H`}yGFM&*8Gb<_@a?msbYK*6Qs!PYbeN_#KE97 zu$O14aqqd?ORK!{9p3wFFF)cvN4>Pl*eHZuMTV5LR^1Hp~ z3*n;p9&&ws5I>~V(08uY{Z5$`f2Z`)1DmoYStrS>C~a)XtbtzfL#?;KH{DlmB@yA}qDwc7lBl981!IEUzNn!^OVGxhV_^>MLP z7eua4wZ|>3Otvw}A&dmgw7sWy~>p05E)XOKt+lsm?ctY41Ns6Fe(6S&-*nksjdLiA{EaHA8dd;JZC>X#ue5<(W1A zN$fan>dVdCb!PgaHfMNqF@)>hICXYWeK>(H=0VD>C!NIe4@lqQS$DyPiRYGOPp(Zk zFq~K$bJEmW!8Dnk%o-EpyR(d;hE(zOTSyhZsFYOalrJ>@o4xrDre`~2LbqFAUnx>f+cUv!+vz z>H`-xbGAQ7UoO7@Ov2<}2$q^3>7WVHi%4UnvbVL6&LY*A1?y6tLH^JI(hSlB`8ppS zBb}^#(ut%syr(T^4w#!z3;E(prKF;tFe!RMCm|Wv&dhhxiTw^laUMXWlDq^zf_KXYGitMV|7p zpFTMuc5s z=0m)QdW2KvIS5UN2e*)F+%3HSGO*&_;CkRw-=cLoga3@*_`QwBA=4kFh3XS?;qWr* z3Xj)XVAUo3En~{83EI_ng1v$52i3pAt6%Ua<461xXPr@d!G&%cs&BNsQR9vC!`kTm z0D1lop>1T8Yt)bbsf=suMAc4}JXE??b#o(&y4>t+4w zHD--EFdIJUAI1T}Mtz-1p1~VuU8}Di`X&gh$MgQg#&5fA%tl6FE>f%3y3eeOIUmrb z@ai-%%P!QX7(Dk4-oK!=@k;z;NZ%mMvPZ6guTmzA+`> zl%^vCkk-JbpVu?}z_1$%QctH+p1-Gj?q&EcX${|RQA)iXqz9%&EB=zSh4SA~KK

  1. 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

    NI`Er_)4wxI?ciBvgw_k>9b-^F%(E9%m zV{?p(Ch<(adB6ghux}8XYkI}ihX>_{f)1y@uC?|^9lq29_%EWzd4qcY72DF!FW|jD z_rx9;II5oax0&;9%zXd0d3O82Z^O;}`JWgl!Uug(^30u!Ip=N(zUUW%tN7Aw`#s_r z?HNv|zy-w}{S~wh9{FAM>j@tx8YXdK;ph4E%_Lq> zm;UEMb&=Es{rHzBR;6|_hhxO$e7t|v5a)jB{pvgLV*v*i3BR_i$)>gtE3^bX5Ass; zjx~{nBJYZ=-~}-y*k#3Y`fCUMPa}GtRMBkwU*bV~b!*1a*>n2a4a_;NZ_Iiaurwvj7)28^bCrYE`qw?x=5<{# z6X)A4y-K&QiDWLg;V`^dU*^tOU*-kxaPDPjTVVt97VJ%33vMm8esnSX=v@D5;EC1t z5!S=jZ=y@Bk42Va1I}#3j@uN-P23sqZI1XTP_C!_X5$+cB^T0n2SUf=JMGyBapJh* z?QOM<_-@PAXLP(H_M1Ncn#PJv7XSa+4T23{7cY%(Z0&%UH}j8#ILGJXQPmx1si|LhszP@Ne?_tx_y?x@e%*I zzB^cAV}5n7d72oQWBgk3_b%R*j{D!l;7wIlzhAZu*1pwttoE0Cg1y9F^>S8cZw~%a zd)7oX@l2GRXae6`p&tX5EHv%e_CVP+TKmUf5txL^&SN#&A}V8jcrk$^{+aL-gjvCn%;iae+s|E``50G z91U`o#dEZ|E|ANN*mfm14Ef{wpPR~(6-DeJg|mB`pFt;g)XNQ46?VmUh~}_fcdR$G z=NDB)kvA?bnp~^uzs9LCI=JM+k!RD^nc|Yp+<5_O^MkQTT1#bLhrh~$vBvH}JH8Ao zI?R0nxeZ-CIf&%Hb3gEi<4=)l2Zrt6sEy-Ok!pXq)|?Br-OCA|UB6m@gYFgoC>cZd zj}OmFc2IXeb{UORWAA`QY1|3XC&rzCK0OJ2dJ4LvZvs9qWMi{$f!^Eqw6j1m<_Gz_-?rD9_ffm%;|DCQnDQO5G{>|B9_8=H=cGIJ z_WVqEtlViIM;qW*brvD^?$I7{{fh<_Bg1K3Rq}t^A@E3L_XoO8acy*c*a1y1n%nyo z@aBQ4b>vkDbsg56Jp^pw!8C7Lzs*l@uGQb!d1<+Loq?&rMZf)D+)|c|7p}Lsc+}$J zFQ`*v`Z@UbKdJLy!NGpjt!MP7VVOOPto@s7k`FDuI$1T3^AC^}ikPdn;ak^RUUr*gvs*ur5+Xf!=>*OtO_}EdBmi1{ur0 zFc#rYYUeEa9P2%LeqHaePf*vd+4DQe&GtwU?+SZ==8x6v{r*_b+_ET{D$>3>2Y)=i z8TN8%>A#C&1|QA2Gwk`fs&FKGad>jwDK2s4e#<|?I~y1Z7JtZkdk;F6c*M|yoSr=e z95iPs#yf4U+8<)g?5KSJ*tRgXH1KR~kM_2~Gl;GX`*Zabf3EI3NB^_%D5+s|_w5$0 zXYXBP=1${j7Cim&M1i5!SJaHlj^`BPf$ueabmz_)+EG7srs7OlL*sG#Dfi^0D1@Gr zvGx|Q2FqEC3*j%Vtf6&M-UB@ed0mN_W5;gwWyXCU<5rzp{W0oZKZlp@|C7*1;bcPe zk#Th#^>Q6PPCgD!J_SCi>~z|28~yn#{koO@-2!d6+2|Y2xenVaCjISueEwhSZWn%y zT6Y1S={%6L0}IH#Hoxn16S6Ho$D5sI?p$2b>p|w4a<1<&_QK3cau1@PO0OWd75waS z>|rPF4CXR-2Xh|*jw(CFL!+ni;UHM+{yCMI|5GDB#fgp6v&VTBhHuZFWuBXY#>Xr@ zumC@b#p+kru-}Jt`|Z|moV4Vppc2e+7s&ANbLw=qC_4f$=kY;b* zfGzFTP;TOmP%cM1HPuDf^TA{KUCF)5n)`$HerPtiaCm2)Z_ydUk}teNY2?hs*rug( z{w_JSqwAtu^)8I=4gE4X(<8>_pt0nSBggoM8GlKc#!_O(f=|#8ddm@PaCR)#*FH5l z7R6H7oC#_pZ~1_%Z@B96DtFhx7pP%~NAU;3oA6eK( z$-S#O&oXCO#+f2NvFv%)kI3Rt`WJP%6U;|uq%OCDdEY$$2J7?tEb$P?pK*L}Gt6gW zXM>Ti&NpSEhgEMJnkk;n;f?$qWgD;Azti|rY8*qrL}m38Z8q1Vc77dRJN-_o$i&7x zb_%$5`@E89yZc_(iS`P^$8ld8Cx+lg^kc$R^l7h_zze#uc5-ITsE-dPz=zDnkm*N< z%cXzP?t z&s&DQ^qxd*`e1#o;hsRYS?yHMk3{juN{`I#^5%V`Hu?_V2Oh4yl)gu?-$x$`_h!yg z&lc*@_pOiAX82xxP1ASvOFDx=)y4WFKeF+!8=)@_XB_^jjWX)Z@b0(TNHs6uq|SkX z4nX7W8pt%UF0uRQoG;ZEfWCMStu^x=4E(eE9;YsupurY*Il$a zYGM$9r|~C9F_(w2WhD3wu?}Q6A3?9Fwkpu?r&t$5%=HL5Pyg9U=~}|HH;69q_Ih&$ z((&8S>mysgDw&l%F?B?oUAXJ)Z|Y?f0Ftb_}kg zBQScXF#Tj>FnfdSJ_EkbBKrH%QTn%eo?YK3_+I|E^7VJVW22|7ectrl>ZZwol(;bq z%_Pr5PGix#IJ}0&>4DSfyYaXGIDVnvb;ieQmC-NV4s9pqMf0Bec8qbxa@J31PFJ|n zGjpVz;)1Krr8@oHDf$*dPEDgr_GU$U)$cfX)hN7TZN0PkxyZ_YNzcllZJFi=k;_$@!rxO{<_hq(Ma8CyAdbkoR@$$`-E zijQJXrhgg(KJzy^9Y=bJmwSWuUU&FqS zd>Y(dh)!V1EOc1dSOUNS-k>z$apWoo&433 zXzp!v=oR2zPv{mC&)Q0!UeO`9FUj{d2hN>o3Um!}mRdfIISq{|=e$&n^JDGbuf2#p z?qlTzy&r4;VQtkTg}oK<+8?_#u?pQ`E*ts?_%p~_I0n7=F?8pZ+Tb^!IS+Zg74X(o z_~8YLL%m+$q1wSs(|y&o?u?C0I3`}B()!=Z-^{^Xyhezz&ti;P2L;$s3bhs(+YoKL z?;C)#@++ixHZ*V^G0%3tPVc-XGR_zq@HfuUhW3jo+2i`&Gr)vBxOZ@vwb2Akr>ytT zdi-s*F22sVzEPV6|A`svs%ZT_zQ#YO_3*u|X#HWWC*NDvLi#GZ4_GXQShB>SN-$MMf-v~x3qo1SyDd3_1pQPQ~KKgr*-+bZ`SZ~4`3(L@QVu^C9 zQ)P#_7ye|$KT2QAK9hz|FnvTP5QpEXK-aj7xe-4nnvq_HuVnk2mh{d!Ev^r`rocyC zMStGsyi?t4?Nlo1wi{i$8y~rh4EDgQ{apnfBx0k zm-FRLt8cOThq%w1#(h4<>3UU1+~-B5i^3gXfZA(OK-AjSO3a4BKGla_dj>V5R;@kAa*kT~=ymNpH)=ww&w3lba-~Uyn?S ztPbtzKvwUdKD~b&eZy18=el=v(CWKBNB{nWe%?WUZ%3xREvdX0Gwp%~W~L8Qego%% zL%v_Z?`kJ?{cl7z`qIPEtmf1CuR6QB$~fKH%zB}HH+?S>`WO6yL=%jS_MCkS`nt6p z)>gm0(EIy-zE$0-BfkyTRt!ldI z*YbeZb;ai9EAw$(dy>l~=ki?|twWb*;cjy(4xPvqF3!_*z7X)_k2X<-hIJ$Rw(T+XxMs(RFq z-G$kgH_hqof4)rL;@@)-SM|Hq@B5QC5_jaspQ*m7bFR@_F-N~(UG(wO zdEM{%@KL!G@?KQB3wX+g*0*V(9`&WeVJTVVfKmUTf8K&H*hNk=Qme* zhL(rXO^fdjucHjGa5TJvGj%j~`SaR?ET&k+{j4R)u;x4Fjebl!Upb#1SXyTF3yyC8 zMq6Ged|cy_Ezjl2=s?Hv6#Bdxa$(7z(d5GVDE>U?T9#f81HW2h){)Uas}1^ib`!Se9oPqDbKc80=yT7~j^5#C*q6rEEE{v`fVE%g z`NB2i_vXyh2YFaHAM4C>eizbaS^F~6xT#NSKjv*qe+4LYAx5x5TTn;u}zGtb1L8hEEP zPt=#z+*NzI_rQfLd`?#FQg+D4hm_{4XjX4p^VI|&G(vn`a2@(}zFme70d_HKyTEUy zNVbbm?^$4)0&YXVZ5Wsh&Bor)c0F-EV(np8hwdB z?h8lfCBp~Fg;BJ|=<;R53_lA$TvU%uq=a^^<~n=QPk%{usO7M4$4|2_ttNj~z}Iar z07p_|z~!BU$^Dl?mQy{7RT)BFlg~mWda(WYEc~N<798$47_?dZb$FStql4amAcwK$ z#I0TK@%eN)H3QIQn~z=VT(*L;#1tQ8)?QIj@0Y>L`&oNhcL{txwC)n}`2dy)`FwzX z%I%`Hr?&KK@z82V6Amfuiih&I(v$BruzVURHfOYl>7N6_^l1_TQ|aQ zeFlE()5(eY584+Ejf&d3oWEE6sD)8{*sk4p+tm8Y=TGzZrT4eF^P8+)Q2oh)$G5Y; zF82L%($G%XCaxh@rSnU8vW+usW~}>EljWJyO=}~|_u!W>;*swsM!uhd!>7?NXPyn3 zn5oR$L7VRf8(RkaRSuvOemlxFbA-M8EcLiCEI==DIvCA~&r{wc#pe{zH}#W!|B3;0 z6$|M{X2kjxEXO}e`f1tIjJ!7A+Ady3j#G|{DOi^u+C*KdCxstw{`0n}=a;#7Am#K> zS^bV6mu`AEif>~1q5Ql#?!B%}Zv6m$%Eeei&X{(1hPny=Sq)j#>{ zrHLP?DJCaVtku{K#P@8T%s&$IZ4v$GA``W7bje01iGEr6M>3<>z=&z>fu5*7=Lade z5cb=M0vGe{H>@4K*KZ=vPANDj2BRNb5R8V#CvL(ABk6eWm!L@+uf7``zAiF|f0@Q& z^2#u-aC`Jh-N(ocBRx{M-MdodY6`t8WN*=T!nt~1NB4jFdz13SRQrCtuB~Id8!Wuu z#Dv5c&zr<`Z~k#K(u{1EDetp`)zFt>F;{E%FbE671~Gg`YqnF0>2RP zmgyg{_q%a~tUl)FmtgPTgzc@}(#khB&1PKer+)ti@#Cyu50wt3!na+!ajGsir}Aa` z{~E4pPrr@KucJ?_Un>(;TinX$TV475eb0R-c{985zq79d*k8ysT!V}g#WoDTJo~a} z?!1MZUDO~%#FudK60`yGA~;f38m{I1*y8oEMhL|IQyospgvOcUR`89{n!%p zx=Nu9Iy2q-kGjYK@~2#Jb#&_+3%t)vJnY@0ed7t_%dL0af92~X3p@LROJCnP%UdZ~ zW5F!%@(S)R=KkLcyp6>A`=YAgd`#8(Dl6%=Db*``W70J#h*H=oW*v?t*l{}MOa--hU*AVxs zdEUr<-ABCR2XYfHZA8D7BF^XJ4V=w#Ym7a4z{rm}cihFMG-Llgir!r7S@gW1z-tLF z^dizz=vj(q&BWq`dG7QA;FOWuL|3IpOZ)LVih1dALTcBw#?8%`~IAJ_(0+D zG4u`MtEDe1ofjGG1hIJ)zO^!{MFQp&pzMiSIU^iPi%WFg}v}fbcSyROGgEF&b2#! z2Q+L&sI>FuCDFd_Q1H0ZO}^B==x}$@S2!2oD*RHt-pAl+&JY89B{FDkvAy@Dn+nkJ(60f@a|!0-Z^V*MsWw*tSlid##c#t+%- z1?bV4p9>E?!Mo|mp15&O>cQFqMhD6B zbC>hsrticrI{npjJer5kzU3LytR4BEnEaZ2v%1WC2mRGet1seg5Z$c`2p)XabOmHh?bWa@%04C->P>`#?rlhlW{V6{dDi%-)3wy<~u#xO8pP~rS%EW zf76eUrH47_dukK&QSal)Uy^qZ`mS>F(f6R~q1n)P{%7*&s_5f%Sh&2HR<>6RL%4fw zq#0gO-|Ba^KG^jgpHF_=A7?W-Cti7JV6j;@3H-xSTXxkpZfUJe;0qex(pGyVYvFcZiO(ObZJd9MI0odo`N;hrhd;XWreyP2(C|gFjfnm&q@MVeqqRd@j@543 zas(NVeH=boycG20#Uc9CLz#4aL1cvbo!!dqVOesHX&i0vAiAp0QD~p;_1j4wo5$+1 z>9L~hP-qRlaiQK6{s^gZD=VgyCxRI3^w_%W&)~5JzYt13z&GG^jx$Db*`;1z5Bi@W zcz~L(+x(Ihz{ic%N*oklpCo}s;w~R zA1&s5(sFG1xw}i?%NLTjcj2LO=zv|nVY_~BNUSP50-lh!Qgx-)^{+}u548tfIC`jW zH4%$<)H^P{z^%}L%g=6q?aU3xY@vm(6vKCw7a!ZJKI_|4P4kkc_ke5u|DkrPQ%k{D z4EbY<MZGP#+Ki>yRNtCoAtdT zd*&dUpV!++{)I+-TQ^_K_wYLz_?e;E>v$LL9g^;$z1ZNfU59qfo%+K0NfVdiaDJ2J zz1eRJul5G=x%Qwz=8H3H`x>zQOD}c`IqQ4mkvqWrXnaZFf38>*?Ux32&@o-LXX>h7 zzHTSWIb~g}uj#Rz*f~N)T_^qcSDiy69hkmth7Zv-4gP8UEJx?*WX*3um*@KJIJ%MY zze~5*5qo&;;bdsh;motqzRV|PAAavvTbIdQ>W@ctcZkk{6J|}c2O}eX9eP(q{mIa6 z*2n1+>#YpA)0ZL9k*JJvy-L>Xcs7>Y%^olt8h;%)%9)#^9rz4nka>!Wi#vOkMaYE{ zIIeF@&b&32N2x)FDt}YguG{N9V6FX8<@Nh8T4?#YKbaO|O!-pjY_#Wp_s*7N!mmfP z8~+2=kk_&jz9UsslGJ+2-hsaF&JZ~*EWLF7tAM5pj}&7oztpAZZuT=5f^(&-6Sxir z7k8Eydo7FRcr7|JR`uP^xHz-4JX3uw>oI8Z$=>xz3m?Ho{L}*aQYqLiTa!G&TDvW| zCb@EcN#|nDB)l`+T*$S56(^Fy?hYg!dFUX2`hH+S3Zqu zKCmVtKmHEir)F~-xpnSl?cUG&XFVG|qWnl`-{{(W9K7(3*-0;C_o?tfE33FQ%K|fN zOy5h#DEoYVy}wIcOAi)K`Vu=GT?!m_`Ttc%Gw{+pNp{VbD~ztG->%bmoxQ5OI}0tJ zpHM7e@o$MCwEFew`nl5^X8FKiX0QjR4+#i&sbc zw9ZemcF(fz)K>?;6z#daTrxqn{pv{i0{kpOWrsP>urCem9;Zz1*Ec3l??ZRiUe|JJ zXI;ygb+NvF@)Grv6FmKGc$(0{Nj~TZIB=SN!bG^1J4?PM}y?E zc6cZsUS*80Cv@}S4*Wz0*(*BGH}(^ElR)Rx6Z&kHSo_>l|L!H9JRhE-&TDymt=F>m zVz2M7*mFP5x2jXTnB<`*-^WgH!lw}0Zh0N}n!b(#yEkW`PnwIPjP)ckh01C^qR>3u zw-!<#Wppo@_$0C)GR`H6an&;q8hCQc8k18i%e<+LVQ8T6{4Hb==_9+LSNZ)4`T9=D z-6_A#-v#d{2Bz#gFK$_hoVPG5JbS4=cwF7#qfShnB(s(yCO*}9Qi#K9{Mi(d_uMm{E!pq z7*oOa+Nap_vRf`lcGCyZakbIC2|LRHdvDsnuQh>hmbZ%eL?^aw0NW*W{=4{bN>1x( zFUuN!ka;VEAM73on(>@zDovhxjvSf(f5lYhm}B8{Ke|c9R{jjys+iYeWYY9L_5|^d zBkU;}8+|c+$%nS)9v+1~7o>gVjp>+}Y!4ucpm-$hQc*}yr<8Lz;MGe^9n2Ytuci^Wvw}AR(lO^xui_NUh z66}7<6@$T9UXp<`>s=hAwO7Q8Y#e0V#Nv97$?xpHQ7#P5XdmkkeGL^wBs&eUu7_Qp zkQdcnB{|WuZ(}cdk~zNDpDR~}e!DX7@$7B-tTN7C@MnwbY@9_kychO~KlS%T7iS^+ zOS;;gqvUCBsbiS3j&~4TRDUb7Tl~Npo0p9~$~Vij^UDp%8lUI-WFXub^mUl3M`ICe zb+4;_%eA-E2fL#6c3mn);w{#a>Py#?vxv4#KY+zB#!y<|_}q zf4iZR!e5nByv97r#)<#w#x9%i&tgdUXE7v*2cj>$|Gs%2pZ^1sb1gpqhbHG*9KC?+ zmv|K2PlQS)bzAv7;&i*L)jyf_UqFm!QDJXcys&G*pL{CmJ%}DYyzuKhrPCV|~|^ zTG?+p4{XozR6oR@>AJEb&^3+?HpMT14aj}x_^bY4pex36`7_iz8_Xp)~!+bFR)B8K6J8Xte$=4mK9-}|Rp12ym zJ>lySrJvV3@xe}Cmpg|ZQTq|PyAS9RXX*r0S2bn-jGylH`!HEr@ACDElG&V2QF4}K zhGt)eP+8N*kflf2-=<@vyo0HeCEj9>Q$6|Z{O{IV0UfCJb(gXS=Hs5~((l7$f-w4( zaA3;sud1avTMRxd5127c(-|8){vGAL={VqIjir;Zjqe#83m+P*pWl^hKi|^&cF}D3 zPWs#9>rK#a5$M`z*n|vo-f$Ps?y-oP-Q|}XuO*Y*yd0u2Y@4)tyz62c* zKL2(cOHAE8!tari7E>4FQ#<;}mf8XDP)uIa)#Se3|7Y+Nlr66GB2joaXJgg+nAk)7 z%aegzb|3j0h$$ieE;3vBsPc`aw|jl>)pHK=9mUC$S0NKGWZjX&Ayu>#{~fzGq{m{0 zmR2J3C@*&EHTK1w(AejQmuOdP17~DFtJJUOnUl;&ecv(m8u?oslfT6a!2IPStNPhT zQs3o@&%z+`&Pm|&8v9AYmzfiJ`UAzOT*2>IaxJ$CR@|rS=SN0>f#jnq-#=jm&t2I) zlod?EG58Ve?#31oB2UCG*b_qR$HW1d{EVr}7G47AWbw zfB&qmv#gu=9f!BKlJ}B zeLuC)OU9eLt{u=tJ!@wzn6iEuz5hp^rI<%o=HNNX=$lj2ufDi)1Ae(2FgxSpU%Xwm zGm8`PgU~j=PwBfkX8`)x4c|1d$%8)nXKV1@!MLC2YNx*qKII0Bn`1tFT|Ftj+fN;4 z41OKD?`HmVO*784Vimc651J_7=F}_wt4`8R0y$c7b9$cvk4<^a&3?m=Jm&nKq$912 zp`!!74))qBghOYPvlIR#L9VFGI{c*O!QWnRgnYrW&k+MPk9=C}7Zr07t7@zs^RX0j zJj5KUy|_QdIAb*b4_IBG@<^XzJ#Nax>whNA57tyu6_gZuHhI|>7XQl6Zrc7BNkUL46D(6*( zCwwNxK{HtrnwQ2G{Z;$qAuh%o}QRmv9_TbZD^z{MTpK;}F z_V?8UblJSaCqZ@Wb!CTKds8_TCI*&H%06S@tIB8TXG2Z)Wzm+>`>=Nbqg}z}S@~Y> zT9$petOeZMiA?hxJj}OSSDpSg`y)8fL%vt@oN*6b)oSD{$&sm*N4Q4@h4=9a607Ea zI+!f`lMp-$>)EG)Cg-+4N62r+9_VsGm^z+g5C68l_j-TV?-y{Mt?_BWe?{YRFs&G{ zIH6}+7k$$Az#k038yFgX59g$G;miJH>#EAJR<7`9qr~^!^Ml$7@|vZJKG*BkXX<;b z$Fa6rt;b5%DY?y7RkBXCMpeIQ*Qe{LJ*?Fy?OJtw!$Y+F0=&FvkAsETONlSj{$tJ( zgud+e*Y@Pz-44yrIY;O`GVH4-niipdu{bW<8u>2GnpgYUga3xLe|lL#a_o&jGTC09 zJ;B*Hhe8Xl93wWR@%&hJ)A>_-!G+T6)?Jw=$06)!qfGv7NQ@eevUZewE1+E1UQT>qcW4zEo=tUX}X4g^h0v88U;7 zYZy49@3U(dJ%74sKJb{&dlTct+)wRuY2c)FEjU+!+ZpuJW-q_g@;m`#K*7+_I0wTG zjN=4tY$%K7wg)d9y@nhfb@RxR#opWCUD&B}5<8+4+%Kr)5>F35MkPaBqxfZto)x~f8YW!6&$_-5yqw45z3 zX~{rO((EzW5dVuxTE>fJK`-q1#CvtOFU;zH8eS#f^OhOrQ}Ra|yjcz2xUsqZXv|~a zQ92Kgx<>-XHFm+`VPY>E^7^VV*3a{D($SCm_DI#)T<9GiB$t%Ft09KR+VO1cWp{PZ z)Hk*gI;eRpvhdzY-7kc6?((85m5b`%=1M*|Z&WZk0$%(rHrBfj#FE9tP~8R1XJ@YRGC@6&zaLh>DexF zGY?h6XMpdL(}kCM?tU)+_4uv-9i2~r*vugLD=l3w!zas?Yr8#`lX5udo4zmAf+$LfBSy9C^QM}E|4?9-Dn2mM$1j*Fv7 z#k$J2Eg9n^GREb|7~_&Lc3PR0v$l|3EWV`BQ>XBcPK9>V_JDKP`rb|Bzc(}@{=@3( zK6qZXi=7BDj`Oh1+WoM>3mCtcQtTk=OEAxtwJ+$6*1%_lX``6u<;Y130;QeGAOAnV zHRT}JH~M8)k~1q*-#bh`y&-%phOoN~w~^DXu)UT;RZMR3$FS+E?3aDKe}CI`lE+K+ zO!}@6a4PWIA0ifb1X>mTYjnlP%`s@*OkJJ6(=Wbh%66doCI*7X$8QZYSH;YG3G;6E zG0|3)AEYj4i)OBFYHvH2y}1QdqNB#VY^?n>g)W$)~ zwmR8^$l}F}Gv(`UQ@-vt9^Cp$+l3b9VmHIKdK zwVZszYY~q&u`HCFsAi8J;MtG7mQ#14`xvmeoDZYy#&u>+gm)7m!2%kxEtGuUFKg<0 z)=QF;c#@u|{rAt2lil?_|LW{rGj)K0k}0^xrOSRW(EDL!Ro{Nb>tZ;C*So;M683=I z*sePdS^BZ1rG`B0#?~<791WWrzu60pCRpo#ivGd*c8Q-X_QKEARCeHB9D1eP3%>G{ zS3bH6TwWR|7$yGYrhVSR(ar47XMzh~xfMU)`1y-FtGKFP_!+&@cz(Fk;b7zWWu5W! zOFQK+{0Zj9`A0uV9mlBiKHjU|Abafo^A~n5pxp4g@-4P&N#9COw}5Y-;F~1vFASBx zqPA3L;{5VX-8b^>QNF{!z0|eY_8(t;O?t>LQHRQn^WODSWduLTanhHlF12M~OI@xH z@&(s3eXnn|#x;g~{VDGm*Y}{WQ?$|ai8;!PTgE>npB~%%?2ZRh{P}{<;TMUG*z7^< zZOTuE-^@Moy_C+Z5_rk4*R4md6901cW$}<7c<$3w=Lf9*m~!BXtABZ^T|232+wc7) zQ4<$D;=|tMNS~fp!s5=`_$rKr3R$zEL-GeayusSE2Jijo2JEt*34ipf-*oGr*!D?U zu#$T>w;p_aideAe`>&mM>E8<&+uKFt0Ri48Z>Wb})?vemCGp|!N_k7M$(XznGwd0b z*U)&Y$l25i&vbKvcRbZ3U0B(nQxg+Uie}*Z@uHro-05G$l0Sz=u(kDp2k5i?{+E0|f=quFdW22p#kc4me2c-65#Zor+}wFh&7nn|i&&TB z$>@^ba*9}|IC(BwO02C;?F)X|Z=d*t*X7y{GUw%dcl3egt?H-KRV#)|X9(Q)H80sr z9ggQwJ?ElVp2t`|i_Z);Ubh$RBDSMsbNtHX#U-5;fu)9rayT`N?v`@{R@vF8X3&r8FZSN)=N<8Y?^LqhPKOqEy@&ll z^-F)L^SK+@Z=Qx%yu_ccd>KXMCTSV>6ZKR2BIW(md;P4xfTe4xI;$g|8N>b`tZ9{X z^{0HBTe|&IkzL|N+Y9?L&(`B7?HxY*20A);(F8u}3HZLmcFT(n5ud2I+x%~h{++#g z9R0(YM`F3XQSZfZbS=uKdH>VVmS)ON)DZ)Z-|Z4)5pUidXIin7Wvabg&3}ouq}O|W z$DpBU`XilyWUk@*buIFd+Q=E<-PE1_DR!Nw*h^-S-*4TzmcNFUYApTu?bTe!bG}Kh zkM`-zabwqlub!x?xO*HMm-4D5e4aMp^Rx+{r`6b0kJd`2o&1&Zk@$qoKc3k6DZ?Kp zw%an_g+EqVlMe|Shwf8F8?|oC9E5Mf{`T3#jT@*7U)dXL#Lr9irEluX5%%hdKelmT zuCMY{N#lR0v(wY)pT(nxIm2Zz7%oYpH&optzMMLaZ9p&;k0YH)O+fyP_StFlI!gmf zOkBxX=r{QQT9(G}EjK(X=ay1OHQ$+c$b`-CV;V=ip1mGhh1!YZ=hv*WbKwV$fU`Mt z1T`B9IcwC1J$j&~iD=8FvzA6I4TID0RQmP+^@n_$+#5cgHSu5kfZiX}d;h-PFQ@13 zS5ZG5p5a@7<;{s3PtwQ4U7NG5cQqTo&cv{dSxEReeidz%us=3n^XuR&%x3gHsxxqr z^m6ExZVTipKNm20*lT9Zi75YS%TQq#YtNK}FUiH3gK_+*mKG4d#M$mcm*AJ>*R!A8 zs^iRK2lLqw{@=TJa0iS!FxoB-aT3bW>cljetT$*3EgI9|F56!h>P<<7%t|2DX>s7p6x+)q8 z&+ne3Gwadd1vE!>Rp8f>UWPrJc-x9%?7GUQNbb}3SgU7Qf8$z{ z{3`wVIZeMzUwyyNFmY;}4Uimyru~wBjLR1u9!Pb+MIFCdYV&fre*ctwYlG6a`s+e{ z-$b99_Tj5vVb@3)AAYTez}bnLwpZZ4e`aE8{ZnuM0`Eo9z8c1)Io28T6@SJ&Z?^d| zMMp$KMAt-{j+BGTW;}}zoq?{Uf58u0r9P!;U%ovVV4z$BULFk0JfOc)xtZfGnK5p) zNu85pe|ryk4_Tx77CQ!dD62pHC-C(IbEH^`X5KHY^xipwe_k{2Ory_D9bDMe2!86j zs=4*VjO(0u-=4OjKBqIi!`M(oQ!<6@u0Xy4hdVJ{K> zLwEG;nf9W-GmQ7_&Z0g;Z`kL^V}somSR+rkwW0a@-oYz4=c^pvcX8MLrr_~m#S2qM zcl+zLiTf2($@vZk(YI=)!Y$FrqP|79N9j+ zj18Li!jZuX@GlOQbV*OD@}?gD+adPyAbN{Bj6L1>^MU&(!2JaIGnES=LHi*j9Dr}?GN4Qc?^-->EwF!Lxy7BEu;@i=~ zdF1NbO?F&H&+FGWP3ODck6F&=#U^<}XuNnemtQHrjOvO**Wx>@9wH9^lwWqDzJT+F z<{;0V&-ZiTF{k22D!Q@bV?#)X@M#4HBzO6JgI-VZRQI9p(DQNj4( zHKOBn^v=a~)ZkB*pJxg^<2(KIRrVtBfQspspQHA}FjwhqtC}}wE1S(8_o4iB^CtE< z+IIZwbeY-lqFt~;^bTSHxA$Gu~q}bZ+VBl1D?O!6id$MjN+T&%TDf% z<`U4jR@Rfox;?cPn``$#wLQ~5%&6`#JO(yC+~`}EyQ`_>m%-I9s$kF6SUOlE+u^&#dv$OQXc;kU3y4|UQs{N59-RmJ4s<$IKXsPyW6)~k z`f~L#LF}g2-dfuMeuvwGS;5fM`;5(7vizgU(Fh!lTG%D3@OfB|Ed?A^Ir07BZwGQ? z^iRI=;SB-wuH+ql*~{I`SWb<6BvL$pF7~JVe!=f;;=flG^c9bJx$=XQoxopffHLKQ z+^JW%RtIu-RTXpO0ouNN9dpN=F5kd)gO{ryrq?5Xc}4q=$+_`LZB_d}*9JLXCD7gp z40hKpzn^l(FhK6hFgfLb4gI3sRWURZA7?$&FY(8~ycoE&dAZHZP0dC1$rZ%RoLQ;0iM^HY%Ovkq+CJ%IeSQrsh}htxyhO@{4IKH5UbPE0!ZO{C*(!1Ui91UzUoo-==BH>>YfY zqCM>&W7Su;Y)8J;9G_ZtbqhSUkyD4!agMOhJ6Saf95v3sE_9$=)wePFbBg|?pq)eh zvpuYt1V6n`fV=8n2Wz3@VLKnE?+^^4xqqO(L4S{;?wgK~Tf^0x*m3=&T$&&^pqbw< zdj>~pW_g#HIa^!Ma^Et}>O_X#QZ3k7zFmFvW_d}i8TKw>zrE4$qt;%xJRI)4g1FrK z!Q=S>^xFrvn|At#mu@|>*4xT?wOub2Vv{6aZv}nVT#m7Z6NT59a%LVcW*+ZmJU23r zz+3n$Jkyxqw-ncMWBSL)D*ib>f^h|T^)KhSff;j-&OMSSTx;rl{8NR=$3N-iCh@)! z_=B$>`rQtjAL8+!6eWqj%hlB5FAAO(EV|mn``toZP7S^^V|Rg9(C74B!XT;nzoX30kh(`Gd+|C*W7EY&F z%zhZ3?OoP9LJlcxngL>55`|VTp?4ZX#~CjN@JcVIJ;6}V`-`W(X)MOpQX<*6EKPED(B%3tNB~b?*ugJ8szT{$lo2zU;3Yj2jjZAb4{e! z=;Rk2D*k%(%FSQ%E?4>G)n23~gip(Vg}$zZj|JxG6&-tvze-)-iT0H(FJ2O_;%wtG z+5{(tz=M>(52XJ9nz~CqGe2sV<@ii!XS}r#+`R659^37?j9rz7PtDpm{*BaoT zKh6|*sWB-B;{-5kr9B6iu{+WA1n%GAfeTR+ACppSDoG1XyZC}gL3*m&KkRvHrVt^*Q>3j(yrM7eDc9Z_{`E%v#~2(#qafoWbzW) zZodTHe!kH=61#gP`8NB8cCRC*zs%GZrH+8ldnjfyJ+iDTd^6w8^@xXtCqqU&9ke#% zBa~Gi;?3UWij~g57uU1~aw{K#59VFXt^j(`Qh2WK*H-kh-$3)Ezo^kWbQo8m!>IWS z{Pe5mx3KQ}(i<+0tiBIEj`nL>0=d;+)w^Yp6|^Y=xEHI@K#QPDnFt9KQgKTy$rthS={VZQw_xlA9at!Xjm)lz=l;pP?I;S~MR zccSMjfwyd7Oa6QOwY1hMXB(M4kgJ)i>QF>=r}li^)SKEv{nV>-`%Z6{{jVTm`xNaX zH$+#%J97`K9pdErPBpO({I+xzPdE(E4jf)}HnQ!+a-XK(!?#0MnTsA|1Hnu_>S|x` z*`mA-z)g17^lVF8)b}Vj6$f_C=R)P(x^g%s+s_N&%y@f!BsKphCJ(RtK-2f0pN(t( zdzbSEsWbiVT%*5C6@A9;%SARHL8{33sz5jGncxOSM=WeoJ8v*$XEUDDz)<+x$(YC6 zOC!QTul4_^O#nBq^(S1vQS06FQ`X$WwNDCeO=Xeh5Pl`#TFtxy<|TT#W{uaUb*=sG z8pfsZoCYS1%&*qxdzaGB0`Kze>@(f$Gvj=_T{0{Bca_z7QXaZ8#oHet4ob0bj?Rg0 z#DgSXV_hw6`MrC!j~U$bWvEm;bHKfP!Q@N$7IaK?Hv9s8BtC}+u4BFPeEa}>F8s*E zGj>g+4}tH0hi(rzt8VcCC%B)_Rrl)iul#pv?+AQ}>UH~cya;*(e;+44DzW4I-WBy; zBuihtddvToQHRQVoXIyiuAN1_g7r_SH->&EC0J7?$N2AG0*u(#i@$NLna?!7RAclz zKz@=eV@m_ivSch5?2YA44lGAkx|}gvzACYa_&WF_)pZkf-STXGME7T?KZ*<%(>kE9 zQPx-L%ZXJd=aW0_UFLfU^LC&pQr>iJQgk9$e`(k1gW=@r8|*$X)b#tN&MSW1kgU3a z{?Uih|H7F#k`w&>QSBIBHB=wj&Y9OSbN&jk5?dZNIf!bu%*{qaU$1RoZ%|qNqTp{7 z8Lt8SZP-X|7_Ak?ANP5nC^BITnJ{kp{Li&<`YfNvX8N370!^ULUk1;{eA<%*pFE%b zc%nahIO~b}K;W5f)q zpU)Hbqa4cFs`beY8?H$%$!vS=DtNd6>-ur_3DI`#5mE96P7FZXeVFK3H+cio1ISIq z{kMmK^TKwoYg@Z_{3?9P($8F%)R{laD@&gKF?yO4p-|)muy6RAaB{=(Vsc4^x*BdK zuD?2T+|7Y`|7XxU`YC%%<;SePXJchia%0TPT}xlbpyg@m`On;^cCPKM7~{;5`OL*t zoRtiW0?_1?Nilz?vbYcj)umw308S=#jzS#&*k>>ugE0Nbk%l^XStlw8^DcM{J2DWZ=d7v@}l}x0WGd*?WnD}4;WtWADH7V@QQgId!L-Yckc<>Xm|>Fvhg!X@dRPup?+Kyz{mT>`ean?Lx=Qi2-)sI`PG0o z@}0Sev9QO#s(14@;Il$Gz0?27&g+vW@9^MXF6#OMazr&{-{u>=3%_<81&p*P;l#0eFx2E732A2B2kpKENedpR_I1r6!?P-2R4?4uhb5(sRiZbH+=Q0<6L?2jhfksQ`B@?8dtxpzLwDt_qmg-h4e*(Pr z*xTaBbVIaj#=^TVa|T=UrrBM#PSzqaP|Y7fXj%Y;zlY8oXdQ zKu$?N_91f>{?hEHnb6~lk!>Q^lv@(U=Rag97 zWDU`ick8mEC)z*e?~mm!#P%S%dXn!FZJdnhQwEe);mw?Af-1`Xk->>!F(eopm#h6%?xR-s4T=ix@L*5a64zQmo52*Gt?;YMl zyG5h_+=Ksd+na4^}4-R^-il6nRf&jZM{DtsTzcfb>*D=&e)+JU2Y$MExI5#vSo|noTA) z<*Pkux0&oCbr}AAf7IxQzH)ZTk6-l%s0&_gGAFH`>BriCw29}=_e9U$p7d2L!ru`a z%|Hm7uI*<(zGUP0{GP_=SN@BN!;#*1WXY`MwefW(hhE?#7N1?4%BvS-t*h?++{^B& z`@Xwdk}rjB&o;sjxZHci*6*mzQC_9^JZiEm$>Jb^E+VrWN^ z-&NNAT3(ArR9~a7!+hXiEK!?nhFcD|;^ayVO7$?><~`A5(bsL!`~v6kBlVlB}Gu{qcpqKO|GIkBM@m?QJt z^5=EQ&(bH&d!fcp_i$rExEbFN?`-mf?TRHv(Ddc+CBr zP&QNT-+zNMP2iX8^TMpoX0+vt$ouP_7iTl@qV{=7HiM49-p|P@|CIf9ZZ=aydk^w^ zl;5|2m+U}2-1qbQXMR7k^A^tXPWGaLKyG0o99h^Ajx7CHuy0{^IFf*dr?A5$&_U|V z`<`c_N#&SKFDpf7GRx8w;I`k_KTTAJlN0N)zpy7L_k#S@&NO*_xx2kSw>QX6s2tD` zpO!17huT?|{3NhE^D_Ndb`$5^ej=Gq!#(J;t4sOUHj*2%Rr;qU+y3|q@`qd0c_B8o zh1l5SqpG?{65jRi(0$EEsv5cBW#*8+D$vkEl!?&vn2W5 z#q7K5uWm`Bchh&~?17)7hdmmLu;<>m>p(r%;*#_>{O-w>Lp+~Z|6_aLjSlL+<$*HQ zpTXy*Fu4#t_E*NgCjae6Ukd6Rq{NMjAAIoDPbLn&`*W}V-9=vOjf+aV@BP+d@5T8e z8@F!Xjct^DZm{aLz2w6^QGtvb3`JY=>ux5$`O+@R;d8PJAJ{{8HBb7$3MP&97A~o} zsrgAiiw_pQC#fAJz3I1+{dNEO#HweRC)?Jd6RoAl=*lyOzeNo^gz9P?_VonVO31%G zxz01#tsduF(;oRM42%nJoT4Y!`taWCsxN0}R2oIGX!neUq08zP%`Hbm0c(=yo7?sj$g`Sw#gZkz0L z1|BW0Zw^vkb~abG-NC@x0!+W*4{ui4eUwF)ta}3s_z=BM<>f}oAa7jj-jDco`St-* z7yAVMAEnJtQ`g>b#N2n%???EL?Jx6iID!J%)<0ljG*(2u{K;p2n}t(nL1wC>Ini*_ zr)t~g7&^FoxXI?DH6fedMXv0CjpI)Fx_Q&TqeWed-TQhw2PxmyV&20iUEtn_tnDII z_}NLgrZ)Mw@MDiSG1n&_7knF(sfYUtcpvqtrWl@%_4_T(HUCHCuZZ->!fkSttE~IE zxtC5u&r;}L#OtMs>|71a-jLLH=ACcvH2414(~Mp3onKL6#}o_`>~ZQ#$HmZh_Sikh z`?jowK^r+)M5o>|-`jPcD6~4a?$E2Xi9gU@w;_u^MNV|9Axx}fh@1v~eKU8G%)%%~Qn}ky-_RS^Bpo07J@WRa+aKS%BN%?=37#PLBob=CC z6|aJ>1e=kyZ+~*3Z7Zr67hg}I`^s|mOmvibrudb7U!)3e>9o9L>Wk?wG~4+V1(^Rz zKgL#mO2q-gpO)r7KUe&#>RIl2qncOUyO@>DU61WOxo7v@ErsZj7KA(H!|&Ri8T*>u z_>cH(*>gzpW8!2lTj>3_3+B@|oh`C2xN!8zPyE&1%e3y9Pgfs4ynlbhZ$IoM`V`ZY zB4=wcIEIY+Vh6VDCgza+zVjr$5aL15CBG`&g!tJNtzqCMSQuJU>f{#HKhyurwJAHK z?qxr8^Qm>`;K{qviFTb~NxX2q#W9t4?_FG139`>M_*iTVz$e15UV>g^HTP8hVhPv$ zI4^ylKd&y9QqRk7izP3sh$hRi^}0Dzf9jCyQs_JrK@YPGxa;fYbU#?QpmV`HUwsV* z{ZR-&*A>93XGiRCnmqlfYWyy@C^pIZF~7daJAMVR5&ABUz5zYL2jWWf&e0T|hcbR^ z5I;O(9Je{V4jd}`w3S6w*3Iil#)__|>lA#mp4%AT1&6-mx98%qrjOm8&lv`OE2y&= zxanKL5L*1s5cA!R?##hLc$xoS^L+q3*IAMIaiek8N;$Z(5LtH-usH)9u=hN=&8HI! zxF?BG7Ztylg`aSqW6n=9HsUuR&d6vX3x0twP@P3ep^o8Wp_=# z8IWz>>{+hfiZHNd?*6rkeL!bGFn?$1x5neNpm$!mZ70e{}qmtzN%^V-f!8UKsvV|q`);Y@WPVt9z^!sG-ptlE{md?xJ7KIy|E zUgBMzLViz$;4R>3ltVim@}|Lh<~WTHL&)NL9J)6I@2R#<`Rh{gmHBxz6|42e>(S)* z@X@JY{!azGmxQx!ZD=hV<=i~&neu@=?a#OAKXdKcf0TEBHRHQF){x>Yqwf{1lnmKZ zSk{>#PB#qfmp6LHzfN@nhb^vUQ-8j0JJFPZwNc-;(j9sp-ADUDu9{OR$Hf$-frADz9zoJXZOo=z8R zUIyr6M7j{ScF(ou%Rdc2l(#Q9zU34=9Cm<57XoYLXb>-|{=D42BzvYQkTh}o_43c3 z+KaVjPM3IH(C~MTum_*|xM%W?=sQ<$8u+J2f`*2i#D50e)8ssEVm+y>!_Ad5{!jTo zP39Sxq*ag1C|iXN{7L_r8^7vy^C>wuOnwzTJJ);3xxeZCmKp8IuV3GMSbcZSD1Vf- z^F{wz{v43!*3b`~FQK|lK^LaY!^-~$^8h^>^1pNS{-${tIcVXMDzbXWnQ^skj5SK% ze-nHzoiSd;zpn6~oeSQwL2111=jLhAjCu~xcIAv`!{}F~-~3JeDe}KLSKE{0HGJT8 z@Ga}%Nv|a?{2I<&ZAj9mX?S@6zDhYqX7UcxV@AmtQXfQC@(xvDGnDUFLqV`ppSqp zTi@P}4baYAJNuHUuZXkiHr68(lpS)<^n3)rcK81D9aC~Pbk^*9-$D1(5nS+!$}ksZ z{O@lwKAn@aQSSbsf(WJKyoR24tH5MD;l z(xJ-^;SbmuE+$7f`$?eNjtgJY^@7MwLjUL$NWeB)@j?)8&w&`+Q8_d`eD zKP-k>-^B~9Z%*9TAH;nfSo7DA?U=Lp1GbOb3vK=Srq%8n^ueqdVC1e-IUGLb&xy*< zgw@PgXyHv5c`qCYbcPplejj+RTuou-`7UxZDWAOR2`?{wdNcB>{2j$}h1g@77XuS; zrm@an$2%?Gt$1K3=V%}D=uh#gXl^+?LGk~(E|P&?E&kW*BG*`(Vrlp`tA9vg=NG&t z>Xi?N+^09de{Y-0iJ*RT{QNq@(*|0QoLkHEl3&5d_oY4Xs2#vC37-}q zro7eu!~oHB!yy^CuD@0#_E53dH^|0(}>0SEN=-vmcHKKM$|+y0o{Y=f|GE(yu$b-0QmB-Ouq%?6t-o z{(Z0OQ*? zQq&Lm-+T$&bM%ioUsQeiO}F{k^(X#Rx}M8=V!6xzHkP|ja=|1oZS@cRs!t7K1H-?|C{B-!~o{}=N zC-(#wbT(7o!E~m4pnfz6#yTUK`Z%xZ9@VvUjXmRB@7w6Z1&pDC+y>J5NgmVlI-Z}$ z^B$eIjelyGb^Siy{HQ_*K8GGwVc!Pgo zp0>bGJbqw`jz%YnR_?=>O7!2gF|!`EslCk6-e%D|pC{Ob4ZL`s#XI-?xpZne&t3KC z7e8uqSxn~C-DLH`@f|VFM6@=qxPM-_JHtC(_!;y4e6;C>Ik5zjU z%==IX|AmUVhTqoys)#+kTZR73pOq^$VDL&T3LdmCRl(x&@ z5z_UXb%*a(F><_c8DP9v^8V^%IA+h8Nuoh6Rs30oMG zfJ#?TkpUrbVA3HvCJl-PMqK9o2;}!0JH+J$+@b;r;JgkEqXCyOym5z8fsl(7qw%M_!Y2blxD>^&3*^q|&E0i zNR-Q~6vSwvoz!OR+j3uEn|)}ci&in&ku>O5^j+Er-FxGTp^+?@9507X3VqU)m5^`f zbCuc(+aYaphNczro~gKxW9If|WdJ;Mh=9Hq0 zhv6%S1(R)$T#da`=#-B_hh*8qlVP7CN!vNb@cmO;@}bW`cRr82J7YcdZ%?7Q=j3Uz z8Mrg znhZR#e`nB>jJaAVH;ucD$~&}EmbL-_VAsO_NYzP=Kn98(I@`Hey!ja zvT?4L1K-fcDt%YSXx-1$jZL1SoQqz=H(;=Au#9?87kHg*Yph!-yLLv%JB?VM6zlfJ zH}DT-p(7RY1GZH)x4@Say05VY0on>WvCQTbrhKC9U|((1*kwZ|VT`k6qdoo*^$70o zbgWP+&y9(JZAbUI$)n)!Bk1Sz(YL#3SSVFakF|Ie`)BU@}srj#?@! zpPCxWJ7Qilj%V2l$3NhRQI z1ndh$T*73;d08Y!NT0gP_I;UXnX0>e@+O-w*WqQtO(lFi_v~bWyf&1cS zyx347Vz^@8Lq>gUkI>j8je5Q4&w_4cR$N!=*q!$HuJMBLnc0Rc`wVcqFgFQh{8U3c z#*Q%B8*Pmk)HwGAaRR#NgZi66BY{hJkEgU1__Q`VBdue85^22vy?3*1hZp`@t@EVP zrsn-qTbpM_TE_vuX82{{oUQO|sZ>LK;X>FRqrZx|Nmm`C>#lgDaS+`S_-##Ud0{K^FQKfyPRH(F9#R(6K|nbuaqPk>%JsL#$;X8&!FIRd`I2hPAq3MqP*d%5u<(>t->~5t!zK0Uqt_i?gsM+OJYZzvo$i{C;jA zd@8K6MOiF60v%GkBL=pihcrHE-o^Lfpu1E6o)}~D)FW6^PQ$Ql|pGQ*l+_t>?PDur(fN@G@n}P{4e6 zx|#1R^pel6^K>v4)Y(E?Wg{+8cKf{pw3_?mLqZ;e#ty{Z8SG50G-p~p+BwLXZJ__J za49*k6~LK}L+v+Z!Y8Su0(`s=*WAGsRqNsq2ca+qew~S$bX0oi@IYx&^@_~8YWv!$ zxzL{!8E1LY#ti)90H3G9hlsXcz3B3s2WgvD*t_iSTVRLIIBbMDH6HuRs9)a0GeU=A zKGyv&)Pl8L^j!&lflS*N>#9q|T4ZA(d~$O7W6bEbN6Ui@#d)LXw=u?iHXHLJ!qN=6 z)`IWMUt`aYu)H$H6@YB5!GAf;q-kU99GurU9Osu{T>hwRnhcnkra33h$jkrLv6;sI zYWs6jO&d4HTPHsH`=#T!eFleWWN9%T*zy*{4WxS?#C1R6KxnCG;mV*lPO!?J5! z;WB8jnJ`D~SBAlhY2}~|^I@KDlo^|7mbnFV0F1OnjE18bW%aXQ;aTs*y*gIf&U+K- zhCE$m0cQg~;B3NY;+u+C6Y!O}V>x6y>1xmqa-V0qHrZ#@ZM5H5*W$XZZnG=1j^mdd z=kUt1T-TX1uuB&peRtYNWRQ2NSNy21dc}>nO#TU@ebglI1@Iz`?a=ACCVpi+=M(gS z90FYz;}gm-;K#iQ?|de|i0{$ou=1a{{tIyPnX*AnG{zB*MOa4>v8d(Ra>$FFnf6a4 zd`H?uu50lAedL}SeWV8ClBiFNNj>|qX;*Z{nkNs(+-?N;B@?peFVM#(!hUf9DyMpt6JLDa3u;wrWyF3MQEPLZ~pN@)79Ck0LfW<0eQkWz#Oe zUd5Myap4GcJm{i3&AhZZrmY-fOmOY>%vh;I*rr0i#Te1QvZZ;++Ovgbdcw;XtGVN( z?Wf_df}jZ-h5aj+azvTl+J8*8=X1lLoeb?$jz|%1I?se{c#>;Orhuaf3mIKS+0F8b&BLYH=NF5-vGz+P-Q;$2}*=D3u7*a`cT6xpNS z5VN7G^**WNMtM~g^D|~)^DM+(6h0cj=QMCR+j4tH+ooIW|IBeWU5NS0qD(~3D0pU)T00Nn6nun!A_?!!2X zy&B@y*wH!XG;nR)>M>vmfo8*0`2XL`wN~?7sNq+c|BA3~09$MWuNLwlaO1ff0=6)C zlxt#KbL5@`&M7%`4zvjUX;4RaKVbZ5P{)PCgF2F)d?Ip0mrfNz_E6V42m9R!c=aM; z`--w)qg?wb^0$8p9FO2K(jZRZQWKhaLZ2k0E=&wq@2mOBJw!ar^cFll=F}(=OAE6^QtuW%w7yOw2gt#_+_HEO~>n!@hqfWDLvz}<)?%A)0*0w|LFpWW*t4*G3ecgmV%t|uOifgvy z2IWlVFzHYP{UZYTOZn0cdDBzIm~-vZ=r>uNm&+LDFN2IJzf8uM`Pw04GVO9@7&0bg z$(W6Xj4|aMWuRz>Xc==FzEUElcKc^$Uv7_*G31jj`GS5a#>_7H67}uEeLvAClMERH z*~R+WlY#4r&TSm$8}BQdb_Vk3%)H@PTZ1e)EE#FI55qmTF1dhy-ZIS0FZ2vCMwKN= z+h0tQwr#NC%;nkOJ$df=CiwFS+pZRrf7BY|3J?eAsKq-1cX4kVZ1FT7h5|3x`6&X|eJSMpW!kRmX ze*z}HhtPk+z%vVWOv|y(An*`)o&mjuEGDj@*>`Ip$Rd%h9lYGZ@e%FGSQjE~InL-| zdpCloSr7eWB1YN-=ut_=d5J=1@GNqUC6pCRn~Zf|0qfCOH)~&6G%P@T3bQPerhKN( zAni8S3n>4ncZ$3%E;9xpW6qZ`){-Uv_@BNPA{}KG+lughV#ZQ_4)}Gq7ru+Mgi)m5 z*DLO_q0dPi)6DS=eZjERXo8-XmI}QR_vz60L|M2SdpLYouE)G?k~yyvcFUd3hJ>ZAw35-3YdxhK+}@E);zxA7Q}$TZC&g<50ggMmprQ=22pu zO4KFbh_279%NS1+``UjJ^Vq)rA#Y;VY5OVa&evj0orCu{v=L=l5nxz_b)1dZ6NrZ$ z_s)7V4hz#gglhx#sXd5qv|%vzBXA#&Z$CzUey>J({9eF&685ohU)F*69~V34ytZ4q zi^Mg41hiTj_7w40#d};dmMwInh z>Bu1mW8^!I6iFp}P|nUJa!DEQ+p*VzJ7HwK3i#G2Pjv9-{tWs*$EzCgPB;A69G}k2hOK&z$xGae4%<`Hoqv6NE$odK zc?WN(N|!xbvCeiX7kZA*Ax%Cr8|SbsGwp!5&&={tQeh(ie4$&G#>ecs2ePVXjrLQM@ogjGS8?tk)>BgvKSDh3vP+XX3vH23?8k&qhAb!U z7jn?tLoExo;Jcs+?<`9JP9mKoOZ%Ha8yVm17OopcOQ%KySK309&!gJ$Q#Z!Be?bc(h!j!T_$I9@6!6EZ9j3s~DoKaK(X#&}X% zKFXdZEn?k-9b@g}sbi(bKZPINPP7r`o%xXe9qfx4EjQA7> z4Uha>(mYsG^j{$jQ69NswnLue>g?}WSPp(*n`T|Km*nDEElruN!e@MvoaU-ns?5gV zIE8lZb5p8OC2>?yI3{V9lHCrkNC(uR?s=VbIJgFl`EKb%27$b~KUBMT+ib0MDa zR;ePW3{NLm-?{-cf!#6x<@Ncmo)gOr>CYVhW&Ijok@4ZB)P+}OS&V= zEtRCxcB0Jtgo3d{QKi93dBsTBiWN7G#n}nanIEsfrAvkyaGAP@SnKZX&-s1w^xSV1wy~za8GY;Mi;6{e!~YR`q=rxG zaNOyiwahl6tr0TrH0G*6YI_a#u821;@OBTMRDLT1Ph!EelKyn``7`q4%nM<^iZqG6 z_X3#@v@`4%=A$mY3%vNuOUQ4oSIy z>?fMg){Veb)GykCazvchbKZ8M*C0)4nxn4##Qiflft^44Eaez*J=M?Q zIX@rxvX7Fd6&d~t(1U~y4n3yBjem+q!g(E?!~O?wmpc1-N?nSlG%gN$4)%5iU~gyO za8K!=QP6KNHmDdIytsRDFUGwX_tm(s#=Q>rI@}N9eh~MQxSzy*kaO2PgO(1O9kxrQ zt+7&Rn@cJ^K2R$CCP6AaF-$5wnJkrln5-_X%gDa=+}a#q``MRN9!Y(o;3aJ+$fJa0LI8Z{oB#k z>o8}pqYa+|+IVp%ef$`wZ^5%$!9EXc2ZTLR1HPk8j5JIKU&uPCpTsgc+{k|;{!N+# zKMhM4WEx%}tf%t+Q}D->L?tj3XD09+=TN@LG8+4rzY1gjt}_$(@6qLQ#E&wsvdZK) z8-22I=M}=di}xg~!JGrHWeo2w_kEU&^2%|&W7W|-aC)6>pj;=#E`JrqvPNAS;g3t( z2A0G6YEU2biCo+<|4kHiMdRtiKc9_##Ps{)*eufVT=fRXo8I64f^U84haw;RX1DQq z9enu2{$i9Ie69fhg=`afxOW*n$LIGl^cVVqi8A;t+V&>l&mIj7WaxSPR{;9(z8Lht z*mr17)LEa=`Isi<4ymLD`q+2zl8_7J7e0&gs%Wnl{m-cPAAA$}40~p?y?glGFh4Kq zn4;WhSc&7upqJ1=7XwG)_FNQh)*KePA=VEe8+U_leU5i4dd4g1IbNA#=Kqf}Y%4LY z;f!$TtaB*;DDy=7N6!g`E~O~udQZ_S`ZgdJxY^pYE3o5q+Ry<-&^ zb4uNo^2yNHxKKW)o4SkJ8j22*NA=b1JKM3Ih=xZqXPU( zsY8qp+ztH%X+R6}KfZ@Cw{jp36v zW?vIf!QTqn(Am$BXNe*o;y`SR!+i19CHvRIZniBOWv<5h*aobRHREhaFV3d+b}T!L zGPba+6(|?@C;E{l1!+FOUIcXp1+abyI``DcExWNjv4_rDbjk$(!Wm`T*~6074%u1- zTEBh5qq#T7R8Bp1Q)xx)sK7+{S7ENWmhs9G=VPq}v1J~`8pQ&fbHdo5Y(HKNHrO~| z9V+zMhLOr08}8wp4}LO-9GDM=uxABbu%r=d14Yo?DX+OtJQ8)g2M!O6n3mmvIE#mx z0rUAnoJoSYe+c`8M!dxPY+5ziS;SOhyuP!T^9z|Dnr+uQtvy8<^opRa5Y`x!q~XT6 zwF|L9CB#W~qE5ouL>(CCgfor+*O`QmkHDjI4}Gr8eXfpW{j|t9bIdtSm{1qf%?D4g zp1%QJH|UgdtyDs|KEU@7%4}R=M?845Z?+Tq()YsaE@{s$$H4 zRe5z)$}s7a6Yp*Iz(|L^qUyrLz{sSDtExu9cS*p;y2AFUwe+1IcC=rqigseW_f=z^ z>+ivw(1Sfb+MlHl8x`=tPogn4wyyJs(y2{Jm|Fqwb!Zc&FSy#dez=^lfB7ctMO*Ec zIxGSG$BYrqZ&Q!;E3JlYT9fM**tTWVZGv6jGCR(u0N(x~FI9y)W3@B4;9R#B*fRs) zCfr3?r)OnrWoJ6)aE+ll_Hn?`ukJkTL?#1o#W=+Uh>*ETCrDp941D!1gX+A_v| zXd(WuM!M%gGxd6Zm2U#lV?AEL6+)R|`wg`>f_@`GzcBExz53ntKLhQigLbV$lMK3T zf<4+s`%6>jO+>%Oxz7>MZY$=41xT9=y4gT?#_D7YHd^@g^Mcpm-jlEa|^(6d?`Sj#l+x&_RPdDVea<0Tb!Xoyc1*KyA*T$w`uY!AS?wF+Y6B8W)>FGNS zz81O@aZLyB^9(QAIV4`_+`bRhungp)85J{!u#7@UZGv<{&I6RvVY_cG<5 zXp3mte;=LA{f6l~mxuT?>5Vs)I%aAIZf^; zdqe8*H})&-f)(HSk5^Cs^X`31>P!4T0`+G=#!J;PmGE8Yvc0Q9KYwg!Vql(qL>uPz za|(uz47lxy`)xRPg!wo|Hezl$8Rr!}2HvAR3ilnrH*=Z>j0~tq%XDX+xH0nh*ZoTU z(-BW?ntUir9@@q+Z{ZWZ$n4)q9eGXtu%85*aqzTQ0~2(T?){E-u)gEWpnU23u_x;t$xeOC_o3V_82ytOV?h5oQ^BeH!+vmxKO7 z?~!6WmlWye|H1$97(e)ox!3QCkS6^P6;&?eVXO<-5IwsZ_rUHzRmuU6o-J2YDfp(~ zTLJ6~6VMI?{XJd#<`^Ug%`7U)D0ajJ3gnbel^9QEjs1#@8qD1s$OpX{{*~QpjdPJ- ztf@Bso6*mos~P*_9x=BzBQO2*#vs0fz=i7&(eKUZ?~r@LqQ5NwF2C>fZ94KfaMmT$ zHNj?(dkuiG129GiBk92y8qwuUN7--oDrXbE)%E(e9N!qvBRVhru%h2>NV5Uo9MG|~ zF+bM6i!Or!1K_F$T<|gLn|5dirs)BDG;Lc7&GAvRc{Cg!01oPqC}cb=t`%YB=1&`$=!$9Wjern5`NSy$wvYOFEwythdxJG9>eTeF{Nv_*1Y zo`ErJZ85InfAVCy;Rmr9@jZ=Rw%FI<&{;YsA3xI^63<3`oBQF-Lc1drI!VDgaxA)RLJKR^x6fxd!(YvORDO;CEk$oy_r` zw7wee#NAr24c?D6_Lf+4Z5y)5(3LjApNw;t&#sm##oh<=h-){-DC#zRUjTf0_F)9= z5KZT1jPLvp{0*NivG2XBpENlFoo6Jz-ve5ASo+U*mCd~qmYro!YHPuGCFao|05;|k zwqPQEsLa)SPtDWOB&i%fikGK429k^+M*lv zw_Vu#NyU3~OumWM|CE{VSNNH%4Ie}~H?zn31;>F1U}9W>2JAC_da-jGpO@p=xA1I6 zN{l?=8ax9=>{IkS>mwSEzTz1pW?{#**Jo?v`oRVru}yx7@&2U!s@mJ7nEfSk40L!` zn`1(t>WCzj+y}p?t%Lkkr;+BT__xz$Z~Fjkp6h!g!+%vnRRh*;&dScfFq<8rypL#~ml1*9m?e)WF2j5u@ht*Q*|k4C zQR?^_aVzO>cmtkWLEoR_JrVD2lpnUckSD>2QI;j6e8}+>l)V6UG%xsyGUobx862yj z6Jo3%R$R?B3OU{=_iC)&gzWLP>>nY-hGg07Z+v!-k~;Q)Z&>F~ut$3p-jkr;xzSGO z2VG+j`vvA_9T$*R@G4_aLe3|4zdNu`4%-pHS5W>m+-yyrZnEM>i+AQDe=PvN9L3rN z*WWlME52r&yU+@zNtw2g36|_F2=~`mo==PSoBziQnWlj*RG(gN7hdM z{E>)^%QogP)@4jRg6k()&`nd(_BhMnO~sKNRGw;BugYa>5%+ezWAN^EwP-i5oG@eG z)%&U-(}Ho*aeW+k?0z{8yy$Ez8!`R-7|4g>OG^&VgnVBHJFYUI&;qKs5Ah`IMhXAVeo?kI1301$6NlRxgPn-O;~)0#Bem43{0gahkrS|c?alz! z6i)5$+?kK_g-1HBbtK=gBr!pI^ZERW*y=^vQb+QgUp^AK2Y5}idyKKco3yIR>lhwT zvh!TY(6OhdeQB(ZjF1unx#YpaOSjsrZ;F(#-$5EP9t`5}IiRPFq4Z5a6t=wA29nvrkGNiOehX)tYx(?>}e=^vL@ zspWAvx97h9kmX&|Y`e+_PVYBmyhqwNUV3@Zcw0mHERVABAsJ_d+jeEo@VUe&@F(1stFFs}RFt zLd~mB=hxo zFJ)a$qmuMH>UYgaGBF^2ew10c)v(G??>b`UgmrTvw+o8!8W-u?}&u%5VvLb=p6( zJmG^WaP*;`MvUuNf82lRNh6LzVo%#Iv+one;bkk~=l68J=T(_wGz$9U-|dNd=eL@t?+buh^3wjBHuxOUwKqJNL|WIF2QJE+@-(QYXfQb{$& z-<0>U?n>E@GK}{Mxdgh{oRpX3k~H{AaR0B|(%ZP6>4%Q)EiTGXu+}U=N9TX=iJ{wk zg8zI^v)&I`?;EZ61J--Cf4)c^YEOpLK`5S!m;qTjE8}3r3;r)_SvHK3pnsnQ|!_>#4->)PM?rR`1U#r1mI{{C+k zH`(5-fc_M>#uHhC@#>dN_TV$JYu`b6XyAYxUwZ=gI(b0ttMWCg)HK9p+%4;-{*<`C zLf-X-3VEl*=LLMmyxFqv`*sP&#U$gKxo0^Yd!vZ?Fn3Q4;K3ebcZ{Oxl5FS~ec2fa z*vrA2;#us+?Z!9Ei;P&9Xs=8$XJ?x+rckprFJnH^zc+n_y~r+<;{%-&i*CqZTCw)P z=kv%%xO$&qz<+62dw2oy)O*u83;stA@T7wI2kaO#or)*Z73ax(bqHt&8pQ#3&h`DJ zzQ=_e)=G;WUsc-r_?FVP#}OAZ9q}j=a?@~^UAQ7seEp?T;8-efd;#SUPwE8h7lcP# z~l+S&>Rj~QN`wgp>#=&MN+4$!~?5I`O^`DrIF=Qdqxr}r} zW_#mDb^UiCP2eYS6UQNqk=B7b(yHK5?x*4*LPC%_(w1N!GYoY)uw+*z{J2AMS{{nEUQdD#EM+U*>)4fYdl0Z;sqso7si zv!vB&4@xWJ2D+ek7B|UyHO7V_@VDF?e6L6f$0gp^ax#@_j*9IBnkQ{;3n5A`N1~03VR*!x#4ObzqmAI}NRejsfN4OaWpL)$g4KVYc=TXlmiYW zZ$IRC<$od%*ZdVp4x~VDo{qd(pmi?pSet;IlhXD9=;MSPAL*?oVV@3p_|F5Fd57)U zTIcbn)_Swy3xYWn^6k>7#uLbQPw{OAQg65gMoKJu&+^?L!6m;CDR z?tc;AyLr=;9YSUhu5|PtFJy)baEwE21Im&R?0FUJhdUK16Sjt#Tr2o4nLQt6aIEFn zNxGKdT>{=hel=L*D91=Ob-I?0bwcjv#_d`eyawm*u|D$5t$<-C#$2s)S#YyHe8 zaMFf)GC-f=Y}CtrwCBw8OM---?IYGKYb>1HQDX_m%)a7Nh&UT*1>N(PCab*(KlDYM z`Nj2%n;{lV8t;aVM;bd|OHbHvCYmumk=H7gXGg5@>A6CrBmA5vAckJ>3glP*fO!+< zHO`fM1qL z1KM80`s4?Wo1dt`zdDqm;(G*tC*j>#eY$>=DK(19=3Bo)C>C(D@LcNOY|pUtFasMj{iva zZXSZaJp2;R&NbtWkZ*T`CQK*R{!e4=@nfu=k$36K(zMxZ!%2VdoJ6~ZcHqPG)yU`X zCvEpZug-vi98DW zV}VroAJkLE$k}f)U39*X-Ha;`!kPo=&HlwaEqKTHXz+Ur_OIZ}hCXS|ZThmScR;64 zlhN-{*9NR#SIk*?Pu8J+C1Jp;q!wJU3$VN_M<%cQbHBmT@cCCzM+YAmJ^|Tx7hS}^ zDUve(3c~5U*cqG`<7i6*4fcXh!clWx!OMmmKskg}_RPOx9_o}v&A)c( zD!&zLm|n=yYp$8D6?2ToSb8n!eH-dqCdV1R8H9&v8Zic!TVpWG+=z6PJ0>jV8Wx|^tTB+!%Q2TP zdg-P7ikCJnLVW%qtJ9}zGl1I~)IAUMw}IZT;p~HhQ9iw1z_|+ba*vH;dL8N+k9FG= zd0_Dej$59fo~vZKl6kgA*rtq2Uy_pGmF4`r`4uBWHl^5Uz30yNk4&*ki>@5($I_WO z*3x#5Ya-FK!oS2LSfg#h8m&lo6!u7crQ=u@Ew{ut$1yP4W?O-L4nfvqJ?a$sTftrs zFSF)Huz)oJcEQ~?Hn^r+ljqqrVS-a z9W{HR_I7b51i$k_zr2BWoCRB1v0SQbg-ihx8GG`r9y2{~Q?d52s@Iu+is>(xm%IO(-k*eib_2$rB?sKe-synCpZVGY^wK732D zM!gp@LafDy@a(?SIcVR)?lpChSFCZTLEm%$=8DmKtFq*z){U_BraYuB=fSfda*FFZ zl+VKrF__75!lY z8dK-G-lN95vsL$STL5R}X(#vCDhCYm)YCSbdy1ahKnv8bN{EL8+fvZ%)GoAx>htZO zuU)vvy+auce*x4R8hfW2eo?CbcJ5sD+sCB($n3k+^Rw<&BgOIRg?aa=9rxa=c8p0> zPqujKPtKC+PagBsAI}=Bo^0cLf_m~K?(3xbEfXiGb>n`hD)InV&DiVIH|CC4t2fJs zHnzxzHbJIh?u9rVN$QCygH+;Jy#ltkTi|Ex@F!H;U!1Dg6<5vdiR$S>ss5c=lZ-S> zS7V>MgJ~2w*;O-dqS_7{i*s|O`uck(sT~+&&feD@JHKYdT}Ik-v*^D(%yse0JJg!R z6V(V}`0PM>mdC60G0^H2+QBH^@Qa>$I0$>s7klcl=jjdDlDzlZM|tDrIPW*0OU;rs z3HRHEd(U8;nuKo^OP@U4Qr?#GRH$dI6*NJn%U^Myhu$`Pkd`id5ga0k9RCuoc-I-j2DR z`gFk6{tR(S@TxN4TM|f6mi)zlDRPTcAHT$(@XbV*N?Qc?l25&%4O0C%(q^Jm@4&xY zd6akPlKoymA4QIH)l9Kq8yl}`QLwcFw_G{dpo_9(uea?!Pkj+^BW*gcm#qTMVw=nB zUGj-H4lo!oit@!2hEqUw9u}wm#v+6sLL@;5iF_c_(P(Tk@G#1AW*A ziAz58`a#RkxVWx%38S6dsH^S1d{tfYxpyJ(Ju}8rUyQnrqrDX5@h0K3QLjTik9plBz`6=`v?5-a4{&JU57wQGGA`!e8(<89 zcLiUB$K0kWs8>aOt%wcYb_;j{bZfg8JU@|eeCTD{6ApFBVZibi(BL!gxhW?8^gB2` zR;p*czeK$!rnuDEfOFx}bqTHDB_H5E0~!h%3`IHT?Qylo(S`<}Jkt$J2s{!taNg?; zgEw2V;8(w7pSKnK&;}YCaLoo><4w2}gD#&LFpWa}1}tcQ(&n3DsXi0%wu8^ETlP}I z3G|;ipoc*l@SG1Y3fc@KZP1<}&@uE_6g=RAuz@?^DFi$}vf!Boc*a@q%rM(Z0iG&o z<3*iupyzqULjn(wN4~j_uzZZR1FaD6fbblD*P;FtbgW(ad_pUD*Jvw?Plkg=r$HkH z{1aLn1rK;7oWr&NJnI0@6bl}<+t}`QD+X>RZN4zzNd`PdEGO{I18Dzm3Z?oR(cZT$ zt4cU=uT=jtz`Y7IGkFI5YVphnlyhN*RPP47p@*X2fcyx9PYgKFM-ivRY$vo?+ZYQD zv{^CetpIP6Z`gOf0A3?&4Vui8>e+X0B<;aV1}tc!+3W*dyz`f?zC*sbj9B&~E2o1J(}yG5Yar!t$vh z@6Mu+88EG5JAK|opDvi9d1mWuH4OeRU|Jl-GvFV}5B95K(A(@!Y@g4(BS~lU&0EnP zyJUKgQC!eYSiwoC2FC!cyRK;Cxq%E#W*Xum#rWwQkbc?Eo9v=Mm) zeACsZ$B918e#Aa~*qdO%at1tjKX`)tGTGvn0~ljCR^5a4$OYYsKvOXec_Hg-A?pdd z2Kv>E?H-3X2D0zCmo#|8Oz1PTb&H;{t&eie&@3m6At4_AN*uG5ba!ab}s7P?6%4!a1 zL74a5_^W*H%z6V4kD+^a-gy^^)$lmy(U{dJ|#z81z5JA zp3qnc|7Eoq^LN(aw(3f=jd$8?1D)7YOaA~gVt(S<3fkCg*Ev6OeB?YS+pxzjyRv1s z(+2znT~v7>=wNg0clfi9fop}Ii}B|}!l`h^>Kr306llRWAG)IH0St==I!yc3|ar6KKgwgIjW zLCasFY=>hn^hu|;7<{M#=K%Wc1C9oK8vvR+yw?Fnw*uaVj@#N*?*Nw*<;K}$z!~o% zy_~5Q9M{My_weRpJw{S?SMj-P4FNRlIju+=5a^r*w` z%2r1dOjnbAIqJn6#1F>&W&?a*JmYD9g?H>XNbqeh$J~N##5qrj2euNJUpcOapCQgd z=HB@(@b;>OKIrAU?pambJ@+{?YlzxWn4q4!H&MM%oTQ#V)?Yn+-wZW8#;exPo}ku@ z{h@mHGetd9e5;BB-0II3&Q#CO9i~R^9j+n8i2YYOK_*Q#%iyUx&c)7Sd*Td#g?ksY*C+MmwPy`yH)mEa@d zz^mrr_4zfE-(NHabD|FDS)tMm`O1#B7Ok{(r*Z#ydA|F{TNc@oCW3L_H{)0N4e75e z`h8TInlA$R{=)5xa**acWSxJ`v-zQ0-dyx@R2p|dAm4ZUrbUHFgEN5YmD$hdhopBG zok{l8N2l}ccqZS!v35}*@;1EvY`*&!FE3h&JZu*McSF_-`3=c$ENVd-|7(H#hPkgT zItSh3XjFav>;5C(H*v?J@VJ}Q9N--K81{WnZta0T%iB8pA+_e-e>Lc}_gjDd-gEDR zUJjQ#V@(EMGhDt9-TpcB9PP^i}x{ zv0HoO2}PdCcelN5l&N&A%=bxeEsCa#0pq-4;C#PPUf8`hKfLW7qdecz@_gm5J9^+8 zx(0ARjdlZV-3wRe=YC$@M|lqb=Le1Q9Aj7J7w!3tQC`jM<@uqrFZaONw+VIJXST0@ z=bC)~Z?rzjLz~Pt+oWi2d4Apj^033@U---X+>NjHz_;dE@bztPnr(8`OZmAOZ}d?f z+T>odO^Wue&d;-(^m8ZvIzKdbTMvAFlUC*Xzu95Z@4?D^U*3+($}`$yuGt*qJfA~%he3b#u<>$tm^s9N}7x@k4|9M$?TiG77&GvAVugMSpakGJM!{}e- z`zLMgiSG+9f=_;Hz~>MDGG7V5Y?OBnIu+YiTwCu&n~XKv#GChgzVl1+q0{Aip*-I| z=9M1(!1wnx`3*63Mwy|!m-79Kw-_`z3%ya4XYkEjw98ntU0NSlonM>yx>07szo5TY zzSg5mB^zr`zxtgCr|p@1<)t?ax}1St)T7MVXq&NS+bsO`ntbP~ZAO{7og4BShP~ON z%-k!$+Xv0IX`cmowe&gkpSQc{6B?V3v2-@Z*Ewnu?4&2k39c8hKJ%75)OEK!!i96j z)W>0?nT$1_8)cYp!{6v>#GIx6lXR=34!c`cN6fdW$whXIb8|JonaJ^*WA-%|=dPQY zt=>LjRl=a__IU^We4qD_obH@2JDn4x!Ra!`QE8y-B=nLAlN!7e?rHFrV{A*46z6i; z;e;=OceJcH2igX@zQK5Qy)@Xx=Ql>IL3syI-T{n{*FwjM$K^`j4_$;~a2v+^;u}8l z7T^7m*Nt_g5Xyia;LU?hlaBG#XXphEmoimSos-OQ(e3uAd83vmxPIVInE8WM3D;(1 ztFQlHO@f;DfwwrX!Mi$dpZ8?m0k0ZA-CG==>s=l1^`4Bs)%$Fmr@o}0M_r&mUj-hl ze+%>r>O&twpP(+aCc~qCbn`D0PTqRZdqTa_~bwb^( zAA0N5nO@-IQXo6vYv3xnIgp^rI$@j@ee63cGU1SdX+j>fEES z28pwcVH;P6GhJ}?uNyGQqYavxt=VpxuJxC4v{t*llJPRRHkrD~T$@ahZDLI_qQ>v~ zBCp6DQLxXzHA%EdWz%@6BRu9-t>%^MwYG6Hwbs`YwO8v`2ahj#S-)m&gMR$#6Z#xE zF5vzB^FilV@956!H#k zy0YV}euJz8xHp2UgX@${hza|R%cY(AkyC52$HO0faP8MQ4(wkIsy%s&)Nu^)VvW9b zq*M!~oU6s2v}7n|2&$fYffCppCOv1-I;aOCR^+ z4{){V_X0oXD=!3{MgOTUobeZZU-~f}dRf3V=GowuTi?~Ue6e2-6rR!P6B5dSZAp7Y z(A~0K_s{vW9=b)>!M}kJ)``zqdqvGymk{x-3CG**rCQ`60jufbb`)uN4$0Smn`sQ3 zF>mP@W8%zjj8Xj+=EYwlE#D2ib4=W5haHXc*H%1h;@mdw4y|>f)X|20w%XSxY2k^t zYsbg-(_VdLqSkP3O;CBQMt2wN*L}A)>+1k}Zf;r7SFlZ2W`ClGqzeWDl=05SB_21zAQK{Bp(S|tE zH?KF|JJ{Y9-b}-b=R0-be3CfN*4m~J-^su?Upt-xzp+&Xkx^~89K7|ljXtij+gcD z$Gh~3C);(*M*?BQBkjh!=Xnb6eO9Wq7e}{avJp2zwDsF)BibnmT+Fk-7+ZpEZI)&B z0Z+$;9{fO_8HF^a4gOo8OH*Kuw$*+|q)Y%T7y<^}P!sL5zWiaFby}oVG8_r$QeelEL*^;^U zfbaintM1M?p!?Qc)O|K3Q2YAhS}Xch8~9CIy)IaB<~6+{^JBfD{Af4*-l_^#l>AQL zyW_B~Mw;}+px+tb#lFk>M86e${x0Yz=)+hff=;}Xb`guG%)E@{E@)@27?lef?jxR>%wTtM=%spt|4_vVf&D!sarZ@04XhvQ#{psFi9|MkOd$bGtB6)6j7tg(S zn6z6Ap8IK}db8c+xfIaO;yKpGGj`wFP@-Y~q@%i!^uu`!;I*S@ldr&ctkd8(@FUYJ z(|-~4zx5lv=D=TccmFf`r{F8!nf1Yj58u~w)A#8OvF#SGEz(*cgWAAv6@M)chX3}q z9*%sZt8M4H=oTKkGFX(dRd;m!UN4f)>MWnU#yhX0XfsoGm@;)EXm{QkM?~Cz#&Y4= zFFUA{^}Np;yXa|-yJp`cubDJWfDAF=-e$=-?3r}Yp7;oU+e$qE{6K!= zcS8@b#&1FQ?bHK+Bmax*D=UpbyA^XIZ`tn#AA%m}yCUAz#ucE~7Ei}-H$0+M7m`*( z%`pWuJ`OTmVfTXbdY?{(jvuMGb4cRn4={h~&%xqY`DI(yWj z*P~th7k=`Ep!Vigy=c>J-Ep5aK7t>#e|b7san}~TV&?(9;x}P~UIO-Loq+T?2fh>k zOunQ(VDid)7JVWX4>4W0oHXU!R?^3!xA~uENDf0=n0gTPg{D_L9dB9VgP@VYW8lwj z9=jbpmT&ObZ%;l3na42#G_&~2pc(j1@VD~Q7lNT*f|us*)^iV>&>PTSxt7%MBb5g$MQAjmM2~!x$edSy%MRFM@f`Zql`9|DfmHrg!n!-oHK{)GpQNd$0Oj&&&AM z9A808#8o!vvyJ@;ymHQZH)vzwZO{O43cZOqZ(MOlbs29Ws5heNN=-4MMJu z1idgegD*%wxAco(uK#V_xA#Nzn=|@7=p+97aYn>{Xu3P`Z+d9%X#=NsA-^eu9DjT< zSh25KFPgMZulOdSW53zZkvPt(`r4o)A62VZ?)4Rt!+!J=9p3yESmdU-7(-}JukjlzX#(^UJUf26Scbb z#vk>)<$pKZ2l6NyAM#<3_5mCMr;aFHs2P06??SHqcEe)u8~do$7HCWU_bq%r=yuoY zO8Egj^v4#XEtC;e!Q7E=>kXs-qWdScSZ(pJ*%nC^!J>)p>DmjQVZ8j>Y>S8bY3kx% z2lt+OSFZ>k)E(iY-@hF$#*??-O15 zGHl9Yw1IDCAn2~&q5EFgt^3Cuv)bTMqYa7@Ukv7b3f=qf2lTx$-xzIB^x(e-i;lmh zhx0zyD;Br?(`_JR!aG7HSoEfjNEz^3=!xwA2LBv?Iv83|qlX^&P_IcmY4(SC==<+) z(Hs5+bDzo+RvSESv_ZwRe+yR3+^jpYcj@6@oif`1xLyE{<~{g)(DCDKdWG#H-SN`5 z-@hF|YtbM2>f0tSnf;n$f7(X7|i|iySne!2XtlC>8^HA{;(qGyZ>c9 zxATbJFif}F0sR|&q3Hjt3g$ido}PCFbc}-$qaC!-&jk10^_Cu9`Z4sib7niB{r_QK zuxQNw-J>s9eMI!--$G|%KPFBg&#!_?#>;wW_-A^<_2*66Ph1^rxaobp;qyP~p_@7^ z+N0l67LBh8?mh6n9zMBO*Iq{-r7W^&zqjz$LC1Ub`rdaw((~@U^iR>AFj1D8^fq;p zchPq*K(=@FUyI(HPn_rYnqrNwiR*&O-P`mU%q4v@n+&*(`2^;oq3N&bxo1AqmH%oq z+T`8W(Vugqj-nQSu%ZxS#m{%^>VqvNKA`gj=*)Y!mj~4&(2b?TdU$N}W%zLJAY{=y zn0s^V5aTFg@-;(Ox@;`vcnkOiuMtmk9-4?T+0>D#k8Fg_Q6D7-c-G$0AA!%TdDO8S zK_gQKX@RcsZkHZ{w4mWv9D6|{oIhQA3~k4{d}}f18eXIO9{NPjz58pEMi^85Z#)z9 z7rd<3{QaQrOBVA7$O+iLR%qox$MUUuMdU+WD-4V?j3SH$G(lI^fOgJaAOJ9NQ33Ol1YrA!pdg{sOuidof zd3Xs%e(EG*Zu<^&Zt5j(3mF93agO%Yx?8kk$%d~C#s^a#?Kmv-5&r*)M*ZlRrQhWK z;hA8~>YciO;ve+T_%?kw#_NVV{lSL&>h*>fztC%b71sUGO|&hLPqsj?EmzY66ZYr< z|2I1J>&*3xf7uY+d(SI+(U}8!QAe9eL+~``-KLI9e&LykXglCy&cBD&9<%zw+n5iX zE$pVPF;*LME9&_s?r%{~%fdN!QEgzZb8w!)c1QwFmQKfc7QVsjxfd_2yfj`>@1y0%q21d)azy$l?K!1CG#Cwne zC(dJC82f+&ZjiJ=(-4pBW}DVuMx0r@(iIyPa~I8<@xeN8-Us`y(-yP70Yq^a*@U<#|F4gVx)JQXT*eN z{%M_Z=1=>S5x4A9`yqcC^8X-vpI3?r&^L15%s;MU`l5b&@NWjAd#^-RZWnN2ogA-{k##p!pDiR%brF)Og0#aXh5 zw~-L2KunERwADP>(PqQ<8Sp24B4(tE{x*#{=3Y3>#E2be(VoFf~yhfS(a(*e*0x{qmt#J`x(r#&-modr(9j=2%O@yt)3f?TsML*eUf4Zn6v3BE zMH|rO-4Uk*)JsPi=!4E!;i}JV#M`1THEkC9hS8%vGQAg!@b3^XvQ8W94(#Z20!I30 zs7IfGFTcDWzUynr6JfyVd^%@`+9VxHLrjf%vaNVNVgs;Vl+h!e0?Xu82HO9l^9YzG zb=S^_1bHIz&;}j$5czx;bP+x@Y<>t(m`EYh-_yX@2d z(Rm)x?ZUQq;7l3B9?yhNiQ)UmdX2gf8&-ksd`haUr66vc_)dO+tmt}AxhUbRFW9gb zNSO&t2U`)TZ245FY{gXM%@nXFJ{6-W46(4waPF#Fj(liC8SR%MCABS} zzf=;=9*fD=5^t3?`UUKTkHSuy!-#Pz;DJd{)zGS4WfedRf`l9J)7ftWJ z_TY%y8PJON;W!tFcV(AU=_rsZ$=j;zSvw*g;}>|qZ4X64O5|*bK?BAJ+yq}U%7Do~Q`R>O@pQ1C?E&t4-}Gdv zw(F-DeHb!-F!1-;Y5yio_Q9ScMNTTthChZc*382=IYqNQnHBc#JVTI2$N>889!5Ot zhO4u+Nr;F0F!(zOGs<+A)Z-$8b0aZ{k3_(iMX3IqWzrd zZyQ}ceeL;Q&|AnY8T_6GzW0DO(dVT^+cVkG-}|AzGe0lbJ;7(H%SXzPeNr0EeHe`R z?^24aOxu9#fxL>F9|8)vcu_q2`9WcK|=`xORX{T=)z&cGQ? z8DaNi=Eg}kFzzE|nZTR(PP`847&;sWbq=&&jjQOivRf{-zo_fSmEKUP&N;2X} zjmuFTvQ(c3f6>!p?P^hfX|MyflW5;W^yQ#vSJoB%%y)5}1AL9JHx}=Wu<`1&NyUga zJx6>S)=wHtyMOWC2zzp-NsCI;SNV;wBWsN5#@DC|c4DF&1?7fdkKGCX%5wNQiSO*A z3eE->{(<7$9R3%)%jd>*Qe|P(`93}VZN`}j=(m^U!5Mx{kb#AL{X2|*Eyx$w-QGRQ zY?mrGTQS6Xe7EC#=LE!;cbNJ5ih0ENIfO+X?y28tla1J;MUahbTlLD?_33EaIkJTK zJ)Zi7Bc*!kW^Pr|CZRp)hmP@l2xV(7_=3J;I8R$U4LdxR$qO=dun+mT*X+9jwr%ij z^<4q_L#L!q*6CR}7zc31T8><4jla+J9@|743g64d1jJ(&ef}wVwis)^Pd>s#`SQK< z*v)YXW89FMJt;d1pu>o~EGwGceE0MkyUp_l&A6)kPn+S>=!@dKBN6l3=)0IF2wdsU zzQF3=(chZ!O{_bFAlJh#$aIYBS2{dT%!lkFk5a#a?1hgx?8yhhcc@lUeKyKo)7RaB zv5LAt0n#fgJu2Y3>^w3->rIHiO1OLbLNZTp9j)CuH$~8dbY{D^Sa?)hzWjc`;>R~9 z$`EN;M`3rmNyNkNL^|jv>lV6q2-q2`yvdO9R{VP8W8Ns4e;Hi-pN%}cn`tedf3$^Y z2l1~A>3ZvVm*XkbCZ&2hhUT)*3^imTc)KGherTY^=BZCae<@gC@(s%sd#yG7VI%5= z&&Cj=AKZc9zUmOr0Jx$LDQ#$@IU*nXl9|`k#hJ$jd0Oy+d2TEJ`9>qA2FhdXVD=}* z1r~I|{~kJ5ImSum`EUEk|0BOM_SSThwu#Z>a&MZkZqWul$QNaBQh;-TM4bJ~e**4* zl<%KO7Y$QCiv}!*eI<%#jD8u-3*b#7jsw%mmL4Md1ixLCCRHL{L)SUx(Xd7Pfh*9z zq2qPX=R0IKb!x=1tH*Pt1NostREEaNT4-YQyG@Jk7s5aM`|!RpYRO?yZd#GgI47NT z06t@06D@lPGcU*yV?BUlI^Th3Vi<9UFm7jpCo@IcM9(XjuG#AEj#1K(EQe&oJPDyq znP0)ZJHI*C{w^K53yv@0TMWN{FZr&PGM6F#P7P@C zeRzsxv5%65gyZu3W;~63$W-HblI+L%J7&L6bobkp>F?~E zLf>zs$&BVl)CZpRWFl?{;=4e{ncyGE7# zqh8)cS<(H2-(|p?26%ht6X``CjK+U-X;1lsf0Tt?^y&RSx=yCWx6<6@bNQPdlj(V)4YpNK^e%@_Yndu&3PH(7OxvMpL>QbuQ6JRD7H))QTCbiU~J z612x!Qb{i2d8b}!p6@E+O7w1DH`>2)7mWNKo&M63iC9~Y zsSM@VDpmBe^mxRRK>EC=v3`hHMZ`nE*qcAfaJCiy^D6s=Av>&RLl?B3jddTiKVq9L zmLg}{rO3I(awO6&M>-bUBIny}k;cXLNK?B#@?*4TUuBAXjmX!8d_I&lk!gqQnp!?& zH_j0Izudile3jLe@Bf^00y!r^5fXm4CLvl9Xop%AIAbz7Au0*lT9MXPJ0+264bV<6 zqE)mV65@|Qv~9$WGdOohVD6ZMLwj4XCewQ_3At@iI(mWWk2}3Ho&)XlIf*R>637AV zx$n<@o}C;bI`-cAzP_*T_mA^>&a8_yo~)VJ zH!t7#ov;`CZp$(^kbRE12f0&ou+^N|Ds;mBbG8|Si{7L=Hj z{I<{8b6v4p1-FIkf^QxyW8bp-BYV*`#C82g`cRMUYu98icGi4s62h6%=411aOxjJ1 zU$t>>P`aasyE4PitB<}64Z%N#%Br{Td?z~4y$my{C;NVgF!8yh+hnIn4we-ovx}Xm zn_vB1>KlL0t^Tgy%FZ7q?mcj6e9;vZtI0b{Ay~Q3VyNEZjbrC;t*uhJPWIYB`QIM1 z>f-UFmDm0fe*MyGmG*A?KEk*1XuW4~m^~i0&U)^Tvfo8xMKieD82$O3aBF$3Q|#kn z!t-M5FRO!&waGeOx}4%JUhJEAj^^ydZ@rYO6%V1T>ax0|{Xd))OFR<_5;t=a^Oo3d z4-pHj-#g=&==bKo%Ji{b9$^n%af}+N*X?(r2Y%=b)qrQkZ?bvyOty@dQ`w|H7W$9Q z+EYvXOu;>!a;buvZv0+)Qk>UJJs;>!Jy#Pao<;g~?B`#Y?sUKYe0BF1CbNzYI#FyZ z@eP+MF6xRnbro`+U(cuXO|g&PDTb`_Xn%+^ImF-Ty`v~_z1gE|B(9|k9LQtQsacD) z3TM=3V;Eg{f7&<=m&*Q18U32s^RWNTyWd~cW9zoxEuClU!*4xwN&KyvkdX@$$FYNP z3}eUD-S({Uh-H8Au~wcG^H6!VEcfmQo>*6}Uzg1%n*cKWZM4Ih(6nju)sb%AUcx_@wXjJw^S$nDD*Ew@+GJsg81Z*#3$6ScB=? z1^M7pd&#GC`y0kaihXuSbNj&M&QO?VD|@rrM}LVmP~N)KvU2tmD7Qr8+sgPCDW*U1 z2|M6*ww@P5cbL7HKJ3~N#%C5h`^C`vx_4v4Ek(B&B`#)jkoz-z`?dC*8j#z{8x959 zu-|^CgFW&*{-=m_v>UrsDerCT*DurimcXnHoy3Y|Z-2jRTD{O+GyXH#^$|yXHFLGy zVcl%u;*9dxoyB8mdv1s`2h%R+juHjj(L%pETK>uGX(X@@DBu0imY!wM!&kvs>*eg7 z4Sn^=NTBd=9{N>Lpm4C3d-vk=og<1tdJuRxhd#On+*IRN5C#VA-?Xk@H!6H}p2@8K zd)^K0(njyrUelgvxPEd|<)83PvSaub?k&ucA0hu96~Ur?kYwAq?p9Bmy317GH2%*n?So+HX)9_8ijdk%^)^;gxlCVe6O-^Y+#+r1O728TM}U+eu%5wMX&yEL^sqg4N2` zi_ujFI^glpIKTRLr>}m|as-}|7k{h8TaQ`T8qjk(+rAo4ut%mecag_4WGijvTVg8r zRd4!_71-I*U7Ic+t@Ux;5&Gwf`sqy-9jAH1yJWL?H=5Tt**4#LXeGK=ouT~ze3bNy zu1zMcr&v>Rhuz!lHk3E}5lLWU?it(q#5H=jWZX7XjP0NSTaB-;nzGf%)a>^L;L>|` zxdG~@pC;Dp{zxpYr|4;7 zoXioQA6s1MDSEJeW7?maxVI_%DPK07mAzSitdX^V=7#_M0vopO(k>78-VtZtad&~k z`RMT87BBBb*J!HW`cCM-&T?vPVAp}#Yvhi`vGsQeI1c(_d$HK-T7%SP!KgL0`aVoO zI_K7!*Lz1-|NFbO7TUc-@P)?Ulg(E)(>~^0HeLjmr85r~o<0BFVbfY5mwtqqAIuTo zUZJ`=;9W`D*Z;22XOfyQi&+b7r>l)s$*#0x&-%K)D6syO8|ZIq@#}78 z?W}jJ7YIMi#Ee#&+k&4Ze%0z%r~0*^BHl^c7N@c+st>7xAaaZ+z8tm>iK$JM0|m>w z*CXQw7O;O$|HLa)Z{jhn8|%PnE&J~);u(+U7`r)eUDQ7F`>e~wgTmSCa_&qr@9(lM zFKIG(ct;<~68Oq)_71f-u0H5zcw=6*xj)yY^?|3(yyX|9X?}L*)sV(H()Tz&FE;np z25>~PVUUa*^JntmQob1JdS=i0iE-xb{(sQ=GrX;wCokU#7QumEqgg|!t!Db!ao0G0 zl%}8NVdwVP1vrUa48Du-JC#>ECH3R=zSsID+AOqB9q{|goY`9x4h(HI`15!bZ52ZQ z-&pIYt)`>0DXIN%7T=mUm*vAEeXVSC%P|K(Ve#!^?q&|NFDZM7`!qJlLT7s5saz3w< z@-Y5+oC!*h7N{QgF;cz5*w0S%dvpAFD96BM*N9V?ixJ|;FPsu-!w2_p8FeS|k<4eE zkKIAO4C$L6iH&k!#1Zb(dajhc@Gxblx3CHug8C55+7nNBI#gl3&Ra~FgBrKD?Z;oF zf6A8uC)&p-rk=!O4zX{%er@HO#Z{x~dzZe+ucA6@PEMTL@0mx3-gzAr^Xm6yfyWar zoR2fmYbF`F_F_%&h}AhH|BL?EyYol(0>$ZeS<`lfW{1vW z3)>3CP`jP$KFwOt&pC3?q-(}dDRA%mYz9jdyrj>?IlPz0K+PSQ{mEK8x z=au%6@q7W&boQ)gLp1*V(mynFg!so-eEGmAb zJW1||-I;|CwZ+*0Q|~tDCtkWV9)_n1@7Xw(PTY#FCcCZ5Jgxp`^(!FWDR_N-PI)xP z1@HH$GrO)h#CX4t#W3)7us1dFx}Jb_SSs5Te@9G z=$|U?rHtCpPjy?nx9V2CefY+Hk2aP?*o(@=r-8d%Teo}mkuWl6WmfrWJGOr`j_Xc* zg3Z{iBra-J-X!&8(}CKrCe7qsl2xAj0o8|caQeLk(RjB%UedQsUke=5SLT0@?dvSQ zrRb|?tNFCi(-T_{Vyp3NnSZFVe0R}vyTCqHZ_RqAIF#plfEnM*R zLdgojYwjoFsl7O@QIw`VHO9)&ev0+FV72~gVf1A2t_yf;i}up+f33kz%iRd7!|Erp z9q3+Mc*tt?GuwAB6PkSF%`X+iN7odxUYWtVWhS!Di(jfbx?6%rI{4{-SLl<=)UM{) z_g?$5S#t&GgW{d&yMCRl$?Sji#g_fvp5T!e;e+m_+>w;`-ua;FYJgvLZofWm>oRaK z=N#q%3T0uU;GnU`X#UC`qjiCW;T67jZue}&O6%jUPwDISd$oBVw<-5sqVGnInEq6o zccW*R_df1{?%aNZDgObr-2$z$&a^laEX3)Upfx6(mKF-c0d2z^lKdM0Q0|-^_uNhv+hrV2A?3G zO|$JoRnpe7Ki81+C8L5?e2N<7zAK zWUv2JR-4LG0!?(@<;`)ucfz|n^US`U!D)%!x7WsXueYsJPtjTDL62AHU2|M?VDmKS zJ@3Z2?h+JkIzoS5AsXntrj=HS1 zgm|3kGq{*ohx%>nsL3kh3}sfQkYn+d8Q3RcJuiL4>6T4HI1o>H>B*S+7O(kax4y-R zS7iFNxT$h)%O?zPe)%KtXk;8Vnsj3E`20~U%Hdl+2~YS0ykT|x%`e?1ykD>mkR46y zI<4PiLo0>e)CbFV-pgKdiQjLF=aK$clzlkEW0aOho7y*)j7qU@EL)QH9<*QaH4 z#dl}|PNg+`z={3=^=OZ_96Q9qh;!>2*S9b@uH&b%UIeUKCpFG@qGfuT@%{vTUQOR`V{WZ7^Gdwho?SJu&L%m)H*;^m z=fO+(ZeWDRWcou<6QeX3+?NOj_&NJ5tm?OgS3X37CmY^mF!o)&PlWf&z}Cc65l!fAIG`3-#F0^ z=QK2+eEM12um050ua9nc4f}oVhc2 zvi68fONc#zeEL0wIXUjDGPXxnQyrD>cGAeCA5!kI{=!LEK=&3sR-k zQG67lS|fI)Vvob}tfCy}q* z6~caVPY1pk+$)k6jMAr(z3Kl&KEayY^Mi_x$13(E_AtJCe#HOEeQLw*&8QuMxHM-mm&etwzsuWH% z&WQ!+C0XPA9bkEMEZ~mFsZv0pO_xSRmt7VnhFO!~|WUVnwJ=t|>44SE@_voRD-n*JA`i{O- z(RY_Of2Kndz4sh4G|{{2r7^m`kFhekkR2<|ylJcw8Y|gJvc}5tJo#zvW@# z@wUF~r}AdQ$hX4m_iFm7Jqo3Z_fE9!w$fKO;}}?nC-B(T`A&O^7)p7Q*b8S4zrG-r z{w;iA*EDD7L(Q!_Uuk}P=PTH4_g!*n+rAR#$QSjWvlbr;I4}Ih&-Zuax%qdQ{a7_%VxqBE63tEq8iP*>Cy(W9zCS=aNB(b>-{C5dYR&uPys+ zaCFIUuvLHiH?J+r1OivBXB_qZpa1!_WktcjRSS8)>~d$i(!TQ#YnEL$)0zI^yt!9v z>`qQ|ri;H`cBwP{B!28CXYiYI*}_+NzA|U(!jqv(7rxf)Y@Ay1>dupa$o60UW$avl z`zl|X5!|>3`g!%M;oH6*V9na+*f<2b{x}E`$eg6^-D-JJx^jwISfN%fBIiTHDUoXEp8A z9$0mtZD(=d@trEGGWza98*zT~r?u{+U2`re!n2(6Wu&Qo`>y}l`(&nFKkxR7?5*4S zfd7JXPSo?1wJpt|PQBZ_`fq=Cp&#hKU8Cv0oo7M5(O+BEJhOGG?7Ug!4X)mHz6%+U zV6GK$J|V!kIEp0#%q8qU3Rl_xsrLeWT<9CfK@>4ldX=S8;)Mai?_$JiBzNvws(~_VAp#2W2;jU+OGfOW#tV{JomTPq8j} zfi=M|sCOoC{4{8M`oB|;-K6W(nq@`h-uZBMigS(CFUDXzm%CJDRmW-S(*B4Y=S0or z$e8e6^)Y$4CVl+Xn)L9on)JxeYKTd7x#8pL%Ym81b;6eH?pV=tDB>(_W!!^xeos*?b#=P8u3T-WuCrAu@ibc+N*3>|hR5T?A`J5XF=B}fqvb`t~dVa!p9-nQk|I-Q={&$r$*(2 z?LHk#XEIZxRmYqMs&+Wt?4PDba)V|+A(bCYXQuL-7fibaJZA;dRhx3UQ|ANeGt@Cq zx-vdc%C`mJY)5ZJNlRZvGwXrG-OZK7?5&lw^jFL$W{UfmlRn<^b=Cx5L*IRZ?|qfc z;4<0rctv7ITSe+lVs)MfMvu2B=3sa)4Cos$C$si$@c9;g2upTxUM%yAU^)R0NcN)x z_s?uUVdp>i6J5FIKN(FubkpXt>hQwU_iyMaYYy*C{bG4~{l3SKF8ua?I`#4&{P0v! zAaBsUG4{Te zWS(<+8lWFb6J@~DxEx&`xbNK^h~Mvz?@t0w;SAD_@f=w3+34WnTQTK>D>%mqJg{~Tgxy>ZlC3NO%m(JZr`8fH9q$u|EEowDM&7JA|=T$6v3(qr-BMWZXeCFvDJp+tm zig9!qM|V*qUd9-vI767ajdQpE{J``2Uq*S^u(ENe_KJ}SBhd3$`_Q4<9bxXf@Hj*7 z{@gb3(T`ESyP@UqJZvEFDei80TR!b^gw>Bs?Xek|j~|}!-MXP^vv&=tD4WTNHCJ{~w%jj!9WqgU*ZoKule7N(Itwou!S*~Xx&_ATpzFrWe>mo%cQnE~%FsJZ zpM9OfrQdV1;2j_iw1xRPU{2&38;qed_Hc+fo*N%nup&MHZZ$84!QC0^(7u8CCVIE@ zXnA%uI?M>XRXXn(c2 zUuB}Ssd9ue!cVGnR(o+L>k)n`pD69EY?{?nd1eru=WLL>L1slIH_CG0ZNh`kw??2D z?M(%snWV-A`I5X2zN~Si9_i#~fzR-1#`GNeyS?AWmQ9K$qQ490YNO~%){FF6z6Oeg zOKh}(7<}st)~rJ`7jNvus;isRVOgA)O>(ev9n#YB&x_6JqPE&fd=AZcO-HNdn-jJL* zZZp*PPTn>5BwGznkbGT~7pFhd-5pL(E%7t7?pcFQ5U$>K;hF2rjSsAh zoUcwxR%@P}XP&wF{J011+UuSD(ve;9x@P9`EarNDPWt?ha?m08Erur?&Pk6R$VrcU zKgZ)sg1?&mMCu!$KKIq@(*t{Q;sfx3M&S+kT<+JBY|M`Jqbqx_So&(@TykI6djoNPF=f_;^jOsblp1KsvRjE}nWQkaoB5yNSNF@O<{> z@>G7P$DPXW&RCCIGbQRCuI@=uzN~#pw_BRq9=dU!GGma7BAtLF(m&S0mr zyd*)J>ThwWcSbjnAuiFcn=222SJ^=I?aSD!wf@`sCj5r{;dWqao7CgpzPzXPYNz`Q z@=G*cvexG>ejSRj(6`)6yU(wSJ-4)IUiAsaKc&tyzh0hpnd=GgCSOvunF041aGH3U z`LUwOz{4GTJ=X%)-}-Bd1h}ztGU4-z7rARv^Ec1Wqq_9tj=;U!veMlC&w2Ygv*9BL zu1}AAI|m;A`RH)Vl~F^R)A}kBw{5L-4_}|IJ)J-5&ih<6)war8U)9u^_0=ag-86dV z>6-}aF|Gp|U5+(qpv0SB(}LsQn#(=?^*l6e;cEDx$Hyc;MDN4U{ir`5Y@W{Ryt>>4 zlg9LmWR;)x?Bubu&QCMPHHS5KHBY$f!qySsoBq2CLPnmNIb-DD?7ctEf-%LswPiX! z1-zW&O-)^%=KM!mb5(Q8oySvc6!CmEC!Q+hxj?_r7%aj=3SB_D1^XjI%^&dEw{@44 z`S6rdkNCraabGs&DT!Km1M&0l4U-33ujJDi_8x}WuM}@rKct60lhudOtUkbPIU7&? zi>O0=@b5SS$I`Feb-o6L*uaG8=VbnnGdVvpy2&d z7QBWQ{}|m2T09ReruyMwKjP<)_b{}obzEN&a+vRlnk&p48TtD4=`%a79~&>hV)Irn z1ok%Sz-BRmedi4Jjq}(yQj2bg59IU2zM=dH^3?%b3Oov@Bgja>_%Yxc{Sh<|pDrt5 zzHf;1xF=U_c7HK_vkMF^^TlPpxXhPgf3B2GTR!SOmy<4T#|F~gUy)d`wK91VbLiLP z>%Stpu=D!SvXUFflN&GV`t`y%>X%y|sOmiE(*(+Bx!>AfrTDeYAaRsRuo zebQUuv#nR5Sk04rFNUf|w{2YBJ+S5T(YEj4D~p_H zyXvOyo1PDKKNq^ad+>0$XK+JZ&+ETfwfXh@>6-^bk)FY|pNkI8yCSMKlQ$i#9PIy- z=wN?oG>dDT0|hxfsn?J< zYc7j=>-ADIR-@SQir?=n=?dacTM+5#`pEL`+N;Ce*KUf9UUND&x@1%J=yj*7N6R-Y zA1yl#-GJ}%O*NzLfsaRBc-p^!BjN6E;H?9|SvM`#UA_Z&?gze1s3!*8f;kal%?Lfa z*yZ;4WzN6@#bXD-=ODa8^(>QKPCfcRYjvF?@FtLpkZJwiGJK2K@cZQk*FDc?&Xd#x?p)@#-}v}fhA(no0P zb3RmqogyvYy6;ZACvS~#2>I>$|qZiJVB>wKLx!zpq2(iZv zemeVuM|OvTM?zWtezIj4K5*5|-DS)b<`BPG-3vF~JX$t%vp1hNe$>q8uG61hrup2( zyr|tXiTpQp*B+Y$|6tshA1USsF{jX5J{NWU`BA;+P(}5ghbt0Gw^nKlC4cieZyb%3 ztQbu#niP+8@?;(k|KjfGjFQ^!Gg*V`Bw*Yr86bsN!G8^^5Z^e@eR@=_-E$b6C3T?TDUj=RBUw0J=LR^oT?sm?m3A6 z%Qq_={HvVrZman1;m<`+o>;Z{Wc8&BJ3>FHNGyU!e)pw{*z?U5AA76u*c;H>5cD<# zy}bdwy#c+wk;RYSfFHl%^JCH78~JrTw?4n3`&M|m`^TSp{tbBg$xvO-;sU4pmaA8E zpFA7tNi02BnY`|x;l(HW*G5m)d?0%AaBa`GL$kYYdA_Dw@K627l>*+*{f{_t&+yBC*E?mh{D?o@9@H@s8Zl zvV!nv`HpaR?OXN7+}!EWg~!6(hrW8*ZEnHz=x=i)n-|>{8U5g~$moY|%NtFsI9OTz z{2}aQZ574GwpX}2Sf_`=8;rdY84{U>&+J>DI+lVK!qqWD3(^UVJ_X-SNiUR62;Vk3 zA-bV-!odZkE#kL06dzp7^J;#?U~!i!Ef`N-$FoXl#I3F2iGJsP{d(xl=`Pz**X`~= zKHf=sO-?$osIM})ps!MQ)h3G2E9Pyjyc`;jZ~D|S(c$`AZ#Hvj{j{6ST-yJO2jbu7 z?1t6>l1rK+b{>t0j;Tlf(Mq?xI05dH;7@7E7B7}tGGz9*p0e}8eDmkB`|OR}t;%^I z;p;=(7xOjlvw5br$JooJ!6%+a#y_3g<4WhkM&@E8a~H99^lP4j{AkZT$&)tS)B48! z>SuYL=f^yT$FMHq8A8{3t~x%D%QIj9WATBhJPY_~eYmGM>h6FywMXDhw7EFklb8p6 z6+wqn!Bv6e!}Zk9np*ZfY*5-aJdX`Zu*>#z9vpe{+q3PQLpNSi#6G33Tglcj44$R8 z7+FC7jGf{BNRR9=TIY`>uZ~X2&iv8yht|%j|P*!w(>D-Gj@@BYADb*c1|N*j~O~W5z}J@0ewLYYpFvW&Kag zbgoJ4A@8&77o)43_{H_<_W^fm!Dpf_x~%LTeVkcyS>vlOvPD+mOPfHxRk3F4#LlJq z^=tC|hOVK!^2>(a?E8{lOWH)3oPu$fKE!uhPX}j%A-=Kq-f6%{Uy?h35k2GtGDCTb z)y~s3#45cowq1Fs`e;?i87e2vo#GDlq3>ybp@}^Xd<}*YdS1fXg;+^$|7W79wVyZr zOyD~ro0Nsa_Q$^K8REOO)9U^aOXDN#%NUz<1GWs`9wHk@#@8{mSDal>5?kCEWbg>< zmSJ=<`|S*T;EcciF#NBj23zo~!L8(9!X9;IX-+zGb&l+y#?Lz0QqnFTVEJX(InWEA7bVF`dec@e~20Wpn4@^*^?@i9nkU! zYuju(k6i+Kmh2WTjBUcVpStX;$rcd~F?S9Jdcw>(Z2#?LS1~8BiHf(J!!CLjyRB$j zd(?quZ$5m1dM!-0Z<42W>=@$>&dJPb`Rmy4O~1u=Tl5Od_kkM=<0q&~`i#zzOgyt? z%jzkA6c@iJ{ZECq?X>5Z^{)QwY5nHj=}dD;v1cDr-e&3>@$1vOtzUa4soOb6oA2q| z7uJ8h^q-5yWRMTgh5j_-u|>8|@ChpB>~QFkSULb5lt2d&AAY;Hcr))4^UMcF>o1Zn z-=IIaNcwToKYNk%-K2ktboGmNjenEhN8^8^d7pO~=h#ZUvCjUcJ>-dS?PkCCdeW6Y zyFQhh`!4P1tmwqLg6Qj4T_j!cm>0cEU202b5ah3I&t-&jIJd!^SlEm$;39poWrm@F z*2#=j#5n>V9m*+>o$G}Uee-u~M*p1n8i#^o_k}%mi1*qofAL>Jvv2DI_{ffTLp#vR z|MNcb{~o@z|2lTh&SdcD`H2co!+wk(;rM?15gVm@gq-NP;H2kRU#!kPJKT$`T^GcM zg0o4|ZB*W6&jDR*@Gf5t&nDgSOB>T(`Scr4_wIU78hqp%4>M0}o;9IarY^z3H`B&W ze0i)Nz4gg_C!G9y`H~+W!&eY|jmPDjfxp_4&&1-Jf$tCb&2#?a(Rt3_oVpI*%u(*; z%mil)I`|133eISYa1YW#?(ADRDRAqeKIhgg_!z~??|AS8xGHZZrZawPW#nC1`qIud zfq4TR;9KRw#2J{)8Lrm5oH)WK`od)AJ9qI-IC7!OFaL`d>s`LL_%OZ@QQi+Y#7&$v zn4)gs4mra)CePQpjCY-T_%bo_PVv0ZpU;akWX}0O|7A|EiQnsTp3vx{{Z4c-?JOs@ zK`-*H1m8Nv85JzUKdXtq_`B+3t-w5c(kBkvF|>PZ={v`LifvjL{H1cy5Amr>g!1+h zckw$h`t}-U`-_pgYXaP}!E@1u#$_K|SHJ9o8_JfcUfrFQ2s!QSZSS}3SlN)k2Uuxt zD3)F)9uLf%88&ve#AD+zo-I9D`0c$$s#oRTpbb6k87KX};B0P7)|p;>b|t5R#F?oU+OQHC=yK^{KG>LNqlQ};CEj>hhrx53%xO=LaeXY~PpwK*&kJ&F- zV#m2iU z6WS=cYMqyJ8#vi`Gx}KLbT2-0f_MQ+E8#qEVy(_8d;0BH7;hKd1wLT(e9>{$TcM5h z&{kwd?=pPmmgaeWn@8Ua&O1Dd@4C}IpXV3m#GZV-#Wz9z zcIefE2hn2_d(hpOFTztXKAZAc&rWN)#95l2kd~O@jJ2!v$Gf%na&UIru29|}zM!jD z2IiRm^U*o`xZ_Q9GBXfpD+gDiNBXj=jys^s*?V1-)rVH}FZwV|eb^ERY)o-y)$)?M z2P60hmea>n%eI|i`YAu8TIvY@pmpawd@@Gxud=vwHb2y@bNl!#9lejcKDXpMLpL+$ z8=14B(dGQt7zQYB&jIVbg!dq2gde?2mo)!Lm#jvo-k4xq<@4M@9YvhAOY%&U?~_62 z1+6Q#O!e-InDJK8687GVzgLX%_`w$Hypn}cciZVsJ9y1r#`p#4rD@hZ8jt3w&UCfw z1e~R1#6tbb$*LvO_#Q5TM-hK?*Hq^o&EIK=;>kPNs%CuY$(M zIQ&>_R5baS-&8HZ?>#NQnCmEa-`U(HiWjSPel^B-C&70w<@`>lJ@J?mKR(s?Lm8cB zA!W(~3rAmi|LBV&%oW|o1g#1`=-wVLh!k_z-{sEIVba5-iKo(E$D%^`}=~Ine&bslS`=YJa9h5+NF{Hh68`UOn$5h_(47M5ZZlG`8v4g&wOt_u*?nJ zFsJc%nQMe2)%)KxzH2=``vY&R%{oct{tNXB4~O9G*?6p`etj1&iaf!d$DP6WI^`3H#zE)bd!k61q{Q>Sj3dOrt z1dc?YJ>)j;IdSS9qgm0ZctVQ$!`04_t`M;|fT^>^i@hQFrFZac_<|dn&2d|=uI&@n zAqPTpiLsL1R*0Br<998ZKFxEC++>0i4^J^)-g_C@q{jG1bJem&FUHtYItymyVF!KP zUEs;Wgx{9V)Vk1th1=}+mS(@_#BF&4qxKxYo%GG}*}`vlZ!u$(J?@dhT|4F5_O^N{ zH{Q;KdJCwx#qfke+n(UP%fDYx@LD}Va7aHgG-`Yk#_?FqoYHr2QAk^b%BOefCi-t_ zNon?1Ow2a@&yI&?%1t5OB6EN{&=hMtTI=gN^?p1u&g_0ia~Qt|`qlJgIIwP1ww6BV z;1?f+iRcT7AhTMmB`pC}vt%9Df0+3=f#hmdiDG4>&noSj(s`d6N; zjWA!32aEXclD0uSdyRR`G7{&HLhDSjaq;x`Ci_CdEv#vi;yf|_le8g;)E@5~qHGVf{G>P9@mcrPyZ?W@PW$n!(7j(h&@${){NgMPOCs%(obl=N&W?oN%gC4=Og)h=J#+M>;%}ddzwaMT)jjK)dc@1tF$Q6HLNR09Kn#0- z-Dc)bGi}(pmFf4+u1(}^1<+UHcgOLOvG>_GQn_vu1E5zb8fMPy4C zX=Cr;(c`NZ&TrlQEZH807fsA7+}k**I=`QNcAxP|FPs#6at-79LB{pv$<7O95ydOj z9in0Q_eY_Nn~76v?3smbi_^XaouGlWx6Y9kvtO3Tb$X2d$oq9BJG3v+Lfi??^(XS1 zDn-{p|J-wL?&wl0e~trd#~$Ls@Lli?mwNM{lQfT3ytUsjF}vJ?Y$jg!Zh z6k9dWs&O#=D4fVYO&`IT$`l8kYsEvfX488tH=wnWwD+{=g`tt=YK4v4&aLQWIr=4ImFnQ%DlS_Swq|i;sa=|6;iepK2pS7{V}qk zYl`zi{e0F6=nS^a-J$__#%cWb5^Dp|%-w;g{bt8eu{v6obC z+JyZ0taSuK`#NUAcS1SDAcgnfr=J8i%X69{@EqPXR)*)Cfamz{i4&}4c-ObL;Xv^5 zU3k!U%eUMj_zdxfT=tm_9cA$uori11jws*BFf^N|H5F~esRMuXcq+sicmgd$m*$Sc zNB(I1UR%-JLCQSrw~bApP`IvR?iInK!dGpZ+tu>EWfSqfRrwivcyBaAOxnz20mXDO z`jT*9`)cv=)*~eZ!GTqeBw6PahP}? zWIc8MTRh0xnMKE8=-BByFxtf0iFTe!1k7Ep(vj0e>DVdhgARRG-Xiqotoxk}Evbxt z_1ItRf1ay`(F5Q7(%)m33t*oMLWd#far}OtOikXAB>gTI&jc4;`j7lB$1Vze(%+_| zGgoux;K!@S)*{CC8EDs$AtT=6VJeh&N81pUBk0gbP#6;7=TZ{U*MH_qh}af zrTURa-z@&njlR?^*A{uGXJPgLnO@dKe5m@1uboDEWcsng!I zW{I&c%polr;{EQWab)s0?%@CTHY|(3uqGPs3WbhzV{_@+@`qzK3_GuNH`Sh&py7R8 zisuSGT3Nq#waggp*yE+Qet`azI_+`VO0DHd8@6uC$97W(cq(iZeUew>yF2uW(KR{Y zq2<^XTZvOHyc=Bv9Cw6fj@Fac#_D8@&6)V&TdrsPYoLSW&_gwL+8-L7SoK-C4~-p7 zvTh856Q%RJkXL1`3B{Y$uWY!iKBTgpj^5f>4Bk6KUO(K|h+)M&ac7`^#W^eH_Zl$-pP)|(?6K;Tr$>DpyxanQ zKF0Wd6x)C&b1-;aJF#Cu*}dpj{acx96(5bUU#0n_`TYgfq`!f8XpBu7`p||6ZK=(R z`DUn$6Z7b&IPAqwn87=1r}!snLu)R@c2oHnyg*OZNIi$PMvQJ;wGCSmx|eiNeH+PV zY(m;Qnz462<+a~-1wZrcwpd&?9UDhKLEZzz5v-%U_Qaa7U)%On*81iY)2?u6_gIS2 zfz6$N^PTvJvG-m4o*Uba%2GdT2jXH8TT5#q#n8(36|i<0t%BBwxe_nN$0Q72PJ#!GSsA<+d*Q}JL92;lXV=BTiTa`^Kh`uM zVmyYShX{1R{Yww!V^;~b+jYPAaRhmiLcdJTE|$!`&VfnI8)?A@BhH^ z_Kz?+0`;{G*OCPNL_nM14p#CI+>sP)Dd)|T8BoERmiAz zVnu7+uReJ10Y_{5DDo8AcBa4e&`tDvCH=31@6}>^2^k%1VjZgcUFBqM%*4LQ^heE; zc)OBmJ<=D@d4b!}I^(Hu4tspWT{#o7afc-1JUdVF{m>-5F3i{w^BLdL$>~h~WHWc0 z<~i4B-->z2{jj>{_>H5p*?UZ&`-@(FI@y_an!K+C3pW(cWp4O;gUp}(;L4l-3p7vs zSe?+Y;Ct!QyH>^j`M^E$;VMRlNM*f?ABWMeWNVp0d%JkHq92{Z4nBMJ^74q_TrfGF z!5%;RZ=7pR;}@vC9qwlCVV~=0*a^2W*ESZi|EWGnM!8Gr@3eVs6`ynB+E+SH*{6cD z+VE|-_2>AyADHh9wP0_4n%HTX`Od~t{>SlQ7`b}e&VJ5`Zi7CmJ_lW6E3U$(T!Q^J zbKKc@0=>5hejRo`|JULF8hbJ|*miW=-mX)TwwF)IhSrQ6bpE3FW6r}(m<_9)vk6G|UfTtXI27qTf@Z}A>Tm^{F<5O`Js&r0CI zCO8!H;USh!I)%-B8}m!)DdJlU0MEie-ogP3&%aj3QwE;MU|?h%p1%Pe!Py8ONq~FN zpvLk%>xSXQvGf&;iKPi>iP#kMoqgRkp?QPHzsX)CW$I3TR~NvY5W|%9P(p1PQTsIjm(dN!$pDMU_WD}^kNr3(%c(~uQ&Ud8S9+* z0R6&`JD&HUKs@qAe71ovGRH}8B5ul;rs;=H&d2%fg>aR@9 z6W_kkoWH|=?HilW`-qik^r+yXW>ap^S0?d+_{~?2EdozZMEkn-;fwICz@=>)*xx%4m^s+n{>gLY=(L*G zXMtIJ%%bywNlqblv~RQ`7ue$;+I<(}Lmm0FrG1hqD>;w;)hW+l<1u%>eJhaP_6mIP zwE#Gh&jb8$Lv^HmS0H~-I&&r%7(Dnx<~T6A9|%8FkYp`G|Ad?4?DY#T?%G&SYY)5` zzI5hiH~Qaa^4*iqqPdr#t(On{$5kscJ@=FaG-vWQ1n?;lU0FH)ePCBV=D*0joWKwU zR*Tc>kA|N~gg)FJBu#DJw>*OXsRxHmOY&W^&%P_a#=^dz2A-#uM}~x_p9JR|4uFFa z>{ZHVVRb_{_XvM~g^ZMsL^10L@zO+oe`Rtiv;ckCRqMp0X=ranVic?wix@+MCUqC`>!`kH+>TiXN#>0zO`5j+9-wygU_ht{LDg$I51BXb*AB*T6^D@*IFC z+|-P(2knSH6o-_)ZoERi48W1N#p5$SeRf>Gw=yoaTY7`Ho{cb9Ug|^+F;C#-LjiCl zoXn@*MZnRu+}U4M;tciwhBjH}ePL3pXIBa1R&w*XQqn#Ot(AkLn*vkhA9w44FA`rc z@~H=Fpn<<2mRuupzUaRayMg_eZPcl{^RWZG&Rl!~oPP_Pzgm+2%t`Q?F*yI)&c_3n z9Ny*QTzPNe`$W7i{40xh?$mvTeHik6x+L;U*;Idh3@+or$l)r+<={?dbyX7AE<~?(o{RZtPZQ(BBh8^SIm4EkNjK5z!Biz=I=gm_?bId={Q}x$4 z_sm$%-s7|n58fDGKfhYOXhxSfQ2LShfh||ZyS7|I+|9Yn$-=z@k2w3+l;UsF#(2O7 z-Sau=R$wT9__3qgF5P#k{2%_|)JrRpMs_Av;+sf%`OV)twQkCIdPg1dc*WyK%YXBC zr^71&2aBn-1bH#QJCe*&ujzr*d_x&QJvQo-1|IX?);HKH=;?his@t z=A`ivs(B3GrM|#Wi06*rytex92HKmUhq3aHI;$J|mFDcP3xy9?Ig!DxN5C`s20Zsk z$s*DRL!?zP2m2pp4z6!}ps2ZgV*~%iM+B4Vb3W-Ty*$U*F;?9K<(7jC7z)F|zT2@!<+l|1bUePPZXz zNOy{-d9s@Mvlf1y1OGKRr%#R2Y5e@jMJv3EiRt1cEpg(|0h+y1aQUw95ZBz1LOx;8K^YWhn(B~8;jeEah*P%vKCY3gXm!uxsT z!9xXR{nq}}!D;PHd~3+U`}yng(hcC?m$TMww(zuknehRpbGO`_K7QNH>5i7r5gRX} zE40e^7<6*(@cCo+#9iw5aNxyw$=rD<>l|ox&84gz80)@|v=@Cf5KnEmG@bdFjW#+>>!zm-qvg}`x{zD=MNrDu;J<3BcrwyefS|J?~N zsD1IP?Do}P^|g8yJYc~}&W?V#-OwiU()81hL!>stKHUWV$S8L*9u=!;yY)RISVde+7A#nCHoX(W;E8_nGo{PfX{6H6y z&ByAD$?I08o3Y7GoEuty9HUS#{& zDLEo|Iy@W|Dc%<2CHl*zyZXuKgFemG=V8}`=B9vK)@6pzI_OIBJuv%O^ebDJSNwr9 z@B*t7f#TKj%5WO&^}8PY?0`#YZd8+;&O&EPUClWAJI| zgwKFGW6x}a2Zyf+n6b9&17M8{w`xPr#`*YqP4aYmGxxxUT?ZhChJwV&cpkfl))@Ex zS@@Y5)cryboBY_iV#e4y!dq92zgxL(>r;$1yRO&~Vhw~Y55Jlv8oz+P{rQ$n-z9?= z()TCei_(Ln^Jv{6yNZ36-YtDdI$4r2)cTRSjs~Dt`9l}*yb-;?j_nC>Ej{iydeaqr zpG4k&^=&)utXk>gLz)NDr=(l`in6NHEvjX`U7J>Ys#kpX3GiQqU(^)*Nvf{IZx7jA zb(J$z!qco_(TQGm+g82&=-=MsP>*!=Ue2USw@MWABsNJOwyVgTSTrvZ+pPEi==43| zX5#RCZu`;l=i;Ycdh~~xM_y)}n(p!RSka%wsq+zMiS*bc zzJk(STdwl-)*7A{(_5QA{C2&S_+oF_5VJ`-^;(`6gROJX+hGfnW_9W%=+w2LnS*N=QV+0|@@!rIWusH~mA@Uf z64Cc3%af5jp%q2=U+s>W&D~LA8W&s{ZY0@WS6(+Zq_@VUQz{(K$m7ss5|7cX)qZ3 z{b(?Toyg85ja5@6W5&Gb<7wMy;D2@-^WjUs&-^Vuo<-*s9-UM7=G3nqStb3flNeiO zPA{lU3m1*p15%4>vC(^DzY-jZR{No0=|`zPG;W%ynlCk~O;@b3$$ry2q7PQy+dXNilG$%XZ_kvxzjrt`! zP9k(e`gHCM>CyZf(&wk%VB$7tE>(|GFLu%6=+1(z_iW}`)V1f{`JUayLNH- zZ_m#rCReAEd0yPR#9d*pjUe_)|*Yxz_)bH zU?9>aoXJKl+ce$+tKW-Vn!Vxnr?5-QCT(aOdJ{aV>kROmX5Ggbks()n4STTc!UNc* z*I;vU!EMufunYHM7oJ$R)|28n^Pz|Tn|cS}5waP*lMQ)G9{U_`WL7_?d|JnVt3cNJ zxg&S;KD$Qm2>oM)*5@BKe8H3b)sHgzsHyB*TS>GpX8hP{lcqa(M9Om ziq%&hU=Qn&$BsVN*mY{d!o#PYt8-742l8JY+_vrLhL@i`H8`pF)JnYrM|mJ`ul5Bu z1$OML07ljKhdjMLdvmdvJ%4S^Q%}yx~3Y5X(P0xc5!`ql3HO5}`Q; zzpC>Bega716om8TV}dn*497K2Gb0`Gv$2y&wE*qCT$si zZx1BIO`vL3^qHH#?LfJmyX{xe$SQiW`93XHtH_YhOHwp*;(3%+)#Wb(WdH{*suB64%DwE?r~ZKY-%%%|4w}_ zI?-c+ef8Y?o4^OWAr#}jNN1mc0~p8PARccv{8Opp|FrChJ)W#9#%JN8u=-}=f{FQ`2oocMSPKbs(^mZa){-CFUz=iUDc+bvzAETVbyYKt z=Db!hYe#&~IAhxrscj|Bf5$zkR|E0dVE0nD6dvHuRTqCYJGZTUVH$M>!preparWMe z9;>sXqMLejChWdTj9vcUs6%}{vB#UkZb7Uk#(B#!=(T==pXpYgMw;lK^xP(BKFm2I z+iquG4gQ8++ma*P*UGym|6}aINFTUZJO&$!!LGZEU6Fc(PkzQOYrnydy>mzz#>bCO zJn^hurY3TP*lFh6AijY;hnAo()i|4pWzwE04R&X4aW;!?+%_lba{feqLu=lgG!#bO z;`4`X+iUy4`fHYT^aqb5N!to97Cc?}HEZljjNat=5y*$g)VIhXZXtF@c#+HcQ@qb* z4w-NHPEWDs40UW_owN-6bhdnAl(RAI$ALlVDqD+BF@90zEM3Resrx#%UdrzhepB{! z+|^X6ShK>h^0S`5DhB;_k>)i2pd!%x!-|f{p?yyCk19ImH&w=4{&+OC!AU#KeSG6? z4|Mbqd?lbkZ0nw{Y7Kb!CH2XE>(}|6UifZ3ad`xHBd~J*&B$ryOivwY=AJBYvXK7+ z_!(#S%fiMOu>Kf7pQy7B>Z>_Ve-u~r}!DIaPr&qnS#(Vz)dV1ae+_kFi zXD^!l&0g#d=KZYqUe9;=G}rwt=N9I7+=IVgeiiE^vnNWOImCIf`=dG2>K?4dma~R^ zP3=*tZTn5OxenmU_N7d+CmG0bhz;by`cf8L+8;_~y*IP=t1ZS(%CkHNo|Mj9Qy%HP zL*t#-)OpV$_?2v7VQ5BvGUezM3HD$)J2%!iuEW{$@w#uQHg&6y*>(T5#=E?_JOZq>{8r+Z5i6-Z7i1is*0(t4 z*)Qq+r&@mc7A#qLuIyB1b%_(f_7mPKTppyY$H}W$UL0URSDS=?F0sk{cw3^u@&xCe z@wF(S-dc1K<_PCqR*>&T^51|==gfP^i!UQTX8f?*7rOWw|1uW67Ju9-aM1`}cINDMZJHwp;0^=3?u=I?+*JOHiL(OSA4YFj=_WtTZie!@KT|_Y!To&0=?PyK7G?2mH1XQ__#qH8hX^aDH~tE{y)H1zwCh* z!B-P==uzrxz#d?6#5!)t3)q2vUmWdW{B0W(ar8ynX!OT>#&0tFJHba19N7Lhyq;Mt zxo`9E{m3`bUsT^A%6*3Ns#EmxDgN7Xodc}^}X_ru2a%^G$s=_m-DaKk061EZqRD?cu-HZqg~M*b{5Tu6P}=sZUX!r#UBju{x5n zb^3L*U{ADlbp9^$g4Q&{;KD_B(mt~6XX;a{KOfXrjjwE`F8_75-F`Fq{4q|*#z}vb zuZwx2HNAaLQSM@Jm5^@Xl7F*>ORyX}pLt=3v6X#Q^G&!+0H3=ruICv5+GyRiU6VG7nGZTI}3%)s zGto;M;n92W2Q0!*c`Z+ubv|;(`0@xRCu$tlMQ zpkx6!Sf!YW+N+a2O=lV$^8Ok7bHnI@nY+282){d}E8iTxMezM(uX7$Zx-L>;N#j*L${*+0NXyNXhc@5U>~W zzjbnT_lal2@%ikpBz@Ztdd$!jvt#EvXd_&}nmQGlPK=U`CA^=_ofJRMco5%dZ!P83VK{Ui2Wn@hizF~-V+?S%Q~*$7==);yQ|IKcc~ZuY)e2Qc0V=vrxak(R+u zr+Fe?6rqj-&n}H0$SjM;GtqcK!K^mXgVu9r!9`K1U@%6!#8Gs}6!#%lH9H$?;8j&m z1U7zwd0o|xJV&0m=)6^bNo+;4@35vj6{_=aKb81&tRIGfF^&8iflq0E44D5)e?IPj3Inm-^$9v z&kSNm%nvx}LDsSPzfwHUyuAbXt`)@tarCtI6#b9uOdxG71doc1R`r*GjZM%sXRkJ* zw_^in-KjI~E2lAz*RZhH}s{iC{9AW=0jlDwisg^w@#c_&Ietm~g@c(N*Ks_M%BKj&T`_uf1ZNWzoY zB%qQTP^2gj8zwgi);xeHVjZ=e1ew-^fR<{fq-e>5t$_<_u&py;zCQwV#++z$`V}jT zGcSVl0iJM(*ee}CN9J?HGFwbx#I?X}lh zdu_#;w7mE9cX;pSJ`cklQ@hPQ&UwoY;`Gbk(3j;8t3LtGGxgnHVr2zQ3;S8C;teEJBc#tL7>N{xPI_5c;*XZeQ z_x@X94tHd3KX!w)lk>qZdGG3vJrs(~f&TA<2h?!pp|=j)o8vhfTvyDwAe*nN zZpj5Tn%DMTmUX!*zQwdo9-u&yrEzQ4SzdO9Ez4`6Jo|&Adz#efPJibz5a9+>I zyr=vgkmnSwbZ(A09%o9!Ck1&QdPh1FW=7exwvC(=1 zYth)@lue22gR;>%gVQT=3~MZVuNKC;!&_iwd9%WsiOZYEJ31ccOfF+~o-s87&ibzJ z8biS?dhdnjjxH#Rud=ExWklwdl;1+C|Tb9W}F4xHub+ z5uC%f2h2Z}66zK&bL(z_|KUp%6a3%DZY#Py0^JoE_@6?bl1tj5UFq)Zb5GbZ z1$R4itbDS?;_I_%!V1I6^fPCP>3f9!ZxI~>v-oW`XC!uOp9#z^&litZn`eGC_%gB= zV;qXTT32t0=I`KJGv9W7iCCA+bJk6x7dy~a$n?}-nY-E-T$e^Yn@n2&o? zI~RCU!|nRU{CR=AFJuvW?xVr&FEm#5Z&+d+Tw|t1_khd!-jwiq>Q??P{*N*zi|)ey z$o#VJ?v1Zw6Zqa!>TSJ`Id_C_Ha?j%!e=jY@+ze#^z|0{n)qI3zjGIGyuK0Sm(8gK zT~8(bcGu+dtU(d)0_zNQW}6vN&cwweH@-ic`w*vqb9k!es`;pY)2i?IH+dL~WAXVK z8qT?C-re~dqF$AY+#lMhvXgmNn>rhpXR`i1zQEQUst=L6i*+`C%G`g5eUR4sk5=D< zJb5>A<)0&8-i4g`C3Ng}TF9M}M{(hL%aA3IggWry@T8^6R`7hsw9qWVo%{U*(!Tu>7?X|)K|J!Z3 z#PK_pEUj;vGvaHS6T-uwC&NBBr*)k*aeF&!jJ`|WzmT8(ftz2x$@(t*MfmRO)99@I zT{NTe#OAX9@5R=YL7Kj)oICE~33_jb_uKj7+BO$)<^8j$dr-R<v*c^IO0#gWr69nfxmGW$~-vH-=w1zp?zv z_>JRt3%~JJAAI2K)Ct!4yRNWeOD9_IKhBwgx+|>@@BJL-aI>w!k!EbL*;gR`V4)}K zUE|0<20p(Z+wAsE+3c^$Z<7 z#PhfG3@xqZd5xZ-r)HiX*Yg*xXqe|GJ+U)S^N$?R_YC)jZQ{PU&7Ro6Hcu?}tS9#2 zbKEEPBKL~D#Qk%xaChUYo>*iTaKFi~c}#(EwKESJEMvRk+8^8jMMY3xOqT&<|^Pk z!+Cx5@Z7P*_$Pbt!TgJ^9PHS+#L(&apnGl(_s2!J_cpJ2SicPeeLM=h_E-Xk>d#@1 z-2?pYSk2U(Ng4BE$&7RFgQc;)hf0yfp*Pylorcko&{2jbmj7*IyZpdYm;;sg?q18D z>jlmtZvF^8l)w1f9bYyUzsbD>r*ePUHegQZJZa3C)kU85itSH+bSpn@L?-+%bW$g% zKT7=*lAKsH8ZX=T1~_b3x$6sE_~~wJ7m-)E&q=bytIpkDkv;MEU&P;%j`^dH-L?g3uW8Kfss9g}y7Fezn}!l!Nc4?y$=nh0gPi)cVLvA?~zJt?!@A zz3tp{UlTy4S~`I-E=K1@Yzom>DNXaOXp;wiP|Wc=pjtGFqp7wW5B*=|>Nt1K7wJlI;(CH`HI{ zO^cqyo^l{}^F7*UcjX!f4{#s*Ve~#d;PV0EYG|J+dENIUvBXjX;o$!&Q7rz0QOUuy z7rNTF$=6X_AYGB*x92fqDjY1yB`*F_!+yT@_#=nTe(=SeeY59rXDa7OkdxU{@0UGT zGMK%;MxWU7XJv=vbJX&=aib$sjGdcHidROaY@X1&-@aFVS($Vw+UtEwWs>*zZSz^$ zGxHplEI|CMjj|)Rc)ITyIjZ}fQ`3{IbL=Z*i!uy+GqM|r6HyZLlq1X9d?mg0*dFIR zSTA%OiO;8^ozO@l`nrXDn-1@r%Dk8f?aubZ%H|rQv+qR5!`?Hy92!OEm%RWR5&CWJ zAXu4;4aue#>f4L1KAZD7joj5Cn0wLHXYH;vYH#0m`8J~*espBxUE*>6WGoqCNXWAQ!SP{D?{tg3qt^SCEN zcM_`}`N;_$wU;Y95-^>ba*HLH)OKlu1Jly@f3U@YBl0-7_>3_0JnF#ky#yF~Gs^3; z{|4XI=dk%_5gX(=W2fdrp4l=X@{+N$FrL>PgQC0f^S>h$s|L5|Z*ACj^Q=8v-z^T^ zPo^F9qwm=g%lD}CB|f_kdmaH+_Dc7lukD+HuG!34X`>9g%L=vw&Hend1bIE23} zw`_B~EcOohci3e%#lNA~Rav);>~%%(@8Gx4y#Y%v{Yz|zxG^y!#QZGA*4I18-39o> zkl*@-jpv=C^-kY{yqD3pa{5+5-*mRCg8D>@zTACJ2jNw{>eEQ(4}H=cX5OBz{kmO` znn}fM_w$BHD1Y?Z1BtdlrhRyR5&8wB78<;mgEzGNVVKr+oOHe-wAe6cbB(3c60pH1K`u z@T&ebJk^`ZD`=U;V^PW)%(^99OO zCW(2CtaSr)S!8C~d|PF9Pj<>olHI07G63?%NWHut5NV` zjpu6N5g&i>c;*%(R-RPcUj*DsIP2~iF28k8bm@J}o7K`cdcxvk;%7GRD~+FzkIO*q zOUSovQ9<8b<@I^FzI-2Z!%wUZXt9EObVete-S;eqr&gK4x~8?I--eEmnT*)Gr6sWe z=1J=KHHRW2eU(1{m7^J(jn`ehx9!c?nvKuKS zGkV2)CgZcf*j%5BUNARAJd^a!fSK7Dz(*y+%nT2Lult&A9Y7zmxEve^Z>OM}e@vDw z)TyTw-iEI7bThj5JkB@fbH1^x*q5JghIUT9k~zT~FWchle3&_YJu*q&T=Ep)$4x8= z@qwTp9}DsX;RBj4E)4nTpEi3&Mz`Vv04&el$Nw5nS~QRUYvQmdmb+lO314Lwo;~OY z@5#V71RA=5vtZYcqRru)35)lw@Bdufw> zY4y|~r@UL_wN6fkH?b}rf5_N*?ia{@yNZcB#+f4MN$m_mKaoAf=*Gu{GZz@vL}C!^ z#eXY;oGN~H{Grg!6Y%|0ua;WxqMO`6KhH$Vuscj(>@uQ_*w;muk=4W=N;76<{vl~r zgmpf^UBHT&?`N+bY~0+Ij0~KD-Z0GEJl^DO4cFH7w-Kl61U$YLU0~^ad<&sxmFYt! zk&JMB%DkBLdnZ}nPnLROCt0gb-opH-M8;d_iJiEEb@?vn`K4hy`wopR=z*SHSxNT- z`_KcO;a=c@nT~uaU*|O*?ymyRXXCiooPY}l51HW%fWo}zzMV?KzG=7ON-_s0?8b5PP zxR*U);A#hUoYPy+GKOzA8LbaBVH2m%8c)G^r|t-cuME(x)8`EM0($w|ow7CYek*S| zc{R8Dnd6y*Wrsd&4#jQ+e#zPY8t2zHnSt;s#+mVZOX-sNMO%%~*if=}1LN@Dk-hgy zR*%cxS|?n1V#vx7_B9#sa_KXP9d^2%wy)@R&mIt;h4GV|T}B;(O?b3rdvIsJv%lNx zH@0i9*uz?*Z+G+l*Z;NZrPwnjdt=UKZ8l?Pw()C1Umh^FORp}S`ruSgYyh4*h z-xVG^rlj^(8b2nie05{zm;=3)j*Kl`tgVMl-fin)bx(Fn6MHnqTJcMc(yraVd)fC; zPq+4Hf`xQ_KgV7~b46$SG+vrR`aZzCsjkbi_Z}YL*Ec%`Aborz&g*)%rPz6uwk1B+ zGogu|X6L)Dv!3qgtk-%av-zUh|M%oLyk|J;or}Xe>06Ak=!fR*eKWRY(b72d<`bf; z5BXS6df_?w-1Amx{sn8ZFIqFBrL7D*Ll9p&*&{Wk*;@bMmnQQ^wBYF39i6K&)7UN^ zqcap&(4P98ZC(+z;M4cwd*Y{`($Ckg@e|{0LcFY_Cy?!?`huR``SzsNciN1^X-a%T z_HOBf)sAFCeG}acK%-}%QP~E9(ElO!VA|iQz17$QK5oxBTcY-Q@ZB+}&-FQYi1vhQ z(VS>sI*E?H!I$r1JO;2!X2-`x>9J>uWAAVCai<_-VeT$$hfdCqMaOUjw44nsPc>s7 zOgHVg4)*v#i+5A5omdlR7_;i{;Y&-biR$lQ51h_i@tCpd5guqb*&g$r=SbVQp|Il{ zW&JgOg*=;dM_2XtlJHwv%)gJ=^7wksbaXxS9#4Vf{+j!|1-+ARvuY=0Sh7Q|nv`ih za!(d~?N;mIYsOgLnlzT@1=hE(8E37YG~VjnHlMr`h@}iqxtDcf(iM)M?RO?xkAPb< zt`8Ud(%)UGqtkc&+IbV&v9^WQBO^DZhVnu=_O%yhO&J|@HpflpPB{$=5y$2fh|``2wfXSgF^4Et{Q zRLy%ve|6Ivg-eNUV^?xz$Z?7K+a`HvP1)=M}!a+Q?ZmR~LwW4L>l+e2M%( zb6YS-f6@b;>e?L7^ZGl!;X`+|dv4EjoP|5nJ-6n)P=C#P{{Eh^!29BE z`m%fO(N}iQJ@)GEx!c~`P`LHI^@UsB3m3M(x2~{f>~8XxQ%9h`=OxO=;U9P~-8y%y z+&X`#%=#dDi>337nIDxM>PIG@i|tVJ*F;b1_O}W6-EV^PJG^VX$(HRBIT$|oRx*3N zr+GQH+`LHMryblTWR<3hPkQmlLKZ|KYK*mMmiaO zm`XbDw!ha2>U(a6VO8?(<98fCmNo2Ka_${mEWgh`hep!{FEEXa{|_K{rMSV1WIE_?u({_05$JO!CY@&eJ!^3Hl#EzoYeffIYd3hx5o4>hn=}ulhU{IpzfX zIyiP*Sb5a%=dwbv=h?%oF;k+GpwH*gceSUY!auzuP(hGIdv_>P(!cUyFZpb^4|8cfp{%QE`?7X))HWqqR`j&VddRDr| zS^p8)K8`qcX1iYKUN}npo^_dal>a5p3AI3zsy7tpmwFzGf4VVOl&;@ka}qxL6R`PT zf$e`HzNA-TcTOUfxCg&F=N>WpoDcKv++^fxeu-zi4(q(nWb+_?Cm)~pX})*IUd}sF zzwHMtofq%3Q|Uvy_sh0DUUNMUT}T;eQ}`}h*~k9*I@e-$=5fz%JGi@ny^!omvd!m` zUvQ&q-L5fCghg={G+&hN=WK`SHi&1WvxmMiv5fdxs2T z!XwSQ3yoo%m2Q5m(C{@72i_n?vCb-d1^j#&Jl%_L1oyo)Cpq`Nh_A=%(Ok}<9=9LT zH49&YM{8(AJj8?PR!N)G*tN-iIzH7^zk$<_(J_C@;8qrN0>LcXa${4Bbj^=y& z4bGpnuqTe(UsjJkZe;^|3ibpmMW2y>Pigg?UbqVRxh{wA?~g2roy{mAE-mfR7qggk zq{(SBOMWAK*Vwz?GQc%+=Vig%0p7~^&$REyD!~`+9;pU0GcSC^ z9@YG7;NFE6`_6@%8PkvNHUU5Od~@1YKQlTf1Ha;^2?ytwa)$wY-I;$54m6LXYt=aS zuwFa(cG~N&`X}fGKCqDc7*;a}_i+CQ`F#=jOnyB6?s!#~B-!)0`o8%8_o^(_SA(yG zO-K0e+3(O(V(b??jeB72G-AQq@7(R8_lG|pim}jdf9SeU?1!93(RlRZ1NuIFlWvIn z0S>-A$=|AY;)kKn9>%4E_O!RnL8fv23(nDRhd!PAJI~!!%slvM2W>#77k_i<)$NDl z%V@-X8rj>%`{nX0mp%ore)6pp9S$;k2r9TjaDbXt#etb z^Hc9=Xihn(aS6761)ptSr($nQpC>!Q655w;99vkX{uASJUze2{K7h=4n3(gI#^s)x z6$sba@}wuKI&>yR@|MoZC`Px=!DQou*@Ewk{|>BP4iOx#=Xbx+!XvN&=Z_R zPXMEcotusB;0x#tiqIdF@_q~Nm1gY2rGWxyqxJpC#DeGl2z4Fh*`}LgB?Vez49+l~ z+v6n;dBaBGtS4zi*U@Br2fsIuI0S*N2G9P&o~j1kiRbjVudA`Clz0Sw{)tmi+A#NM zQc{;}Fg|mYeWuu*pWI<*w-c*dXnlbERI{|KAbWwivKt;O{i@c&nheJu#eW1F2&5OS^lS80 z{Tu{W-AzB^Y~jxf+mpV)*+R}0d;hv{Z&Mk5>Ervm*^BOGFWR1TQ;*^juH|Ka?DgCy<*9YH)R#R^jVPtJo82Zn#02Xk<`8y|*ym`l*`Q%ms+R18p^ z%~YN6Uwf~iZ+f?RV!WJaU*lxA9hXn?kemFe#_ht5#w*ykZUTC=8+0~p;C^CjSB-#g zCc!s9KBrcM46y|HFsGrrFt=fMVb9}6*Bz9f=`(f)uYw+_=PKgN8;nKXMENB<>%C+d zwJmxRpV1u4GmM?=HDW!Fhq{c%jIN9Zqy8(5M;U28zT4}%&czY4Lf@1>FOTuearBDq z=&$@6xU)3Rh~-~JGPklTpd)Pi5%0*(k>VfNf?flMKJtxZulvBHk(>7Jv}1s1 zeSK?Mo)Nruni+vnAe$8ktMz$Ah4I_+MH9AL#Y}5x_ z$ANV>zShw4_eNE6)4cH_fSXMLVFlU|QdvSnr zhp*;L*Cb={sPDW%?95To)6i#nAU&Kuu;x&D$#u`2oV|I%j9lVHAWNP6C~4LR^uEji z`(8l{deb`LzL)dv`;lRZR^VT;Pg{fBGPRV6aCe!?^dd{20k^dQ`s4}K*Wxn}e53OA zq7B1Vst-q)BU3TyEgrT*??=nXt;KCJ7@X70 znb>aM)s)7#9MHI6f7utmugUV4bA~C^9{&>JD0Xm`O!{DZY_Xw%|AYGG;#0V4U|lN* zSME2RZ&RCUE0I22IOTWcj!}odEbOB_`DFNz<8%(_uPGliM}}WW4Q(97_|5R7?SH`> z70yP^+Qt~1LSJ~j2U>xzPvd<$?;-lP+aKzhyguiFdHix|`(}RkP26&8)3FUH94;OwKj(XiED^zsI=?Y#+2$OTMM#(>Ms9J;0Jqy7HwP-M>vA4S(?8 z7S{BUXa~-n2)afhJ42U z(uqU1?vi_grw$9nmSJ;P{?ToRY9FoMsCXliZRJnvr|zlfl%|JDtr^Hl*WqJu7~jSQ z@af8k&D1xq=7Bj&eZ#`lM)uoRA%`@7Sa#^UAKrGT=@F+sFLe?32AgKXTURxN3LfL$ z>A##fZf0|6cz%iD?X1H;sPf8jGnW;oEhePcLxe_NI5Usj8cDn4JGKH|}p;o}Sa6sXS|uraUj8waQ1 zzoWYH@!=^OU;olN!>MmS>#6R)T!77cMJoAH4+2(mFSo{j)n6WA(cdUC(Re??sN2J&69*XQ%MXF?RUrv-(PW`t8fFq^>LDb&ZeL zWun})U}?zEYBr>Zan{$@%%r#IDaztpKT+53c7&hSCjwhc>dgY{v#LX zkCI>UY}V7aWkKWM)S%Hi6*)Tp>QF(|N9M{9^S2K_XJ}=S@1sEHe*VLD-vXVYgNVMz z$L~^|qHh}eP3aQR=NQO~H8;iI|1AFg#rS(g{C$xVSF!p_&b_#27rxd(xr=m)m&S3@ zo+%?9$LX)wb4vDmn|Y+$JDP8@q$@uHAC@fy-kW)5GWNjqhDAlg%+v2o**w9$ zPiU9NbGnwkx;n1GBw_?N8<*8L3lFmCChGs)I@*^y`u7WUl^O?q@KArI8BT6+?7Z6R zIW|e{kFn=+e)hQ;MV4!ibZxbgFKv4;d&LdxOJxt1E-1v>+v9DRyZ%c2eO>$r(YhC?O_RgGs!>_bQc6IBa3C?|5I`@0w zenrylcpHB(Ea|xSqSy7w|8zu2eGze>n`j3)`e1JfIs@9BgpAe;F9^VglessphP`a! z8a|EK3l;tp+kcz!euVoD%4@_=7NAa8eQ|j43J?rB2IPy!wTR&%fB@?9b zgV(*a9Nh-zXGYIw&0bfWn(w1Mr7KN&-1O(|bnY(o;vdVp9+~2?qE~>!w?eV4*Ay2B z|L-t2T-xt={M*)6#zFcNgFQu0sbl-?=Wc_e_;N%vCh@Z_-&$u_LE3e6`%diV><>ck zRoipVdEX14NyOPy8)wd$hkfYYE$eHieH?&xcMcq1OuNwj4bP zF?~wC(y7J!6OW5H;P%IPm#w23TSsIhYlCg?7`h(K!+o70%bNNHYd>SRZ*-`h{;k@p z=K!(uyjSedUTk?+$V#LetzG(-NCP@AbYa{_h3eNK53!fC>A|K2zHQ*!V=8+I9eykR zEwR3D^UW^j5A9T48<4FOm&5(0y4LaS>wL?BmRuhR@nVgy=B67PU-*~pR%yGyRl7a* z4z47_+j`5(*m8W2h5E}_=Y;d2_*Nz|^Y-`}kcEu=GBUsq-8J-&@GsZ?@i2BB9LTmm z6d*=+yzI+O&UzT4A05!A*5CGo^*3?N6hQSMrf}xv!xG+?DE`~vNf2T~DU1lkDt4t36 zZkgxsZAgS$@i^>tvqSSS4l`vc*oRc*awntkhz_QgxN~{<`sbr7AwIj~*N?8m_3IDd z*Do1L=UUbhzfWfaf;kQxN9nuUN8!egZqsdx`IKY(N|2xCMw;Ly}p3g#B#mp zIi(8~yaD9llRST#?sBj>`QSU8b&Iji^@K;*=ly*~C&fnF>?Y=5wa3&x!+0n0Wh2|ntLOUbGYb9>eX&-xr0{n07_3;aw zWy5E581=ZZQH8(c;lyO(JIYjhZJEk9`SyCyyS>G?BK(mRV=Th{>K5MJw(_VqIkx7| zJe5O7p6t^Zm}Fb$t}-TNg49*U@2Yq`NBE}q8&wayH3it^$E9yi3@_J%AoVxNYW4&R$^XW&CdBoKf#s`CoG{%!|b5 zoJo8Rd`Bg3dQ5Y_>l36g>f>CZ#%$v7jLvhc)5H)vy$^luSk9St)Oim2YQHrH9#W?m zf&IwP5n^`w>c7=LfqriqEI#BnCn6t&Hs0aABD}^kKAMBwCxAQu zGtAv%CWLD)$uD2&OY^F|FT@77PvEzPm~S;R+uDkdL7KT&=ijJ9_owGJ|FCVM&Ro!r zc>huSc3D@x-{P5Qr>})}dZ&b9`OU_`WX8wGcuwxCpz(RT*~ojUt<)goij&%8@@aJu=2;)OiGri`?6WuI z^L0WTmowJ4>HC2h8`_@dS$iv$*@fP6gPmu6n}H2hcK&wsrSb!)w*Ni& zo$B4&754bU%h{K$pqvc{u$}fkS(>{lL^UqoM5yV1AG`l(wFFDtNz@y#K&Yb>B+9PQDAS9?qQ$t{!}1 zL-xO?tHJ&UPH1N{V;IBk*QpooT?Q<#ySF zCVq7Dp^)tdV05h>GcLRnIWCX+P|i>7c-ZqC_Kb@j<6cAggvtM;m$}`?ybLqu*|gaN ze@UVL3n&w0P73eKKfktZeO6Z37{2@Y2JrCmH9r8BWIJY575+0?!G3qfaxR7ykfREStQ| z*f@UY)wvtZr!k%Hz$*&}2cHp+cYTkT$;4>9nYPq7FL`y|NPSy7W+Hv!ej3{1UdC7@ zeOe8#Sp#oaHfd8^Mb>z`PlC5#_TSJazul+J+|6ZBMtRkz+A-t9Im*NQ|B!y^&Ynr= zOA`B)W*$o&a#EJ_B222)Je#MOGbf zodPcOCX5gEHeg!`Y}aFB3Gp-NzuFwdJTZ-`{vz(1yARk5bni!zJ>J2Opb_8v9AL{K z-!6QWdRYICq3g&6zQ-DjgTULWa*B1fguG4s4g=>;pwTy=#pUp}TWLRP&x?%CCwUkD zn88mx;x=T$)9|1k=B41NhE^-GjBqe(l+66eKh#;Ui!P9-;J_$G9K5$YhJoIfC$?9y1@ z1NWEWr&)3#<~Qq!?JMlsB9@>}=G*u6%fXM6z5P>5@onj`*G|!!69>%k9d+ia>-*^X z#SQJ_CqGKFb4`wM`WS2ZH$N;r^vcotLmmIM>d?5Xto^1jHtaFRg^w{$-(|i^pV;Ub z8*aj1QM9h_%%x|vW-a0SefD?F@hruId`A0J$tpg^d@VHT^2$2<`SQH7cJ%jcUTLJS zZ5zsGZ*b3W*3wa|rK4F(Gtf6=qIbwbKQ@Ngzr*pbaC}5vpY6PA$N$M>&UWMj2mHyz z7QW->q1a!;V>@0)W=OWr4`u!%{)Zj^hz_gRXtg?tG4q^hy}!+4onLCSau-Bw@C*3k z93!SP?;4NZW5oqU@~L8f8AJZqiG5^%eZ&XshdX{4s^3REkia#MEz+H6U!Jjc!hm<4 zrE&yhvGD1#K3HhPiYX&Miw~MTtp&s&Eh466JG|bGO^mObr<}MPq#dE%WAILukK92& zuvvApzaFauczR6lBZyQ zBlhgcz8!TRRUe9uH0vYCzrD}-xXa#YL-il0{$A=NjzmF(I_s#j4%@oUoNfMR+66wv zDkgSK0kLZeR9`Li^{T#GjMy{i0Enf1x)|A5`@;-)M&BQb3nGJ|`slV>oVrT!|KYoZ ztdh^a`s)vJ4*~x1iU|@xH^?4%e?B}i@OK{cQVnmZ-s9*#^sUd6-yda7s7UUA<@`&g z)&HW0^KoA5{X@g7_y2{s`}g{+_kr;|wxfu~>$}BWN1K097`X+x8Q=DI@M~W>+UPn) zT%elI8?hw;PuEh9*%btq%k{n2>(4L0a@9-0;^fZWZAn(geGY9kNDl!W9APc(7)?wd z*1kmFI`MKV4WB#GmI1qKk8GhoerQdx>-(CGf?jA%zQ!)>g1Z_Wi^krQ>(Ja9^tB(Y z{t`5QC$ztqIdBJaVG%s!cH$EbxAoQS@%zvO-*4fO7xaJBcLaKQhx# z%n9MO7(av8$*=NiQ+ZT}>^|Z>e{AlZPtZx{q0iZiuBk!1mUXECU%jTZlCC3RPuH<* ze4DWmMM}BjlJ7^F!-Yqi*A*Ta-97h6^ZLRF^EC1x@mmABgQn}aSy3k{0_U4DI*fqqNbVL3?o*Q z*ZN>tsnuUnT=2KVYJIY^*xEdj7&XY+YtfrNH72z43C;-YOEzBKoQ(biUx_(M#%%46 zdKljbvet*CrfqN1v%a(5F1~^_z|TA_!oR2g@y!!z;iZ1|u7^E-`&_*rI#w)g`9XXz z!H5~GGm2Z8OBu=7lenjWI18}=zN!AJ0-F>&*=jZq%J10+&8v*|yS*i5fpyG02yMl- zH2-;jF?;KV$=r#O?C_KZ=(w@@r-e<;KPzm6mRp*?*xv$OH=s5$B>_+#|h3$OSm^2&cuGDQz?^i46XlNrR$ zm~QMm1+P_XbssjQUEAhhryAdn++p7})(3yRX>PG~J(#`?p9(DzC9s`8I|5PlG#?q1p!jupR}y9xIz4t5dwEY|3$?BVOp zKzRPx@nP+Kc9~2yYX+@-UDvQf#u{Qwg!8$v9^yiIy9csY#)DY z+V->RJx7~G-jUIx$VYQD{_L}l0+Ypf4niZl(Z97b#+rAUhtI#b%90MqM|}bK#ER6h z;ggd~EkF1>QI`0_@dS$l~Ova`Q&b#Ka_ zXe-WuH`Fv;zI?T3SnFA2i0VmBEW9=U!!s#vJ;+X(HZ1f=W8HSpJ=`{109kgTIJ z^7|di=l3onRB-37Le^lKb8aZ>Hq)vB|2}+v@tMt>slE<4az`U`z2<0At9SzI+{*!M zPJYpi)(&I{>C$E)FNvS@GQUNq$)t-e+ksW@DcH_VknaU(^i62=-A7Y4eZBVU{f9m2 zQSG0*%(VTx$nTRbkGz%Frfgb%W5_z}Nr}ETX~6)pqpe4u3~W{GnLOi+#kI5%fKH`% znZ&zIZ|KDHh@B?i65`qr2hk{a{}5{|Ye?T_WR7ROR^Jr(!#3WJp+B8E+)}>;t4Tk7 ztXFyu5@+8}KLhy6_GK751Nh4J%`|uT)Gx_S@X%V;f+FOKc64>Mzjx}`g6vSsSrg5r zK$@{#{BjHb=&&?{to8$PZ<2=Oj8;dXCY7%RMVhv5=48aocvjzXWI`t9XPPcssDzh&m zv@<~aeKU)91Zdw+`}hOLz7ucX88h<}W0s8`s-p3eV>X{LU2ey28WU|`ymS`hb?mX| z{}0;mfE#ygrvcY8epT$dUejJ4_>@+Db;_pvA3HwS!oiAylHe|M5WPw0jG&*ZfV(Hj zh*iIqWZ(1coI!GEU3bz&m?J#sNFbnxXn=}XYIgE)Tc)svE1bKyx#iRYrd{h7F5 zz3%$xRaxeZ#;)Q$?j&LS#UIx&-m=xm9$=5>>A{zody6Xh`R90o@Tpkx4Q4R#4<_=w zb1#VNckSK}l6P&WU|MTvRgke>|CMofv@9VmlbM|FyUG&`fb(47lmPrUznOEV!pGl+e)s9Tz*WrixQ~A^VebeoM+CN_4O|s+i%0CY9u~YN@G6SaX%w9*wSwD<&T;h z+L-sxU*G6AM|IBlGh=ig>x$NE!M1>N;JwG17ZrK@b?aHng21n5gSlKDf8JebEPnlF zV|%iAmd2O4C;Dao+?pDXWr?h|7+$q9GS6820)Au%h-bOqTepEFDO6wlJ8d3=F6 zcfNQW@htuCIBm6mk#^(HOUh`s(07OKSlL2dRoK1C7xOKbn2_+He0=Zx*uVnVz~HC0 z4GbQ4A;#TQ;$Kaq?uyW7gSV#WVtC)UV`zAfd%_Rn^QYiP?XQUYQ|7~8ehe(H&-!fmirjcH zzET$sjW5GPc z)5-X-58!SDuN`Nz$Ls9fBE+H8K5_RA+&u?xO~mQzl##rovu5{DwtN)v&8{&Pr-6ef z=<~9vpAFY7`4{7Q#TSRh_08aE-So@T(i+x^C~HMNGWaaPW8*Y^PAnQ8Q`9aH0Zb-I=(|R%$%wH+~w!YGH^9YFby+quQdD>^0i$< z48GnkFlI*gJwamf6~R}g6~H6r88_(JB+ah(W@EADU^#Pe5_RZX@8>VyRwuN64qUx{ zjYD&Zyet{It4ZKx*|bxpy5MD9@Uj=ow9cA2b7o0DdMPja0sVY^;%6IE?A#ae$JE(F zkLjKM?t%Lf6PzuesKgI=DdEqi`m{ioHRIM=>R9cP%Ek`LA}=S}Xb zap!1{#%0Xq=S2lL`-WhEZi3+J0w2DFujf%ue$M6V$x(XdXQQbOY(9xJ)si(Ny3Bc6fWpIO0qulvxW z)B=;g-LUqMck_2SSI@UP_C<+fBL1g%pIQrRfkkkC+FJNC>Uy0$(r1z{;QNX4MOXIF z^GEnY&dbyp8R1d;MXjBCfz2mBpR4#y#IL&@ziyuqdy@3PsLPM>I`HrZ@`$eYvA5BB z3|~K}d70SvW$>8)B%eDLxx_uvSOnAlw6UnBjuzS!tfMlG`ulkYkBjQ)%ORfaaYzUL zcpv_PZ*E_=>p3H|qjsaQqc@3|u4%?j{_U6_wE=uP@o}&57_nE$r~bfaF5909`eViO zfv3yo16J8yOE_oX&c8@}jm%}tv_@(lk%+6;DRYc<66K@~@7g%LYvb^?5Nl&?9Nre- z)fn0MM^3#Q{$B^)N6DAWekNrI9+?LIZXi7`?k6@XUMDnu**g1xvxa;&&P6*3K4Rzw zYZ8131cb;dnWuq$ZV|DykI)~Rx3a(dQ+R-2DaY?DpL*{c0=4GMw+^3Q^njfK=4Kk>g=dOmCCeqc$C^8!C}j6LU0-T6CIe**Md zvBX|SPnH~)Z>0MdJzh#XjQ?AS{r)$~i3bYKKmz^fys`X9U3s-()c#X^zpZ8jM;IIyzet@*)=n|yw zI7(eL=swDF$8Y)^cx@q0NDVq^o$*HahiH5Btrp$K(AU$3`9g7W$V|d{l_{k346``)>)3 z-xRQl3y=lueyv0Iyo~k(2SfE$+$9@=9t)sR*+o7;-jI#9>YLQfTHxv>j`8gs@LL1k zJlOi$w|NdOdCl1`bTr>NNBafge#^rulg0i3e=h8R?pWv?xaxP#1bnRTaO=IV^5Qx> zsk4eYi&wHPGmeV8?bM4-IHBGX+*7<vE>}r!6(4en+an%NZ&h_b5<6aH+|Cn zHlN4WdCHhGOM5bnWfx_3#mBOmv3y|Gr;lYQK9=yUgUF$=8H}sOvUA1%cVk&u_sOwr zU@R}Xw*mM?O9uKN7nehgk&DmWUvuy|6fTA1=drDQp0SdSf+JULz4#t3`}>=%zGwa1 zVdBK3$eqXi5ZGJ>*Z8c#!4cNr8e=E#JA>R6F%dlI4!kYUhhRFgt=#e+gl4Yh%z@W? z@JFQSy9vGNPB)$FO~)=GTb1Qqyrc8Qhpi&%|0>bRjtaN+R-(JTOV8`tdS&PFR$4}g zwE~$fr&v0=WR`H}F1kzmy)E9B)qH1v5q4e!{Y$6!u2ogHn=7NnV~gH^?yHuVE7xNu zuHs&Z5b|EtSBOCZ-Rt|3NzQ$KZeL`>$^J2ZL%Fhr+|7Mu#0~&<^+A16p8)3NKJ3yJ zKVWWQPjAMrxp#8hHiljPSKzklW@9Bjql>G`jg^;{H;|=NZ`IGZw-dfmbtQ1%?`Y$o zfAHl*+!sUO7uYc8CITY+6 z^v6{@&6NiC#pAbE*L`|$@s9*AYwnQwg+KbTq1upRS?mdJSI(){wWN_yAX48G5M?9jDgEzeLtn-^<^7n3kfJTr(P8-Pn%G($nTx@y2w4;}@cT-0q9xU*H zJiWaL8F{F>LX36M49>K0H$>kn<<@iHs61F~%?C#w+OhG0??56x3cyEV8y!>Yt?VV7 zF@T1%?;g4x>;a2=Un;kP#q$cn&}H3R^bpXd?UVVR;;qTc)^he$zWfhDADkz%@sPs! z3J*4%^tqaOp*|lu7Vk6pCemllPz~9?cIdZgJh)k!*jujyzQ~K^RxNO+<=zTC`JI(!V9(PwEK4w%HIpKiqJt{jIxCTHaq%|+U_W^ykHKGmJ*V4sV}YzP-8+c6u~ zbH6}%OLAvL?*6AGBZ}wsl2^|`U}UcC6i?{IHvBJ~=b z=%O4lUAPOM@Gx*bz&w})FKHTqpB?kzb>@R?A+ks49HI6iwk&lW>A+Bdju;=#a6WMK z*>J%prx>x9sUO;$BYgjF_Zhst=sd5|_vf8wdrX4A8T^Unz_V^Td4J@l^Bnv&>HKfz zTjyoqehr%GgJv&2qjo#0m1I*Jt`9we;Y9oYRC$WuvY(Dm5$GoSjHOM}Gk zwdD@xoGp7u4q>eu3f|=b?1CQoLinRSqtVxRCxrWEf(LlrI`0@_oCNkS!>?vtFnv>$ zGX$0Rtwix}}l(-*NBInA)_tZCXQf+ca#Xv$!|o)D(OS@eMyJ8fOp0K4_8dU+DJ|Up>iN5Sg5^ z!-vmAg84G5Z%QfhQ6TynJpHfm1FB7Pe0ap8Ye&;B z&d>BsFSVuy4J&V@Y3)PSM^6>2pso(dWcb18u4u`BiE_01qde|C9?xG}Y`wvHbl?qQ zYI#P6pMUX2>xEZlSuZ|2+v;c@x1)2ybGjIn&0kD}9A`r+U+m*OhoEp_Z8;9UEhuYKsmb5wjR$zFP(?S*#oK3a7slCA%mLyvjI+ z$K!r$VUDUzTem=)e%eeXR)u^x@tdgE+4pkl`VaoCr|+E8aqP}j&uzQY_S@|6eu;P7fPjHqZ^deMJ8fzZD}#2HQiH z^v*u^5Whygv(u5YQZ$E{OUs!rs-v5^q;~^4kGl1c?|If-eGdT>Ylm|dmG8yy-#p@| zC~q(hcMtZe^7ym%{k8Gu-SAku-5@e8&%Kn%Ms}0k9KYbxIq+`1S2O2+sWiSdkWb&b z1t065!TZl#xTr_6|CbtFZFbjFFTk1a8B>X zd~XA3+8rY9l_kF^S6w_=M(BKW{qh|DAUDWN8`QW6#tA<1L+zkqmOs+z8jfK zV=8`-$6U(&4E=#O&-#Bp3;e^4S@^+U7~>`2xau>MgJ;Y-;g(}ee#t&V{qDwAWsjBq z`F;et)>wV@Gt^njS&Hv|hJ0&NjM<_Qmp9~}A52f=4Uz$Z;0qXIZwtma?jrEPw-Vm> zg3AL5?-AZ#Pk66^Z`kuGPLIbWL(<0v&MB#n_CI~xjX#X~sI%X0TOHK(O2WI3_m>jh zTafo&OnfK(xrFyJ-k;@N{GeTY0Q%7SF8avfe>Xf-Y2tlKE5`T1Zabs@C+ID0IAmkC z%g6Ini#91=Ozc@ZFZhXYt_NR;i}D%qd?q?8H(v+3^k&rykMW_8uHk)6!g~kxtWJ2Z z;r&|)?=8GPr1$t()X@J26Vl5_uS-bZ3+`nbaofuyeW~8TvwSOC7)#Nqo9+XidlSmH zQ2wrj^gQ0RpK;sIqy2>m?>^ou6Y`f)|1AmW5z3e9ow@A8hE_v*k=}n4vSe$> z?-A;ot@k*-@_=uq-sAo6Api8lcj}*-@V=LH?KRx|Wu#Bmd%V3$_5yC&UfPm=&~3{H zuEr<$~*0r|71a0ZV#9dI#n4;keMZy_EMQq?eH{S;a07&9qRSbYzo{W4|kHIW#H! zNath2c4F`+x*JPr5606J7ei?^q$vhV5;okT8(9BX4~ynN&(L;JAvDT=3o#vh=<4@# z=DiX->%L5U2wAU>kT<{_&jY4xY_{^VtC?tgBLuHuJzseQeah>U;lhLMdnr?;GVC>x zhu$iq%n@|)oD)V49fm%AIQn;A=kJJl`g?DZ2&4o`QIj!ukz~TO?9NNAw35>n|wL@@FP`PIcbw~ zlMXJ!cd#O0%+5EH4px|<*gPW;-GiCScC333|*{;7Q$w@Ex2UF z!65l7O#gn_`qojdB)5FvD1G%{%T(+h`H>5DwKpG_Hz4D`kej^e05B;gc(8FpTZNfo z-wi651LVuc@3(^VD$*NR4}w>(Z7Y}GJZX8P`G9#0xUlQx+`?z7mwbu!b~9G0cdh)K zNwe$S?K|jaAKPmhv;D&rzt$gZh7JPgxU1;TH*DPeEp<8;8q?$6!$$7{z_jc~LL;L|*#L@wYB_*MsCZ101H z)}W7Q2Ja`J!=}~+13K4vGK=&pvE6eH64|*+bq<nM&Qqn=gU_<^fOa|TjjKel|O@Gf#?o)^`n~lWe?sA510(itl%!h2cSj0 zzXm-vLp!Q(EM@gCe;2KVz3k!LdRLHt7x}kQ*8{|{(DQ4p^9LsL9*;Z1{a|V6`BLpR z6?Z~?IRQQDKMGFK^+%hLmjd834?epWx^!Zn_`}C%7yplApZKtcav$!?IwK z=w%Y)pQOa&pK!*}iGRZQ+wo7Xh{r#fKHSn7&U3R3TbJR+;?UdZoHHhWN`VOe3`qFE*l4Bh`K&&92D`)OJkrgcNX_fb#y^_jLC6$V}s7&58w6t zac^G!dg8y-6W7AWe;F}w+}J1W#5|bVjBh$~J27s`G5Dis@m7A>_%}p2Pk0#qs#q#M zGiBLwY_$>kd}*wdt;`wd@Ga2=K@>Uz;9)BBa2h(NB51jndNxC!idBJLc3Hk@ESj3p zXvfCr9-+7@PE3^?Z2kqDmn$M}g9$8;(v}@t1-)$)Jz8RHm6UjF72kghF8=aRF;o~^ zSJ&r`->1b%5ikC=Xx<{9V}h@;{o?!z-4U-+;1DW1w?^eP%xH@=0| zVx4`_8rlLbwKt4i5*Or^u|vlNISQ}Xz3nB7hB|R*2=`#B73N(0$Q2MPdxQL>Y9Z7shAwi!J*@g$fxR7@{hE6Ei?*^ z4dUCS7%z$^!nvwtD~NZ}6^}jAjvVjaY|&*cnw-pnQ8Pz@#7VL|I=cV z^pO5PiA{1RyjihH_T+vtHp%^*J9J}{Y-K*k*Gl81ehL4`J9RoI-OhI#KRFl2EJ+0~ z^TA6hcv-{TlT4&IJ&H$C#kkas-qcnXk6ls?PVP3x+i^~WlK|^jC3<9)I|@!Tr&TVB zE?hYIW3f$ym!V>tNKf%uW1DDB=uE3(n>0lR7hg}E&K&t^B@ z1hw9;yO}1TF9{F_#J;PDyzer$segtq;!UOoA4#xg-3 zoW^{*4w>*;+t!q3%bICCZ*9GGKscH{f^=*k2JPq2zV=={$dm6Pvr1mbk(@bfS64c9 zWjB$=I#KOO505g;gC?;>HX~~uV?CFwxfNMc^1|0iSN`A7cg=^b@qQ#DBPmw7V>KK{_(+NMut7Zlf!k{&dry9@Z9}4NFp=h9Otery0O#5EliyiZ;-%NuEHs zn0}SguU*70+(Ta`)6Q$Hr2|WOolKCaqzd@Rh zZ<1emetJF6!VmK5!8z=I-q5&0@4Mg`=t37?3*DTI<90f2{|cNa?F8-X9)gp!&)L>x z2jD5fr}hvhy|3LMG*FAOYBY?kEcv>88aQ!Fyo(GV{i>y0liN89`td}u8f{RSAnWaMd=FDtH;Zw~u~Jbi<| zkT<}+GV{qV9Zr-rWO?em{u9v43#ldj$|G5}lek@4AG9`j*lo?6> z>-j0&vvJ`-YRMOVb1Sh7KhF0=TY$W&C0G1L`+(q#b#1D1nO$cf>SZj{uIOQxcp~lQ z(~mmx%4b7knZvxwvHzVIWI4k;U55Sc?UKy!|7Yx*RK_li`MwrfZh_tvx5-1FmhrAQ zIESIVrMzo>(OzQ|INRDcTd)A0En$sK@Re15&1-@K~006A%;WTCa_ z6t3f*mt{AUS{-I!zt2nyw-ATVlUp$$`Jo2Ai|?0;U+nl?OLwXLvX8X{yW^r-;_6H* zHd-IVuH0t^!l%4fb)K2&wFV~}v0s|0;p1jX_z5Fz{~PGfZsq+={H0xg;X!nIHQ?tW zA5#x!VB)^Q_?Z4!{7v>x5AE&~4Dy*yIIj`#q1WNN&ye17A$`4-J};o}^T9zSHq{DZ zFb%V9swZc9Y=7ebdoJBmRRx|kZh5Kfb+PA{<@z^e(~fjaKH8D3GasFYbcR86BlGb$ zUVy*x3-}w;_l-{=Z#`-I8;^{h!r%B*?&f=RChS12anSbJp?^KVKav=#fGxgG=nZ&C0>Ywk8M*k~C#<0_h zaVFlUHuWEY2L7+L9}0b<{r;+dX0ADRjQ;3z#`YxWv79qMWrgXZm!%Km-l5RSN@MMW zYtlp3iDS*9(|VdmgM+6|nMNyiil@>&Mk~DWsTuq~%$fNga4vq=3&u(x_?Sr_f5=(h z*~`8;=k35)8A;)p>CTz2 zGwA=nmuB34xPiOK*w;T!o$uFvZO$KjS>Yb;fSE`9d%;cY#YF^7IrugFf8Kt#YR<0z z6F<|ynSmDU)&DXfwDJ6;-?aU~lhpYo@0?jb=WffFKWB{MzKDaHi8-Qk?EefL-}9s; zANCn5k0P7@9$I;avw*+I?4I)&bzcKaj}H#cR(rC|4x??|h5GE6?m6Eh{l;;I^#{)S zpM50swDud<+-6v!x#QR`*7N@JvFJj_8Kb}FGY)<;fE+~r`$vQd&T{tuaqd?61GN4Q z{S_bh8fP6JOQAn$MyuMrpL@>+Q|Jr60*~L6lz+A`v{CuRmwwM2jr`NsiT9G(`7|*B zzUhtweB^2HHHI;GC@>~m%^1w1Kkw7Vc3>vJ^uZhF8`gGD|Ex3kFMpr71WyCoZ+yVU z_qT_I3VuCd{LHtBOK=7|kKo~;Mytl==e|(EVc@C3Ci%UaM&$oG4v%p5pUkcA6Ys$3 zPlhe`31^~-GT_y-bQt%8>p^g>b?Sa-LeG=XS1JA5q-*Tur=<5gC|eLOo57kli)W=@ zg`f28@$V0j=Xy5}&)2%o@R9s@{(0DV?jIAf$5VK=+eqPjCHw08zZlx_Sh``yc(T6} zPh=l9ru(l6t$GZ+sNd?}_;|f%SVyI^RNi4p#`Y1wdH=Gn&3TrX;G(b1#t8fD`;2)0 zuX;v=fA77f^D$#Y`0q*AxQZW%U#O2~kPRQ=oXa1KjPO!?{?}kPD(1eaU$9QKFgHq= zSF#zx8*LsFf4*?1%?NCOs%szfCy1TJ^+7tju!MQ8J9qck_fCs0_kthgeaJH`JTrbi z^*FGo?nGaw6zY7JF`%uthT|hS9J#*Pf~{*JU3#z*yJ4m0YH z@Q$pp$j?tcNN1o`wJV$@eh)Ih=vNw4QR}ji~H2)}sw6PCZ*FpG`g8q@4r4e}h(sCmRQ6 zWqPb#(C=E+pF#bjo%+v>z#kr5?!wQv9o^L~h)8POOoEpXzzb5fy4wV3YapOf*9*m(3DFuDP@`6B(%%xGyUhe*FM^VG z_s6YvL98~?wb$z{`fpTxA*0|&-=X3`@GNl zywAzRzW8Qie!@7T?Nqi=XXeKTWexxSc!@v%Pov>eN&XezEFPHqk<;J$%~b=NfA;%F z4zzlI_FVc*$}hIc|Ks10_VfPyQ=|PWen#3;#DI7g-<3bxII#Iu(#}!c@Z|TgrNNi- za=-8gJ{JJz*Gr78+Ivx-T|z(Gco_rkKOs)|6Pf-Q2cs5Wr)|qiZZPJ5m4DwG2`}{i zXMMyN)%+FC5dUYUkw#o+#R6*E#{FYxtqj}DL&!Nf;C07nY@CNs?Oq{V8CLca@iZBki~$){bJ@ z!I*#Vome}bJ=+eA_YKr7T8?t2a~wW6zWSKEVY+i**CNp_eDWUnPnpZrwTgMW%r&B`nEU^sEX{*{WITDq&AaAS<7 zi8naE#beQQ5o-+X+xqx_#_+GWDXz>ttXXE5W#WIG|L5^5+JA#%q&ZIJAm>j^vdY}R z7+0Ac{QoUwayZh&x%&B3qCre>SJ$Gqw1>f37I@n^cgJ|jmwa__5Hw=Fw_bx@<^=m2 z-K<|uBeQ+_FVthuymk(a|$FcB%k^cPCZt%st{~oqeHon9&w4bKD z?5&u27o=HvL+pdUPTqef@2|-FUU6dX&&Vs;;%AMC&B~i)!^)fuo=jNr>v(*z_1^kA zJmoTHLf0PN^J(Xejsz1gZ?dj<-)US`$UmKNJxyMfB{;OEXZ>>AV|{NOW7aXU%gg!$ zy!F%(LO$WWRpnmqvgX)RoJWwo+(G665C19GjDvnq@)Gv87sADBwC7Z^5%~x5qpONc zqh93TclN=%WM}vh{<^0<>O}t$ct?7(Q{ey7SemPb7!jpAg?*ftZzEl!f-}xZJJK9W zl35qy4>>um>{F~kwTG!PC4av_{1dHztU5+C>kNetnOAh7eH0s}Q`loz=?4Z0iqZpD zE^y@Xo|8rV&|kCG;2oJC9o~)T@NQteaXsse>(Jqy>qk9D=_-s6i-O2WaIlTD{64<< zC`dUrRS zjXkb&5heJjA`W}0d9KTmQ;BWc{1SXr5ufI+S=3jC{I`~G6f#ZE)zEDYJ^^_?-U0o4 zVt$3BZ&dp6+{>UV+0T_}jwMabcz?);z4#*Z7D-v3?eETqzdN-{^}NBF&lB?@Cq2Je zH##W~FnQwquX$J}+3P&%l$_vFeL8FGBd>U3wss}Vuh^|G&jL2VB%PH9n1Jn~{P5)f zmz#R%-*hv742~q=@TFOPbCP<&AsFoXFUGDfw0jk2$@`D5Y1;L@>^#28)EOCdGcyA7 zh67K>3FAkh=Jr2pA7&Q+q}$s&aCk5s9k1e{^=0SR&OWp3(0beX5j*%D=@!n5v)O!p zoXvji{K$WfjUO;C0RzLT> zPT-OKo$$vVNYh`4)jH6$#d}_7ifZ}4m;aW{-r3l!q$e)y*>}<42KEuphbI=R6}^UF z*#<1E&rBQorWh=WO($5I;$Uft!O|E9OJ6XkUiU@B+52V8#xsNc+;4%K7yb&kvF${3 z=1({(2j+O3^o66(v~A41h&XE_jQ;H!v3V4pd+3h$bm)69R~UP-q+R#{X8d<-#s??+ zKOO8_xEEm4$a(Gz_?c92jpJfxdRGU$L-_*P84Y1<+7vtEu)bybThYt*9cv96 zEZbI5KDI?$$B@G`2P7-z8vo}4V-oMOor$7*Ux;4d_k1hlS$jLOt1IT+uG5aWR;YaJ z$IGr!`#`%HW6I+okLHsSF7af2)84V(r5g+*%de#kJu%mwDC$1Q-f1yyk-flqG1vM@ zFP&xY^k&R8a3dSBnX#B_3n^DI*L=|0nt|!T+3=;Li5U$?uRa@ht=vJJHLe8?;;eBk zWj|sr*Rm%Z-E*F}q+9z;9dYs1YUAUpjX2l7Q1R7-$3@6jwbbXPKE+s@;b1=*o6Q{V z;YkBRim&z&cB_&REZaiM$8e+&-zPn`g~OXa!q!moB!0Z+6SLu*7;7%R9Yg2TUyQZe zkueU&VyqeT!D{F5{awH^jrP0QH~oZj#J|HnTROwv$KtDnv8nhXFqNEVcPM+XbK|R> zU`-#1(Uo96X1)(=ew3JN{@XGdDteXCJLXz{`LF3F1{>EoG1%zOW1L_8BIR0f*q*O< zC%A)S!S4xd>NL)5JH(1uEVdAR-!YD{w(d*ac~5_-TXdRxWo^A|$c|$7Fqi#wzv2iH zM|q;hh`jWbZ4DJ!+Zud~!$Ma&@z`!Vlf}NoN3=_}a4&!--F@tD<1^sVzW&mHXGv| z`aZ^Zc)lk#TYA?%{8>af-}1jPHrrw85sA&V2)&FMn~lDaE#and#Absp2boiZf5okn zjl{akun8PZ-@xnE-rC%7A6GKIZHC}WPIeKgQ-fw)wtJ^MQ~#86Q1FM0#{kzZuESh~ zhO=uEe%%X+=k!Bj6Rn+6Q~y4(&Gh{k{>y*P^UJY32eAWs*-W#p-b;L@iOdhn=$~@> zX(#>lbNX!==e5gMRTl(!U(5T_Y~BZPZk_j|dcQ*dA1{~yy~!TyW%j(kPx+=T5N(nj z&<`&qmIC|Sf+-F7e@Kj{V^=jdyunpTJ2rC`Wg>X^fPD9J`ML1(+LbkRO}*MYaq83c zA55vPzj;bs{Zi`Czf#k#A!7ScW1K0X_FXbIS!Tf)`U=1|5i?JSW%Q=Srke%O%49lL=O}xAX#CUTf@0}Ct zjdu7L1Csm9Sa0TY|M811Cf1w#)0qc4PB?zF_zU0q^Vn~A8vMjKZ+8W*EnyA_CmWGg z=Jp)M-YhQD?gzbrYz;S|3sUSi_swG(I#{nM_S@`R$21f|Z-?P~6TsVC@@RgQozBv! zwe?%3j%o0MkBP!p41bCN$Jnn^KG{vk*3wUYN2Cz*06zpj)zm}ib>VTYpl!?MG4adx_q zyuIVZjf%6y+>P&~Z0Z*t7NK7n6^Dm4w+RQ>2LVGKIGEFegXFHt?ArRgNmiT0x0V7& zIWQ?^oP~oV69=-bERW$p_{t@19(Z12r$-;9^ok+(2jIv_9CaQZ6i2QRy~s4+sQ?G= zal%I|jvQqQr^zv#f`>Zc+s1|B%IzVq+9lh|Y|aG#2_D#=?PUY>9AJ#EVT><{jqzOi zC5VmR60UOU)0j~Isa~z4H#^mNCgPpP+q0d$Y3f_Vz zw*aGTmIAEd-cBHH0_mT@XT@@^!PIL|zZc#ziTWooPNuB-Qg@UXk=f9cu?l|}uE4b) zV#}iVblz3}S)jCDWN$C&hb*+t{Y-KGgPG?Dd1QB~m~IoPXEAn@;-ec`4=ZlvTD}cp z%pOBdlkVU+_sKDMy}(-vyvKm|EpV!Q?ZA8sZ5{IGZyfj``)ppW$-peWXc)xPa{~io z*$8~ejDP2(es2uscFuYnXTHyZH+ciVP5SIWS$8&h*281H$PS82H-$bn%87YQT)Iu< zpF;ZI0l(rebUFjizMPxVune9)378a@t`i(T!}}CyR6J4qa|$+Z?eNt@@KwP!1sIo$ z=ANi7@QvTnkd(8fL32WTEd6o#y`3%%JR0EiL*mq>PETq0kT`XN|1PCLI6!7>Yx;!q zBH&~T*SC;^)bDe#o$HBH2aSlYE{oB4vf%b@ZrFF}<_4wp{*7bSDW+Us{KSsK`&qVo zF8Ww;>r}=F>}|!nx1*zrk6nkYTc5G(I{2=$alK>L5&Q6L>^kUUHFRzB{z~(?f8PID zvFo%xi$A00mc9g^DdXM#Gu6mJ_8B#;F?G%?r`@l$6gsMZG=0q}&5nH6f0R2D>$JwH zP^`M%|M;eV<;3OC-CDz1=XA~bX|w%L>o(z_XYB@kT6ruPUC;6GN|)i@u5rV(rvpO3x&UF`ja*n4U0eIB|Dt;uiKn*1!j?Pv9A-}G!Wr~lF)(p=c1BiL=} zPYl{(>reK=H%p{Pfd&Q7Y4}V9&lRSw#O|-aI}c?ShaN-@-QhHj55xCdIC1^xbnFJ7 z!-r5sk}$B#%5}(@txub``5>JF&CS1#g|K0$Oc-vuWr`Q(rJm;j;JV(oW|}% zds!pPOIN7=@K;M$=)6oOzK5LTzY6%ngGO@JDWlGSSGn8MO&!n%{%J4DMLENnLzPE$ zJ;0v1r!2i8m$X`^Cw&~ef7x>>E#Wt>|nm^gv$Gnfp%q8(RDbn=;j3dzaR<>CNh!36$lfoZflV@6su$ z?{lcbJ-&Fw4$&#&LvzS4fo1QYjG(7_0CH-2a}G4+SumgunZS%i3@<<*Wu%{mrw*t7 z+tJOT6RgYd7MrxZ_p)MWc{t~!-Ib!{L(u5+#CQ#nCM-SDC)hQo7?FqO8KDQ6bG1)l z@l9*oRXMdEaW36xysLd&pFuYc=!Td;D_ziyf!#Iy09t4tXZgxf8DaKDLnB1xQ?QRN#qOyT+iv^~aHZ}4 zfg?F6U&>pM-F{B`I{XSpV?Lq_vE9jmjB?_oVtJ*WU`GxOy-AxCt3s z<9pvmXQ(UL($`2&f7JvdwE0wYTOoUEg%hm3lp^3&TE!jEH~mXxFQtI*+c=}BJjo}c z+jRD80?$qKO)Bkv8{Vk1LmM?eFy;rr-54|Xj7hT#8cBgg`YlcT6I^q+wqVoUpe4MuVp8; ziN81UU1>!Rs`p~sARgHslLu9Y+CrJM#X5U*^1QZKXJA!V@BJ0QFIh==FOTh&Xg|VZ zeE5#!WXUY%zo9X?Xml*?CD!{tzI8qHdG^fh0kc2SY0KHY9qK)AuSfmxKrF4`vSIHn z!`X10FHg$`9=Uj65wU)YOnNCN&aEwv8(IcOPqB zk)4F_VI&qs9LZK&j71imN71P+pnrStlUVd4$@zjobnK_T3dTz&KFP~@w&}NRR8 zKFz-V8_4??vxX2X6@QA+PH}9#b0+qF*m^Hl{N*{0<-PlQ0dbbk>(?0lUu>D>;85iV z4tvb&nR)cQ`Pxcjt)0p_!=rcME**Q066nEQo!%_HUi(aIURjSF?*_`Z`_`VD>6g}7 zq|dD;);9By2id{rK=-!E2+21r<(jetvg0$w$fAd0<#~}uRi9*rcv$q@yFU%)a(%Br z&(NeX%-D^`mHjL_(|Axib3BvID%%q`2^lW3*ydZW1 z=$4ky$MYSGamnxo_fJ<|&zj*nY*C0WT~>@ON)hMDerDRhFW|h}A@ICps=pQA3tidX zS!djwe`~L)HRA`XeA%M(?k9HuxrDhG+4cOjHt}%dlGCZ z76bQD^k%i#Q{YdlO)^DhkugQ*ERpS}l%o@L(=Te5{RY0hTcJJQ?f{N6YWy)$;Cr**Jk;*%MbY44MUoV0r^}ubyksQHTa)B1vsY|b%HgQ*q;-9{`@OA^YnAY zYe@j7aZcLcBGYNAp_N<;-lG^Qu*at|JO}h7xZR~RSRd7 z8Glwm>&+BkFyY}J=Nx+cyQWgN&MHS)r$8eX%*aETG5@ba_^)$pKOk-=1Akhr+k#pC zQ!}qOrnqVE5ZW#y>x=nzdhc3$fO-wLm?v-LR0(X|J&`4 zOk})$$QW{Ai(ln8rs%wH)c|8kfbk<+ssZ%lAE6a_joCf)RlykT*v(G<{apXq7 zoHN4+t%qJh_cM&G>%m2JtgUYB+e7@13P0F% z)-mSXqdDsbJhyUgY%um{hZ%229L~~3jJH29-l~l3%EuXR<>-86KQ#rpO1}AhjzRl< zZX=ROoG6#u5gOoihSDaxLPNYpWU$wfpFG}?pZdH-qk?a|314dS8tNZB$e$mkp5vUK zp28SmZ+B>+GpF)8>Zyh{#xn*Evky>3+5~KZYw1Jbc8~ZacnSea9e8q2HR_yKV9S~7 z&mTC{zv8F<0l7m4`dcmB4rso``wP@>=9ycQ$KaT+&5e#yX#~@CjO!hoaa&8dJ6K=& z>AM}AQESJBSKkk@?w(1ypE3@W-pv`CFH+u)Au$`-bkfSUcqI0N=x5*o$35J~XB%x! z{N^VRb73HHZ(sK(~ue`c?z$lvsT(>Kj0P2~YU9*Z5tz-z8s7 zql^0XJhuq=pN-||fF3Ru#!cWvFwRmv7YXAy>U!9Q58Pf1d^O}*62r4-xx?kmUG4QW zYyT{lb-Jf9HmAhK=z45>Ln?c!(MFqF-He${q*crk{o4l}#s3pb^J3+@vy3{$2fHZV zIkX&)riJGuK+$>MiPSH`~;(2vp;aptFr^AsbP$34hANyrv=S9_Y3_a}V+B$^WXE&84x zFPdulDi23f75ga?eHfWP8{4#*gX@Md2DfJ!TgNiylBh4tK6D2%^C_-3IS*DA)0;6j zEZ<9>WZ+$A#-V+q{$Cwqo8L5MOfN-m7Ut|{2l8?yc3wlMdn{)>g2cm0VlK%;UYL-u zGavb9=uxA4`jUJ3PCV*7;!#iV==-QE-yG9@wQ#=UTH|YtoIyxh!oC9hdb4Y&^cBlX zmH_WhjMn$}7_D=GA^Nc+68+fKiXJ)=O&-u1P3As^`!Mc#+)wboi|d%~u2$KJg-;Zr z=NuLsMVx^OWb^Q82WJFEHv6!RzlN9so3H*_C?{Hepv7x!MR$nrn&jr2h=cxX;C{=| zJ$(Xg+CqESyRW;K_WT;S2l0I=XI5^a?~wJD*Lv~8LAy9t**5Z;LAjZQ#@BYjGv{y) zrHeiB#k8rGvNw;L8oGvZJ@}g_;a@G~vZr3B@3ZL7Ybe{txn=y%Zmp%PS(F*#Ux|nH z2KA6<{>p3IxfO-%^*uqXMfgDz=e|t)1=`wp#L>2)#?>YnV@u7QGuF>?9CvWeqm{T1 zdmk%*)?Mg-WpUw<+on5M6LuAudf6gqtDAMxiPJ@q@UbG!TDZFw;L}-jV!%^WmSnbe z{$-})&wzQ#NV4Krm9I0lHbFm4H8Vo!I`B(`-;|;3i4O@}yTIvhaTrERQ_ZMu!KHHc zkygB~33x_*F(DM)a9k8Q%u4qV>(-H5I(hC^xo#8@%2HUiE!0c-;(MCxX{I%lHRg?*gy-hh0y8 z8FfED4NaIf^_x6gFd9U_l# zf8uU`q`W;kt%b9sN%M@Y*lXsmr|l-s6*6+8eK0GbX55xA=ij*TX&{4%_sNx zBdW*bU!0w}8Ctc={te}855#`I-8C{OUT5d=^Y8TK?tJCHd(*(}iy5mOnFCfdy524D z*F0Gea^2A_n(EBU3=wM}5*g>t?-=2ToJw{?3}hj-U1gPj3Hxs8HJ-fL^q zYM;nWe(Go46_~e_x=%q{I(KsZ_vB`smga0|XN)7#e8nu^+T!c-=YC_zZ9CFflc8_FiP%{OiJdhFSO?Rt z4;)X`Kh5(qJP&q0js0B8k~i7ceV=O(!?r%FH?;qg$6|{#hm{YHChYmj&N50D)k-hA3bPQ(v3@eIsbWsjt zxC45`UM(U%tT8{L+Nd-6`Uod9G!Q)$e24aS)ZCCCe)0zGQ6Ap~k2>*j5&I#=^b^?l zqbNy#@p2=-VUw}F0(z*;G*-Mc&d7fOy;uqOu4QhY3B7jSJafhDasKT`f5n{pZ}%Tq zvMZ_CJp1EFYOa072;It@b-;%{DO$w7VX=w(6L*XbwI_}Voj$@I54`4+draTD^Ulmn zs5?EbC~^(D*|F^V{F?TTA}+^&a6b_9gVT=BpF^Y*{M|L^s(3eJ`5X&eyAnOochIp_ zB^p2UUuw(`xY#qA3677%?HQ5x5I8uZe3TL1Z0#AfGY9)?b{2HJ=8t@G-{Rhe?4x(8;G~3WC%}LVq^x28PwVH3@%Q!LamQc9Nh^*uL zi^rqbKAi1u6PMd8-HXciL5CfTgD~UZYMuk+ftSAX7Ka?*#PFel_EfKF`FT&;t0xXv)zZboV&M%rWfd;Dbl@7ex-gR|3x; zT=xf88nKZq-D>#2%vSN4)9@B}&GIw&GdlB{BXasDj>wK5)A!gQYfoI`nzQ0pN16Lh z3#L5M|C?pQ(v6-kd`FRGA9A{h=$sAjx)K~+jSTSQ4e+yJE#Z~e1G|1%P`>Kvg79qqjiXQQ;Eqjy_-^5odzmBB z zcRknP*ChzoyH;d@f^tLUo$YvF6y*RHw}Jo8)&-|l?7C^7-P;t~3><48%q^tYX5 z?4M%0tGI%@Ig2TuBe~2IYtYr_(9b6)(a$I7XV>a;`+3p%{ro|!pHI@yC+X7<_BbLB z9Z#J8LiTl`4#r6``)a%46Vf5-%!>GmXzRp1%#qkWihou((IxWl^bzOVF$AMX$0Sy~>;DRep|MWefVJpQAHrLI1P` z{nIjZ#Y31IRnK8``GQY!i0VLJnx2bp=L$zs>089qJLt%*lwQk?{Xs7NS#IL|WiI-i zgREKR0K?0P#xy-2A~tIku%c5Ut$)S8gEysH&Ak~Jbv^U+YV;&)*xwk8EZRvOUDSau zx}l2US4BM@cy}kdq&Eg~RvO$&1`uq+kzp4Dmn}EFLcBfu*@8Q{`4jr?!?^EXq<#9< z#W(5J+o6Ml@YfATffHPH@a{p!lZ4I%+u{{Vijs1HJEo)4+`0ETo#*IX&$lQ~HsbBj zH0krjA4Lbir}tL1S2C06x|C zXTL^&w%wJ{y^r(rZ*YEoKj-Jw_WkUkRYD(2HY7FYX1(#8^zUV&Z}OK=_Z#S6UnQUH z+mad6yXkui_an`7yfzJmU88c{S=c50&N|P#8u=vrN>QJ-kL`Rn=l&S~mHz#|!+R^@ z_%8Ym^wItAD|NCrF^hGS^Z;qBRYTykjlHkq#3}8%+8yeAB`Ne_VY=`1HJ*^l5vI&eS`T^=jj=b- zI|!GBjF)Q4RzCU5I-B2Z(sK)WKhl~8nsCJA`&U1<{53%zrVMY(+@hmw=muTH@y)peb9M+*8@iDew~?Se(c1?v6C2?h4gbfa#0er)mdq@Chl*fzbIcU4Gw@g0+S7+M0{=PCS`t1YB~y6NUAsv$oA!5I zDIW-m;X|Be^K9Ah<_VRL&VWBp`wljf6I^41>zM-5}fcvBudZnry1Mz1u_C9oe3SE5Cwmkq21;oyu##^=jUOp?#bcP@TEh ziWgC~WRVSfth^npr=?#A1D|v<9peUs+}L>(qTkA5JZXL(1>Z~OO#i9NE!<577m6it zMX$0VGjBF^W<|)BW|^6s|D?U_#hUmS3obgw&G)&pJh{|o>Vf_h*ad5?Dtewn`#AOQ$E&K|( zv8QkGT{@I<@}X<_*mOI_20QYKL&J!x3Qvl(C(dm-Jou&-7rGLssWXx8q`IILoPB4J zqb{7RejnAPnAzv_JAOCKey1(+^&;3$(C?C?MZ4k4ouMjZXT@T-^j5pj$Lua>PfTqw z&=EP%5w#}{LicrNcOf>-4)}sQ#~so~j0fv?dV_ zULE&f2tI52ira_2S2SM={$&&F0%x7%@BAG$!rV(2FPhQG_+Nw`&3t#bI1l6L%7O<> z0e>B&@$s$GHLh9msL2P$T@`ZSchJVmVba)mF#Cu8RsRbQUS!*I@bF~PSv;WMvhiT@ zl9(>=U%`VrIWRBh0e3^kX8P<>YfQF3IU5~VDScLL>bRuqlFmzgtbS9w)!t6(-`gGC zCR^}Rz~)zmcz91S+3q^yXrIMDgE3=vTjkU_a7Ol%V9+(q)mAJB}#ubM| z^Qv3*)rO*8)?2w_{~MotB;b`Cdf zJ8M~ohb2Ri#cOaiVnBBLXr|R>=dwbh?Ztug+^S{$3=}e6p3+Hy*C_B#Hv%j{Twfn>-WNVrB zFM(5MI>)gdtYS}Ex?$12czEUj?1u(8xbUenz!l2GrZ=;FK(}pc=cg$Fz~@mB&LK>2=Gp&P|i!wPaNv^y(pxWVNy> zthM6G$(hXAytw+^lvM(ayA8`8$k*ie<)!#r_rqta97&anfoCc5;ZjFRQVRZ@=K8Tc zLT`94XAi&6x#d;Rhza8ljF4h1uX79v-hcA31NigoI&A;jif>;2RdBvr?KfqL8hm=* z>qpX-#Qw`K#rHXzh%7%%w&%ie5pZOCtKV_@8~?n}*!Aa)JKO(!gmu-F zp`0^EhWsOa@m>51u^+y?gt_n|pKR(@rIrV+XQ1^VowAY=%;(k4_Ah84h#r)5OzHjZg;P`|4K=`%K<>I1$@>?6d|= zbA*NzI75!>Tp@?oh&3DpRW8c!x={Y)6K4D$h`VGKVC;^+H zf!Gdl_GhI#^eJa<#2cr3{h^W+%kKMEtd&NxUYlNSgkIy@$y1MUhB~9Uh_R&d{K!qx z5h6FuJ6+=leHdLo4+$``owSmtQuy8lPwGUr(f;i+%DRGe-}>0T??H4IP3&L3&7SYE ztT*dFVbAw1_I%f}=PQ5mo%H)M_I$OEvwAu_ehU;3VJ?B6}Y9>nde%gj8i%f_&8SHiyC zNaT=5SbN>hy2$*;nk*B&MHsoGg8k4j*ZQB8{HNIUk}=vB#pZ%x@Nj6t{cra_>v4|` zUga=WxE*7f!;GD45{wlc$ba~pi=3f7Vf0RgtO0~8>7WY}EuPX|v#X$-bFrGcIrA3D z0&dYDdy^}wF5%i}Y=4OFl7po;(>y7j7Tv@crR*?k)QW7w^Z_Vb?c<;3;&<_x_QGR^ z8LM47vc;sSx{NDUrs}fGRNKsXgZ8L@KV4Y@ecTA0+yK2?58Ygcec8+qbY#+RGIhAQ zq;K(1SNyyBTQ;&?;H4twr+7)M?#kiBq8((kE~f57@Et#89E#b(n)7onIBfc#Am3li zQH&8YK0_@sB>N%G z_AweWivPaYYDbSPqZ=Nfd0_%}T6@j5T0B_q9{$Dq7SkD}GxsEbr-9%r5xg;`R(e98 zf~!Apc13X|PR7nsyZ|riKEnDOU*eLng{S;soYR3<8t}JqF8_*l{tG9EZT-6BbLmi% z1J~+&kLKd`Wc2lkfopw7${s0{9*}imd!pr+;WWCAE^wnk;(7{03nMga`w39ZjObUHU`sgbIwnt|ht=}DX zZhIx0iXUh$;cERh?O#dT_tN%ol{54k?t+ayy->$6BeD`)j2wo%j}M(i!o{9*anT_i zJn~~9cxXhAT}k`V11?`mpI3p0o#3Ggy<;P5W__>by^#5ODLTz0^eD+1$1ZoSzPTOW zsh19>f_`nw$U_4$sM>a~ZZGT!9> z`Q^TFPPw;Ju55UfK1Di}UT_>`+`Bn<77t5__L>;m|EhfGtBT||iG3&scMtl`4sh+6 z;@{o@-aX6x-5uc9jU60(r&YETg^I@jP85&9uRFR(>G_&s|MaYXJ87r>HFDoz=hHXk zi~SQW>iL&*BKn&2XfN`-_s`MSKH>R!o-243taW;B7QeA%pbmJ6`bl&ho{gXJQUlw8 z>$X??Xu$T)aYdoUx!B8m)e(Ali8EyKzOT7L4`sv8#5evtpqqPZ#g`oUpRO#0)@DI- zCD7iD(BKX5BItC_`E>fx%{xMQ@QPCOhRi|lz@y$7#Q0qdzc|jG`qaRUF;4`jbxzu4(%z8pAp#!zr__N}eZnPU3%o*08uuw6k+ z1(T2Uf-M!;enY?M|3KhLjluIWd(gxy4puT(D&BG_^Ct0bf=lDhJg(Oq4lK{WYli?! zsx!5D0N_psIQD!eo?qB!B)+Z4J_QIUe-5mAETXN z+11ewbQS5MfkWUWC*~)#gEsis*Ga;DO>Mr=o|b4pcr*J3x|82yyIpzEUn%rw<9I3U zy@dLNV>hyc_`{OLi)WNxVoa0HEEAntH99rPh&C*%X_F00GJ9(&?5(A;x2F9^?Ty*? z@0GyOyRWuT-$$`N&7|)=(Eeij-A%tsh7=qXtgU5V2s~|hocB!vhK<+>iti;eX7@2Z zS<{A2kzU_KkC_ErzhE8xjImv54)D)zKXX;T?bm*cZ?Zo$hp`gh|9R98e{1ux_L>9C zqJ8oCTx|7)qZGbX#AHJ8pJlzqR4x9S?S7X`ICq4_r!=PG`IKZr_4!5{UX2IjjQ+;M zTI&5#4CV>osXv%C)|yDy7k)H9z@tnWTfmyg?$>?PYxnEL&{%1#j18<=>@q@>_g^XF zI?6Ef((Zl8Ov%uK4_e59#^cB9Qra`sZqE?T0FC8pG`6cPck*5E-ohOjVEf`{jqM%G z<%^N~xkoBk3rPOo3*AUIW!=$JCp6w~opY!&BUY#CStxnKrnfk~iT+(3SLSMHy1#b3 zNtwlQX?@IR{iU4)zfrlO59s|I8kev3^Trlse~$06VOAd5^(}$#A9eZAf#XvEI?ZL= z#N+iSc`hNH`13w!%dBTSb;a;2osjV6MwaNS&ZFc}+;92ol#WB?lrmm7;iGUVb;rY~ zwakRL^s)(<{kf4>E-6ZdZzMIR0Gn`WpLJ%=HP?O@wtG)*`@`iI;iDD3b>V=1V$Y+G z*1E`E`*BY6Z0z}~@lBW&i#yMnfqAG7eiCt4v$u>4T0nau?46!K*S(nd^2`gSe^!H- z?9w}HFL0y2U5=dzwtj`xtOJOXnopd^L+k?{zQ!LpGU=>;R;_(;z_RHE&`aRSK|31f$tLc~3)WxTC)o6VITux+l`DNY5d}_sm zcL$HYcGf5BQsT|er#C`3c&&^oytdmSXt=}III>kPxe6=QnqjO@w(?^|! z))|Mf3B#ICv9}OKe=S~0z^rrpw9e$)#m0cw8pwA3p^DEB&o*gdfP?>X9p0YZJrWgP%9~Tit`a zw1%_Q!GYHJSB!1>yIngSKbM#BeRy*4so_b%By@R$@$D&Fr=$4VTgw^Bx%g9+Pr+vx zSIfB?xpr}7qPt#&&(Tb0TGunCKhjn8Z{kl?-`~RT-WHzM#q#XH&*3^V&Dwf{7}Mp% zJfhLS42@wcey)7-DxUbgSK%M^Qu$UL()9tb-OGN$GH7Ed zv{4F-OOU_zljr+fw{X>Q3AUZUQRNuiwI7&TrUdGr0_OXuL;u!NPATsex@OKj2RUwnU?4v;I7S?s`0Q zrFs9G&{iNeR@OkTm0Y61a^TkdzXjh(%NXBP$P}y414{1t03MY@KKY}@?jbTHa7lN& zV;3%x)|);`nGa1LrP7K0g1k>Vhv1)dNbrz&tODZ43tH8+=Cw`S#haN(Q zT<&xRjR95W*^=S_wqwjQM&R$wwAi~5C*BcUK$^p}X$i2Rv+T-7o?gxKAY`0ll%x4l z<@tea3a}Z@T?JlX)0*iRu)PKCDPKA8EeF2I_)7M3Ibvt6(ikree2^BhpSBSA3`6h@ zB0lHf=4vA~=mkD>rY$=h&aR!n$2o)MEMR<`Sn|MJr+n(`1*BcY^`F4{Ds%kLR~cw)@k(i;qm<60f)gU!cd~MT!?|^00*JEu|So(3g>B^2WAUx?jL=^uL{c zI)<;&wHbqh$M7}!7WWp-cgP|+_)FVMd)IQYXER-L;Y4^&kFU{KKl{j2O6+z0_y3Lk zi)wG*qDA>kxAwMezc_vE-7C(f&X!gYU*`zCO}<56JG|mR6KCW{W@PM-_bZCejz0a0 zGN$_UD~ddG)~_giz8bo;d1j^g+&|C!EWe@`TtCcY{V>8_KO}_YSJZ8U-|={M)#rZ0 z(NIP|j%~r=d2%imo1v&N{5jTJ@mP`W+*b+PKtfdnxhe-^oQb9^tA?=HHeZv|=sXZkC~a zBUAPthV0K8Gz|XFmHjh%WdChFvOnXKxW6OG+jp#m>xpZwIow)XMQ0}WYm?6Wo_?YK z+WU>}aj@st;?UD;d|K5iT@2B(t!YlyY*8nS;k zbi3p4SbHM-KQxrM+@_pymbVAkpI^YW+vzlIJ3Q!@3ef$YaV6l(b^vGPUBsEoXg*D> zM^|*_f$Gt&pc~(be+_^CFAZH?Z}CXWMg)US*_GXz<4WH@_S5SQf(~&PHe0b!D(VI5e605}8(erw)7@karNg){<$T zsux`ZR%|QSf;`KshGTjcjS9Cd5d?$NY36V z-3e*D3CMB$S8M^DKio+F+IFEDi zGtakW>~ZWX^_H>GYxc<4*&jydS5lX7zKMMy+1!{iHnAQ%u3TNedMN8C$=ce72G@DC zXX#8^)+Vt_4F9xE5?Hdths*7hHD%m*5w! zCI7dBYo#&3b@|u%&)Q!x41Nj@ijSR(?+n-IE-(9B&x>#N;5!z-pclR~NxO%%!k=XS zV))2~WdHr}haLEdK~FuuHtDQi^)T{h2lD3{{6q%v8M%6%FIYP-CzyhKol2aPGVt1r z{JDm63PIMfL1%Ih9}ba8T=#ROaY>f-qioA`kEw%6v4}Gitm;R*#7`3)droZrm6scldZ3d=fM{+Rf*4&`y zR$p)}ut^8a8GSRR(x6yowyC|=1Il) zQwD~&fT0CGptM@QO#+S~j={me;$vnVgITMk5wlG(CA4XvUH1DnmL!(onrDWsDw@l|-soBXRp|C36c@)NB!QG7oQqMwe@ z*B{c?q7CsE_pOtIzFQ{+?*%8{=Te`&On>QrV9Az(4_FUXrVR>yzYR|5RR6e*?+3s7f0ADHiPMv*5y6R6?-oU(gJ@eyr%#$;jFN?9y zz}AsDUGpfs(X=CS#?Fi^0Kejwy1e+G!9L-cMTTspN5|ITBb)W_LhB(nvatu*SiHj? zlSw0ymxu8E7GKbP%lTt6$*{&`veEaLoO#Zethwkh>8DT2g`WWdVpef?2Z$rXJtc6h zJLS4=53p+P><>&IJwPvdfq$q$|};hVeDsJq2*pi>xp4)3^v zJQ|xe?+6GUe5ROirpMqM8Mt=VPVBDrZ!GbAyqx1OahlZSp1P{u)=}!e=+-?iFIaj@ zZg4g}GUtG6=?OLii^}wpzYE&(r6mWupsmf^Q-DG7+5~e7JVH8U`F;o}J-8AbmEJlr zC>dc{EZtJdGyenIQM0_1;8Dt}#E;Ph%LC^ZERQz-m&#M$T?jsK*}FWA9Uqta({Ri> zQ^Z^*`u}w04s2{K8;FZu$N%Z;2bx&Rk4*b3uH)(3)$pjEb-elf-(Sb~_O&cIc-Z6q zkiBnLOZj_y&NqCvzhtGa=;Q2yn|(8lp=9X1lsV%lJXvkXhW9KZPT>yda5vA|Pdy61 zEi{t4is0|kb=m*5p6&e~zLQ=C-(A3*qVk;Fb3S41#~!TD@HF_cu_mSA1K#GBP=L8DM*mGspM+7{2I$KRV%) zF8JjD))A~FW;*I@KidXz8y`WYSdi@x4Og5BV&aJhlK*-4qyFbI4P*I=!$#d5;6V1F z?>cMiPdU3^yQ-@ybT_h7@s;1MxAjGK`U-r{hDnpZh`8>YP3$&#Y)12X=ZG%t;|vA1 zzWxQk=Vz5$@|Wmq^55)WE*$RcezjKn9pG;DO&0E!a9-wOad)A!!_dV!I2CUtokrd9X!XXw>QaW(1$(nU3LIUStH> z*G@Z96v`Us4~>rXlhy(8{ZscSvUb{~?bJ6CeuRYjJ zXj~^Zicc7(eZ-ax+7n0bn&@xYfP53IzN9;#G0t~4*HLukRqzJs!{xUv_&LR;)7*y- z2gXkkeHuuUEw<6}K6D}elZsxu5&dx^X9_oPw(wa~boQVOtMXjP4n#Ib zI!AnNeBRHn1L-Hd=0WDG^X))@Q+nN*F*}fA=v{hU4>rMTlKPI%I|o``mR}WGiXF&Y z#*KKrxjw}Xw>z-GuE3 zec7Mwi1ZGY{fN&Ckv+w@7{040XA<(!e>H}0=nyt7|6j%Mo%va3@y^vNFN7wgSKfnPR@0`0 zK9WtzxbfJO5T_)FeoDNgCx-70#PFSpJ_vsJH1T`yR}5eLGNcT~p9Axb>_B8saxXd| zGlnnYvz==fmy@y-t9KK6AH{q8A$A?dh~b+$)r#ReWNIviZ!FJ2bQv#`MlpW9?72>2 zF1nBYk&bF7bKqO_+r5|3U#n{Hx3#K3^I{9%mVKTy-*mPZO^7-b5&V0r4T`PO}-~`$*i0eM``px`S zEZ_CCeZtgd>IY4&uD^v?zRRd13j9_q-)HKT-mcG%GIcs#{hUVWBM`=6hgO)kfVBH`jXF#=}US)>GH@kn>_Fh zVx`4m`X*gOOy7;Mn7))_P|j@1!RL+Os?!`KJ$x2x#BDKKmm~ee^hHP9ql;He-%H>x z=KcriWk+JiHa;h&FF2UfgM+x3zQ8g8IFtsw;6XBO4=xnbcN2MS`xwRaMaJ#dK4v3xT7dDp zhVi>3Hs;TX=}Uc;vAP6*E_~UH>Fcp#`W9oGV#oB=T3xbdyVgkPnkKKpZU(=%UZ-U@ zBiZ;Ma#SO7$=jYm!4KgPw(ZP^)X`2|lYzkt-e0*Og{(!_g&G^2IU&Z&8 zo%JE^hSSoMrOB>lm1XlIox?F;e+xXDdLh=2x6uAH;{5&q-sR;=1ApR!X+w;NF~Dd^ zV|**luXvo(gntlwnuDs=a+Lh=-3=x@+D;$f8RZ`(P+zJ zjidY;TYmB^;F3R(6kzTg5EttgxXy|73+;+$D(^Y5et~Zaa4wJ0t{v-FvfK|zulYlH z%y_@Cv}xeh0MF;e`=w6lOllSHm;73Tu^%?QjQ%|*-Y

    &K0pblLdR9@qRCSR++WS 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 z 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ʎdZFbDz3f*w>B=5YbcEb~%niNXUfmU%CpbKE<2Lq7pb6((l-5(? zm+<_)JkDO+?8`gywR6`WO~{rHfA-5}1dlAk7P)A~%|kbRvbDYLlRMh;{?zun7Y;rX z9S+5B&E&HGQdNx){KhTq)s6A?7RH=tzssFZbZ6oa^+~t6AR25dk56w~NZ)zyoSs_4 zI&t#Uj-ebYc^sXXeCs0zjqVX8F0UHZlgWO2XRU)L)91$S+rgbP`BOMx#^9qbF{ z2U~;K-j%8C!`P;utJ*T>YGlkw#<#ky_t9gc0He7i0H*HL_8YRy;9_i^z54)?FB z5Av#mZMlup+peGwrh)hJ;%Oc4l;XdTb8Umz_G(Wi1nrlzN0+#~at!asz&kuxI3C42 zVfxoxN`FCD&cAr7+8U&t_0WUj$rG;QtvN<;D4$7hY@mWqMu)w49^qfDxPB9v zb+%+y`bIQt@S|~G;`-Mza4HYDu-Dc4mJSv_fxC;LU5oi%VgHDaw$sS7n$wK#QfGj@ z=PXsPk(GlkU#Y@(dyi*+)LeAPm9W_n zA7=ZHGV_4iCV8V6`)!kN2-r6uN9g|w@TK=>XG}Zt7w88iPsC`$*Wd%Xcl`?VtmfYJ zo6!$W#lAPl+{UEP`d`dn_rGB!H`}l}a(@f^VhQ>=@#*Mu@aiP`hm1YX<&5DR*&rhs zYJ8v0Vm_ZVs>70h^6155a1R4>kp7v64sPEcMw79No%`i=xBYSAmigvx9aukJ4|={X zZtm7+(8ayupW6Bi`sN+QS8dSx)#yT{ixVzn!>l$gqm9Rb)8Or)oxX;1n^q+G4}YI_ zKF(PHWGH7YarI+n9#x+7`q<(Se7rmm+WP+b$l^hNsP#JZVuCqzHq@d2AiA^`{GKPk z(^ZW#AB)`0xjdCgey{$lbHI_&3@lo!wAf=PP$50D2^Vez+gpUCa@dQ|c${UgO~$SN z%-lFYUDd7(=cO~zx5}*N?lH#gRWbLzG1*#r<&ghLp7H%YpL2kYol)j6`$or{wyW;c z(>6`%e0Dc-%2m1x)wEOZf}oWtV%?Qm#s2a!zl}4=JBBZIHv9XG4OHUZN0R#kciQ$= z)!^>b+MJ~DmoD{J+(&;N2o&s3QGXYCRQBD3MVkMfe-a*B!`7s{T|U&~`2910%7c zfBQk~XoUOFidDDDYyMGXguC4K1@7Q(=evi~t?*@dD)Z{MQ_K(PX~X-pPCJf#qw=en zt7w1t?W({(o`MGA;I5JM@HzWFPVFcD0$TkK*LS1t=+^w4XsVv8{Mze__*&X^m$ZF< zH@J%GKDp+nE2Hjx+EMpD?YidL;q;xzf7e+V=@?TvV>mT;O`mM$j4F@Hj<0cGG<|il zw5Ho%?ihKHz|`6e8B{$OSC^W51@`%l+mKX4~HsT0BB9Tz#iBc_ukeGEGX z)-PpO-nc*gszeQ0`A9OtJ>99Ntv!auRG!-Y z2=iql)2~J;f6}Nfv556>kUKvT{^5P8r@0e@v|s)=?nJvO z+ASSo`qk@g9b)VrEBP>ETKdI0x9rWIvNDhPrR%)U<{`?Pxcpju+dMsjPrNee8qis< zvO*ggfh{yS+P#_YDE+{`S$7q75W-bek2PF=t5s1>+2uj2yfn!D#nY^E%3^Qs)}u?m zA3M5$vTouG-R9zw4gKV~DPP}ZcDXlwlDiRoafx|JWR>;fj>C|Cw{KqgQ;yYN+ANPF=p$u=JBw#Z6Z`dXH>A5R6n;*zI#=z#i&1 z^Oey>JP6I2wU$}eWa|jThpM8{jitcpgNBPO@{}^Ky7IQ_(3scTjC;e|6sAY>y~aeC zwyd6FH83y1$DR3VqWYFvz6~{5_0@RBu(!^ls8w;HdZoiD<3885>PO}-&GUnS@&yY* zy@gBvEI6E++}In z+Bw;o&)+9L#beIREW%!W@q@OGXj>Qe$t`{m|Lv}9w;o+mIWk|_3M;w8pFb4i9*G!Z zel_Dg1uv^_t{G03TG+qEmsgceO;&Ai=5pl2Orq4^XUa)mo|DuW!G8Ft;ECp0S4X&` zCB~g{Wg9q$!ul6m&^PKCZ!!8%X+8%|bPuN~qYS?U_E|r-uPx@`0otLoY3^T1H6N~w z>Fr+QzzgfC!Qq#q>40kAAc#DTyXi6q;(KI6y*q(e&N^E zIY~$LR}ao!oVa`p7iE`EO{!gGmrqNo3`4tCHL`Q5zfWZde$$6)hr+U-2zxv>{y10Y z#otKt_e3!^=MSJ|Iey=V2I#>#4| zXUUpFO_eqH`d@RXxw0nuH39EmL^IMn3m;7;))xCM9zha#|wwyKLM7~Fj%wynXu5kKk3;&NkS6*+rgy^oJ?Zd-MsM89v{KW86(^^sy?}t4C%(_S-S)30lmD z$nEt$ckX9R7kd17uYK;0dsVbv1@~dCXAI9(S$e#D+79c)e?$zp-FrTmXRcl|6FnF* z9zqUb&C5N9~^lk9S|Cnmm+kuaD2G4;UssQ{m{Z4ZPX}`xx|K< z?|)=nqVE8F+2G5o%NGo0&7NJ>33OyZa1)MOeVe)arw5$A2M)0l%#<@{+B$H;IOx*0 zD6Tomu}@B*v(r9!?1P+Zgx~iV{|E3FlDcL`p@BiT@WLTG)rEv@Mz21^{xkcc8!Y&a z>PS(CKNub7%S3X$(a{uZO=_=8oxU^scEW8if^961bWCQC)myJQ?=2j4x$DzLr_>e4sC!NNYnaOl-23hgioSNZPfr6oa+F|&e{!`$$D_8m>NAG@m zo>kG0&j<05gg;urdHV`%p=>@N7=nxe`J~Xd9_$y}z^{Fe)KAaK=G`5af$_FZK8t%G z1J<74M{1K-_6K*%S3%G>>xbA|+IoMLmA>3*$MH`%^P9rV9O@lErfx%H<8?P<{*z97 z=uCNb($>@HaW$V8KsV0Va@z5>f6mYvhu*iDJ1>ksm8d&FHL#Ml)4xt-T7_@4~#Tch1%@*q4g1zQa*S6n;>;10Q0In_PH{Chr z5HzN^H0_KdgXufQ+xYJB<~QHoHj8&nI5o zr#;eTb(lU;eNhMh6X@5*?%It;8H?^bqdev*3d|ddNss3D4b`|fi@A8wy3bAr4h2J3 zjnnoF^P_^ zI*t9KK%4Zz;!Pt}j1~6SQ_WA=b|I-|?z3SWk02j~;Mog!(Brg?;J>A)%lEED+pbtw zKm1vqFQT`2#`m$Ue?JX*3;9WNl&`Zod38A0TE)I|4|ow@>#TKjc=dl?oy1VK@0!6) zM`wd8@x9ZG%`V~%?~8J7TYGBB=KF@rd}Ui@^8)?6)|s=(<{{#XvKLDbUq3PeF7PMi zmajN-cJSP$&no@6Jz?obg`Y0baY?jd9rls+en&UhxOI%jsQ&tkG^U)nV*Hr82ww() zHra+ymaXdu_8b`Q{iyXC`vSHP@z|jQ!>P;0#+L7LTP~MPEawp5S(jN?%U|bw{$FIw za2MX*Fy9C=Z7twPFdl!^mt5eR_QRo<@hQT6JR_U2>Au{`^sg0fb!}AmR$A$-^wuL9 z&^X#F}TkREHg&p{-Z%ffnCZDlWKFN4! z@n1PyR)S1Ho6CJx+f~@|C|#q!^nY7(iZ2zOe7@*kTan^R?+;rmH6Dc9lhEL*KzJyE z@1fJ!tT%$YRRQ0S|59L}zItp*2Ico*-MZl(Y%En~r^btTxZ95Z3rsJ#d`j`cU6EBV z)HDyh0QtA$BPhYUF2~y2g*;+-S`qE;wc9<1v;5Xjl(mg;-AUSLzSGxH_CQDA(;=HL z%pHm}-*v{%x9MBeH^BXNdSh>tDPn$GGsp2|7n(7r_3Hbh$ts`jizpZx;Qq<*jJd6G z%2)dB(CKONYHk?u&mAgx{;o5%+=0>k#c1*XapK)O3y>x7abfa&lkg7KdTN950VZ2A z=YNiU=Nx6*G^{%GoJ4+n2^^WeS>*Q3LG=ys*ln)tJ+t|!zU3q2?aQ!nn7-gr>m$XN zPR5^B&j;0ZoI~qY+id8~nrtP{%)|#m$jZD=Kb&p$!GC7&-s~^LcFS7Xz+PpyJ(eBZ zsO-i3v(^aDq3=()=M#qE8R|zLFc({_*IavcrEdhTSgA7}#6x4ODOa<$><G@v&{45Q%n8_foA=n0KEb+bHGO`7`C<+JX{2Kmy@qGtBT6&`y(#Yt^x0@S{GTX| z?jj6A({=EPG`KVS+Db1S_qk1<JKp6L($VQ(k9dgr7VoNiYh-UQ zg5BSZ*lWJTUKsJ%azfr?_U;3!m%Kmtz%FN$X59a6(97~(;!ZHu2Adr{!MOaMI!)c$ zCpO>aE&ojVPC@I^=R4oCcYEPCX(Q;d^lfAY!xyvVaHUxdeHa;1|3+RIoi}G3=c zr8gbTXYR~rT-fDOhUQP5&(Zx9zXn%opYor)r5YQD!wJ%b&wlBz`5(LQ#pDgmY+t^P z{apQX-ft*^O+nEl|GNXguz8B_-Ctmnr?|j$2QTz**yPQAYYtY}NKO>l&S~RB>)vts z&~uyrICYMGkK|mVZzIoUuj@h<=NEaDCLP#uPn9pvz7sS>8L|b{JN{HOx#sK6oRSON z3XiD{UnoyJtHqxCoi&X)=U9Y(;2>!<_pjs8y2->@^K(`hS-=ZVn)Th4$X_MD*NiQo zy}!LpaMk<4CARG8H^Jd;JMJ-gC-NPGPp`gT%(l8S*i@(TrX zZ@u*lvbK{Cs1eqcnuAAj9iI)zbj!tC2Z`J44-M^P{z=c~&H-%fMw*;^<4=Ezd*c_5 z%?YMVy+7gBbtP|=udoGt_me(?ET{kYMUEYzEni&h_T9x!e`@@m`2;$=fVJo`<^ts_ z3(smT%%5{a_q==S>OT5d(!TrM{B4EBb+P;ddfWE#@gg&dR^?#rCQ|{?IP^N3y`( z&EIO@$$D4k?Myij&(3G9HD_oGY0eZyGuJd*eft^5Cf>aNbmqObO@RK@&NBKofATE$ z85}*qN!tBG@cl6JaWC&-aJ`wjub*|-nHc^HOgVbXe~#X)-B$h#S?Rq}{4D0&-g>_q zuD*=?r;{h;woiSjI=|q)H}DpHt>gWkn?~ztul|@i!V~$aQ{8&JeyEhz`)|&)9($2} zaeOMh=bkgr-ty1E;oDDH?`H5HU5otp=2VB?2A~mh2d`HS7LJhFHjK)*)Xm=BGREb` z_E{b6(jOR@bf>z$VVHZRKQrecW0S0_bU)Ey?%P)UHw*GxcLe4R?R3Yc$uB%9UCa&F zT=h8TGEICv<=C$jFNa z-STzs@-Xwc?jd-e_H8ei->Uwe2%a6tkY0F7Jn$q1&*YI;qLUk6DQEvZ30!YO`@4`g zw9b2vd3hIgYRv4?n5nVa4!~!c`4+rez`23jythCX;(K%q>qYC`UVPc!$34`_R~48)Gyo0j4ux3G!B;H&<(RVPG&^fe{omu!MPP%z zF){P`cF7{_)h}QTv8U1B_{wVqxvdWtIA;V+8O4DEuh{uH>tD!ze44p5M7cl1Mq0YM z^`F|_F27>$xbvXGI{iz}^wY=YoS>0E%$XIHH_;t~3J);u9ywckwCmD>*4}@6?C9)# z$Cuhk`d4eoM#7bj^~sA`f30@^Isf&dS6}Sin||AGZRpCP#fN8ZYj@5vI(s{H%umgv z@l8c19uBCE@Tko5A@Ex8db6i3xXcsMIZn>czv$=O3x2P+afiBz^Nv4-G5$6V&wQc% zXER&c6Ek0ISO2^QeB1apdGvmrFujc~%?qExW%p7P@g=3Fuq+>R;O9ZMj>MN3S#7+I z<6>+)oW0<*WRun0C$`fWS1-Qdtgro^eYSSS<6}JdW9xe#I*>i8Sub@y{W$yVjjup+ zeWy7q{T8$W4}9Z2?&4lYnb29A)}=-_vJkz<&FDqGHZ7WY*_XGw)uS7EXlHeDdqJ>O zdtVXefr^ocJ=QiEKuy^durPmR>ozTSs;Fa!XD{^I!_z?P=Ao`hJc*FwQP~M20Dex&? z`JKm}%g#HWN*r_&tkL3lxM{#Wo{ z>gWZEfz5nVj$OBRuJP)gkGVXlt6+9(FyG-Z@0qbhnBYK1>5MJ+pL^o%vGu)QN0ahj zpfu(YEjJt=9~QLcEK6I9$Ibl;EAq{KU~Jqu`sEApfh&K)xy-3!{$MQs;ze(=#*_WP z&(_fI&Hq+uaj$K#dDU7<|hfAW=4_&PtRx@Pu2d^#ECPGp0_3)R=;%E96> z@hP84HhtZ(R{-a;l9%SJ$Tjw)oD~Y;lVU-&JGQHxv7JJe-szSxhdh$454r!s)nLsF z?e;jY+1~zI&6f7pYZ&Luu|KO}ob#{rCco0RkS<;cpjO-y{z;Vc?y$zIo;R^-Zly zE6|zfYqbBp-xIBGE-1@$Ci1K+x0o_oTpq2xgi%?ZZ|Svic@ln~?r6>==>POB{$v4t z^74?s@14WGw#Ce&XBRT&xo_}M^d)Clm#>4?k6(jt_B#tYY@f=Sn~_=VH2`%vE)f)|8z+~N8xI#FY^iM z)55z)@EaMUJ$KKv_U^#fY01nn*#^CA-#u%szD;YbHsp{#_=zn;pGD4ATjWneD+WF z|FWNLX>ishBfw>^OVBy0-N4NA> zJgbmh>#qD}`;I_xsFbzOd$j*5(sDoT(6^d8+UHCTw)#&v=j`|6&s^c<%u^>>D|{0? z6!KU(o0Cl!kMXa%!{4;$?l@z33u9Srul)bM+c9U|cRQesz8&n7OqzB38TnJo*t+HX z-S4sHDWD&RS-13nQ-v$63VrmGGgqAHp+CeoN?cl1nPrC^86ggD+yY-zSOxWjZ~Jb? zx9A`3KdDdrfw@N%r#=$>&6zxV_nCz^Buzj3iZzpD+ix^17`}hqg2g9hYn@y;1an=< z-4JcVth4UPxvTY~q`3?GOruj0O`3I$cMhVi3D-OQE)9FvH%jaMKex%*i}`of^~0=p zj$sQe*fsv&W6g7b^-e81-NkdPt9E@*do+mbwdvMihvv7(d812wSL^%X>#Xkf0dyWN zzR(?Kj=^74mh`<%zjVg@@O9Dd0rY~$Tpjdj^bSF5_A;%N((r>6xR4Ej^qMA(bO%8z zXwPw4H)&j(y&9FTwG+PeZ>tN0k3`|=OQHWk_*H6Fe97$4&)TI!5PXs+Y< zgMy0}sf+;n`+4xe{hur7$N&p)WzNFCUR)vCoIRv9UIbaj2Ccadteg3b_H~yR zbS$9G$kPWaBfj{O1tIpLzLK+I6X(B06FXQRMaZu_5#TE$?Ygy&kLL>L<}9@LAEc|# znb$fWA2os};h%S8&>w#;d09b+aCREJz^nGI$BwquKfg7~ytIt@X+3qtsIwe?A{q=b zhVkw2n!Ubr^`$CL&&fM)V10LE^4|kGpE8TSj%I$rI_q&{kf*3$X%6RGE48*09<;tY zyS$)dGwUGn%P8$P{j0fK?ZGzlll6zb(Ow1*Uq`!Q;6UXB(N_hz6Q=?kXuo3w8A3c; zd1Bz8p0wq+xHw>aCH{6AJjkc}H92!z2V9@lUH-X8wp}#4wVrXDfNv)Gmwy)FBm_P* zU*~~`o4`Z#tBsXG@SyeNQr43PSWm7+H#7omf0l9&u$F8__nxS++T_z(I>%c6yW!(y z=xhY{h1Qi9LvxB3&OXAJ);Idxa2$C+_9L?WmJE^NKh1wH|2_Q62B?l_q;yJh5WoCo zliB0`qnzXx_;5W>`Xy|!+{(bS|24`Yf-iJ+Q63f!7tS&E8*9J(7}j4HwGN*fhYKt z8=p@H%61p7Tiihzvu6MP;tu+`PxIK_*g>S3-E7gMo_O<(yZ%mj6zFFfZRK%u8@4B~?19 zyvPdLdLQo@9rn!I41B3lt!;g>1q`2BHHou;lao5*GeDSG^V(?$Q=a0>-)gTyAKCx@ z$VzO+lE`q+(mvb9Me$0jx7n|+apvW4%~^XdES#vYTG(8KJB}sM{a>$?LGgNO0BJB zb3GWC_nigwf$RY0P|utI?Q8yOrRj@Q^OKdc2!D`%Ni{cD%6?~rd#*>AvqtiAll^&l z$&tLN$-xa)=J?t`#qq^m zZ){(v2^m!3$CwZFHjj9yzGLWXWZQZtc+fwx=Ck16&ZD@ih`Ti_ZkJ1IieJfhT~@rx zQQSksRcFO{^KK))A}ikH-Aml3i2EsTg&DXGyZ@{O1B=P`5OF%6h5-@k?%zAWtnp8rP<=k#UNIl2{<8v5Xz3 zDEC1?TkD9Bv^9=V-F^VmCNd;x1&!0&^j?pIlZ+%M4(3e*IP-je=bSB##*pORf1W?) zbI$CuU)NrHt+m%$d+oCCHcc722+xvD_G#>=hc_*7Uf;CPIlO6+(>$i(Wb>FK?{@^J z4@vIoXqsNu5uCBvt;e@*?)A@)#i2RI7en)H){~o;cFmk;rt?4dGP28+G}*QxXT*+# zU%N=(Iu z=SvH_cZKZSoRW|6Ec|!&x6=ov+tWJ>lBv~8=~GwJs-c6y)n)2`HF9;wrqyMg#lar^ zFTt;MS5c@_HvI-jPCbbXHZ91FPZ4KY{Z<@jdi?Otd-R>7V@^PztC z!>h1s4cP1z!*;l{A3l*l)|*~Ge@Nv_TPi<^@|yQ{e;oS8`psKSUG2|oLR@C=kE}R< zj1^J+CAJlj@3YcB*z&NxyMFNEf%EyUcom#uaLbu|?w)Q8x--h^yXqd~IRo0Fdh}CS z$!EN~Hs^HQ4Q0hR^WfT|a<64?eDON(9JHyg7q}{p*#_Wj+u0}D(PP$ObC--!J2n=9 z&o0tkhb1wbOvl&LC$eKR5MA*$(dH`J6ShNO$nepxwE|!Ta1) zYx3I0;A7HxEuUmf{zNz$IY8RCW{jV+_Gr+J)rambvW&E4q-_XaH*an1w#SZ;ztp>@ zIk%KJ*LO~uId331Uh6NnbOJiSTXN$mP*TWa0%2E2~3y8HP6x*@;s_`n|Rkbi;T zZO(&phf5jrzp%g}zL0$8i93t`K$mp{KI`LzV5T~H;VXI?n2nYPM(+4Fu#(=YoArU+ z?x51XOT40&)5g6Mc*Q9w(km119~nYrr;=Y!#<7TC94o=I+#8tdhl=ql3UVJD-+O;C?oq`BNNhM?#<`q@ zAbANawGcNY+~f4 z`+$_%Sv}zr;)R6RTYBq9@Xsa2Z!(0f^0$_442&wf9GU)3KhE0*J9|fV7Ce69ohMp2 z&$0AlbKA7<32|Pj;9jf8_(G@4A*|71AL&$ZOwW}^ug5=O5`GDjSqI*EOc(am6%od@ z@YPC>mThN^DLtFDzs$B;QRZBKXI)*{#_;%-YCHceooiUZm_#$T_j!6}rG=(8?;6O7 z{XOTboVq^dfjsTh+4zQsd+j_M{reT<_op`WYs{{2+Shq`ULZb!^6l~aa<0wlk}V6p zO>1K|HUwacE$e+HZA6i zcto)n)BU7fnzt?xG3QQyo6M?y?nG`~cj3=Zx$kMR>($n?n^Dg+7c)xV2 zMeLze{`^Mt@62JvZ12C)63F*Qv6bll#iiIT+j%c)^uBK=uIv{!Fth)(`Mt|%FXSOARw{}|h&1`E9G@M*l zJkz}^%I(kRuhkzfPUF?!S>(5;HeGmf@2C5o2G6UNQy%?F3ar*Te8aFob+Y~s_A@8C z-*o?{j&|hyUAYsAakpEH7^={{24W_q?=h~$FW++E5$KFT1K;rb7lIBV2c6u&-B|A; z8{~6u(ruHfE)}?ZYJBIP{6Dd>!<L18p?uY;)ch&HyW`TtMYYhP z@Fa9R{FYwAUO5$-&%1n*#Cv|I`u-;BETGLVe2_ZGU9E1Luexn=?gX2o#&?W-f@iw_ znAT7nzb9lN7fzxz>TevqV(3dT&S`{*@8j*wl-K>{`=#-oTS2`|{PZ3g&;Ax(llYP74~70J>I{`zty6EedT!-z$>g73zv>e9j5g@Z zGNK%z8a_zPUpp*6T%E4y%u((GR!=u;cOh|G&daU{U3lRktM$7Np}(ik`bEJP{Dys5 z#PiwfFMj<`hSu8f<^a5T^j+V?H9k`atQ+8oUQFZL$Wuw)3iKy2r@#1LJ|{TIf3Ac% zO^=85!b2X9&9kQM*uLROS5})&%&F=Ae1`04JDPo2%|iZC{~my5>Di6!{b~_9hrm=< zm#I1Qa87gi;XX+INS{L^dlXadMvtDcR|pcvBAfmb&veUp;sSWS0%}h`Ge+}29(-eQ z19nNpmTJZ}nP}sFQ(_WHK2RRx50Z|@rmUVNH~#I)TJjs*8*Kyd&J*Y^zH`3M(*@=b zeBfTb5x;)xn8p3eUVDiqZ1m95IR4ER`o4Dbo)+geI?#QF(4FTk4@9P|2t;x#1Cc39 z0+C*Hm+}!lx8g45>rUotxpV1}WlrjtJMIkJ_F}wx{q}6dH{BRbexmFS=i9^r`w=p2 zJ24ln=7LX7BzD-}A_u+4T;8%6A8YPV9>jn6e6iK~?rQ<(y<Lsx z#&7mv(qV4nP7Ry#s;{>==KP8>W`Anh2qTM^+O&Wt5ASgE@WE~3A$Egj#s{Q6+aMb3T?6o;I?o5P%m$#x># ztC4sn%L#F2I)Oda=<|!FLm;VPo7?-(!KxfwEzpAk}OeG#Yc&f8CoGU$(82i%9tZ? z&tu|$_~ocC`o-}Nl|8g!t<_WG>#3vY8os#?o7z6B=cmx5v)IlRyIp?1I>(~3CBt*` zu;#||`!jRXxGX@N=aG3o!klYv-eS%dLYJcSMe`#(P+k*Dv4MD?+UF;brT<@^7PuXP zF0wao4MAHK`;b287Le}J0@gr+x#mpHnRd|)_Gakfb#K$F_~|7>A^s~?81lT?rcXR=2D{bw+5M(V2X8I|=p&k043T6@Gay-0g z0z3+SxMjqD&w?Hl@>9O*KJIGgr}u+Coe!kd+l&oQ{mA3@DzFOkZQ7V{8~4?>sEmHn zM=8#;-rw35;B0WfrQBE%>- z`7O>ah?gzrzx;aUg43PIF{R;fODVeEH-UFH-$KBsv@w8BoqN_Hmv*meBf1Y*zrvoN z+23=N#9q|BW^SyzD08N{i!o-=7WKVhtjGHrzT){fQZZL*f&*6UBy)NuM0u65R917V zdG~ey^0!bO+OsvnH}xLEe%B1&v#{CgzkaV=)){I~UX(0<%$KP~%g3HfGySvdF$TS| zHZ-=-66~jR7SU!rQ2tgm>sa`xJ5M<8yfOrwtJZ|tN>2w`=d8C{b6$x$pCiU)DwX9( zC-(rq8PpRAVz)=uK#$_yC38hG$G(6w_)5^3O4_RdtM&3e?hb|aTj=p?D_Q5zCNrPt z=nvMiHgpez;RSPI-`G_P-RQ@@F!wj?=QeH_(K8X#Ot`N#QKBdEP#Ad!9^Tn~g*t#i zn0Cb%rK_pJx77U4=D)kP*n5R(gSF%OL5Awk{lWN|*vrR5uf2dFD2kouaGyT`- zre>yQ4M`-Y59lG1v~1KmrC?zmKYjmX^t166+dZ39(ohlUh9_#y8?l|e3%)jgHCFc3 zLiFF%qcxB@<_(FBoFRg+6z1Snw@A8Qr4$6jfoVK)dLNfznyV%b~~x@?_s`b7elyS}8Hbw zrcAW%&-PXv+Wbe+`X@dW?b=dNIrN41my|xWgFDeG6|2cRXPel`{eXTf@Szp>g3=b7 z_}uezt*-Mg>Aos&PZSz==4jXTfp5-SX8*;^kliwKkbBu$0xdHK*pCv|zFv8Y?61xodvBRuM+U@hty(J#0aAOBY zX=7+PGLY_u11I7>{P1<}IvkvSNO+srX?5)j272BRd{etu_F3Cpd56B zPJSQUI{I`krf0w1jh~e*I>!E0IJcQ~P#=iZf8Lb|trwo*X}-maSx4Mcr#j*<>z)-W zqB5$Z8oCnC<2!zQuAR5Wa^h2te7ax^`$qDYOtM`6%GzxsHUsDoF&yEc$hxX)JMRO? zqf7mIWec8u+SBW3E~oN8lNLv5SA8(|ChOhM+Yq$J@ER-X$~-QA$*iM*@r#~IzR}*^ ztq++-^_ci?HS8&>i=y@EX~XSAxii$~X;#BXJE6agMw;c1BiiTnGuJ9{?|5_jk*QNw zy9JV?$9u7?p8y{0HFNVh>wA>)FZ%nMX5uT|&o|NRMn6qujXd|n{W>$DI}bd$OLQUC zH2U5J+m{)r=^Y@|7l4egfGiO)h$V4jF3tj7I z@^mZK7|Xq5(F${);kL@5j^Ib|b$H0#1LYsJ&UCOIu0{82kt=G!3EAXo$686rAidy& z+R$$gF!*50{q*ZTWdGF;X}RhD>9@v_>-NQuQnnD*djhUCK~ ze%R6Ua9KApmD1E+HSO&oZiwDreda03c(g(P_4{|~x~gA)Q#SE~vRpnRxFy$Twf@<^ zM;$v9bG|e`S|6MTT_sI*B-Y;+$$t=80=Qgxbfsg`^-X>cy?(xd*~FM5j$He=TMuZR zi5@9NK}T@LkZg14j|K~=L%s>bK5_MA?ZN+8T)l1E;*Q{hL$$>Hk*rxdC3>iCvUR9G zKh{-8Y`^}wE1d#jALtxK0r4}He{erGV)AP)>N+ha)s)RS?b}^=EB5v3vEE%A$-!mL z!QkYfFTD5ksadCy-Pvn2O*z`ZT1_gxsK)R!=*-V`zR360?;u{N?x(M&uiNpL$G>Dy zV{dN?y7|@j_HmH|>U(?e1-I`V!Kp*9R#-g?*dKQUR}SGf-qZgzcq;Y8z`cZEgj}F_ zaaP!)L7bCHCgxhnT*j<^Xssy5spLZaH|-I3!I{W6oty4Z9~u=?blYO9kr;#ctyzu4 zp~IKW%*#1^SXAEp(qVH|T&N89Tu8%(C*x6PMlE`SKZw?U6I}4_)AY|TWZ~z8OmMDv zOlzE<+Bgl|-tm3I6UDc?xT1MZdZOn#NoS;=0%{Lor=-rW9PChg~} z*`vVhN$>=}5*JTYMz~RO^ck(cdeNNilYKl{VerJ&2fQ$NECV+x!^61I+j5ul{k`aL zn1A)*G(6`WbQnML*G*zBv>n{h{p_0eIO|LO?j^7KV8&NNy8dhZS94zjwCq4N@i8R# zDLs|eCc6FSDt!8NHQlGy-_(0#XY$s&${U|e`4hdse!L$VQ_7vA@^R@zr>Q;c^4_(F z=Jw_vlK;!H8e)R^x?7buI?zl$qHopgr43*BUEkC9!0`Pu8h5ib^cwZ#R{2lS?hvwn zh&VuoZWeLQ!@Mi+wP?HggB<kmYv`TR%yRHR$+drS#>)SvKUNn$y#+zyD4M&M#!kIY10o{v> zgJz8E=bl^d!wnsW8>3jZ%5|Rp0vLL{Rd6tVO`#j3PWDYPbeP-`aI@{WW1o! zx^#n6t{<^wAp?tk=8oPoj>OG3=auEhrSflU-9hha#|^z!{n1#mrignGNH;&}>6^LF zDfILRT=cEF$kY3&KI%%=PKzZw&=b_n^vZ)LtpzqZCB|&dV^61FC0XwJ``z`w;qmX` z`U8IbV@KEjgs+=WpPGq{vYoy*|HkPqza@C4LF-*MIBf0uZg{NLyum}#Jsk^vSVqTk zggS4W9!;k6n+EhR(l4anS!eJ`=5XIFpIz_WY?`eRRbnwy^2BF)b7a3dY})qWV- zR~oY>&B3>EZH@ItJ zmw!jv@cM;Up?i@pn9f#S-ET~~Cyi0R^u9qehiUST484ukdJq^HIQOyVT}1iJ^Z`AJpVI`^uPk*T7k#^M`dpL zzbF&)%3OK$AK6FP;J*C8ynCBc$ENh8pcfjiblyjyljop`3)`d4Tg0%wP@IK)gS3Wfv+lmem8Bo+o{4^IVdx|1GyOT7UthafemB7Bq}mWp z96?9rwx_*6v`#dQ7$z=1I{JjgohCu#R{Y+59w!|^0sT5yxq7q8>1>LgvS~@LeQuLg zpBl7WpS@Yszn%VNv!@zB2cE#*FP)X}L1n<EYLk&TPD;p2d8EdRh_t6qCH>9f+$%>YYeL+{*m`nplO`Za(LIzMP| z$M4T5+i*LuOs5lZl}U?Tc9j2CfjbYm=4sZeWSaE6jpRKX3I5pdpiG^z+o!P=Lwfd- zx7xRH2==0HMi-#(zfH~yv!-qCHc~$Q(#u|rH=k$!wh1{@dDTZ_TaixL$gMB*x#z2U z&f?2&;N|M!y>l^|%Um1XfySJ#`+=xO<4d=hXZd+E&%mdST|bQT>O&lu>$wLUD~0cr zNGE~3-p>DUFFti4Z+&R5Rn1+kp&8gaW?D(np7}SR6DwwIcyr>8UuQN{pY|C2jI~ts zf%TL~+3mW{rDDl6w7p)C&Ug+5M;E^wHfuHAAa1LzCh~J6o(9hH- zxaoh0HKy{zz7hX_l|44vC(iU&&*5>U$&v6QmmWwj7ltRw$3F(_tp>%yy$wF?uFYK8 zR9$%xyQ26SbknB;X)?3Hisv$b^AAp z7wWrX`b}RQ+PRi&t-R^`63NxFU44n4`sh?&yDW42A-P=jWex9bj7;kFQR^XnpB3|P z?n8Sf)uEq}WA-BBq|2y#vCC>brORAK?mzGE?%BclB^q^)z)M*Je%10GJOk2<5B{y#-rpQDT` zJx%$ZaAW&SgLZlICcawA{Z#|3!E!r$aFD&%o&4X;dz_GKN^7u}U8(`^j4eK7yL->1 zRTy<#ITe{%b<0=P*yK~kbk9>3^bt9J%gC9Gg>kE=h@a89z}x1ltm{|KxsQ&S$du^t z<#TuhpYtQznid}=UdIvq&X1sH@8)|qy7spNxvs9@yM0!V+v^yA2+hTwy@A%fZ`kaCytxQLFMo1>N86hLYvscGI@;LF zJQlhRTP^4571QXDAJgbn^aZAj>P}LZp2q&>mYec*;=Eap&6x7iu8YJo>gFuE(%+g) z927skQJ=4qSGwXK_4BQ;DSBWIV=Ch8@CL?Jv&}ld9@ITM?9yG}vkq9*0Jm!3R{||A zY>XZ#;!N(kuLKWNW4o$dX(a{AquZhf-oW>7-L@U%Zz2D)i)%kGSb6x7852fh(61yb zcB1s?msc*$jE_=cyYVJ>kM-g|_WAUun7A-M^Yv`0afglK4fwL!5$3#8m0K)pF^m>S^|Qjr4qm zKPWz;;t0t1q8a`w`Gsds;$H(^{D)wmRsLj`9vS1DLuUFyVAkN}c~;UvMjI%HhJqhY zuL`v(PQhV(go3Oaom*Fo1$YlJRi+NdReS?qFU3YE30Mmc`*9V&`zhioqT6%hP~WN; z3Nu~2`FWbHCNySRCzCxKm!*<-(_RPVL&>eD7LZnepHJgyok{j|iDmq6pXS-14-=~| zN_=3!f#-b1X%TM9N2?Z{;}e{zpT$_d@c68@|NPA?KR(Lnm?~YTy%;Hb(qg2jzK+4o z&X3XKb{EZRo7QXfT*1D2nQ?FB{Br~FxM3RSJ_9oci?Bl~e;;tslk@OBZvpEFef}oz z#5K!P`lUy1cP^vX)_a{Bn{f?sQf9U2zZ)Z^+>epM+|>T!sZ*f|vrfFo`qO!P;$3-h zQWkk}QksYXS;hGV6DK9ee-kHV`UkO7Q^u`n3EO#dO7XK(Ob<6^3gp0&wQRw`hMbl{yKXHIHZE(p-s0F zW5dKk9;5X~oH8$6@9Mj;7wg^peh$z7#c;WCZn^aT#wTqkIJWcjOYAYpFPbEOd-0k) z;PrF-2Ta_S^U#+{{7!RcarZW7A>H^bH*kmc1H^AZeyHcE_$})+FW{8v#})CKwEvgE z$KAxSJj&Wrx^&%rK0Rsn<5}K1<%M0yU+&oSO>sq3-(~7b%)@7reXP!7)&{4Ykp6ug zytR%w>A%%V_O=8L#If;)!av!iy`*SSH?or37Vmw&ohKf)ID0U4u<}M|0Q7YReffvG z^V$?^?mTN%@yovZP+r?^;$Q|Cld(^$9}j`=!tdJ2yLL4f=e0G$x3KkeRz_{kD%cvT}YU7+{pfcHDh(a-6}pAy^Ui}X!!YntiBu|EjR zl0M87d*)SOR?hdL3_Q?!rw=aNwiDBG>Fm6=VcFrCV~gj|-$LM4M1LP5&WqNlVkjxz zjbNs-RV(t^3YhOA=DU>ncISdKccRgPS(OX3nJ0|=s_*cF6K?^VTFQ468 z5o^QS&*lKD<+L3GR?#mvEe-*zQs7jIJT1Pkeu@|K7!$ z(tgG_<#~c{l0n}9UnDDOKU=ed`9;<;c+^aK6*Mo_!dQY0pDv@k(#KkUiI=en3cW5*X8oAc&l$PPm0Ccz#MI3j+&XHX8PGkKO5+0HD?se*uTk~2`6=)OtEJ! zFy2dRDxCq=-rJT8mXvyf~@iH`&ao_|0+J zK8ig0##fpa&#ZmDZQfn4yXPCteqZI9C;#Or9=RhgdU`#Y*Y_kI|jU_j<#pc8$cENn3+%`;7evV;8Sh%$cX^yqGi5pozV@!rikL zpi|el;=YWf_u;rRl;wY}+4JaI`g_*Md3IOFVD>#9%IDwdt90oi((_$S@1uPBZ4&+D znSS0fea~v*R;G?k9@f(g6$e@u+=T5Hy<6la3;H)>u+YD&AP@cRCH8oiISbs3Ur+b- z_ypf?x$8NxM7o?AgRx22-|r`8&oXd`Jlgx=bFsRXyD7HgQ&Ku3)H2t$dj@l%f9wI* zD&7R^Y%Q@SY~+)<_8$$+vHv^Azj6i(h=EasUZ}+W$dG8H?6px}H&g|#Xf2^v$X(F5 zcBqi~j?;IIx0k2(ab^!z%N}s`yL7!|I5=2HU2N2_$f60Z=TyYmz>R= z2+}3Z9BgMzDJF(Z3@LZa6FD0Rop}*|CY>=0&6tX;NBnE-yBg~eVAa3GYe#)CeQI8Z z&yas_Tr;+gD&mQYt~cWkAwClNSYDe&J^9v*!D{45dyGdXn^$@~NHTdd`z`bZt~?um zCUBrydeZ!cPxpCx8+Xn%RyT&n+0^RgjQI)1A%Bvu|Ir;z^XDrfwVYA7B>4ESQXdoV zRXNg07c$mpv8T6D`sFq7;pNCoz&YOZ=HlL_AF#)8%R}-BW`cdqW+; zILJCXsX8y8UgcbQd9^dJ?>_hrIEoGY;%nYK7iy0K&M2RLiR*GF=TC}0Cb}da$?k;> zD?2KuZ$7+!`k}-7rf-%!-?4srndV_nFwmoY?rG!~w=A&Nnk@v!62L!E?D;oeAdh1I zoL^PxT!QaOx7a%_)@5uIiBWmve7(23Os_dGNGd|L)pY zCsx{<-`yRI{BrIDXW%u<>G(M3U>S$vq?HtAx6P`7c5>cm#?4LJ z%^KLUo_+gz^djl{2Zk;&f0_@?gXY70SDyZTQKt}^nfPzkWcitHe;m1r`Ui=TwBwVk zfj=l6j}%u)I} zPPL))p+DRMn>@c0xTOB{RN}N%Z>|5A#rFDtUL06|4B8tw&x2|Dv&AP_L)$6cf zeBP?(oL|@0Y^#1PW9)#wi^potZVX2+?SbBYofv(lFQw%9P~UEib@kDw5@?M2>cXP< zHpl348^B@R`z*RYa4Y*0aI+3t;_8c9D(Ve96wAr9V`8Lf+^VmTaTm~b)zi_P4)=2} z9cL|c@WGe;!Dek;t6UBIr~_V7f^JJblA-ap4Nb#l^ft0v%-6ehd>lOpa#VLw*p(3* zkhA3@+KoKhF~_3=TAv-z7N-+FhkYnexa^Wc`6_Th{cGU7(j@Zmbp60ohbspl>(oN) zgg;i(_ZHht-(M`=VKsFxmVGJ#&5;b!;L}yr1>JLbBJUsKBQ?Ifm+l84zloCCiU>4y zVd-k-p~QoW_O6l-N=mHcoExLb9Li>w=Cnm^52kV8R)vf(_iw9MD>;Kjg?CsA zuWlV`N8h5}eB@@@21jJfykQx$5Zhk^a?P!lHF&xNdhP2kl3Ewk*Ia?j!TzidI$ndW ztDJnLbG&s%P_CAQ&(j;wsa;~N$AkF#`8w_dxSVg_;KnV}8Cl{vo}7+;csBDf)sx3v z93N8bmsR+YTllcA;hDwrVV)u8^>yZ9x_D`}GY|f7_F>*nj~!{_ZLf_2<|whsJIC3` z_)VO_p*6^J!Kp3gUi%{MwC}&@&6{*es_#|yBJv?VPx%o2+O#gzW_;%rYbOCO7{cHB zEOO=$yyh%4N#hiJ^pj7cXo+ZWA^lJ+gq`4cf_{p&m^;bNzsGsli_n$Rd@EiOIeRuZ zRIu|0+&BM2_a0mBop(+RrhtNS8U7vVz|9aYgSa1suR~Hd9d(o?bRbHR+Wp~nAXsS3+ z*o5tum;~|Q_jzt3zGSGAd%>VRHw@N@_E5k2s~G4yi<3asOzg9u(PLT@Zxh1++Pkhhlmc+=+N%`?|I+QScR6%O6b__7bEKJHaHFvB0m1?KoN zeU6XIIpE>!RCgcb?llCjR~Y+#4_+4Z(}mZ51F!KOyf*sq`l+`Mx^x&Eaq-kUR}&9{ zvo5SW{ciuUsCz!^GUL;j72i*Al5VD-yhm?3ztH!gc>?PShg|I1{XFTp0Sq}!s&$1rXchRSQ@O%fj z+zripleMG0e7xAxnTh|kZ^PGQHftT-Sm;^LC&Ta(>0!diP95-)DK_P1!%G?)7I&~_ zwNKm0epY^U(jC+Qw}uK&7Wejn-kEu84EW%$2WyOdfW2>PGyO0$?I`86r-MiTT>U~>UT9A$M5SC zbgg>xIZq;Az%Z~w-}s?(gl63ERpx4R45h23sh>LQWX^-su8V4ayvUq?ss<-&rg^aW z0=_}%=Rr(c=`w>E`)~6VdIjB2!&gS)0Fxi zZnFop!!6li&(}`#u{6!UUh74Co_=KP{k*xCUz_gAGW|r4vq<)clIuA;_(kincGkMS zRTDd*gxJxXJ6dGp%VzYy?VLYgy-m)y7i^4y^T;hu740JI6wOQ9O?=EkJ?kASh#Zz^~LNE#{s-?pd%md zM;x3;ebjoq9rzYfruU;#Cd+$Yypk1w{wY6o~`k$XtIHgl~Qkp7X)VwVk z=|DauPDM{$g?&cnFGII%-?j8(yLWBfYn}N5x~a4Cw(r9JJ?ul%FxGZMR`2;bxzROuB;(Pf0;cQXR>rcKte?v7eSWB$XLUbjn z!~F7Fvk#ei-^Sk2i(MzaFGQTvKx+l`=X5*gT1ri z!SgJaN9fx?`nQ{~fn&okee362!Y_C9lh$h2mo(2#UYHf-XD83++sUC~J9%ZcoxC{L zPQJVUHs{@&?d0Ii?91ob$$>@u@;U!;E6-w{<#zINrJcOA#7>@DPTD-uR`5ht7+A#< z{xh(~PWC@+ClhP!WNJOXjr=z8+rqDjUkmwOUdEm(docD1?JuP3k?%ncak0jCCS6<5 z)Xud5WC?#>2WI12u!$I8^aY&GeXVKD&?W4j;^|3r$%<(#JIUjG6P^m^y2l=gbY%H- zuW7Q2KMn7u4(@)#daM_nLj0LL=Q6n0KJHWKY^Dq$+qn4A!FwM5;lkH^dy$JDGvK|#%x0ky- zWJeCMmb6ED2pk43?;rgG()~5Mj5O+W&y4NC?tj`Jzs>|JPW-vKvE=2OStI*A`BC%P z4^C}<+;-~zINa zD|h67dQX*G&wF|~r5*W?)M}MIL0yB?RrMdK`6s4%b-`oZx}2YQbyWM$lAomJtDeF_ zPcGd1R%-R#{#XSA#e7v?e&XHJj2t-2)tT=1@kDqW%4$GgHuReCR_7*-jA?K<-k&;{ zVm<8XPp$5F`Ef`1ES*vF2I&mEIeLwAo5F=XlvjI~z?+0ma}18Jxph3!W6#D1vd)(C#X^n`79R0V{>cRa%bZ8zPiynN*ACuZMII?OOcXB&#=6x;u zn(Ze&m__~P+C1yb=^pT4qM0}Na!+c0_LPx%Q@J;3Q*}4^Pn9d?J-wXL8vZr4T4lX? z18@E{H9seBWZqO)-H*Jw3jAl{hpG9h$IRQhAEs94`ST_l_Z4)~75@L`|8;GgE$1wG z(|>t5>&|89NF?-MDfdjmvwnH`We*esU-&_CHtU(XuRxdP@Lj%H-yBbDB>PBYh_t1B zsYM#I*0`R+hYP;V{SM%Lg?cVi2m7vEt!vRU<<(jKi|Z$}y7Xw@_=u4cL&Shi?6kp` z?7_ZSo}T6=_cdtHEB3Hl-2WZ^pRkj?{|XN|WfP}Iy#6|OJ(j31KjC}R#Ma(@ z*SYm6hE|DaD0vV0@<%@XsfOR{Y+COPzWgx}*`?|FNNP8~ljAq1o*#ec!dYN>5x#yI zTu<>6e1jFqbK@$KmvbtT@%7icZN&YyT={^zyb`D2)BhTCWfL2E8gCl!=F@l{^zm14 zH89M+-Rk)tz}LXOpZQ3@2b0jn3(&;$+o-ox`w)_T`vWFDSD-Po$vc=$bVLSAH1hOCD5yW;$lb-r8U0pd#TlN#-VX9Ll&!Hyw7qT z?AbAadv_CGA%qPY+wpS;*a!XvXR*Fh_qnnkg(tQgvGd>B3f@R>QA*5f>9WSx4VHcG zSE)sn^ugr=;KUug8#vzwznKcZxt%nXEn*Mz3CjMGvWNM<7d=l--Nv$;I2$ZH6q3tCYsZca{QE?iT2j?Og5bWlx;m4l*?5H@z7 zarNk^OPq;1BX=81aO!idzTb@m!X$pNdu4Xu0)1r4XcdqnQWy0!nq;n@+H>1 z@a-Jlg-F8yw#Z>~(?({01U6-%ktmmM@m{m5nG zng5|%wTJpO`xDRaQoQ~`UNkv|Z*Ds6s(&AR;LACz+YV&7s`b}&${A1Q* zM;GW`JG-+tFTfpSf#fCDaeOZF&dsdnd4Xi%0^;$4bN%#XPEDY-WDj~r_}koG-V1}R zi78gHq$b!pu#dYN_5@o8xvw;_Rs3txFbxr`Di~*CZbkAqdZq#D&8vH&tRLD|YA?zz zXD?GR>Ap+F(lar(1oBpD-{eT@@Z?AWnbYiLE-b3xZnTQzmGX*YqLQEJ$r9+va_Gql z=!q|%ijFki%${amMe_X370CO{6)_f{u&vxT@qg&2{p`AdvKVx;bL`Nfc;zH_P78=l zCO%$>F25J~B96>w=Kef=YJcVroWo6%h9pn#IUVeIgEcN#f4BHaCo#@Sz7~AIl_k_( z4eOzE_G7MmzK-{frhA5Rpyyk$SM*|o+TS#}Y&m>ewEkP)xy8{MGPHd^ZHTsuuHOWG zZ>KG_Bib&R^dFE}8u4ji-yFfWWq$q#!N+X&N}|)-SOasi0zGRd5NqUoYM3UpKoh=I zHxi?*ocN4;&mm7;=gmi`uD`70Txy~88~+GxG4r6i|J1hbHi=VrYOc3W)cCihjsI1~ zF1XvkE`{t}fc^Yc@~fS7XHu(A(9R%m-^%~KUqd&6#qr5r+iOXyAWgL32h*SrN-JPsz3ZIubd72Cf=Rb{x3(D>3i2J^8?DL zt=(#$v~1ctLHnkkdk0f4E&Ab1Xc75J2URz8#HBmg(4Fxv-4T2$@Y_(#Acwm&wXZzL zT{_O$2g?S*$qhYsZeAJ-&)Lv==b@#I+#_?dm3*C;Fv1z;CHE%g3mSf=8yb$@=(+cx z;a_FGegz#o5WcRZ-KXJi_%z%BKSI#(s_>9IUz`0o(w$(sXKERBD)xu=TYKQs>fZu? zu0->d&*kalxgQ+-Z={KCz5$+!ZYsZU*3e9~H{jEA(abr1{tEC|eBl7!539US&&3y9 znDF251l4hZ^Dp8FA?mPWIoylnwHsjFn|Al2M-v`=f;vpSvN2vqxtrh#s&|`9&*3%j z1J#>DoUu2-6V+W>lhf(eZ+kuqqU{>5%E@1+-yd_jUgE|6)B?rk&^cAjiAz5iTmLxx z!0c#!XJ^yOayxtD5n!o&B_a0?t&{gx;zP(7+yRwaY(E>@oU%k^O%8 z?dTHe^F{XE<#$<+p-WqRkv)ESz4cg}Ixn*CFGt_lzC1yujT^qOBUw5dD)+>>JSj6gZ`P7r_O|o1N%tI)1VMdNplGeK|_q?fU{f zDu?fl>vt^~#HD3^x}jrcEla2A6hGnesT%sMvI*KupeJ*RAM?^rA(#05(f8f-Mg35J zgo~$q+|;*!^WU4l&HB5B&iZX=N7Dg+k15{8zCCmxweVh-zm3=kT>1pBdIUb_jtQAn z&yD}USeqYw}pKr5&Jl2_7?U=nNbysz!=69y;MODsmymHn4Q{{rZrPozvn!i77FRHqhzUuS(WQ;4_*C{>LdI`GIupK+O z!^h=o!B22`k$Dv?^b5UgwE~#j(ATWiucfEI=H3sJ8+yi#($;5`?-8r@%X&6h ztxbB~YPB}%x!-Ets^>hb^^1CLC1$UluUoD4dd{|5pX52*?qTdZ{BK@|UIU(2!@joR zdCpA}KaIN-;OlloG|8>2jXQ%>$6TxRkM+#AT0g7jTB~)Po)25C)jT(&7hlUWF(vl* zpW&&tWQV)nymRM^WI)M8tM$x_{XGjmH&kx5-lOMktMzU@mvfgBPn8c(v|8)1!7Ww# z3aeFeaOh^MRXV276bn5M&q}K`s%Np)Dq0zu#a(1PRX(%{|8S*ku{bN0HvaEet@D(= z%4)qu&zG!L?YBcqtkzHHxzB2ytLGYY**yR9E#h1GwkFjpoxg0o@iq8Mjh)&u3;!sc zb&zkp?$kWOdeq)@;d<`P49sjPY{4EwKUFq9j~Fje+J)tecz7n z4SGnYuG4m&+#7I08?n`?FOPb6C34q-cQ+2@qz@0h!u$Yx6SqIXek44>vq_4sSolK6 z$LUN2v;lcANSQ|NkKZ#9ahjfRK>FfD@RwRCwxQxV_iYtEJPS3|O zJ`vv*`K~}e<+~#P`&83N3^&CRw(alJsF;#2052<0DY;7ZF<*#NByIQ_Xn@D=w zdf!RE)^T@@`_7yid)x0-&cC1b+Wytvy~?WF=+IM@+*5~aAbyBHox4xszQED;G2|7M zsm5;R+Q$OMKIWYt#eR0ML-w%=UVOJWap#l8$dAwbp@UrF>4}?W4M~pe;Jl3LiWhtH zrM;*AH~+r&vnwO^GxF~6T@y8SHsD)uu|UmW|{+iCW*qsD%A!QY3{|5ULZNtN?Em9;swGwYBGo1nLk zH2281ugA|87&*mTTwdJEJ-f0&*0WZ>t@Uzj^xZz$tOvz}QJJ~ueFo=Rj!jyjzebd9 zeg?mc&F<>4#q7>p;`*5~dQPFfO#$wDV1B>OS}@-@W9P4*(P!v~>klfP)<_%@l{0;- z&>Hp6U7Iwsw&Owg6!vZ9*L^=a(|@%*rz=PL@_~OIcQmgJaj!{$b0SvfynCX~E@-6c z6pzv~8Z3XSeH?br94qNP$`7U^4xnTsNHnDB}P(EnRSkNvaBrhH;e)G=c@a%tSc z^XR}u_ceC$B*i^Wk0Wx0JDzFBU0-G#=YgAaoTFhHc0Q;KwCbDknR!wB8n0q%%XV8p zJ0Zr6k0f_MTF6qw^nx$wuH2#1BXCt6(}3w);FqBj`1GAQ3NO^T_b_|ue(sQL_Ti)a z?X0z-N3xvL{@RIhmxS5_e}?<-#r9t6jwy4^glTUsYsM+IdItR1XJ#C#A7B09*k}RY zZ_=!t%(_}=S7)56VlBJOT5MsTcPH_#%^iKJ^V@#k;K^>>GlT2;)`t%y_~Z8d+24|H z9en{A+{pMUN@AM~GV{O2bB`Go(JJg7Ez_|HG}pGr&blg6zwig$6fKCc6A zpZCi?=|8{VKP6wOzGeRNQU7V=tBwBuIpB-(nfmqqu|liWz+eBRtJQPEHS+3P1>dIn z`BwW+$%y(U8BtFoPkzk*zw8?IrMIne3;p~7;!Wwyy3)2mC;rfXFY}+b_|Lt-WuE_D z#QPuk?<$uL-)*%2QU6;X`J@X`o)6^%H~8Rw+w0LM_g!mQc{LBvCimUI0DA5IH*igF z*QL9ZGx)4J7_*!I4eBDV`)=wt`7-f7eGToPoa(vO8rtUj_zu@qsn{AHzF$jqyox+z z_|1>SZz??c_i6>_>5+F|%-}i58NWS_WE#Ijh8T_oqqg)jeMIkJ03zdzFdqBxMhrk6$yVo-q(9P{o<)A=lqIj zGR1k|Ui2YXBzL8M=j_uJ|9cJJ`-|`Jcs@E7b3bqudSKI6J>ezu{|0_jh1_k<7oVOI zbAHAiUi`Fshj(5!H0kTRB;QYFJ}+?3RkhA1ab8Pvt^e|abmPF1b`IWf9^0a6GoFu} z&bg>3S6a>&9w6`Jo~HnOWnNi(`UF}d25!F%J+QbelszjyU8tl(x(!C zLucgkTppd^zTj|y)w4Yi-qEq4pbUrCmXbm%QVY!bg9|%Ak<{&pL=MLeG z$XFXDEIUzNXq_p&WrsU=Rm9ZD{^9ZCb#}PrCOf;O^yrD>p~mi=JO1hTamCxnAuV*^ z&Ewk}f3R}{`M4+C%~x`?`*>aB2{)h8=8~`EK=-J8N>e|okj<8I4|D0HBmX(mp1EV; z#HB6xCiiHMEI%~GDp9_3E0z-jW*ISHmU15*^x#p&tPHv_D|HW~=v(fOqfS8qv5F>) z#9ow~XW99bzm4*hl&_$CjPl=e@%G$`J4nBs^xH_UB)tM(5ib_z@0w>br)o1j-s3jf ztj0&S6MWnNK6ir81K@MEoqc>ic-sQr&INA=!P~iZ&heYT@o$m#EpYrMaD2Qy{`j9z z_N(CXUEuNoa9J>@1uk_ytY+D>ehaLs7}FBQbO&R)oiPzNtjWapyfz%K4ZGW^?>6e= zEZrl(=a}uny_S7Ke^7ej(20JE!b_a0x=JVW&d-%43Z+G+UF23DK|FhgS;kRzgXPv{49ne2-n0u}CckpvX{v|K# z9ljP2K0w>WmrIdt6EBY&-ZNDfaVF!m%ahP?+({pn(}!jBVJUs6q7PpGK6BsgrOOK| zxxa9{lfb6Bv=IO3+1bQXyE~HDf(*a*?#R-6Z{Lg!ea_NJw;!6<81msUatG$6NB+gd zziajTTKIaJF-RvNKOEti#v(keV=h>e$7`>X&ccfwR?8XYI@Z6N4qw4HHED46++fi4 z)p?rl4QcdYmQNq9-LD6L%NpQvKXADZxU2>)WBu5%OZavN-)`sIZG5Xtiz_>VLk54+ z$B18_TgNi!QGtJFWDfM|CgfZKnmphC9m{!lKlWApO0*XG-(C@!vnuM^mgW%Ge%b%p zd}`^QaOXLEEiT|^aT!001=z)vw|$?D-_lfQ$qaB|iW~FfXYlc#gG0Z7{tJd)9`S-{ zW z1@P=*=$-IEH0RukHO#^N%)x!k!D{AU6?0(bXJihvj;}nbyI8;fIraCdG!r}%pO_kA zY|vN5Sy5i$Ti1pshP3`e_KeXu2R^xJ;M-fQCxdVO;A)7tn36d{(0b0SJzw&%?p*=k zsXEWGx7YgYg@*X|`Q|EKj_mV-nPO8HQitfdn?K`z(kqWHg|-;_u@V^E3k>c71}hln z-O!dXK91hcxBK|US=2{3qs+Yvsh|fRGiNo(u6^e24Y&@@U!T+=|aI z{)ZX=LyZ4H#{U58cbpF!&giaL$+vs?b`RfHfIA-CG}lXm*P`cKF0M9<1@JJ z$yx#6nB}g?j;rjK_Z7qUDI;87=g+fQKff=%pMxGA8q%}umrp+*LdGbaio755a7=hB zpTws>uk#ymKl*@M);`Wp?dkeH1l6`on(AEuVQGw=D8#|bw__7 zeV(W8D9M=T>aRtwSln4`Ij8t#qDl z@LqFcBUk1@9}~Z+JeA6hz8@OXyvuqgYhpiZMD-YYW!6Z{@R${&>Ac~$nfYy>-)OB$ zMv~mn3vTqWhgba{<}IEKZFu#$6{}eft5^>!Sr7NJ9`1pb7&<$;58^eZAEv)!fWu$I zBYT0b^peC4IY}QqK8s#WXZ#v;-kbA!=FE5pK2(Osb_7=)>S|h5=ImTm*1yV59^AKT z^Q*^J9qOF@XU@PQoFU-sfX1OcNGWi%e7PbUxgrO-Vwo@Nn7hdh?xfGhHlGe@FO?}P zsqU-o(UhLPCd_)!o>F_uOk4>~4YvqaY&&|OV_LYywux&*9oLdG^{u^$yS?T%eA<;0 zDv7<~%lG21g^aVXqu{#28``fc{IYdL`LD*uUvJ7SYcCGq&lTwD!^cjr&%}{J;(03l z+=|ii`iQJPdOu<*tLBcli)6r<9sv! z4L=^>E|Ib1`5x=f=yDD3tsuW2Q#luZM>n>#_=~$=0#52n$VzZF@#wBOU$onF|5VAC z?Yk1laOGK1pKh;!Hrx$uxC`2FC$wQX^xyExd--+`-&XMLZob_GZScPRE*Prq?HjAh zveDBlgGV=SEGXNE%(($xUj>ZI@ds3%b1NREjfZICLE3nLHrCL-C+El}BYWglKX$Dr zmwCDd$^I%o2YR7#1zy~~OZOQmEmMy3+VSX|p>5~IK>ecc`z|YChE#2i+ zO^gcJ{AK6&>KR#IBWr7f&s}-c+b>Gi^yFd5N#5Q?=iw5>b7ub?G5p@>vbBy*uV)_u zPxsdG2tSo>!0^-$tyiBnWTqE-I_wY8i9P=M{#~?vgx5&FuUHUxLhs2(lhCn zhr8P2xqIK-_Hj=gh(9xiyTsmF9ADJ%={S4$-eaEbq2JttHZJPjgN9C6ej3%>i;4a< zQa9Gy!@2uCYzZzOBHofk{KV~?Ef0rTb7_1?wAF$}=y}Tp(3!}F% zxFMV*8SWNkxlOnMQtMe?*aW{*Z+ zdGw!sUEF9HE>o|hamhB(yU%i_bI*8)IKxUaYr^cml-BWF2AzaA7#e8cZ|L8?0;~0} z8?4rsp`(Td?)BHpn;Q(RnYyDJ{(YRd-|2M5z|Yj_$qpm?mk@P#1oMZk$!mPQq>-rt zz(+bQ#itaEh%f2OWbPTRT+`0Jw7z=t{UG@B0Qj>8dUrqc?mqCy+t-ev4)U7j z`a{(taLR^vh?h8gOK@LEe;UlpJQ|pduG8DI?WLUfhWbO_N9jNI5IbGti4(`drG3P( zFtjf-?@^z|aKtgvfA;#;(laX#l{AJr6H5Zb8d+AKcrB|dk#k=pv7cxDeUbhtlScAX zl4mD*9_8Cy^1R2hoILZqJnCD#INEAePi!S7cWcO=?dmK8IbQz^j#$Jzv4|UDjfwHJ z52)`~+Y_Ygu%uTu^O%|5U;I5+&w`9HY+IAeq5jARcJIf1{Qz=<+A?@$;BMw!Yj>MJ zcam2Oy**v&+IZyq+@&~tX3wU&UT?}PYd?*gS3Dx;om=7Y0Ym>Y>oIUJd|&-M@|D}& z_(Vq*GI!TCe7XwR4WG;R^-a1A@zsU&t%P6I4cE`x&J(%3UiW_V%eP?)_lMo+#a-*; z4gtyie(d}Y$r-9MQ{Sz$c4VJyaBG?59AqC9z&-nEXFO@ok~TOu;0%ACXFJ*pXTnml z&zPvUrxWcKKW+X>#SmvuUD?I#Z!4)+@XM6()ep&MX3Sf;_d#i9jyxLRtqG+glmA`l zmfim;cyQP38LQFb4OiRWDF4N5#aS@6Dd{8gT$*m`&s_W0(l=-BS5-IT8MQ8zme|L7 zxtVpcob~bw&$XafPR&@hk>GdM1*%o}v z!%>54-hR{L*P-x{ho*n=`c-?8<;*yba$d!cHv#|ouzsb#IQA!lbGzMjW%h7GYh%zq zPgXK}Fth(khnwUf_0Q$;89IlN{>_5+-q5+v#{=mgrJL&WVglw~*mrm2%FB00F0WZq zfA--e_2<_vsZaitb5L)`TzI6*>1Isnec0yr!K}5!3QyKfaE>U&o}iZdxYft0$N{e- zZ`7qKPt8H^ylle5Ck_{RIA`dCq02vW*OVtOWX|=TYshp*z1X!MlIcu(H9lYI_N@xP z-yhPo%^1c+aqNgnCqqN%}bEmHBQOOy}FN9vN3je@dw5CmJh7H zXVO$dYvV!akz{Q4Q%1(Vh~6jul@UG84EBtoOI|&ramnln&AuR2Y;~nlRw;APg&&qX z2S$%%a3Ot-_xbgTSBH@Ulk_nt|A%?R=)H|c zucvedd|qz$I=YubT1}ly?|$T zs|C-);kR}z+B2;qetU98b)NT5WLE? zZPxBSyBMCVctx@WDcvhS!hiL@1lxG2ZyTRs&)AWexb%e5?eUgVmlbXc7kILk zXwG)@zZ zi`31#&HIkb?vD8vpGzhlMSdUTxt`~HJUNe>ILmV*&x<^_@Vv}(tyjkIYNJb5J*DV| zc6^dE9(H)g^17O`jok54RaaPMcun)iWBAJCoRChq`Qsj5T+LqZ>TZa!?CNf?tE=vG zyPex-pXN)x)&F!jrPFcYt#kx6z*qUuf1b2`-KW0gen~c|Tos#^LGnmV<`=+@J98M=>2cY^5dcHxV2c2!ySsk>Y| zd-l$|hVAU`*mFWj?&fy-#<8CwFFLcHx%QF&+=zV_SnmjDq1T+a+`UVupm0u`2cHoe zg38D@uUEEJpZ5vR>+FV;x+h%c=@VJAD7ctuZb~r4jkGI42F0viFJkId6C3&p6~GF&ht=$yv6r9VJnynWd)OoSI8UU z`6%D2r$@N&vn%vjo=@_uold=LobdJJ%_YzG$vd6rOMHuyr;X=3Ja_X|p0zU~f>$P8b77dK?=kc+{k}a19-^~yzs&|%J9gEH zFmfOFMY{eAs<)Q-ci{|KI8#Tedyxf^x~`P=>*+-N#H@Fetxt1ysyheK$7n z()(^`%btWT8~bJ##_+4`TV#8`sz@J(UGd|OrEQ> z#M-AK1C@W+y7bdO~Z!x7Q|`#yN@8+)V^smEBJDU07rf%LYbn zYCjh2Io%X?$2o{@W9b(MySHNZQVb!LDYb$vlA(?KoViC)o=hJ#rO6l0w4EP|y5kWp z8aP>nUY`vAH~VVyU+Yt_Z)X0`pS3n~zlA9)IcXiR(sy_7FBwgHe_uu;-Q^{QPO3j1 zZ?c?f`4fD}v#%TfEA6+uy1YGhA9bsYE3=_{@%-E@cR!IX(1 zolhgpf6-HoBOM0jJsp1A{Cw$qS$F)djO*DkMDK&X{3{wv`4^gru_ark)~E5gif6z$ zQ|F|5CGSYjYvdiJnLTy7KFr{Q`KElbN5r4854ik^^Z824v=1unYBpy2>*1!q1`{pl zM>nD$-Hm>9XPSQWR_0vtxD_Pcl*%xB73NR9{XK?U6?(z&Uq@2 z;VtQMoRJH}*WC7Gzh-^KrI+LWC08%Ud6an5G5$BXcXTVC>8pY9wbDFZJmO=NNvl;( z>rQ)r#l2SyFt;D9QR!YK>$`RP{#nxN>HpFXs!xTV&Wm8f>I%J^*E+a=ty8D8D|wL| zrG0LCtCwfGpJ#e2@#vFo+7&I%_>X2WssiQYT?rrq%+mcce>K&9ngjn%bJ{EpQkyvmMmv*Oms~7By$>>EnVl7>0^w{<<*bN;m7%(7<&1IDoxOzCvbx zP2Q{f3WYkw5B`~-=CL1LF7n7B?&5WQDnu`Mck#u{n}@qb4)@O9n{UD)_0Rk_HaOLt zcsb?_uy44sk2Uj?kTb9XTuGB{I$mDDIla-c#om2^9+e%guZg|ZF>n9G-A~EHBU#$} zqgUd&i07kOZeLxx6SjIf!8!S$mNa^2p+a`S#*6csXHG-5&>3vS3wGg*Je@9MOQuV# zPnV~I4*eLlx9x56@caKG?%l)Vs?NL7y=NqAkL0_2!v-W-fF+rPfJ3Y)ay-%)EZcws zCK$-Yvek2tY+3^5Vugz(4Pe=VBxBQDps8iMEgBIuZAlubNso<{7K4*Rja$-uNk3*J z2s09C0yee=o9g@h*1O)(wlMAa&U2pU{IQ?4_S$Q&z4p4i_xD{*l*3G!(>ePlr}7Bt zSnE6Bf;I|Fk#VhpEUVHj+*JhmRS3MnV#`z1JCE%4P>(od!*u7}g;$EdT?*si$Qc;3 zNb3N9_BP9JKzlLvyAthEK2~Vkt+MSBM-Z;?Jk|OMFnAm{5C)CI@LW0m z+h2}x3FpS2{qoO85b$lKW9H~2;92X}qNB8*X~zH1ekNq?XLRgzE$Y5A|A4w<&p~H~ zIpDrx`?_{%gTD}$@>HyvfqR zO`wDMycM(u@qpq(;Sa~>(OEUf8r`BW;h>)V4idv+8R2Zs2{!U|9d68|L>quvRNEULm(~l=nKX{AbdV zs=FdxN8bmQlZMa3#XK&v2PDrJ^FjxbepI<~dJk|Q<-EY3M$Std3OR3jD|FA>Mcz9R zX0k8cp#QjT{QOu5vh~d6v@Mzr%(X@NO7<$kmmg>0l$qI*e;x`AFfj9xpd!;Cs^n@ZCds{Y`5i3x~eF z31`MNFS%A^;n217y=*zo79(w1-d2+;Z?Ex&YDc+u{rIC5=cJGZ?0|1Z6L>*A6N_i0 z&@PqjoDc6b1YfC%#Gb5a3a%ODSabz<*JJ=+yJNFP6NuYt-kV_m!m_b~h>7K|Da$6p z7?$yzr*S_jkyUgYj)cL--PCc|371^t+-tt^U+`%qkgb(82;O}kJozc?C8fFeuF#Ql zjNU@!A(U(Ax?~-{FPM49r(c#f)W*Wny4X)DW8w2c=xM6lL+|x0x;jw>f7k9spGov= zUz#{rUTt{w?%)O6$g6b6E*K^M&9zPXM`<6k{w=-5eHyg17SFUxMFkh}9L$Y5yZv$f zmtWrGr}-4V@>_@#a*jMlVWb1t!Tx)Y<#q&`a=sJ__ZC{1j^<2XGdG=%b@{_;VLmBJ2%>4ynd+!CYHtDGF{ zRGGv_zHeo|qz6T(N4rpo84I5QGakxc8vFSe?B}Cm8`@QHf8xiD43M_OZ>*Ibc%UiB!c?NXwjg@j$1vOPgbZ%Q4S6 z{2CNo@$~}@DFAP4# zz4&E|&4R*DsVDwzQ48~B-OlOJ_jH`7hvND=M|MEFK=7Fx!DI57;=d0p{+kF-Xxo7H zdI7hM{$N}#EV4zl=TI({5;-kUgwXrHliDrzn53A!l5 zGM`;>dMm@v0T=Zx>1udK<+g__WB);R(E<(IvTO>_EF zOSp%H-r%{W)I~R={$9kD=R1ghh!|U-Z@*B`KlUK5gTXA|C(b@8=;w3t0(@r}bQI2w zH2!Mzm!_|@^h8|)^(`sj5wzfYmc!zd2R&XVVT+AI4hnyBmeif@ANy&8~ASVY6>zC<(oXn+?_AY zTW9KH@3^*(6UC$IsBOn6v6um4%+& z(vG+kN$O{uqv=IXc4Qsod}TPJ5ps_T%<~D*nUr<%U;TEWyw|m(yun0zvco4gW&Me; zNbP25Z^P#v{tvML5{w7K`wxL@{4`y+UBBIS{n9RueFP6pH4%6s(3vF{x$($JKF5~b#4yyx4_x3O>+B^FSOQ#ZJ*C)tI0n6|5bjQ zGkaI_=51$7pQ=OaIJXE0R6@=vtfHTuW6e(p|r z<&Rn}AAJ(Ahvn%-Yv5x(IWcy(tmAYn7&h&=kL<2Q|8`+~iJ$5aBZ1{yOKs38wi{g{ zb(w;%g$8kq%whJ7L*auLJNK|Yb-I4r)BRXC=PTc2X$tOfu=n`giZ+ppkRRWO z?`|^REzW&cbyRALzp5s(yAXT{?aN2d_sySl5>-qWBEAmFX}8zBFp#Ln_tY*Gu=5<- zEp3zh0(C+{R*?={{n6?Y2$7 zPJwf9FdY0>dp@F^*$G&k3J%m{%As?O{j_E%_K!82zUKB0FNJ?zm6KKauGz{k2#Zyg zZQ!!nYM|Wp=dYH3qD@f96`1w0wnl*4YHLLLS@FTD55ICe^piF@qu+;}+#q6B48dm3yi+Ezt_&ZDe>%BV;+_~k{Giw- zQ#Q(RAa3P5I_~>nFPpM^tO>Zl!`gEAe?Qm8mV4^d z`dYO0({A~`=->veY(V!2=^=iDb$$|?SDkEh#){aX&TCrxmtrP4H>u{rm7GeG|M2 z_kqG0?l0;PO7m)wy1m_b`JHp%gTnftUC*&EnRq{uhBx-K@Y7H|hrqz`|4GKUwuE0` z`{dCT|LDEKVBQbm`}B?Fo|fk#e^7fLrPmkQ=Q>Xnd9?&iD>>N(wg<<>%U6@;S>kW35e;1B5sa*2j|dxE~dda}Ls&gAiz# z!bl{X!TKDwI>-~;&oL+5R7YLo#iI(>*oKiE;9JV`vyA6k2SZNp*#1f3G}eyl)pSj& z58W2LH<2EnNTaa5e|yw>c7I@AC)c^sZe79PF|JFl=`~o7Tin{eo!o|VV?bMWe)!uX zJRgPc8ar{UCF7F~eU$05^ZVW8WqED~{rE~yx1vq#zrf$lD7+|Az4}GxrVW)s54KvJ z7HL`PwAh9V{+av0gB`^7fNQ?x6x8+xi+~&K|FfPq1+fq@*N$6abj9c|&ajg>8cOeU z2hbK^A?v&x-0@n*>3T2Z47>-Lc$jS%Swa-Pl-SoQOE>{JEO>gu$E7hhD!XI-Ccvdx zEmx0r`}BLsk?GlFQ6%n^PKpmU=EsMSZ#*Qvy6NRk7*}pz`R(y^u5)V?>;J$S=NQ*F z$G#Q&xdHpD1N&L`mXb`abazhLHaryoo<9n6kL-@$?(e*fS z%=oXI$7BIwagD*&0X#6vKxf3q=`ZjJ_WSs!kJzuJfunZ@#4cWKVmKFm+X=P_nb*+~ z;28ruNDE(5`0PgLqEz2Tdc=?C)Q=>`vtwLoOU||^FChK3JQBI587a$1N2sr~(LY*y zLqjuKowd@noEyWB0Z;jDdHgy*!Dj+H{IZjilto6z?e~B5`~!(ZZ2jop2XCu>e(P=3 zlh;MJb=DSDO)if1J=Ip!^ZdbWiNB8BZu;$~6WM3I=X~>iq7R3m@8Ek=roJ~zI-cSA zYOqHc--pj3mKx@Z@zijB3(}xj!=88O4iA2-fs2G6PVNv`z;Wic9Jl<>-07dZ*r_Np za^cF*&f-dUN>SpPC6#vQ69UoE{OK#^aKE}_#AY}YZcb+i1%FUls^?)n|r;VbDNu(`^5nKFIsOV z4hdBR6W+sliIRu&!LL`C^}xCC(@hg$3F!jL8HgYFE%s5~k$)rIrr+ap^2(NPeLCGJ zXZ$Gs;IsF)tjM0adxfC|tvwdbv>}~IeWU0@6!!5w?vwM)+sDm?!vEM@`U;AVvf==i z>2rOy$-@&}2_vz2K`TA4Z#W@n2fc*t-juuJ|;5^o$1qL5&41ji?Eqye&9R4bf3qAw$ zraX`-uafeK{uBOqm-O#b-@XQ{t&O-i4{4m4xD)xztFQ|?o(C9I7Ed)^X1?#2kx-7M zb6$(}rE-Q=yz5&1=jcc@oBdrB`@1C0^F>|IM1f-YPO0O-H&kS9V=KMvSk%j&C;&~6 zg5D2lpj7Iad70eE6e9Qp8MC}Fe~3MdFxZeyz-oWK34MjEs3AP@gST~oUJf}<$k@U z;yT)3Dhx7p3_K8?oa>6P59Jn4%rWE1di4LIKdbt5{M~*haRf4kZr}*>FO9&FuR@M{ zr`!WpWibXO-U6R1uksh*LwFAu8mHY6c{SeqeG_=EaEb7j_a~zTu)P6{z}d*WN9?1V zZ5;1C;C2^u0{qAf-Oc-A(9hsOO#S)^xPJ)nO4k(M@0j(qo4Z%;yLWYsGqdvX&YLqg zb=_N3_^q3d9_YHa^77Dv4gLA|$ah+Ir+u~z4Um&6y};*Uws3*hs8cz#&l$Nb8=6aQbsPv8Td`Rvdn zulTA=WzM#amgiy@orfk9x($A9q~owgw0-R_|2+-fkG@h%;VVU(I+kfY{f4QBcukq; zC8E~>u3#DE2e06t{PF{q^-L%`8O(>xW*%s)AnXstekUJ$ecYyI+*YA}%rkbv%Y)9l z$)M;*DtxxY=j&gsm1`<3-EP-0b+_Qtk5xLd-ydkld4;f5$(IkhH=^NgbgcFd+cEVy zx{@S(x>7?DCqUKORppFfU}f86>0CL?DV*HyKf`*EGw zg;=LNgG+6c_B1;2Z@nE!h^$y*8?()dyhwj(>!F&;?%KrSu1J`CMh0<`aL!ug$bi5z zzpozOIRZHe_ZsJ_>65jIoq;0w^;utx1M^@@Jvm3qbj1S4Qs9-?=e-N3wsh15;vHWL zX7}t48ve24o5AefXM)*|KMR_9%`A>4s{aqrj^Jra!JAfYL@ZW}^T}6h5#L>C@O0yf z?3p`PWY2<@j>KLyvWd;m>6^2JXN<>tXI~ACIAG3HnZ^8zpiu*pWz5m1kL-8$GaYb7 zUcO4~Hn#`G?!Z5HANStJl`G$O5bd&0T2I^j*fQ)Z_d4mTkqNaz)(v@(`7g?dBA*)P z*Kz-J-PE|L7nv$`Vso&@7WA}#R@$i8FwexyZHIhp=V0AvC>0oWcRIbGBbS9Iz#bQR zLw+X%|H9?_rrqN`BKL;JJ>Zu?iGQTumWS`bceyupAQI+yPW;~#_c_OT;Hq)`XBl9! zmA6o~QwZH#&(NH0mE~?<2IUEy?cE)lv+Y9gacp1KvD&ze$H(M(5o%-E75n!Z%3Tt% zFOR}6)U2;$@Wo}Rf)|%{6@+2yi!}JOSwBZ0TMA(hClObev{=CIXJbQx*raMVXLtz2 zcXeFo;y~K~1|0JcPn><4$Wy3K_W8=SzWN1C9HTNj7N;8{iIdPTC@kT7spvSZt}z}7 z*J;Z^eFy7IgeRnyz%kvk9UYXzg7ljKd^Dn%Led!C{GWx^VE!B}dFV!TkXk8YG9jS?&fL%4# zT8Z8N6X$22#REGj1OCdP_bT1wd!NCX1qLqSKZ>z7=HXvlz%i9Or#rE3h_~=uWu&wt zP#NjoLZ`n2IE&xy2tX%3Nqn*WzRv8gLwiWbU0wK0Zw$Ebn`Rp51rLTaXz-ke{o8bF zcP>Wu&i88jLhrhL#ZNimxtBWqrXB3Vb8MgNngcwz*_SQs4&M@CUNgXuEczcUR&-f%y^i*bE(Obf2RD1<3w6f$8_-Pkdp%6RzaWp2aw57 zN5cP59#`WRP%f5Yj4+Imi4g|-ch+Nh5`LV-Bb4DK2V~8@vblL%QFHUQqnj(Y6*gCH zt8};jE$hD=i1Zh_k^WZ#PCsl5`pNsV-0CiGqV7`d)lY)HQhht?;PmY*&y*sq&--*a z&VLy|45avqzRZvpulObMH$?g?{$@(w?UjPp$hWlN;(u#iWx(XgLfB`OuJoDwy5Uc) zTvgX6-`%+|5?&5p*$m?TLKhTn#u;Sn1O0ib;LGDpws32*j7!&!mfkLmRafv|Yq}uE z?+)H-WMe9q<9w`pG7?^YNu*!lkm}Kl9lNFfRJXxCkT+2stjYlhv)K>5PY!YKkMj|R z&x!_)@qOwChp}EFZBNuh;CDj*lSo?(S354T17@ABU=8~Hts1_|w!1KX8*v4!`~dXe zYe5UIx&x8FH9m1ICF_E-OK^rKd3wNl)Oi!@jqfwY#dxfW@pv@)jORp6eC|ItihVy{ zoQ(f3%MHD0$DC(+)3?0>tkcM-AV-)emrMpfD>mkl z3Ipd;kO7=3=h@=WTYw&1)m57)n{w!X1aNW8I2MFax*j|JlCcS8okwCjYHDL0HBIPG zcW~C|zM%N-CE?>}WY#AR8NU>^LEBNNylH?%As-I6csy@5Iu z=&#ZTR%FwFkqwJ*58Ji$0Pd~LkfEn96u3ovr*bUwE!-2&=(^=|xfh!N%#Wc36)*9f ziDfx>H=*vta@`|rgFZsg$zrc6ts?OSb8;&@6PcRWniC)DzEOQF*G?tYa77tn%a=ZR z^UkSV_k!LYX8XkVAK-j=@N4%Z3!Zs~wj``ixYLAvuev_9dC(YY+|!h~e|z|$<5{F1 z;9kZFa&{}D^vj+YLqTPl$#Tf#2ApFD4mi+(6~it-{*C2z_-?NMxKAArc*bW38l7Y9 zb}#tNw&@DeF{p>UzHr@2dPt=E>OeeMIJ}b`52)7uaNN zIVjsn8C#B!St}0CgW!249_(ldAK4emaAsi)*$=%BVGe)?!+P%kk8FgTUGHb%8wR%^ zcAl1{Q;*Gjd0^*EoWWRxHM>R2X@60Mf8c+xOyr+>p4GT+B?Ue?V0oaEYY&@Pk^w8{ zRy!2FKNb@>q5sP=*5`PsJ*3)Vs9sa|f{wY)i{d9~*EKLv@v!bmKI43IZX_@MVv-kI z6XrdPA!QD$@t=O%3*{#ib|^f^^~vf2bRDp*jh4pJf7S8OJ;FL_&&|C0PAR{ux>?8i z0Mka3|G>INW{18qpI%T4oZ*7@uS1M8q%ou((ua^vM!FU0bfoab^kyN2Z>Bd7>DQ57 zh;#?iQl#6FUV`*Nq!mc-MtV8YEl59wv=Qm2k$wSbHPZD+Ymlx(8bP`i=?bK4kk%uO zBE25za-^R_dJWQBkS;}f8`336zlaoi8m|HAVx)hFbP>`fq~%EOLRy0KD@Ye0y$|VJ zq}z}dBYha@G^DLai;zBsv;b)b(jd|&k>VUV?;A+ZAblF?X{6sqdIIU6BK;lGE~Fz! z{~YPtNV|~^A^jdw!~pjG8Y$uddp|(>3#5HWk0bpF(pQllLV6VGPm#Wa^a#=cq(4LY zAku$Ex*joH{srker2mE#vN7-1NFgWll1Nt~eG_REX&UKrr0*cT2I=pSE=770=@m#v zkuE}d7HK(B2fnonkmezsi_}9}jC3;6X-KCdEkHU8=^2d6Jfx?QUWoKgq@_qVAiYF< zR#i63^)(a~SdYDFa4ySquR>O4;6Vtmn>yR&);=gba8Ee>1)QV!#y#Pk>uR_0{KTDz zD_~;3gSSjCzYhO_G>UXN((-!|SI_BBFTXdu^LU-q-&5Cjb(`0dS%W%jaXsfjUyph_ zP;W2lty^K+T_Np4W}8`$dS75&#Nil1-8)ftjBQ?P+q|~#GiTvhe2x55 z5N+*2y)QV~?6IKzfoB_-@~{Wy&Urzue=*&^goer2rb9F^h;zeN;jDIqQPTl?=C=mVh^^e zA=s=ICQhy`GJGNB)2zeqXq!qOvz-4=e9e5o(%0>FzRWYwcIJI6=O<2g+>)Fv4WH>e zlMYmz$vNft@cCVk-8>1|&GnGod=Ijl%bm%uJn0s_QUUv}(9d6%vxQ;Tas%uESHJkP zR}%m5@+;qK`}v-FJm=YmUhgZf?7ArO8qPNCY({*B;lH-@Z@g zQrgsbIp^>Vuu*cXjZ!JbpX~aqLQ06jy zbVdvCbAS3(q*v4e*TCjsG17Gs3&q8L;5?VxZwaefoxe{BJ;E8kQ79nZ6FeJwE%I97>wGl1uO zUVOci@W(|EdD`WMujlg+#*?z6G;Gy)4_);+@}x4HNtnhta}MG$@;T*M^i8E*8}BA^lb+AXpU!H_R6F3qSZ_xA zb=?=-%SK*f^t+S+YXe5^?;z}-s0R&L+oBYFodoBJO_JaknHRs^p5hVqgZ0@@ zrV1-`yf{WCZ{eKZ{#nLP@E8ASHsBNMQr@JnLU^!wrVZ{p@_ekLK4i=by!7Kip(*gc zz=Hwc!65Kp9`Im3@Zcn~CjwP6UV~Wo?6;nK=-01z!FNY>aDB>qki@q~ z`l{ohz7DKw=GV#wh$F=o2y=*wrm((65K+o6j==qEo>0e7-;3IlsRlFyFvi^RKAGG0052 z6}$(oMM3C*k(PrlUvO)7xa8LCNIA=KvG0qKlCHht*6isew`M{bf zqsXtswRlP*y$0#`y~NqINY~+tik=HY7~j|kTf*+Pn<0RvoXXi!kxffWj z=bf4}qhsP{HvhpKUusz#nfHuS~qPG?M)d#-06P z*_$OOL#)i-LsI<0kYBQq#kDNc| z1Hh+j(*w?oIG&+L{5p@1d>8R2Ql8bovmg%+ByV{5I|JtRE)mC+HkFR+I^<%-X>}x}5?Sw9Lju0R2>W z==^aJwqOqZeprQo0rW-x-;K>Uh%x$eyB?HYk+G*ek?^;MZpqc5-o(oI@h|!xv|r^} zL>zC;vmNG@-}CDS2x~MRrts}HPM*4W5WmUP?SAqDm={Eu`T?H+@sSVV*-ZBdP za5fU$Rg*p#K@3>tkJKdBwJu8{W={Gj;PSdd%QDX+7SFTLVXT2a{hC9|YQe*0Vovt- zgQyQ%m-N^9A7bywe=sn?@=*Rb9>gPDuk4?$?;H%b_62;FjztnB_Pll4ohZFSdSB!H zkw(@!lzo`^9v;^5^z*Od5zL?eEIyr&-z;_$I&L~wBkIpX{fc3qm5AMsNiQl;#bMGTTz#NV19huYkde+-2fZm05hzI>|}E=Ei(yOnu^m zuv@-J?3Tyu`CcO1kug^s!tcu3k-e|;&w0~*rSy?s&XL9%7^m%F_l^EZTXU#Kd`r4)ws4KQNCyoBIc~Jv8lF+KhQUH>BL6CUr_4WjFP$sqxxUQ1HkQL!RD4&Jmh;ORl~5UTJ=lhVN?_Bc{x3J|jWrx^dTr7+zSDj8{fVEzzKUm=@IGA*nd%botc&Cvy(wp4bJR+U_RE-;6UwhL_a!ZN`}*P4@gVz-;qucu&AQ8@>X1 zDDdKJHwoXL3XDnmxcC5Nx7TJ*#cH$53taOZ?2%sD{cM~mHe32170pcs?jH%PHs?Bc zmk7)m=NV;A6n-QA+ZKM0ay9>6^ULneLhpJ4I@tH2k7Zr&B4?(TAGk^VQ0gK7?T*cc zf2P1F4`b?qZY+86pc!jp>uY_wJ3wQQF72@E;Q`1yoj3EQWw3AAc88UJvJUSnE{yE< z%3gnFwu^IT5Et3(o7~v#OADQ#x2twR+Jj&wyT^8F66?an`$s&zd+dA;kH1 zot9boPRkKrEC7{l5q3Rrab!1rsg^rS%zPd}TsIG~4@zw8gQA09+5HY;Dy%9&Y)SO- zKLERbYjN};#sY?&)uDDdr{PdLY$Fl#i{JO)`_S$4okARls&CFgJllYC^PeE)+V{YB zvhMTiZmI5Ryrp`$*y-=tiuC(V_6n8Mj|Iu=7f@ z_9|fO4ZVMuG_m*3dE2~8^5UUy~dCfn#n`>wm-Xr$cYfFbdJ@Y~z7p6FBMoxlYG&l@H=*&|qc zfH7g#$&|x~24{tq!dJShpr*GHa552`Z^m4CGC$w?!JR7rj~OdiV%8!B91jAH=K+rA z1CCDu94|2A1UZkv8MIM@-FI#*>A&6p**m`<0R*L#`ehu#CNHO#uCiG&sgKe8C-m|Iv$TKq-4M_!Bdc)t<(!xQe?C)_JO zXZ?M6rtjAye{LKCi5>h{?)`DOb*Woo;+6BiUSF7a_7~6(VJ~GBPI9jm|62sH?}XM- zc*TCE!HcLqMBx<6{dqrZ^5}F^~V{AnhBV7qQ)w)8n$249wV}Nl_ zG(1s<*dY16+xF+hTQ;vWXHPK>e*#A)Ar8E7HEuHm(42R``@?4J$&`AO*? zZAA^NDz_?O*+q`ufmN}jSX!SB$6buzYV8gVtC>p#lpnc&q`-jvxr zvte(%JoJcJyP@m9do$z={p8~qf6}xA8~;+mVE9*700y&+v{Dt|j6aU@PtiY)gVA}T zzR`Kx`oIwe&Vr_rSXLg!-^LEoGa39afIM{}=FrbmH{FbLO(Ng9dDYhE?q&bj51v;s zjDAR5W{K7Oww0l!?*u-0SNzs~6`0*gK6n&(C~a{K_?2v`+@bGO&ORy`dmJ$t9y4(n zk}<*E?RG8g{7)yb3-;3+3&-t!cL9F$EZe=9mkm~a^FHj>PQr%m6zti~z_yM3{5<%m z*?%FbI1rq@PBL^H;oTq|evkj8vR=`hBEtB5hoWGg5hv z=Mg-A0qF{)KSElM^uZ|3Nu3`~KZNuTk#0xYG~djv8*%>FsdjI4`tG?gU}JE5_+MkI zfc01LVaG0+GmJqT{Ydh^xQ9bdjS?70_Q)$!&0um?M+ z(+2{HQ;6N;aosHfe-FGzyXTmR=_qp3v6#T)QrJI~Pl!ErNO8lYS`(9seW|rFiivoF z&zcqk#{Ukme>q|Q3PUG#1ZrPfh5li_-}UVIC?U|l%R}%30q=snRmFE%mU$`I?>*wJ zOaCg^&$1E3plJFoX#Y!BCx*dakq=7*KVO|GcKZ`J*LyS0^%mdCHGN-f3-vUA31bKT ztNBIPdyxNv4le_{v*w@U9_M=hD7d~lv1EPq<{39^yQMZ{z6+Y+SjR%p(|{*AS>Xg( zDEs2H39ah1Sy~lk|ABpzgsd+GKjz;B3k*D|#lI?jklqvMcXmX3lTQSC9ry*Xoe1cq zBw{Z`Qt6Yb)w?1^>m+zl^J~HE=1;Lm_Uw)ZoVC0)YYPYaoYRAaErB z{)8|DHZIu=_y_mWInS;`ANVc!4^_i|s2cu5)$kvxW|^NRXhc1}`xNY}d!hgTqbWCZ z_PQan=8O+ZjB&QUSwml0GX^GpeV{ivt#z6DCBK|z2K?$o!gK9qw zT}nR*(xq0ml`e-oC|_h+`loI7uVxJ&tK!5>18lg5_!g(fuL z%E$Rf*2iO_e3;KmC)nwKT$$oUqua>QqOw0#UPAisbQC)DLG%wP+w$vdKe%%Z=n9_W zVd;ti(%1Q*D<*-iC;(mIfvyNydgKP&Uyt%Nc)l9%t%9scOoWJ81A?4pM42FPe*ZKUuIriksUsc{4a2=!9M*JQo!c)8%Sx#F@zL$9HVcq$etcS z{&%=w50O5Bly(rOk%GqLH$3RID4%A2p^mSOvBa_ufamWBE;Vzy&+5^;rb2gRdDX&4 zYGIsfQJ$Z6bJo15IPJ>%sUc6zA|+gvwP zq%!uQ;t0+whJ5fqr0)}LUe8mjj0xg{vpb^-ZY+|`ZoDxFI+cLN7iU^2>8ET_Br>{-W+TMOayG^ zf0BpgJL=29^}ET=ullo&Znz2S;&Xr-Yr)UUKH&Ud-gEnEq1{)0e3L}18J^|L@A&E9 z4#0ix1(y456Eh3o=Usy9xgzi|NEh(}KeHI=70gdcWR@UZ%6xtza}Cnv%;zOCQKTzz z%|*Y~uuSBFep^J9-SE3E`k=OQBLC36LfxtG6Vzp>zKG+bIw{H>^b8j2Q0P}@#?tI3 zd6)2r@_v>R294W~!=?rPN-P(-5a^I>#Eiv8$ly2^jdmX2w)QsUgIND$-l^dR;h z?VVpKEDZt%Xk1}AM}qUrZ#x)2vu=QA&A+p6ZprH$50=wTTT;gFy&Ujmd|4? z-Ga5W4r|HkWP;?03sGK#=aW%y3cfqlz#c!Wqi(unmC(cf_!8u8GQqZI*bl!imLK+# z2GE$`G9H(kesdqaX=N+N&%R0UyTrxsFGQ?mXPVcU%L9HhjvVg; zmmr=qY+EM&17h$VyB>7tlb}Pf4tEviIoVzBKYD!il!taBZsbwY>5P?L+U6YNyUE~8 z&_Odyo8+Va$-=|d!#JnR${7HI=Ey=M`7C|`@pMoswxpj%)uE#{4a%< zx}P>~qQ9`nP4ru8gP=5*-wt6A{as#>n>m4Qc@S}bn5TVgS!9vPJD?-nuSgvo zbA_{j2bepHGjV3g5aKEFeK&--F>a(q=VQ>y=el6i$Nk4TT`}156(iPrxqD3SX+y}d z<2`M5Le|a@{T=nJW=<=YoX`%zn7@{r}shy$@fYTvxDPR+tM^z4qH#cSk)0z z=gRx__+Qc)b@spIJA%I{-%0__B+(asw-T{nnggNE(pubOEr9O_jGYA-I~y=|4q)tD zz}R_aUqY6gr40e!qd%C&%jt>*kL`;E%zuG*GjUqj$3UeW>(~w1)Q%er&NBPe#-B0$ zu;Zh4hCHXttV?`DZ93jWfBp7&$=Gzv{an+J*8PZ|fNN8o=qza0=t1A8`^eZi0$-Z` zTp|5w-Cvss&5jryLMi^)0blAO)&}d8e7GEQi8WyThD_el_9pMQdu*2WOu3#nVQ}ay z)3+q^txMx6tUHdGxrZFepHDUB`R=bV`P9H1zz6uX+xbgIuf$$og1siZUpLP1qOBls zn;FxTu4(A32kn^$q|Nvp-D7&+9h`x8gU84x@Hws=tn=rI!yzlvT-`jOio z_FI(M=2l|_zw&(XX z*oU&Nh3Fe}lzfKRL)oO(`wJ)WGWK%F6?v)iB4L&6HOd@PcE0H=plc<407$CBTo&&CH9rwh+z;R42$|He9mHG1ZS$=h|H@qt;V3$em(ejdvyfALD&y4hFe372Z^7^$5rb$P7&-`$hmCN0Ri zej3K)u{NY!U?=PK4Fryn4l?EVztn+oJk0UXJ*xEZxUZ$q$7k>Usp+>qpLnn5a_HVt zzDw-u?0&TKL3)Pv+;1vQGO%6f2gv*HsmGXbj8w+Jv=n=g{Dy;br8Yum!~Zb%INvOn z?+T9RTUDm?QQKM8pJ+!r(Y}^-2*>T-d%EKC>{@&aqb z{#N{43TX?1vF5)4rW!vz=1V>WJCEn0iFtn>OeF7o5x!ZE)p(a`;2CgG+6#L*!ai?m0TiApFmME=H8$|K-aY@OClq_AKD-*}&U#fVbxwyggBtIW{2tl%CJ3@Hb#%Xl=xP=DbDh z`soV(TTQZ@Hov!zQf9+Ap{W>RZbKiKUIaYah%zfjRUZua-uK}g=f3pPNPp8Lr$34M ztV{liv2&8xTe?@?hm8C*=(bVF%d@cA{{XV{GmtlNzr8uvP5cJ>e&QYWiLrOQ@1TEW z*Ch-tD1RLK$H$j>GteIJZP}q2@c`khTk^U|@ecStGe&t9E=Mf?Yvks|SQnI=FXn$q z9Ij+R(8S>~J~lytBbV5B0}CxIE|dNcuM)52&grsyu@3cFe%L-&cshhN!T+FK<UShk|H_So* zZ?$quj8#sDc?5lJvN&-u@@w41qihE}UM{ZLFaPJ%#F4=u{923SW$v}ThuXhhQyRLi z*Fl`h(lGo(r?f6RGME=H4Xx;PLWqGE!u|gIcm!}O(NwYi+T@cTaXFeGvPb@e^=m(JxZwxrS zn-Sy3MVvnFEBN(hdFEmR=BNy16)gJ$mPri1Zot8&8+pG2bvg_k4P922_|SX@FmPPP zOkKLjrwuH#@Qd;e##m;3*f9f^%>*nf1}vKeST-B5Y>s($a_tvze+SBM$Mf4DA6gIj zkkFXvm5ASQOAzr(klu!L>$T9yLbv)L(l?RrK$@N(_THHvr`*(>pLceCxX_jOf-%I2 zRT_``g?pI&xdU;_&w$_lHDcDL80X*q*ZqgxaL4XdfO7?X9e)Nm_kgrBd;n*|K)#4I zZu;z(O?7~WB)vrXjBS76?np}w#vt*>PD`Zd!p`C+BYo*$P0s^Cuk-M!M~}PkNih32 z2Xh^Pxqyj$e-LNfmOZ)flVv!snfK0=V%WkJ9}U=ZtrWJG(trLA*b?x((1Bn-=_c0i zkFBfj-m|Vcy-w^QpT>V~g}jE(k~^?Q(cjXx)|xWJuuD#Zk2>PnRe-;xJr(Fn(>KTL zWw*E5ws`^eM>y!jKNt}G&Y+FCk>0*3+`KMgVu3UlM~s}C-|^i0a(cE3dj?7OP|3D^ zMb5E0+a}*nUUXjm|au#D7z}3;LMw{uSsIhsS>Rp2mr31dqaY5sMyrd+8hE?q(0dzO`$T zn>cu5An}9w(#Oq(k^Um+$-GOSe>SuVac<8C$2fQk8*)(%5HNRanJ5s#`wwc>671-E;SjT%2=ePrLj@eEcHfJI5nuU+R zuI`bSpB=L?M$>^gJ^a5@h}+0|p?$X`3Lz`w2-Jcl^S&*LnTm4}T^ zLdTkQoOxvzyVE~$u~RB%(|8wwMsQ0IvoC^q6CKb8;LXkg-kk&wa|$r%40J_&H+`Ts zo7r27IR6q8+KY(46y@&dOT4>W_Cx3bz(gB=nD3<;$LTxjUpbbb+rr5p;ObBi@})eS zF_<5J6ZF0|bt-USrU}?b$bEdgJK0pR=NY^gg zop_&)*2B-s9Zi27a0BstPA?D`R|UI_4Z#1yu+@M~R8=K-aK2v{;QA`fjA1b)X{yrmlZp-HkG???(gS-KO>aYyasYYz(zl+VO zX8D;D(Zqi|zao(txi&F!@VdnBK~u3D=i&AzfukE>dtu@}UM$~hePX-eLEpq0dJDV? z>r(z~_z1*;a9U$ECG|2!8pED-D5sKn6rGmZAAonQ^5%M-^B}**-0wLJ8)nvjaMMk& zl|Kr)=w~&X+J9ct)PAF(J*v-s?s)iY!|@BjKeOKZpm~3IcvAe-ue@yL4G;QL&%{4= zl91gSdU%q27dY%f_rl!S8|Iny1^Gj)HTF&P?ZV$Dv9^^qV5~*@AAAP&9{8(*aPpv= zeW0fxoEpG+qUBRjPh=m;;~V?vpE%Y&IZjTIS(#TE@e3#rdUq!2MsA^-CKH`iOIEa31A*TpJyjE8?gQ&~JQqHs0;{&**WrGdK;p>)T`X$B9d5 zKhL>ky)9L4;;wrGiKaTlN!|eapUVX2<@7wL&-PPDRp(c4{W>>TdQPHqoC?hScVqte}6`(kGTI1_ikv$C%$ zgG*x%@n6%H$MJwuLhn3$+-q(gWj)eInU|u7)ho76l!>{PCT8Az8>z}H7NUMK0DS~t z1?3m!TjkP6;#Lpmrt6+7onQmC-?lrkoc1+rXJYv#3;!mT(+=c(^*^qi!|3z*>T5gX z1NhI>+nWEuz5KVNlxoYn1A^O zcypI_(JK2oH&tF-<$9c_raCvwZ#99Z-EQeck?VC%hb70$WhjWnWnS8PFumlSlgu&JALW8}dLrKTYb$S<|YsK3_a()}yRT*N@8c zSbp~IzXvbpf~SLB>U!D|$QcdraRnbZ70;&O*>pUcfoC%fE*Ogy;MqJpy8zGTcsb16O^)w9-x8?QU2Y(6mm0+Aj^^>?CeiG^<5k~n#@Q+|S zUf%e(T+9dY1Ity{%em@-%UpW7ym)@_isYJ@RpS?bRbT96ZjJIEz;GkA|pKk`Q0hV?@mL0 zHwyV3ZDE>z|H$!u+m|L1NdG<>IL32G6NtINnD`#{DD7|9PG)^=cK8dm*^v$KD{RCC zJD&8NC@V+&$}PCR!a>|0JU;;2ovpZk5EuM?_%3NU8PTZ5(T>GJ>{ zFGHUPqAS1Do6i#F=ONv_n!j4Z0Bf ze3rmclV4=vD(xjKoUpP)zB>={rQ580$seOk{InIWTnIQScsUszSe9BjAa+;RAirGl z)Z27h+cnyYsI5>1=2!j0XxpcL)!d^o_~)??gi(qMBrh@}_Ln*%*5O#PE#{kiayZf~ z6_#c(@;qC|wLV}fqxdPx2^&=(LD<;vL_O){ryC}%mh_1=3H5`1o4R_enYXZJ^sH{q zsq46yOVML6mHtbb!5n8MoV^?PynHvX&VJwaW25CW^h}y|>w`QL6Pz>_6uFV=%>%Xa zKF@;Yf26+!Is)TY`C;vG@@T2R&S#R4&8Be$+N6y@MBXX0@kJeLH_;3o^Ohc*8TMCG z5}W^WYNF{;2Rcm35pZrysqJsMq-tLgxK8d<*xUTR=LnsnbaeyhW|p51hBd<`rV=(W zuop3~Oym4;jqx4Ql}veN4e3jz*#|LJyjR_w`sk(X*eRY@c{24`QeWl=Fx{*doKsVi z+#0J%!!I$tHE*;l_}!ZB;Kid{gN(h-Z%>plEB^ZLQm#uUZ-tQ;r(+F&>y>&q4;A*= z4~GoB!?wBBOg+b(;q$cB>CM!&rgCfgB&L6LL!ui#i4JrUE@bOn1=sYZ_mVH1JsOC; zRO3Lt?n2())fw*H7u;?52&Kch7D3zOU=3_X5=r=}rr@KBGm(2U?a|Q;;Aj#&ND4ei zradqUoSUVrjIw|7jcmh@BmB4{5966{=>XuSTnr99mx}K$cS0kTpW12cK#utQZu=dkJB#LpOz<-3&T!G5GRQ@Z}Nkht|FIjoo@1<##lDl^~rpP z&9@;{`X*K604{+)Drj9sU0NFSJ$=kW=o@4j@$N;RH9nN%_sb3L5nDge)iF=n*L>gV zYD^yRTxIsEpO9TQm3HQh8SmCgW16?cgu!9FpH61k74A4|FK~oij zrkZ8OLgTHCZny!@uZK*Y=h5cLdr{hK7NLAH-kXB=rs6&Ed-li6RvV_#4N=ss%f-0h zzQ+E3Iz50j1fLMq6SJK38lQa=>sZSf2jYA&AiVl>ecl{r?=${At$E#xq$Og2w}g*` zFXzx%10wfMB2|3v`S7JVM{z6834xzqdaIj*g^Y2=wjhHFm-O4cv2{g%cIc*X=51WR z3iO{mUEh*9gKN8+&5R*^$jy#M>#`Z>HZnUzM&F9KxQz41dFd`5m)-XV*HtgyD*SB7 z6*^6Ixed_KkoVv_oKyCr;R&&)7{WLb?~+uT8wOIMV-4xzqp73w3?(ED7{&w{ndEi+8$%bNYCOVD~`a zSY9poQpnk;4_AAicKZ$Tb;K{a-`HR3_1(zhHKhZGYpBOBu6D8|hb{?w$xGrTf1W3@ zH^8tt-^UXglVW&f_@~gP=$F-Ac+> z!6y`gcOnf`4;sjO>#N5V$Es})&kyAIWO0TxVJ6>gppM7Vf_DJs&CkI+$Z7!JA%lI7 zJhAhsbJtQT5=6w~zu3<1?I(8_pb;c=ee*wSAR{B~`J{>p8onF7bXN zeGsC3nWNCPLT{CMHrQg`xd!X`hqCS>v7gl(THOYJuDa|=#1u{+werYAV&|3tZC;6U z-1uJ7#DM;c$%8HeP8WQ@I3E>(uA4!J_k&L{W1B2*t4WoMAL%y(t*_0&_!+x|D8{1T zk=`!g+kL>diQpGUGur{fw*be*U~?G_n)U-%${JpextMF`;t>A(Mf=~8;43wyv8QV4 zgKI`B9t2KY0$mx~hz89#Q^srh97CMY9f%FOwtZP@UHh_RC-Uptmo*%gezsY<3IB5Q zPT<|mz{6XRUf!~K^e)KiM<6e`>+#6wD;o=#yAdo*^>oggQ9kb{3d0u zgwf0!KkOZ$-UmJl`KMXK`Qn3({x-p$Cs`2f9h|nJckt^Td|?aB`d0d}@ZAm7@I$HY z1l|mV3h3LiX0jV9e6q}2cLVNWU%h6vJEd?9?!V<074dsx0|Nj3F;PA)9<6stB*8sX z2phnvvxU#XKD)DQA7CEJxK@q4^CrPjl=pCbG7e7tFX4v?n@60i)?fcOH}q9p8R|<8 zTx8~*d@kQ@xBGUXy&uGQbOi&)Vj~al7QX%b=X>)X6ozZ6v>BhZVs6-e0DF?@U{qkc zKjsc)gQac>cqp+8B;0xvJkwi?B3WZ^40`Vjc;KPE!35g?F1UH@Sr@Ts-R#%_7j)(N zQS#hNfBW$9d06A~u%@%Yx$$D;w+3W*Q_i{lBm z$q!0h%Hx!t5ZYg1gLz&~nV|4~q|HNtnFlkA)Wy*;fVVI)0C3fcYk`w%W=USX#oI z-1@7T| zvHpFNa9)+gL#Hs`oO6~J;(XMiM_z$GxA57?^&L0A_Wb$gt2>{8z01rJ zw+J#@iOq-d)!>2e;k%XdfZHf5f$x;UY{YboC(4&4;9rgOvx#%oTnsuQ*oX4n_kDd( zUw)RK!r3$##N;V$8-T6BPixZfA9M1j^_I5%BkupH#>t-!n=IfHz;@O*_#5#jm`@L^ zW&F5znK%00q-VaBDX!htJk!~hSsMw%rzf0&oe*ujX#3Fse1VuzS@165X4t3kUBq4o zUTJ-eKGUH#;k`WQ<IHGuC$ zEtLkoSJakvZdUjXyhh%F-!kXGj06!!dSx~}hV(enGf01d^fc0eN5kni3i{J;JQ`;G z4$wvHEAw~dyEpA^cJ8_S%DwYD-J+`N5u55MlpRFbCs6i1cXE}NPhZ5zTUZ~mt}rh1 zUD)I0)?4ljQN-`y8KTJ(J8B}amvJ86D>ca-`Muq-+eV2;lLa@Lbq$*d@NV|(4Xoui zEKg$iGQd23%kW}Osri=Ljj)_+v)S4KXpCEy1MeGI5A%PDJ)*H+2;VWs=DXrwBD|3B zT>{_QFz)F|3!V+#w&2;qwhg0B+y8`L=D*hj+J0TLuRrI6X`ChMV03>`Pn-;jo{cuoq+R%5giBt& zz}#ZUZgp=89I*Vg(WA(>$TO<1Gh_!nzzJr}^F6hlQaX?AGq3hlq&XMb|00Z|EQ@s{ zFM0>c>D6Dc-s+%O2QcI#J}4}&$5>JR$-Kr5AKh>>VBbxEiJwEv8u9h~!S<^vJMiu9 zyRWR||L-3H{e`g-{2}_HIrxTGig^GpHwfE-7cqy2tXyj-D!A{bXoK$zTAvEo3G{?O zgO`Gi(74WTTKV9A^$g=;aB0xeyO}GTe!tBS=dRJxYim9gsf64nJiOEikG$Yi(pN`i zkbz63KhCFZztA3WWWf3fHGEQN2+||$x5gxN;Xh~o1NI+72MXeEg8z97_8-3i{(aky z%YF0%hAiE4m&Tn+$jYjm_+fiy?UAemJa4J7=czvA;>1L}44V zqSc9Cdk8kkmKJNZ>#f12imy(hZ$_VlwY|d5soIPsV{<`!OpOngd-2Oq&%`Z9J$?)G z{2^@voF~gZS%`D~xb7&k;jR>e|>wplm3pO8M#FNEzRah4TR%4a?} z69C)}z=n7V&U1w?!~yY7y6^Q!<<_Z@{`45W{dg_n<1+@k>Q1Gf99OoZF=M%Rc&|8A z$1_E*2G&J!8|V?hdc-n;J*C8#1AmCvS7FX&Dk^ZF zIt{`nzBdA$QulM)5y4e}s`&L1%kBI5i5~~=Fm2q9@w~v|gLJ?ddHJfnMiy;o zFT_w{+v(>5xtM&{gXg>fyyuPAMz-yBoqI2z(Lowz&6CTV;-8g0S=fR2l3Qk2o71_F zVJ{FFw!eR{H!oKDlRPYqdNkvPdw(i?$Hf4zNw+LPJpI*1GLrKNQaOP zA$=R^(O~v$bbC0xVY{KNAlu5(2(Yiu$u*2T`{zD+wv~6lh9vIQ&NlztMSdLXYCmG4 zwIV+l3z%3`sTgcexh@7EPmBq_rEtrP)ltayUado1jJoUyVAS`pFL{nq(`A9gX6W)O z0DGDSh4%B0iN6hh{#$`LM@Qd#WH;NU9TaW1&3A$~_NTYb>hHKJ(${pA)0cb@y2XbE z00$q3Oyluo=`%QIueiw28pgkcxEXCw_O-C>n=;3gwYOem{@2iY@V8(c$|%APIx77(blSfPB(gi4L=9+y`@!qLiSZjxTRvL+p{xyCl=4}jdCZx5Rz5EDq|jsO z^5S>`?S?XL;wmyGmG~00(e!4BY+qt{3vGz?mdz}dc_H3WowWMn zu}$cwa&g|xm;o-ZoH!!6f$?vhndx9r*!#EIZ0Ogu*($^}UJbj5)$q&ZnR8lKbpk@C zYTOIPixJ-P6y|~U4Xn?yg&0TXg&tKK7y27(Y;fk~-Ad3J39FYN9#DID=BcY;JItT7 z`d^%Lnkc>nXM{r*oD9ORA`$~^J5&STmt`eq^AjZ%PIk^0B~B>mTcy28=cZTIXDdAL zUT-gpGmc%U)4D7PxlHOgH+v1fb>?}ItCJrHV4d;Xo|Q#1UkSdP@>(f}Oc?N`5cJV% zE93G&mnyto^Wn6c?s@`ouOLhFE`8;h%Ce)+RQ)`%J7j%i*1&%Hde~8KKK8Rcorwo` zPjQp4ZFi@PjKGE(XQ@?ffgSB$_lEaIf}Qgrk1N{XhPF7fJIvnWSy1OY2Wo%p)=}bm z_Ad#$H#5IO0a>%~`3%m8j3yC#mOk37lm79FbIu4eu_W-^yl>-5FmL=G+PNo5Tgf^; zjkBo27^hj&ldqixKg)W5_51^g#K?n*=MQd6{B`VhgCkC^WsGgH4`~ODO?o+17^$TG zoVfp)?cTa?BhK`*V@=1ugSgXdN5@=sFf7}Ku~)gt`*&jww}R*Uk$krvK8)mZ>t`Wm zAm*3#v6szUsSmv=+a5Oh-Xvh}z5&Dv*e-PW(ymB?I?@Zi6nb`>U2`4W_rTS&G5|G=6s@(J3TH=+IRVDaek$pY(?7V*Qv3g?mC z9`?mf)LlMZ>eUu-{6&seXl(y`jO{=FOX(%VU@kFb@vbFhz}6?hVAXM z!wpYZ+lxWh*rjp&8@^VT-MG8X(8Ip~3{LMxeCB-TrmmpiRqC)B;G;$z7H!J-J;G+u zkI45NYx9jbpau>k4_JN|@{dZ`RZ-TYHYcZIH-_K1SL8<>Pt}d?gj}U$w)|uF)VZA} z0vB{P2IL%W9ls>(Jow#jfws@!`SL5Jek1%-l%_rPMkH|(zJy0CuEM_=8)2P~jn*IC zsm+VKH_6&dLf(;tEj;5>vi*;|V`ZPvq4$SC-!a}N>-pEEKTp0@*8%fNUymTZHP4w; zf5`@%BS~LA$kLa+b44V3SCx!wW;@Oa1B}N13XO2^T>5`0)&qUa311t6u&-RZ3bb%N zXyTQieGvm6{0rwaeVTOMO2m|e?r^Bc?*B=~?lXmW3H*mZjqotwYx@7?Mkn#cjWWi% z9$Duxe248NwyvulzPZlCQXHOH*T-kHcjNpNy5oKkWnJU{PgqYLo$rIrFfz%VS2_LU z_xXMq_TV7m8Sr`O?D|gn8|YjS|C{m)&R;%;v1J<-Q@l>v0AbAH>9w$VMLFL)x%S-n zbsD>FF6?(sO!|Ch$ej&81=$-cJ2UBvD7!FM=2$-_euH#7@lPdu85xt3Wquna;1~R( z@M50cbvmKZGyz$I)4JOmvN_ z;u80aefB`tVc+#b_JugcBAeZQS$?=-p}=ijtDN(5@>XW?er$F4;Ked$X~bzsHeP1p z3=JY)3)>%$i$i+E!m?6XL+K&#?SR24Teo43$PCcuQPRN^?FLLa=IQ@wd2%tv{)!a_ z?rQ8W+TEsLbF1S++hfNqdA+U934@o}-GP0|ewPHDcPTUDe|vdO7=F!Wk4t#w*Yd-i2*h{di8GI(o*!F3_mp=urIkNe|>Jm3# z*89td6I$tB(0Thq&3(&*bB!#yVvlnyf&MN3y1?QspLJTOe`&tV32)x-7#NW#{!(>M z`IokJMgP5~;c#os^U*K&ZMoR#&()jbwD6nQ583C-1(zNQIQ@wKTZw-%-~PCD)C2gV zdx34_VGq(?ier*2h7A_vuSxj%B~P@PbqgK^dVcuuAdW5ly7>;vN(4zfyr=o=MN1#6zALb-ve3U7( zPhSOWpzeP?*7VrLGG?U_`Df@D4Q<7CehXaD`N(gN9CQmuhJ#bg_uJ@e3cU&2Nz*3R z`YzuB8^6uqdk~?pGcsdV=R)WeStnOM8|AZ6o_WZW4}$+6fFMkCGH=p4L9t0sb=FI=mkpJmZi$umNo2oxhA=&ZCTTLSu^Q75obL5 zg>ZTV@UC%MnE$b}4!#r6iR?nk`(&^@PMbr1`yAf&HYvLVaEi}pXUudbZ0C3Gg74wi z#P@KMr5zgp<5dQj-gAqgRZ7btN3pOu1e&}8ba)|PDZh&tNI6}a%G=Hi)n-q>U7H;p zsWtOhXWQ1Zn=iz==DX;}IWR0``#-T<<)7Ynn~r<6p&qZS5WWIMX6{z!&o_RI*l%WB zP9B8+;sE>?UlO}{6=%Jl#B5HQ*f<<-`9Uw9YE7xItkLZY=`+~yweea{j+qz^bHPRk$JmhAvE76bN@EEeyRnlP#TRBY zwh_o}&R~)>&|i^IQfsg|Ikn?NO8eD-+6ITVsmzIcPV;^B9?5C8gp<_frm=B!o@c#l zjRuTPdwTi)*uS;*+H0@9_PV_5y}#|`p{?t6`$sXJqc2&C1{nn|?~gd`?2`w-Xt|a- zs?7%UZC&-t`x;78YCf^|hPL88@(Suw;-5SRoX_CKKX~n9S@1u%XGi95@9Ukf#)^BM zdOcnR?0(B+4_B_T<`{gVdjsVY!pj|luWuDg2EM)_7aSP7Hl9`R3U)o)FhAxz&GmB6 z$~)(=$3Y`q1T($(j7$zZZH|HY4*yMby=9GeXuauT-2c+G71igat#x!7!Q=D0pmzyg z1KZ2tOjGky5zXi3N7Y(V`Yxc;Sl**#zyimtcMlv-9+SB;=jAZufy9mJ(~$MwfX&+0 zN8dPp06Iydff;HIb8JcX@wxGNqkN-aud)w>CAxg?kq*d&7mFUAsc&TKl#3W$C=WbW z=v=D)TGf+!Y(`%h_)Pog2CLn#MeLqyOR@$h9G!^f{Xk6p`@~?Wf-MQ?uqHvH@I33( zGzz|b(cZ1rw&w0jKB}^Ri)(* zarhLW&u;n;9|S)I=VmgN1Yc!vWpa9QRVU75_L+V&y@24Hj$W6A^iB=i0eczeB?#P! z?~G%;T4|w6Jjj@gZ00E75689qYCC&s8~C0N$MWS@JK53A@XZ6h+vpCYU&I=Kte@?e zxiEX_sQ$h;7*O$2*;XBC_Q9FqR`TlNv%-82dKDPw`D#8}`TS{%HXo`@;(X+_@m;GD z{X`mE)p&Ar!p^&ZQT}=12bIB}Mw6x&F6~FP*3&cliQnu_2Zq=dQ^RX%#Xbz;`@oOj zZ{Je=Ii_J`@w+}^(UM?Yuo zH>rPM98ML3b3Nu1xQID#{bx!P+@~!K+dhVIB0nb7);g}nYEuzklX)%o@Tu2l^3)qB z*5}sc#dPo)@It!5w}sz=!!J1%>R%@&oO~btf$|t1GBSQ|qTI=or#k_EYZIlQgD~C` z82gELaQ!SWFadx6tjD&}DIr zew?rhbF(+`WIQYB8lB##>`_=Z0e!$`tq-^!@`{_Uj;x>##TVeuna{o22=vTFrhMso z;PWKri#Up^3qO3hE?HZLuiU=pZ?BB(IRV^Yn=QEAi9i3{Jv^6xiEADFT<{&jF&p^0 z(GL(B)0&HOsGT@#q6WPDnhwMVK&%1yv2KH{sY_ea4{F@unMfAAl046LU-zRvl6<8t z+5J}b$dR||wC_mzueK0})q)ReE1gp7$WBELJFpL^0k1v;A2sYxIpR~EKzzy%AYSDg zh*v59MO_1dAFlP^5x>FRR#z$hAL=?IS;PCVrp2@0MjyBzEa2pfH`fT8H22+oYF;ep zTXK!M(6{uLYFNCqQt@Z~dnz+F__Rsr=laj!EJfb`g{#Wghj&gy@)w?oOmK^P9@@<9C$h-?_U?mF)tq0l59ZkLP@SUqjp06>N(-LJjY}b{xFnJ-kPJNXRQ^ z0#?rgY`y|8`hAdB&Q`P=_jVcDKLk5C+MAU1AlB?eIQwkc8G06WaUZLmuY6{(9_bbG z-6S7SK6s!v1leX{f3kwu8{lWL%;=zs%wE>srFr^aD+4@QU2VNt4?GHd z(k^!u_-ldS3Fsq_skSdULyu}4WXs1Q`IZMF18Pn$t)p>d$Y*4}mO6#`GJA#ZC5{OV zKLI`03Fx~{ti=@ga4ba@&u>1nAc{wH)LJ!_Iy3_~Zcha0= zA~TjVEfGsoDgV*84=M{6Cmme$=C7d?&H@qYgM7X2;S zx2dth80JQtOm7Ruu~x>BG%xLLSfBd!Mn8`0&AewV1TOLkIYU}>TM4Wgwh1`Bk>d`% zSv4kDV~4&3T}_TPc`a;L=~x9sKeq?(CATb5V@kb7wjq8L0LY43Edr`^ThZptnLL5hW{NUGAGn|DrP1_@7sBHe?a2 z2mmMb>ArnNMs=w_ zgwfi+x|e+kMXgLV-i`3z01pY1VJn&EdSe_Vj*}|ig!0#J%pwkZejG5{tHPNN93MKv z<8>#etG(NYc5Hjm3G&3)wxRQwzpy%zzZ*E_`E+F9KwznJ=4(R+~jcQN-9 z`{BFj0C0g`SNU}2_o)*=`k!l5{nJkJaHk#i=Hvgtll9ZF@aP?o$2SKkEBT@idehWP zJZY(V#FJH-8Bfh;45I&>ck-F|T=eop#!Wp9`s-x5(O)&Gzf|N-eCFd_cgFEW?o4;R zYq{m>JEiCw<)%2Fd?Pny8E`aJ20TvHgARj=g@to~d^MJ>#Cb*iXX3+L11uZE+1CYG zso}}YOCXjTY|R6Rjl9_sKOXLk_=>8lvF0x2DFpNyLTdW&6_u&=rSFGp&3PU?6tSxy z|KdAy4~39d=P&kAC-x)z#C!5Fm4)ZC{ zq0$Ep^E5tX;HgO!tkJsT%vZfTdVICk88Z8jed$C0T`bA%nXt@au3X&X;_1GdNa*dLR31L9jJX2uG8l{zvqF0kc+Y{BGB z%DLqGq9-o;GzQkxn0Cm!!?)!ffv0uApXzZo8hN%?E9-)7F<-4=F!SoYDbku5lXTuO z{SM_e{+vJ9XTv`z+v9!foX&mo+HV+tI3DU^8RcEvcVhu76RkFIiaPBA6AtRWhc59A z#CQLr%f_xq&Kbp(oo6k7$qA`*YsWn3c41=$DsA#1&&QH`YwA2z&~ zzPW0jPNi@AZ!M?%oBNdCV4nZPbS~h}r%LATpQqt6%iJ~5u&GyfRV3TsM)I4%=R5^@ zCEywOlCXVj5&c+Gk8)3wcV7p8NuTGcJu4Cp&P2R$E#G0;?V!z!oL%b3H;+3N%7-}4 zCk@MG{}kJJ5f<@V2IuPpp0;ZaY{KVQ16k;x;VHZMl_q<}A3ET8v*dX!Uet`6DoNIrI6u9&FOGpPdC^%^FTh@OAdicrI z%PUi%oQLio1VTYXEx{@;5Vd?50)sr!6dc-pjG z^-d3>J;4Q_>zFwVedE7{56joIUW%d-NfZ7yXv0t-T-Ay+iL^Ta8N9&g)`QbCZNK9A z;3(eAD0Evx(_F=a39Xa1i_asYd!fdmWlO==TpiX?UF-GZEVn@an!Ud_HtBoU!~#<9 zLZ8I==gq$pgAEyU6jH~at1-CpbbMNd{7{R$VJ+kGx2+lI`}1jt#|@t*uOPi4mhXGO z9`H}Z2l`%}ruOMx(0aztuMeF8;JOM1`hm$jSO&{QPw5w)3$2Zw$;m zvEoMTyxRjV$GnkIt9QYhIS;t!&zdp*_VSoIQ~l>l!sBD$ zU+!6>`spr->@oZw*qR6R69{<({>~ZhfW2+JmVE#A#)hh2= z*lE9YWaXK`noRO7IgkB`0~=RsJ@H@&dcd~mCOo2XF@6g^UchsirC>xcZ`IQ=fLLd& zV$Jy0IrjM2Qrdi5`6l#rtD|fS^Y96%{snlzs$A(&g^wrPBef&83KQ{9I1^IXZ5OOL5p@N1s|)$|E~PAUuWhN?d$m^UbD`|d*A^_Qo;j{ zq*5zg$Uzz_Wscs4ua~>x;_Ic@7aVLMGcNd@{9pfWv}ttUDI3u80Poou`P_GBfqstN5C5TBhfl#aY6tkR z_0x9UweIQ}i^p=0&p9!;YfgjGl`Y@Kc0P@{GdiOSfp0V}je_SH?3#E+d^-Ej&Vs*0 zD}Op5a_10u!dAL-WgU3J?gpH$47@udCR)yq_u|OYW@x30%IBoFHgE&9CL09w{ngTWtohn4Rb)h=*;&8=8pFSMAuY& z*c)B|X)mD{>)K<=4{Y6|NFTKFE2}>V-*BXjZV6-G53n8bv~qg=sJ#A{POLxW!xwRu z>BIL34o7sGQnOi{jmr9S-^3EoN?zg5#!Vy7TBvN(GRv=Dg~W-g9%`~m-@9r`sAJ6Fa+ zH2YDRWt(q4{vPe7hZU>qW``c@Q zZ>|>l<^taU@@>|sL*LwK0%w>8L~IMTK<>d;F8xo43yiNj-gzo zt*|#Miu@fQj)0zb(ii0S$iI*;Dc`C`8>9MsRCw)EQH2{YPkVFLSLKnY!ijmd5HE%v z%pw;!Ofim(Gg7T#gA?=JQQ&K1C)VUo{bWu4jgxEgzeMcaUm@=9uU}h}|K}0WM-rO} z858L31NWQ;8P;^juu37ra@F|MS&`>SbGYqQn@TFH3VzBIJ_da;;$nm$-Y+D7f%#LC zr%j6YYsv2@wchO9QL@SCn?bJu-*fT3Aih_I@0F|XSva3;oK5@(=*pr_3F=Hko$06} zwjPLO1DRVTWN!2DY(AbXz_W$w{W9C>YHDlSz6`MtnqY?!v7ygv?|7c=nX{6*o*kO^ zWn>p4;OUt-S|Kenr9H#BJJ#YG;BRO?Q=-?-^eSFF?X`t&i|j1PZoU?0NDFx0TJGX} zSMxcR0j`6F@}TR<)Y&EFy_yfwc@5}2=#p03d-oX{(pe(##`Kpu_QP5p2fc5M$$R5? zm+1eofoHa&%^EurwyK3EV|cliRavI`pk+@-v|sbyj?b((_`qjY^f-}l_gkA+sQw0) z;a^HICgkr5ZDqkekeV&aGkmvMx8Y4-9QVWSSjDiExvSN63jc(8p+73VmunFjg?YyLiNTK!pT#eIZ?GaW zto!64ZXfH!bf25GZ2@J*JVWRMt;#MtW%Rtg(%aNHIZLH&BX=?1^#bq9DE(lxnMD7J z*D~)N{eKtvrKu9XG~B0&E%2*BJ&0pEt(h+OHACc1z z0C`d@kfBYCp|Ah!p6j!)JBE!B>}#-3`M=hUfSJHKsu9b5SnJ9Zbo$(mSDM~;@U7jU zzj%xNPYjDJr$_hwpdPEJzDIkCUT(&^H{Wc)+Sm-c4EyW!$tmyqY3#efYcjc$RgmGx zeC71~bq8$KFWBZ|&y->xyV%b`z=|>jD@^=`gd_XJ*yk74H1<;P6QFSkd)H0sAQtm!GD- zVKeYd)^R*(kK@F9vt~GdhEHe8x@+yB8a*~i;Fw-Kxv~@A^5Zu3Wah3*b?qx_0A7h$ z9u88LeGhXykcNGEVBvPH_cyn&XF^iP*&-><&!L8tlc~DO%9e$+ZNk$|_+^YivfE zXH|9$zxC+JFU^{ZcBQ>2-Unak6$5|xk1Qje_Aiw=*lWdOOdRW=wl(rbW~zTn>Gf;I z-0NMKiRn5HaKN*;XIb+WS*y+}Y4c(|4#>*DZ{xRK$9{U;`hb$r(q970LeS%>h7J$E znG3*<17&tn>aWq`V)Sqnjd65##)}c3S*hTnt>KX$a5E)XCxVNMuljDh&;3dILZw(Q zOg)Sb)1)rad7na`)z|=*R6}l;?65NC zJn0?`4Ds1fj0;n*7Jhou(=itF4yE-TF+L@1-45vszjsEv2j72;*UI;5EZK*4v;1p7 z_ml1L`4)X|Qb*svP)hn%W)6koMp=IsCyfJPd*}J zS*_n|gp3^feRks@`MWZ2X8sb##5ZEC{*OWP4pM)_f=v(Rc0`Z6>AT*alQJuT$%TCc z-lQ3qf;=mYGYb2SV`_AXjr@qXC*)~ZN5siw@0+-w?;r_qu;~Fn6 zd;6X#$}mQk*5i0xu8ijDe@qL2_ zxHy+Xz&H6UguY;ZzQX)w_%1uOylY>RU9Mupvuy01Tj3WH7kLQxBPBojL8R9Uj$Lf? zy9lzf#!}&7&xZ|<@yq6cmjpNp{}RCyK78lkMP=jqa$o7QDvwM_0jD$*SD^6#P{p4?dg+e3*5&!=}N5&Lm?m(tkB$`+4wT zP5oj%e;fSj&Dxi22)qc|2D1FqkYgC$T6f^5E4{mutDxibrVl>x=|9DIj!X+v-SWc{~Iv?_}sgJ`~~xr9tM@8I$ITzPaoj%{7&p4@o#4^(IeeS-|1fap ziXT+mx#D}ZcW(c)_?_GPTkhQc{l9NlYpK|$w-2A*jEw+Z$6>@YRsHG&oWVQ_e`781 zC;XrPG~jTDJ$~i|j4gEXq2r|b;$IIvcj$H3+mAj!whTT#md2Dn*%)Mq>*x+~lH}EhwfCk(G`2pn0t)CaY zcG&0jLx$0xjUz=&uWb4=@KOAaN^Zjb5dMywj1&PE@DZz zLAT3693>0;j%Q;)?*l&f%V*+Tnwjqe&vqUB+4>bT^P}@;s_|;jGOL`nqv3ULR;@6)DgHlw^<)xnnnR-8|U~^K{g&)ps{?Y@BFpf>Dksn2V9sF^w z*8VuZ@L8+<-YqyUY6AV+AphNlSfX38ml%tReOU-u)16w@6ag%cYFJL+fW((sCpg=J zOw&@j8^kk1C6jq?XUXBRl<2FU0v_J?-4)q+mBB8)R}8z3J66F*=uv0kiM{g{c0o62 z$gP~$^)l|qfP0;<6+Z1&C)m~HEa{5iTM2x(9y(5cn8rMTZe+VgzR5i8bSXb+g?@=! zxwtC@8H)}1NzyahR#4S!wMQ#JQhKUI65wWRtMyYEBy)mhiP zpLL7R4w02yt=^OT2PX46wty;+tWxEG&Cs`&xRTVdHavOiLl=1L80Q?uo8Ky4cgF*h z{>eh{b!YX3W|hOw-8LPUXxqE-lOJf?wu0|1$NHXbbl9pAdg9xn^TAQ!drZLn|sGGJfp z7CAG0$~5$zhrT^{U~=YB{$R$EKA$L;VPAN@nDdRY2on#1dEG0Qz&!f=J$YCq; z_{vV$kh+h^y1<^vv_cNUw&}C!I-CXFJ8#HRcJN|)$vEh_g6;b#Xj>(3NL$&T;dvSO z5#^w9xz6MtCuJ0kD4VFAmYvu(J=-}i*yTh1)yfpINU1ybkgH`CBCi!(gt|*}lQJH} z(~T@g@*-oPyus+y1sTgl$FUf#{oxlbr}skM<&F=Qh7-ez76kuNr(1N2I77xirt!7J zJ_cbAPCW+Z$=4yjiurP^InoHsEBS?@u^iGzdm%#|;Mr{C6MX)Se~e_4wEe{Mha5W# zxnCj1+i|Q-$gkdFTck(odChcAxTMFyC$C9uR(q1L&BdMzg6GY;^d~`EX4DJwz8<(W z?G=oE&obEOt#7LvcdKPA;olIlj@giP%mJ^k0zAXH;9piM-0aso;`v{tw=#v>i>{;l7lRS^wx;xOVC#o zZ5s>n4)7ZJZjI*g8sDNuUSeb=UJK!3#UZCz=tZvze)MbqQsI(U<2%Ma#L&7Opyk=_ z<(@I_0-pu5R<^v^3S)lNf1Ux~h`b{{yNDKmJu~?c!{CwdUyj3<&@SxJ-H7YhMA^{H zPo5xd#`libz@P9ZC;bT*`wxypz(=X&o)-T$anOh!XzF3?f6}}`;PLgg%$1>!*`^QM za(|B1512R57oXox8v-MXTz;$YT8htycffalI4-fXqniI@QtGL9qVM%H=XPNqL+7gE zkkJoJIJ4AT&Bu9vhd%F50B(N(>+r9iw8ob`0UJp8u7duPf=?D_`)Zy6r>+#IQHX+Tb zaXIpv>3i!SF4p@fXzICo&p0b&P56O%4ZEPbK$zrS4L?`ajB#DLjbpg0W)c^tzay5V z%GPAhjeu6c#Wv~hvKhW>_^fy?is@x9ApQl4#~Zw}0pJsJ48PgnGzLE?e*gdUEDPAe zbB;QCwAaCY+SqnX(}>{Hnm!SZc9K5Qx&#;QKc;w1iDB7mJ>@bUj8)~uA#VvdYRs+! z{p%?oT*5=@*!qx?xo}_c{}r6qKG9FZ_c35HXi)JVvPJ7PCZ43Nj(s>W4>S*KYDtHg zxPOU`QZXk#un;GU{Oe7KL9z+_3s0o zlXeu$G<@#j{nQOwo3TDP&pFLcPc+Eh_MJ(+SQqWMkO8as%orcj7rti!m*<%Miz#5W zT3e3zbO4?_!1oz5CxrQR05kbKfHSx_9RW<>{ji?PGQbAtUS?K9$8{b2H`O&`Z$O66 zwnnf0O#4{;wnr*e-UrzA-79)jj|LPwGMA3T5gP7TgS^8C%Z?XHEN zpo2-oZu#uEvU9^a+5&$<>|gQTGk$1T{H1@WIoFNOIs?3wZp zS(zC)2cLrKe&opQ!&+euqFqnz?r^y9;#- z-;ZjUI%E4pTEII!1vqsewJI`lWMybX=;0S@tRebTxXi<8_+e)(s-8iCt1BZ;<`KsNY^^**|9Ti(kvBWm95rwHzDM6vcZ%h8 zGcnJ0)vFy^hL+QEzt&CQ3uxGGu1%uq_XI&$-$q3g&tN$e-|k zEqWgP!QUyww-~;j{~~mah4m`*n!x|BK=0A$$D6gy|1ZufnSK=T9c_fr_u^;&QF#k| zPX1F*uQS9L0JQbG_+Dg0-^7@=Vm#Q#+dbHX;4*JvK92Y(s-M%s*7Dd4N7OJ_{8!Z$xUebc=&-@m*IytEFD9NCWs9uadJSm74$2UoSlRk9@S(}u zg)XCd*O7Ml_;7xW|4 zgNyC=03Rb>WMr7m<1#Pg$wt$EyYdj?uOEUPRU{7H7Vs6mLtjEcz*OdmpQU!gHVU*d z`$N3};xl|kzAeiv#2iU%1+N-@X{oC=y1qp5$62SfhWgG9)`gKlT?{8#r*C>?S0(Ux z=8wd%r@#v~_R*ozPaUSeh0qJ+z5T&T|FtOMF)dWMMI;LOrj7j$yox@{+=a5Ahc(V^ zbpx){mS;M&J%7TH`6NAve(wb@_5nj9{sQ}z|ME6qS$D6DT>@jrGNV(XY1X;a9U6`k zX30PCp7ofLUl7wUg7>K{vojrztZf6EiFdGm1Nb>jIeSmkzUPmsKOLG?-T&cPEaNyN ziedyBnv{68@mXBc16maOiu5V#*I^8dzw~PT|3)9nsg}6|{gNG<_WQ4F{Z{s^ru<*L z)%1-27Id=}4b5@2F`mPl)~IzitYcV^o@4v}vjb}#myvgV5_`(v|9$DZ#%=V)=#)SQ z20A)H(70uwamzvD&QN_MpWF|m6n}*II=x=0Gmyi1X3jA3$o)Va_Tv0w`TMGYCV66 z4%xeumsJninHc>0@?H4i1@CxvzyC~Rpl-Rk7Yt1;+~$ru`&_5|+vj=^n5 zF?XHUAjUTM8=at;_`MwT`Kxv8*5AVVIE*#ZQ?zDS#(G}hW!NXY3_A(_C;+oDK&2)-Iv*Xt$k(9Rs}6`0W7@fX1H5remM)nV|-0r&41&jyyLed}WU zB7i;J;H75)f0W-T>+fFSKlqR%LLd8ZZfD0T8~k4{Jt?#DcHW$oZ;Ag|qf^B+2Y)>V zKShi^Rj-d@=?G3`a7;CxnE&dC_|shpp3P*;qPdf?RPaw`zaG>3$?NzL;w=8v%A8{# z9>%|o;2%f2#3v+{j-vIQNwM@CLr);r1ZOKQ}zkU~XK7TYV?B5SN zpXZTofSu1)dq6#V0nZ*o*@Jkt2k9m}+ak|s#}U+a94=tO_c!+K&pOt|>u&4YPd>Yg zb;vf}=`GJB;1}c^;+!1$7;HG6g%38^XRG!pzxfj_vti!IW+;#O|D-$wxpycnu?HNj zlV<6$NR~wg#Kul>IL?C!*Qz8d=W+I5XeIp5V9cYO#hc;0$8k(9q1gk3^nke^q}# zm(X5qY$TLv%-H?@9cu>sJ6tsuxp)Q6k9h_9BUcs4pV%`5$^ zI)l7-^cjR$XXXs*gY5Nth?_?KaL=GMG#s!p0nPh5H{Z>lU+m`3E{9$G^@t65gPVV6 zwT%DwuqTet=h52as^cBearigOA8^Ef9r=vpmq0$G&YufETbng@|AdqNX6zBbYW};i z(_c4u%lK%#WIQ|gsebt18}O^F{JFT$y4Pck8~ukQbOln-6X1V+9p#4Jycc`&m-@{2 z0@U9EOiYLL`h{;Zd@DE~a-8|r7wc08_LWs4Uuk`@33)X}`Ya4GjtO)Sv+>*eN2|~e z=*6F{kbYon4pG-LmzI68_t>Nj+m6`#!Vtve&)vT!dww~5L&YPYp#^U=@!UVB>AcbM zIONj88zn3Q@Z>n{VnVz~i2|7?&Fazjgon16}TtMeQ-oHC23~p&XWGX6 zJh79igq_stz!HUP^qtzCT?}7uZsmfm1&|w_M>`kr9@|-hSOW7WwkurF#O!1FUaVDv zZ&;x19oTrekm1%Xu=3TN)?wgO3P;XEt{09kQ*$+ykElz_eZ1q^A}>^V=veZb=1jJ5 z4zYcAC^BC6ca}QC&f=XHLCdqA1)78D5xswon0u^2md_Y|eB&3s*0J%v8L(N$+A3a8 zAzde;-?7k!4cQRiYsIt9Mb>}^zZpr`KzZ<+k<@fUMDx%+^utO@e^uVobPDD%m;NiY z&m}f1d?Jh>R_j7*pzg!#`Wyem?&mk?lazYb%p071%FAT#M=K`%7to)E!Pl5Spk-<~y%)-^va`EVfBm!zStq|`0miaFm+FR6 z&SB1KRqrzQ>b*Q8Gots}i0&tKZq5JmJ0p7B zXlphR08WK7L5(A9Fl_xD4|(E|{HE6eehToXLcVrE#?TPvzu*h^dA3nZ116>`Ux;%P z`pjh-2VKfv_ph-a|ci>{*x_7pNj~zU$bkOdA zT_o^8A9`1+E}u;R?+c_?b?^KtWS@vBRi0M+yUvYf<-dgQk~paF*tzaikkf&mLs?1$ zvK&M2niOO5ikbub$1whn-|@kJp$w1t4n3y_bxN6;J%$|` z|F6;S9>ZDVVH`OJYCeFcFpcT=yY;;~7l9wyx?K5Q`uo%>?`ODP!!?pxH4%S*nBV3z zzz8)KJ$xT$DP=uuS9~%pfli3mT{nzU{LX zcF_;vzUiMlp~f$2Ww<_y_Yr+9v2S-2;Yqn#CsWM(n!J~><=*8xCbiUfNSq|*vEGy} z9qaJEIE8%q`Fhyl)x!?27It`CvkvO0u{3(~*zZ-^wvsv$M&H1h7HJ24(Qfu)tzI*R zzpdKnou6rrm0=vUzv@7wJvFj$Tm}crr3v$dPVq{?SJ!$Hgl|TthIx*?v<;huS}XH9WJ&U` zs5eME2GQ#$+|O;|yGBpjjLE+)1$goP96GoT*pXf-uV2E>3=i&`4faQXt(%2q;%Nh;6KIScl*81Wxlk0OT%aR zAHhS-{wk~u;Lya2*stO;wv()p`K;0X62I%F9r3}=_l!*d(yCsM+Lc`&2d|Is@)_5G^hwS`tQq)disZ)tGr%9~TKDd*-Go1^!)J!h zQT2W=GQMaw<@MklR#{B9%08ZbxrV}xq3Wcbh*r{r_;U&PLW zF_4U{g^X*@`-xi!9N?H-jeVC*K&KM(@+|nw&v_zK<2R1K-WL=MYXf#kk zxq|xse}-L!%#qktuzmL7-}@czH>2yvybIsCodL$P5ncCWuZ+FgmxE>D{Ey1Q6NpWC zew&>izhCs!DWjYV9UJyX*}o&+o5{1!EX#FCJItFhTd!%BHNsDfnH$xH6$ux&Av$TI z@2K*SukpFTxh_pRK`%2#8huw-HtbyR4eGn`9p>xNU+fJfS17gvefyr6T5ATz(C*0C z6TN-UpJK1r*fS1z-2q+iM%=GKc^vV*geEKYBMJXd3Rcoj)c9rxb)mPtp+volxL4qx zm*L%Vl+QrX-Gygv?}iN92x32I#X?)Y*x zjI-kVXot^v&%9}`vBbKK{Q9aFr+tynyCLhMpTxd0nU}LanNk1FgVw->O~T8Z3EPob zR%GBMd)7AA??gR!8e-6tS?YWGe#qPdPsl)Cm+#yn>!1PWA$hN~!B+1h7G2(1&{Z2) zqVSt}Uqx9E=IADCvwa7JI zr+r8Tq1#&zSykQ4M%Dg0$U%yA{urMN^A5k`Yt;KAEu@O-KZ-m!|wrq|`%&1l!Pv(b6HqF; z4{lC)#TcVK{2p~FM`5dA@V^t#-8?n%>$i+9vW>3?g7V9_gVfcc*Y^bAXek2;gJP?9Ph<0wc-$C z+Nl0OU(NzeOgxA8%i2OKxV})P#vki4ybI4pPs)6|uH0wg3sALRuAf6T!u#W<{@sqc zH?fB<=yS?n79SWr5Y3P6kE-XV;G^)_4^ChH++*)kGG*9KhbK{2%>Jc=eUCURSq%bbN12=_D(70sX;&)zCX?)c*sX5B%Ce|62RNdL8)r z&#`y^3An%N|4#uw2S1XrdjvO2rgyLO8Go{8G885 zvOdPor@aD@k(d-L=A62&Sjqt6Zdc@u3w|`m&eLAdzEK<3Dc@gt^`Q=U$i`3qC)0$^G~x z_ZK}6fL|Pl9By_5HducUy2W~Y#ucuXAG**Tb*qEmLkLfJpw}7d10M4tXe#!X@*s}A z;V0h**u4SQYxWh}_`0I2u%-hZj~BWf)qC{KZ$ zZ5;G8pL-8#SlJs0^S*mToN`Mv9s)=)JrbJo|l`U*C#epJp9^2X{@G8eRANJ8G7as+Q-ym0FZ@cA@O zXF*r9c^-XF%UHF7Cq+2hs`aQKlZB7NH2eXHeQMh!=O%fv#q?z>V2BSG`_e3dOLA}J zH(yb7519R$etx#133h_G7K?o%`I$k?uhHk`J$x``lhY#t$KtrhWv65<(oSVDuCtJ@ zaBN_ob)q4Jm}T&X$@^ykU;4n~$Q}|n=cRuFdtfV5jo2o9?t`~J?}0-|)+mhu1H@$m0R(UPBHf#G*&R+m=F$3~_A8T6qLI*C$ z_Q}V=IsWExNAy8vVy+J395@Sqj(pyy#?Q&ry}MfVmwvR{9veGOpD}#Sb=-`#Xx5vO zzk&`od>Wqjv6(KAJnj+ z=BdyJZw8!v3ien0zMDr(aOa=*7`%;k`m4#;umvwtzLF7hlx3{1?m;ga`@>)td^&wC z5^mIcoqQ*EM$>rJbyB~P{Q(}d;~E)X-us9P3to*{pS-8u=LBd6wolrq?*E1VDSdV* zS}6osevwaJ@_lnvf_L!w$H4D2`i7mLi@t*O^pO64(n4apmJ)gr_not%1=s@Li-*bp z8$W6Z-dzVg+}O~Z*{~Kg%1xkOZUl`aezlFxm66Yyd+nEFZ=yr-km0|`Dd?k+r(ch= znX%d%iek0%f5FoMEp#!>#rW#un@jNRX`qj$t8wwy#`3$~kGVq3cGx!1?qAjqcu};C zVOu%G41j&j?1o1U?Z??Pd-J34GK%s=_$S8xWPSni#=g|wzac+*0M}Y8|90;N6|aqT zfcpT(9aDZ>-Bf%W{tMMy86D`Wfmawi8P+$nH1m11>7z}+Dd=b*-6Zd3p?A{``J0DgE)B1@7~(By&S&Ry0+GDFKescZv3uw0^c-#C1(I$ zD*Wi^hcc&XBbjZf6>2;c90kpD0eI**@Nn92vrVt`Q}v@*N8Afzn<9C}*Jk-UYuC1) zUca{e?1r`N`M;0m&-_eqXTKJD5r8lLgGe_`A3wK4aIgy_8|u$h#KMR%7arTxxc$zk z@K&zF92tEE;6{^n#msA4Me1NScRVRDdp*jHtuph6wLT2(UbH{d;xhztk?h2^@-O~i zY=CjP!3TgJ3S2vde)ux%_?qF9n*TLAVj<=-`VN>`mqL14Y$E)TSV6bd$oE)32wswb z4=!zcw0*%i_L|{&=Lc^KuhxDYDzX2JT;O%kSmZmCUZvkQqqpZ`kDGm2iM$yfv-Xrd zNA2`UACPhQn^>DtF#4rCZpijwpP4c6pV4O@>{8qt9tX`7%|nN#%fMjZ;h6=WDcisB z&hq_k0P95CtDOSP`fRP>9FQdzbiZ41zJP91`?MW?5Wn^Ldc05n`?tXaJK3Dr{Z$=*szT^d_XZ*pE zOdtwAKX7r=zF)DXANzQ~UmF?lmpjk{6c~tov2hVD_Tg!)Rp2}dws>*qjzfQ(cSHI2;(?*x*6q{I zVj?hAZI#Sms6{2#3=tWSS%GQVOo=ASWx z$Xj5{pi*1W+;_G>7fY9WMde#xjf79-9^d%agS$2^v&+jFi;wNsL5H(Z+qZ$f8-P!b ze*cANf9E{tCg}e6Innwz&0m9e;Rp>d!hZLJJX)Uau>0lZ5`|R zp_tXa{U)pZ%X_TwSH59|k83(*3v^jta_l!*f2I}O?X-R2LLBG)Hk|kO>GQrJ8_6%j zS#&SvZ3gCTvpqxgtpRh-nAUuEbOL<)3HY>r7XI>|wjk4xzOnpS@cI1j+S$sPWnDk0 zk-ZQEt!Y8GMEZ}jyh310UCPSz={EiNBrH;S<12yX#{UBI+Rwsj;8Z^NJ9UKA3&Zyq89tr}W>fwBUEue+cJ7V2=7nGybgO zpNtusoC$~?Z#8vJ>-ki&Z|DxJlhW==qf#0r}-<1RmV);CrS?2&F zR2}+6jEXOCWlNEA)cWyXyEDA&8IZf*7sU!ARk<$>Ug~~04Je~T*^3f zS7+*~1(#AXZ%cd$jNJhK4t&>*!AB^0A7j^w9vII(%I{R0=!12nLE2 zu4c`*Qn8~o&x$;$GP^;oH}ac!W|Ob9<2SbA2e2J44*ig|LTi)-UtZMM6I6DLjnj7T z3qE?}6;Nv7Z=4q$Iyng^V!{F?8=KG)volP%U!F&*Qfupbs zyfnXKPenNKkKms__{6H#W56*^Ni55=p#9F@0on%R1R6H{k|Tb;y-n6Y=bp&8AD=ef zIVai=9l-&%*$JMxp@VYx*WtAM@A)`%lyR{RbZ?d2Ze8`ocDs zaeKt5g>U1k?Sy^xK`YaQi}m}y`=zWqt-LD;e5$X-87jL`%0W*n*%a#>`foex8xF6o zhk@l#eKq*QpncW1%B}qBlE|CPHwNI}2X<6tkeQX2M8cq*)%lyNg^o@_@QtAI-B7Rg z8uRtl|6^a)sV_Tp&HvbU2($;=F)*KaPY3X<5x`TH-`Dnq6&rB<%AVEq`)$9q;xPKF z`cMo1Sk*$uns-%s0JeTS@8AdD#o34bquMFvah>_et@(FO-kN7zcJk>q2P6hG{TEQL ziS3*PPxeJ;seEhm1^p3g6i=P%rF)4)5cZ&Gt@|6K$&k6K2ia1}XcU#h(hzI5k}e}B*cUu~MQQDmP( zJ@CQSb97}0xKju;VrV3#Xb=zID(G)Ae`KEeui|lg8|Tek0ijjBoofzz55ng9LD*bh zOV}W^TcjI)fx030c`|S~l03H38}3x?7xSFxx1D?!_J?`ua4=6kX5nnY-lTtoU&A*Q zc`0uON>v@&V0q<7#Rh9JY!S2#)_ARzF?`hdfEDK*Sp(f2KZY*gH&-57`mt<1;8Ygl z!f$!KrO^MDI$kaG%zK0CfAgjB{8{LApI>|vbk}jkWo`JM2kgS0=et(m$f{A;35HVe z)%H!u_)@!UK)syVONt-}2AI>&Kpsgx}Z{+y2J=R{OaF(#}`@xHMdQJ@60U zE>a|Dc05vf!sce|tOVxNqTNxs~bw4>GOR9{oNgp^NU$ zU#xV|&uSfvF|6k%9miMUQqejY6O`8%`+-WmPnG*9ckNJ7USa^N@~H3}RQ{;=JUD)^ zBoitHzZv@PA?Tc0(}Yfm0QPv04>aW><6|S%c=;8w4$qV}=HD)F%;&FY%=;C%{$AEw z)gyM6F@x3kTzecgRmWE)p0o~o*CRD?39C?EtIL;8mV?$R__FlSf9r_!S>=m;P+5YD zs&XCcgRwIFhouiH)^9w$(#IO|Vc(GiFGuwU`rY1xy8OYS@_?POuaG(V4rmB-b{6A} z)MGMnKK;Sl!&P_6nL81m2EBv#fp0e(JhVCBp;f3o+ll?xr`I`Q@XxibKK9N)8RS2^ z9cv(HTLZgvoio6584ry8^tpcZ{`CO=b7@&`OBO~4DzA(VlwZ9ud+OO4*-?KcVU0G z!kjClIeK>5L#jW6iNgQh0381`d^Py+)j%E%;sdB}wE`yad}4j(8841`_s$jj4V}^# z`1H8p9e2tHIy|ql-Sw=abfpn%J%_mGw52m~&$<6hADACq9vNVL=$^jf_Q8L?MO}OA%}rWX zZ`Q)egI1Qb?{Ua8SicXn#*3gevY<7Jbs6S2I(fefF-mSmx&!e^Zgpf#GHd#kO~H^g z(0X)Df8B>?_Ol)GpMawrA}`*=UsL^$(`H!czESY7g%-9hqJ@>bqqJjHGJtC$wJQ0J z@Syx6pLC+%EOPyI;12~?I$y`3Vdj3$$}VuNytnBuS6N9p_gVfhU^?Gr-thPO@O`8Eq4I^j10530 zze>Xn=izyh2O2jKX&53c764s@m=^%=T{}B8OtdTV;%Z%<300~5gEBT^E>o;)vYk&VpRCu5H;0>WDUKK8D)6 zdfgIEMRBQjkyh(`JLuwthHnX;3TUh_>rf}h_&{aepYwI4Zvp-ybf*N?g+hoc0{sm0 zPxN!bcP}lEX`bzS%BQG*4Eku7Yv&l&&E?8tQRrwU{I8)R=HbwoZ*2$JB{)-= zewu>IJoQcfaiAZ+gt+DJP=qgv<8&!Q^Ir+fkLk+LCGPQcovV8MO zIoFt|Upc8DadY z7&$+DP`_!)j2|?9zvQXv`vUOq>pXS!efCq=-1j?6zJ1G0OL}hk&XPaAy*FSbaESHbTgo11^)AiH&AB>bSSrd_^Ev#F#nq7zg`>@ zjry@BCT2PC<$J5w|M)38xO-dmj2~~aXZ-ly*}N~?y=}JKmp^XNpXU(2$u(j0f-l_v zULA18_Zr_^3R=nqEfrMj;vDo2hP55cM{k9mIWFqG2e2oL({At{jqM_RcJf(qN}jSQ zYmSNEzqGaiLb>AE@_9t>AuA_z5qxW8S#G}91Kn+pv=!U0iUQwJb6T)>Wcgp94fT9b z>}aA1>9f~jXN-S8=2ab}#?H!irJnOQ^1c<2I?gk4-xnZ{Oni3n45trH=Q??o2q)fe zU)gtyY7=$HYcYAI$t}`$3VcuA)0aa8vS`kWZ9T5)TENqY*YWv_kiU5qxiH2 z6tR&rI0@gc)pG%QJ7XPHdMR@~=;^BO7o})hm3`^SsNx0kdE!3oiw9&3FSR{Ld_R_N z{$Y%JW^Upb@_!}yy}-efxK#V#i5vSF+JUpI8?>geh3g)1hFCUyEn%71u-HL-KaIYk z{LF@1vJ>z>#{U=@l>bd0vxcaD&gTx+M$D3O%bu38tEb6-f$w2#GLM!`{twXKzK3$wojb2%V*>F3nD@(}TUIO2&D^oPIPa?Z@_npD1vit&=%+?}Jtd!9Ti9bI zdd_PC3%X2Po$CObDH~$D$tTwo>gHOcKd{SJdxN$8jQEV5bfLgBG@^+ zocmO4*G90n9pE~AF9zD3@Xq)d^{3+-QE9U{@1@H#wl2@L2%K-myKEz++X9dK`P?>{ zH~IlJcD|@n7&GrjfbAy)F3~qA<*lm!6W`rve8`YLt;&!Zxaq;KX|DEzQjYkexs$SX zoahs(4_+Gav*4dc-h;fO*BN5oy$)-{u6otI6>B3W@aQP`g=P)f*jL6r*}9N8Y1Vp< zFc(;e*MVqdkr3yX190Rk>d8`n(S5^=(IFoh6Sgm4DSZ z0&!G+hbeg-lX+=V%60qT>*S!j!#ZC2TGb9?m-VD&{=HtkzFGipTVzZP&Jr0c8On`_ zUt`8!b@VvyIOT*BBht4WzeXOmAJV>@!QE)v*bwtOW=?YPXxM{nnsp=C6SS>W@9Ef` zCWfaMsFnZ4KIHQxzDro^L60p5y+f8A3`qa4!WjHq!)WG>KM*fH3o@%R`QM^BN|fQ; zpCxS+pRxa%Jic3)Yw~PESf|~k?P^UZ{|57AoU5UG!ak0`PwDF|;xEXZx0(cjIsLG;kEsbbMxfw42ns;Zx|B{M+y# zWQgW$yi)dh1arjy8`OJI>EuAihGS`C-JA1hs(fN2=I?fyKMQTx#@`w9zbotMpY)!9 zzZ}Q`#YZaSHt3h^73$YmPl$i90Oqts<5`T0n7l&P=fSw_{~pNF_@A!>kNf#Odh7v{ zbAynPbL^QP(KsjaJ!yGQl@H3^p`Oe-=vy?nsaN>#&h^qJ;i`$Dhqel9t2o~bm}2bF zorQ?u8)m@nHGP~f~_aZIu7dpL>mVGO_i<99yuoEsoghb zk8F`VePpIEFMKamc2k!3%p2dBg*4#2=X;Jm*AssP+TdVJjY&?AY2wc(=>^)vS&&7r zU2jCgBH&|3CBDVnX5xBr`S;fsug(6v3h|UxUHBPFOL?M3QqDK@6u9U1au1pL&b3It zQGVI=lNgrgg_Jx9d;|707+=}LW^9?J4$Ak6%X$F&`3}p>8OD4%AaJe?G!b~xY7d)u zzVyw?cewTjwLfPU_^4VBm|vA|;`r$N2aEDsit-yin^N|4LQGgTV35B!6n$Dhz=Ve0dQfr1ZkKhjSL+xU)tUIRNW z#;9Z&&pW2z?E^;0I|=Xzngja0!1^;ZhFR-Zn=>~JT4JZHU30D%r;5hcuw)`VUH=#K z*7f^|Ey9a1epn3+*xef#vUR_hXaB18y-DeZ)$Gq8Xeo|wcU;yBb-DNsuEKiG4F=R0 z(C4X%(U908xJqLBMj7K_xhJ2a1o}~IL%~Q_!LGgT&FgM+Km4)V%)aq@NndK*Oy%`? z%>1CVwMFx3njOKB5*^bs&BHRb%<~&24Pg$<`NA_GrvI7wgK0;NgQ9(~=kea&#Fojp zHm!3e*PQrB72Hko`h3*UTeHc^nRN)ou0(J+2#x#kv@&$zeA`?_;C==xHp)x zZCr(QTAcS<VZrdIjerJfUs? z>(+HfvIgc9=kZL|$)*kY+#MU#Ix#WBnRd*2Ozq8K=-06wL#s$UJmIU9Xn0~$FO9zJ zl)hZ*8r zN9tc08utH>d;)P$IbQshw^Zg?eOJ?k@5!UC1zIt;X^q-@%=7(#UK7RRk^C>xo<$w8 zkY2+o-=WrX;+WpE@NLL8Jfy>#&M@S=g zjtRVhy&3pxvaXpg;QYwvaQ3Nh_bNStIVMm1!sMwRRLGC$JYr?3vKCzrX>M>bPak)D zewE(qM={pY2EM854W|XxIUDqt#G&&}eQb^e@+LKBb~1)aaaz`g1uysq(JiM~43=^s2^920;r9%HE;g z9_uUpy|`WzwI!JzJ>MSkIg@XZx$LP$jItI-y?0SQ2H*6!*q(WRI6&OWRkWb3|J9@* zM%5ZgY1p44O@;b=KT$JvI$SHyE|sBj@27~nq~*EF>oJ9`prUb1n$v9*r-mjk5k6Xcg%WZO8lkr ztjmY>|EBf2GU+wAFV)|TBmZrUUv~%Y81G5nu|kbOJb<%N=&myxj`nfwc)h@1o)P?| zd&C}U*070rzT@D#0S*7&lh=Jy<$CN?UY{8%ui*ys2AAtV|I8TI=r+20W!@8@&H4W^ zmLu)vJ^FDF{V_1GJ1%vZ_6$ltna}lVm=*v{l$JBx8`Q8EX^+|K%xfNjqsQ!Dn|g7y z-J;uOUejdM9brF7zZUiZ^7NO)a_Vm;q0`AcY4{-gxzxSeImS7l|2FzET zNAUkSyk~GdpET7p;pux_q?H8+qz*FMWomrRN?!P?-h-Iqhh&aXuK=G3V&ot85j#)y8-r1@rk$Tb4}Ak24<)feKhxVvmrawcGni^5A=y?4z?A{d$ru>vi{6j zpnRAazA$tlRlTBgiyl|=UwB^Ve{tReY&SG|ak;J6S8;0A9?KlPug!C(N#?OR766Vd zIKP)(f`1UYs2Xe6#4=_6n5J7*IdC=hpZQDE8odvSpLOVevoHr+^gGPg=omT7+ePJU z6TWm0aZQ-~MJd*h83W3;a&f^a%)T*ctr-*DCliNj_+&gk@`A`*-$~ERc(_#ii1U#P z{1=_q`$^yD%0TnNe=qADg+Djb7VZo4MBlxt9i+$1d?H`K(~6!OSq|SJFIl~3_#T&} z)Lk(2JnfInIuxB+Irj;(Bh1o*SJR zJ}>04hYU}zu%FDnVyfVW?6ae~uR%MKt%IEepScG9A>XX=qZs;3Sjm)qGk$nEPuMT7 z$ePh}X6BBm`qq2PYjryYp4RAlrY%KzY1i-|{^gWsUhzBht4n)0RR;SLBVY4s^%x_~ zjp%VLDpU3U4flqJRos45)7r&lmur7Sf3I7g{eVT()ezn?@@A~+!1FR|?Vuj3qx!#d zPh(BNeuV9-yoUXuOZ2tnoG~=se|~DtY=bXeE;TwGmwTrEN7E~2&zscH;Fn8{uGQt9 zsX5T&^M86?fbT_hxlTifPifvWXDm~*XH6MsXzWLcQ+;V(`oQOUjiT;E+`t~uvHJJ= z|NYN?pE|Bqx9lO}H|id^4d>C|Ho8pt3ARF-f2Qe*i=JWK%DvP%vmpwd%fUX5(|<&s z>;B){&S>r6y{4TD_YW$Zo^4JH%DkC8>zK83xzxyj_>A^7vc?5gf;KDY4o(CD&^>iA z4ngRimMK{XMZbTaE#!Pj2Eh2I2M;nBOaof+RV@eEzk+Zre3 zdcc3}E!G*%LiREWKec7R$LoI!acubwe7iB#rR+=;j*R!mU&u_DR_}7JM|^IFN-8#?jYeawevaue4xC zX(MK-oqj^u(oXzu_TD|ds`AeFUu*9`_RfWCLbz!XQZ)gqtssyQPj(V70kjl|#cF2= zaOT$lR)?w;ikd*$ArNaD#M%ixhafX!Rw(u&R?^D=GM$NHb&zT8)R|!ioax>PNReAM zf;sQcv(^ebF?i|BIltd;UgwYX+G{`Sxj*0Mdwag$??a4i-PNP=?N1MCTpzrtdrh!( zhi$uYQfn7O@4-v@uJ=VedXEOLZ0tavs(0~GejF@fr%fkz+H_*4O(%BRbbSxf_a$E6 z#WRJlTfx7x0sl?Y?&Qx#oToTTR$hP3lIOMM-pDG}dTz_T)~Z8kuK&PF-v5G!@f~QQ zeU*LTi94t7+;->6pY6MI<*p-lu2fpIE-g`r?NI-IM3I#`>hesvpBCJ?^11RmS3bYw z&XsKkR~lGOw=x=T<54+cAGHx9db!@?8)tVf9l;%M=qz;Kx6(RETSi(dY0JDcbd!nP z(y0bN94)uox^A`GI%nH$@j33AH`o1U#@4!jGHWo3_+R6Q{WX%)E!?w?{j+KBEb;(&W`)Wn!&rQIq^%1*!8h#mh8-6k+hE$u-E*UL z1HO;t^!qutd>lMb=#4Q}hh8S%g`=Lk1BsLK1Bspm0rYz#42;wVto>nlfAdxH{n7Hcd$3Xeow`_jBBImhx+8=-Uor=MS-%-B8s;|A?68qjeg)4sb zPD|o~NgJr_Kxxjl6~w}HY12U8llRs@-wy|GD~_$kR~5f!-^V(+%=Mg&>|{^Iz*!6N zZBc)dzYkQWVtOe(9Xilb;QEl{S-=zVP~guKtiM@P#rr!0Pp3M=v;*BVdnm@419vW( zw$=lC6S2*ffA`Fry_lnQr}k!A2Hv3mFT1{5 zZCNQ1H?|w^XOEQPo9f0DdJ8`E2>r3K5h<|-nZ88J)6kiI%D{#D9&q1p;7q>6#kI+> z(Y$W8=|^+$pL+LbXOLJqscv5G#oM0-Y$?uXnw{35{={qCSl;m(-9KROS6Vc67&`P| z7S_z)F*%5pizxSwtd3D(CNBa#k>E+#c46pqf4-n`cvp@dA|7$ zoDu^nV%Ec71Ibi9oWH3~H~zhgpOV|Eei7V!gG^4Ou@J;m3mMoP2v* z*Ydkob#;wf)p;`0taI}c^z8+K14oVo8vk-z;DGx0+=7Rkr|~0lb-S}{jSs*mu)x5Pkl7Msz*Ko9jvJtH|2Bx*u_WhqVGJ9-gzwe z?XI9pLr&v&DIKWtp6lYCh~s66GbhUu-DllBpUe|;x997*c9t1;=pQ!D3ypN+q4fl^ zyF&I;W>3ezNDQvLI+4Y+VX^**au`c1X#rOj1Z?q$}O zO~3aO)ACCm?SH1s@#C5%sQVmkC{NcU0^%ayNc?JF~)Yag3Y zwf2|%e#4X2Lq-rU!NFR^|dP_tLkov6t69dn6xn$N)Jv; zy|W=~kDgd$M>eXR(ahUu4+cWb!~*l;z#ayUj^Hz(Jn$gBF-A{^LgHoCod%YfesCr^nst@&F8L~?C#E4Z9%47UL*8bRS&TYteu}dw>UKUX2TDiW^8B6KWo<0Z&!6?S3$Gk%i{rJ;C;fa>-iBEV_!w( zzreYM^0qM7)f3#g2R9N=^pj?OtI;*o!^17&*Oxh>=pzb|y%d{B_ERc<7J2P-z`Z}D zCt!88T(_kuWal)Xw>9|h)V?{raq5j9L&W8?s{fkUAB(NxrO7x)@k95x_YgBr*!Em* z+Gwe(>>fv)upe`0M6Nx~)O(UxZl{8S%@}^ed04`et2Y7v_tPi!O)*8Q1_y}e@(91~ z-S*9?tJyPy@h$(&j41Mh83S#dJ?yq?{2@I0X?!4(-m@1~IAdoLr`qFTP6c((?-;9ePJ+fSuAJE*p@(O)@hG# zJq2HV8s0+RD{2DsL&L{RY)1~PNq1>#VNJ^XPE9k_mw# zm974xNFpVRSe5z2SHYJX7b$v?^f#Gg%q;mW?;4hEZW^XJCXpUUosY>^nJy&~U)nI;KaQB2sLq4yDH}&On zrCBK#zhj?w<5Iqd!!C`A^$-&&_}SvvNo1UDsRl3QG4^V2{1tmH(#dx2SdVi~Q-qHN z_m7)(_G!BM|3E-{%Q~SrJc4_rJ^#B^&epp5-9I62nC#{+rrkl>g6`%5H?4aP_u_eU zw;8@>>sptONyd@0>^;Ao<;6h{4Z5S@DSW%X!n6Bw7rx+$6Os`E$XPz08=65(*MA$d zLhW{L3p(+u+;OLayJveeE(YHQZ)WnGM$gtV$%;SWi5(ySih$-8#PwA6Dn&qfp(DPw)VT+}Nv5ZVS&v-Z(8~QC=xY~y zvX0Vx{lUbgg}Xw--T8d*F3WkqgI#}aN`lsxM~`&b5#b)@=HOqL?~B%6gt_Xe?7QK%Y&Q~%0xnP2a{nr4 zOK=oC@^_nB>c$v2?%8(no&xMc61n5;RjS{-|6}0ddzN+a{b4t~<;#PLW3!3xc^7=n zwKuh?T+2Mt%1N6?+I?Qyb)?-&+APwDgR6Yifs{sHhkZV0UgGq)d5P}ad5L!m<|XvK zby+q1Z+KSgvO;sukkZmGvx~!@PT3WwUaWOYf9eAx8(O?MUgniqmQ*G>^6NKt`b zk&Pk6!>wD;J=VLwv(Vo2x)Tf@xPGqHxD=U8`NrB~TYuuk$}JqPGOi9nI6&uF%A@zV z$FC{2cx-mS%!zrw)^cXNlgyN0UP{@sjPWHiMg ztN)xE11x@Rx^r|=hNE)@-Oa2r^`A@IoOegs=6G;QYmw#do2Ss5`}&J2@Q|-_PYXv9 ztW8(vngc)53xF< zYxnZ&@~cXVa<6)9Eq8$|am&QM2)^)Q_s0~=*wY=y?&jT(S-gOEKQ{3k-hCam-u*m^ zYwV}%{TrTqJB@cg4zl7M@AcC4?&rCd_y6Ih*FvwV=(lwD@XuykvESX3hZ}@7F ziKTJWTJ>$;Ur+~a*$!EgGq>sfGvSyS$# ztl=Iez5km0{@GQs>=wPI_Qv?~p$TJKZ@D@wYdCjt4S#V)+KIC6z;IxJ^06c3#VvK& z(-jv$_S8x{S3qp%BiYFF@b1xUlNRBOAp*?Dp1X}Rzzoy&chHTFLazRGz-rv&`5K)0 z9kHpqT>arm{F&s_q&nlL zQg;<{7Spn1_)63FgWyds4r=V(E!^$Z{N+$ElolFf&(-(Zy1g@M(PP)cpGXE$T084s z9dLDM;)!130fvxsT)d2~=73~u@eTfdRa%Vlap-f}co&a7310W*2jt1dqP=ds;0|z8 zVMeLJ1D}U)zq23T{!(CU!&^g3cN{C=tdlu4<9G)8@9Cs!*_&1D&Dymu^6SRYu4Rv| z(Vo?qv|ov(S+8@R``uX6+z;3Ie3=`wH@0qWLUbk8z;C%b=5q_?a`)@p#My;&6WvSZ znt9M&-2VNvvDC8SlLu!y4(D{w-~CmCmtq}X8?k@i`VsYkPD} zo#gTpvH5{jGqG~~h16=_C>u1)34fH>u~l5xB{UZQh2tD3(S9mX%ARCAJ-?mbk3j6*?Uou+!tYUwJ?=v5V`d%fmVFay!z8 zM-sD#TZstqNmWlxYicoPy9v%!=ntunXh0Nj08x}Z(r!jf&N9)$0KXcc_r|ro!T(%vx@FZ$e?^PdgPCZch zfzpz3Q>^YLqqmLKr4Yv>XmFU9HdkrB-u73(h<{GA6cYO6v2Yc7+x9^o6d}`F#h6i~Ld3yreRL;cR^Ukxu3hs@mNSq=z z_&I!5HU4P&E!feGWZ#Tw?b(-Z>VFcN^FS}n8EfdHMT~!oIn_CTs4i%5)If93-MPK- zsN<=+S7x-S)4V6gHn+Vv;SWKd(SKR@qo?=uXXAfoVQ2CC*F)%nWjmpM7Ctg;eylFg zruP?;c)oM^#GSuyj)AGXuSd>X^?BE%AurGJ?m3Fq?YS|Qjz04Ub=~K}nQR>Ltvpk& zdEevGF7saN((WjEtjHB6&p_*~IObK*2gNb3_UOYv`36dh63bn8XDF6`G}YBfMb`~B z`ix4#|OcPs+;3-5FGZszIPfBEj~*Sz(;cb?68>7BRj z=sTJ_?$heM2PVq>w^7k$d?$VRJ__9vzohuvKELF*oeblCTJpY{Nnic5gIM}ag54Er zbD+G*IPVPfOtQPIR2=UmkdH0(h}>J@^q^r?dp)JPi-1_m;Z3*s9Fi)e_9+&YkRCN=wFn zRduy97J&nm9<6&BT)5x7$Kexd0xr$byKg7aGIH*8_!YBOEy0WL#!n63j^w(P=FfS3 z;C5%rGRyR-el2*&J0o5XZI*pmQT9a|Cm*wX^lIvp-fdvpf8Wc0y;mpUJ7C7#i>`F} zVajew?_1OC9WCe&n}Jcsc=K=(Sf=3}0`~t4|?Q`f;x1Cw9h@ zF{fv^YZc$--lMAW(8$I!p3YsqV!GR1>AGuo+}GXw=6&mDo!EWI`{P`=(Oxw0h)vF^ zYu)))n$LGemkeefxH5h$)k?@`PxboyE?QtYdBm7gT6En!;2hku1$htIO=)rNi1vAr z=HNl@IcYTTvIxCSBwg~;h8Yze?2TtWWFr!XUUYi>SDJL3s!Q*>FEhrPsxL~*qdz_# zlfTv0CFmjH1>b_#(D!`4Pbk+}vV0~y8$N?evKxp6-?ia7*X9uUW?me=&ex}_tkS|> z+v5LpcBu3xhh#T=d&roEW?*WsN9#wjCe_%uOvh(0cd|RTZtO94?jqQ(MAFc}72#)-BAKsK6XWUAM zP8r_ae{U9TVUMbiX}z+x-aR=wS|B?_w~ad( zR||7tBcJ&COwL0Sp*s|Sy4 z7=!JmVos^;U^ud)Al>CFE8M=#tw`#J@l*13RLCj*8K&aM-}{!-8#HDdTk(Kac`~asU}T$&3~^BUVQiUU+u^fvGNR) z$GjhLZ8P*<@0AsA9^wpJ^@y&=i6y7^DEG!hQ{8zJ?}0vsd%bw(d-wzze8!`}@@bOK zh{}l%^XaPIV1VyI<2UM<`HMoDR2ivKGoLITtxVyl;f7R{J zAeY}+Fu0fBiCx8All$BQJkB7Rr zEgIw`T{_Z`yh#Fky^3~>j!rB?J$&t3|2|+_+qeF!YNn@_68M~>I zv|8~?q}6-$Ncn2Df0gF#U$?BAua~a^b_xToU5M@jpE;;(`ot6~QR3ZS6Gom?y3_BT z@Q!WX9HF0^NgbWc8M;ohUb1b8FNr|oE{DclZfKm+st3FM^?7#FcjjynYjlLTQ@v-3 zr1^NwpMQ7ml)OLm>mrZ~1@Rm=96wTm&P+#h=QPw$?6Yd2%lw{Cbn zok^>&G0u|0_#rPY2ydQGU;Q+6eJ6U~eccavG#?>hjMKI&8N@PkcSK0H95_Eo%i-z^Ph9~2zQ=6 zJ$28GPhaW6Z7sCaKdX1o3SFKT-BM!_Fk;$`H<)*Lg+`wr(;e^=9>dQP80_%wG2zT*Mg53x8$G4ot4I7r z)2LN9bgwSYGkQ`tt)8^v?qV;k{;wm>22aM$8^8za|E9qs{oi@{|NI>2JRe>Yox1Gb zUA&_6F!?)b59&RHzs$w=GV@+R-s(SspPywVsyP32zsujv<#lyOgZ7}(ubpphH#0`8|b~z;|)yuV7s_AP+Ht_rOV$dt^R43=hA!i1ovJ3WK+Qr)6gp)3b^Nm z#>Z@ri$C0VSJ$HVP+qygiFz-hTp{Ir89`~IGVF#0zklT5=!}5b_ohsW%WLS}`YiYe zT%YURhilTTEwUoTg`r4si6?`G@Y_<~Lk|ZW%j=)c?R+^)@4nt48g%=ww9`w# zf6-M3M`gOU)u)-)cRe0G^ofXrJzt`TZy|myp8Pcn&HCtD8ghFD{wry}eEH?2==86) z(;ABQ?teM7ru_-|wPa4DgMFBRpP`ADvFRvsw4Y!5ub%l({mJ?& z?yr8`KmX_n4rYC_SetCtW|Uc*p1KtL5{8gAlr-0_GNgNHt?J(M!ddL8*{tE!E0=ZO zV_S(X;PjraN4l?GIkCIKTbG%)51pGvJlw8e(M0j|p)2+`72O!wSYm(moteWg#^DSj z*UhxTFNZ@`A}oJBy;FzJ$A#dRLmt0uXg&MF|5mkT;rn!^%99s?|IUZMSQ9mS1Yh?9 z7gnb@7lMk7B>k*gr}jV$dvMKp?5Y5KeiGjfKTo>R&+Cp<<+-rh#8t||r|-b2IRWRw z>Y#IBpZl#{b%EQI&&^w|@*kMj*G+wtGXF^Z;ECeoGF9-!4%M@hr?E-`l9!p z*KKIZ9aPyBwynzb;7a*Pg`V8hlzSs~T!XAi<@qH0p(Z`@PT`>SiZ8XP+Ol@)H`deh zd`*FMqAu0VCq3Mj;JB`6!2Q3qr>8PDxOU@r?hb9nuGX}za(W7A553yP@SWk!`5o2) zrR}k-N-rMdrc*t5lahAS`_+4#_xixt{ng-e#qSZ0zp(l?vtPp(9ywSPw4M*SaSS&p z)|BnWh1zsx!OhN(-|I1bKDE%qao(i9hP>~m4+fo6$RcOaW1Ipf+d*QAT9FHC^IiHV zUTLgtVajY`zM202g1%He&e;!nzRTRV^|m!Iz`mlTGE$=5uKcgbR2Jcvz_X=PK8$686Ae_(>UpH9swBc_UX zF33EpJUf=1t$~$s30Md16^ncRjku3#&`ndoP+;0RB8A!@kP;>Ad&Z zzl+=$M(>*|e~t>7qYs;#C~I-4x$);jYvI$JWI7h@-J=FpOyAVskCQ){u6&$w|B-f* z=hw$As&B2g?{f#u>{<%UD9v``J8e2W|7Pd-Utw30b{3;Zp0K@5Zs(^s&a_#wzPO4lixMad_YUGsf|;`WbfjOP~4n z(gy6O_wD~wKi7M3q4i4cqkM1V2j2Mx@)zHx0~{RI^r7?L)e8W{mPd56lY!77h-2*IqQjcRX-wS$aUy@(`6q5UdL}L+qPE4>d+T*7QIF^ZJjGSaF)$IFD@>Bf>@EV<&44mKX<`} z;|r_ZI|lH{@8v&!2hJ4ENZunK3m)89g?;9Fyq7j0Jb2&!GvMJ!FMbR5@*tYuWIXZz zHaz@S>0>Xx#l}%{ti6@(<6AFH>pisJo(g*3lK0g>`1V8hRr&k*VCf68SKt%zv*^i z<30Bq*7OIsle%RHG9r9-J@|#apVb1->(K9+@OUkxwcuN!`DwxaMCFs^35_`!hxE!Y zz59_f>#Hsy&m`fVWW3|Y%u!qa-doRL_O&aYpW^SNO-{AtRA`>j8|Zu?ucxEE#2Vez0iN7>7k6@dGCsFff}dTv-Ph%~;~YhsZh8`Z z-$V?kUYRI_%|}OXAJKC%)~Ks5=)?c1zT|lt2-oUv*9)sd@Zg-ur(e`Tgz0Ay`i&za zZHKk~av{2rnT$*Nh+nYJbT;VciCvY_JFa*T8=-VEQzIHU778oJIC4 zr?bh6^$hA)&tR{f)ZThz>v|X;MKiW!zH^=B#0sD{4X&OO9o4Gn5*IG}&cPsTol=Mw z6l~Ralj%<1e0{%n1epu!e+zo$-SgFlkIl6Lh9^W<(Qgd46Q^99b1#1`upiGVA%6?J zLat@I<)DE+Y`Amy{&H!QOJ1W((sd4&%jsG7)|{?PTdMmiQS6X^L=EJbsh|UlUPyPtm4DZVBfLC?UQhp`j%AZrQZ9r zl}}reDf^W*d3@O2n%?(&pSAX60l(co-`x9Kdi#<5t;4-9tM?o2_h~bKZf!nniI*q zJ}+x~dWGbErg>?~J0KtCeNX1Y{t)@*qwur6yrM^!)z1fgUeQZaA4QY=J*0knvC%h) zhtz*P{dvWfWqH%r2f`ct@1s9V9;>@3>$v#T!%<1;$+R4Ps+UeA_f2@_%mSM|b5Xx< zU>=>)_J{Xv77mw;*%M6fDn+k(8XUIs;o#JW`8WS>YU#_!G!bcCh+N~a}%W?yH<{xotclk>dz7Gfl2iLVvU>&2qnw1+lS zr_KQe@m=|9nWqQ&Z~BRTOJ_+-mrd-hHaf0y##P4I4zVshy_=7(nCHHD$J1%f`u(FD zXQo6p7FuZyX*>%vtP^qeXZlT%U03te*cr=hV7F|TbwK-+bI=nn@qP9ck(C)d<~#ei zD6AMp*3Ox>;!kjPW`~wX@xj;m6m1I*vXc6OuJ!$RYm^oFk!2p2H#YWm@Mv+yoz0o( z9mvwMIoi(sH!b*w*Vv=F^5OSe$|8vh=6o4`7z^=tiqfALa~ZxdLOicgUA6oVm6|*| z*(*5}ta1H_LeAKvTQ6hIF2*p$*FRCU*o7@W-|k!B&*=kWFgVZsl}@>D*<|>;uzDzG zN5MwH7B-dhh#l27207>)8?#Z!PidQwEosd7)rt6r?lGMmMz+k2RS6S9nwQ)7+W5C;bFAPS0HsnaaVfFg?cB?pZCM;B-cn{Ip7?K8;;C6y;yW+e z#r1zzT3i7Q_|D(i#i11P3r0i8WTh^QsvbSa0a;nti|KvSEfMp(1^KL*KKt{riuU#x z-Sr%Ye1efaFuKOWF@5J1eN4IC*b@vL@M)dqST?NKOCy)nzTV0IFMK1?%^7=R&pKju z6tI}=@wHEgP4CL9>_=*CZ@Z~g+XcOS6VV`p}iGCrL-~cX!N%|NzofuAQAPe=b1r>NNyg@15>Gvo zIog5zmdXA;$XuPEu9Csl51YqYl~<40^V{WDywX&H-)C2_q3NrGtREg8V^tozA?WO9 ztX;%#)mTrTw0`t_YxJEMahA>_8+S4<$F|+%sJ)-A`HQCW$XBD+e5a|fZhg~2&Sj3| zSe4;Hp@ulPZ6RZLnm#G7!>{JDI(1xw?tzMM2CMabmpLv8W_MMLa^X?9up~IPOL)US ze<8Mtfq}$s?2&0-g)q=EDjPz&uuJsize~tBN)kFM(PR_PYH(;OqZt66x z&l1KIdgPVOaqxAKX@|INw6lkF*-^AoPZ#xxmg#KD$IVro!Jr&y_2)wKAUaq=UtWB- zr?QhW+bOGbJzHt}Fzwc}SCKsu^7sA;ebqVE5r1x|ulY>RPT}_0eJPISE-}eUoMV2! zPhQ#T3a(;;fdcEqSk{h%ww*q{g3hsrYUeEsS|>Dy_~ns}IkvT|eS~7(gj?(1+tMEQ z*1d?bX3YnM8%8niV#<95oH=%hV)H~2IX7F0EPj0*%oy~Wzg}z|=$2gqFz@3G-P6&{ zSkKTe3;eaU%!LX0E*zR*op^BVx0_;hPc$7|yQOI~wDDBIaOdQ4#($PGv?rL4wclwP zQ))Ht#_lJNIhP;8*^|(>x`ie_k=8qJov}CBbe1`gU!dw;Pq`R*(}3^zm1&!cfW^*W z_Ws$}!_>$hopOrvG3o22Mn6t`Ct!yRX*VP zTa;<^?RpL~UZwZNOGD5RyZBzXJ_}r*4eU*2UbhT>^qpFGhAo35?=14#&Kqo9e+oQW z9}u3-0_O`)XLZR&WX*dY0Z#|4sUh%B3p6nqPd^Es{&o_c{)uO@wTimbk80Y;EwxS@p?~dmXsSQfC!tB-W~@&ojrA#i ztVuM9HOo>xtYI%b(*FnO?;G^}!s^eMwNI9Ts_4HB{3@TG5bGa8hhtqh)h-|VJ&eB^ z-`)z^@$;NyE|cYd^iWiyhih|#aZ5d=ukz9q|Z*B$e7Z_)K zS()(_$R|%v&`O-4zi%>k?H)aUleyCw!$X=o#{LF8Py2hRPJJpdHtbRO)XKTJ{{&B2=V;jH}_p*dziJ1fl~^>oq6B_&E4OTN57+q1)}dS zs;@z7iqaGZ%Nis<#MB+&d80?m!~ZN6407jBU`HN)XqNrwGtMxlhZbAihZfu2hYnla z?=n8sPfUN)M$bw7H}KWX+qQ0o=6}!OJu~v^>Ss(PkLZlsmgTi&@914`+R7t-oh3iu z;GfS>ySa<3?%YLocW#H(jht@k-*Olo*<|eMC#;*%{NjuF=GV{ITox!6?zHK5KDa|| zJWX2{R)79|@D>IJ6b~mj7@Wl#w+{+UOS83CLak{JYtBQ4{}|4?rxEwhq@NeQ2z6Bj z-7+d)0Bne-NJ~80Cr^YtyYVGf-D#&E-5BPX4{!V&JmBn`BZ+0D;tA4Q#T!q)(Mp8g zOP#i?ERtwF-?MWf|0`I#(6DO5FKZk%z)cnFZ061I(5?Bt*>q(SzhqpllN7!T<3pRJ^uTDmArlR=&p`g;{+#7DTMdlg005{=u08|xYCcZ z-g&Hp-gj0;oF9Lo)X}+#@;%L*%ML-`z6XCMo}r3g`K4mR@xv(Z$jDpoJrOMtb}NVPuo+fmaWovS9Fsj9x@ zaiBZv9mn^0znr>sW?b0KSKx6SI46H z5`2Q|+GYZ`>yejaS9F;C>!GEEOJn%?+Mm{XW;0ImXNgCC>bKH6j&k94nVScjR0Fr- z7gevG2>O(z0sNt;Yd!c&FzCW#?dw`U3z{aF^ljrlDvtOt9P(fF`=#`l0pL*cEj?zK zwbHxvf}G>+#0TN^>a|v5*HyPT;>-2z)c1o<7xY-~WAXEOmzbXe={5D;*T2?&)3ulT z?H^#b@&DI;4|I0C&9{Q~DW?zidfy^Hm4O64z^d*Z5C=x5?*?PkU#KTY`312%B4#+g5jH_Y(G$ z;)r+1#%LQfIiH7b$xm%Cr@{YUV&xFh4cdoK>)FY~Y#~Nq2fDJu%(3z`1;;jgJ2HUMCHw1M=&gIqU-#wLyXzht)!n?$ z?c>FDpXMZwwg0-ef5dffNB^sS|0V1GHP(F_^Q|}v)}V-^wGVvUwbvfL#M=MMM_l_O ztgrgyuYJrLi`Mx?))`vQ+F#$h_7l9dSD6>?ez14l^%ZQ=`A=K# zY~=4jjgqmo#=F_u)#=Fa=N~y(nC|ZF=n~89Eq`5mYQo&%>B4PC`pn)n)_!gwmaF=% z_&9}OYv-xgEax2MT|ahvhi`u*xH$6Y!yEl^zHr||&dAy|^M3ZlmCl>sjhf)6POO~# zgt3)x2Hv-lU-u^~zhe1E3fw;F|5;?o&FJ0qj^B48H2C5^JoQ?{>1K~jV6UEKf8+x{ zJvC{)>$2EeM}Hq$@-N2@QTS@B_F+=HO7rffH0vW=rh8M(7>Jdsa(dTTE#j5M$~lV( zj_JlWyHRyLOI!dtJpl6C4Ra?!$s%h-JM|HpY-1Q2TLkY?xU_n@_C*X{!p^hWLf^8A zBgA*HYTfuQA^hak4)taEW8=Ng+1R2{E`QyZ-^~Qi;lDG|N{q#aZ)U3X!xx9Tz8qP| zUiH$KUnoB~8{PKu%!>V6(4%j@uA!-9(A`}{;O=VThf5~Qe{yq^zvoZSzr{J7agn$0 zyy{kG{5bfzliW9lt~d4uJ~7)0Whnak);RjcB4pH3J8~hvC2vUn_~s#{U$@RL<(yl-CaPl}Jdr~gXIWu4 zdc@bi%Q(i+hjWzQ5**!C1-(}6B6Nt2Ez7<#J=YGbke)OaoZ1??W6b6l=PhSBxA1MM znafQqAZxC;5w4ACePGOnm$-`@KhOR6)V>_Hvo;jsk5fV)3XpT+!Ms+rnZI<*=9$Z@ zrl;ju2WF9{VtL;5S;4f1ihQfMq8wFR#)88*C%y`}Y=k@kK7M#{< z-#&hGjJdJy7{6KV+~wJ*>s{wmv2#5;JJQR0X^3LdRgf0D0UP)Nm$!SBz9r+7fnO52p?opQ3$H0%_@FSQc9p(Ykk0&N6;jW8W^QDM z=bn3OUU>{I*jne>75nE`J^L=&U>z1s0mj#I#uR0}RZe3sJ70Rx|L_0$Hdg)hwkqS} zMXy~$w?mb-GYT7O^|RjiPP#T){maWAF1eiEL!Wi+um8|C;WLap@E<8(==OV+Uq`qZ zAA9Mqz?n%^GV(o$xqk@v=!it^I^;OY*squiIArq1!Ac z_q^=#2G)sdZtT1=Cro`7xVnT`&l5gTZ+OAvIqN@P+)^to@<@f9J+iiwVy0H3I#(xVsM)%ydWLq19FS36#>fn?MYXzSj?&~3hwP7pW2BL@2tG()&L!K; zk-n)M{PMQ}>-w}Su;IuQ9H(_@{_X)cKjyUu4yuI4H-@vVgvJ$uhA%|tqnHkP_80%B z{g!oK-uSA^s|JIMlXSE%G0(C=Q9FA0ZtULF-{kSFrM=$q5%+=lHTzWKQ+w6+xa$=6 zJ$XDmbsr6<_Fn^kjnp51zni|fbM-#^+P-ux1)KRG=O}%BwZPMjM+&sA?)iY~^Z7pL z!nex2^TTBP9$n|&@8aX|{%hm)4LSkM;jxS^4|oW<_InmSDF#njh27P`?jPr2S6%AL z9DT~DY&*Jj=+(D4dz8-5@URQfMY0zwD_GYq>}(1j+1_5m+Up!KAKr`nO?}`UY)iCnT$@GuZ(`3VkDo8*`C{|m&^v!FwtBo(^4$7(q8Xd{#lv0R zn0-zg7x#-lr>g%F@9!HsI>-~UWAy!~`_HrdrOV)*{|$Yt?(WpQ_xGD#&$`MEX*Y7u zOnZHk_T+zt4|RXoRNK;#_P1l*O8@%XuyQt3DcNW1!}jJV@F;z;_< z1+%%>6ePoG3iC6F^;Mr@(0rZuMZtTbkpubs`+n``@B4{!?u#~Yf&$Dp^5PtP!90Gp zr#uatGJJ#@ES({>K46u$Ep5J?JO2hb)ej&)VE^{jPux_zw0SmZLFX$|u)hQ*$Djjy zr*kWd^rZ3k@W?>=b)!L|K?!l)MTseDRgHevG0rx&N1;j zi9_CMGd9&>{gt(I2rxtpt=EV1R3k%$BeE^aX-#MCmII?{)HxIz=i~W9T920wYdyYZ zcy4@XGWHlBqu?}oN2e*o67P4(7v7Em7UeB;aOTRSzc-U@;BCiYwmtOPV zDh^(Yjozmo9X9{d?^PXC42$8PjySTL8Dd9Py@t-<)ki|}-wqC$D7!||+LZPW#2bJ0 z#)^Z#4-T7nh;)m-pSud1vpJE3?&48=iYRxi!#wRAH#?GOGV?UHcb=;Lr)6vx6*G~$ zI?SHdJbj*dI$My^m`(i6>(TX&UjXgEC+4S*5|@L#{v1WWYwc9bQ^jG>_aF29U1aeN zY=jPR*B-dNay58(MiudRs891+5ggeN9bAfyjlCl}0$s;&VkmwedQwDRxohP9#j+b3 z-)iCe@h&o?`ZJbs#YS<@QHhlp_vUTR_&IZ&5a$88ZTNWtcQ11;B-u`F$VX7^bgqje zbPr4i_e>mKyKhEE`k);hYyWme$K=`@JGf&49JWJeU*M~G9l@J+M2SltP3N9UVrL%a z9xmDOM7akuJo2XE^qiE&<;-~pF*GyiOV4wePEXGe=V;GRr*oZ^IJ*57r*rZsr}L-S z&mij_MPJ|fT#nOuaI}*+IL6Ujp6(j!bRy@T-agLh#ICjT_;|_?&vg4`+>OP5>>xWQ z@q2%+gG`X%TU%#(pe;T*RD22;Z3tLx)ZNy3YpA$qsGaB;X(#@OzMspn6X(Y9|0+9i zM_TRcJ-NIW@RWy(N6RMi)^PEbc`3Wb0JFtGtC4$7zjc2ASY{mY8?3~;*V>6QlWqAZ zOpQ&hDDHW5xYJuFb@V(s(uq+=&m11w=$Xy$_LNm!lS>nms;!;)^SpkH7*_WJ-$${V z{uXh!j#B5_)cL6tYs&FkD~g8)hAuC|rfC>=bmm^eSzf+X>CUNyc1&xWnW*SKe}O=^_a-UVG~|z$_Qk%-gnLP zsjtF+6kTQw577^uk1oQV@K*sV>+QRG_wl@C)OVaXS|{jZ?t5;1*if&izY{x|v5}2d z-aj-Av4*tH4NRXp>~d?k_UuvYz{TUJzQ3WqqvaLFkJVXICS7igSRQ_5>^;B87WbUYZ`Clqyvz9I|Dy4fEvP82#(r<99h$}XMwHlv%bib4rrC2>X!xGH z80(7LuC*##rdd<;zV}o3RDq9|ew93d$f}>)R+jqoEPXl}%-Fx%&geQi`SGTsz|7I| znZ;KJt!YQ6RTLk)p`v&<<)iGU9gkX5-X2++c-2mC*dP97)0f&ZH)|heYOR60<&R`+ zK035CvE0tsKH(m#@+f^gIy7VUW8uq2kZ0rfutmooq^n{%{RdXNXs2_|%;NNNYw8Bz ztg}Cyy*JY7X~I5#!l2?#U@a{VyHQ{kSu4wjIi(5izDrsS@z|QPn4{s=iqer*<+3kY zJFy#oU3)nW4|S z_)L67s7F3(g1zstHje{)3%z;{QBQl7RrwnA9M6BbDUL1mH96C#J_hW~>IZvMft4Y* zet3N?3;WjhYWBeOO`tyQwR7{s#dk9Y@M?`6WrGY(Co!(@{I4wRQZ!cx0c~=cVse9ISrtvj-oeALqb_C(S-a-wd9;75W>?xoK5y zHhKeeAurFfcH-ai`b&(feYka?3z)n|F$uG*Da0pe6x<0{EyVs=I_eF=RhKbe-d=nK z+_IZKRt>Q#Ke^c7j~NZGuphs{e!Q1HXb(2n>DvRJz4RU|oMTmLU9=BHGhU&b{`+J3 zyy^iyV!`zNTd*U2dW4%_aMJ^h*yH7ou_lv%t3tt()(9H&E_S4G?~U zrSd?(bY7r(u$9Yto4VE3dfKX|Ey33IA@2Ggg$MjDd4z|$z~jFU4r%?=ENiFyK(N!E zXK}yJ3ijfJcc2&NUHra~n2@0gtFnA_WaE;&y-oL7Lt779)2Du#HOL=t4YyLD7bz}& zzkxN7kIf1C5Ty@Y!Qr%FwH}9$+Ko&rzp06VjQxjrUsCAKliyF}fhou_b4%Yfe_hba z^NdSya*x+<;m?Lg(l6rAvP-XBMd`)0`xDB`erFH%0qCJttU=eY@G|Q}_%^Gu{tE7a z&W{vt$RyTwX?Ws>{K&3Z|FZJn%&pF@KfSdGc$FVWG3m<# zSq;ayx9J|neY>5xy$aea*$Lj4c%d1sn&BB z>|X-SEQMyC^Y)JB16Xb70;VR>uHgJ_XwD&EJPL0xWVSWs7&Pbm(5YkLSDT*w`H;<% z$*1}34--cVIM?Fata587G_F{(=R$OIFEN+=Z`1wQ8gI+xk>_H>uug++3O`;AZOUg( zwI0Xdy&Tr5lReZz-?YBcSE;>o@I48gBQa0nbJE*-o*&FOI)|puo&}9-0QWDu;^iil z>72G@Y^RrBWfwE%W8Pl-y?AxfjxmRCv+mnj_hW``W^P}69lQc`^VrbL**mC{d>emx z#V?_onO*hJch#jmE0`B=AHUApc?Mmh{M&&4dEk%6qs;T;tj+Eu`c%mNb?MVDo6cab z|2D9`!=p`F%Uq9_d5Q77OYEW8aAX7Oq`i4z>J;7d>7DRT3%Jy!n=d!LX^(5&L47{0 zYk_Y54fVtiAw#{vIS#UhY|+J&N7uSG6BSWYCdJwKhZB53UGmLq)n zK-fyW0uO)BBJNy%gy(?0vZm4A_2B1&PR)fBXLY`n*iPTN4sq56FDyPc8TY<>ce(Rz z=ICAVRQSW3K{og{vRznm!-6@^bLg5*G4DNB4Rw&A(S?rcdI=mI!ne)l477dlsD>cF z^6d;zMslcRhy;6Idheew#xs;Zol}}PHMy+q#_hlA>Y2Wo)&4QA1r@H7EOAKZIBf^9Ao6rw)}br2MEmEGO&sK#|rpj$9I_ zpZ-{N)+AX)XH4dforfrQAHH$ii)Q9}iC6Fa?D6dEhB2SFoRM>Frv)4rdk7gv^FVv5 z!>`kq2L$6Wc(aqpb)n|eX{i@_a>RQ}kMlCW$hukIW8VtrYoGb=J>W+_-!gOo=Yg%x zVA{lqm#utmL20P9kg_q#C|~S3bbZowzkvRcd5!J%{_pet@Av+{=KTkjO#U~$|IDHJ z&%CMpsX3op9bGUc1oP=EzrBb7jhVXS|}zr-#aS z*wtOs7Fd<)Z;R1IX18WNW_7>tW!rgCSHM1onA>7wJgc8K;F!x6?PUhXZ)t_=}K z<2$pY!Z|;iwM1`vh&6_HtIVSAS(MZLgvuj4pqP~M9hMD(pDtNk<9j~%`R*Stww#}F z<go7w8lBXudv%Js2W?3-|qw?XaEk+2{#?6Mf%=?0x@YU?#`qVPQ<)iM8S^SH}+<%PcyfH51z7>mhTCjIhJ*D_e z`eV@;e$D#rLYzN>s`${YrU&jOU;YcTXiL`_gQfHLZu&E$=O&=SD3T0 zv)KRm`(OH>Y_tEf%>I{Mr0SB6uQ`le7<2FYd;XNM^@aPPt!32hr)i&P-<)SZ%}7c& zX~_4}`ln&%bzT3oYa@wI_Dd_`|NVh9;$ORa)7^6;Tk-YDi7~&T?K3Z1xp4zAEQ;*3 z)*R@&cn@^&y?rx%KtC~xwB`0NBa^;=AE&nt>0hP*{S0ZEzYy!->pw>u}<7rFMxt|DOmIm+1a)dwH!Tn&yL-)D}cr(^y5%<*FCQ$DT1c9Q55I?Rd&ujrga2K8M;N{$1W)lZzDL2yC6(3**>`C?XGv=Tj$;RhIcHDe z1N#(uFV;`rc>3yR!OcpS4tO|iMp*k^n>+)PW6T_hF1X)Z9o`83yD&S>eAif{+f-fJ zvwl1Jud(R&0R56q+%4zo(4>o=#&_vseLeJ)-v4fWpW^>DJVk!GM~eg_eqa6Zi59k? z3)LEke^b4`<_tk+#?YfI(K)4^L$B}0^`&zrZKpXab=#CKLiu9Aa*NV)+`ZqMeuD=a ztcAwr$81m;AGi2Jms@CWJ0!L@2XmdalEh&u8=s2wjB%*Sbm^St8R z+c_VHK2>lI5VEXd7zsActQj`H1RYZRDSYG?T5XCGT(pKdwhwmF>2sLzDZURPS$-vUF#x=doGJ4zH~)t@$P(U#WDNwrpM4v z2sbW&zRcMUAB7CGziSEci;M2GBqCm zz8RkM==X;@cYs^t4eSGG^u(}mZd#YzHR^Iqco?+y&T)$xP#$G=f)sN6WL{`BU ztth3x+9!+H_u8Y0k?>u}Iz87~Z9TKCw&J4?9~5p-o+EsJ3!5477lE0Pw&rr~dOYIt zzuZ$fJy&|L>9kW9>0P7PJ3Y@6(;&<6q$O6H_yg{8OFUo38BIBS8L={&@e6LDE-Rb( zkp1eGe}dYk{%-McwUflJRIbdu1N#|twz)I$s{y~~-i*%S0{jd4x2i5v=FaX4{AYDn z`Wo~HxxuWiW4j}5N09&2kF-Z}Hiv>)`@^hTa58%_)tWmy7@D=5d9Fd%yB>Hr3NN9% z&_ck{4Zx(} z&fR>=O4BAX_O=jukI+`^5c1of5bcQ1*Sv)rL=y!|F?bo#Qdd6lU?JT~JOaF$v>Uv% zp;lrgX(i|t!svQT-S+r~BKA6Xh6Obf@`|fF zQ8|KAnlYMk%s~uUF~%II+*HaXMj~_K>l+%3{{ER;9Qht#zubNO(q-Lo=9D?^Dxl7H z(SxB+m?zuT&T@RmmrQnauGKn!isKYq@BAbPW#d=h+akOJbCva`UGy)w-EcHvxGhsg*J~tmL3%bXG@j_m&8|F z3B^))i*dvz-C6`Zr73P~yUx7E>8wMPMbKvdofJ>Ekbb;MSJtvyM>7k%2n_0wgi6Eneg6w7ZHI)l7|LBi)TB&Y5 z?`Unl_L~ftpS$Uc{Fh47@juH1-ygiqIdh-Zaa7k**6s{6 zER^Z#cZQ6*qu`qQ^!)PNn=6EuV%QuUL zMS5kLi@fw{YzH()vQ^L=C@##KoFl%0ZY&lYH!+l-)4CKnR`}BbziTft7GobJokaEL zY-g2p5_N+=P$!}J(OR8m|7~K9S{B^z{J@(xlMXF;Jo!I1SsVC&8aku0f3A1%uHNfR zddQ^L@-F%#|G!85ch+>Z@{qQQ-wbJpm;jwm2?Tp#jP=t7na;8@Ueu@5`cuL5$4VjU|H*D^SMpr8QP)l5n z=HL@Ejxvr+E2E*A`0CBvKmRQJ(6iZA;6J?H2CWCzZZxl`_>fv0Y z=d%Zku&J1qA8OTE&QfGFXZ~cTWx*7ujXSKxXK2lM2IPZfYohOeLRrq(vqW#i`}*aC zH;i46xAv}lW~w4dB0_Azx_Y9^VNF;&O=|;T|IX&mzB)veCBo@b37Lv;Ahb%4>C4mZ%+<5 zt8%TKh1k1Hgr^oC{xtJd1g!de_+|8IVm9&0N5OZG0T(j9+u*%#hxdLKJfhfVkAt_q z3GZDJ9NKjp-upPbH++BNtMJ~(!GRiol<^V!$MD`=*j&U%V_%e+-Y_eP_YT2(S3wIq za;&x!&~cv!7o9MC4)ZN|U6bb80BNsZ51-xidL$v(mETXt5zoF2oc@;nqpQ*#WJf$( zA@Kw8NjIZYvsQd}pNK-g^YA^3j)R|u)`?e-QlIYFIznA)I|eN@ z{Iu|QLFua8G4_g2vbMRG*(<8}jay%vht6?%GdjUs*{Ji&9YQ&|@LILt_}pJ`4hB#C z(0SsJsejb3dOOl@adfBjksQS)QM{6@)_;d~r!wEB-9tAy=dY!0@a&p%J(UkK-Ua9S z)}itrHszmHQXYHkLnn&3q#?+Uu;}=-~EoM*kJd=w28*<`3VJA+%;@g77 zu{SeJJeE`2GL2u1`X8WtkjM11j(v$dgHK>($9(W7dgefyXx*(&_pS8b9^Dm2?>ZfS zLZiz(_VB?_>ga}1{0hJ5EaQmhM`~yiXBn=3$HhC++jM^sUXFDzG`-xV#iMrr*+$mZ zO@j`oFWT=h)?PeH_x%-){+oQHCD7GPWbDa%O|X3hX{YIjOY>YCNzuI6{F%-<#*=H0 z?cy9tXM{#S__;3W2mAJ0XD}COsoU>7^isk*$@Pw*-circZ~Bu;yWQZ~H~RJIpZOnU zJkrN4W==J(9i$1@$KObGV!sPH=Z=Tb%cVJjRek3f5a0XhUY<>xsmI0d?l^Zr|D|_R zn)KoN)jZe3|D0l;eI7&etTfSEUr*JG&x3vK>{W+sia*dU(~DvJadbg{kj}}w2j+i! zJFKhb_~Wz_M?V0aE6#@&rSZEEJ(mrfh0t*o4v*~OZpmGRgOFwL$+A72mvmvJ;KpSA zmv5`?uQfEq*x>itotMA=o(JFG%C|R<1&y46U6Jl%40mx78EAmY&7`9|iA-CouCuJ?`Dd?)`A5=9ELDxNoc6wWI%o*7lZnxG?l_$8!_w@pXSqSRc`rDDV_R&iNpl=#SfuvAyQ3{9})209aML5!a60 zwKW&4`f!>LoSu9$;yjH!B3PAgliF1Ljj0}P^KIJKWA88CX+1WoA#nLg#xESEcrnTF zNO}C2`=)8XsSm36E8syN_xbx{2{CFc>Q=rGylcp|8^VR9&O&U`*Mh?*@$EKi&s~q9 z*Uf~tl>N@z$P34@J9-=2i#_D|d#*=5}l*;Nv-ma7eYTSEJB+RF3BeM=()%^x=)>9xcw1Ch{)(&soSEGY6ro zNB&!n-XR=Dmu1(&@5j0oLp0*ydFC@q?S_WS=E80bomY%S+r*#MUGmV`jrlz}Q{8Wh zvuGPzJ+yl-)!_ySfcJeOHpU{`C1|CQ$Jdd7thqSlmkzxYjg+Sy;ws`vR> z)uJn`0Mumx1;z zWp(HBiBfQdO@H(8Pm9)Ajf*dLVYk2EmETq`9nEp`iJ$B1+j8kUWs>JR`CWZU{_nq| z$Amt*cM12;BOluS{HCB7c_{{eWm0ze}NW8f1)u}l!yuiM`em~mR{bT64cspQx%tCv1ckji9 zJ3I)RSZEIRwUvv|$E#hz=o!yfOLCCr;taS)`d%A3BFtJV4k-KON4nd2*`r3t6^3 zrus$j-I@om`wkjkfhu$k>O*zlL35|I>=Abp|I}ZTx0wqcuO;7=;KL_;`?s)31xIR4 zq>pjsGOZQ$8hkAuD*t{PmzKJ8(#K_Le;~Z@L9|!BL$xF{l4bX`I!64@y+X4XB8u3HnNY4vkX3S z_mSVn68wCpa_7}FU>^O^2ou|l@h$S=PB)`3P~2(F+aAW5*ONN!0b)g$MtfYr@dki)gYR~&7 zTi&d|uxUOlXg*KT#skRG^@1aN7jYiHFYuOBKGT+zio{rD@nCka>rf41> zfKNIAJPCg)=5qLoe;OO&t_FnuDf%WI|4V#tUhM8~#k$a#v}Wu>Vk<8-FuDfXWMGtU zYR|_R@^SB8coTZ3a;F!6crd7Z(l2TZ!XY1}UVq#w>%p_Rt18*ATXlV?yy^KE#y$?u zI{+_wDLxdQq4K0BFD3J!+5PrFCp^l3bPqf@0RQRJ5$356f9Bs2HPGHZ1z&vzK4&0V zu*IymD+_Mz9os0wUn?eBEwJzN!y2P_(Jb2D6mai}@ZWtNTkCfz`s~;9A>-PlI{a}8 z-{`+j2Sa;zcUQn$iC&2oU097S6dL7!kK)hjp!1YZD|o%p3FZmN9oj*RG0lqk}*t>hQKcC@`C3#$ae~TDj$cB$}?}Y5jd*ww8 zPb40Uy{j=Ma`W7~;V-q$(yJxQ`o8>h5r=2@!Qon8;qWueX$EVX#$3&U-*6`WZ@}M| zn76}T%&7kJcBvRrn#Z;93xX%T|IFM0|Anrl(C78wHJ!`aPky&IR@9jVw>X~*xpw9C zYvEUk6_s`sdcW;ntf)7M1NcZQqFMDXZ9~Wxn zU1K*#IbT(N|0xh(bLUv@m`^b<8wDTB7VWTSW98p7-wFO!8JD+o&-mnTnL|8!F=le70JUxvHd%MEN+d8Oh1l1F1Z+4k9%CKtk;mAk0U=TA2N5> zi_H6hB>8zS|K$(;c9L9POPVj28~j`h!Xsk(f;l^ny%Z?k_LE^WCO>+26`@1u;bFHXoHPOfWX zaG3LH^+}J9548VgvffI|y^;HZ*o$HNk&Q+9R-^O|x#%4he0qJ8&V~K`ti1jAaRInS z>0{Z$x`#;ozy5CpRupUOH={xg$^5mx1!?!CQP%$aH7>2$#_a5+Z6nEeF%EDpZ!kW<4PX4gf!>> ze}R4(1fOdpj^7``eRDW1s{CReo;T&!e~uW~_gMS|pJAQe``@&_%G=jlR=s!x@1glc z*?D{3P2)DZveuNZ>(}G@zu+CGdg#mVW3PnI2E_w^M~vx6K6G686cgd&=oggz^`gKx z{)X87Hs}j!7z4i_|L~Z9_&m&Gc-?EkV=f1efq&(vKBn-PC>nMC?l6x5e+gg5<1gX! zSw7>y{&lnazm3Gky-4Yqcj4W__-(w4^O!@~c-H`QLaYmV@%>vx`8~DNt-zAU#B!hq z9loIDz@b4k7Fe#tLHPRV4^kDLtoWU}4&eUB`B}p6BMsBrTs%G8Nanwf_xECL(9FIY z{5`vK=?bxP-tJL49Ute(-iLUjii30C+t{q?N^{?bxJb?8ZSnoh?dbbl8g5m~d2EQ+ z;UBzj=7k-Pd-{b*V$LRaL0ey#mS=KT1-??HB=PLuM zj4wog{}CSv@8iws>4szZh<5t2-KStb3((SB_;UIG0m=-k4bTCO=OtnJ&-dsEU&r~# zc`QNRi*Z)wEAzwoNv<%EU_O=iGNru6PdjI2oNhH3#nwgz*kMj9~-#hT{+&8RC zg<&7wx9ddwhu1kFE~s%f4&#_GE~t4Ygs)mQ7rrOLg@1;x|5hKvyaIik4EIsZJ0VY3 z%Q$X?VRNEBVqLY&2lC>{=W+i8Z%@|W6XLD9uNH^tU&FjW&Ex&yeU3R6Z`E=xpTd1U zmJjIT4HtX>xp^SLZ~>*wcL~@(EZsova#DKNL+ak!;cJhTp>uHMIDO#%FOzBTIJlgQ zr#|%`$p24ug@F%Dk$g!(AAYpo}-Ypt+rvHp`^`@}!6YxU3% zbKtX-?OL4c>9IQL;-hRJ?$ed+-MRXy0R2?eyFOdhc3>s+(=D)VKObzD<-Dw)qWo|0 z`@a86df>0WV+UX(e*SmJZ8v;#Vf_>jh|9WZ{2ZRm-{~l+?{wn2=?_#r>8d$)XL!H9 z6X~hE{Ty@bi!T5kdhDf_vm^EIU%=KJ;d(2^i)V&j`~Y?x*D<)Q8IE!A_oux7H@^RP zGuBy~WY@P6X zW=`tg`0vC6*f-oC$^9Gul5H|G_p`Ri=W}fnl>de6ZNFrgd*Q(6gX93WPoe<-{_uYP z7$f($a@)i)Xa1iCe8YZ-x$__PJ8<|N>(}IYBi6X1=6o&W`Jr2Rd{p%>WW&EOsLVO9 z&uy05{?6wc{sq`ua$Yg&B9A|}#Gk$4d5``BJLW%0Hk?e>{(ng}{3pTtU-661-8cG> zjXZqVq}VctX5PQRpHGMX4z`RQw$6v;_;B6?JbfSd3jF(*b*lfgdH#O|A5X^1PlRhb z)Mo?c+9lVjdE6%9d~B{QeU@5=HM!B8m+;TAb`xB1huJ3}sONQrhSVtTKYe6mh z@9?plte+>Ou{k&qwylk7UbwIJWBaO>|1l5K{*ssXp8t!k> ze~2&Og#G;=^tGJ~4^G(6|4_d<$H5!_8}-sb)jm0?Ui#k|cl#%L=?7Rp9FD<-bvW)X ze_i#LAElFq?csk@AARDQ$NXe|N~O?F7A?`@Ei2?gwu|XW3IgEM z>}x`3H$mz06*UgB&ebZR zwq}6jmBb)0nwX+lM$oHy)JinCJ0b0)ftC^QJ5oflXfJt=ki9o;#j}p&TG639hioGc zU@^H-JVRTPvYY*gF)TFd5|@fMKs1|7Bsn9M6c&;Ntd=#ia@N9@vUawD ztz^|~87pL!Y%$AY^(+&A^MzVm3*)UYrEOQqzKrV=oflfOh4R-fd+p}=3({#8bIkWC__r^nu-90^*hk)%W=nj#`hL}Q7>UdS4z zK`nliD?eGqM8e8z#)vJ4==J7&o-Ji{HWPqZKH|(qL5R{ABaDQIjAg|al=6ICbXrA4 z1c`{4M~H$XIkt3-A&Es{AV!T5Q-KgT4lTeU@VUh_V)2!H0+{j?K3KZ2WNE{~I;N{; zeMs;luefy$pHlONlpxti%0+ovl`{S<;E%V3-XO)8QT~zJjEyyD%_J``-Kid_sW?fB zcVMgUD6Lr}@wR9UiB56Yi0G#(Gl6995Vc)@Nkz!qhk?RSyfOBAm$ZX^(42zq9cVR zc9W9KEV5aYGqnopO`p{tPl`$-&1uAH*T*JAOQvLuagDG}s2~M|)U~E91_UzV^I+oh z`H;%W_YWrH`B>XXDQ0^hpGX_LGe$GwG6b3E+r?{7tLX?IO35pv=W4wL7#LAr*IN z)-KVuvH>9NYOP0mgeEZ}rAJf}9kzI{u5|!flbSO$apa&-Owvg|T8h#*G=9zjNt32S zb3WnR^ey^F`XWtcjm*YA7D#=Q!$OMFa-tg+7WO1|+vD4fS^9a4PnqAmX1$a=r0pME zUa``G*#H{0Ehw>*c{L6*Ib}mj5^2w`j$iI-7|k4tN?l_q)pZfGsAaY&J+T`s8b<=z zRn?bxC$2&cAzQ_Os09JOB#@50>bPEa(?o_ZGG&dqRJ(+zbFz>wrt+M~lRtHuE1q0? z!@6j4{k|12Pt4?M(I}6GfcN8B?S|}pdrMbcU*>XcYKO3412{1m^bKPsgs50zkJpi$ zd=n^-e>JxyM39k9aTb!CEHbS@#tU={tRpUu8xzMJrPY993n3bVfoK4J@|x~*T|VF{ zkwLOuJYRPauKkus$d7cd=ys5Dwr=Q|(a}+YkMcDtHyMSV6T;8;(A`1;*b_)>@BW6! z`tvRz9Z4%z1JjaHSspQ)wE~JRqF2&BQc13)*jb18=_I`eBPV19T}}6M>GZ_aw|qmQ zhCV{xDmKV2hIGln`3v;N^rz%w;$%)d;Gz5>n;7uu$3qyWu|z}GlC=V4CMh%|8w`TM zV8~4;2E+Wyd_#R^Ig;72&GC)JHiMya0aD?kwbt2gSZp^Kur|Ha5|e0%T4FGmQq^J| zu?jkkCXF~#Nl9D|X|5epj``~E*jQtGed~gGoyCQf<)z`weDauj+;GiJx7@n#z#T|l zcNdwLSrWH+U8OJ09g(oYT4-)}O)TstwG9p~m$$Qii~$o0&VBW@!FVD$^&kTID;;Nq z?9@zY5;b`C6o)L5u)9DG$t0u{6K+f4lFG@;sL8Cz8M`155HGO8;SjkTDW_#Lg=-dD z`bSI7yZ+Q4c0HC?b!FO6!fE&XZ098}9A2~h_nP;~Z8u*8R{EOm7rGeC=ezvTK60aO zw{9mrhX&|*pywxbkLa55a0(%xXn(EUN=IlsxRxQkFu5Y8R2P*)I?7v;7WTAl%35Jg zS)^?cNPcA*5rN@GJu!kc)fZKnTRP|Wq<0x(J9Om&>0VYD3H-(r2dme%93dng+_;52 zNH~QV6R~qeq@Cz(TH?xUBGtAiS^C)^aR{k}&V@A$#7+CbGtWRy7hOoN<=n<70&X?+ zxU6ewxt09t&_WPvFZ2SuHx~7o_Zd3?2YaBBX;10YbkgacD7(V9hL9Pqbz; z5i~lZQGlqiM;HCtNIE)W!IJJKq9p=?BRx7%7nhrmg=*165=!O6YEMotEj5&C3rJU0 zeUy8mWkTIXlhSg1 zWhN-oXeL$ZIO<4}B~tG!j3pMPlRv3CJ1N#?5?fa?iLgeJD3Q(lCYUp_Y*A53DN%V* z{K(PT^`ev(RfO{bIcM${wn#{J#2HhaiRoq%hvf-N$hFXs&&GVbjd=hdFauf&X@}!n z;wEL}eew-)(pZ{EwqOqP$STr+GT?}Egt;D4TCOZ(9M*Mi%SOw{R24^IepoCqG1b*L zxo$}>sZFcYHj`>+nU=Rh940}diPQ;L01N#$7JwEbh(Xjboj{BNF@YzTpuw65KKvlr zF)7yE5@&T}xjCZH5XUd$SVyU#BPO^UC|On95g$Cg_uRal(WzTa_2|_?VIg~8_(FJ? ztrGk~u^1_~)7ROb==tP4;d{baVwWfp2fJTfN*;t3+b&SyAyT9Hqu4GC(RQI-SPMpw z1!=ldUyKj`ivnTW_0!r*0q#?^WY0xcY`^)gs~+5W|JE~a4_$id_4huy@79MOKmVL( z#-Ab;ozA1Tl5@6x`bqol(g4TOaw1v1B*A1XmqijuK#%Q-F$ip7rY!QL zk+#f2!;*D%-q>DZNf!%1Hqm;JO;v2FzM;LC6vR1=q_<&V`uN%1-znOak~3v%HE#I! zog<&Qg2*`gjAphFXBYHI3e>an$OrjL3WdNCoVk!o^U__vzaK2OE> zEg^Al|dzjq>u5dqlfjsd;A9Jy-Y?!TL6X+0d0iO^%g^?Sa)5h-~yct7cOK@aRx>^fr88U$jC(Mn{fa8b&{d8@9BoXy6AedR+Jfx z76&oH&f)yOv*F;G2X8z$bC7i3!M6?`v=Q4uDB`xtgZM!qv6+d{qKSyM#_1h`HjBXs~`Hk~2QF1!hj?E?sNpzA3+=`^703RI2 zXe~+AM96Dk@=NkJ@+WvrGU@k-lb%aj>3n(?>7*;@FnN-EmwbyXhX3JKGD*_u z@5wVHnO4#rWEZ)J+(7Ptp87lZZc1q(y$(K^m$677m&Vi2q0y$&Bjf|n$A3Wreo0;g z)lm8qI0@c?hvzS#onMhR$l;m(hWq`0|M%CJ|5O$Q&TasHT@QD~9`*M|6PQO(WR7^c(hLwwL{xzRkX3M#0J+pij_O zSRDI|X@xuKe%N?Tuv2^3jcka$&TgX*(hl|ty_?;~D%jKPPWB1?jNZ#$V)xO5^i#^% z^YrKRH|%}(KK%pxl<9>KSm4j-pV>Bchz8iR^zZBo_8WSL-Ol#2N9fbEg)L-X(3j|k z>@9i*)3bNkTkL1-EBZQ(WFIk!{hgk}`q&6NkL_g3*`ut1J;b!^=kQq(_6zn~_AXt- z%9zOBWY@wc_FMW0JB@X-2iUXh8)}Aw#Q{&%Znl|S$(~|QuxR!?Tg%q5gWzT7vuXAq zy9698g?U&GZ19z=ja|l8vn$vryO^ELy4XgxfsM=D&A`5?= z*X9;F(_`$h8ljk$=4Tq?v*Fki@o1V&6VF``(Ti7zthF*ff7+i+T07E7otka8G&RUOt9AGJ>%zf$VK0XCVxC z1t>cT93mY$oR(ZqZX-XS4^R>p5p9MtaTitodeq;$=nB$?^Yi4ApW=HHoj`g&JU3m? zQy+um+e~*N=RNg`2Wf&__i6HH*dII;39+F5P0XCN;;fu(#P=R%gGZ|xnv8R%RH?t6 z>_eH2><6Ws2mjLvt;$@pLoBFp)*EV=wv2R@wk5BhT(l?uqQsny_6E(e?boduBx^f* z3dc@calyQEa>}-(EROf=xM3u)=jP_R`)vpAzQpyNbm(OqwK~?9jiwCS;#YIj8aTCi zG4b@QEj#@}*EP*o7S^4cz9MD((g(Kgy#1-g9j`|}_v5|3TXN!omp{E{UhrWO%dIuI zN>x-4rdSz^*Tc0aYNMpI*hFqY6S)@gl29Aqd(-rNFsJ2Xe+?l^cgN!G6oj%X z$ZDXw0hY#Y@(j395*Z^uWKWT6;e~!2ib5KBl0C;tNEwY`9`Y;rZ1#ZjMZn~L00{-|{dL=6WPjj+*OnH%nLkS zPPdTD$a3Z*O^~Up*z1si{p4@-KH9|Yr0hZp1i9{&iLng^cmCj%srRzq4Xf=t;+Kc`-3 zq7C#R@)Ui67SUfq4*ijQN}i^_hm77s{tTIW3wab_4GVjl*um=;vF)^uJwlS$PWlp= zqBoHuR>FRPNWnq+2)zWlO$}{<{C<$wpsk)mb>QDe=*RR+@&uwa4wgzkBNx+dI!Z60 z=hH6wDk2dtQw{wSxWN%vNhbC)aE}7u_t*4Znoi#$Kc#2GYw;p|n|@79)BtTIo9>0q zbv^wr`UbSE!*m_|8?Qm$UIq`$Pv~wsjo8Ns&7@b*9>hKN&^~%CIM9{!LfS#c5sL}Y z&D21k3*#Ya2Ja8fOhklF7r_7q2QoZ~t8kR_FGtC$gjK6@R?VwjwWz~hkY;UcUDbp9 zF72vS8GXhSg}OK`J*rR?zPH1ROGv+*{siB7^getqr4yuy)871Qd&$wZN`R#wNY^uW{Kt0_vaNMT7e^$f7$cQ(RorHD(iR> zM?zX&US>`*DNf0<*DcCllh9|0=`f^eDwYmbH*X;K<8Upz|Frw>Kl}c^;rsnp?W$VW zRus5@3-S-#aR2>Do!`$w+(T>8Y7?`Gd*OVolE6_)>eZ-jb<}5)&&b3M;Xf>zqT&+7VgO z&|r>6DtzQ5R681s+J=U>h6br7O>Bs0YG_!fSBqJ=+A+V3oI5#1EsF zuj3Dg0{=LO6TIIxVv_vmjr;%f+3&x4?(-Y!3N>XN$PIhtl$tZ&g&O%NBm9R)fHZ}8 zeIH5Z_U-XUx>CDPt^J)HwhIt8B0Em3o$av6#|4D{!0~!<{O&tZ`(n5~Xpeb#DguN@uySx4s9jTrP`byTBEj*;kMQXMnp0!3_u4M#PKHA+IX;QNL$WGbiEV zSB1G*a<5Q?Jo#TP4Oa;NhA%zQ@2iBYg${n=zvIh}&pGx=UgKo7RvmL6rQYoK?6t?X zaBTY6yZ)0xet=iEAbr*O+hLB5q^)Z{R>{AmWEs4HR|y}3v$U5 z@c#2M7n0wFGkOb;Y9qZ9-@NWJ#A0}wpNBtxTqd|M`we zg>&%>k9jyow!8 zuwCRbe82F5PNRGN1v#P7U8B=PBto8LmBi)dq8Nu(n;T)wjYlZPO7td;&2Em; zMT*)8!9Xn?Br`v@x~`}-r70qTWJV`qS&Ti_;>?VI15Rg;vc?#qwfacWgaKsRFLGAnJl)YxVYGyN>Wo(%{WMCB-I?3K;q)i@v5w1)=-@w73eUY zf8KR&ccBAjjqC=PyX1j1=2ynGY^vXu8H`C-WGd0mjstM z6K-PBTF@V5_Pm4!j+#B38{6Qd*@_lINOcvvA`awEAPRQnh_g^$203y^ye z^*Rfl%FE&5{3)!MyFlCTz*#>9uG2(*O@0Ue;w7N{KGFtDY(5md-;`&W`*fLgm@ zEmL@2SHb2%m=4xMp3L=1;Imx|ujMBAA8#k;z>~WlD`P%NyRsFV%KK%lb9K7Yg#ZSHb=r3-1{j6)BKhx`l%b#qV7$-&Z zE9XXgE3=BsHO-|9ooz-(gDzhn70xVEZCBwb@qOB;W>S!nW-e>ZS{B!-jpVU8>|YZ> z;WNS!izNjl%^uHkMNkspt!OS9L@82qv1DD@qU4b?S6p6jkt1`$-eMX!cMq}ZjbcQk z*`bYQ2+nfIA2lf?Ge#oGrU=1FQp|Rd#KPro1YM=ru=WY7@W5l&gKOSJ-ohL_4;YTZ zC%Xi2%A}F_U?m+^nzd5$(?_4X@0aA=U;GN(&nC!CiUP1%r(i6g$i z4jK^)^eBnuz(>#k>TWziJguUvK(^6}>T2?;^NOmA$g0K5szw5R+ncwRH2AZ-o$Dtr z_G~)$>IH546R+KS#@ZcuDKT+|o6fK4|Bg1}?E7tn<-&vanh)F+c^Qeb$FM|_Xo)1n zIw-N+WHpi~lSK#Xup~OmT-TJdEOMdI+Q7gfxXnULSUYA*z}#7cq-)&w%WsSYxM$M4Vj=5M{7w64Us4r8M8!Wc!Zuwm$G2>8)yt@oecJ4y)aeh=8&+ zLYu^qa2cW!c>ggXFag9=$O}Jy`Im1WCYeRLGOV;Bm!E&hxqGg|>JD}{JXL$)c|XGD zCB;e6X%Sfokr_pKR)?{yBBvlludOl@v4nRU2k<$3XkoW3_U)j5sY(x}4&Kd2*;NGR7PyPoj-f<&`A1EH3YJE{jW97+Gkm>+WxCUq6_g zF=`m{t(w0!#tcw6?eQXnCoW4ViYp^ErR4?nO_c>iN`txpT(E&uwNdDdK``5ZGd4ZK zZaC)3k>g|tYUr84NTA8#;C7vSIJm^G&}3)IsgepTR>+KUk{U;z!=ZCH991R6;pk|o zb}TAuLb4*GJFBZM$>CVphgA6JSy;5(u{y=!XmdCk64G)U(prZju0So0{-?xA60zJ5 zh|g(I7B?JT1~9cwyJDUc^ycz@GDOJwO(x zrjjh^G^yov1@a;cMsf=)vx+N*u&Sf8Y8hXj&;-f(4LHM>XhDnnpLffxq)U=WwuGai zzVN8)9ONcqE!8~475QHSymfi< zSs@%Mf)FnV$!SrJbOLq(AUWkzITxq7ScPJ-h|VmF0SLzfy@CZx{{)R0Ym6{xi$;&- zCeT9l7QrOfm@P|;j!hRO6v9Cj*V0wmm%2PAxf3tdt6l1xP6#NRCT~3Kwi- zj{fiHlO(yte>-k9;U69KdZZ4jdN(Zj#wE8D^oAyV9?2izXTvxf^p9g;p(2kzFyE?Oxah*DFBlr|4gs{KqxVKVsq}wmKfqWAo_rNF+buu&}jd?>OeowG-9K*-mm70L@ zsgvGdNZRZT1cAa!$4956)}`Iu?X7)b?D2Y5jH`%*o2wWog{CIFz-4J5;Ktko-}rQU zd_jIg)EY-ON4&`LaZHrFqd~7)^@kE6K1S3Z(&`@{@(oW0fSyG~MebnG3k>#;OGENl zYk;yKs-kgk$m0vR0ENvy57NG%Ya9rWlRG@=4tRnd?~og_g*giae1jpcX9D2nh!P3{ z(T041F|Wtv#zgT+!fDVqKIk0`0EFYN;G|5Y-r%^4-xGw5Gas-5#69L4N1Z;ue+j0j zb8a4=3SL#7<-nABr3+2^{GkzE;2-rUNgpshFb-HvNpt6Q0q=R63b2`8h5$~GcOcX` z)IP4jauQr(!pld67P|fZi7lYCVIaq#-@}QTwtLF3 zux-9HF*z{m8okkrZ{(CLx3_)xP9ljI#k6G63fxp&k()d_kzrq~UP2gl=> z8uV@RN@d~Jz$X@Rqz_Cfmz2-6$e9lC3_w@whOzx9Ak@_SBS;_HrrJ_Zs862gV~fLg z;4`^ZDv|2yC7)C$m2L_6KsejH0lzdbg)_{KUy?He3iXbGzk-*vDa=qI7LN42K&X&{ zrOkt!#ncqntm939<$1^4zA%GDzrd5h{iU%<5EiHMfn)f(4;&dxIKVkre-C(hP0ezz z+cVYQI|3^5NJENz3Cn_EG=36c6RznV_dz~*B#%r;iWJ$3+o-%7o#b5)Cx?L6qtb|f zVivXJOL!GU@_?;+f+G+-9{-@r;~U2H3ifdP9`^x3T^vc5gI9YwWI~f*ETMqEGvpoP z7ytkk4Z6V>aB(1qKa|cVg5%=#@s?9$5fGo0z^zF#9=Y^%M-Cdtl)G z;T);Hp&uX~_l&B#j>?lgec*b4yu!DoEh7+BK(SGoMe(UUp0z_-Z!Rk-t12uhEi5e$ z3nq|&rx2_SU=5&4ZU_#DOs}(1Z5iaMXeQueW5aDcu*nYa2=vvy^ z+~sO(?rT1M%sYm890>S4K;{W|Xv7tm9EFSzdR_j3pdT8X*A?^+g|=`C^lup-^}8V_ zfWaPKO+o1(7^im(=Pnh0y$Xv~TP;$P_291F0`yXboLVSBM)^SSzTt69pGzi$@nL8_ zr%nRNJY2Me{Dc0{AYkPl9q|W4vJ97H;S94-pvqB)OGufD-3s!D6(I#QA&zuh7(0Ii$LBQ7Ilia`~hM-^kd^>Oc(uy)no<{k0|`Z?mL-39{5N>pE0 zFDefELq3@=@Z=!yJSd;|A-TaQ(UvSgaDxdi*OzArfsas8Xu(9eq#DGyy&ToiISfx$ zQp0MfqGs_{Mj;{g+#+jz9g-DZJZa7!SI3c$qE6`woDi4`c zt1sXKe$Sw?8?s_Fx-z50WU8%<`8*&!1w@cJfc&U$+Z^70JefHs zxVj_{Cnr}HxV)zWzES83GGhSK8iW$(<(5f1q(%?A(8BwU*&62j78TsU32!0qpej-t zRna3W$i2StO+5kc1aPf=YpA9Ml+Djwm`smLu8}jRN-uIdWD%Epw7sL?IUkHH4s(`n z%Jr%0DpWUa0eKWo1}#qkAJ8X^i!)dTz5rSq1<#m)GA5ndDl>M5jBMO+ff6}21|^2` z8d(um_&!_#M;*tej|cL&3j+pfN%i$0{GlSKUpcw$o57a5xXKwe3>B`=bzD@HRS(Xh zVaxHMapklCCc!4~Yi?h{c*@2Pzb0((9o1s7tj(fnrz*7}@JB%4pd4Qij0@VP&YH?&o*?WE&sNvKl*{Xx zISmBeTfE#p40d}%5WbLI&@>lwg%wP*)6?n?1SVnM`Nvgh!KG@qKhzG(b9kh4e8}JJ z=ij)red`40t2jgX8gFPNw|bz|gMNF$td=9<67NdI^l63q+UYq;qw#E=soKfS5RjmM zc$}ll=<_(IOI{m>xEH6g_7zkvY4Q6*P&(Zcy^1$L=1_7IivMBhIN;T+@L9m3SMdpW zJ#+Jy!vG)M>|L%9fePG(5JKb79=f` z^5^phii{^~Mpi)PHd16<0|x|{n{3O%DhnzqkgDUu0^rh6R*h8=Uo=NaE%I=lAAnP1 zbjl@n+vP=vroagm5pU$Wsd~Mve021>+B$oiTe{j^J?+bvboTakF70+fA%Rt1KLsHN zoeWeRfbq832P=-7TSdk`uz*>$&lBeK(A=hYf88OjPL6{Hxxfg!bhsGhcEOC^z-1DA z30(8^%RIx!X=nBh1JGh5%<`lxk|E2{*yIEp6aX(yA%eJC3A9F^!tMZW<8hBtktB5v z&1jDbL&C(u)Gsh{7Y~OpXGW;vozW3yd!}llVPsJRs$ZsKDf@&PSkXUKld_GR_JbS@ zLHSPYim9MZ$K-_47g_6*WcrjqBM>10kSN#al{{Hz2%AmNk^`XO6SfpquvAae3F{~V z{vXv)g=g4bb;4F=5#S%S1UwDOk_D5>*+sa?IqFB4FJNxDvBl-;Oxwzx6@4-knBrv| z31n9Y^t7Yf?t@njx)>A^<$^74=pDF%t8CE4U@<6uGR~QndpB~e52Zyg6rud78eXk5 z1eX;TYjSoWsDCs3m4$K{KUkGG)K zYLNl}lzyj>(653cn?^=271!FC-whiq#GP42o(7 zPwF=BahWp?P^DxDMjD(7=r|yL+;z~L1DLzOlv0_C1JExh%L|DzreuO`xlULB{aw8p zm?0Byc>a_N=alnU}i9??WmBLi~-^1PF~`Y z8RjfX1Bph0KsC6^_{_`ZKV~Y(L35G<_ttQM3*i8u6~vg*0-_sGltzLaI(%xuwtapN zZpJ;oO7<9L%Hs_V%JYPFRIZEr!Y#UOGgO-yr?(4rXYS|-NTM6S7P2HTJw{Nc{b zX5eDAQDvr)9xdY#8t?|@=FDI>AbjF{_tx3`^5a@4mx)oPoTFNpoA2Jb38FaMNBKN7 zIDrU72nI0d$G?R;NWB2{m=A>H^KkQ~2S|>X3`A|WpR-u7Z<*7EJT*1&194{@#3!PM zFzH5WYM^J<)GWj)tcW@;cLtFM5+5I~se$5;--Zqdd~cvr;nYifZDcr;I-&$6FVX;xP5#<}7vJ4U$U2cFHa5QPheJA$DK zz~92vTcuCO%3@w;=@z)ZT7mV7Sm9z&4bs2`A8^Uc(FJKH-#{V8A+WI#5GdHVk}IEb zFfHc-Wz;|7n;XIF0agPLt)uWFc{qLfJQy}NCwvo|D}aj#e@x-DNS*rmoAm_9!9>6fjss9O zj|(WWM~!SM30|%Wt68-`xi{kC&4Ix-|DXb*QTK3g(>R1hYuJ^&Qo+k1Sa|_BS$U*) zGqTjcLYNkU$9q-alO8IP)!QQOkIm`zp4u7=<;vl|$Z+2`K5)(6iEe)g&MQu;9J3IQ0hVwI+j3OBZh!9tH#ugU z__B+CJe$XIWY4_3w`&Z+~x36Mij zbu>aLmocAf_%oMw%06UIj~vgF(Lx!>5+!uitoVGuC}w7WgF6tE{i?wsnN7?z26aLX z45JF>Sk-l8r5x%E>;UwaGg@z8CJF5j$jYY$Of3j!5|{1pk8&rr7Zy5%3i^z&@|==z z5L_-;1!q(ssCILeAD*cexcRFpI?w?g#D|o?EbusT2Pmgya_G3|7p9DZd29|myZi`- zb0p?Q378gl-Oqxo=$PX0EEKh=zJ7iwE}O}34o?o$CYaUS&QxbUSTr+NvYjpaH@SQl1gmVcc~#*Mqf12DIWUmpy=r zkuS%S{5%9cV=_U!s0Onf{p9{efKLeqasr#0<>+$YS#er&J45l@D@?-0Ie9onz@5ba ziE5H?Uz^MyTH$AIbj~&hYT)Yyq}5Biu|`3@yJCQCgn9$v0%YLv2p)BYf;T#2gt?{J z3Zq_b+RlVK8lBt^!S4@m$c(*sTm_Y#N&IS5^*a$F~p$5x5{$I0a+}0H;0KP6XO3lUgKo!roQ@iD5UkaSO#iCDZGP?y8ob z^sdJa9-%GHjDaq&HDnJX&<6}vz6pm|Be&dU2L8{htJ5Yyf&v(52NNgHly~chTlQhD zm|2-2gQh?Y;wr3UW&3jO{o@g_(NU;L3OAH}{WG?Au-8B49r160Yf24haJO=R$22@x zW1&QgyW9IZyE~T3?X=D0wzeK5~RZUcij*+m{;1Q0{kZNuSj1iaxVIq?-Wz#(NIyj6Kb+y{tr9srP|#^F9I3dIQr zHX}#nTeb73@ernS)EmB5Q7&c{OdXT0n9Flk!a(1Uwd~umd4)(du@pOZie{@uhest= z(&R|&T7zZVT5Ji2jA+_RFVOF&S&V9Pv#rQs_@nwnQA{>zs;SO8MD?Ox6pR9+5hWIH zoYR2IHE}E|Dqd&O#8I7&>hp|dL8tAa5mXRumMA=*%a{W@5Fjb=bKW9$0j3%}qT9bfhfCM}bz)LlFXilJbT+Jq8R}EpNU0x!$i@xC8f~|e9 zPm+M9aVONrV>yCZ)F21{TAG73$Jo6fLeS$E7xFflm?WZ8Jm1J$Q%W>w!y=e@{ahyJ zVHLWl(>S!qi4@|{H_CK+0FUY;nWaXf)6#N&PYsR3cN7({Z!_*_6(!oJrx{|D7(p{y z=iw?%M3YfuS-dLC$1`Rk;}asXTzs4}DI4~15?O0zM8rz$NJN;OCTJE5CS9~C#vCp8 ziIyqTM-s7?urSd zf`$VChlpJxM2$wI_FSyheoqVdo0Sn(>+q0{0ees!^(PfmEI&8su)DRmQY&D8Zc&p@ zH`t{TtgCJ!twoFo5k?kWtkDanW*e~A+Vbca>ck!lZIl+^0xB4tnsiIDP)^M@8WDm0 zfae*kk+DKM?@pY6XEQ~U7NgP1_s*wQ?e-XAjur8A65E)iGix+v361=95tyv!-otuO!JrX|ZHU(d27VSca&ln!M{HGsFxr zM_*w!0n!{_)nB2)jE#tm`Zz6C;2YYtK#&3sZx(BeHKaD9Rind*yJb~tSrb62;h2`3 zmy8F8^fW243Z+q&$nnm3<(6_wPFfOXD)x&!j@J>|GA!daQoSQDvM44o*3gl!G0w-6 zrSY-lc2S=W;%TDT-UyRK(<5mb$UgLA+=T+LAp&?Eo8eI}DK|ixV4g43q z;_RWI1w9j^g_IUf!w*$4UA#7}k+Y84Dn=J1GCVZ;@ciMXR1g&~h|v^K7HDg|o)s~U zBrLI<8SM)-G_rG8zuK8RL4wm zs~maIh@4Jh^Z78fH2ZS{<#Du za>}_5vMol2t}+u=ouFx@oD4bmAwH>?d5E6*O7WDzFeS+q^*3pxOcE_cY}z_xK#joAPm%4~!H4=OYo zAr@oS+K3s?XlZJ7gf@!HfK`A%5sSs1-&(z%=~Bci1Ts%7(^D&TXejpo4-=V(?!`6r zA`!pAo=#|8ezqSHl< z8T*mf5lxI8*!+tKA7hIE2kK9oZo%1u#+A4pPr6epk}(?(=ss#B+C9cB+|PmQu-Cki6q@JT8A;3#lQHS%Xnur8sN!|mhQ-hy_AD z*XVN<&W2*} zG(G+2aANjXa^9Gpk(qUCPHtX)L19tx>}sf*+PeCN#-`?$*0%PJ1q(YDE$&*LuVyLCEk+bowPH{-K2(ktU}ldg<9Hf zEHLI6)wQYITH&iI`Li*6MdKFKnt(cvbq6!v9Ip5Cr>J16aoIMM;b2|bdnbA*U^d`Vu@0Bb>B z+zFqiY(em6PGp-F*&eKaD=bt`?S<1P*L)KdLXdQoq7FBcSq zKR4qiv1$_!67T`S0l{4-cuE8Yo%&S4AR_bQlN0szb7~DCoGdRWlGiDzt2A%}1h=`c z_@6wEb&~%3X)bJa%c=O$h5ZByLY32?$!4sR>`Ai){T#!E>aOw0=7$Ic=(QAyF*xGp9i5B1mwLSCUwF~3 z2cP`m)6c&6`nm_dpO~c68%@!%Rr70ZJMfGDGR(W=(%W>#+J+(DuFLFx*W(|3ymsK> zM?U@PNN?YsYl@1qb5>lpci&An-+J3!k39Oc)?|)Ju4!yvw*S^2|75Q&J|Qi$q4AyH z{o&&y&pazi>6uwM<<&I{7j^aYu2{Kx?Ya&9gWjP{!L6sCdH&6}-*fL1uiSmlxc|9d zy?yzHwCx%}EEI+WT3j@}6V`<-Nz5>C`=U*>=1t$ORgDW%H_VA0^9)G@x%OkXUgR@AV z=Sav(ijFmO<7RD^c%4zZP@ip>G_^G3X=^n`?J^hx5rW3FM$eK5QWols)B881wVRAu zOH_>(@+hf5jGcbC&eLmNXfSrPCoa_YS~_*cmHO3bR-?AVm@F*loF`zz3+;TgT_75# zKa1DZ3dt*|t;}-PHA9o8>8H={8nm2U65%lJx<<2e!Jda}&Utp{d|jTnPMZZ8m!pZ= zac|A^v!`e(RCQis(iyIOoon;^zTQy|OrP^yWbjK@s)34`? zboz-Z0PE27-*UU~4jOiry{)T$`l&jo=qogd6>NvKK=hbb8mI5BPPPU6B<9uB)^{#ifA+;FeBhBEJo}@UUjEH{cx8l2FtwawHh8>eUwX}TFTC`!#hzPJ z+uphAlnschU3BRIT=C2c@BHSyPb~KKPLFr`?E4-)`1osYeDbHWzIDOP`wu?;%yTcl z`OAg7AN$F(FTLE^y>!)@4X$rryz9FUe*f_&pMCBPyCe3Lb)Wt1nr@sA;HFeyd zlPk-@Wzx(D0kz8pz z-w}7V!Ih=8@3_-CeTPQU?MM>h;fX31D?}aK8d{y**n|BCSHRVgWHbnRK{w+&GQo=z zqv_Tq>Q+I~j5GI$tpe-{(XO?bYsBPCmoz4B%$$B+v-4gdLAVU5mVh%<1M+XzBQ z&?@ek0ue|dlyc_`d|T6ZqNpo+`cr)!-s#W)VGQRB+{`^6`@|h@%ASv%_e*(N6kH@u9~2S=n?==cxCY?y@ds1+ zf@1z?;hX{p-@!@#FoL2p$WIFL2P;%vgt4lU7?NZq93 z(DEmi99nVF&19uzf78mF-*{pr`Mk+J{>348!`EbBnmy^6r#tLBl=7s1Pr7sWCB-|g zE~#+t`LcD#o&_D)?$_OX4HyPZM`kFfDQKNfahQ(QZhjril;y7o`Us9Zl zn=1D8rnnFHeX`NLVyXY|it8SAuOu(KS9yQBZxwmdxtbi>x90A5ou~ZaH;31~^1ge$ zL_XT^2|d%*kH-v$42MWl#9r!)I;8o?(XZ`@->aRF_UigG_8K;4A2NPj&~MU}>@{6h zddMX0-)kW= zcVbWK;Y5<*OfGTnOYYxzIC)~snKC`@O#RgFPW|M^`%<6y+2Pce-f&7yhYw4iyz6v+ z@*B7Fx%c-uPyK^4jr?g}+9zKgPXFS|vJAxR1BD0}bA06i@-e8(Tm`|ifT}7tvweUX zkb$Z)vz8o+VF=GUApD3`CV_X_6Y7PR6Mp;Tmp}f7Yd$}EcF%LM-%Q-`)|Wq*(@Woa z^x#+D-E!o!FW-{W=GQkhe|+i6gZ8g}Bd6=WI`fjdQeU~K;Hy8#>9h8%D9u^7?A4C1 zK9$qodtv`wyY4*oI`>y!$>|p__$Yl#+O;2U|4PLBga{ey-P&|%=a28c@+-5PUiH$0 z>!%{?c7FG(XgNJ^<(EsUu84T*#jld&^wQl6tNkBddC70T%8=8~)$GiC@mrxc$kzpO z`qQf(zv?G1pR+gd>k2vj-ko`|yNwkeSAJb5r!T&*GVjab>ic@WZj;lsjnDq+3!_edP<8KX~beO_%TedYzm;`<8*zGe+xg0$>|Fgoi?g*4V;_# z&DnCgx8%u+{v(gR(D==Ta(YG9BbQ$It?nz=eshJKe(a3giHt3uzZ3fAS~Y0YB(^7U1V*{rX3mOTEi$wwG}2Yr%~_7E6Q6>oNY7p_cT| zrCv+p%j-seT{}i&X<*dS?DAUNitm#lPf^>GrG@47-)9c6C$@R%-vjLx$?e0#OaJO0 zaw@ZS%q@$A*u>x0b;iA4Zaa5h75LkK5MNKYXfHgPBP!)#{qox0WYnWs#w+;9-#LT$ zI_*7@ktF~6?fK=-DcBcmT{MsAMxA(n>{$NywQ;_tUHYNL#6#@c_V<;R)etCe)t6I- zy}$pydaN?|Z`13qy~ECKe_zpS9rn(xHLdvyCd+HXq17qkXAXw45-gY3qe1rkmXn0; zjf8W{>jSP+(NT%#AMPbMFRy*idggn$F}|7*E-$ZLdEZ}pFsPsJO1QqfuBweO4)rtk z3nc_DuXmY-H`E^4-jInMF8{usBt-l+$=@7SPl#P!511uHmBsJx>n9{FuQvql?2)aC zNnRjiF0W1EBNH8?>wa((^Ox7nDte2giKWZyPb%xa@_bwH*Cy61uan(O-o!Ku zHChuJm)9ST2zz`x&K-G`*uK10kP?jOElBtjL+o8%hd&uGInvgZR!AINUMs1kCUsqo znQtYIFRxdqC8cU>Uo06T&MvR{WA_wJ-Ojj0B`qwk#jhVrSurKpDugKC-~ZSo9WwGc zX+?}8iDh|xpC$Iee9Vd=0}|&y-k()G)g>gBX;1pw@e-%swWPYA&{FfhMOweSmUy2@ z+A}CzkxUX_UI#C!osf*Rxm`(;U0$mc2gcs#+1B1oQd(Z8uO7$`?ct02PEuQ5ce#Fe zcA+ACjGe5#y#C)^ujN*h`8ofelYe{jaTTu@6w|)|Z^ryuB`N7LNIww>hi2c{Uh7uP1wZEVCKm8WsdVshX;IvqP zVf4c*uu)Kg9|894We4x@NPzzD6nGh}_}uQRp9ucU)u~KhW0ms~lVkvbplyZag#3kx zh}7=cx!ofq9bOeVIx1Y>EiiQz5L6qrVDAF>L^B)DW{}3vpFa2jno4+xnHL7F& zVoU!h%Kj@V_@92t3At~)tpCeTxh{*j5T9CZZt+(Jhq4-p<;CB>g_>fQ^B0z-cNdr2 z!c-NYR&=?l<{#e^H4rGWM5W6=gsOi(3#%BH<%J6WK!=u_xnPOI-|iRxAHQma+9SMC zf4}poGd6#f0*A~G{p&9MdmWDub`x?ocl-A@F3SE}1HqX6|Er&n z!(ur+F(~KzN9p80|AwBG^)jgQufp2%E`M((f;r1L9tv;&!~6gGf8725@2^BRqg5{t zlA!DYm!eo20X9_K#5XhOUMh1$x@%-`uCt)1k1R|ZF$?Mi$zcbN{#A$vM0*kJXc zQwNXOGaOg;Wp<;OG7)6?t3JNoMu4lqo915Ykm2+r_Zt)r0$h4~*D&l784_$_q^wyf zF!{NhRid2;b<+WbJTp{~ikQ?+%b~!afy0XxYpJlpmeCMPA>)LCw4jsj*f}%pX}{$I z8d$wvNE$}jM&l!$9mSUhNV; zRWbzXo{~QQiUf5J9g9y}5FuvEjIGZ@3J8@X)746euvb6f{g@ja)~Rgg$X&uY$9~^~ zCS908@B(Lx$vq}`)}fwM?L&aCQ*xgzHxaQDwZ5QFC;?1vyT#4S;b8S#<)Kt;Kj-VS z`RYs$2_hnPKjXocc|!8B`LRE!5aj!W^*BEFk|*I`G8D*Ak$C7{s|gdFI>=w_bd(0| zm2DfI>M~%J%BC*)-3(~B7MfCSPKI1znMcv$G&uOvScrjl)QYeNJ&a zcc*|8dBEzGIu%}I2_{ow$*}tIzB?7eWa#*~PhkKD(6BGwGFCc5gBP4$9tPKNrb3Re z5RVcK`ZjytypELYkIyxf{T~_d+a_XlYb6D4$?uK#@1()I{Ts56ZzO|;s-Gs&m%P;NiL|I!w6s#1tK6h9-_hfnfnMcrs{Z=|T*+AUp2$N0tb8 zE3U{WB4@;EJ27zq_wVCxB@e9%h+x2H6wrJGiMWexK5n8oJ2-Kx6W;^uy|?-Hvl&I4 zHuK?5vABB9&vSp@F$(Uw)DMk+)l1zlg2$iQiIhKwDYKekg!frlB7z`HhJ)EFI678R;KF^ju&IkUm-TDFNB&|4`0$3U z(^R6u4w;yPZ)cd`de6bo4R6@sMxT(Hh9Amkt`?f+br7M_Nh~~HmkRe*ZTz!_P6nU# zi(jtr(?GwWA-Nd${q6I6KEK*cgTu2eQnGy%PzlVmd8&`+*vLxjoHH4=MAw~H@}R+m z-&M*p6J%%@_2@i4%mQ5=xAPwM&|pMoU~TdX3aGDiwrto>fjgoY4Lrc}&@uZW@Fh~! zicK%BV2kDxJrT0jd_=Heo4M37gZ9O13)3qlGT6E)eXy<&CuDR6^AeeKZdZ!x$e%En z3i8jprg1VMH4R|v6 zM|`r0&_s>g+rdnM(RaaI2HsRK$f{YY-#~-BsFpS^v_Jl_DJuFxIC)d6$#bs;8EVUJ z4u`ZcK;V^YXyZK^R7SS0`H783rCy(F%(zd6Jj&cQD<(1|6>rU)a>CE`H9Mu>M1~`} znN^}SR5-!VYCe%dfx@$2{r1#g9Ph?=I&3cu8WswVT|?Q%q_V60MjJZVo5x?O(4&FK zwt?=Hd@A&|jfU?ppg}9Y@5s*!bdWt@=u;9;0+RcN;G^zj2+0y)_#Y&|`sQ3-V@@KR zzi*uwsz89xp2sTJ;Qi2xx>Z7bNrF41x3yQX+2*)6O_pOj86H3U^*+1`?^h~k*BloG z-Wsf13X!J4R9RA$i4H3?-&(nF>^%wU@5t`FkM>k$gJ8*4wCnemM2fhE5y8^`#GUU) zgyHfw`9(yuT%DmlG!0|u#4@?{6GRvd`3iqFW0UE`zN=2<0C#iq+Vw_AASop#aS?xy z!+1c6AxDSi5j~fKh0I`foq6%201ZB$d2y0@p9)>+`xDkmGDF$-t<76*Q{bju;LqVe zD&(1m4v0=-9MFP%{Vo#l*zMYEcbW#amyOP+;AG*$F3I-MCjqqgE8VO_JJ!E*vO(|& z+Rf;jW>V%9D9;WZ4~k&H19v$)>kJ+A**A%d2r%GmNKk+Z?*I1f%C*@z4*G3n&X8Cm z5eCoQ96O2UJ;k-kcN3WmV{i6*Sjkc0a_!gb2T034daVFXKM8P={kga$YH(5(#D8hv zyq!&|lPi?=5W#9s)$*;YG_xNE)8WR&v6^e94A`gg zGHyo;1Ds3rVi!BnUkK!K*FC1d)VkpD1GvAoc5UE}dqM&yf8BQDUlcGMp5J-;HVw}D z7Vr2efem&K&FsB~_t{0IGr%pJ1iH!dG(KSh_`~*KQFa=rn|bG6+ed{~@oSG)i!%Xt zXZz|(83x=oPOY9DCxd@h%f2_2G%)zqYcI5t43>lIVwZYpuwmQBlidd>5Pfm#c9#he z0%J($KI47Axy>z5OAyb+mQwBoaVk9O^5*z{nE=Prg-&FbkYN1LDRmbd|FEw}vEHtl z25nkS5%nq9mpbgp&GmSH>y?vV=u5M~gp%FhOfeIvet)_>caaR)ce6s<(7*j`;z-$g zhzuFmxT0q5sgQr?M)%EIBru&j{2}%LKymond5bOz9Qd4hIz|F#q1Vd!-%cmPgE8?Z z*_t>{_|k$4vnL%iU7ihU+Yvyse0SwwCIw=-Ha}=&iuc5%zvT;2o94wnYxDZC|rGO{drB>`I2|oLY z9{#3C1pQvk3ce;P_*Fl)5;mv866sVTKZl|MJKCKG$L_uvK)YC&dhhkN3=%w< zFnV^Wh75Kx2YFem$)GgV_#$)#+T*np=gfB`$ZA#nUdY6N;BNNJZ>_8_@Y!j@+9?XS zuPQQDz)tXiA(o`wdN`Nsrp5X1H>j|x^=4=|jR@Oxk}22UP;lbft{kpW?5Qj~H!XdE zf)IJXznKLEij&WD)xIKvyX>tO^V=veki>cP=mG_9N8WM$(vS8-b1?eW00WL3rRC3S zP{FZj&%2o*Ca`K}IBN^zeR4lv!+H$kx=$gi<1voP*t?szP>u|dS9Km`>f!|Q8qS)P z8>wK=V?}jFzi(CL_f@Tp3|B)Zr~RD?z;e-~=Uf~CipQPyq?hA$y;l8Z(M*RRIRVc! zjO#|?2&EJI=+N3KHW3}c2K+krd}&!^7>sG)U{s*r4E**o3;nHl^ONxBCy3xd&{;CL zNCWd=PLrlbBp_Uqu9n4pm)lB~`0^3)02{|`4>6uO6Cpv4jw6EDowcu~ACus#Z0#(w zDizcmbqA|0iC`a^$QQ4T=c_d8=XH!zqRM1`&NVW@i9JFJWA%8QQeBS<{$TtOsQBer zDjANhj|jbYn+UJ9?S_X?n>hHL)DegN@z+fPnOlGYyz371PNLmty?*yr`f3W?4QKW; zFagM6s|v^|!F?LXJg@SB3U>WBCT^@?1*z0{lb*lxwRx{kF9s07&g+GsbTa`2dkS{% zCQ>1CVb~=ip9cGME3)jfND#T`_FTW83Kh{Ei*gnO7@ynp)Owl>ca6`*Esc=jS)NvD zKp+8LhHbX2cua+-X{+Y!by=ZgOJXE*3&FoU{r2Is^%6n_;@C^5tt@ci}n zQ!IS|1v*YGgm5zan6~h#F2MNxe8G3+Q)D28t@hRG!5-^;#q_&ZFwPS^Wg@~!hKtAf zXUzmLUVi$>$;OEa+pS|Sr74gg?i|;GKjwd@r;`q@QC8T4FXtjy5HGkNP*DQj~ZW9sIbmjp;mB$01^_6H7R?kaHVbK&<-3` zBdpRiq1DR*eYdj}RbYae+H~1^OZ8X2+F0MDUTTmdf~~_|Cb+0nF*tjU0ViaB-u?cX0mk0smRR==VT<2O|E{>AHqsz;XYE1y+n&YwW@@O!4e4U3O za_-e$Dc0=IDZmu)OU5yZ0=`+Rw)!b}i*|01=XZ9GATlw*=J7KtQqtn>7B zwI;#7PTltx2vpD~vm{Np(qN@$ac~IQy@P(o1w2!z@Uecy-rChvD0~*aJ0pPtF6#a{ z+cEx0wmi7^+b0j580#>UKtFbzdCej zz1$`$bep#c2;d;9YP(|gZ?|#S9rKcx!6_1Kmx-mMzQkc}Qv4V75N|MB)ztTzjQdYM z%GxRf{R-7x#DSLpPwXc*pTl^k`e~!^w<%_bS^0Bw62?t`KAqlrJdgr6en?79c9B3c z$%NhX0Tq51-8Uj8VqVg#_KSl1DE7^>?Np5KuWVXiU6Ln)`ZE>p4<$5sn^wV?>8HT+ zm2vWFnCE8PwYLyPySBP1Ho_C*n5OM}&I_4PV8g|}J6XSJpk}^irys_b`{U_bZ8jlp zkv-9PgM$t1C)e#f+l2dNms+vWRg8zW#*cR$r@;9ZrfCn1XQ?Ndn#D~pk8*ChwctjC z`mt>t_t4MM`hL#tZ=ryu+V#h}vY21!@c!O}@veVHh@Sar^iN~jZx733eDnESR)rA- zQvLHE4+fARF#XQa-+K`!k>4($}>egwY-;x4Ek|(jdpk;76bsN@M-IrZ*Kb z!HjTo|D(%HFjoI{YHTY55^Fa8lpLXh$Ud_Md$drED_6iW-eU)SH{!tR7e)#0?i&EdkBk#u&cB4NSiVb_?K!kBEN!oVw zBQmp|FLV3>D$gx0>a)>+#V0RujSCT6CKWCRcaY)t${RX=G+AKcJCnUZJ?06I^e=DQ zhxu{R-1&wU8Yt}T!8Y$?I55^)|D%)u{VUA%bKcS*oKoKzu7DFt?37QMVSF+-ka2=^ z1LyU~iZJIL#dEEob<`xA0P;pel6DpWRATJ4f`Sp(n$o#*lZOdNADz4(N;5-95T8m4 zfeDO*?3Mk#;9R&0{X)(tfTHk?Di_;O{O_zBNvkHo%+0F;Ef~jbF?#SxaV^^0v1`1? zv?=iD!eeo1+!q((l1ewF2l)4(t(J71qaqtV!p) zA_)W#x@FJK_XXppDb0T23uI^!l4!=k1wg*Gt*Y@80d%qz4BjD?#m_1dFNJxFYq3qH zOg82R8&%!~j}qXf|8RjQ;sftIIG*JsqkYtoi|o^;!jR6nLZ7E>aDx8yV>K@k&b5A0 z9@l4sstl!&a1tGedpR3zA{d}+DM%aaKz}r-JX(!;NcX^OlX5Zuy!N_Og~K$DkDl(q`}4ut(5FcON4LDx z)($SgJb3!W=ZZ8UbaK{oI&CFEv=l>_g{kR4R zgoaK}IAgvi>J|3M6Q7r;^MEU0UX>kNAh!4f_jd#<_XB<^+~zR2;&GDB>y z$Y0x0Q1y!r0b&-hxgUs-b2v_8gD(lT8M~j+=tjR+=;->j9sP%BSDX6~=6@zVU)M?z zVW3tq5fz@`Lvq<&fcTw>E5W|>H{!t?>h%R0$q?JGaQ0n4GiqB>d8F|C#<{Z$>a@~f zv88`qwIY_SB<@(JgYnjF3so2EN-|vW5_}QBLIcmp)|iPDA|xE?9CUZY@w_h0f4*%+ zf2QpDlgAt2)p-qNR?m5rcV+r`VnS2~eh~vD_dTn;>2IAD+=CZ4=5Wr9D9BJ2C z25eLL7JIoD^X#=_#BmA(UN~hAycK1DlG^SXAH=2fnn|)Td}Mf$yXMn59THp*%4?5B zzwoe(yX5pL5~OFXihhdzy2eG+o&)`5R^^CT5aIztY86Yl95nFAdK0^@fdC~}%jls< zdE3!gndULSxl-A^_KgG^Mh_`=ve=FjEi+K@CLvAG4d+VP5Vlf%qJUX-3 zkJDh@z+|N>@(X*leLo9#(ZNPXu5O-{2IDia#ZNWpASzarJA-!YwM0Nj|12FRrC*cb z!u@i};MZ&p#tCcZg{ub&36NRN9lH_Zs}DRG#2EDF6EZ5}9GC~Y78e~|zZ!Alwi`zT zswg1&Qq#Q}@5}qR(ygj_BEb24j+iV(nC19#wP1dIWPLZ)wx_NyHC;~P)2Ii zA9H3f+8S6?)rj`DC{$9ON`qd@9kYfwSN#V$dZ`Zc>z=&Lf+n??Pe*ZCU1hi;D&i2Rg?1(GR9K5FAz`pL8Z;d&UiXjv?I%!@}kyXi_$< z6{F$zoVDKEgg6hYud(8`!vuJ0Yo53iM1Z%})92`z_g{WnmhX*XtxW0t5p`0ScYpo< zWjc=x-qGu>Jj6I+hV#w?v%m2)A7zyHFy=YMLK46BqYmV7{Y#|-B#dLK_*@hyFkI(< zq(lHf@w?;D1r=OB;JEMf6kuStsOlO+B4qU6TRbL)vreyHojK%3hPB15%nE4~c);iD zC*sNsS&DqG=k@7u^O6_<6g;;Z+()PHh$7y(EBTxT`rWm0VP_8CLc7p- z=GgHD#NDr0JsUZIIQ{RKo&wNuimNb=i7BmpzaDXz z1=(6h#AzbJoIippGx+&Mdb2pPKt%855K$2#yfT>AWMac{b5|}fvjkvXCSjbYl!tuL z`W=xQj?q9)Y@8#_81vAY7(SnP8n6{c27SQuP-EKpr)UoWLcQJ)&6r8R)_9wn<24a} z@H%928K7SY5IA$@7#XruQ;d6eQ9;<|yvPp3H|L#%_g;)+;M5<5&V5R3P)9jy&pu9s z9tmSv$^Z#sZJkWL%aB)075MIZ40(#5*((Xpsqma2DdNmbfOkg0C+~6N?CJR62lYQm zP`qP9)nR!8aP2S_YdAuJ*~AU^e|Mn7Atf@DkxE1rfl_=>p zGu*%Iukza&^YU{S27Og%(4+BEeQ*Qf->K=mQL_~IJ^#BxsSNXQm!ISz^iRJ90{Xf! z?%%*S-@6a(L(7Pgn!Y>*IG<)O_0ZYWxU);;lnTmyd!rxcUz-EM5NZ z;*&calarQo=hgdk+wLl z#sF*wkgfEnub2Yw3Rdb&KO#bCto3mt#Cy!#W0Id>9Cd|0W%LB`zsHoGnzZj^pzLj> zr9Gv9?&vDx#{}Ac8;>2&Sh)QZ?HU^;HK`&Phv!Dz57XRChCgxp`9EX)YA7JHVg&h| z3f|KcCJO#5V<6aw`Td69FB(;@65-kxhgtK3L^!TiKfCP`5g1DsYeweLuW4E}a;Gu(07dfjv{4ip{aud%#E0tc;8 zqKyn03Zzc%ki|IGyLyg;GKD(B4Try`BM;dzogQ)Z+}_&J=xlb9k$=1upM4t z1D3|TAQl_sjkYyMy^BD>cnB$y$G=ezs6;bibM4!!S4SQXxn z=Ur&k0b)7{_(LAP==x58UkktQT|&E38}#XA+B>v|ER4Kd^d~jrRkbuM>0KKuX~FiM z3|-0VMBAE~plh$X`A850-W2rMrN<&a2hr_2-Xo89_>rbQ;)5Bc>aA}5B;bg6z@d(K zdDbkuUlqnv(z~WRF0vwTHb@obQA3_XV&d^(oECdrXCh`nmIAVREjy3Dqk!cwhr<~b z)LGOUUQ59Jd9PoCu7>&gmhWi}Me68p-<*+ohWwqk?)PVNigf5REBD-3LxNE4_Q%^X zPE&S?+QW@FzQ~{*+`u80b{*v}%@L0wTN^ft;dOng58iq!9PO@o+1o_qC%*g;FxKV9 z{MJy`uhSa!Ba+AKeD|_~p!2WBQzs~(b|=^T=~)(#7jmG;axp;RlC0S?9R|qKpU1{0 z(V%YKO}AC36ENQS^@7$C1uAGij^9QVmjm`%m99+=$af4>7?`%)8y^EH7yz z?zYQ#uAfJa0JXc*nm1_>AbH&3kR&q=lq?r+bBZA^YaB&VcA>nb$?|ZD5jd@VSAfI*W zedO;AUh7ja?`T&!@tV&EdHgyT=Zj9re_E~Qd=-ZAX=cjicSJhqYLs4^*^73Q%CtrY z^H3VYiDFcNykl0|o!ol9N={vSiV0(&9i!l1fwiA-BLN;Vr*J1RnQick8pAxq) z@`&Iqy7KadQ*7||a{MkAoM?DY?>-arBn>vc)E=A1IRCzdvV!1s8knh7ON}Bg;InEd z6@KH4;+|dM5+Vc$qA?GJ9wmXGyDR5Qbt1Gb44*aV!90-s`;!?q7YP-x%M!iJ41*r) z92mA_(2kK{m2@P7!pB2G`_aFl-b-l&ulwM@LU_$Qj*rgvJX`L9c-EI@U#>(lEJ^Jo zj_d&7m=Cur(nNhmc1kw+2NA|Z?%wU)K?U_7a!l4A68t<)ZqG>rAPP*c7)OcgzC-J4 z?qgh2uKs+rM<^9`(lcd!aUS=c-6Tsn)O}U1qGpOA1p*qUvbQ5H^z7>m z4b>$As7bJ`yE=z6VU>7O`R|Zn`WJtoeh~q#QQO_OMb`_=M@KEHq4nvyrxaG z=tl8sGQ@;fUpCTahHCbxLfr>6a9$UBe+-`kzn`VU1maccb@m?}(&$jWU)5R76LEty z%j7~IBAgX*`Q?o|4qcXgYs=@U(6hi1=s1S>bU>+AQ~?1_Qnk}Ov}jPA-8AEd`X!c` zjvOlTuBNBIg3}}kcwGdpt6yRQui=c@u2tMT@SKCJMh(090{mkuMN z?avn7m|)|y?4=)}WM~&NxZ2uB0}gBc!{&G{)wud}x1uhp=k3@7$t4n4@4Oo*c$x^? zx$g>7FkaU4lR7ZtOocld>He{0s3#kdY(2Pw49T{P9_k?mh~#_;h!ti)_d~z-4E!9y zu#=&Adzj$Gl*VymZaQqJd4!ujp(ie1o-2fWAzeoukXK^ax5A! zUa`HN;G6^?BM>>2jCSKog_cq_#vkI>I3LTJkYRi&#iNu#?Y_l?888fWb-RO0CC8eeD5_FZ*SNi;_3Ak@AGFXVaG}m=zQdpfBKmM zKhrLc6Z=Ro6*{IMv4RNu6-W>67lMuS)3NhN0SsQWq=D-d{! z0vYRu>A8`(pX4@W2b)qr%p<+6A&U;qnCSD{(xJV@_~wdeGTvX$+kre(a3MK3$xag> z^5g+?O~f}-Dti46oJ3yLlIL=J8}9F|w$gO;Tl;ih?CW`g^MR#;uIeB^=KLvsIDmn; z`uM2tt&J?u^vT1@2>ENf8-{1vB-ufdS(K7D!UTr)>|sx(*x^c}gu)-pn`JaP=F{(C z{=)Ur`?etFmono@ZJac)dD+^gyazz9_Rx*($lGsvIuk_xMgWl*9>q>9JYx1t{Os`s zby(M=^qmoR-h63@OBi*LMN&^oo?<>CD#Lfn6yvO;?E=AvxDl73isX8hP@qaXPb{pB z2;U^7imegXJDl~Ws{!M}jXR7@o?!mLBv12BMSWTMsh4#&h%bsiH{C3PIOL6-Rh4TE zXwamXvy$Zu09)|el-@n)4^-XA#{!WjNpcd?eMf-U_C7BGOBy(Q*M2)OPJo=Mqk6k5 ziEya7MUOTKFfz}5^*!dnV@vF-Y!0LDD9pFm2lZm37U^cM%?aR{bi~7jmj=R;?6>;) zs6ZZnKKNlCd9V_JhR99|obBqlwLc2^KfZL^FS}TQKgNjv7xKBGD#B%HKbe7V8%NT? zwV1cpe5vWb%LFZp-Lw1gye0nZ`yG4_{cP#CKTU|AZevD<*9aMTQ$Rdo&OsgVtUZpW&C%YA z2Z*qzzVbufI^+%dy=D1^Y4B7}ey+VXXAHZ7@b!r=GPbGvRPRe6Q3mJWe_H(^o+N%f>3|(5) zFkg)=O(aijC`Eg%>lbzOXCfP@T>jX8WfKEd3y2f*9Z-K|WHfzOiU7QITP3%bA&xfc zALHf%@Kj@zXXRQde6gm<+(&*jRZ`)wAL97ztNWuAkT*G>*U`d;{x>+NfBR`g3OGaw z2Rx9*{MgauzJes;ZZ$_n0P&#!NxPLFkSFo~`0-*D=GW1dOMKy(49p{S=J(lA;o;)b zN%=!+2zP>b5;yB1{u^-U zMi1gI+g4wn_m-eS#P5yM7nD&)wJkhODFO9ZpBWI!>rHf_la|7 z;~Q2Jpr?V)(pe7mSbDnbLuO>~;tXpL(qsZt?R)0q*Z@hOlINq|MjE(}JbYiYj)D4) zo*#UeKLj$fgs0$r)m%MT+mCUrO5*v$yV3r|4W<1d*%DwUo5HC!G0dyzi3Bx_lNnbH zp0-~=KGHwo#|*}K!XkDib{1rK!`uqX%a6vm-=502+3-4!2czob)H!3v6xuwbyiJ+I~ z=1_=wo^Cer?nJboZ|v7p?z@Bh+lmcb9#05}8y^uljXc)J+04@?kxy)Nc3+65A-`(L zY!!j$CF)RYW(M;9O?i1oh{%H${=V_fIEet4pP#2`9HTy$7oa)?KwE_)+(xXAj2t4e|E_F}#7mvzPRJ5!c-SVfN+4Bw(bZ zNCdp4g7g7C`mR#kH~sNatnyS~oh%kt>Lf#9<+Cgw#AVC1-@nheKmxu@nNu5+5Wn$K z>v4Qe2d~s3O6@Natk`{J?pPWXEj-~%!BdPpMrvY(Osy^h+3~>BSL{yqP(KNe*r`Wk|UjhQP9TK zt|J;xf@TlKV#WbxkWtt`T2N$xuSFq?^)W=?K5%`|Je3Y7svS8_nXp0Zr=cDm%yYiq zbMkT8M}hacKT;;GkhiT5a@G~XxXOROlY|5Ej(4S-e+8gU=Q2<6`gYV~?vZ8v?SyfB zTssRknSy4%42YCOoziq$af_^)`iy+uv)^@W;rKl+>So{lu@dv~ zm-il3AZ~Y~_~N}w$d6vq*w4X0`+cSF7uO%OXUuw?lba8sjwrS2wH02+o>6%{V|ykD zS2WGDKgWX4Kj{i@DKlJgv^f8Uj(qURlpnu-qd)6QlL#mw!k16=)9v_u=6`V-eUl*p zOO@X!7y9M2to7ag=Lzs(v-LV^B--=ie5GT^_s&yC*1Xdt!*1v7HR12@ygu^`tVTT1 zBELU1{|ybkWqs+cYNe}&mfD>DMnBRFmDj3ED){HpC8A2w|gT5O*0q`|#ARo`k& zSs?pTfso!lW(c4PSUk6=H;;56kSHh!l zhl2>;^^5!XF#q=KKKZdd9rJ;;9c*Q2CsU)ZpNQr~94XI8uq2ZTEEY%9r+#4GA+dSW zevG#|9tKH8I$=GFLp zSP^Pf%($T`z= zM3f!BZ$ERqKkB&{w8Qso?T|m@21kvrGze+wZxi^7uP55qY&}NOXQ=K=b zT`+Dk>-CCyevd;RpKaT4X$SIU^pi)A9zq@0;;XI&2_oG7sJJ5Ehz##HOYGK)rohCeIr#PZ>847YDmKKWEJZ9 zGl&I7G@lH_|ikEa9q9P{IzLtBSXZ*q`l$uS*u3Uy8v z7M~Db%5w`|-GMqhx#uHOod9o{ECbeLpbkrLHrvOH0<04}-;SL@f4|ZB@xu@T472Um zQQg7@^KX7v)?s|guI+L6^ff9N-&nEf7uF-}qkQZc+Q9_UoJzG?Xg{mEN=(^M=M!O) z9XsEEx}&0g6B9fSjRm@cA3q_!n@_NrKs-Pc9$x83T>i-3K>vjh8a%&Ai+YC7m1||p zncw`#W9urauTdg`#@bJ7ZH5r9d7y6aTa*M{kIkwMvay1Ha6QTa=&-i%$j%syubwt4 ziOm`ye|eH`-sU~l11&y&KvPHk!Is#qoWh7l^8V7`tq1T^5_#99g}kic;_YL@R47of zKW|JX1DBWVw~iVznDPZjE+AglZ!+Cb6YXm$1wS+^D9v&>Gi1l&s_rMSHnA$UJ&8;wOTQLRT5l! zcdJ_y{l}W;?t9YmF@K&Oi<(cNLY>H9VFAWbZ{N>+&=o-an9CuVi@T7wRteMB@Tb5D z@!9l0h1jZ0E%|Mb2UfK!S-Kim)xraQd}@FO5ERm{`ukU&NK zXT*)RYV=PReH!{7)8KSg!_}{AG0$F~R7OSqWMbx#=xQDkw5i|BdsoB?m9lZ1lT~QH z7NSpmzle5Cb3u0$^SbqF+fq1@H%-$%8gWM&^X}~;rH8JgzGw1}>OPE#~;@E};JVyxjOsw@8drue5{-Vq8)>SbEzfn;E`$7iAfdX;6}2CRL_Ggq8;`jgd@b z*yh5tu0IfQiRb+*+=Z!NS<&X5i9F(yE%_musPlAGjWRxo=hZOU#9=_13c-#oQ!OJH zM>lJTaW7)LlzZ7!!WYl~XOnVvR>TiH2KIk?fb~Ofmnf6`tkC5uN7l|~0{-xO{W_?# ze>IZ6GaGU4pL3!G4XVhmj@Wo>qF?2CVW)QAjSRPo4$(4hkU@1I@Py(U0_v0E{zK5^a@H->H%Pyd$v^>y-?dMQ`A9TWI8{eu2D!aYB`{7RCjKxs;|K z-lu{`iuryX)Pc%>4R~0JcHJ&Qq0C?h>X0&LB6u;cDyDf9iK8xZ_KfQ;I_h3%%@XQj zTUg=nWv9bCP)Blv-nLm8^Pmj5th!$0X*m!^75Ul}Z*s8OCo+Uh_k3(p!~7{~vvi&o5e!X! zec#N2b*%nhwc}9_!SV7z!3DIZZH-e8)o!6aWHJ8n>oz)6+w{rspzd@#_og$|SpTK_ z`m4q_W%P>=9-L6eaN57$VR&E>ux{*>%md7`6}LauUcUwFGCo#mQ_oW2O&JSO2(M4t z*WpqV=8sv0H{5FLkheDK6#SaO3YYwjaI~YJJS@G@f!UiGPF~HGov=h5?AjQK$Br~G zK6FdXuO00OZ_sX!i9NacabfVxh(SO-`iY=te7Bar-1hN89M9})eBoajrCZ4_j}&` zLBAUDEbxXt6?NS|g6eORV4ZDZdA1Vjcg+rct{cO82ew^zu=OjjVilnz;*t-(m{2H# zcwc3bw;v!<;QrTc{X0J}&%Wi(x)!hdRa~B_Bl48Kc9a;FQmiXo`dzVzdKt~{2S-W{ zuz-;CKxYa1y(kf>?=I*ckF7s+E%$F-TZvmWUpCg!z3n>Tu@C(qWtST(elCf>XlWrE z_31oZWH~tsSh>*{+oXw5`dC&~?J(AP9o^wuokIk_&6|r}VZIv9v8bzkf)!Y*r&hg3 zzGmXHcXeGQ15!`T53EK0=^H(yBiM!t4e7a~lHpkYnfNsLA;!g#@vC1JoyWY8*Iv^Q z^UAaL3z&59+*Vnfwva~NCTFi#%4a45>Zk;#OWg7Eb-p}J^+tYalrFp#^F(i#BkZgm z43N0~qSE3N>TGxJ^YY2S^W3T0!-{rAB>$2^g%AtGy#8>HYZdC2^nykgNA)nY%nZEQI z@6)kEZ-kG1Ks&+Weo^up`l}1|qZx0pzNVktKeC1edYJwj<|T z0~zt(bLn=+D5y`qG2m~DcCqE;(`FIWvmS_&;k#iYE@Y!FFgivc)s`ME>(WsI{meEW7TA&yZyRXwRpfj?V`Bk{knj_B$t z@p{BTe+iZexM2R;qOPfEfjsk1b`DK-X{^s_t^C>am;w_)ZmWkd-|=Tr47Q)bI*}(z z<=dR;uouij+#<=~NHD!}|331maf*by7}vjixznt;3c%=KOuCdQ>P#X=Oe)m~Fm*-t zCNtXKpU$Q;E4$H7ELQSm>Y)Dn@z8`5^0F7^Ob_)FnLw*Rxs*7H_I0~|o{K-~y+#xc z2O>_m#FfA+hv%0eyF=9y_vhnvin?Ka6!`FIbhQwE4|k^}O~W1%{HCc}ISmovxrlbe zY#9;C%wIP=eL@DY()7GxTl7yR+$(&j80WQ~+NPFEhT>SgH6w@{v^ZAOMQSra)Vu0? zR;XW7{N0(jDw_t@k8i8U+cUsj@IqmI5!MlPP5C}3$LC`eAA?m z>LRSOEZm;S?L+}v#>mE4CX^hYyDpLqyFk~g2@5o1Iq1G zHm}Bd;-lxJnQhmwLeJ{XxMUYrSUWDrPt?YE_R59B8^f5PLp7C&wg+{$E8oAeJWBx8 zF&Pi7-B_Q!-6uJN599o--ik290b`?0`6ckWB=`C<3q_+}e(&(8!hi&i+{{K%E(Q`l zaStz9A&x4WueYiI@hH(XtsYqakkD{au~QcLKh=9_-5;6Z;=??x!{T({*<7jVbsOs{ zhV5j-j*(&i_TY0;0RTVzCC|pc!@TC>i-YnCWY||YbE_M99>#gw^bX{=4oXhyXjUWt zd-hgrq&R>ESGW*%R7Blbj2!n-)PdS%`elr>KrVFpLLD=VEU@+~3)A7efM(~8A58G5 zrF+vEZsa9@NT2mV{KE6V85;xCzpVS5`*W5;gUF+$8~RayQtt7Ce}4=a!WG0FxUfE* zmBnz%CYlNhE%sCL2PyFB@`YBP85*#=2;X+pLcWNwI^qt#pJ!CU~OEfEC?bl8>S;l+811wK?LJM*D` z%HMq2XaVDx`i8)Pj0igT>u8yVq7?BP?SIS zhz?)XvI|1a5}_g2J;)pTIpjzg*qlkl`p(EhV)G>o__l3}{7nk#CqlS+(_JuczIpa( z6Z*&3SG!-RJ0UN2ysJz35e3Yxy6Q(G%&>*}vQIOI1`GDZ zAG{EM6w7t(m^?#4{4J+<2Lt<}jJm~=5C>J*C@>p@dcA9EYTMlrmyGgwUG&Es`veGg zti6c&Uw}DLN=XLsqfMoayBJi^B3(aOj&YPn5YtaW3-Ww6b^84Ibm%rHiPAzGLA@}N zg?9k+C;N}SzR@IDv=AM-%#D3Q_V$c(?xI4m{amjw+D&(#>j?s$$kXJAJs2uPzi8^R z(gk&tR+PI{*L~4%sMvLTATR6D^*(CE0(qxwtxvrgs86MghaD>-!i)3WwMiAsuy#kB zRl_3&MB9~Knv-UN8o|l!&s7mG`N|iy<^kf6&rGYdw;{d(`8?fWL`b;nS2Tj>tnS<9 zMy)>Nm&OuT)(BFea_jTxHuQ@h$;EX&n5Tr^$Vsobg!Xyw+lSs03~)QKxqcCK1QI@* z+Ye(Oiec%F!m$DdP}Gfbb*30F%PQ4<80!%n*BsqaU_*vGpH~n=-;%*M+%4|nOXR~e zPG6~)N5AgDZT#f~71DK!`MMD&-ehTI<%jlIJKD}@X9f)_5|TnE5qFvFOk&zsit#YB zqHD@53)XwGF|S@v1+Kembz)grVAf|~=mB=FYLVo^`e#L}HXXsbG2d#p7Swm7 zXPkIX^rph@CJu)~yRd(O!rZ70@*UFugRSe1$9iq!xAiQ52bx2#HE4(vVpZ zlI%zsDYM9ykj#omvZ6#*NHU6~l#EC+Dipon^Z)zT`JB(`$n*Su_jO;_cU`n2t%bJ0 z!)Kd%ZNQfne5+p_xCTDC15&x)_7gJUIBM&oj-NjpcPJnAVA{bYAmbq`x$&;%NS-W} z2(4OTSpz*z8rzOtAK*81^!22E{|Nl9C;#_1ZVLHz@`+0T^pY`+;x6AGpgvmtSZ0SW z%-Y~p`XTf|)hS-mmX?G>Jh$qH;fVYocT8q+jy+E&Z~0kFBS$Yk+ilSYJ-4oE(qs~q zNR>D2|ISJw+9570OhLfG74n7tm_c7k3Hi1}g)h%ktHpX8Jk@2U>xXUuH~JeF*Q3Wo z!b44!Z#@QHy!jDl)@6FKa@MVXlRe&}(ZT!v%M`*lw`HS&9O{XWOt;D}RbM*jWpj{;KpWeI|49| zZu6`k@4CxGMt%=4ykkQDQ&e#ybR8XeaXS9tdKuL3QRmzzcptTgM41ve2{LSpsnzkQ zyGuRa%EwrU?jPIL{3+T*^*-;l?J%S1!zm*`Lmjo?R|&-kLOJJ^ZjA0WN&s`O`aJ&5pq*vq)LMq z2wOZ7jU0n^GGN!Tm4STk^gi5)pC>f3E&AIme|KlSuPty^VTpJ}@Cw_WB-`TS62rT?%!wk%^XO|H;XVx>z@+VI6y`#! zH8eve=+E2gLe6QT|7qTk-p*)%!Z}-#G6LO4#u=}aHLk!9iWA*f@jjYwA3qtC2psWz zmeq6?awXE`h6*v?j{mU#dQ<{>N|x2#CxI9CiH^_an$i>Yafkg|hdO(o?SIKZs{F>BZ7ZOgA3VM82`6yLwd!V~4w(1& zJ=w2f{`hxx>ExGh6q0G1Q=<*uneEyi+FjJo4LrANgo5BtDO9$8hI_2E&U|J>l0uRc zJFq4PpUtVVv;2{3` z$(Lg17)W6-|5L|ZRFXJkdO+|zbc_vhX^og8HrxAU`~dzHx_Nfpmuw1&atYChE&^|J zzuCr519PKIh8leg<}L5Anwg`hn`}B9HyF`Z6|Ho>#a#14u`^_49D0`5)8p6nF%x$2 zQOX724Nkm)F!5-W%Hx8A>e(j?Ym*(vT z3c?ifMqyMTiGfN6>;CK%$2rMN%sQ6l1^=s!;gY@|e$N9I1&tEm-@4O%l@6i)4XDk& zLmjxKkzVK0%}ngpy>-*WdsB2*z)kZCbTBRTMq2mKKYXID&W3J&Qc30Ka1}jiq}-8y z3;sHLbw`Ui?thMrG^)u}_$asbh3@SFpVQIvZ?_L4NzVw0O{770!XG@>i@t-Sj>oBC z6LN=&UWiCxzBsTd(IrX~3zbg91keHZYgjbPFvop4;To<__mGY3*eGFbB+E>y{i?$S zMZsUxlbUb8J^^=rz9XNQh|j~HmQ3IWX0N^8&}L3Y68LVXu|EgjqEH~s zfqS=n&w1nH%=DytBsItd^S_RhW&;iNC->-~{(V#QWO0LcDZ3>nQHtBNT+>cZ>iZZ} z_lwg=cnSO3my;CY#eLCm67!3t$wx=KUMh)veU{&^78#GfO!!YBPonb^tNP+g3el7e zNIMXXJV)l-uIH$8no7}nI>O*hB0LR0mQcynp9@rhbrdoZwJkUfx=Ro9YtK{O0k_pZ zXx=Z%Og5`nNu-2Qh(y-I(xF-O3u`uIIX5CV>*0+0w`C?mnQ8t>dx3j5#(uT~&;PuD zfXo%(Ha>q+%Ld$l?h@ z*EM1B^yDzR*hfk5%vW}P-M9D_ey?wCbp-hGkG?quCg_MdW==*6VlJ6#ZG5k+$3oU# zaJY57nMSM( z+@+3>glyXr=bWKRB_|zIR{hz5duY|~N?G7b)5){GQ)!H3TEs!x%?bVG!GREpE*r7{5oAi6gfjNhr|ThFi-Yu z33o36J}{c>6ug|oKqB|oK0Sdx!9-Ot@6dl>$ zdwg;R{m721KQ9iKaS-;VQ1v7x^tA(bXP!`Sv2+a{p-x2{RoIo%RC%lK4!o|1~2K zlYOhcPmYNkN%K?P4ZJU?Gs?>O59Wp=%zK6-*$Gdvf3i^`d~7;iM<-S>l4H^D!``zp zk*ZIn7W!83-*5OPy|RG&#pK7p=o{z=6ovm@WnduwC$_x^It%>%(?{13@F?t?{8i|m z(vyXrmLuQaQ%Ibh$Pq<6?`25?y+ea^B&_8zGZ}^7P~d`^r6!H!EB&0Y$^hQ;qj6?& zlt$#Y{o0?C%}Orv99LRE-!NZtsaPH7qu}DKoMJe5lG|BoTa$qc39gIXH43~;U%gKO z^>Bt{C3N`{(&Y7-Jhew1S1q3zN57f6O})PbeE5}ak%EmG@T;9}F1-T0<>>C&t*@X5 zSzL*(m+@yOCPx+5Sbj@?vg!#dE&Fe9J~_tu#ufk@SHGel}*{<@uu17cdV61*QA2 z&tv&vp5DHTHt^|L)N5u^a6ZhGl!`Gws#I^cO9gJ?lltk|$MwL)8XwAvUPPZ`%9X1I z{4?U&pw0Aa@Com#CMTX^E-%bv?LNXxVv5Qp;xNy589z9^hLM%T_d1@Elm*V8itg{g5(nlx&a7ER8aXvJeGZ1r$H;ry( zcy0os84o!bNUZdQ63)Xo7ZR1M=6BI|t{0-sg2(-SbNyQh=ro`6c|YH-3?0Le$YP@o z>e%Y?O@XTPx%Lna^{DcVaIwg0E z5&hO*Eq$sB{F$yRr=vW;d;IO461z-DHP<|&G5RUz%+6<1dhk~o^@Se%!a?RwsI|!% zLpLj;Xku@~O!h7v4=E7CJlFryU?;xM6PIo7r=ZTSu(n0btl&A;{n5(p$DCUBWRR~8 zK8=Fh>PN3}PnhNIj_hJ2H&_{uMdQAYjj)@|$!8>nGFyvdF^47Vt!&uBf&RtWq}5-F z2EB=H{dYn547Jwrp12GC$EL)FUI4n9759+S*N{`z|9iI{@be&D-xUYk>k5M}8}OVIgPsdc<~1s+rMSk8^=4af%=egCCq9=J7YdV{MSaGKHMm#r3A zNaNAin_Bmg`)8EtopTd?-ReW%H!;GuEGhBXqJv6?d(29#yD*>Mz1cZ;hk-;-GO{~? zpL*tQ`1&R81D(Q~dVb(nO?Hdxr=c&tc6#-!6BmUPb7>rwnk1y-?hEZP=)zVPavc8U zi<}VkG^JTRgf z5_7@<9i~^lqxinP#C@Oytx`qsAf^Gbt&w58m^gO5|v1 z%o5;JJQ>GYY^a2+S}#&?SqpPV;;$*zI^bU73_GgSp^v-G9XkyD*m?O_4xa1u$T2EB zIp0P{4%;36>S+dD?y;8mdGLKi$LDfa1M~@nl-iXQ{6L*c=l=k=v0olDh<=1VL&T_& zpucvsxOwzQF#J)yIyK(QsFPNA*Z%FNC)|%YW~JXj$04{yt_r%B1xx*?VBk%aEdNBV z>%!L@(qwgXEzbEH8?VFXk=G|xz*B7w--PE?i)P^ew#vG_e&CtewaY91LhqPv^E6~@ zGyJ_w(Z$gRz;jl|d$pgWkYO(Yp9JW2SN%%j&%imo82VX-3A)>Fm&8|9E&``<2^4O? zoDj=vMhU~ccByRpNdx?xF9|&~w$JeQmQ=f|;r)2vu)k%$6`s>tRWmO>@L;7;!P%#o ziMaQ@o3q8>wXb#1Ps9K>Hu>hBYzDrd^?sB>6?|iSL&bua-_~EVE%E=(NSsa{u8cq* z(mC(1bG8T3R=-HPQsx4`o+9JCeEp^``5B?6iw z(CP0LJLsXsN*Wq&_r68H!(sJHroI{e!6Oo3snFM-X-ThAOlKm6ch^}{3n|21iCZj= zm4Ub>spa(t0-vljIjmYoB{%nHk)9k1S(AK-%TI?8OR8&VuQ~W5qtQ9pE#T)bSVs2U zNAAxS^`kv0G*WS0vuy=G=gorVL}fqtmemK6IIhD_uPwCdHs+w&_bTOXhv|rW;_r}` z8PH<}vaZn|K<t*#2GIVw<(ybFYD$UQ!4REjb_vd8!0B>oQ%M#gvIrOw=mU_?>bQ#a-!1zGQRJdufpwtyRADt(DkAOxbCBWO=Im8 z(z>qjLwFN(6b%2Kd;g}8YQZmBw&>UN*EAi{1Ajg1w^Fb%hKc-o$>Cm$oI&RZ=_`%Q zxNnpiM<+J15hvMkabY#gjaPI$;&GlFwZ^U$yn>(oNl(W#aPz0^`&n@9l8;yJOZW=o zJ_y{KcKjUhx;srQyXXngbC4@>cA_VJL56`@SjmvVEj&}#jQPLy!LeC7$%BhXn_k@BW5+X4`FHqe$pQ7g-~feF&M>D`~6x z3O@B|iB<1S^bZQZ4U9jbpXHD?utwhTwU53B*PR7V|0-6e#{szrVu%04fTuq9@wRv% z^hdiWkN8Ja$qiY8*}EHa?}dvKw>tmQ z6Pd1z(>zJ^$mx}#bHB|<)|(qO#{uVw(6w!iV1;h!$1aPfF#P8geTymupH@AqGoZiB zO4K^as>6G5u6|^QY`(}s(l!Vr?*YD6(ER08B>L9jV#9+q=u0CRiGICvjn^D#5Ul`|K_7e3Ox}`8gP#_L%w&@_Fuf~sHA+O#(Wj}pwjH`3KM%+ z2s7W2Rp&4dq*$xl`r%xg-8OI83mh*#k7}kJ2tP~ttjj3sxmj9~gD&vWDzov6lV6y~ z8vY|!=Yc!iV@ixx#9WcuAaeN<-ZScYk%**k(09nq{yQ;8Pt=P(t3$RWRxu~b1!6tI6;14-)@k26xzc<&zEI&X8CpmfSU?upvk1I)0C%bTe zJ`lMd?#D>po*&H)Q6xmYitTB$2=HDOE(ezq+$T+KV*9dyuY`V?{+h)|+>c*Q;;|-V z|E^6EE!FTts%UUgFgGZQ&Fu|X4}XeTsgSM|a2H86tJ$kmVzDP}bLn?_vOih=oFwk^ z^|cxy25%{3&)Z(UKHxVgs&y|&8u*9w-3rl|yURXv1zZ7d?!kMHZ(IX@Z^QfDCk5eS zE%gz@bwD;VcU18Ou#!rxD~IL7!Mm>QEX?SllGS5nN1fqW{&m+bQSJlqYv085Pq{Jc_uhV9oTRx9_qeH{9`oSdfDwxEWoWVCZ ziGBVu^$YV$-VE(7-cMTJ!($S2tmLojoY?OXX5#Y9_EmcoE0Oe@TR#k4eVxyxO~Lla zQx_dg{X5S#xsOx8(cB+xbv7?U|JGylNdoxR zp{69ST_MQXeOdnMH1tQj5)Z~-dm|qzUpk%o7dU)lD4Sjs^vxQrX>q8_av%47nMIyd zNuEEq;$;q^Q6$U8uLHk>d~L)7HTaAsl$VczNBwCXw=b4~9^00O{sry<&tClP!XXJd z^2oD+7Fs|@{^f^WSoaKhKzjAHJh(T!x7_i}#dCFQaoA|L008$Iqw3OM@Y$u+O755w zd=BN@(KQ4+qV1s_)p4%2<^nt494k|=LKb5k1XGv`a zblu6P&fNpfTrwSYsCN^1UORc~7(M6=81&O)fs;!M-5;t~#{DzUzf+Krk+j}($=V6M z{mB=LhhncXlFn4oYtqx;g`VU`kFYTlwxEr?@tavlQv2l2$KQbuE+m=_UIw1nr6Q#C zk&bZu-n;w_{oGE+WDy$hFq5NOyKkIBA7~qM(0~vA&>3IzjzI9FGQ4b%9g|cQ-t~)* z=tzk}O3s!o=#QjWzsl-i4!W4o*X>Uw8^p}(%>TfzvUo^D5O~A^mempITzFp%HgA3+ z30;!LSkSWzOr&kChc_3_lj2OiM;Y|+j@LIADq${Ga?9DW2%hggN7j6y3HnOys;uAO z&E}5eOErq&{cqR(aTI)~+N%l#SF3^kppI zdzy>BmJp)>{buX>?z&L;@m;0v_F%qWWoFk2*D_+4@I~|c+4}H)68u8%?4fr;z?`uDogdSJ+%k59-`?{4I+ImW$ z_wv43=>q)e5Xbdn*OVBDnUL8LY>MT`SKyCUfxvj|;5-a!++A{wb{{BvF%bL5|exsY@0;B`V9Y);*y zkySn!a+E$6awvndY#-+IIJ%SduN8o|1iGYaJ|m=#%VG6PeBaJN=@LbG$ko4a{q7a? z_r?3ZiEl-H$lB(Z(~Wt5dYL1v2|f+U>Bx>s+!G({#c2~BG~(K+HSHHnA)+DWnYjjZx*tS|8j8CYgs`CAQ%IGwR)QKm~ep`<^Gq!KeMS{$278cuQ{8Q?@ss z@wry4`0J&a$l9MVvXL3=q~tgNLhyb;AAP$wv}3-$nl!Hiy#xE1fzwV@M)K#c{6qIH z)M14{1sfyiFSRV%8o$b*R!INp=L7U@!=D>eU2x`1u102ze z;aJA;V&o)@hiA?Jr`mkyd)i<4bM|J-Zx4-NC#rpSZs*P6{yEEc_5kXgP|M*nKTpt; zRyBRKbec%YKrCc@KXnATB!rC`1|3hrdSpBYGfZ8y$XHVCV?6U((&**iiJl4}{!m5F<$maaXcJQ}%ZbDLvZ9wx{N0qu3HW)tT4!kb;9c!I(_)f*WZSbFAJtIxv>5jfPT=mHiew4F{Zb!AD z%aQPmjN1d=q>i%u6a3opPEq=j0t(6Ge!EnoNKdu~GH$QS1>TmqVY@N<3^}3iC-N2X zK3hNeXSjs(YVbHu1^454`d1O_GT_?m-_DfBBA@-_yUysn&}F)^?E3o+?{D~{`0rEf zB)aB+P+ckVuiaRqPNTl$D^4_PqJD_3@*Jp-p(DeGW7gUagHO3@!*u8n>cADYYf9*2 zpLh!05C^X1b|gk;R0F(CMqzXv@b&s@H!_CyF%jPfa(8;RVBbq^s>?3CuZ8SftHmOK z)2<|Hf6_wEE6e#eiT6=Q+DL#Fa_S^^FMiqryog2nv~%KXMlw{kuz3Y|^k^)1&M;*qxE(X8 zv|ec)lmHH@s6W(;9ExkYao3}8ub+DMp^WDYE6J*q&`6a8Kgr5JUltC(iq)qN&roM} zdCl36!jBRp&E2^3H3K=kYqei2&cBha4mIW$-rKmtrLNY%1-%BWZ-O7Z^!SSJfobR| z<&SOoQ%fO(JZ~TJ;CuZ1#U$Aa_-*!Z()k5^|F=q6H#+(;k@rPMt{Q`L|>wJ(nMk{Xour zz18r}_f#T~tR-zJ!%U2$9)5fQ-M-*J@4`I%BQf+Y$zgaN`#1Lm|IvdkrvGBNy#vm} z1817gMhbD!l4u?cW+dnS>bngmV;{+pQ*<7A9YN(yQ`l1TFOuMxt#(r`% zb)A}hGW@yE7uTo!hK@4qr{j;c@I}287Nk96Arcv4X=m}?J-yd%BkIeFK2L%1=3WXJ zUsaZ^j{5GvCH!-JGV*fz8DGuo0_VM%X~6>jpOLTT)*;Lhf*UU$yZr_@Nv{6>d?D=j z>8=;`j-`+W@lyqAz^_9-6?W#kW6yxzCoxkM(8F-VIg1M&#mSJ9x36g%Haln zaJ^|i z5c|mBl}PYRntPOg*I^EG3_UsEkGzlQ7{-h6>z&Sd>hczi`#MQqQGW1?YcIT$Is-jZ zRcf=a2y_LG2X5^WyTwepG@m(DV&6hSKifAKbLa{WR4}AYqF-u@9efSm#31rf(BXUF z8%!N{C>6mE#Zs=6EC}ArUh2YX%=4`?@eA4p6mt33ALbnBx7dGIs)?eXgq%2m_iab=lbc0J%j3mo1MNanue4r~W`bVKx zIVT${SGo=N_Ry_Nqes9^13JT|4>Az%{zlt%=-=P3P4*Pr4zeCaVtl z1M=0)TQG0eN0kXrWYZBl%MT|GV}5I$@zJp2pd+WE-K_A6J{%Z1Xv9vs1esPMS`Ha61tB)>3snvIBy&lNqZ zV<)!*O%!TT-!`m{%y=COT+Sw9)e`hNvAGk2(do#+eXqLY&kx<%fZtM$F!sJUs7@O8 zF%ZUe!6I?!_d66dG%tfcFX#)4w?n@X^5`M!JjE1^hO7J zg>)Z}6kIt3ygggb?A|Z)IoeBB`ked+xE+(h7=n&I23&YB~yPUHAZQx(+N5V_AaeCSuSD!0&SLLXDy`B(%Y zH^CS9#=I9RMD7jU&$|)OH|{;{+{M+0eM}FN*oUT=$Q;wr7hiv4Z_N!;6-_;6qW0b5 z;>DY+WKvl^^*|hj_`Z_ZqYeIQ5AWV@atWB%wgexpF{F}x--4@E6yR&xZ6|yRb#dd{ zc3yovU$xP=`|*OvA=|UQND%e9%%sa89XP`;mj~f`KhUS|^~kt~_b_dm*DNm+{EFY2 z?JtEm$cSH9g?_dccCY^h3G&dvoM{NiY5m1U^-s+r+z6k3D;x zX9k`?$ISfNudeVH{Hg|_;;y)-%a2{FzW{t}z0c3uuhG!2My!>1c$J=boZ2pW5c-5H znmaXH9J;#@uVyWG7Sg)Z>%sJ!LW2LTGoG`ikuYvvlZ5}?w~oAoYTRqddl_z7TY=xH zxsptgf*#T2O0%&6@-TO2(`N%O;>cro+!WeR2d?L4K8bGhK z&h5Akz8}d>rzi=We`#lXzM3{Vvf-SmWc z^Zo7r&ApzFfA6Pb$J{uytnr&3{-`wv%7)&t5%V6*&(MVgiBG;})w}pM@e(W9k$R^t{hMXuj!~Tye(D~QyO5UM{U+j5< zbP;f~9Xp(LaxAE%qe#t85`OpWD_0w~oy1&LsUm$f4Ep)L`SmL3Bh$Y}O)=u1`hWUz zhtL$#`kmB{!Gbk%z1N3D(CFL^KY|~wlRV~&FBDoa1HR(YpXmw@29g7FRt#9 z54(_eJ`iY~TY~!S${&;Rn2A_?8>HUtW+7)+%}eE+CPb`)Lir26?_HWo)(-*fCHQvs z%g7S^G|{gH7G4wbKDbj$A)Z2X`L8=tn-DBwWqZzy# zRWRSLN^5j~0^CPsoUea(A>QZpPm0ZeJJ8#9idL`1=Pb@KC<2~V->=MiK?(Vhst--? z?|`5C)w+hx7U-|sk4itXg}>zfnwrFSti;>%*uMktx#eANvsA$x$S3-xv1t#51l=3` zeu@IV^OLMVI`C~jr+`EK;8o8^rs{IKz}FS4b$w?7aF@ZwroFhg&Eh`u?17HQs>@O9 z`7ixK|VSe@~&Q zWj^L(F7|andN{{sJd3Lh9-uFMJlYUc55CyPt~C2TD>2rvwf8v z?fM42pnkI%#}V|qJ5Dj)Mt$y9T_vcDIafP$Zta^i7IH`UQ9~1any#w(Y`-nxTc>lG zxg&raXof86Vc@900;PU^xPd)P=a_@9xS}q%4K}vo{h7Z->*NLu#$@$!W%(uW=c!+2 zkq%UHNRn6XG4w(#EOnQe!jY>C&4AbnBl)tsD@g!36B_S2Z^vTa4vnd~toVEES}9{Es3!UD_u=6H_5KAX;s;9if=P7=VpdBf|&Wf|l>)SWPS zI|aU8lTCI{lMg+Si?7xGdy^1WrL{BT;n*WnZ{*~PdE)AZ>t!;)A1Yrf7O`x@KB7k! zm7?RUM6_soP9gd%&l9F^ndB+t@%<);+E2`+%D?Z6e-|OjkF3^9yMRC0oX6oR2Y>Il zYv;aG=u=3Rq$Te4fbdOzUwfe!sVOk>!2Lv+9epog{vI4v9{gC0I#r|+br5)&^6;D6 zhPY>0w+!b?fyZh5^S9_3^20CLhpfH*okl{!E=p%zfu5xDPFwZ?CKB5BSys0kIa(1( zI-j;+PvG5rss`}d0q#dTmBIHNkLXdlWP{w#`C`VHC*YG$q%Knz!Si=*ZSF?Dx5$y` zd)yv6#8;sc*`Cl1ru`}SJcPYUN)u`_&~XT?%x#olg-^!LaCdDKjXY~v+k5mC_;G^| zZ!&R?4J*!SZG&E|*CgC#6?lWo!dGd0z=uqZqou^HZn8( z`}=dup;BaRefPira!Y8l{>XFq;BonHtpN4}WS1WB173RcwP{>8_}`vyvt_FASwff2lf|7A2HmV1lX357;N)I5J4)Yzuc!?O-|-&hiRv)M6S_A;sRZY>0x{bY(XGK4l;`~nb$qmV(Zm8MtwS>ihSN=UNeBT&z)VzX8 zx;Jt`{O0!rZ-sxtM0Qx?7WA~rt5+@^!Fzpnd%{MXkJZNxdblZrM;d$Eae5sq`4BO+ zZ`C&FptU=8E?{na6XNG>1^nh^yRz=jb@b%XK&0kgU+mkJz54yBD+4)uJm%O+IE6e@ zG}yZvIUI4D&6@UB!OwN&V3;uQ!WKK;kNv0v?uuh!NuKy~LToMR?bw6U6Uuuk1p16% zYayGn$Y=bx__Mp0gN(j)jA4C;96;|wYP@2=>qRunY;ez9h>MWR4nRG=^V2a8`i1vB zw+mL=K_B$4?75jB@U!#XO6!2*JSp)BvVTEO{&8&?4bDYwmFjrd0{&UGGcU7y1NzQ* zwv&Bpn29Xs+tvpaz&rGU?;3@&5@D;&MO(EP3Ag5Lw^wx7lNT%S_;wyW8QQkvPb~O8 z(+R_1efX|wGL|R!1x`}6LyM|Jri@M-)-x|1p^>UAkDEjWs zhc_H};Kv-(w9VrFj=Y|I%|GjD6dXH289~&&aXPmL?q+PnW>kL*jUUf3BS&9I8#&Ys zcIJaLn0izIU7euNt=drN@cb66uK_JTrvWW zIqXpv-HiTVu|nK*GxmC%|GiDBhlxBWidZ+e1ABg|0)C&wd$dVgEu>2r`Vn=t+>ItI zZ1`asJjTzr4<+9R(2?)L%z3Jw z_`D-w;R?VHJ{=R(MW2l`_jy)LBW%tHYyn)$mOob^ZDKJO_z>lM(o4 zfQ=|sSelEmQjuHkzKi-7=f+v~W>+Tqn~}kG-;;za4GJ?EVeT^aZ(!sOL|?y&+q`iV z_N`ScG8{0Y5@zvKktuEL0j}3jS|>@!$;|nbox_;31P!%VpxfYKXbA}DU?Cwfzn^%I zARl;&Rq*^;4(tbZnYzD#d-_R-R{uKa*M1G{`XNEc?N?IDHucsc z`Iv{_+lfTQGLxIH*`)SE*WdSOt8oGP&bPb=Jtx-EBL_H;UJd&1L<#+VE@|B7UgTb} z1@b|&CpN6@f}Y)mOt|~dkqRwCi6ZD`+CTj}EWa20lP9z1mKyB2N~4=U47^YxcdZ<= zF?2UPDtT9-ui)s{w3c_nJk#j5H+2no$G^V!a*-oL{BLQ<-(VqG#SIS_p8=G*U6fkJ; z#lDV{njJ4OukJIn+;s;0m0|XZ;vx9K>m^ezm0ZWZaY@Ak-DAw;enG{sY#j^9O%wG! z7lygiYR^P+EIaAzxB4yn{lDBD<;hLW_`KH2?JqEY<)k<+UIUKnoj!kGd?)lF79(E- zZIM$dW;NSr0)AsEJ>K~c@RK3Fu@kn~D`~X$eKByfcO~twB=oV5q1+>=;4qD_oINE; z6$U^buGRZ)l;fBTJW4L7bmK5z9V;Bw|#I1J{76Mf_LQExC)*~6zIH=- zu_|;p+7A=NwiiRMr4qRD3igtJeiL+Pb32usI7IDT1^i7@cD0?UAM{?^mmUv*7w8R_ zY*e_9dC~Et&Ndt5i6y1R-a_B-PC-#f74^50&X`;_r4U<@uNr2D;4i*ITN`APd6`+QDUX#PHc(1xGyRXlFg0Ht-4VGXJEUHbC!Gn)F#=7JH2K zTMlPm1}{@7NsRGk0IyF zVSCmN)@_W0b}34Yihkd!KfU@Ua34F*ThT?(qbRFO8nj{ZGGL) zXO_5qoyX^_Ynw9FY2@^^_5Ng~9ZY1k(Rj1^T?R6w9y-)o3-@067KkvA zii6g!;=|DCmV2sSLhjb(@GqD59H9}_Ke}5|xtU4psbt@ML&#ySe6>ON6#SWupRxjg zckAfrP2WR(%=>tYse^nxF8y==z0R@psKp@y6U*E?L?n&>a|ZOUDB zC`7EoW_{io)ZgkGk$<1#ImK2rc_m@r>sf^x;<&HB&fT3kXhq0g=_j3y-~;dXc2!=+ zbIVAQG?D-ZGs)O%aBkrm-7v2W}&7MdmR`Mr)B3&$yctmHdv@_s$pub+M=g8w z^VW^S|LwWcTrpnSgMW8**ipO({hniWkIqKmP}~1mtyLIDe%PP2iy68c0)3z2fyXivfxt_(n?zjUkI(GjpNKR@zh1LrVJCE1 z<_BvV7}}uo2#CEK6$xLLT_2su5_DV%A77I~=m@2s(1}0BzLSQk@QA~l^%3qfCzH5ViD)Kr=;TDI*R>;o>j_~i1gd3q}O5Z$!)z;?`)DpT7w!4EIo?QUB9 z3G-%rT;O6IeCBm$62s5K_nN+FO>mF3D?Idwy@xt;ZqjbB9Jvo&bOnnA%w&XiB8(n* zz`)co##T92@=DQ0b!Q+u`B{6k{4UO6oaWsAarhE`{;EplhCcY~iP1A>p+jx@z}NOB zAA4nHCThMiKyP_4JmD+wp-cDE-j%f@AM`6%)9ItY3vUguv)w_R+GnZNkGe5CJl17< zflA!ed=79?7_m3~+fai)_#DqwYZI!GySs_JcyR;$!S2sWr+^bg3>$u`fc|i=@2_|4 z;2HP(Hm#kAfFELJu#80mdA~FIN7qCDWcyUUI<1OAj$7`2lZ!g^Z2ebx(FS`ce|wQ6jt*2rM9RNaK}8s4-KndA}8&ZK-y;+7D5~H^3ly_Aaz~= zCi1+v_qJVCh{xv{6O}C#?uCzDEiP;Ce)PF?>}%VeK_}DuGebWNdr}OxhO4>5FMNI5 zh|Evq0!JsV@Z#QxZi}zAUIE@b))x6r3VBWef3iZDaqqs;^>s@?UXO?EqURvyhk{)j zK5mAN*GF;LM4UqOO@#!mL7yi!>DQYFy`4emh}6G$%(*E{jw=%IpOs(u;(d%l1lxOa zA6R1#Kzdv$izy)nr(4=?;_v@nA6ssVTq0`6@ZZNj;WrK90FOYkAbhQ~kt!TWY>gkmiS-#~|9@c34B;H>lh z8~NNBh*&a(J;MULpkBVvZ}h#{1(9t(gfNGSL>NcD0^WbRlRscL_Ose=W{`nz{p0TV zXB)tm*K2n?Jnc^-P9hPrzw^L*b8=I|mKn&y&3F02&VrZN;w^mdC3q{TvLjES_cFaS z^5!P`m_5^}&ez~?xP4Z<;uPw|rK;y<|ITBcNP5SW$3ahy9{hV>hz_|s3vKi*ow%>} znNQV1H+o!m`c(M<^2h?NNGU)ctsQ?Z>QfpA*}jnY>P#H`6|x*Wl5)T$mS)a;)x^16 zoZEjIe2IMdgE~v_`fYwG4>y3n)U@E~iosk|>Fi~A?E-ZE;`BQr;Q!+~TvVE5j=4?Z zKmZ?jnH`_1$JLjQS8%1-Zb!Ze}p8A?=gTMjNQ?N@3CRLYG4WX=WezY zSyS|jcP*wvSf+p%mWBDO?;_+Ulafp=ba*NDeG*ovODneG_YH9$%e+1!!U%rwyyKU= zR(a^8+QXzhbI{jO0x#%_vXB#3ZPbpcB4_%vPyYn)R3hb~^h+Q5q120w*Ic24FnP-V z6#5E7`Gu=--~qYM(rnG;pwFM2P7A=ju_oE2U>EeLU&l_kZZM;e`|Bes?6{CmzpJe9 z2IeD&DXLp6c+A!;v%w9*&=XFC*^K)$5FP6~UBj3c^ITpmg*^rS&AcL}+Q~vrKDb<9 z`3Lj)l}qQe4*bW9NGhluW+a;HT+6a?znfe>yY(@6qk|)lvR*<@qP@VGEvt*qzti7g z>;U>-n|J2?Qt%O!o7TD^H|UecwOzIFquwk_8cX72BU$NZ(|^l>XKj6Ys(=po)8vi- zrw7o-%d=V;V!qmc@F>?;LQkySncSIlsl=AkY@OQ=>=k9n`JwzD?wo!6H^p{6H zni^sv4A1`L?0t^8tkBZf829@_9p(A0?dTJVI$q46zx`%$zitPr7&a3bP=n5uy zu0qaO;*7^{efTs@6q_wAz)y1TmFUe}16@&=&Z!4{=qsnpuUR_J-iJJ*@+;NL*uA{zxvvzg7 zPEYpnxqZB$iSzMnMEtomasjmGw+;he&fmNvIGR9L!WJzrt&JQQ>yfW#o}r#Oo%yGY zesC#pD@(XA=C6IPEsw*u|C(P;vX~FNSohdM67Y!64O-c6&LgL@oBMquKXOvmrl&w!yt+o7LS4 zoF}z@!j z=n8(z2Rfcn!raj>Wo!ccUguzfCfX{}9eQ+G{VQ;Wn{)=^GT@=pI>#IuaQ`uMB_4w= z>R^^~_I~sks{RK(b{)a{yJ}7F5lbo&=5OEH)XhddD_`{5qKSSvf9Y{tDl6Ig%BgJX z4V7eWdY_wsI+w>~?RB&m`3Jj+)=%8$zQq?e<$Y%$#?tYltKc8XDRn(BjC!&<`l3^Z z4E!+Nlsj1Y}ILmi|>V# z>Q;6ly+dAXT!o$l@t4cp+6O$qP2|{h;O(y`yt-PTEA}mL40QE}f6bI5wSX7=dsN_| z|MpB>+O8|({|J3(!}*c7z-z-|PFWa&NA00zW*xuBM$T;hrN#lh#wCOHm~iBK{}Y}K zk;S?BCD+%*`JP5x{_a&j4L-76^_QV=JpP{bik-HycpsyJo237%BV*U{YtYvkdkJ!1 z{)hKG{>!*+BXaa|N2X0Ak!O}~+xQvx!;DkuC*kMN!|Jvz#@8@I@8>zNxPZN_pB_)B zJfsmp^NnG(;3;~?lDWR2KmQ(?z-$x>zvZuMJGXXWPIOyqd*vZ?{clGf*I0qal2Ya_ z$KM+nbSCR9=H=O^_v=gX^GyT4Wn2J{d8Yi+WEF6&u-Vv`deBRTFnAu1pT+*kv|R`M zmZ@ZH&*lUB_5)vS)CiaggU+mZ4_yg(UT-h87z6Z;T9K#vljG5E`Mfw3d;xl>brI%9 zlk|jES2xPijL-MoAKv-Z**SsA)udlQ;7DkN^AX7>!)a*-Bb3 z{M%nf{3Qx1S;&FGGJkD2Kt5a)g#_lvG+-oYU%`CC*@$0?itJzw{E3S?7VOuY1>sq zQ|ZW)CrQ08J%CH{g?|(QufiK_@Q7XWPtCOS*w&koWXrb~ zya$hQDfCrGEc#R1tA=;ocS4UPwx&dXHT+7Y%JKU*!w2kEw22Em<*s?*UUm;UBA!w# z?|{B%DNNR4BM*3xiTKZUrtGB6{-(FoNoHc;%w1$p&q!)U9y6{-UwA+9btS70`1Use zKf`ZA-=57VSc^V$lZo-mJ@8%kvk0D(!|&H+TCKI(82Nm`qc8b|fH#M8Dc{E&S8i_E zs3;5FoI$(|-y(cDN;O{%QBR-Ey4%}3u@NoZvmJK#aE_#f-)b+i5~tUm=`&YY$otXb z{%OFWA3pQlc2XXDfip~=?fL+p$D}@v;)5nwii0m1$%yPF_9!B{R8j zI>DK3D+@_pwh-B_i+)&gZTNfeE|f-}le54XlX<pFD5>|-Hqe3JP=5%5bo zRI)F4Ag9mt-C8Bwi!HG}Jqpl|x{DpBV+GIUe0!nn#0>I}dxVsWow4U>OP@+o3ciOn zL<*jV&v9Y(vnf&RpT9CKeeD%=sPXzohJpL%vy>k8-HZK!Mz61wq2K)^UOL?Qg^_3% zb`7uHg+BD|ci&$Qc&;m_La$)nzPfMp`DW<(IJfm=S_6;$-TwCCs$lRNsTGg^L=#36dJ??h63FD06FIYbJ74x=I8O5;pQrGhtmhBXVtoynfwi0Y9!d z`&p14{o`VOT#*fOr%L8{RhOVkz4Wx|$qIN--nhiwW57wJFR4wKVP8heD~SuYnFwvZ zNFWQiL;{_^7UN;~qQ6d?3uE5<_MBD5 zo4kOFWDQU$zR*LLYn2CVgZ?}8>b=6@ILyx~ky>Asp{sd8zswZ{K3cT0upaZRpGHT@ zRp_(|_ZzM7BQG#te8%S|_y}2#zYi9{D>QFlznO3r{Npsg)hOnbOf-E)@nq4=QxT<@udE`22TudA-e{7gb-m?f|^oqQ*jg74(K1dKC|Z zaKkqj`6$|OmWfpS`pwvT6gfu@UBAYFw}*Q&OxxNrkWe0xZ{cAqq&V7Ojb0dXLJulA zPpk*dd~mYVHw64pLQMX>9_Tdly~pV@;U_COwdxA+>|yGW%_Ty}!QDKpa~--41$q`) z$}!}VRE#L z4(JQ{!h$n@Cc&?+UVn7~Jj1|(%a*h@=-~DrWA{nKIg_Sep2WX1aetG!RLM-*YNWbe zy=Eg%-1jU!Tn)T!*H5cW`0vRl?lFF<#U3M<8~+l}uaP5K#}D9KKh+y*yw!vGvu$eU z5)1lqndK8#aX;BDf86-85qn{acTYZ(10P+n7#kmhz4vUdGUz$6f9e63^}S*m*(Yfp zG6bCTTK(|FBa_&ZR(PA+xlJESdAN7K-7;#frcek8MMk|JQxSPRmbvkfa1vw^i%8h%9fBpM5coeG%cLv85!|yI4 z$h`>u{pid?sf3%*^$yDT?B9=jI*8$!9(eq7e%j4fJ(2TurZN4DHoiAcPkRq9r?akN z4t7p1_9wTAx!AjkZPyg@_H;ULzipe5&Ji(rF%<>H|NjTIG{qE+&U)C3{g1sjfpe=Y z_kh!dQpzH`ETX4?bcQx*lGy_VvUbwWBx#bFcDj%`lXGS!Ot$7EGn3Mmf}kiUsJNp7 z?g9$pf}pZ_rLLeT>Qw|;+|Y|$5k&;Q|MR@>IXRh3OTBu3_xpXnFYP4fy!-m>@AFnC z)uPg))QUAj*Oakb)fmW)Rn$s-bx_St>eidTT+ZjRD%Y5*mCL0{)l8VE=;L}tFJ^Va z;lPX^&_~z2U0t3&WlXJRCzWZvk{g%Bi|i-;==E2PI&p4jt!`p397|nsj6sJB}!PEQ7f9El&NwVjd@iJu3DMNRVS6n+{C04 z^Q;(pm1{L;Ro`9{(>tRY3KeYN)fms|TBBw~R*g!ldbX--j-}uH%AY2Fb;t#0ed1e} zUiO)ZJ6HbonwKkoDxUpp_bD0QpW`3<{w2S<`J&_z8(x<`XXTZX2Yq1btNs^n{OKEB zS6{ySm=nMI*p|i+g)5a(MbpRgYE`#&ik7%eQ57^Whp|*tMayMrA!3!rbX_w-)@!MZ zO)!rAP%IU7%tEuusZ6jx99*B$^m27_u$Hgp z%6VPXW+>yOT2V`vN=iX3))k|wmkp(=PN9NQMJeYo__XU1B~0!ZavAkPK3AMl@}*Mw z+(e~>umYM=)UYU&Yz@sXVy@7EY_(LWn+dWN9ixmCEit)bBTUJbidEz{hKefHRV^v` zoM9`@N`P{wa~gJXS;btNGdZp1a~e8S0d&yCG6+uU*(qHMWNCJR#r5%s*b4!W(Sp&#;R(rNO?;&RGHI^ z)f4zS{lfnEV0hOMVsh0SnzTdLB2+1toS+7yV>Ek8RxEAmHcC>8wY+l-TSmciby8Of zIZey!a)IYd*(oJAuBds8rB+u;GhDTbnaEE0t5v;F#zLi{Yei0LCZrcc&<|CbDyuU^ zZc2Do&(<(YO3qM>$y!xIkrR5gq87DM!G{(gysB0ZL@9Wy2#Ba_SgFO54>PB6ctrsJl*pQksgmep*oimqS@kLOD>aSg@Q3S&CP zb{vII08B?=SxB>r$)S-JV8o&BaQHVn+j%BeICnj?jOyvv3Qh9sDsMe-uX6rjp^!b_5{lxEdKri=y{K?7Dsa0}Hc2cdV z09F_$Ib;B$1>Jm8Yt_k81;cFy5Nc(32o#j~LIQP7LkHr?pHb=(s|MIaQ zkXo*aZznBQU}pISqN+p)M7{#)Ow`l~UA_V!P3Q)_7>1KzWu=sNs(AnmC-8~}gaIf! zfBYmsrCymouApN>X!FNmqfF$AbE*U|D;c_T{xS>dtW!4G)=EO=x>4On9y3<7gmP1- z)O^)xOlRfx+rh+2mWWid@8ZR%f+RDtTG81YSpvdlvOywKrlo*h#0^XBGq&)H|{K8iiyl} z0o=gJARZ!PB04&DHIirsmgjlOiu}Yi6 z^jXj`L=A&|v8N@fxhVkct(LN-d~+!9A!pVr^n^OHrP5Rm3#kGU&`B5?Q;Ok7E}pC^ zVQt{{3P+*!PIE_r5US9+ELLmfi3&D@{BdF=D6@|K^Aa_tb1J5aXo^{0XvpHEDRq|0 zM1&f%POWG-LFJF@pw7*;h6_(1WZ{Z^aC8g)cR!B*-Qr)lbgTdSdRQQu2v(e) zZ0(g9_FV-M>^l-MVD9%Z==*BR|3bLAifjvLP7p5>GYk-_j7`~C@Bxles<{GKAY-yr z11p6z3>BGW0b0mTQh`qXpEiqiQ5b(V2TMh>5yY%i$9tu0r)Ct4NmUeHRSRVrRdXUP z*(1jIE#h~NgZ?=jd#(`gl#ZV+mf?qp@I4U8^XGE;i|{@4xJ;%;etw7Ol|Fmkyhr>l zlD`Y(ulRB7StcK3{yk=Wdt^GZ9ZN;Id;ALc#-f(V;=8I$5E~5chNV&K!@;0`eI}Ag z#)o2|Oc3Ac7Dj7%s>XEBcrCABj={U9HVg>Xomfywjaz(a6!^DNRP&(ACvsVt4%{R% z<*K@$i&DyZh4Vq;0OAQ4IfywOQ^8)MtzZds)WkReTqC4r>KIT>8tkaa{0iO`ETP~m z{gR!NOskd3mY_g{O}4FFPPF7!3GmH;*1-BfjjBe(gjGo#trT(^^r!$@jF{Uouo>I) z$kCC345?viP$0*A(39YI9poqXq7l0ONywNzU@Pe)l z6{m_|ft6C3;5sqkW@W@TV+xt_Y-^8VpV?)S*a4u{u=ng;$Ask@Vhk485KC_*p&~<4 zn!p38n52McxfO>NGK1CB17@>SV);NCYbn7SV?6{0;sHgU&62nXJogSA0+d3o>Zd7G zv>J<4&<_w2kT+D7>0Ak7C}4N0O(ASgD~d@nDfJ{tiiV-cl3*%Z&DV!W_z_Pj<564FXZ}4k=lKKgKg#tJ3T; zsT#r1VUlzRrf4Tw(g_I6%mJm*jg_jFuoYsiN~vHKiQUoGzEMy+^F^8SPSP-}+DS+X zRmeXkv2`n@8D6aQdD1`(mNP&lU6Qh_3HJYO>=DU^niDH9?^F%DQQ24qFFXWGV%dNC_Yfyfo|Ks1cPX!=QPDW!j+ zNL9$DWL0J}7>I}jz)zrVxeOpLs+2@d+-NKYm0Hr+&?MZ&&YT?*LN2TcRT++?AdI^J z>$5f80El#2Irdaa8%TNC9wEe&5QsNodut&fJ&#p6w-`BH(Kx0zgPj*#9}dOEIxXl0 zNIwaLP+@tsu2))1mEd?z<66>T*`dEd5@aTIK%Qw`<4#F})dF=A{;Jw^4op&A3?PAM z>goJVAc!;@%!8|yT=WCKOo0=>Ps%4q6X-G*rttv%*1|)(C4&5n- z!_X%RSV*k{%!F>Ve0$n5ts(xq>3`Tk+Ga@)fu`z#R6(fn#wcP&QNU(+ynL=FE>rmN)ol8ALg?wp+F_Fq9g}q@#o3_)uB~1^uyf zJQ0p%Vn9HH2|$7-4Fi)ijpYFJNYJ{0l4uoxMB-3leZ|rvl86;H6g0P@)X3mKG`2n{ zBvb@BX#r2?D$pB%;b4UUMvUkX5PfFuIL}`O*mNiy3!1AbD1)Q1PZ^xkV%mc4KWFA;|0(a5rNKx zi^*d_pb6bJl*GVQ`)G+(kklE0>oTQdt@I~1lxi$sd1-R6l3{-+9vc|R(BwvAQFE@X zaLh8qH1Xs}+P1z(w`OaeUtv|ERGl#qDYka7Q~;rgE|#XS0hnr}Y}6%)adc>q6$rmt z^9d3_D3CA&Or}}VGi4k!3oUcMf`zEWh6V;&OYkd+WOUG<98uPXN9K!8`lG3^Ra67) zf@+?a07*BFdDr~PP%Mg7G*1Bl(G9BrC)7oNi`tx}sgvqfDM@a_530Bbk!B8T6j6-O zUzt(X%8fx?>yO6LnM4%gu~2I`L96sgBJAG>WMH+YT)?{4Z(Cb)=L||d(DdL3K}iFZ z0NU{UI2-t(0Bt#O`$cpP+m>i$AUM#6&_3ryHXT~oDdvwvUx`POc%9IW5Gh-#JOlUy zNPAGPfI3vBJuWwNijY^97r+QY$2BPy9OHPk<7CI{9H%)}IyxL@If9OqBkM36Z*Y9Xai8M}2V4%pc?^CQEI3Y2h^<3z`DhsWV}sE&&r_dq;#F{)p%Xu;wIOBO6$aM*$)7o4y_S>Rr9-h$Cq zLl-dZ8A$k*l}d+lHgwU|i~)S5yD%kf?XAh%41l1lZf0p$&fq*_webv1S*D=j}dhRs~CbdEc;Pit@EO0CUdTwkzsDXtzFBJg##h(9eSm-yfuBnMdaNU_clzR zM_IE*@o3Nxkfem@0x0nnG0_UI24Ei*dU>c|*odhrH>?rBea#?jTZ?B{L6%lnM#&lG zIEeT_4}>hs9Fs(Nu%UWZOud8P=_yV?3jhH`sbxs87Oyf|YPw>sYY*JbX`7G60f8 zmLWt8G!WZN=@rI&q_3cL5vb9;Bn1&7EJbYA6EF+`=~93%+-*<`Wl)S{cZ3Bvpw;*2W3?Pa)1inTq$&DR(I+62 zF+_S;=CFWo26kBHd_%c*mSTXQBdk+W{Hb6xs?15SiUxO52MEA6Bd(^7HO++SK1yV! z47@doM9gi+EkQo0moW>?fp5ZmmTdSLaq@pqAEzW^;JoaYJCv17*9YLd>l$;8H9*#wl*4jdfEk&BvYz@BModOr?r*a32@Ha_vL2iv2A3IHqPflzV>+r%gUeuOv<^lWiY`Jg3P((5mTbY zGLb0YGIJ9(A@gqS6aXHlnw6yQM2Jwor2d!P>k#m*C$Dt92 zcmczq7d7i0HUg$bicHn8(wej_7C^(c;8`)3oH|Q$MN=ZwS@UH^+4!H~)pr2ts8EWG#ZFtETpD)TQYlYN@lICmeNEA8l_q9&81nvvNW*@T1vBm zW!tRx=F+TSB=alEnf^1CbNuIQP(na4G`ED_#XJxM2kM60yfoz;(;=DHTKBC4MV+lN z%b8j*Y*cU6GDHUX0m=+G8;q!6?gVK;ydE3LGFdBkF(e&QT@4Zd93ENw^9cb32Ly~f z;DL}JNxISGAx#>VGqap>h0x)U2$KNq3K9+&Ra-pwdrq_oKtV^6PE4X*1&TC~ZLra< zO#msQ5t24R*#Mb>$tL+R!O>X6FTfHB4kSSX2HR*IGe%2jMOAk}I3nq&Eo3gW%|+id zm?%V_kM$$#o!qRz4HA3ri%Xop8u#2fm?R|`0h9SY^cKU0>0%-iY`37uHQlEq1;&U% zXj%bvH>1{xB_T6+P-*{kG5%r})~u*#Zb|bD7_1DZY)i~SYXbcar6bN>h^)lak!aFN zaDWdaD-a)A5j17^wxd?2qYvIzk8AOt{i6R&nEdmKu2<;)gXH1`9 zew)K;;_Q%4FG;;jwjP>2K~uSF=|DjY%PnMPvqHFi)>~^Xv#XqB2v+N)3Xg&LZyHHz zL6t>#K{7s(-JBC@AFVl2W-X22L17r45(NH6uulQWEt_fQjcSaXEjkWn*KA)?4<#?f zb1K_BRFuL#T?=3@vwbGv23z<55RjiuZDjr!P?r!Wn1#U5NInjL_ex8vl2S!xNK`P6 zm1-RsBh;%o!NX**H#ZJEGq-b2cn~KSkVt`}RCQS0LgoiXMFKK|>L4tU%Vy?{BP$wg9T*#v!4NU= z85z`QZWQoYh@*g0$WRME0^SM=3l$3}4E~>21LP|-wgVCR4km-Z$)!T`Xfth*A!{8f zP?Qb>-V%C;|19>k`cNEKg-DW(Sb)>$ERHQ?vOZSH!M2L@ZIp>&k_ZHgi~qK?{Kjmb zy)aTwkj!q1D2hy$V2=*EqNryuESN17CJ#a8%z&iO9Q+6OQqE23(}i$68XzeH%Po>5 zV2BpSOa0uY1X2tS#!4f)A)%?2ASyULDD=t(e`RV#jDEbRCr~@q?0`OAEkNKDA1C3U?6og;{6;g0E19_{ir&W7?K2;bQF# zxEn>>-6(@zxy@}1u4s%>G!M~`ZTp(&97RGTG>8SwX^h58rP>t24UySZ;ZnW8-FQl_*FhYUwWLLY@Z?trR&!+S*;EY!yhWCD97^3X%sg(*mvoDU~zMXnIBLik=mM_U32d8bI)FL?%B)1p0i~JMe|8Og)tiBaiC{>@M4L3v*_!8@OkCtUAW?v z)0{hR7tWkFbma=bB%IiwFXtp|bYHpn*?9}9%^NzjqGl;&gn_M1izSAQVWKS+!)1n4 zK3|-z(;d(Six2F<`LkI5n(vF``+4$r;hcBVzTHgU)7jzmxL3QJ6aO6uKDBD)neA;W z&UpRlr=7aIS9#rQPkGHhuKDP@F2C*rH$U==H}3e&w|@NCgFpYyonN}`)=z$J@8kEq z|Mt)9p1tdX_kQ}TH(dYjd*1fu8*lmYC+;YJ_U^A-d*xLZUbg3*Z+S=M(f7RYlmGht zOHcggum19;&p-Ry=b!ua6@UKIi%);^>wkRsyu&QdZz{nqUl&+PhGZR-W8{_Hk?{NsQ4$o*gY<@dk+ji3JP zd%yeZho1SzzxbJNlDB(=kYbKde|D!bYi)Wa>VR1Q9rh`j7YJ#Kx{ZVZEOEdQD5iV~ zTG!joU<+TDOg6Ud6$-M66k1yi^pPQTW`*`Fy}(+54854zJ^*QnJVi&Q#AR0Mflyzi zOn}BP0T!>(e@B5t`U*ht?eWb@T5i2t+rGpMjPtQ~#c6zu1Gi)#L-!jSe0{_){wwFaS^Docy+ya}X`k=#FH@wjPjYINdfJ^~P zM=Iv|WUx#~w4`(Q`8UI zH=ikg00`|;_{+Quf2YoQrZ_X)Ohag^?G0dSqbki)^kQQ zl}kkp|AY?g%Zwnr@E!FA(J&>zbMtFb8q5ZUFfA4` zVIsz%&&SF$CA=I@d%raeS|9|*7Ut)4WW7jOU$zVUzCPR35=zx5A3`wJKruY!Q^!o& zSn7>NxH(GAIjmLEn9`OKttc+6CdJRtwlk`hOU9xCq_r5Yq5Utn22z2NQH32RoCT28 z4|$LwHIXP;t`VydY>WmyP$PHa$(jJ`oFq|G*iVqRnN}(@m>z3wD-D>0C8mShM+>Z~ zAkzU_5XNQDFIppLa$8OF@(SgzlHGy)6sDRiK?18w&}|jX^(yhqe2 zcgK@F)e_IoBNrpdwNqs|{VEI~?8;cIDT2usknI-vRcMouYR(Zuvu2XFL72rRgP11B zhJ`g0l&nJfU`-Hf_{@fra93#vcN@@*v5i?c31&$dz*0RP^p+TgH7)T@a-yIs31|i+ z^G)p()7DmiTP?^45l>TB6EuPo72$l0I8I5um2$&&S)(j53!MUbWRP14cvvF0Ni5W& znK8kksc=yCQ4^OjPfd(zWOWU!lO&ZJTe?Cs00k37dR(Ip{jxs8Va5#1tQarJ&P0g* zu@}dMtR>J;%4-<{RuFMB6GV(x0AK;aJpyU~xugfz$&TK)Oli|+Cvl1Z3N#$IMS6@j zwY&e+jTykKc+ zK5|dcg#tfiAo6zs2Ng<1%D|b`_Js?UELybSpaloP%6!?ui>T4`xMcB?#RngB(6S|m zETNZ0j)M<6c;P{d4ni2L(UIfe1xpTEypU|fVI{usApBdnz!X0?+P-jibiDT9n%?g{ zeBI--PbkH~lhc3qUHhhg9PyEnOW&B*R{kQUp7xj37aw!nhuZJG**Ey|M;EQXdClU} zZu->cFTCrMcU_;j3Zw-zuiWvKipSHM81^wR@H0EU1`C}G zTEu&6YG@eDx(C9sWNfWGI=8U`$-F;5K`y)|Z3e|Go=vce8#pbDnnGkL`i_;V(u<|8 zMM3_Urk7-Y3w;_~?IkL?X=q~xOIi&^z5_aJd8?+2!1y>EYX&eHseZq=s~g`Py`A_* zsQAtx6!FLf-;Uv6DCN&25R?(=GyYV}(;6CyZVHE*gHfzKF}=1HAw%a+OQBpa+2{Lw zmd8q;FC1bIoUJ2`<4BE3k+Z1gCtPE6W|rm?LgdxTJdQ;Hh2-?nOp(#ODCZEY-Z%c` za2R(q!IG92tg#wX^_UM0ro`~2LGCWhLwk80$7vv$qR3Xw63z)>G4t6U)A)x71f*v3 zQ6PA-cNW?rXBDs&R5i?T09whtf^hjq#|S|t(kUiTLpaM|C^!oQV?>x?<2)}AD2yc8 z916@urGD-P`flU_O@K2^#+*)+Cz~N&nhGzfB4(4{D{uo6;Ed ze64`dBF71A%*-d$=)i$3gJ1`6_Ck6|WWz7hdw?h*LlPRpmPb~??i}`A$$<;T=2XWG zw$^}28ZiWyV=CFyAxlP{CI?g4TS1fBH7*1{RAWC?!pQ{s$2`=o(eXkR`;IXAsAU}v zdt4mkGQEhJc7v)S5=VHx0HjCHQGzubZXMT^Qz8xA!=MFbyXntq`xpPw$ceE3{Q zG%4t))6PEUOaf|EC8J!ZC{U8PTx*uoX$d-;(3|sg=Q_N(?oK|7R_pE@@9-{nxm=lK z2LCt5HpeojrxJlgGBS`}n;u9c6X!wCYC6rBw?D#cZ`4vU!y2ei^=n{~&~{!oI2VCK zL)dgyny^XA$gvHP3M^4FOeG?u5a#2OMJx3(j+8iFi$7eKh0j8q6eBIe62}paLmWps zf&Jwa0uge-C!xs2h?U?Wpx;Cu?xv${jVCezH0w za)f{xk&|T835J3X!x(Ii6fNQqB&gyF9eo`H4+T#Uf;Y?1YBHMQ`vDG z-sJEiE3p-43xV>qB-}a=;Pl2?(iN-u2)mR{m)7dlpzvIq1~9gTf_lZVMV7%>T>^e2 z>`7vT1R9eJNjDUOt(f}SM^k26D-$6mrh z%`t@KaL|Y$6QH`7Pv&eCx2r4S2q{()yS*cL zOR-oF8u*#n47|zl0I}r`@24s(f`uh5@ERXiO0i!7F*iv=1!jPH9QzNZv`p>6MrmTJ zd*RkuHbQ~MEj^IR5M<75jHdg=6TMP!BDG$G`opOVXwuBu;Gm>ETB3=vklrO z(<7N=I2K+TPe=Xa`z{lWMdF!MFg1(>o{r4C<;w7u0udhU_v63Uok_$8Mm!zvu10HY zr3LM+oD<&L$dLh=)erYGOqp@#&E^CHK}yD*m@f@AttCwo^xghTX-Y9~8T)Pvk{?KO z%%SI2H`PbeC)?aqR#PHdqnb*Zr(MlUVcwyn(&j9Q`P(&LSuO3_Z%O-E7_HO1uf#_L zb7criQZVAz+uXDFC=SQif_4YPQ47M^pci=^=m&*V9fN%0h#;h208DAXdt2s2D%GH# z8K%=QMj#R!lut1r<4FDjdjc+6rVAIf_;^^Y^uh+(HV;kyUA08Aum6;GrPKF|P#tg-?4DIrI ztWXpxLN_rFWQAL0Z0hXnwL+~X=mlF7Y`sjVFg;c2&?cW*wK_T{+(f%s5CxzqbDC}4 zm?4d!6T?emWs8%OC__S%4CBq>m>!XJ$`oR@$(mZugxSW%YYOKD$jpmaBippcN-6Vp z1K~jwHc+MrUS^hl4@^vs^+N(=yY-Y@5_3XpK;G0ZTS{BS7B3%#?~e&J&%GKZ^CQb3 z+*6P zJ4Fv2QNt1;fQX?ozysu9VP?9x4OwTmEdtMqwEAKL23DkD#kOW_#O=FVjWjWRCWSqT z2}r{fO~+{ht8u38#Rd@e8A}U@X3Vglku^NgVv1REdp}H&WtF#49EVDRmxDzKT4R+H z=kvcBB^Xx8TZIh}Tlhlur)n_&ima&@!}0+qx|CJ2#wPTyZLkk||)jr}E(4P;U6 z{?g&Nf#`~@0|%6z##S1QiUmJ!mu!1Q?z8mU+BVfK|C@6hv=84po!PvdLjR^{n zpH!N|1hhSXNG4-|D1l}gT+N1BE(-`MeN9Q2#6oe%F2MItDb^B_(Gt#?O-;bPpSdF% zAduT4Uy%YLKrH+@$*6L${=(mMgVL6(#oE6%$YL7}V{S5Y0L%z$kf;ywyfz2K%Iv(% zZA6KgN=91~W3RcX$81GA084IrC{>Bh3zdcz)eL`86XRth^>MOrPM0F^U{soES*S^! zd=2WF)%;hOjRrihzzNkZwtBdL`b>BsyVQua?Xvx(+E*DgGzBQe=;jt%NhxSDsQn?+ zD}gPp0eQ?+a`9s9%n-&8Lxe~fLCB42EgdtN1uEv5yOuPJR~mSY3f@R2q%m#JZ4ig4b~8K)83`;8AnpNNlk}JwCtas9+kn+8?>-wTCn~4XZRBG+qXnR}%)=@?dtY zv?hZLUW^_kgV)4QWr!^gZ%V|I=?pnkJCx{lKLp%1s+oAZ#QI>$LlnPMg3wcD0JL7V zF1XDYu57aDOKgEe+9NrBY=K1CBM@Xdm!3*VZo>A447N9-V$gz7RXMruJyU;|wx_{s#<&V3>`5 zO)O%P88-a^C_TPbfx$Wv+9b+u5^zSKNhDi`Aw#bOp~D71h1joY%h)<+EiPL}036wG zF9DwBQ4tIgTFMUHo8tt92p&Op7vifZ4p-rrXWdpd?N;(>XKfuD(Q3vW!<*NpOtDQl z>O@w)k;NQu;{0c;n1666Ic-F@KQenai?QX&8Y+UIf+rp=NdASPMY4J?%W4+I&KoF8 zG^@j|B{(?eRVFggQ>_B+f=Ov5#9MQcc-APJ!)ilGSO8)@0?x@bYl3X6>E@_$0A%}v zASNJ2f!Ni?YnX`|1W98h6IWrCW`ZCqz|7g8ksE}V6=xTeQy`Y|oLviw6(|bU1=w>9 zbZHBf{Sw+1Tew7$wvc_64BZN$K|*a3FVIR8C@cg=FPJ3BE;5x6uXs8{Bniq}C@F!l zSSD-@hDeUw=FY^$cZ{F4Ks{cQ$1$z;S!{Ich*@l_ET}aFHxVtCWY?V6cqJ@6D^Yld zIS&{-B8un3@MaPlYO(FgrX?UcX%Uk1C`N`oy@vxa$+p{eCse~_prwk39suyg1CT?- z6Ny0F>vebb@dAuTfB4sWbV zTPqm33ArB~K9pydlb{K$84)+_&`psfk%zmbRvo-S{;tRvnDS?IF${3XLNo`|@5|xw zsG>_S=I2nKPf+Kqd@#*UE$)c5u%x_#0)^Nr1rlX8VAIK52e`|p@LgQElS?aQ4Ohij zO?Up~jn(9jz^IyUxC;@^&sJyL9T_N&tEJU^e9<*oE#yyYsA-*g30DIN>W8jM6pW(u zrUr+j`8-wcae2`k-Y&S?f}|64=YTLRgI1JOJy4lvg;5y6PS%{UZw$hwq-oK_sTu*s z=PW71zSSM4mN%mdp&)~(o>U#jG6|zLH3D^${*pep zT6EqI>XC>G$Kq`OrLjka945%LvjkYkBsnzO7}zpfE6*Tv1EExZ;+C%m-uw609Q*zk zpWFMs(w9$P@frV<+6Ue_@X>d@@8sF!?L)n{jDBLnP4Dg<_^EgIt+zgL!Sa{Bbkwn5 zJ2*IS*!_29pa125u895Ou3wk*7k_lp51#FR@0YirkB zt4Dq9lq(m$R=@r2_ug>S@jLFk^8AB8bjag-KiP5ZzGYS|VA6t(hOOfg2Q=bZw-@Mb z+68QBCWZr+SEQa31}oT^WM2#J9@`BEHG$Hw90{jkM`8o9PR6%*L4&1;?LKNIkLe8wouSiyzgx?UsK z8b`&6CzMEvU>#?2$RQFGqG$me_y|*w$qKBA=Z}&)^{_t)_sDR|8;L}r9t#I?D}#*c zhq@iK_xkXh=u|j498PBT6)kf&7nyO(Tyuj3Pl4h@)wyXo9!jlD&gP{|5j_VbOTdj( zqXn>BfM1>tc#qZ;i}@1vG_6x&5!__RNYie(z!!8)2Pf&$hBbV+c zs{^l2;C|lZWNV=U)SEzGLYGqkGf%)DE=+eUgZCD=vIP24$WI2XW#N0W;iI3l=w)#) z0j~C&hO5*dY5Yq7*JMZ~U4|wZ(J5K-o@m+|8?I$RurhPf`+P7o#!1S22F|Wk*oOfX zTLw~SF?%8<3j&~Tj1GE$+C@zQaprMK1lszBy)zDX(B&~~8V0)(YVZnm#&G7d&Wf>u zjlNf4!Y1HvOBh0v|7g<^+O;gD3+xD-T_f`emPwF-3KcY`uT@amYy-yzX+)dI{qI_a zyRNLyfln7NIvR3p12{Jv6%Iyl(}6UhY-=AS(@N!@~Lc*SJq=q*yv9_J&0Z7buPBmI7c}yq^LP zO9i<1Qvj@|_fr63setnu1svLVJgo6}I8Lj93Nml3At*-I$in#}29ahpC++%Rg9*FR zhFMCPO~fJKz!rn zb~d&H<3x~<)yllf$)>1Cj+fCyHQI#Mavj#7A6H;NIY zHCfO<(c!!P3W3CZbEJ2-^g^}8{Zlscl)*&)bW-5t0HU}&ky&=6#1=B69rE*1$ zb1RdipIyXZ(%817P3l%KX_kK4B0*Z%Z=tD#$Z9T!krp~zQ*cb?ySAEWD#+>`j6ysb zim+!M1Ll)ei|*!WGqv~)CVMAVvltwB1qZhd8h&XBpRcK!el{DxVaSgAyXg3LhtW>Dh%X5{( zlC?AU0~QD_aWw5bP_Sqtz5!{f2KXzw5DA9)Fl}USZv?66XaUfgl#WnHNKjd1e2Rt1 zgj5ooTiqHt(FH2MVK_?@Yq8WnB?1PRwNL?l&XHtjaWm*=@V~XtF#?b10}W`n(!{XW;Kh{FxN@ z(Re-vf5+jEtgeXyKMj8?@JGIL+VE$CO%3Cv##k7p&<9g5mG-#bpk!~6$D@)(v+Kcgs^*VF$q@ z=u(X!&h>Ftlfz;L)1%O#I_wo9C(N_#l}|8WuJ0Ht4CY%a#l?b2oY4c7RLQUz zJnn>OLy5F|+p!4v^GCYq0iV;);~&R}_&x6`@q77w;`f5T^6#EYU492X4<4Q6-%Ee| z9{$z8`(64~GS@8(;P*Gv{XO)1!!;)r@O$1<*Sc@O@71sU`d1#tZ|50*o;ob(*z;IV z{XT!taotZY+t@iBbnJ~y6z;h(=vedi(I+?kGI-vVUzk1Rv&V%J&piI{lP9eYz2irN zOCI>+p3w8_etG{w=NCes|KLyS!P(!1-oCJH)tOf);jTsAFFkj2I=t}Gm!I7J(>I4N zKKga5f4$=F@bVx3>Ti#Eo(uo(%Io?@&S{UFe#_F!pLuI0^6KJ2U--i9?~Gjg&B&=w ze0*-EQ<`Ox=%u=bR7 z*FN{AOAhY;*w*`=ZO^Xh|MiI{_55vHrC+`7v9Hhm`Q!cdy(c{X@aKNsKd|e8k#9V6 zRP;kzgMa+eR3!S1j`Z(8wq$2?>vf;MZN;UxMvcAKU*~!1spwU{Z!O(@{>kg!ukHSi zBTnA1?(UZ!nf`%#**f>GcOAR-jyu+!Q+y+3g;e(>4BT`#OJ+`hPY{m)kqg#L8zlTZFOJ8;}Be>&y- zC*M18^0noU)lPX};O*-8n{t&!gMWVE+}|#W_YPM6deswOA1e;7eX;L|J72nC@WdT^ zzu*4V9}j-`y}n5Gro&^}ho8K0?-haAn)@Gl_zu@h?6AIfU77paO|ee|ANkA0uX#N7 z_G^AvyWu0p$G`C9=rLCe48)H*_K4p<{Mn1+$G`8WPkiU(FUGh0<3|tPb;Hx~_uX~b z<6jCdPh7Nm#m`>9m zLt*H?qkcI%x?%5`ox>--=b8;Wy6(C0(XV`SL;jvk-#+wsNAmt>U0-|K$(_l*&)iX{ zoSIACKhl24tEN7jJmn`})_;4$L&?))ZFha-ilwQW)&Ks?m7h5$b=a=`t<{SU$|m&ZQAwWH{I}=z^?SJ`>uKY&C$=L zw?6km@r0lMDs61P{VlJ3=WB+36S?j9KmBaO&>;7YSjqmo6uUz}L z;qlXtx&6=AyEpFn!>i9QzNKw^>^C2L=2b7fZ{wA>-uvhFa~|CI%(f2W^Mi{wO?5f0 zUat0S`j3F)x!jjao9=Ai)BE^CAK7$f=XKxs&%Hm{)aCD=J?h0HM($~IKK;9`!I5Vx zfBo3&J7-63zH0hatNouD`Ob--&VBVakB^*t-LYT){SB|)9N&B5pFeTM;AZbB?ic!J zF4?^M^qoB?ANQrrA98LvXzV|Kzxk5CZwl^Odg_*soVEIzYu_@w<;rDeeL3j7a?5*u z_4U-cYwy{zM)~4zwk~>p%it%UIJNWAm0R7>@4f3fuex>T&-{1xU-Yi6Tarir?xaV* zwY6@n|3UfNj%^zgzgRN(a_6?flke((Y|RDRzW$kQ&YQ-s+g3a23%win{BYaR>f=ia z*Bx^HjXMWV4=q0L{D*%w>Kr<#dj5Bg{_^anmwf8{i#GoH_@Vws&;RVZ6Rxhe9+TPf zl_%?$l>0N4r?;K(kt=s+R@~-$=BZcTmU%XF$kd~c{5tc8FMT__@kghOK9~IP6~iA( zj^4WBO|F|_Z^G_q^KCr!tD_6wGji#4*ME=R_xIB4e|Ya1>T@rC+x2E+t2(>u+^=@+ zeY^Vb)~i+pecw%8qR5AA(XeUszC9hYwNjD5;+>HD7gygv3r$5a1!?WrFayHt55 zllt?6V;}p??|MGzJt+IY4NrxW7x}XHT=v*nZ50!*_Y1?Y#M&-r`Zor zw*RGT)sfma?)_6W*b~xbZ*wP)4cE2d$G$Q?^6t-S-G_BQ_Lr|dp#`rB{-k#E3Hq@{ zI`+^{V*2mzf9}Xj*SE_)!E&fzxKNS($^e%)n6Ze=+yDUzW2E=e&_Oy z<5yjrdGa3@ymkDATkia?N5}3R@BQEfzkAP%&yT+`bkI|~?pQVP!*!>9_HECp6K_7{ z_nSYr{oNB!pZ{``_SvI zpWOVTufBNM#E&L#U3c@2iF=miJ{!B~rpInSFSmK@$3H&d*VWv!zV9CXsPgID!=dXY zuSh?ZJ8XDw;4`^nFSu%I$3rJx8oj_+GSaU+bx4n4L z#V@|+*Vlfm_^A4~UCS5$thj2|SN`jo$B!&cUpsZC@8odlnl~)@!qTxFr8P&NzCFC_ zmeO~QFMRji*FIUgXzSiRU%BtZ@&kRl9vnI;Q4U^yZRly`(sKIK_Z@de`Aly#1v+zWBE7PyBetFFL*VZU6aOPdxtKm;bUo z_3Vc~Pkqzbtn%jPu6gq}i|?u2==s~z7q0tm<%H}`Uslh)%ed%~_;IyEKbv^;haXv2n<%{FQ2pb3YIiT4 ziM{;5=WEY?>)6L%TJ*cx!!HlqygQ&wUwO`Tn_inrPp^*c{jaAc-aLJ$y5oXJ@40LG zxLsG?u=1yWn%;cv>MN!nXqzd&;YDY9QD){0?^mxqcI=%qx9tA?eed(_o!R=KUw57t zeR<}Edyibc_YdCL+y9hq_kC(&_G9i(-*)*sKR7#a{P9U;Xj=;EtJP_jmrhUcTuq1HCWadg#<2FU&02@uBZscKXie-*iGG@QIO~e@j0w_2#8l@9aJE zzHi*P?CU%4f6lml`0y8Y{`J|b$8Sok-gVY{PP%*Q9ob#W)-1ne$;^9q4P4p2b?-Ib z+jYxd-q-iiYZmRkw&u9}>?eD6FM6lr)9W88?0$U9dF$ezzG3%&RvvuK6X_rCzWS=g zPo8|{;TPTU(@TmQe1VJFuRiTtPwkz)sH1w**{{3sri-rI`}Adh`pz#eQj~wuA>k`# zCx`xYM$>*TU~{HrIHY+PZuvU`Hw8Aw9N62xn*YFR`TtY>&qjdwN5$cGoaab5Mjd4w zy}f$QEMMoi#c{XeLC0f`KhB9cup0l>{0COc|5sBfaQnzke@Id+1itH1@fbbU^l&^v zSB-)%B;5ju2*|0KQJp6oehpZfJWmv{pU6934A%mozfdBM`bHbit42xbFuJWZXjdZ$ z>N~Q$llkYAb}DqKqDR7?nfV5<%VW^u^0#@E8*vmPP&TsXw?<}I_B6RSphM0uF3@n#H%~XUb0b6#@J*aImC`lb z9-k-UlX|O20bYy9>koM+n9orV`Al~S%O_lj1V>MmDsJ3c1xp4phGGvx;#wb^NU4%i z6K=X-99tA_L)q~JG+~f*k;;>mvm_DEvvL{QaF^mA6J`S>3}c^m(nka2YvQ6%I3P2l zguI5D1euC3MPhXkG@ztc(c#|!DkZ53Vr}etOsgr{8At_$)Co#H($2}L7oA!OmwF`# zh=lTNEQLBaF>c}{)s{Vj%U&q?Cm~T*4n|@^WCYU#j{-S7S*=hh6&(doc|zueX`v(k zq_xEziRSWyh6sb8ee-|Ke59ao*q*zH+J)`iuE;k3kdauW-QHO7&ljioxrG_n_bv0CW9_*AN& zZsQ*Ir^9p`w+REP>O@Um9<7=#jIs^mSOJ!WQeP~KdE|?BJE1SFuIdX6w-JGJt!P&Oq}(yIsnl;G+Y=_e8a4sWt@CB0E?Y* z&5NGLB`8@^sX@Vl6%o~j$x=E2!~kuG3Tsw+<&h|1N4_Jkf0WlTBe z=0_g;fV{8Gy;3$HJXbSKmr}26cdssXQGZWp^)WT{~0xOyt>xIBM zMr6UlMR1LF@X|w;9eUW|N4yIDQGvuD_{IF?%=?ZYGtN%JDhy6B2q^-@S;z6LD6WpI z-Dp`r*i08p`dhO#De0pU^P0ssmmxOH+%(u)@cl#{LFdNE#);dIRT9zzT?rd6AT4yr zv@a2x1QvS2eG|Mb@p=~4P-G1QBn^Lpa1%R0XbN{CvtuU!P8dbuk`n45;dFJDlU5+ke7#PltgXr4f_{5E$_VUC3@XMv? zW3`ElIyP3pZLZo(Nd{zV;wBOKO1RDzOLU(7wUljsBht>W1y$%0ujU{Onk@m|GGaa0 zvsGmyGGtVYtL>oZ7bs&iIh0Cg0{-B7nDzz3YdoWXJJUJ1Zetw>>mG34gRnE)1i@ms z4kE}J)MXfWHibWD9Bvo#R4ln=5i{&-xN2diUJ|ccaF9&mlfWDI0NcHm1uui zCgVzt42HsyOn0Y}!r`TG$fY49D7BTVNhe4*!yBtZ8~sTfF&A5s+5l^?LOD)G%4``% z54anOY(b`TFyCOSJlLp!l*G+II&3gRR%C;pE!uJoQyE}yqSL7V;NXkR@EV#tXiASm7|UK?k#aO^r|H(RtN;vpd`8a5Cm zEf}aeq4q-m$XS~CMoFxDyv#y1oRk-|mr~Bb4xNwRSQDYo(u!&*B4^lqkDbbKY3Mm9 zOTYm5wZ`mQZ`K1-IXc})K!hYaO@k>7?zLpMH$(yBRxP;6A&{o!Y6V*y9H*8k0Vor$ zgocQ3Mu0y}*Mv)fh8|mFimvM{w_|b$BFK?q@BkVQCwI)*%kjm;mX(qj3{@p21$7f^ zF$2R4oo}c&bbSg|H5hVwqGL_mY9j1akY9p!=2|R6Cs-2kf`c)&fg8*~Z;M+xITeLv zD{vU*)Ue2~;JD@JTm=qNVK!x66iUGc%%<2dkeN4ONd=3t#w0MwLZ07r4ec`zo!MZY zr2eU9Iz9k}BS13E5f(K#3$)bW+abhe6ox(IixEzrM9>_7C7>79lo`(a7k~&y2(ZPE z0%Tc_xLD210_s&J$CCt8oUVX-&KT~QZxs_dHdWF9Zk(=Ba1&7DIMShl48~q%cgl)I z*rEFktXhB_3!HRMGll{ceAH6c8@#`pbL=z%9w*|W8JQSle+=SbL=gM zGIu0qCQGPRjD>)&76S1t6ZnYy9Rf50$>)U!$r3Ku#L|bG^L=3|Vo6}JN6jZTZVX51 z8i>iYY(U*nAE5PdK;R$!qaB3y`+TC)J|8G%Y+SM=2G}D&h|_uoolBP-98IuD3oAk_ zMc_Z0W=1n(fU)dnvr?*qpq~#p62+Hk)IqKt!B9$i5K}vugXKSgMdAnv?t;1?SWnd^ zLFCA~d0jWrS~djQn28DY9|ypP4M$GW7$l-3Q{*y^W>+-!1TFf+=FHS<;r@)qnLAA8 zo)`+r(a+m6N+&#?0mab30QkcOMw}m_ktTDK8JzqUBLp*uQpK>f8oQlI#0<>9#fe;t zf8+4|+4wgm1!D!N0*DMqIP#?l7=7f}6P*;2OxqB=H8_wm!Q4@ftb#l1aq6QgxGu}P zGe{l_9G`PGhyp?!+BpHx4It$KHs&1@(5*Qvr!2uK#x#NmE@gQIm{KakA|hy771*)^iwX64wYPc=NVImLV1_do;y)WkQ1*d?niIx)9DReTqfk9Yk-Z z-lI77j4n9Uq3oK!Z1NMsv?9vFo`K8-D;6ySRZbiY;RKhh4hw3}z*LZoUugsxR)H{N zI!bu26nnUF8#UapHb_U?wuhVom$QL}s7~X0(k#A#+OxI^Yd{Ed;u;~%jS-Ids20%< z5Wun(aYNh^>StIRrc)Rm~I>b+>_~{Zq z-QuT5{Pc>SzFb1pkXhA`Rn?GD)sRiqkV(~$Mb(f&)sP(NIH8AAdN`?v(|WoGJ3MZW zXV5d~^?SOM00t|U_26`+r`yxx_jJk-KaS^!IKRi+c-q`}++;nvl?bM{RP=k?o6N^P zf8Qp5FaG;`{N0=UUHI?s^m}^o9|t5$eov41>9$Jom`~lQu7Tb@ubY3|ZpmRxm-3Lw z=uRLIfWt1Q0ZVkgu8Oaz@_0KsySjUN`^F)+0PMvv&mstP;kOvncdn#ibzv<4>tmDS zMn{uHm;vdhsdYhzkbK4Cr636y1t+E8#`ubS6h+DxQQ#naIMwv@WGzz3rBoayF0NCH z5q)e>t@z88b$G4i{k4gdUXEvBA3BXQ{$Q1fUKX2$K%z=KuEuvC3llHGGYlia7C=%B zIz~6PG~ghpQ#LBwrZAn(-~#dw0`E$72GolSfDE9FAUIRzjyrF?~61mjT`i$4nQbA?1G@I;Z|?#- z4GU(-Awajm*ZDlo(3c;0iDpU=p=6CaU!_?3Rk7~)`j>gTzzsuh_fyPrGmRYldDrki zlZHojzr$s~KQgv+wRy-Cck66fDGzMM=9`CkZW-Wh+caJC)=lT_-Lw(eCAQBu=-)&d z7q+x*ZR+xtwjS6Rpl6Md$Ne<4GXeE+jL{U^lRI#b?2wf+3r(j;We<2cjuQ3d5<>k7UC3zQHeSPk6XjoyIh5s8#&92%%sgiVyWA{e-RR7NQd zpgK{ID-BLUR7zAX0Yia@oPv6_q?07sYi7AzEO`e<#!wI!QbB4&kku)>=ppvj zEsxvPl~Hj|L#a604u0N70B|_7R|Ig-43h&9ihes!V?usr$Vn(m{lk8ci~}T_3a+V} zGF)Kna6}=Go2*&*iVai5jM5Fzfb%@vBtn3gD>vV@c0iW6@WWhVnd&SrIWXyM?Q&#@ zTWAacFW&~nqT7ucgbBum#*%nJR6b|4ct2P}$;%Wam(j?kvBq%Q`zV)#%cMILzLg;@ zc5}iScSK33!(&NF&3y!6huBzhKk$a*4nV@Jf)1wZ znm`-ig*Sqffx`eop8-q&&=NT;{z%A6$*%#Q8?qRu24y0P7y|hXo(Os#vK^!2d3_M1`Py}KaITlSsjy@WuUB9*l>Tpz8*Z@$< z6)5GZLIJOE8WPe-O%`DQhABRutlj4mbTgQfwL3IHW!PNdr> zbcVpX!lzZ$tZ;?pYF$KGm#oMI84NB5q6I{)C&H;vHXufX%OVsA85XXoCx0BTbO(h2WBblKXZWvOc zu#zB&|GCSbQXG!*0>=Vn??Q*e0E{5$I3YaYqrF+soEqKlRc8#!n3d1Iz|$HXjiO)- zG=>368*)_A9-f65Ku9o1?n&Liauv2rakglZ@>n4@Cy5kcD$BaVA`fJNN*mGWjMLc< z1#D9|Cu<1zQy|+EKqfgw-2pQR4J18@70rCVG%m7?4`hW=niR5RVL`lF0M9rfMn7%p z0Qiyuf||n#e<&0MPXUi?`Jp0-h;Z_Yg!E-8g0P+KH0@QwH1bNwpZ1%Bb`J?=98LLC z;aF%eY-VvqP4%x-8}TV5G$0s{#lk_T*0=@H#Bg^ezTQ8Aht3RmF7u^3lSqam;bbx# za?dI|m1G#;GlgvZ(LgvE!%YIQwaIWQK9mfG2cm<~v@AE`j}Abvoy-pxafdmGwe4-M0#Zz8S_ena4?)qr~E^>cmZu4z@1iW z!}LbY526}+jwhp=!{8j9e8`KH3c{lY@x@@+#q^SofaT}Xs0<8;#X!hW!B7sN_u);^ zG;U3Z21jD?B!(eO(MTUoquYsOJRJ|l2QUetXcAKtPmahgdV#m)$#9mb1;T5iF-*5L zmtyX5;SU1S$)Omv8w0});lvp#lB2!i2W}T-?#xgqVHG4_A_GI4G6T`rdPG>yVXDve zmVunW3`ybEg{kUt2Z5_q492!vR9WqHFE#OP0Du!u0%A*#nJ z48hSv<2B+RjKUXEBb%+gWK5R>pG7nafG#kcLDH8Z+`7s;8yPEGtQu%99IS@|Ksah3 zv0#IaVdlt!&X%$nb0eWXUy;3J#5cJ6Y%04y!^EVK-2rn6tm ztBzQs&&6QI3AD&i3XV*nT*Y8qpf*K(~F-?@+M@j ztb}BOpF9pm%L&*)Nh*hFZA_?OG$5;FNR?0lym$=Y`2?E+O*WP@XH1%^4E4}RW9JY# zjP;Pi!ol={1)s9aXI!rk-%87Zawc9(!5wET(*cbRMWB)Ze^f2W(o!U^OksxddXkL6 zO}E!#bI>xC3E@={7a+oW!HitH0TN)ysnOx#GX zqiHi>F)rk@G#1oZP?W*|nI)$+_$}m=yj6&GnSr4jtsmM$4ftTnk<8Q(7L(}-xt5^u z6jEFj3k&QIst|jOti>VOh1iJvX+!Qrs|W%Gk|)brVbOu9Vf9uDkP3u`bVCFkKU>dX z-w|XJ11WRCbQg_d?zFMic-vYkD#Y_?e(K2t@j=jL13JPjH`38&hL{Uz4SShm1<*0K z6Wy*t8Bqw?_|PNEu4n>a(3qrKahO!rAnBc8$Y^jUGyI%UQ4h&71ak=g?zqAjmOxdo zFM!iJZTklUZn3%-ml0|B=|PytLJI9I~Jy5To(81^X< z_QQg~#W{O8>?8#WEUGdU=^Ec!9#IX$o3$M5LTo0?xTV&Yl-4BNBY#E{dK6A67}JBB z24td@6%_mvKSxWF*hpc48c8wP{EX;oX~Tds$o!O_?){-l?jY}xl&@^L6kR$E4e`9(i2Fu=vsahQV-%9Kw7R%`Ui;! z1Q`lvfbqdF)D!=wA6!D(^f_eC=ipcPEM2;Azn^7`Y@fx879F}|$&!PXHa_;wALcmW z^s`6P2y*x1ARK)T<6m-dM~?2quXt{J3m16w4hIYPN8fXwIl$WC4Uc%6LTgDQN;9Zn z7vKlGNrzcPk&kfDJ|yEact9bf3W$9cp{X(KQFyMaS$nlnAkAsRRu4M@0HpyQ#^`cx zVRFayw3cuBxez&Vszu1WsA@_~QVdgC3D=nLH8CflSvZJP;q|UL^)Pw7AOOQ;6ZB8K zia0!a`7B zri(yUL7Vb6acBc%8S6P1LqZyC7LaduVcH=*8nS4ddU(J&q~Rv3@M|!V#K<@$*Rh`{#RKX7 zq$!P6R?yoDu2gVTa!`eZ9(hT#Cy`8#J*bJD1KN^eUPV~4pWZYJBzkI^1G7Awxx&3u zS&%|`65`kzh2qRfl0$5)4X0OQ4X-A|h<;DQ0(-UG46A8J;si|1V7NeE;#q(8U1uOH&LSf>2yN&0=ttadU5sUP&(r5U4HnojcoWz_#9*e=1ov6 z@Ry0L2dczm7|gmM%$xUv%k>~)q*D^&X_yq{F@0tL3yui38m`;`Dg@-5gL&h?YaOB_1t?Lge4~pE zz!?#k$Uu6hNvaUkG^j18MW~%RV_M0*K%Od1BqiM>BFA;GNMaWYhzw2(R%OyXXS$TC zRyZMif#;@UtNj4nR(r%{2$F%3!yw;=s^h(3aG^vwF&&Tw;iBjJt5pUqTqM2l116d| zRhgbef3mlfMhtla*j7QPgHfwhK?X|Mt8HPxakZo^v3kioi6`+!);6+{B0E zaW%9U1wKaz!M$j%NMsc#pyIrBNy$IQNh%a00Z0x0lSy}lNO!@4GFE9=hFcC*Kq+_7viIHQfiOfpTR%oNZL>h$w zHVxFtz5#0iED7yMCZPpv!xF%V!mNmI&&Y724DxLUv`G&B%os2kMc93_^I7(NC*%1( zbP%he6@)d-9Drd!7m_6-<1;X`;BLYHKzL8W3-|=*M{}opdc3Y)kIU16zpidyXJo;}Hs-fZ7 zRClq@-+4iLWg-G0Zgr~Kk(j}j@%p`<4wt99)8*;waCtkse0?}eyTywyU*DM9=k@gX zykl;+56YBYUv_-lH?H^UzTUoU$2Lyd7xH&`dpmLEi`(n*_jquTjNjkg(-Z9Vgu6Q3 zyLgySq~T>t;trwCy92YDw$p9ZPK5KD#*;Dx`ZSLuH@YU7f+MU`J;ME(PfB^!WQc!C;?1+#Trc?Cb6I7J33Z zrt24MpV4CxV=9;3uyK2|ye>3W%NN7l*^!NbUEVHH2Q1>e zp-69Mm#53!-P0HG1U&Gv9q|Uk-NBAPM_)MH6$poV{GoxFz~<=Sj;>1A^gwYnu86O7 z>f@8!hurn4SjXgSEwHxIRoS?y)0^GmRoxxFPMlH3K>9kyR9|nWTlK-gIEK-y`#K;# z+(z@-?eX-6LV>PccQ_mhbw@C@y`hd^&>f0+!eLKOsMqiHcLuxTn`ipgclQl-rUIKr zX2<=JLTY%Wf8)jpRo%2>*k2pb)zCoLy`#Rv-Pz^xbi%Q}2fux&x5JIrc)UKfms;cV z_%PQZyTqG1iFI3Zf{>lIMRtDLV-X}U$D0qg5sbj66(O{czS}E&W^}%Y_My# ze+Vpvd-Y%iUA z?sSJj9i5(z&L01U;mQRiZ)K&r+E}mpz3JFwx^u(e+Q>k844zHb^_GVH+NMqQ%8U{A zba`FfJs6ojEPRYZXGfqX(AU}7)f)--bOrjnp5C5N;Qt}+y>}$Zl61fO_dZ4L1unar zFBPy>CY8ry_v|*SU1f#)k-uKaz0S|u_P&~Z$(~cGOJdk`KDqz>9k>lrlM$yr|`Iu z?;BC5IrXYp46N+Q316pE{dCTB745wd+>VP&scPN&Q|Hwl%?IUG)f5TRktBt+#*pZm zZR$}vVxH5Q7Fl*+rXvJLR|AxjcLP6k_*pX?+sU^Er_G=lx?0-~%H7T6-pP;G#bsmNhe}v(*7u+s z?ho!!W&IfeHigD4PGE*y$TBTGG}4jAy#g=t+`vhD&ABmhhr68`b^XnHc^mAz*XYuE zy%H~MJQkaVlH64cGH+SJy%#3>Jl2d)~0k zfxFoorIUX&(Y2+{c3eF#Ukh!uZY!tPTX#@>9kSd=363=lI*vh76oKi zxmZQh8osfT`RnaXGtryrAY@|HFdf=yC34V5yojfSs7e)?H!MxJ9nVz!(lM7G6))T9 zaxGrgs_NXm#USW(eMN6L-R}9i?rbiLf>E=(NI3TGn~kt*GUvL?`RHw^4w14q2voEq zM}0;q(j!!gZs>a8sS#@4erh}GO{ykGjAzImV9OP)dF20Tjn|3Q*xKH$Zd2FFPMyc(-X}@Ny*(0;5Eb{~XeHB(^ zR29sj37&$5el8_OG|gk7!`?3Y)vy&Q8V#pXEFK*=0eaTZpq$bn>8ls<(8`rYk z$goWpEMTpcjmEj59<}wjS8k=QkM(s|dDvI;bi1diTUVoMR692ZsryxCTthFa#y8D; z<41%uZMtD(Vq1YaR$yuYtpkA+f#N!*?fK|X#X+46qD<);wI-=s`dD7p!}+vPnNNF@ zWvj3;)3c?O@~rK3S6_~us-H<@HWwhY7B7zHdZ{FwkCkl)3AY#=0<77 zG+C8eq}o1e$n;&)3rs_?%frQWn6LKNo2yo8-4-{uHFa~=dFC|6doQX~^S$HvopM_f zoG76Dn}AhhiRH%y(F3mM1&-+|5ir~ayagC#?id6rN>o(>QJeZ=a2)FewQqNq(?)Ju zt_I$*q}MjHmOtMQoql=PnzYv`JDavlbXu$k)C8J`D0Ve)9Md=0M>>eOpX=(OVw)ia z7hV9YP?^FgQ`_Z^kM~uuFxOd9fV4_)XJ^J}!Q1q@+Fh1rt)QG2rFB1klP6L%5zK#g zd72`boM8itv1*F$8OTYRWg@H9GHlyS`xrq_b^XY9?e(;=tp;JMY^QUMQC=-4?yFY` z+Shw}pKF@a(K3^sIL$ymG>!B(4J;#Ikyl06TBZ>=D$6|7EU^x0TQQk3B`{qtZ99gG zzk^QK`-g4qJX^Q#o%T92%?xK}EmaQsPO}@mx7*<9S#;dyXot=hOvFW|3~Oq|h=z4! zSW#pkmw|>|a!uVp!MKjXBOj{YRtEK@2*}PSca)qFh*ATTY@h&(+Oy zn^|7bqxpC-Eev<=thz3oQ{9cGH+J6pwA+|g@=NU^_}&73aIX(1>3>zhGH==tBQ+Lq zhTjN4i+@C?iC?EVh8b#+p`q15pQ?lOQ$}Neaaj9T#KA%L1ki-dB%r5`k@P@HxN_mr3fDEd8bty6ph}n>y+w?>2O%M)(*?svf3`0LGjqpS7)J~%HqT*Thl@_ka+On%ni9>2^IZSB>2< z3e&Z@pIyz$H{a|i>#)=EOP#TE1Wk%xh;xlDPIRWg8hy}L-iG}NPAQo32`BB?*xE{3 z3A{j8(>kz1w@t%DgCh?3-{3d#Gq;lOPNXSo5?HMR{V;A8=)E_-T{%uxkPSM&2^oCNizV`uAy6+>jzkwe)Du#m$KP; zVbbbWn(1b1X{m!w%i1ke{jllHu8VuWr%$;@8fi%*nHoajXqMr4UYcHmxX|zsAVnaW z9))lw@F%8ji?1K(+C{&*meIq0rfQwms?e;KN~QfSbDAjA@uk!<)ov*YdwTw8a}U^= zv?2%%2Rar>+}a_n4c}B1JqnGW#pB3lAY{Cjp4zsw*m#+s5*f& zES)d8^V;s$wXS|XHOl4u__Q*L?Ui*ZcHi}&u?erkY^FA4QGFAD$f|o%B(BTc1k~AK zW#MFWP4gmN3>fT3_y8ffd|(<&J60cxe_a>V-MXEgOvmA*wYymdXBW&4p|P2-qd~CQ zUY)uUgU%;?VZI^fZzDT)wqoCEsJ&sopS~3$ff?`>#Z%LPhcUt&p#FSEH&q+%!og-m zhKJgC)f48KeFLUAlqp>xtEAl$Y(zVT@Hr$bT{v*y&8kM=9K zGn=lu^=mzMb;sx1adrvS#ih0U;#z{i&EcD-o1?c8IbV=B6P#XUG>*XqFfwU2HFs%V@6xW@jIp6d(^v_ZmHeczV0inYiIH(x4P@Xerx4SFXx=H zp*{pRAy{Jk?L?_6=o`lm3?~xqBMmY)eT<=jX~MGv6gv?%!_)?LwNcy)?!uSGEG5xO}`8Stp`ye8XUUST=vB6%3LZ7f zP)VDZ7!!Slrygit7%32K*42L$8@^g>S*LBTFg^y=NibaWCO5?}?s~9#bmp%Ihc|2{ zstX7!7Em;pZ`$k=2D@NGT1EILC@j2hN5|d8%t5Jv!xT@~TIccD3VWsT>5;B&s=>Z} zoVIh?aWNP?3fA_N_dRV<$Q`1gA*>YwDDct-jsSVU1uAIAWMQkWV_PO z$8a{PVOuJ8#KrT{6_^9Zv9V(=EmD08bQ!s!;nWZP$E&+poW{je?)}s(t!EnC&|!N$ zg!-ZMQ1)3Rb+(~;4rJBxC;VBTMSJv?r$SG{_^R7cGv&W)$R z_&Cg;8Y#90{h$X%gcpS8%dj9dXsGngXxW`j<<_d=OP$_BbE@ns^|NMPhtr%p3rdBw ztv1T3Nh(aRfr(!gGc@Tmgl#&60MbBxo+bRQl7?JVJsuaDkA>w~q|@$7t9iGw+V!gS z$*Gl1pN8x4q8nwrrs}T?R`cNLrTn&9F^fV42-SyCGwpb>Ld>`rGtG(ugdE}uE9Str zE2b|zo3HyA7)$Xx+1Kg78BFb5kh-r%`TlKPR-DneRtX-{-MU3{({^t-^t`h2)uRG{ z|CvX{;aKTe(4zjK)s)=54 zl+bR4#;tMMZaarUIMn^Ey$jS?Z85#2U-M1mGHd3lgK+(h4F@n9S*6b6nCf)PPULXckO_DXr3pO>yX zo>|!DyE7|y``zjLFk6{-$D3|-(mhRTujM6{(c(71ZdHAASk|uLyJ%7z3t+B-T?l+# zAgT#p56=pX0L{UHd_KGmCSKpWmEFU@AD*TiZ7|adM&)XD8-~8`jD~jIZ#mu+k{pqi zSPUGb2tyi)_Pog86&)uXn3z~YGr<~)iYJX7G9a-v$5iufbJMW5-rO_tlYG6Lnrqv^ zxVRgfEHLKGtEsc>proqX?N=43#BOvz00<)o@t}CT7o5KiHnw2+|;VxEdVZjgu?$p~q~R4Qh!)A)@_8IOGD> zP<^(E%7H_b4}lKMeux@|_VRteMP!j*Wuhhc4?aK847d!peagI+^xNQYXewjgG`ti+lS-D{YHl|sRsR@DH|Duv-2Qz&`O!j%+uFeKIraO{Cu%j z#xXM-w9~t3%mArk6ZlW%Uff3fsSg@GP4s1?GZ2%(n~_ASCZL0n0oN&~vbY1+)d-B> zsv8ni(9;BpAO@|pr@{sx+Au6u**s+%Mjw4Wov6z}xzlg8qFE6XaSu1$R%YjhR?b_E zogNOeaOjRi;*e;l8;p#NiLsObh=V(+f1Re;W2Q7~XC@yrEP#St-aeS}GOls8N3C(NpR6cA~( z9K~jB;%otWLK930myaws0bCi%jhK|XDi%_wk-M%v%2W9LXk4$?N9qF7?PPhKD|Ine z)EQ;rKC+?~L~2mnhN#}WtzRqn!xBdrR) zB{4yvm0^e3WJ5P2$1c9xk#X0q)?uhC`TKT}vLE_%cF7gm*+M^+Egx?8-lL~$!^BuA z-@rAjX)Yl2k@yK303$-3J2u9{!Hb8y($QQ1L)|*OzUxcMf$Tw;J)Tp&%%rQUPPS9r zD{a3Xwyg24IS7<%uq#?t9IXI8J!Ku#HksoFW*GFmZ9-HPA$j?46>HE^wppAU|eopzn~ z=g|3R$7VrFq3Qy3x#9%AF6S|6tF*j}B zf&|0IgB#P)iidIGQ5zm=3u}1nOw;bXsP=kZWxd@8{=L-iyXD>CvWcR05t_?Gf*@KQ zX56<_#shMhAW>)$htW|e4o;k^r*58AYK%OsxwmSMUZgCe-ffwRjBZqL#%}KNZjI`* zVQq&&MvMho%5%qF3Zfc;h9L%VKA8;DV&%YK;4A~IQCk)<30Q3F^j@5ghShplxP?HG z{Ms+Ki|L7yx~B8(^42}y#`A^W)~jX}dI^{zcfb(E(+svU5J+wSPYqX~5ef*QCm;o* zh;acGd4#8QXWdw~SMAN{o+`OpfA-$lG$$2xinKrK@8w%VSu2(HK6N&Z2_o(j8iz1* zi0cT%VN3`R!2{w%+I|4aQK1M}fV=>1e8k)%X(0c_E#FL!_0u%lQC5Xa*i|BBur&Mo zsFd=uvvQrzif-1@OEYYlfDhgX?_I+0WOSI3ss-W~c`@S9i6&WCZ5uNxF=t{QfK%JQ zs@<@Z8_zHG{J^pLId4PsxqRG~v~X&j!g)RHPHyM!<65q!6?j3BToyVDkfn{XvOFIq z69SI;^3yO6IMu@FpiPM!ThQ@J;F`DMdGR{fE&IooHLVX;?<4iGm`-ZhZmS+;3d36O zbvD;etBlf>bs=sAMnE8l#)Y2%0V+9R-B{Ekv5{MgofWtgGgH(($(Kce;K@ycsow`F`Agi2skuZldK;FCR+DU;SONcBHBu@ z6c!a=8WPsf^+j}htmoxmW|x&(KfNvV!W7#tKZ?aMv0Z0B_SBuR$ve*F7*l^FY+#nZ z8S#=r`JyOsdk_#miiAP7B9LzoI*|P2|G~G^AZaM4o1VNrMi;Lm-<3 z8_O!du4yPagYEkv#VtU1gx|Eh`pa`R6^{H)A*EF^#rB}qv)*gHnzh@Ht7_{}_SE3v zmfdCSOp0OUrJN+uLii>^AYeCW5xf)VQ6D|Tq+n$N9Z%B3Yfn=u+npX;+P<9&DOGE% zY;&`CTsB4HKAY&*X2ENbCQHOCS7(vPP^G!UHzT=;Vh|oAas~9ECot=jxIa!8W(}sv zv>~GKB%wIZ)})diyiSJJf|``>dNkffy(=PESlZ|LvZ~#U3JGj&@3k5)C`_lsdt}6r zb}vvp9|s&72Kq!J?+JJsS_(uni3IqtJ`WHC(S2>)51GJgrZT5`qwkE%!(MN;PdT^Y zxs*z&Ct4$B8(}Li5hZ3`k%R)EAE-yM1p5&z7}(r0=F{S%Arqon2wZ4`!_)BQm{x30 z1OO8Yq(%@>xXicuHKpxy;cc0{3=7I7HzX(KeOy+Kt+Bf+48rzfc`Y;tN~J06IjRY- z0#{4aQVcrrcYFc8WayuHCY#8^c5U@br{*iHR)+A6L}_ibk0LWhLKOY?C*R8kuwJjVWl zV0j0wKpx=tlor{A4m% z(L?53rX9NLO-GZz*>=nxlL^L8%7JqnGgrzeCaQ)deD_Pz@g*7tH8b~ByWYj z0n{Ai*Qc?r9bF}iCVQh6F4N868s6*9t7ESGIXR1)n<8OBiGPTJR$p4!%WkA1s6$?v-TlbNA()G4Raxov908oOO~yL!G_ zI3JdBd6ncod1+w}QB474ApW|K2~kMx3E>7p0|HzF4Ukt5;l2BNQ37kpEbhP8<02T z5!e>Qf8eViX9h7^xZ1mFFR$;%f@~yi>DAiB>z;#$cCbC0dPqrzI8BFs1C7F10my`1 zi|IRo0P5RhD4A{eWV${12#Dd~nuMb9W&rt2E99@CT4@);3$FkQnuIq{kH5WjgXUyi z@K^r1k{&PJU2bleJqsW`9Tetgb=5luhx=;qdIZ=K$dOnvLEv~b36wy)p?Xa-f{7wt ziKU6WG;a+UgbyIq2U4V#ece9%-9|svMo#{Go0T*AroJ??>C~drCJLi=HjfFHaIT*y zibNL%k+nw*k#Lx4gaR)E5^KQfMg*2Y>L6Nd$5KeQ*rkGAtuxcs_2b-~f?~U91UJ{8 z9d`Hh>txZtydDmPyfy{!B)Q5AJi4dfd8fJQs zN!=FbwYF|{m!Vp(RF|E{V$yldEf4)sHj1v<1*BAPZ@y;*J&VgBDa$;2JXj9IOdxSl zLS7M91}$OviK@jRFUKQmNr$URUp%+HsTUMwn`kAwoJ2?eKHG^QiqnrJNk`5gSceiJ z6^Zw8;aUiBL(-!GL$nH3*#QU;v-g(;t2*&F<9_Nr?F@6Nbf>(0+?rXZaaoSS`}CIC z?%(UZjq%DN1#s{fxR7@8u41buZw4;(TfaXcEBhJlmf0k(5fSM|6B5Y*n8Mx%9?$@q zMZw=E0HKjPp*Rg=+gR`Snpc<>t2B06m*ML#qrxieuEIw!nK=FF&e!(Vs`#DeYG>2Kr9? zR-}|qV{_Zr*Tt$8rYimD{sV!plPLkTkMZ4SPSl&+J3g!mKd-@bk@jpr4u_-{5JM)4 zN$5%PRH0k}>iV>N*j+89TF*7#r%~4Lw+r?_86W%G`sBXpmM57`7;N5akI^=HS3Nya z-b8_-7{NHBG});G@tDX8lKe8n4;ZLh2wKdh;j)wau9zfHY5YJssD3zYTUn!U%aNZv zvaDIFFe>*Cul-rEobII}f8Q&SH0D%NglghAAmtCS5h6ZqQG)>LcgTAtjT9#bZRvG?3Q-jFXHWXZen$b^xA05pyJ5EJjznQVBj2hLO{N zRK&3Y2|T(!loZq}Mpl8oWoT+uD2mc&MIhVXE$LcEPY`?55-0urV2y z)@so#&u&)nuu8JNlcg((k^lbM<&0$UVhG`BRY`SAdloE=W)lR$SW1SS&kn?-ghg1* z!3syrZ7sIt-nc)@Eze^++FdKmnG$U8k6quY?dGY~%r~mBQA7`mZ!WNkgaj7pj~Tde zwmESph!TiPqLmKmiZCCzuO2TCQGlMGWFeSX0gzlyT;AuuG~S4D%omms4VZolLJC={Vl@vmgA)Z|KvTCFIPS%%Uuv#E2BVQbQ>>Dl~dGXu?W?WV;5XLdyRbw}LJryqGGF;|)Ec-I+h0`-Q5g##cQzF3Uyb3rXVeqZ!)XNjEco0B@i(JreF!s&V7V;oCJ4JCxj7D z&@%ayzYy-=8YE4)5s?P~8=#u_Is^nxB5TTX(9vBpO{!Jr*fE-??x^n9-*sa#sTJ#o zb*)y+Z}hHReO^-aFTorlFs2%VA)}0$<`v*hSXYe zUWg6xigqQeXVu&Ec%P;_$M<%}x)1UM-=@WrdTpolinchK#nm<{|R7WID!7f4)#i4bF*sNQ6^-@Z;qfe*N@p5%iuY<|v-5-y=wNW4L zbJf){>bJY^VTsZ)<`Q*Gg0>k!)=OxVTzOX^hULJ8N+<=IJ#F0V$L83yhS%PviJXMZ z#?;KtDLtg@Bzt_Ur_ug!C(ip=5$nOx#Yqt_NUTG=N(qMYKe#hiCtz4+3Tn-@NbFPr z!tlEwM}NWR-R=9v$<0=&ai?-RHT^|lxwAT*ZLK?W@|#nj%+JPDh>%2TgwuZ}8z+)O zqyc+_BZL4Eo+J_i2xmzciOkr9A_)RQjyr?_33Ef-xY(Zn4pDOZ@M9I>HkO%d#x(PJ zBGdZ0ermr*VV78Pd*$}MsWx$PwbnV>PAiW&=}+R~<4OoWnbZsXMZ8u%1SBGtA&HV? z3V>hW7d%LXfB<6PxlTxOkWLoAVtI}BS#4Z4*`v4JJr2g&Tb?J2vAeF$AID+wVGaFM z%9#h5=64DGg4zgxA~IA01bDS1<)DdNQjMqy^lX55$h1--gLWeKNVS@o+;z9x6M<8@ z<;PLchTFz2-|b)4=WTmgJ2bV4G8xwn;h+ha|K^Yh#K4n$Bh#xu)dYYc?gbS@s+3Un za6uX_JLNI(>?C-Qdf5+d^I16S+IjoEzeOnXBkfqZgr(j7aE&UnWw$-t4QW%fXlewP zNZ$z%KhQmKJ&1B7hiW(tw<3i0h_SzYoS1rjw(XJImrIQn1ApW_Lc4g|jr4P^mD|tL zxnVCj(@3%SU6rz$$gL*v)h2*QA|q+B6fHiI9DC;9 zLcqjlAb$#~gB&53z4mI0^W!?X)X4LiUKOLZNGbOXWG!b9_BXAjlc`Kd9Csc%#R2JQhu!DgSEEtQtWrf%v8e+j^Mv;TR-l6M^{64D zYRm`Qk%7hCh_j?y(_TlL*V?NrS;XXPFCV2SI-mQmgS2yv_Dg5ITSwVkze`3W%bI*& zY{F-<6%zI(;g_<;Cz3H(xtL;t?55Pp8Dy$cn<0Jy;T1|aR0kSb%s<-qt~Q62^ySb! zbyx!xFO$6~Gi_HS08`26dMh{9-0Qx1zCtHs_{9ffJ(Hm=^6lv^ks^<>M~F=jjFf+c z2nVSSuyZceAtaeWAI(eA@EW#?W=G5QE}Jkj@0zKWw~c1$Jlx85uNhsfez0HHO%X5=yxd@y&14E$OXl-yX`jNE!L7OMm=IF2f)W zxykDZEPW;rP_}}TMlA+dkO7sPAE`ZI8A46qTxuE-N=kUwg;INFlvab8(|^^RY~=Q9 z)qZ(!CZ}j`=hCCO_PG0CjPCZMs?>@3HlPh+4iX^xggk0EPrv{J&X!=PjhjkD*99J= z_BB_v;(LLLp|>|?b^0XHx57B98C9@ z#j86jSL*L@i>>=`*6EzJy7wAPV|P)q>EZy@Gb8Aeoxsk;$dK>|Mo+`!LDfoPkQ5BT z3gE^_1`Lh`9A`*ipBS7*JrVvTUIs&RHMgryC9jUvcdY6h`AO+b~Fn{DvKz@=l0X~5oB-|O;xaWd5GBdx+tq6TXKqIdS|2B?gRmCf^fsAVroSwu>8sFQ*dH zA;*ZsC>SRRN&BSqDe7&TkEY%!J=|AQH$6MK+N1QFWqf;(;aKDo|>%q7=>(6FTXOFAO* zWTFEC?u%n8k#I`<;Xll9G>?wcLbH6jsa^bzle%66Mh|P}_rmpP5t=D)^y#YlIbDL3I3UI$_9CHs*7Xh@!%$LaI#hTNgah*i=s|g zm0@?+%T=r0sCd8C+fgt-ANJ$rte`fcT5d~zVw?&Lu_)vpjy>)&(KRnn;OHTOp%B2U zAU1mF5_nPx{VG1u5`|E~b~&14+xMeB2I)hmT@ z84D|%LN3`)!ifE=B+94v-_)@_j-!m!x>K#ny_j4X6t~n>o!e#e>!89{14K~a0@!o!1wXmix$nZ*33lGoYCee=UG1Fng zWu6Lwg7H=?3kyZK1L*?xkX~$&S&d)e+4skpBARM+tGvE~8F$0Xsa1`_R&SxNvQB$& zs%P8zPA6w}B^ib6PRUCVGk})T2rsiggs`%tI$&Y=oZ1yCFW_rYkw9dU=-u-%Reja; zU5D(`N2{81N~=>>xqH?5zB$=cE)YW9+I-g z$$=rL4l*b>(L6)aohUR3_7%T&+VtARb^G0Rop$a*70Kkaa$K+l_~=p3?7dp^y`4X7 zu74C|#s-qXVDt>iY)Np(ZcFVi))}u~%BF3SiV+#R2ASy) z%9}j`dZ5Rio&mIOuO{%S&_$yvbv=ye&7Ke)F~uSGp0E zC%wkzwcWQ$hu3zQV2mVGiWh~-r!Y>&0&A;7>`TLJ|Di-a_T~+8 zC1IOAqK=+891wzJYY}0JD8-Xg1`liDr(X=T2ITvyH=UCUgy`_XyWyc`d` zi;^$g8%ye5^$jHvaQeKTc*c^uAVkh5iU72bk|d2bW2cRn5Pm5ILhv`9I3>8I|~<7FDpjBJn8s{;i{dF_EvQ~+NSpB#eDD0PPiV72B1(ZyMU@h z`bir`|KhYrsW*dz%#Fs{a2N&OctMHFu{_4#LZ;O9wO`kx|XVPSUbQd zSsVyEBq?AYG>%7OD(tthzL-|`{pPKw*9Mtjo7S;f2-VeglD$?cOEp|?sNbju*AI9K zN@L0+@7!eLjUS)Lj--4cl#D=`d;Y-k6K{VM+K*;Uczxk zUsv6Ge?$z+U3;sgyIPWr>e#prto#UH8+C^|NCSlUkKBFyW~K`UG-w~ad%ajG<&CB} zD&&mld}7PbLuFml-El`%+QuOj%xilu<{X7yNn)4s+$uVijL?{B10mon6Q6+k1Cg+I z1gT@#44z%Hs%dw%Ua-AQud~m2rBrQOKX!8OJ>AVW*Uj8eDVmF3dA=zBKJz3|IAEav zIP-*4kvsxIxFpc6Y#d_2tr0$Z80qtJz^YJ9>1rUU!l?UcZ*&!$rs{7OU~QO(H(Rrks(4UZhS2=O7|s z6z>V&kBtr}nUGx_08;FN0`|aS8q_E3lo`+8cDtihP#A{7ok z5}--?hhngES?F(DLw4<`EAvx$X?sIO>HFcVa!OhE_uZl}mLilzewEACc1enfRG$cR zkbFpf5G5N&GkFMVG7~c@A4swmD%{mbkD&ORumwaqo+EQEtq#~635?0EPQ&T++Sv!w zhu^G@kDbunjZ^(eML)pNr)xQ{uJ0RU$rg&EFEKgzPANT+oBwr8PL=84EEszU(ZeA# zFAy38Y1nfI2a%k2kS)PL5D$9y+OoZ4qdv>G_U~4%KI|hZjX@`EtQL=EE<3t6cOCEH zyZ2G`Gvf(c=X~a^kNoRZc)L~lBdhN;vM~4eLs-^ zh=^fUtyQH$>#xb+d|5SHmf8y1n@Rd?wh#Aw?HW#M>vnfi%ipyzQ^k9trqL&#EFb`d z94=CU5LNSSNHB^N5b91XV}$s_4iKz+np8?zO=v$K-czN73H}z<#CA~lH3HlrUUh;D zTKbr7>)~|WD0lsbGMPOd_|A)T{xoew?b0ngd**51_3taozEa;vqA4st0~r$yxacN4 z7ST;=GbA0tX8$|QeXXZ<`uLFcGMn|g!ImO}esdcJ@B7v%80*e?(@Ukc)zdj>S0%p~ zcAZK%7I-q5WI$4PB9kd$`&emCNW>JiNmej%1)sVv62wA05r!IWoqBx|;SDyx!G2>4 z4`VZ$`74C}V7GH_+i8@~-R^18AI-A2<%1B+qq*OSKgc(4vhWL2yIxdu42 zE;W%PRFTa?_=GYW?0bZ?vI`LBD3(4Qs_8z7-L>j8*l*bVs@ze%=I+#7j9Y9`RGe!2 zqnGuL`DKzy&2k}Z|16l4v@Yvy0*U!1F?B*<6G-bfjX)R`-4w@~lgX33v&b1{Ul205 zDO&-ov3zAOH9~cO#1PV)eFKPhgyFoH-Ha@4e7x3_OTIeE&bQbF-jU)*O}oqcCZ6qd~)W5@Mb zmPjQFQS*o`w+PJR^5LmU$_Ml5vq26FALN@w^4Y2o5!+HKqgq!p+K2jdTHFVXS&34( z{j#j&D19nVog%SkwrY^2gGv787~=G>DV9azqDnvp&}{+$*^q;>0e}^IbFm)~!bSRJ z;B|AExiZ|nKDJS_t)_RyQs$7a?JEysuP<8-kaau42{@2;+>28Dh0TJ84~9#U?QM~x5lA`ejsU!O_oSS9km{V-QhGkJZ=}G zQXO4u>apmjCm!xpda|z;hhuyAI&xF}EzVRtm*Ufcutf3UzPN%rL7#XO7#nJnDS5$Z zgfmy!Mu{!6I9)GnuM6GmjT_l!b#9MJ#wa^qZMF|}T2e}ze4Ql4MfEs)U7WtAP|2E1 z;$VLT1~?c_f+I4sT3_3h8bVR3i5#u8Dy`WHSWM zVBXkR;Al*A&sDQp)^9z4jS<_xSm7DKl;zJ5#NJe{B ztOFFeGAYXtIYbOlJE%Ypx{`NeXaTCMR-mh~ztN9vy52|kb9;wivqR=XxkuS{v7U3* zO7_+<`t#kap>CQ$Yt|uLdR&Ra48}B-QTK0&LPGG<|CC_ zV@AmuCWn?N0-G#i)Szfi-B~p8%yyNyzMtDy=Ecxzg%fX4I6d^n$}ms))_B*NHM_A& z5D}84`GW_GNwu9Z`9AD$At+DG9YzhdpZ)u!WQdvr!puAsVJxs8dxo<04EvP&(PpzL zElYLXYnwyU?iWVpR;@OR#k!51n-6NY*L1wV`ibG(-tXx$&87CeNoHT$&bRNE+VXrIXRG&06J}OFb^4j| zY}#h2pyq{U2ReL^GAtMN8Nk{w$|~E+_RRsWnvgQa+khOCB(f~x1Eq?Ylay$P5u8#f zcc8XJ$aglva${t1%WY=t*iv3u{Z+Pbt~aa4nmMga+`;a;yX}ti;c{8n@(=Jh> z*lj0c=y%o+n~+$)foyX{_({@KVMvIzva^Xe4OGpk7$k~t*trF*0b|9gPjyG<(%{;h zn&aAZ*Qk%e{@pmPosQj2-8y=zZ2QG_ahRH{m(&lEYiF`wEvl6yI4R))5)ty^LXy7B zud+E(C4HFg+`@LE-;G^$xE-Gsh4!LtSHs(4-OLQtQ`lzfluN0m&|imLz;CiGxpXQz z{mKtNY&o3lR-f#b{?}*8WsWqh7_+1Ov&GGq3(3~Sbey0&3cH=lKk;71(yb_N3Mhc$ zV;|wTK!uAMhdx1p$5LTon~{_FR1ziQY7kPPsEw3~ zlVFixaEIM!Kq~}hH0ULqI)Y+S5GqB)vXRE~YC2RKN!AXd=tR*h!B7GbZ%j$Nup@ zj_g1F`5(By62qnnL9!&$cxh;okaSI4FU6OXKKAxwHyzwn^5z^e04PJGG=+dB(Hg`K zdqToKyP;79DLePUR7eJk)G12_Bw4&<1&XF;$2l?<;Fn5jD^$ zYZTfM7nwpqSbyq6*c%DuLN+RBhg~HB)cDHeh7r7{P?31Fuw~p9t4kb=ZQ4u{yWy?i z7};XT6e5*;8qy$8A?)Eub_6a7aXO3IeKzHx{ui%|Tpp-q5^;$$5Tv4ZkW1noklB#t z2CO)RYgoqHgnJ z0$3r8y6mJMZ^ka$f5$!hK7WflBmH*X(QYQ*9Q-#H%+J3_&z|u|XK30>e00@hkNNS9 z{q5^XtElmaULEIEyrn!BqLDn?d`m|mT4BTu2I#nXIFHZIKWx2vo*X`Y`~L5L`7i(V zPq*Oz&m8>U{xc{24?gGr_^KED5)bO1R1 z^Uuj{DX8H2!T(XQJ`ppI*NH zX=lP(_#z!P|MjQ1>C;a?e(si%&T=pGc6=#h^Wn=+&#V16IrGPMVy5wC{}j ztw>|zb^qJTOM`9XlV4Ev2;}z;9r3pK{p1?Y-Wty)B`?qRw?91(|MWMcmwtz|T1gt6 zBhEDa8pTan2KVF=?6*JIj_6D~qi@KO`>c1XIbGtCz51V5LbNB+CS%1!onC(WxX5pV z`%mAvOwzORMLI!-(ipBDzeSP8sxLqDF@I!GUmEnGjK`zYEEHZUwQSL?bzkyf_ixEb zA8$i#CeiEK=c&(+zufiZ_or}yU;h42{GBb;!&*Z=FaQ2Y4xf!EMyM%wlGcZhkk+!qpAHVHRcv<8G zIgo}42nY>$zF*mA9WBQpPXJ=_Cc04B6je9fF&F0Uq+mq>O$_j!=kcHEYR8PX7F@Lk)ASiZ!A`p4DCN6Gr(x-?vi=VCpl zD=4kdhKKo%v5X&C`m??CX=Hi&gOC?LPXCZ|hL6Gf?LQ}-arZZYm<;KkhzWBoEmDpz zUZL!Lisqj^b^qD8gRXkg8Ga%iAQ3%=Tb}(7PwjGg+==74IOn4u9$2)uXscweN{Ks~eHV!QfhubF)NFF#He*N=7}c~MzR(v8Jq|F+OAea`T6 z+*ydfZ6`DgoB||%qqocH&o1&+(teycX$nmnTCp`RKPRXC@)9?@4og0I|5HJKd{!>K z1b_n6pzqeHT@I6R{xo&ctG4s6?)T+Sf;Qr1`>($@QJl%5ZSJHQV!Upp;ZNNB?TH`aMxh_JRgtDTAHSskAP_ZH z_V^I6=)bJu^bb=1RVIHN<$ret{JEHa72p5tE2O`^f-0}T`_n}zv0jNLj3L>}_=3Hg zPvTJ-#EoQs9j@lmSo5Q?9Eux@Er96RL(Q~79t(9?Mm89(f?I6Ck?)f0K(~?pK0g8RY9&Gz~ClyBeRyj8-x$@zrAMBpy_3G&d)VZY-5@ z7v3t-R;+ct5;p~n?X-ZqSq+Rdnypt}8L$F5j{jYQWd1-+c zi3%R^U_ZdsAK&gfL<^-0*icrK;GGzQbCI~gGQi=5eK!;1&cRsNL_A_i{J9};fdBVj z20Zq1bskM=;3yrcvM>EL$b$M&W3_)nSf(IbD&h6y%GuJVLBb9_-|O4cy8Y`{tMfd_cavdz8rXk*5!_v_1zgVSetiV2 zTHWWfLY95%UedA4^gsNmKa4+*{UUzz|ChH&eE9$Q>A-);#B+2$05doG`-eRiCnGkj z@q|3T@b{dw^6=sIeK`fxy%ne` z9XM&6CvEUt8riLPr|gI}aiSn%ha)jyaa(vCz__8d=;vf{CQiHh(b)C)$1?;H;vl^I za1IUsc%pq@amH_`sRL4SGvY14-}{vpB)_wV(ye3t8PXhwZ6_7B6EOMk^xv43~Z)AR9E zm(I;=T8xxwlFL6bG^@|$`N6X#j~KIUi?fgxzj0C2D4qKzlgjp(-AKpETK~E`9kTcj zG^Z}eg?wo{C{F(PfS#$xB#*SFL@g)3)LH4PabqTo!+2Cg$q9|fXROz!W_q3cG=nkzIRgn3GOX?`9%&BEJw2+pdF@d^R7$+#Y?XDr;uG5T9>uRk6t zq6iywL@)DB+w1dk{&samZ#dI?y6*}Jyi$Z$tR^PAn`CiX=rCsFal+bkLmGlwaO5<)>DNpJ&9)5p&IGlH< z`F4{Gc_{pBjqxsTR`)0S(xg-3a68@1ALCI%DJ6*ZlLuf9<1Wf~yz&a332*lGJL20t zdof2#_onarm)P#gw!-|w+)Wr4t7=p$pP=>z2{vMJ}rRB*)prgoJd|l$Bz?%B5 zf8C&$Vxoz!V~a0zawR5nOqRt^-sU+AJQQ;)C}MmVmPez)cr!iCo*&lZuCU1=UO--# zwyP&sdeDE&5&CB{K8@(33@!l(!uSAG5*9;n57QUSe&t*@CH`Cq8E{e*Xjo9^)1GsVtK&u>$>`h+dZAuQBoxKUP+5GV4jl&t%@E zJ-svlJ@0-!ZGRO*{$=*%fzWFS%#6t+IaT;3UMc1VKnPruD+^mh|6wRB@dFZZ`TNTN zzHfR!uzBbHaVcPu)}Whd^Rp|ra9{K=9&EQKlrFuY`81~Yp3nOIOzBI1JU-cQWRUs9 z{QwurG|0EUKk0}Wdd}U;`84^}PR5Jbc@Dra)?h!LA~xmogs-w8F~jdIjbm==FHX$W z!5x3R4#V@jZ{h)bKXpt%(=YP_gf`j{&;Bd>Ek7E{FJHBL1X~Ar$|u@ zmW8=waOe^q189Cj&&!I5h2!I<$@sF0rPGy3}L z$K#HFIO_F}V+x(mgiQp$#jUZMn?#{-rgX}FKE}t-yA@5ZlTR3)Xnb`K)3cc6A0(2mrrSwmjawiS!|R;^}h?GZo+V z`&l1Ho|7YE7jEcK96t&}523oDzZb8R93d^Be85IL7jxkWed7++@gQ&4pu6Sx5Xm!P z!~knTx?|IZO!mh#WpO0eJEoZDN~Gt9MHVmI=Pi;&7K0NHcDoKX_!w&F!N*uUviJvC zUZW2tY#4L?qVyr=C-N-cuED^YM9_IBvm__=4X@pCie; z{}?6_*PW04g5&s{4^H8=U;Zp4@VA%G(fq=Ed_2hSDUT<^@gzC^`p#e8`+4tVhMz3Q zm$<<1DUUcn$3rCyKe3BHlKC(%^QlmcfBkgdi5PDGRYZS$uw+O-sS;%AuV3l=TriS9 z%);NGK947OTnR_PBRwbaPap5eZ2cLD^4Ej%?~DP@`+L#j&~uq2WBBr~grxtwiIOJ= z_v5$;2lt(ZQ9keZyODf;_xs3kqI~tsaPe>`(VxE@Vd`XF|3cb7i5St2NXG}s91p?= zun?;c%bZ+7SkZq~{{9zBF}!n`ExrI5!lb`b*Z|A$HZGOSN^@ZZ7u z;ja9sQW(@fUifoNzkc*5lEs&W4*V0!Z}=hD@nDN`@rjv!jPs{*kqgA~_8E4RBY*!V zFMNlp3@G}j)u{W3f6Eq&G+HBnAo(@y_=RRY+X{VJduJOB?Eg`0BX9V0u3pZcSZQ_t zRw8ZcWw!+=;&{eJGjR?zAhQr1zlp>C_5#|I^o#YF@cI28AFf19R=pg@d-k}1xyOM? zz7%JlBt*#vbwmVvGdg}ao=`M6%p*8@I0ASGS@9bViJiy11El&16_@zD09Bs)(@TL+ zcu80}Jm)yI=(|^e6P?)1(YNmyMEu#;D``n%)*Jv0Ekme7B!8TE^tiM{MtFsvCGiq% z1k4t=fIdGBzx_fqN-lAiH{@B6;MjqTJ#9Jd7$bPO_FC{Swwe5f1l-4vNWS;`8~^c) z*maEmdU?96&l~;mRH5d@GyndI&u@Huz~e&X#hk)%c0MK82tt67eGZ+_4L^MJt-hU{ zu6@AJlW~(X2q1A6#%Z+u@Lb|t6p2^Gak|7Wk4=+IV(co$uEYFEy#8=d5_vYq80dX} zbUb-N8brZJarvCc@3;FMZv63sPi6|78IwORE|B>%+V~M_OlJ8*^SoR>e4>}1lTVOC z@u`JYPGIqzJhb~SGFl%Z_Ge$_Ymzhc!O7U?V;Jid8OVqpEHbjp!@eMTaR%RTei)t!bFmax z{oQdq5;^!jYJzR!+4~%7MvEF3d1fKMpO-zb(pfGzk-}9ES6eRh<1wLu`1I>(@mhW! znr(p>q#LqcSgoHgd>AjDOP|;xoDRB2{3Lm*FA~KUSN;3Ph{=mWKuB0vzVhV;aU4Me zBz7^%8&PvYG855@$*I3Mj9a=v)%jKcG-yepnP32$@|LAa9n0G&eCR2o=Ng z3N1PMmOR6M>dPPB`Q4S{6g83KgYZq?zHQ@y{K!!k7U;Q}zx{sfSKIB9fbesMo}Ye> z_lhzM_vw2)Lg&zaEgem|gx6EOJoXkrXQCK0Y4* z_4ZO1?&$RC5TgKsr!)Nawiz>iOnz+Q6VZJmK6Jc}58vQbfBVo6WHbHp1e~l~1~CQ& z$2wYfhLb%VZ-klR#-)Dg%LD)4|L6a;+D=L3jUOfcQQ}Y-=s(;P^8(YBOksR$rtG(P z=6Q(YZvrmj)Z$G5Y8y$Aw}~5>O;z?Vp7k!A2z*A^u{56hN^* z0UDlU!-qk_{Phy0hw*nyi^M`4c{E%DBuq0CZ zFE6wCboM^p)RK^zl(@w58+-dP+7Y{ik-#Kv5wQPs_Xhk!R}UUu`xhtM3F{7 zN)Bbaq!j%kqoC8jK=$A_M5d3qLLt zs(JWTV;K|z^#Z>X9HB^v;zJC1&AS*L+BK>c# zPyN6BuW7U9En2oxKBl2ru6%`xl`2=MTCIAGnzd@zsavmpgNBW?8aGik`G56~7RmU; zgMJSy1?-M`IQw8yh!fR|0WTtBRk{!yaaQHBzqL`PCcvRg*U70ZksHBoDv>yXEelTs z9?(W3RlT74pn8|niAD6<*BUcf|K=H;ePgy{-xI|)~*u)xY&@&ZQ&0NPx!PP}7PVncDPVk4lhGCx^k zanQnQFzKCW43X9taDZ{pM5wvBllDgNcqeHYuV8#T$h^3rOfptkr-*+buwz>kh;Q(* zSSj^xgx;ao2m7O)grJE~YOK};wP5hqO;3;7pq8zewv(L-mS#~=_b zI^G^k3(;G_=4CC;*;~b){cRl_!sU@Nf$XR)j}JNbF=@yS$ABFo`(T+O5O3jkoZ^Tt zC8r$5J3$lxt;R4w(&64D%DR}`5DXGTgbpzTW^4_~kc`*CG0^S}RvxUHxw)&gpD-G+ z@4h&IqFxAeRS~bSVTMViJBZlO1>ZG{>7xy(KmL2y`= zNPCV6(J#S|A3IdU)`SO_De_=v1w}%8djW9@jXV{Bs$a^sUt3gk-~G<8;)RV&-NUqa8Mzk5YWAFw6)B2ol7=xM4Fq5D6oR5L$Xi6K5aosNkMJ z`ey~(fCX&t%{mA*iq#V_e z1Fc#iN1aqib7O!EwT%E&5{?$oyK+NSMKDG)%?@fkAf4it?8IuPLMSQo1T`UVCtUb* z^cMXKHM=l;M(w0%5!Z3t4&>k@728=R69wARbxde2RB-1!?G~zI@FKVMw$ByJJ zLHI@(7yTq9aMo!qc16sJ)!JMgcaRh z+;ZjH5~7u=0>ZS^6^(#q#|VHn)08u{f&eX4#bh(EyJ9!=BCbj%UlOp+GVT6PZ`?gS+&#UdK1SjX6EJ5^_%sSbkxq61 z7t%Qp$0jOV^n@}22dT;}dDMy^>@rCW!mx1b5%0ycW7LyQq&ze*IHglB()snK?nu)N zAQ3bNqzw*b>M5pHCtZigK(d$r$E`t|!$Zgw4v-}intRYYi2pUbsRU4P&DY)UqMGcZ`O+_$bu~+|iwD@3;WjNXhoqdp|OD)khX*@nJo8#z~G@77&}ainYutclA;A0CRw6rQLt`o&9rqz z1BmJwZuKbh0ByW5^*^6vn=3>WK%arzxM&0!|MpJm0*eZsDjecwJeMw*E}H2V$@v&c z4`_lhC*noP{}p5ku~><42Un082*gV%7@#j`Vr7=C1qcx4MewF(H{|vU*z(A10cYEU zP+C$~EGgQBU|Vdt!4gChI>Df%B&NMmKC_+^Qq&$NM$57rGELK7n!9>Y|gQdYq(K0EG75c2` z*x>jwMX*k?24W%guKFD;MSH12p;jXPq>&1JV+!~wPl^ge1`6d*_7rJop`E6-!RSY* zPXvBeV05uzflRfAI$jinOblg9Wb(-0i$dY+`dcgB6*Iq-?W=4N@2qSY?@cVjpebMk z>OMAJy5UvW6bdegNg}l?%!D3s;Ut5mID+G#KpI!Dsf@po*@)b|lO59p>O#**+$44Y zRv2InZb8t+$`c&$HsFRKYRUh(ff%d5d>J^Y`pc4=c09?V~B!S#tjd`Fn=#4 zw|8I`-l3`zGO+Mi*#X3C^D^ZHLCb7hJM+i zVi6Ir9S_L^cu~quAwhq1h!pk*DF}`5i*)^}LKt3<0vtg@yct!BMFQ-T(mFPt&K`iA zdASM|@~H4K#pr@2CrnH#C=_t2p@NPRi%IGNQj1~zv0wCh166TgGH>u(G2SjhNSU^O z6arC^Y!(+7rofg+WxyKflGGR}(qIJ9DtLLqKa`8$#ak(WIRk-w$WUIUgehJeB|e6( zfypFR^2`n7B#Y63I+3}UzgU(iC4C@is2!n>2eZv4X z%)@LT!G{(9xgSsP3x8<@eSb`ddx$U6@%ZRt$o3(Ck@zzGlxZT2k&Vuao9OXg`0AFO z!{43}%ob47AjV8aRw@#7-iQz=J8tg^Y1bmt-9T z;>ohd@Xm8A%ya8^W@}QUV+6qTp!#Q=wuVM{1&xN>*u(?` z#!fQ(>0u2fPy@~xk8h3ae5`=o@%Rh^e|F0qSACgcR+RPBH1UFTgf-O;PC&RL6A($< z(Swozdq7MgiwTf3X-Opxk?iE*ZR6r(OIb6V?6f6FpkeLh?TL>s3P0c}1%Elv5wPaU zpcSqNQJ1`+QV=vz(;O<6LoS11gNE^{msWK@>i795H6^(H0 z0Y?ZL(P_~^2|b{;LNrka5r$RbA@^nFf{<$R=m+#89*P!S0zB-Oc%uIl9O4op<$4iG zGM!G^78Y1JSZGPhBf3qPV|y75hyGgScS9R)uFaDI(9{KKiRrmnl$p{8iIN*Yqs8(* zfhAYS;XjYDk(vvy{BtQ%>xTbx+^9G!V6RU31%J1seDs=^3Z@JgoQQ!nFNC&;`4Op_Uii}Flb{BuzvW3*et zKl-l~y)58TU>7c9k`1~1r~*W(UnNM1$`4gw^`9kjMHk)fh}J;pGqdBHlhs`Y6LkO~ z1rlEA%#r#nG@R0qq+oXug9JAL(xs_Yuz+RAm@?J`d?>UAtu%US4A4l{n6I%*)Vk!M;0*D*r^<^GLI znN|^oGZw*i4UT-UHUcpO!k+_7H@s?v_+@1@lTz~sJkG;k*pz>Zfl-vLRs1Ca2B@2K z8BEV?&+Sss`Uy&0tcv4l{IfAz#H&X46~NW#8@vn?{O*c zc_e@WV9S_$0JFKV8umwYIc5ecq9`o3A1lv8z8H-GB~lh7DE*;@*I{I&Js0lydEx_M zW;a?b@nO{xQK`^~z>SSWDb=%SVd#H@A#$1N@pcbXJd zg96NGxN@>d5F!*qxRoeD^ypQasfaDujKm4EL37H6!vz%udS%FpmkGfTtVG4LAX_bT z=+MK&IjLNJIi*lyc4l+JU9?uLkciRp*ZIhyvE(1@F^J3bRJd* zLQOOpfnsC@Au|VCR59{f#fgJ6WqxxCM!HGw!ge+YSOE$ZzF%dl_|n>vEt-IgZvh<_ z9NgbZ1-CPC+DcL=7O2@SR3jq9%K#QYLIjzt{tP_WP+@}pl|tBlU8m4&7bsBt$O}+JLlQc2c1a4^MY5 zcUyNC)b;arLIlKLDpU`7(%YqfKJ#0-hqb4*tHcJ;J-$wMUXD@+Cl`CEqdhW^dH!B% z=hVj@5p0gu^lDE$f!^(XoZM;oSUO9!8e4BqPd0C=uygX1O5D9Yk(k=u&CA->%f-Hr zwQYYXm4nwS)1$Sgmy@lN2Ld|Oi+MB$+Z{d%;ZdorJ=!}s*`mF;sGbsx3xAyKRI~C$ zHa15u37$gURd>(+QYBBR&Y6gSOO^!n-`uxPED^vSNm?Vgp`36-@xi?zrA3Edr#nz8`Dxr+$|v|j4y zy?2>AFf>3XOl90#oPxmEL!=@x72X~AEGQ{)w5>=mfE-Mr223wVLx2xN90L3C8oJ}p zs07^DSQEh?Ul;og=~tY7BH{#uA|*cuT_N^crch3vVJDt0iv{WNOu@VqW`yua^g=5E z&1PT<*BFWYlb?WQ~#F=n8~1;fK&~w zCEos*XMQVJdUTQwQI5>8Nb(S;_^p%+KM)p4#Rx(sL%&@6u8V2I|6HvGf+7VP@CpVP zEE);Ri7*nV&BzK!nN?|D)Sm-!;${R8M)mG6q40RNFMJem)=rF#ONvqrQPA&uInXkS z3=^Zpkjof}v>+iI@3UZ|1?|SJYs2=!Q=Q-*#0hekC|9zrR3qS^-H4$9|Db$C(UbAu zg0un+K8!~6G|mGv;e!h&GjJ{ZUlIRT$NyyKqyNj}e=Xs6C0ywrmDR@omFWimsGVp= z<^mqX7RZ*&MUJy+T+C&%xE|$CBRH1pky-(24y+}%Kuz1h^4f8$7O7M9$Wh1=Id{n! zSIQJjia%wZD3S)5hcwx_LgmTO+_0=hIDC}T5OEC5sKcC+Fm)l^M?^zhmPaK8YFRU< zTy7t-5!0M_3b7$j?g>8XK$OV6qSh9Mu)s)9A)-xiC3cGTR>&O`c#83QnEP)X2=*T# zRZrPF_0IbW&SuIMVu5-iPab_H5hBm*pmP?3%j}c^W#ml}FL&b+e1dXOKwKaNa5FA* z6%Zb z5z;@vwk#yy5bXCjHf-|*vkHPAS@0EJRd$9bP!65FhcAN!W|P1uTNY-eUV?3u$Ez2p zJ%d$ZF_SUTo;=Ko2rK80J%uPMDiM~p%yM&};zf?|J;Ne8kmTV`*k4fk{zI8Sj@4WK zv6$+Ws!{Tns@Dm)hI?fZi=bY~WRAaA32d$aAgXB)&_^cF0aKsgAH!o?h8?8zEJ7cA z{kiLf1HN0pHS26scp>-}Bu(+A;38p*g++IZAs-!b3c^yWZLW7TH(+B=;nk1OAM~I) zez+lT9VSo^1T)DzUJ{RF=k|h**A@^#G!fu}HKd4D7vNwNh(k^Y0!aYsgqfd5_zKJE zK#q29F%l$G?Sm9bvHT~_KXjT3MUspa3ce3QK0S4}f9?~&f+Kz}26aZdMj-WACHCP; zpi&h7dKWSx{%CPndlb1XBKGMx&%8ORwRFwQG3#Q}j_kWCpT zVt<4(33&st0#Vq5_a36l+1CyPI*c8Ok;(M5IfBB%AY6*E4%&38KqJ9)u<#$!l+)AP z1b}f;?t7N1h3UgYFB~^4MA^5I@`VfyT=5zwEGS`D7Bd3V2ytXUljQ$G9#WJ%7pg91 zY7iB3+TxP13E&-JP$GhLguag=VyHJyct1eTD5DJ2ZV;+SuS*_5q}L1-+UO}8Aq%Uu zs5VnQpw`q2kc6`VS74E+i;joSsu0ABg%T_>;2D4lWIPy6Fm4dzZYYLz)4ah9M#%Me zvGSfj$)eM#Mmy0^t>jNmCYCs7c*Z6pCytv`rM>>MrQjjW;`{hhVAnfoL-z{<6$zzG zuuvI8bTK@5=j!U4gT3T7T9~IXB;9{*LxCBH=z>CqxOF&Ag~(y@5;W?6RJKr?EnG%8jR%uc7$Cy85np=lMIt3t`~-i>^< z)ba-$6!21@ML#5q6Otss$%n_eQP>0xfO)QS4-ceuMPMfe z2h(z-pSy#@|G`6QFH*y#|KVHylP5xy!4-m0jBgxG1`apkh>39Fs3F;dSi+1e*b#vk z6JJK&WUZAkw-Eiw2MFJKpcTfx1lXm(k2^e=Oye%$fFamn$*ULNwqcvj!W{w_64Pd% zw!xAT5rBILI^kl3Koj0orr~)DNW+d8j@5XB#pY|1k)ugSEt~>_GlJw>q5>zZls`j|q4xE7so{ z;&{cYHB^8B|EqnBeD%oBkD0@$6@?bV4ve!Zr^8F@$?{4KazBa?wefHLa-D|`br%#Y5-G>D05Q&M^1i# z86W`y$n2TH7-Y;A2cEHx1Y-OL-1T_%pKHVsrLDDxwXKs^|3B;HvQW8R7&q+0l*ufK z!mX~h{(m}2OrJ&HD%(fH*7@hl)O+v!H`AOVE?5sB&CRL^#N{`CcJ#MV(<{Z9VCa87 z1oH(D(O=&S2P|nEIXBR!zqGpmIZ;zkiho`>dIWi6`4hb@_#=P5v`n-AxMS5={<&u^ zlM^c%fdG$CI01qt4o7|;Wcb0j+~YiHLgwalqk}q_s(ZuP8+6lx^0_Jp&%dlu<`MSf z@6Ra5)V12kKj%rlx60*ETR8B5#LzIrMR*tKP;mT2gCiqeg2N@~o=j*haygLUMfp{b zAv_X-PzWhSX@u{?-V# zaguTC3mr2ij5vyn3%j!g@25J7xPc=P01xLN(_Ilz1hBI&|VGZ%6kV`4F8dX}U~ z`iZlv?3l`wH|#_!@5qb<$%|QLxPn%O&s5RaqUDi%k^-gSH%>A(HwSp5Iw2ri=?x=c zyrGk908(ZNaT~k{CyqK0CG}{Th~0TL8x2W*3YdME5s)UqWI=@j^ZdQY0}5wgN*bWJ zb4>V6{(Urm#ryx0AboF~O(? z^R?haB~}h=pIC`+9DrFzHRC%8e={b8+F)8t4q^prs&itJ#RpWWjX`8cy9in;*lf8M z4-YHX#)d0x>R@~++z%WbW6+7`hkFsI4#nXS8x+O>0fdnV0&5e9&8Hc11)Q*%2>C^G z;)zwm`8_uZ=TIC)=w$guaMFb2E&{ON9io~Ze)`BF1tlsIVMuyonLj!Sz$E0-5e6XK zK^eiV)EFUrJScVv_p#>0-GOWhibIOe6v0NEI$K#$-XJ9-*jviiCW=)8I|W8pE#(S_ zIVP}zJtQR(R%;3vNEmzH88=#k=KvBl* z36ARA?VdH$@s$TgbP^&&5IyJ&RVxb~g~EhXFV}7&~bKV0ul2oIOFCp2v+N(2MoYBFV z1apJo1j%B_FP07jPZi39A6P$7$OkVJGhh1z_K734Iw)b7lRXuIzm6or2X+rBU`c@i z4|6GD2_N!`C$$(uQEqa`GvVO55zEF3xPD8)Sa7gxN&xif?xW8(nAs%UDVYo%8LocA zqj3suRD!c5uxMOh5{0!Xp_b(Z;{J8w!gAcDYytED0}qZDYbAiE0Q2f*HG)>CK%8Qg zyTzbIeal#ZlIRf=kDMGsLDcvR(Sy)0(^U{Tj#jP$M~>V@30O)wyjbB`oP6@~M8a}x zsoG~r-E~ANa}r+&3~)S{P9iu8$>s4@u%|RTp6XZ{#(vUi$$n65~py+gC)jepv6xX zgJF1sGcldMPzLZuU=JT2CxJ`-CJ%2=oMzS_~KVwg~d@ z0^2~+Fz<^UDL%}&WCXs;;XjWZhKxpLWyDWWmT)Pn5E2ey_)*B1PWe-iM;bZ=+xWOh z{;jYmMJNj<2Lyo+;(Be4+mPM}(1IXx#Ii#=5$zvH{DK7C0CG41MA>px1x`Fxn6hn& zFwb_6lKLpjA+9HJFDPal#Fr02H%M%xhy-4NOwvT(6(HHDV;-ICtK7`U$G))?&sL6} z;=feRvh0yS9`uh`F~Y=H2DVG8x%!ZH8-h8FSuO+m2D0J8y&V&*S(FZo!C^r+BGf^7 zsCEnlC&ZBwvX0f4d0ZD2C9WNK)HKB+on+~&~zaqpsgnSXF!JKD2WzbRoA z7iZr{Yt`h!{eiTzO4=7Li;chnlQI&#F<_F86JnKliG*$hEuvfs6>cPHkbpsh6Zvr! z1}CG>`x3D7Ql~Ofx1eJJu7Mk100;B{`gWK)AAr~5Jd={29f7|XM}Z#j5%pfAO!>QD zgB8?(V2P{?oL8jyXFisNUGSX#waN(*J}&EeVK%cP<-gYoI{orwW*vgt$5tN6K&z z2}Z&XWsDl(CO`%|leCsR?hM#c;4}CRarh!#A^T{V5X_EmYmkR5zB>WG0q8pE10rfR zcIJmKepOiYMWTOyhzwOAZKA6IS6P)+Uh%;o7%PP6fC%uh3@Nke@t<+=@dBpixJe1a zqJ%^0PTMHZeTI9K%nOSr;#?{as|;d*3R&}4v!FfxCNQ%U!G}``GC*$xJ(uIX_}U2n zx(F$PoTAHOS4NdV@W^+VHXB=sjf6@PrVkDV1zsz%%B&YP z^8w#(q1qPc5-X`fi{|EJNPyZ5J#bB&s!nYvV&`-eNh&RK21R)t9YZRio`?ug##a6q z2p(Gqst5g{+-PE&KMEk{kQqS93v2 zxv;88pjbV;hi!N3s4@c~HiW&Gd#nlE2F@=;Gv%&A?#80go0(-5Ob=Fp^CfB^qk>*w zC-~WmQs3{^Mu_?#=NPNdf)?lp|t^S6S2$C(2Nm1Iz>@-mBiq zWN&aaOogG;_e1Ux17yNU?*)r-AnZl)f$-WS>oI^1iL693EU|~s&thZv`3%JmJ#l}3 zJDHpeW9mWxglK(Z)LAr1sYp9Bc@t)U29{~B2nndErbL-bghi4N#h@e}E~N^F6!RLA zGlLk1Z`qoN(Oi~bN{Du^Qge!f2;%5VuBR; z>N=t!_qtJ#$(^Y(M4LNf3~-{6CXombRm12>-KtcubZ7XRH-Mp39YtUy|6?P*bRt~>nu6G`?yRC@PAPJV zP?@FDA5ojLv84EAauN=X_&o4lI9MzZz5Y(R2?r_N7DNt&v34r*DwwqGI&&&R=LEn{ znK@|dgogxG5=HkQ|BB#mtsF9s`V~;G*i=my4=kZNL)47?*#5wc*YT*ap|J2X4)V(Kl{Ku@)tL==Qvh~k=HX(|637em?E z7nZo}Q{uX-H&?AB7zk({2_+)wqNoehc2xKnDyL70e-L-k+Eyv(5sfF;07Cr`nMtun z>(5ji!ss})=tzt+1U}v1;Ew9_f;LQeP(_>qR4>3U?s`DM#AIkd6s3SN6#vq*TDQ=O zGEtW$D4B(RI%%;W&(X2H*ZvXR(;X01*_c{3%k zXF5>Er3jzt;7U<}y5hSQN0|o_^<9I)eE6oy}Npn`N>fN)vTig8kM*hM~Np8vhr&_g1#8r5E7Y?T!ywX{)qFI z?4ybv;=vL?UK|kvU}f~E>iluGSxh7MTRG8O@@f&{La;evB1_OECTG(YgSrB!$%>@| zKSm0H;W8Ll3y20t8^jW*bYjo|QCFx1uLeytK2-r&R{T~+G(f$cs)aO97z58zjn`t) zs0J8|Q9jbI6B;9jI0)zzIYd8{&adD$psXz07X%oYd{`m{53(nj@y1X&^hDy9 zD0*rq8YP-w6Uus1s~14;PZoV5(=ggUQIQQj1?AagiaKSA^awt02AryR0}?;WaP$+BoF}!8dyp((Mg#)1LN*O z=0#7zRhQhV`3IM&Iklh?TMBHFE9?*h1M3E!pF8o{n1PLKSwkM^Y0CrFLaG&z#6@CzL>xsZ+ce&rX?k;rJjh?zTKXt?&g>1{Z?F zAeUjUrAYQc3UY8y@H=72K2+Ii#VB900|xOt5}Y>3#b}P642QDwfOPyK+Y8kk<2IGD zDA5{5a3P8cTqp+345h?!;;aZK4ay)}9wEe-C$%MzF!9|zHU`ptAQu7D`LNSZv z;EL!_xPdx&OYH5uyj-OAejXHpNr8zJ2}xZ@ygevOqP?B9ot>vwe-HbzrH&Frgi35# zp@X}(o1IwT?IN}QD$=@I~RBMmDBfQ;~};Hc~X2a8D@~YSLVX_XdjBs!ksGs2#7*}PT@{a zM9?vTpSr}|wy#8mTNMbQLkd8p?nz{Ih4^gVT7W=)qhff7dUEkeF6#+^1ed_M1rnt= z$qx*Lq|TosPZq$Y;LIS{)yWDZ_!EfQ0m7W{;U-Z0?S=f7JpzIl3%(6$ML-zAsKf#z zftkbWbz<dDvPe^7jR~5p3>*%GL|702BEjA*)K9P&yKXHe#&%G%?SOv3UK_8BEN3}gS;}yj z`&3rLGR4AdfC|WrZEntUD(Z9!ATA1OnEPpAy!0LLU;hOxR~$<&LGbAp=k6cJS6DNh8Qli9{aialXQQtn&8 zh?jjt0?s0L!%@DO55zW5S;LN{l43E6LA|qKz&t9{2sDnO-LZDy6LDlj+J?9$e0ar; zB>)$iV^B&5H}!QFs{dX`pQgt5GvbAZp%@q0EW2oAj;3?T@+6C;$|)$64cVe8$A?5* z^bOpyg|@&}2&<+rMUmJF?L44Bw4p3bwm6i3t3-?)Y}7&+k?@dmD$KT`e5&j_l@W6E z3SdLk67m{3yoC6tsjz2Q0Twg%mm&ddmG4x-Hqa+?r-W+-iw-3`D!9oxv1Ju*2xhpW zmW25Rs2v!#>0InnFU6rCB&A&IGIf#EIglW538XM+)PZe)gQCIE2~rn>PoF=!wWF+! z*k`qNPB3ypH%Ys%R!Zwgb~3dh)f_;Sv5o&y#eE-WR2ZaMJ9Y3>uHpYwFD$-Vvp@IY zUn~FY;IHFQKQC(i{f}+`?EcU3srPLIR~PJBnS|#A1Ux8SuH12!3PdRM3R1rlu@HwS z;w%3wQFepz{{bdAi%1$od(13ls#|cKa>R4~236Eh*&jZqM1j&&rktnphjLS?L@uM_ zAS6pynnuaP3rvh6-Ws0(gmZ{~*_$#G^)?fct!jP#EKv^apH2mkuzLuT3N%EtiqQ-E z22PXM0DO1OzpM5@2+JM`uo1%H2N|=3I^~&C(Iu#OL-1j-^5rYwGcwBmR5$-m|H3Q& zpYHN+{ry*8^Iz>;HJktHYyQ96`TvFm`rj~z|0)FiZ&;xJe-8gKs{gOT(tow{|0SC& z_&2U^_Gssl^u(kn{w@n;;R?<8*=Dm5*%7jPf-*)PjKIT=#gXgu2 zdgQ-*<=RH^{M1^VcZFk)mM%}X-aBQZDNJGJe) z^No)^W?$|&tYFj3z}hw$dUYqe=l3mN?eUnq3d?K8J<~L|Pyb~%xZ9G@X+;ZG1{Zy~ z{-{NtG0pqw_1Qh@@`Xn6lP}Nwkv5{8_C1f{ANljro-|&UbFRj{a-PFH=O#B;P{G6h zd1==>8_QcgZha_sWN!ZX;-?Ev2L-u2u*rO1+5K77F~)n3UB15Ws>a~iOFWKDA8!;q z?yHqi=JI2^hMW#L)~|`lVDA;<^4AR;+}AEOX1nF_?)A(swEtjm@m;*$nmztUZ%p_1 zOPkVd$e*JZ)6T3W58?mCfQI>t3 zEAw_d8YH=NBP)4O@uP%w4aN`nTIaDL2|5p9>pM{E~h2+=y*9D^DF*Y#%t*)VPM;mrJf;U5{7wJ7wKlJ2!k~%JRHjn8fWKKsz(aWhxxoV{((XxX}E zIV(qgu-Ci!g{gfWJjE*i|yQiw&2>-<+(%&XD((N|u>lK|Y_P&R# z=dRCaQz7Noq7CEMEUl#T>r)N5@^COwj_SeU!q;coLCPlm~w zT;4YF=!J=(Oa~2CXNfyR2-qyR_ck^KEu!&(wM`rO%~(^@{IJu;>vV zn2@u5#r&^>c6Oed9(u@MFK0t(`HWxAe&0$DmNQ#ekkakYf=g2dzB<}i{=R16!}j_0 z(~lJ(WZ5q)Ri-;)He+) zf8lB7m8=u{%B^YDD)HrzK;yJuvbJ07%DuW|uxIRBld!kzj-FUNa8|~^jPloJ&GIPx zd@cO$ty(wjzh>u*a*EqrVeUkKnN16=m91|-F4o*;|Fr4W7W<7lF7tdiWzJx)>t|XF zd63ljPRh#1UOQ*ie|)OxbK4m$N+NG`u5;yy*6X$p_TR|bdv8i{>X|+{vwsb<$;-0z zFZuONbFFrWR<1#Co`>rT`}ye+BXmqm!?H zYSC|{rtvk0lcR3BY96n z6i5c^k04{1xE?H_U|Y@vp{=IkVS{D(y?hT42-;eUMi8>F#R@`#v}S)=p|acuvP}$FJ(I3VvB~`l9VLx8htM z^PBlYufLo>X~wb9%{w-FSCEo%wC z+bq)R(9wN)l_AI4$5t=;*<*jX7gJ)MpF1@-tWDwD)~lD>y&O|-`k1lu$`A8B`sQEk z7wML1)vLxj>(@hHgaof17nWL_y~gZvfkdP9)$ZA~vTI*x_pVFg^$9M+ul93z{qE+q zxwf?`PVKbC{%*OoOD$SYiSE8^Wl%Tc`;*^2ZaVgm|BjeJ&xhw3jGEr$lzVtQifuGlVFn@%j9*Jg~p)rgqy zciloOTsZUgOi}fHCWV!!uS~Bx=W}uo%Q5D)wcmG~elG9y+9osht&Lf`BE5lCV88z9 z8Y^F(&uez{ipEagYL<<{)@#hz7;TW8F-TH(-{X47z8p}$`G2-np2+D~@js?qsr`b@gkS$p*vU9I-m z=FnB+OS!r1suNMluG$9UrT`wZhf0 z7WmWip8M4K(e={0$eTR$)7o>XZF-+(eKww0w<|nyOT}E%i~}~qiVEf&y7oOUFuiWl z`Rw^?cbZsBV<#Rgc$u5`^U1BB8`_<#{_Dk-a}zvbs-8bErGBlQeQoONJ*a(sP*vmG z?RMVSxYhjAh!!&jK5#vLaL(K(PCM6_7;H$|TiL(GtZAjQX0HvLyL+T_%aZ3!>&}u@ zDLPO({ARqziWc*?b^Vl+s&VE`$4Rs1YAlL6;@LC7?m~lui~5}?y|Q`yyiYfm`X#on zRPUtYsQWYbT#8>-^Q=bN+g;;-^zOOH_`|2mXZ61~82m|Uv+DhK+rC|QdaM7?y`=(Xw*`@RG zI)ffxI_(B~@A6!}{tQl}o=eR}VfM>v_(c=brn|XC%!Wzajnerot09FPEC=PTm;Nu=b(P zud7V5Ytwi^$7Z)~n?Bo^QsTH}t5h;+PTR`;ry6+P(T=RH^H3+tx#{bIlAZhZ^>lof zlsn_-(OHVUQ|3O+Tbwn0cC6jL>W?yNBpx=IQ{Sw2pSGdxUe*pcSFw2S?%cIasz&4l zoS47rsCD*?(1N$k$}Mhl)6?$gh&;z#4{n7oo-;CjLcVnUXIp*$6_!t4o-}#C^@+jW zcFPZBj49mHVdc-W5k@IrTJAj8(`Uw4-O(RcbxT&9Zg+n0*zFx!t*g9g{>5o~i}o(h zy_dOmcDnA9v!lnY@~k{!wcWykF$GH{zd2ZKhmmn zbJ(7kGwu!%n@`Uwy0v|E_ST!vpKsCG{i?&m{oWmNW=YX0JH zV`PW*)>t;0r}=#0$Sd;K2aIh$>aS0K7d*4viNh~VI;E{!yfk#g8*4MmuHQYoA2AB} zb>K`^2cyoZzk*ke-`i^vf}qBLl{T~ffX0@>2*OK0uStGmZ})8kqn57z9uYSN0w2V^50 zF5cOZ_G9wa1XHDpj%N3I=ne{clPIp z@Agg&FRJ~u*)iSTt@~vLHd-<~IILN<@Z2w_$4W*-=bSxtWpV8vZvqRJw>nugr#OHA zuN{~6)G4)`cmBgoX-&V7?A6B|pIFo%_iF5lb*sPk>pA+;Q_tdg*54Pb8<#NNUh_x& zj8)!os}=`lTywAcVa$k~%d+Fv`RC0$)^}ps+Mto`A~)X3f9@vpXq&r5;T@NzaGyVA z?*xy_dmF#KKYNAZ*6jQ5ciet*^kMC$pQeAU7ExhGC%-4(dcF!jI^JRL+%xU>=Pi$z z?Nj^OOs$Z6FYd0bd#m2w?FWkXtZP_1;KRI?Q!Ec`TR7p((`yFZr!_D?vM>3=l-_sd zEYdkL;X(JgUY~LCl-iZxMmN+kS?w&irLC@|-&%-||U4FCVY&VT_X16+O ztva-@VD`gS8^@eK>b-C2`IP*s`AMg=s(oAA)AHoydsk1Vcag`YpC2E8^+1cM<*Qx! zxc-dRn*6I-pT{Rosnn$O=F}U5W6k_g}`GygPNfap!NL zX4`vz=sY1PWA?POrAdk*7OfsvIn=e2w`}z8O6S{pC8hnES-5d|hTr7{#r1rfTz1I1 zpHpk&uv*JAQs+M2*jZ~qHKSL%Uza936bw3a;@xE3igmRX_T0CzVZqKf@4pA+CT*DU z{#bBR{gb7c$CgC;H?!Eb=JMCqBe(oGoR)R^-TXuIFXU&e_;}C2Vd#yBRG*N3vCjsk zTu6RVbE>3K;F^E~Yb@5^O-&2YT^W>hHuUm~T-RM0RU}ylWJ5nKyONc0%6x45bK~L* zdju`sQ()@9F`${#mknJXPYgX_{UNE(irXbijgEKik-9ba@y8{v0}Q8ri+Xd)HSfiP z;DZAyRbP8xr~3j&vzX`eW)yXZKRoJ=@6+^g9~Umrs=v?V(%{YY9cs_Xb<=k)=~Yys zAJ?%;Zuj)u0Ru}S&%RqS|9F>S4{Z0%d28bH&DCU1oui-az8B6+v|4=l>d7h1+l78! zRA+hY*5bVh&5s zd8_aDX)OXS#vHzP=DPEa%nlbuue{%L(70<44Dv5X0}7JIe7IgXddCJ`&B4P`7EYhw z7&dRlhk>JSMoE&bW;&hUoNE)HVZHL&;7HAdyErCbeK0` zx!-}(*%q&RG#M7$-d6wcxBGM4)5{%M*k!TT=oL#fKeicBXWkAt;X;A#lZTv>NKDOh}#4T?-WO=zBE2oWaK4Em&*VIP~bgh0V{PT9-pA_ZzjicS_~fDPw_nrk`i$Fk zaPGnzCXuEy&$Jmdz1=3iXO-O_txcPBe_s#F<}b>v+A(MPxs!DxOiEtXxE5jkYNpS@ zYj!?HQ>^V5OuFjxGNs(AcLj;|?Y?O~JDPN2NLo-{$>R1gc9$`wV*aSq4t_1(5)+d#96qpKcyG{7mq zD&(q0TEmr3G^&j^if9v7s8JKR@+klF0`sar4l1+JM@DO1|!ma9jC*^BMF z8dk44b9S5Q2ihcW9^+}+IC$5WH;ZnaNE!R-YsW2HDtx=-H#l?D=*pjO)-UQOKYzKa zW8(95&#Tt<&1{==<4*0yexAjjH$Aqjf8QF!sDDidRm* zu&vQD)wFi}#>o5M&-*n#=9Bv*xLTk4OOogBZC+rO`t`71$H4s^FPzrsQ8oRB# zZkM6kxBm5U_sds2SWq&hS7?u(!3SQi4sI3Lt@)1*Y0aDLd^_T7wTg45W$c-Ar{Lo4 z-W5;UZrfnxY*4|>6piVuPjMKH< z8lKQa*Yr);yPVDwCrLYwpFVejd4YUw@6m1IJA3bW{&PXI8T;?dnjjxGBD345mhr1* z=oS{8+16>7qTR;ymD9XF9o;?gV$()m?IYT)cb!?UPQO>h+P&jzS*?3J-t}B3XT!D6 zEw^OXUU{@d8^b9FEO#z`yz@h^9|kW^M75q6csl)!>A|K~n?^02_C?mP&X!!~tsg4C za_Rg1&b!W6{Hj&`q1EYC*8P=HXE)y379SeErOxJu9Xs#Kd7JshEu%DGu1>3I+g6X% zd}XzuQODi$L*E+SzuW3_y^Mh$UA8v~u!$JarSQnKkfqrH_1c?Qj??mS&1&)4pn^ko zwU^GbJyuk$SJ&}w%bKn$t=IKvJbGxgF-9d{H_F{MXnNiM)TdW){N>lqNJ9(Jl zu()HkuJw-Z{g_tKculQ~vp?q#nYp{VRboKqgt3$Eo%dN3yDqHClhw(?4|`@@NiRMb zq)~gQ=gNek6+%b7x8C__YWWiV8JhlI3d_Cjs4&tBbSQVY#53ohW}%7UgIj@e&5fUR zb~?GGhx+J_{}{jZ%JsGnhfX@yA#qdlXB`X5xB8s>sHBzMGX2BfD-K^+X?sVF`Ik-) zGn-a&J~=*W?rg0F!{19D?jN^t{oG@>$DA=eFy1bFq-OM&uWO^SPKPy`-tEOCNz}`_ zHQr7ruxa;ZUDfC7yf0PSRbzc=tGhLq`&*1}zhm2)B4^q1f_}|cuCj}g-&xmaXR{%` z>3uVjKR)!@Xku^C(RZ2Grb!on?6q&aVN#WKvadtxPpD$v`|2?}PsPnaKX2!kPnbS@ zq=A+qyz`A9*@xt#Ii>fTwb=i@{NTr-U*^o65k4wy-&fnZH*oScr< zo-*v%_^ewdnN@?9L~1vZ?ydaHDffxp=ngk(*v>7iY|yenVOY|}$Z6Zx+vm(`JE{6^ zn_m9um)G0R3Jca+dTV@zEJ^beXQxU-6s^9#w@rvmoIYCbQ@;P!VS9uc_uXlSspulLzy5 zPO9IkX!U~Y$9k?W^4NXf!DL>}9;?rb*0jy_pAvd_b6RuRwridme&Jh-rzR&DcCcx> ze#C$_t@dg*^!o8&%=WK~?%e+IG*su~r_-mpDQ+lEbgg{l(1%TfmcBNtZ8-Sgqfv(g zET@k;=N`N$RNh!t?@9B98G9VkZl!O%Q{iMp{=@Q3&s2`x*mzlF!>h~tzjo-Gd*}A( z22(3m)t@`(ytZRZt!H&NtWK@e|9VM$=~#`+_fv9TJ~9p69ongz@9wT8GfQ6jZ5*6C z(K@$XpFXm=wU>O0sven^RAXzm$uT}lq_G`3^y;5G+n{M-RoxHsZ%^B7A3dpaJ?A*T zOK(>0Z&~O0JGbKe6QeR)AG`k2a@o0-Zu#{mFC3L3do-%VZu;3dY3>HO7uWVoTwidmx_sWPFysJYwmzQS!8_(RU z8SDG?e#*_0p&e3YXdauf#W zJL+U=n;dBnZXA7Z*}M9CYQ1tg*SC|cbZz^dt9p6m7qw{l{gUp>QN8BPJ869|cR_G= zcEkn!pAN;|6Av`nJ#T2%fm;D~UFuDf{CK!y$gB9?>(4%$ey49~aMp%(E?TP(Hh)>_ zX|ZwFxks-jC(IxA%D#u2!>h^P+DDuk8gZysw-*zZzxO^Ly#4Mv`S^+VFMk-dZ_j0O zSDP8~IbCgn3N?2YNcvnfd0TFVUE=c0&+ix49MYwUr|zdMYg$hnR_o2@Ls9wGpC0Xe z|Et}NQ0eX&GZuRE$r#<`W@ew%>(>_8&sY^uz(qw{Uvcd*yc(B5RKUA+M6q)A;_KnB|G1rt}DE6&?g`?QtcYlr>n-*jF#+LXL(HOofcVUx-<)~kT}D@!eT^@Ntc>Oe{}CY_w$5mVfxKnCk&`%r`Y9K*rVav@adnf z*z4Kt8E^SzU(D7@Z`aCo=1h6F>_~dLq)xSueKk#&*50vxVoKOSJ(r{7uYTS4^I+Bd z<+ee32EWXU3?eT+D%S6k{^3Ao^ZoB9lplQdMWgQ@ub2hjsW>Bq zoDw&0$gJZP+I&dMy_06XbWG>+Kb=kHjx_Slm#rF{^j$KcarDx&le^olsPFeUy6V(& zuIp3M+OI6kiyc2F|9R?L=P_$vHohA=t>D7*Nt?En^sZa|RnIpAa%Io#`kr(fJhyn? z#ez%Ki|%;o-AuB+<}s?Z^NcCRxliXctx~hv;Q1xl4Odw7?7OjT+X*4vPTX~fjJVRW zzv*_f*WNbUH_e(B@GfbH$A~>67ww(Wrsj_m^M?mmJc~VBq5ixbXES%!iEjCN?*>o* zntqKB2Y6>WuSuz|@$`+%4azgWrcL_yZnYlLB`$= zy<8s5-w+WnZr(Ll2k&~J1+QN}yjGgvX*XcNSo^ofYc1WpId90oi`5?=oP2%%L)Vl_ z=jy$mWm>3Pv6s!UEa}E}6}pGzOPXvlU(uxI=#pvef_C&NT+r6Cc<0gO_4*VqsJ(y4 z`4-n}4Ycgm#$uF1+{0gf&1C16O=~8f_BqmC|MBO3*H6A)Iv`EA)+Vz7qa2s`ZhbKI zSn$o0?cX)6ZnAr`S<9o2F@w9jJ-Mwyt?k|GwWz*3y!XJVwH{ab+*-b+THNjxU&4BB z-%#9Evy=9jBm2h}Yj`!i8hU2=_zSm>?X$F5829jNSm46EO#`2O%W3+c_rWb0XFAW! zn;-15CSiZgxRmA=9y8ArzSkXj_D0RDL*t!J*ZKHx->=K&E3CS>e>JGxEmdP;+-aQ} zQ$jSZPFuImq5c{T?NOflB5HeFa5;BN*QbWnn%Eer(`yIAsHc6Ktn9G-Xs+kA20LFg zE_d!$-Ipcy(@e6Z#c$e1RG-!6$;$z|y?fnqd*S=Z=fLbPqmui7$)0z+&4Sr|blcW* z9_z4vdBch=>I|u7bKcHW%W8jgUe%?u>S>&rT)n4W`t$Sg8|}MHHu0|ZX<~(mF`w%c ze6Bpi++~2<{*H=7|7#D1cFQy-%vUcbKi~b+Gj_C-L(-ccSsfNuuJ~oDe$I>gmoEnNKJu;2(_0GH1&dBpSlczD z;ebySO!u@ktLxa+L@F)r8eb_l_vg=A!zI;D%j5=@-PT7}O4~EdU`o#9h#rTW_c(mA zzxQ=Pl`qR?T`Kxk-~3c#8|#)`CC7Rn2@mV;Q#)K9+WKYx?6{ogJCfz^B?;ktj{j?|jOS@e9(aCb$gEz0NevUV&;5M!QqTtLHQH`9Z z&uBjG@$0%(Ze)%a;xVAsicNdFds{hPcX@MiXK9Gl)COaR&hYcp7+NRnz2d&L#`_y3 zomz#4YiJ+qljzc_^#zyw<%6#krB*9k>r&)fb@82c*EaREzv{TnBfH(a3U{tdwK|Y? z_v)OIhZ7GsV?{sunT`72Y z-!qo6W@|2Wsk-uf|A4gki7Q+!Ha{`;ziKq%bfcjYzh(FbuSgznHR!T)b64GlcbX;G z={h#_{x++0$)rkk?Y`eSxV2}+c$4mr&W({)(e_P^NV%}RQfj>mZ35TmTs~iG&9l_q zl3S~2N4*)LRi4DZ9(VADXH?5i{g<8VV>A3myJNxk;x2ywkyb8k^oJYs z^~;xA^2>ko*GUhXCHbXY7gk)iboO?w;R9oOKeqW$?|Z}k3tHs+ z+XUaepAyvfO!>>fn#Y<|UAe@1_afshQB9pSPYgfqGQ!{1xaXHERey}k_wP1mee_vb zjlNS7z5J@|xmLyEL}G`V?cUs+)ALPB$LEI~H*|YHx{~*z6{T+n$*N75vB(_>5H=n0BX#b5pIw~HFob^q!6i>^MHeShY<(1sg! z-hQ&KRYsi&Gq&z6*?y_1)zj3D5B7{59?~kbB=t+)nU+mTCSLej{r1@-DeD^!c4!o% z`R(O~ZOiWZ8FicNeWdT%jya>Uy^T|KbN@9?f8o$zgjh4SbgaMqmU;frq?^I z+uEYqx45hx2VLh!2OZ6r^Rrrt-?Q?)$Dg$uIH0D%RWlJA(#=pN3~mD%q29 z@K9GtfzQc^1?StY-;f+Jv3|9*+I5d4CwSUMSgyM;`;+yOHU=ftY`=s)a%-{4E<#69 zv9DIUA+Pp*SX!{L*lSAQ%xy`-YVWVVKE8T2shZm4f)U}$J)WN2(?VrXh;X4u21yOF+;fsvt+ zk&&^HiIJ(1nNbhp?#BAY2F8ZQM#jd*CdQ`5X2v~Cx|`^m7?>EE7?~KGn3$NFn3?o2 z?QW`XYG7(;YGi6`YGP_?YG&HQth<@MnSq(1nUR^XnTeUHnVDIS9vET|yuJsz?t#a8 zph%n~eM61@vB}{oeow6mE9Ku@qo3k^E1|scZ`WqRJ$=KC{)yK*{8po`aHa3J(LeDj zmN(?Z>|1d3vx#soj!V2&5X!}IirM#4SyPkj@-(Vo-z zwDJG{Mc&)TS3Uoa|F75CX`R)nR;>$NaJt@V*IR2_mussQwWh5UWu5JuUDUQS=WMMJ z4IzXOqGAXk45<)CA%qZ?LKvbU-lr(bE4aek2N&6=F{5t3MTY>QA0U z75x*bE#pVbiN3fa@gdI=AEGbuBKq=ts^UrVq14NgpL=+tL9_YPsXleCPgUV-9+&@X zeoeui3*mg|4{lIy<-%Cl@`0{B2x_8c6j-7)EeKv5plKVS4mQ9d-W?&*j?f0HKZ*C2 z`Bk2!{+9A5}pX3Aazo_DWQ6-;9ITU;T zTUGLjs1kn?KBd6sk#`^7%d z7keZeE!|P!RVe!uQa{P}E%S@$iz@wB$xq^rv?G%L#9!i1(HB+XMZObz2jVC7m*`cR z#!r$D#9j%Pgjf70=EPo6#h+4MCEX?ei8--H@`?CY!Xf%%pXiG!;Sl@9K8aTex2O`2 z^1fyGAO1u}@U7 zSDqz2QV!((p(DQ@`OlHVNB%hS`;p&{G=K7DlnK8466;e3`Bbq-%B$pe38$1RQ6(Ir ziaGgS%4^H_qA%tpJmP;bFYzMrB=INDK5w72BJnQyUE)<#@t>%YUnGBszeQjCDe)lj zD9>VE!XfTRyofn@7FFDr_z`OJY7NO+}xA@L;Ni7NR? z!Y%eme8_vTuVs9Qz2Yy)Z}OeEBl=>mm={&di7MvgSyXXf-b=iQ|3zQi7k8z9ApJ0T zmUxqXoT%cC#J|`t?T5sZxG(V_^^U0G56O>`&Qgy_xe|LMKgjoDPVATWVvl?$?Nf&WP(nY?P^pbol`9$)8lzU0XmiCH$qJJWHT83NdCo%7DfB531 zT2!C^t3~z2Q?)OCn$)qr9#^hUz0#-Jd}_2$6>}}yX-Q{E2T>)w@+|Qs&k}x#4~cKF zU+fiC%uBs+?A+WjrPuJW|{`BPNUmv&bCCGjKqSnLz?Vz0O_?^~+kZ*fmlF(=Q`PY`z{Jkp<%^cDYzf2IE* z-%0$mET_`HkosNR7k65wYs+WJKP~m;S>8*$NIXfs@c(MOwyeKeK1=y-sV~p+{zUOA z`AgnQevhqkKTRzMRtiiy^HdjMHknL%D*_SVvq0WU{7U~);#1N=RB=aCiC>w27yBfhCH*D8h$`tV z?MdC%=75_@O#2twbc`xNn{KqB%8=e>g zbD$b(pibcx>MN?rWn11WDB8{`{Dt7mPl#n9JA+%U#?uAAXi$J{W+YyX2U_|(z)#@|5y#<{%JP;;vsMII&kz@da2A<76D2nc0Oca?Els_~4<4Yvi(aitX{$ixZFQhUQ^^EO<+61p0Zhr!QQvVRagLI=F`0{oE4c1F zqbP4)DOa{~AFI6tkBG>DNxn;!eRt4%xK16xQQXq%RWWHi=XnY%$`P(uT3B9Q=1Go< zD$0*Au5Cs&{Ap z302v13n+W;0I^4fu?CbqcZ0I$UQqTZRoQtzDEl4+u}}F;=_|L?_sTEIUgbw+kMfgp z?r2bSQb z`cA3J4kY#%_baFP)VW-zjEsd!kz9hBRYG=kat*z^)Yca@`yIxQnL1+(L_rc9bXE-fu3J7vPul*vlgP9`x~nuGKPUd|a8>^}^s3=QvxzQWhlS-XdT4`5TT~lw)Q{rim^HQmqum1Kp-G;OrCBsrl+YnjQnZ9~GgPl3c5>#)H}o6gW>tPr{__b2bB|Do>2!=j zDwUEE#X)bcWS1;oyG4_uqSfOQ+8!$swhdKDT~{Kukq&K$UPkqb@xfhRc@Ra3CsLwT z@M5ZxF(s0p4e=p}yrR7`{zMdllA+RJN>frcKIeW6-o5Bf;eJuRCw>FdMP%gteyZDIPpFx%3>`jWx)u#Fa6?Y+~xYI~@R_LxEs1!$WBLJtOL zdjsNC-0&_q(@G1uNjKN&+Gf4KS5I4l`6VXDL6g>K3Po>akZ!hF!u6wecGR{rYTVw< zx+7Gp@3zd_N;pO9aLL?WMyx?o3;#3Ei;*E zSeKhNqq`%(Tpu7_!c03oa9t~NZD5lYdL??kwiMTw23R%+X?p@JD}uCr0oJ`i+Q9&3 z?$?>k+k>=PGvVH8j^^j$R^h}sw>$=Ml64I31+LKPZm(@k3$(R$FMjTAeL%S#WZ4s> z*9Q^LdxOmTf||Q|n%>!#xKNuxVlB}vD|CIC&H%?3bt=v+>6UUWbCNf%XPMXO+A7^j z{IAt<{K(3Vx;4Cex;Du&OV2*~A>Va0Iy&3*U_w-{@4y=>4Ob@VamD?&o3t9e|2mVl zQ}4gRq#aU8xyoc&Ytm~?mTe||lgYBxr0+0U_L}s1(@|@ce>!R;G=wg1rL78B&Tqrs zFukv~kB5DxUiD^ealj@V+-&a7?*_BwpjmG;H?v0B(?KiNwBmjG0eoQ^q3po!S^YPe z$XV7}6TV+2er~5*x?2*pMDrMlIm`x=4>jmc0CwoJRM<9~^bMv}<`w#;vD*4p%4^$N zhct}V_OxD4K3ZnosV^T(Mp_$45{Jw>Fh*O}#af@Dt?Hs|+S#>x{b=n#*Isp_wKd)1 z8DAXk7JO)owzPXD#i4ufx-r_p?$-5Vw3;3kwAb~l*4K~H*7YJ3D|(wTUeh~s=O}H( z>FRg==@u-mKEsS7OU|%t8m+B2elN2v(N~PoR`l74i;aEF^`o={eO2dkQ-5V>@qoj6 z-AHZSkdXCbwY@`@sE4I7)>T*=Lol`4xTQ*K@leY)UJPAMsA`gCZ5^o{PMWcKw6-(3 zkVqeH<>OT&`eU$mq;=mIZSzPKzJsGID@N;wNA2bJo-t!~rs&&J;+Kup52vW&akQ*b z$S4BU0hX-++L8dmeq`ljJ-s1tPr$OS+FGlnrki%KLr7g$t*%pde(&wn>tGkHy0i6g z7p$+L?bko;&3qR`4%54EUozMmbiw!~MO-Wi~ zkY!1-b}&eJrnaqRYqGYf?IHEMUGTDGt*+f#e(!5YbQCTXi;SK!S0 zIQ4Q*T=3cv+JQK0-Ei%2oT~pe53?K|rfnN$U6!QP53?Q`rtKSMU7V=ZCR)}e>vf5i z?TPx%MDw0Ry&=(ZAW=V*Xjz)1S0~}!wMmu(BlH!?%3y7>xh`2>pKRGQT(3{IZXT{T zB#+UwHN%z0*5Q^lBlI1^%^2S~oR(+baPzVe`r+Z~`{g4nH6!$OBP@+0^z|cnxow0p zw|xYqxPF9{pA91jOH)0yvX9sq3P@|uZRi>Tx_z*<0h5ER z+rzcS!PZUTTJ?}#%ObRzA;Fu5XthJ|so`GRTHQiM-lVE1Rmb(CVW9*DSXgMQHe2_# z)~Z`sR#|94tcxw$o>r>$Rpx@Vt;F?KtGU6dZL`w+99bEr_gfZVJe@of5?x=cQ_(iPKcWxaW)9ukRXb?4 ztf1L%m(K5{9W1N5YFj&6w|CW6b+WFb%y-(0hnIA$(u%8U72^R8M4c>yTA# zwKW#&^0wNZAS;W4`+`*39%^Go|8N@;hOo332`uAR1~oeJC0 z`dmd;o$mcESliQ{xN2`c++N$;9={)1d79oO&4LRKbG5E5*DdRGeU(mT^M(q0EaB!c zT6BNIPD`*QTkBrt^~2@>Ykh#WEdayV)0>XY5dW*YNjVll8Fb z)_A|^qIVc$UdSg_TwSjB5?7UdUG(5tX8g5Aw{Fw*+Ga2DQ&6@Qx8{t&Wv{ef*a$s?E@`aW3?;5zPnUEYy9RCRh(Pt_7IqQ zlj_az9IS2U{dTLl(W>n*%AwNROTOIO-ds(`w7oa~(nXo1+0uRAY$BC583q4nUS7fs z>XHtsle@HoN_)yhU2F3;Rgm$&@x0e!-e=JoEWYP<8sKF`hkE_gi|nPcn6=id?bQ$Pdq+SBzZ(MP7;anA ztP7=|*-k@mjw)t_1dcx=9#p${P^Xuu9ai;-q310^s&FsUi zdAcO&@oP+$!>zRC0T!CZRROA#zOI#ZMWD91m9;uh+tvzu7YACF2kJ`$iS-qM=9;D+ zy5U~)cpYQ-p%;Eq{_5Xgq7U1h;=0LX-9|HEnq$20r!CO51!kI%g~V!&9?Y*=Qjkg} znx6+$gsHGt;)Bbyv`pi7@R;DuM)o0!HyQnG%J7I_f-?yN$~^5|@5Oq5EU44_@6)wL zmDYN-$+FC(FFD%cVQ<@N-AY6*)w}z?>!t0%!+WSi0};49v^~aan+Qh5CX{+A;OT7)!C1KFJ%NW@+EH&gdrBt7=t+ zwVm1|o*1%<@Q`R;y|P zfVuIg^U7XoIm;@1r`Oa;DsyTax=fGXs=6$y$Zk_zBYo%5 z+@Z{L(K~iGXX=TTNqVtmpJNiHp^OFo1vPo?Yg;| z@tWS`6ZLI}M2mxL$9qOnA;%=*EAXu6qZ%X+iEuKB>v$P-51 zTS4CAOJy(h>5T5wDm!#5j_y$zL-{{A*gQ!KnZY1Y#Y^+_?oC<3sq|nhnStky)847} zFkNN5>@k|^Cah82gl2Xe(ajcfh;n;$qV=Fzn`C8_P-tm1t6H0p?Ka(d$gC|j+4h;~ z(grt}X%H-Xs5uF=nG9*!X{Htn-eETUFLrrV)wfuohwM}}NVtkE3w0q$cr*zJ-)#Cq zDhxLA_d?aTU98e*g>G4_vWuCrctBUZ-Ge&Owa!GBmz-nSXVMR;VyIWEZVc7vx&VDu z0Hsr36VRU=7GT-gR3eT3qPCO1+s=Sh`oTbLQ>*U#0_kU}%4BhC%d*xwO?Wd;8L7cA z;P9ct>hI8@gV{T>50>dBvnALzrdm{o%U!|*sS>en%nRlfx$~H!%~5Mq2)y--MQSc{ zgNPSqHZC$UQq9j9a^ltE63^Z5egCh%9X`0|#gf(EjM;wBT4^sTH)P(IS0FdN*pusI z8A%CxSM#>aFd8BVOUol<9yEJWT9!>oPBz5v_8Hyo;CZGm?&;Ry@cziUp-+9dY3;pz zA06@Z?}xXX{>@GOX9i~txcHiJJ587LUUKHO^=q?M^zT>Sug^uNzy53S-f!!7ugu+) zJbu^S*8(mdAJKVK{P;H_K1zH3hLQ7M+kD!A>uy_g&RuVPxccE&V&At-3(7AZc;ECk zzhC!Ff6u4WOuD;#|F54!B)G0UEj>QDV0G&IHzkfdBk%W@iqhVhI;r5YzT3-heQK5a z^ypf*r^vA&C$}mGnaW5+EMT1=rI>&@keAMsy@zLGeNg5TMM^C)U=fd7(ez$Kt|BWE z!Oi6^mIaX4>#oYnEze;|F=s(ZPKirNR_2-M&8GCI@F3loiQ3|-93`L_v7-(L-e9`e zRj!0T8;cf>sYr76id|)T)$4E$Gth-DM|4bVT>Q|4VTnm8V^h<{jqlUg>B{P$*zUA#c3*U=>wRgdg>ti3B_3OMgC6~{- z@RQ*e-P8W;YhTHn``zy&*8Toi;0?v;fenMKjc05)(vX)O{@t^${53NBp&P!vxX5zE zw;mJ0+KNj>ggh79OPPl+a5g>r=EW;3D z8M6dhUe)vixwk64Nei0?G4wXloatnoG~^f~>$}pXByN|xTs8_+m93CGfiT*vvnNf= z9+#seo#!BTeX4$1pr*$?bwnTe;}LySfHrH}Ghg0vWajCXLyInp_;to3Z}*?}#_UzA zJIzX-lac!U)_c6RBZk^o)|!|$&clkUGu^qs=h5-ScErsh&DK>=inkmS+^&kU3?|xr z@6(*DKp-=jcg8vjvPAKfGi`jzI2J8Rod~8M?{<~29PKvVQ=1rnqN;UYa*`W4yG6vX zQ#~VGG@T{h6i;3eaY%+NGV&PWd*?fSpEoI&RgZ0b)>jQXhR1yNbI-PO8)9o#<$YLk z{fc}3Ed90J9y5b^U-NOnP*+{(TM#6 z9#|8fiG*~o9C(&FSVvO7OFfhX5>%BvwXR;^Of4!abh@*cqR((vW+4Thl+9*E#wmiN zF*>b`^%$oizS{c=In))-i7X)&*ozHqC1!SNR!UChS*ckuIa%o`YF()LGwX84JhPt2 zx|6#Kk?XF~@yJJJ-H?*Vn$kR{dSv0;XMd*MO&XD=zHHSb(6uQok>ahAQLTEaB`&8D z#LBuDspl1tiwjCits9BNT$YbKvW~{Og$lGMwYZ3wX|mpv#d?&}yINzsZ%az4JzxVt z?FCWK%mio*05uvLEwJ_AE7RW^Y0?8*4Y|~;^-U?pK{Ay{eD_IvZgN1@OJ$w4DWX+{ z#|lbc>{NR}dO#>hayv>rHnl!|D3H$Di@+@H4~<^FRn=y~na3w8%q zeOZ`1?)~Jz1W18Zwug zn#IOaVji0yygrikHz_v+&G@r5|Ff6d;ty{QaprFCR(joSW78Ige>iT+cqP=`<1EgP zC@U&+W@Jy9nv(6_CU}$8UGLP*EiGt#WKJKH}~*sdU}SJ;R4#VOIl_ZGJu zx8?DjPmf)E{(*#`fiHdcb;e(RMR|p(msh2_O7qzuQtrzJscJoqqUK2T_BU*Kh6a-B zi;KszjGt@Io99WRi{Y!r)bguGt)n-U59&JgoH8|gqAHqG$ED?{wP$a&Yb*CHKRT)& zd3nPFIa^ibfkOhclI4juE;A) zRm+)K^PH7Q@sTkJkuR0ybGuYz z?9j-Vq`1hqp~;Ccv5`X)BZsQjamh*1(eXng`Oghikx9mLG&UtfN5&;$AVGbf#M^`< zzK@ACo@3$@B6*(>nK(>+&suS0Voc;vycFksAB_jGBrbATJl}IY6_3hG@%WFsuwqmI z;;|w&-td1++%QZ=;tJl2=SHick%>4LJuEUNQMs?|Pl_bC@iECRPsPR>?%}h<$V9?}hnw6dh~nR& zk+B4E=rA-Ales-BNkwQvOk{jC;TuZ$3=KYrK_@Y~S^OLJ#b7&rBnpX-*tnPi?>e+i z*6(`_9<}qZ{?p>eAKrN0L;JoORCT*!;FWJ@hK_t@`pMN3GExL{= z>!_Fmd1?(xERkUr;uDnY;X$c>tKKj>)>GuZ)|LS;RUWfTFT)Dy8zVw#) zgC+zm98|6LDUQ1Zd~KXeh|-55KhM%tM2cF3hqF-1O{~ z_e|KkJToBkhua@IBj&R|w>EUB>CyG!#yywpEss0B&Gtv$KA1oLz&VxrZ?)~Ne{=hl zi8-M?_qomwf9aF7F|X?(QExpT`|PNVH)_u8&QE6l+PdN9CAZ}!yxyIiIo>~g8=HCf zqhOb(IOeO;tU91dLw9xZm`DGy?!l@{FX;dD@bbE-LH&L%@a%u_^am|J zUSGB4!6P$neqd^O+A}k!^toxv?-$<{H6w7c<@GljZ<;kPsHXkwgez|^s$KX_vE}Bq z@BTjjmv5iD9%1`X|@E8a4CC2g?FhJEHD?Dq+oxZ7*K*QC09Ammb_$dQO+O zFW&g##_@;meWR@3xQkxAYHHh?a{FX1vS)pe+p*KNYuY~Z!~1W=JaXyHKV;nf>$U42 zYc=79jQ1LXuWR?vC%gAQF=Nhc`oWN;vFBbNwqslL=aDyU%XvL;;@ls1uh?x{{q<#U zY&-B#;pM~o2UPF<`q8+|*ESq{@Pd6iZtJ}7&+)Aj-0d!0de%J)<6r2o>8G6QKg;>+ zo867~ztT8&dfCezv_5rR&s_J?A7NROW`Fw4V?Xu%t>d~c4u?#Cb>yyoS+9P+xb5V( zx}>HQ7pQ)FVTp81O6f0qDvHU9j%??Ga&NV*c5ku4rPApb=iN_}S&>WYL}%sb_{g4{ z=Wyniu?LLK2N~MfHr8j_6(5?C^-kCB-n}br;FgQuW_*@c>{7eC$oO>l^73+wttt5x z#l<-V_A+^YM|6FRW8gJ~$^Th-!3Fm&d^GZ% z`2%k~|EvF)J0-2``E~YXt4Ckj|H|T9{`&B~cD31`wZ5d@-hJ#$%hStmKP#?d$I#68 zR=hXfvch`yhc8|GMb*zYj4Z1SURUw$4UYapK6R#iRnb)5Y{ZMZ$~O$Q*?k2vl|5qP zGP0&+`AYcVh_#2DS68RsohJ3qxCLeWbg2DUGRL9%AKC1d^{6hium7G};Z_-<=`%I% zQ#~0Q;|>RXkL*L#}6tivYw;4mr8o#?Dc$lepcyruk5B{`m_pHW-*UEz?{!qJmVsXi>H-2`N<+`{}&DXwiZ+*A??=P$QVe|#B zf4BeE*_~g!yt4PNv+uoNK+3GYe#m%Xt8I@qs`Yz2oWBg&o7WhVeu3riC!>Ze2-;Pc zvYUNp-YsFO^Toi5_+eP(PIbB66~;bE8Skip2_s7OpBejuWgpwLQc4tK8)HA&WKRL@ zLjl7AD)@7XN|{qqd);#K%H72|n6sC7r2ogh;u2@Jy&%KICT!2x3bqd#U23yl{mD)3m#qC|X!?|_ zY$JoGq^75goitAM-!rnOPRYrhIC*A@4=b4J$>i+ZHw z?C$p6fqhARdf(7-$t4SKe__VstMwjl5B~I)6lo9L#TgZ9KO^IJ-%Q3->H$}&dS)M; z5!_a^d5_3QHrYioMG?uybz}cIeQz}vGM2rG zMeI|htu0NTGI?Af5wGSd)ZTG5M&@-vK9dA$ETs1R&1auwCgDsUmy*UHsI;OyKe4DZ z-$f>Hj!&65>1-wt)#Ozk&uYG)64Y2P8JKBTE1TNIa2||;*>DkrLCU%I3xk4eHtmc> zi`3A`j$SV0fdkY8Lp~HhAr!$}V47Jgfl_cm8C(EvD2ED|50$V0s^CIMfw7PZOg?Ml zU_4BKbeITd!X%gs888LZBFEV<6|!L(OowxTS#E76oC|y5Gx!|7fCl&qzJ`794SWmx zp%K1=@8JhH06)S{@G~5QU*JD*2!4a#;SV?re*)V?wL9sG)uFx!FTobr3a`Mcunk^= z*WnG=4sXI+@HXs#ci>%k4|c-)@B!4rF8By`!yfn;K7j=~^)RT)H~>u03e3eb059kfO;0!n&`hX4kL0=dE{b3LcgfIw& zAut#sARM9~65=2hhC)0Hg9J#1Bp3n1VHAvnF)$j&LJFioDvXD5kPZ{zEI1P;!z7pj z8E`gaLKaMgX^;))z;u`iGvGWp7iPmO$bs|04s#$6a={4>D1dw@f!ITUsN~PpaSmZT@Bm|_rQIy2C8|t z7WDzRoZpY2u7f4~u0?$euHpB!u%6#f!UlK>ZbI*A)J^alY=&RqEqD`lz}xUHyaPMo zJ@^3LhkE!BK7w7a2X@2t@F{!(pTS=E0zQW?p#i>zuizWl2m9e$_zoK32lyU-frD@h zya2z!A@~D+hd<#k9D%<;CrlayfC*ZG8CpXi1c3$GLK|oYR_Fljp(6xCXXpg#@MZ{f zgRXEIbcdeM1A0R*I0H_HJMlw5)V?qP`oka?2w@NkLtrpOKsZD}B*Z{8#6c`L!zq8L z!{H9>&FA?NSOjCyOMzM%3~=#%36#O5e1D~~1FnG^ zU>Q729=sWK9qMw_H&CyGhu}7zZ-qzsor@ihpswP%l;5jS?*a$E??-)^cMqaIj`}ES z8ty-i`UH&Q_eS-bceQXq0Db}wxSdmkmZiU-mC9H-!;VxJM z_rU|e9t7$#^>71x2yeqKVDVYo4IjbBptjY03ZKAdz!J6g1$+))0^1g}ui-2B z2KK>z_!ho{M)(1~hu>fkum@iI6@G$0;CHwP7Q)4lX{J7gsgMQPFb$@|IWPle!ntrB z%!1i)KIA|TPjg#;J|iI4=zFdRm}NEi)cAQjSJ9E^tvkPZ{!ESLn7Ap@pBFm!~@ z&;`0eH|P$hK@aE&y`VRo0XFCd{b2wMgh3DrVK4;3Ap#;H3N+Bc1OZ@%RuBlS!2&_h z2HJuZ+Ch8h0Ct!IPH;d0gk^9u+yuA4a<~m{h1+2Ttb{vYHLQZW;7+(3YT#bD z2kwJ4@BrKo55ih_7#@O0U>!ULkHX_n3s1rm@D!|vjj#cphE4D+JOj_cW_SUfhqvJ+ zcoDY37I+0-hHdaFybiCyc6bBcf;XWK-hmzP9=r?h!%p}RK7d_N54+(b_!#!Ur|=1U z27BQP_#D232KXAjf^T3S?1yjRJ7|O-;CuKH4#3aw6Z`@P;aB(%{04{M5BMGagu`$I z{sLVsPC)>eK%LL$5@M}21VRv4pe?k4c3_1L&>lKMFm#4a&;>%E8+3)!pgZ)09?%gXgcyj0IEaU#kO0FV5t1Mo zhQkOL38P>%jDZvw3#pI><6t~YfOMD$XTn)92_{1ZOo2=|8>T`QWWzL=4q60h4kicy zGqi$0Xblz!f;P|=tk4eHLk9?kj?f7@LkM(%uFws-!)ee1dO|Pg4X48yV1qu;7y3be z7yyGH0+#inPJx@?W>^llz^!l_tbp6$4p<4RU^UzccR>x@4fnvkumX%EQRafdbk0W!HsYe+ziX%7Pu8|gB5T) z+yN_L6|9Ck;V!6wyWt+V7uLXia6dc%YvDn72p)!Y@CZB#k3lUw4o|?7upXX*4X_b5 z!PD>zJPVuQId~pkfJ2?BtKfI|0}jKVZ~%UUpWtUW2*1EJ#QD{*BbYiE-i7yIC%g|I zz=u!|yWk_(4SV2Y_yj(Mz3>@)4qre6d#0>A{VzznS+5Q4x0ZJ`ac11ofZ_RtZ6 zp)+)XE)W9UpevjP-JvJ+fZosx&VbXQ57?j|^o0S?9|pld2!l`<0)rs}!XXMGAqJu$ z4q{;_#KSO1fFwwS;gAd?VFZkZQIG;-AQi^KI7ovDFdimCI-CV(!ep2PQy>G*hD^wU zsW1();T)I_Ghqgt2j{|Um<2g-KIB0zIKcr0kPk&r2=ibrlt3}KpcF2EGVp*KDxe%H zVLnvB0=Nh+go|MzEP_kmQmBT@;WD@a7Q96!Ft#T8{lc!1kb`V z@EmN07vOn#5$a$IyaX@9R(KU&f!AOgyaBJno3I_;hPU7y*a7dsyYN2jgb(2Z*ah{l z8$N=MVGn!?pTK9Z7rubc;Y(z_!ho{M)(1~hacep{0u+AFK`fkh5x{B za0vc@-{DU<3`gKEurRg@f;P|=tk4eHLkG}62NMK<8CpRgw1)0*8uWmk&2FY3xq-#42B^P4iOLuQDB2U&=>kae;5D*VGtxj5+uWL7y%<;6pV&wh=Ev$gLoJU z2`~)OVIrIfXTce8xFy5@Gb0z-{B8f0$0N|a4jr_>)?900jl9rxC}0b z#c%~&30J`ixE=0*m9Pp{!<}#!EQ1^2Cb$`v!!2+t+y-mmL3jurhIQ}=JPMCN4cra) zz`d{r?t}Z`0oVjj!)B<3$Ds@^fG1%)xWNPEPyt(@9(Doe3$z`m@4$ShgnjT0aMVF- zMBNLY!G&-Ud; zhg`@52RI=g3ZM{*U@pvqVkm)9aKU1@9Cq|4Z166;2Rq??_y9hHde{XY!EV?CAHyf` zDeQ&M;B)u_8sJO#3ciMY@C|H$jj#!xhG*be*bL9X^Y8-H!He(`Y=N!tGQ0w>!Zvsf zUWYeeJG=>R!P^i`A0h@~Ar9hUC?vozNQ5LvhT$**M#3l<4Pzh$#zHEj!8jNX6CfQX z!kKUuOoGXf0aG9o&W5Rw1=%nSro%Zf17^axa30Kp*>FDOfClO;fC&P?46Ps#T7w0G zpbfMIE3||5&;f#>BXok!5CUDGE2v}D-QhIo0X?A?^oG;n46s2T=nMUzKMa6@FbF~+ z396!Ft#T8{lc!1kb`V z@EmN07vOn#5$a$IyaX@9R(KU&f!AOgyaBJno3I_;hPU7y*a7dsyYN2jgb(2Z*ah{l z8$N=MVGn!?pTK9Z7rubcp%M1O_wXJ33_n2){rS7$9=I3Qz}~Zo`Maq5jMfo@C-Z)o8dWl9$tVtcoANLEwB|{hF9TDNV%W<1gS6< z#z7iPfblR9(qS@8f+>&zXG11r!Bm(A*>Da_hnX+~&VzGdHq3$?I3MgV2l5~noZx^0 z$cG{*gn2L*N}w1ng=)AQE`uvzF#!qu<@u7zvhI#>!f!1Zt=EQ6cjCb$Kb!)VFsKB=fZ551vzj& z*kKOjK`uDK0R@l`MNkOyU@nwEF}R=@mtZ+uhF#Ya58L?t zD!dM_fdlzJPVuQId~pkfI4^)UV<&K6<&r{;8oZL zufgl^25g5n;VpO@cECIEF1!aj;eGf3K7@MM1s}m~*aIKKC-5okh0ow~_yQW>OZW=D zhJEl2d<*-b5x#@(;Rgt0Ge;{(IYK#uR7ityFdimAI!uH!;VhU0lOY49Kqj0GQy~ko zVH!+_b6^I{gma+}^o4%V9|pic7zCjZ27_S;ghK>GLKH+p48%el#KTZXfMJjbNstVh znT*2X_9X6;R2OdLxr_7Ja_6?$3tVj9kI8qrN7y1p**t|sB{q%&mQ z>*9Ve4k#6|IlBUKa?Z^-*XeczXeP~!Bw~x!hF^hNkQU7EPTEv9|IT1*`)N39bGg}{ z$If96)s?a*Q=Q!^w0jEGU2E!oz^<5yQr?5J*n!4&VP_#XyQ%$~l}_ipj42r$#F#QQ zD|<@j zTvYC{D`v-5vD$+=w%C=c&Qhs60wF=&OQ+6{sD02`#T5nWJ~*`xF*V!8e&{03OxPXM z*khIc*@dIID$PkuYMd#G;mC`v%4v5`&B~byDUb!z;T*_>$(%}L>!PQ;+*ML+XUkr$ z%TbkvH`Cm%GIi6T+J`zGzs+#v=M%@As&VI4aym}!ZO(AH$};eigPqtospYy#a&y@X zHl9tXcr8XrO;-1-spCLupEq}^Ip-0F8K|6CD3IX%TD`iz+WE zi{es7+$)dBW2c@g%FQuRwrW>JdE9wXSm9g{nWwhPdLoNl5u7PV%F9p8OUNCXJ9Ox< z{HXj2;||h@3U=H^uvMQO`^Jar5JnU^hp*ip?WCO{=n;0#q2(D4d6Y|ukjYaJ^}=W(lMDVvKq zHOR*2Id#@K;Wnr5wmVzh$;YY@;2gC#@R(4e9aY2~fSywtXzwB9D4)WnQCE&P9{l2} z+GrV(XPmfeo>`0oz8+3PR2YF9EBlLW>I}6l*O_OhK-paRoHO%O7^Twbuz6hh<&|tc zw{a*!oz#nLW9)ZTXQh+d)ah+bJ|Rxv+oK*m=>l{D7joIX%h^~J<)?92&*tDDq}qFH z9E4M6O)JWh$!W&dzG}i-yo++xH?56`IIangIwq#fw9@qR>h#%K7vKI_8}*e<)qiYR zR$rcU(Eg87HJ1&^9M3HFOSV$=ka4MKNrAh0zH-=|C1ebOd(y!vcg<53EvLYI6bix|U2#S zxp1M`7yslbBSQ0{?0MXGY`4co=M7EF%gxKN8up-7`;h_0$lw&{b*U(ifX_qih9s+T{w5&0b2cTb-<=hwPT=uc7A{@tf) zR2;>TMy2{Mk^k;ag@+3&{N}(3#=wXGQKw^(4pQo$D(OUZq2YdxU0p2|MZR)yip?K= z-V-@z%p&9#DMh){L5_T@fsxZMy%|+#Bq!2tjC1SroyApZ(xJ|pY|HZ=>_$UPuFRb2s!(^* z*cb=WaHvV>DqDVqn>NI)E(Ssd3D<>{78s3+SjQBon#HMN`k3#KHNsVJ&XRDN8B8X( z$txtCvE6W>XEv>o9G*8Oh`0gH@FhOS1EJpQqwucHmCNzmQs&?o==rYaGj7;Z%`2l& zt&iOK7_;HdACq)3kR8~5R9!_;Z| zVwYXr%wf#P`);lB7-4BT_HPTVbQ)77|jQ*HuJZ^}+1vN^I z=DB6_*dcG{qj%yUZHku6Rcx#4r0O~ES5k>+?K50VKouATu!x#TYn^4>(Mf&Cjh!Cu z{A6*->Cif>OZS+pc5+1#_YU+Z{Ld!&^9Sb5w9yT>(>M%!b+Vqj6J+F+Xt%eMYy8OBkZ^ z2*1%k_fwb8?kSClaH~ld?*B68T$GOYw!J8|OzX7!XFmEL9V&3r9W<`Abf~38zm)U8 zJLtVhPFb!;`eDJ~?+$RAN0f0HihsJ}CC-w(LU%+gNt57B8h2iyn!3diC2Fh8UgY-M z?9uTZGZLmKubG2>NgFlM>|t>thE-A{WQIl#3%$zvzIN|*V>Z=Eq5GAqI-e}^sNuev zkykVIotPA$2V)pig^|vjACmNM{_=Gtx*L=7IjZY+te5J{YMG!;JI!l=CHE7VIO&#H z^}^L+7ZdQzVzbs7&FIOuOs<+sBVp8l@x~V+i8^3m>2-7++wRB4D8>BpOOer;bLtgilPpCnVuS=Qj zqWouL7+t_PQiYSj8vUAfM$LjZy^q>);^4n`<9}VBYbuaj#>Bm7M4c*-&*G!_9YRI%Ecn>Z zyylPh=}8A$b#tPM?H3xo@nCNnshs1>gncE2y>HlRW;51yk4fLIUM=q@|B%3)nq`6i zUk;pfC=Cxrd0Sq;RJj%2E4`!Ga8zmtW%Y}#UT=ET+&{fswPfW{f_asOU+kBfQ5p)$ zD#NXUs;B~Yk*DI+I^p2rXYY=Sfofw!j=B{s#|UsT8+MdDSYOWaRU4soL&92)h#2lO zb7b6U+R`xl22MVgl)Iz2kkaGbwQDm!h!18V%J{};VVXWX#&GN8WF@FxZHhVB&67-Y&UYF@ zgd-e?jh`36ta@aew_mLW3Z)cSLu5cyMFJaQ^6bTS{|r#nmeM9U4UAJ_*ym$7>#rF& z7RbFLQ?Ipt+!Ug0_72q|l&@tN;@<(>i5>B#2RoOIGI+8X;P~#K+pJrA(z&eERT9A* zfiGiGMI(b<`M%qD;{s;YCG^gSD9IEKzs!XEL&kPG*h=Z}_Ww^d`u@Qgb!&aI^5ZQ# zj8hqc7crSe*U>*E=^wn{$MX6Qu2j-Za#gDIWFD}DQKZ@dR~PK7=2)!owtt!}#qG9N zsonfuBdV+EVFAkbo@BQ&9p>>p+UjiKbT0qtuZ4M2cuO1fNUb+p4%B_m>?>_H3id9J z_$8y|dm>n!P%DILbu}i=Hxp(Mw{VHQCp{V;BHoc%^uAg*8l!GS=+a+E6YB{Qj=PID?$7Q6Dw-TNbAR80QTS@w8Y_EWl{$NlyoGPb8Q7mK#kYF ze>A6JQ-u`o)YbW+*~|B+1%1+shR0}i=>7WVn84p`_E&o*%Qn9Go2Fw9YGX@O4pMiN zOdxx46tl`KB;`~hWyU}Ci#XhJ)s;Mt2roH)(QH$iU0u$vs)G)`Yu9Z}d$f&So_7;( zK~YI@5h)OdKnEiUR0|zt&&_o^=Nm1XDp6je>WB^tIhCcVfFbO`YusKbeaB9+uUpM3 zF!fKKXDHrm*D2ZXq}woc|FPN=?Q8Ct$ESt#)5e|S*sXSF_-Qt~h3(#})Q##oAUP^Z z(?|O$cGOkgYGRf|@@r2{`M;&zo}v7P$7% zF?O^P|3m#e3@CBB*@6&3%=;{++H&RkCuvLQv|gCwTEL_w(URzk7S6P(4o4JIZDkd# zKsSvWPd*9$(LL2L_$9~wbFjSCzTwdSIG^Atr|5FB&*h2AcSNZx=xHnd*YSTd%T#_; z*7*)}`6VuxUy5LUoYs}yZ3RXu`_|J$w1`KwLNveXWR`#8|G#mQIhcPfe2yY-gM6~J z?0*xkg1mn(TqX9re=QC@h5kAH_20yyr_evG;(z5QQTo(#BAy(q;qjt(1H`z88`KSr;M<*W!ayNkN7E|wy@i&rX zoa|HbzEHzxW7vDr@y%9X+|DZ}%Oljzh-Nh0f*eEBFX1RFo6jcma%W-!Zcw(oLmA&*7QeW_lA!~;k(1~xR;2}=sPaNJ z`c>AmNl%?2J$6demTkPB%En=T3}uxMj+QxZ>Gt1gdv0$)kTT;yV$TTSF&i#UwiDsC z9YIAdwiMclM;0u6xjEm?bOA?m{gX;YD30fjvA@(_T!sW#U)S~2g-HpTRNYy|69xWh z`c52wM!53qWyWn9|3)0LC5eef8pJ5hTRHxf;2m|c*~x6l;CpTVGSkKni7vNMJ0{hKXv^H>oKEl z;pDQ*KOKM*S1b;rVkRn#iG@?0NXj*}PGO9(SfP3X4{ksMcX}U2GAvd$)ygqSV1}@9uZsNdT5f z@(PtfV*$u3cvR~m77i+M#0>Ht8c+^3*N<(ce+o;Nia;YVPjM+$?szy;;HRsT{yG1t ztXJZ%HS>RViiYE>VhwuY2+rWW#O(P&-L z{=t$=?_AY?W6ddSjEs&YVr7|I=jf7=pmkk*0q}4p*DFt0g^mp;MtFUfGcj*cr}g!I zX&m)!GV2R-QzV>f->VDFd|e+|u>LolG-*B#&yF>pCca%Ki zf5V+h_6PkN?x@W<##nnqiG4w{+CdEz)qMd}4D43r(n)r0QN0wa0{|S&@YrI9CWIU3 z8+=Du|HsuowM=PD3#s{c72rBOf}>C)N2w09sHRANoU%J{b!uc-PFmZ`j5u#^6q2L+ z&^U4*EIoVg<~91_Xtri$w?JJP$nP#$*(p=Ab0$okGA%RIXP7spur`{_xbVif@9bz? zvK!nNnLfL`byKL?E*!|xrK{BV*)Esu;O?pjpN`toh5@T@UM94x$T70c!f|4?acX2; z>u`3ByUIt_wF>jbVBqAG?9_C_raq)%IaQzPVcYEaR6<-Hz&@(^YED_DwmM$JCK(Q% zsjCp`v|iq8aLRn&C}YiEcP?b}UOAf@Rc-6r(#{S%a)!D^p%~Ha+F-7XEhK%pu+nf= z?Q*6)Vlc#!Xm!NjCb1e?cY2s{vR}1fNAJ1BuyJVs=Zx!GsSus#uXzM+ZY{SjV7@Rh z(tEKgXTtql9Us>Tqv=xFykFByzxU>ZOg1KXb3{|28dRqb(z-X9GtNjgPXRwQ8^`tM z{30&s^XpW=-<&D*y)A ztrF4aQzr@1i`?VYg@ndc15`2E;Fe~+n=OxTII5*#u5;q5X5*5}|MCl?N-?Uq6L=`L zr5n?{M~-}@;P}o&wEW0k%>LIR_NgA<{HZD<(hV5<-%s+%l#X{D%yG1NIc0U4!^sW0 zr!qtOd%Ey%C5vWH&5)`v@E6KG@nJ9+hCnz(KqN##G{itG#6dg^g#;J|iI4=zFdRm} zNEij9VGN|eSV)C57zg8F0;I!4I1|o-NiZ2QU<&A9f&ef>D+q+vV1XcL18uKo{r=-Jm<120frB^n%`SI-CJE=mUMBAM}R-Fc1boJ?w&yU^nc6kKq&e z6!yYr@Hu<|4e%v=1z*EH_y)d({m=;C!T0b39DpC;C-@l-!Y}Y2_!SPpZ}2<(0k!Zr zJONL_dUy&pz(&{vPs20tENq77;CXlf>fl9q3AVsico|-SS795x2Cu^#upQonx8QBq z0q?-O@E+XOO4nAv?QjRIgjKK_?u5Ib2JVJ?VGY~|_rn9Q79NC$;9*z?kHDkw7}Ub! z@Fc8y-h=a(iSN6wiKGum-G!NP_d;cv{E3n1*#O1 zG`VR)(f%rnnC^F9OfIhfDGJOa}Xb3M!e%plAV%rML@ znB6dYVD`e?0J9I~4KQznc@xZjm>Xekf_XE{%`k6)xdrA{nA>393iCFY+hP6+<_?&@ zhB*N94w!es+zE3ROtBVxhWQfAqcD%bd>Q6(n6JP*0rORuufcpB=1G`uziIFFi*og1M^*&@4qOKZE%vnCD^s8Rq9O zzkqoG=9e(Pg84Pfi!lEJ^Bb6dg?S0)-(Y?VvmfS0n44hU40AKgTVQU1xfSL%n76{b z4d(4Ix5NAu%pEX)4RZkI9Wd{Nc^Ax`Fn7Vc8|FPQcfF<|&wO!+ZzkX_#kVz6lFb82i0`pOrkHI_$^KqC@z&r$V2V*FuP&)!0d&&0p|5E`(WMx^G29A!K{K=4RZm^ z8ki=SwJ;aLTm-WYW7^$_Sl!L~i!JBN3QF&;gNKplJ47r+T~f55QAd%P8tX5!V6B>zOI~^!^|1(TgDve{xML-y^%8byZM2~ZgFt$fbGgHH zG{b;iB5mDmEbPH9s}{OFDV@$nEatccq6yZ|4=NEcClcV<% zyh6dy_||ZbzGtTVezDCt9Lp4L3QqHAfLO7KhE(WK=M^*#;@Bd@iFmpA^6ILp#p5Sr z=NJ0N%^sJ(F@;0BU9q6^ODmIiNa7%dYYQ#g=l~YF@u>xYRXnV|{>rBZVKnwHTd}<2 zi7B*q47TCCj_s(iT2kEl?vez~EFGp0#q`S=j*M03vZgd|ZWm*a$0{_nZjW-PYxg4D zB!}4ujBK_I?A*1YWoZje?m2VG(iBFm?63!rU;V>4Be=bC(k{ZNs5(^PU|SZ_*w{Z< zp<*QhsZ4Pa0W|jSXdhfsnP61Y1eYNV^k7AU;uzgPf>oT`Qrlk=E48sOX|l6|$-_NT zm8ITTxdsch95MZb{}m1dOlsNQp3=%ETfL|pHz72((LAWWz$<+ntwZ81p_R$@t{olf z%<%MMk0ng$T%iyvbEHC2T0LQBuCC`BaV>0$D_rbAd>uAEZZ`eAh=y1hNuuTo?w?F+ zy~!YL!@=G?eYQaxmjbl<^p>XbndA?Fs;FH{&P<0-(O^vb`y`xSV{Y9vtMt{xquQ#c z7f`76Ljw62b;sA`cU@DiEY|srI zG^|n=ej4f`U@8M4$U?LCwp>}Nh(4PxzD zOl9JnkDLBzd9r(XQ9pI~%gB6caKL+!= zvDroMY|*DVU^gDRe*P%(e&vxQ2R9S6wd?+{A~^bMD}!}s)F17{bts(6<(@o&4pfSp zCvoVJzQ+&;Jn54r+6VUb5A`(y#^GYf(=_DK4rAvaHle0_RU&1RJ0;XgsBCf!%YuNG zR+Mi$aV8pWSfc}9)N%6_4GhQGQPnW;3gni$x>|*k(m<3$B6JuPm2Go7N|)}9jZu5> zF*8`Of`e=5_=pO3RI%R-XGpYlR&X4!ZTmn$?Fb-&orQx13)s6!yA=a^YXKVknkAp4M%eW&+3EU%UF?0L=wVYYi$Q#|riZb7C`S;2869d)1!5ZCDA6 z+rjh^h(vobb_^o^f%CD}Na4-QYJRCwdWafHm7`6!_TuoA)OHcXl@9VBZK)O<>YUbI zq<9#rLhbDA=qj}6sn$v{Oa(+!#_618fI{m$cAH%xWV_e&eRqc{9PBM~PM~8{5rVJ;83ft4LW2`?eM9qZz)mclV=_ zRVmrqRcJR?dY*>$Js7O$$?MBB@d4Xv(7qigV8peTu1&?TRzoqH$A&j7eX0akcNezx z@91uXN;G#;Rw58SO`SM8S2l{#KfqQ-G__Uu)PSb;F%5O)iwkfV`K9Z(%+n)B(w8|8 z1MI=&lX|yWu^N1ujICs7aMF!R+xzBa7D_*~cT9WOTR`L65#GX)g=d!EsQ`})0>o)7 z`t0j@nX_fER;!;z$Gi!i6N$i@jT`vjkEDdolp%%*rR{VyM4K4lVs?y10%go7Rx?Rvh46ArpW;C-nVbLD?mnqhqy9fV%w*NzPON_cArtD%! zw|gTE76sT`?a6V1h@ z<`<2x(`=9WHVLyO=KOi}`zVa5>v59ub6#=dIvjYVxUpopK7yN14XhOX^!9sUb7`B7 zx}Kjf#bv@;I)JKywlveCVYEkbXz;65!+1yiSjXcoRJZ|6S`f}g;Fb&i3Z*w3|BNNb zm|fGWk!uWDsKa`7ha%;SUXQIZt9%yHtZL7~E}ToS5ZhDfPLRDw@p7}@*d%zaS-uQ~ zi$jgYY?9i)+Z{8Q6W z!NH8vE-+`H;xZF;`+G3zRnK{84nS4Aq048&VAn#_Y)Y4D$urI0bW{katL>e-f?I0T zrQY#LA*7Ith4v+g{n_TsRwc1SdD^g;GYlr(sX>2|tnEA14NHc#^mXdmHBIOQaIC{o z$4ToOFAIMy5aXD%>Klb!yfs931oSF z3Dy{45Z!X@zUqY3QsA(?j0sIl#$$!3UPxCCL7wBlgr*q?IL>qp)t!(e0Cb~IHRb16 zhp0sucBff)s`2gKUZVXM#=@WJHbBo!zkk7h#=>O7fs8G9*U!);NXLyvGipUMC z$LXu8u3ofgQ65+DV8aR)GfcoXbu^`51HQ(Ds6~jbQCvzw04Z8}W_S;gZrqGfaGAfv zlg`0_ALS-gbF;BqA9IyL-1>1-5oK1e1ftv+Qi21bYL*T+f){klxXk!snI-P3pab30 zkk&}; zYE|%gb^4H2=yV*lI#{4JXc%OpgPAhNA_p?c_v4u`AL4HUk#+UM+|sI$Qx zxT%rqy`Z?#peSy0(p6#Gu09M__4mmTT&Yxjtl`m!j`#21ad3JY2|dMlz@J(z|(l$L4JuBcj6EWh+9 zai)8|gTlVfh=;kRu+1EspWlE<`W~E$h_jk8x}~~`$QIQ#N4H)NHqu4R1H)=jSQ<*! zRG5$l+BTa8W2vCg!To(Z8`0G3Nu}_X&MZ|I;e73FgXkx=_ocLchTCeCYiI;8-%)%K z)L?3?g3?w!%hZ}cQAJ1RptaBj77QiqHrF@c5~xnqpq(1l-Ly&ww{oH-LQ*wJosnc# z`<}oGJ(>972FMdm{+AyC^gLX(+s z-H;ngG+jbC)ZVWuv;y`OsGKabEldKbnPzHEh&zUw8mR@827QwuJ>8v!_Py<Je|kM9lu7jh4F^`$eZ z77Kw?HqJXKpw2>dmcHs#NBLqH4MTe^K?5>%xz*>8V|ouW<&_R*TX%)BLM4J42#va9 zU7^gNtH&$IBRxSDwCiVVEOeqw>K=J8pO)S%T1=o#dqxjm_6^`3uyj^K#{%L;0d%IB zPgKps$`m6J7+09M)mD$sr(T*wU>!K^L|2fDVl8iVo`my&R_@ zQDXBf+E2hM^=Sp&juuj9v?)=oP^Va&k>KXMJkClQ#`ptv(`9DI9BV=mN9h+!<~Ow} z(N<1rix&Az( zYMMsRRb#TIfP*>E-Ngy>=c#KoUWM_x%BB#7z0kugwpS#q9yCJJIlkM=RoV(wsirg+ z15+Ow3BmdbT5F0wn1mlJ^mHzy!?G(|7N8?Bz%@k2fd!+T6%!T?%p||EwITN44|KN= zHdeB;$oUxb{rmg+lvti}*(U0=%td9>-?qCquOlI60xQPkATEPl!$Tc?yDQwn;TDHA zI8bq==Lwgq|D>uND`dl}J=h=^Zze?C&5bkxRP}{zi&!s1{vz#w6V>1dj}mtd_w<~X z$K8agB{A{5d>0jRYE(=Vv8bHl40&aWIS=8yg1LkZTPZE!_iF4gnI>J6ss5FlGs`b@ z19Z<$cl$!>j}6k;=?XIpNYeu?*X!$fmR_co7~w7%oK=9`kR2GP#@cTzc_&HOi-|~_ z#o9ZBrS!DKu|Oxs7LUzi?z3R#F!iY$nOdq4^m3(?Y5_!F-D@u*P8CjSIWvGo{yjaC zF9T?f>{Uy#uo;mw{*<+9z~0P{>Oo+$GHJmjdegB{ofz)HRTi38;2}yHrUk)BqDK6v zS%W%y&CU+B`f=h$3W$HDP?q9Jp#xQ9N^)y^J2oQs%=JHYO*9YLw^u^z(1^ehd^-x8 zu>@Adb4s&5XztPi4i@f)aB!4QUdz|XZ(4h4(Su@>6+D>*EZQsYA&RSDloD*J+cQuE!?CPR&;x6%_ZG>&Kh?Fi3N#iG$V)k)K|=4PG$L8<3YUAOjAlNPY827v|t5Q8kG%N%$?nI5Oq+`U_!d3y)&Jg zV!#Pk3cx;M(0QAOmC(~ELR5FrHDL>T)HxI4T%kqz1}LU(tm2`i!&J70)h%oDGN|wzDL%Ujd6nJNkJhJxWsX{-y%eWGIric-gyxR*axUqJ!2(wDqBv`E8e?M1qVJaSsdLYHgPlG zQC6(V7iX%94)x1644Pt59wIVCS5V?+K-40*=kKU|gE~+Tjx$-s0CU$tRj!!H<{Rcy zlqcj(I+X~hlDB3A zu5pUFTK2?ig@}Q%;vs2c+rm0HX z4}vot$qgl7MiXB09o-!?=tFC0_L5%d?(H8|VpiV>qI3`k*7o-=#87@JgR%n)v8qWQ zH6i1vRvhW|c#~DQJGttNV3i+pHwhK2D zdbg_sFsp%6$*N6 zIIt=|+|QfgC+Kc{MvePmlU1_InUR77bwdmcHhz)39YY*8?Jek|4s0t|yL(V??dnGN zE;D5#tvkcef?3h1HMQOWltuv|-lK<#U9F;Zsug1@O##l|SQwqCifBn-WkYEj9>R6F z-FiT$Y+=>=m1BE=0aGfD#wllN8eH%AQ+ry2?Xi4aZ*=$UF&)GGIC~#GSuE%*^mOQ5 z%$16#zSXg8>LyFA?it2MaOOnIKp~wYvfY6g)m@<^bo8~G{Z%QIESp6(5O%ErGSc6E$P*PR%qDhKZLeLn_jn6cGCg{t)TiL=`aX`(xfwaAuPHX z7?hxmDLjRG40NkHduA`XFY0(K4B~9$Lmn~WqQ``BYH!fs7~DbK6{;AHUSrN$Y{&Xx zHG4QaQkkfYz$U}J z7Ei&Iq6JjbG$Dk>h3Rn6Xeu>)P+O06Lryq2qgqfZMmSt#hz5n!?Up+TN+tUong&C8 zNEY?0TCg#I8V;2U34Bb2_#h_dAbrahEzxK1m|DI*95Loey~+8FBrr6_jIp(1)uPNv z7)Qn-aMWJWGaZZIgpN8v)1-Jb&Fs=@AWSZHVdf3%4FH$|#8{p%I{l?vWf2Wv^$!o= ziaBhW(7qjTGV@<4Ae zQwyOeS31^224JZ%iS{*JjnR%9HfgHB>^eqzb!Sws>@@@5h&~qLfd{lwNk`Y9 zKD$$@(tbT;Ge-3m#vI2uG?JQbq0U4L%?h;Wn~qZ{f>hafR5Z7_Q%QkYqcncq;Cj7+ zW&G7RaPXRxIdepwQw;itf+q!Wk9~d@^S&9TGj-HDNF6`bEY|TXHYsjIR zmceER%>(r-?3sgE*ziI12{a|{wL);gv>3AZBvde96GczmG}LA|NmMemyyS%zH{;|< zJsWCf6sZZq~5L1(C%5*9(zih*5mF<`n z#!-FvmYGV?CgsfnO2LoPFV)}#v}v8rY?5m@nsY^X#|D27IlLPO z*idzg>0XsX@G#S+N(-POBy$_vaF#2r-=|BPh<%aSL^R1%eS=VxAXcg( znL!kMvtd$Br;CzYJb~6g4Pu^^>O}V5g25}yMWnTw!_y{DO^>zgv;RF2M$6buwSaTXx7TJKQXp3DT$p_|}F;#LhR zWT}Cg-o#T+kE?0XXtKo-Ti%BcIR+vM90S;r}GnGKP3VT#< zLLYNznlE)52iw-;P*3y*_vT-ZoXNi-Q#A*BrRNm0bmZ}|<`8+?js99^M3L4^;zS;3 za_DntSlzxi7e1uWqNipU&V#ysxNnH=s0`P?p>X0Xzya*5Z0~97-icFau&|sakU9qX z)Oi1~IM$_Qx9ZO};+*3>v@CM+c|qw|iJvpD(z2s~S{An?qC&y@0QyaP(UiwUc$s5% z;;cxlDiW)+(@_E?(=&vG_RtFQ7L;_{UZjU-=J6@Td|(YP!ZB4QQ~-DmKA@&);PbQE z+p)-3ophy!5Rpc8`w}gO!8$4I44a(qrL*IPx^c4p;H&5=Oswv?w66(gguVhPH91ET zj@AstDBrLR)d`OI#TvuHU`mZW7q>CVsCbh~=^8XgViy!A71+JEQ;bgXSSm>4l3J0N6>D1ynPC-*lwZ zlRq#3vV4A7%V(&8jFx|6 zUuP!{hobRu+V9hXGq*65NUy2z3=N{fS<7*3{1SB3ba#r6;V1etNGb7fiH?az)C5~b z-DRN;ki^OmDw!A#K;H?6T^LYLyQeT-NXsf{eB6vK>m{L6gU*jyoQ`dky6=`C$kfI;43}ctD-CYYwib1#tzNc29}Awa_7hXQBXM1} zSUEDdtp^7LZ7ZmHJiN;U5=AY=@ig@_w>WdIT*DNsd_w0@>8y@)IE%qgx^q^xpgYrP z=3!(MV+3fi^r3M~9c@fKYVlSlPSNBFq%*0@xv{==Mb{~9{bY3EHj@2cbk-#O9r=>pSSLq=}pb*mU!Hw zO<7#e-Q^%obHZIbwDlc(jk&?wmcMfC#!c%lyL3|uqkZ~@N2Pw2E8)}pYEgHiq}a5K zXAe3dv@N)=w{aJ)eoRNHI@zuCsYw2Z2Jnz-2M;M8dn2xtijLhWDyEgh~PYV)+0(KIPDlZ3v&(jBPZHeQrWdL^Zu)4pg@ z&93A`aiwL~vQ*^OUrJO*uVvdX#`%YEJrXxU%C6%4A)?=m83cW0=pdGhVHBf)R%$Bg z?Ap$eu_``t;c zp>3+FhBU{Hoyx|{Fj3}DxCkASwtO*9>QZd<<4xgtT4G4GN8s{ARXDLl18WEP`g5~a zy;AkKS^P?%So~TcB3U%YK`UMR}bOdmfGR>}a_6+aAvYDZjHn2NI-ZZiT7U)n@DZM4a zONGACISXk%6-Ufa({a%anOkl*QlHR7td${d96% z>i~A}VaZSL_EzZNad}$bkP!>U)i@NOlfyOSs>gun(x8mK?-bwN=dxv{HJc+(^nyJe z^dxN`bRUAjJZwETr@>HlFk_9@Y2MHJY!uJuobLbT*Ei8(by`;01O48ymug}RD`k!k zH$;Il6JIuY92d_F{*6VGl;nXqTaGq~wcNEXuFNkz8ua16H!p5TuDZtwhAg zo@(AeO4R{f*k?&D(Dm)6!4N}5Z{u&YO?(b52{a3Frn z3S-=x#|dsa+G-^!QifyX;N~QgY7U>H)z?cD&I%}qDw{HKkGf?HE7?u$57FpQN1K`b zmeZRHG)=~T$BJ>S;k_FIII<3|y7pT!8|i`)|>5J1fJ&Ncf4KizwOq~LtaqX!?Wm&YFe+6Ksm3ST-$CERCLip=|h9LVv?xqdL?<>G!fPRacUOauI?+7jo~?T<}gnsVVGJ~0x2X{cTM@o zPwnbt?MmM&3!%Jln zZw9`U(5ANB$~md6xrc>+s+UO_U)dC413xAf(maJBt^ndCei7C_=;3ms=8X)~7&%0V zMi$gCzmfG~=KM`+&YniVci_$sItNM3Vw{Je_x1wD2x#oR51UeY(U=7lwUtqnlnQZC zhhQY)JkelB)rFZvGp=HWOtfPhZG_>cLI}EU?46cD)gIj6*lFEhXr_+QVf_Z+j!Hf1$FQYo^6`7h^@2>FlR-Wz@hzRbCbbM=(p4X;9CxW7HC( zPq=qLZe>!5{uEW zIBC;xJB^f42=h${Sh#5jVB8N&(8)ysYYssy_%Z_0#gy9D14DYqLh?!-_>F^Har1C$ zs@5M4Nmfrf3t_nXXDTLDKIP<=S*4mn-Cp=e~twSZP0I+miT@!4yB^4s{ z`OSgQ#d_813U+amxQ%s6BT$>BuZ(tJhq~tt8_`jz@L9{j-3L93T(V^8J0#<}`<(>R@PM+T2fqQttfGZd@KhJ3p3UJEERIN^3$;Ylelp3)}j4 zbfYjYS-fnK9%hBS;hy6b-u0A1D*R#XIdkzjsi;Bhk)=?uUysJYHLIw2=`|A>{nQ(~ z>V}P(sy(Mv)z{9s<&m7|>(^OaARC{v$eO2$R&NbK0tZ%Bz{N%??lj!pT z80lvv``H}&*~(rV?pHY6ZxQaBEc(SNzoL<~CDYqd;CS%j73De=ucS=h<+hhFfDiI&b`jDU6p;x|}>Vo_a zvL0Tx!pQtP7{BOSY$e^`0Weh z*Iz1nxoj=vwG}}8CO0$66S-g#}0()jOej!e|4zH z5Jx+l!=b;hE@@>&-!#b%=dm!Ik#KU=s7-`^w&mo(Fg*vV`~_|cQi$(TNZj>A!0*38dzB8V`HXol0<8i2p3tBFF zGXlqNO250_5am7=ZZ12H1SC@P#Nr)>+uUpw*Ie~;P)E(od=-JsR=S@J{g*E9x$NzV zk+Bk`8E5ljk4p}-O%Pt$s)3rZ;xpF#w8JNPRgb7YNS=nG;uLE?jMSf99;Srp-Cv?S z%uzfXL3!x+#6MS!wg49hDhAsRLCD^eO!Hiv?jLGH!kE;$$F&vv3Pai;@5(Z-hq)2 z>UEp{f`1OZQ;g{yJ3fcACIivG@Kqnw%*bVD zWYOS^l$akq7q7<-hw>27qf&R1lLatR?=KGd60|e3)4>8=#$xT-gJC$UY<*k3A5~_c zZnZ2mvQ6Xj<-ucRHK=1q8-y~)5COz?Sks(ZFL;;*WmQ` zLd;)GKEnKs<@;7YN>sV2|BK)Os6ST&d#ozs&acArK z7eoK?`tY%MeQ3+WzR-UlZ{ZkUJRe@^_}clnIFu{2;%fC^tsEGo3PCqqRzN7=#+{G0 zoQv_pNI#sKi`)$-R@wZ2!ofcp=hHP>({cIQ) zI~}6`T#U+b_5o-UU{OJ~{flz2KkA>#0idY&7$0A0xw7N`N{4UfSCU@dfc%vDYS33*6cda!l$q}DG9Ubycp`~r($&OIqF_aTs#0m_{M~&HxaJ~ z`(5(8C6wRM^3QfZTKc1PFYv-F} zkb@w8BnLkCqov;v#wYAoqW^=JwQO zFnC`_kR5K%NW;xiV>dotVyAn#2sfDHMLsZ}=(|k!-RypIbl$WY-IP-8ftT1H=3DJ@ zM^kt9_{3=AY0GmEPe=PPN0AL%kV;Y5<*+}jM`H2S^UQxlISgaX^UOA#yTkEam!7 z=Bi(iqN(KD&i^T)JjMNIix}GsWgD?XO(1{A<#S4?m*VuO<0QS)A`YQ4L_aEUU}| zjSd*epBZ7f*?{1SD*EI2g*UN3Y!+ z)m|u-$Tg|YbUBS8)wjV7#drgZl=J5aqz8IFI*hb#MD>)N{s%QR=eSa?dS6UFY`t_~ z^y#OmI+8(EQWN0_OP0NsXoAs;-{Yh=csDbZDjfx*PH#J+}&TgysE)LxUmbY zW{}M{p|7lbK<-j|0W}1-5GY<9R{FMtdgP@N{WvNh_%7o_iH5$9p*o(nyoh?kDW7^h z6s^ILS;D==cz>Jdt4H)}kYetp#Okdcq}{kr(3jcUCOQ?S_Pzj?lnIr7QkFX`eimUj9MhyEh*BmT;{WgZ~6!<`fQkH|+bMEmqJ%7vZ2 zRSti0T-SEr6}k`G_b5QzJhI(yX7^&f6#hU?m!8BwGTA$UDDJoHk;pq4^}>}isZ8$kNYWd^jQ5WRgOq6vM^G6NdD5kV(V~L zh5YigZ=lE>>u_xO%gcHuQogd!fhV!{tDP<}j^WhP_e{JO>ta_}dOFOn4x~@!SJ2+t zT6e!czo>=Be9hFFX*JVpPN+F?13H8qD&AIJ+VTEl*l$W$A5sHy$^FZb z%0-ivUP`}uV)`BOR6@Vo>FE#Y#Po<-)0H4!wp?swdh6ozb}05CHREmu>_|Scf9TKZ zd+TEQa-{r9JDoPY2g7(e__jx;)VU6q@=vB)j29%x)t%#9a@7idsV!IS(YH+&-8=s`_|(({bR+dFhU|`#1=aSa zIz!}jYqb3q)P<&g?tl}SKL^A4k_0(w#*|51Kl$Xy&M&cU%PB`{jc?eObtV<9`~N{cTdP=U&z*Ff~`Tezp?6< zm9>;vcxZpZ7TPK0o_xP^k~;xojfd@Tq;g~Hv)gs-J?#v%MMKT)Y-iYdCYaxG)B`lc z9Fo%k+wr-#WPExg0cU*da*-c#xp<;1{rXfGZ)dqsBbC7r3yKBYlc@5ZyZ+FBR9{q! zmN})E>v-edmIFa2(%vNAbGL%L+Wtl=|8~5^{tlo1-iP`iroU~uc_2)Ge0*yk`g;NI zv_o5Nn!|Q`Y5iCIl1u%KnIB{2;{qf@=KmpXSEG+ymv17?mEBTB3d^0|=R6Ekwv_Y*U`dVk+hh9Oq{pWTY; zmX!{ij5XaIR=WRO+ii9{50a44lQ>`2T$cWOQinp}xb>gazO>^xG}7{`_8`UEFQ}<( zP{qjB6Tc7RSyE3_KjJ1hR{5EMa49QT-#;A2BVT&@|%u^2M^`WwiBW4`M6%_Y(b}CsFTUT*IMta@iro-|<0Hjg1R! z4dwGd$?+z&{{>E@&UNfVT^`aaxlWqK{T<7sW8*twKaF!-g~q?t@N0DVJ2qZl6z%eo z>7;@G{dO{G78|{_7#^SRdfxCE`IoPLE-wG0l@D9~H;4QU#~&T*3vB)HaOls!K0dn` zV?6P-@RTIGUGq$s&O`C_8+z_EXxgB5+YI+o&ZmU+T2jBe1|2(ZzuQjd%VE4)?R7b7 zKCD&5iuU-0zm-p$-XBB0mDH=*#~j0Bpt!(FcWo$#Vg5n)@%XWw-(vq)r2S0mm1UFJ z_DB3yk2Ri#Ca3fkYd4J4pUtNuCb&}dagNpzL~FC4-DA@`JOaMwvb0dqP0;3hLm0o1 z@2E6?Cn*H!Eu`53sj z<0bmTt#X=!<{o*zo1$RHD=0tW92|HF<^f0R-p*&S{wpS5x#~a0I7p#re?_`g4>U)SFhpYl3@OzYm4{d@5^?f7AYeY!h@hK5=^zZAp4;I>9^` z?dP)T=!L6A5W+Vmq=#m0I%0g+ecldqiQ~APn4D}0(-q;%J>&14pr-ejFD5;9K8`d$ z7TEk$+`*r%n7`$MPHQgli&AcfQ*^n{(avS#!PLBVI2|s3P$Sx`d#(;hW75q4z9(3|Zy@MDSz-{7N}K5QY=UZ#`d)!pHeN z!ue{^o_onzE^@TI3ZGb<&76RpPk}xb^*4q>gZkT+|JG9JK-6 z9CFE(qY2l}k9A>unq@r%GR=Wff*af46QMs#-VTyT8xmA!0_CDf zPB*~F@J0Fd_7`*25Bs_;v3A#rFg`)M0%atSJ3IUbL-$X`;-8}(Nq{*4O_QK9#Bcbu z`SCzVFOr{H|Djza6$jkf@tNbPFSY+8QU9CePaW_ASdza<{IKKyNErWke&(u?0Fj{% z{hxOHH;3^F_S>nw7iJZ;9e<%GgZ$6+umE5!Y51xrZ?*XKM96=4yQc%92r^)OwE3eJ zr$-?Qpvj{DSV;efyL|>}#TOPio;bJl##2O`9%|>w3ZeRt*p(b#ADjv2X-bb@V!?!J zQ&&46F2H&&V8GIjO$k;vHJDShhkd=Khp&v%MvDgQ~|R~hePjo;z~|3Q1%6My1| zdOY8g{Ld-Ve-izq?@94rQQ`O{g`X7vr0$%-=`$-Kk0k9;gjA}k4L`q=CiN- zmHWNi_$TqFJ|X@|@{?44EA4+(Lj05TTcz_iiT~y1Z&LmxzohR;@k{!iBwuNN=lrg^p?QNkvHz%hNCVW@V?)C#yo`h4K7IZ1 z_<^V97v>=U)>{8MZS6EZ-)#B`0S#JT;X4pBm)(!P0=|d67T!_U1o|>=M@)Evu4DcJ z;|A7zoK5FW(~l}iM{T8!60-XPtS1GXV4R1dx)Mglzsm?l;NHg*I%^AlH(UNYY5?E~ z{3or)qH*>JU-bZ|9k1tXez-ardsAKLNbb#ejy zg!tM1?pL*Y2$+ipm}JXg ztD+L26B&2kitjSN4%+$MRCgpY4v@pp6%ZXH?V-gmdE_^G$>O)o?~XYANPN`ZATbYM z^M%*33clQrwZ~CCl*?|WHNn+_F?PQ3`CEdHcbrfkZ%60<$4krxi+{X7RnR@)IhRY# zt=Q*s+41CgE(<(BHl-0^IUq~wjNBtw=lk>Yi)W5b#$b>M8~b7 z=d^uXv3UoTTsj^xT!TQvponV}prqR6 z@OHCaOvblV6|L4P#MMQN?jut*V@FIkdoP-1al&?ddA*IG>s+^~_QTRVh+MZR_CNI? zda^vMpdWYy-KR>l-|mJU#`jRRsQpIuUkub_W97|ffy#BaNd-wbA zm;PhbN37h&`X!!yAy|ix>Mg3@bL(s*-u`|#9^d`Zb}-$307#2JtCv{4$?N6?-`w?* zI#@3nPl|#q?~Z(R)1&%0O3qo&+4P@`r`tmxdTRvq?ecVgoPNArM$4mQvkWnpKZ%4b z?^I9GBlsMZgdX4%M}P49UE@d$bzKA^E2<%9B zE;*9Zy=pCr5N?}4TU06|{E5aV!r^#%w)sPHNRQxmlpfj)GC{UnrB%PYQgp|i7)x(L zJ^p)VyU#Aa4{EZKk8Zie$U#(Wo$4W`f1VpDeRZE&&;j?hvu!!(kJFFJL8P9D>&Iez zd@*Ufi7qqnjyKu-y>0aEjo+7QkJ|F)Xcv^+zm?0@pjlw=;EJC^(G}-wT<>m;>RE@{ zjrCtD)joP6-abmo$HicTHy>?2zcAYVT=q8Sy-ZEuD|I1wjQqBEeHK1iB;j+{BxAkI30_OOP=g{r72#1J>yH+ z=h3i>4KUgIgV5_fZ$`SK@f<<ywz3+QU2_7JP=QZ-48Qua@H$RGrx@RNt9C*I=dls2#78>D!Eim{$j`X`q+a=- zNDn*4`90&a2OvY%;4#u^m&df~Gh6>T^3_*g&_<_NePPG*CA(azbC+tP^GiJ5n9Fv7 zCeCHzd=BpivFY-@HX%0${Ntu{Q6WCZ$;SBlV7z=d^bz{%QXe_m33hyk;(RC--zP>I zUx)rIalVW>v)sW5yF3lW`4BHpsG_an6yxV(@ph-T-q7=cQ_$>;Rvt78YR7M6@{dlL z%qOJD)~8$J?W3qZR^wfvLbl7xz63ty(7$3Hsp07Ghw`}xV$*%lI)4bg1X#90`c+5{qgul%LQ~@ST17C^jN+)#seMg zMJNZWy=dp}!FaqJ=|$wC$&0mjr`vRRlbpeAy?D2+7ZcV2EdZTyFx(zX3U9RTms|8> z{VF?to^-|5G1&gNE#mQir#;T$^KaIb88Vqp^Ku2`H_sq!#;*lVY2=6T0&wOfed{m| zhGCyz-pSf&-rHf%H1E;^nUc?+>-W5gbxq0GXSjRnb@iu8ALmyuGuI^4e( zxXb-Vftw+D<%{Wj9QYCkoli{2WR^Mbj{tYkzXjlH9q!)(+~s}~!d>BTztI!_t08b; zY4C9TmjUFXi|HfdOMqV)xDN530F!jK88;_aWio4pd&a*5>=Fn5ZD2B8*BUpEgU;2$ zJ>y>n?sES=;Cw_Cd1LqYc-(&&_!>c<%OTt1Q{;11L&P9=rjHjFjx9t1^Tlb?w131xnB)j$_>*eIdHkBd!t?W|Mk%Sdk=mH zbf`||hr>M#T-FneKj;bfW)J=b5B|@d`256!{|>m!FOE+R^tW;3VKaU_aGCFn-v_3- z@c-j+|1|VMgP`AL-Y>P}EpPB7d1X?gbwAB`Y=Gx!@=JrO%Ad2F_O|N}SxE zPJnqHHnxxdtKgm<-}j>W>i>Qu;roGv?|cuFFMO_SeczM9pPrDur0|pI*Q0#UBOr(OoyChJuwj9-jj@DemD{CwbNG7;E} zp8$fgT}$;2J=P=3zR0)zSKv@tc9W>XRSBztnlG*PjHwg^9yvd_Us3 zLExi(J!BL>-gqQFmGi7HjqJQ3^5;e`DZR}5Bza>Var<&1fO8mxy~Dh}2lk}`=T~G~ z$>%TM-Rw!Kuh`fBR{ph`1RkCcZ99!rZn^#b0vL2MGYdB3KLalH9`~Q=drr9LKE%Di zWPh9S4*{Pe+_#zci$Pqr2_-K3=ZxQvhS{+WI)txv;Flr(^Bi~!a4MtxF#Qe>PVH_N zol~K=UHCHKF8VZ2>B7(V(D@b`^^*S_&!;^2w>|iGJUI2KSXPJ^OrLa=E59}YpG^+U z!|tgaFLgWP)Sq+VR7bgR>Q_lQWI9wgy27PC)gl;v*!>CsE}V3-3qRL`Q(M60{wu(b zgW-q6{U!hx{v2>ux_%7Ym9BpTPIx#|2T+`IVv|2#O2qq*Gw3b-r& zzXtA#|J4v$m)!mu<TynrJ(lbq(MV zJ?o6Czpjp^b3~qnqi*y5e%Nya&h6&U1C!$_JB=IC3#60yVVwF2$1n){fT`$w>Dp%8 zlAe@&Vx07(#QTl=qrh*jLkVJhEAUqtHxj=FxYSqdp5_%~z0COez)y70nd5PP8gNZ@SO^wk^O7oT#!b6o+pI-e;9^?hegWBm>_ zryiewPB+^e9@{o<|IV>PV^6YvqgY3tqawe;_6W@xHi&N>=AGuOrT$}_+GG;HhTTIi zO8v$7UBDL@H)Jt>smDF(@72QnI{c=`PQOMg_m|`OX@oE5?-{?q6aNEXyqv!qsa|Hf zZ-akXo*y$h(H-%4V+|+AI7f*zJfv6jGqNu zw$m7|0=~@QzJUC2$>rap0Iqbn|1NMBozDT6{O53Ky*ld*BFFe2fJ?dWGGY1hOGL%_ zI#PLYdIngof9{|D2()DV#W>A7Nj@`9^H+Hhsdn>zBJlYRoc62WfAFw-TF<72LYT7u$nI(VOWqNmzXLAYFYNvwfKPU~pO5n5iq9P2 z@De;s=N{m4yp-_=fy;8i_$9z)d|3Y24g#=V_&eLy=in!YvmfEO(y<4LkT~a|k1m&= zcY>ZQZ>vm*N&Y@%`McKmdn;_&9xE7}>PyMzJqG`wm0yfcwfNa(BI%1)m!WqZY?&U$ zcNn}XGaezzm>7?i#V)EcRaN|MIf?vaH?a9N@|}M$pY8xaJmDuPzmnQx%onzqF58T= z&3L8lE)zhx;kFq%jo_}-iyVI+)0y8(;Xsy8#uoyY^1}F|AS}y2<6i{sa{oP#`|o(% zzXV*?$4tKt@i`0M_+gy-IV%{1&HQ9rd{VEBvu%GL>+cTZ@d)B0>tn`qD7U8w;*58} zz3lH5j2qGwJoZY^HiI94O?^~;7{3d^ECyjS{x-bJd|~{Pz-7OO@vnIB-+J(ufy?wV z9U9M)^2qp?fXjAw5x?p2x%!!fXns@$Nx8=Bipx({{grx$Bcg* z_-T&#d1WQz+L>Q109)P+zvm8!X@<+|r+&^H7=BvK%Mye?l|k5yPqJ`o$I^3=l@7*t1DE|Y##=4-hwz&oU;4PdXn-4; zKE^2wiSL0Pr^iQc3(8BW?==bWx$Uc^{Vz6=@r7SZ_^zq@|Mr?sN5dw=50~S^0Hl6m z{AS=Mv18bbS0lZz5jd4odcF-K$4eOhF>u+hV*Ewmi(vR+{L27j{m=OIz)xn!e+D+| zyVpYR%op)t{6D}a7ye$4`_FjrXFzAJpkHs^eexols@H>~bbqMA?hA(gt+1I_1Tp?5 zyl)`DJk7>VN^ipm-L)Eb`(T@*s}ROX&RqC@;Idv|_oS~~?zaGR>HVL2=+n59i_Sj- zl;wxRy~*SL4&YLcGT+!n@Xm+7v+Z;Qu+@AxfN-SV$4~XJZGHw8<7@{X%u9!{*Ta@{ zNgm|WYJN~VRn|wH2G1h^sm~Z+4t#+iG)}zJE7uRyR+i<>c9-;<>5%S}bQqrvJO{%M zKwsPe7!{6CVFUu3#cKjJ<+x|Y*-+!v~9xxI1r6=k8Skuelv2D}2 z-85wFeh9lulDowT=}P*}@nW09WqTsO7~2e=1!y*S(=YYb?@8A0TI=^w)^Cmn+t%kX z|78BMZ4=_Li^UkXX|zA$x39m!PLsZ~yOG+fj6)wElD>~L9NQhIgKhhJk~}hh*|z;N z&h}rvM>)WJVLSR&pP@$BU%uO%(Z885Y}>9FXZtVTqa0wqupRvx%H3GMvtD64ZTcK9 zw*Nvu$^qsJ+tIJ#yqT}wk#kPuSFUlU-*){k`}nT!axDXWmt*p--*))CzMtIEV~00O z!@*y>{bI-0re~+mZokN}X$r({@7VP1@AmH`_j0V6!n57WHK+95Zok>-v*T}nw}0FD zlk|PG?&~Ph;<5Q{^UKa}TRv=hN%A&BgiWtj;ozAaBSf0N|Hj*nbJ=L%1*t)}m`fBUzce*3r0KRZ9{-*)`$ z@?)ph{%y-U&Hu>9mUlV#Meb~QwcXE@#PDv@Px5ca*G|9vd$jKD@@S{e=BHi$c)iqq zR6tTUalCx>PTugv*KVM7NA&yzM)I&hp<%sde#WfeJmc6G4KV$u@l*0FssElg^nCH= z^s;T72NvUO2OrE!-q>TMZ`X%*e%aq`{b2vL^@;tPvQQVmQHyV|_Jj7*VjD8~OEa9LMy|ATEoO1&O1 zfRBHie|Ny0ET@YT{Bix|3zx%V+mH*aB>F27!e_c{2ZYUwUBA~`4y0_;Cz}qZkG8J9kTlU|p6W&9h!rMxiyQQ%UBcNsc&!frS3 zWHEj>-scFs!@N_wRF*BqNiHRxlpjwSdcO1@O!&^_;AJr9HO4JjjDHEZtY;W+11{^U z9mel_AXt(=jDHBYq{BF!1M+GS?)B#V7qHhm@Sg*dGQ;jWJ@_^YXZ^7f;YvD;)BbW< zZ!o^y1DD~l+_5dZL|*wj+mVmr2Z!?&gd_XDjKAH(r?*-BVE2Cq{B#F>I#+9n17C)4 zrJORI-@<*~;r>2PxOASEZ2vKx-vFQOpwotM=Q!~3z#AO+(~vLL_4JwPf5#(tzXrbA zLFZSNd(I!Wg_p=He`h=LQT*WVY>Q8kSC0Q=@JF@*7^nLU8iWtl$Fv_$$|K{S2PnsG z82>bImwTGvl5)cC?}eVb(h;tGKLxwr20E^A_X3xCk=+k^+SX_pQKZ3QCM`0WSH=INftC>9iWZdGO%^L5J}fRz7tZH~Wwg=L`3Y7l6z1z&P!r zz0l#_-bc&sFN1p?<0Eg3Ukmz84mzE{XFG5@XG`*d>GXhptHb>+;8Kp+{Tn^*-{o=t zeh*Ijd1U*C>HivWk$Ru;UjcW;e>~D9%N4t)@doL>#-x#Lk>toLe`h=LQT*WVY>Q8k zSN_g+k@WHG)1?=rs_zYVyIBjXHSCWS;nWw5PCoCc0rW!`+-S1j6V*1gTwuoE%#l< z&2reXKHh5Z7huc!nDOHgPl@*%_t(Rgdbri#cfih@cd}Z|`#rFaHt%G$n)lhTrJOKM zZ5TNx+hN>OU-lI9P8R0_+v1aY?KHscuw{9(-6j2QHV*Q}Zb145knWkE_rty98{;dhlAr-xZ$=fV<-JkcZAEEW91R>6vWthjBW0 zMy8ALqdoW#@Hv{K`pfS30&jHSw*Z&&%&BJT}ks zbYJsk5fSFkXyf^5#IsJ&S!~`%N{8#0w@ixWBja}fC*8^q$NvBVpgNBq#{U+$e*TIIDNK|0=LX4}O6I{~EAq4*VZV;Ie#ie2SL) zR{W;tJ3$Gmwbi}6?EUDD_I z7b+hvI#;3`N&askVtA;2nWbOV-%j&>8S-7yXS~^iUvA+y89MKTeYSZgi}82i{R{_w z7cd&b;fLLmK9})l{AS=%P9&aZBCr|Xk9U`Q!t*fvu>6z!NIr1;&8L5ozBB#N+FV9_ z;WEy)O`mbL?e7yTz;;*ecczD8;e3+5J3Wm6oNnAOecMaYcia6)f9H)uU${Ox#WDJO zd5r!z9#8|LdRmO@L$FU5J{hO+e~B|6*cM(Qul$|u$Vc&`(&a$}HLBO7cqM%wRbav~ z^NVfqNxd@8w*7sqznLD}HXX*Afj3!kF7?yq7qv_1K{Gkhze`F_zw(vIP=9opc_)kOd|Edl z+o6m<3S8FzjGqR-4T8?q=KUwIWxJ1Y>Zi)~^)<%*YS?mo!oZO+EXJe_aus=!=q7z1 zZKRkU+qQqk*|xur^*7UF+or=f+xGWze<#sR`aah1ljtUW|Nl$4thX*lf@Jv}Yy8Xg z$K|~ijd$4&VSEa3sh3!9d$1fXjLzDPBq6w}Ku$bRMz{kMSFT%W;RRwDZgc;P@XrjMI7$7f$1nF8nP3 zWxc_4?0S*$-IjZB(*45Hz9zQg?wfM4RkZwCFm178Vzp#wjr+MTYc7?+vua6iq1Pxs&_c<@^g?#T}N zv!O?)IPg<}%W}bdqx;;X95Q~k2dDL)vmNx$1%A2%r+q>$yb1WJ4)=sh{l@XR5V$Lz z7kTh?z+Leq+(n1>Il1slJou#^`h>gaTn6052f|(M7XX)fhV%tJG*2em*NpE1F8L<$ z#oDX-D{-l3c>aTQ07wN7=>>Wog}l8=zpB3-=Kbfur9NT&7r>T5lEXG&keWnB71WcAkcHa+N z&Nnmudf+l&7{3v?tnV1V$%B(jN&U?3DIX`m@WVLGztT5;7^itt7rqg=EB>22_#ki> zA84NbBn}idhfDWw&2r$hKFx(w`$v`|relwLF;2qla{u25(}ln6!T;TZe+cwt`Q>mA z0+;2K@sD`i)4dy$9DMjVa993*0=R6CF@4&P=E9pm+r|H9fV<@ISr7gL4}J@9*^c7) z-0H#a2JR|%f8)U)@Zg^T?kd-x_Ta<=SH4hPCep;&U$+v+EKEd!}yzl%leD)qidq_xeavb zSqdZ5%Q(eTmQ%*5zLN1|{8HdNc7@mA9=O$bpGSas*gfIIJAN3y0Dz1?jUUEu0wCkh z`FJ_#=1z zSwFl6c&!POtTyw01oj;BP8Q?;gm)QV#;1ag%l!$!UGDD(9Vu5lAN443(sBGS{u2OF zek6VxJBH2p5xg(-;4=T%{kP$Eio-qOQlDIF+&qtT%@pn>zTAVaap1oM9jSkq&QF2Q zbGRp5wwKs_5x6YZjDG_(SVoAP#3lb3f7;`o@YzJbJktHy48msohj^Fy!uT%WlFt%% z@sr#)!tlfHshuG8p~R_f;D_=10i4SqY{qZIyNk}vz+K^z9&pir8*o|gvs_&cT*^P= z8$I|Y4^I6msgIb>l^*;m55C31yYQPHY7a~K)M&JC$C$L?E!8J)sQL7K()V&Bla!vM z@1qT$%cd{AOfShD%kw^XpgM}5HuJIu^@%K})b62YG6I(FuhDR(6}FUH#z}q}j2p7J z&5#s-;YGdr_{ia01XohtnLgV#J;vF#zi&6dzk-q6CLl=StBf0o|2y0-bKq}8r77db zbndcnu4hjK{}(yvEIuyU&KWRn_QIC^M8>IHyYNmA{uT=##BX{?_e(mAQ@hlK&-LKc zrf|6@z30MPJ@|bVK7`-&P&}o4GC$7(KV?0;Q@PG$ehXa6)^3A;1)!{F**&c%mhOq~ z^bEtu_%lxW)`e5M&4ur`@GktO=U-rCx^^lQV@Qb1Eb~ql<1|0AP~a?Ybf2lLcNjkw zxU5eZKMuI;cQ8)t-6uQfe-zkK2mUc&vL0tTUk4pmxgh?y;!kpWrh`7wTj{`we{$TC z!|nFqly9zbcLQ*eU4EF(>jAuqLD-CwUUh~01`qzkBsU-Kg+7t(ZKnSv;8PvpJ_=mQ z3A=yX#lpG%`ZU5^D8glYKJ>o}r}gVpm-EB!3!pFS zk?V|uJ#a6}BjekFqeuo19uJ+50e7XBa94V1zQC1U!d>Z|16=m&nQw&4`kHZ?50dQ@iAy7Ix^*Q5I|GMy7fXn)h-M#xx?EZ@YT>SqMa9K~W`;U9ve*(Bm zo<9rR6@S8A`S<}3{yN~YU&Ha~1@4m1+km_H`B%X6F#Ir`zXssq!(G7h>=^bA^L{Gw zUAAY24SuVoPZ<9&@Z$v?#@A+}`ke9ga4*XXz9T-g z|I>xj`Gm(i+|#_IltZR}F>u*_VEnBfd z?jPNVZ?lAZ#%~8E<%ID&fJ=FnxEwcQdlwNlxN1@0{6MVbtc33t>C|uAI850Iu|aB^k zKiU1OfY&*~Em-acjGMQ@&I|X9-{HagApbJG?Eam=<$Mt1e?Yyk%t8N;z*jl&{{b$` zJJb0u;8Ly_zYpO`J<0g{EIq*ZQn;7xcE)Mlk<^EbpAUSFBc6mG>%i&UFj>Daopm1i zR6m~PphLKS+3tZMa5_ieZ1h|*&TXuhx2OkgIMW@z-XFNEa^X7^__2XReC)^e8G~llI zPxs(--kpmMwToOht%G&pvw^$hBm0?<-LMNJbm*tM#-vnItqZxlQaM}K6{2ovI-|4}#z-7CI=@dNfzmEFO#pfqI_%}TGw}89k z^E)2=cOLwso_M~^gAaM|Pk8V>9{dgquQxJ)=FEtmZsY2F*ry5~++ThSnC$N`zS45f z{pBZsOL-V=d_)w+^!iGN$9!gcOpzXir~mEgqy8y9uM|Hy9JY1nmHW%(WFN}yDiI9h zw*r@XmT}TAa@>URuX*sVLQhHehv1GLmLL7Af`3hC@RbVhl};b?e?QuDlFy9a>A}C~ z!9VK3>3#+m{m-GCxbO!(IISCSx!;fWiVL4&x!-9-<=e1l39(`PQ@~_espG{FNs@UjXh(?-L$;Gw924ACAwBz|Rc0 ziF2IHJB@?8@a-NtG(O^@f2{}qDsXC>@WbJL4fqlUVKe?Xa96(2Jp{79(QEwDx)YKT%Idj0?-^PS|Lp09&Hb^2BP<@)Y9&{^cbcL9^-k=@^k2A2!J z%Y(n$gZ~crYDc&a18;EPUj#nefj?-*$Xu8;iW!zh#@8zT3a;c*;2&axdr1>Gx6eM?5yYb>`bw z&?uL2k+{^$%m=mwY4yrD+xGXo0c^goJNCym<7_A8r))ElAN#k>57w(pU)G_7*}sov zhsL(~Z@Tk=t0el8=j6$bpRAkcdoBGDkL{oN%C>N-Uh@Xj4k`1mf=s_w&e?We)mZ0xoqCr)xO`QufOjKgC1mEa1mD=syHp>O!XT zx1N0YZ=}l=u04;)bP9;4D_ujtUFmwg2dDKuapR)>R(AhOPd>gI`Nee)C6C>|*OQOec;esWiO+{1=Pvo&gm}8* zf3gSP>5+#kfV=4Y4szAt$S+!VBF7&%z5nTv!%c|4OFn7bQm$`cI<)`X<^C7I^N#q? zx;j_6!f=yvvi1FM9HY#^+t}xf%FHj`-gK+*OYd5tm%u=;6;zz+L=& zvxRRnakv}d&KB|MH17>?zt(}%I^8)Ad>U{$j>>eVdvMyPC-a5f6E4H$c>V+Ad65X0 z@&Av#{{XY9$lCvJP*BV|=13DHh#)E|W>8d&fTCh*w-@R(w zJ~i)CQU5FRI`B9SivPUTuj;4&|Eu`^q3ZkZE6iRI->)-q9;&|ozGhV%|2bw=9RGdX zsyO@DbvT~CitnGB7SB8RHkpr3eV)mVW1P?O7py$KmW>|ozw+0t{`_GaqF2>_*Xnkt zsP8_o!vA8{t-`-HTdBhTW)`34)t{+sf9oph`*!2~QT1OpuiCEveNNT5ZEhaNUvc)e zI92ui?}6iWUiFuQ_^UwuRiXY$;46b)Vf~EP6ZOYEUYF$8n8){rqc3Y^O7a(MyK#KR zqzY}a`;L5C@ae&40-qIpcJNQ_e2M3m`tt?2-|wpGe*^A+mtIx>2k;H;I$t$zD}%po zapL)_{`=3Ns{A?g_&lTf4}iC};~4K3s_%afQ?+0D-(9G_-#4q`Ob_n!ImX{A%^&|e znRq>y-)Qj90Z;T`N>qf^^$Fush{IlgNr)AIT)ABu*$DdQn z?@iu6)l+8OY)GpJQZ8Q=d;oYnhrNp8tPb_p03QgxCiq(5YiDlLts$+Gx%#;-_O+DDbVp^<1K2jgRgVx$An7 z`?i9VE6#S{+h?xhwL|8Lvm^LU;5&ow0=_HwZs5CTuKw%yJXEay?z~GgtkGz#j&G1pHC($1+!c9?x9;c>?@N@Tb6^27d

    ZCU;%_*>v_gTDjr_xYH# z-S;BeviyDU55PYJ{|NkJ@K3-$&0O>Rv&_~1&%wU{{}TK!;9r4%4gOc~Z@~TaUrgGs zzeluX`M2QTfqxJF1Ne{N{{Z*r$C%X5Un1JF{GZ^zg8v5oFYteZ{|9_x$5Ofa>8~4N z(yG5Mk4dXjYatbCwT%`sZwv09e;AWir`19hN55~cHmWwA7P9*OdL<^U&Y*>?zJKm| zOj`B#V`9>(e|}d?TJ_H>h)Jvdf45@N>TFs_gHsaILanZ*h0Iq6Ujuv~_*&rpIV~}1bsa5a{aF`$J@7%`gTaS@ zuMfTf_)zc-!8Zcm7js8^}26t=2|^O3)%P|3Vs;)IPk;4j{rXs{3!6F!H)qy7W_Ey z6TnXdKMDL~@KeA~1wRe^bnr94&jddU{A}=Zz|RFg5Bz-a3&1Y~zX<$d@Jqli1-}gZ za_}p_uLQpe{A%#)z^@0t0sKbro4{`dzXkkO@Y}#|2fqXSPVn*IcY)svejoS);E!gm z>+oaXkApt}{v`NQ;7@};1O6=dbD3-Pc`ao3kw1gK0RAHQOW-eqzXJX$_-o*=gTDd( zCiq+6Z-c)B{x0}?;O~Qf0RAEPN8lfWe**p~_-EjsgMR`3CHP;!zXJan{IB5Ofd38r z+st)+_zwJg@EW^B;&c}a%{{;Rs_%Go91pgKMH}HRf{~P>2;QqO4F{xT>aR2?> zm{i|CFD@o|8*u;px0qCa8gTy{xtLVH9r$$M(}T|d?w`{TleRk(xPKmROsemnHy)GR zKkp$Xxqn_~?w_X`lj5%hzBc$e;Ol~~2kyU*ACvks7<>r$`r!U|DlsYkQ1Few zHwNDXd^7OP!Rx_?gO3Cs1->=7{~moz8lN%X+k$TgzCHL3;5&ow3cefop5O<9j|D#z z{4nq%!H)tz8vGdWW5JIDKLz}J@C(5G{~E-k)m^lZ3N?Rr1>X&PcksQy{qMbE(suU; zKLGqd@PomR06z-+Xz*jej{`pe{6z4Rz)uE0C38)KQ#02%p9X$<=8EHgPZ^WqoC$tb z=2|^l3n`dZ&(T71ZTH;FwcYbFSAGBc&X`pH0`LpLFUnl;F9yF9+&>R2CiUlX@GCOc zcCXA_ajpWtI&;OjCUeEP7W_K!>%ngT_rDj9N!z^%{ATc5GS`0Hnz`cN27Y_yigQQi zigPFU_{_C>mlo1aYxQm|B-eKR@AzZVcJIwx_5JhYVp9G4!5;vBFmuI!2;4tcASTs+ z1pLv=)z8PkAJ1IzpU7Nso&@*LRgFn;p3Yox{Bx>flKbcU#U%I7sg6nhJh*>;bxf-N zLgwn{izQl2Z-BoE?w?Z_lj6J${to!N;O~LI5B>r8hu|N9e+>Q! z_^05XfqxGE1^AcXe*ymr{A=*Pf`0@4H}Jn_u6g(^_;;CW{(KMqL*`ojQ487p|0#3D z{~6r>pG!=t|4;B=!T$yRZ}9(sw`vo6^ZV~nw+5dId}?t2{EV2iziq*%0iPDU9r$$M z(}T|dJ|p-{;4_2I0zNDFY~X*&T=ReS%r(w)WUl&iX0G~kfzJ&-5BR*`^MTI~z5uv? zu1QSl|3aB-f7@rS`gPzPGFP0And`Lbl)2(}245Jw3wT%XZs6U)7s*`v)gyEDe^KzB z;Jv^X1MdyKIQSBotN%-8uKxGQT=kdAT=ka*_spdxGx;zBl+j;QNB_2fjb}0pJIM9|V3d_*n2mz>fhx7W_EyRi z{3`IP!LI?o7W_K!>%ngTzY+W<@SDMJ0lyXeHt^fQ?*P9Od_4GF;CF-H1AZ^~ec< zs&(7=D(iQj3VdqtHsEc+rvaZ9ydC&-;M0T806ru5OyDzv&jLOx_-x>R0-qgx4)8g_ z=K`M_d>-(5!RG^?AAAAu1;G~rZx3Dv-T}NLcqj1A;0uFy0q+Xl4ZJ(}BH%s17X|ML z?w_w8lddO=fiDie1o)EReZZFjUmAQF@V?;7f-eWYJopOWD}t{CzA|_}@c!VdfUgQZ z0DLv@)xp;Q9|*oC_*&p=gRcX=F8F%jgTM!a4*_2vd;{>I;2VN(1U?*m1o%ksQQ%vH zZv#FWd<^)u;M;-w|F?-r*Q*`CcLd)Fd}r`oz;^}T4SaX-J;3(_-wS+i@O{Ad1>X;R zfA9mq4+K95{9y30;D>-83Vs;)IPk;4j{v`D);K$Ve-6JG{1Wg>!7l^99Q+FKE5WY< zzZ(1+@N2=Z1HT^p2JjofZvwv={1)(A!EXb<9sCaPJHf|;-vxd*_&wnFg5L*zKllUS z4}w1g{xJ9>;E#eo2L1&2bKoz4zX<*k_{-q0fWHd<8u;trZ-BoE{ucP#;O~IH3;rJX z``{mde+d2&_{ZR%fPV`98TjYmUx0rJ{ul7Cz`q9nEBH6ye*^zJ__yHSfqxJF1Ne{N z{{a69{AciA!2b#UFYteZ{|Ee{+2MHr{1Wg>!7l^99Q+FKE5WY;E#eo z2L3qs6W~vRKL!3Y_%q!9M~26#O&r&%wU{{}TK!;9r4%4gOc~Z@~Ws{&(~ehT=h;HQC~4t@ssnc!!EpACKv__^Tcfu9e40r-XB7lB_4ehK)c z;Fp144t@prmEc!_Uk!c@__g5IfnN`P1Ne>LH-X;_ehc`m;J1O_4t@vto#5la?*hLY z{66se!5;wMcfsn{eFuV{0N&`I^jb(=$6CjK-Wz->@TtMufVTyo27FrZcHq;2PY*r= z_>AB)fzJ#+3;3+yvw{B!e0K0Tz~=;?3w&2k?&I zoxnSTFAUxVyeoJ&@b2J?fcF4j6uc*RFYv{{dxI|yz6AJ^;C;ZC0$&<@8SuW~%YrWl zzC8E};46Z!1imtOKk)wGtAMWxJ^*|*@YTWB03QgxCiq(5YlE)?zApHB;Df*igAV~; zAAAGwq2L>WZv?(E_%QHIz&8co419C&Ex@+~-wM1wbG;rM4n87tJui&}9|gWO_%`69 z!N-7a3%(ur_TW2!?+CsV_|D+FfbR;v8~E~!4CmH6#Ovoao~r89|3+O_)*|TgC7HaEckKY$Ag~$ej@lu;3tEh0)8s^Y2c@W zpPRX^hZkh7>)u7+7lU5{eku56;Fp760e&U;Rp3{HUju$E_;ujdgWmvtBlu0=H-p~- zek=HG;J1U{0e&a=c<{Tx?*_jI{9f?;!0!it0Q^Dlhrk~Oe+2wd@W;R(2Y&+mN${t@ zp9X&h{8{klz@G>IGx!VOFM_`W{xbM0;ID$e2L3wu8{lt(zXkp__&eb5g1-m;KKKXV zAA)}b{xSF`;Gcqj2L3tt7vNul{{{Rj@UOxD3jPiF-@yM4{w?@-;NOG)0RAKRKfr$i z{~7!j@PC5;3jQ1Tzrgb_|)KSz}tdP13oQyJMihirw5+_d`9q@ zz-I=Z1$U@U6h>!H0v703QiH z3VdtuZNNu^j{)Bnd^_;%!FK@P5qu}`oxyhj-xYi}@ZG`p0N)dQFYvv=_W|D*d_VC0 z!4CjG5PU57A>fCC9|k@S{BZCiz>fq!3jApBW5ACEKMwqO@DspK1V0J z{B-a$z|RCf3;b;GbHL99KM(wT@C(2%1iuLUV(?4AF9p90{BrOsz^??q3jAvDYrwAs zzYhF*@EgEy1iuOVX7F3V$AjMmemD3%;P-;xpSgY?_>s)@^NT0Jp8|gx{2B0P!CwG> z5&UKFH^AQne+&F=@DIR01pgTPQ}8dqzXbma_*dXxgMSbHGx#sy{{;UP{5S9}9U8xn zq@TMj0^S3BiOgH4ugAWHE0X`CZ6!_NQ+klS-9|OKE_;%pigYN*oBlu3>JA>~6 zzAN}{;JbtG0lp{rUf_F!?*qOs_fI4PryF~{|x+d z@Gro>1aGxy_4Tba_*CFigSP>13qB3_wBYT)rvslJdZg+!P|jP2R=Rc4B#_@&jda*_$=VFg3kv2C-B+9=K!A*d@k_0!RG;=7kobO z`N040=_Ev0PxkoR|j7Md?5Im z;A>^B-zQlce4WhobM1A(*8?8}J{Wum`1;@*fDZ-V5PT!>jlqY3Zvwt4_-5dngKq)8 zCHPk0_29$7M}Ut69|gWO_%`69!N-7a3%(ur_TW2!?+88?{1EU%!4Cr;2YxvC5#UFH z9|e9i_%Yzef*%KdJopLVCxV{@elqwe;HQG027WsD8Q^Dvp9Ow4_&MO`f_J>K`hM35 zyfgU1;9bDGf_DS&4!#I@5Aa37dxG}@UkrQ+@Fl_ffG-8UH25;$eZiLnUk-eE@D;#U z1YZe!W$=FB{lQlOUln`+_-f#*gRcQT5PVJWwZPW~Uk7|$@b$n4fe!{B0=_=@2H-=% zHw51Zd}Huo;G2MN3ceZm=HOd^ZwbB?cs=-V@Dbo6!AF5_4ZaQdXz(%M+k$TgzCHL3 z;5&lv1imx)zTo?T?+<~ zehT=h;HQC~0e&XR`bp96j__<7*xgI@rCA^1h$7lU5{eku56;Fp760e&U;Rp3{H zUju$E_;ujdgWmvt6Zp;Gw}9UYejE7h;CF!E2|gbDF7Ug-?*YFT{66se!5;vB5d0zV zhru5Ke-!*N@W;WQ0DltvDe$Mkp8@7Akhk=g+ zKOFoB@FT&G0zVr381Q4kj{`p*`~>h5!A}A|8T=IRQ^8LIKOOuG@H4^B0zVu49Po3& z&jUXn`~vU`!7l>882l3OOTjM#za0Du@GHTu0>2vk8t`kuuLHjx{08tF!EXY;8T=OT zTfuJwza9Jz@H@fBgWm;yH~2l^_k!OCen0pF;B9}czAsM$-r+yh^*e%h0`CmIFnAa6 zuHfCkyMr$R-UED5@Sfnkz!wAW4Zb+|65vaM_W@rDd};7y!25zP3%(q9fACenR|Ovc zz8d)I;A?;n1YZ+;E%3F$*8yJ_d_C|%;Df=3fUgg}0r*hx4Z$}8-xz!t_$J_+g12g; z-|(1lozq%t@TtJ325$r27JM4;X~ElpPX|6d_zd7Pg3km#Gx#jvvx3hC{wMI+!RG*< z6MQc4xxwcFpBH>S@cF?P0ACP%A@KI#b>JPqJA!ut?+m^$co*=l;N8HxgD(Q!1AI~N zp5VQ}7X$ANzBu?2;7fw{0bdGyY4Byh`+_eEz8v`S;46Ty2)+{d%HaLL`-86nzAE?t z@YTRq2VVnxAo!Z#Yk{u~z7F`h;Ol`80>26TX7F3UZw0>%{C4m=!0!Yf4}KT;-Qf3t z-wS>p`2FAyfIkTS5ctF3kAOc4{uub<;7@=*3H}uL)8Nm5KMVdG`19a@27dwkMevuv zUj}~z{7vw;z~2Uc2mD>|_rTu={{Z|$@Q=Vh2LA;7Q}EBgKL`H;{7dk^fPV%4HTYk_ zzXAUn_}{_51^*8Gd+;B?e+2&r_)p+JgZ~2lPw-#CcWJ9vjE!GE?h3ve`0n6)fbR*u z7x>=b`+)BYz90Aj;0J;q1b#61Snxx@4+TFAd>r`U;75QT34Rp#(cs5`9|wLs_zB=A zf}aF_GWaRrr-7diekS-?;AexM1AZ>}dEn=RUjTj~_(k9sgI@}M8TjSkSAbs$eiiuD z;Mag(3w|B=_24&v-w1va_|4$Ag5L&yJNO;ocY==xzYF{x@O#0>&RBgvIt2Vs@Wa5z zfgcWj1o)BQM}Z#=ehm1r;KzX<4}JppiQp%JpA3Eq_^IHhfu9b32KbraXMvv$eh&D# z;OBv#4}Jmoh2R%~UkrW;_@&^NfnN@O1^AWVSAky*ehv7w;Maj)4}Jsqjo>$d-wb{W z_=DgNfj7GmkAXi9{sj1w;7@@+4gL)Hv*6ExKM($A@E5>e1b+$qW$;(PUj=^+ z{B`g*z~2Oa3;b>Hcfj8Te-He9@DIR01pf&9WAIPFKL!5`{B!Uxz`q3l3;0*yUxWV@ z{2TDUf&U%+Tk!9|2hUXfJT?S;eeeyyhk|biz7hDw;KRT-0pApSGw{v9w*cP~d@JyJ z@ZsPiz(<0Q0^b^Z7w}!dcLU!Yd=KzF!S@2+8+;$|eZltw-yi${@B_gQ0zVjhEchYd zhk_plJ`VhF@QdcDzCK(GehK)c;Fp144t@prmEc!_Uk!c@__g5IfnN`P1Ne>LH-X;_ zehc`m;J1O_4t@vto#5la?*hLY{2uUo!S4gVAN&FE2f-f#e;E7`@JGQP1AiR+3GgSu zp8|gx{2B0P!Jh+v9{kVXFMz)Y{u21h;IDwc3jP}S>)>yIzX|>p_}k#`fWHg=9{Bs< z{dTIp{`Uu81$X>S zBk+yEhkpR^avE!@);@j|3kDzBTwZ;G@CEfNu-F9r*U(JAm&9 zz7zP);JbkD3cefo?%;cX?+Lya_}<|AfbR>wANc;@2Y??4eh~P<;H|!_zW%ocp9*|x z@HXIW!KVSA7Q7w!bl}s2&j3Cn_)Oq4gU>8+;z{dBNuc zpC5by@CCsa0&fpq2i^g^BX}q9&fp7!cLDDT-VMAv_#)svz!wGY3Em5QG4S5ti-Ru# zz9e`b@TI_)244oeFZit#JsBi7iK)k^*M2C^`!_nlT=oIS3x-1Z?BI);uUJvveT@q5mU(@u8!#xyD<0C~8>LxXGv2LdxgJ*7Nddv+_3C`k1tSm36@TrX;@* z{8sa>s%*LH-)0`q8~J#sf0uduD1Oy{+PtnJ{y)vD`uPv=Y3z7b)t?G{PVia57cgI> zqMtsGs9)r4A@pf0S>R7W{3xX@r)K zOv|fT-ZuC)X?YH-ALosHPV;!(lYa$qz5)N%JRWbw`OZ9!uY3#h+3ib7{)RzSfA%o1 zs=rn?FBPY^dAu)2@2HJhE?>~<$7`;9N%N}hx_7CFv%KBkdsO%e=G`iMMe}(6XuEyP z<8j<6wLR7HIG*y$%;Wu3zPWj?)YdckjTjEtm$W>NPpHzcSeHO~ zTAi5fmX>a`eEEsms+If}vo$JwyxB6r)d#yQG^80rnJ?z|Umq7wzRg$`JzkgP{j7ex zSIgHikMm02-8}Yldt3LkfPKa13i*lV@wm%RGLQcPJbJuu$uEI8o0$)=FQt)b;b_a} z6uOaT_o_JVF^;($|>YwIrgw9mjJ+blRu?|1V0fAsndZ=E;wic76NwNd=mF-`8a)yI$IWOLl zYHsH0>2901^SO)nocFT%-v9KF75}qF_wm0iH*lqUA6wwswdP)PrdLiM)1}*fo87c> zhX%!c_D@ik^3pgBPxX4ITyr6iwG~pR>_5Z{IhM&+GCJ&Ex$^{*if{Kl1VB z!|Y2*{Z=lgT>ID5`lC}Ip9^un&))`O!M|)TaL#|erM*Rypbip_Qd_wcDuH2{CZD*yLpd> zmJ_~3kI!fF`>lS*iu&%0R``?VRdJpHf6BaPMVz^z{%+>+b;$74b{}&;#!B)7%&Ypd zhk4a@_cLEtK`d9Czu9t(vu&!=&+<6Wbsc!cJRV2+W8i*2t*ZYs)c1K>b-mibyn}ry zZITw=u{^#mlD})NYmQfyziG>z98!uNuk-THtzNuN%HKAR`z8N}dAttD$Jsc<`?!4L zY<%Qfo6nN^=vnl5Kb7xk_2cU?`NHP?D&ibzHgARRW%c86SDcTnZk4}e?$;D0z2D~N z?;JwQ<$lj!D!5+zmHsZszfL?U?G%mDN}LWzA!J`Eus*{FSd{9V?y?XYxy?X}n#{ zhgB_393T1W<{d&D`5NYNzvSzi$8j5;+WIv(J|jkt{nR-4`)Gd(+m)YW7UzllWb@b` z`6=Lj++!S{XPyRG|Ks?}2ZIkWkMmjeH!$xqA!NgM`9|jPyokO+Mg2`6j=xTf_b=TO z;~0l{?d5zFDi~d{ttNV!mTr{39^7+l4+NN}8V$9a9 zrklk2)5pu@?*o!8DQN3fGfd+6WPj+H#T}8>{eBvsZ==WSn3}6UT3253)~%}d*QQsa zl&`B$@oAi=R>dsO<59ieAqMhpM*^{syaNaEol=bzTS`zFpt*}`I=CFsCm5K=$Yn7J7HrS zxj)b8-s@eFA7jh$xlO*goe=T)UcR{bTpl1Lc^~sNgqF)+v3~Xp-XkrKuzdas-_~sQ z;99isl}WC=vXWtQ%e5a1S%AeuaJj!fAD=(v3)yjq&xdmVy{C>9aXOpF=Wx~k)=ua+ ze)1(OMjR*kV&FdRRrS|4kFOUL$KO}zW?xFZ(t4t8X`>iwnJL}#qv3V@06DP_g{@(I!Z=l3Cr{C*yvlT|ZKC#_D*`=up{uV)e}S0IW% zx#ilfa>Y|VIxXyMd3^o5Wpe-ddwl((c9Yv*J(Ky*ccxQN%jNav@%c>8Nz>cwlK8q< z?$0qXj(kt^_$RBHz08w-W=ie#-T<|q zVM3URul4fyGZo79+M2en*A=vV#i#bA{nJ=edzI7nr%(Gw?bUxOuS@Nf4NnU`x9fzK z%U7`F_&$aFX!H2KL-f8CaUL^U1l+fww0&Ce`KGaO((4kRxAFZixu2h_c*T_DkJ!4d zF_pNra zbx(KOSBHkB3E$-R*lOnrf5|NF@7Af#ns$AO_2p}u$K$2zh|jBd-I4b(k8$c#{1saN zevNR7u4_Z|Gi@bqSM_JGIB}lH{ikVF?td53+XJUmpYoZ_r;I{&ay_x(1>wmni$Tze&@p#Jp_wZx< z`#e?d9~%^}E2{sXwTtmnm{wN3S*fY*hNtK|X2(tL?^DI|U+x`?@0ZJ$&F0036yNVn z@%j?IQ>x>c-0ywy_(ZSsiiKo{w^7oy_K!Nx;>K)fiplFVrCuq}q{f)k`r3Y7TA=o& z@>Z?JrU;(>eq`&CPU>-ap> zFE;1mGd%d8(Os4tJ=>ha#vHlUZ6{oL;xD6S>NVrrmks*o{R(WZ=x_*&yS;t8^R-Ez$4dZRM$;wohbgIhI34gQdf4}I( znlrwv{ZQ`qzmfE}l+$DzQ$Lhv#l=qv8xXG30_s@J?^^`aD`89tH z(O&@||KF~kZ!hmwUY@T{>H2!VGmoqFeEU$A3}`?}UOF8?;rv!BX5*Kv$iwXAVaUR9@-<@ZbVds5@& zakNcx#aFKSP0j04#iq8`cwcVq;&_iqaZa%TpEfOf7Cm0`<)>QxD)-+*+a$zk>hGc5 zIEn4FiIHhxJfl7X7O63IK8cYyk^N4F^~O>uAlMwX0}M%I@R*H-RNtlI-bd&u;m`X z75{OwIG%k|opzyaTr8Exx|6cJRjTa22eD|4hFhnyV=a%@Cb=KqIF28r`m{f(_{e83gw(sXwqm=<;oish82}74@Hd@OXEB|)%JT^U1%xqY&YRJujPKN^088i zzJk#5L23EEHjRItuKSpO&UQQxzY?L!>7e+XbaKjhP8^H<*1e94M9vzRYe;r_X4 z@i;4ve?HoZp?-Z@{>i*Uh5u?E?@Ovbm2J1G{tV{vyitAcXS~nL=P-}YN2TK&y4bL& zF&vL-h8ck^CXEg)96#vpD~Ur#h=!9-nj6ALSv`WG&XE z)-=n-4fg~ zb>n&O jL^Q+@rQT+w1e)kDg8oq1$pW4MTo>$R3RMdad>PJ^Um4_w`i>2qey#AUA z_OkuZ&q$pnHO{2gUpsC0czgbd_XFM253=#AOLaWcxPCTGnt*WC5`y3YCUhsNiZZM@LZ)wc6JCM-65*Bs5~rHbv%=gFz;UB&zZ&751MOq z+!SJ?w9v`o_7qyK^Kzh_$1?>VmX`hA6J7OJxB7LVzV>q&yME|g@M8Hw=5asee!bSU zC)V$g#Zk;#tpD*C%Kh)0HFh4SgMYIWpZ$DY&$qp8c|nJit3XB_`;SuIiw{2 z(bnVq*6a2|&Eq`KTtD7Cj;F@q5bJ;Rw3$Zdu&g<`?svc0xW@T2Dg_&D+xIb1T01R# zZ0A>ej?pt{KCX4CerX=|ZDPG4son+FFS`{_O!DQ;CNB@p(_z(Ob;p{Lp+IX&&S2`tRpjtgq{+ z&%@}df2aAv_N6p9EzDziH=*UF`en$AC!VKuR?k!E zxaqw5i;aIAPx(K=uea@Wn6Qb4@4o+@XnX5TC~oDSBNF$w)UH&X!cKCg{kz@H^Tk4I zx&ME}D!K&QsJY`G)KKy?~nMg`jbOSszc{Tsa$a;HCO-Ztf60%m3B%C zeov0){wcmEC1gvAC)%vSIfJFjmvKX zf73kP7wc2oV=Rw9QyiK6V$0)syLIyXbN1pj*Q*Rq^?csP=M4Ea;Ql^Uye`(;x~EO; zdSB(E%~zgKrQv&hT0Yo3&SUj^oR!D(TkiiSAzshqk3jw7tp18=Tb`-DKX>Zh;_mzD z$)Bs@c6~oR`L!Ur#;1dM?EgrwY^jrd#rpM*mi+fg;&B=?fm`imc|0~dB=>m}pCi@J z%gyUj9na(!*>atIDaju-h|l!$Ys~9Z*>ZUs>*xHzho|MK%;WxsDwT_Bcd?bm<1fG7 zJdTI_Y;(O9@xXGwUw3gxNxr?USJl7AJjPeMrsl&^#k!RD&KhdGE^poVyp->3?$7*6 z^2O~w70(lS5A*J-Y`Of;wjAe^-@iRQZt>&&PX0W&|2(iNj=%1%isL^ot#Us;RlX1S zz2;Thy$}3J@OP{~RdL=0|JdTh>zc;rDA+ImIcimWe?F}8eKWVs)lA!_(${P|Z9`4@ z>)=nBSMA4W+kQMB`-YglsQu0Vo?56ViL5Gxd-G9y2>x7oe{eBz!Dfgcj z*V&iS@>)o_uJ`^rH|~$d%dhM4{Fm=*9>+I@Yh}aLq@?>pcdNZrXdz$1tXGA5-MF6` z_rd0Mp}wBKXR`URQHA^a9x;yU`~NqO$7!e3c1g?Q^=|Lv^_Iu$vtK_vwYE4_?(-&I z=T+aYBa3;%l;r-t$67+m<&W8NJYMoA%j);}FM3{tv6act!k?wzF0Bw*~*i#$m>aI9;uu zRsHX79-rgXAOF0G`6}YL$MaP6{qrN@by+^#ylR~HwtiM^*MBc0KC>v!qvmlwYo459 z9$%-(f406?%`5+u`>Oiw%oh&(t2pkvzFDb zI!`;>cH{il_0wa=>xtZ7k1nF%mdpKK6XWZ8__}#KUV4AwCEISSUvKq14YaS=|KSa4 z*M@92O`x9V42-!yDQ_wnP6 zXATWY`>SzK9-1~R%9ZEk&0W{Ld)xxd9)igI`EAAuzuhc8N2&hl=6)_H$^T&x=Zk!0 z8@o78+CSxrqg<|BKBe+-C>w>;_LMg&v=zDXyu7*VrFl~-Z|-(=9r54Wh{s3IBKbJ! z*xKcyQBvFNbes5hI{y2N@j9jLx_1tdqW1#tTj5(+oH(zCr#kDKPao>b`)b6=5ANxt2~b*SDu$o?z&wzYNk?o&Bhglx=&whW$}8vW2$?kIpWn7jzMWmi;_G_(_U5amI-Y4j?B}CMF%9jjX@%^>nvXgW^pL zP+0KScb+CU&QTM>V4PBUYCg%C=KDU@GQR$k?`rPHLP_qg_u_Gu4>hlyzq*7e2&oZP_8)2<;vyC<;vxMbgu0w&$m~){!ebXUK6#+H=NdW z{`>ot@paPRR8IXamBZ$m%;_}5`lWJg2nD+&r~NIJL)ao~d&=_$a^-n>bJveb4JmG^ zyt&)e_LS#wZptN~f7-uJLJRcS3 zDJx%Bl`S8gmcO<*(RGif{S6@+Ez)_VILaF}vK6`Vyu7*V+V6v{W8Fd!`61?=D*P1l zcwbTd&&}Ic)c5z{tNc~-_iiN36KPRRA)$>h93lLvN3{UO+ z_Z8yn2)XY|92fa4=2db0**Ly$l)}fifJKdR+k9p6_v1Z%ZaWsYC%@Mo()Fz2_2f^Q z$LDnUjMFxLe_!LJ++)NfS02kIXL)>TOmR!)&E57zh3%Hg|F3OVE6>ZDyRP#{c^*fuJTGtVdbiY&_NP?d-0ha0k4xpv-L9U0ezt*(*UgbB;L_&t zIvB5AUS*DK!||EHi{g9oz8C(#mh_k zoA)=57w?@OFW>)sJ#U|v&*MQt%In8_xL3>D=f|g0h~-qlV?Mv(V{K)&4x6ikqm*?^F@;rXN|M~pNx0koi=SN;%T95A?`C-WG=f^*v-+BM? z{^afR^EKaI9xrcSs$UxKMZ;Y4#r*ut=WD)wfBuUp-(KGTe17Kr&)etarS($#1!HGz zIqzSWtUMo&{Q4Z9{k>`4zx?>;+sn_7e7@)L^7eUozW@30%G;Of=hwfyejYC$uY7*w z>-qf8<4x*%segHSY5(&1pZ6z^m(P!U{PX(x^(HUR&(HjLm##l~fAjYFdcMDTfAZs( zx6hA%zJ33>R!pUM`S$bkB`?p%Gavu_e9ZeBf2Yj*nYXWtowwzD|MULjlZe1G!$ecu1P zzxnaWuMhe5^X-+!V^aH*Z?CkTZ@+Xt<=2~heDZkt@yy3BFVEZO=VM+T--Gl+o0sSF zr8NF|`+WQP@y+Y!`;%`kKOXt@Gat`<|MK$u`kIe#e!VL7H*cSBKkt7YuV>->%Hx;L z*L-{V@yN?d*Ta1K`FQ5-^Z5CCe*E&|U5b~FU;AwQ^71@hzCU^W{CO)c&*SC&-#Yc@ zK+AiDzR3?VTfD*#He0g74>zj|zD-)*-tsuM@}cJOnr&}SH6-O}bz(LwEz$dVYNvc+ z!?Z9k<>$9){PV3XlRsh&`-DbYq~%Mje!N%8&oYnapyDiQ9gNQ=@}B0sL;O)`c?HYk zwM_9(wD|Fu>gO{zSp9gdmY+6tRn!&&#z=?NvUd^N}gwAj|7Q@OVx;m&UzwXzPn=pTF;-=ep83DBSS0Fu?LSFXgM5 z$8F13H_zWQ@KCM&TSY4EU#VOnDSoNETdF|gGP&EIMjc4G{aCe8ny%5>@4u%Z&fDkx z%*#ilh8^tsu!e$Io^Lmg(>B!g#eCf^QCOkJ=4}#wtT_R6L~+g z_-tCbFPF;0CMIc7{Z^hgmMhQ8o4a0`r={|i?KW)$bljBZt>nt{^5(8j>h-&++ZmrK zQh!V3P2EmjPuo*IspWb7rmkyy%JX(|<#~B?*A-8B9!IV`FK_O;e&;8@J}X|ST=gb3 z@0J?S{*=lmb$hB`I!{XFiZiLX_EUM@UamYZZ|-_&e@f-e-LCe7=2fY@x!bKv4HZ9+ zQ!3BvH+8*lsz}={l{a-ec|C1U`J|TT^_#jrsq<#56nHaxP+T}{q+431{)eiK78P&R zES`L4@ZW4g#%E2{e;@o!@Xx^i4*os(f53kMe+~Q{aQ_^VxW8l4DEjA`$M@pogUq{! zk(LiOkMDKLhh*L^wN)NMH7u&#XVxyhA0&Uoj@vS!k>V&1MGcFaCHR}Qi|;+kr?>sD z@~NzT=MYTwr#6rKDgPylKQgub*zy=>>*R-7K2uuutaQGV%0sA0TGab;*IBDN`)b{) zt-Ta3y&C?#Mr->dq;l<8zX`z``eEN1@@bmXKz(T4%0Ka?oK&fGtLd~@vym#bZZ&;8 zT_(0^-D-wO9ETYda$=0Qp!ZkLG>q?u$PX}Y9~ul#%l)3pY z^F)4{^)qgF#DwatZnV5EEqf;4%I0D0kNjP$Qx#{JZ8!Eu^?O4cf1fL!U#jnaZ&l?B znfLP!rZh6;A6p*#Dfg>U?5D2(3t4?DnwUnVrQw#xpVz2AH=9@O*YoCayBnrBi(2qF z{?TFld>)V=YF-uJ|6aZ7IJ#FI7yq2Hs`~C# z_5J_RR@HZ}s_&mCSmplt0`X_#+OIjm=Yu#4WIo)+#nZ0#<;PMEu}HM@Vrao7GT4^0{t<;wH&=B{flQruE`bGLg`YDn8Hl{a_0+Me<}j$C2?E zS8(;~fXww=?brFL`|NJ!@jk2j@*d_3g!s*!Z`PffiOSbWt)8-*ZhSqd{W;#sfZ@|k@+0< zrBt65&b7R%|EHT*_5We>cs}WQerg+sSYPhXKUMC}WAXJ`y~XuJ^QAZ+Encnm{U#J^ zTBfz%vj@{6ZNDy+r_H3b-?IUf$gG(tItIH+Q>rsUhu8sl2({?N-=ssl2({EsbNT zyt&)e_$tri$d%{i&0SYKdmE}UmC7p{H35gEI*Ok+DV68-o4Q`Q{+7y{x}Ch~xW z|9>6#X>{_7ERV0VRb0xiwKYFTGt@PfRmo;~MEqrB?E6*$C@6YAyc{}Y-S1X9`3(9+e`~S_3 zKR4JWb>tn(7Y?10zh@SIUO6h&8DwvgbP4r0Ow0avNb!B&=u3tATD0nwsj1gHYOne6 zjYVHPY(e|w^JB%}`=#ZzEbkgz`|JM~I=(L?ztHAQocHqA%;WV`e!qE~_j{*pEoOOq zpIP-=PhGv;9+~U?^{*|C=B|gKCM6Nt9Z|=Ir z=|>x<_;X_UN^KkaW@$tId8P5Xqo4cC(5Bk=w>UjRCsqFd^LV`LQ=QQkKOQ&jxAG9G zVNtF;FYlIs%JceK*ZJw^OPm*S|G9PixzXU%a6a2m+^<2&r?c~anY8Sg#$h>Ij`vl~ zNB=o}?@(XvKVSEAT1mc%xnE0^ z=ADE4-~D=8*0#IIgvEyM@)v9^-mjvsTT$PC%do1x{~kxjiu$vecL=^$T7KU0s{WsB z9`7d_pJ#2q;`nGD_qY0UrZizVL*uHGG$!ZfjNjJjcAQq2`2ds(-$% zR`usC^Egjb-;aB|zR3Of`aN4oexyOwI6P(^_iOvq@H@*pq-D=^drcA|<(~(p;)y>mRDF4#t6X_ru630wm*=_4mFMMJSGjU|o~vAW zUaoZ=`%*pC*R_M{|Iy{@hn*IcY0snsE!Vy|>GjDVTaNQuzPWikpQ6WkD&NxTcegL4 z=<&L!ekxae<#Ofn$<1|ql;`o}%JcH(t}CAMJdRv>Uf$ew9czkPDsS#~b=;KaapcPL z^5(89p7K17TzOvJ-1X8pmdcyEUG0bRJdRv>Uf$ew#Z%tgIC(q2&w1))&vo&BSJ$9? zpDLB7=98R_Ni8<8JihMIefd=L_ha|0DpNr2lw&{s!hP0Glzx0eU?ZlcB7W53%Hgnatm+6g?>QB>1e}9c> z-EWlCAA4+Xlt!hsudG3QJuCkvbG6U=uVaz#ulkqwNA>dkReZHmXLW7N$6@AFLG4t3 zMlEEy#zDD?)xLuu<%*LZckO>1GjF2(>YT;V_VW26&&NT>SL3R1ir-$4a?S0TGFSch z+R>}%^+JAJv|a7D!s#BN^B{K}2f5zUjPLb%nfgiFcI&nt~@KCiT0jfdiBp2TaFmudg?9H#pD{>ar&jfY(IwSRKe>m*3It`F*$if2y? zetnKfapHRhUM}w#E8DX6NApF+TJIuAxy}d87Zqz9b)4nue^)`uHP5skD%SB+JNd3@ z;U>$qEvGG#pKZC0k<;kp{`rBL1JN%t@0aRCKhOp$?wjKH|1*zsR6f9biHbN|LjCQb zzW;noV-owbrS&I{#kOf%*O-ugmsJ$2Y(3X;fuENJd{RhnB zy-eq;zt0`dSNYrEFK0e5_2FTQuWORiM#)dIJio@Kq9$dE|Crr4V*f{`*85xDDMZro zQ67pK7UjzG^5(AVyg%Fm#Pfc~6mWp$D}~_l{$}x6qCVAG!LCm+PU$)^Dz#hE+Qso6 zll<7$)$eQj&)MQVO8c>vwdCKlEP6fj zxs6X8Z}}IQD~|uXB*xh@b?Pq5yN3>LnwA%_Jl?DKO8%1N)1_t4v|ax@o%qZszr^aq z>w)|-b3H4>IPP^0DXIPqwjQ4iqsRS{pKtZ6;=8v`u|13R<1?E4UaM2J-JZ6;9V_Da zr>ewpQyl-hr(PBH-Qzr0eg8Rb{CQY(J@a`uxqo`i5*6{?mj#b;bl%n3{L!G%yKk_rIKYdb6&*aOS$MagguKCiTzOGk(->7ve4f{Op4)Iw(X>N~c9G@nLu8$^O`Ruer?#VJXnb5s^R`s3F42CM z+N=M{6;JstX@SaBkG5YbpWObH+D~qIssDC5H6)w%m1%OfUuv(7()e$jDokY+;%iR1 zpMUYb5j{TV$#=K<>XV0#9`CE0c%h|^_O)cg(u8mF9=5s|czm6!d8a%yX;_pipVaca zepA;q-pccKa^-n>bJx42hP1z>^5$+=`=LCKBUhf6H+Nm}l;?5e%JcH(u4{ai=W*o9 z^YY1EFYQmMd{Vbxx}TNGCv|(OU!N8(vK@-go$_t$!s^fXN}HvH3(Vv5z5EXFyTSi% z@zzyv%N1v^JwL_!y?i@}Gj!U(y+Z%`R zIZ5%S0$Zc5QZ zmCD6klG6EGDz6MW1+hNGI@R*{e6QENk7V;u_hEk>9q;oxzW%x+j*sS^O}EM^~}rqO9-Gpn$A zD5y`%{{BvUK8oHg)$vTeoGr(Fh#s#en_E3ktJqiE$9hLgU)fi@KB%83+JMH_WAc@) z{|h&?obYXATJ~qPcs-0BU$<+%ZIoTl#`R>;5IRAD` zb%t0T`?_`Vw=9pxRsOkoJg)Mt=5haZJ@?NQtFtmC_2>0$-fy2O%w_JcRg~m=TK|0; zO7qxwd&x=wUs~@lHy6&81-od_<6+@`y=mf9`Aqh<;=T>Ey>?AtBU`*d8dl{-yhG@Xyq|gO zzx-44x{CUD*!+z1T=ieK{>1V0=Sfem+E={($PYGO(krASzuDH~dAd(3KP_`@_c`lN zRsa3-9p+4JJyZSd&3jb%u9+WY>z?TOWvN|#TPO0tpmdF0f{r&%CQXS9aPuX&ukMirxZ3<6Jy51jWvgSnn{pXN=--xe6 zRNwDy(}nu=X?cwGXRQj~(Y!;2zh}ocUhfshf6pzR-(ynSuPl%EfBDkpT~i&;j zYW<1hulmL=E zGg~Yr)n6Lo{LSiDjoVnOU)7(f%&Y2mGLQ2_+g;7>6W!Gr%jHAOrw=|NE&pKsiQAR` z!@Orj{V&YB1s{}_pEHl=g^tS!w%vGKc{yb&;Q>=be}6qa{s?Z zRsC^aT$L?X{U5DA@%TosivJtbcdx3yi)}YPcPRc4^Uf9h8D<_|zpMV1=J7bn{r`+D zQ4z&|Ch1-QVg#eJ)Wm>|Nmm~ypG-{ zZOgOm)ABc#$9b3-v(c&KHOu31@Xtf=MEj|B?^~UC-;#fj`50UGKu&zH12t(4~x<;wH&=C0SJhO~dB^5$;0J~ixbd7M`xlOJ#S=4sh8`BApK zR)z0wwtn!zX?bqTI|bKbX&iS+6=_`L$`x0+T)BL5bG^2pxTW&uZa-doJch0#kImS4 z9!aL%-#qTG+}~&D6gn&SzxP|U!jCbJ$3^vTHXjh`Yq4~m zs9q_zVW^pG^EFc&Dy0MWzw9GY|NJ?!U+C+$Y57ANfSwipm3jBzTc%}y{j_3*d%TXp zTNYbJpk)MFMxbQ`T1KE{1X@O*WdvGApk)MFMxbQ`T1KE{1X@O*WdvGApk)MFMxbQ` zT1KE{1X@O*WdvGApk)MFMxbQ`T1KE{1X@O*WdvGA;QyCLU`qY|Qgg>hzt^Ok;^gI8 zpHlr-ytMtX)Q=W#8G)7&Xc>W)5oj5KmJw(fftC@Nv=PvAmY&-vSG`G#{(q--Y5($Z zDb@eKv*%N$r={^Im6v+a)b^^UycCzp)n3P4>r}twrS|{r^2zPL+L!htuh-Q2YM1Ae z+dhxi)b;%Dd;VMfXlj33>a~nO%LufL!2iFG0R5Sz{aNE=r2pA^QHy5xg#0!!aT_bx zl092AyFC4^`TyK-+CutF1T3#BY`<@ze5{pQ!ua-Q)-}u1-)Cd{x7f4vLsOZ#7nKhWaWnjfRAeA*iGXK10kG(S5Rwx7-;9G_3D^Rv|G-%%F7 z*72Ls+Sl5@eG2hQ<6AmE{QnHLZ_VeYe^yAXV{R$QoXI$YX8M_wcGpg ztJVG{E3Y;Fb6DeA{qys`=JBy|OL+WC<9nTrOs(zTW|3?4->-kQ_P^fBYxRFrp}f?7 z^BHRQ|2X@czgqiuR$=`8|BKaXUpoH=+J}qOYQKwZzt;J6+Vr*C54Qf<=T_kSzO8V4 z{r^qXYVY&6*74n^Fh5SS#i-TlxoaKYbqeuM zDjXl*zgqL-hr;}*v;Ng;zkq$nQLX+DD3q7Rw{-sWwf(DgeQ0AJURSGset)gieq7=B zcb>g={JKK>mh#%yhd+9J{Qg<%_#am|ekWPEB|A&2)7S}&<)!EI$t^Fvz8GBSpPwI= zu>X@=Ub_EHZh7Yk{kN-Rb(%uuI6f(Uv&$!U|4Z#l^Zz#+wp#Zu|39g=6_l$F=oza0wk>%F|j_?Gr>frV=y zAOE~kOE`bWT4AmJzf)*`nU&WX|9%#~R(War{{Dg`JieW+uvYxulUZIm|4QZKy!SQw zpWYwA<5RkS%rPN8wr?qK7@+^N<5QYn|F0k4|91apEu0^I{jh}dqnj1hy1tage}RVZ zeEpi-^14F&bm7GPEA9WN!v2pdlzabbjo;8hd8vP;a^JqCn)_d?f2Helsk}5l>KeLN zyMLwr*D5c~|322Z*8Z2qw<-HqD}L$usMP;b|I+z|$G@(y|E2T4bbl^Azj}O2*uT>F zmd0mu3tnsdhZV|88_zkeaTH`acP+r=< z()gD4zjtB#rTJCrU+MUj;`{j3dVNybzjX@xS2{kW@%8dr{p)7smT-QQ;+M{k()gG5 zudbnc+`kp9yw?2PrBGg9DEINH6~DB9!wT(7*Wc3l@9iz&@hi>mc7^r_Sb44eFJ1pf z7222ff1g78()m-mewF5LePR2hk$O8qY#pBW4BOZ!)f zUss4^Q`~1u5YF5Q{Te=e^Ds+`B`iG{R-_%$7gcO_b6=tfI@j` zewB{TxI+9fh4Ot0<)!1hfVH=T_n*@FS=xT-_>|^XY5tVXkJA2?`d2D1jc;jwl-ig2 zUn(zc-=Du~9sg2$AD>$7OY^^U{PwV$bFKUH4z}@H<)!}bQ)pjTD8HysK2M?l9~9bm zE0kYWC|{vaUOIk#3+e`$WrQHcME?OCn( ze*LReUfMq|uhrh?mn9tE()LU9)8|*M?LS#4FSYMoXkVJ2rTMo*A%5xlRVpvd-vPFL zOL%<7SYfU4EsalUewNxlYTK{%`wi<9`d8Zi->rSE=f|Oi_@(PtY5ra}ncJ@`^v{oP zt>afZe+L%Ym-fFDztsP$3fnJ@Z|VFiZU3yo_Dl1tbp1Zb;#+DnA^V@-OYMFCE#dj= z<6o=1bpNZf#%bwm;Y!*E;`7@hA8AmbPD-zoqdl^}lp{>uh{#jeqI-o+cK~ zk5d0i<6CO)zyDXO|E2ccxYqAiZ(bOmQvU}O+Lw;+7lrmeSb44ay+@(F&(B)pS63+S zTPQEJ_wlLK|H-}o`uNt`zk!8v-@c_b6SDvL-P>Ej`CmGJO68^JgEW7ze|;wO56j0C z{=T7ip?#^m)IXm;mau#?Q5N%rSg7-_NDSVYi|k9ueyd}E-&5xy#KYvuT<{yt5$oze^|of-<0d8 zwa5K0wco)S*Xm!rmDf7HrS_%mm&%VS^lxaPywty43j0^;UupZL@>2X#d7r}muTUs2 z#rOGb3FoI@KU&IpeA4qJj^8jFyjtg1ze0KG_>{_ju=ur}Z^v4Bt@}?YzTbZ=;r^G# zr!>Dy=htA{c&+PO>KI->|LF44{{7MA<86Fu9p68?{Er^rQvA~O?|-9w)*9!BpI^1g z{rX$0ywtv*wV#~pPj72q>-;K}d;e;+|D(%G{hQq5Uy47fu>XH_xj!FRN~g($mH6HJ zZwbpw{kv+yl@;6j=cm+)f3FqR`uoh%^}nCBuQk8CeXaSwPNDs*R&ELJAA_y1R(v1- zTK(H$GTWEt??8)h3HzV!&saWBq5Vx(UTgmjD3pIs5D*X$ z5D*X$5D*X$5D*X$5D*X$@PS$TJP*jNd~5xp9A)k;X|}GM>u-7OKWp!2zpu|fZz;2+ z@2-NU__yHy67nnMQv56NWp@5Q3rzVv1AHIyzpLcZ`S}X|>-?wsz6nqLq4}=)O#YXJ z%k2CSJ`p+TTluB<$@V)X+G=zS7zh?ByRgt zpI?^zk7uxtU;82LrzcR~Gx7gv!~5S9{tw~tZQ|dD{JVZuAF7Ye=W&Z~{SS~|oj;l7 zQ~&GwEwl4O{)ZXe$M3lHzuXXezGy!zwD{KlhlX4KhYh#--G}o_`7J|!7m#27{m14{ z{z)I=pFn>7{Mh^!KtH;^^z&i;)BdLVN2*UL+Wr$x{l5dxkJkB2@%I3q0ABga?D-&k zOXQSa>7VdHxXi|<`6Hb2+f?wBAMvUGRlkPwP8IoQw%Goot)Kj_5?{ro_|#v*$MT=9 z-;_Vi_b${o27C~n`b+gu|H=Qn^F{uTpuS7MslGArNxzDp=7aE`IUfoU&riZ90@HlZ zeA50Qob)R^<#!iwx_(mpG59Aw;b-!n_S2GzPxaIM4v_y;xXjKE?bq>)?)lXJ%3o&V zuK-T{oy^In`l-Klf0p`p3V7w8_!U3lqz~mk2LIHbL-Esm(|o*#_ygc;!ew^83Qzjo z0)7Mdyz{dM{z*UTPyPOp`twZj)8i|b!qek>8^UFG+CM*j?fO`p>iZ;@>GMN-eB1w1 z@l*aoOWE?@RQyn1=iB<;il5>iL44|O#ZU8H{uBOO!;$JM{nGu-h43_A+YoEmq3|?+ z6X5Rwf86+1A38tB;J@AOTYg2=H^jN5W-xzUX`qe_p)iJLyyN zm2lFx&UfOIzT}_!NAr6D`3->A`AX-T`a}8A`6vIRU+tgNpZa|0biS6vm)ZHQ`AYh% z&FKDozl6X4^0@eek3R@b_3Z-wT$QE2ukthgQ~j^*WPNFW9xP;jpASX(b6aiy+4gS{ z@UJQ^&BqJzQ~mFRr~bSap6=i3{3ibc_$Pc`eYPMz`LFYn^qKek)Ae_M&iI?a|K0V` z{v4E_%+CK*VA8+#N1DItzs<{g?b70bY+^rTe3|@b`t*!T%I+nxCpqX6vu{P4({q zPWco6@HhLX{Y2-N@OpkW^`G|h7nqL$^dWt#^Xd9ff8QeE)ZZP*?+ozDFX^`=zRb=q z;iS(OIZxL&+Fyj9%6~dv_4!Cif4cvm>lgKh`b+zT{L}fS{dy(+(th6nee3)t{i{Bi zoiFO|67Z=%n{)EF#ZUFk+u!M&{;5BUQ2!%{Px@2+x8Q#Y_#WWI9|ND}m+BkjUuNff zDsZ0pnfLrxe3{MfZ(ZLoOV8&=IPGt$Z(e@QkL;KArTAkx|DE%51^%f%!gs;{Dc}R( z#INg5((iVf?+;$+0+a3^Zsb2*Kk54XO39_iUtY+6%6}v<-Cyne_nbdnf49N^bEy9# z@E66G+4EDs|E2os`XIa0{`v9idw6_pLllLue6_#K<~Ph>j}xEH&xw*t^RWSc|9b%a z-Uv_gU4MT#JwHeDP3Lp1>1Xxt%3A!s_^E%-0H^tz0RJxFG+$@p|7GmwhxS9oPru*M z-)~;3_+h@s@cP=)?M6@Ll1_f9aR-eehp+;?JA^Cd8-y_WLV4f0W--h<^ikk8iIZ6rcQGLVWU1 z`t4lTaTpUzL!pXR#{mi6EDv-5W@|7m|e5T5oA`9FmGujcfB zCUH`JAM5WkhyDCc@e@9U{KtUTe5UKmws4v4Pv1Ybzchc7=HK#9g{S-ugs1siljn4O zS%&zFfN#ow>Tl_j@*4wQ`lR}4zBd&--5)Q=zs%}SIK`jJdCI>J)-T8ZDF5kvQ2z$; zQ-5}a%WQrxMNacY{3Y=J>3`4lZHb@q@BOj)k03tbD|7O@|2xgik6&s2hDNdc+7D^| z>i4^JK5GB{guXUDosaW5{T~DWnea59Yrv=d-TPOf_mq5^?+M`RReiWWsQxFs`k!#}KQv`*ebv9@zv@eP z>67r%H|>||zbxjL_>>>b-xHOFEP52Su^!lVTc>JvLPw}UK9{}F3&sP7D_%b`cy8=^w^!oLQBB%RTs-NbEu3z)| zpF;iQe-K}0^`8n%`jY=s;6DMpuCHl7lm2ynQ~rMlO!qgnpA&x#@CzlM=4%jNX6L)E zU#b3zFSGm=z`K6)^5gvcOZa@Wnje|v?>5}#Hvm2rp5h-izKu`%(0n|o_@O_q6* zo!<`F_}3z*{7K*9|6}OSRJhFMNBtQAzvH$(nlIYlD=ohD|6F*|Z&P@h&&R-j*y3CL zw!r@l;3t67_2&rqpM|I2zn=(C=W`wW?*cw=eqZE2oxk6m-+_iF>35;YO!G(i9e{o( zfRq2~Z<_yOz^Q+9eWCL~`I9~?%3o&p1LaTgm%u;q>H0E~|J0u`;QJz{^INaqNjSyt z_n%hZ0rH!-|5NZ!{okFFPyM6#+Z*}*udYwBJMEtzzt;Ip`|kvBI-gJeOU{q(PY1y#;1r+cpZpU} z{ipLy_@Me_c7CY-VMh1-8+iRU&DV3CoOJ!`@$LC~3$M?9+VZ!2(*K2&OZicK`@r8+ zerbLSm)ZO$fZrFMt{-=Wr~SIv{KxsxkJ$WZKR$%`3lN`hivJqo6TdzmD$U2J<^Rk2 zY-l)Qe}t#~kNJcDZRMZlv)&(*UjOnG?!V9FKjq(rv-7tF`MnjM^jiZy?T1I=r^io@ z!T+vsnVk>1{?`6Z{L*J0oc!<0dD<`3zk^wNzJ5C28^EXd(>e36{gLK(1o_=4!L&b0 z-*oV6w4m~9|=$TYyw{X6aNVCdVg!WKK@02-zn`sI^T4CJcIm7 zADPux>#@xCXA$s;@TA|+_%=T6k2+t;|3~3T|5vJP9{nr76n__R>hBo%BfzPDlz;h` z+5VphO!X800Qf(Xf6DJtpv>k^zaQ)apMF1}^FjT84UaF}h5XhUey9EOrdsMuCJsI+7SKA-L>wG2sYd%u{?g&i# za~J$iApcw755iM^)c>xp)vx1sTADw8C4DPDndLtdnC83ohs^R{z~^hw`Ph>4q+iWP z!Vdvo6fPruEl&CG$a%`|1n{NGF61{6nEamteg^ncIZx+jLwuR-|ES?sKhnSar}}>8 z{3L$;{*Z9epZZ7j9f3ZpfY<($S$%2#sz0fIs*n0x_aDhW&EGokCxA}@C;wN#-vylJ z_X+Ty0#5xKfWItUX6L8oEA@}&i|VKRiBIRBaEgBe_1_ULv-*t%CjF*>Ujn`fIL-Ib zoP5%k&IjeU5BbsjQGW*TPx_nypZ52>@kzgt@{|4Yd{X`7|3Jah{11Sa|HOX}_>yp$ zt^Y{Q)8mJUk9A_7v)Fyf0v4%&es#bsed$|lt1~e{gCvf^F{tC|7(a(^-+H-zRb=S zoiED&K+cnX#Hal?0sl+7c&Fz-rogZJ$27kuz<;OW)B6wUeDBG>>`wdV$FEoAKj5E~ zyv*_!n@ijO>YvQ=-^hQeZ>90A|FQ6-Z|xVEjelQYny;FlXTW14M#dZG{4&#fW%){a%ukFDYNwW z`6nfx_z%E;;pz96ZTV07EtPsfzkWWfzI1*l{%VVF&(FNq=Y9E4_1F9+e4*uM>!7uJFXC{MMU3wtx3kSvo(@AiuZ5)B8j23s3sK7M|)m z6*=X15ByX8d*aKiKAms-e=c%5-!*@!{w=^u-=q(nk0tSCHvdNg)AL6=!c+dstAiSt*`1&`F$3i-v3eiA@ONG2)_pZ&sABP-$8tt z)u+x^%D?6_`LFqqS^u~2`Q0?%!_2+Eeo}vFe-M7z;@kQbAip{vGRvRNV2|$zPy3SD?G)g{?&ZTY<_kBmGG{gJ-@?@?&qWQOY=?rI~G6HPxE&V;#YkszurGv z|48I?e?t9v4)q;Deq(riaZmZB{n7Qa^FjKrC_kCi=Z(O0e?6MfJ^v?hn?KDL;Rnhu z&EFtA&Ch+nzrg+fDezwkPx);C|4Mk8-`B#^{LuBY<~#98|3&d-cE0+2*#39G^5^wm z`$J~q_xx=9j$1zIL-?VROY>2~n{b-HDfmAYp3cWM@cVwU`ceGaKPmnt#IO7k|3YAz z?=|sdHveV7>-wDH6MqT((|#a6&F{SVQGD`0K>g&Ou5Zim{t?c4m|K?BN>3m-T z{~>&SDb3Fq{MUYx+5Oi6dwzCAPUmA&V7mXfFFZYdRQo;or}?1#$p3WC_wDd0=OW%hj3`AX-% z@Khh=e+>L5!qfSBteel&-&OHtwm!lafPWA6+b5X6q4~G-MdzpQ56j<@|J0wFUzz1^ z3rzfPpg;AW@}vIH`R#mL-!9Zg{9}oee*YQ3|3tXV&gX%^bp94+bkC>rUGEP{*SAIC z>HMuhe7Zk56hF;ZZ=BVK>K`CK>iG|(<;Fo@BehN?Lr{*{DYyT$v7;xHelz-h{rvCK(Vdt~vTV~JC7r6hL z{%6GxpKt#_&QpG?v+zDXo!`<&X7j%inC6H2L;8>8KlQ(GnaytyI1iulTdC+FKJn>% zuQva7zWV;RIK{8?o%E^xrSrQFe8LCuWww8t0#klNu>+sxr(WOsJI~LmI+OfQlzh^+ z`j>F(KjBmPPk%p#=7aXf3;F-2u)p?%r~Y0Em)ZH)S;+d*`4T<)uj_|QUHo%~-xr?lFR8yL;-~qn>r=|V3uF6B`aOdBYQ9o_2f!Z#zB8wP znlH+~9=}`)^Ht|pX6KLM(|nQt-;GoLG(Ut>{x4?odVOnu%dGySFY!<0oaQ^>x3lzo zepA4^KKA@lfA+!u1>ma9f>Sz1gfvB%iuzaeY&c_ziHxZutdj@>U?d&6|NuLw&U;UBU^FN-!e!dPGZuxgWUpl`7#P8?J&Oh~MD*vfJ zix8jisz3R!&qtM6{YW2*Py8(;Dt};eTp=!{gUYov+y7@jk$&hIw(?}=G`tG*P! z`jc>)-`^d-^iTQG`K|d*=ZpNm7eAe!Bgk)FKJ|y{@3@^0>L2ZgWz{eHZT{=`m()Ls zPxJdx$*1`mS9PI2(tiYe%Af9UXn#FcXOez3|1#S@nxA>`C5V40JoTsN-^aK)`~K^> zzDf082~X#n^gk9qwSGQPyZh%`Skn6G5D|R zQ;JXeEVW{6f9J&?DLI*{{B!#R_+`Uwen-H61^8O?Z1cNpXpN_H6W~*Rq|Z9&)9)W_e$?Mfy?#CQZx!lWY5leR*=xAX?=#?(Ki%KZ{lV|fZv*;A z`-kdZ1O4myCz;j%RpVQn;@9U_B>!K)|7yeS{LuX)&F9~`|G#^_NI%*?o6tYH|NRX6 zbrbr#1o#Hv{l>}8&uQb^`6hjcPdLpV#s38LU%>rAy}nOo>)!^P@;ib4Z$bWRfYaj} zG+%F-RfJZ13+^p#EN;<xp0cAHd#%hG_p!Dn7-33i>Qb*~G8k zKhu0{%YVWt|1s2G=Rf(U{kz!w+xepY(EQbYN%MCE`Sj zt6$g0;uQZC_@4?-{ipZ`z(168nazK527CNv!>#^x|C`R&@$$@pM(EFt?!O+2mi+hm zvGvjUp!uWyMe#?MCOq|LS9m(VOW?oiliB>rf6}M=pYR8O)Af_) zV*vlXKHL8-;77V*j^O5dHecH z7Rx99q%WOc+8;F^Ngu+gzKSoi^$#=H<8^T>jv;C{Op3qT{P#AuZ@&L}pl?!rb^j}~{40TpKL9@Oemau>q)*Mi%;sN{ zo91iY{m=v3^K+==l77S|d~H^~ufO`6^jm3soBtGW>Mx!D3FO!PcNtnT-+$fKH%Z@7 z`(ex97oM(9AMFR)FLZv1zX$pde_i#2e8eCwai*CX{O z-QV~9X8m`-=HIXH7AHR8L#yBVZ|(KxV;%IP{+|G!^4}6)E$BbioPGb5`1Stxbp4yQ z^Jn!LwO|&%_8SLkypMT4*>z~Zxp9H4*i=Xrxgv)GyF9at4L$L$D z*Ju5&=*g}0`+Ln-ihm+7@o9c0v-ExaG~Wa8XZttw?*#ZyR9`wDkHk;scU=C%>w}gG z5B*yNoUYGx{!;&FJ}CZr%g>&VDd5i_zuFHn>;F(-I$zb_)SsG9nLQsPfyw{EjPCih zAJXeH&gDGix83~P`o|D|4e;l}Q~c6bX7wTe-$YLSX?|B{;eG#4g{S^(0l(kB+4}17 z@09;;^Kbc-|6B2Czohyup#B5EuY{-lupwM#>+9#=;+0?W|5OJkT|bs*;eGtBuZ`dP zZ}G}M={vOe_WZpTp88kkBl#zO^-pHwZwpNNR{v7`?%(QD{u6%$IMuKAm)ZFD6+F#H zvxm?srdR4JD+tvWfos)xXo`< zNUFc)L+1H_)A>FTKgI9*+WJ;oe2bSpNxuPb;!}LuzYnBrI-eCk=`)7>Nx$ODY=1up zO!N6%c-qg4!e!QfU4IjP7w|V~ZsPa;*!b@oUlRYhQU28*nVr8uV4A-v;7h_~Hve6L z$^Rqa>HUed{}R8hf2se2aGA|-OJMR(^_>F0^iTdb0H^s_7GGxTd!^v%{0_pCetrJ! z{EQSl)kpc4erbQ~S9PJjdVh<|=C?3|y*{PC%<8wGf8x{p*XJuI|8#vMe3+%@ z^%)@kr17mjy}wrfOYu{G2Z3q+Xui)NKZ<_{@z+&(%CF}4FH=81v|pZxp7f#lx~KV1 z*EiDd4a8r7{cxtvr}#JWFSGOWSYX;8b^a4h`)Mq`%*OA7Yw=eir}#$#)A>CBoc7O& z;-~qm`AGSd|AgNYp62fq@VdUqx{U3c@4wRg(f(R&&TN0S0k8Q;^^<;Q(7!t0GFyMm zZ_@W~t>32dOZw3Dlj`rn*#6P|!Bgdz=AZZj^lt+7*L=uqe<}V0;M4pMjc@fMyqcTz zqw_`Qr{2Gp=DYYZoBtBvcs`)Mns1qnPyM6*SAD7e3&3}Ts{}h=_4rb{zP|g{eEp&N zJ}AD-#;@x~!f8Kj1E2D%*Z-&at^Oqa-U(0rsrgELn!ks@ALhhM|CB$SFY3>={L5_r zKMPFpzX?zJ(S94x$*1{x4fzkkWw!pu0@M5r#SZ)@fcN>b`-!g4XY!x)r}MiH{Kb~P z&2Iwr5q=5$Wx#2FJO}=k@TA`*;A7!3s}K1<7CFTy{?07CpWoljzlHp(KAAmVzdOHE z1yB0c`AB%_n{YaxN5Eg76Ys*>`J?>*qvKRR_2)qP%j|sCew0~#4;yazG+&h8-#b1) z{r}N%y8bP+`t5v-g{S>d^ONqco&tXl@D<@Qn;-FMKWxi+s_$BOs*hfOaRz+4e%u1T z&ZjJ%--J&Dru)N3!jnFwpUn2B9$!qq|Gf}7;osyrJw8eETh}L<)#oGNCxBCY!fQXu zY<|?=oyNEN6Mt3xN&1e!Kk0j*zps=0|BOEA{Pp~-e)am5G~c8@T^~pCum9Qj&!k_% zNx#*mzx7}JP5$Y8QvJnG{%?h+{?z?R;(rn@v-NfT?R*bnrum}$_Y^$kNApRKAFj>H z^Yx7&KHgC@{9h@*)Sp}6_xZH?d{%L3{$4=-G#`XNQD!Or zE#%j)&$d3=Uq_%H&F@3d=UR9=A9sYyZ2pAb6FJQ%T|db`;q?3j@vk8NL%{2N%B+6F z4EA{GBkO6lZ@&LZ^Yu+Xocg=coZ0-g0H^p7z@%T{GOOPz;8Wr0 ze3ZT^e)T8u2jMbXUtOP)f2w~d@4QD6@3s3iFOBFrD zA7=2c=STau^h^2I{3QLT|K$IT{3m^Op?-?r&%f>Ok^HCEZ`b{8x__npQvFZ*okD&0 zfnWPE`KSBSL-AApyS{f?nm>Led|S>_e``Kd{2ti$@4TgC^Q-+MvpD5H%;=s^{%d|y ze~3@`Bl%DB`Biw@-z!Qk{r!_?;-~)9`A+rK{*>ANod`_)E5PgZyRp8C9^y{~ruzE+ zRFprrap@Q4Ybxgnr}sB(wy-w-9^ga6t^On7seaOj=9Bh+@l*fF|AqMJ{jsa9eyiUK z;5ENVpKIYMf1DqPKZW@9{zjRt?}flLf3+WEmOm1h>aX9QQ~jhL_2(^|uX_JL>OY+i zny>wtJYJvUhTHS?LHVWY-xU1c6+iW_K0hPj7l7B}i-}+Tm&N%IZtEY4&3x>Ib-G8P0CV;O3Ui#=qtp2tCWmdmq zINwXazoW>hzPsY5`=g=xxA|`iPxJGz@ojxi!2cEar}=&=e%dd@pZ9#6L;OvskNPtf zUuN~C>+3>e+WxLJ{}vwsUj6%>`qTYM&(G>Jh5U|NeU@L(-=zA=zs%})2lmHHk<Gq(AX%Kd1ca@r6_$)j!C;%;rDLV8reG z()=tp|CT?7_|Ju>$46(>|YQ~ej< zex3{qg1hk?ZgNZGQ=`{-pZqd?x)@TYbMAzdpY#`KSGI zsrae?bbiSH(CV}OBfRvb`PYwF|098^KNIl(MtIu)_4rNFubw|h{KpXgF5qLp>Hcs< ze3{knQee`*&UeE5d|Ur@|CacN!jrxageQIHonM;ox<1QneSZi{=acmL$^7m9cn|yM zDdaZ@ms$S{fcN?=pYTQSPw|h%PxEyR`fNjdI=`h{>i_Y7%lN@g#z&A}A55!%ug}i! z0RGQ~Cw-|uPk>MJaRL0&M=iGXod8btQGO4>zuFt~dm&tA^QZk&`#JIH_Y>;h_HMF;e(3qx^IP+o^jT@RIr|W+`za$Op{`lSf9a??1KNPbm=nwHJK7GDB#i#kA{B~h}C_dpe zpR%4t`{w(vllG0p=dF+GKUe(p`sN+s>3kgmeh2P92JzGNUuU<>&i@-B>Hg-P$m#d@ zp}dFw+!vVmG~YBI#Hap0nx*gOtL88DkLI8DQ(d2v|7*ahKFYt&Pl~@LTxQP~osYkF z{@*&kIv+B7K5qr4^G*3L%-nnbH9yJ!4)907uk(@o6Muis{Wn1T+AnGTZ-mSGn741f z|4RB3{zA^uQ+HkA?M0oPQ34D6~pwF+(?-1foq)*y^RNoc&Ux4~9fWHkm^{38n z+8?V@F4bTAG0oqBI-mIDzvd(5NA*1de(#^1k5A&K`J942?|{Fr;*x%SzuNo=Cw*!^ zruuG#r~d5-m)Y~Z2>qx1GXnoq-zxn5(xLgc`qutQ^GE#3Kk?6@|L5YT{ayK`{_O+4 zB3x$cFMX5$zMn0>u75H+A7e4od@TY07CwKouJ7r5QT?=Ex70tGt*`o@@V5=O`i+Gr z{i#0{Kh0m=za)L?`ZLe`?Lq#ue@Xun`IlM!cjuh1=P+N@zog$#*@g2(_0fEN0smv+ zX@2VSozneZ?T<7+mA}l+?}fk=pZGMtKZ7d;J0I5qQ~!1$|9SC|#7+9Yf%tU3YJSpw z?bmPHzp>)WEWQc(SAPmz&% z{Eq>z^PSG;CE%X{uj`Y{);DkdKQsTSz9q=7=2tDY^Fe&--vIMN_0jw;LVX(zxAhVK zKJcl(q)*=uc7C2He(LWj;3t4ThW+tQ{4^iWgzE)7Hvi4S!})k9F!}!`Jk>uaa=O0t z#@qaAKgjHSQ2&M*-Pd2QZ%X_1fr?A`BJk<+H%kAc-zwx^^PTt)ba7AlQ-A6F7cR5? ztNokir+)wZAECdL-^wh!k3T?s+AnqfQ~nzezwZw_zok#=-!|ZHgs1zrLAcEJXDl$) zSN%=+necSJ>+@}7Hh%HRf5K0JU$2i#^H2L@0{$NfPx?Rl=Nx|wzu(n7M&bbf07;(Rv$_I%QQxexIVg(rPT->JxHzDU14^(W2$ z3FP1FxB473{p@^f0loq8_W`Ht%aSrr^$+r&`a|Gwsr%+~)=U^+in!spRv-u-!@`04TOYvF$x{Pp)j zm8bd^iy!vG65v~KfAU8BbUyp}w*8r^xiUNdHD9SeW5Czp`uDa)w)u_ZUuN^`xaA+I zzSN)b%)OuAI-fG@zpgJypE_R&FaPO$JrkbJ_j@Um@W(Je)&CTK9rCC9r*o*Up8u6u zeQ7^0%;HJdu zeZH)|gZ#_v`JBN1=<{d!RR0RZC%pDU(!cX<{RhC`Z24I}?XTZm|B>=b=j$WjRA2d* z{c`;kKlSHC^ObNqzuU9)e11J~JD=M^;{I>`EuZ@PRs7`tOnACK7(snCf9d-3PI%IH z2lyv|PeDJ@hpt}}h(7>+E&MN2zu&eB5BqNc@ZKLgAN!5p$FP0#{nrjye$7Yf-vOK- zIv>=ZrIxJC?@)N!Kld8n);|EgDLl6hYH{pt6YW8q03(r-8%4~o7`LOt=oTvS^Bj+iHJWB_r*{1@l{|tAEeJ?`A_q47xKS= z{MLobY=5i%RNvZ+?)fVX_vc^zN&dIRPyOA8_*5V1U;ABV^*L5@X?`gF9{3*vPW^oi z^GExA1m}nPv#I=3|7v~`Uiv3|0Q{>aFP*=4;-~)6d_NFBollyd+Fvp|Urz<5{EDCS zxhp)KuR1@8-_NhjZwvTS;VJ(!;9mkx`MnT7_5VtE(udyPK=EmQmK0xR_v0$yG+%p- zZ~NEzHh!J&q)*S!`mgy){P)7sd6Hb2s5ByyVX3xR1qYCdJQzRMZxar*lLxBn@} zr}J6;k=gvH|C_+S5uWs+`F<>Z>OVa{GzR{;@bvf}_1Q_^9r;iDm;7&o zK4S$>{s-VsAin|XtNx_;b^a1g=ez1peA;hs#ZUKN--OT8zp77W=cgW@O84)bXwTP? zoTvQu06(bgLVnNT@1GPu>HiM!XR0ja|6I;xw*C|FzdxgUKAmsU?~d|Ik1x@F9w0wD z|0}@%LwK6+Q;9EYUuXaKufMFeZ>|0h^!ZIP%U{#{B%Jd9JfnO64**|jncMt!+5xlp z6#Rb%{%M%Y#2%<8)g`qk%0%B=s|F9|1oAJ6FCe}8?rjlT-|A2z1t-$MK+fWL+M zZy~?u;GfR-r15QkmjEaK*N`8bk1dG*2=x01@o9eUf&UkP*XzS&c7A9+4`BZ2{Om&g z8x6PpC;UW@Kgw)N7xn)c@=NBe>5Cwxco)9ZhF;&y&sh@b9%&xNPwCkUtd zPvu``^`-o2KThR5)we4=%^#hQ8}ZZr*$4mcf&W8{h<9-`KSGVB|P1q-4~wrE6q>shZMgb46EO%_-THr{&(UhecuRA z^GEv6_HTH8_)`8;{ZkEJs&6cQn$NDk-7gfM{=OpBe^>dX>-&Z9RDbC|PyNT@r}%g!1O8JigAAx_GZ}MOLN%>s?z6m(_KmG~6e#G{V{MYMOWp=(! z1g84W0N)4vp71pP>k6LYzXkvG_*~-G{3M+8--7(>@x$bw&d-|s%WQvN3rzY=g{SyO zfYba^|DP@9_@r;`uXO#P{Y?CA`A_?i{=VJ^&~F`Z%Kwx2GJ8Hd-_A$%PiFBE;A7!w zzV?BCD?IhD^pV;8>U_y;{lg6Qe9~ts{yg~=Kj||FPv>tJ_+J4hKH;T*%D?na`HzLm zY=8Rwk?rpwa`L}X-ot#<{HFYipZphJX7i`|4@FM?Yk#Nw>U<{rF8HVX9*Zxt`Y$!y z*8fh$CH||%xBe;rem-sdLH?7zZvnpnobKQ2e5Cj_KMAM#8v}ny!;$t=KOa`V%3o&t z^Il;3{hs{Se9OFl<)8eMzF%5p*8gIQZ|kT0#^R^`)%liL|1>{@lfFw3zn>qg&z|^c zzjUIl?@0V~e{=x(4S?Slp5}W;c-;{sppYQ?r z^VUcFsxRgTIPtfEKLB3W-;`fJU$#H<;=2%^_Q#_5GMnEZFxB@2@MYmL>wh9J`KSEn z)sOm5@d>Z}oa(FjN&9tPd_n$YR{voJd;G4FPy6*{^L(ed`SEMjFSGG$ev<#1@1##% zpOe0CHDKxfVXP-l5`GWjpF;di_-v`Fi}WXb>-B5t`L{jAPxD!yZ}xBh;O~EH{u7_@mr(zfaGBNby}&dd zwEymkpZZJu4e?X`)W0>66MriI{}S|nDqLpu>G}6DY(M<{*Asn{=C9^MX8luttADA! zx5DS?U&T-T8!345Px*h7|8#z6|4{ukzbXI6fYW>)il6kS`8)^y6!3{~nVp|AfhoV@ zC%pJcKdNsezU)r>=f|&``cEnT8{sK_J^r4q-_$>vp8@it{nYEX{ptBxeZ~-fNx01V z|12=+I{;4lQGNI1KlP9LzYh6P{4wweulY{;QGRb#e45XiKbh^{ATY&WEOy|Z3QYUC z;-~)XmG^LdY5y%ZzOC;{c)C756Q1%f{blz2TnkL~)%+xV9|=tH$$#z703U?QZ2!kI*w^<}$;)j0)c=L%-^MTfWfrgNi_FHS-+y;R zPWn=QC$sQAKKZZUGMoP}gMIx=O&QDIZhVW^{z&y-0sj_os-Nbg@{`&8X@Al6@j%Yg z`MeALq5P|Una%%Z278?JTWEZHKB_*MjeigD+CMVOzXhE7GXXx;H#EMje+lq?;c5Qo zF3AtY5tzddD8a* z#6JZ6Zh%ko{a6E<=HrtVK*Ik}{DhwXz9T&KpYWRB)W3RsHswe2S^6hF&Hs`3ssA)T zQ}NUN!w&4X%0KB#*PlJ$@9AVD|5NFo@O{9aDZb2}zi06IKD|Gh@;|p%`p>C9H-L|Y z%WQtzfY*G>EWgfA!q?#Z4l}yHzoPnIh@bS?ZT@ZkRA1?n=A#~8mRbMrXRxoY=2vF> zPx%cZD+SBH5T4E_ov#J)WwyREfk~g2!c+VwN%wJrzK#W^{*8sF{Hnfr@Ky0;c0R9Rz79lA@jn6nP&mz(e#Gjx zEKp|i??j6~fch%GbpBonPtR{%2v7U<6maVASp1}aeSTG%ufE@{zI1-p6hHNk^r!tp zIL#N$M}7WU(uex91^U(U;;65TEdSaDJEMUuN~C{0JZ9Jn1(Eyk37lkG`MfKkb)wh(7>6 z0sJZCPyV0Ef6D)f8j$q)Dt^LuA%Dv6734>J!fF3(D}I`Pr`WBeZFV(*f{e1>_%~#5g;uAiA{{iYJKE;2klb7_R`Mm}G zDE+{(s5+A$>0tJk@_FTrITvJqG-l@U;Kx z{yd$Z9@y@$b&*qk#3y|S--P_DKAFw`k-(%s`JZ=xP82`sKNXnzH>&Ewd{qBaeK&y9 z^Ggd-Hsw$E@0EYz4}jDDo3}qxeSUu0zm)$vUZf ze(LX`nw$8?DlX0UAUw?n?T2~s1I17K?V<2=zP2F$JHlnQzpD-JKi0na{%iS{S^SZ} zl;6JaRNs5ysed)!G8=zG&J(}RXX2Cp6OmK?-M`iMO5`+upX7g@{4d2%`VYcoHoqf* zY5qySQ{dP2O=jc25Sa8`5t#7h@*e!}2u$_S`KA8cm;aPs#ZUMc@Y>%g|82l)er5Lj ze3J7tf4d^5{1;~KeSZn>iP`!1D*x&H)cse|hvsA2^0)fX_2+^3>HJ*^pC`Ys$}II~ zrR8t+BYXn+Z7KPr{~GYg|DO11zDnPuUvHePpUy}9{g0$C?T3-_liB$5=J!g@lm2zS zlYSJRaMJG!{C#B7Z?)75`{@jD+AoA3f`8f{q#xn)`mfig%Iy5reoym3&(CkkdEyTh zJ@l{kgUsf4uKd#ZtNot%q~Ap3v_Go8gp+@|J`lcM)dl@%e&^+1D|phM=J!hcq#vCx z+7G1v5yamYF6(8qZ@&NfUf)puY5r+{Rs7_CXvx^~F|Yr5`P-1+jfzY6KXrbSe!YI% zpT0jVPUrVh@ss{Ef0bY2SA7Ym^E(k=X6qxI^r85Kud2ATAI_9~>hH%{d4B)DR^`e6 zRQ#lGhA7 zE`_K3ca>S{FX{V9{N(>e&J$k!k=gnW04M$akT~glQ2yT(Kj};7e=2^`x8@`HulY-O zpD(N5ONdYRS8EC`v;KSk?0ioke($g4p8)?5@C)HdzY{el;q?637x4cU@MnY4PRe-{K>{2Njq4Km2pvAN}w1TK%pd z{tD=`3-2#_3jPt7fN4L{`P_y0J5XPpzZCye{4{?xU#WjIUlZWh^)R{_5T|4)Rc{dEoVL;HvNNApwp%dEcpLQ?*ZL{9Uu zHFNLxYwxe^-yZM>z^{a-{!@Idmolr*nZQ*4Xh!$-*Zd|v&G&2IlYX?ntACW=ytqQx z{@3|Uc;D}qPx|-sZTmY`@H9V!m;UMeEC`p`_=MAb7-sIhzO(rleEc`S-w{5KKE1!T z{*4yj;-t@8$iMry^F#h=eg??D9>0*;`2G56aoVq>Uq2sKU#gGxBfWq2y^2rsGXP%s zCH|UlnXPXSnE0E3cYSPs2(S51@$U(j+5GAJ_x{@aCUTzk_aHpwM|k;{+5GPcOz~d< zzArrGSJ#KMf9vsqgdc+cOYlE$ekTxr-u%wMKj~NfP5P7nhrp-(I|BY2;W9garC*xA zH1OUGwHJm{x5~6{D@DF4_!fgI-fP)DZjctrTUM7zX$jZ_}>&Rv;7}tu*bI> zey9EO z{t@KA4f)ajya)W(fKP>|`M(fI?+-})dVhV=@2TRa=g(Gz%k24nATY&Wn9)6dUYyP! zUEfELUp@aJv-S6bZShU;-_Nh*F9QF0!+RR-oA19;eiQId@hAUx-k&@2pXOsKJne@K zDUZAQi_-x<_bzn{yj|3@>}3GSa|`@a!0Y!vne8v_$H(CROUvKtN7v^|=-+FI ze*yEe4fVeO{{!%c#<%r9)aNJ2to~=M0Ty3q3(n$aFu(Qw_7wlw4EFnbui-ZSBYl31 z%;N8%zy11S^;?1b>H2UvOV8Iw_zUR&_Tnsnt^f0!@o7I$f3916n_oRXBC|N{2fF_p zU_Kt|m-iI^%?$SWwf6Y_J^?=6KiviXDd7G7!0Ox2pT#d>{waQa{+Z1BCw*xD-pt&4 z|0jTd1f2Rq`B8lb5PuK!r|bLCocnpR4Y=KpwBPUi>#RWA|Hn}Od%)@UGn&sAFrR(D z*!pRH9)bUQf1=Fla{>E_?r-kG^^fNFQR~0WkM`%YR)6!-dihshDgJT$X&e7#!)<@) z_m8jOpRRwjKPTXS5AX?Gzh1$7yaE4TpuhF^Z)8^gLzv%9!0Gz(0^;9={69kdq|ZL& z{|xXC5TEwba^u_iCVUC_?e^Z^zchJ0K7sxA7V2My`CWnh>Hcp7{BMxoAJE@Ln9u(F zhCM&jpBu<;3-Y7+*a!cF)BF(r0pdS}`u+g^C%{M0zn#Xn=dYgpklFq|X?%-Qe{RA5 zYV&XNTLYZp??V39fKz@0YpDJ3_g^W$?%(nkAU^4{)B0oeUj+ZZ9f$ep@vT1h zTmE)_x1hd{z^DC9`d@*6x_=}8gpVQqy!{=Tf7_pF!|nX-1OC3@w!eFT?*fkJ3+D3} z{P+D}^Cz61KX?i8Hz5DM|7?DQzXJdFA-_|=`(WAmq36%2|BoU53E*c?|4YE>`5QXl z^!V=q#Haetp#B$t9|2DF4UKR6Pxmj!P=CLFxARZu=N{BY_t$j(X}+cqpYG3Se|G;? z{~d_G&~VGA`J&&iUO{|1zc1nUy9xN80#5xsY|7aAy8!=FnD0a4&xv0F|102hK5l`3 z4EWG+JAX9)pTPeV{14Edr{JITc?f*kU$lR>U_Sf(wVhwOzEFP`K;IGQOZhzq{m6g+ z{mRx)`R_yg9l$REr~cCY+e^@wuD`Uu*INGee7=GD`XhffBOfY|5x#ozBl40eHIm5!)@yy zLw-AeKZE=R;P?L9{3hb3{1;STs-O1P2KXnu=WqANNd9HNJRb)lr}?4zrucRKWmf;i z|DMlRo&S_yJ${#P>d&~c3;OlMt-kZ(uN6GaUp;@5=CA8-^?lGXxARl;C$s!5fl1#t z!c+dF56w5>b^ny~*{$kAf2RV|{yP(%>g)Mg{ho-N^rQX%L~lMz?{6XfkCng7<~M1$ zoo|{?ihrr%lYZL}zpf97PxxKnUqF1)ul&obzIzR~`u6@?{sQpp`YW^kEB~Zl{r;2Y zv(JakZ%yQM{&wU)ov%%Zzbss4>+ADl^IHNw`6vDe{MY?Ms=xS2|Ee$H2Y^$41Mr^< zPxC|i5PlB+`+l|kr~EhMUuOC10+YU^AK}mBKk2sx@u~hr@nyC?I$xCkM9z~w)Zd}9 z3;FE{O#Tl5p9)X2o7I-M_8~m)ZEI4Y&Dk3s3P+gs1qGzs$y8oD;A4O8Qm*Q~uTegx7o}d<1x( zPpfamPx+Vr2_J;ZtpDYPTm6qzT=Ks!e!`E0Cw-n29v;74fc&n&KlP9LU$1XT_a9Y% zs_#-@n*Z7lNx#ZpX8ZS1V2VFdXH)#q%)R&jQh3^Lb$(O+J#jluqY^eE)T|ePi*d-k+25Uut~Y z-#ULX>;DXJ%5Pi4newCS%SiD_-;_V?pHJYQ;@AA7^S24}-SxNq*#Z3vPx{b&jhlZP ze+BT`KQcQ%!wmNLec>tp2Y^?9Wj6m~fyw{XjPCQR^DDFU)%{KKKL&g%a+;qb;E#R+ z*N<3zE`fh8Jni2J@az6aX5%jaUiHcDw10m5+V_w3U!R|qt`B3mO#P$$dwiQ;%}?@Q z^(Fk1aG9$3bL;up_~d`5Ik)_GO0NCL?B5^0)bnF$J}SP<`v2H)+rP)clm8RpNxwDl zzYF|Bz^VVVe~-ZbGvR4JQ2t$itM3@%uM3yi{&jsVUh|pyL;6jDU*{v8?-k)PTmLfP zn}E~xuk)=w)j!!UOalrk@8FXZzNo1^Lr{V)qgOfd;SUV>F*!zH~+T3Q{icTYkm?=^;dsnHhu@Je#4CJ z`StvG>d&$GDgW-@#;5%1d?f$0f4e?5{uunz{w{u+zw1T)ei$BqI)eDMKT`daAL&c_ zjUfIh;1qus_-`a``u%z$aS~4RL-?xvr~Ve6&PRQITf!Gqzs%0(Lm}z&(@8(t4-X;# zK3_J!k4j!HdYfmp{MDB;z!%$3TmMUde**tB-}U~qG(WZf621)i)%8hc^`ZXL`JwCU zrh=#WB|i0^_{_9l#A@v;KExu*YdX)A^wDNBtwb&aceYNAZUl-Om@DuPyP@{M;3u`cwNi;go;rFSGSO z6qx)U0$%$!U4O2G%WV8Tfhqox@TA`b@GHOMzxtE#W8ta3iEx>{zSQdrWw!o`pYXbW zkXir34EFwa8gBVLF^dlpC+(Lti2q4=(svp1tNzJse$yH3>)#ii;$I0*{jK`a{L%fz zDdcwm_(H>N{e;)~mD%|t{?45Idj37d9}7(VIRd=+GOG{m$9Iiy_37u&;%mSsd;|D| zkAOcGp60jeOZc_$*dLM8`JwYc_0fJNKH+zjf2!|F^~>yhJr$Vvr^1uIZw03P`b_+! z@3JyW{3FP38}JF>v|n$aKDvIB|K4BQpUPim@y&+cY5)BAmCk?7XX-EQ*FA_|{gK)H ztNs*!Wk&b>*YNs>WAW2`4-mh8KT3a}i}*M4pPru}eOJYo+5UFG>N|*>^sU#|r2LAU z_{)`D=r8ThvB=3k)wd;b>MzZA{r;Ku6V3N&RUi6O=Reg){ofHe`LFy^{X2ly{z&=N z`IOoDqy0ntT{%zrQ~!%Ev-3Zm!5*ji?D<>&HD5A|)Bft`+w!ZwsXv3jgikBGkl(t% z#3y~Ie%cR{S$bZ-CBR3J{|)e|KUDw6=D&|=`{w(vUjQfnkJTKR_5Zy2xASw^aLYdx zp3dJ0{MUX-^HcLHv-!PixXtgZ;ghllM{rQFB|7FSd_fl}uZ=?8OzLy$q`@aVGAUwsd{v`dne>Fmvzy6JEuo`Myzt|MpLQKfP@6dl~JU@4wRh!+{QGn!i5Z)<5m{ z`>HSXzvesjcL(bG0Q}l-$^Quap924@lu7zcfPc5exARB&-H4y!|IGQ43mbnBC{vYx zZaqKCzY;Cw_dv}___T$!@z;U>0pi#5=PCYY;2#Q4^R+HqX7hh7@L$69>wHG{{i*#Y zv;I5Z;=7G+`*&Y>y1u>>p7z)C;)nc7KbehB`{hLB6u<62WY+(onwR)={vS90R^M&m zX+Ca+r}!h_9|2DK?gM{AxXjj9`#IG&+dpHk|G`i2lYg3z=jwbq-&Nl{{{Ij^UElit zwewf|E1i!){$-X=^EI8(J%1VS-hUf^0{kVw&*AaKI$x=shFkq8|KE*|pg!8a$G|@mp7f>u z)awIfRzKqZZv3f|OXqI@obvlDzRcF&&yU5I8{eKEn$N?=xBhGY$Sgjd!5-fep7g8z zmF8y?`0oH;6E3s*tOCBG|TUzxLh^1s$9>p#|legAd8ePeMtAGM!kmQVTB z{!aUC9q6i8o?Z3OA|8eOX&d*qtCH;@U|Eh4A)#pTD>d%$%G=JT{)prN@3vhq&Kz|=Q z=|lUa?w?ctE``giK7GDyeNRPB{yz#&`P2M85I^;Y^so6%k8crwU;NbnCE+rw-!Oyy ze%@-h<&OdH*C)#_{bd#(HQe^M>X%vkLSX8D_iy9V^`rPn|DKrjPyM0zH2({wPSBV3 zcilgv`s(ikrt?$J|D^LVk^j`6YvJj9+>^j5e)&)N*ZE8MSa`~>t`8|c>hBrke+2pU z{b1*-@=x`R0RIE$G7=kDs0k!40yeNBb}eV z|7`pV`A_|!>)WL~r}IVnECK(i@=Nv6`9FpF4gtRvp3X1rM?BvPS-*40?<3?_`Xv3T zzp4LcfcNXaJwLtwcK#;vpXPsFedpDu$G7!8h3C(RU*|9Nhwu&PPwk)7-_k$L_fPi6 z>O;>jQhkKaTmKH!zYqAbaG9O&`|$fu<)7xC@M%R4@#*|f{uMv@ulY#$65wOuss8$W zJNo>K6#tW)C;zLE-xJ7h0DKGl-va+9&!3$?(*Hxt&z|4A5-;tK^TxFC`~8pgzX|b) zzb<~tkN6)|U)q1wzcfGO|5Vq9G{2u9|A)fU{nbdg%<6k4FzIs+{VjfqPx?@Pq~AhS z7xo+BJ0hq45&vKo-s?;J=L#;f{UJW>C*s%nP4RbTu+ML?;r4vr2b}m_80){zcj_Pc z|J^w0-}SZitwDXeO8> z@o9c~eK!6V`A_rvNqD;de+vB4PiFP`18~|eWARh|1K^KEPWm58z=V_k5yY?gN%`0O zrvBIdPy9XMDgUu1BjFW4`JcDG1^JiR`CJB^?jI@tq4~G-c_=*9U;6&nFyE`qzpanX zFV$D`BeVJM08aYu0>AW0_oqYS+xp9Y()W$q5}xv_`V&t5xi5aozt5-5Zv^});A6m_DsnpCo4{WZF0=WsOT6TNU*x3EyzvJ) zPyUx@>HGXkf0>;x;@9VYrucPzkXij||0VuYz$w26z<(@UX6rvu=4t;=MNat-!ezGp zKLn=vq4P)kf%eyq;-~Z9&#%>I4EhZ6FSGm?5-;gn{Y(1X6Q1tx4uz-s_5r^S{wMJK zNL?Rfw*TMi`L}=c`rH*cg{M!6T-%XgW zGsREmck*-j+4{fbTobpE#?|E{0S?+=JSfd3EjoX%&R-&8;Oujjwg{2hV+OW@ah zrv85up7v8+-xB{7rT)JWImLgZ=BE0e{Il@z`2+9dJbgaj9?Z`- zH9y6#inks)|)a`pE2My|H=QM z@KisZKgCbyr}UTE{AoU@e^WV6@hSg7e3{K}74TiaiBEX>PyOrq+WDjXLh+ZNzNzpu zKZlS%oe#?YNX<{z=PPwK?Z-O5N#94p6TkLj;_m~#1^9+=*)Pv0^|$VS(*56K1yB9$ zgJ<&_#83M4>x<>T5kH;pXL6qUzbVfNpFn=pA3C4+A%E)681f^W&R3n!q;J2z+5W6U zen-M(mcIx%&DR3(tADcYrhW7MSBn3;@!Buxd_5GN=J!3|H{k!X@U-97h0CmdeSR%| zEOM&vt?)E|gK(Mk|A)Y|U+V8`CVu_?CA0I{16zFF`FNq=DgVA7ZT%FV^53oMgTCay zU!QD#gPf=O>h-Y+pNcQD`qO@!0DlSaI-e=OzF%y9{d`#bq{X-T&AY$0!9V3k{jckr z%;ryg!guHNe+K*mz$w38xa}|DqZZ%tDgN)qYyQ&w(|)4sGvRbTiT}684?(|s!qfGy z<~QME;W9fv;~DJnP2tHu%@^@^T70`7)&ZyU^M{60rV{?#*4lrz@#*@1EC1>9dnrGf zU*ea(>HN|8?EBx&N6n|q>hngy)BPv$7h7j+{4WZg{O<}+^{-a;A^(kr+xYiees+HL z#TRJxIT4=jZ$~Y@<#)j5H#EM*kA61*TH10hyTI@H^);#= z{&zNQ-`o5b0k8d*>ZAPU^4HK2q@X`l{W^ zKU{wY`IlLJt^}s~`uVeb%D?)P>R+zxLVi<$Y5&{@d`Gy<&VThM`CpjPy?&PsxBhp* zKk@tivikS_*!bIupY*5w_^|2=uaBwzroWF-`u5AkV# zZHk}teFOeigv)Gy-wI5RKYtLO@~8P7EBVBKDm>};9^%)2klFgq3LSg=sPMq=^K1RT z5IOC)nqQgaqkbYM{hkX<`fUUML+KyR&qMLke3braJ|98+(kJnkh0Cmd_XH+=`uVr~ zsrV^=)tCG)3YS^`j|HaJ-|Y!c{&xVc{V%ieNxv(RQ-5oIl0M{rDt>x@=QH8y{1AUj z{FL9iaM_*q&yQcL{uF;AJo%^jTLbhl@=zY;l}pVgUrKR=&< zeAcOnx6siJ-{CbPx>Dzc&h)d_%cn=pBu%0B3kl)4EP4Tzp~H2 z?N9yv;8?%nC;X-OX}+rd#J>c51^jRP+2N0k7bFbfEBR0RV+#2V(m(aD z>tpNh`dgg-{yd$pZ&2R^@X9agQ|B|y_lj_t?axPn>3odhi#h2Y_|NQuM z(0@wtYyZe>{nsMPtpCXj_Ix@&R9_El^Q-$enZ+qS;p@%6t$zdXr@8>7>+7EQX?{sx z(ue9J{@)t^d(Zz;{Y&TT?>+y8How1oe*XXYm-v=Zp9q)rF=^j?|8;2J*!iOTJ_DcTbK3YezX|xK>-#D2slK|uPWsm4 z59#;ABjAr(eztzPe_Vq4#t?rW@S5*bKj}|6=}+}-D!+983QzeD!ew^;tN#h_{j+@P zU+stFpU(f2n!j+q&j8=k0#5vOC71N0{t*9C{?qSIG(WvR_WTh35bCS`ruute+y8T@ zZ&A)=mQV3th@A4fDDPoD>hp;bPLHqLo6&v#8m}^2AL&QPdJ?q+OM@AWmcbKfoZ}Px^iU z{!_rIzf?b+KRQ1vP5JJoCHwtXia#&DrC>?lhk#dqWOjb2|8zcyPxxNT&+5A)JncvF zzXty4e3Jif;Gg)vTVIM_`!DI+^|SLcf%?}QZux}M`RRjW{Zsve@=NEd*Kg-@U;LzB z`IlLK-Jc|W#ZURI%-s9)UHT?|?T-|H0R9;G6u;&#>kPsLBapVa%m)8j+e;-~poX!+av>U_xT{MUTUgMR}481SLt zHva?QQ~i&CKNUWYzU069FSGjB`A9g`cL@Ax!>zu%z^C}M|K`2EKY{!%0H^#3?~Swi z5l;FnLVt))@w+}Y|3{!7H0Y|zU}Xh3QX6h z9XU_?kM!Au{9d*Ex=ihx@4wdmOZ8R!gb%+Nr~Z9`_*5VHr}_Hb_(zGK-oN!x!1sP^L+$-x;|2W`}wr-Zxlc32YA1KwECPX za?+pb+p5>+hx?`J?ay(s z1An36w*MExQ+-bX@AF~ve=B~<{~_d8`#0rB`-%25=|lLjic7!$QT+W@ztxZCr}U9o zexHBa|MH*sv-uAGdtmE-t@*e3mGJcWBNO3ie%95Xv|k2@zuIuC-+^$-Pd{S$_5QRp zAJ6|a=il|S{s~`#`geq<^K~dZ>0gh(rTXgnE3^GC|LOYn8t_4Q%5Nm)(tMCUwBL3W zKk0WL@>>xuv-%7IQ+?IHgufFmv-4B@guha8>Hcv7{H~v^?}_;7{q=M{ss5?_Cw(Zt z>Tlw22$xxX38(qnl5>im=5KA5p3krR%WVGR8SHV&zv8F-slPQ}iBJ7oZ28;y+lKl+ z3s3s)LwetVw#cyVG zKmYyUSU%x2pETbKEk7H-e*aI`=aKlS{{!H}|0I6u&#}OCeXjYIbs5_?-+vw2Hx^$9 zd@MZWw+8&4pVj{liJR)%6rSe4??>yu7jE%7KdHYoUzg&i{7#xaHa_k5ukilg+MhDp zU&?<0^nD@cssHB{J?sxUzq^fZ^RM|y{h|4z`d`a`s*m<#y+1bb>-o<#9}BI1J0By^ zhw7vA(d)DN*ZijZ>H1u+-%RJb2e$Q3K%cSjG#{0J+V6YdpY)yam;CkfKKLj7YCp+r zf69OA&%GJl^WQbx>QDWdil6lVtizFB|9=VmyMV6)egHV>KN4SN^*Iul>L>l^eA0gS ztl%lXeLXmn&fiqzG(R7Nr_UEA{RZ)qK4ZXXzi)~!v;FD&&EmTvr~GQar~0WsJ$@g9 zS+0NeWeeh83s2XVJ;19znT@|8Fx5|dnqSg?toW(E1L0{t>3k7R^;3UNl%LGb*KNbC z{`LHHs&68G!s-68_(|WYKjHm++5G8zer)wyeae4|zb`z^C;6}XlYUd-GMnFyz!ZN3 z_;Ps<{%gJnPw{C!tNz3vSM;zSRvK>gss1PbkARPoiEyd zgYuKzY5)BAwfEoRQ&Ez>b$(^GKQ9F){b)W9flu}CD*2>;^*7DO1n{aaJ^oJpqw_P8 zf7zY(&yQb8Kho!2b7}iW`{zjfG#|w8=iAoz1pJpiDgIc^N&T<=p88+=MP~Im7ntJH z{Ov1v%CBDkoX$__E3^7_eQo|V|1yj33QYA~%;=s^{oMrrH-K0Cl;5^+nXPXL@QLu` zzv8F)Sq1;JKR=6~_RCbsrTCQp9_0U2%BA`2_1XEO`p2Nph3ZT7KZMse4f3D*NBM05 ze-ZMp{-*c?;ID-z{V6|+Pxvjwp9+`R^HuvJ&FA`z?)O*UzcgRJjF)~Xzx%>d|E}SD z+!H_T?>(r$^hx=Ve)Rdm7xJH8Kl566nm^j#kAUB=4|aYIq5jVQ<^E5=f9ae0e-8XJ z;py?;E8y=6PxG^&%2R)q#Ftrp=ly)*zCW%0Ulcs$U$4(g`EQ7y^e_L3PxCPb|F@7I z&F3ZfC;g7ZPx{>oPxYSw|1IE`!jt|J;Me_W;vZ>pQvUV)YubN%!jnFGil6wUPs)$3 zKZM_r^K}0AA-_8RDL?%ELHwi-^=DJ!rT%;b|6?Ve_%%PNzI(z`|1>^jcE1rmD7dWu z*zEuR)t8Ddv;IebF9J^a5x?&bn_tbh%;MyKUYzQ?QF5uj7l2cKq|fi>FDQSR)&D;_ z{-K>8Ti@4Kzdc_xA6vjD{b;`uz76q@gs1uaBz+S82ymL;LGk6n>ibCpp7!rXtIzh2 z^q(}ojbC`mZ%tsjKE4C~x$va#W58F0%WVGd1t$I0gs1wtW2^5{MGyOd@}vE=F6Sw~ zvGAl{;fYW8$H(CR68s+tPxmjk!c%|h{HFZrd{z9UPw$WIFZrj>|GTgF>G}T?$dBs3 z2L6HYq~9Q1_RIC}|1b6LAN~2;k@FOPYZl(~C%~uvT!{Y@{lC-F`0?vI{iig)H^S5Y z8wpSKKT~pP{x1MOm;Y2B=~Mep_RIa>6FJ2v{d;~^|C*2F|FQ6Nz6wwMTM;g^^{)#| z{p;Z%R+m*Ou9msx#DKdNsm=PCYkf$4l5il6ko0ROAP zWw!rE0)JxuEdN&glt1Y=6+hK?DLm;n5uWnj0sgXZneG4GpXiVHR-bWs5B_U^r26Ro z?Hux>`M*^Bq(8-{{+`Q!y8h67mOd%Jk#L#SpYR^v_MhrMRq&J_&EFH?|BOCqe(r() z6Trv9lm89jGOOQRfr(G^PxW8Pe>(r40N)j!`d6=ymD&30_xpsu6+i9A&y8>A_qgFU z{<`p_?{drE`o9rB=|?#Azs_IEkMds>UuNsC^Ch$O?FpPG{s8={Kh4h*;WC@w8sJMx zKKZ{AKlQKo$Hu4kPcF6mtp0@8{3iWZ!2hC(OXueR^w|=g^f?ut{11@-2KXNX|5CWj z>RbI&2-`o}j}zbzKY{B6A*u> z=s`ca|JZDNn}5xR%;FafxBa8*PuJh_dti%C6+iX=2=b%-KQB)D-9Y~9Do$qgr~F1U zx<6lCAM5`B__QDBd`#p&_3yJXOZ&4YZs()sE1jQMNWVTm zw!WbyV{y`lem{LK&*}bPNdZ!SrjXyR@TA|h@E9NbF9ALRy!KuV>wUvZto^j`=5KJecQPx)T}z9?K~ z_Xpj7jAwMur~XdGPyKx^Jn45I@Ud{2t*_=I`6v7a_;mj3e5U%V{|Tr0xrY2|K4n%P z+JA>4r~FoD?!A9H-=xoLh)?Fv-*g+Flj7fW+kdUT?&wZMe@vgkxN82Jy^X*5pCf+N_>7A_ zgwCsUe%StP>nHa2D*q#*+x+Py^Q!e%#Ba&N{L}x9{#T7(?2o)k?UxX%?Ctu~g?-id z4HCKP`IPl1>aX%|^({z!ofOZjv_Gu}a`pVG>R(*{c-?3J)}I*vs{Rz~qcr~fL3-u+ zEuvS|7yhf_7lBLHXY{AaKE}T)zK!1%?0J>OxBNQAzUXhM|2DCY@#A%$?K{NYbj#1` zH+$1>=lPe;PqQDE`fdH1ZsTM2ruRzyW^dQGBLC9zv}*CIj^sD|5-z?+Mh?HKeoSaNPgSsRpV>pWAWqr)2jYhe~bBD z+P_$TRs9m>~B@$XYphGRqd~v=vC|gtk}6O=i5xuJZ z_T0X7f9Mi@9_Ll_%jWNJ?!R>WZ2#+!{EGYQ()tSf()cmHyh`=Uh*kAR{#EmPS@a$B zl<^x9|7++~`-kb%VqeVP(*E22Ff93BMX%~l++SAp-{yaeZ`Hpqa|^xd`V;$qRs0R~ zs{ZezSJl^w&a1S)I~Z5xw~298{E6^h;oq)b*5B}7)t~Nz@a6SwQeV~jv-mOpQsP^F z9g_d3#P1i~;*X2{S@f#;W&7uCu^*?oRr9Ox--4UZ`r75)s`+dC^Dy>R<9l!VkBid$ z77?rZXXD?7J+IRB8}(J?ANxbq{9i%87yU1dZ}V>n|5f$d`kTbQs=hAKr)7S1V$Z9z zK70OP^J5$5RsFU2)}ICOe*?Yh_l-J!%nh)%vpirCZ{+<$CG*T0*a?Zw9?8 zza7z|KUMZNzOC5vD$Rdb{(a5~(Qo0rYJax;Y<|c3ZgiFBKZ0D43tecJxKMS)fJQD4>gcOIlyzP^XhtH$r5_`fQ8kNo$s zmawn-_iJtaU!(I?{jvEMut^s4n6{jc&rCH_xh zT;<=^*PO&(Lg!UEzpC<&{#NzJ=GU;;pF*#Se;K`MeHRm}v_6|ZGm_sJIX5TON(SKg0`CEU@f6U)1|2F=1{Wt%u zdHmA(Y5leFo5=l__Rq%0bj#oNhx6oDwZ3C#s@nhBrGK|rd{z5H8~&^G_2R_g`vn*MFNog?(xMvHp3L>b5@3ep~!oe@wUj zbmj3&`@1OlEs1XZiS@~=w7;vO+x}$Nx43_=T3^$|uUcR6@5@xJ?=G>o`E9!W{$)bq zZ;3vS&Z~5MdUL&W{)ArDznC9Y`UUi={oCeOtiLMzQPHoX^D3?1_LrhRrS_@1&HsDT zpQ`%$56UmEzdhGW$G=*!v-#7J$1j~flaimUAM3BxXZ|Oc997qk7@w;7WBzS^n*E6M&&JRCXX9trU#rjj zTmGh7ezv|X|2gTu^>+jNs`Y2~6EgqIeoXR@{#DIy)8qP3WgqjmN}oy8ZGS5C(*0?b z_`FK@f2-f(+x(6BSJj`+gY?Stn-YB;=T-Y#x9Ilo`*unEm>;}K`&;Ox<75AR{;Ax5 zseSzS-Ky%Jk@|ab|E2k_qgVMi`id7IKgN&O zeeO>S@vFwy{C7)y>(3_kRsC&C^l$dX!Yb|GF!8I_m(^$SO^@}A1AS| zs(%PQwf|NAFG>9P@7q`H4>rCwel~w+rG6X#`22k@e*adwK8B?~aed%bI=`&`7++qc z@i!0Ta{ptwUTSaicT&dJ?3ajNH9r>7tL9&q=;zR@=Km_rtL`ssewiNsK2nwc5%S|z z+W&dcV}Gsc&z$HRq7RZ;RsQk(sVe>w{;T?L`~Dqa5<5UcL*qCZvn7xkC=kNm3qUqY`Mf1Cfk*z+ol-1@x-F4~zY!%Ks{QRey#=Z^3!W_+FO% zDe|it-!61srSoGAvC2N?Kd(~z`0xK#)fe-NSLyt36+OnMs{h6MEA_vHeN}#Q=vDRa zi*EC)ht5^SxAnaz_O^cZ$iHg;v-thkSFMkj|GY~3Z~y&@RgA0r+x$Cs5WakV#{A($ z7eD)}E9UP5%Jq)ith7F>e@5(2h`vRBRev8gh<#Q6meH%mKl)!aKh6K7#J?(f4?3^X z@rnJVs=jfItM&)G{ziYQ?7Jhoiut{cSk=EV^s4+XqCdD|{&k`ADxH7U|LAX3eKG!3 z^J4?!s{L^Z`>Ohi{*{jJAojdU^+lXl^>;eAFYS-buQS+J)i)vj&!Sh=Z}ZQ-zc%}J z$*&8&YWz=#y~VfnH!Sf-MZbz()!$iWPSyPA75`Sh)o1oy#OGByKW7oE>Wln&m9CHY z?_*Wj$KMB3^=AqDDt(UNRsOrstLB&K#riDmPuTM+)dzFEv_Cd~`*ZtJ|4Zmq^~L>3 zm0s*0rTLBJ@k@2fzqtP>wV%g-)%e-{-x^C->Uv?=k*t5<_G`ye{KD4B--2lYuCrX z^UuCtit*=Fy8p%aSNV_etLne$gVt0 z?5p;dF?3#~_3!61yHq#((5w2>711l!SIiGyrSaqU0af$Q*2gH$tNLr}yDPG*$j{=( z{==(u|CkYdIM-?MXMYvzw^XCxBM+X)4LARFVElNr|Onps-9Zkp!CP?Z&UL({{wk`rSsS7xBODa*YY>r){pIP zwttvz{;hxJ-|Dme)IB~{U+Vm;yS}>nW8-V<&+1>0{U^0Pv$y=LKAYb*zf8CMhx7iG z?vG|~dTM^wUyE=1lZ}t*?Ro!7?{BRBRNeZMs#|?SGJmW-8$Z)6KihvyxBTnYtv=JO zf2P~~xBbg>^KbRp{7xMo^WQJ)-}+m3ewKe~{JQOJ{7p~I&-|NibO}F@FZ~Zgf=8x&-zuCIof7$%0TetaHcYGUP({29R_1ARsU-$g7`YpbV zpV`-~r`Fe>@6V;5-^{=1b=N;C*B4u#sk+sls@wdt^=0~`^v~kk_?o@NxBN{{&Cl{T z|EAY{e_-)b=coC%@fnu+XZ}qePxNp7vG}Ij{5tHq)n~fx-)5hxcgg%P-QqWU{#bmg z&+hNc-qyeA&7S|M`I)`-&+51NXYtLy+1vcG{8H<;_-&1YSLyS0%dc+T^0WGyty})4 zTmClxnyshK56eH*|Deo&(^KQ8+Si?5>io3%Yr5^fb=#YN`+Sm`f8GAAzGmyzzts6@ z>u*5z2h&sio4x6&<7fRf-QuU(n}550n7ysPRR5{=mY>yUdTM^=KXv@i$@;YQVS0bf z{w;p0p4wj$mup zzv<@R^r^)C&HUT?9+CKFU$<`c)vc#Ke@eAat*_bfi~INceEmqBU#b1G__jaT=a*F7 z>NEc~KT_?7WPh>vsr@y3%g^jBf9s#=mY><%{55;i&3|ftQtd5&8(-5cKhw>>>9+n& zxA8N3)6KutXX9t_kGeiC`=`}s{XgouegA0l>!|Cg^_zXFZv8d?W`C#aw*H%~56J#? z)c2pd^KbU})g9li@6Faz>$m)i{qH`1J~scU^V90L_^G<(Z~2*S{!O>~EPma3v-7k5 z)m{Hl_iz2HTetqD-hb8YKQ+Hpd#kTY?vGOAn}5?Sf6LGOo4x6E`?va28bVAy}us&Z^Wzg_hEJSXYe3=d3>8+$9nbnrS>OveC+vBaerL;`OEH~kM-*D zKkm=r?vJg{fyDjM)?cb#_w}J}|F-{Fd>cQrxA8UmX6rV8EI+G1wZ9hM{9AoyZ}Ckx z|EYT2@y&nT`eE;neLhOf-~6ZQmfunLZ}ru!TmLM6-S&0+xB5)C{7g6hb?cU2-TGm# zukQTr@BaG}KVRJ6`*Yaq>yq)a{lV_P%sy4O`1bov(=9*iU#fqLpIX29uRDK>Z@Sf= z`uW`Ao1WS~vp3!5XWjYR_*njypXqh`xA<0ns(ycuZ}p|>b@x9tKU=@e&ObGNs=f6$ z)xX)>{avrzUzvT~`cco%#^3s9^_y<~?{xjB_pi8rDE)qUFkj!Ly47#@C#JW_{$lo~ zn}5^m_HXg;?|R++HUFufuWWoQe%-KN)kM)BKRMUPR zSa<)6`Bi%Tztivkj(Yv}?;9QU`i}Fj-k*;9bF}+Y+@F+Qf9lrjzW$`aRP#`8VDAn>zne`)m1| zf6L!=8(-_6<(FEY`M3PdzS+9<$LcfP>a+N!TYR&(`Dym1+x#_q>!0~I-Re(`Z{uV6 znV#A|v$y!B*WJHV|CYb$Hh-+Ysq@49TmGr>>#pDYTYaWm{WibM-s0Q%S^cJ4{`Ys? z`fGZ#`;$6<%)V~j)`#`q^wjxp{!?|EKXvy%wLg}>>DE81-~3yBsq-&2zS&!UOt=0u zTetdceC}ob_xbxdn?Lt5e(CdPtIu?cZ~0sQZGNTdsr6a?=07!mv$y`5ZuOaN`I&D1 z?`8g_>(BgKeiq;CQ{$U|(`|lQes$~CU(>BV>yP`k})OgH~^>z1GCmS3?ymwx^*|2DtP zzvXA~Q|(jzTYUR{y~Q`(;+tN#e~WK=YX8iCs&4%=-Qt_Q>8bwB-t-;$d|~#@)~&y( zdTMss5X7Z}l}>xBi&k?ELTV@l*S6_Nn`e*&mNj zBVPCU^SSlU`fs{je^Pb3Kef-dsqxL;`eVBJPt`5H=@#GY?{wYfuk|-oKkEIr`cvzx z+rQ;!@$1%i4lXbE{ra*f_I2l<>ff#(&DL%Hr0S{94^#VN<7fU;>oGn4M$9nbtW%IXg zJ$3%h%l%cV|2y5@#^0Wwr|PNkQ|&E(^KZKOzrX9YzM5Tsv-7k0Q@3vYPmSMf{}$hL zn;+I6yFan`=HGPlZ+dF}=07$6)ckCGQ~g_g=HKj1PxWu(XL@RW=Kub#+xVGo{kQ(v z`Z((P>=FNbk($5FkGgf6zjf;)GXAOY>-L|TpV=Sv^?iTO-@e~$wr=yw@=LWh|8?t@ zzs=8P=T~=p^Kbn#`)2FYa($^gKkMJHsEhi{8ayDZ@P`2*<1Z)Z+dEe=HK#9)l>5~d($odx<9|B`nT~r)(>t_YWsao zv-@lF`&h3Y|GN9r?D=sVzk2+wKej)cz3G$k`N`~U{+hk%ss0BO>oa@npXHybr}od{ zoBveZ;+t;q>s~(=zuEdk;{0!R{&#wO`+n2b$FW|0{cU!C24sCUJHNW)+x~3&oxVRD z*I&K9k9vP>|F2uO{-wq@|8?t@e`@@G+22$Bo4wU%y7^Dl?fR1HKh?hO{+NH$t-gMl zf2sac?Jd8N7nxKl5+8#ZR@j{lVflTetd6xBQQKf2=<1Pu;rZm#W+NrPgQp zrTVYi-ttfFpZPc4;+t;$v-tOSy*KgmWwZM;n)rOB+4&#GKN!IK{QFva{$%Ul_K(A^ z7wfmQf0n=5r|K5JZr$>)JO2IMzxCJj`+I+mdVOtjeYO47?2o!`|GvUeug~(o)9bhX zG+RIF<74-CrVq>hReZlzdjFKFr|yqt-;-FM`8VCJZ`MEaZ|leEH~*%m)@S)!e^To+ z|5m@nH~*$veA8`wQu}ZDn{NHH`b@X@X5Vbx@;BYa*XpZ#{#bmg&+M&!tIy_VYJL{q z>Z@B%tOe9hka zWA>(7e%7B<-Rd*{R-gH|`kSq%)^GhW-Re)ZH~&_@+27xFo8LA*W^eto@kx!JnxExw z`I&C@r{-_|O}G55Kjz6pw!PJF<9F0`tKa6A>0SBr(bB)4u=qAVQgzG! zuJX_ow>$+U)VU)8ik{&*S+?2TDJ`G<$t? z%JnN%xB5;<{6a7Ne0VSQ(*AczeABHyyMHiy(^K=af8W^Rr|Q-p(=EQ)n{NFzd+V>+ zr^Yw`)<4VN@-zRby2ZEpO;63w?CZ|o{F|QIAG0^z`e*ag?5%#YH$BzA)tB18)ch^J z)o=DzzvZ8*Tm01g&EE32`zPza`M3PczuBki7C*H<%dc+#&5m#VO~sZy??U%JM(Y$ zsk+5C{iw%J&A-|9Ha@0X{_XkwW$FFD`8VC-n|`PJxB83EZ>66PtiPsPe6z1xPt7mY z-s&^|rknq|^}6$`+kf5tIrd+De|UfIPjUS$-G6OZ$Ql?NjqN z`?~Y1+rQOk`eDz{^0&{2N4>t({8R0%|8?t!J^$nUs_zeMejN7xS^md*+W1@lj^{_c z{k8s^o;p6M_LiUNT?g$g|ND%SqTBt4#kbEF_WZ}}Exzd%KUKH*_W9E6>(0;mpBmrh zSE_&OU)_4${j>g9eU@LUUOXQteLipbS$(Ek{nbgR$w)c#q1=0A1*ruw)3Sbk=2 zy7{;I%)jklrl*c?YW`NA`A^kt{hEKv-*k&_^T+IMd{cGnkNLO!t$vH2s$2XXxqqeW~`%&d>6<`D42IFaG_l($BZHK5Ty3{IL8? zxA9BWEr0WG`Pbb)%P+M)v$y$adTM_xztsMuj<401s#|{6AG1H~x{a^p-y`=gW^etq z@iqTuZ@R6&)cP&H)t9QLj=%NC{M-1OeQN!w_EvxD_@>sM`g}gMKW1~ z%ird=#kcy7x^Dfm{#*U2{w=a+Q2^_gz*54&#tHQoAa_NH6^Q|;~fl8v9muiHM=zvXZ1 z*T$#r`C<8|>egTDkJ+1^nty8lQ|+xksr8wE`}--Y&veVbHSzw@=7;5%dVgW|R=?$M z{W1SG{-&FM(=C6CpV}XbZ+hMFt^U;fEdOKuU;}E}-+$Wp+WNBjld4;Ord$5ao`06V zxA<0{*<1fob<6Lt>()QZ-|S5{|EAmgGJ9JeW^eP~?3>*moBx)- z^*^=07C%+D{8Pur{HNw`_Nn7*{_XRb_0RG%z1jV>{#gE|TmR~=-}1BiQ+11q9sj!f*X;WjtIu@nugwqh zZ@R@l)~mmNwEm>_KXv?jYQBH5{A_=={+PY>-*k&__Ex|7H{JZ({%5+yuUk*eZ#;2+ z7r&n@{e3~IZv8X=_V+htZ}Z3OO}F~)@4EHJ^rPONy6bDU|GMKhd;E`jea+6l+3{27 z&z+vX)o*&;{ZEabYM)x)QMb4LncnRB>&~y){_Bq4?D0#Df83wy=QpYSJ+@El@A3Rh z>)%nIe|3+4s(*VvW%}^J@HR^S{Wr6>@ilwf6{&m~e-JewdN8LVk{8IO))cAGx-~9K>{ejuntv7po zY<%mk-{PBo*!ySsHM_qS-}+y-UUz=xzu9`T`)l>5=2y4>)cjKI59(_#|L^}<{dMbB zpT#$O)6Ku>=D%*;@-w~J`C0sC=WqEnTetq0Zuy(N>E_?`y8Smhe%Y`yOK zQ~fvFzS-k**yE>;Pu=z1-}6hY&+L!7UibW}+ka~Ro1I_X@ejLy8^6Pz|8aiRzfZ9K z*!S0_+x+RupP!fh{f7BZ)l=g)+dj2^v$y(8H~*>nVUJ&Te&#<_xACdlzr{D*@=LW( z^>6V_xA>`gYW%})Uw3}yzi!>ezwY?v-|{oP+5Rp5vEGPR)9&x;?!V2?RNeBg+rP!H zTetdBeJvF}NXZ|fe)6Ku>mcQwipUn^RZ@T$6z3%+Yztv~NDN^n{NJX zewn?+zrX9&zh>8O^E*|y`fdKC+M9ptf8FuTzvXB3ng3MX=7;5Hy47#_TYhG5y5(6V|>Z}t}7{F}Y$)?c%?{OZ=NzjfDV@eh0dY<#S~x^?Sc z-SMqImS3uUv;80T_?BPYy3Icuf7300v$y=rzwMvq-}Kb@srgxa%ir{7=T~=qR=??~ z{W1TxKCC~cTmEKm`B{B+$G7}b^GmJY@-yAyTYs&7^Ix}p@%K}u-;Y~->z~=D>UHkIg={zh-asS%1vG>E_@1WA>@PZ%B=A{WaaE_@1o2sYgXZhEyTmClwW^etq`Ye9kdfoM<_Q&$G{#gGl zKhrI~-9MRs)2%+s&vc8QYF~H$srgy`sd{RD)<4V7>`kxRzpa1E&vfg5s-7C(`rB;% zPVbM6Z|eA1e^cX||5V-bGykdmtJ~i4xB4wV^Ix}a`Pu$#_NltXH{If!z4brUzuBk8 zH~&_Ds=ei(s$2f1TYRhEbc=7gaaKUKHAY)9a3J{%!u4z0FV4&A;j9zuEQGJ^t1o z(=ESL-Nxsz>sG(buftwnYJOI~>DJ%6=dby<{LS8U>%aA{Hi|<$tUn{QHQd|2}8k{jvF*8b8&)*{ABM^`+X|`ZE7!Z|mE1 zi+`*)cm3Y!{kQdR^V@XuZ@P_7-S)OW)Ez(7zxB`b)cVcd{`+!=UAMnqv;3_;$9nbk z;kZA?{h@LB%ncz-zFAFB2TyT7=X->;PZ`)kF& z|5&Qq_nQ{qbo>6u>QA*#^>6V_PmP~yZ~3L_srjYar{-U`z14T8>(+nkPpZB7KkRzl z^{4tb`&7N|@v;0YzS)~@{!?{}Z@R@dd(+K-s&4U9b<5BEn|6VHyPjHqv+b?FmY?b7|5&enK9bs>)bVMyeQNz?Uw3`x|FG+I_pfgM z)?bT%*!BB+eX0Go{-o-u`I)`tXZESO#ZT2!^Gmg_JAd<^n!njw{ATN^`PXfq>OZx= z7TU$?#azti>9@v;7yf78u>-MZyxdfoY%f6K3K-SRWt@=LWh|E8zLZ??VFXL@S> z=HGOSf7JEV`cv(XdjBkc>rbj)cYO1I*!5=jH?=>O|6%uU`B{CYn}5^Izv-#|&HkwC z)<4s&{#5%^{}#X5dfoMzf77i$srIS<_zc^_hOy>r2hA+4bAsUv?dAFXexq-J9#Be;-=-FV(Go#owQn{`-YypQ>AY>z~E% zm;Rc)#W&sjn{NL;uIbJ8pBg{a-ujcOTYjl}YJO&K`PFT2{!{hT`YgWrH{JZF>Z$R~ z-gL{~>`hPgZ}z5JeyO^}H$63es(osHsrJpzKQ;cb{lN`f)9z2L|IMDCmY?Z$=U=z~ z)cTs8pXGnpb?aZ((FBtv_a;s#|>1 zQ{$Vx#ZT2O{$bax{<`z8JAU2%Q~P82nQrmT{;2C#zv)(g-S+0+bj$y+>sFuXR-f6M zZvIU-|8?t@-(lD5?vMGm{v39D%P&<=?N4fav$y=3t*7R1_Q!hl^VihzxBi-cvrpA6 zeyVQynSZlC?0RZ_b=#YN)2;tzZ@T$6-TbHO7XPU0)}O;(pXG1*VXx2r`yNNVzT)?d zrN95P`b@X+HG9*|f8Ba&eyR3WU#fqzPt`5|RNeA3|7LHx`ERyv`KRhupZTxbzS;gQ zzUkJ#)cxJ!n{N4~>Z$STwm1K&dfoj?&F|R0`uT_Tr|#cpSbWoM{-xTR|GM?m{LS8U ztFLZ*^KZK4Z+hMSEqB`Ot<)EZ@T$U)$RT| z)xX(W{YPE5`b|%*Kh?k4r|PNonf+nU@37}@{i{2Fi=V2e=3lpcs(fh{5xBN^u|EAaN-{Pn0&CWmd`-^7h-|YTd{ifUZcV^#gz1jW0)8ilZ z@vl2S8~?h0KUH^q=HKc!d(%_>r`o6HXYre@r`A`ueck?3`=6Sh#W(+^oBz7?X6I+| z?{vNH@i+h0f3r8eZvPhluJX6x2J%g^jn^}6Gm|HG~y_WoLa_V>4DpE^F~KUKH< zQvIjer#_#s_*Q@2dTM@VZ@Sf&YG1d1%dc+T>N7nxKl5*TYW%wGEq~K3zf^nkpQ@+k zXZEJooxjDeTTiXe>{IhM|Eap=chvn`eWs_@pK9Oi{OXQx{!OpDzZSo4-Ri45{$cl@ z+8?tw-TGtprXO|xsr6a?b?cVD>2>F4{ttV8&CdU*_owduS$|BgJ3sS()b->3R{uWN z`je`s&Y#ry_WP04{EqFb=T~ZfZ2VLGn|-t6TYiUKztj7dT7Rm&&5u<7W^a0GeyRQ~ z{;^)~{(h(T*XFPNzTf(1{>?sBxA@0;_4>NM_a}9JnSE;iQvKWKk79k7{`aj-xB4u; z+4mky&qir}W^eHez4YI|>yr3Axn62-y5*m$Tm7lyYx!CHy7i-;pXHybTmMu2-{0-6 zf2Lc1Qti!us-Bu(-S*}`RZs1o*;{^QZ@T$6J=K4zz2#T8ZuvJ`Pp#kbH~(heY`yOM z&A;iX{W1ThTYR%W>UwJZsrJ^tRR5{=mY?YsKUKH*rd#|}d-HF4v*XvDpVe2lUUz-X z_HXf1_0;i6jc@jrpV^z9>c4LLqwfE(_uulXTetBw-STU;z2(iepPIkfr|Qkl-{PBY^_#uv=08=p_=jC@cKxaGkGlO~pC6WAv-^M8 z^GofI)t9Ot_54!nPqnYRf9AjL{13Z-%g_2}y7^DlQ{$U`s&4hw?cd^?e%SL%%|F#X zwLgd5-uh#@)o1pmn}5?&{hPh%cY1zx*PrUY+2d#Vn{N5nty_Mk*PWmFxBOCdi=V0= z_54!nuiM`GYw^wAbo1YA-SSV>t-e(MW}h10><_zMcYjj-H@kn9zv-60*{A9j-*k&_ z_I2xZ=V$&+xBAWAbn~C8r^Y|*_Nn=$_V?KS;1BRh|31*h$8_tj*_+;M{}w-0xBBbW zQ}Z|by7RBwztv}YYJTS5bc>&A-)#S>@vVN-Exzfg{+n%IcYWsnuT*Khf!>UHOD{tvru z{jEFyX2)-KeO7;}ZuOb}!)|Z+rRvrn(^KP{y~Q`({F`q6O;7coYH#_a>Xx7Bb;mdV zmS3vg?D);jzuEO$eABIeW^a1k{_BpPn!nlCt*7?K@-zRYH`~9(zrX9L<5PEk>dw#n zn{M@+eX4HpQ+3PF{F{BV^}6$Kw*S=lW?#2%^CLCB`A^lGonLDFRD0{6`A@Ys|E8zL zPqnxFOt<){y2Ur$;-}g-+rPy>*6aQK^KpNV`%4FE`+a@g^ULVH>6ugK5rO+StEs`#N-&A%>m zUZwr}zY*W^tI{_}t}6dw^s4>utk~Q9=*FH`X@8axKfgk6J1{S|xADm-5207> z4^!y8T5|l;|J~xPs{P6IGh%-t4_O-D=I71azI6U{iT~MLFTH=Z`E>>Rs{T*X{HpzN zoyx2FdkOmoSB%d%@vFwSi^{6}?}~k_@2dK&KV8`KDjnZr`|AF59mwVVyM$gfKSHmX zAH(;;f0cc#@2dD+;{Q(9&(WW%^=bMx_EqcC`a6d`uhR9|bs(4P#riGXKlhnDRrTEz z{fy|_qIXOFt+`&Bzv(B%f0yX<=vCtv`!BE3{JIY0^6|MS`@h-W&i$9h?~(Y!_d>6# ze*pU`J^WYcBcczX^Qx?mDOS2ZVtlINpT)RJkNdkS|DjjePoncG&3^^4%Kva!SJ>a1 z@vX`)^5<3BKl}XCDfYK=ofJO%t3Q9cG=8yv-DkZw_g@-6`p>IWKP&nb(WgYW{&(f} zrS;E<|MQPLIH9yYvp0QI@>}`b>iCx*RIOY5|4Vvle^2N2)z-iNOZk`PcTV!Zmg}Ya zQ&+B+_NOP;OXC;!FQxjj*bnD=X?~{L{xQVn%d0fMqQ27l&42rW`||zO>`x@x+x)#C z_1pZ3`$Jx({j>SKo!3`t-<9j7{kQzA|EAmhW548Qx{d#+__ynm#qVTgRo(w@Uz}|H~ON! zKO1QD#X9;vjyvEt^f&t2;k!7VhClozjlSsPAMt*S=lDpYZy?_9YxJ!b$7^ulS&hDh z;{BWO`?1@DFX6m4@_5BvjlLH69@qx6&%MZ|-jjCk;!Fus4``E=hf zT>r90U#y2uJfzWg1ODdSjj^Z?W-Y9v-z2|yl5*GAH^y%BKFqo~{sYdB`d`-&x43ZzGP$V-=3~Hu_fJW3k(WzlWd8@JG?(Ib9p| zUw~U2@4$cPY>b`HnVo}YCmLgCb7p7Y70%m*-}RJ6-!=Hrr_&E6>ud4f1>gT<@`k4# zLEext>$}Z)U+`@5;P`{|YXOeZ&nftGoIe3SOdrPJb6(Ks8-+hYoNF-7zXV^x`R8Gr ze+FKFTQJT)4L`-Wv@zo!HcUU^7e!p&|7G6ahfn1A7W}v5*^mB1um?uI-Eiz4@`ryx z+(F2k>g)WRMq?NI6Y$qy2YldnG{)L+0z_-9XR^sT{{a^6aDJXdg= zN!?%_ZNdk@br|C_3^%@ z`wQ?%jLR7~NdLFs%NdUa*#3=;vH6_Y9Hf-Kj=P|8_Nm+C_dCSD1%I4% za}zEx-)=DppTj!84j)0id+?(%Uvg#_3jHj6K7HMWao!gE2n`5!f?r5KI^jonzYTU0w*hDw%h7vK|_|1&V^pN7|{Zwmep z@h9MSaa|gN|B?5*;YZ1{72f2y1+HUvlOGZM5bNPOd?@~}!Jo(O3T&{SUxI(h`KRHJ zasC>N`MV4w?-}@T*7X#OyhmZor~S`kACC13Bi zcpAp}Q!vgynKPS&asDXe|NDmdpP08pIkQ0+dKdgb@@a#S?=9AQ)O!=Yo%fgF&$G_Q z;OnVt7{)#@2&0Yx82dmcd_R4kd_;bo9fvQB`0z8a|H3D7JOpEZ>3|*N-wvaXZSVy1 ze~_E1Pd;mlI{hgfI`CK16moqyHy9ifU&kOJt=g;TNW*}3c zZwme`@1M+>O~98i|Hfd{I|933*%%wnnRUU4(+SyH`#Rurxc;@kFX8z5WAppGEAUzL z?J|55@h`!LznpzBXLcS&{paAf6Xy)v=Dv43XSP|qzYae`erq|i1^C6^Kpi==Ss3}u zz{qC`Mm`g{J~o~+8-+dSLooKE0T}u9!^p1}K8*Z&a%P<{?jPD<^r;no3-hi4-^TH^ z$K>;37l!>+_yyQs$(ilIHO65J#{5`;7g$e=Fy`gSg5z)|`dqLRJ_`TsFy{T0N9Xf? z2mTxO$+IxVbqhw^)9``ZUu@>g*5EsdvjTsHzMO(T_Vh;I5?tffb}?r*SLoAln|@8g z81Hd7#dwe9%!Xk28-U@j7lywc_*VRN=gdwNdMgZnw|OuX>vA9dcgF8l&g=?|`FR<} zI=%!48HZIE>w6K#dRu^z&m6pg{cO%`0!Cj4VT{WF{22R5FMK=ffv;qr>xBEnZ-+ll zo^3g^U78#3Uxsht{YyEsH5hrEgptQ2%&21&#ylB;v5tn}U%iz5J!jSn-^lr0FwX0Q zk#`JY%*)$+KN<6K7shyAf>YET-&4HDRJh?%0?uNVYaqueKz|UpazewFVvy1R0U)LDBkTY9@ot(b{PjTJg zv)jRZTYwRF3jP^+%yPYm&rQ=XJ~vIl7vDquUHRvf28{jSHt)y%_dbmLZ$Vu2?ZN2B z4t#CIgP+fJX&%Pskp6qPAK^Z|7ryg*S(iDpZuknWbDi)+JNplOI`LcKf2F>C;{Gz@ ze-p;%mfhm`N^yJ!{>V4c=bYIZ{9We54E&7;(O38>{EWhmuWgKtIrvEY&gRTc!N_+JcCqdja%MeW%;!w% z?}88IdfJ&Y>wvH0{5JSe_OTWi`&0w|BKh3>qDJEb*j459J-&VZ8{{-^m{Y&s$x!+rammf}@@cq~|;P=w! zy)Wc`ig~mPqs|@puQ@(f9B;#@djUHTYrX)h_%Tj<;Z( ze>!Kj0^d%3dt5~RoO-UpvkUC^IkU^~iLC!ium@g*@p=6mWJ&gIK|VV4t-`n-EW%6d z4|DJ|eVm1H-JOB4K2E||A7e1~izjMP#xV139>zSIhEHPNOy$f@!jF9w`$Eoa z9R4Kvj==ES3SY}OUS+<-b?7XNec=p@c$+ZdEy37-7GT7ig{0Cq0sBcg82uS9j)T$9 zG5BWu4Z>K*Lr-cnUcmexgj4LF1Mnx9fBiYLUO3J;b-_1a*9qUw`R(xGeBN$_KfpR_ zz?YNPK1q!5{wBvSW8SR5uO-eYIEg+3V;!D^uj9UT0``!93!Bjd=ilTw&fkM^{zVw) zpNDb&Ss3R}bN*Lz{y2>DM`4`b3*-DQ80VjWasIid=br=5!mnVRoq?0g-&Od<%!gC3 zgY~}zcc_0cXEtBxGlf14zW{wIXEs^rV=z9ikHB5}KAbZffPcbqf6lBM#(h**&g=w? zb>9IapPK`Do_p|bpTPYEjL*>*V0@n4f)6LpP52w+v5_;If$=%^B;4TqF&K9JFh0-n z%%t(+xczzDyqbaGUYI4!?~)?!bTbbovkD^V&9y^Ect! zIB&T)UV>kL5Azbf3_o))K3C2b`bl_@A6#YM8i8ToU-0@<@yq*HVB~o&$h_Wy@i~93 zI9`EK*Ak4nCLkX<`r6?uS+}>Il0V1Ug)bwYD?#$P2&0c@;LlUfHjL*2Tkzk~&(k@x zr9xkT2hTC!BI{rTzK#5bVSG*>gpucU7Ts47{}TKn^0@%xbNdF2&+Du4KI66sBi;gR zC*FL{Y#N@!ZXEs*=Z(Rbr=##)#2J7wPx_1F4)`Nn7teed>jwXuaF+XlH5l)cYvWVA zKL^>H`i9}_@!t>MiND)l%JaRu*jM4ZxUOG@8@zuB{si{qa!}6}jPo}OeWTD<;14k` zPQf0=?= zF#5(b-+UZkJa;$^W53wUnYF`LP-hE_&q;giZ}B|k415pvd^gY-Vjix+Z(-iA!ni+O zf)`>P!gxM0!b!1T4Z;6HzJoclUikk-{yDQQ80)14#=dj=%NvbfXWs7T%&x)rF|W?S zc%F9}j?$-17=Cz09L!c>>`zN@n)BvhJU=@L=Q*AzI0|FE55tErx&tu$x4>B6x1OE9 ze*?z8bq&TobQR7sZ+GB%>Rp2;seb|f7y2>>R@GuhH?EGhQE)$AsE-Oe%SH?`VSw<{Yy8D>s|+p`Opf(exIbc_3gV3 zxh3tp3Zu>|IkQW}`{!ZQdoE|T1>^g#O&H&oEyFjDu@B|Umf$tUV-7~WvygkuzG*nc zJ~{zE&G=s&&g)-?QU59=wZ2&xbx*^ndlIfw_c)BaM`6_631c0!!l>`obMyLc!k6Oj z28{D}VbpmM#(m^j82vc|qd!}aTl>CM7@rfDVSL_Pgs~qk-)p4Tir)aeVbT`E!*kF!H(#2dRG>c5vQS=#2LUjOQz>FrHs5!`N?6<;)i0 zBRPK#MxHY;o(oLHG5hGroY@$R@fm?JKD{u;rzdCD4P$)TVT?~3jD7Sr&5!Z90e^w{ zbcMdY6}|Jvc^;fGf8ZOxlXZ|YYlB}l$2!QFwZPsNHpb$i2h1+Kg>mM4+nt=*HvG>V zZ{^H3;LG^@u%0uUhd;`F&lLP=@|l2t!t;XhoY@#W%kgN=Yy`&h++N6D+SdbLMIXE1 z2Oh)x{xSAz{NKu%or5Ro%USqk+&7$oSD07Z@SB*QTcN|#@K2c^oA3`Arw#aYt_$lq zvo-i5_+8DJor2H1i|4mFvsw58@|c28p^qowXWqc)qMX?T{C)iP!{7b_@`cZQ4WF}f zW^M4jUqD}TW-V}#`u113e<$x-@DzF9g!}LYd>wgThyV4dTsL70L+}#$55OmN(qH%q{B_1L_8su2crMYNGi!nG z#?Q4k^Lv5EGS6WgUxe>tpFIs9LcC4*Y2M#}(cg90f_@4z44f3qIuN6Lzd~g0pqw!R@2fv?jxCZB$Kf5`z ztMGd4vpKUJ_zvQohfl!YHjMA#HsPCD53|MbB#b)7VdOnf=&g|N6#A~NFh2D668t{) zwHx6KVVvI$qc5E>`qBZTFD)?oa{Gt#;~Ox}+k+ov zKJOOqUk&oS=}OM*0u29KF#59sqn}Ighw--nBkx)Gu~;{-h5dH2cz>*Te+WLG^E->< zR`^ZS-2%h@`oGQlbQMM&mx|*H#qk-~jr|skdQQW;$#XMjwg$O}=sN{toR?sX^CFCK zo`TW0ZW!~d6GmP8|Ay-*$G6}t<8%|=!|@)B^UlDiXB);m*?`fvH5m0Q!^nRMMm;Bs z<1zRk)<-*xzO})~zXeAA4cJNkx0er?-GFi4HTVS1y9&ea4qV~~N1%B|c)CK>J zdS_vb-!zPRCgC4)JORUg9Dd2?a-Rp^h5aau=ZC}aYq+lU7soxJ)34DV;`#R^&oOgm zL-1$uHvmKLh97I?J_$aSeW1P2TVeQXDc;}v*ZeLByK6A)F2gwgJPiAF_-hZL4)|B> zvkN)18Q91A8-P6P>FbBT$n~`sK8^jk9o|i!+u&bv>TMqC-No@f{CxJeTd;-WoA5W# zuft#9x_J%$6ub)mnD;NjJ-7qoe&Q_r`RFr@{cWi@UVtA!ABAyWa`6<`fBJj@KAQ8- z!~gI+>|w_EZNUfO_cV-rH({K=UcA2sPvCE*c>fd(KcjGk^M;G}2aET6;n&mGZWw;M z;8U<~hcA3Q{f57HH+BC2_s#GcJh*>?zlq-~Fn(Wh3BI4>3-J56AK1y6ormA>K+!)ot}fA;C^BjKA!bC2A>{z!+V~>z6)c%wZm7DM;rWk;_iKaqp?X{ zmtnkr3C4Bh0=)5H))o9g#(N8X{QG#`ku%$bkK+DlBWJb__wm05FLT~%&TIuflJk~x zW=k;gTZEDC0_3~pzB%}9T%V@lgSuEJ@I8EwF_AMHhjASpgOS%D{08g>VAR!su`gZy zfAaUQz^HEn{v7-GI*hs&;3EB<&zX(GPm;$N{0jDwRv7d7=2D*Lbr|{{4E-XEzHh=` z;J#@iXSN2vl6ABKzmvQs;p^czjPV@%e@0O&ImA!B6o$#%j)Nw$LYG z#2bTu{ZPgaZp1zX$C!5w7}xo|H}Menkz6NW>|a-5M|^*oGdl}^g>^j%V;+vdxStz= zvHttvd+B#?&TQ-Z@_DrhKgRhRF!t9)*vk4Fg}=-DBk+H-zHTq($G2eAa~=K^{`PWa z*Wg9Y--VI)4*VUC&%n6vISu3cvdx^?I*d3gklzsWoq{o*Ct=L@F&N`I3S(T`;RCro zw7?H@pLzRx`8-P>_F-H%&cWA3JQ(*m+wk8|_bU7f@>z!S=u7agSPyeB`ZEh(gZ&JQ zK25+~`Z}I7I|2U&y&b-kI$B}Gx&1Hmyl%m$Zwr2e_ZMJX=cZtc!$}x@orK@~9Q?!I z;{9qh;!?E^8Vj|QRj8|C*-@AGuwr4#NReN z_?!kOm*@kG{dWb%e!2{AFpj5S^mhsVaf9)P;dcRkH|Nj8$a4;UO$+^k&tt!sfp^`* zdWNw+r{IS<|0In0Ite3gJB)SP0;B%h3tV5RV;?@0zTAQzC*Lc@`xoMvaTtZ4c;O?80%#RhW%L>_H!`KpMnv05dOF4u@Ay4yx#&p&V0H32Cml}FT(J9`MYz! zJ22+SX~?tvz6}_Cm@3|%fZ=BhK8AXSVfZ;W&wdCeVAzeou)FbHd4A_%=&LY3pU)TX zPr&HI7<>fRkx}>|`r1*vfAwGRd6WB#EAShrXBkHQbMXClF%Iw>naAU>mHv*xM>9@s zam>2fdwo6+cj3P${#6+3_)Kwp8pb+ahp~>=a%QVA*6|9Abvy@S9Z$iSe-kj)@p#T` z6h^!u80&Zt#(Zgo(a#nb>$m}3i9>O}m3V)gJfv&)B<#Wa5oY^J#cKUu1egh?6 z$eHcHcaYb4_^0USU|j#t!l!e53cj8Emf(Ll!Fqu_o9~;32jdEPw$L{U{{`_za%RKu zDt>$5-%&?5-A8+<(eT43bafZv4O?e92XwhtrETkz}2^JdQM28_>n*J0$j2P4m2 zxX$r5j6AnO=e!jd>t+%@jBy)-UrQfH;R`u$5QhB#{8G;Ahfj+<;Y+w5bL}BoX)_9QRg;{eQzCp|HHYy!`Sy$;oI=H1phgCE#}M?VB|FqzmdG= za%QtI>Yjlye$z1OAA^zCFpPOI2qV9K81tG5d3PR0edi#5)6jPo9^?(9pDS=0yXBnODHwS#!EYh&#hlp!jD2w5x59pmufCTyT!N{i*o+O_W zIkOHJ`Lw~vrxiv%4H)^{{PsMb8!+;@4kMpE82RkN$mc4Ie6GOA=Q50Zc3|Xl9=@7< z&gIO`!pP?g{ATjm&Y5k&=iuiwjC?j>fzYl*v=Guwb)#r1C;M%*r@%}peXHTHM;{6ub`h{HgU&-fQ_Qfmk zE2(1xK8O4HRT%lKz?(eJUCx;e75V^-=W+e;Gw8iJvo<(Ke_G+I>Ep%e{JOplzk~M| z;djD0*b(;uFrGh*!01;eeCb1YUH}iC1AH6LL3r+QDQ9*L#`A?O7|#!u;U96l0K4ouqU>A)0*c0$m zcX9oK@8!4^#^>}F7|&%I@B#O5pZN;%`5eX(zMk{0!8q>{jOQK~;a?JO2R@$T^Dy!` z2P2=eF!DJK<2mjr81Wa2<7pV*BzYgC{+-orI3ogSr{{nn5>-#K>x=zD4@%|co6!yz7>Ru=~2jla_42;jmC*cQK zXX7xQYmdQr-Zu>6x%v={=YIV#&ToZ}=lCL_!)-(gL;Qx z+^_ZrdB3-Kzo&SAk(-gYADw`4ogRljM*J}t{pf~6=p8Vg16=1OA)W*5!Kah|E{u6_ z0mgHH^YBx|Jp+G>&wtxFv#mnkEc7+l!}?v#nXMH1sX||XPeh;3nRURJFZ>PE!F-9E zl{mir^8C5kJp5{|2Xi^INf>$?jOSzx7+6AWztaWZ@i_d$kF$>VxLJ?;oNMs)(FKRibv5e zxB^c@exusA3V)UTeiFuW!BH6bpMa5nD|`U?w!lxae_!Kf`zah>g5htcI6ea(%(~w$ z-d~2l!}W3rM&7eJ~sgWkUDNm@LZ1L>oEN9!T7%a zDts4yuH?)v!nh9az*zs=Fz#$|DgV5821IIVAQ(^ z<34B>#{I!GjQf!(80&Qc{!iA~IE;8B@SBM@oHHAO5pNLk|6>C=vwrwY#gAwmGH%$?5A4a?#7~^-Fo0?_D^#+Xo?ZTKRmtpwXf$_VNZTMB>vz0TOhHs&d z<1of`490WpVfZZO`w)yc?Xa7Eo_i_t@wx0bFy_lTd<*BV!I)>WFg~B1gt7mQ!iYZt z<8#?CjL&65Fyair_&TI+Bx>$g*F6LpZi)k3Y-=E5vjlmbAkH9#87{>Sv z!Pqwj;Ahycu6#B3ZLuH0$ZH$Md8@_y%P{ge1*4BkFwR?m|B3t9xk4X@zee4IFs=ig z@S_}ez^L=aSLJ!^!N~h6jP-gNzMuKE2_xHu?^lZVm*K(RCBs-BL-1{|A3m6Td*K_%qaDWg1T8S;&HjtI zUcZdrQ{>EcVcefwhS8r3@L;{cm(zz082;Ab%kZ}X?-{0FFwXCUas6)%;%QyJe`82-m$_#cDee;9`UAsFjv0LJsH4%k5-E{*2jUtNH4U$PG4 zzGMx4F7s{`9y}+6&t|<(!-MCh@JT!;Jef1=g>S`wC%gy$>tB)kpMi1Tc@oC=CX+Ds zhjI8}j>llkuQvFT#J&C^o}WB|^$ugd*nyGfc^LQY=V0_{9>#O$Ik@m(>W7in3_QoU zPQ%FiB#iHG#^IN8KRuQ+>wxbi{^b|)dpE}OH2kB-kT(oJLoo6kgpqGQeAi>ye+!-{ z*aqLp`>in6DSz|Wco%i>w|xhBo`&(g%_$iB$RdpIA?IOS&*ySx4fu1^dF=&Ur^w?X zeBWK{C-671pNFp|j~N*I@-&R={TPhveJhOX=gX zY`jmMGdZ(q80&Eo{sH^=M9ypk4lgmDa0m{-7r|cmT-XiYL4Lc#YK0tnR+1FC&H-9{T{~G)$ z>Ny7=!+y68W1m}tzs>o}@aOQq08cdV51+x(560hl3>U}2_&bjw_}kpybiF&zzY{*5 z{7>Y}I^YM$v#rou;bYKSa%K(q8Rq5wPx85%^?M7x1N~;s>;{a#3)zL=JHoyJ-->=Q zXLg~`&ldU?jL+w*@b9skcvsG0_?y&s^_}EHeV5@ck=G@7j`z1xX~F`8|c+0iVx4u>TI8 z!(n$5a;fRN1{>6Iwm6=E+_Ibw#yE@@$H5qf5g6<01pHjCr!DY5;%9$7zt6q~2iT9! z!q4#jX&Cvg!Otb`3XJ?l;UN0T+xZ;IzPAk59>RVH@8e!uzL+;|2H+*v~-rys_z=*(mHGpJ5pJ?7lVc%M}=T?Z6K) zZmTfrI|aXo{dN{ceJzkJ_H;1%)F_UF(Wf2O!w`Bf^z+4WF!XaU=JO_eY7ce5Sf8`+ z$>;YB>}38;=gg*H{JSla@Ikykkuw{IAH)Ax&TJI^4dXcgqpmg>pFdmRC#mE1CgaX{ z+=Bm|&p3P> ze#UZUqcHpo!40ktgE_Mvco+6vkiSLgYk{ARd|9{Q{|b!#<^p^=@1KXiO~1B^_cvke zSL-nLm1TH>^TyyeG7iBQhtc9V7~?Pk-;Dnrc-Ii|f2P=9;A6@AM9!?Ec)uM!gZJBV zX065hEwGFC8#%MvKb`Ln*Wo+xe->^$j&)odZ^BnIUsvIqxbCdL2Xb9ph971=%)>bU zB)l4Rz^8FPFbr>TJP5;Y7d+U9A(x`Q7P$F5=GAGwM`xaHzzdwW48ND>Z>Mr*3ow31 zG7sZ>u2~r0GfuBoY@47=LzF5&KrRrr;o!qvwql3zk6Wh(+I1Yxs z4r4tpz*xtZem0*+7vZCs7Z-A7JH`9w;TQ7$xt!S<_%!O+g1h{lcNM;ozO2CL&oX=l zbu7T>&lHSxJ_i38cEj-3m`~j>>^orerv*M9{WkM5-rs}a_Zkd;JMdl4V}FEiqP}3% zH(eYDqrMS%gZrLd80%zdi{C%7KTg9l#2JO3#@{fE{rLopb=rV&zj2#9_zre#KWDZF ze~Uid`Z>mhIZ^7}uX^IE6kMd=&c%{G4ZT$$GVE7+_;ior_VHdnYA3JkqCyMvm;3s*%HD|U{^yfT$a?FRE*#?aHv<$zFJf^p~ zU!;#G;V;sMQTTH7Vfb}?J|BYbU_AQavl!nl_(;xghwtS5HuxFpZNQ)9_Y${%{(#v9 z_zuSZ9E|T-w%~{3^8)-0>e_@?sdpLv7Vn>ezs~z7;d>v7e>li}UIV`8nar;b5RdWL zfj`E$o`Z3nK2vZDMxLi(oVNj=yu>)cALIQ7d@t*L|NUHNsQV_odN+RHPZMtw#`!C7 zjq?}b$2o5v?sah8fd_fPH{L_t@PE>e7Wl{bX~3Jzt9|-#nm*jhneD>2;cp8*lI#2$ z`~dTF;}^NEvG1(IxPM%QPh*@`a%Ri$ogAOanJvL9%#%g<>-2R7{tMM^0z2`9dL%vc`cB?vFkf~hVSp0M{DrY@D%)SPoPftcE)28ew61c6R?x>2jL3w zdJFFT0-tAjuDS!)nFq7*Mf70?zL`8u!sqe+1bjso_V6{t?}xEodto1S_2kU<8JBC+ zvG~jE6WmWNz^9_m=gj8fedfmuyqo$aVSKMY4x{c-7{9+7hEeYj{2-sV2jL9ocNOn< z7Vme!=V8|h-%i{Xc!s$9zr^=-jK>Z5OON9|8%F*+@I%bEN%$1a!XM%IbR3i41@atV zo}7kjtcUBr!uJK#aTWe5elEZrxKq5p4bM{lI&5XU=8NN5_>o65PauC|+qZibJK|h{ zkA`Pq+_!DOc&;`HbRgAc^+3XC|HVfeoQKf(H)fKO!~=!ZYRRuPQrVsCLAjO$_> zjO*e);}rXJ_lNl2^KLBcvm20qgQsr?ekb{D!*7FQu=|13 z1LL{c)qlr$Fb}W5U*i7la?b1$T%wMPaESY|bMQNevkm_}{n>=E?$%(ek9qh8`ZWRn zfc<0y#&xt8{uOp@FxF>F@&1i-`RDg*aE5(x7rq9bhU<*`CcJ^&0*w6T;TiIq%bCr> z$ZrNlekb8Q)O7;J_3|3y^Sj)S?85hv$3+F2fg)=LB44z6E2xjTgtkm~Ue+?h6KB^sDtF`MBQrO~xO8doad*7shqw3XI=- zU4pNKXJA}sHjDSy;S}S#20zMvx&*(8JQrbn@3;Wt`<2B;BOm#ckB~6v(qs8xCWww|6J!jSi<9p;=zs|g5U%CO~bKG_KXx7Cw_| zsT`_~4=}H@`}m#utA(GnFE#PU(!Zre17Bi3)HCCKgGqm3{pIrkd(8E8m3h6o$lRw) z(u0lmG4^CWa?yJ4W%{Xy-=n?VrA0H-PxWl+v5r4kraR)J(l4dO0eiJ`pMN5sZRUFg zn|!Hq*Li>Y#2SBJdsdn6w=VNG@r(R+&M?=7F|O;MLEg#%=KZ36-b1*RKc(LF%zD54 zg#C{P{2ldO;&%zpGv5~)V!!YpA19wKCS7ag$-dX|j_))3?;3M_x^l2O-cyA;na|}k z^K;H?;2#TLeZ2I9iQi@NS!b<$r}<>@<9wfb3{}T__(bt-)$v9?+xXr5Sb4qJ=a1{} zz0zWh&vksB&)_ugd1vim>T&+j(o;UT-nj7@_K|(2-V>E0e3){Fs&Ef~Kz`?Y<@y`s zL!8&g)TfL8Dt#?~#{4_{i1}qaYnk_1E1LU7ruaMZpQz%8nCs^Nd-QvMY0<~5w+`ky+{)aSom+p|N3Q}&&fhlj6A2)7&e1oow zx$o$$!ZG(9H~4DDV~$_h2NI4sewnawYWQofTh*(UK9k>HQ(D~M8-%a^>e}LxNAkHS zEzX$pj`{u49hDY`%y|c;#XkSqd3&YB2D5*yFyp_>>+1m@WnM4vS)6CabDA0d@#^?k zb$o;w|IX@oGn2lK8Q&Uad~fhku9KI4Ssp*<^?YLX#ZBh(0SkPH@LUxhuN-0STZia3 z?%Vr$26JCbK4ZS#QhCKC{H^ zGqcQn?i9aQ{16|iy%&E`&hK4jesAy@&CX-y_dGMd=lFfvH(OdvRPp0{wD_^oqLoXA zK4yNlRN+XO43ln}NjJt{yG{Qx^Q6A=;&005n`f-Mm-)}UE<0eJZ>})U zHJAC0+*k1Ly2}gW)5FxKo4F3P@;}5kG5hz$XSBP={>kKf z#wp`}!mmnq%#?e;ciPYPnfB~4`EBxH_Ve{BJjw~z|6$Hqk3)R8_O|jnoZrNMmv0@v z-MTzKD%*LJDd(8KnClO}BHbEO?h>D_+(oV%zj^+$eQTQEDW55Ja)RH>ab{cxn11i( zm(p&2ne}|M`^vh~qK5C+f0y>DLFJwByX14kwD*9|dYF02cbI1}^K88e$IP>SuKE{q zysrw!9Pj0m^-nW14_D2z_ZhDx=Jn+Q^LlcgS>H2!ta(0NT1;`~QSK|5*VPkztA3vQ zyK=qE@<95T(qfu ztF)-+2jqK$Sw9z_^SskKzsa1p#+0+dJkOtH%DJiDTly)cpU$dqOh4^1&sEl$e%d*) z51GfCd>_|&H|<<2Emqj7UuT%#m7A=NPgKW;`C085;8*M~y_`|cPQHW<{D6J^2J<^@ zSNbE*#cndc*LK4EUfVGT)#r$hRKIQhhFx&G_qyXDhSTC}j!^NeQZdo)c^z74#e_SfU8%%|1TVufGRj%B_5sFTUpWkN8$@DYu0=-pJJN^1r;F zAioRxj{Nd@>8qFdW#=t2pA(qn@7~9JWX_*p?o$T%A1`r#TUzuoud}OrZvDor-_t4_vwrvZ-Nt8!_3E?EGwEZ} zuT|lg^ozWo>&XI}l{3zqH_YVI#fQ##y~eM(PPB5-@g_b%d_7aIo=&RcKt?r-rR@aA3{;>JI!kjlxzcJoE zTE$OZ_&lHa+{LsvroEk2IHtXg{D0Eb@gDZWldqKf#4*3cd_F2I4y*VBezW-f(qgZQ z-{phF@01qXRs0qoB!08B*r?*y`4sVMrNs(=%D%PCjQb+*dNDTU zAL#t?(qfFS7alDwM)()nJ6u`}^3~s{pZNguzOS_C&T;owUHqu)L?^#&TpRh{%55ku z>JzWrIzB-;wWUQ3voG9;FY>y=WMpy4d`{+^C*p6G7H9lN`JR>*C;VlvqmTK!#{G~R zK6i9bTI}>n-s1vc;>d3kO=y1&|I^4nyO^|HW!!>t=yjU-NvP_!(wBP4jQ9rwRUg);pi;_z;u6pUJnE*$=v__%@D7*T`41fzM$* z|H1k{|C0Mf^XVp^E&h}*{@EM-C#A(6A3tMV^MTx8_Kz-pK=|U{y#J!So6P>Zz&mJX zbHdu+$RWS4*HBv2(tf=fv%l9=;V4|(U|zpne9<^L|BQd_K4P1BJ-*3Dh+pF!mAA?| z<3Gy<@iSHY1i$rB#)}!ZA?A0E2KjZ;_3?L&UvFvARmHc^e$?K?oL9#WE4PNato`6- z8NXe*$?I{WTf5Z-W*?ic!ZG{U1XKSp&RP$n{BHRTG4=1_VfH~@?}JsivkVut%yW>- zfA#*h^G^95`5p0Cc$>*@hN<@mErIp{=DZ#@NZ(Z*uVec02Gfr_I(ulw_%h$`UFD4Q ziyU@*p1Yqzb zD-ZdT&fjC6)9vs9>a)$P>n%R5S^YTgy1T;PP>*H4N_di~{}A7+yg_EZ4lv`?&p#I5 z$IRCr{+9E*nRFe@e!FWD+~54%DJ?emar@DFX|ck;6<#ha7Wp~hh0wJVG_RArr-Q9ehaqD36sbT7s4~>0B_}u1IYd*$z>4%$DI0_d#%)UFs zFE{9C=JO)W9LeuBmKJAU@P4`D`%Jn$CfyG2rM}xyK8s8{7x+=fJNX>H+8>dV^9Pw`V(7(*{gnecn>_pd-E#B4f zO(y*sU*Y^^=DF-5bN)hge4a@^SB0mUdQ6oTll-!LCYbp+UWG?02P-?Gact!`>7NF^ zz`j_=Z)Pns&(A+^-P-qenEiH(zv+H;v$WXYy!Eukq?_T#jBCt3GhKya_Njj6KBABB z$o^PbG&1?r^LND8l@>Suq1;c;n9uibGwW`XY2O;}Eq;Z$Z(m~enFXewr}#eUC%AoY z91q2gV(&i-Dh5ZH~p{AgL(bZz+A`b=)d+_ zUYcK5ULW>8&~=Tk6MxDt>z5P0*6|hTKFwMFtbMzW8IN8LsBcecv3u8BuH$$3`{K7t zi>)etlTQ-AQR?sAmFd?wD1NoHSgzuic&qru(qe&m-8j!56hBv5%rdVVXG)7{{-xJ> zQ%pT4`9$d_N{ey6O?$`qL*hqEixIv-zYX)r;)hC$9wwh|{;>G2(xQbY;+t7#A8q2g z6n?u6mB} zAB4O4M)}oq_M6q4Nx$Pmw27Z%!|m)}{Gxf@$K+GXL`F!bTnCsLi)33vo1AMLi>15VV z2QzM0ce>^JbG>IAar~HHa6Q`Lq3||eWS?2%>&&aw(qf7EUd1>w54z|POnV1^?mOJy zR@U+z6?&Xwo=J+ljE`1+UUN>uUKHuOuMO$gn%#YOC&q|AYX(i<-9?RdJ=^EMN{d~-T)LgoVxDg{59jzP_wy6{A&&7b`eTGYuipoldC|w8G#=f| z=lfc@%=6oq`P^jkIb`zL=bK!&cG!L=^R|j#X7XQT@}K7C?Gsa_#V|8oL(F^|WcG=E zew(a%nfcJhe{f!FX;II-E~sVZ$;It%al>oe`Fint{E~IM%kfo zTCDQL%30)u?}sjw79-60&CK7^YGn4&8vdjD+$b%sZn@>grvAPxEiQQEcVo{>i(~fP zMZK8!&3AeFt;U}jmwBc?Cz<{nXZmfF>9n*uI=y82?TjampOzN8Og=kI zK3hyaOU(LSWX_xA>-5V^X)(b!S}y~<|1CFst=;}4-~K8bbN#Mo_Wc_EUHYN4IQc*C zGbs0%nGXldeAr<2;}!mi@tJ1QO)>R5cYXFqY&E95n^icbyaQ&u_DhQ${-t%Y#@~1T zsq2-$-O+x;7t6oKo2Ch03O`-Ar3yFFmebx_g}dmI(mq;+hiHpvpRK}E>=jUe1}#{8Y_Vg8nMeSEL`fnJVD*Hc<_=eTfJY0=3%2Wn-9^IMqvttRf+e`=ZMkypyU zkM)1S2MRB6SpUv5e^+~!ZLQkpLpz)9C-dQ*eBS5M`T4xh1s|n8XUykJj@f0u+~>cj z?;d|S`vkx3Hv2DMU|!Dio$9wJzc;H-!#zv;`BwS%@=4C`NfS9?;+gFj~SP4{)GN% zVg6o36Z3a1>iJ^dcc?2Z^5v}LbD^BPe!0oybIcdI|Jvn$nm^l|cb~J#9lz_fQR?r0 z-g4va(hqxRn9p4d@r9~Bz)#rMd-?N^QXl5^X9qtgpB8@Dc}>js92)td`x-a?f%#mM zuylDC`82QZuhcW2@4V#8?MLVQ3+0^gXZ7D{X>r1QPUwjFUc&*O(QH2Rxzca*0mgNc zxewpql=Ih1izVjs0dvgvSeBY@xp5&p!?bUjY2Os{Im1cj`wioKLXB}@+BL)h$|{kMkc?<@V5 z&ljFE?Yzks%m1vjIAWeNAMh95|Lim0tJvXJ_3tM0y^2MqKV~`faP#3ox7@g0uj>?V z&kgQMzs7%*ewBOrcZIi8k0st;{5=1ObJg+L>iBeZe4PGXH^PlcPA&sSVNpv?E2pAmn`^usaJ5Bp3z*O+prnfed$ zW6J4f%4_3^bWOaYbd6Q~4d(pQmh${{o(nHC>6V!Dr}+V|H^!OYl^Nr){^{pq>&z?m zWnbVA@amh5yZLg-Khv(8EIcpU;w^rcYqPXiq8~=;Uo0)AnRMOEb+D5yes8>^v}j|G z{ie0FsAJNfyJ_j>e&rIs-H^u2>%}S@Gq2BXb^l@=pE7^{{iF&XSK%!_LVnYg6P2Uf z(mx}tw~hv?aCc=F2er3_$-kM8G>$j;9_#a>+4b7>Sn{b-WePrK+XgZ6s9jCFjM{;lOb?<{}&P~uOS&%Yis`_K`8LB5Bj#R?x{|7mM= zzWba;{*wK)p1&`?j(J^^FX?~HytuN?S!@X>zfHbWejBC5I-jlo=lMA8=;4QjPx&hK zKjL4c-VeUz`Z-iB^PH@vw77Eo>m0w}Q;g?;_$ zjSq9Z;BU%zy0n<$iS|wM|Ku~l8TpLyr5vTdo!UOgzf^t?|Ihe$a8CcVCf<0raL0Hz z^QX+iCgyot0}td|&$n2|wY<%B`%3*DHsgMTf6D1^Ez6%`%Aa7$ALBnNe}pM-fWNN3 z-OM<*^5y!WmdWQ_{?q2o8I%7ppKZJr*ed=?x{T)$r;Xns^Ld#))+uL``Mk_3^Ld#S z=JPU3Y|-vT=DIWCVwd}y5#C+;Vdnm1h`;Xm0N*Iw#oWg-a@~2fenmxcLP0Ts_bD_x9}*rrihpu-8G`e4yv(TcyPYQ@=H)pB9;P z6YMii<4pczrNs!-4?|2ogQZ0)GhS_v_d1VfHk*v&4l};bu4{^<6D3mYDPl{HpZxrNs;{gr`f33I2!hcxf@heI-4pSgi|P|rMU$oa>8Wjl|UaXu_9cA5U#=Jj}$78^`G*LWBE z*epM!ozqqPB-8&B%={ZKEk>AmHN<>Qa*%g%e4w;w;hub&nEWpuEl`+$mAg#*ChL?t z!9PwvuvR`}rA0R%;=B$X$)dgrpMAgkBIh0RK>RxY(EVS`{oh&@j=BF^WcqV~`TOtl ze6@a?<3IG=XrE!mcbKmfKUBpJRN)>beH~Z*iz%nJ3dfXl^ZVQ<$Y+SD-_2g*EPYJ+ zvnm{ueuMAQ?sfjS>&pr^gqN%E95;n$tMCZlBRpJ%2l!6m{wmza>v_SxbJa_7INEO&-?vF=B!a3B9Z^{YLEV4K5y5?q-$pKZ(`D2cHeU2$IQc+d3aHUW9H!=Q@>@tM8D1QP|EF@HaMiW%n~ewX^k)W5q5$JD=#|0%w;v}k0miw&j4;dgs}A)f=LKI=^V z)~fIdQ@>f>P5ow=`VI4b(hc$U+SgizTdHt9Pw!(~IpFon4QAiHdib@)CI8lXIOkpD zbH?nyr=`V7b$pM$|=RA3v-NA29b-3(S50JTqRiOgR($IpHy;oKfcfa-_5v zX3800?l<~)d!P5{EiHQZBK7a&i22b`TC`R1&HOLp(^OhCR`E5JmnPwk^Dp=s>*2h# zIA!uZsNCVb?UP%~b$5d)Z@sjbsp6-Y@+M1*Ar5JGA2a@4OnIG5c^#!i3x8QZHZb#} zp1*0oIQKC8tL|e?neXN7@ecCasKU#Yv-~;dPcZv!4RfEDhv{E7pUykW`kyl2(?4O# zJKz>~nD(wS`3&-n&L3dT@8$LV3o{;Ve7brxG3{#Lb-kH-Z+vH&-*V*~v#-ta$wS<}@BPfU_mvjC)$wk=#W-~_{m=XHkfv-G3{7k%2{H{ zS!CKV$FyUT+0Q4K*K^~g#Te6$TKLKNM$ISdWVx9{e@-^zQ$6WVzne(@q z> -eBg_IUa}>-+fX&udg$_9-sDVe3OxLw3uebXNqapB=b6UqO=%i+STw> z&-v81j*oWTso_V>zZ+a|{kW2jMVD}%XLj%h^?w_C+|RZ~<+Sk0`elqsH^QH>&kXaw zv}1@#H^3$D=SQDU@9(d|QMg!Q&R<~8pJ&dWW6q!9JDoROTCDJG_JuXRoozqtd8_kV z_+584Z}=qbYv7kz&wuuQL0xHaqdI=+{3qPc{!?1?ivMZlb@Fc7In7_rJm8OTf``U` zoX=Ix7(dhFdc)lJj+7R|{D-ukbH-tT@6f;Vyyg3R4zRRXWrz3`zTM~hmrIK+_BwBq z&-ZswH%g0rejv}?`HRx;mKG;`y8Y;wAGWTKN{b6VMn2~p^!~`r(xUchx7_#+<<_vl z`>Z!gizcQ%jr<|$8%m1~p6ZV_zCpRIrA04CpGtat9iy^*UK7*W*exS4%=j)^& z<9(GoT3XC7>8JTp>8DDIMgE=fTi}z`XTG#pW1aQA%J)Cs-_DDk^Nhn~Y0)75SF(?BNWJPxizcT0 z4t~A*weg#j(^^{eGUL(1r#P>>v>2-52l-U-1Es|nv))IT*D1rL#XR3_zHf5byjASp6HhwKT^hD3O`Z&MHSyv#W(Ot z;_I38-F%IFI@qJ0ZG46OpohO;UmRg;qy3P1zjTjT=R5o*`E2lg&RgMYg%|iy;YmKs zb-VvZy{^5ta+vg;%=yjydEo~B3Tt`dynG03pO?<}k>&Pt7LJdL|CI3<<-a?Bgm2bg z!+g8`+hOwEVm@cO#%brR@K1QcztWz4rX4j;w?EuL{#Cd|xZV38jr=b2wV!#8&|Nvg zR|`+^gYuu}?<#+t-ynXC599$qs+?_JzrV~Y@h4TdX2f&CTlF)4P5dzb?Y^!vO!`T_ zTl^y1?W1$tmVTC>(!Lwd@H)exbK$i2jBgS?;&bgQyZoqdopgW14$j}te#+$E&u8n$ zo+>=S3+)}{3#1?6qI8SQ=dI@WT=56=(QJPQ%ymTjwwU*aH<m2pGku98K6QA!nNF)E}R`p=g-{5`B!wcsX z@*5L=f$RGaQ=dM5-1&3N{Fvs$%;PC$eyp<1{p}Ky-%aMcQ)c`Q`DyMkzw6!etnzpl z-zLjeuCS3GRKEu1_xcBU2k|RRev3@M%&|rMG;hZ-reDsPbZ49qf5Z=SkLSv7ezyAt z*7H^N;aWbC&DqVLx!$ zKFOpXW7<6uU$;ruN=Q%>T{FXAG#fXq55|4&z#rBw0D&0$6>xr{2UL2XZbkcMgF~T{dieU zEmO`7-p~BJaNJko+t1h}{V~)3hfM$OGySv9)Mu6HpJwOhdNWt$J5%L5&0o?FQ(SZ2 zc;zVnM1I4}=eGvwdzJ0oOun5=zMIVWtuyspWBO}_Nw>uGN868==~|d{P0aYz^J~)A z@V?5wls@z0oL{H^Z!+!KXY$)+%AJxv<2=Fi^C(l#VSZE6SI2kxPx9YnephLgN5ZGf z_dfbuv@&nHnfyAKer};hLG6tRbA-0k_F;a?zPHAE3NJCAgPdc=vGFI$cGffPtYzl& zmE*Taf6i~_DbGAlI$`F=4%5CZrhOgG`ycVm%=#PT-S1$(W%lJ^zRd9nX1=a4^SUyUiu5^9>g=IKTnu(*k$Us&D5{2%BQEw zr<+-?olLqmX52>;mfr~P!bN7j%roWBG1ui8=DaE9yd5Up7L#t1xo)mA=~kI^H<@&& zOu7?heH=0A4w!U}UbH7&J+Ir%>v_kdyQG_#)in0;+8@y_32=F2AEp*^d7 zmwj-BzRKOc$Sv2q1^Os^`!VzTyf>Nt@6#E%PwD3Md}HoYTG%bWMt(c5q|bfIq;Tpz z&eVI1nMWf`y@#0gtuX19m~@NG^>m&|H_N0uW6C||gS-}l% zus%BZukI(>_;|;gIjUVvd>-rg-Qq8u_Xy=q2&W!nOg%=Kc{R+`W00xGGLvqRNw>f| zOE<@)o8fhRd0k)rvUzyG?~!hoom^+`b1r#%;Tw}aufsMb{}v|yW;Td#Wb&_P^6%%j zyASH&CvG(^%ze-Zo26f1@|k1undQC2Pc!*UGWi@b_1tHj;~SML%s6(~#4_$pe7WNd zd;n{iaC z-&Ll*=Uf+mLT?GQA9KdI-}srbA6Iy*_&MH#)6D#xa4&oUo+_*{0d zUwk7oFLs#rZZYRw@rQWEXG(v{vG}609S6+!z;?Km*9-ir<7*tegL%&EgA06$@Jtn+ zIm&vc2&vCqi$*+~kzm6}~{se+TrkQcrWyXCw$IZhH_Nw0+GY`+1e9oAB zPT47+V)jX|Fy@Y-{sxpv(4Y;CbLhjG1u7@K3M!5-{aOa=Ka{&Djf5E>;?Z!|JD3lIX~u^ za%Y)xr2Teu^n?pDAybDQ`&n z^v3{`Uq2rqT`!Zan`!3)Gd^=1xr2Gkx0)A|Og+c>qvDU4=h+9$I@;vJ#Uk&rT;9UF%-A|pd$9XN{|I>L5yuJ@&>eaNv2=M znRKH}x)uJ1_<5%OTg>(Cm|qjWSH)lQT=Q+IM+w9jx*V$~ok_#Mix~Tpu;e>#!TlJiT)K z_tO3u-^-D1g8$K=y}YaT4YS|z0Y2059)A7p%}4%ulm2GXH8JTLc~94$I_CLMEx&TB zd8NFEn~$gbP98DOfwp<7eKGCZs=_htTjy?%dBC(|j=8=~^BKb9{1FcGhdId1w{Gsq z_geXORpD#p+a&y7%D<_8sm}@1{|8Jxx0rm^`HNn6tn$y*V}7Whi9^J`w} z{;fs5n0YkG%%gFB$aQ#xPfPvyJoYi`tcSTCbTQ98nwa_4z|6O0W}Yw5Elc}6?`8dT z+icR$9ZWyBG3lE4FT(YFHtYCi>nEF&KgipD<@~hkf``I4nejVi#_x#NkB)}x0RmrlM=er?S2gI4~{z04El`9U)u=XGU0Gv8|IC1?A&`u&G` z-DKY1Kjht|-{(8T@AAFwBX&40{R(}aYBi>Q%T+jL-pn)OI>oeigttf^lYY1g$D|+N zuN$v^zEk?n*|Hy6nS2`gIpf{H)Vqdh$EEtG-_MwSKcz=b?T2*fZ{OvQag#~E&fH%t zGyS!|)NhLSRKJ+|O;+KU`i=3&)o)n2lg57_%D1mF54$sNm%_i~_&L*$H>>a&pXt8u zw2D7w%H82>-EVGjTK=2#NTz*_S?9}qoBR1iK12L8AE=%&^_;50G4&j0`mbAk(k~s% zbA%S=^>aOQe2hPS5Bm(W&y8?N{wvIRi_E?;&llLo=J*Vs>zUyP%)4o(eN)W-b^$zTCz( z?T=}HYZZ=Z|1i^kGyE#Ynd`(UGtZBh{r-T-Z=cD3k0;j2E}!D~Hvi52))v!0D}1PO zW6E8w!ZGE}^H%G;=9jB^Ae{cWVEU&?e8P2nrT*+-@@;r!IWBove4YLkrAJIV_L=nS ze35#tR>zlV3vHiZeqU*Tf35yK%zEu&+TFqIt949%=W{+M&}_VTNBiX-pDBKm>7ONL z-OMucZGu@p{e0{lj0028X1bMauVw0Sp*{a=ou2Xo#(SSXslQ_SYp)8&^w&0%Zk?7^ z`y!vk84h!tZ`E&ue6oCE@)@YYG5PfJ(aIgxf7k1h`My>!-{bzWi(fD9XBzMtPZV?6l29`loT<~*}s%<^x&o*U<##P3z{JIwWGi=x zVU?K=%gj8OtDLADVdlvobKlv|2WU?p zpVqA2%?5~@gsJCvJ_v>rkpdaLS zE}Zed$rJgU@k_!-{CDNIO7}_SHS&?-8<>8XVCpx@wy)`qnd6!AX814m;eDna+x&LxYKy7IO@6EMPxyj+=&wcJ zPjO$o!2FKKJpZUie$4kgXG@D2=6jygy#9O=^L@@y=KJF#e5vpd|8&Ow&V0|aoA1`% zPUd@_9o#Yh+L-Towld%IY-Yaa*~EO$vw?qV9o=AFXKge4!3KZDIIJ=AV2`;!yvba5 zPWY8?c7MQJS7s$n|4lRJPw-978)M$L9idx`_96bSa6ix3!+&HKlfIQ%SM_|eeJExh zs;j~=`_K}fBmFw3T$g)XMDqK)U3{MY>?|!hnBPZfD=k`?-$!X;ejlZgZxF6$elMVw z`CXJ;lpbh)oXS7xj+x&_IpS;8cPQsc*T>vFR&X%+CWp!~AS>Q~wh4p_zIAxt{raPA%VSA3T@tRJjAfA9j8Z zUnt)R{u_sxdd;)h`k$%7Yy4g9T4MTXkJ*2>nSFPQd7XT~yzV;U7oC5>pK$z?Kk0gt z4{c<;oA@Bd>zVR8f6a3m@h$v6HZbvZ{Ic+sbpI`U!Iui(@e=6TW=Ka=w=KiIZc^|)vzpve$Oh0z; z=j1b>-n+s*%y+F(ak)^?_|4iZ(*M2H!$yCUdivN zGv*ufdu4~r`+!RcbDp{G4DtIiZ=9F)yh>GTUtsD#$8F&)TKethyeCij4Ls(Dl-Im$ zehb&}dOUuk%r75On$CIRvoD-6>-~hc*tZX>@E-F!a@!n{euJ;&GIM=cq^-4mp1ID= zGS|6jc5sr(f0Wb0{d}waBxXP9tHLq+$&KH1|E~Yf)i3wyXZ$nm-)HuP?JB%hxx{?G zVwOL1tMd3-j__{U)5F&Yckw+xZ$Bz6IyjZ|%KHiZJ;5)k=Mb;=bH3cTxAA4-TiGLB zOOBf_P5cY{QUl+q{9R_8wwTYctnE-ov3+6s4&w-QLd{;7hmDLTE5MAo!JzVZj1SylMOyd zJJ$Gc^Jke)6F&)-Kb?cAsb)D+sVy^e4MF;bDv)lL? z{no@g7{75o(DiMUZ4{c#rHGm7WgLN`6%67X)()Bs?Q#8@BV6szv1|HX|ct> zGJcz-#RgOU3X|`|nsL!TV|><~tPeJ-{}BK68~rXoX)(aB_xpGKr9~gt?eo2*MGyZ* zKHYq}eW8QD?|55j(a6vHoOnZNQNxjpr+U0yy35kyg30HE@3$|;?2E@$IA&j5b$)*D zVmbL3$0hD-{~`~p&jo&?c|XfHS_g+*l4s7F2DWuK`l zEozzmzf}Hjdp&f)=gH^1v^eAkjZ4h998}?$aXE1Qo#eaAAJaeU%-@fkWqz-HhDYi> z$p=`sqioghogOAU$m_WwW`7&tzIOC8-<#^=YlVAxntYgaQ%t%^Cfx+{JLGHC@s;ZM za&>%xIscH)R?mH&SXX=eI_GcmRoU0p%j1{A8`53yj*g#I$9t;dUA#?sZG5}-H1l@S zH8ABgCKBTTwMCfy42_bBK1Ci7sY3a?e+Bfi>v*{i}eZuas$pG)D_^Mbp| zIp^289-J}1^V3nKYhmsSnwfM>Ou7ap-3XK4Acto3JCm-DN!P=q+vXe8e~bCu#SP}V zw$2^%Wr2TW950yhxyf7)PnqXn$9$*u9`N5?5B51_{OaFfF}i=Q;q~X)ne%&@^Shbz zJDKxa6Lw0A|K<9-#UHS5Z8GPrGv}=`=PfhmE%1rXo8u$R&k4R;`$qW;HomhQuX4Yx*?FamraolGM_IX`N`B{g2`u$$!C~Pa{eGwk8b{v z@;f+s2mQ>Pzsa1x&YZu>oWI08CtPGc=Xt@TzsaOOWzrur=@0mR5HN8=$pJdXH zGwDZ}^h5m6t;V0ZAL?fQeq$#;BEF@HZ{ly=-aO)6@9e&SpDOI5e15I*Wa@Xo$LN=R zrk=Y@x!X*+n@qWDe6;z$!pwsu-fEsK@;3FK=Vx7SyZ@l<=Po9{4ko`=CckDTzXpE4 z^Xiy>zHt7gem>)mab0}Y=PEPa`D`=!Y%=+*Gx@CWJ<=~T?YUyoUoh!!GU-p5^heBkK4jK& zhlc=3-^!$KX3{q@>FfCY>2D_8D3flONjJ!(>*J|$>S5BaGQYDw$B(JsEMF^p!2F%) z9p?GwHfQc^f8rz6|FSxMRvkaBjvw>X_&0Bs=hrjm*D>eUFvt6<<6YJ9&gytub$p^a zK2jYYu8t2@$Cs+(bJg+L>iBeZe5X3TQ5|2ej;~h7&#L1`)$zmX_FAn~Qm$jt{htFY~RAFYs0RdzyLObH)ca zeo`IZ=Z75MWsm0~jek_W&Z%eexe}l6tM*p$-OTx|OnjHg_Lt^QCx?H*_hL(nHum}5 ziq_Jig?aAKTpsUlDlHoM80i{Hi+VoIdOw%{-R)a9nZNVC#kbwxd}n?Sa)bF@nsxSy zU*o3xy;c5!_+>t5#{N?sU#O1Hb6-DC@ow^;ZQjg!V9#)zB7MS`> z^K-&ee1zw-V@y7yOg;mArTN~&C+p8srhiWOcK7$krNt4`KZm8o9-nIbYPUQ`_j;y= zt-i;aA0J?G?)XpH9~y=8+_r)FJ90zpRNp?13U~3(xXzEL#~Pn+9jx#!!b|*X^I(zh zf0X@*-)uam_%-K^Gwbq-IscM5|C~Ahj5+_5Isbq;e~&qThdKYoAFG#sso{6AmJeec zy`SCQQ`x~o{nN_tai7%0DeatO&Ku>Bei>%B;{(<4H75V1>i9x+e6~7%%#^p!!%hzUVk?8Ta0@X-(~(c@QLb|FPVKrelhu7sei&T z`Cag#@;haI54Zn)WxM*AcJ;7O&n~vJlWA86)1R&UZt+cQ(XIxjU+efV?W$$kb)o!E zD>tSd=T$hS9%oFuPMCHb^NHGZ#I);>Y1e+@wQGyMAF&#f-)0q#$#0!$*D}+tn(eY( zd03csU8>h3)$^PgubWJ}&Y1B!VVC$rX1w;9`LG+cYlmsqIzOu(G4)uh!ZGz&VcNCC zv}=(WuLY)E^Gv&DnRZR^ujLn$-*^>{$#0Zt*C5lb?W$c{Rl7FWt)6Slc&#$+T1mWi zE%D*v=b7=EW!A|wGY_Yjc8&7$>Jd|qkt!Thk0GXA15CU6nepml+SSXnt2^=9)ylt< zUrc^2RX8TUCZ=6=OuKfNdhRmoW{(+wPumxc_(S%W`adbd`4Vr3^jG3< zd$Gu!g*87zIe){J7Uu9@e|T*GwHUN zbPa!6?z?r&JgDWl_$$Z1O}Mu@-p$PauIhLjA0j-#+@Fmx{XNLvas6Gc;uo25nW^IU zs`wpd+}5l3iz@ymGk!-^e9KOG-`B`rP{n$t9ku*p)-bPEhMD`r0VZ7^(=R=IP^0x! z9iOX?&s4{!n0$7t<6G774W^tm=KNKroYoJN?QLf2U&s5Jk2U-q&$sjC*oRvmSJG#F zT(U*@CdbXEGY;ziV`iNl@`%J!jOnrBme0P}Z*cOxTCcm2YGyB~#lkeaM%Y6Hp@##l@_Bsblwh=-xf#jq&%L zXX2kSV}3H97vFbN`#SD2`ET>5bKT)D_b8A5;P^TpD}Ie{(T>&9Vukng+;h3KSYp!8 zGx^N%6Z&nImwty~rnH!5(oJ$qx#Miot}*_TzYjB7S`713&L86EwWFU)clAC}Y0=B% z)6G|?Z&wv=W6E#kzjz+l!k6mr=F*~xIj@29&a1D&HOzUr+0S`byY?aHU6vLX%z5V= zQlB$!_#D6qGu}sR){aAd!Mr)(ecku%^X=NTS6b{c`E2vm%HOKO8@ylonXeVUTE#Ch z^;+aZ?(hAI(qf)3Qop&=9J`O}Txl`D1?BYfXXVpZTJ$pc zbo0I1*TIzE#@9*TS{-j<+S|yqw}EMIJ^wJzT}z8vCci85F!@~a4f46*E0lX)THIvP z9W(VmWQXhQ0sm3{`<#(}ue8`@+O@;9YrC{q=ZDmLmA|5#75<#_mP?Bzrkn-tOE=5Z zYlgpPeovPcQ@povn=CCR_+H~Y#=mmj2!F$U)*#=goB>|<8~@3DKsR$A&{c(F?gNfK zT&}wVX8!N-M83QHbL(WMwAkW5n}?fxx%@YH;P`rJvBnGizsgrz7b~U3GN0gjJI~}d zS6a+4`AswVP4Uq2$+Q!W%3*1BaO!(lkY%j(Z|~!;Qf-)qKBV$yt}mM z;$H}NmKGgMIc-cit))c^Q%)1>-On{L<<;}!=5ZZU?^>Q2mzvVz%zC~3?fpG-roT_C za7=$Me8l@X#%Y#$PCU-MP8;H*?f?DU@xE9OKX(V^^S|xu=km`!dBRKAhcofH9&PX= z=F2+s{^T0-ep$<2dAy$ayPuch|Jgn>7^20!XK?HX@9!G2s?tniKBZ=RPH^UQtH5&!TW))D{q@qT}{v}pZk zS+8cMUQK+w{%>T;X<+J8$JD2Wsn1R4r#>UXd0sWZ{O(9E)9xNVQNJGWi~4bJ(*tH%!WcTpxjZoMjJjL&xdDBq$zL%gf~Y>?lkUk6Hy zem=$ZzK3^nyqkAZ|xGR zgL&tNn}2+W@{dc4BYs4?4w?CRQ@*MHDSu1*PWWWyAG1e$j`*b8d5%(AZ1c?f@>`|F zCVxzO*LfE%^Y+SHDlKNCdh8u|-`joUHlOW2b%U=rzD-g8H}YQmPi=gi+Dx>;JB@_q6>=DvAxR9YOcReLs>{MPvj^L~~2eYKT@rC%;B=J;9Z zXRG*`Dt_ye<@pX_fvtYzABql&-yM0x%>f7tnlRrr88 ze}|8>uWa${oMy@yXMW$XnK`e%3SaGe{(2w#4DVvSopMgPW9E0~4y*7E^E-c=%EGGXVutD8>C&Q~sZSmAdz3ZIyty#0U(k;=pDz3V>M!)G{=6(L&N(dI zDKqZJ%;$yBe%--`>W>zt-)oqC=G=TsJI|PQ4yat_S0DGZ zueY@5X69E5)4pcr?=&>>zgFjaMJ@cQQJezmw6z z{GE(uran!aG@mYx%5smHdL43Cy$(u?ZRU5tSDD`rUuJ&ydx5W#Zoagbs*X?cecCzB zjL%5rFhArvHo&acHYUF&x+QC`tKu*Iy6n$$zEpiq`PXPOZ>8Qi>1W^lWvYlH_N0O;`iz2LH=6CjrqJ&Kc8Tq?_$Qi zldn}-7n5H@6^_Yo>2u|JU0}QR%rX5t%Z$S`GwxHR#RRio zk1_ky2)|@r5Ai|YYF#n&qJ!7_Cex2i{HY%Id)&}JbnM^A5`)CRs2pBzg@*|Rq-24|E%(k@>wY@mU#VlOPJr8oi8nBnBSG1 zE-fZ_{X4a##Te(bcZ6ez#-Rv-bM{0|8 z!t?Z!qJ5k%$-Y|IQCY*Z=LYYjJy(BsZLz_ZNxw>4Zu@K%9cbW$=^PsN^$IOFH zW?ghJ@AI|s73O6t&x~smGoP;hR{Ov2v@MGH7Ut07s>%WoL>z}D_4YQ6fPs{z_gxL>{nfrtTe$jPdzqHt6 zt_wTNbzy_gQtuA_f0ph)E}N{N8}Q>UDk>EfCBCAuyJ%>vVv(XUiMv#&lvr43Xqcp^ zR8*v7Xq1#>SXfk)l$cnQkBNneiiwFXDk>@}DjFFoB^fFiCE0s@nfdGboHJ+6Idgu^ zkNdvo&br^m99J{*-us3szMh}fE~o$EI$C*K%=N=M8(lxFl@_ba^}`I4-!!w|6sMFs z$n4+3X9@3p#&eOonZHcAE6n?|mzn*Bn0eICt9it%Hx0~sGyJ)7JPhz#v{!#=(aroX zSsU}YVGC!p%Zc{-RrNmRsPn}kr-cuy@G2jspJMuHr3%ON(>!y(w=BPW?_+^qHy`GB z&G~bdIseS?cf~J$-ulXUzDD`8e7t_{p(ePso4=X$fcamKT0TL)9N6EGyLE#(&Q-3< zf8X}3JG)%bE<3#ZUj4w_-_@PC?{z$v!WZ^C<#$=XPxuo1HQC-PT{|Dg3Es*49b>+~ zHN;x&(!zH>~z=e$?9cICIEJ^4i2_n7}z?fBO+pB5&cW+tCT z=6_V{nRK=MLB~1H+6=|7-1I(vAL`^~E?E;e+)1aA`5bRrML*`|aP&yl13? z->E%Yd3QGP;qq(XP14o#QOc>|J;a|V=Mg+&;+LXv5i>3pt8ly;7tHTJXPMt!U3{Ue z-#PE6erKh{Dc@o|95eMhP%o&kXRtZSUcd>!mI}Q+u`X;x_Hg$GOj3beyU03^TqaIGE!;E$e;E9`!ydEe@G> z-Dm2(#kA`>`_*few{wYU*9E3s=lK}*nPJ*>lxf%DD!w!Ej<1D1+Bc?so2zh4`!+K5 zt!LWz;NQ!7?(;VF+$$}1nR;$B^;~1>xx&Y*-y*v?$JBF%spm9%)pLTW=O9zh{wlsL z@#@*g$EasaJsYZUOg-zEde$)YT>G-`<=O8#zfCe6<-(_Z8 zEb<}7-vWQZb;xYx6jN>k-(>%K=DE}5SsA~^{0{m$e?Wbfc$E+Hx#AdqR5^oHd@u8V z+C6-W{7(PF`lww_N{elds{a;qpMIVBKI0O<{T}**nfHBcwO?;((at}1{%>a5=lF}R zo7CrkhW4%3`EzOi(qfrEE4)-%EO1 zf8rohzka5EeVi2E&D5`jsb5nSf25v2n)>moepUFe3>W*nsvlFoabK$L@!V&O`F`Fg zU+KIz#C+empF`$XFEf97_*%~kyP0v`&W!U$ZmCy2e@3{L`Q2B(w4L8U?bqCJ?GcV| zi{E7XQWc)#lzyDz7tE6h{;lhp5$1h^!)&%+KYvTOmw(SL<~eu^-ynQ&;|eDI5D(cg2W#Vp_L_-6Pi?K;JLKYM}?VL!7jbnsR3Yv*S>)sOE?{dj-n z)p6YQ%>JFUr|=$M=6YwCE@5u%W3G>Ou9e|Mx&*#;g8Bd8{wmx+hj{DJ|5?Y958q-P zTI3H1&s6c_e5UfdImKo^$8j~47MEWy-}`vPd|!8uY1cMB%XnS-U*9v4-z2kt3-i2T z?@~JP%Y2aWHP4hYO{e%ksjZ z%hFWUKpFXSeZ?mClhl&?!au>B_M@rCO!;q}TT&I@<) zDfd+$=Kq6Rc_+WyYbh-nIW4|{cYcoN6s1Le%r<^E_gDXQWpU2y{&(W6w3z2Jn)MrV z{V~e_G%pAFTKSECwXAm!Gv2!R>-wd$wCG^QTO%``8kq5P@}I6_<$K7i^9P)^-+pPa zSHV%DMhDjc&;9$Bxlj;}H6`0!nB zxT?<(Um%~s(qe#FC;OOnvXgmFa2xNFe&zodHx0}>S;t&&)bjb_FReeh-Z)~`$pa>S zi?4E>w#28XXG}d8t8h#`=b80#mbu;-x@%d_K|WtS2TF^6rk=e_Jv*4|qEet28ua!C9H1VN(BSbCNmlGCF!|-7M5}sSn9Qly8B_iVbDeg~mslT;_)F?{z!mOrN4+-rR^e5S z)#@jHm-tCO-a0T^*~c4ha(o=JE?in9{@i}&{H8}KhnZgov^3tj#s%x~GBZz>`0d(r zv9ws=wEMbwK1)6`OnXf8tLEJ#@2CD_%YxxK2d3LuOuD!|q=oXt@Pp(!j^Ot|l^+jnh%Sqvx(qfo@JMO(`rA0s2 z9A_`n4_!=sI{1>GR(@&G%D=HLwUic(e5H11C@s#7m$c&%-8$Sl!!hF^W*kgc;h1qS z$&7<>Ud<;yLA$kjSe15eVIlwK(xQnOw++nr$V08XZ|~f=dA9OS_!B&2#?3x6ulD!@ z#=$l-uU47qQJ$IFx?}=~lbJ}Z;Z@aVW6n5Q9zw*uM z-CtVt@SW<>!F)fw-=BoXr#h2r%bv%K0V`|uaRzye_;Cv zpQ62nndd@-%=46s`Wwp61NcwE+syV&=K22`v)?Mm)O((JzBI$68)u$#5Aku<#{qt; z?-BHu7JW>*E-t7?J0EU5wv`sG)%Iq3RCMdXH{Edc|E{CVarCm$yy)hsb)}j4eDPBI zdNg|LF_ZrxuRgC}o)?WX&%H*O`}IMdn7Hua>uBRJW*nYW;h1qa#2?e1-IcAC^_3UK zNwyzWZdZ;l^&6_}WBQ?+IsQ)Od3ihYyu6utPTs^kC$Hn}uCo@@`-=_kW7@Q*`MJz@ zeXsS9_qHC*^EJ*Bv;69$^`^9#=9&00KHl@EQGQT=j4=5OR}S)x=0iVUk@c{O@8Zu0 zck*Yg|Ls+LTV)HgUlae7bOMHQJi>1W^|L0lmXG@D2=6}VeIVIgxX)(#{Kh775A1f_J`8E5G zloo@$NxEJppB^Tk?$V-_Pt$%al}${$H}Edf)t44^yr20}TUuOW(p@~z^}lrIrNtT3 zKd1a{{dmF;*?wGF9PvIs?Ebd2IAD%rkEhb@mKHm_$@y!$wAkSNrMu3w`zrt0dbP}d zvENc@vB=jy$>*u1#XO&_U*?$m$}xW0d>Ab)hI#d#N&cI4t%+|jpBwl`tmA{+XI?&_ z90%uYx1OHz{^F1M9_zy)A1r>C58`$ezg)SK~F8Oyd?@zhLCmP2Wt;U_>+~Qw&ez?GP`}Oe5`0e7IAMHH)~_aB z&0}UBU*nQ_ebjQpwGT+Y#SY<3zT9zalopeGr1(BI`#-_>Rlld|t-?{b=&8an+q^C+5C zpF2$RL;7cwpON1%|D@Zx!;cELG4G43;Znv&X>oSb4cETMxY*{GY@g>dILE99v!%rd zzasx(e&AQHEe(~vw2KeaP96M^{aX0rY~ll0%UK>aTc@3GHkk3W&U?vkjM=}DUw58b z{|?tFTxQZuGS3Ajcr4smZExjW%){Dhdrh@{`Mx(?+cR$mc`AKBXVQN6Df2mD@>%1n z%+onOR=bZd>4*8*tkZmldUWs$;xC(Ace#!@;fsV9nEFlgJ?!Vx^hZx+8@sfB6CbFa z2lp=1?=#1}!5r5*Q=e(3eFk_{Z>AnCRk)_|8rST1`v1ywCrr8nrko{ic6v_2)Nl7* zu3wFhO{Si!m2-T6^ixc`5AnnD>0qn)Ys|WI(r9rt4vtHULpEEdwwQUc$bZ#-3%s}W zV>)3@Fwa|tIip?r`DOE_ue4}l?$^#;hrCz*XQjmfpC{ja<~VklnHPMa>!u!_33oE@)oI~(%jfXn+U=Tp zFyR&cuJh3X=Z%}GY*(L=YI}bbU(a{j@3hnWlm3vO)xNvDLwLOk*YZ!5yZ^AV-Be5c0adRS}d?eezW|r^Z!g~G06eno17>uMwoKCEA!*2!@F2#{Rry^b>S}aUZ5`K zeIS>9e3j!k;alW?z{Kw|pFgbe!`gX;`)P0fhWd{%?|~cUTdkM-=}&1P{mk?1PQJ-JY3BX3TLV94{M0k;Qp>da>O&ldejDL8Xon`w+5f2h zhHIY?zsHYriw7LyM~&+qeoVMNVXi#5jGyCAw`iX#Jj8nocQfPS>_M(0{qFm;v^ZhL z!9H)3Zh%jdZv9s4?f1K$E-kvb;CDS;rNz1H^k3IrG3|9$g=5-lhxz>fIx~M~%roP9 zCFZ<1U4>)Li!G0Ie{g@}hyPEz)iLc;%XRlT7t+1Qai8 zs@~nDMH^FIYiTiBg-5FJ^!K?xw0=zRL)MS+(qfE@!lR|d2y5j#Tw3(<8|%z3en7g; z(xQgT*0KD^am%`WS(NoU=iTgoR$3e}=lLz>cc80WwjRy1x!e5bFKCA;{=NJsON$9k zx&9pI-x-Hv{8r_RvO_+De2C-eW2bN@lW#MVZzGd$9p5P5+R~zi$u~dlOum<0Wxf|o zzI)8|!Y-feytu`8%V(MS9?CqkZq0D&kdJ@3@y0u+p8R{q z(aN-63)8<1oR{yJ{+cy@V*2y63df9}6K33Q^C#42jVII2SLOD;h0W?@h7FlF(2*v_mDN>4@!%DCZ9dlY4=^;X!}lSvCSUq z_ZDvuzgb#r@JY_A>%5crwbJ4`f8RQ?%4_0RN{eOwwRT?O|LO0=(qe(RJ{Z5<`Oa~V zR1Q}5Rd!c)RJK+&RW|U|^1slISqJB|&r#Z&?{i+5Brcvyh;9+@+SBM@#B1f z`7px&bzH-IvF(HWAL$1;E8Ne2kY6|Fg*%z_9Zb4*CS4ofd7F90-xY3V(ls&Z8kuzU z%>79%e@FNl=Xly%raNKM9r2;ov3c>Uq`Q9u)@4BWxN_WG@E*3GmlkKt_7mP+{Bdb<#EiQ`-c9^LX|d0w-({`%ozh~P z>(<#V-c|f&X|chKyIJj>@pAG*t}C@~)8ied`?mf5GQ9AFavaSu<7k>0M+-kvj-xsL zmj0M!#?cJZo|8=fOfchUjOq7LzD#(88Ak)mIO=24_cG~vm~`FDIO<}?Q3sQ*ok`cm zq-$ZuQ4=$c8aT)NS#;7}s&~?zGvnxl8AnGiMf#W((_^AQ{P5&71a7InNDKm4fp zn$n_^*}s+Pmpvxk4v(eVE-kjI_>Cxjy|h@X;#c_@@hhdpGBaM5_|M`OON%pJ^PIeS zpmdw5?-oBM-DYXA!ADBB&I9plrNuG-$oM#5#!t-?%le-Sr~ZvUe#5nUTIcKeFkbvv zd0sf?+cK^zXDi1m+nDpih5TNU^Dz@1;yvzeeX8PH<@@kn^R=|-=`B7BzJ$aJn zS@Jnz^4sUP*?+IJ*k!%&PHC~t8uzmMG4W&hU zRsIUoz7tHlUH^$PyvO9b%jCOLS{(50;!pXP92_dkX=C9fsneW@4@Nd=Un7Oa0|4GjqtQU1mdG#aZbAUR&MZ46N7B#$! z_2=^Gt`FV+o^wY%&-fMV!YOZ7&M{xKj!;RJf=6-Cca*lta+{r3DT7?Jr za|(sxzi4!&QwmAOu=W$J(Ov@)M%*4$P7`DW!UGUZJ%-yi9&ws-Mn^S^_W?gQKC z_aL{{a74Whhkec{yw6STyH{H5^0%E|uQT;tV25>kp7+uYbNpueO|hOs{H%KR@S(R` z2lyV(i&~iHX^s3Q>CW_PzAt&qBl9$U3ivz>M>JVOmg1wjq&x4Z@3D#@m>10 zkvX4s8xQ$^sZM@YdRG0}Cizb7I>GeESmh{F&wVESF7tmh z+x#2hP3Hg5)_EuGc+N}t9Wl=*8h={-glm}a0N*Oy!%cSaE$m?WeV$kKV*Yn!g4^Q9 znfI!!@$JIb`Hx&;p380XZNdlq2i8BM%%_%j>NY>b-^uUBd#d;@Zb{d|Q}I((`~<%! zJj(o!%`o%-7(=|Pe3tnR`^{G#GXE>E$CpaC#YcFav(EfK!3p1QJk&i?``YhPIJOAi z-}O!-(=L6Z>aYEJ_y+yc#k6k+^ZvqC=5wKD=Kq!&`BmHN`CjpL%>S*_RPmScP5cED zf5zWXpCdj(eGm9?<7JPTUpu_7`LWIS39s{4mAlB4JI~C|S-x9%l3!Er@hX0lA9J5O zRK@pkN4g%~!EWaLk7Mfh5#d4Rxaav{;i)RT|18hTl)KA)?Xb}Hc$)^g>GSA7Tnfi<~<&3gbzYg*D+0PyJ@D6q|?bFJ%Pczd#4g8S$)$u9T*INFz zdR?mTC{OuR?la?QmmlOdpDo`_?g_6~UT5Avxx{?W{z85qbbdJDd$UeFyBxO-e4&1> zWzGlVe3bf)a>eni@j6%ddi9*;-xyDOd~oIiGoQA&Al(_aw96sW9&OL@JyGMknW=9h z^Z#HC%zM@AnfKt=G5-%%%ltoB4WDQKK7PQu*u$jjX8vcai?7ih)66`cWai%(-)s9Y zAHa=j`x^5;rd6h&mzjQE;J$jzGvnrf7uKg;=Krg9_#4u9jg{qeF!{7G`Lry0Wy(Ef$~|Pt-Q$7uyG%Vhex^*{#-y*| z$BeH5{*QFsOurv6^J|ZpUpst`@xH~3`weE?U+3mM949mGmziNDDX53Hmi?$Cl z<9YCB%l!M9{Ck=FyP5nunf%+B{9Bm(o0Ab&Gyv>NCgBiJ#(UIm!HwP|djGcRsijzS;A^GrmXpC;Vm4t&dBKL*~4; z&bv78uklCHFU9gsJ?x_;Cj$F=w_R62Y<=_ZM^y) zR$l!NE59IJGry?3dj1D%`DLETH|Mug{-^LEbKSAe9M3Lu-Lb0nrWX=zD)X<^dnU`CjB7uKdb|Mo%D0+mG+$Gh4Lnu{{x-i(~Rpe=KnxP zncriM@K-!X_{p((NfXrrh%?98>Nw@9+H7CVk59WxeC* zVvc8w2hQ(2I};Gv|kSrXS~+^T15y zG_%h3{!&>^H&ae0Q%*ZmP7D9jI?zzMoQIi{X7%>Gl%{u9jpqx@g>9A?hn zgUq_L#;*%6GwaC`vz~17|Adct?MD5<99PS8%W|5SavGR&>X>q_G3&sE^mnq~IkOIQ ziT?)SPTs&pX5P>9p62}wGw&z)ircI!T;>?F4vcWZdNssvcOQA3HS(E#p7CS*6f+OU znEx>zW#;`Lvkvs}&eC_WmTkNXn|Nw_9h0tx`Tyc``DdLu;Z^_hBgWMpGp=^4aLl;c z;?HQ$Rr{x1mYDi2^6G!O__%u;KTP@Cyc(~}{{x+J+V#gVGwzR=eps3;k8gqb-{U!E z`)n1S;nST@rmOf#roKbW{~ix8|9jlejQ1YiUHP5N{~ovVZo-ZHtmBJ0zJ@9sb9}YT zde!yI93xeDmnmd3n|6Zx?>P&zsyopO+SAe5}unPD_guK1F^)dIcIi68IRJvhi|9<{roqpo? zif>}x$JNOE|6V;mpLTFOdGFJ8{-@(x;-}Sjv9y@yeLa7fD=lXE!`A;PzTP+*;MeWf z$A7v_KXBN6MmL|Vo?X09ZU^%|v3BM;MGL=Cd@Vn#-#VsT->b*DaK2x3!hiFeU{w6= z#_b3nq}_%~iy`)_#~|}RLA|_-@i4=`a9mS-qxwzqNdAj_f5I>Dxx4Lye6ad7Md#Og zwwiyn{6q8QLi*d~f65*0xyS!i-yP1$Z=H`6UgO7vm-!(1HNQ|g6=mygpv?dp~OXyv_)!w+?<$s<-%l*^zl`^J=Jz>sOgXbmInzuzQ_T85!53tm zVxEh3@MfO9$UK++kg3NW^Lv>c=Jzt2yoc+M>r8&jd{M?TU#xwnnB$mW@*n20ej2L6 z-TZ)Y-^u$)*UsD@w6aC`^4H7flIMJrd4E<~oU+TfKVqKG9WeFT;b)D<>wNO_eLuXk zSYeOz)*_StEc1QUDc+)-e!kK9sk_?V$$T%ri4V5DhV4Ape;Mc7%=6MszEQn4N{e-- zUaP#x_66qqYxCTYZmzVLt>S0+=i;YJi!Of6c_rq&(piOL&MWPl)30s3dY;LQhdSo@ zXZvqhe}(J0?*8r?zehbT^k>2+O!$azHck$i=dlO;G4pwcKcs)J+wYUc`68d-K4X^o ze)I$%BK*=No}drbOGcIyA@%=7+LKE^t= z%m?3Y-Z14XveofUC0=-(S$F#QE83-t$)|-GH_cpl_&!0|8i(}qly*%P0@9w-`S{$&(aSy!2dTHJ5=QrzzK0ZNyy`@DLe{i(MxDHlHoOO?Ksc#D}WydTFuB)N_S-U+@y&{v_8ArNu07b^S0?T1>N6 zdrg%V6Z|gQ$4iSbK1e-AON#-fp8cgoCv#jK{2lS_r9~TC?bljbH1o^mYa=(ThxL3L zYnc7>;ePhN)Xyv~cz^q!mlh|?d!vu}VDU$##Uax!drUsN{8jC{Q^jxbapE_b_c3p9 zOM9%B7HiD@tIYd?m-tNS7kHcV+C1|fcK0o0& zcKJGPG3hrsF8v0R{(2R^%719~T&T2I=G(Q;QfaZsq@QPwe~z8%JzHALRNJSxVm?iB z)b@$eV!YZuny~g6=G(0^L;Nx8$skXK2lz1i^_LcX{1ffi%UiW$PifK47m079T%+WUkP+UuA({zJab@gMNV z{Z)$_^z}!Q@>6AgyUOhj&F^F_PbtMtTM;9!rPR;Tv{wKE-)`RaFz-+AX7{%lucbvNhwa}{ zTD0>gh1*JtRwln@K1qC2Y0=0WR|9ig^`%7}lfH(j-!(qfewXGUiwkD^8M6+Z@=4n7 zq>4Y{!=*ngEe@*qJ$^(x?eODie`dYk9gs{Q#N#>@56VwG3z&)d`frNt6ck6C`R zbtPt9nW@4t>&i51%*X5I=RY`}1#YU}d}%Sqw+PRc7KePg`FX(Kk^df_C%nsFuwL$z z7Tat|`~8mdi|gWA=J~*-_%`7)CcGm44c4t`=5zEm{=9ze|6RXhxY7C?l{3kQ8-Jtx z;amqW_oZhX*8iux#r^3?X>rWlpC0hJ_TT3pNx#Eyb^Wo$7dhSyKFNK<8hgag%^Tm+ zP4kIaPx%1XGh-YOKgv%!&kpnH&$s@T7K8lNhZ&bVP+mX(Qa|qUBlbJy&(;~QFLRx5 zDd=LZi`x13!p(f7<85FUhkmcTt{&tEf6n)ON{fCz-?-}LuV{}BX8#su|0e#P?F~#m zbyc{A`TfVG{9oz1_=4YP`xzg>BfiD+l3n&&|F)TQTh;be=KBc~{2t>eW;~5o;h6C> z#=ml01AOJ}j^mH2l@_P`@f;7I@crglX|c;!yPnwQ4W8RI{uU_5EJ3;w)*Ib^;Mv(0zN=Q?vdOH4iHnd6${J$>#v z%YRd!VSd&2A$GeCAK;H0XZ@u`A2YtXn0#CK8rCrRo-UO6oiO=rG5KvW`K@zMeru)0 zbtb=MCZAarj&qth{t^DY@io976yI0HckxEY*}}BTuW<71A` zvfnr#tv(%mz5JVaq+bt>)6Xe)o%vne96RL~lizF=j>&I^`F_kObALE%eB}Ev)6DaS zDP|r_F!z&V%>CpgGY?Ohd3eP1&jHhpyG;M=FzvC)jKB42`|zUcqTK)R9p*_tlTQyH zYX44V9JMj+cEAT&Uv}9eyv=vsq<@&tD>nFc>%O?ajXPw>&g z7wqOSvz~VTakZ{6&t+Pf=dI1m^VSA#%D;~J++mP!SC1ZM|0%vhc(e*Hb6a?>3hy(= zxyw(>XPtL*o!$H=Wqcz)tUcR|-1ALtPPMGvZ>=WK&+F^@7Bs{WI=0C`Mzo(!7BA;HSydFN?`JHkL%2FtuXzu#Pmo1pOxkJGX2uUv|9($PVIb^a@&}ETbTZ6uzq%$!GN`74}c#`hSrt_~!gz05f1WX5eflW!A~ZzGf6h2zY6xy@hU z9DgY5Ca>1bDm+_;i&36t{__U?U9()CH!qW~@;Zbwo?4mr-Zt}^dE7+r)4H{hzbk%- z`M=mfenGjt%>TvqF#i|Z{FmkLQ=0fh=bgsVqJdw!-8|$S+OMv(sA0~Vr+?vndGb4C z=G_7FJ>6|)JZ&=L;X3oYbBehxo8X9Y#!HJa=DKW@`P^lQuhVXWe8)YFZ|3umYs@@8 ze|1$Z^Bj4XnZFyA3%o7s5>vmC%6|TV?_>9s7G2DK9o6>c%7)4sX8sE6>iFlz<%L1}cdq}>ON%4sx?+(} z)}G_M<#z2<#g8)Yhv;F(Pa`va>N#rs)Rh*s%=oEcu9FUp>x|n2Zfno|(&9RsT@TLl zN6fpJc{f*uW7d-y{-FLE=XdL;5$3vO*SOE;G^fmZd&D92?p!U`%XVhHY~xRgZ{br} z!>pT^(&v3txpIK)7O;_8;ne}{#E9%+DJ^S@A zpSN@~>w71YPdk%uBa>eplixL_o@akmu46~c`RssK^B>*f@P zIm)b?T~)Y+8CRFuA?x2RGoF??q#t7XVW|qo^uq$P-we~A(|o7)nkp?unRXpuKKJV8 z4d!9PYs&L)Epwi)Va~t9%z3w;IluPu6^^5u%j{y##~sXhw~aaPw(`Hlx2%=tu_mTn z>i9#h3ol<+hEJJw;h0(X4w>`VezrT`?eR7CTjNi;uAXN;_nqT|l{d@GpGiLb(dGd& zk4BjCdYSK~cW~1@YA-EXnRaSm=2I;*pN{^fEccLEuXmZ>A@1-!+Ht$I*kamule^+K zN{clfiC<-YU%JBg*}hy_Eb)boZ;|g6zffAtv)_H)Txl`G9QP1&-XE;O?Nzv~3O6wA za*b)1%h#6ea>2CADU;6u(=O{(c!fD1&ok{a#lP1+lcmKte^Wh2_-^$aE-eO__UdKE zV;g_jbB1PSJv+Nz_QNT2A9TpnZ=0##7SnH=O#RlF`Ykc_o28g5Q@>WeN&Q+% zizcRi^-TThN{eeu{mzZQ^ye<~KW!_#TF3abtYf@d$ExsL87^jdb>GFTUtPxQxO^5i z%Ko0`|ER}YX)#;H&+tP0bZIeF#ZU55{6uLnUd4~`t>Q;Zivixl`Js;wHs4x!C*!BS zim$EWkKS0uA29v5!~2;}+ZzVY2 zF49KD?=$aL*r>v5Rd|_?zRi5(o%Kf-vtG3^``2+l&okaoraNNNt?{<($E2TP(ho7| zyE)}N-OlIhhZcU!_-SV9*~p~Nk3^F0Y`si(%%nSF(j74AwktQ7{Fgaqy;&X$5&kkGs zug!L8u~x;;Fyn24KgY2uewY*T8?3@zyqEGj`8DIHqqJz}PZ>9@%=d7cxMF=j|6BEt z-x=?(zQ_C-;X`H~@9;atZ!+bqGxc0#%30ulD`&p6m}APBVal0g%IW1#%eRLqr-LKH zZA>|hOgZ)ZJzkouPnXXj6W*!9D{M-+%zl%+MSD$@79&jk`uKGDcQWZ)ne^x8?bUIy zTR(49;W>`x{(+hQvsF0e{5i@8sK+q>*tqIt)`3m)?@yiA);X=b>wG3x`6T1*fOYrL zuI$ksM|`#T{Y}q_zr%Tq`P_YrZNkg^ob$^(Kl2Ff$jrwve$sX5DDykl5k6o1FuT>O zhxtBcH=mgP=l_{c9sE1%Wh0Zmf!oTfXY#9K^4orkb=vlIK2SYYng4y9WvlQEze71w ze2IP;;seAFR`E^z1??BpevMT)ru{bG?0KW>&JCvg8cr$i>`k6?%V(S4=X`OUiJ#>Q zIKcdltdF@5>*2p^zou&YsrJ0Tb$s!yo@Y59&+?@TA1(MH#6V6Z{Tz7U&mi! z4JUZ6+~j-81Fv@y>Wo0;{jfsb_D z^~}0?q}*JW?z2n$9;aO|Y%$MqH<;~f%yZo9{Ic*I-|fC&k~f;S8}iG2@fv?YIZMoS z-4t`(H^_WX{(ukBe!G01cG%$u)Z>B=7JtV4uI7}#Y}}pjHS%rPa{ngZW@dggG4rE` zIj(VLy<1_vZ?edTX1wqd%2{Kc-<&h;dCFGh9Wn0-I$-KCpwZL*ea!dwdzkOtb=cMK58#5+F0*68ky%yb>6e*wbNp||Im?`PCU{Tn zF~~XNDrQ^_RNDhlzA?B%&cd- z%zC-b%;Op6dU1-mUL0cb?`QVwW%lb}_G@PL%a^^f-^KgN{f>B>akj_TDu0s6XNo+`exitni68<_p`qtJM^TV7ur@(s=t2W&Uq_W5<=WV;G)@+Xv2!(1<&ytlkg z+UKqMdyhY9yzesCdDFa;{05nNp1#NW<9g$O83((}I=#Y_GtcCI_-^xE`MXRx>&*4o zG;{ql!dy4iG5H_wNT2I0=DKr~sm};gpJApxLrl5-Ot~%0IBDj!pZA=sw79&ZY>yMB zJ&u|7*kZniz0Rw8Gx?1(?_nKe=4lI)u8~Ps%d6vkSLr4bzgC5Z`I|W&=6H6^%O&$7 zW?t-6;h1@`&fMRu@b~Puz&qP-o+)Q6@%E3|f3yn6>_5V+dp*3mk28<*e7=Ku-qg;l z1Fg*SkY?uj{1UVNEHLZREOWdwO#LUAc~bMia{GnwzvzlHX1`!k1^#9GxZ+eOKtDv@34(8yj?#q8Fynjt!{v3zC|_p#0I!}eG1npW%yq~-&u+2KFz3H@eo=V2 z3UBR~<9?HG_k3WZv{+}pXRyMYCl;CGo@4rJCSlvBnD(8h!eh*NVwlfV-y#0K?S0Jo zp`AG|v@)Mxv{c&<)#opa)0lC3P=#a0=|1zkVT-T4-Ekb0^ZlrA0IIT&<3;H{LEjTGnfVdCor0l-t3K!xrZMMjDy% zR?i&A@kh$zSYwW3l{t=OW?h(Nj$?|+Z-n{3ktV)Id&jhQV-=2R?+g8sb>WCRj(e9` zA689{tdlEzly+Y(Ef)B$9_8^eG{}1> zw})xx$&6odNuCr&%{5fUj&oMK94w?CLz|5ab)@s*9K2tkP^Xb}i zid*uVWZv7-Q-!;k_kYwe=h6H~`1_OZk^6Y->j?84c8IyI9pEq3SPz);FaF7Wj{Q&g z*RDek_*LU!zqHt3jq~jcpP|2o`C9cD|1=+!^jy=A z6Q%waS9`jC?`6vC;=J~0V}3W&%Fn283u~pTW$Jf!SU&$e<`3RrJaJ3Ata3d3ngZUuKsRwy*Pp`eBu+$23#!2w!8r0cJe+SKE84a7Se; zbAQ{+l;6nQ-!?G!w};lb%=0Z~e(#ufxxd=vA3C1K1FO;IubA6W~ROKdCZ8>)JvNy9mYH@K;~R3F$+W|06^?0#cIN!u%=~Vo z&2i^Csf8I=%}oC_GVN8*TqjL1<7|XEzCq?X=%k82sKUF-RSE-hmA+W&9-EVEpjv`2b&kvv#b)<9xe$H_SZ09b~?D)yJ>jVx8iH?%}$Id2ZQO z#W(N{>vIkBy{`Ni`xW*(|5wkgc*(K`P zT>4e!d^pa()IY;)^?YDRKG{CbSMi9c?*aF;^Dgr{=540ExA+0^>->`WaGm-6|4Oxe znRzZZ!|$~oU;KM{Jm<{uoHECA!d!>!Gwr_4yUJ&cc`xNEb6ks6{0wt^!_09F@h|Mx zUv1BiztbNl%FX<*|6;kljk&L%V2*2)Tk;=b=3hTEpS$=+*0*J5{wy-{XQA3Y$IPD@ zX8zRvN10!Kr1jVKKNJ5N9`Uu@<#n#{-rBjpO5ekj-^owf-o`^VGUYGv@6C%jeq8)C z4>-yf-tM^0Y!|-99M8Gbbp9UW>x6sw26l3t9lVR}+f06I zTob>-oWD-^(40T{BK139^4({itM-4X{GD1a)6PBoJ9hDJ*~Ztifp4~s#jIoXRXAoH z8)lwgPjFfP&e5UVI?eq4ZJUpAJ-W&>7XVaG*U$=JQrf?1Oy!9I2B77-bp0}Ry zb&jW3eEPSW>EAAoJp7V zJ7(JJfd3%8!{obBZC~cw^g~QPELGu{ewgLWsh@nGWB(zhy#|=}>SvCpmuatVroHmA znRkdk6Hd8D{73Hd?c8PRvCVDab>?%Bm1_GE(~r}9m-@xjZ>kE%t8t>7_ZbHROn$xm z9@pVr{HT1}`7y3l+gJEv=@+>#evThu{a4F;YM6X3#AjZf@?Ewc@ecM^+k1F5Z~0E~ z&CGnAVA^MlX`fN1U51%{%(TrO@6%9`R%yce!!nKj(7P!+qd|B zuJAvcU-~bs=dKI-_^g|i&)+vr+xaEyb}RF|zk%=1yl48ez6!_m=M+=_38wzz*{+;X zUbQ1r|3&VKU*HFL$<+6ZIi6$Ye*+J=XZtQc$kzWZ^KWMIZ(`ybnEdOQ{Ck-EyZIrG zRN-NMSa`Y$k8}QZ=RKz0D@?x2%(z-)@||b$-Qv}}VA7v3>5rLlddQ^TXVTaIPdN^1 znfvv)=$ek@EQj_cwF=N$oSstlv|dl+R?feS$aY$89G6O(y>h z=6tlq-k^d(xRE)?e}3#r9~ruqer>?iuqQ<_qspGmjGYpIl|>rt}HJ2Y|n$v zON&#!T78fB3+D47JI%{I{*~|+pXIt~vx;A<;#c?su1A;oa``Wn7K{7^`7e|f^ZdN_ zndO(&f2OpU=6%(Fs`=m*GyLqS9Vu6S6-`JeR7$8{7E-nt5MDf z@38+cf79^}l@=Y$^Q3n6+TO-Dt7mIz(ZbZTiC>ehk$P{7d=lmlnHBKHI#D>*giqdTWlU-z<~w4Dao}bGo#cVt&Up!Q?y6 zpY%E1SZUF1*r4ycil{V+L-a*%8%aUxOi9Nv60!ofp5%s>%Z~Z zXU(%i-l`oA_`i;CkGDJC9p1t%F514qcH?i2-{gF~!jH*+nHiT$e6Fk(_&m-q|0_Pt zGyOkRT1+tgH_nX5QLbx`kgVqxSt2YeO0)Jd7j!`g;#(0#%mw8eSulO zXPN$*;rkyg9W#%*nEX4K-)T1S#QF8|hsyRiV%p=7X^(xTJ$9M)*k;;elWC82racy! z^?4!jt`jDi{g3;M7y0io{j$!~>pGt*{VI2~&q`^r%qP3AT4bIZj&Vdihq-6}L4J_^ zTy*E-+K92Hp#$UgO zEE)fO{3-LTo4+I9E`FbNx|3NiI=E(?XfG{V_}|KD;vpM&C;8U#Yu=wwTUz8HPS%k# z5BpzYz8o_BwafIw4)e1W&ica9nFvwWle zoGC3Pnfg!gmFhoUT8weP^RW?Ty&K?^diR$WEqt2xYGnH9?Dn$W*O_s#$~%mMIrhqb zmZvGVw3z0!aWlp2Kgs+aVWJ9;G4p36@s4MZIj+8Fp7b*Nbu;s%nZI$1^D^_j{W`Orukgjz^X1ZFiD{PwzQXa$ zGsiK@Jdd7Y>NUyKYn%_taWeCDh#B95{E~79N{fDGeD^Zrx|3;_4ko`=X57{@#P!?gc3zTWoB&N811X8fP>qs}MCe4YEKb*3Jx%sgG;?^%DBnDu^vnb+fdhT|FI zx4Ir1Onq9Ic4%VSp^<5a2BsbAn0j1e>T&+Cvc6|b{4o=M$kcDYir?U_ zdaX0#b&bhyrHWtV4{5Ij<~%#iwBHny&uA6j%X>J^E@uA@roGyj{9Ae7Ta1fpdn4~7 zTwjH2nRO;FwM_f$KeXI`k7@56E~(!ZQ;#+Nyz8T7rXQEsZyi}={(oeFDSwW+PM&4f zj~V8?G0qoRKgLRnK_-1`Wg}B=1CxIpGfrxmadPp!rK?=Xd4l8mW1jh3bdu?}34WV) z8RwVGud&i%lxe3C-ts8xP!%5Fw@cs84g0q<$J@+&-qFC+^P;0{*K>Y{c0A*sS%;39 zeD|4jd(7u_>s5G}>4!xo-8^$#v&?nP1ix+^_A%>d53j}{lV1}v9vYc?)l?pSPr2U) zliwPX-!fCbC8mB0Ou6+;|JPRG!|yK7OZ&X4H`DGrOh0Tg^Js&A;e5AVTC6bVqa|iO z%`*E>GUIfj3Xe1SjWPL+GUtZ@zD9lenB(bT@@r@Esbkia^M~Ac?bGrfFIVAtp4vWFg(vva_8+gpy-c}XOg%f9^K2V4j~nFbzw z%u4}toM-JfUi+3i`yWT(?Ds_!>j8Cek{ks^j8y;zL6`^HCeN96n0{Mj&Yvqx`zSl| zUOt%c>4Tgf_0tIxUS_UWW|-riX4=?oOeJ1;j9H(CnETSaJT3Q;6W>+dNA@uLbusskoqU&Z(otHpGxv|D4=nE+kC^+$ z1LnSQkGXH$WbPYRnfu0J=KgJnS&!QuP+o`3xmZs8EOTEs!?Z(V6<^P++cnJn;>G>T z`^01BK5>t^PuyYd6E~y%H<;_z!TXi-zn!^%Zey+o>Y3xbY$@*pF8JH}+fl%9j2J;?@nes zbuj(d&g9p^jHf1M{xvZDdDdL^-yE~P%`o|oG50m2%<&8}$1}uX;X&qj2AJbHxNmtp z`^@p|G3~a?l;6&b|AYIK^JtDau309ZnJC>PpX|7XnEBVukKAM&G0%rOId-G@$J`G$ zGS4kW?yVi{xA*_b^gB$tZKi%(Ona{|&n4%X=O;7FbCYSl&G?#Po}Y{}&re2}=O=^w zxcOPby#G3X!jt@gbil{(!mP-)HKx$MoY4bAP(c@6}#g ze4qMkmKGaKd#&@``em&O|9_V52j1O!{{Q$#pOw{TYH`#lCsvqb!gSf)MQv3SsZm}a^zI|a^#fX<9S}! z?RIXr`|W*Q@9X{ldSCDBy0)DKe3bjqis`2Cl^kC}_3zf<*6y3AalCq&#>wGQTKsCyqxw9m~QLoR<8|Ix#Otkaxv66jH1S21XaHQRQvX$+Bb-5-vBCK zKmL?_eWu&)v;N+~J80h?DxVEJoAP$Oa2wx5xPcmHE2#5h7B%meQ1vXJ$}@_}H;a!A zF#fPfzG>5q;D-qhn=XkOcL~(}TpT~iI2%Oudkj^s2p;XD-Ap%tJI}8$OZm2+X8qqr z%{vX$d0j%aTOQRu9IAar@n@7PYq~V5TqCIVNukP-M72-C3rA7yGl0ss z4>b<_sCMc;)viy=sCHUHwNn%|zlCu6861!LetAD0NP68vz4aNMMtBYHqI@0GwebqZ zOUrbVsPUdgr8|PEcM3JG!>D|GsORq6L9hSuLAr7SRlg<75MIEKQ~ofP>5o3te7Jtd z?p<}tv1YneR6Dg%*&2$~q?}9XNkB@l=zehb*Q2EWE#>Et> ze3SS==F15@l5|R@D{4FI*&OO~rh};KP7F2g`MvF(gIJfdeHLFyf0R+{zDYcl@E|sI z9I8FH547z)RCpEdVt?BUw@~>sQTZ&P@-JhCc`k)d;`*Ibn00H{Z|%R13b*ij>Q#KQ zou}idd^8R*Q48Ozn5bE=meb`Yvyk7Oif2%)z_FifWHDC8o@256U z@2A#K@25Jb_fm`a7t)zWm7}$L_s-|9>Zo*UsC28S_gzb=NoVle}oIDcAG=B+bq6` z`;aVd^WI+Se9U-Zsq-<0N@wc{J`YE^Hjz{D#4i37JGe9Ma2MxE0Usefsr2$*SSq~) z@)5riT`k{@3-^1i(%Sh-E?c- z_6{Dy_Epohz3nYLf$dGxHN5S09AJCRbSvKWWqcOftEOA>wlAWO?F%OVCuR4}yflq^ z?lXa78W*Vdb>nz1;T&rINO%t69Q*t6_l$==%y8cOy!~76v-mw!ybaXzr!FSBF0GGV+Z-X=bocGxgoSKEo#!9SAT9R8VdPT~E8v#8%mNTJe+a5_xew1}|JHkV@4A@lO&1SfK3>PGUc&tqs$3P^kNoFNH-k?iTsGY_#!0`3$8eo5 z;A^;l&!gHi>TT~wKl${b(hZ`{XDy0%+WCL1e6y%^N)g|w^zbkA*ARXa2k{%Y`5vw# zv}4qc{U#RZ zrvUQD|Bc(d^ZB1ORQ)@s`d3i<%c#%)6j9|VpxPmiD%UvvmFsI7|3G{nuH(ifcKiye z-^TDCM>F4}o)abTtvn|hGF=ou!F#TV>HK&S@0on2+sIq_)=}en3is@#JosYTYY;z9 zxO=gU^E#>@R#5#ggXge6hrcKPG(KPbfjX}JPD{UmN`D#E-f2|5Q>gkTQR8_K)t)g_ zdxcTsC4?KaM<1&F)-JO4>Y$EaMYY!oD&7(*UI7oIycxWca0=DVL#S~UL8TwWx6#jj zyo~WuAGdNWpw6Q#>i#b3g$GdS`%v?cZkCkp_JuYdZK2B3LiN)ks$BD^d4dR`I zqo{EbLDhTf9d=v`Rh}u-cpJbsah~;~#&zccOQ(iPCx?okLB;pse+hS)n$8+ z{4SvGGb^b3uW8iyE#lSm&#>o^w?B-UXMCQ$x7%?YRQ*>`^>3r*;})v^6;!*;qv|(< z8V7k){2Zzu5~%y%5UN}QsB&$b&-+jIcTw|T(+k&8^IZ)UuY|fE&Z5=@Y3!$c6L`4V z86(WMG1Emc&iz>gmG1U=mQD+m--73yw|xTDZ+YA)H>%tzR6EB|{Srlu>o96u`fz7l zu?;I+A0`>b*aa4UnsQUKdUg{e( zT>w>IKPtWTbM5#Ue1de+o+)p;57pnjbIi799hL7a-aRsXHx61iWinzhYjOv*)O#}<%Om8 z$57>69p!xi@ucFly|7fgIx5}_YCSZK>i0?H)I2eVS{G(e?GVR2>%KwMdOCvo-elvg zw$7>Hf$U#Fwflk>o=5d#882bp8AkmcW(;p7{{cLJ{_8hg0QV>CH{JSMY@JibDD{!5 zPt6NU)u)774~^k5#FL7b^TJZ`vZ&v;%%H||67@Tmanw4t{J-3vv5ua=YxdCZ_*BMO z9#3H$XHdVdGlDPRxM9?Nw-5C_gALU0u&m>?v||SY9KVXUu)U2>r~WNGfcdJ48R9Ks znDSKc7SgSLfcF8!n?XPG%M{)~yb08Lb<_*T@p`t$yzTw?H^SQ``j2tlK|K#x!G}-b zx`YSPzE#sLYCrKSsB~xW4EkvjmCl&ssRL$7Xar zS))8>bDY$19WN|(+{}lpTxC3na!s3V3Ol4%M19|I9QA#WQM`$AWpI)GBUmGx^1=yJ z`3F(o?~maI`}NksTqnuLZobkd^SHiEILc4y>%Dsvg zQtr0tTHf|19>w;C>FVD08XnB{71J%Fo^Mn!$~t%n_ppD_bPISEpDV4HZXWL=|5-ej z_3Di2%J_V(Q%yICbDUp!TxJ~Q@FvzzS=9T4^($=u3ZB7vzKoyaJe~8xlc@Wc96pcs z8bzfuj5nJ6--n+i-o)j*cMZ`mBX}F*ei-%tG!pnP;s^0X z^hftHOFx4;K92fbvnYO_d?Ka`;;*RBMA^zUj+(c!$ddTPh_`(J^?Yjmvled!U$sB& zje3r`fVw{%#UShA4BpJ~BdG7`hEetJN7X-o&nN6d{Z7Q@XLw#s{0_c{`KN^%_p|sg z+s9DlN}=vE68Kd5cgS>c+(W;|@GbOn)O2CIl+HD2( z{rMq{&@4tcHBfqZc)=}@J>-bOR?*!3bTIHeCw!95{-~ zKa96fpOEPWQ1>@Myqfhzz;r%TI=f6a_emR%Q>gJgfqG9>z)h6{HLeq={030h^8o67 zkq?8EUq51lZhOkgzlq-^-wo5P;iKf+Fi&8RvyA(k=`yJFqp0&uKhh(6AGi5y12vADsO?L*^Z6gtxSPTA8FyvVmGJF^ zi>Aw<=ASg`|IiNMAJpF%<-G2E%;uv8oXeI6oW zx*)2&8y~g#Vg*m595Yy_9FwSWwmF-2;yjj2$^M2mjpF`Cv;e{ip_6$k-r4Ka^`%&}oF4R2S z{;;LjLgiCOrBg+fe+gCo0{#!zajENg-U~}z$45~07($KD2x|RbonXG?IH}{7ys*@9 zllTb7jiY|wAcGGPPNLF@qsG4vKSerH>F7sB6_!e;%{t_K!czNNURY{>6ZL-&8mM&V zQR~u8uG^Y_qF36wBZ4pGdj*p|6z{r;yCqNH{CMo`?_5>^Rn+fucE4!tx{e{*b+A~tl<=Gv zobXt% z6_%>!7HXWV0lbIf0(cecI6rn81H>oiCZL zh$k@5*J=&;laE3op#fu@c%e2X}SdJ`Z0*tbNz^!t{-*(Tl+HeBm0+8pD$TN zZLeUO>*^dvF^75bPvd*(kM%EEx~n)!x^2@fgw2V4WC-DyUmr&`B;rD5`94g%r)cKXb_hZxx>*3VxI?r(D zJfmI;Z==q$HPm_B(RR{p;%85x{jRZkXYqLImofQ&0(Sp8g2%Ca*mNn>{cF;63Do^q zXVLD{nyBy3*YIPEpB2;1;}YBFP~R(@L4B@s8nteo#ETg(6Q(Pn&Zh#FIiK>T8^cSu zPGs?jFy%E}62C?K?$wsw8sYd_v1tK+xB-@Klw-(wY`ELiKsG@1WlccqQiX;DabHUPAg=(YnKpMRajW!iBPm0t-jB)y{P3aI?@sQhyH z4)%|lZWxtc5|v*Jl}{MINqdIy5W;<^eEr^bA09+_>sy@XTxU1&c*fH@UdnthjoM%I zwvT(;v#9tf)br~h)N{{1)Hn#D-lzCb^XcX{Z6006^XSht)3xws=8Y!4hkjW?jn@Ud zk?~qF-7Ic%-I_7oB3_r8c@Fh?$|=vEU|v$WR#5j1i>P`|q2}8H?!0e7eGXw5H7~>!X1*|FM_&137|gb z;m0S~-n*9jZTh=|`u}N7)N|Y#YMs1*zaZW$>b`6We@S=(bw8CsrBkP#E$SgvkD3>j zs>dwqeqjprf6_|d_xb_fp?)x39Jifo zIH|fqKPI^$Mfv6~JFnZXfEteDix;hY2@ONDKE|CFKhO4`P_9utoqV%6v4{4< z{YWqWLtCGY;m-d#$6IKZQM{b3pbo+g19Bbhq%E#P6AI6R)Ja z8>Z``;;-RFv|9&%Nc>gPwefh)%N8nL17~ReI@X9+Gu;ZF!}GIc(^XON7xBH6V*$TT z{EF%3@hg;L&UCY=_+|Vt@up2Th2JIKr0FIwLV1e#Vfv$hR}(*Px^YSTG1KKx@w0dn z@iL}Mn~A?@x&^$Pa#l0E zHS<>$XA{hu_yEUC9Y5oRrH-G*yBRMlUOJ2T9?Cg~$8a8(J*RPh&gYUBE~4(!$Gz|v z>iIy{3unCjDb)RW67^glhX0^EQss$yVX5*&@YBSrx=_-*E`Fn*8tb^JB)s;KlUIK?_CzD&QcT`v#yerfyq z-Me1Kbz#eNJ=FSq({vkn9{tlqeIITa_1v*--n8i^ z@m98%Q0b-d5yC0Fi0gP9b$=2@JtwYEUadnWQ17J+`0y#rqc}u<hAv9#6m#)O*>4w|xj7AfNu5xDR9;^kI(Uf_NzFQ9mva_Mz@iwtm9%ef0}|hyGtf zy@#ma#~43J+($kkR6esmHiuEq6I1v;jtijD@#D^Wj1@0kRCojTQJ!)9D*ceer^z>mFQnbl*w6j!2p-Jw!+135rL>>? zlb9!7gZB9m^;y9h?OMfk+F=p(zPyZD=S65Ar4z#YDd$+7{^a-^?q&Zd?oa#-svYB~ z_E~2T$ckqS^?B~F7Y^aA+JB4Jo}M$P^J^OQ9(@99)VF|#5+3u+VTE{l7_WS`Z{~W; z`0t?lqm3WtzG4Nnf5vkF)vooQ#Bbuk2Qg0Yi_|lSA7I_IPP$*A|C^}) z_q2>pqh3{PFn$(M$4{Z=v0;1-{omK%`8)Lp;s+SNJ<`*C`Z(bv?LUUMoW=Vc(`8W4 z>qhW?%9X-?jeG1oo$ICPhVb27H{zxn#7DV4#Y{K&Gu{u=PEkCcaz*g;0~we2Zl2E$ z;4k;`{Ka&A_;1n+nl6CvqTGIbz3wM)KknD`kOtj0`J6+0ZsCQ*+ra(a%zH=EweVEN zMH7|p3hMhc%ciU1lSpsLbc?9`=J98=$DHYAQTa@we&=-pchesOcksDg`ZtIpw3i>> zy_FTf%^UIqPIPdAEn*L@e$$;;Tfbi#qqm&zcPWxvwkj_u841AzAl(9 z&&}W>`DXD9@*BZbuJ^;HOX6#uML(G?jK5=l$aDdG0qx*7-4^LSpK;Vf%{R-qm+RF$ zY8;hui*Yn_m-Xi~sz0Yt?K*+#&k{E1&!XuHcqr|gH{Cd@eaBG!nZqFaM@^SSwev8l z-%@xH?UcY##^Dftll_DEL7l&-{6n~x`V5$^AOFiZ>N8ysujINKK$X*vVdDEtw+j!T z9NRzN(QTp1*~5SG++h>N8`@DAE@(sUEJhj=B^6>*#E;y4~fdSj-`;Rk4+Q9P4*A&t*u|A^^^ zQRi98bV*eE#Bo334Vo^7Pmo{KbP?QXZ`?V5QRh>?>H1LTQ_yq)R6F|d{fuiL9>{(@ zR6w`Q&8FIM6V*N&sQz9@_4gX8zgJQH-A3hK$79I1X1Wzre=nP^ii%f3_4B;x=1~1S zYq}X!`O4VQ^Ck4Nf68=|sPYw2^)29|O!axwjic&2X1W}zycs-_eAA{I!G|f|u<25$ z^2PBP#2YkS3=bi_sOci8@`Z5^^Fs&^X8(Zc`cdTzpxV!mYQJ5m_S@$CR(UotMm`&+ z>*6fsSvTDpsyr=x9`Tx{YoL$(>ZYrq%2UPNY+o|nBB~s-_)o3(ac8~ng=Z}6%BcCI zi2A>KHO@O-XO{7Lt!MCL-j^?#ZV`K2PZms9!8Y-Ozu-Qc>tFzP?ypR@&3>iVL%nC( z#BtKyz)>I!ZzLUEuhOXbZ3Hi*J(G9`$0tlTggSrXrW?e=xIV^E z<0y)U(>@W?g|UxxXHn^wQRz?P*XXw?yi@17=_c@Bq+c>!5tV)c|3G>2sPs1QGU~gI zzh&ND#m6|VZMr5ti~ekwu8t~q&2%fcMR?hCRqT<^65dLA7EQN+|BwDnw5K9@42krJ)^r*CIq9TL zH-Z`uE2!hDsD58U_4^`T!|@BItDxR5&YNx;pG>``@I7pwG~FhuUAuTM^;^f+QQuXZ zBfYliTH4OM)Wi<^Q@^z15_l-{=@7nweu?ApjE6zfMX|{BIbymn9>@NW=?3sv!u_V} zL*?&B9k|bbj$b#!d25P;p+)6 zny!Lr!tqi~mXSyJckbb~)epJ8Jv4<;oF8#KIrxI_`bQOFq<(xO&946U6 zYq~O?LU`JAB|MS%Mbj1VmF&-(ZVaEp{+#JX@ig{lO*evPv%VX~7X6em-5{#|$+q>^ z5MDxf5PwJcWB4xKn?y|)!IMchY`Os)V1K{qHc79c|Ho*$4!)i6s>%QRVqW3=%oAVd z!x(;y`8J22U|lqdQ<%jv<11sjG^$;vQ0LVI{*rQ5@DudY9F}nw7tnvVrLPZL>G|=N zwsTw$FQWdNrrW?jl26xktElI3ZLAZoWx6Kbpz&_HI_i04mGm_)E#hIUrz#j?o}9-o za{Qd>W>M>*8Pk<YtuQ7ZU>F4mh>>o8<2DRQ! zn{EV^->~UYcoFv-Nz*0pe)TiHl6fy?x=mESbTP<0xrQ1C9sDx&Sv6f7bvRU(sU)*Kf z$NH{;4<5ty2ER$Z9efG*Wvlo&>1KaRJCT19^&BmMo5UOR!u|MC;_Jg>_b@(sSZ91~ zVo2)))NyUB?BlwHU()?5UdH-%S=$NEqn_u?;mb5WyzM1Cit-on8zz^to34U4S!g;J>n)X>hm8*g(*R;2P z3O6X%B&u8m%n(2DJ1d_LPgc92%2&F_d;f;d)%!Qo1oZj5HYUigfwyzs)=}?47w{L9yX@_sM3s94w^=t!t(%9vu+($u zA-s=uRYYOZ$^6BhxZ_4Y5~1Jt*SuV8-(6@T2@pGG|gi+lU~@R~i0t9AOB7P-&_Y}r0?qfWqQ2$qO09C#q>iDfSD@O~@ zR)3?~als4Ed*NwR{sq+MLUP{zthavzTlDYdAFVuX{5`Zy~=Z z{+<01(}hv}we<(C|D-pMCvjfS;Lu*q4}2L;pvt*qdYa!t)R-YfGT$d_5TFRsQGmgmG1;9UIF!aym34( zOg>m897g5i!`n1&e{Y|&Si>6Qx?{Rk)aNYPsQ4|^=PjCEcpCM2pGnl`Cx%d;ds}00 zK1_diFvfhaYPvbp`8I`mPCUfm*Lf2|jq@mK{te@+=no(Mjd+`!UrEAsOkoW-h_{Su z)U%2|+)e+Wj+;Q;7muUznIjz?Kj~RSou}h?DvsjW^lKKCeg^e_jYd%azoLVuvAu=* zzZgx_|HY_bk$hIX{mZETi;?JBx*=4#`tX$;A4H{F!tb)ZfVZfecrD>2)c+}(!JYq8 zgnA#}M3u9KdhZ|pt9QN-*5~(T2=6A{NmM&dp#Be50afo&RQ?HkoO*7c(p|?9wzu(A z@^9ivsu#Y7?aMff75v{*sK*A+aWRPM-vGXV{`H&Ahx$DReaY-4Y~TLdj&2L}dkj6) z=O@ny;Bh>ubhnin~sQGpK@7Av!)O@^(ub~`y)ccAkYToNZy{8DG ze*ejjnm?=LtNC{hb={vqeP6ST8W+Q;@iTh@xpb?vb~Bm`lo_N z(=YR=&-KmWR+#HI>i7a~5FW!{QT|~(fc{G1^x?EKYJLmi|D(J;RQmmoSU(0(z)H)}K8mHYy?Yi7SjjL7s2*=k@<8l_?s&aZ}QR6a+ z?;_q1o=^M6z5NmVp{@($ukqQy|0ACo9!o!$@Kcm?9PgvP1Dpw#B<4SoR|EM z6Mqa(sr!u34AB_Z$qYwqvFNz^TdmqE`k^7 ze%W+=cutu9MtwfK$Cn}IaTAZ^|EF%4u8Xgx9&4y{SMhVC+csSb$4R$ox&}T>ygI&+ zdeuy~jL)Tis@SHzmhddb%_3&8f`8(;c^qS%FlV|l);Mk&vy6`^d@}JTFits2rYmBC z`@n+f#&L%IW2VdDg_LvDbXmNce#)Sad42?y&oDmBJeI;MI6i5*1m4MWt|8OKai^W} zBF{&Nd0@J+r$r2?hVte z;xUxFjVs(2wNUp*O;ma63iJ8En(0>XAlhZwbXC;?KY0*5RRhOLqXK>KD;+U)plFDBRI5|>pyCp zH-Oq-*Gr}_^B10jIn?-^;6r=bKa7WSey;N&>?=7hn)o?f!F}(do~B#CE7)GaA5+hH z)6JsNE8@N6pT@V5PZ&Q>e0{ikoAbT*U!La?Uc@ip9O`$wCvcW<0hMmvbhRfq-$`!? zzruZM9$!rSK3r$J5AUJ;`cUZogqI)ZeIVD9DbEt>_>>nOL>(8#1Bti3ZRs`f_iSIn zdvF0i!+bRE?GI}^`3#`)nf{L*H-ySBKe2rj zucQ9MsCJBdcDF3Nh{}Hf6~BziCyaj}y!|iQmG)l86A5?l6^yF}D!pY?`V}u+!Z7j1 zQ1R0^!~PMxmG&PtT@nvu{3c8nMWq)+jf2g9vTo#j-Z0%N>b|9oS|8O={}+4)_mWQm zzt8?O-iX6^7~^ix3;R&_4;%l-a|`CnuIZY%Nc;w#Nxf=#o{xDAUqZS?R64`>F|LDy zcq~eY>t@|E3onAgtqtQ1ywMZVa_<7)8}1gBM~N$GI-#y>J;7ZweJ}68F%q zU3`dnU=3BiReS^UPYW~5AIta@J~y|77cq}5V1)B#`5>F$s`w<*nL)MB6uyIU7E#}; z9mg!6zaKMQ7EdDn2!7!RuJ3#}?+)gx66*h6(C}XoB4XfbX~lU{MYe1>e0cgNWYB^?-l0p#XJv~ z!y4^8g%#2n!{a$Fhy5Iv#Vq+`@EhzOMzw1SwGQ+@h3g3FLwE0ITx_$wMtBQ#KeLHv z(hhO<>-%9*{2$VZpuQiL!C%m?Nz^!>#t*Q+glf+`-bB1{{4Ll0I_kaa3hKS(GU~l+ z6+c4LFPUx;|IBz@K)s)=;1u!ZQST?qe5h{cb8hHJr-*;2dDNWmEnrjqh|i%PXYp3r zsf;>br|=!zr%d8ANOuAcrd>*SAMuN*aof*_8TCFOhmKTJ>znxIz04n`>*5LQ@8HilevIQDAfHjZles|6j&GQ*jxQpf|Ea7S=^r1e-L~2OUcy`W>HzCs(`{mybP`^?I4a&C zev))!ri-HD4WQBuqQ=uW>b+PFf5!e%{1nG!O_#x&D9;EEQUB>aE6*gVA16@n;YxTL z{Zuqv0dJ!IdDD%f-s9v@-*Xtn1>$E-m%-1oK1rMW4!FfnYCq*m;1?;^km=(1@Tq(* zz;rQG`e9W35MDw20n_#4GVj^@OczAO_v2N>^Oj|KGsn2R#D$mY2#Oj*D_rbkK*$<4b#<8@mKH*#9KC96^|s|lIa#v@#azWn!_&< zf7Wy}sP~U$(@mq|PvT9KV*)=-{F3R4_$c)&m~IU9{g)hmnRuh7%c4G~lrj0eb4zy^ zXNi|GT@oK5y@ct8Q27ty4Dn*7i{dk=SHyH-RJ;M4BVNDh`tWMf3z{x~is!@65pS32 zwi%Dt5O2$LJyg66{4DXhrd!7{@zzY&LB(t1H1S%dYhsUh4b#<8@m6r2c*~}%Vx4wb zGTkg5%sNyylFS2MSQ2(^#*@ykCSJh#)4-Flj{EZ*qh`8goaR2bYPu!-HT}A1x&_oY zo5OQCAN%=nJ*6AOGr5iiQ0e;d&)kRmOn%3o`JUspFhu+JOt*=u?}q8R_!|d{ zI9}Ved|q_gbd#w0dII0d{!QF@AC5ck!*S<*IF`w0)pTvVjPkTh z*VK0PyXorqP121YX61;X$`Qe{xlV*p<>|-ENVm^)0aSVXsPdGwoq85f{gcNvu219m z%=1`}n{E`BSeIn+2>K^uy0o@at`XA>qxvU>>Yo|Bl=-)eRh-6;qn{s*)b&L_9(e)b zEw=xhbwLmN>6cB@ZQzxRx31|rcsTo4P1i=vmo3vZ@Sl{kjzYpXk zRZ#Eg6O=>!62}bfFo=hqK>usI`rmXB9H9PT(}hs;#enJhQT?)vs^1d6h3oqws$CcG zyR=uubo02v_8C0l)y$8kn?}tWQ>H87m6W4sx;$RX{&CagFiXFW;^&E%HQflRe!hMi zC)Uy0+#n0j_>10sX z+qCIMQ1kGx=~AfnDx;2@!UfiC6L>n?OQ`Ei(R2k={1sIEDk}aWD*giMdRsBwJSu({ z6@LvCe-#zKjk=DuOxHxkj~`*@MGVInpAl65g;AfY4VnBu8QPoi*=M>S&a*#YIzQ?< z;WOP9>Fd165#DJhRC&^<@{FLalf$M<;ZFPDPW#|a``}Ldpss&K(-lzh>!|oEcq-*y zMvdnx?u>uaE#h}MUlvf;{fg=4QR%FrK0nz;T~Au3i}2xR%^M-q^`Z|CrQAW&1@P;P zL%->K7-YXbG>vYXbPgfBWx5_7$2i)=vluTMrt6|l=OM>^h;f`n)hmtq{OAatLHuFU zrEraOlcr1H&gZ;P_oGETgyRaR`_OUJedw~czk=6tUo!9QpY`?+@FDJB&<;VYV*qu3 zqYrmq&2_6syl-=#)5Y&#WPowVx;2bH;<-Y|bOWf*_xSODSV;dV_lgaC@jm)j+X>fjfp|-(&!1HAboS4oeiv~D6~By%SHgcY9*X!E%Ado-nKx1x zVtpXBK1h0Dsr5ku^U;N#nB)2}?`&ylN7a{wN+t|48*u z)(cDZPX_fKa}f0$u}QmE3D@z@jJFzohxS;;cM)DfeU2b{jE&e+`XuMgEf zlQ>1VfExE>sD2qmwR0NPu5hw>^zNq+TPYOJSArB=Fy~V?XMA@546RccIGJJC^$*+Itgq{;i_ouXrw^&c6zt zd?fwmnZO^gJ%(!cF#eG60P1)jYCLYxuF9{Bui*F`zL0uL)qB(nOVvApw`*LX#^DU* z)Hs|*jl(HaKTM#;VG%VBE2#2pqQ=)cs$8q6c4(r?w~R04{2n;o((OZ~8$|8*qtexf z(Rao-UdQ$_#`L@cm3|TRyL{vLBleHtGOnP?TScY2xx(--Z1(pR~$EpAI6*59zeYZ*~CLw53J$29ADRd zoJ0LChws^TTpB;2^5PrWp1^B3K8_bNz6VVg!!tSW!*~MgppfbMvBkVR66Jjc^ZpQC zwuku(^*N3(-beWYcv6sl#W$1B_H%fy#Cz8*TxK5b;VSL0hOc6K&D+1??O*oxSG@f* z_;H@UmhdHfZZeC%rv7RCAnAkX6Fv5LI2o-M^D&7|5R=gf6-Wn?265h=IDf|@{ z@GRm@QSKqiJ&9U>l<;@NFW{ZT%VUWB<9G|t+sE)&pc zE^xkwQQzAS;a#LNfZwAXg1E$WZR5Gzk8xZJmEQ`U#r_4nihi!(kM>YLJe%!VY!WYn zuOz($-m;JUu)+2qDxF=ZbT&@nc^u(&RKBaIe5QrdS3e{u@v7wUIq=1{*YGlT1-)4;${j5};`TnCk3 z4=@lf(F2=G!D*%=RHXj`0w~a~Nk4Jca!se2C+N z_({gs4Bkb)(|9}Ak15lw;r*0*6@SY1w&_~?J2R5=H+7@~Zra)wal>_?T;k1A&i)h_-Q*!kc?oe$e=*ZI&x_3tL?eAvK8 zNVkhRALfbwDjdUK5-)?ZlsAa_oZHxo?E0F+4>SLanl9^Y&)@{x)2182o%Jf7#5@$j z`x!_5sNXg9<2B^ddm-yX`mu}p{`I=)R#D%-Zkw)wx{j=%(wjzIucz>Cwii&>>kMjt z67_xUgz2J4RfZ#`>qDx3Vi5Ix?Z%*Q*RhO;3SP(d8PxS<3U%Eoq0-HvuG_cm%0X}c?2B1H?_wUn>vbIJ`v4i#b$bMr zP8`*~Ayhg()VhC_@uK!!!jox7sdilS!cy%xh5DVa0;(N1{vV$MqMf>?TgRQxY2m%} z(<;8`{fslyweZWY<#Sr5YoPvbK^;@nr-u5zz%qtNw`#g2{7{1R0{(#g3wQ+QT?OX} z&*NU=&zWu(RgN+q%l2v0O?lfV@wt?L0>kVtnXZUIuJZ-cu<25$ zbKDX`irQ~ z!!DqH$72pP?@Xh92YV8C+6gaJJDIM4ujhQs<147gxamf5f6A3bU1!s%-vb@N4($;} z)gyqaXZKWV*L768c2Mu@Tex#yfIIgEsQ62$aa2L2GljaY6;a;<8AG*K4pom)?I+zd zzKMQ~;{U1tJpK6Y0OJwWj=d!78phuS-f{%%2-Lh=$0MopppM_#XUBK(b%fVY?X!ee(jSYa zo5f+)A7%Ux<0Fq><9eDw^>+$i&H68ans;KT>%rYpY29r-Ncqr{)WztgVcsB(^aCQ#?o=F6>|b=3Hn_ngFa(wV@M zx$YHklW-p2NxjDKVZu3_W_=Pz<==<84-DX^Xn()ye5mtb7bZ9#w%v|y3x7;KdUzZA z>!|YAQ01S&KNBwFgZrol-cGzxJo_ltA@~schw#JXAHpo#`|)blLw%_Gv>*<#e$j`b z>Kwm4#JU)J_*af!$I}U~;Ty1nIxkzeQ!e}t=`N$nH;=0C45}T<_+k2K6xB{yOfp{5 z_z%J(xJ)>Os!trd==1jXUS`|ZQRSFH)pH6}&v8^ebEtZzQ1wip>N$j}XB<_}2&$f8 zR6Pe!_1u1`tt;EuBD{zn(tL|M`J(DyM%8~3RsRC2{#pDB$BlUVlXyDMbrYtGpw_8A z)Oox85<73VQ0Hv}_58DrlZ=m==}MSnewLb_i(Xi2e$M0X8HXdNbyMiITsIgGyYR`B zXX79N|5T|2RHMdVP2%?YT8<;Z5YL z6(@GQ@G|QE3smqsXpLR5O2scf@ct4Dt_1t zOT`c2r)kF|_5KO@q*3STFfLHf?&(}tu!VPG13Q#+4Ecumi9Usizy1d9)2M#~A7%e6 z>VC6`$8$br@NwEBf_g6D!=G{7_UrBVRn+lCd?(|+fcMc3NmP1$sQbd!h@~@+x}VGA zPf2GSe~B5?eOv-h<^CX!2cOJ*iuzr&80!9ho5@}KH?hU|-$2D{zDqMGy~Q{pm+NuirpDk61^g*G8q+LVXT#1^+;J z3H7^g{x`DTpq+>D2HH7=`o7E%>i6El*dksC*EntfA0VC78N3&#+(W3}sf(e$=Nd+( z+lTrdO%T=YJ@5EUd@|!<)eE;#pC@bKknT(I^{fY0P`_8VfGTeV^?P-5sPs#yaht;@ z6F-d^@}D6;eXpj7`d-ZvK1w^q&!qm8H;gw@-VpwjdiSHAg9Y(;jtk)7gnJzKs{?6I zRJemrqkOC0_7>j!OzxXZ*FcqL86%`$B%Ln#k7J&BY0PvvJevEIQPXAdjay8C3sIqJF<`lK2`gNxYeOQT!G5qv8eM z#Cd{s!u|WWKH^(w*D<#5oJXkVj48#V9_!e|HPmy{4t}5ZY~t4_*9tz3akz|sV`)@1 z-4brlKePBC`Iqrn(wRb)Bk*S4uaTY)Z>D{B;gP#JKiU6g`eO^-acc&U&GY zD~!`Ad@D|3mUt!n3-?zAJc@J{@YD4FEM7@F<<7EpOrY9vgY7qxUKiDl>v&;;af52d zS>j!(eDD$C7g6O-W-XloR61?8E1ec9ohB-sh8KSxm0p|pUt-)rb^1}`{>^TFFbi0@?nmzw`$ zURY}W55L8poAu*Am9OV8D!&At#`RH0~alevBrISOYlf|ppo<^lN?1hu4_ib_1`?f*+H~VAw zUe>)4)bp_cyod4EhkE}OK)rwSqvH1{-$lG{-^8ym&vvj#dr7s|suz}OuQuvE-0-N? zCxu_2K1tIh@O6xr7}iNQimF!#Ro)=#`itd@^?s+0>W39n|16>UX92k+ofvtWZ682w??c7+quP6$c>g8dChppw zaf<4<;5k;$03J_y{igGw`mM+Ds$bVjr-MqTjq0~1D!sZFUO~0P5~|-8@d@HDp!#hd z)o(MXew#-1+a#*rCQ$LmQT;ZC>bEq0fPRzew-GNa)o;V7e$$uIv|ik%{1NK2Wx5_7 zNIS0M?`WS6zKwoZMb)o~D)$Pi{}yq8;}=Xen$;|Ba%`If5!@0v-LehKkol#cQIDuc7+6iazpL z!2NL=)z5?HS-ZsWDC!k8T?F;{k|3%be5iD`a+b~}>i)QcO0VsOYq-ACidcP7u^=}`3g#MN4-=G(k>fZpWf48X50_We-+pRu}_!;$+ z=_;u2=TGCU#4mb|Vv_5{Fsj`K@fyZi7!RO4eW>TRK72Ca?ep#UHS`l+^}R&?Df5h9K^tShC-%n6asd{dDVX1m{QSGvf_tNhRsPR@or8|!r zZ*yL_gc|Qfd?xKsFkKeELBEcm+AD#2@3BVxG%i7=VLTA~G0t@~h%Z4uDxDtrOsoBIr~SR~riERXcmo{2 ziaM{FsBy7^N3negpNYfoU|rAsL;@9W5EUnteoVSCx@l@tJJguMk29Ial262n_+I}bPNBm7x`dvK!5bEiL zm+%>+KZi%+BrY(HWrKNS!V62nu7Dk`V;PJb#Ce0NM-m^R95MV4`G@gn>J>!YS8h?S zD@a!=-JTbgO1F!r(LXuL{X)#({oD_wu|>O%;7QDT)2QD~E2751A|B59T){^u$2{hP z)CaF7-*wda(MFvgP1N~ON1Y$Ryp2ykYJB=o=ixT{H9mW&@tJ44#@86?JkDSUhw)iB zh(D%&QuT{@VX68}qRyul?!^^62AA+?+`uc2;ChIk;{5Vo!g~A|+KsU486tcI{TD>- z&wiEm!3+lZo_gAJy?M&R`0nDJT>skWbRM&*n8(m)O+U%)0HsAeM=to{(0PV!>Do(;RhKXgLnq%#PFHizeG{vFoeo~0F{3~ zD!;;)?K;)^66Ixl*HFKcUqro+$>Si``*D09&-=zqmqoqD&X{fxU*Mx3OczAmZ~3vy z_*tH_=Y!LDINOUj#_uK+Oqa(v*TXR^G2TOX9$`P~`Bdd9d*3>Z6~^flUcx*xiHn3M zQ0-H|2dP)y3+GVv348Y8rH3=_Q2A_p(ZU^6IECuB1ghU6_$cRf7?n>5)h>PbLE0l| zx&W$Nn_pmkME_E;{^G)OqWIV-yoLg-x$7(^E8NO@t!?ky55znvv|+2i4W1QUA&Hb)==Yc z5|z)Gw|&&xp1?<#XX5x{&YviLn|cIL_1^wG^`V|U)bX46L(<*A2JO&Awcon8z2k*f z@p9_jHr)cM9u++FsgwuLA)ONLlnc)zJnDsq@$H0@UU=hkd>(`OqlKr_4^>ouEntcE zs+evbcg72TQuRe0*Ph|?cbrEJ)VNkG!Tdvb6>p$D>v$^dxQyqMUlmpVCDi|aTR@d_5TD6$5!5*9UQR#oyrhFF z=L+`iW1WC1ZvkIQ{1iT$`Dw@tcP``e%k;-8s^4m;bgHOy=5XiyN2QlXr8k0FpAKV> z=VB?-CB5wl{3qLoOc%pvk$)Jw)UywjUJ#YuR+;BNx<28~^~nqOEbKaX0porZRjwu~ z{|1&>AJqB?WW4)a~oXnw)8^#9hF^IY@Msc*n=a@`4fa(Vys$V*nT05@duQ{%b zk3E}qM5VWg`rJzeyUbVfrklehJ|8k`x-veW`cI?UZ4!0-1Quz(lIaroEAokZ`v>tC zoHtQaI}G5P)eiV4jmJ;1u4Vl8Ot*;-P@XP6o$c$UTf?{T9Jph;CaOFQRC#Ks@~q(d zDbKR$mhkJ0hk3l3dQYL|%L3lOe40g_*Gasd@E|@$yG8y#OZOkwUq9H7|2?{hE7J(M zmT7bm>)IM2*0Ee-A+!l06B?mS2#rj(SR<3IZSPH+5JFs`5o^Mo_s9F3zwWo^InVPv&)?_A>%7k4y&Q*Xnd`}m-z(GKXZqbP)9-eeez(o^yG^bu z=PLhAJ6z@mg{NoBR0H}XEpl|O@Dz5e>$^1AJm zxo$h*_gjn)e$DvYFD-WXGuIferNtJnUKjJhndg}MF~_fwj_r?_{T%Q*<=AJ<1C@t) z@7M;P?)bgNr#Viq@Ot&N%xt&BKeYeF(&93|VSLOo&;7JA=cA1YyN;}9%6akX@_Ofl zxgI@cu7eJk@+~p-Fwb0{PIJusGR|Dzjd9rg-otwfcQWULZM=(kb2H_6;w)3{8fL%i zzf&%sWBw;G!#tNT$&`D9Dfci_?jEMR-Aq60;vXq*XKB&F{NCDLt#4$;UjzTz^0VJA z&!hI3^Yk6&{BespU*BZvaf7L+HRim1i5u20F#T?Z>37piznfzE-54`3j`CNfGs29E zLB2f4#nPg;THjNx@8m13?tHzo0suAYAs*@>iJF{IApX)lSo*z=4I{uCL z7gLU>!spzupHrsXSD5$*yr1wsPqfb-v)wK~V7qNT$Naa&Rp$j8Jd>Zx{5}Vm`s`); zMHlnlzZRZq|H+q^<6@M#Uo*rk@2Tu!^54M^>F+Jf^C=^T_6 zTg>_OX0`q@+ssqlO!{5S{yX_S?Ya7razD#VzUP?qXP9`?e5mxNN{b2Re%&~;{UGx{ zzg|AdyxYnbDR)b0arWZ!IBT{Gyr=1V9U43OO|53U%Y;c^vR9c)*_+Pr^C%nDo$EC#)6aSF6v;0bFvCqWc z;ZIn;U0Q51&(Uo#$Fp^&pDi=}Y>DY-3rs(oWBS=FliwM>Q9VtU7E??=8)xp%jWO-p z%RJ}Y&5WZCUM(*(j@o$Xdi~%G2X&_+w@lFp=l4{JV&(3 zf0h1a<~>oX)_>Ug1%Bz)=2_-B%Rydm9BuLY>SOf%j z!t=a(|C%|zPcz5&N#=f74>R93^RM-X!<)+R7?bWW^SUwNPI zm|1?noL?+5>5nn@wOg6va!a+mneSJ=MrMAj=hIzh*OeBv%s9Sq67~Y;3FoE70keFU zFSLB8v{+`+S>!XMbGfuwVE)%J%dh>K`z@uuM_#^HXtK1pvTEEpUhFaV3%B@yTN%I1 z{lN*QJfpmm_8MWHj~?QLd<>QrE!FyFCZ7#_vGw((MJ;o`=;S@+dG`UYQ;+-1{mMnA zzGnF%+s%{~lT5q`rk*F?Er0Htk2B}F%}hHky{o)`dYQR?Uf@&J$9!oqS1q6Au;nwQ z#dNiNia*q^CrgV_=Dz6qO6ekVy|BRSZ;B7rKZlv~&4J1mUgtP`{!ZgayKgh~vB7cW zS}!f;n0A}tugcGKX)(pbALsMMA1f_JnfmEvw(I6MTt9Y|7M=Wvd8(c7b{*MPT3mjI zcGCU}r9~6}Rz21*4y>PJ40*({x1CcR~*U6%MXsPC)_N8#d>nV*iBeD5&x zQtx`1ZV#U+-R@G~!7i6~^84Dgqtth=%YJk5!Ll7snE$t2VSb<5WzOF=nctf>_=obp z&YR5VYfSvh%sCwUs9yDC_Zvzhs`?V(M{~ zskc7nxYWaJ-@zQ;>UanB6;ofeRXC=;w#cwTmQ|U#(qP;IQvWYHLX8k(mUk&joOu8 za@^VG&sx9AjN?V-{Sfnfz41KBjO(!~+{bL!!?Z&evwbVm4*65|b?P^!elOHR!ZG!G zSk=!#RX^t&?u+Rcr~I~lc~V*&^RB{2rNto!jsGj9#Q`(lZL`z2;Be*LDiwCJdoxAU=$PJaKd+zm z@FwM{`zz1IIRC5R)!&gVf1l+iS%1C#GyP|uY5z9y3gJfPJsE?{ywb-{JAde9@_WGN z*nW@u>T`$B(=WI9Aa3x>+GCXul-@F*YF=F8>%?E+C};SqoaBF6Kg>LTd(I!|w?|Aq zdN!piop$~LTbcH1;9oq@cwoNAF~r+)kS}&WY=FP1f6lVi@+tn8bSL>)+b{B-+H0Rl zZZgMrHlA9T_o+7X z1+J@_*eE~y%zn0+=QXDO#`UZClll>JUSI@lP zI1l|NU$gYe?i~uFRXI#W4@BS6|Hg8V-1)^O$}9ljFi3x6J3ee4&1{ z!yfUrnCHkh`40VTo$2>uTjl>tM|dawf0%c)etvPQj)^O4Sn$C!2> zVt!W}V18F?;M;RNr&q@_<*#9W zpF6M8IcECbCVz<=e1djaVXOYI%tJ|f; z7PH+tkHlLmEmrve;g!;2ng8kiVN0dOJPY}s;edQjvq}7^(xR7My?#SCAE8_w%FD3Fz@Xi z;eFIsKXZSzk8e~@ZA^Ze`Dyd-rS0;6p6kr-TPxg|^!ssXF~d8{#||H%oZIYGe_N%+ z5%d3mD}1zc5BPh^+4XnEkL^17N5UP<@uQ7DCw>c4AH966?Z)_T%00-;)61VM$Jr7y z&Mq_KY=NJ&-86H28)nKs#8VD3^>4hn;|xDz9&KZe6SK@bKgBKW zH_n{Lj4<%z0UT6^=PC+hpRcG5K2N?ONoAPm|6phdIXo(tb^!F5}lT@h>s$ zb7FlwsOXrk`vv`5O6L zc|JSLhdFN@DlG=9!f(xQX;?pHgXkn`fw zqBYA?zg(5?vpv^$=HpWiU$0*=`CP1)&oc4G`Cjwc0N*3sZa!PQ4(7V6os0TKL&D~l zi_eOm^!Y^lKP@dzqWFjWja&D*zCo)el@mrbx+{nbQ zW%}jCKbG-NnD|G`^V)m-fZyqMnd`M}K1=*{Ub^0XtMyaW`U#F&KT@slW!krk$xj=T zehV`W8mr~C)$&VK`1CVnybY$lrrE9@N7$#I#~uBAxC%$%Vu<-4W?=ruV~_T+#hQ!EgE=J-n&v-)bY@MYx!{L z)RY!^>B&^a%RiOZsfWzC+2woG*Cuai9-8Cp9A~EZLiI7hk2`KP@`u{*aNqfZesI7y zrQVqLDQq&wk7Xv_4AW0WIc>i!{8Qy_=H0AsWR6$0yqEnRf5Gpa++nVVHktek^T%yB zz4mKHtCeZ|(pvVB|Fqg|Ryi>7LM zBOhsbLupZ8Ew5v*<+Y_nO||?IA8Pr0#>UqRJm+f=N z%%l7KHT{3Dv{++~qbtn*mYDs_G3gBRxg2EP+tJTQDSuyS(aWUU#WCr2mKLpij_r=V zCjGmccbNRFGW}(N*>0B4vfWH+F~s!GHeTyE)xu|6-&|VMGxvLHnfG>FTq*n08FPQ` znCUM&On+Ho>T8B$!sE>GzK_r2_E%kJTfffq?*?AIKKV*{{eHq{WjEkkVqCX|D~YoNG*bt*}pfEteKcOg+(5YT1+$bGRB-|4Kn?ppDBMI zQ~n-~+OE5_Xk+?u6Kn3~`h)M%AL~ks;{(TI<2z=2A64Oab$m0&*&Y5+xi^@0nPvLj zG*gaAK0-MrN{ex(93y;={0x^C{n2*yOuxJMQaSF9*{Z&GnRZxX>VJg?`pZ1i52l%Z z(8{z!4aej^CjXbJa7_Ns%rhU?4^Nom^c6P$9~9H^Fe z@ala>zDzk<_$c*MTP?p-Ek8dhmv6I2zGs>7KF!Sc6U=xYX6ChCrXMyk_oo{;lzf*K zN6Iy?{tlVZg_Y9@rkQSii&k&UTqOZj7+kcpBoga`rLb z0qf#hwbKFrN4XCxFPQYt_%i9AGU@O9tA4Itwt0>HZ1NVutIYZF9Mcb`nEMT*%>MeB z`{sT8ruDu21@+KgEpKD5d8Q%j<*SBo7Cz$D`z4&R{Q;AYOaD>!uZt7cNBY-!X>rC} z=biE?mY?DKKzd9Sos=F6|wp8u}BY}Z}c#IMU=9bX|o zwLFkcO{woUm+Mz}E7xO}`DFQ6C@tprB;nc8VvwnyZsz)}lS#joNxzw2lzvlb(a2Ak z*G|;K&D39udPsSinEW@E7Trv}b@G+c>0s(@{69TUp0C50TD9X)(?b$G5T4 zVw9i1UVq`C?fRJC-Fle(b@AFe>o?WUo*)L z$N9_Rr+()7+tQt5>Sz75{2%!$Z*Th*_8J$9+%iwkFyDb2W#<18o|{jG`GC8tPv&=o z24-HbXTCpJ$0tj_mcL_t4ZmgmiT$>iPYx^h_!{GBmx;H-#9LzicYbQSe4p@y_cPxe zmlj9N_X!V~?-L&IP3mut-Ini0{j1@-^5?jA{{PDP;gmT}oG{;^KIDzcy~_{V{|0lM zS>X?*Gs7G=CYk;^&JS5X#?MJ-khxFU!^G=i?yI)*{o=JT@fvuwet0+K-MMtlrB{i+ z&F^^rY^$``x|N(o!^#^w$h@R5Ay%IrqZIG@3j5N|CtYcU*fp5*k#7c4xcTb+oi=O z|IYGtKBC9*jE~bFm$=dAIfK&TaXYR{E+p%rA1G*zO!22!H-(sURtzqTEA^&_S3}dr;&dpUPEb7&*Z0$SM<{w9=T4u zR9am8uj7O8d1-ORRp-yArNs$zALo#{&OG3ajw`$T`5ecpBH{I1c>4a+lL3isM*mvCC|?!{<9s+F;_ZSK*Z^ zJkO*zS1q4r_A|kxJI=qF5{mu z%a53PJuEG*Fxww6&tdH|>26oyEoQqFzEnFcRLke9<S*p0lE z@zTKmbo{I1t%VPNAU)|GF#Uh43eWLf(w*j+^W!Og%e*|s302U?&&g*ue@Xe9`N-^t z89xntt>Z&oyt{mV-|w>KhduVl*JWm0F7W1#OVdpJ8eW#K*)#WF?Z20Kp1FsM)^~6_ z^;9iy=5^Y?t_s&y;q&k5&yJ5P{CLvm)#n=d3F(X`tX_xt7~A(T&%1Rq_0`F5ng=^d zi+1LILJQwxK5Q;6jvSwp?hc=<|8G~}H9p^bF~`4nsQvId_0`M#?$E{DFKlA2r@DUZ znoD0&KOM~XecSmd>)V*``?fOgKdt8jjJrC%|9<)fN0jdp^L^h7$GJw^oiX3{J>^s6 z`-u5n`H-)-evf_5V|#3u=QXCdX#W$;_jkvc@9&QB^`efJ79-5}cZZqp?+!8F-yLLw z?fY+b&87cP@4d|L+&#?ixb0bP|84BHzj{7|mzdvu4{e{{+xM97@UAl7;az02etDS# z_P4;CXU*_`<$u!lU$CEX{*3-VR$7cQ-{Bo$zQa4qjGy+KUvu?4ylu>Pc$=8-@HR5* z>-meU<(s8@VY^2gFQ@#F`aR_Hg|F~!)^G8y^0`@sH@Kob*ZDirS>;XQU6x+Hi#yMJ z7k7?l*DD9}UEFCtPrNDqzWSalEhd=n;*RlW)b9vCA>TvHdEx+{>wLMN`7UlB^IhCt zenb2oroE4t?`~aTzNfm+eCKnIZ?M1J(qf1CF76idUEEFPySN*r#X9p{+!cPt_8m3O z|LmuYud}?BHwia0-^Fd<$K|J<&k?_l^Y&L;TGTM##m!5S^4+=%>E^q*=e)V_u;uv< z-yriH+X4Q8?fXlMKIS{Nm-$TfxxkcjjxQCS<*&&9OldLA2I=fE@phPa+x$c6Zj~0B zY!PpjNq33)9rc25wA~r=9othb*zTmXIA*?Md&qppw*Q)IuHMh+Wxng%!{^$*n}1}x zuF|5DPgCv={;}olr9}&0V0jb2Xq-1N<7|M**D8~rWqwJ2SmMuck+(HZT`n!=d0D!1 zrNu03oOjQZ7Sp_|=Rc-Oi*dF~XN-ShyV25Ogr89Eb-vbd;E2h`Ayc0ROnvTi!ghP5 z#V%8y$9&f{`sXdoGs@AyHw!oOFIdkzKfrN-i^6?;_AeTrx4h=k57k2*S1iA0V}@N13nI&sFP3_|L}I z0Q1~kmwbF(f9T}5?Z2b6xN_|^m)@;h2fXp6p3^BU_V^X?SNUN1SgKs$nfY#-xjvg@ zljFn$e@b|WzbJlxWe*d-gNfh5Ir(bloy`Lcyv@U$pOhAt_;|<5^IMxo)axGK$Za0V z&pPic|7)eiDu=IEetydMovIvX_B+ViUMoMG(=MHSmHl^cN&PkPYCiauN6ANNaphKJ zKK7Y>tT6eQWsaZY?6{SAmr3WK*0|?3|EEDd`QKdOEA4-o4^_WQrNsn4CjJ<&RWAel z@mtFuZ_8%hOaD30PQU9uNX&hZ{VE)DA7qCQk?wYBvBjr5|J^JtHaIN2URtd2UY>WK z;L{vuN0{F`hnabIfcc+M4|AMvcarf9_1?-O_1;oiG;=_^HI){P%>C7R<~hq6<~X^^ zjI&w3K{;Z|F;j(O%F)l)Ss$~$uL{Sk@8Mh2S9g|czs?`O=F*pq_ru#57q*Mp?n)Jo z*{<#G*IfOcPAflmz5d7aqeiwmFK#F;>bYpXtK<9BXKiUw!)@{NXP1Ynr;EFp@2x*C zE%y1$>-1B$DDOIdUO!ypjoNjU8@bNoh5oR}FB@+&Ouw7tkb0abEe4tG2AJ*oneE!y z#+J&uYJDyL*YdfazUI;|xNkMW^rKpS=n{i&UIG|$xY?UtY1#r(x}!9 zi{DqC0sgyw8PhNOt8h%e>}1ky;{W-caARq)e&=g0Jwm!`rNuCl&jvQsdOnLuuf7V$ zq_^K_+?wxJD;JpbrSK&c+s*fK2yz;fM-~O6Qi<3K*=^XGo@*lIm{VE)@zaH*8 zuROeC=`R0W{cQ7D>fv$~o@eT1rdmE#Eg$CBr5}_2P!*0ze~?M1mr1vqNvDgKTz7Z! zue4JG|4%vU`8eaZmN&D$rV4M|;hL+@Pp$Hg9arXfCjKDvKf7MuM}5>X?N-CTRo|y> z;+%?i!ZqXQxU@KA)^GFs)^G8H)^C;;tJU%qe!%kO(qfKh((h-tanMrP!0f-C>CdOP zFXQcTsl&Kq@-@notDDQ>AKk7DA2Q|MVaCxGGhWvDpZ9fqslq*#BR^5i4}7)b!cb|^ z$-?#>oUy#Uv}on;JAYrOzvj}PSwGL@vyJZ(Zmq)mw{`pz-ecBp@FBKaXXc|d{=WKH zEiG1<`?QlxJ5Mm}JI=K47}LH3O#AjTtl{Ri3jJ?V)~8`47@NDJ_oq7~383x8&onw79}gIln#N z(e2DLrNthT{tllc{Y@sH8|;(LI+L#zKHd7oYW-z?+I|;Gi+R4%{^m-HSti|SK3Y0c zRd}39e~j<8{b*@1!q?b-xU?8z_B+6S`|V}6>*0HB*Iin4@zu8LEG;^i?b`SR+qLjB z+N+VNuZDzeUte0(G4)l;De2Ud7MGa%y3oJAp}x*bi!-KNhrGArM9jQ;r3%N)t2^51 z1@gPi_d4!ul@_PWdD{_lJyCxT^-`u%umF~%EQmyMPdBg}c= z5R={j-^V`QbiHv%Q`ilQG-Q3JwY|c_agC?U z{BXjY4<0kuVOO|l{dT;Me#6{HT4#P|UuJ%vn~-j<=SG?9k|Dm#d^yPEtDkQWzp1s{ zZw=pX`Gw`VemUo#Cm;Md=^QcnJYasG+OEQz%z48alkZhNKKWqsdzs1a9RJStQ}-(O zH_Q)MKEyBEUq5pm*2T4Gabb_y|0a{4)hgdByoc}-lkdy?^!4`3 z#G7We8>_;@%ySfjOuh%0eD^Wi_wuvC-Aw*FnEbc!=B_VV?_H+f%nw`N#N1yylHcrS zkJ;}wQ~#U%ka%nSH}Mvj`)M;wdKy?LpDLlq? z_Va`60{cX zjn_DC)bYoS^ICSAhmV>207rbY^bSjlD}4U*JTFjM?DOCC|6N{dUTtqPZq!>HlYT8f zD12f4Yvp52IQ6r{)XySQKXXjEW-6zc`WR;FV~DAb9;QCdezv^sKjz&tpYT(!FprcL z2mF}pj6HtQcH7MNJ64(N;uSV2=R9+LJkCenO*>S}2l(vk)j!vsVtyZNj? zqslQ;g(vw+_w_oMd83WV_qlpWI>-EE>Vx@z>JD?gyurid^XHtmY1dl*m3r-F>c5kR z+OdQGX8)~xo$`;jUvuf!&PPXiKi^v%DJ_P1U*VzBVvv9CJ(UBcMK^Qby^|?#2Y*Vw z+V~#fW@dafFz+K>%l=%aE%RLdmUxqLPgRaG|7#y%%G1l-XP>wIi_QD9{I2CQe4p*6 z`5yaU;}^}N%glFXuQ1ou+kB+)a>$=mkLUbD}BY)4XE)DJEVEyB)`4j^oW$IOaIs#JtbGz1Q`t>##O{#d&aR zY0<)OIuC9xEt;6;1{(QdiDQ0*FC(q<@wVvi;G`!z3INhd1-ONl1FcW$=tta<5QKhwX|qv zjd{C??=z2Gd6;>Z2fUs9?sHTAcA5EZoypH~<~X z3!iRzGv6S7BU2v@%=V`}?$7D>NBp+OM77zZ=Z`>RGv7 za&=vE=^fhRkm<))m~nW(~E0CZy(cdy7?r_yLfe8VD95IGy6Muko#8hzsb8R&pI;?tTE$hfqy7}v%H)2(@gwv zKG1#!`RDfE!BP2bXZl4ev)>kGKaFg%T@CNAo-Q6(hR>M&9y9wpWaghMOuT*8YNr{d zKBky-MyvJ1Rd|p|r?*<(&1~1je8;kl$#)A=54F5b`lp@OT>5qOdBW81Ay1s=9#qTs ztK~a<{{z(nGhZ|_{i=p3@Ad=A{=CG57nuGw$D}*W^s7mxpN%v9aE$4Pqf9?+WzuhA zj(7D{`1t4MS{kKHAH-+P<^0jSp7NE$25mZm#pw zT;}~PA7aw&;eBl1$=pvHa=wuN;|}m!=G%Vm*shoPKW;bkf815(yla_Be}UI=hM!{d zBg%QQo>^bVJMf~~?u2(1K4R8y@+Rr^i1&KO@lHP1^;Ab`(Z)Q_GRVJC?g2i}eeV9! zVuZO5GR*h64>D9*tnd@!FEj6zUMejXne)_H=KYV;%=;dvN{dP6`frE-&-u_cmveum zw7B%h@_OK0cv}BHc;<*DP#wa+CcowF*P6aInqM^$=Ps_;JZf3ICW)%e|E{-?Xe&)e??^S+UFUTd7J z@b}FpOU(a{E;HLLF!85(Za-sujN?Vj@nWD>x6%%T*sxw zQMLS#U$y*7X|ciQn2#3uMf+XgPs-ms8`SS4KP)`K?^r*=Ct2Rd;p>eX=K0K(zB2v{ zlinC_;W>eB{*&$6c~||sg?5Ccozccln{VX!ie~t5T${$nyu__!>{$A$) zDILr>YJN;PjvAS9)WEcR9W#z`%ykiTfW?C=}HoBTT4ZTHV?V$z-C zBcwaaq&v-|JISOw&ZIlSUo!s>@&4LxfIqDt_w!$**Tb(GZ%aHBK49J_w97~9AA`TF z-#hSwPf`4c{ii$V1$pXdB7^UfKsGY_7Y7AG8beREt|9Pw`QbI48gxy`im zde&dBo_HYK#hhm}^IwJYl7JUDo}N9?eJSC6re5Zm`sn3j*~q_AFE!jyzvoZTzsyI+ zO#eCJd-V51rvF@Fj$;Q^c%Qei{T>s4mx;g3zZJgBJWo2v^wVx8UyV$@YWQ!=OFW)v zJS;xm@g?`|N{cxr-;>OJh6&zJdZSGH_A%dQtL1;F=bF;uXrS!JhrHxG@-Fj#ILl9@KeEO+=&iz?%>P2C0EEo?w~N%Du=V<=Eo8t#5jAIsQkO{yfMWkNWsu((UH+_1AXh zxYqO(_vzioXyk3AQ^#Zdrk2_6LcG85yVg1HrCg`g_9s>NfVt1I&;OMEE_2-4VeYeR z^8U^T)|vY)tIYkD6(;^NZ{_~qB6Iwj<)HaHX8xY3!ZGvrG;{xDiaCz0RQX@#E3S7u z;(L{6o{RE3&8zo!nDzjvAWdxxj;y~WJm z8_fKD%og#Nht#wEFERDGz|`kFQ=cT`(SwVwf|KKq&a>|yG& zi>c2JrhM&8{5GaOTbTN+=Tp^ZOnuf>;h6fYW$Lqrsn7POmicevE7WHbQ=g4YebzGj zt6}Q%%yxImyjNNrG4*-K)aMpcpKDBgp4u+s^MsAIJ1#AbnEET92=uN|howwe0c zWa?|93NJJDwZt>!zs%Iv0U{}W97ai+dTnfe;wGt^g1ef3x2nEL8t z>Z_NjulZjs%QMG2E6;3cF~e7=zX_)P#+mvXX7)eC)L$Qe%JWdYr9~G%-(nmx^>$%D zskc?(%!@0f#Q}5t+vC@iV~79EZH^h&hgJBPIc|49&3KcaPJUImoxkEZ(aJ&fRnOZv zzpUl2J3i%4^{wiElsW$%;-@&s?bH+d#2XtfkB_7L*UY!2#V~Vx9OS=QK2TcpSIhgj zkp9f?=r3K&_e$IOCC9T9>HnMMM|`IJ>@oL|HuwXs@-B`uOV#pO-bOpl@apda(#h`t z3w)D&%=3x2*AJNE`UP_yvGjDum0LJ}shr}2U4M4-%|E99^0TfJH<HJ2#Q#PxwW3EX5h)336;pZJ^4)_+o zf9#hQdwjQXvs+rNuhmEWB1)tTN+zg-?=?<-VemTfF8*?av>V?rODsv06UIzp#9mf6hVX|DAnI ze%hJqqBj1Sa5HZqy(Z@R=n_+olb3oP@3H2^(&7pa%^&-`rR962#SSlNpAFVnzFu0a z^7g_jrNtt@bDjESt>v?&#W-&+JXTut^Jc<*rA0gc*Y96#rNzce^cU%@^IiJSqmL7A^M=Ku38eB?v4J9FQyj^7im<>U2- z)A4IA{h0JmN{d6jP5)S6>T8y%uPJ_0`s04!}^Qom+tU()^C>q{MaSOL(XcyR$g}eZf5%P(QlOF z?~wnj90z=_{=dVNW1E?O*0^f<0`D(h^L(@8(>Q<1adoV;80E9>;5buSbo2l8)2`B@ zovE)HKDXYu;!pa2*2S-1wOHqWr9Jr@_Or^2!zDgKzNh&$_0YzAr>BK)X;L2ki{Im$ zN{fpz_a8Ek@}Je$As-~&gDSkrA1c=pzs^CXyj_)@e2D(l!Ashuy|ifM|EE7RSJpG_ zR##e_KCf)26Q-Sx`Bv?8R9b8?>1~!4>#P%AD=n6JFTejUl@{~7t@U%I#VA*_>i{#Z z`uJu0Y2;VfP%W>kmY+S>b;!-kTf9~}$EC#)^S_BJ%(&cT#_Kk3E#6jXvBC7~H9pdD zc7)k~KePW{X8TTNyfpG^KC1O~%yw(faa_?(lN{836a0kueXP;G-OTZzjX54Pvq|`D zRR42)JYmM=5i@^ZVdn2`rk}4d{d|Ra56u$aA>Mqoe3t3|qfGxF^cC_KaOJ>Pc_N{dP6`(Axax~I=FF2vho#^W|~yxL^)x6b5a zfr&rBl)s0mmu{wB+A15F#7}BZewgiixAjeY(zJPxd7k2Qq;!_oT0hCW=Wvv_6&_~hlYS<@ zEzEJWkr}@`&Uf-V_AEzp{m7iZ&s5=<^Y2hxvr~YuIq-F z^NKzuUn|W0zC|YfJZm}02RN^5c)8<-{#?ske_vSsyZYxTbKY>olxL@k-z;A4KXvn^ zmbWqY)5e+W&QT_RBg}R~O#TL#{B1D%TV>jRnLi=kBI~)ptM}vha_3hqQ?9!#Z)DDA z8+d2odJf5d9q%NZm$FRo!gep>317lPzL@RSFY3>eO#0)@{k~D=e%~-}a(*_z+l$}N zKa_qiQ@$Sl5s&#H+|WN(S#xveBfNunb8Itj z485X!er13!F%J5ebbFX|J6U61X=T!D=C!Uf8=3d5Ur6WS@>T!J^7)gC-zvw=2^aP2 zqbhvJyjNqV3U5>{^PkM`m-#K%2Mg8mF8+h|>R`ru8_$fl*3zPd8E1{mevakmR`Peq z{GPtY{64zFq`S>S<9(e;ca2|lp1s1SJ1#7j7E64k`C^etf0|3`VUoFC>Q>H&DsLC> z<#^j!T6A##LE4*N7QdOdxQF)T_441xtNoSf$4g9qnB#TUPczqB8~jP(b!OhZ!n<>q znV0KcRkq{Bw0co*r@XaxJ>=)i>-+o(^{~sndpKX?bHv+Zp8s0ox&E-k2dak!?i+Wr zY?l5c@5({8slPtnO8Q;=Da+e<7q&3@uj32NBQf(xZ5580M^5DXCh;2OJL%3c`VI2(yS}Yq(&^%F=|`PxQH~D2O1PPI#={I#z6qut zhneH&AYY(=uJC`%>zDbIX7$c@-NU@{JH~6q4^#eHW`4NDjKg#BG7e9859uB;zccLe zg~D5W0XxLMC!3l4&hhH+3{1Myy!tx>lkPZ^?g+2`&cLg`Gw|x~3~ZHNFY`OYrI|9F zGvOR>j(BhD4|p%`@j=>gn^(^t#Lv9k!pzIfO#DV>Uan{6<#A@a5oWs~{tO40eD783 zx2y05@2!8VvQ4}t-oOiHe`n18POIg|%>E9U{Y}5R+}{MR)4t<;xa0j8e_lExZ08_< zj(yDU20cuEI{CAfH}g&UQA|H-s=_h-XqSn<#T?hx`7qn9@Zp?ipU+{ zD<9^G0d|Pr$NR8{_hlD%9XC6e`eSDJzT>C$E5260uV?yy zP1ZX;os0iE^Z6;${)3jMUHaK(zukOvo%x9Qj>kCj9gi_S(0)dl?|7{83--6fzp=kX z-a`Jj_;vX^V3(p?`n__zp9*K(pD^Qm$?}wAfw?a?&mrwO&8KjZPv$tE#8D1%n5o}> zK3INwE4!I=x~gysQ~%4nxqKcm^}Ww-+wC&t?s;u#7e6CjJ0D_wGt>X;c_Yun&w1Lm z@aOf54NhpsH71=!rv2xcc9~(?b&BaH6HLDu<3oAOv}eof%I%x@^Xj>tJ(kxp?LNzw zXumOLKZDHwJv#U~=gsTPIA3MP`3f_hmY8vVnQ7-8{*vX5b7eYp%s9NnUdzv{e*~{E z&Yo5*8cbc!^I3FqgVYPmr_jEn9!-tw*w)kl4SNJOZ z>4+b7|GMV&<$lkF$E+U}PWr>l_W=fYqjA*F$5`LP9M8IV$DD8Q>UU(Ad1RZJpV#@z z*&qA4$j5SlIUk&4&T~&WYWWF2YxyysBwYXdWxi_oY~cweUt`SnLri*od>niDE9~Sg zNtHvneK&fj!$RI@#%y&IX)fo@!}sa^}NrY)gMM}m+?5n zCs;qgI~Xr*y!ss#=DcH;Pqco5+20XUjw{Um_L=?dGW*-&LmXe%`KX*9a?tjR%y~!6 ze7W7Z@NJZ{RrqPvH}Y3m^G5e+ZGVY*kL$VR`3}t)^B&hzHmUa${{zmzp8*RsYw`Q36p2i?w#eU}cvX7_iVd}e!$xjFK-I{hLKW$8UP0aap zE%V))3;FoI^SJ}2pR6ao@;!Tc&i+hk1HG& z-eKCk?+?rKtX?L5H`D%|O#8Pp?cc(u+pdW@&#K|C37<=6gk!?b;2@LkHgle}#iYBz zq`StXyTYWq$ed>_Fy~ow%z4%Z!`H_ zXXeXQCcn!}ew+T-@0ym^ahx^$4PIEkrQOe%dF+HaPZ_fQx!SRhzpUSM^E1xdJNTN^ zD|0<|nJM24uebk6enbCj{gbjCdYE?T;yvuIlWB)}<~f=@ragA5^&8Cj^E%TWt4w?3 zr7_vhiEz$$51D$avpo4&uGTLy{b+&dM{`U+n&xlYZj!I!IP;#gQBDgF^OYRrZ?T`R zU@xcG&6l&2pEXW9_%h)({w7;E$!-1#*P?PBvf26aeig3yQ}-pTKdr*8!VAI;%y$iX znB!L`^IfuOe&(U_&DV)Hz|7Cfe68>T6Yqet!aIDF^Ri9m{A``+A4kmno7z8fohaV9 zaJFj~{>a^&$MBZ=UoU5@pW+v+ALj?GALVN-ALgq$$lM26;???Qj;Aee($DO#na{e1 zaxwE#9baRdo{0Cmw%=vu)oteccl*|7-rQs6%^ham+~!|ezR4Ebuk&AAH!d*q=NxmM zH_Ys3kW-HDXZ$_;Ib_ zbJmYD>F+cBbC*efn@N9@Nq>#$rz`xX{4MkKw!h4WIG;OZ#>p{%-|{17oYeohelC0= zoc;6(XFom6e!7_bbTIpA<)@9~7A}Z?z(<)Uwwe7ca7+AY<~fQf-q-rNzi|GjJ@WFS z_vo)p{6p~vc)OIF+5b3OtRJbut4w~Dnfxp=`B`A{Gs~Zl&J15>`H_Q{RZazW{fxM)*tw%mJc%56aCC}U?1Og5ADIt zOZso+<;r>HKEo{M+;^B^=J#p-neY@dzi+*-{5^S-Pjr86qqJD#-K<~bu>4(S{?9YR z+sMx(GY-d@dKqLR2blZY{k*eqCvWF?-@$(|54Z83+04v;jl4T+*soqs-|Kuy_<;GY z>JD??dx`(c`6@iY+#egOmbWnXaT}QD`f8c)Kp(FTjP!Q(C++s zUglq0KF`0i|0!nsVSYio^fUQst-?)J_~bq1`YX)(J#N}=r&_*VEnjBN&u4fq>!+&q zW7Ya0-rMqlYI#q!yo29!oM~a6SFEeTwN?21-R1g2X1}}qC>NOH=^Xzm`{O0;ImD~S zv1)k(lkbCf`Q5>Nf|&aR`&BsRzQ#KLQ$JZN^_}eUzV|p^ApK$HIm13~2>0+ksW0Yv zz$PYNb^Hjgtd#55S!0~cRpF`1@yg-KzRH@)(|4BJZ!r67VV)0cVA9`whk2LtT;de3 zo-cD!xSzgXaYGOP+qmdv-V@frAG)v7UWFU^BkLPDrhlBh-F;N+Pnr0Ke5Q2vnR;C1 zlf)mcmiO__zhM4l?gREP-|OjQ;+-y=H{HKIW`1W|WS8&)8#vEDf4ScuON)N~xaED! z^O8Nx^OD{C`#YI$*=B!dZ!3Q{J7V^K$j7;UxWepzorCs2!XHzPHV!LC9iPs#x0d-m zVz%34{&%&(b;q$a_8BLuT$Rog_a9<@;Dzug|4Dd+N5=gC6R)3dFy4Er_1)F_T7Jg* zqqq3IDCYyr@0R)~X1i*6CzH<>CZEkrKAV_)Ht@lz@6w`< z$>)XqeN;M|_PeZ|H~4PxFPP)RF+b$|YL7qGrMw?>AH%#i%Xf)4$-H-dg6|L>;^AG4 zN1n2l`TcqC1Fn;;-(}v5yT!bpeuHnbnf%R^785+uAIA9`;*XX3KD^_c zemTrvw|uCy8047nKxxs>Z|b)_Jie{>-;@?@e3AXN^1%LDN{ePr*uJT>Xk^M;&o78q zS6b9^O1zrV;_NTW^iKI@@lHyMV?Iy3qtfD#SL=^|t)BNwi#@(vyxr1bhl#hv@7+bc zmKGbF6mPw>SYzU?@Y$9xmlpGUzVKXWF~w!)Lz8@tM7*KW zVvvc~$5G3BON$Ps9^3gD$M-hA()!lYqJ`P6k%`y9#H;5s^_RNRqLztwvF<#=_UEO= zF>i2OI^y4&mk;?O>#vj+2W(faJ>EsX+TjbW-!3gSxN#@-Ra&gE)_XcuON%A`iE%j3 zuV}Zq(qfj+mCj6QG0o&}l8;i33EpH}j`K6#^Ey^qj56_tnDP$tc|WN?mKObdv2^=N zi(V#v7ZbmeUy_fG(xRO&6~C>tXl3Hp^EZD@{goCqeD9C@-%V+8Vg7oV?aoV!Grmgr zw6r*3#>FAuf1Ua)Eq0lHvcp~F+Ab}&nEkGD-T7h6`Qb_xjyXSE;&;`{jCth+$}`Q! zY3HfZ;tJnqzCK7;e)da?9sa)bxA;xtdV`I|{W`y>KGsT$Rc8KJ;ehRzON%9bCHea+ z*URS3IX>6%WPsnzyw3k|Tk{$y`7PYU+72+imfoIW98y-&UCK z#4Pip!k3xnIwyHI`5NY3jO!uZPI!RtaUAV0E&BL6*NxqLf&HE`_hAm{Rq?(v@A}1j z(8zYrVKkH$_526RFYy-Q_wY}IyV)ULS8377d{FkvjyX@Crclc%Xw88AR?Qi@Jr=44v_o+9sSAVKw&PQf>GwWygTJ=24 z+@Bd>;vF&jJLItQ&MUmH{T`GS`@FhezC`-l{1fpvczgF@*7!TxX@yTxo+b8JUiUHa z?JqC)&HaE2%U>*f&iBZ7v*k~_rSlY~y*ruq?qJ%xjYr}Q@jBbhu}i&eGXH;AW3CTY zxGml?bAM)$d0);p^Z%>HPn74$4g8UIuP-g?s^zsDw7jOYIRCio8T&hBuEY13=frpU z*OqTE&xbE@IOCs*H^qDxZi2aAF~*n6=Sa1FfVmIR$DB8IGWQkQ`4%=a@2ziO&M#~D zH$42?(tW;J_%id{!aTFz3BKO_z){{{`Ea$ooyqU+mh*Y#+bJ#9`8eUV(qe_bBD`E$ z4Doa3-I#fIunNb_yPeGcb(@*%j5hT)VLxL(G@q*Pktn_4(qf4DPS_xCrC$w{7X4Z7 z`lE+Kg>l0_xK{gf)pbgH!s?@i|EFG?`1kfx&u22i*DwBKV8gwojdt->pMz|cK)q;8~UDcb93_oZ*=_X=79aS z@=fZiv0C52A6Q<)Pg;KZUFCVQ^U%`bN>si@roKm*cI#)J8|dTrEbnIa_y5y$2VlK4 z1>LZZiswPaL?t7|Lc{05;uIz-Dx36(iit`_hQ3skXq5CuhDJq3NlAu9MTv%rMTLfi zN_8wMR8&eVQdBhZMWsYVMMXuW{O%vS-*uhq+}G^R&d$!v&dlzA+3jLo?g#K|+D&U| z(ZDJBsAtaWI_AFX`RCkc)=!->=l>C3;P^JH@CG-uhgIHY{WAZ|c1u-wf!{9w^Hq3& zzp5U3nB(c5w_zedc)g_(Aiq-O^%{d9JaWslQGp-OEpx&-efEFCVg1K(X>r6~GY%Z`M=d`nE%y0w$G6KhfA6tVT5R)| ze&|}?R%x-xe9vryua%GW(qfHk!mFjl3LBrQ{gf6<-1NKdB-7qHnenliUyz?B=KQU#Og8&d2d8+`&WhINLFaKZJFI+JF z!Z~x^pYSRl%ziej@HDfZaX#AoXZFKo`h)x~`{`$vw^d&JXBqD2A8WsTr9}rHBYs=8 zzLh!t246{+DtZVTW)Z^PPm=YI!#^ z9&~+3yL*81gBd?snD;|A^U;pCftjzIf3OUnGV71|`qU4fV*Yr@&uga#rNut;-Rd1C z-EF?t_2^b%-&EEz{r%2~s0eo8-DTD0=X@^y_#@9e#0{39lQ4PPhyymW}g<$IjZ(!VGz&iJd+J1s3vc$a(W z4@-+9{-FCXho!|f&x|WKne;dKLffyG7AqVOf4Q`n=MMyRFlIE8E!-KcL zhnf2%L(K0;ef+Y1rj0pITABBSv@rc$Ghc7KX(}xmS)*OoGv`Mgr;I&L7U?kQ9Wu)|c|XfHs^!Z}f8NKx zQ2)K9MGw<|xAAuIcivf+^Colr>r6YGXZ~Joh?lwk<<<3X6&@_ZMGNzN_hx21Xk_}w z`YK$@lw%FA&X;%iJ0|1oIdhx`%=}@G=}$MA=f^gfe6BO;Ei?E17MS~fqkOA+A7RpI z=bh6InEQXN?7CHcn0Oa&*MBR=V?M@lA2Hh<@{P*pptRU$eox%1)^D)Ud}fjP`-55L zIf6+(UU)oV`5R-(uZLIH2TVI}WX_}YZR4bJnB}qZj498VDjah^p^s??-Aw+vn09cD zpSNAic9#abgk!ebVfHu6_b2^wdEZPGj)^zQoIfK>y2DI=)0g$it&_Qrv2bA=Q(iNC zi|{1BsyxSdroE1`!#ruQTHeih_0z?FlK)obz3#Qu^3yNduk=sYrGGl)UF~<5X*U~8 z{AFIh%e9r5<6Nr3G5KF)exDutn);TX4nA4_>X>oh?5lpymHrX8m=LJp4+T?g4ZBJ4`!W<4+hrm-ssSA7$PXGQz|g zVz%$$*R=B%4vXK&zjxhyshpDU3ub?(%yAv@eJLk4$ahS>cdBqqzPFijS!TXpKXB># z#PRkq<68$GAl%Adb^Y1MA21(p-~j8nqo1l}-m_f8r(1rFzo1oCjNL89%1UezY2GS1sRQ z(pzEnv&igshTdzx5_4SBRXFCjrkLZJ5_zC*t-^Y!xja+=G=nW@rZvRXdDS6Mz@ zT8y$+xehb$qZ#Ck_S(yN=W`Epf3};S60eQ9Kij|w=kqmQ%J2FAmfIik3F7TBf8Vvu zCkk&?>o=J6*LWw}EiwC9WYV8wzPCHYKXISCpWm$=wexYxBc?pss&Gts)G_x>FO>Ta z*lt_C@?8E+=6>)7A1vSNygI+wtsYhrw%;XwLU^C~PQxy9zv6=Fe^09AP1mkpy`QX} z{n|+#?{}+mWA@j_?5~&EUk|gtZf1X72}`e?+1~`Wlc%SDELdm&Dt1 z9`xSn`nB&BZs5N7^=#FTom>C92kLj3@2>3guFkIwzDIbd=K8fMHZa>A*)H*yn0Ukd zPW?ka^B$>dcfNjg-|IsBM(zH*v^eH-Zq+`R?Z=t(X;%E#Sw6#jr*gWqnBuFn*D>Zj z8>3tje}wto;&5rv#ecf9^Mv_cVryy9$h=3ZmQR>$HOg zUMP?H(&GI3^{eOhwwU*gF7x%t5AUMAEim85p5tAGNBI%ycURUk-^H$BzKea0`7ZXE z5MSx3^VBrRCY4yjNbM7wSP5k4)c?)uZK#D zLH^lK8s|%kK7PXb-qNCn_cwpm1p*s-w8YK<~-M*w(=*n zvnD=Pym~%bdDJn_BOcoB%hK6nm*u;hRxg`;mv*yJtzYAd9PcXg9oJd@v;JU$ck;XC zO5OFV-%S?yN6KfGxqg~t`l}&+Z;RhUN{bqPS^eeZ5PAR4rTo170qU2FJY>pykNFmw9ho5A%KUZsvS$Wxh||!hD~+nfX3> zBlCUo1~%HRjzh|?mia#Uh5e*oI$^$-GHdyXBAsNOb06bBrM)tLKe5Fn`MJq_uY7~~ zUimtAeeZd#v{+@nSH8mgD6eJad*w@Pu>Hb4u3vqxe2$q%&oa*qPVvjy)fhh^AN~9! zyP3ZSYT?JVhbF$oINr#7xBNo7`TLAR=DENFzQXbCFyAZR6ffi52HW&Y>!rmS|HtvI zGT$fOW%{#;dgGUTj5FUWA7@e{ccqTm0k?++GnZIl8 zrIt>FhJ*vCPj3FEQmY!W{n)Pc83Yj<1dD(rGO%TA1T&z|BRV`PF3NU`DYKm&-$44-BmbdeFM|K?S0ertG`#+VaD|>K7^b63H{9= z^Zul6-dQ=d@L$=)hsaMOAMZS?VU6=>SNr%b%eT1e{95I^#UJC_rPt2``|aeBa=EZw zo(DN$o(DN*o(DPPv3xW)Ixmz@1M{46J;#M>c`y4LW$rHxFzu~}&$C?zr=3^Z9=aH| z-*x_ker}1k7&k`vr{+0>yu0&tfO)RApDEu?=I^81n0U=hye1}IBNMNN`MZ$w`<0$B z?RTScjrn`(W#;d{7I?e!dX8yt)6D&%ehy2ok6$u>>fzhjT`ljbmN)QkrB}-~$6v$W zmA?xQ%_M*4O#gDkFDZ|G=K6Szc`kUBNq3o(%4d;Z6mNmq?<{{$Iy1a#XH0rye1!98 zqzX4O_iyVttG}${Q>1h7&DXEq+qcWl3vcov&Xe`ZdFFWMnEg#L&l3&v3*z@O`|sqB zDvu6cy|WZfu3M~bE&>robw-)&k6H9!yX?l{tk0ITYUB-uEH_r$s(U%zvImLa;d)4Z=Nyd#UXRQwC`KWexR3s?)>d3ExLKjt&WH9 zbX@JseWE6&->hT58-N3MSU{w z-5syik50oR zi^~U==h+$a{QD^{9mjFy8Xung@nM`|2gf-o-Y9=udmQ4Mj1z;*{r`Su{Oe@q|Lxq6 zpSIGXl_~!w_G$->r9~dT%6WM60s0B~UFFy9XMz9A8KzxNGVuoaKb8;hb+_r~_zvf3 zBXb-V&E~_-vok)?d9cUy-&@T6)H&up$}}^dpW>a=+X(YqMLTnU_wrj^2RZHoeolD1 z3a>K9y}}&#Jd@rOzh?iF%y)ywc#HF9lxfc+{JQV}i~DPb{NBv}ON(y)T%G-DXaDU! z+!?c<-737odt{!){QbcKGY-x1P0D$;w3uQ3{$Pw<&Vxbbd{|ZgDZgb7m|xEGm-V-^ z{IYzHGvz$OXXLqAUi}>}b6wobTo+F~$bF2=pV*?jTKHAlH}ScSub$`H|3-`QXwsiB z@y3~WqfESE=I@n;_!Y~0_^gbBOuO%{!ZGc>gGslxa$SBtD&6f{^+R`aTzs7CgC*v? zo8z4w?|9_^bDS&km*bk{W3~S?%X1xh!nY}pV_t}Nz~2&XysaGfYMF7bh8g!Rtv|Ni zkZ}I4w~vpozb<}E{dO|*-*%>6TUyPZ9;@$Bqw8NKb$2Xb3-(Ta3UU#3H+~q%TyIOve`CV_FPd0yBD=k)eNBdpkP45|9EG_1_ZTkskemKS@?Wms_ z?|Yd24L$7owHInvea!Vt0|(`+o*y(1t7T#Qy67m++jHi*vtvF(J2+(SgBX>p^7ziaTR$kD6aT*tQD53k7w@25Ht>Dw@1(t)4<7Jy+TAWc&spBd_T&75 za36ocdD&g9@8VDC@7s9?@!FX8yVvn&)niOO)>h$|daU8s)JGmlOTN#)%W~z?Qn~V- z+Q0E}oGHgvevkAUc~AA$!2R_9r9~YJ>uZ?!mp9B`&8se$@IKRD@A3zg?`9QV<&*V? zGklWvIL61QuTf^ZVW$4Nnf-S%fB)CP6N`9m5yP5R5nDjcB^xD{}9X0ZYAEVte z*QZCF#&_|yc%t9f;5SKkEjo^6PKmd~uS#czzpNdN^M&lHtYhNU@R|01qCdW~bobe% zz3j0@c$L|Hg*mQ8=6Du(qpYv zF8I6BKjSN;d&+x=cfyfpyKXKm4*3n&{9avJ?DOOHyH{H5@2QRkrhPJ~8c+-^ULAqK&l(=s|E2U(&u9E)=9Z^L?5x({3hNYxx)_ zjl(0{a2^dYf8RdH^xp$qS55~^`a4Xz+syf}$(#?D{CD{|MGy0LIi1Yk<#aHAm($ApT~0G|9o@+MT~0mocRACnlkZ8sMg0u(Rkq(`=5OoF z{B4|jk_cK42OAt+xIf_x-Q;Zema=^wlm+MZ{SjZA(TnEcc;`MG#f`MbaYpJKe*FD-WXjnccxds)6wTCDS)!fU0)3{#$?%=PFn z2h3N8N{c~ezS@_t=l*(2i#9&`zV7Rl77a{(>zMr3F!{~o!<2u1)W0hKCm0tU=O*v1 zTyK^ZYfSl%^PSQgVd`PHv>0OQVX(9qVDj6` z2NSQAIj&m%Mat=Mu9JjMxWNOyiMxCwZ}Rt*_Zr*ouif&kiQjYm+E(H*{lHBoy%j#x z@h|gL&XWZ`%XvJ!XTG!CpXDhhW}e%^=jaFPn0aY_+{<;v{Vp))!(76-Z%|sy@ac|kl5c#rzYi}hM)^SF=tyZX$Q*YcbKKp$F5Jc(cT*K^ zu7E%hqcmTmAOy0#3w6{#nNJyX}=B3 z{Cq;c-L5^2^0(w;fV!j`-TXJ<1%6yRo8!}@Gh14$^IMGLOMIE}@PH3B{_Zm8%Qkbq zY%%Y>-F}L3UVpyKdkD|-o76)OznR@^SH2y5m;AN!TeQO#?h4m1@h+wJFY#K`D;{5NZ!mYe`jQ)e!?}hk3ubfVq z@pPA&7u5WK`-IBtW1EjLPuVIh7OV9O)%tnnd%|<2 z#Vm85a*Fwm@MLK*%B0`IFV-ke_B+l!H^V=veQ)r7_PfkJ%jcN;r{mS~X8x7(xpaI@ z;vF&ZwweBTlb_a})~fXjeE+w4o~X2#W4-o2&9_Tuil^#robM1GWv*lUd8_fbMLFf~ zUz?fsH^Gl^ocY~&lwUJHAK_Q!W0)zoA$BXT!P4TCZ&BXI%>4a`x69`ickFkQZ&1$b zyf;^w`OymB!zErfUtHuPTwl!bGDlJy{EZZ&fZpvecnV-!w_r?2}`w-21milhw|6^Wi z`#_%khI$L#N7$oRo?{+<47pU+Z08%(@)K2m+GFyrAOSM-x3{3qWJ z94;+-dAsuH;A^FK^nc27*sYwc9Or|rA7#pGn3?wtRqOjIJNX93(ZTnM-^Sc`Ja}fA z?hfy+-Y=g~=JSjx_x;LkzTb9h%ytXReaH!BUU)v}x>9(lvY#I;ly_w(pYQKW6<>X|c!;Ilt%mv(oSXG4~MZ>$}#MmmjmZu>bE;j^})kcxR=>5xcaDLGfw*OJS1d7FN3oxiUguJJqUceS)w;Uk}_ zJW7ite$;*znEBW|Q!aVAb&l&o_>Da0+s)(7N{dr|$#y4vS&RFWrNt3nub=O;eeM(X zFy-38+$U^fj;FP>XlCvcHgQz^M!wYkCYa+JW7^XwU+KBHkAsGai9g2tZZOLH?%v1TPiD2Kd>iN|2Jb!S)2bkY%vP(YZnR)bd6&~jwYNwO7OZg2m z`RZrhPu;;h&$aRM?jwu0&g5f_50sD9(qe_l$1;0eXDqVW`i0VBp1-1f&GAjPpXCeG z-!#8Xys6S+l1XQr53+o$v>2_Hk1+K%%ogj1N{d0J-Udp2UsZkCPcJ_%UQcP!&E%tt z$ww!Xj}B%&d;S8yJ3HQEnkwJe=f@n+9`iklE#95$%sg&|SMx*GTRz2qF%KAGo zmaFhAlfP*uf0O)-@|@t+a~aHYT|-s4mr19SNvED)bKDmb=I^&F4`yC-!f%uA9`n4& z4qvBSw@ZsH<~>_$%>GvSPtuuX(x0dttsJcEW%k=uh1)BeD(fmQe$MmA(mSB3_KjWM z=Wg~_h3ELa%4dez-x%|L-B{oQov*X>r$9Fb=})6>)bYCQ&VRPt&oS?y91pATUgak5 zX!$b#S36wbXKgoGt*>SFpO+-R$~@&{-1W15Kqq$S(7H@(!;X*S477lQ)^)lW#J=CvPynC$BTVC$I2x^0~;@ zn9nSf`aW)1j>G%`>pQsR_-dKonJ<6Ze8Yau*{?j0_%v=Zzc1fp?mKQUzb`K{=`1k6 zFV8W*FOMH^LFuy0aGy7{{#*4GD^7rH&=J(`H=J(`{nB!o6CthZ~abcGEJ#m7+ zE`CpCBNOlJxysA_cA4LgSD5(A%yVlCOnzsW{dY6J8+Vl!?aY4bnSP^|tLm+$w8+Ol z(r@hjl@fY#O=f;F&w1@(hW~5(Ddu^!@yb!YR=fe` z{(3Lp@NDB+Y0<@RQXd^$SDtOmeYFjO9`Jq2 zVT(Dw7RQ(GFf=js+{h!>XLEdx=3_C`j^c2 z#m@O(w>m$Wc6UOjlJCWq^UMS0dpdjkhr;nyZn950>%5ctUgh73x6C}RKF#Mzcao3b z>93ak?Fs+R@gJ8KN7eE}uBDxq7JJORYlqL%Z*4Q*gIebgN^gyKvwnpe_PfNC|1@8q ze8#yaJj(IZJ9B(P%yA4d`R?aujo*FD`OwXr4_&222lF17Hs<(R_`A-hM&`NBdZs=*blEQ)aa_F|@KxzA_$c*tlfNt<^UVF9ZYDpiO#5zN+U3Qsl>N{i^Y>yC z%=TkkyIuQb{*IxKZ<4=GUUU5Q%)Gsh-{br_dZBSldYjC=eXR;lGyUl#U$6WpN{ex( zKOJG}bC8dcPCp-{JbRh@s$I-;`Sr|vv6fFxzJIyQ|1nc9J4}1os={lP3w)$>XRGi; zZA8cN}jE-z0pEuhu_ZNH5Qo_sy!GTOAMo z!Fkuke#_gK?}l88e?8^Sr`i9S<NpRqGG< zTGto*%=bICnD2LNGWU`CZI|?WncwAlnCBw8d7`~_@UD)hm3gjzjQO7P2=g81U1s}j zenYo*%KTmGI)B4{SNXS=ukcxxFY(2e&+3Qg z0P}YY{d|%2z0BW%wIwXQWBbeZ*AAG!8{4O*abuT{7GAHGuT{%e_zL4j%($^!g=5Bz zVg4WGc`5zpI_~Y$abcJ_-jRiJ-Z8-32kYj8wU@5aqMhlV z+V~LpTKfI+dTo|jKE=`7_3Ip}b)IwA{!f4J`qlN%s@WTW+_)MfJGE z%=Z>(3Vvgbrc^g(XexbUil!32ETSF+x+O8$&d--WZ@M-HkpbAB*$l?|oBj zlh08enOF4jFU0HSBXhi^MJK17j~&eY*c$$neillLd3M@vuC$nC?$b|l)jWQT zpO*dz|55)v%-k0nV6KaMnfmKy>aT?<$3{Ndei}-PdVY)h&vm6mEt9{CS2%B_f5Ok( z{)m4iyvtl4@9_1)TYR|mHcN|}T(f+E*?yWCPbZl3YlwfL9{QQ*;%fOS=k@B#%jHXa zrEzM$a;9>Ue`NV+!s7QZ?}ut-p1*0X!ueR>9p(R~lk(oJ%9oG1kMd^z{(FYEi9f;r zNj-Afd})ZEX)tau?+0z;Cmi?Q%RDEqU)koQ)O}wA&8cT~+?Pt(-GhEi+jq#W4cZl~DZ?LrJXX177P4ZF4e9vM}eWhLR@IZUn zE-h{{?RuS=hu1BY@oM-1@vfB?7uM%F%yZ^_DkseOH)?&Jn;BuAo9So1+t9;2PcqJ* zc#Lvpp3_?6mi;VqHucZnO#Sm^&Xbc@mgD&`KWP6)rNto^^+#LG`=8dCbXJ&jma64* zOnNg_c!GbI`eUv~hxlUa`*=6U(Z+uHZ>pAG<1b48Sbkn@T#Xr5kE(FYxH|RfGM|&| z)2=5%eS#B};s9P@U^BPkR=a%RAPMCb{GxgbNebQ}b(rshbw=n58G3hQc?PHoQIc|*e zrQ!|q+4|)*{zqFAxx0z4;v3xtv_PC`ScK8ze+hX#) z&iCH#c$o5Atd`F(?PHw3Yk5CErhlwu{to;=xlX41IB)$fpDdp{rNuU{{w|z(57G>C zoKt*}a+u_y{-K?(O?%^2d#l22Ww>bNJCt`VGyb0|zxUBF|^|{HsH{mAJo;H~N zf0b!(%bd_&mY8<7z{Hzllkg<3erICtZ}ju`9&KE$!iRt6zP#huXX5Yh$HZG=wp*Z6 z@Wu#N?XQ#hequX^9ba2%(aL;3v4yFJdZr(|_*3^+Yz{3aji{Mg`({ViAFB`#XOz?X5BOB`kTjbT258?P_#tFAEj zRhO9is*6nevrPIkOnOsHJxnm?*#MJn57V!9@Q;Msn0~s3xxaY2=JzbiN0|H!@b1#- zT8ORvE5{8F;Oia=i@9ND=kK=OshzKKd@W3Wx5|t&OH6%s{#E&0Pdn3oTX=UiG3R$ZYt>&JUu5~Y?b5%VvS0b0 zlorQK{p~UN+2$|W&&7uMneptHU)5jlv&VLOrNu5EE4))$Y%|BX$sbi88@!s|u|vPI z#{AvHGQU-Sxl~##@)^#DdA?YGKEaF^{d}_a)y0f=txUT<*EzgMzD}8O9}u} z78}g<$O3ad%`oo~ndV<!j#hybDgnGMRsG2_i&!AFz5R+e_Z)2l@^QD@&$gc<@2S*ESK$XnmLYP zW}ZCAZ!fROXB(5xYdpyL$gA^F`%d_hIUkRiap$PCIArp@&x}92%=ojzj5}NW zN5{9x?$m2(vCJIb0>3Zy$QE~Pd zJmF@}a+R51E;IEo&(y;#Q(x0e`<-O!f0!SYkC=Q6RpFR?H2zJQPA!v8KH8r2&#ljR zbIkOs2TXoitWSS4!`xq;VD6(1Gxt@8nER~*%zf1^ent3*&o|EPGwJVe%koX8e%G1y zxWGpkAM5_MERPzdJo54OtiP~6<#EQ8$AslcZ;VNQIJ$o|$kb;a@5&CID2JGGXs^OC z<hi?=m)5;kwH6e=PgO zW2QgcX42hc<`wJA{BD)$Usjm&YKEByPV*MWKgINmBTWA?TrKae>|)aGVDizv{`$lJcrsF(i=9R}B$$42?95VCD17`f$=CJ#pTYQoE z{05VcHRgWwDsx|ciAVa&8K(ZH_zc$t6HK{|GX2^hGk&!2kEL6~QTxAETAXdVKOlTs zT1+wfpJe*+QKtVM;eXiQFfSd)5OW`WkQrwNm~!o7^3}-XyPp5)`0AK^Ut`k0{QL6w z&Y1CMfxl(_5HoHJGW#81#*H3k-00#jX;&T0c-G8}cePCaeExT3KF^qZo-+A7Ve)y* zL}*G2_Ik^ZXv_@r1vVdfjp#hv&loEB$(5m&`Yo-(Kct zi9aPji>1Xp-zGo3%>BTQD%`+2+nsNh*L$1HJZFRdnR@3TSD5X)tM#qb@b!`#ol$$Ls~ zouA72%*@A^nfdq}UoYMaACdf*7E^q=bS9Yl>7&eb>JX>&Q=QCwsEsdh{H;uWTA2LR z@t3SW-_hSl|CGJbKPfGanR)UKGyX2~wc;)DiQ+Am7W2&CYfUiMaih%s2AJdPWUd!# zxGuc^PQS0&?+#Ob+stq8zT-LN=Y>x=)T}16+URqX;h(9^_k`Z+*;u+quP7=6xg+%>9Eg{? z2X50Ynfrfxe6N0Bx3t({?*DBw{rW0%Tq}H<^K6p!)=%*7>~~ta@0Py>{)Bni8S}f~ z5#KJ|!_wk_U$lIm+v4vr^|;HNr`ybPd|SM_zr?Hi%%#N&XO;gsZ`XfbR_iaS^-UjA zkNUxS=6o7s#;qY{e*>Hp?qjasdbn?S7n`Nm$p@t$V(O=zueHAurhOgpQR?xqv^e1J zJDxq}dD)Cz>EiJaPUi(>QwqN8UZNE@jG#vV!*LaqXZ(dVw`~Ts7p#1FeSJm4Z zuPgU)K1#bEVVC?2@aJ0PzgpjD`@fctex{xFf7Ej>;`K4}#cpOk*vTAM8*^RS%))k! z%sleqBjx;hpO@BeFw0l@3;O*P4ygZS{@5=&&q|9~zQy@9Q(8>%-pGl{K z_YrQ*`rEVzX1}$}eruThUi?4z4S3FZ|2-Rk(&%&+GnY=?+s4H!GLGSj_vxwUkEDCTl*4gp zam2howlLS3`RG8-kBd+FJTicii$SIz zA7J|N4yIl&KT)Q;&Aj(zg*mTg_z3;ebZODYlw&Vbj_v%ac=b$wP{;HKwY;DG)|3`! zCuO@kEiI0j_P@_;zs)>!SoBOyr<)xXYx5!Im)Cv!t@VaOh2&jUsX9V=l2wI ze#e~OlT|q8{2r^8k5=J9rr+8)HXlj3^KI&DwX|5_)%e8Dj8CP-95YVLFz3ZJev)e+ zEBk|0-dDTtl!>joM-z(qkd=HzLe&pC%@4Z19Onz&=N#dIa0he$x|O+q-N1)9t{VQg`rA8~o_Jf#cbhhu z`yDIn$bNWY{T%<3?fh-?kY*;G2L6xotz+&V)G+ZkzTkdIw|<5{B!5f%p!IW1eU9^A z#T(@3o8^<<4|SuRUy!dhzUcm*pC~QrnfP^FlkPR9em6c}?T0Ur?sLyPxoZ7nwSIzsZvA*^F<7ndtJe4O z&#dn$ExNgAzn%P3%R5SocCHAwl@_i16XBN9qM3gz+*DdLGU?RwHI~rb7`^i8RxrtT;xNXKQqjC8>aZeyK2AH^5JUv z0Q3I&PQJtafDT@BUeq)5szd$B)pZHePtP#@%)0YE@!P(v|I^M|_^)hcu5X%{{-S~D zFY1`n~n(%YP8%sgY2`QE?<^PZAZZr<7arLy(H`TH2>4I3XIzs!DX`JLj=^Nx;h zhOO@BOtL||G2Vy6{6-G&4(#KCa?^t;V&4ckNLOC;fU|)QvYAou9e3EKle+1mo6>ln7@mi<(KSd znvYj56MUuk6$ET&J}%*J*q5nd`G1cB!Xzw&`b=_(kQn z$ggT=(>#-(snTMM?{?gS{730_G4I`J;hWWC9sgSX4(%t`cRS4Stuy0e>(|Qby~eMX z<6|BFTfSHi)To-SVpAep7?sHD@8S*t;h3lF0YMA?9 z7yskDXjUI=vfWAL5uaiCJ~Q9iVCGxv?3C^r`>da1?(>fE?D)&!{cfvP0zFl73$4PzI|0r|6rk&|8#_Ddl_P5Goi2tsA3^Lc{eZ0SX zck@*IPCmf-(7}wS?fjhOZG4+{)XL1qn)ty+{R{6Semz^PuVt=R&hJ)w%v_J`F!jF0 zq`$$WJH^!dI8*OKOucth;iJ2j``Ksqv&ZabgL&U{A9MZC%VW!r?sCi3b;tqt^~?LE z#U67VvddhDZ17X|zrt^E{1beH@*LwG#p|xZ9n9~b^-Q~~Wv&a(YHzvr{pP8srNute z9&Ylp*3UE7rBh71>SL}$yO`_H4rX4_#B5i~&)BYp@00Jm#GJ*&Ew^0jx1aOU;)KcX zA^$~wxA};a2me4it4w=aWZKzG6`tfLr9W7OyP5bMRk(#|kDJ$Tx%Mb-aJb9%`~~-i zr>f->)$%@mCBHxN>i5Sg+*^i=Rz6fZHB7m#-&y@}j5!}ic=f&#=6oDr$~`Z?f4J~j z%`Mj+#tr@!*O>3BELP$9Dm=xPSU<@N-=WnHU5QiI^u`)2fNIDmR0g+dZ6b%zKM(GV`}}X8yLy%-@!o`P%|Bf7@k~ z?N1W6-7#NaK2TqO%hh`^uQBh%ytF*;#XRS+bbS!I{Cjw2`%d02UNci(lT7}`_zv|p z%Jip0{HS~!@r`K@Y`k5+#vjqIt?={m*KyBs`xYkM8h%*$%~s2&ndh>HnQ?fK`Fr63 zCf+LFV1Fx2|GB`_>mie`eP;VDzE%1+*?pViWbW@BGw;i8zSk{R_tP4fdZ}mbr`0j_ za`BD&ZTs2hRr}_3+uh`r_#4c8Yn6GA^b%{DwSVUR+ydWc`*G&G%6-i9JFS&x4f+%D zcKO4WukqislV!d{c!{}wm|^;$7bR zmaFTQGyY-r%X}YxjnCBnR{2i(oMqnsJXm?DJU-(%&iR9W*E=gMPTAu3=95z2UoFS6 z1OB`6*=Fw7Z!qK6O63gm-reacJjV26!%RQc%Jdg4_bJEqMy8(InfHfu-q-lAJdVEE zaa+F6Pv-iMc|Yz3vwncNK00eG(>>(-rN7B3<#m&f*AJ}onZ}8=(qff&R&Gl?bbYv3 zS}ZW_V4C++ZWB!U~EA0t~Y;Xevj^C>S11aKgann%kRFE^Pj)o?YMad=gSyho$Z@`Z{KP zEwer^E6@5VwsL~6SHGj|v%g_}m;PsvKVx}+)E;{HO#G~IITYmTd%Uyx1*^ZP{`lYRs9`$a7?Z@jeKoOXK3l-B`2p+5GR zetTQI>~Dkl9cGpJ{@@~W-*tw0?xOep=F^V{(|}*WX`iben7ldrrp;w>D4mn?SI=X zSMLem;`5Zp8Z+-$Wab@{e7^WY%<*^d-OBasfyO6Qby`~NGx0W<`Nujl|CnLg?;vwt z^)TmEGxK--HO%>N_<*wgZ?joHy~Td*bcJ&%Pv*Ym40D_#%-^LCa#_Cm_;<>;o3Bnj ztL1G>I<5R4>C`jVJ9T`n?f06?_?!H)a@ycWIK~I*FGov@R;FKX=B|&T5$W7vECGKj55v?o{CorvF`K z`rlb*em}{3aFCBy4mD9YAOG03{iXJo<2_@xKViz{fL|1Ek-J=A<{kY^f3l+8z1@D+ zcu(!|n0deMAs=V`0oR?M`@CDN`=h1BE}!LjxSi5so41-TZo%f_B&i!46!NsXTI~)%f##AoA2T|m(rqx ziPy@nOTVSGXkv$U-@v?&xR&24-!-L0UUL0T`95OaAAHD^$3FAE;XU46es)WX|Bt2n zfp7Sl_dgzl#l&4kT}9DL(2>#6Sxr9#K}`@8v0L=I9YOeYTd&20#l)6bH`$h1kWs`| zTWm#Lb!B8z6hToGy>tX+-CbEn5&T~7e!h=KACKqbobUPnJ>T;^`6f-)ae)3+AH)5Y z`BA|$v4lS%UlGq>pIvZmUNZ0IT+88Ee9myzwJgq(e#*5;{7=Fu*OK^J!V|8I;eQYw zbuErFgoj;=;cEy-UE8O<`rhZ!5%#@Y$0JzadLPEm)9yh$i*Y?9{XLmKyZ9ygv4zLc z?@iY>@VPvn@4D7OrCY|oCOPkT9^ccfduo9IUc zHLuI~Rh&nij|uA4JRe7$k5SY-Pv8S7Z^X4YYM%E{^L!gM&o@!?d;?p|v#x9F_!YiK zW6iZTUeEDW*IIZT;U(7^_({Tb*A{SzaK*I}ew1+0wK=?&aNe~vYF>{$j@LnIKkEC) zhfv?|9>WLGpQvm4vh*)9?tSv<``s6mPUD06p7j!*!~Ua)nl}a4=J67KXJF2?Y5WT1 zWKrM8K85-|{}ie{T~xVixX1kNV2pLAjSrzctFEo!$*e=muC;KC@RDl{RCxml?_U(v zzc8Ns4CX1Sp9iEHqTGGgc2WK8q57F8oxbmV7LRA&I)mr1eokYE`m(M~VU+%4@SnOK zU7N&z5Kg(4M16n#80z;YM_r5K1m!kS{cqsg*{{@5zdu>ShtbZeYYTW^>aVy~MD_Oo zbw2k{{oO|Oa|4goAJ;mlezsBlJbdCYp*-ht7d1b7_+jSDj%(Zad-}2E+6G?D@vdt{ z{C|WCu8re4gvVUlI_a2DgYc$nD|iLrW!EbBA;M+Xa`-{Qv#w3z2MDKJ8^=1~G1uaF z72#pmV)%Z-QP=vTJZB_)=vohJgm+w9#mfn=xVDIw5pK9v#wy{GYqR)1!ZWUo{<-ZBOG-tjPE3@9}z)2 zIPsX!I|%Q)*25y<9oIJS?S#9ot>YZwHP_mBF5y+zmho+bTdpl)fpEjMGQO2?$+cPh zFTyjfWpJKw+O-s(O*rY=D4s<);o2~sNqES$u_yU;nZOv=SsZ6s--q!Iu8Sep22uCl zJnA~0MWvrcT~}Fr1lRGDYZdU{x89p7wGpb1UZ5&5AKIYmeCOMvPZ3q(_A9PJ$0_uydQnCmpg*LqTFFrxkLB_wZpXm{4Db` z=2{dJv^(Nj7&Yz<)V{Qa+Ltb%_N67%_e>Q~=Y8I_IlSa})@9dnsD0@yYG0a0?Mo+7 z`}PAoy8q(Q{TGk!zjzYu?Yh>%qx&!F_g(6z_xA0tV%e5{R*e9<0@${N&9ef1yzU|r)s-EF-&eQR%C#d%qrcwLv zEUNwtYX6Yq`D~sP(soT7S!^^|ye}rkr`#a;Wup7PbCHjrV1#KaBbvxjyk-o&y}>rK}4F zuI=ML9zK?S?6|g#ClKCpZ4>X#eQN_BM|{_{HPr9Nbuje+);-r+sMmpOv_sDg z+8E>g{Z-WdU>Scx|68s#@psI#Mf@4@4cBUTEcI1gTfhS2UvaI34`dz{U7N#?@jNi^ zS`Pn>@@8Gj;^V{YTV2cGAosiUQ zBL0H<3a-uJ2FLTR&ER(lPrH`E?+{MAHi_RRoN{d(-$HoIwFGtvkGM93-y%Hd+5zo- zJ>h-Vc2UD#F1j;r|22lKkYwPk!V?QOaIZgj98M&;YZ zmr!00^?Yx~wQYPT`L9N=2;9cAU=xPmqlFblmATWJH#s~zfQc?zbb0|tDt@-w2XbO z^O9=?{2SqU*XHnHT(^1GX7S~;bH=r4{5$EhuBB1y-Xy+^bSc-yQ0v7alK;dms{d=K z`O`toyS8hq_(aBa#kFPB{5ixg(Vu;sV%^?zZ5Q=?wdY#%nLOX+zFfnP-iPynuP8BI zcpB}SdDbzZ71q@>>hq?()5kH6b;{3Gn zTFO~Q{og?g*N9(2{a?f)zJmVmqS9@n{_kcBm2MN2u8T@{h&LR=bLbTFDa`v4_#e#E zIO_e^jc5BlsEzOA^VSPkqdi4z@w#Uo_j$cDjW6bX_7vVuIDu#KeoqXe#P0;gcclc;@E zk9Ncv=k4e4`igO1!=wJ-=kCS66VXjsz-ypYl~-RH0q5x0{eH6b;{RzB+*WV+q z#qkmBdxl+$p`JfPaglTp*TVQn(&@+A&7jd8CypG`z>+AsjiT*_KM%o|7 z7qB1eldr~leSkm2J>2E^4!)W8Z{f>0PhGr`_zr%PacJQ*^RtQ95nsbQxPD9cs3`LS z8?<*8?|v-bvxiy_XM(WQdYHu%NS8vrzdA{~G;ebFSI%QSuz}~&o<3%&?*KnTzJ0vq z4DN%jZQ~8xceh;Y;+;c$F2S``{1oLZqdq4T$#6Yr{@}Ijd-NlMXfZsU>on@x;EVlp zi&4Ct>q|e{qjnx}{Evip@m}{}p5gPk9yU?J9LIvN)Hv?E)c12+sCl)4XVb4PUdVY~$D0|?4nCjw zHeSOxt-7{?|H?jR*|iob{UWNI27a6CppJ)p&ZFj96_u`nIqEIp5a*|ezh!??aBU91 zOa45b%Y2-{I`eqiwJfTf3|>Tg(?K|is(%81&wXGV-^DsR=GrJK-v};{FCK&kQTYZ? z`C?ckU(~e-Dqk40*nbJHPngdK_$$`0JshSVyZCG7We*?9^|6E3)30sUwov74;3d@G z4Z>}FJ@v2Pr*IkXqP!NK$v$t%wI+U!`WpB?^4C%2Euh+8!N>D^@nzRacni7? z&!Os@!41ZF8dYBwa}VKlt!o*)nDt>2tJIgmw^3fwwFy*tWB5Oe#|Ww&alDN5!@=qX`4;}w*%hZj-ru4_G1x=mC+x;V-_S;yZ{{u-7@ z-*K&t>fb7=e=DvnqsDUyze@WT@k;7z;JM_lyH-Qhw}4&Jl~C;~;wQN-3a-uLgE`-G zuFc?&NT0>4Szpume#)Q3qjAGWaGj2!uG7&VEOnjkGT%PV^?iU^clPlb#%s^DKAy+% z(URJY;IG%Pbi7CPpu8rceNS|;mhEHQ0 zrN%KDgr&x@N`LkGse)SXN~rr|5g$d<3$D%MD6gaDT$@3qoA%@BtZP$v66rForBL_L z2I@T3@e`b|*T%)(fmZjOPKaZR7KqCtEne=O{Mtftu&|OXgwd zU7^iV7ebYEK;XIpPTZjr~jrU&r;+r~FGv zw~yKfZlQiRb`|d=UpY8FhyURIK7%*Y-Ynjq{29D~eoo^5(7zOF|CGSfIZsmOX(R|s zou?sGIWhb$>1VS(Uel=Y%Hpc_zxY#?k9o!=g%@!hCS9ArPcts#u8pD6kD$`Wae?&1 zt_`8?XM?T{pwdV2V$wxi3*!Sx7jmu7cq!c>zJ_ty!)5B-b!`(>-v+*ya=Naq;~Q9C z)?DkL%2`3BU&c#F-*RmUbEI#&wtzE?qtrN7g0R#$mhpDZ*BtHCe9Yq~X;;p*dHmbM zn6Ie$Si?H$s`w=4!2-UX`YNuK@fwb2Ug_y4QRgFxYVQQzG|YIrHip0EzCY^P2x@$W zvBP>eh+n}dDt`obng3zeLU=3V+^1f&LwpVMdJmO;7r#V(J=b>dA-d1HwuMT+hP<9? zN{v$|2uqDqhkDfiRaAdgP}f-#b=@!Gr)gKiwL0FS{fuiB$$h1a&*HvYa;=D8Azi_> z8PxN%bqw)bVfOT3UZd)rLiH;++|@tGst2KALt^Qef|Gmi?ct^B(`Cu^bl z(L~)B7cn`)dBlcwPY&=r;`i`H#P?9;?BMS- zuUy+gmDfeJYaMUn_?l~-;P@&&lX4dEOvYDgd>cVnYJ6+>XXei)?a_MN#eXB5oc8%K zjvCi7)Vv%)eV!tYdOv&^zs3G-2rppW9K=s^-43`G#;=esgr6b4Px)wR!aARmcpc|6 zzM5+b_#s~Z zR$ME-%KJHw>gOD4eb1xT!yIa!Pvcvdw^`RxsOu$(dYv(WZ{+y6Yh$SVBbX;X?pjQe zFN(?+!8dU{>{^*UnTwH?%WZ==fJM7{3Wz$d(jcDvR=z0a_U3*=vMZ5cn$yl=U-fLhVgVF1VIMy)K-^hf~fBYQAMr?VUoc6B&G^-ao=$ zay*5v=lD44b;cO3KZyH}YYANA{p}Ig;`kN9!>$dX%88=#NAN8A8+I*(Pdv2N4qV$unr*V_2Fd+@s2wHEGi{Vm~BD8K1i9nYpc zHP;sK7TRBNt%P;*74cls67uShQ04ZS7ym)K4za=dap2k>s$ILT?cfy8GdJ;o z*Z&)?b@49d-@0pUyo&X23Du4!o#5{g5tVKZ zhbT9X9m>hMHX9tz;6+^5QrC4l2uoepllUR}+hrc<{j7D=zN3SBKdX&jWxlSuwt{ie zXa9rw&whFeU&y@5xR$~c*KHCzTt5@8jpCQM4ioqy(vP?{gsN`ueOYF7>JJ ziM&sCh%X@Dfooe>r(aV2+6=-{{hB4euJ;-I9POBPEr)upRY%oZMb*22`utD@wH}pS zE1}k{qH6`z`&UgJr~E~1ozDH!wHE#h|L3{nT5;B&%go`m&*pWdYgzmR;VIXW*d#pR z+9>LM%@Ne|!8m?{`8Vv^ApVMRir@#y7j|v`KRKU-_gve;j}zW>Z4Ey_xZ_$2KTLSZ zwK}e!!S(Fg0;--O)=5`zEr-uwUe5%_Gx#x%r(GMz8sRb5;`lYn9d>O9|4hFIvB`Bd z;93lS&;BTc?$k)Knu>UCI^9j#WeksEF#|yBGm*WDa*cY}?`>7>7o&8kPwFWlW zPt{#J#5Zw$?c*zG@1EkZhx-4CExew2u<6jW;+j*-_h zf9cmg;Zq(=zj2Rsc^yAOKUVOE+Sj1Qc{vD6jdKl^Zvl^=;QGhi2l2Whh%aED_gCle zIF9ErhG|^j|58(^-%E<)7pO<7p5Y)YRnIu>EYjX2z8%wew9mzdus)?+%i#a8eoh5u z1E&LrbG)8o9JdJ<7>7+~nt^cWo4ZOnGsfeWacu+tO1SG<8~;Lh)wL!38{wvF4LqCr>aH!|C%CW7;WpzhHU9Y^EH(Z!c;2au z!yEm1PoMS;F<%c|>!AKWxq|xt-<@jG01NxYT&-x%JT`H;ZV z8IKXXiRT-`cu4+85FZZWdo_<=z*AU1%c%S%RQ@6=e;!{IWuD+eO4NhT!~r~m_{}Sr z2h5W$p2TzFb-eIg))Ch_sCKsSvG?KnM1AkVToBF&;T)dD|MO`8&b!R&abNIKCJhuLj49 z!SO8s}4B|VOKj9#(9|zX=eReML_#z%l{w(&nzr;}Evs3Z#0;=95Y8($P zM8-%->!CR|&45BFPMcXV89;W=D4P1Nsb)bLK$ixQqk{-V@6gO6lBW>Me!D?6;W zQ$bh~wiMn${t47NH5Ql%9K>PrOXVL3!czHTcsu!{m?WK4y1lZ8rNX;GSSnu+56HKJ zGvt#>w;hC~(sfbyg>|fxPAc765SB{U!S`?Y0^AS_jH2v<2Sb-e#>4@(_Cz$K1L9p4YaQpfjjpL(|O?wrp} zOfv7g$oy$asH_j%UE$1%^=UF)E( z^EQ5pb!Qbn%f4j=bsaCF>Y2d=`KDc)LgmY#@}*JvCQhs-pHw zWjvMkm0ZhVm-ioLQR`L=C-2KTQsQ+S=?_rf8@P_@Ulp|uFQCdF$8GkD2|SN|*obQb z_;KPR_#>{Tuxp+3=+`ji;8SSFf@|~mM8b2f&7gkoK82@n{f(gBM~h*SeQ5ukye_Al zbyT>Fk0Lycntu`eI{UgXYF!B7huOC#-{Iprf+tg7+_k+T_3=7+17D)&Zmuok3ACeu zFD1V2S}};9#Opa9hi~URpTcYwZ7bn#T$vx1r*4SX{FsJm7Uj<3JX$EzKiSCr4g`h+ zm)Uf;$XCUCk*{Z(x~z$U5nvsIX}ziu+L}Tw}`5*fUo5J%ADjr zGK2rg{L7-gXF7$q(Z3-KlP`qYKOVl7?=NKi-oQ67E?rz>9h%3}*(c7S#%&CbCEpM} z{F&tYFWUd0^Y_xwc=U{ zpHt$zp~h<#RnHKr{y|Co13`QQkG@ClOh12Xfi2wU^^4T&m!%*q_4=iWw>^$_p!$~& z%;BAnVZPwAXlE9GLpzfA7{+51^?gur)b~LR;SHSsLHrTv`g2FGk54?n6VKxQ;MyK; za=eE>z)jSAUDa{sLj^To3zB;0Q1dm1ny*u+`IoOzlVabRKEvtjQw9f@98_(BfV7mb`X|IzluuV#CI^R75pUgZx*9ZXB|M*8^JGg z-#T~`_XFbhaFlg(*R>7Q@iyu{xr|TXc+0gB)Os7kapI${ZNJgy_bOh+I=_hT<-Al- z-{U!drN56@Lw)XI0rfq771VlMM*S|^8tU`CE2#TiD{u+F&APXN`d+l*_w)RM``RG3 znU674|H7z#_efWv-X39nK6o2-|J=kW(y!y2*e7&Q-)q@Imgp0ksCr9*vv@P(k-_sQ zCy6hjog=8v??$fT{}5vq^XVi$n{ldeRMr0=@6gqIL*x>m`cMAf&5zhqv|($5~_JA;3wo@v*z_#3XPDZGpL zjB9B;h4@MQ6Y(k6N~qU0dDQ2W8hF6`SjX|lG0*Wfu7ef)HsNJ_Fzs*QD+%wSzE5-m z^?jm^5Al4D(U(k;=)aUv;_)Xfof?Kq!jw+{y z#{8QP;&Z5aviLpL{R}>g`IN-(5=G71$&;4Q0 zwdf+x$*KQ<@Do{&)`D~$Jd<&5yOt-N&Q}V*q5AOKw09iOBHfs44OBaKQ0w9b9`zf~ z+-vN52yIE%tM9d;;kP@bMUv^nV-Q%6Zzr>-oRlM3dJ~+Gn8d zH^X>e!h`r@${oO)n6LUV>_@WRACm8{)Vq)Re1492^=k(8Im9fgUl~+CQutHm;RIeu zIFCD=?>Z`96>lY6#E&!o*HPos#-9_vg1^KTs=rHkF6HdtH@J@;VvpnTPk4Dl_-n!u zRC!aV@+MK`B~j&#>BTH2vzPO@hW!@Rqh_~!;JfGkZuQc|K7k;Id5HjJ>$BLw^4p4IKGT` z5N_csnV(Cja+|2}Y@o`i;G@TxSEzkL9{bFDsd=9Z!cy~o1|Q7&nZ;q+KZVaFoWakW zz&PTIY3~>wQjSzPqd{1zoDn>ke1oWcMCMvQKa;5Tjp0K%p1_YYE+hC9`Wr{}cNjHZ zgP3QW2JkMi1F*mg@H+YW(V`@vEW6uZkMK3Tpi3F+@31<;(?P zsd93t@ynvduS&ahy;M-`n@5db9yNYBJemH^qWU|78ow-R{H9RjmqLx-1Zw;`sOx?e zH6AOtPd!WcTa5#1-fyDj{RW0uM-K7H)YnI~XY7-~b%+}00o1rf@om&IiJH%8)cG%? z)`5A{yq-m+pGKu$y^i&V^>!I=rF~62hx^K+YYn`b{agjN$sfV<=wApM+8FHv+3U~>hoI#oFd#r-A5XD7458J=u>Zjd@d?*P@B+ed*M{-4ls||U5kKHs z%#Wv|u0>Gk!gyAS`@#*pUq|{q*Lrvs`_UcO8lU36`8-}{x>m-sIbL!tj<<82?a;q} z@V@!BYn%85+FhoeE#^fL@6Y{i4nM>BUc}=G*D=QXEH&5K7$JToh+hukx3EvUckvjG z_wZhrTIO{(^(65s`Z3|!I4%$#b8QsW?*v}U`HJI1*e?y@)m&d8Ji3qLHz{u(-$(vA z*Yc?Ha<0vy%9}#Hj@w7=!*;RD`R(C-Xx|1V2(RM32{-YJgsb>{oc}cYQ?2uO9LIBb zFZN5blJGSC3uf`L%)c~#hWR;(Dt`=BejHEZ`ikKvY1bj;k8r@$2mk$Q*lz8vopulwH=;s2!n8Pxxkr!aQ{=MlAkEZ{%LH-{nGlSez2cH^zY*YNK= ze;NF&mmk5S-=)V>Y3Clt??-)`_!HK{b^HeVl`_ZG-#n_nIqcAmSyVfxP~~J$zGO9o8sBvrK^WMql30zyoM{;}-zov2i9PhUgPN4cfg6e-9 z)&Buh|6{2BM^Nc^$bUQe7YXaWP)E(98tT4K4boLm<+g)xAGOcgNA2U+QS*QJzkU1? zSY`Z1T$@1UPvHqTiTa*{c~rf5Jet3#dS_ATXYjX#i+C%xQJ-g6#UBuEqQ2LD5fh}Z zqrOL}if=oCb?@`cXZkyWYos4SU2hSL9?Lq0VbbrAet~(giC?2VYpCx7$Z=e+Z)Z{M zoW{Sf&Q76T=VtIhTu&*~{I8sz1q9zurgj)w~`{xHgO$w;|Ue zsCgK6ZJ+$Q-g@{d^6j{`j*laLhjg2?Ya1^k-Y`E6N+n66~_+{qD5{{C; ziB0tb)s6+%DtIpAQ@{|{+dOKVDqryW%6K{HORg31_taN#Z5~x$9#!8os{E{Lllb8z z=L^-21iq2|!GIr6$6V_N^&jFz)ZZdr^LPn04`;r}_s20mvUmmMPq~)CNAZ4D+Os}0op z*2c%szeQAe1-yahm7}P9E3{wV_uQs@oxfGQl6I}Qwv0M|E!UP%WB#+{6E3zqpH9*SApXNEfxPhue%J?VHC(vVP5BgLdRyo5A03ULrU7 z>*FwmjN=>0zxX9D zZvvHm3^UB{JneW4q|g8mMop8rH|X5Q-lkJ=aP(axukZXM63o;7?b z;WnN`zsf=S0_t;Wv#9iGd?@3W!U5(_5|wWhZ)3cBI?g(?foj(QK8xewTlhQ`HrDvu z5Ej-s&wO5S-nChLKjS^)S_Yp(x(U3IaUFLpj8~B^5Efo%gBNTx;OD%)`2C zGx!d|)2^ky$v%SeTi-z5Cs=ZA9>2)vi|1TR;U&EPlyq&0dat0}P1i=d%+G1oMc0}^ zcrge^zwP~wp!yMZZRa~Yx2OJUU_3Ck;r-eAp0{s8(!O!m!l?FzT-zkQ+PC4_II4YP zuC;&Q$5&m;GL42&7#iRjB91`X}*_S+rSGs-gT|N@9j9iCgtwCwug1vvFlnJwJxu^RztO;>RJ>v zeND{2#m>v$#aLGpBO`!TS?po=OJ}--|&~?(YTid&+n^lH`>t#JfalTuXwtP&RCx*4BB=7hu66G8ezaX{pwib}n@6Re zb8Q?||CnoGRQ(~>mjC4Sw_K~C%B#ATN0pazEsh$;Vb}V1dHO@wHc{y}Tw6e;ueg>& zl|SoR5|w_!wJ;vtXID^+8`=j zD6sk$Pru+=0hNBgJUqViP(i-EI&`M&4Rxi*E$pK)y% zl|L5P|C@(Brn&!Ftyto%T%|lIy_j$q{*9!j<2~`QtyVfDy7YMgq>mKjd zQwP67yV|a;2JtQYD)CFMHBtR&;4SK}Yc*_BZq>DUd>7|$ITi`sLHZW1sT|i5$3;S4 zB>jkMYY*{uwDEhSTXk(Eh+o1@;+w852Jv;&eyQeKHHa?<@ueWXh`QeM_Hz zr%>f&T${un5>C06MD=^zkEh368^w>(kA!O@sC2`AJU!&vATE+_z_l1ET?BtbJz>{E z*dbm2!AII5D&0Q*m~?xt?c&X(>$$drO1Fg@q}z0D1HVMNu50V4bRGOI>DsQX;!UJm zacvouZVA6bx~6N3sPo)#t%g6~c-6H9)HoMW<5_TRK8Vi+@v}jE3{PiW-Q`E6WHs>c z0g=!vnLn$6g}~PRnRnE`Jz8u6CFiZY9{2Jxv zU7HQ!r}3-AXI;w#@sqele9EE1?2FGLgb&f|}n;!E1WL-Pt{HuQl zuH_!??VgeJXWF%F5I>2x5}$Hy0)I((+_kNT`M6dBH{(7&>!|B}&9zPtzk=T)e%ZAa zY92K48^kZV*1#{*&bn(gRJsN1lCI)f88x3vt`$+~=JDI4n{zFXn$J1cW>M*;ah-Ho z*QQYOIpbOyl`e%}CtcFD3DkTZcWn%nE`eVo-H2;()O;RxZ3ursx+s2%bP?A!{>|61 zE`F2vb=Q)^zK%_}HZ$tuJB8b%%ea;f;!~)3nRIO;h#$qD5ub2vB#0kEr5|){0M(Bu z{+#%TYhlzl>qlD9`cLq52lxxp?Yp*z8s}ZtdZ_ZY@u#HQa%~ee&Ks_EQR&w3C#37R z)<%uN>-I8lf)HpA?)<9j43;4gJtGHH1mw!9>fm@@dH8p#^e3EX$B6XuH%Ih-0{G}5f3jt+Sj2* zU^Ot0%9jaD1$M@Ko~+`>=>LjqxhMHPrOtWOzPIM``#`=Q>f$=%ujm)}Qu|cbYN+RDRoBLz90^U+z8LEDdY2#T(C0ndl6I}S{2qtLFXFF>Z@5;#XOeFU z8$74UxHgFwv+ql}7900{-|#7s(0fV0NBlK!puMj3P|vG&TswTK_p2vq|Bh=*sP;Eq z>l*tv%3BGXpYU+wX_3&!DX;EY;u&6EJn7>!?AqKjJ${r2Y-p>Ugxz zcdh;`&tI0LE4h|NrJHnZ>p4EJH}K<(U)QyDtkKRj*Ou{CUKh7qTfhbSmk;7|L3|o7 zrM;7`B~bgs5!a%4F8TJK9SNO>9ef|@+pbmdox~604)qPWHi*9z8%EZg7|U}Ukc*0LHuM8p9TFxK_reus)Pr%c0sefyy`T+F%eL3F5;+eE<1g-l1zNr+NMs9{)P-Gp;p|^PR4{ zw#0eY>&OLEeI-=2j^|xwLCV+pL4B~@%gfXd!$=-t%aH|ORhCh^JUSs1|Hqt zQ1hbV+B~Wqd5qHToNFn(fO?azjiK5-h)N$trH{B4#@i@YKURU(V}2?Bj%ypl-<{7T zbzO_Sn0+q$>%+j2mw35xR5`=0)lttk%2Ml@Ym=z;Eah4Ybv^Y^<#u1{_EGIUM2+i# zYl&C*cnslhh#z!qAc&9PZ;21PR(-kOC(8I5o)eW^8-1C_cc$EB)bW;Uxgb7`dY>&z zd6(lPUV(YkdXPi4zlIv;3jRC)cUpF>h*xty3ohUL81d)HuH{kBuX3)9qn=;Iaf5Yu z*yZ~)JwAe;;QWML3!(9xq)+*1hp7C!cn#@#uI=D+Nw@7<8z0U4qrM`?uf^4AzrQcxA2<(9*J?q03HOOFy4E}0@8^wIdHoy2 z>;BnwZH@TrDYuQ+;o@uj{8v%e!-8uC)O?x43*W%H>e>u0F%Hu%-^=CKW!klI)H+pevVPuFiBweIx(!yS07mmfow z7j-R-N;meO?kuVuGpO;McCCb(uLab6-9xQ|TaxQ))3pZbI;y*tc)joI;;4Pyuxmr8 zechmIVbs1wKbC>E^E%%rbx`qb*A`LxriN=J)V{9h+6-zRl|t?722lH`m}|W=d|x+@ z+DFZ~e7}?Li*l}|QRPm$7DJ_vx)wq0qr$E&yusT$hiY%$wG67gY1hV4?Th2Pv7hty z9lF-V^NC+X)z@&Xj;gQb+B~X#bFPh}(vP_|ib|hwt(y1qP{9u8q3l`-^&Gb7+6-zx zokX>J!nGLwH|e6TMeuWk!>%2^$;;ozFH`=WYrClDw>{UkQ2ky(otI_TDyZkSW!K`U zaX5UV_v^s5eN?~pT-(7bD1Y0vCDb@HU0Xz@Z@9Kbd$q2t;y1ZJt+=)v#5eH-?k9_` zZKAG+@SEu`9uWR-j1bm!mPcI&S;=)UaA5o#<^k*UAYMnh0oVF(^>Nrk?Q?fs+rg)6 z9d&ITb>3I;YTCczTGNlG7hS8N-q%^cPf}0CwK9H~d?nXXsPe{epZPWFS{zmHuxkVO zZQ2!cEsQ!pA=eJ*pVIHUHdXL>FhT#czZiF|8^o{TH`RXEiuet}1=m*3jU0XcVCQZA zoFjw!JVFFthQ+u0^)iQ>*Lpsw#_*IGgRBI^2XxK??mr|+Y# zr(MZ)*K=(dRbR{Hdq6zhj3nK(YjHff-d)>OJmqcr@$`mk4L_c)yEa~mgfjg9!6+Uu zk48|RZyd&xa6n;wo*m!7=MlrG&o@rt@loa-juJjV{lClp`Mgfx|KqanW?cAu`Mwl>ozFo};Ey?;!29vJ&fy>&!%gD#<1)8U zU!VL6ckzF56}Pb!xQJ?Zo%G|BQ^w;czl1*|T>zv>fZ{&>p^%m2rr?|PcsPD0?VlLQwYol=5Ua9?_A9L?5t- zr`*Ip5x?PD7tiPaT-Wfg#CKdp$3fX}lYGER4q|G>3IA#K#} zLv1WDZ#ci}coXq!_+rZK;IF7>3E#u#X&3QF8aF)ec-k2ppOxgx2JvzHOOknkXY;w* zKK;=A-@`PY;~lt!*OQcU$Z@$F*u$@!z`W$RuHQ8bGatt;^>7=np`4lbMM6c!DT}w0 ze+t#!48EUvIDvb_kD>mrIF7dw9>UW}HxPuQ_-V@PQ|{f);&p~=2N)u}@7f;zlkwYi zt%o`fo2ctz4KHWh7pjraGdNGJz>UkiogLKw1GP}?YT_2*1ys8#csrj9E(YNOevx^Y z!!Yfbb@_h6Na!Afr(Mh9uetwBxt77Zb3E-@0##oeH4X!)`l6_D2nXRl?bSH!;W6aj zb*+c@BD~|;Hr|u)mTQ}+aaco*!wPB~hA!uQ2+E7$?^Pe3K)MLtLHLk*cX2PUhrgpe zoe%K249@E+>bwrT-wmVs8FHo`AysP!<4xA1xO2)>zl7RG-N4x!e?1KOc=YY(5teBMQ^i#w=waSPS&3hA}3 z7x1^VbKbQX)Owsjt;Z?U`rW}KuHpglEBH@ieNO z2I@MDU+ve)5dNKcI_O#yuhzKZ-D&SE{*3XR#=lU`6n>iXl?lR=*r41L>U%bmsChbp zx-OSd`Imy@P5dt7wurx_yoJCrev$cGMCI$_bGVQ1q3*xCsCs+2Pk0mmfa|D!&3)L< zUk-KNW>Dubi#mT(sPi|8I)5qD`AeeC-vsKsB~a&a1au+krX#LL;iKN7zggxBy^=1Ir3 zHa?sGBUwSETMEL9LAZu$PZ^KyTR}J%m_^-J$5Hp+L=Zm|7{#|UeqmJpL;9`oJ}TTp z&Cg9#J?r=j+PCIf2Q`nE@&AZ#xweGL-@rfN0_wg}z)x`0|gg=EoFj+>)s4U;;J&XFkT~mN-9C_}UXV-}rjkpTsuvVFG_i`WWi`g>j4U z9{H7S7nQDuO1Fl;(fGSoNA;`b+5#?e-zwp)q%YuexgTY(VV=>B3~GH!q3${lFYv&3Fx6&*$t&KY&_4BdGfN z*Li&j$~%YhM^Ni%9QFTb1E~LJnQ3u-6P`llpTytc2!@WOeC*NRLD#}T{2}%HlK2DH zM)5b?uNxfK`c^@m?;>hnT0qU0In;H#^eI124SWUTS4Z8K7f|P=gu2e>@n|28y8cr^ zcpSAa?@^x8ucOkpQTvBoj%(l4!+)^O?YOpydXBe-ztVYiEqepcE4Z&tpsvp`)Vvx& zwRo)6{N2)V+OaA1Jv8`o z!fl)&UG+wur?W1W@h<8q;iJhni)WL529-aFB~0LlNOyoEgnNo-ecQpSXwN3<^ZOg9 z|M%;l%4ws@S&@XJ%bYjnZwODL{qZ0?7=)+spR_NF$8vw4axH_qjAz=lb-b1N*~a^j zZq>CFydUG$zz5R5I=-9FZPr{XV~pbkd=l+m|1{^7`Q5<*;@fy5^{=2Yub1&(h;QM& zsb|TxI=+y8)KLF7R>cU%7hIdi`x8GIxIumKBi&X2DWj_|z_Qr|1F5`^W^_fw$i+xl-Z(?;N`Sy6|cZ$ z+#SS{oZ5=Ph)-+@n+6n!L@nR?`h?+O}Vo;%lw~4 z{r*oDPlz&aT+84W$)9#@6rV!>r23Z#!czSkSY_R!-WbkvT}NI1Z+csAvfT+8DI>1TuE)Onpno!2a0M}MdA&6J;UEs1Xv_Irp|6A-c$bX36q`n@i zKTX`HJ=6FU*3B%Q!8}Rf&scXS@GkPj@D9$`0hwhFpRV-)FQA@n*Se^B*6~5yZ(6AI z)xdF7`x2=9BlsTj$6Xsl1fw3KAiG4aS%7~evDHWf5E!4hCjzqRJjR! zH|37F7Dtskj4D@OLZ$NdIGLXzehY74z1qZwj!+)HQS&f7RR54O~N&vx2A6?q$?CHBs}eikff5;CLZ8 zo)3;^gX80<`PEv;9 z#z~*X+c{qosQLy_~RO^IB9jaAy4%N=L)!`%+b*Rv@l8TIK)iTOin6s8*Vv&-f zE~A=CwR9%tR8rKLsAy=Y-`AV#{%6m}bzj$g{l2gJ2loJ#e;Jj336=jc>OLfoFJybp zF@x&I6sjK=@DJn@N7ZM}3D2PBaR^7pAD*G(&uYeTbo`-?KQC&37b?Hrl{VZ#g`22+ zHcoC%P{&=`G3FR{3^?k?4pgt* zI_n$reg`wGE1RhHHc;)Wq1sn)w&$Gf8OH=_{}^ij;pNsYDxWqgpDk2A4QG1=)jwI} z6mV=3i`+lNQS&E;`hM^kXZzqXJ3c$8d~^6T`ZI+(uOyxAVbnNIIorFxvgtagbelM8 zACB6Gs@ICMJ@1%xTtL+`=7h&l?ewAA?RLU_&gUw3!?B7gXBB6;PLR4zC^=!N>x4Y& zILM*KBZK#_?nE$1KZH>C2?5mo=L+ZDo9M44RQjpwxIW@OdlElDd0s5Cj(SkvE7BvK zzVC7ubzj=Xq~kdqLeulaJMxZ>AWZHucf>f^Oi`xgQAq$us(%8Xu}X9z2Wr=SF=$ zsLN_1f8o4LKhNU9Y@e~3X}tAR=7-gU@VTlFYJN`O>#4^$s(!sKjsu=^?BY9^?_KOs zj}~4^dzyF(M^c)(ME{)1(26g{6iF4%RLiKZJ+xBxE)z39l zKbM{DMZA~mp%iL9B~bkwL)B**H4b6a^Nx_SJ>Z1>PS}fK(hXVUwO<#HC)`2Rr-iC- z6V)G8RJ|+s_%XB(wOT0g z>a~r}`4IPGR@21u87F_6@u$CisPnA8JW}V`A@Mqo4^ZD*y~y^TGyju#8SCgYrf7c{ z59fY$3ibU?lc>)FN~r!U;*;!`N0-J2l`e<+p1b0$-2Y$}HSQ_Yd3q7`JxB}qed-lQ zJ)ewWmH9r0bL1Dn*OK2fc8L$*ERLbRAJB{XodOTu!}{RDN7z23eC@Z3_YmJfjpGi! zf%ukWJ~mOm6H&)|c#orIHD$bmdeq5J{Z~Wv-x{j_%BcQZMfKkh^*zc1d^z*Kk9zLa z#TRfs=~&GU7TDg#+sS_m_55@4Z}$1=INm}#0(c^8U87IDRJJ0iUKEfwCJ}XvJ!bb_OSj`eX zMmT3RY5YCyU&OOHUKj9r`h0cCBU`U4*x+rh!i*T(_DEYF%8z6Ap46yNb{M5ceTgQ$+nf z*%CfT`xo#9#3!w03iq(SP2fuz=K<||iu(4gW*e`hzEbtwa>7#Q0q>nWFJPW|u+Dpo zZmaR*)aPGboT6Vn zxIgjUyLo?waTyTSy4kmy4!(}~JU-5Ob_w-4XcqN;KnnLGK7l``-{w%Cvra3X^!=`F zPsec!ebl#xeo|bjOGdLvNre3#W8UKM3sC6oGuboFhypDE{;i%v4vEe3a z|7BEri+BO+{*n`3K<$@6?KgqS*N5uY)O{Q;)N_Y?Z)RT9QNJHhL46w2S>dqVd4@5I?)ic>zPH^?wp|z8}ZaINt~GP>vf9_Nk{EmEMKA&+n7ZL0pfv zaE5iOz;@lod+)dTvZsPlIK^_*b_mCroRbA1)T z?{Iu2@c_apCw}z-uD95)gy)gZG9Gdo?`2y}0eyt?RLKe=~`CA9D`>?{LNg z&!-(TxQF*pr>$lRujaZWgc_d-Je2+Xcp>?D@fGxw2S3PliwiI3IOtMOy$9Msy$8C5 zZ=u{xJd}Dht!4v(Wq<>o|`4NmM<8xOg<>D$M=28+HBT zLXFcd`$d`8X~Mb=O5y$V*CJj|dlGmg<1=qHbExZ{RaChv_#N_F#*cBnELu$g-JE~& zR#`(i)#_>Sv z5wsdF>ig3d@IR?%>LJ!k+ObYpzk4Yk<-O@OCoBn@WlX8xtY(G%zCt|<_z2^e$5&GS z9G=8HspHAazZ#xTx^;{)&(=_%?-%|_{h2>`H1u;0tIy{DK&&Q>U!r~scr3?H5-%rR z40YUv@oRgTzxZY5>o}f8IDji$w|Y^(W9&iY@4_PSgGV_JvVL{2K)8k4e-l5+ylUcC z*uILFuzwNt`%!6pCi60ds?P%6#_^j(?VmuEA4ioxhbljUDt`(e$Z$(+H357#>$V5g z9yco8&LcKlLDgps^&F;*s_&AsJ%_4i9KVb))c#>7K7^|0IO_KW$58F}pxWVf;s<@( zjy|d#yLc|gSqq=V`dP(g_M1cfep&$a`*AM3-%Wo$>~VdU_&$D}dbTjhxK*&sI+R8I zesl(JCw>vXMEWG^d!-UqGmrODuW2WK3ibauA*-2m;`_{>Z}VJl1NHl18;t8|Y3{S}%HdF6p|MrQ9~^c}H?!`zMCFKaAoRh!3OgJ16l5(v4w~e(+(6d@A^9 z(v?u>n<8ciXHoOIj!T4F_!->9HR=_5%pM2h_`htQM;$*=eBwm<7gfI*R6c$DGUL|8 z6#d=7&lA6i1?thnb2;AX=wjS!m?M4_mG24;*)NN~;d)oQrLK1uaX;ES{IeZiIZj1euu7yh1MEwp{1C_pxN?${z zU&b$zK99d=dj^lBerfzJ0XBiuvPql-_&4u%;2ZB#vGpR~_i zr|>G))k*wc`h6Vl<~}@tCFz@dKcT*@t5phMy)3$Y>`hAHJ`lreb!MIYP}q?Kbiq*ee7FJ2XAG(rN(>5 z2}_N43(sNyO{-bKb6Ix=@ZHa+{f>DIvySGRZ~}v@_hEdDdQ7193*w8|9>5PUzJ9!ec1g9% z=Y*x&HK6=7$59XU{f|}D`dNB9?P2^^P|xF*@d?63{4e@7hcBSLF?^75iK4DEBN%6X zhfvomlc@azsB~kfbUr+fe0HdZ?i*UD|Kq5$UGt)XlU!$P;NhfOaqn?GK>L?bpL-VY z|8NO!!z{j=`H;qgn1_pa6!|9cB^bjGa~#d0@|(ufNjHUE!sB=@2C+mretakQrCxlL zd|jBPT|?^gKIY#pUQhZC{t7qoEwpof|2?j=sec4DA7}AYj=L`V%Q~(zJ~h0N{4&J< zm~<(nXTL@KE%of6o)>Q64-TS#@FeQd!~)yvSmwB_VTSN3{tZj0^egxi!bQ9QbExNj z`Y{h3PeZ~wo_eU`DadwRXO7`f%u_!eO1uyMopx;;$oyr$I_mhZq0akN)cJZ9b$%$} zGj!bI$uD4>@TashinX!ii zkaT4yzJxk|W>Ni+!4HrwjTg|rDOCC`)e1gjCUP%9g#xyThcM^IE%mKxC!F4WSi^+cs zbsqJj=7|qS=Na_VUjx#ApZt0_YA@=#y^T7*Zliv;p@q|wUq}7EOPc+ae-f4dJnB3h zL!GDRQ29kr$IUb44s^7w>>#`84-zHJd^?ay)o9D-L^t>>JKjQp0izjnE zFoXI%3*hM{8 zEFHqS&U{|N37&7{tR{okuwM-Io<|h5j?CfJY@bCP-&3gZ4B=HcfejqP7ji!I;L+sk zwwi&D^@Q>0q1KlUe&ZPW8FhSZI`JE*{2QosppHe-=TP^(S=4-tp{{@DobWiRK4Yl+ zDIb1=@#xWh?Z1oKuY*?--oYbiUlp|;R8YsyDyqFjJect*XglEy>hr^eL-)9jpKm+|&CkyDqr#687(t-wP?P zi9aX2fftj$t}y*o!(WllDr$Wwp{^GSsN+6FKH4wn7{Ck2Z_B@D^#8p6TxMK~ zxWGKjV}V{pNP!UC#D4`73=3kEP!>@$d9!1C?I|HJ{5EVS5pk zZvor%TNXdWxTR3(=AHN`Ud!=3hevQ67Z2Mr`kkLVo<@0Dduc=j)%&Z~LU^Y<+3`FjHM^g|SN{WCkp`I!Ae zcs=nGcp3ToQ0?hc?hkMqUrf3!d?V>LafkXeQS-Kf+OLEUF;7&R!}S{T zHiyc00Y8OF)OjtADrX8GCS3@p8UG-v+yKsy-x#WWF4S|AA@wY?|1LhrI@-bW=#RD& zZlTg`;%Hq#9WU#s<8PCEenET&=kuX!>|5f(l~C=iOV$x@z_xQp_;<{cHmW~c_!-h~qWW`&bn3T|;{@tF z6Tnx~uaP76xSp>26I`KRrcv`Nh}zGMpTr*Ne{~G&FMfh>6Vtecr(qE_KeMR)lc;qw zj;colFQT5yUjbEN_?OFN9z@;e|PW?Y;U95 zH9@)?IF5q&5c>!4e~2H$pVGb>>b|vtTZGr}BaCAS%gn1~yqSK;P%#21|SJnkjmC9BCg@o6VMg?n^=U^Pi6e%^_XqrOioW;L@;eAtN}$9Ek} z|G&`Mpq*L9p@K`admX<*KdhkoIrL(CzdV5-rJsTrqaOqKQjX&>tMOum&tW`Pvr9QC zKA(}=-gUx~u*s25p95y_KukOPr=0y4QS&c}$75V!%8j8u&x@e)owb@8zMkW{iXrM% zv6^*^(!Mpknekb{1DF@n<9l2Kj*BVObEFV<7^fiKiEca_UARm6UG~%SrENS1x9~Xj zZ{hFAcb;^*-;Lo>Y>%SWM}7!mw4P;9&jHf-T-Kch)O@R;o-3D8^QPpu>{xKjqt;RX zk@h;ni_fPXJtuzKvE?{J{H4@q3iZ4*gnHgI^AfJtxsDz~y;XLywi0@&0mwG6??YM#e zpg-2}L&TTxK+bi>aacpT@CxMLOdJbE3KZyD9T5-za+ z3O=9tu#ATMi&m3Hj<1f=Ao= z;6a`DhiupRet>%KukVDXiB~(O@IJ~5;g`rigP+s!hub`m#bzj{=-B&kJ*C89I`|29%zPgIKuP&qRt9!@T z^FkNjK>k~J7WLl58vRkjkCV?Dewuo$D$Kf2Lgkx9rBCDN`8MjhI*xy2`y48L1nZoa zCQ+Z8j^RJKZu8@*_0`m0qpXeSn4_Pm=l(IPMpJMkWU^TroJ^ii~TE@WPX(KQTl5Y$2cF9tY!uE zK0pH>VL#uoJl`ek!9~WyjqhbVT=-AE&v!^VG<{rW-uLhs`o0r|ZJ`}kV6ckwX7ZF~)G<3*hRx2&dxZOUz;A$<*1ZWWJX9#rsn>bs6gSH=%g zzg7Gk=~nPH>{q}$81E(gJlnJQHnykn9{MYV+CPb^M*{ET`}pRqCho*X@pbGM#>W_U zsd1lj!cyZN!hbTZ1=@YB%Egm3pYiw;IbQKBwlCtNe7>__H3__&^5^mW#4qFHdub1z zc{s-j`dqXZpJ03FIOZYi-=x(9@nwVqR^!1F2)nIjz{o0v~UJQwr$0QF8g#?VLpQLC9l z)hC3?Zvu}Zzj3PxVE1U+hsUtpYc(!BkK=1Mw8wQM+q+iNMwQ#bCwYEQ!9yu;-D=iQ z<*nib`<1Mwhy#(mUd+iEuPHjd8*Zt|$KZZ%ariua-`RZ>; zh%cd>0_whO5jkGV@?z%wf)kd6&AhWc?u29bCE78I`dl}3BKHXg(LU7t8^aR$`mszo zK714P7@lD7+k1FA=e-Wz7Nni1dbCmZb#>HzeHE3ig8F=A8P8?=68@5Y&7hw5CGbGb zn_*lfe)tONLHYr9D7S~x9IqYJ{%t&-^>IsK&U>4v{Z`S-^}!-$2`5nPnMc(xj=Hap zI@`nAPIwBh!b#Ng;{fXUu^Y9&3pb9TUQ@O|s(3BsmoZE~uA@ayC^hk8yBAfLzR$0__K+sE-J=34}nZW?c<+!&tDd8di`KgtGPs`VN59AF(a zu4}000IN9aZ`9{|EBO3<^gI5Le3$U^x~6clFiW&(q%(d@cE|TTKr2 zyg7{z(Eb?edOwN}VFP1~Lmgkoel@G{Pjem4eqKC>dG5h?()BLvAHww@>5$*c;eML^ z`c~7!kJ693_^6)yVSsjZtY#Z;PBw4cpCjz$0NzVf_i^= z9o1iD)boTD)boU8)boTTRDZ9W#B)6Azl?97{Y9%O;K_vZRJmueICbjseH1*V+6303LM^>kJObUta>O=K@`4dx7vldznx83>?0N&p{}s zk9t46jk^Eda>A=lc*O}Pop2cS`&%IleU9r*tC_%Q?kmQv#*dokK71MJyjJ6OwvT?? zo$bRn(z)q2oa>$)E58TCd7t&Xi67^>XTxgB z*rD82d=dGTtj16NdTy}uHp-{ob$l81T6Oedh9Pc{PX9l=iXq~QjycCHx`%Q< znL6(Ay{ub{R+GeYcs`S`nk>GOdat4G+gEXg_LlHO&bKR8vy5M)enqP(pzhzRcm?GI zPvJUW{&05VgzL#*=YJ#YI zGi0W9b^&#rS|Q&PsQ@1uY9rRrz~G5SI84_ZzB44%7j9$LaT@VqdE z$Ft5ap#HxliTl&vaeOKDjN(t|uLxepc+cRsIiB2jB*(+>bncfq9=dok^_s_H*dD`| zlCK97s2`#ID)EEQGY`nGieDqVjze6*quH;B-=iIQbkUC)e4O|hY!L6pr^s*kIj&C# z@8EYyzlkbm1658Pm2VaEY+sj@TgH31Pb=YZY+uG}IDRwOVS5ta$bPeUH{oeiy{1s@ z38K>b@bAPAKWo$XQRQx-(r=>D*HG!J_*eR^fJ6Fg4!i6>i%J*5*R%fwK9ly0q0;&A zDYg%@d=5Xuc?5q!dcmLOx-$CWy#5>t<9Vb*CYCMWKiSwxXPowsqLhUz(s<%(F-Gdru7pnb( z&rm+~tKnnpUq+343A-F`dDOV(P~|S7=1UTl&pfKU7^=K5YW|GljVIDBg~`{Cnm1m2 z1MzOWiuA)zbDhEZ)yF5;zKc&{2i2Z7-b6lISYrQ8)c9_o#;u4tE|RGF&f{6^KZgIq z`1x>~ml466NMRDX`6+8;ob<42XV z`zhOh9n}6U)c#HU7v(fi``1wOu!1Uo4K=W?Z6GYY1iv`jR(ze_l>Udbfaq2OLnkTcUc`}U}rzzAtnMBQ#aa4N)sCnW? z%@Z$bp14u-WO$mLCwzP;LoT-!y7oFQWQo z4oB-Gsvo9N<2iw)K8}A>1Lo57l2D)I4&b`hV+VwjK=}ohMN9Xc5)UIBNZg zqWWzbHNU4&^`6Ah@rSBk0CoKMQT6kp>M{JNJzum@=ZP|^oki3<4dOn|4`ZnHYIo6& z=QgUpS~wanRQV0makGxEJI`~d<06B9Vg960$MXVe zJ|Zs$Vikeq>)bYN6I$k2E z<9!BoythAW>sLmNcL_D$mQnMqfSPYhsQH#f&9^jazC}>&m_fB;61D#rYCj+9eBnXu z=R)n*{E(gJ4OIPBQS~dJ=GPKx9%WJMLISmZ#!=T*QB;3KQ2jB3qw&XE7zY<>U99n; z(J{>T9O}9&gSvi9qSl2dj;_B@>(Ufz9#5j`yTylM>dyvh{~Bul3aZ`9sD3M;+P#G8 zw=AmtX;i;0qVh|k+V4l5hrFocYVe=-eA2^F|DfvCK()JuO1FmUpHkR9vw<3)I%<5XsPS1xjZYahJ|$HD=TPm-pz52_cKUH1Q`AeU zUU4TZRj=Xu?7G@ToiBG3CjV{Jd9#H&zc*3m_XeuJYpC;k1$BO3L-orlY96oPXdOrO zcOKPGIn;cQqwW)CQP*D~)c8%H#xE$T{}}4{@uAx1LFMN{jmPqP?Rv6+s(%7U=OhD99=Rwuqg{psS-j3%CYW{{%^EZT=zZ0nW z8$`|DG1UC^q2{j#HGlQv=Bm%&J+}QlRQtQA`MZOfzuTzxw@~$IqT1g;t>YC`dyA;` zDUX^*In+GLpyp8uHIEih^C*FuM^V&#*?hO1pUbH6DWJ~tOQ>;5qUtvK7lXUp%OO*^Sda%I~1AYc^2xpoGeAS<;RIYMw2j^2?&~OQZ7hp{|36|8D!IjXHko zsP(mqI(}DC{l0?g_ads_^QeB$q53_8>h~1t_?^bl^%!a%drSspzSY!lihP!ElKj)C?*&PrzSm+A^&Z?5zJ%vBA*-3h%h>M6 zbC_?-XYl?3&uxlU(?q@3)WDOmj;GMx8h)94s#a6MV~*x}0k5DP+gKoe%WAr)&-Xj{ z8$RFPv6`{}v-$f_`MdFJ?57{iL^C9v@|`5SKjSxnMdHV;CXC8=3a=&Kkkuqn^`1xN z8%NbUhF@j>sMXA&^3UMcHUID|;!{?$gvvjM*N}hKYATAS-_}sygHgsX&jnYlri5pb z&x+M7@{0jSrtY#9Ge;jA&uNdAyK2fVl zqViAR2HWSYCWWu3-F4LGW^1VDiL1Dy_sUSu%ll6Jj=6U_6T)pYS(o=No+n4~1B9m?)A&jHV>)l2_lEI9JU^YXnh@%F?*x9B?c-JxbhZcZJj(Io2Z{Gt zjTe)IJyzq!OGr03lh66Ei_5G#ZPfGLZ9Ii4w(t|IH%+{O_=@9-W6m*y+pNPW+(UkS z+OfiT_pGLi|3N=>tY#ZOKzPe)3e-pMr!Aq2e#zmd=!YzNPv!j|t4X8YPfOuJY+tmR z1>8$GX*CIa+dk$M{(#RjqgFGAZsuJLNAJ<0j=Oc7IgIyktfq{Y^8WOy)s#@jT@znN zzii-j{N8B8YLZ{(y#(@!VTJ#Nu~ypi?VjrY+11KO{4_N}IcAEX~PQJ;4;@TFM8XS06=wO<);qTiNL-(#9a zeeSSEz8@o8K;@H1y&scB<&#EzPw4_GpLtY1bEx-wdtYPza9nipqaSB}Tg?vsKf-OR z*~Sw6yJa;^yo!0!z(vy4t)_+_AzZbZ3ZBh=>sGUhn;ic|)bW@{9d|j@ahG;na15Z* zd7NZK?}fY@ps-U-$;=E!&e;vr9gDFTC@8jytyRSj`sRK)7W!8#o}`u$n6F7vcRZt1094 z#IIV-GVV`&(Q20P3F32Blg2H=DXU51lY|pi6URRij#*6vA0<3%HPg6BIBYeOcpc#h zs|nz3gvYG>J|FM16ZTlmu*CH_;eplk@OHwxR@1@165g?zE&LPVmen-z4#FE&Q^P+K zu3F6+{*!RoYF6+@!pl}uz^Bnad8^6d4)GbQNnwZZqSYjEn{dKv;`n#MF{_!w7U781 z%%Ge6r>!Q0w-7&RHRJd@!a=JU!#fH4t;T~_5q4Y6;CsBUOSo?}yLdI>uGO^BMS0s+ zvxzqo-?W-KHVN0PW*u)Lyk<2e`~%??t0~~q)jw8~#RrJbSj{3nMR>t#5_ll#=dC7& zzb8IwHM7_tJYzLs{59bztC_?r2~Su}5HBMfuo^%9g0RnOJoqcZZmSud&Hrx^9#~Be ze@1xMYC3o+;T@~l#tR5!fi=Q)tEu7|;fmF);V%i7t)_%k!Yfu&z%t>y z)#UIegtJzY#vc<-Sk6nAObT<%AaPaL;PGcnRT-)wJ;n!rNA}iPsWtT1^8VBV4zdDs~B1tfq{8 z!mC!ZjQ0{QT1_7RMR>_-viKn3jMb#@e!`1ZlfXaeI@@Yu_&D)VtBGKb@T}E@(Zl?l zvYH8enD}w48N<5?`>n={2aw)lH7@)O@xzsorjNUXdsfrMA>oeIY~v$@x2$Fpe@nP& zH4S`-aNTMu_z%MCR#V2m5ni>LWxS7Y(Q2}IBlpQt_sJP2EOnop!fQysXf<(3da3j= zCoGjdg7=Vq)@nldQ_@SNpLD`f>BsR$qz_t+7tbQSRCAYRx|M<`~O8j{0#dCQ1$ZTXG!nD4BPvpKa~54T|Ark z4t|R5ZS+w8P1N;fhV;5`UBu55zkpxhIxDGssCU9@;+Q2qibbvqBls!eXRT%(Ri6@G zLcgxyrwJEO*Ngcw?-B8yVg^rVzqHk)@LJ0 z!_SdEYc*;7Ea8;ZETZnu6Zlc~FXMOi(I5Cq+(7kX6|ZAn?x6lJZ5vPEe#ZA>))VH< zfUw?|8xTH(@;i7s`|aT9dLQ+ETOIX&+Z5_|M+2yNIB~xHfAb(-PdQ_#_ZcJD*q`G9 zRel}S-U2HBJnDN_7E#Z&I(R16$8F@&_1JA(L;c}W_}C%gDh}|AICi4I$bH@-oI|HSvKW*N_-+%TR7gsO@#s_8fkS z_q{UsRpJxaVE)cIMo{TzQRyoTiuxgs>W3v%KcrFZT0qT%7#68l)M|WqIq5a1&*M2n z=MtVr(eG*Ov0lU-C-CKjcYn_R-#vr>J3+12T_-HHUT>n(r7%T43#feOvC8@xbGFYp z+h?5ZpS6HcJoJ&)Qy=4>BxZ2ZjDuZCw)Ue#*CcnIyCvYK&JzCOGKy{LIVT(|Y; z)nMs4@k0(eOBi`)I6ERSM8%b)I4ci!RIZs zBVFhG%5gT0CDykg@p2J=M11f{yYBh%8|q)H@uL1ec1S+TzmLjy7f)uMCyDP;j|ytt zTt}Uc*Kmn^%2u$MsW-p#t@#Uz3>0j;ad6V2ZSUP!vS z)znbm53`KlZIoY7%(dySN{~t zM7oc`gNgUxx6y^F|A2IJl-tF7>Hi_ym0ur~Ul&7^*Rh&-ljD{CpF#Z}*);0^$i`9a z-9UYARK*{#e+5q>{Tde7UP66O=nCq4LUX9^3C*I?XHef0nnHa~XaYy$^*f#;ah@6w zzDLIcVbvpqH}g5nB%XUXHsRm%{E_kVqrQ*Ujrtzj0r9ej`X1Y^6KI$2N=O%zLSMpK-!c=Ys^EJ3~HyV7ypAOZX4Qam8wu@db=i z(P|24m_K=ZK=avZa`=4GWvyl&%k)zm_h+2u@ZS#MJcCE6-FQFyPg_k0e?t0k++};v zYKHW~h4gP9^?i3eJfC!3yovtk;01)+_)X3W+qgz}3w3|d!YcV~TFnOjnD_=}m~VAF zk8lmIB7GGvA$`Sa)==%phq8})cji_|DUow zdp-XT$Np*5c%|?@>bqz)3#jo*T1}h%)c;%fPW2n!tA4YZ25S7Oc#rzWYD)NK#b@~}1M3{+_#EAM5#c`Z7h;^S{!cE3I#0~u;q+6)YG&~u z{{L&nY9>+NTT?*YFV@L4p3U*x#!Coq z<2%TwiaI_jsN-WDf5~{RSxp&re5|65j}q$mSV7JEW&8!{i&m3I<-df=KZp99Jc~MB zGN}F1cq#j(tR{?qBmW81^PAG2xPB%)j+$oy{1xfPtY+-be11VYJ*fHPM$MZ6@voN!FO)sJha{Z~-? z7g5LE66$$Mbc_BYJcqx+DO5c+QTfzR`BYJ#OD>`EOQZ5zMCF%6<(IjY`+wS$t)8n$=XD?G^k3+t;mT&DmbY-?M$yYD%c@ zM<^=nW?gg4VV!ZyIHvGEJ%_=|*`9E=#~q`N5y$>5cK=<+ZPfRhZsIok*YS_IjxCjg znpcZBnzy*g_89(-`bMq%UMKha+&9jm>Nkxy;G`2C$Lk4q|7tDbb%d83hc{CW^P`PH z%4;c%H78s_!||4NOy9)kAnd>Bm~@ozM3e%rs_!IJXJK^4q-0yRo zbnz0(>ELfkzk?d*Hg3}1ZL4Xa(ru#BZJ_E?$1AzNuA%a)pwg|Q(v?v8t>E?Kw`?^9 zRJuGq!umXeza#w=DxXOwegc(Gz=`*x%JZSpc~JSdQTgor#nx*ZH9lLYe4E(By5llx zzalFC1t*+z!cqJl*K5117dfsswou;-vCQ$N@m|L_j?sU3En)xP>~m)?HVC`%tK4V1 zkl!QZ_dV@(=oI0r)jr%{`#3&#AL(v$p5qceP}eI~)5FhlTy#+9oo&=S*}zY6-PyqN z$)|?8e#zp`IB#W8=ba>8MSL9fJYlz zIB)pz^;);FNqi6W|F1i!b+?7rU=#nse(O#+jaqkSahvi&sP{?cc9@T>!x8K=FJ`SK zjQV^egu2eiqrML#hrc18EM81}1`j@%^&Q_wds3)&F5>n++KoE@)KH%XR8ZHo>!|)J z;kOxA-|d_)N!KDg#5uy6*VCx;+a%sdIEYcMgHz7-q_cg+3Fom*x>eM1ICUrUfO`A! zTKe6Gnt!`@*!k1Jy9w{$>-RB^&h{E=9jaoN?aO!w`xjCBFQSg`1$>zLC7o~rFDE>U znxEs2UFxHCu7fAA?ycb|p8r!ha9SR=lMx{j&h=zT%dx>v^Uv3(WyFfU71vx1su z%c%VdsCk(~^?M(GLx1n$d$5b@hYqTJJGhVjU+viAq=bKA`wHrNT$b@wy8l7V{~YSL z%A&q6B8^*wQ+U)q`T@0n0z-u7Fwgy31a)0BgVW>}#s>)p@GjDM@zpq_J~|G1gf-u~ zsPeY)4%|XruWw?Ha07K6(f+&r-qbBr`c2ev-^9n5FB^C%+iQ3)^L7mnqnuTI0qe`M zvwaCw-yG`tC5=C4zeW5V>)HZp|2S$Lh+&e?Cqk(49z)F!KdOCR{2cdb9{dvZtl!0X zk9Jj2<55A4$2$I*{nl`T@hGCc=edB&cgcy*;U&zU4C=g=MtyH?$_X#x#e@^6^V~eX zn0m*Za18Uzk0@&YS;rYXgM7zP`vvhuoG$`S*p0VPpAPMKJ?&q-+xG7QYP^&9rhSx) znlCZbe3?Uy$1G|*W>E8G8jm5LN!0!mPS}s?e;>Y$cn@m6xbSc+fv{B==g{KhTLaiGOCtP>JE2!h7fEpKn*Ew%siE;Iy=8GHkeZ?+RJ_FL#QYM!j&34H!ja?IkBJio}`&E&U;s?YfS_Iw@0 zU$ZU;tY*yF?#DXYeOBYe9nJ?HyqfK9t8rnLdJK2%bzKiNpSq4axJLckcstwc_!#H) zHB@_7QP(SZyoU4K66!pfb+#`czlU_}Jhm~4`dyJZyoK;IeuMqOcscc&vYHSo{{X5! zZag1{_u2cC4z3a2L9LhDsQa##wsXC(;l!_^#wmk$VjNYUIn?Kd5!7|TEROGE{-N&I zrcw8KW2kjyaIdZJHvWR}1}eURS5WV|)l~2k^k)Gze=?3qyoz)QtC`0J;kebr@Jhl_ ztC_|f@(!aHgjet( z;$sgGrk!)B<35C{=YV)!5B5>(U=J^)ottREL5FQD$XbEy06 za?hSuN~m_MpxO~e&D#)a9hk%+^_W1-n;>@S&w$m8;eM3wN8JYu$zS8wNA2H3?Z1oK zzl(RXf5&PnsC8kB{X4|3qt+eIgSH-h!pAT!J=F2Ai+WF>i#k6pkWRnn5=D(;1dnE& zo5jBqp2jZWDSQv}BZQil6L>A*AbQBhhx)yig~yq{j9(J)TD#`LT{VZ>^*Hp@164oD)u=j{i7n|0t?{bExMz zGx!+eH;sB88b-a(Glh53{~@cH#6!4m58}JYZw#L#A1`Wu59+y2|DSf9>td5|168jI zs-MCOh}v%nucW*z>i&KaH69D7{+My%!%jGa+TV}&6YqAm_aEhX zCHd@P12=I4oA}**l<#cMINQ_C_E~I^&lGC^NoV`;5nJyXDt^sz1@9)Dcg&!kCoDL| z@h-wK{5|tx4s||>;Kgj8#nL{;0o(L@*lMOw`}rN+jxJO_gTBqDkIJWq&*i$Ki+?4b zj@9g-@@YBdQRA3Hjbj!y{u$Kxr|}NC!2gL;pxjkiI zqVk`|9rBM`O$?Pjg35mum3{`5K8&}Ke#&Y>sPfwn*>$asdj4NUjn_KN3B~k zsQc(?)csc&52U;hY8{+F-6xFW!-RwQ1J+$XDnFkScA?raq+TWJ)kWQpZJ>T1rHVRV zmT`*nWR>(c(m!jc^2?~>eig4}|L7C8-y=A>UqRj9PNVK0!>H?)Ch7IQUh+xCpYrBW z>0_vRM^W{RpxQl!x?h|?wcm#---~MhfP8gb&_%VUgKEz8uyp5M4p>H5@H_3NRY zXLWFNpM{EVpsv4asCrdU^JE>BPaak89IBpK)b&@B{C~mr2CANQRKKsH?jOcndq=;A z;z3>CxbbnybD{ciNV*3}*T<`AUk??(i>g-_b-%KMx(biLib=|y*f2Dmp z``P-pQP1(V@B+r6g}P2`qOMaLsCL#-=_*cm-3hOuj*A6c!vx+%{pPJ^4t4xQQ1?}n zIJ)mc{T`JYbslhGj`Pld`t1M>{7j+zU+=1w4g*Ucksc=0EE5 z36~SULH#ZxT^TiwCDj*w2T)(yGmCnTI)nRh9Tmo9$_=9O$>CYVXYe8VBZW5;Uc|@w zKkfyqN#aL%4<=zX^Y~(}+v8Rf!ynU*UDWseckm?YyM;Fq-oRJ$J^u}>Sw(%%e+d_e zU%?}&_tb%VUGL_+Jb}~fKaQVbT%-6H>1Xkq%!>@_dFUeQcib0H$A1EK{#-$=?*)8{ z{%K&B{cEV_^HuCoZUt{9ejSgeycRBVe%Zudv)${l^UIA|&s?Z^HY8s8_MQF8d-sms zGg!rcGCxXIvw|<8pO&qrh_`Z|l*dO%w`4Urd>jAQkhPjLzLj>y@iE3BW;Jv8OUj)^ z{hmk|%d~e2A7Q&6Kd8@P@KN&jT8$gO#d^86$Htd&K>VuJtf1mExJf=~e1iCt)x_}t zFUKwJkFz)=e#UC1QO^}8@UQGYj{hP)Xf**R-jB-1ivjxCg-So9Umqv^z-l_Ea(3`B zwzsWj8&%E<>N$4-b-g%`I{y5q-#6K$y*jQoP`|U@zzycZ|EKBx-&6l?)R_f%=jO}3Lk2S`B27~2k{|?({XkDr|NUW)B6YG_yJ=b z*=MZxUDDqo<|X5G^%UcCE<--de-rr*FxJU_e*NCo1ID`8!auOOaL0KI!ZVEDooGDo z+|$pk)blsWt>IJ7lb-Q^EESCYDrekx%XowSi61v++Lv#nU*-FxTVbSI=Kn~ylue7g zjec6-k#zI?^1aoAe-@r(JRcfie6FQM{{AQ9?6wb~zWlbFnr0F;={S?o0d@`FRIHJ8H5mwF+?>nlUJYV>*^4!vktOqcW6tD-{~IUW%{|Vi0|P?g}ZpIcC|BppP`Kd(l_#!>RrpPs&@_V zqyI09bwHVH5Dv(hi}0_g{DZG7d^&u>`A`go@b>vA@A^RJ|9;WNEHZ{oY9uVbzF zefdQD_xM%q-_2gWP^6zJ(v9(2=M7bzd-}PEK~`!1KsNRB2in!cn;4f4ma&c1%4rJy z??d=|--9}qUxY*9bXbJLIDSxs!#F2%}!(ML3LltuV@+x!t*^ zpF5f6?exo3Hcc}A&uNIibRG2bp7wKn{I&nf>&>Q4-r4xHGWu)bw!)ld^y3&Kejtqh z&tTN2kI~2ug+RtqmN_D73+ zm-S$Rw{m|TV|=b_l<|A(1N_T_%ro9ay$`i3_E86{KjU>F56q`+{;TV0i!m;9jQ^e8 zFY?)De4cHKcX!@8A0nTM+vo8*5svYy6TYi*rWxO>8e#nI^)Qc>)64J0eSzICw@=BY z1IE5+pBKru>W+@HoM+vq%d+Y44(FEcEqsto+q{?XRyM8j?!qhCG|vX%xonzbz3@af z4f7ttL)p~NtD>I#7<+iB`+s*fb@2}FH=X=!yf4o&`?FTwQ$8)()WB}%)n`*3tl`fAD1hS@w?q^d~tlNVsV91ll}%lD%CAq_ z`N|i0j+;#te6{f_=Rb)r%cc_J`O(Q=xz8x)n6GgBD4RBT*0?V7YW=drCz)>xY!p8q zy58opX_`^a6fYD%nN4H7Q?2>Q`-mUOreS_XzJrYX2Y8`;`*~KnzHI8`iTX7$o{u%s z?@*nsXOveLVd-nLsfN+6YTie>D&E`i%4{m0ugTN(APW7NBr_ji6xHdQm~UBxK3lJ|4G zBAdz?^(Zmwabnz~9>=_|bVu2A$f(CQ-9pc9am2W8X45nuApKM}jq@4i*8rm*`WXMe z-o?kC-S1K=?HrVF)IBmy2J{rbSK&FJ#j^FRiye@e1*?*)+{J3r}U!1g{bv&!%BUzYnoly9T*yUopT* z?d@iaLl@(7;hntHzNmxIzwMm!I<1m>vEO5)FXyUo8J{A3i80TPF7Ucc`G?uG&!;-R z#Xi^j2A?jx#=qkV>&?GKKFIkqh2w<-yr1|Ue#U;flQAzk7|%u9`47r#%cd&cSNaN` zHUCPy&VBaS`218q9L6{~e!xBL+u&2BJ5>M3cb^v+kMcX`c~xSB>lyp5_PgfsZDWjY zYc{no#n?UWz)%B^7tNS(>`N- z_t>OeyNvPOW{lGoV_Y{GkwmH2eYZ4F|J*V zaqVD?Ya3%+TNvZo$Qaj}!t%lc{TbuB!x+~sM*nZ{W%_xYF|KRbw91&T!+f&*`#2+A z7Z*LJX=IG!kbaueAM;H1qZM`b;qF&u{GxOx;vb;gW5)N<4|x#}_)h2T^R2G$Z7w@+ zos(?8M;@OxChJCPHnlLux0x;Co3g2q@wv4IK3IHxHq|laNi82Lz9yTh*eYC^P33%u za9K8;+}-mF;p1#t=T+wQDj%mmCir-c@p|=b;}V+~$9bMHE_2y5%NXYw#`sKU(SN58UdDXs$);9D|Fkg1x0%-oH}THWHD*%- z<9e@W>{n`7>v(lGRWRmJ8Dk!;-7EKJ7~{8Egu@uWNya=IXUww>#yo4`X+8J=*I^Sc zh+aR?X%~WUhBEcChMi!$fi}^Q+Oqt1{n95K7K6D z=iM8uM~r@M=RKrv%cfRF|FrPa_cmUq+|4*9h*}%xJj(2msHk)b~`ByXchZU@I zygZv`8$9o{KDIN;Y2|~pzno994xSj_dr5zsP1}t4HOBm3;*tAC`+fA2`7+9Qoi)Pv z+{+OE=ylNm<8@R&Z*Se};g!-iUg&j!^2>S2&8@HEKU-;>*sR=xtp7JXw^U*NZ15r4 zvCb~-U1QACRo-9xG9To;rEHq!<&L+?|EJt*^!!JCcKLeyx}9uVWwd{VW8#;yX_3$J zI&&eL=J;N}n>L$GGmQQJ1YhU8@oXAneD7;pxwkmieTp$Y8+@&F>skMYn#X5}k#2zx zRR8&G8fDyfM)*1PA7-?7h^^uWIjTPg*xaCB8Q&i}R(|An#J`r`VK%MbSN|KAc}9QE zG5T|s|89IH`PrMeAMhgQjb>9jqr5skjJ3Q(`jz|T^M`o8@&>r3e*JuncJ^icKc@F7 zl-tVF`OJ&;M>9vIYs#huMt{~b`m2_&cDyE=su}aSiqXDuzRK~ktp9)YJW2VRjMw9B z4?MSID}J`2u*5IwugNCQC$xWpkI+%e*^3~nxY?@+?bz+3yblz|_4e?9r+s}9(Wc0zxjdg(U zlFtBt?|3yY)-OBi7cLjhvt76)lz$x`A)oD*{JeFG4>K<}vuT5o{~90Vya7gjT}8N+ zk>82(9?3mMy6qx7&o8-;&GCQC=W#}PL+RYo3*6Ux`QX^M@OSDx%}1C&Q@loaoSpI; ziGcWAN>FPgyZ@D3J2VW z=J`bB%`xV|B%}Nh?#t(pm)}l1*`}X%vuT@;mu`zca-S-Di0gtS-q-%;L_AZK@co4= zv#Fl(`@ePEa=)z2ratbg|0H96jzV?jQ0}nFMffSnD6uKR*zZUN= z)I8LVI{v5rIcd$$&5n7AbUVD18;t+6UE|l}v&i^A+i^bG@eV$fO^o!FMf{#}8ntIP zn^t&t^SxJjai8kpuhhSTaer!OJm+iSrNT>mwf)u{qyAI8h&zma-ekLe-pHmkMnA7I z`uUK9=J5gVryl#+RC<`#UD5BtOjW|s&z1a+ey+%-c7EOYExcGc&Dqq%Yt63)MtOC7 zvif%NJ^Fo|S7_HLpY1vx;VsRdA-?mL_Pg0Mz*|`d`nl$N_kG#a%Pr?m@TZ*Tour%M z)ynO8xP7krHuK+%UpcRLe8cfynun`=bc5@qEx-Pn|sUWvGO9kSGZNU$mi&fS>DXPeTw7SJ<52Ux8wZSmu&DE(k(Oo7j%&y zzOi}Ac>lEYh}?h2!q1bgMz~G8mUxx=Eiit^ZJv#uTh3+EEdSv646lgwGMgqC&u53& zXFoBRP5peI{X}0jb@Dad7uw(plzYHfAIdNGykEHDk)9{Wzl+d*VF(J#oIqbLl2N z$UJV$rUu?ie~+~1_lJl081)*=rUCw){_4-BUJiJ^+mlTle2RLvGuF3e#`{A}e4%uW z*;LO)>1rAMa-`h18s9yxsMikT^VM7IFz;3wpZ{Cnp!5U$AMt&>p}~5u?d)^9d0*FWS2nfto36(uKH2r(z`tcZ z-)+9v@zd4T^K7c&lzgfgzY|}@X6>xZrV2jO^>(72alIV#9O?EMpUt`Z z{?^9mhyDm#Kl^xzdC;3pJ^Z?KQ=Hci6Z{+bj`NkmqkOXRMi{?~Q2Cgg?nL-z=I0Ts ztiuO@_<5=%(#TQs zv7YfhavjTFW<0W~CgP>9;!VU?W>W>@{pWK2r}N5qj^m|lI(m-%oPIvcrUTBK7yH?? z!*k8+EnXMvH80mc>-?R5ndPc>%+T+sot@_GwQroS8S=b7n+A&GZJfA;`mkTR-Dl_b z%@+73{WZsR@zbo5?*t!hTt|5i<&JPnJ%)LieAfDM`74a_hYEL|Y5odt6i#!!%6PHn z4*Hujo*S0&G4k1dhS%NayFc>=;9y_ z_8IeJhcD+c<2qR2<2cDzh#%(*%%2fPeTH}!{W{1S`n~U*P5taNPJP+b&HhT)Z#H%C zvF1rDzo(yC82L8w2iA{9Ci~J_UM~M?{=M_7vZ;b`eu;7Z$=~Jkj~M44GS1&+oWICg z?VM)x-vA$}|H}C`<96`$b4wPUvn%|#_+kFNdEL);;a*-Qp9a3S)x73Itcz8AwBu_} z%kis>_yxxK(~R>6`Fr=9e*S^2JZ3Zh$Xeb{eM@|t^v6B9yhBb1@9_%maMXNSWTcxSN--riiaD;*X!I|HSVz+O^9lXNytJ2BVz*;&@weyuJvRGk)i; zjJMWrM^7<7jKdD&{4K`$t9+>UF~fE5W3Ck8P&k$NB=i30Qu{yY!bo>mgu_U;$hfZO z8Q1kJW8Td$=G}BQO)=)(WHya4=G|yE4Kvn*A-=B0JYeM8%iTu(#eVaugD(+o;UmoR zX6{6Pb=!A{-{v{etuyA~3Lj`ZmWucV#(iu)n`RmFaE5W;n&9*G+c+)a|IB>f71>$+a%b?Q0G zw^;9Hc*#r6muwp4#nSgN%IjsU*F9_z-_2L3PZw{bU)p&=tgF18H)Vr5&)1Ni$vc4T%Vqawc zxyTr=1xCM3^WoC>Fv@K$j<*!YoB2@3n;8At$mrL4wu!GT;;V}I3O+)7c@bY$#2V1XC|Abc~(AC z*)+)p;fZV-XXLxdCHLhGew^$4g4Y-A&$F&rUt9PM-eaaf+{l$5nFMf*OcRf$?9%s!%)`%bFMzir^oHxKYuaj|J z2k#_(J8xy&+Zg$@GV*EW8`PtMx0Jq|zq9U?SSft`_xjKAJ&u|eyS%;l4gQ~cukw+N z`k8N(Zh?_s6Jvcl(m#)h`#0k{J1oLsTxa{dT)%8H-cK6PFP91T@{$JY14 z%$o{VGU{8wA4y-vsPB&SUpH^Jc@N=D{!0IBF!nL4jPF@3@)g$E1xC7A#=dr%_Yxjs zJl7nM?_|`6muXiw%N(C#JV%@4uN)s`JVzVhp!^%3pX*u6%bi!rc%E_Oc!z%9XWZYm z8SP!=6ZKOV{j^eq!|10uUMpRve7*v4}87-ZD1kJ10VyuIFi;rE`i>WRJ?VOCXN`5FEt^^y&wZMCNAXSB)W|=1UDl9I z^^EnVhVg$&ReazXW>fE&n~|&pLmNUr=mriCJYo|lTB%cfaIJqG#Ss5j@$lV!e7 z_=GV&$NZ`5;3%68`DWvDkWG7x@!927>ec#E^T>HE98+F%HZ?Kn$Hr``W7L0@Uvd5l zpCbKoHZ5_%eQc3e$aj!Y&kbI~L!RGgzVS-+UU->xS3k`2?a|I`n&m^4JCjY*jDDTu zzeqQcO?!;%Xp>W1=js1~@k3Eh4w)Z)|ES*T)63^LzbBiz8UI_@#mJ|HcRJ7bGCr4B z#}CVAj(-x~VWeAUl()(#Z-pO`ZkbVD+i)(gmA%Sq$);vTc}ujR7*YZ&=2GR9$n&z8@8Hq9~epJj~mIAfeU8RNWD#BcG& z=Jh6TX+OKp8@b=rkL2^J`Dx`Hia%Z7g`-|wytV76lPiw5^R}L|wlVJGt&Hb+E&N;8 z<1*tp>k>O$e~Uc5FYpVozhdOSU&QY+>b1kD*A`#Ms#oUoDj3Jh8OKYE<28)$_x14^ z>eIZf*|XT4}*TqljZy>ttVbkmGBboO4KmX8GtzZ2=1(Uh-3BAwG9%q0Bi#(+dYNXVt9o@#S7M|) zF4FBW=KXGwuG;Yv{oKJA$2RuLzlEC(`i0S+h6tN)bKKX@)BK6`d@7qJ`A6Z2Y#Qfl zt(RljG|W#J=OMmDdHt+1U;6kJ`S8cs&DjDg@81tnR zVd=UU`E@YTwMD#i&5U{46k+Mc8R4qa-x&g+#?~kx_D~xnYjC2bTFWoFp*RKdm zx5KzUZ!+e^NfAEe={oe`N8 z+F`6`ef$Y~80%7}eBPp5U#u;?Pd@Eg|LbhMv#)8*rWT&7-kAG{$S-(cjo&d6t(k$#DhezAxj zX5>FqgqwH=^{HkJxBl7ZyST&%H}P)9XVW;n&A9fzDUW+EzvuN^4`aN$BL1xT&Fl1k zJ0GPV+gK6#Fvg{kZ_`f=*;LOMmujBtb!i2^DBUb$U729)TSmFB-Xo09akO1#-b>fY zn1}U@ey!wzbmgJrN7DaFc$fdh4gQiVyo>c}NV=%kAZKFyvZGt{G^4;X^+*j8b>&yzv)qiLrUzaWXb<~5eZqU#CseBu+@cP1a)WGMu@7A+g zId$1o%Xr;TT^z6CZ5^-7rgEPCj@;$?zfyfTC*M8ZUb@|E+Tw4NzaBci%-EL=7V-W3 zkn!$fY<{R{uJlNLRr>v&2sG z`DD`bdG+1qpTuwS|F~MjFEY+w;QxxB=bhz0mrdYyZrg9$0uPmEN+)|&?Tk`$*Sopa&H=g{0 za`yRn`=GsS+U0rnH#^z1&07d>Wz#0V;d$LM@8r4c9M|MC!^meko2K|t_qR!&@BE2u z8fTn8%72M=@~irDm{IOfHVtsm`TaaczxS}Q!8~BE=T5DBisz4EJb!E{!eKmr9MIk? zw7ZXe+S|)#>aQODPJeZ0Qx|viS7$c0@Jjo>X8u5YQ#RG}!|GedABwNdrXkvYo*m&I zxX2fpw+oz7{w}ZLHm`I37T;!Hu$fI8{Db3bjNjj=ol-u#8UJU}#dn)Oo!K<-)^lB? z)@8=L>)Y_K3zYC(T}r5IE;RrUS7l$E&iblK*GkmvcjWSvHl5_>+Ih z_w7S&Iew7!|H*z=LwGmq|C7x-;jOIyPd1;0*RyGjasOZ8*TpYq(;~kmypZ)j$~oN} zzb1Y*>;IJVbKEI@S^Q+y|0?JDkMS$wN3&_9h#%sY#1CfEKoQ^1Snqqe>b}s!Z%fym zO`ZIPa7Q+^GxjHK{44RTS^vB2Igxd&k?Z0cvZX~n-;}B3rt}rr zbn!sd&t}sMx6PMn#ylJ2 z1I)V~KGXbZD6CuRyTZi`;>E=1;Itb%Bm@C3zTn8hJ>tKL4W;Y|>F5W@Do!QjR$hU&e zm0uY7l^5YK@;h;TM7amN#QO>RJn}xt1|P0}>Rb=^)UVx)_eDDSF!{Ff3(__7GV@@B zj}<>U<8yEJizA#>pW$p8;v20ugV{8|%dDsUyb-$?pD*mprgnZnevK^GzIwh_esx*@ z6QAQN_#W})S^xi@rZj^CN;V?1~0VLW%}W;}Q3;$`N0CvVWsj%;dYJa?F7Jhz@<+&8uu{kh4TsNY65 zRnF%9cR6F{g$MQ{rDVv&6io8;S_J`K0eMkZ;X}B z8|6=&H_Y4E&-L)P!d;B>+8F6u8R=UX>FfD^?WuTAexIP6gPvQKWmAdIH;+%GV>;sb z=XpMwP5X>--{I-|mePMqz6boI{@myLoxhh&yXr`?9Hrw>9rN8Sfv~^R?E8FxH2bFh@^a%hz}wp2cXLVl1?{{h<~?sPf2a9-`HeGP_l_}MPoD4% z(j77KJLCoTR1f}M`&W6T{L8NK{6M&6KF_;mzDmC~Wm6+xVjLT?sh08nR1LqZKdbpl z>8rA-k`H#BR%HGEt8rA1E#nxaQ?8esfSW-mWyz3t&0mDkCSs((G3jQ_EG z$JJ+EIO;XasMi5wU%k&MDdlO`gTV8DqbL5&iK6ek$N?p6<+YY3HgsQ=IIcl zy@QPQ_A%Pq%4ly5Put7O$I~co4OhAJGU~P7c~@C z@#*SO$pz(A@aC?UUHL`)Hpg5ytGrHmgO1--{bm{Um}b0>GR1fwWrFekPvuALM~%aY z@I9p8;oZ5xZtY#=-Gq0go0ZQF|3!VbvuTU*d}WhS?*&FavxNhU{CWyI82R=u+Aphj zH}C0q7vCuVb~XsNF~0xUz}H%bs(5G}D)HWqpIqzxCh2$S_u9_x@YmY0$$jg^BICK{ z0{72er%kmYPzVvGC4Vm8e(>N&%x=QKYj zzi~!=2N?D3XSB0}k-nXgzKv1eM&3t!Eu(*H_*VT}olRAY{yi+(eZXk?Xd!YIEf;?=*A z*U7J*QI9%Ce^oL1tCG=Q71>nI=&xh>$Mebqeo?xOCF_j**7-^6+FCZP@)GOXN;WO? zw)Qy-jQ11f_;KlHvuTEpmwq~%rg$^$7-2l$Y~h70F`mzkt5599#u(TC0MBC|AFN+G z8NVkz`0?Biy^MWX4`YAT$+(ZU@pPZXM(4LM_E}B5o%&Yux6vPr^Gb~LC+ZRDj~VIr z82hqm$L}kCvT&5K9~t|U*Z0p}+(lusNJx7J>vZ;oz5w6ar{pI}pZ=G=;nBohpdn3G` z@XRMYUw5Aj<32fEgu}Q`PB5OkkMIlnw}Y|X&VIuDb-hj%jun>ibbqa%BL8E?ePfF; zKC6uT#}ecIG0S+)*Y>Y@op0f%)xSBLni%V44Wr!h!b9zg_56Ub&hInU`IRDmiLuVl zFxL4l=RH8VW&f6+o0eGPdN^4*H61gan;vD;KI3`m8sq)h3C8o#F+SQn?Bl26zQlMQ z+RAt?wft$%we0t%7{5!O%{$A# zsfceZ;v0(iGRFS8RD?G^oA(QAjPoYw^V(-e82in7#{ZO5@#e0ZV*7Dl=T z#_yi*G4k1Bx+<37Y#cUD=U+(phhZ-Mc?(tI|}F~)m}G2WAmd`JI1-#Lym{(6D&telmr^#JNdE`*InJgd z{pR_*TM8;n;c$Qa#$Usg1MJxAJP~TC%B`(SP-f|97lltWV{P>+eW8aUbdx zj(uPsV;|S`g}i_2WQ=D!$S>w$2V)+#G3H?lV;(j$@@Zns=LW`nu4AODX3V=I#`o!W7~eBk_>%R}>%w{V zn>TaWG|Twh;S8_P{xQDSeAr=pUTkYUfBtrp@%h^g#`~mejL+Y$GCqGh!VdKsKzw|zw(iTh+^)hU#^(WMxo15eV5f5W`3vVQ zd?nX!o>9L!M*U_O^_ynYuZx#Bubol9Mn?T=iuejf{SM?C_1j|9Z=F%UHOHfVD__m! zEi=knVwAVQC~uxoULT*RylzH$t&H*-iuf8vc_;FX^7a_zZ8OT-ay-gw+{pWhI{t%k ztIeh=zDN3DzT0)&#Sc^%H^%o%)*0j8^0oZBwu1LJo=4)Zl>dNm)Vq(jR=-~U)cM_v z&%<@`&C+)=J_k3;FL@n3!_&{fGoJU3@f+sr8t>}9w8V?VAM!HgZ1YO%d-K=xdfv$R z-JS-<@1NDP*6WhGY^tI6d(KvK()_RD1&&u{Q#Y@ce+Q$SA;#~a^z&Ag%K3)pSNf?b zn;Ll|=Qm_iJ+D`xWbY{fy_eeSE%fFJI?&m81Zb`Sm)88NG)ykXArWu~``ykWVG{tzHvC2OEzs={w^M1zn@GHJ$-(-AG zzG+^o=W#aeu}gS2n>P3);q`1<GS+!zDWK@*>uQF=@0k<_1R}U z_uu0a&$e$GqZmrcEVsn>x$+0?~&KdOV5yDr-JQTvzHY-(n#6HVNZ zPh&PU6!G=^s`$EWs^Nvkv6@@@v5HT%-dD1R6^we7@#W4dWz)%-Go=@+*Ksx-FrL@% zGRoiK=cM1xrmZ4=lm9M$Bb(NX_%*&q{AxC>6!FWP6~B~CbBxbH&$7q9dYZ4bADQC& zq?^p92|m&|jAzprW86o%Dcwjm4fFHn?;yV+ejuCr_+H`OZ0g~~^6So~F7}vDoxGWT z>R_zn?fjtg+OnyYk9J;5HZ?PTAF7dGwqI)C*QBq{raIoqysqWf#n)t0HDf)m*Ty}8?RBX)@*9w!_})fo9g)``XiPOTC`!FOK&X$GeN;6^way za-%#S4jKKn$LP0BM*b^|aa-h){_p3%3U~6ZXVjlJ(f%fWN_-vTf81&q=kJzWFXq`c z?`+>b%NXY=-b}gyzDc-`6`q6iFn&*_lkvUtR(@W-&4rDHb%o{pcgIWYvHl(Y#qV?q z?=!+XMR=sS|K9NHPzSuH>9{7S~>Pb#=ApYm)vKCyo_pY|Bzy2wa3Q^Zd)=HDp4 z=e&_@YGtHrV4PpaPe%Sl{PCZ2{66Q^XOGdoUH(8mJK40&?+b5b(;P3A&p4ys>KN^> z=8SYz*;L6`cPp}~oU!h%{mJV#E-}{GS^lf}-N%1pFIUBPFxIj9i09ECJ@?}pW8E5O zoHtU~Q`o}DrtbG-HSG-@tH+vmfR>U74=W_OWx_+``U$$1nuQ1l(K}J1# z3%fX^|2rAiZyTSX{MI7ArHF4V;w$+%>B@`n{vUF9mvP<>qufPC{T3MYo@LZ~kg*Q* zFxK;G#yFQT#`*B~IlRpu+)+QX)%8Bh9~qySY?|g5g{QJ$fjY&ICnGF%MM;A z+{7QVk+J?%a7lRccRAfUuN7YA#n#JNenNPvaHNPIVC1`VlRRFF4(c_`D8H9cpB~2ju#F!VZZ51Zj#n`9E9aK{%Cf1% z$nWR|&*dCH;2rI2_V_~aoBXKw@xpdSzqj!#@@dWbKinMOz%Prh&!$So`A7eg$7!Ee ztM@LWylpOWgHgYAe#`l5*|f^2-#nw86Flt~en+~oY#L>x8)D?!!)QkHcc?f?_spBoALWT+lQX7RNJrc zGtzHn(>mjKRThim3;Z|7=d)>+QU3`>{i_-CypmCm665`slizrLQsFw_N5n4_&K1@( z?t^vwx%?^_{a9AG_us`lW$X)9`4;I{80+O+5kFkS4;AtCJk6JpZ;4UQtzUZ%&rN>I z{a}&bG|&6_EAd@?zt@GG{4e1WBmMS4KEBSlKhNkx0P-2;sN>|nI3k%k$(3V`Mxv9`&-v08TpMD_A}0}V|-q>mMy~7e1X@eWo$B!w*NCf zzu02Dj+|%m`lFZsEqw!H9O`**<50u6-&HflZ}I1zqe(Z-x2pFjzh#~1E39Lz!z+7v zJ}vW+(oZq!HOZ*gIHO+ujC!^69`dPW(2x@p;psY-;7(#5eJ+Y~<(lYkd)}yu$G^zL|$VwZ3zkasE1|xWwmP zU>vw?pTCez^Nf6F*dyHp-@lp1i{z)!xkJGM?9bU~9MmY=op?Nb`gr|yd zUlDF8!sVQh-`{ ztag4WG~OrMKGz_8#2-6a)E7L=g+f4x;g%{bhG@CbTdV`k6#w<=BRmA$@{vl zkG_}dalj9%_bQ{@6~^nf1-@Q*hH?HRA#cLi4AT>dHkbwb%w7~&Lqb<%6I6O2EI1px2)e6y6(?AQ~D?2a>jH1b`A#CUzX!Daon#urPsQn8VP;VbpWGNXTv8R-u>$$fs5yS!FCwm9PaP2NZU zjaE8ecz|(!ALBVo7o%S~c^m6_8{;|FEMF!41fzaCjPkY^vE$&+PH?wJjZ`aN>Mmtt{3HurMlRid!dKteP*Tc(|H+vh;bA4WEhEI`x zn(_ZQll)MW%eSikP+=#3W1hD2`}(()GxnJ+yv;fKi?_aoB{7@Ic`NNHAPuiW7|dM;Z5%LEcjR`}qd_(90wB>1O2L$w=SMr#RlmNZ-Op z-^57Yz(`-mNMFN9U(HBg$w*($NMB;4KfY~Ff5=FGz(~KxNWacVx5~(OiP6qEM!TjM z?HVtRk1*Obz{sbMkxx6L+*U?@&5ZnN8R@DS=_(k{E!T`^e2#OKPc!}te5&&ojl)CC z?>TzwX`eh7#y+a82#2wc zYGs_?!ub4JJtLoLK2krG80&eTa${ZW;peRz-Ms!b)*-%HecQ9CjnN=l?>rWN zjpIkz)F3{_rJf%WUzbfCMSMFK#kXZsGvj+~y^MW-53hH;JDXPdH2t&4uW08yujU+| zDt?A5(obj8B;)nLI6r>YeT9+lCO;wFMmC)k@yGn6_@iuEt~pb>A+860O8jCrEim3c zn`eC9VV0kEd?uTwS)sfsUT6M{b5A~FjQWo<>Oah={}7)pevl6^?tT1M`SoT~6Jx$N zGS>fk#=2Y0d)S9A{MDJ#RgTZ`L$14NM*fqG{3jUwGsZdLQ7*}UB@eXjNhxS;mfU)6^#3EIsYVmi4T?T z!ch2wg5Ah@Jn}gXjz{grg`m?Ez@p*tAE=bp%Ox}1i3+!6ck;AcMm{Z! z@+#P5{VC@clzXUOV_n+jC9yx$5AiyngKsiEvwWWNr;7Lyb~tBa ze>?Lyl{3bvj4@6n#yB0hxTD_>8RK-o7^i*4IPEdUX_qlh+l=%Z{9W`fW1L3#2jKz! zmFv2nzZY(0q^m8C*YLGxt-p+MI=ZKF9N%a3`vT+qdB*vJjB#q_pM)zJ>B|`D*S+|T z^lLm4KNG6&B%iDPJ;m|v;&?kFpLo&!XCCOMN5sB_yZV2yA@_S*VIyylu7UCVp}Yu} z72zHI81EBp^Jn^fE1Nd>Tj^Jd)FUBy6zkJA^Fs2Qyt@eTgx}=k18&kua*3-iTiOj_3%B`?{2;>o&-Ut&yudGINrdhZ(R|tDIDN;%$niPG zx;w)L{W8sH*97DJk}-Z>|BYtT24fvu@m*Y;kxs;vuUs~ z*Snjs|LEdRl-J4sa()M6oo;8Pa$1VxO^ojuSFb-xykM(due0Mf=G1k9MUM9XHo7#)`Hoi%GYc{nM@y&dr_@-=XEaDqDF1|jS>bMp4 zwbx|!V8S`c%09a zZiJt4eGW6ePu9-{$EzNY_X(A}PCYBKshqK|C@bPiMf{2SZ0WCKE=qrtO^5tP{dJH{ zdyLO(Zu45{wz6rHFOzN~o7NcVRv7)ztekk>*T8t*SI;H&uVXy#>v&-PTx&aDpdQV< zP<$Q#+degZB>lP8{bT8GYrK{U`}tk@bTaP8!_vilx1UcC-^aM$PVw~jHvT%_Uwaw% z*B-|GwVQE&?O@z5+av6}Hpcz6m2rPz-RyGt!kY(k(qGr(5JV#E&xW zt3!ORdUrAQJyneQR5H?)82N4LpV;4QF#2Hgk(H zPK%6jn&lVeQ(3sIe_ram8OHu;j4@vAE$$o6YvudRrr{Iy9-{yC>&f5PXS@E6_!aFsOldSE>IvzbJh_&y#-}Z(+Qe_;c6ofcAdfeCp-zg}Zro=e2Rn^>NhdKI!-& zzrq84mHYe}_Za)T?FcJ>liyYT8b_78!bRmR@X}G&3x8{zCfICVwsXL|YGCa9D;e|t zQ2CL5vv8bml;03ze^~o4&li+i!!N5xHDf)lICq z^ye7=K|c)?$NTv}`S&vVu{(~t-ntm&ck=7{v7XV7<$QvEJW{{t$2C4resg@Ya<(0h z&qr_Yar&v|5jkAR2)FWc+S$Sf7{3O_@0!#X;axsb{kIs;C)W4{r_fUMe%ve8X8Rbqn9_v!eqw>6{;}6d>zI>y8spj{EtBP<1V?8=)&+E}KcN{-p ztP{J8`^8ofUN6E++?H;Uwa%YntW)ER^2YcQ>(nq~of=}4J6Oc`@dv`)oY($N#yZu? z*Ep}Kh;Lxjqn0J*RP#u`l`+aM@#)%sq}{Q8?G^pA$)D+u1;+X{!5JXgPz^B(5=vGPyHld*2iF~+mhk*}|l$K-YEm?O$RWUN~UjCE_DTk_pwtXn&b z>uiOwUM&>IXBg#-G3qhOSf2)p_%6o!)XM0;YR3Asp`LMFwLLbkORbD`shP1ZH8Iwu zM#j3-!04x1Mn6?E)}u;BJu4XNQ5mB?N7@!YWM}|%NhOD z`?%asJ^Y+(#u@1E|`lqspFXs*3$0%czd!SxX-acd9*(~b0%vg8k z82!`1N62r?dGS8Y2+ubz!>o4xAfK$Bbx+9sQO(^bm+{>CQ-lVlXo>g z=Nai|_-WVSL=hh2wP&sGyq9@Y$Ft_|$>Y5rEd2r}ZXhHI4^7FdqB-vwq#>4;^1)^m~(bM7|CD5A|*SThGJIhelqYoO;H5 zt>u48SHmU!Q^EM$?D~_`yVW@J_OY(==i;XdCmHMIDC70_2=5!~3RksvfP3P53cDET zkGjs3{!KY$yo>f9JyHFnJLHJ^9q=d8Ei=+BsQ=HRTwbIfhWR@6>EbVqUnj?7-^I8N zR@MLX_lp?mC-@Qd8R18xUc8o_jQ>U6TR*n>Ed6!x|5&>J`1a3v|Ks80&}}&uTaiPzQx??LeO6mWSg$RJogB+1 z2&=7|jBc_mqsS;~!fFe`f}p6Q=-DaC$)S!o>YN~)oO9xwI&zMnoE$pph$*_GzJl-L znb-B#{dT?I*YEdrUGMAtPMUK39n|{(FD2eS>V5Ji))}uGsP?Yo&p5y4!>f22{ZYlw zP`}9Y?LHMi-KRRJ&;M32&AL=X&4&!W_90wf)cs}#XQ}rj>hro|)cv%N$|rG^-S6V4 z>oJYG-$haPy9nxj7e?Lha;W=V7InYtq3W@Ns>eF2{1U4CJgVH#)%Ko8|2*@J^v4m$ z16-d&d?)=p!2cni8t3(Wgca21^I7}{@`-!9sPAV4=k57mNcdWw!;W#2ct`k4{obJI z2KXI5cRw)QK6Z&0x|ZvLLCl}T^}L4X=5xsh%ZMp%zk-slKFx@`p=$}67|4Zzd zu7{7OU0qz|d1Tjg9lV3_*+TuE^A0|nb~o@9jPGrH2II1hk0ZY=(`}-Df4PQJ9Iu+L zj9VOE!N+pEWV&U14B;iy74cNsw}|>3<{VzmJfBCEJBMm#)^r(sWR~|jrc0s9Phf|1 zv#4}&RJxeyX7Fsvoi^PRD%}LOSbriI<@~tmLb#)OglcyX&*FT*bVIJ|PZ;mVcyKD$ z!F2n03D>8Os>dFx9zD}_@loWnYq}1q9xd!sUK166$8_6x9pj{Kx-Hao-Naw<+`3`9 zb<}lTLtWQZ)74PdwSwx`GOC>`rdvj}a|zYXB0ie)i>51}+L=eSbHQ{ORDIK^cBb&u zEBPGSbP0SU`OKOwj%sHVKgQ>jQlC>!`mogJlv9lJG3HYgf5>zDr0M2R>p>Rve_)e1 zS{HnH4?oBJ+C}ZJn|K-XypE&&HEP{iLhY+_sQEtj0?YT1u=2|g*1kH0T4!ca>r4!_ z&P<`!nMu?-lSi#H1JwGmk7v@~T~v7+cpCjvLzS1!*?zir9rJ_uEet$}`l6oi8~A(L zzwN_YsQvUB>iK>Z???O!Y9Cud?Wc=AocG}@{*HVysQq*dwV$3sl@~=l_eW6s>2XxK zVShY`e;|BJef6Awh}uv0QTyqxKi)yrqlwy2H&FZO4OIE-sQq*ewVz%=?Q@p!Lh>o# zgIHJR@mTl!7qUO1|EE#==_qPH9Y*b^XJ2Id={RaX9YgJ>XHfg;X&mhn@i&woLG6n| zSfc(x)V}(d{B(T|QTys1YG1vL`dn!fwV$q{_S0F^K01M;ee{CgN0XnP|BrFBkH*nH z8b|wRR6X`_w2wyZ6FaEq{}yULy^V^ug?j$q#1(zN8TI_Xj;dD;wVy8Gy||3pPZv?o z`&q2fUrE%y;(&UtbABJSzurUbuY0Kdbr-e2-bIby7HS^tp!V0>sCv~=`|C~A^ZqI} z=*MN${(1?&sPzL?&pc{h9mi{^&m{gU*LwoLO1d%BeAvC-`muxBXSYz#`%Tn7dk0m1 z1HVCg>Zty!;yn3Q{P{BKdB23}w32R;1N6r8B8|?kU zDr(%6QR~Sv>Uq5&X>Sg-f0)N0`J_?fX%e-*1X1IpgUWv!mH+sQZG8!$)|UWkeL3d5 z)|UZlec4B?FE!5Vx-6s0Tf(1nd;wKn47GomK=o%6^|{YB=9oWq)c#}xmERtoeG2`M zw|dQ@zMm7vAfL~~O#YuS^O^9p$^SF9&ugN13gah&P4Ww)+7-a{`_mtIE$yDeCvktu zn*4uZz9$=H{-gHmC9E>emhn?szfk+rChGf84b=Cc>iB8i*KV0Ee538pf_N3}3Sfuy zN1XowpT~9av-JNg$NThq9IIUS7=D|4W=yw$DrX*5P8R=`^BL2vqW%w44R7W?R5e`% z@8t7{vguavWZGNA|Div2Z?^X&ZTtZBYoV_54!)o8CcY2X@a?#Q@5Ck4_ks$j?*--Y zRQhAiAJ6#XX@5M1tE8L37V#%h=_9E0wU-0MWQTb+3`DRf0&idmqe|*LtAJTuHVP7D%FF5vL zIr{z*>if4nyyINPhr;B$j(QI>q`gJfl_UHT;X~B-c>4HU=FdcdaYOnbK8E>Q#@{hM zR`52>FT9!iZxIW)h-XvZJl;Zh0VCu$hi@Z(0*|$y!RImW)==NCt>U*iet*MT8Y~IeG?o(5EJMP}X?-)={3(sMGtl%F7s24tpcIELAv@44LM*INkbGbwE z)jHE8AFVSxcq#E4sP=8+jl^HaPf-3UK9PQ_;STXCIH&Q8n#YT%^f^?#IaE0*oa4UK z#j|N==%w~t6GVOP5x_9(!jSWi;Csi%raQtPk?s)xi*YwF-2slCZx($%7}j+pp9t+g z#$Rh*kp}uZO=OUe|QHsCaGE?=Us-BHFQo$Lv!ZrrSovt4rFw zfxjl7b<8~$0{PD21nth6E`#?GFKxOQexC6yHNIzjSZaJHd_Tld z{TWk#(4RAShQ7ybx+zqDMp6AaX}Sr#n|d@}X3vXtRDW*bB>l93chXPmcIn!lP z=`uKnNsNM>Jz~WNjGk~FrG&^WV$iDkMu!&CV!$6 zFx`NDdIj}7z%!}mzUlh-yQ_IlHr+1XPWle2{I=XjT$F)(`}*3-$a$a zVY(`+{0c@Xzihe{yqj`LrpsfK@gg-|7JOK0yv*S`^SepA9>}`Z#!2R7;N>=-jtOfV z9il#u9N;4<@4$5XsBzTCaoVwGx*lp?PQSv&Q4}AK41dB&-jU$E{q-hzbMm< z;T-#!AkL6)z;r|Ebt?HDqn`5zsP_!}sOR=QypMc(rt6~e*~Rn8r(?P{>N&EBqxTc2 zblaw@qtb2R<4Lz^x(!siHPri)ReU1P*)`KuQ0*w2ZUvQ334g}>hGo+&p`Npg_$c~w z(R4Y~dxSYWi{n|-Wl+!SY1H^knJ$T{&kVM?&Lg?b(>^?s>l~y19vtAlfxO>2w~BA4 zAIqqDw}S6tohad>DRM&(tuj+gK+so%2c^7vuG3#QB9I^neG z5~zNSqxy9QwXRR2-g``$E{Y!@-K6Oz@S)6)Fn*i&cOlaqzmokP@s3Q_#|^@JrfcIz z2)9hPjo%`D-E?bM<@~DYR`9)qOQu`Iw-GLwZXV}oe-?FL%%J);ZMqa*z&e~XT>{@l z`dQP(@jJAC2H(f=Y12ipLU`PC0bC_Kymh2IK$W+TDz9(4Jydx;({=GZq}w%J2UT7R zKg#i@>9(*;c++&N_;$iI)0OZogqKZMz;_eQn{E!@OgL-0B(4!om~I9?NO;# zsQxHpk8!YKx*~pvc#EdX;hlu%O_xAE58sfwPt5wT)O}*Wc+~veN6p_pYX0t_=5Nn* zU3?t%-8EecHGi9^`MZOfzYWvXQS)~T)y_@Rt)b@c*b?<*-x{EDd!OK{GmVI~u&u9Hy!LRdNzm0k>tK*G4mu;E+-*?tAp362&w~l%) z>*3|>Glt&Ut9gIIetjABo^c8Pi*5}Q_HdDT z(8aHEKkMN4Xn*gu_I=1*93y?lbZyl4AzP+vqP`E=z;)cl2NJ(-x-EPL{j!R8Qtu?* z%zLSE@9t~txvpcnZREYjhSa#I`>@owSVN_+;xhHmp?=q422Xwv_ajugX&;tK7sQ{F zuhjW~4@;dN(r&$vI6(bf&EzucC;OCfJf=Ni(}nPrjK49{&7t~{9~>Ng?vlU&*LfE8 zcj$3^7UMC7qt9PZ-^;4vHz{u!_5G|R)c3OrsPAXxUuXTF!+R)y-gI-Q`eaR)LG^zM z_4~X@{1n%360e}#1M<6@dhB4B@w$a-=NjtoU8}@XeM+c$EaNX3uSHZnn*MyK>Ch9KYp8i9z2E>$_-+R{t94(e2$5CCF3#mdisasv$#+D;-;Iy zZ*V=P@rN9rGF=3JKzQ7AVf-%b9+L0VX=fkDDX)Xq)2}-?$@xvZkMcH9e}BJ@yX0R% zjsFBbg?UyYKV8=)d^E@NsQ)*Y!#g-WkAF}8>!|ruL;at&CKd@dP|x$*_(`5$>!|1X zK0bx|wNcOW!4mI%$mf`_ez)}q^}DSRj$cB&5bC*n4wY{Pm2Vo)eI)&bIoc7!39i>P zo`In^u+DM)dxX#9IlhT1cL&!fuZq7TzY^;2h>Ca-;YIuw;T)bI{Ve&YA7ZHAWt~C& zF6$KP`{T231?#Qy}x5Ag@|;{bP=w>5kX;~!|;rXOn#c8g4&2&{PG9N3ZE8z#(*K}{^?;~kP8_%Mvn)qYtv4y{9 zJzDd}YyNlzpL8ny;g2u*@dHH;>9Mg{o%~RnG*fo^e#YVyOB~qskda`eDt!-CuU&tV9hFZNRgWca5!Jp0AI|yk9ICw;RQ@R+PWbRND&KK@KJh~S zcmS2|nDL}^`>1$5)bU+^e8(TJ;T6oQDt@1FyNsV@+%CPD^xOxE_#EcfqUj2#@AofY zmg70o&Eu<>cXOu8qSk>l>hDq#sPQy~S_h(-Jwg3Z-{(JIoSx48TIznh@555}<1T8Q z*v5-k&+1sD{4LW}QR~AI`Q62J+DFZwj$~f#pz6`Uhw}Gob=2<`tfBH-#n);bFBCqeeaLi+sLwC*sPqf?Y|`iOLG*7Hl`ey?BVF2b zRs1sP%6KX9>pr}R?_*r8brm&FD?VJr(Y!>h11WqZ_njDOd`|oD z7^<9p#l~eDm2L}D9ACp1aKBu|OK5iuZ=}9e(=Fq3iC0ABzks(h4|Dhx#&rfC$Nege zj(7=7pI}|Uv&koJx@mttiWd_vg8KY0jOVCdO&36=AHJ1*Ieu)q1AGn18b%P|)5TEjnnHaqEsCExmvs!Ur~MH; ziF`t+ehK2OoIm2a{etV%#cA%p4Xo2oQ=j1PVYz=s@qUyuX}SqKWS&Lv{v01ST^R4- zcnAkPH;kDs=#K~RryL)Ce55@!ZB+WYKfmZL;O&%`$CnXr0v9oi>ZjU=nD=4E8GelMQ^xx--k1IHCHy$Y zi+Bg?Xaac;ydkw8nDt?){Xhu+hJFg-k6G`J{*w2k`hE}Ux(!UXi#MvjQR_nmHJ*y7 z{lOe+93@cuxj1Tk_djU&%`Ph3#G7eH-G}>YR(=mvej8PO3!lpMU&q_Xzk=F#l~MVW zQ0reFHBNJQ6X%1d`V2l`_u&q{h~q6h>lF6ksPVUk`n%yWj??~<4;S!i=0yfIZ{pr4 zs(oS9I=J_Kt9KVi^+wgZiCX8@Q0v?ZYMoogn^|X;OjkgyZ+X0l;|r$C;ia@Ig(`mr zwa*Qr_8-UZv-TgL!h1g4LOr)MeYoab#?k)WhZj-(Sn%N_s()ut``;Uz!M^<1yG>0+q+Q4}@q#!%Po@ZC0!I`}&BZ=lxwI%@o`q4tk8 zA1^n)6CiRCxtdd3n>NQSa4K_-(G!6rPX6D*F%8?V-l+ zCSH#f)b(6J&F36ye$An-TM~7hr%?SLMfFDzvxJ9tS-b)2I`mNe*+s?M#(BbN)O<*w z?(4It=duWDypH2C<27u$F}$1i?LpHG-p)RP@PX+XsP?R)+OvpiPX^VV6zV$0QR_$y zb^SxAaT7$f?}+Ci)w_>paQ~6I|Lpm&96gVsejlQa`rb;4eRrDmH;F6cm-pcXAFiXm zN3)6Azign|yN+)=!Fa-lQ_nK$xo`zvPWwxy+uySNTo<*j?V#4zRn&Z0Le1AKzLD~i z_y(LrwJ(Bd-xz*?ct_-`d3uP7KfqUU-`z*0>-%sA^?ta4qwkA;(%LyBpOW(T;R#eY z^*2_pY1Do8_*1r?^l>z=F{ynYevtASxWzu8?vHPw?gyLxco|<$z6<_*4wWwJ&!_zH zBL(N;s+)K9hJk zRKKSE@dWBVG>huLDSXcf?g#YC>iOsx|G<1bGTkA*j&gQT_m54~JYPZmAI@mq z-oH*@pL#@4@2SJ6_pfQx`}ixn3>U~1RhgW=f8TEdli+YdQ zM*W^?6Yphzu!9Z4+jxTZtm8h8|1JH(_zGcwaXV(Z4C*~d3OmG0qCN*npgsqg#eL4# zQ16v1sOP&f>OQ%MnhynBAm6;{7VszZFtPf7Ns~T;jQ=YPt&Q|0k{Bb(*)P zTgKNCZ^?8;)aM!ne39B?x&?d}{hPy+IG@4usoyMW9)0U3XB=7Y)>X zsE*GkpDmOBD{lQ#!#R#uO}Ffi7x8%3?l^_3bZ1n$7Q}_bTCruYa^>_un&)Yxq6JZxuD}OE?-|#M9>i6+EAGMM*vj zcrxJ}UPrlesP~k!sCf{_*Hgck>84S?U$%#uKV8)4Q%%(8Qw`MTQ{m6qdzBF0%X%|r zx*_NFIn@+l{r<-U>UVcG@w2Rt8+Z@#*G;#EFX1|^ny!ZT(%xm%dxs)k#k}sL>eIug z(w;Uh(ViXDIyJ;S>UoGy;(VsT_#yr*E)p+}&*FFt_53)4dhVP=JqJfH&ib~6`unvS zK9>1fMeVDKsOR|P=eeIVFB8~gp3LG;Xiwa9G1T|cCsFAqQ2YC#&!^|}*+zXYy})_3 zYXS8+c@DMy&Y?ahuc6*wRq;N`shF;W>gOHQ`n-i&pEvPT-Y2Z%CA9azpYQqeUDW#B z_UHHi-tHTHyqa;aXSyD0o_2Ab2HoiuQn{;8wZkuAK2bepEDpx*lw zQR~hk&QQMv9A{kTQ0arHb@Pz=eU$4S_=1h2DO5jAVjU;2&3n#q9Nni-`?TpV^7j<% zx2EuqC_ietN!0t#2@G;PV!CmhCS3^6QF(YR|eUmX4;&-=7{fI2_)@s99L^6jGT6D`#D(PzHIdr|cx>2-b$b$;e6 z_BqfLK1SEgbd&fB>M>!uAf7?_!!I+xN!RywQJ)j+`f$U$irOESQO^e@)VjNb+7}d1 z-*;KS$5L+2baSZp_bI%Oeo3O<-zP9nyjjytqn>A@cpc+r0#%PO)aM`r+N*r_@O0YW zL*>)O+sJ3vbUUc$oo##y<7ER??{yr#2T+)L7f|W*_+rv8m@bY7q+9LTdQrg>oG+WM zgqj!2_+ySQnJ$n2t9(p1k6Lf$@G9D!#SrH+rc2{!KZrl#c-(X`e|!eD51qz~IX`8( zDE?UU4;{xNrW?mwxxQi3jp36yA2eOSpC5i}6we*wvzhltsLu@tcrNh|Ot+63FMZRs zQO`A-sQdmpzMK8R8fxEE#R2InrYrgL%c#FY$fNe>8C3d|KR=85{2+!mQJ)#qd$cHq zAHw~_heN2}-3#LHxIV-GVx2lc{ZY@+`>1uhkNSR2(}#CZ-*YLWuKOZ>hwv=wzBq}c z5dDeoBwYwKP6DWSjsN6x9>Qf*cnROfKD>ytJcmj>hc5cC)N^P8^?xU#cmdZxf@Sgv zq3S>AGOie>`>6K=JyiX=cnbZvYq|z1-Zm;;9Z%-`mg&~~`Bi_uh9_~pYPw~AehJ4p zUNqezD!+MuehyFPeAeXu0o(b6KR=77aXxOkm_Hx!=fggH{7tSK@s3P)h$^RxYDdS1 zH+*=_hga}VNLMo5vOk{12Xj1Qx-_0jIAyw7d=TNd>1OZ(u8Y)lnf76+>k`59h(B(+ z;eYUbYh4G_`qjq^IlpJR9{xT1la4>%#u(>YrfXuB>$`z7=#${CgD|kNX zN~SBI%FF9K#}`aDkKg0HZ`PmB;0))}rc3(sQH9BO5>?(fs=UrO_j5yY3geyhkPe0G~j)`}jiMm+WDR_&w8g zQSog&EQ(O_xBWpGBpg!OJ*5ZMrE`y`!jhP2w{+ zKViBss@`M%d=USF^8wQh|J~|+h;fb&Om~1PcOO-58?~;rP~Z34LhWyAm>^x%bQM&( zGAi8?#)wzMONh5<@_*r3w+LrV{x7_xOQX`wqSD3jBI3nNH-XP095LNEs=P2NT@Wwj ze86sf8$Dq zUD}^d`SUSUxife<@up2T;g3f!&GB*59ekbV9>V*k>!ZrsLzTCK=d(Xq_s7@#@gl0e z1=Mvj=H~wQU3>K40WFkqVBVY|H^YK$G1@LFROSn=gauL6O1Fgg8U0U zoWeH~j^GW9|8Z3OkUu~C7dw88N;g2|)Az^sQ1QF|c-tRuq2BxL_~RS+EYh$0a0T_= zuk6DG)IMS!^|@XO&q`7+yqI|7_*42lY`WGzvtQzP19g5I4>(^p-6}584;9q^K`Ei) zFQMWW@h8MzG+h=IZvwx4g7%~SFUlAu_`Z73blo=dkMz6vbk^q`{1*G#b<{q34OMOd z-_CfM!zA&O_%saT81aVxWZz#|LG~TzhEUgU467%&o_H_$9Da@WkK|Ls+X?4!n&+Pd z)IKSPUE-%u@AH%R8rqdG-3;n;q$$*O8%OnT5Ve0h{3_R<{QIc=Ui>qVqSDpyR?<~XS3&h}5%sx69Q8i`a56Odo#TCc6Y=|| z+r!@x?wPKOqwn=&mVLuEo_aF-bbKq{|KBiO_RP?zKQkC-JoV2AjsB1HE@~g##w6vg zqw-0i@=0Qad=jQRng|8{l>YAFOK9IN7O;uuQ~zzegY%pCVvaB2H2Eg*O}b8)=K9ti z5elp_-%e;a_mPgQ`ax z^W@X=;U!c(3iu25?ogQL@} z-wsjX0jgj2QNJ(M#&7dI>lUt%?*dk+*Bri!{IaNiPvTn`R|(U_QR_wwA40vSFu?VS z;#J(|Ch)DqkC-lu8b^nxS-Jsgz3HLSby4Zs_-4|zOxHk_vyF;hm$YvKm2MrCZWYU< ztC_BXN>@hJZy6PT2^GJ9cM?Bux_MOmIaE1WNjXVWx&$g+94n-YnQj`DZVFY-1S)<6 z6+eI)$Mq2XLBDR{`Q*EX8V5zx^<6|=zriV?(cd4n@R3}v9aQ`V>iTV?uHORQL4Nc8 zd>l{Z`~>QHMo`x?dU9y=`}E_e_eLSqyc|Pa*WMr7JnW*vq5G3B?He=Q@P5|5V^qH! zN$PWeYUe(xox8|;m<_3YOUH+$_AT3}>%W5Upq(Yu_b-=G?aSdSsP{ZRi1jp!Ta=eZ zttTlQjYIqj{hUDc!>m6(jcV7F4@Xh!&NwRnFlyZi`t!#DTW@x-&HjE3%bc&E)}=D4 zycJZv$MKomm->IOzYlBTD)AfmUaX_)xrHik6IIW3AFiV6SMlL8s(vL@JC;!OTlD7( zsQTnk^_lm_W2kj%@Av$DE$6#9T89+o_$J=Q`n7;V>XAV8>ny5Y_kL&b+Ng2aKDOg4 z$a}F3sq0trVX5mEMXd*usD7Ei8sP})Iv)I*`z_%)H4^aKPh?iplpUUw(s(lI6Jc;AU#&5n4p~$?)2R1Kv-l$V zZyH}qJty&9jPD84h46tVxPRPd?|VAd@8@|gt>De{ z!wNRIKP_XObXgoy&jdb+`{4|JpZ=Z1ZxIgTr*Z#R^e_AJ4n6?4@rT4)#fK7}M$Pj{ zRKJ8#%R`x=)bnf*sD2wq_1nRr^;-`|{f6qdHB`SX;tKhvQ2n?4bDLka|1|^m*t{I<+x*x?jmI`# z#&~a`#(5L9Pidgmkt%ARQt{yuYCJFd@EmI1r&04hfbZn`41YM%^>B1uaCBX8bX{yklTmlTf1GmgeHj>a?Ux(t3`*JBTLJ$6vzc=f-n z-xt4c{gy=a+x#AX$42|JsCK6D7Mwz@D^VQX$58#Z|6OZ;2i5)tD&8t;{VAi?pC#0~ zlSi#P8C3ctD*wTEEZ-igzq_dZ-}T2kK3qlhcL`O_9P0XIQP(enx_&8C`UzBi5g$JM zwyn$isD0)#K7)GYaF=be}^x2ea*qe7$qb5TRRKPaN!Qxs6|DHiZaIFEWykwU$vm_o8 z;URvNa*j~>4p8^eP1JQ?LzPoQUGFO1$~YDphQZ7D`-$ytwT_693_Y!-i>*0{Ux9^&+gD3I(A#KyO zaEtg&(>3s$d>*uIx;p+f=eJC^fo;yOo34TzoG+Vh1^=1zCDRpfjq`ca&Cm}0KE@QT z(tlC>Am=AdH-Wz=eZ+L*csKF#sB}4e72|gv|B`fbrpw|u<2;Ek;`}Nqeig6f^S=t} z_j1elA=0gwu7uy^cM_IOw}dKh9oOmq{xsu?&&~Gm44#jBrfcK37zZu<5%q1Fu7N)! zeI4J=?+9#}ZUa9|x$CB@qT-eDeZ*TaUC|#e;3~)Srpw_MB79HCbTNE0<7fu2rXCS| z!YPa!)c6fzhey$X>5k5!-#FgI4~1A~@Vz{@Y@_0D;^Su+ub5-}Rq?mHcUi{%&Ae|n zT>*bgd-JBt;R}hM#xd55B&t4BsQOHz@*hX#Kjx1I{PCl+t)7Rb>)`?UcTLyApQwLL zSHL$={~Z1=$LCF##gEXx8Plck1N2|gbTOQxo)f5gj-%=s!WWaznCSv|SDO3o<3_q8 zyovLNraQnq;eFHf@J7O2({1AogzKhTKwYOCs=N%UU(#5keks!>QT;T9@8)>abd&yg zcgn8c48D|nrg4_`96#3bJHnr;o~9e1^6R6<&7SFY@LTM2>Zp2cVS#j;rd!3E3D-=w zh@15HEPj;!jhk-B{CF(u+W=pw`w8Adx|ZphcopY&@V_W$6LlZUp38NjUTM6R=ZF+u zb1vfs|DN;-)5Y=ggkz?g!FyP@rcF1A4+^mVH(dn3K>TsjjiG*5B#7VOcXznb(j77% z_E<+33F~)73U~v*E0Q-|4*#0(HP4%_f$yNcb)06tZsNOm@411$XFON&6Rgh_{7=d+ zn{FSq{_NqiS(keFSM*=kbi4Rq+S4&z8})lx6DMr_ilEYmQR`g@?4K>BE`^Gh zK>glO9Ag}h;RWPBW4dY7x|YE&us@iZpP{sFw3@!6+chvc_sx*mQ^{cXAic245HX1Yz(=P%26FX@&{H-}eK&-?{` z-eR47SsF*>qrUGmjb+Bkl&jryL{Hh!9Pb^I{>xn;U_)c<#@ z;5x_4rYqn#m>+q6K8+vZe9Ck&yqtU|@of4ff_?fUj2|Rk$mIXtG2huY4<8>2+&;m+ z0WTxm!*7y*7w@7gnpmaYJEm)3l>6Q$rv8NSj(V@Zifj78HG z@DH?i0kxjxOqWHqH-(?z`Xo&^j=$hKgiRN~za-s|aft2^)s6wG9s8(ubWrVRquNnN zt#@0d+eEcv6(7mCDWmGYf~x;AzJqX4VcL;FzVE#u_5LL7!&2{0W^nX9wF~V&(nXDr z9lU~dVGT7-R`EIHU&CL}4`bd&jQueExsHmrhIiA>Rnyf_@yn?3y@0xJNAXLnGn4pN z)Hi}(=Ds{`x-r!H95mel<5K^>s*8WjI{0RG%z!Pm>eMngE9S>0Z>n`fORtNtXTd4i^ z4(j=I8}+=pOZtD}dbY7ZyBet9J>15Jvp&^Lw}r=y_f6BS?drSNpZNz=vfG{Q5co5Tkbo-kb?Zuf;_!n!XU;Tu>- z5Akog9s|=I;5X?1ebe<(_ldYqKZCmeOyj3XH)Xmg>i#p1+HWtQ?nCqVKGM(OXNaFQ zT?T(fIcd|SP~|jmbbm$tKI9f^Kd_0vBmRcz){*^qdd+mJIOKfIbXEK<;fm?XctrhH zQ2YIo>54c@{`)w(KjV9-M-M+sysqhXu}6L#)3tGQe}0m`KjY~BjHCNA{vGMZOc%t_ z{TWC1XB^$1addyilNr}Drkh6fM-dgjfd5VX^VlHY1=Hp5f2h~I>E=-N+Cp82O;q}I zRK3>l^Q2!jT@6*Q9xC20s$OkWy;>NiUQN^Opz0NRvc(Ug;tx5l=c!}-0{I`A?hsFq zeqg!-RQ-~qQ~eS?pE#<1G29{jjOnIP^;<;MFOMoOhpOK^KAHUIOqWH~Zw(c{hPs|r z{0H)_n68Z9rr%afS3=dRgG$#zmD9vq2=CxOlD=WOZ9Ii?>!#a6l^eat#_t4vi*+f2 zUuB&h$N!+bu<6F|OXL?cT>!t&`62nBJ4V&-$aDudLw@_%BwgQhd-xUlVTSbD$CXg? zX9;g+|4~Ghzld6A3#MDZeE^M?`8m^NahGt$bZKn!ekO%qCSB5W3A~K^QW?L( zdbxw@zirg@tYeG#Tc+E@DD_=MUH=w-m2}6bbcd*P1N<844otU?O4miD3(St*Q=A(^ zrJF{jo5D8fqNbZfr3<6dEuija^Y}xx*K}F@f!b@jMb!OZ1C?$aRn97^oEqvnR83bw zm9vYA*G8>-E$k4lX}TT!7UeWdw~ZQiS?8aF@LcvWDLj?yoy7kpe!_IK_zm)ln{FC4 zZl+8Z#qSZGG~GDv5(EyetFX^pyomHV!L0)Q1{Cj9OHg8ZMrFJkS=Pv3H(3aZ%0fQz~}Jy8bk6!cZ?4t z{gLVR@BxH-rrX9pCR{gN6;=N-`RMwspxUvFx_(ReOnyJPXu3rlt%LYA&hO&I>?7Lv zc~(cd>k@ig{@VLXX)#_)*o8#G-2W2~1$(v6e; z2!F--L(>iL0>;-qzJT<5sLx3{_;cd5P1i)_vxE8`LLGm>`7P6J`tuv8a@O#W^Q)$- z`155{`X&4&=ZmIW^ydqx^b2?|=X0i;^XIdu^s{&i&qGqrLvbILdLD|Q{!dAP_Uk$< z;DGl$^Qh}EhhwL)4>Vl{Pp9A0rc2>Pgp;OApsvFzD!(dfA5_5~a6QYWTfuWkS2Eo) zD%~1>77tMKx{sRIyQulxMvb?Y>2^@_xq+I`+js`+Nc3q|{sgK$j58sQ=NpgTs@E5~uQXAYHL29;kLm0!wqNmPCb)6L=;gyW`*q4KMv^4r84*te`> zpL}ch&LH#2bQSzF(w9wF!XE$EYuR*1sC))^J^Ae8X#Uvw^q%Q@sC>Jo+r=}pbt3@Bw;Hje4$M!n>GXi>UZ{{Ikc=&lshC3H&no&SIPL4p4tD+Q&DMu7?BCb#agP z1s(hY>rNYsq;LB3JNP}$H&B0%m3%t;Vd^!3eeNF-yt2f4!1=p4pGvX+;5|eV^?OeV z{AU=h#2MLd=G1yuYzeue%>qrNAQ!l%;S2~>R|cq#1~$2TzFgZ_BH zA0J-I`&;%gM|c_xI@(>vU(s)i zcqZ`*_)FCjKSsM2@NUv&{qYQboa1SKdI_5VosQ0=bbTU9?i=J*PJ?gZlv_5Vm0ai8m#M!o0GbKTCNemVRl?U=_Wgqi>N z3F0rI%2`DHf6~-t#MAh|x3Q0(#XshH#8Cg2d=j5V`Nz+opHy$u^&6ntbAY;jEgx>; zBj}F?p2z3=Td2=BH}O*9Rq-C)&o80=&*>t*f$NgPTWQ}MYW`&KEczvlSCKA(zvB2T zK9_M2_u&|h-izXu)N}9`)R+7YQ2)nt4jAMW58%=4BHH}Da(V-0^oyb|`gzCEtbceqY%d@A*5q4H~@`eoaP>!|Cp z>BAeS-~V03Ptu+;>i@GY;ioW%PiDLvqyA6p0I#9kO4{}%D|i~|modrsSwfXtL|v~e zev z_pLS5|D~+r!zjOEx-$NO{8mi2j1T4flIe>05WU%vWNeVe0!$rVu^KU7qvg>p!O%J zD=eP`DxVot`Y8UE^pmEGpwf-w3pl@w+D|W`?)QtR{dWQ1&;2=Xx&_p8Q5RL;4yv3T zR5^A09p!A9ZXH$58mfM|XEHv?e-1y(`-u$Z3CHjajGHO^J?W#Sn?#jAVY)H=D)}6e z-|MNz0RM>mD;!t7S5VKTB|Kmsw`{s43~?QbrdvdflRZ>Bx~O(^P|tU5RC{(XKt2uA z)lu!)LbYcy!}TQ`!4EOM$MMD!>;v&TjJFWp!SOLvyMm@WCjHA;zmD+T4;La20OsB{g~KE8z756(ZE>lC2haG!N9jz8nMC1$#D)bBg(5r3EK+`|D=tb-rp zKCr@hjh|)I_d%9W?-Pr-cNO#BbOqFYw1WS`zM+Bo{9p^e#(i=VAABm~9km_?p2K`0 zJS2QN9^+})$0E;7QqN6$J}mXz6eZo++=n7~JL6;=!=wwN_6LjjIL1{TujT%g!!^d; zJgPo1yp8)q4XcF9_z=<`JkRRaN9`Zm_;cD(!@Jo3ETev3V-{83@VORV#w$-}-r|SI zFN`;nZVZ3TeIV$MA7$DU14h{|pv*Pm?y?`15%$qk7@_)c=U%Psd$+F!^lb>9l_xk7!R7 z&!9aO{2KjLK>dHcdAx^ll_VeaM;w1ozB3pgpJ_akbW?a2#|s#zoIL)N{+h$D6VBoy z=PUR{>RZJ3QvND#KA3TanxFfq`5C#2`r{ZrkntSAhf&Tk=dUEcls_NCzagJ#yk7eo z{4?$obNDXyO=a9=elFu%d$%QTS3j&GHSlApyulmYQARi z@i^<9Mm=xuVTAkmHvT33Ce?3sAC~I3@(XOft>B}WZza<$qsq^t{%&gl^?j)vYW%=x{ zov5SMiA~fxaflk{d-zoV`~s+PUqrPhhgvVQsCFdq13WLqQ1P~3 z$n!VXWfM=P-fO7#SMV*wFXHF8u8TPOoo&?f!W91dA2W{ep^WPgcA2+B@>RHp3h(-G z8=p^pEq{C)&!Ye9rd!6((eB9?@g9YKh~Nu3KW@4(e*6aBvzac4pJSW_@IR=}A>~h! ze;@PM!|O=jHQmtypBF10K7r!{(;eV5Xx~2Scc*%&-@okQSBSrhe@ngEsCA<0&+nk- zTLa&49{q?V#%UebS?^ZyeWWj=z8_q|D{u+#;dmZT2s>d=&YmQ0q_<|Alz7 z_+E_T%Q!xRx;`NsXM6?y@ge=7;|HjE_VL+VhYqSeZGXIps^<=>o*Sro)=>4Upz6DV zs%H^Z&jS9CdM=>G!8~3_KhBvhf&WSTDb(+B)vmXBR>hl%S211LA78xOyJ6)h7!3WOsykNRb3^Fg*@p)XIJXV;m3#j)o zIeaqT&z?737H{Kx#-C5(wR(Ou-6U#WhH*{rt5Erj;lEza^M&b-3bc=Pzkv^@{7qE4 zbyR&;QT55;lWE^PDxW#LhVrteOJkeyF^%en04n|Q&6fTM-^utm#3%9hbpw1n{c&Kr zeY_w2(KlTi&!_*JcnkI0!MDc}A_AYtn@uj?%Orh!-@yCPsIqoA;_mO}POWj8fZ=@d>k8MoRkDESR z@fN)ccpKv=i&|e&*x-H{!^hH&2)>^4gS?gB!+)S$sdBqMELH9ns-9D*c^bw$xL#xU zI_2}?(dS?rQt1zTSSo!N`QGS;)cIW>mO5WYt$P(zzvS_YjGGLq+!Q{NawbvZ9wQ<$K$8!DKrfcCJ_ zbUUc`<8{=&xQu7AJ}u&DlvBW$Q|>(KIweu-V;s|zA483^X?zUjOqni%U!uL^7$bdH zVbUGFgy%5aN9EH)t<$^se#&e6^K~5U15o+YQ2A69CfyQheO^R8=VVd&&UhnuE9b}X z@$9b-ncr`sf4ZpWpyA6IZ_K-6ypehzneGtBn0Euy9iaMW54HaH@LANSD_QqDsQT}q z*8e)H-dlJf*JT5>f2`sp=~qzqrzKSV^Qisfybotl`;Qd9?mWgPexC9s@z;#^!ulsOwNd_0s~X-t(w>hf(8X4DeQH@D(<0JE(qXqWZsvx?WXO|CLeww}OgS z#4P!wQ1wmVm6Shgx(I5X1@VCT?Z3+E*~d$Ww`aN@Ucmjni~9Z8U7Y27$8>GHocl$~ zbUWxc-!R=aK9lox({19#oZm3rIzEf@Yo=R8jnfs>b;;n{=+^{l9g2CUQTx|PA0GFH zaGv91sQr2XX9%}nX*Teq9N+X-@fyyT@I|WpwSoGlqg;hRYq4G_a z#!>k?Py88F`l!OhpTrFDCrlSY#qTq&wBGLGlS$Xci?|*w(>3rd>~9uP<6|B*jyGS; z=j-gl*YWwpUo+h*&Qng!bX9yO*RPCPUsh1h`^$I-^JfV!pxiW`&T~f!HJ&5*NcI6o zOYAE+e~2ymwU3(5yLdJAZ~O2LYQC=G=s6cJB>xI(zAmHkE8yw0cfp^}`STfnK8aEC zN#GZ$PZU*7#2doVyk;ETL%yNgY#xl^9Q_b9T>!79ABL|R>5fq2wTF6NQ`d3&vx0gr zvx1-D{d%8^>&H5(|29zlmqD$I zNz8J52EW4nB7myT;I&qd1H7B?EqhHtX&hr?*KAcCD z7sm`n{qYG@ys!_4Q1d*1dJi&uja|n>RQU&}=aGF>z4lQ3w2N9=TYTnQ29=w#>E6GpK*Wuka4K-&_-SN7JiU*xsI9#^*69yX#K@4`nT*Y z;41Z7z&|JbJZc}3!9}eTnBw>>{)+ya#77X;AFDkB8zl>GAm78>klK%}`>@o0tb)p~ zjLK&TmG2z>AK!z@;IDBCk8u)zgU7GudmD_GL)8C^8(@v}ZGXIppJ(0J@yFLOL%wUM z&p%i2S%j1Rcmkim@hQBV<53?TFb^gOm%Ul!`(ztZ?aBDCRC`jW_DY>k`mogbar~R} zSO@4Qy$|o;A@7~r_%W_a=#BQCCyjc)kwm>$iQ_q3r)fMIryo%7b$gQQ*22rEXA^H{ zU$uiTXFfMfx9-oc`SYvzGS1gbm&YFUma6xH4@=ei2#?5j>~_BY#JnxzCm4qdsQ-^T zk5|zD`}lgs*(UChpHzMuJ}i}AXvNwW#II=HV2kv}oFDyOGhwwWi5hna)c7i)%2`B} zJBNJUx*=6g)`z9a>0*rZ4b=T%3$^|pyoq^5xqZ~{=EI*SXSeWHo~Ik$I$lM( zRUEAksP{b;)Vi^Z|H(L9!ZUCY6|aDL9?YZS&3iN6Y1H}?Mddf?j|WiuoMY9W>vUwg z0qT9?9_syQ<75T3K9^AYgeBD9m&Z`+a1^!fhWz;;>iJ4P#*?7^`>6NY9n^d7 zHeN}(i8~ob%%cHeKKI&?>gNL=mg?s;@zl>roFiQvv%LSD@!@II`?wrt)DNid3kA#e zJ;x#8Q?mTso$2;{xbMSl;$2O?8>sIclzh1RX4=bou!~vxsbjh}&T-#qnXZX1rQ99- zN78Tma2@04F<$X}*3m3#KaT+~JYK5rXW+wF$CLi}tUo@D zdOi!F*7ae9`9psh3#4nJ#@Q+={~GFj zbQwF0-#DJf{wIbvXnphHs1F~%h4&d8-@;o|4{rq@M}MuLp6iRK_T^Fa$l^w&~*Caxd+U%zj^yecZ|A!4^ZpD0cta&bZ-s>%yF7J;o;5Rv*GhN0XPh*mDQl^Xh<1u_1$7f78>5os~Kax+xbmOS! z)i6Gf_J&M1hI$S>u3Ej0@Tuf?Xu1P`ypK=e_@3!H{&*V`9B-L!+aIsvB^=)}-I_nX ziWhUdX1W!Byo3{1@*dE11%Et`j`$0vn@2qdW%2nO&zLTadXJF8o4IZYd@k*rHQgi* zxGv-PGaU2bW3IEphp6-WKD_6{J=|kmYoXrH)baP+Z^qwc^C^r^QGc3l4Aq}O)OvBm z_|f~>L%g1P?W4wh55I?9)Hv^8f_&PhYog}chPQ^AhZWTO{w36Xu88{mlSLoS;!VVh zqvk^lH6JEX>q?b+Eo%IsKEFw0>HhQ^YTZqu=0^f^>Oa#>qw<-lv9HGnzKMQ0=J@|- z>Hg!}Kj;0AXVWNrXikhG-qX>%crQ%^Yf8nMJ*y z%Aoc;gL*EW@aa+1yb?yu*F);7?eeJV}1=ReMMa@t1l6GeB z->7%mbSb=neo3JEyUG5weyyX{uQfc8ak_zhu1^)Ev)>YGy|;^cKiI(+YCc1~AKXH{ zA3VfIlRtSLVe(C3jq(zB8||Awy@!n9>&O?yhf_`%e@%K8A5T3}Yc?Ou;2G3^+H^_O z_)TD!ev09*sMp@dY}}Sn&*e+_eCEMb)N|u3p2&U{@M8LD9-qMRokNu~jT*mGK0V>n z$9;MXRc;hj?ii}vQB=8`)LZFwRCvROtEls{hDu4O{o-@%OQ>gclq*3F1548?y zqSikRd_47CM~%NV)VjWi_vQE&Fu^!pLG?ox_1du26+Y4-+3 zna|eo9NL*h{SIylRsIwz|D@vSm+mKRoVHQpw2qpO%J^2=w}L7+iz;^sRc;19%(`a= zi?kz(DnEo8CxcJ${vG%5p4@lrny!o5|2As>O;q^}RQWa3aV?_CUGXmB3h_zQekW1a z>v4Q0*Xy|HBB=e2;R7`;@EN3sOgG>-Y8|?V>h~_H-dm`8mr&amQQH^rC2YTHx|~m6 z@#$H7G3m>uTg0R1ulOS3=S-LJ@hQv@KV!OS)H;3&HD4r9^F$OiF9cER%_`$X{k4X7 zQvVX_yvyS=*lr2+Ij#j%JLWOZc5#ex{6|0Q#~tc@Me8#*k5(~9{tBMPI9oGa3003A zYQ9}S<(tDe`DRU*M&(POu9I<8|3*;t8$+#2!gwL$s{d&#ukGDHwY!3krTis)2hO9) zP5bzy4=21a)Oa292E74%7sqo*yZ=JFw^8#?6V;EgFYp|M^Lz}SMmxf$3*j$_58_ja zA2rbySuJmZY`q3I6r1kUS$>H2s)?b|^;?`xyR?*i(0#C!fXr(4Gq3154;gUqWrah?g>6)A(rGHH~j0K8Y_OK8Al~{TTJ}5g)%@we72@^=k$7 z{f9C>gZ7k6S3s>(S5WKLEb984LG3?{y6>IAQ<$HksQhF24(9a$9%KIBXME)d_fYXo zRD2$f%Joj;Q91Zv+8aV$Ul-|bJ?BWHzW0lY z`evtQ>?-R?Ybw~;IJ&*!EkNT{dE|1E;g36!8^SHlXM&)0^=aPTX zbhG$g%1it7Y5V~5OcGU20#(i=YQGbB^!*b|QBKTsQB?jhRQ@n(zadoqAU=ouqox~P zZ2KLc()UpN-9?qtLzUA-?YD!<*T!d4&X(ymQTdyw{0-E8>!|!Sd=~jPOqa!Mh<2gY zbum0zZ=;@{Z(qcE>_o0tsQz!_864k+>1wFwuWR@k>RZH5^Zb7XH6D|w_tFzSJ%~5x z`Ik@MVf=1WzaDD)ZSNMUoH}azbsxXx<4ZnVz~dNStEl^!9L~_b71J%C%AG~s_fF&S z%=6hx?77quKArrFrdz-Z`P|;T>1J{JM4m&NZU%qEI8ES3IFH*Jr>yh0Q0Mz5w$x9k z{k1QpUuoYKPOzU%)3xw9^kdU>4eZm74LqHERnx6wk8s6wYxr!oE1Rx>N9Q4qlP_nw z6`Ubo)^y9Le2e%<@-3Kd9-l?NIn&Le{y#W|lczI&QP0UksQG*ZAI0_o({<^G(>Ts; z?W3Wa|Azy0`yRuP?e%^40seq-xsS*5J>tIU_V9M*=Uu#l_1uo>dZ_O= zj8o1DjE{Nz6y;>_OzM}$_c3l$xJq~i-^g{UgukO*d5rKLE{AswFfU+`>*vH}^cUrf zp{`XOC6OX4o8@NKhuA#2?^UBBhvU-JG$8-1u`fJ7H|9fp7 zT{hhkzL9z@pq>lNpw{ElsP~0qJ{0=|WLBagb?F5%}muM?zM)G1G;8dd=ZZ$f5CLCK0c3sCx6a# zD?UDp0rD@KZUO(y{E+cZm21jIR~^ z9OGjdM>S6I8sZo6EVf_3FB6`}e{z1z;^$N!{21qb3LnF`oW{E`-jcXU{z+81`E2uDa6M z{|0LRRlJJ$JYI=&-WgOqrcw2nLY139l^aFXBaGTEgb(NZ89{9qKy5d?%C|3?V`%xLAA4jD!+_sX9-pQ3RVd(;v(&s!4sJuV)#JfL%78D0lbXu55K}X zRr^I9?>?#@cJcWfmmdCxd|hl3-$B*8jjGQU>Ug$L$FqSto^`yA{8d!F*72VlzcQ-a zBC6a1s@zqjQ*I7b?h2|u7E$HSqspDb2Jy3~a%WKGB~j%~p~_33%9}uyH;(GJ7^>eQ zcz^EqMo{^OO&cErRQ`R`{`YW?`=uUgJaq9Z#J5n}HBtMiqqeJ|wyP+f_O79hXBq#< z@hq9HfXcs$s@F8CUQ?)g#jr#(etnJ?+zHe0tKSPoa)u9Ce&ysN)>*>0>^9RPog7fa~Fa&lyO4 z&S2ofQlB&EpxV2IYDWXVO}OSQ;}Y#CqS~>FYDXT`j+{@=`t&8AzUb2zeEOVE&-nB- zsvR?^ah$-1Fiv8q=K`}_Prt@-OXFvi4-2eYim1=AtfJO6dHf9NS=72=8LwhIFPW}} zDyNEPldpoOa=vs>-}i0fHsLMQxZcDB<8XSD`wPNJ)br_a{21XlUPd^G|75#S{3QDu zFgL^us)Uk@41}K3cbLQm)45 z25SFRTqFNF{+jYDsPkUV7B@Ep<)P|wfzQQyK|f?r>;D-%pL|Kw^UTBRc@M~Z)Wjk0ZPNH-#?chMmgBO$ z#dA5@RY7gHhR>!S%c$R<$@}=6k6*zjKZ^b0BUtxGQNK46LjB%M5LN!x*O?F4-zHWl zw}p43AFDpRjwcdcM%6EZMd};G0FI!3C+6^LJP%;|A?kNx4p8+gq4u+auVKGSsNad1 zNBvGr2K75Jlc@Wh9Q~nkvZ&vIiEeY;X!jUCka9zqBmXF_lWzp|d6|Q6+jy>{e!pb{ z@5{I-;3vtK^RA#i->`@pZwvTn#^pS2(#{Nig7|6g6e|DDw|Jh*ekO0=c^~bKq53O| zQR+2@de1nDzo$P3ZJ!_iM0o3)<|=NoziIq9+fU-}*nX4tzL)w|P`{(Hh6VDi;yH|) zZQ7~NHMLOr=kV+FZyH}fy=O3mNxYMOO`v`!We@c`DLve#{?Qw)-$GbEo#Tk=pMZBr zzO&da_Z|D3-Xi{#cBQ{dySToN;2pH*fcOLK;C0laim%2BzKZ@Ykx%De0dM0tuA;{A z66(6Tfcl(i6P2%y`kY@4^*O&P>b=$uYF_K2=CuxL-L;LH*XD0x{w6$!n%8FVBEr+C zc_ogT*J7x7Eo!<5YF-;NT^Kd51@Q}PKZ2jf0BT-qcli7O$GwFc#5Ym%+7fDB+oL|3 z*LKOT^*|f7|1G?j{F|tGt%X__Hc|6h&8JsU^I8ElujNql*$Qet3*T)06hzHuBdGc8 zkaW#wL)3hBfSS)1eEtk-K8xcf@p;s|*7E5M)c2j&@mbWnjGE7~-?#Z|5jB6!;|A@W zL(N}ltkJF+)cn=D)#j}X>U>Y4j(6vKHgBz?@>fvv!WwGcTJ`aHAD=_bTXU#+D~6i4 z!l-#Ggh%sM*UwvcDdo2CXx{SSb=15yhMKQNQS(&*HD3*H;kdEg0cyS)pz2jbm7hh; zSBt3mY7RADrBUNFgB>6Ny#ZkZGw2bPfdDQ$ghw6{CcLp^-t?k-;G=Z9j+PB%f(<7|;q=TAw zwo&7-fx0iNq2`^#pV|7Oj~^y}2lf5Z9_l$)7eCJY&@o*b^?CdjYTZ&teJ;O>dOx_1 zleE8r$KfjK{aGIMIooB_{l+Z*8PoVR_B*Y3`YDEQ#3*Y25nR>$WV#?8@;TN~R6PRt z2ev=_DeFJ>cYq3a@k5+f9fc`p8_%Siw&^xe`)T>~CTc$o)2(CRWksr7XZ zFQuQd_8!FPW~0SMZ#@V7feh=VYGWm~IJo**?5y&)b9e4C*n0 zdVY9Fx}F1WqP|Dg#5-wM9rgLHH2JjO6kf-EXG}MZ4fdNfT>`b=Nz=tp`^}=(`HR@$ z{$l|@O8IL(zKGWmU%(5sUwqxWc)n%2DqhTU#dXt7|HA5@#J4gIr%>%kpuR^wfojhP zeuMIcYpxRR=Ugt^C=PTgXNzdW8ao4B!FwXhaMb)o^SCGDq6Y4Mg7U34&LHinb zBjdY{dT%{`yX_~2Dkq9+e*{0xc4Me=f_MYrQB*krR5^#fob)g4I-bHS)&HiO#@)S_Ac5r-Yh63V0W; zORK2scotKPi)GaFfCYR#$8Fwpv#9=_#9uNWMfw@2I7S#`F)cHAu`kvCpuk5Ei+&mr~J{ti&-`>6OHp2~ZGE~;J~RQ=ni@-|WVTlgFLvx%Q({|(b^ z`1GnzU&nRQE2djPUDpQGNtc^$0208fKNYUze+zq z9fyJGc2VowZTu$XY@y2AL>-3~s=phk{ndPW)yJ1m$DxR-R{>T3JgU4ERC!s{aacwj zhb7a^`}8@VK8rdI8Pm<+uPHx)KcYSb+N0yKia#M=-gFHgU&q^subHld`rOGO>ia91 zeRJt|{5}Eey+!;E`4>z#kLPec&Y5l&-+4OQ;f>@=n=XaFU1UBo-6VeJMBdMsE{?C^ z_(oC3H-eh~D!;YyI)~eoH*2~!_1dPNny7Kxz)z80H{B9GjehM@j^4lS;&(~kFt=HF3^(o`gbq96)7rY77@tVYcXMZtNJ)))?#h);b3@KOZ;Qaxg zFJYeA#b2@i9n-b(GQwM?Yv2a+Yz@a42OIcZu9sEQtz)1371OQZFA0}TSHd51{EB$= z`-iCismS9infG!yeG2bKO_#+>*nZh`OQ`MV@p9tlOgDo|Y(I@RQ=g>irm#W2gy|+x z+s9G)W7s2q)N~QNjr?P#3#0OnVx9OA(;d)%-(*}2@HV#JH(eh`Ud`{SnQmLM9+O&+ zwS8D>J+^Qs&pYY&Is7*3j121icN+T~uaxO#Q2!SUmF& z`x4<>S?^}?+w^k{)$dh&I>&t-L(E4NyoGkGnXZgqVt*ym6;b_IFx@JCp8ng%k5Jwo zexLpA;+3>x2Y*NYp6R;SrTmWRwy~piKVHcGx9}#?H%-^VWy($dp6faNoIw5FWgPW8 zml6CP`NvEbLjBHV5En_`L~Yl^57N#Cp20exiu&D|b*GJ!fAGM@%Lr<`1hCHWI%NAF&|gE-9iYa`z;yel^QdpS zJ=AzfvAxF2G-|vgQR8I_HC_^?o5UYd{)FkqQR5|!8ZR-_c!`=Wf*LOs)NwDP#!C_P z`=|xfxXIy<*lxvi%c$eJgc>*9KXTkDr;WN#+w?XtLx0urXdL0uI5J(u#~1M)0nQWC zt)j+J-gL|O0@j~Pcsucnrdz-=^_)lDk4@nYPT=pkK8>4h3|~ro2$gT2dMn>9D&LOj z+NkT;mgzQ8+ci+*bC2!sPk0AEeLUmgPpnhuhX5-6kod3C{voER?-=oaya(4o+$BBv zXB!s@)ciexnoq~^r}S^!bTQQRBWk(`YCa94=KB!-jQl~3ro=JC4eYN-6{sPZfL zYx1v|u8fybe#vxsRK6VEPQDe>Wl`6WWz#L8%3VZVf9LQW&t^Sgx+y%y^+W3Vk?>)u z>&FB>_;l`X=qHW)0&3i^pvLiV>3x;fN%pT$>@9vs^L_Ke``IF5(J?^50nA4mHS zOgF$5@q2jk8GN4JbUUcy)id2T?yc4&9e+-~n(5Z@o{Y;e>Y?#9 zgRi1~)2Qp!6zcb#6Zi|Zn>5`7>i<&y8)Hu8nHX zCVpAW>!;V;?WhUuz!CF$#?E1~}1uV}ggs=ceG%i+s7e^yZK&6;ij)!yh| ztep{5JHx1UhOkfmpy@_2OgrNkAECXd|A9*38@OMcF(hVwe$~Q1?7nLrzezpjOqa&1InEJ`QvL|) zcc%lW^~53lbu;Hz7uSD9sJ?xoNuV- zXie1fn*}@r_X5WPAEDk|JdWpxZB%(J{2l9>CVrIjs$sesK7oGSK=s!;>if49)0Odk zFJ&B?u7LU-!&OxN9G*$~is_c|Jhopl-2&=)@;oa4ES5>nm~I;XOuLdkeG1=8dct%Q zK7HJ$$MHR+$4nRT>0>@UjPE8rWV%t*^WYKuCHo(_%dw;XTM6LN_qL9we>i?a(+%)e z!uzJ{<4ZXXdw2`+yQbU0b2-jEyqWl}={k53=ifHoM10$HTd4JF3p>O&P1nF55w4rA zhFY(#p?*iYjCw9u#4h;?rdz?|?#1;EFQB~(rklr)b6$_5##;bhWfvV1$@=r8JDQv z=O~P@fBIn=Ph-8ignE9ofJe`d@b83UsQdc}YW@iMa8T0Uqoy0d0s9$JzMc>4;%{m9 z4r==zeu4a5({)hgZTa*~{5sX@Pn(4AWeHkwxe#vx;n4zBY zsB$LoBczX;u6x&GN6*35P|vraT?n=Pp&w5}JcslH(+yDRyFR^#DsKzbzni9Opx(chP|v%@ zPqc9zMvdzb>iP62>iP68<3Z!Pje2gji5iCuAFiXub2s*@JZriPs+<&RJjYSvxg50dTtbcKB5FJrOt*>}&w113P~&+X)vj4oyE3Tp zJdLX76sn#H)Oe1g#&gVcA?)*C>lB<2qrwNmTi9pB_Vv z>!|6*P}`3vOg)E;2ldYZYFrOY*GJ{+`Sh+Ny<@s<)P6R7dJ8qKo2ILywqN(@71X$1 zGhNB2uln>Hs=Rqrzs{L%7B#LXQRBMJank#m7QTn;Y8?Z_*HE8-+rXbPF7_njXcyl_ zdgPdG7eZ|}g4!;C4^TglugZ3f2-|Tzt>dq#N6mB_KE8^-CVt&?Yj`c;vgt~AIqx@% zrYqnA>zX`XL%y8pR`4?NWlgt?%D05t|03>_f5CL~K7I~=NBpemGCn?yzac(lx)~oo zjlU&6X}T%Y@1;-T7m1%R-8jCU^DAz;7%E=`FCpKU>B9I1UFS^~MCBX7I{5;oJG|eq zz#GXoG~EFz-#%VUzP{=9aFKkwrt4vi^sebT_&UIEt8V3^k6zsBsj+ zJIEh2T>wAEbIF}kj|KF-|4r07t%j$BnBVbY?gPrG_uobQEH2@FFp2s+(>Q*JZ~(R4 z?tM9b2zOAQ3*W>(*WU*I3hSu%!4=ed;5>eV@Cx3W?dMVXGpPJ&RQ@Sc{xMX(gE8iB z;`dPd>Edt5-$H#(ZUZ$Bl<+F9d-Hf-w(H#I*wN>OxA8M<-$b>$fj?oMSVgrvhkBo% z#j`PkYIhoc%ltHhdfybouVVzmls}59$Kc*pj~!G!ny7lLqw?kOO*~(cdcL&c!&1+e zrtzqs@doCn5rx@qcna%T>eHv2)u*pvkn|#|oE#q26OZbN zx3LbN_vtA-j{Hf*bKJ);O8<>2OuhgnsjpOh4?`A~s_!PM|5|t*?XRQysirXHRZ!hvZx#RFG1kGT zag#y){z@A4xuXd`=bf2XE+wp;h!~Ukr8L9B{qY{&rEvsf#*JHPmsc zD9mvxgP1xn|xCFQa&t|FNS*Go4)_Cqxaz{{HprPbkkVZ=b=oO zz@yJYnQj7)XFn0t?;VVw{{LvmbyoFXSA3B1iCPzB@gBr4;~$x?7E%4afO{N=ebjrF zUDSNh#sAaqJ>t>4f^VTcEmV7&J}lLqu?H~!Qce(0pxhB0!O{bH?!daLfJN%Ff+}wr z)&D6}eHqX%^KF8PxwQE#rxVE2#2I_;=nz6;b)}sLvz!@rl&Chnjbz53=JshWgxh z7`GV5LDc8I=X`ns_4(#W)c-1tKbZ9!=`p;NaUMl|zWIRkZ}a@KfG4xxEb8-T3#iYF zq{#PG`fC#Pzg5BgR6A;@=S@|7 zDaSqiugnL!uA-i=PN9xR9D{eG-Z()Eb{`doY$wT{@vYv`9YYCW-qd-Q7=wVo)VKEGB#UC;BVe#$(=#!(V= z9!}vY^iu-wNqr{pfyBpA`yIo#Q~xkNjQCMWJx1{1gaeo)d_eg+{#%5#T?zB$x-DT}J_GHTtlh#S;r|Dnf@e)p?^Iu6^!>-qE{;VVvI+&+x^c=j7Y zrT6iFNZ-R}P>)@F9ph*VPousq)c?a4F;2LEb?TGH%XNPG_^gj#!YhcM!PyDM{l9S? z(Rjjj_PdJjU|!6dE{FQvzInWW>rMi7-5n(@k2)6kSL!qFji9c-y+_*mdmA-RZK2i! z4ZL0B0X43xcqijx9Zx1)!OPfB5tT2G8c#V?z7>4<-5Ecq=kJU7INHB}%AY{ZYa#Cl zUc>eQ{5#tZ$5|iK&j+Y-_fX@rj2f3EY%wlZQR6a$+CGN5zlh=qd|qt~HII(swZtDh z!oq!2cn`I|9n}7MsP?u|`zxT%+f~&5R#4~dIBGo~N9`wyx(@aqZuRS;>a~T-w5pC; z_spaEFNP{Ngeot9T2J*(W8Fai7g6tv3aIx*NqjHi7-}8}qQ+}KZsT(skJj_}3gWj= z$ES&3VtlTl=H*4aKW6Y0=8rMFC*w7Y8pi|9C#^3!kF)W*jsM4ZYnyHhb-&ic9`&6? zo!_m;az8*n)KTMT1C?Gy)w_UNS1jW@IM0_*^IQsb-#CqG&p1|Dr^WG<2hv_tJEExj zjSy=4!%1_9D(3*-#QuADCGFWpttU26^Zz=k{5(FJdgV~%ub{3ISsWvM9#wwIJA*1e zhAKCL55qB3`@*REz7Xm;m&VHpr%>08 z8N55!!z31|&lJ9v{TET!=N#&~yn+wqd|tvQ(?9E|^+g#~kI5(UypQsOPdFBM2=Tj* z=YEs&y7&~%zjcfezk>R_dKmRN&{2G-@>34qtE@_0Z+CoH>U!HlwR4UAXuC507gka8 zY;20_68k^!;iO~!WSmZ*)(cV8IGsa%-zAMj@-N~;lGNi#oM*%bQ13N|#6N;^4^W?@ z8KCZ8H&OS~E!6$=0{QdgpT{3?p3IqU7Qe&!ltEp0Q+NmEOyko|q`&a{RZ;WL8lFzQvp&3pHxs{re`KDS!vjn! zO#M>WWIQDBQEa!%ezbiaCmBzD;-5K2JZ|VXKb7a7s<-LJ@u}SR$MHSH$4nQ+2M`~@ zRpQ4?7e@VlUI?E`dxLl;>7%AQdVJRwv4HI`{f954-gEdK?muVIalK37GdRy%sP6&R@so_70qXhkKI-{$ z8#Nz9pJwLp=za|K{lg{H_YW6P>+^Zk`n-e6*G8?+w@~Zz8rJF0b^Lewql|ZOJuBgN z+3yf_|FDm*ro2ABh~vMDPh!3rnK>3H&<_FA9X^x(=QtkVhln4TZXbWl|5x`-w}*P4 zyo(XmvpxI(`MajuM*fHPk#%ng|Bd>sVwCfB884%qOPC;j44;G}IE9DL;2_}vJ`o$J z?|s$ql|1j_~6{hh}r5S~ZvXAZX*U$dxk)2Q-h@OJV?Q2E2SMty^LEBiTo zy5$>Up5xNOqtBDz(fcp_AnmQ2F6GmweflImo^s<@Bwx&QK}<2vjNn=+%-O; zsQEF1I&Nuv4&x(_Ixa1R*)I1i8+U0uk9v-x;)l4vxI4fnlYf9eV_fXvt0{jM_5P%X z52M@;{wMWm;~L|66BpFasL!3$Q1>07XS42SoF!59oIqV)$1zX%0QGy_9n?Izg->Ds z6(3&p;Tb&opM&Qx|50ujb=?|4U4N?2w{_7vzKwpbn67}|=X#q*T{m+0E%IkkzuUKr zx_-p*IOc^Is-GjMejLHau-(D)xPRrm8{h?;&-`{**1{engRJkcsxihG8lc@K=Q>bz$P~}EZ<&L3_bL+XbT^+Tbqz_M_%9%uc zk97i7P8?NE5LM28%KD{;x^8w+*Ubv5A0}~{a$~4^kD-p+kp5PE4^aCVp!%VY+RrX( zKRwibD)@8aOZYVMt)kjLho5F$A+@fU^-{(_2C?%;S?a%NHG zPUB-Sf!gmRYQG`W^=?Re^*#GI?a=vtkg;~}Q2hZ1ehdSQtsCJj| zchtXtYDXSV<$im~hZlT!9`8r|9KP}t)>WwM*c7VXQ9S8%`XA3yKfaK4^P@Q5QQ;=0 z$XD}L@e1an3O-b^zTSb+d zMAbWjDt`=B{vrLRb`DYfyo37PzYc0XXrboi4b=AqS24$SIlL7Yu#UwSaUPQ|hgFVG z7LQ|{5l7W~3}4QC8AQ#$qxb-gW7ImKhIQP)HvP1Ydj8jwl-I#+>a~rUm)m$Y;Vsnj z-ytgB0F`eam9LKl;)5@?`>Hnnh5fhiDV(nj)Hq9Fc7pRC^&D(~TA%NszK=fs602tz zbsmOL@69qkK85-{m>ImDa+0XuPblN%SVXP6SMj?iFuw2>>XF4uXzw!WcYu~~oOvca zOFH>yQ2!^B#98V&h1XJk0#9R}9ry8ZA0PAaA$$q>M}7Q|a&;W`@x{dV@fynM;EM=v zqwa6FFhjV7FT^J5zOaVsmkR!Zdgm!u{k@E<^v672cslDR)bq9qzMAd(sQa;9eE0Dj zPYlt%F6uh8g__5DFJ(Q19n`#gNc_2c{&;A*1`jQ+q<`yp8vR~FU60GC=L|Eb=U~$q zVO%BfDU5?j)boT9{4xEjhaVajhwNvMat8Qo_PdL^ekcEf=OdIijxWVHzA(x7#s452 zMqOuu_-*EyQPYi}@*h&Z@(oe>2KX)V?VGNHYVRWXHSXt8&%NhR&%HCKao@!`%Bkba zu!j2GFe{;A&coy|MCMDVLG+xAb7{~jO9+|h}Gk67` zPvrT?I_h_fmhj2UKeOHp>V9kzM_Fg>zx)^nf$@QdTp!x_9mZcB^}KcipGN*=d==p( z)bD@H`S2|2_dj|sV_i#qw(&7sA2(6I|Ixz#WVi0j! zQNRBY!+q8bQT!Y2j^GElJ{{6udQOs~-T!)b&U;k(tEk@v*?P^fqu&!B$CXasdUhYReV_Uz*V;XYo#@!9j?UDW(rK=tz?>UTX-crNXz zzRLP(9dqozf*PkOypVF^sC;v;>@Q8#tg{H&N~$zKiSi4(j(l>ZEIat)iZPbQZ0?_17H>{4f1q#d{E6LA9rduc1B# zd@SQ>6*YfkQSbGaeEK3@&T&}q=^1<*{gA>A^`5~qPiA~#l5p_#yicZohJ-ag?cr6F zmsqmr8xz>({2e!49QFJ>hBpu&HC+UML3@JuGx{ljN7w5&*l`@PG>v9cWK>wCe*M}9njDB23&EwOk>%j!-e{#bLPte}~;=HCG1K44mb@-+u-9Fwz zxNo{1-b}b_x^4Uj{k(;j<0jt8_s&|TYv4_sZx#F&+pU?dfHx9eHC+~OCA@69dF&FN zGhGU=B|Kxg1YSpY(sVJrfpFAxA^a-gpy>j*MfmWIN4f!S6W%x74z>vQOt+2SCfqh% z6WfFvrrW^p5w4o9j7`EN)8+9R!a36|;Z=keO*f0*Ae=GXG=7C}(sUE}9m3Z;)UEVN!>4Hd|2v!X@c=~$oL$`CBC;5H(eCJ$hsk7 zx(xn-^EHicVZ0{s>CD3$%gle=_f&C#`Faii_W|4o;L910MW4Qc-{<<2Mg30wJl@3j zrRPjHi~7878sE%3H-lHv$vcR~0W|ew{;oo^(jLH?yAsUPk}!;~n&S-*jEPdW`3grVITy&v7Yt z3ALV@MLnO*;O{9Xh5ySuG2_$M@YVdENC~wbDd2IKN3CDBB-=Gn&vzTB=Xf=I62~p~ zKa@+qWKqvo7w`(k$-L<@cs1or;RTdCg1c-V!0i(`A1Mdj059cu@0+fVmk{1F-8SmI z?Ck&A=TtKI4d(5%$^VISUFUNuGp3uu`_Qim{3-jL#G9D!Ch&S)2TT`Nx~>DbrR#v{ zB0hc$zfOGEbll3`QLT!(-@yAybtS?89a+|m_Y5nyJGR%sCot7%KNwzS(m+q z^2k3#-5>1YOSoU?;SKcPGM>l&mVElOPoF|PcirOn-IadXG+h(*o}`Q)=Q(r9bo2NQ z%3H`;zt74Q<}cHw@f7McgL}kJn{En!K{#Q$2T%$MIuagz;9k58(;Svq961pq?)tkbi}K9pJM#ANzP8+{5?t{kC1x zZR6jV2NvIH??>kGZ92|4WPZt*E{&gK`)T|$@k!H-4N8*CP<6lT`o34Q>ZxxT`6TE|YWZ87HIOM!b<6qe>Wx5&E{_^Zs?JnR&jE5nv z)9(kkNk0xuw~zYVMjzkFywt@@$iIbeU_3SP+7p#1K0pFqFV@pi6nHB>oOpI$=cU-jWUDt``@e+89)*{9E;@~3@x z8kIkR%0G!m_4MgucrNFE*oQ|^`48W1`G=_d15|x?P~~@gcng)ki7LN=%3t&8YpC+e zK3u?~`r}dk@u>bjeGdQ1{Gask2_GNx@uNO|#K#|UeDwUaPCx$$tN1qRQNhnqk2Sn2 z$G?n!<9brWo0$*8tBh;Lc@PIUg5P0W1Te(@_sI7b%ITrPUDWrqo2dVj-5}rB7^h`C zpZEfPmi?{ZPsyM4@rzg`egSVH->gs1;71r=Y1H=9_<8areEI}FhILd63*>9!3mE?m z)5XrT=gSd%lFkd$h4GKfHzCsn@mktxQlwupCaFVwVuKc5?{kU z@l{m+tYek?zY3~9%BcR?#ngdD1|YQ^T)N&H-w>J`UOcu21iw zp05T!z~@w0?;H}=^s9=`QkCnWusOwr5-_CxQeEfos&-nP1kDvDOlRkdj z$H#np*vAKb{3xDDxdGI3;sNzjxQ`0=e7NJon?Bt1;i?Z;e7NYtt3I6d;UyoQ!#k%q zuYEY>!_z)Ig|su3Fx@25{-p`?W#g#hnfM^j=ji_!YW|8~jeZ(M&07I1(~bk$B?s7J zyFUJz^L@{ByQukXnf!Wwy@Q%xI(RYVZKBF+`uG}ZKO3myTk+{-JeU0x@EgRB6m1>~ z;ES1W4v9xs_>iqDSMg!Y3weAA={eJ_px!Uf;uqOZ5ns{ueZjzo-AF@ka7Z zDW2^@sB%WUUG^8|zG@4fPUVlV-k?8L@w3F|@p8h;_(|4v0lw zJ)S~ckHh#7=GV!xJs*hU<M zw%f(a*lq{6Xm1Zwl;1U72lY9QZLE`T3!g*!rs*1}--)T?7fG+7j`s#Wn|yrnN4izi zbNnpoJ$m?~wjK$g)+1}EdX-T1Dx&IDK-Fs%pFw$f)8$b0T0zw-i+S3+gij~mqUjb; z^_xf4Zw^(zS)3+c#&naY`o-|5e&<j;(=Kxio0p3Y? zA7{wdH{C9(K0B!T^icKb;xozDF-G#jnd?OiZ({u$!i&k@C!eh2A1Qww|H1iL^5Ipyp8e(Vnbda~Cz*F^zT6Ge zbGQm#LOEqTgZ?j~+LcE~dvc~5qCVfZhgwet*SP;AUjV;Hxk-FK@r!sK?V7{iYaF2N z4_EO<+OdNAANe}!Icp8|oV9{_&YC&jj@u00gY;>T zcL<+My@RG}Qtnaz6Mi}K+5-N8-{YD$T?d!xhfUNtZef+CEIneK>u}6_vML- zeIG22T4xSE&h>})r#tv7+P#J9j~1#wYN&C&f$EPcsz1u8{wSF)g;xny(Z?5j{06GO zs;F|-O&9zW`_+6-xJ~*F>iddaAMW72d0x`SOSqryk^g{spyjQ5*HG^z7f{D{+Q-N7 zTZ9ks2Ao{yeG8U9O@EQUgs-GNMbi~f$8Qy1Mtt6MIXs>7UKBO#RTfsQ@@e%r8*M|`5`Y?+hro1%X zn{hpZKOj7fKjpqGX}T%An%|pCm~IlUB0OQban%3u&fysAt+mhDeNP$Nk7k_XP1Lh! zx&j`JbG(K4yy(vUrn|0?hc1T|`-8{a9@twl&(fsok=#8B(xDC#(b@n*IU znXXx-eDW7i{k?)+(zB*Z;Vq<3p}to*fj1M5;djXwHC+T>|5%O_?bZ3+S3lq$CMP&9 zKHR}~Gya;Wd?maI^LT%b%L3~2CqwGjr~bju+i?w`uIqs>aD5H4Ve@9m*J*RzdkXBC@{>j(aV^fG>*_&IL|^*_~Vyp{MAzMuL|qSh~ARQOujYL^|**N#%%%b$No0) zVO*DM_!IWCwqeib%XlsAFPW~0dOlx3J)d7jtp^rSpRbz39}}L%OKD%qhi6dd+azAV z@tpAKar`>v$4obdDlddru>Fww=sY~Y9}&Ng*O0$&x*gQ@y@&UweQnh9|6R7%@$BJO z$=@|y2X#NVjryG97XCXn@duRCKt128qspzJKHrzR(E4KrTa-6#x+JPUrtr&@6GwfX zCW>!kyAb}6at(YU8_)cs=f$XU*HGmyqrU$+k4N=D&6jCxvVF>QN!0k5 zM6GMa@k-L;ri-GEZx~hHC@TL5YCYVbA9VaS@XKshHC+b(gX6qOdo<5BQ0LuH$*!S4Y3d{j}2Yko_d_jXWQmGTkIz z#{1(5)2*RCe^bIYFiwm3GPWz=C!WK4(R6vF+*HnVE2w!pYr18ukblW^i}-x{bq;^U zcC)6-;0W!hpyu`dcs2dj$2{qKrt6``VFy1Y~XtsPj%C^QNQaQtMeR<^2hKFU5AMOJ=-1Nx!R8Sb;_;dS?sT7x((F) zQpNAl4<$U0^D2k?Y`=)V#V+desM~la;nBPt-5TopS2kSv?oW`6xeue<1%PofbF?z8aS4rxI!&T17p_ znz+L9#ZdW1P{-kr^gAaQmkpi^($66*QtzPYMlrzoJz}~5s(puS|3UH%O?QB5-vIS{ zzdQIo_TR(X=$8&Ynd@=eyNPF#-ty^nA74YYYu$%)sO!-R>UxxA|9Y;mfPbJJ(->r& zP2n?X#|El?Rs1CNTQ^+=RlgG6jr;{Xo_S;!m4636LH?fUx~TkZ{44w4MCA`PIiJ)& zrW-}&3*ZIBA6|K+8=~S5P@fyx#|r6v)9qo9`E>_R;rMm&;anHD@!3iCi=X8>)x;pz zgF2o@`i4)h`t-6-&m(^j@W?s*C-qIE&WB0-JI3+uoNrOo{18Ts-@`APyZCsH&ldiJ z_zl$jQAK?Yt%4t;{%fWy<3~7ti>Puk-f^rk??!Nq^CXP7PS9_teh%XKlrw6&5mY}7 zzhu|J1JwQocpmxoO}C4)^hX<~I1VjTyXvTRRZ;D#;Gyb+%Adqz^xqi%jrbsH9Q8S# zmok3lIBs9y_+;?EIUX~p`8Rb*i{tg=-#~pIwu-tQm+<@aTM>KYFPLrxKT5rt z_$m6Sj-RIkDD%x+JC@%NIkTkXb{$W>l$htZD57?GOFK8_*}w8 zJd6Gty~_IWknlV9VVt8Az919jZ%sQ%nQUAL;J`jv2${S;C4 zE1=5BZ1R4KfJ$| zms_ZLV;wbb6j8@FkGg*3@b089qsBo-VaiXT&bK6L{KUMYILCRne~rx}Jv>Lp3$<>k zqMrAy;iVkcJl?^4kwxuy5mo*is{9Pmj^Pi55g=>Y%Aes@v7H&gwZ9nW=1{VS$hLmlrj>USCz@DtQ?65r0c zZ49-)QT#dmUHZC}Q^ZeEPQi4msB%{DkBq+=tWeH0p22)KfjWL6)Nu&-@PRLX7j^%< z<@eLTpHW_oeDBwI#y7EUteUQZm$MFBGu=Mw_d5D`3&*pI`rVEW-iv-|qdr%-iTXXQ z(Jh`|Q0^h&FzGqM7qb5>YQ4OO`rVWa2JgmkMg4BpIO=z^qWBH^D}XS9yGV1<(33Y$IfVw}Q#rslj26ca)My-cZ_#wiTZ`g5P z!%HZyY`PNaxEE3X`=)0_u4{3Uxmm_m1HoxL$@$w@Ou|*s{;3+p?|O!ipdxn|waX!t%11u-bxd%3{KLj-n_hoF3}vIo}?7 zoSN7=>Zr+~2!f!<=+3FBqb8f8C<`)+EwiBLp(v+^@8j9m_1FFOeqZnF{p)&P@9UlG zx{_qMPT(EXtBHEVMTYva%9mlkSWvP}Bt5MIJ4pQq>X z^XeD;0#0EA3xOH@9N`3BNd4ld>(1gg=|`>`3#jW%8J|YE^RCUI#?=%)g5y)d68jfX z&l!jDQ<%f|GfuK-?4NNhjyfLuoAfK`wov(OqVlQZ0R6a#x(_>xdY+oc4E4#Oo~Oow z@cuVEeis$L8HDSBRn&9-MO41?_))?$sOS7c_&3ZG(ZJo?eID%K!>Lyr8yfFHd_9OC z$4^q9JiecNhH;;KBB=2c#)q+gkA5A*uKJt#wuRc>M6FwDsP#gJe$jgzZTv6#tL54@ zYF^mFAJZRA)V#2UXOQnIp2>bIsC?^q3&*kiEkBO)sQG3VUr4?)u1%xzox)F%?T+p3*@J9Tt+>Y zpF}-hFQDF68OA@+ZyD_8xUAuoY_H?nI4}CP{5rlzSl=VwMSU-_g>Sw;#{>0THAy-> z--zRT2@m2K9M2d=_}o0;S`7mE+d`UGK** z>VMxtI7Ge&Y=6M>x&FAehlkIB*nR=~XYufPI%>T*gy$0*QW7j z9PjP#c|SEV#eS=J49nQZ@tb$8gnF(zjCy{X#T%JV;&^}34Z1dfx_=qP%ee0xK|R+! zpu7i?Zr`j>jzOc+8;QCz}ekmr(c1Cs5CWM(}?0OWw5{o_i|oK|TM-pz4*vBK1nT zHh|X>AI1-0?+)&(GEZ!y#^n~ikMX#PdXH}vA4E9~*XpR_R6{+#siNw;jHlCIOQ`)y zsP-1{@lU0`_yE<{wG197eH>MO1aITG9{j+s+xz$g=9fKuy!zF(9UNl64jw1I?OFr% z9HNeD|1@emmQbHd3#f54>e?`B{N-HBpxTwjizs&p)vgrkd1Vsy{5gR)QEuF|80z`+ z0P6hdLye;r<3gWvw@~AK12t~zsPS4wjn^`2yiQ`0@C1JL7}pbgD)W62bzDYJ<7fzV z-HZItk8cR|{3G=v=0(a&Vw?IUT#MuBv~$q47#{wv4gQF9{jNnYO1iLXeW>;39{Fn> zwTo5C@8O;7*LAIhdXBk;8qXW3@w^gPNBwWdQeYX?FSDri^0XwsDc6Qk`{z*iv(l*X zK7=RG9|=6X4}n@|PEt>;mxodPnnS(Mk;N|Y%lIVvbpfx_e1`g+$XQGi-^4t}do74> z1g_x6InVb|`R}5Bueps+X1{?S`+gBreqmJl$WQz^NEj2etIxF%oUiz8xvx*U9oIJSg>0{)(p6CDX7Ra%r-Seq{u`eg^LQiIvn;-f z^Dl+!rzC!r{o<(n2VLt&)hps!hyHvD`Lzul&58)$4_54Nx3&Cg|?a;=7% zZ>p|UQ0uTo+$Fybil}-OT+5;I$+|X(NybZu<9QY3x6nARXK{w( zKN`dj%QRFL zYpDD271X$0a%~Yce#)qEF^iff@~HckY1H^gqMqvxqTb67q1wHLy1&sx?YDuKk$xR7 z;q%xUs{Vza`g>d>sOwH%ay*Cea~zKxK8AW_UCW@}!%U;Dn<+ex?Mc@XsOv-=vy?Z0 z`uy9Esz)7lpSl`^mr?bq;4^U%hjCKz9G5lJaa%>bFL{9J$I`#3@B8iIpIC?V@SDVU z@jC9iv{3CU-pxF!@q>r`hdN(|gK!pAzYP9{^ywfzg&NmMR6iu}@chE(P~IROwh#5* zQ54hEcN1U6xL?N$IDRXr<50s9wG-dV_*lYGj#K^~Pd|(r2U$Fo{>-?R#t7vn@g({! zj>=~Mm&hlI%4Y&ol$YpwJ~2FldY0hyNm0bzdNY- zE^0h47pxi3z{`my1kncD? zoBhY|S8Oi^;R2p|jO#S&cg)xC<@+u4!z!vD>Zty#qVCH~;rj?@Q2jF$#2>K#b4b6B zJ&hAoc^$kT_1{L_|J}q(+1|iHiuCNS_dIuSll%vN#(g@jk1^a(|GE~%$8w*s-?cte z`aJ4<$>5o!PrEjQdd@wKrw~8oS_u#DyP=*V7x6u`V-p*EE@|RtNx$LRD(XF|1H6{^ z|MyYvP4`gGg@*29-Nf}Nh5DX$9511LQT#UT8pcP`4>c^{66!ti1yuUkAbuM4`F9e} z!?~Vck7uz&eP&#n#wE%hL*=tidd=S*)bFu1QJ;fWQ1eumbUHuUsPWc9%?I14d1?za zj>dlB*YN^QQQoL)BdF)%dDn(fpF1=749ZDij{K6S^Lr3={>Sj)^g}6A4s)gQ)W*hRW|C$Z!5ve&1^fwceQs9725_Pod_=epJ6kQ1@Z_g7E$h_a`W4 z5C5Ke?7Fst2duApu5F?|_cyWs80R^@j`VA;HBj%7)=|G3SV7G@OQ`p4%J^E+&$~8- zMd~+>Z)6;f;nOarfAHzV=kc@DJBODN&Z3TA2H#A495s*a(;pYHy@%S~LVa%7MwQ<{ zy+>Wgf95(+4Z;hk&mS|W@m@sDgNZ*ep2#nTS~o_5a0s75y7oTnEgkp371Zza7VtjK zhf#bP?H|EUGEVZr_5sxRisG{{gn2ypBlpipw}+o#JnW*@&pWPl@j-0wpz?2{@^7K? z-$otRP1L%61Ft9DdJw;c%D;hHH?9QX8tS@Q3Brr0>*)fXaE$W+Z^k*)xKE<$pFq`r zP+{_opxP0}!*=|^%il%ScL!D99;&`wRDIj1&(|&2wo&7EGuYll<+qNi_Zq4`4b*s; zL*+AuT6g48>&78ezA4udsQD#|s((Lf9*JP&7~|*n!90QrZ{X!@Z=lBG3TnSPYQHMJ zm2p!+t%pWY^%+F9FNQi^QG7Pnp`ATn&-d^m#%%|6eA=k~X`%XO8@1miD*q-bzjZup zKWhI5>NwSKlW|zZ!}}1Zb?g#q9a}=3N8_mW7f|U&gK!2lFQ)PRoF_x5b!5u5B4D_OK=8te5X*yZ35Naan$p^0%{$d!KY#p zzfJoRcvueVb5-xR!RI5?{JDjHN4+*(TSxWZDyrXV_yMkC%cyb|@dnn1WmG?wP@jWF zP@jMDuBB1wLU=#+JNO@O$3CtfqaLXBe+O0X7V3Q1K-GT*RsT9_9FtpF;IR z30G5Gw^98uh9@w7i>{?np9hCf>5{1S#Zm1W4B`h+?d(U@JB(`I{x0*i?q{Id*+#Xq z<=O^5fb!N|8$~^D9l_JcKacNVec$_yr|Y`b!NYNkk2#5Pi+|PgFMK|q_tsro!{-rR zb!`F9=D5wE(of;lY%jSsiTb=a;aUhko~8eP?elyW&*VI4qvrW7d?)SQ#QU`V48m(c zxPiJ4HXnpb!S=}@oDWO}MgsS_J}SQ*T`%dMo@?8ve%{2x`>v?#$O7v6G0SyApL-@y z>(?S`-MWU4VEZZ#GF}_5)wG>6 z)eN3XeA=}k)Ot0ATCWb`wT#0U>VFVAsNX@|Ld|oVsCjJzHQ!Zm92Zf~Gv-jwZ)Q>F z^)zk}Ka7_%e#8Ik_sjM|5AW~)ANMu*95RG8_D{K%MD<4k^*#3i)N|p31GkHJ zQho>jOnf5U#`xc-Rl9`*~CNamp#V7DYX8>qk8o+oxXozQ9gk8xPkhsQ2;L zP~U%_rapRZSHcPQFW@V26!lzX1hwAY#e&8seu8p)u60rE>!7|Lv5k8E*Tl2PXARF~ zU9*C^-&n`*kY5$gWcw1TUW=&bf(L)~`!M_X9on&n-=e%-*LH&KJ$w!0vWwqfd&jjl zYF*R9uMxlP+7@d5-oURDzwTNCAItf@h`Rq;#&5EH-nCgt{iadx&zEqM?USw*QQwzI zp`IfpQR(BDOELcOcGAaO8$f+uCyGm~4pZ_ zPgR^E-4gzVau-qkwSccDzKk!>Jb=1ySiC>&C0sz=rx-=urx?aE=g%POenkxbf&B+i z_bZ}7xF2=DB8<9UF@?H+FoF7>Xa#luY6*3Ja2|EvY7R@JD?i{!=#>iN&1@gRH&RX( zZzG(+9Zcgt62H%Wr!el?cp~jy53I9Y|8rDD{XXI{{vZ8R!B0}(J$w`UcX5sQcHlPN zN`70Y{0n_YLjQzA_|F)_2UAWIRbC`;24~n_LX|g(+HV3?-aP8}hBs07{Z~=tt_0Rl z?Wm&4SwbD}eN=h9z)s)+zJT_nA9&>OdYD3uvn1;O00!`12uCr(@hafc>HksG?|%>D z@96JY>`}jId;{yKDb(*Nl<UYB0cryEMWB3f(hYvbN zf8!$KxQur(Zl;3pSP&k;IqH|jx8NZDFZqX1zgO0G!jZ$@&)z5eF3!I=;UCc60emy* zM^Wcr9(Dc=qmEk+?8D^Yt z9gO0QTL0niAI!YX_Q%todBQJYoDZY=HG>n>e+R!yxQm}tf8p_0@chNK7M{)i+jtK5 z8|wIYw%1&%;*)6iGJc2SSHWiyUc!&kjs-lK_Re9Pd1=poWu){(J%N&@)>unfQR1`#R$hQkCWx66T z_+IL@=GrQDNZ)X68Q;V9ifeP&W_*lLkC!ms^QiXb@C}5sSfySWjB=a`xJSFD@yoQQ zgty=XUXKg-F>K%g`>o*L@g8Q~wJLs|`=iUQ?V!r*;!D}DgQuLwd4~T%J-1!k!c$rQ zZsG=?E1Irtpx$3Oz~57^p_9BFDOA1*R6F9>BELb`VyN~^qSB3{(v9Kc8CS(%dmhy< zS^NU&rtpK5vxN`jIBwzvjF+ZsYj_v^xr*l#-*BylDrXsA%=ufvi>UV!>N(;f{)p|l z$dS+&>4!AlgbDltMzD`|hg~}${R0T^yVk-}srN41RZb7}zDgJWmU24y(33dtTx;Q# zjEim8wov6a@$0mA1NFVQb=TJLsf^22*BYqwb^H+hT63+6S<)@LRzam(#7l@@aIGA~ z&*L@p*9>0F_G#CO_-*|U4eI(s%Ofz1gd^<*J7yp47k>Z+tf#@KA|8iRi7EWg#Mn!U$JhQa%~@AD+_dd{-j%^&ZevRP;{GRQAYyJ3Ot_OSUr*ylhbUi$ubY0iBk@Gsg((awK#o{guL#-oSHC*An7U5E` zeGIn==kSM&Z>jN}4Z>36JBfFYZV>goy;KCYopc$tN2{@Z{Q;5K^>22o#5IcYF#jk z6Rh7#7^9yiU7NtaQokZTl=y;cqe1*IK8*OBYuO+^jgO_AA=gr<^5gh8;s;&p$G6kp zefYHpGe5YtcN*7E=Eq&vcJLdV-);Of?`v-2HH6o3kn-1DTSe8kj^_|xbFCW0SMY_b zGZ%1|d8CX<>ND@!41SSvr(K)E3gwOAV@OwYZ3Oi@;=`zZj$nfAVb=~$r9G!}opEgk zzsUU4MYXHrS_2EickPa8+LKitCCA7h@wx6^O?c%1k>+-05{ zI@3QNCGmj+tSj(5>K(`TGcNkEN4^n!KIz9%zn4`&{a$-&!1L?F_tB1B;)mJ3ig&Z$ z3hMu8CQ-k)k~oWXDD{q^J{LuCmG(sNC1>;b2G!m!`TdsTA$2@DL0IZ|)bT6qSH*j1 z|1v6{1ynzb;Lo_9GEIIzqx>m+5dTY1a%~b1j~kvteaCQ({Z~-GM_onz4)ii!MShDo zz&KiPZQvaGg?uA;I{AiO>%(7jJqx*ZaQ2bVlUaZ4yS9h-YW~JQl5WSf9=@9X>)`7d zUu$^ddCY65b}r+yIetsQ_61CGJf?zh3E#r@NxX&h6ZksXKaP41J&ax2kwNX3#P=}1 z!l>`3hVaYmcR>5}UR4|Ssb9;rCVrazR`HAUON{nya{Ome-xDmM{ttN+ujjt{2$opi z=UvO;O|0*;uBGw!+&3LUyUph zF+Nw(ukDAko_`kgcCCs3O}kc6$FJd94euab)wK#L-6Ec;_IW4zHk}+7G4v#5eHg?6=}t9luBa&pm{BjO`_S5$8n_&!W77 zYlC<;{n3wlzoJMxZzuf-zMk_uhx$Fo6kb6%^9Uc;2@JD7h`ZL0*Rx*;(;VMD>Ye3y zMdN;dV~zMNwvXaG<7o3ytXFBr0&X(Tl~L_0;kR)dqkQfj!H=B4d5!nczPM}qk7S$^ z-gB*oKO@|AZ5!2Z%lJIj(-qfJ7-k-tOn5&}xHcAqi$Qo8zsd2-xt4jf_ix&@9pZI< zck#K*vs?I5j>mf7D*hAa*9u-wf7I}A>HlTCfPPuRe`EjU^Z1;_xUINWz#AB6qxf;2 zXN4Z)^VmM&Gs$NM`>s1QTlfd+vxT3b z{3bq&alVd=tb14S`?!L7kEx0}UKM;E$9(~{-yGgfIVCJ|{!id1h%ex8jxk>FLG*7H zHJ%c9|9)OMM$NPFAS^Y{#!&C`gi-H14N&h-QEn7hFo{~vCtQo8*7Jj|Ng;wZsK%Xa5-Le@O;h>$3gr4`#l` z2Db67IQb;*pK;zzxHg7^go~~fQ2FIBL44M=BtDvO!nHwsIN_LU1E~GNcslWYuI;8- zpAz12t%quF7uAlAYg<8l6V=`g*VcphRY`oqwHoUBR>4P*|B`EqcoyLW*UFe;zM6M! z_(HE|7UQJLxYmz9;`r2_=#Cy^{$TrvYcae-$2Z02RQjTub5UTxXN6#gO&(`F*JL`%mFIM}B**Z6p7`bN(u7`wCvf_PT3J_+aLxMc1ZK z=_c{Xq?>T97{urBROYv=Yl$F!5T8W)m}~pSyi%YZu66JYc~KTSKL<;8VzF$+hVqzJw>z50kEq z;!oLcIM|*+Q~9nXvBUNlwlR#VU!Q9sR6PzZI@GpM^{C=uJv=_Y6l|ZuyV*VwY%ik9 zE4Vfs#Ai|coN?{o$=-iGRK6Y5_O@$PRKL!m%5QQ$Dcw4%zH6>E7(e%aKG$v6rn8=| zh)P#*Z4}k65!Z64{8FfKk#sGJIuCl}_XkP%9xOb~&zn3xg!5w9wOkON#u)KKuJs4; zefUt~L#{1f>gWFw9wmO!wFNx<-CI0D{H$vesPiC=I)8>-YdwSX)O*{tWxSB~R$L1W z`~0v+`jg3T*X4ifeSYY<{BOO_4;|MwQ0-sNd;cuqNjlG5n+f7e`1Pw8cdixjUiQnO z_D|xUFox>qetbLUPsFu@%RPPO3vGHiKQ_ zCs5^$;Sb2S=vq36PomD_gliEzV82kXeg880i}vohwt-ptb=|cZD*p;zO#G5-lR^AA zYTS*vRz!`vf@>+%c-nua=d**i)4rZ-^&q~A+HcvlvSh!RVEYt4k#b6|jiU06;s0Vk zs-9tt(4IcmRv8zHUqRKg?pisBFQLwdN!N1tNAk-)+xJVL_KUkVh^lAIwbrxzIIN)N zp=DIP%c%P0QRT;Qp5rj!TK0J!pT^g-ZX9wgj=yHVfna+-UPAd1*Y-zwp33$eRK6Y5 zcxk)V4C2@EcJf_wtrEm9qS~|IS{c=zdDljQ?fGE)aIifWY)_)f9YmdFa za;qgM_k(*@qTQg@>|2F z(vPdIRq;IXUv_O4RgV&?9!0zl2k~dvkIJVHH6MpuYd(kP1+3ep*6kZXSZdwAgxYTb zHU7%3jXvMkMOoDL6smqn*P^KF!G3T)v{BnzuGNG1Wz=!4xHcEWPhpPqCD%5t;yh&? zxsK<)f%C()dDMA7iK<5-Fprn%c0i zpUbFzo-KH}UywC`MQo5U*Om8Q9Orsj<{C4+S^~n zvx#4Jt-^M#cNb9W-5LBT`A@qxUgZ89+gmR@5_%5XH*o|9$Nah*#f!+V-?a#yK{)JM zAEr5vLasHg@%-Yb{030@m0rx}LY4C(Z|6FyKh|7ZMfFF+wJNGVW>Nhy<61F@A4R1f zacu~d{{ih$zn7_x`fUc4PaZW-54)E78{a;N+P)iX-wC$&y~N`W{?_Zc@7f-!++EjJ zgYAuA`%19A9&DdSac)Psg=3KAF$4E!Q?t&j*^Wts&3T^Q*4a@ppu4t}Wwlsn-(fd&LWQ3i+2^ zo5#nqZk=;&7IhxZ;HjjWc5R>jyn=p+zKr{5Jg4h-Z4K2w4Lq6oZN;@c%n{%Ja(}KK zM?KfC;NM^wufZwQbM=yIqp0i9h-)p>^|~~{{Q>S1PP#UZUnJd_YXh(3em&_TsQUEb zF~(=ewcaZ@?rd+Ow%1U{r|Mb-wf|_aJ&z|a{|>u06vPjpj$72VJ<3;pZPfYDa%~$m z&bC}@pvFf#sNXsso#i*a@soHt=g)-8|6P0f96p2mv#!O0_$VHh>+*lrp1y;s zXWO+V>bzbJwy)sR$*=BOCD@*Pt?wU4E2HQJ>p0uGL=W z<&;tFnRjgt)t*_`#!;WE3#fXHpz4u#ErVL8MFN}jgT`g-^*)ab;AzYwQP&Rs!SmTe zm9y*GRuI36s!zkU72lq(yH-K<>olr9B@8njCtXVh@q?)KVa&DOlz*OUqxRdzCs59o zYwJOL1BZxTajg=>&juDTbSn2XQ0uImYq4N^DA>OB_g>BhUdwwn>#i-~;r)bQ`!qhD z@}^uX;BmsEuFbu{KaWr0{y#HMy4Ht!-n2@;PSc(Z!Y{`ay#J|;U)O5*M*64f+A@Bg zdRJWA!Phab_FU`WD*e`WZSgJi6UT4CwOJe@JmcB~UPyS{wK3HF$2_KqA9gK^k0hLN zEsaVS$Hx&r=-L1tCmeMxf=?tIc5Uy?%wL3eUF+fnggdTn;rWC&U2CGsS;fZ^-*9a? zh+n|R5MOp}9(Dbj!}Exrb!`Tf&jdc6_;J@pQTIQGF-d&RwJe@VIOAFxwayxHEsDx7 zgelS;{L7)%M4eAVsLv@W*Al4nH||;tbsi45){pw!5pk^#^|>tM+WsuhjR^0#)s|0**{M$yS9WnuNGbF&iMFSc$4Q-b}fdwk2c_1o#Qt~xaL}6 zj`zM?~+q901Gl~L#E9BN%L>slpgzSH#MzaDD4cq`9O zw(++--`K*_NVkUXWWN<$;(6g59@l(=`aVGx-^%lgBxcDk;qt$zJO^dJK^!9e06vlD z7g5)CsfYIO;+;H)DEym0ryao)d2TU``ro6zz*Xw|kz>4{fp6sb-YizwuY|Yo9A*Ml z-VjEpcN|;1rx8UxSDhrE9^n!mkZu|ETyzojetH>0q?^Z6*?$hNC%%b#Z+ruP$$kyg zd*dsp_r`Zn?>F~Q@8Py_B*MBM^&WL|p7*6GXB~e}xPp4WVF6E}oHFWnM`lpZhfAp6 zlbOUD9~L@)4ByIeF1j{~`X8_%RR0ZPnCFH4_)Yq!53i*@dzAk{o?q^~jpsjvYZ#@x zdDQQ#mGErBxxh4@MR*9`LH!0$=|k6Ye}v-~LG|ANo}>Nn=!x7vz`Lkl+O=gonffi_ zao&%b#S~8B>v*nRP?*oxQlGC!gRs=+>jS)we%eF5Pq~Bo{jVM_aXxfi{$G>#s7TlU z_9KV?;}JpqUQ`&>56K`t5yZ!X_zLR#^$V!;VH(fjx-fx;p?C27o9AWwWuALq&iU`! z4qik1yLdgYtZ}Y!?@3_l|2_)O)vWypjD|u5D^N;ihXVnB{m&9q)P&mO9?U^!HPFuOWl4 zWd2CIHiV^fg(OrpM5GmigGzGL`p>Q_X4 zc)BmF3LIZsAh%j0?EKa3CJe9z%MY|pxuM*Xhm5bF1#W>NFO6zcb}>Zo?tP~W?# zqT0WVUrsU4;00`7#D3=UeN;d1p!&JzS{K#NZB#$EQ2o4(+J6h*PB?o#$B}lVQ1e(4 zRel1`W1PlO7g{CDQRBI>=9JnDZ8 zXGpK_!%gFJ>7OarN_ZjtGl{RJ{Bevi?~LIn>58ru@KuyQir13w2zJgRe|#eKA4Yvo zE{k6wehA;d@k`+&s9zHQAKMeC-zV8a)n^y4pqw4odZ_wzQT1t~>eIq2Nw@9V7OFm* zsQNTf_1QqxXB}0aRaAZIsQT1U^{Jxjvy7_G^bM?IsLvEWhjL1;P2vklH-YcM8Pt4N z#vJ9$UU^I zQQu3=;}dDe9_qb}9^S`wpo{l1f3@(djIVXPhVMZpQ2!UXMZKr{?~DY z>w(nupcaIst_M5#e6~w%?*(D0?Ti2J^;*CWQeN4$c~rgTQ1zO?!}Sv`ldkC6F6w#h z(tDWKX@42tOn=Q|mHp=Mk*9FJpysi0{1oT&2%bj$b9g)L%HmD@?oS5qW?oF=xtyOv zcqzxHAGNOCr@RL9`!->He|!^vL%B`NlWq+!#|GX<{TG+Kehc^!wa>MA96p`%9Ql&y z`ID&gbu@^tqmEw{3+%V-+CJVyy*qd#`ER4f(I)Emvzn;)kQ%7(DG$7t`JQk;Zqn`u zYCRmrdE%#n?P=8S-wxsXh)>|VNk4ld$C-Mi@e1}!q251D;tgz1;B$x%p??Myj=ChQPRa-i=o~}jN;SJ;Cu@_pnh5h?4shg zaD?_WQS;>nK979XU0cOF>4#-hx~af8zL)xkQSTp)lE2m?Blu73pLeZ<=h5DAyoBSo zj@R=3TmxT4x)s;z_yXqPD(X7FgcFSOP1HJQ2cJiL8-Kw3v+y6hXGi-gI2D*g{Z3&V&t$(r{3_)P;1!&Idz7p3w?tU=siWFk zL#@B6t{tG(TYGrej*4yu29sP$GCf5v&xajlJ7Z?#bCt!=!Q?OU!jQR}S@JX~+R zpY;jtn89a}ZrZge)OEgupQqgusO$VVKAUu7t`$+&`2t?cco;=p=ST3x)FY32e=vu- z&Zkk=`5}A)+mqO0djfCg_{Z>*r0YZdPH6N4z7FZf%P2SES{PNoKGZtofb^>0KITcc z=h`l+emki8^-%TeqWZCe`rol_yqx{ETx+80yN0UoDyqIKsQT7X^{t}TCrRq@^5gV7 zE>q4nK2!O*wu$;3`6lYU*dnTbMo{xY4!?$N)cPgA%=t~aAyhq6sN)^SXERO)U5f?V z2kz2CJ6UPC!yyp{Q(5A$pfxwc1nVdm>D>i5#dh}ZQb{Xy12l%GVcV-l!! zOboS-=|in!dZgDnrh{6?Y@q79iqEJ04cAss^{C@;SX`VDEEN; zb-mh0U9a{~?{&6O*QqAzI<<bf?Ax~>&a*R?Dr*`B0cSFuir;XSP1>!{zaui#IH2c2Vol4r)9$aF2OAPkFlU6UUdcy?|N=c2WJ% z!7FHA+qD+z{M<(M!zQX9ns_DYHe6dr^}`yfA68NQ&_MOWGO8cuQT;H7>W5iWKSVzo z^utGdob003HCw3rYYV9M&!Fx%P2)4E_auIT<6A_nV@Gfpv#5SbqxvC%8V@1-KIQIE zuKHtva$kC!brs&G`rzfzF*gg7w6(YZ=t{_Y?R4&bw5N^PGAmQ2iE1 zU8iHHb_}4d)BULVHG(DbUBY)Wz7|l|=Q3)(oI|y57ImGT##gfc6l$Isz z>5Hg*^Qhl{t)Z^JReTHWU3P63zf1ZaPO-gv^8^;(g)L-`-8icj}h<}pvjP>Cl#@If9AJP45*ZNV zq5iLA=M&zpE?!MN+W1k@wOm_6t(WSk^-v98$@O#@)gKkCl77jxIn?jb%;JZMpK)y( zpGp2j)Ou_LwI0i%@{b4Z(=L^>hbm_c^}AME)K~X2HZe`VHeK659j|rN@A$6Z>)2j* zZ2>j^lu`52JZfDzgBRjdu)T;{AB>>pryT13+hpC>R}*+4`Hs6bCMmawT3_Yy@7X@= zS{C*HTPeJZ^CO9xClf(@1pkBlL#X*}pYk*g_E77R7Ha)eV*6V;@8P(D z=TQICmc=IPh9T6v8bht~BB=jm-9hcQf!c2kwcjdgzdF8!_(j~Kzh+STO@D^_4{V>r zSJQtJu8pJCPkH=b=BXikGuQnTK7)MYsCtA^zaPFwep>(Zt$2R>#J`68_FUUV<<~;x zw~oqh4VB*ts(wqT`pu&9n<77b9-c(qznMVYzZp?Egj4u)j$7!ntdB^yOIX+K9_oK? zTBzgOKwY<&QP=B=YfGqkb_TV68YUlo4$h#~-AUB`F;sttQJ+6XaDw~_IF3csIGIAN zb0$#hoP{7f8-(}p2CgSPJdOFIi)HrjpgteB@B{S67QUHwZQ?uFzJ^M-g5z8#>aImT z$8!+k6M-@OsJ@@$TI}=W!+0LRFVgO)YyJ3T#$Uv>FzUWr2zB4#fcZNti7(Ro1i>~Exp890)X40kbmAH!)#zPNZ#`Z2=#qn+91L)rtoXo=ap<|ErUBZ2&bsBMOs#<_rG3Wg2rF-znF| z@fn22TpLw9^%}ul-WSQcmPI|+%HT6epLQ*Ymk^(j#K&D5z%k;Zm?gg7wGcjy@WD-o z+73RIaL=_CUQT%1wGI3=^;map1)t9Lx@*h$6^?5KhlyWuZ61Haesiu(;|Zjj!b?e4 za%~JRBV2TC1oeDu7(a(O%(Fe~S_XGH&I!Dj__%9f9OJ&D)P2XkAS`v?ae;QfmhDp8 z%RyLbd*X}Sk6_$q@#X^WF}T)2{m#`U-iaHi=h{nn1@$ZAF6YA>-oSV+;WGJ5pq_&a zuKGMVfI5Gp_+GZ>@Z02&64^W?uYYqG<+cW>=`K3_#C2*SgJMLN^ zD!&8LE59P)H#2^u#!n##OO2oQnzwTkr>IxcwGBMry0s=5|MRH!&7t~x_)9)--ld#{vp)$?0|TUi#^nM*u|4rpY%}Up^X|3+oKq&s-2LA-@A!mFmCAAS~5?6R3I@@r|tK7Ag0eT92ZBkFSpUJ-!+q zC4Lz%rrq-!TrZekNAcaf=P=@04xh~N$htO!|H=HGa;+cLo(QVmVbuEuZSqxo3l+bO z1I%|lwrhO0QRmk-o=W~(u5F;^vnp!;WmNkssCg{^HQzsjSFm5&wIS3vNlN-Zfy$>3 zl}`wj&q0vSEMe7S5;aec<4tTI!(;Tv4j!(DP~)eInpfJWakPmVM;oYdw1yf-4b(WQ zpvqfB9gq5Vy}Zp^Sx-bmRjK3G48l^!ua2!#c|I6yuLWVL?UM>~{H6Av2*Og^$58!R zz~l7KsB3Awn|!7A8w$cw`$bUw6vo5(;CtTQFsdK=Q2lT~JJkMt)V#WjYJV5i{x+)p zP1JE;N40-oJ2?Nyr_MO*qVC^zaDaTaQTcA+i?E5WQ_DiDb7sGwl4{7R|;=E4awVW@R z?|Z$XsCtJ{_3lH}dp~H`9;)6usCsu%^=_l;y@jgx3RVd(qUybXs`osq-gBsWPoU~O zrm#L2xK=>bdjwVQEUMn)Kk#~u;r~$20^UVABdC7Oqv|(^Cy;*xjdpfuhptCWRDI@A zKi)!nBdFhV>9zR27ta^kcstv-@HSk;j}pIt zUng9^zwkL{5WhkA;0{l}i%Q=>rC-6X5}wCBj`IvE{Rl45o-DqMc{PLoO?(2sf>ru+ z9hXr3GmkH1UN8TM_s3}eJRbfo6KdX>!Y`A49N$Slr*M<|IiVoFNBb1NjuTvOR*Aov z^fi1G$89+XS5VizEj;{v(H}GJxWChfAJF(C{@KhoQs;du2uq#!P132|8>n{owK<*~ z=MbJiz4wT}m~oLH{1wiJIG#l~ih9qpKL}6Y3rRnYdM~YjI$p!5{Bx+|u!hQi6(7g( zZ{RllTEXvdT*vNY{YN-~m#ZE40*-T=?dsPJ)P0IF@v6@hsvcd`xNG6FDgPh{7k}dU zjp9QYS2i3#3%6Alz%`z-{ro=9=?HeyRLQc2h^jD zdjF<{Q*7UMZ5g%S68;16i>{UMaNR-vYF`=EzByF;X7T&vJA-Q9B&vNAsCjPOwJ}ut zI;ebFsC>5Ye9nhW{2uuswNQ1ezDl~3fS+(+d6@52V;E`;0czsGhR zpB!PmHk$Gd@x?6-@0AFPMU zzl&4M57E25UJ+Ei!uUYeWqo*9FVyq3A^b=BFNN!blc@X6alDH0IgV|@BlsTLxr~RO zV^F`BxPYI=dHf9hIfGg^PvciPZx2xO(k5O{`SE+aUNKa?22l68`cd^Npw`8C)Ver_ z|G<2c#lO(*G-_Sk!6E85g&Ow*T`#8}^?50RN$L^CS*|+=q-$~h?cs^+zd`&B)O!te zKVubd=5uDlwH3UZ`d3i*QI_x~wlBIikH_hcIs78=v#w2{?gy3d3&c;lR>W1p1=sjt z(!={n!}xRV$K+f~;6E`Aq{cx!2uqEFZPa~%=Er8$|W* z0IGkZ_)WI=yB0z9@BY2sUwe2v+jm{-;Fk!uUE9K2IDVV>-^4dvTg5LEZn##(CgEk* z7Vs9rW!Gl#tAwXro4{KMkGobt-RB#{UvOMTT+5-3cNV`!`iyHS)cfm6ypGQ|3D*Yj zHqu313u8+21g;Sua;?j8d<(~0>Uej8u+;IMx{v$%>{r4BuG4R)@I2sv@LOW63-Lb2 zLl@6voNnXOIM255ag6_U?6G|X56@d%qP!(kd5b|V2w3{66{2q3)~A;KNvVOrq*Hinmcesrros zVX6A%@KUaSwV!+Ymr(6rK;=J&@8J4Aiz>H->X!+86OQ8!>BsPwgo~2!D5`zKsQq)O z`Xuou)JLj5i6AUhpBT0omjkH&+Q3T(Xg5BZ>%=Z9pDzBMnk2AlaKBq3?E%eI_>i*Gm5H6wipG57SN9`BEEBQPacI|+2U&VT7 z8@0U|gzKo!fi=|U*D9)<3O=0vE2F+wv-K;#uC4u=`&;C*ih4h11y||MS`c5spOeo# zeunFE9yh307BdmXCHd$*nghZ&5g-4JKUW^a&$1qfxz>;OqulOqsTcED2meUEZOpPB zXa(VIJehiKq0+6Qj&t{a+zI>``DE~=tXtBqMRA?-`%%}`2!4-ou(L}(w5x&o{?!;( zIbJDz66>FSd;;4KsNa)VuXpi$!X3Pq^0!dimr?sI2F?c-@pp_{sc~Bf!cyZlk2=pY zsP%6WKTLlmf9K#&0Pk$uyx@#@GitE(2Yg>3X`!(^~C|r$m3{*Aq#t)}41dWwqlijBg3luV9A1eTd@c@Qllmm^D#9_m z8l!k4{nd|i9FGWQX;;{_5GIH}*kj#K{Jv{@cn|%#gE7vJF202P+W1o3#x~_`;yc*B zfepf|IDDM*0+nwaFCpKWYgJUf6;!^9cn;|n&`4KyZ4R~nEM|zGacvs4e+jk!1a498 z7`~W#74QziBlt4H!}v+fZ^mp8~L3|43#axS^(uHxDbbYRcaEs%3 z!1&W~*~3xF*}>Z=zl#OJZ7kw8K9cdViPsR`zyXf?8or!x1EYlN_&N4pMwMGZmAmBH zBEFLPEx1-jl|P4Pu>Uk_zbVwXE4em_FJr$6*Tzx%74de;8^%YT9;!;6m$@J;bzWvs z=VgNPNxwrG$Dgqd8FXy~uOq)wncoxrd8^j-eo+kYEbLs!U z5{rAQ=E+g~G3AWlBI(vq{jrMr9J7M@98*Jmj;Y{@`T^*XIMaYyM0V*7Z4wVd6LN6kNmS z(cU`hy_5=`M!GWgvwa@*eY828=kv=9>UrfjYMoKUqof-_tq-!O_f>khLqD${_~)$h z|8kx%{-nm=d=Qozf3v91W0R=+5hK`Q{~YT5hA>{m{!;t*1!1ZEL#Xl(DEA>8=YjuY ze~jR%)bD_L9Il6OmVCOXd^$l`DxYoC{#*DN@=O1P{%8Lr4qyz=zzFKN9+3a(gm*BC z+o*nSqK@M#>b_+Sbsu&aweDQP({LVD&uP@UbP8Y1d{M$%*l!HAE-a$zpTRlmFIE3^ z5SFTc5^v@>B~bMrr=Aa|oKaM{c~m`yQS0bA)Hs~RbBSNUhvG6m1eZ|bXc3iu8_y=Z zfm)ZX2l0ETcK7fsws-L#8HWRZ^?nMY()XeA8AYYfQRl$~oYob!AM2qdRQ(rF^`FBzuCwc?daR)GZw1?%sQYBQsQ&2$ z+cTk~p)YY9k~m0w9F=b@FpA1Q64)0QLbbDizheJk)bSlhov(9v*zXFn|Iq!8hW1#0 zB~bl8h>yhqRC)cVa>7A4gpVP-&;Gi9x{KQ0!}G9%32dS6vu@#|2{!}RQTwe1+gAc> z_(3m| z9*2E+0d|A*DZ=Ly9z^Y*$0Xqls+<{AeM+eDGKq)vK;>UVjhhwJeVr=mzD@=8ymJY4 zUuOYzU#E*o*FvS+LZ#b8rQ1NI8+d@Hi=fi=q3#ofQ0exAbc2L{%ID!Ms+|c`y_$VT zLnGv~fiL9qz`AQ|I7@idwFc_{*B9^$+$Sx&Hi4gF{3h|}iR6p=9?l>Z_4&fJJ<8Mb z*j+rEa=WPX9sD!-w(x4wZ@bpSFF%m$0lq->aIK10a9#}KeYCH9!qLP38=A#maX(?k zwF&$M;c?eSutzxWS{ARP+%#%koN>W@@xFy|-oTggIe*2qI*t>r zxi%R-8aj#dYYZR3bz~Gj$+~m|wNA>TK2K+Za0cJU_B87AbPT`G_#VKEPv^WOUybus z!n(fHQ12gC@S1++4OITK_*UXOsOwS-uONOKwObv+m6Y;am{T z;F-D)9>gbt_+I{K=rydPI`|UC+cv(5{@Zf-o!_IOzonkpz<6Lduy(m`A3^OO4#K;a zd3}1Q`fQ@|SqU7+N$Nd@x6z+T)cPilx-Q1>e)L-um98I^E`-y3UTQzn-3naB_v<=< z+HV21Um3OEENZ`LRC|kfSYP}S^Io58Yr{uFFXOncx;Bi5>(ER6dO3{BH-m@u#y@Lb zaqZw4M-Q+2yQp{q_6+K} zSVZk#z>gEZ`7}@0#P<!i!iTynTtc_u#2qkLcfh*LtY+>0b8e;qM3Z z@Yjs*%EjLAbGX9&q3IwzhQDGw4Wrtd!KZLO)t=(xrh>ZuFQC>t^QiuxMIHAN>bOU- z#C3heJfAu~hx4<7XAwVzTE7)g{V4P^hwviOx1a3mm@WJ<<6{HQJ zu8m3BIUG2Id#qmu12><<^_S0&b<};)8ory)Su^-f`gaH#T8}NF>Nk(7UkSAiOr!d32-TkhsQabSAbfD)(a>iJ@1wSFq1K3%>Uhke#?cJwd*Rcl@idG& z9%)qi6e?X3wch|LT@+Pb2$gQ{3BJ9FPh|TlzL;^)z$;jf)N$=N=Lc$BO`zJ}9&%f# z{I*c%ZxermCDeI08EhX9w)dm@b>;C#57)7asN+6?>Zc)8y?2j$dsa}#rHVQ(OQ`%8 zP{(Zw562B^zXWPN?hE2u$2{LvRQw_;eF^nBAdeN+qZ!QUc_?1ZxEyqCFZKUfy8k%$ zt^xn!Sq4#~pR`6z+hCSdgJ66spGP}O7_nhMn2{dX|N z{+pqZQsNd@)@GaT}S0p!+VIYqRLrDl_!SEKZ;5pL5-6z-oQASwVDv>cpg-K z`_HuPzK6LD$|sGgk2$wJf@hFl*liy@ z-6;S;$@4|Da`5=lq-w^6NgZL57Ghj6{sPQ$0s-KZgP{P61V~d3+hqC32|z7f|^}QTs=5k$l6b zdI-7g9@KSk{pt4lvxYiu6EzRkQOBvGj#ELMR~bLbd6lfDh&pZ#b=(B%xN+>Ue++fp zsN3#CeQ#~^Y4$ohLLGM*uVo%+p^o1`9lwS;eie263Vw*=m#wCRI({B?d_OAv6e|5B zD!mt#ega#h_gKyTQ*Hn2pyru2s=Q59e<{0g6qR2XmESBXzYvy-tZ%F)fa=eFd@AiX zfn(O!QtNAv3rnr9OF_Fn$fEMipw$kLX0-s2KUJ9^&W}Q*QyGfVA&u~7Y zC$s)Ig>i_Q4+f~~aKpvdQRAg1DQ6U~U|kVJt%Ige>3yj4+N!pJ=V)i#Xpj-a)z)svI+TH~EgAVC!)mRo`or>S->NQ=^uD8$D2Z}vwV0T=_XP6deKAq zCs5au6~DbM_E6W?WxSX8MbvqxQRf>&9Y2Dqzc8x)X7M=E`SGWOw@+lf%W?X67vUAu z`8QDKpFq`19F=YswO`1EC-HdtkJoBEsP^cbVCTIyDqR6}J_%I)Y#e{c^G}4=@oxIn z5Kp8&yQt%JTzmy}ys`^>@HEoxPuqNV@lu}4Y@wbPuj4)R?=`ClqSm{k$Jzd|f~w~p zs-Bloo_})HBsr)sN>C{&O3y9 zzC49mH>^C?o=*=|4@>xI_Uq!8IggIjL{R<2k2?QpRQ_92_PmOye!TXWL!JwnhlZ&6 zX%*F;J$#UPMQUDIc44V`C5Jk{6zcruvCjD=ttNpwzbHP0_ozp#W(FUjae#*7Zyn2Z zjN^_`$8DkVt)TKP%KH%bKP~U_0yZA{Qa=-4invU;~=edWO=TY-s8FP&PNz{6< zbI7h2+ju|sDf6iKqzliY<~=`Z-rGEy^QXU#Q2lI(x(>Bmd=u{>zUt!RsOw_Hg*P5; z)32lE#~$8th|&Kh{w3i}-QET^FvS?%Qgp^RHl( z_AR^ZY1I8#3^k7DT>SQgackGbs;{2J{Uwwm3eZ25Lj<=aM;Z-gq>hKpZ8weym;lYY@^ zTBv!dj{06#&1y<6K7&dZclz-z#+}r-n|5KTaku?Qo>#N}siNAmfU2iFs=vnZ6z12M z)kJWG=YV0WnL_RFL$#*|L#%JMygYBFoVyFm!;G(OypDCpmeq{$2Ev>Q1@YrsQcv(>Umb%YEmvd@4~H%4|)E^^P8sCRPcK0Ig7eJB~a%(hx*(q;^HUq zH0BEr{yX#E{zY7GnUB{{;TY=sN)cxeUqic1q9L8v#qVFpb1~v~Q1K;v9_LfEnylL% zL4CdxL>*@*ZO?Oz-=_bKP{&(G-M6ixzCTsPE6A^6H4AQg0AEb}jMYq_^4)rc{rqVT zRgWRm@5Qz*u=)0!HD?J`4>^3;Vd@QaUzfri#`PSY&AKvz2kUefA41I|Q!ZS3IiDM` z-tnT2>p`7IJ9WsDrGCP=M!5SjJFnGI^HT!V594?=^H~@*zs$O@4>iwBy08b8U;BKU zu7yXlzN(_`5A&$|`Y7tYJ%YM#58x@pdr;@Gf1XV@M)l)O7p|h(IfYBa2T{*6w&v~e z#;D`1q1M+!{4m$8RjX;D?!OwS{bo?-<9A^%>Ua|_oI02Oc{JnYrL3!XPB_Mc_tc>3 zr-Q2h7OI}AsCKI0pY?gKbLSkp-xg}WF{=GGQ2Vc=>Sr0%ZcS$cm46L&A6`YJE4%Fr zsQb{gi;v?!6OOp>ZqnWt4pI3GP{;41@>xb5e+hLT*hU?{?BYwP`YEFJPdh_ydk{5G z23-91**3o|)OBtRRZk_19Ovms&3i=`mYVlMsPY9+<(ov6%Zobx&RI6Rjp}bn{5bPj z1hswrOy*zas}kX?}#Y>pa`l$EAEaTh8n*mY?3~KdcGXM*E9dmSj~3E*7q`Aq;Z1UZxVGq z?_bKglk;6c)pHwFe`Qp?Mo{SjsQqS8`*~3Njb3TjQ$Sc)kK|8GC8`wUunm(%CR`3C~FQeLR z30s8osCgobpCg>+`1&2rJYGS$k~n003?HDpdDMIAGN|`NH!kNn#9`VMFQ)uet0|*? zCt5)Lzx)*HI6l0Rey~J()%zl`QF76zK`;* zW1RFGc%R1i>*xo>`|vsRi%I+){bY~rkKsDBi~4@qChGksDYmPh#!>w=hU%wLd|t zq?^ri9gZ>n@P4*$y@B-9{|c&{9sD!(RKN?^KZPgL9%1}n&SwT|lw%T8Y~Lr}TR7is z{3P{SCSQHOBaaueJ%{=p;n2nR@b|1&+jtS%8~A43hvNrGSAQedZSwQuLp_WS{1=Wp ziRvd_JeG2Lw4HvqPC9+>Z#EKSQN!yX|$n zg>*&SqaMFw&-w1UcLsb9YV}H%VyLd6>+p(H${0rx?fvd~|>!@ zdzdemQ1fvcZ)9F=;z!B9h8mA$)I43pBA+7_Q1f&aSC4T0LhYYMjq4ODT@>#n{|IXT zFn*nK%%bWcfU1WX)V%J;7qY!{l|8Q_E^uB2tI6ZRd)86slR?d6X}pi)2JkZSnMURB zQ@rMDR6Q@F>URlMzg<-Qwo&!l!Wp(VQT5!w|E7P`OSU{UyoB;pt)_xA)N=t<&v{h2 za;SRFpz1k|s^6K7g6&=9yLGYFh}|f!?&zb|$Mf&7^_;|4QqKviiQ`?2 z$2rt>K7#6Bv#4^bjeIr>&U>SYNv zZ`QG)bq&5*^Au{F2g-ImHYBX;%SeqZh{Wn2++P>q-Xo zyMzTik@OwZcxs`pGfniez3Re+cX7QqLVDEuM00p2^_I1o1^gKEdfLUOT>L!hJ;X`8 zOYLYiaeO!7nAOaop2I~^_p@RA1J0tJO9fHSQv!Gm_X9rEbCgNcaVOk%53W$YJ<6^5 zX9M5Gb!QD#?iJL1%+l5L6Y}rk+c@7gp27AOX2`#YP3paXujaX5-fD7qD*ZfzZ)U%F zRJtVQ>E{W273USVnjn6K<4xla*l!YFO?_-q&VBmX2CBcV;~d+Uu}FEA@LKY3q3(wp zcnjxQ!X+G%&$Fi(FR1n2#Jg?(+99mpH*Dc7+sAnD9z{IpKkTRPaZlq_>^G0^#2CH< z=kO!sAH}y54&z(t=LIYiUeI>J4b-}%hWdY%b=3E(S5ft|i9ciBTdUY|t)hUWz>d>iLmN8SHau)=W*_&1F=>@of_&NTk`cvt?$sPFHO@x5%{M16nX`ySen^W7(``Unxej_uQ^ za36L5-b2+#2X)>p)OpwOFZ6>dUPHPHs=t<9cmXx;=kYykkK>2QcNaB}Y~wML)H{Cr zam**z*!U@YI`^%C~@eK9fSV&ph5oc?YO; zE2wnKsC0{{bZu1oG@T7px@}atP1NswMtC0ew~qR~&-At2k8r+|sQx&C>W>~&f81w3 z^~3Rd?e-CB`#S3SIz(Lu23W!#-hP&X4&oX|Ha1qaB{AN(| zPSokeHrJ>9D&Om49B-k*>!{-_;fJt{I(`BFc7*FI>iV3(pAsLyd#Sf6d<4 zpO(q6Im+5Qnh zop%^3)JFmj=0~gP<6GIjh(9G=7xlj~ZTu1AuYsD!>Uclt%ec<|In?}+Mg1;s56`CG zjqnKNpQ~~IMY;*p@1r{S4PDH>K|3Lr5vnbCL z{(ye!!7%-LpZ(Q;_V9Sxag2I?K0^J!%^K=|U;3!~t8LQh_iH0mKiELE|2jU6@(%HK z!aaNq_1(Z{5TD04aNY~3@tj26&&<4^`H%24{`v^x2d^UCA~rdn7T!d<8s30K{HXFl z^@AkdM?XkdO$={meG);vXJiev&KuylT(A0gKj~LcPQA?H z3(Zy?*-!703*)EQK8t$3IE{0(TNkzdYU5qhLlZyAehqC`f5A@> zuA%Z9q4w+Dz`BWaOE~5{7E#Y-+xP|MotD+qu>Uan8@`zSQNqu&y=XNBRJt6#jB;i0 zb8KI*niO6}eJ1deq>rQWi=pz1V3+;FRujS>v3~&1BflB^EZhB7PpNl5s^9oP4K8t?d!)r;mY&A=$<8)B_wehnYr)4!wJcD!%)P7YA&@amP63SUZ9XF3>Q(sxk zaz1HXWPVTKx5;nbYLa*s=@R%3$`QAk7=DZXG>2pU-#ThF5mf%O_;T_OpvpOe3G(ry z%H_jL*goO5d+^^m?mqR8W)I)V@pi3d2bJ#@o=HAq7v4bSzmA_L{hHMb@fy;vTFn4; z+!ai6+$B`HMf?Kkx>nP{_mHk_H7!)S2A)s48h(fNDx>PFq%i4=R#QOLR~}2`le3yE zs=hM#OX_REYSO6lies726{S8`jJdGX=ZZ=C*ZV0)9GjFohFy+3XEjm$Cq93PSWOr| z!+t5`uLAi0Ij&n=kIMM7bGhzYO%Y#wKF?jOX3(_#zK0R=Teg}u>iq!?JeBym)s*oA zl)r$_AwF+4Y1I1%QmAp0#K(|6fvWd7s^7+}W)9VFqxdz(T^NsJUYNzt5Ff&CP=7(x zdk_NnHu9gw*kk!!m(}?2ecX3@@fOlepwf9z@4?vTJe6(-U&8wewykChm2QN3FTxt? zJszw0e$KCtdf!10e?a?p@J8B8s=eASEY)7skJ)-G;aix0idK_By?SCXalb)+dsefH zKVqKW!9~(-Tg?`#{zv!*_TR9Y0jfUxsQO$%)n^Y?u0>RRcCDs^s?Qdx-J7U(Z=l+} zZZ$PjyH`=iE#d1`UsjXBD+w=HO#%yq<5m;FKk+~7VXFz?^|aSC=Gbq_YCL!a;r)*u zXf{#r{}@@#I;!5+@U`qWw3=1a`SnrtzKnUcFIi0s)z2F^W_um=zLT2ORPf-vBKSJe zm8_r-&+V4xe`v&%3N<0aea4s+_e?(!SJR z6<h|9`S2d zGr$Gn`}hjtSFC0c|HS!pt)_{8Cfu-^D&9itq#8B&> z2)>&5u+;?cS6oMDtj32gW&5O+|7$$t`6I{Qvzje@IoropvyNvIUbC7$UP5@qY8G)< z=VLW3{BQbq6X)5lVKo(e8R4?k z^VJMqK)l~-CNWFcYc+fH!%GS8TFn;f`mu>$!VzB1_6@69N4-~Y1r zJ*!#7N$#J!cop#-t7+nUI8FnvCBAMo6+DXl%lJ0pOIDM|6N%5^yNJ(PO&T{jj}%sj zpSPMAmI%*TO&Fg+`dNH8@gb|3!C%upe!PbGX)FI@Y3C&`R*9dm^8b}QFCx5SHS72w z{Yt7|t+}vNzuKc-)jm6TCH-p~muZ(Rs~O`I*THqXl|*h#DUQyo`1F3f{&3J*!#9_f!5QtLfm;To2l~$#`txjl9RQX*G3R zC4J4x|46cKV%=P^nlc`&tF0!Fv-Im6{u}ACR+GXvQm*``nRhUYuc5!D@I0MhDd%P3)1bVKp^WdsI>FF-Eoj2!BpHZ{XeRziu^a zsQMdP%_{2tCET&?7{bdbM-acm^(BC3(ta~mGmT#%zbUKn;n|$uq}6!Q!|yvLtj2?f zD9=8}xrcOnRU&o?)c3ApU3>kU z!x_pEwVDtlClU5o&F*LIb#(_HPyDvkY@+)42I@Mnj?ZHI zn$-+Z|3|cfT1WKo1hy|*O&2wvbudJH+iL3QCtS0d59%0@FK>~ zJRU=Q(rRL;^~W4OhWMz}giyb;3R=xH9wIztH52$)!XB&H{fxa{?BI#SZ(Gd>k0!if zHAB?@Ij!R0Wjsf+njUIiU&d#$|B}^o@C&TJ+Bi*o%WCSVb!H7uBED)hMLddd!D=$- zBfMZWNt`5{u$np4^*@Sw|8c}>g7_%*3s}uGYJE6`PaxiBH6DB-;r&|h;1uC?s~O-k2=}dK2_H>((P~WU&U$)cpTxp)hyuS2&b(k zi5JuE3H%WAX54C`cpK%6;6Ji|*lGg!RKhb>ulVT|)r4`0`@C5+#D}aV zfKkFTR^!8Oavqabo2^*ZXl zsD_%?%lLKnFIi0iHLvGU^LiKWV}A5}-qzb5;U9B;+ju$0-Ljf7euI2At!9K-wr^O? zI$lP2&1#0YOS`S&fOG?^>ETG_A*-3fCqB;8k?MCo7nbUGlV7mq^5XXx=Mz@5$95fW2X(w{ zyr1n`Rx?J;(`&d!{Lsq(xE}I+mvGN&S{UH?Qpaz)u+;IFIG&EvMIEPuKPG+KYFen{ z)KK$x6@S3?iq#ZR*MkE7kodgSEZ{ofwACc=M}*^66T$Bj4qMGM1}UdhIj3A$s+o{%)ze_%QsC;%% z`D~){Sw}tZU9*~1R6YY#J}anvVz=7Q;bu{v#{^K{!<(Vd>N~>cNc#^{M;RUUV{<5nfMTP zC{Ga2=l(o^KW6(h{sFzXb}Z}0FEL)Z|JcC?2#@ihTz}WG!1ve|@gW}mcM1Kk;(ptO zC1KM+?O($mkiLXop8po{qZ~Ky%-~Nr?mX%}oH5kr)FJ#n>1ObIIE5q0B@(h{P-in z9#lE@mu&fV@ZoIVM%Bv(-cNo*7r*M_mr>`@aq(>zpF!25d==wu!G$GZ6Gfe05LJIO zsQR2j)noHE+M9k*N3~}S)!tQ9J6G`WgiH8XEZ`>2;xEvPF~+sjxSnufsd2scMOz=+ z_;dCj;e$BD2e6MLT*jYa3zdHftIPuh)czUN{wdV{N&GV7K4CR+RQdqw{i1%CgqeW=h%g%%DIaAp1}Zr#C4>P`d{)Typi=vpML!T`hN!VUaj}+ITPhY7^hVc-X+NP+#j9WBVHF`)otJrpV{4Rx?12zhzXv z^4w$d-6g!m@%)6fz5HdK>ylp))!#DCG^!sZ@e5o(6R2@9hx+|s1pkwKf^K`jZTF$( zIgg9q=Qv8YgZdr)7OLIH_y)e`Fhb?Of!Z&H59Rs5yp{iJwe=ama~YrOBn^ zdN|K`TE_n%yo8@1-wytga1(X@J9xqo`XlQ5!<(qz33yj{-o}0tsQ3{6itvmJPoef( zKz;9G9NlA;8E*qTi*Okab3L2HIN_adaG$B~L*W^u z_u|h@l0I3m**s;PvDCwNA@c`mm^&Uf6sYsQD67- zoOvC;cbN4NexC6tH6A-IEHxgdS6S~-?>^N3XicK7XC8cj^WUf5^t;AAtC=HS;~&eGlc@eP^Y1)oC*NsQzEkLDyBBr+-uspvKRc*#Ge%tx*73Wv_Y&&*(nZZX zZPb2E)c9?n%2CHB&|X#iCHa<7<1&Z8<9J!rx@I1gUjp@e^tjc`p~hbrw@ANF`CBJ= zI#Ttu=fYC;wT(K?CLUb>Q0WG!d^#>%MZLedfS;tEdYrfVa~VHF{!;muTv#gqJnFg< z!<*SpYQH%bmfCOP+qS=WQ2l(Dc=gL2RKFOb+J6((e~0)5@{`JM)rF<iia*X;iz<;a%h_m2cFArSc7-#&ZDGFUF|%(y!wm2@g^KYqpA--|K7K z=W}0BL49Afh)<$CdHfUR@I>a31$+YG1Zv$E#iw8hpN3PY_rC0X&-S}5Jel|n=PI5= zcoCn9EmZm%s-G56`Dal1%sXSK>&_eo*&e{B;}ohK9t_~xcUezSFH-d~bYXc=-?-2E zt%90A3#j=yi+{s3YJN_l=H-|RNARzNL-;>9?Y4VxkMQnyxIe}%{4ZR`zu>BK1$PNA zx$P}y9sf*x4t0JRyqItl)qWw=bvKB29Ok_7a{9gB=|#OSZFk80HAy|A#^C_9p6;N= zcMJ92t)|t~QTvrp>*q8ctP4@^b4prG9JQ{VL9MH&P}fBdzL53DHvQ*T>a+M0Th2Uw zo^Tq~kCLe4#PJ`dn5tcP7S*o<&S_M?pG3_c9@Koevtjq!M6Hk3TzCn!KI-DZJcU}X zG*RQJhHD(ZidrXSQR!1I96_ZIqu$FmYc(O%IxC3JWLyML>Ak4@CR}*?$97&Eq1JKh zsO@VCv;P2xl&9a~4&;5bC{qL8}R%$~S{5pC5HR59<84 zeq_rrM#c9~_0dGFcN?hmbyWHqYQHS1{23RHpw{hvR5_+m^*n`2??a`ZM5W*Pp{(wl(zWjL5PN?@P zPFal)b-t6R<9SiXD}A4Nk9ksRo-Des)I7P)Jg)0(5C2X(Euwz+*F=r?!cY0UobqNd zPJZ+FUE&j{-?>gXHyFnO)|~^?`n8Li*BYpCQ%8MYzl_UVUp7g13F$Ym$@+K=tHcjo zeyjK!uB%;qfbw)u`PcAxEa6MYFZeUN4)&wg!9E<4ZW8OvpI*F)^6t8HdBR#ZXHfg6 zQ2WoL*3D5={sYwWu@%(wu^#HYs;K#UI3ge78>o6%z}ug}e26M%*v0R&zkaX3t8{E1 zq4FQ%^Euxg_WM8b9i!I!8>sbt;sIMfF;x9TF>{!C75|t0!}v?e5yV%KE`U0YA9Wlr z>NtDkr+Uf|-Y4Ax>Nu;Y_iyx3zl&Hw{Vrk&bv_+u8(+t9OQ`&EsP}E`qMk=?q4uAD zkn0sD@L2B0qIeabe@0N-r%~-VrR|h+60fEH_ernMMVr4k;-_RiVuiLBKu*zJk5)x_~=@{Qs1sHXr{IQ|U2i|0jC_;9vQ zpvtkg$^EU`3Crw1#A&v7QSD#H2i1bZoqA8X?Qy)5^O?nCAHlqb zZ_)Si6ej-}eDb3x2VPBh!nyx*#wGPx!@IaY$>OoJTL$BlGwrtTQLoxQR6VnO)z$X^ z&mq4Cs{DC;DCQKVUDK%kxW{>amGjy`-B)a)p11Vzfg|)2)ca0)RP^6!p$&QE@A)Oc*6>a~Wd z_X-}=yNjQ9#@zO(3x`nc5^&*3=k9;l{6@|pD&K(%FFG5j_O80^Wfz}E{eCg)!YQ{s z>B14`jMMAf;rw(So0y>=Y`AdWxr8c5*M*ySFrT_`8MQ7f;t5l@%1Y{ zKf^sds6X_vUkk6{cuo8`+v_gA=He@O2l*865c@CS7wK2&|FrogQTZlN`FhaHe)}9( z`R<|e-9g1~yZA9G-*tQh@qJXj!{4)>WWHU+PY_T-NeLrInAFX__&baTma2s2UgQg2N@LtMW zci{^Dh~t#8M!J%VFXH{>JI77}LzMuR8 zsB+Jsj_-G2A1eO|rw4Uj``dQ^9n|)1)bY1m{K&;`pyr2l7hZL)IG6F!)Jt1({DzCK zIxDF1l->3csy>P?TtL-F-i0%$@}!*esCrJi?FoD@`^Q~4hB}`)7mlLNBjUm#RDLr~ zKdQc_-S$Zr?{V(`*4FzTD%~#Xcsr=`8@u=o=g`@AE<3x~RM8 zH1==dq>hU!N701~E}V1WtP9Ve$~lcnzrDpg%6zzvM-e~3-*bJB;&~;$Ut=|4)H>IX zA7Q>4Gf#Yod29oRnjijPpX;{pzKeH{*ifWfX~Ge`*)bndd|*Y?7Y`T&3g^hyjMrvS6A?HoJSc|-x<{UWdZfvZMe(# zZwRlV!UGrX<72rVb?_Lrw^5(tH55;{;w(vBpHcN4MqM9fQSCnC!hTe{Pvai>to)hp zYq4Js)y_>9Zn$vGg{v+c!42-C!l?9bP5fvf(i*JaXX;7p|hxS5WCwsCJ&i zV^v;MJ9PhO+qq*kZB%lW${(GfR}Rq3+#71>0)>%c*5C;w*G=`*PJiuus5 z+e{XV~IH645^<*A|WvnqHC`?dGEKPA5w4%okGH4Xd*pa0gariQu? zsi1z>UB+86gA??tIO@JShR@-87e(D)2k@td>EF&t)c=U?t2~_77*!w1|Km9l`NvVe z?6<-DU-Gwb4mc(2yWR^!w5hfyB<3h^GR+2wo`KgJc}H?91SD9>NXzmF$z+!fUC zqI>uN_1(oK%8};$o=ZKZ@G{cRTTKSlehXI9LjB&pfyYySbv%Z8so)#=T(WF6YpDHJ zQTq*0`}OeCwCA$bWd6?ccJ@o7hxUnKpY3y26T~3po<{ZGEz)UT?-ADh#}ZD_K3#n0 zqZpU?CC;yn7t^0xR@1~e`f~#xPCu#RMQpEGO&L$+{7b0uxrcf_u!S8Q;~n&?4a{+# z>sGUd>PPb)-@*HBqNsAr;yu(`$ZCT4RL=8tQvbszP!DUk z!twj~caF2{?BW~Aw~f!{c>DNU((mH&hZt`U@f|$hNu!j(^Fok+9FoAk*(ZRHr*tiM7<2~DC%Ja&!?O{t69c((0`Y#W)c5~e7jb&feX6Nz%%r{POBN=ubF2G zUR(b;EYogTRQ+X8&tt-e7|^XH5;h&UbmVS>N?lJ$IvfwsC={d zpso-2Jhm@jQumLj{loZu$`!yLaXlJSPPMD=k;KzaMjT(q*|3^A`swdA)cZe57^Xef z*}tLwj4wEj>lmI!{!RQY^;ky+`!mY;G5TWxkH!W3D8}*a96y43UrPwTL472TqMtIZ zqo{ntsPmdd^|uiI2lGS#)z4;dgYx>VW(w8sw#iTHojzeb7wn<(Sw`j4#W~8?#-pjf zCO!oln5FzRyc(-`y3PajKCV0}{~T86H(C4*@hLobj))ouW7PLi)=~3Z_)&H|`|uLh zPm`#1N&RU059O<%)*EGfKIx0tCEo%bOZ|B8OyZXwZQ~bF@g4jM>$^5yO*^&la^|Hb zs{ZQu5|tm-9$6Q^fNHNK`pGBk4B#gTPvfU?d(yVs2CCiqsC<_2>ci9{YMv>g+A)LE z7{q6@pC2E=b}wrEG=X)t?{WV6-?&|TEZ>vdv6^k1BD`fao2dMT_|N25L!Dn0wXRCy zN#qknt%pa{lfI|6jxT0=7w4ImeTRIWDC^7#j1j+2{3`u;53eTw9W3EC>b+SJw|@v# zj{)ZlCdn_3T0g|_a^{CQt4U&(aKdV$K0B|4@D9d*5VelmWBbV}A8MX0q3Sh{TBju0 zPvy@X>pOTqcN&#Gg-Sn%daq#^&!XJ3_yF-i)O(%$sP)`59%7tLq2?J6sy=p(@g2Me zv4-{+U59p_TR$49ijg5L+m%eClOvjji;W%ly@05-?Z>2jK`+c)bR|; zl}D{(Qg|Efv_UyEE(e$(-HO6&@8Q8XMUB%X{3GqXh#Hq2)VOS;#$^*VE~}_)VPciulFs5@xK^Hv-lkL523E7n@{KZ&i(BOzd^fhSj{@t zn1|L--#-|l{`Y1TA0XVv5&N%LO%KP^%d*uhq4HhC*Ro&NYTB3~+_IV~zLfi-3Vwz2 zE1=%LmqopQFNI%cUQXg4Y4-@~J$zo&eBwckyZxte9i#nr@nY(2jH-uqds zJ80i!)Oc9Lm$SWv=VJr)p0XOghV3O(K6z&v|3v>vp~im_4^f|S7av9KKZ_Zzn_krM zCQ!%Odn)6P{tjRz>xf5+3vmTp*ti&eHFLsQw#3^%FmS zgK|zQO#VJpKlP&O%Y$CR<0skvvx!&Ge@0eQ!&Awxi0U^BsPPj;r3<0@>*hcDJm*o4 z0p>~Hx0*%NcJnO}aa5Urdyq@O? z8&ygeMT*dA#r7eS<5g@mD~lPoU)Q{`>1iG!pe6C}QsP%RO_1?=Os-NcZWAw)b)bq$RE>XT1Y8^cr@*O;X4WYh=+uWa0>rGx&VHf{yvSr!rf#REq&a^Y;3^}Kq`;=3kV{f7I*+AvH=E6N^%UN;eob#y9o8!38x+8-6UQhK|ww+4& zWUdQY)aMQvyp{2m#=lW-2|S(oERLs84*~ojTo7>)-&t z$$E1M|C9aFv%Z7>MTnu+1Cyxx{9W?9?fYC;U6& zbA)%P?*-KVknZ5eDd!mVykr@5-@jxv(Zf7HAzc`MeT4pi`W;;m4|DxXE6n+&@X;7Y zonH|(A7)XX>km-J?V-+N2{r$9QS)dU-_QMU3$?y!pw>5`BRUp)#If*Aw z@B8F`JngoJ_i-KEwVJVu-^8yIKeC!3>N)oSzearDYL;Al7yHC_tfql_Ze2z_x6a_5 z9Jk5wRZl(CI=zdk=MB_*i--71;wMhA>!v-zS~u;Y&TktpW&0LBlYSFpKYjl=jB1Av zYF!^dU5EUr>ret;#XL0cT)?*xpGDoDWUQuvx?WZBBg`8W)aNKA)O(Jjr}CVXa)eR$ zBeSUMQV??-Z~Hm+dBzs%dB!^GImQrgr~Q{v$6Ksz2t1emahU5asvag#<=g)!_Gf(Tq0WCBHNLh`^{|OrH*BCjUm9YL zbpF{{a;>S+OA$M!|M8e6FPYM}aK4bLN7 zLG{Cy;krY*8mfF%Jf8Rx>i)2Zuj4octC_J;peIE80xqY)c#>S9Yd)7{rEWY^PujNHlAm%!^^00c2WOZ-Nxq< zuHZ+wUKCLCV-9yX?-*)aM^WpB2~<1mQx7@XVb5xI@t_^>D$aiu^}gz5)OEYdd8_<| z(`-Mj@%uB-TV()IBs@~h$^7V*RMvmC~cFdyPo zIEyNuA9bDZ;uY*Sfoi9nIr=UAVcTkY_$jS}Q29jhpugigblzB?e*ISCMcsGpQ(m>h z7Cx2s8lw7DAJwmVsPa@$`6ck#jMF((dxTK!u}8U7Puuubj<(;{}}8`kCC%avoh&`X)Y)bPd#cDv!Fpgi!Nv&}ybp<(@*7+l%Vo zy@V}y3!9{?pzgQRsQc}d)gLZ39VZYH!>~Ysn*PCT$4)r-o0`)z;AbyQ?Q^0Ec zsLyYAUu@5J2ld=_jK5^RO{-bLuM=Lhnht9I@T2C1%@^7F8KLTD164mgybU|3-=VZn z_1?sT`#?OK>qicCf3bjC7tW);ry51Q*FAu`&)$qP?=X+m(ZhL{oDqB<>BFe!yFnNB z;XLu1FJzrTx*n>XmQekoi|Q90%y50E;;%WM9P0e$70-ALqUOgL)O_l}_fzi9zu5Dy zqUOacs-I*~&!dv4dhny}cYUbwGKm`hUaU|)4{AQzeSupCNz#u|cl@Y%azAGK{SK;rxA8i*FQWQc4R7T5 zd1n^&d2kx_y^W+ZfJ#4uO27YnyB-}&@)@GGucDsM_fgO1TUcfP0_r?+cq;4U1$-y* zDO7#UqpmXv%rhS1Rue;AXZ)!Ar|~bW$0kwpq6dG${IkwHQ`G#3SJJPRQS)9hX+JNI z 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�ecl$UuTOMFDz{+i+{ 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

    n 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

    *#eU8o% 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ıJgY^IxQ;ETPfQzZbN9I^uJS9G|#}b1$ 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�g1OFbIeZx` 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

    q3N?GpsVkq# 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

    l(=YKg~I+i@nKXu1gIJA$> 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�@QK$FZ8%ZRwfn7%T#_+a3C8?A`O3|GgCxPBpGO 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 z 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

    8`#I=j;j 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�S{!NVoAR>Sqf3CSgg>;TUrY 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�O0Q*g&r6=vSdhNrUw|8;;9tl| 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%0D(63j*D|J< zJd$D5@Safp!#%r|00xnDc#SCHgU(!ku$)VqrQL~7%aeB4*5xIKa^(MYUGc$bN_$2V z!V9{}+Tm^Syv+3-9@XT9v8_qm6R={Uo_kL^E4Yx{hN_sENie#5YJj`K1hn~9cO?CV zDs15GulM+S?Dl`7IKq^MsWUobr4r$|m!RDeX$F75NbMV<1iU13b}iaJd&wlcAy_

      gNsoR`AhCBuOI%okOES}{LYbDyc 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

      6xE`cmM$=R5 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

      l-vrU81k%lGx;~Zkkeg^hvQF)zx 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

      =5*-Ju_TefysKK_Svv9k=A!$Vbs~Ow&|u4W4aEn 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

      bF17*e>;r70Ie0 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 z

      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�&42Vn?7d4_7Sx3fYH@Qi}?0fa}22naO)hp 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 z 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%0DxzRtX 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 z zZO(-KsK1o@@9_?Pz|%O9ezr*y;CabBrN(RAulV8=)@O8_j6YI4&m<4<9HaaSJc{LT z0{MAx945!{*e+9m=N0X>z^Z&c(8S{UIEnn~xQ@^Nf-wdb!q$E1Cw`<~aj_cpV>e zKN$l&U+@D)W!P!_Ta@p_bnV$CKX)E0JH%@=KxG&5vp~6YgNW zB}4Tm5Y?ZU=!4-=lAB53qx20JW3-Na-xo|J@ z7#*XL|0R8Ze#$$`J^Y5}u{!gx2Q^=7u^IhYVOBPanK{hVsCkTn`g}Az?qEBg(*<~{ z(B30dJEw3p`{Q5yMEPZwKH2PORyNN!u4Ch%K zD~sz_RNP6wer9(4eU7UrchKU^77wJHKG*4i9fJ8BAGx1SQWLe`lVo-4%^$VC;^Gg+ z^MQQ%5cPLa*Kq{fyMSTr@7<_&H{mGK3t7F9*<8Q7nX$1c_T64MLUcfa-S$o?&|p(TDakp!%HzwGN}A z=HW?p&Km{!dmp@x2T<*-LzQ2Gi#Q%8;$+JAz+W6Mt#KRIvw9eYWv~~|JwezLAJ9Mj zeaR-aBctYW^Bn;--#>D?d47XB?w^|v(8K&(xBSzVe#GLPSeNy<4zDu4m8j2A7NGu) zX$meNeJswwVW_`j>SX!Na6akvEx(547qR>x{D=GumY>q{e=&{^^!qKo!Mpeg&*4W* z&$u*if%qDmp!!)8)z3<(e&$EDGY4-nFH`V3jzQ)(%gnrPekP*Y>xbH(T~Yh99cq8p zMSad$9Mx_?%tU%RjKcXP5#G(m-z8y0;um>1?^FH(>hJ1Kp~}ri)el8&uMz6+&TFFn z?z{v>rd%O>RDkO{YQLvN?e}=7{r)|-+wWUZ^_HQxeN_9?F#`K_yyf@8sI=R~^6Owm z`d{MIzEhA-+NH!k(H?Z zHy?E#nT0x!OvZbp55Y;K_r(ruuLY`JRx>_!=lJ_jD8T!D>C>qEFx2rm2bDh+htp0Q z)b*?m>ig9tQO9|FoJPMsFrJq5|BSg43v>QmhhNC=f~)9XydqrpiNCOYeIMr;D!zsq z|IMOqoEK5+W+}#I{|&OZ1&$)UfzsJeRq+u0yF|PH;T()b`4H52$|`1kG!1s`)Ztwos%?NLCFO>q;vT5)b9BT- ztc%#F_U^X{@Fb$#NDRbE=!br&>tr1BXKNP^z}DQ?{%YksW!A&$+Y4{b32|{jZd`;%U_Omzbfb?dG-kbZzc?$)AThzqLo@S48!L2S86^ z;y<-q`>#;#KE=J9=MGvt67~6e4^%%2S)3NN{iryI^UTwlF5Y7fMQyK?#dm7B{%k?@ zXDli|KkB$jfodf-h9iA1>VD;4)b>ZAw%-SJzOSWp${nNMeQ9rF zH+R3k6fbq3Ll!(9(opnm^hyg2}M+|)+hhvdU6m=LvIzI3PGxCq;^ z-$$d$x5LS-zmllu#$5Op+wn!!tKZYDp8}|L>uYgjb6CFs&tvNKN6kYQd_vq7_4mn5 z@fmSFjFF%Hj4D?apOQYhFXLhRpZhrTn=^a6_~QUq{v~dr{3DC6;(Fr0QT4y{cg{2` zPjL4qEdBL(mw(>ejYG&^g}Tp~imEpfRj)Iuy=rDr)O|*f znG7|~1gP^=wQ;U|MKhzB(EL8umoG?Mq2l&^$saq$RZ?kmchi-x=OTB!8)!>m6;-F9Z7(u2&SL)`uC zEL8f*!R8=$e(7Ll+v(;nqnQS^KayZ0`sHJO+2P{L*pl=ksCnOsb%@tm{&LHoW%*Oh zrkIm*rO-QmGr$aw&B#Bv-L<XwGQ{uK3H$`o?n#E;M{mY3pFb!tL4_n>+;%nT(I=YW-NWX+y zZ-=lI@yX2r-oJlXW!6BAqw^+bYcn@$oarp~U2U_FKV8?t#IRdW0;@*b@6S~eq3Vl1hbdf+$@1LDOW9w{Ym>*SF&AfiHeh%i&wa~4wj;P z^yMyIu!MdQA6yXN$%mcIu=y^2^pCSC<{>}kJf5d{KVRZ+jxXBZI@k4go;lL&Vpc}= zul*c1?z6MqxZlij_YKQY+mDEP&b>0z&ErB;{BgS5kI(Qs`{|~|=kOcxI*XU$XX0)a zx4}=u`7F+YzlbAQ{Cygq6A>Rnt1!?)ObI09n^fj zK#ljH#oJKh9cS@i)OeHccIUZ7sPlOO4AFW(9eSZQ1=(# zcDno3b9jUJFzP;J6Y4%>E~?x-+s<^uqcsD6FjU-$C6!@7m|aw;3DL-U!q<`=i=xXZe4b%`Cqz>U>fa8)A0U`6NE7-Z%Q8 z_Wreg%{51wy-@X9qUzN{U1$3J=eFMsa}zg2y+^2t)0wYIsQZoLxS2QuYCJxegYu6L z26%GeG;GBF$d76_Evnqw1Fl>V%uafzBkp{3=&(zQ0moc=U0hCj8q|A`8%F~? zONck%3JgT0pP|1iiNBn2{k&lwGB=wY&$|5D=5ce2`Tm@n=jWJ)dANjHH(OBSUy4~t z?~Ga}mGL0?NiVqk$Yzt9uAMrldd1D;sP-b>aOoef^V~!`Pf_LOpx$?fVivZO!_xm; zbLFm}^0%Y%AF(~{zZ0nb^g`t?xb5yAs@!qy<}y9zXY#eZeoq2C*=Q&7W7p1-M=q{y z_Iv2kyWMx`kMHq$F~?=p_ilV1)b?M!bL-$f-sW@NYxse2o>q+i;Vsg4V}gRLhu3Z% zhre?5BfWH9c^=>iqCY-gIiIjjAAWJ;T!~u0l~C(i(*v{+ktSjPrsN*8;H`mXL*6vAb zZxiaiZ#C-vaJHonvN&@1K)1bcfu1UDS*NJ&y}`=FPc6QMQ`p{Ri%;NW;uYA0{tQ6f zCj?_-OiQ~OPs@0Lo-%BAVyr+qJDNgyh=ARrc{?D9ie$4LDYhek>$FO*9kV_w7RxoE43G@V0?o4540&`8# zK=1lkhMLDIsN*x#;^tVGdPPvjS0L(me_70xzhL$%6R3aXmZf9KK=1Jo7Zo2a;e1)# zrAI-f_XrO39!IaLy6rzg9Y+^X=hLHjo8x6K>Nwh@7{l-u>5Eav(YlJRe?F-CEz3KH zl@0V1V>{pJS5bUpuBzkq*Ol6CKkh^A$N3hIvbZAZxQb@+qFQeMJm~8BdjmCJo6RLy znet;$^Vc3VU!_p*3EBH%Ges%4QMsD(z|f7f|Crf%WLmCe-*wVqKgv)@^S*YWu@19*Ek0FVyxM znf_+CF)sZhvD!O=YOm#Zx1N8FbL;r}MAwf?sD7M6wYLxT{5IL*E*4j`IBb%uw-i-x z9;)6X)bo7@)c&Yq>3LE8@VE5*lU=>+sCvHUAM*8{=B3rUX&yDhtllE@rQB51`?&rV zx3#zqCL@2<6zeDIesdhEzoDr5El~9fSe)JB)TsKOQRQEw#&gF!gBs7}sjmHVsB*_p z>w7KgIGv4pe=!tQzo+HbwEQBLpWgD5q1qid&9&PH)oxeRd&(B57a_s#y>9 z-h7Ml>Bo9hdn-}b`|8N+FlOSc`<>-;jtIxZqIh-$sMTkWaEXdUTsvp z;;4G5ERK)esrPz;t9Kk#uht>gud1kil|{{aA=JDkxBNtwp8$0p2xsZv|8wy()bA`D zM{R$xIm~Qo)-cZ>aOKvRNA?GL8gieJ2}5bW+CCSD?G5yFCGNN<(9;<+Vkg|Q+l?;_ zbw9KKPxHHEjZoVUG%xI;U$i?DyHM}ePS;L9R68kA`Hgl2df$Wf+3xDMFe{t+%mCE9 ztlI3((`Prh@>|V?=2$Zl>i(#~dS}{o?z;JEt#iLQ#%yBdGB2!g<;IvE%tL!)SG)9x zsQaH*s{+0EuRFus{#b~bhr25Sz0c31Rs?!FP;T+EKu);k@9b81! z-;X-4O|iI(#ru!A^1D#wH=@cfK%LKqq1I7LOD}_(xAc~N^SG;j1y%nH>iKmy>iKoO z#S1K+i8?;YoOb1lqPCYAwa%}ca`Cp4fu7dv&m1S*I)8h{T@PO1SdPz1*o}4`o_FbY za180|&${$gj{-eC$j|f8?ca+JTs*>Db>F2gx$Dw>QO`B`-nxDTp|0aeQ1=1x@iy1{ zXsG*u-*4Rc=p*Vr;1%jVpz%w0d>(q?>SurMjPfkd)06(J`W)!#jSW7z^v@q%Jj1;3 z!KJ@@=h8c)`t{h8$UDEcQT;lJ>eqf$zqXKV18ZzB!M4 z3H0=(KSi+*rZ!JRbnRV=NBbuA8Uk zs5pt)D2_`{5zD1drM~9(bQ0H}!>IXPi<;kssQI0Rn&0t?aVTnj`=REye}L=v1%Fq+ zq@VMPPa@9Lc8Abk^ z46ff#Q2joE>gVJ1u3k6uPdXRRG@qt*aTBv?nna$lv{%b)n91dP%qN*$yvrPKw$19& zW19D}xVV>D&77Mvk!J$!|IgArhS$|?VHnBW z>9~nFR$*_?|ET}3khdo?pO1dPNVpPpA21Ac9}t2!F;WrN&tK|ky?sJm$6wG>>6C)=QJ(Zam2_9{t}g z=Ixn&LyWv{4vnpzPi{X6QiGupxK&;B%Vc#z~T+!RJQ0-Un_AJ2b zX1Z$Lo`-B_0@V2+5Q1z0d>V2WS`mI^Vo%hP)TH;dpkNGQX>3MJ+>3-u5Ul8>>iU3PbYep~!*K_SQH%pkw%%yCfwqsr+ zHxH9h`*#>>{j^1`pW3MXS;pd2sQvwy`dUv#8hd*-Fn>)^=c@*&-#7ee;@bU!TgiWH z@om)p+JHJA&&ROu-{WQKjm8-`1btW^ZBf_fCb*3Bx_F3nnip5mPGr1*-{^M@^Lz$} zG7g_$H;*My{WUgMU}y5D<1Vc;)c1yl;SS;=O})eZ?{ZFTOSvexlk^wl_uxD~jCcm= z15y8%rVsM}U;K9930#kZaT#)+_IrR@{{@>l15n$Y2CuL^aZuy0Y58R>eKn3JeYbfU zM-ksPE3|O)TMG3%qN3P}^_1D-bQXJ~j=R{X<1QTP_ebBGyY$zn^hc=gEnUYLZ0}*q z-){NqEPt`(4?z8Hs5|QSM4eFmG()vl4@YwzuZ+50`CEQw%TI-4$WLVXf7q@TjK4eM zJ4So4Te|IwjM{&nN!RblUg1>c?U2PgaT;-P%4z-8Yvt-yL)FWPn(u^omvVn8r}{Eqf?96v{uyNPqizl17x8ddH9&LZxBizz>a`Wjac)OhaW zQ_`7`wqJFpVAL@MPgKNlNNBPaPI|-Y!9=e*1 zun^~Se=LY`I(vuxpFc0W%J_a$U&rw$YwroJroC)k+;u!H?xvhCM&!Jb2z6eGfqzJk zh?7ZwLwg$UK72v_s-)|89i{L+adZ5DvAenb5Dj%*iinRH_n)qAd)}e$N1x+U(jVbQ z>Rm#W--*vi-(u-=%qgh(7=T|XUk)!}44jJ*QP;=MjH3wi@Dz1^d4O66=TOJr0o=oJ zz6>>QQ&96ZnQ=~_oiV8K3^6;KP0RwQaePCSe`o0z%}Cwd_>1;%`T3B4Y2%j(o3h_h zpnm@m%Z!Se$Dh>G?_<88%DqPIhlhBc{csBtu^%quNBTX2Dz^hW;!Tt ze*=DCT>UWYJ{7fJ@}b7%jXk)(xJoTZ`_ea*D^79XJ<#VFq#HjMSFe%%y9JM`B zLY>Ra$%9?J(WrWDa1*u|>aL&lQR_CyER9;X0jPDG3tO>HQlQpNGK*uO*3ar8ZhyDI z5#%?)SZrraT+MdGM%Dj8zbgL{wLWj7(!0~nPsY7_m|H)a@fUGt98I}6IDm0nqMYL6 zI1=|*95~$dpVEwEmK?!4qFx--{&+;X=KTz=qy3Gjd0v8==TWHnX-4_KE`dLc@H&z=TY-_3RV6v4kF%%y1(9u+j;*o1U0V%Q02O!<|!A( zrN8*-Ny6{<7?<)Npz<%G=JBwl4`w_%?wXd2kj}oi;CCbOxho4?KC%Eqpp)l#=7g|VAS=XKk9ti1NEMw1?v7J z5HFCv29uLsb(~wLWl{ZQ#Lak{{1y0=SmWJe`HN8F*)hYlzX7#f(^36SMD6eXW*ZD; z`)Xq}<}(mgKDGI8y37BG%71{We+Az&zNP4eHBrZH5xk1oQ0piqY8`o@#$RKaJ1z^N zj>}n7-T5dlYCC*Ug{XlbkD2?+qUP&&9{g^r-T2EnYU!#lunc^O$i_{d=MMe>=hT ze;3vNepLUXQ2p#1@9HlzW6yN;!=dUoK>h#usUq2x9%Q^l zaVYr#sN+2s>hGv$LEQ(YK-~`|Lyb2fYP`|RaOSUBF8#Cl#=L7@GLNIidC1}&=0?wM6^-<$1 zW@bi>D+y{`yXU(7xDB-**I^veN8x4SE~x8pbKI}>fU2L+d`CM|DfbxloIVe?Q7+m% zSI-Mo?-S+K-gIK^mr1DeaK`yAPJ?0RWz>0OfY}R&v){U6LdI3yEQ|?=OD%Bai=xJ# z4^=KLYP(~b&nd4s%0gG(3swG?!=^9-MVJNMXueL zsPqq(eghNHesFG57O1nb5uKLtX$ACw|@$u-os=-?bokX{{m{iE=29u?x^=O z=P0LnJ7jK09ep}8ply{ zm$@3>)81T*N0|f6uGpMlcntPgX-7H+~u8)II>$WDUy-KM3K-6_JE$aPZ0{l(-9#p$$*SP!b9r%L#&~d2x zLs9kHqMmQkqxw&Z>i;kGmH(Ak<)7nU+_lzSe^+Bh#y=L7KLC~A8P!fRR6Au+?VMd_ z<3Qc_kHfHWVAwcN_wVU3Y#bOi4y#{ogIj0CQS*=ib>Hx0y^F7-;-jeFiL9{nuBd*R zp`L&8<4O7Lr{6#sP58D#!xhi0@JH9jFCHhH>y1sjG8|U30oA~^M^sA`%j~6f(^E?Ab z(|!qTPkIXMQGoXrn2d35q5UK{8$32Ha8E+aRTE^gn8NSKeWG*_&w@) zypQ_a=OD(!YLvT0dlm2`{)ha&)NdfFUJq2g+S{Eua4P8;ERJIFJIb9R{W@;K<~!YU z?&BS<{0;n0dTY$bxT2VccDZ%25_LVDh2xn24tR<31yTJcM)ey5zvClZ%Q%zn=J>%l zcnTxq94vvl{~w59+ks){qdjh(yixNM9}6;`pH}XTmAiqOr>^Adyx1CVF|J_D#C-3u z^i6o1^wpS#^s)Qgxa*-W_0w4##oWA?_qOyKij(mZ>1zK4-l3g`sP>ERcjL~3Zz-1* zKVnk+fQb%xdjc5uU1GgYXoLR5RY)&`%Ta%C@PFn|yvpAj46(SQ#Vt^OXY7=jM+ua0%AHNmvuB zVs-RJ&C|D|F8wO1+-6k%RIG;n=IkSGd)u(RI^UH;{hx;AScP(v%+Xkt_z-GdZlb;i zmgKY>U+42~KUGGJFE^^+jOX0AC!TfN+sO<O=9lhxKUxDhsH)`FLK(&((ztT=p?89~F598CgZldCiS6q7w zu`cPIEpBFU8PtAHcGcT+ABUpi&evQ&X;6RvFD@Qtzg-|-?aw5xgr`vFpUBtU@%x%s z|M$iFh8y1((lyTa_=$1eN6pJ6)Vz$u&!qQ6m8*qci2p;)OJmw8i}Udk;~IqO*Xt(h zg5x(K>b-O<>`#6@+=vCRAKRY?&-L{b>V-|IHw9bZxNtsU$NOWCkEacBC~BQm!?CnG z>z`YHlm5DOn+_{eE=jOM5@x1`{ z<3Vgq`HiUc9)K+|7TzL%|4+&j&%p@T1@Ez4^-=wmv^ckU=7($dIBI?DHiuv{$|uE) zk-3h2=RSaV1nU2(bT%vDI^q(j&(pG@{{GpeZ{D7+lwXVo>AwSZAr8XM`1z~r?}2$1 zwO_F^eaV#uF93IQ!r!TI* z=cx8?VmH#yS$qJy5^uD4K9(V#Xz>92kGPY?!Km?7v$&Kb_P01AYJ5qt9LBTs2&i#> z`0U2<2-_21#vnXn>HDx9@iL2NU`gW9SP4Tcy#rPxZe(#4)VPaVoCh`TbQUK@ZFdxl ze|~b?{R%ZNcd!fjXD!~3+RhCYFOtNQEgpv2&aM_W!3xAxEiQ@WiSt^V0kyqJurkKA zbT8EQzWQk6z!Jn4uofOft(R?Is9?HXipSJb$gSzJ>Rm#{c5 zYFz0pPJ$X&REvMTb>n)CHA#PhnxAW^aqY8s0~R5kW${?l{DfNE4b@L;tc}5zULDn6 zQHyh7Vd6|!2a}=pV{FS0hid2R8#j*UsQOndK8Bjd?N}E#So$K=ct=~@4+{}@M(yWd zORtXF&!sF5Ky61xi<6<|GrGlpUc32xE18%3sPSE}_z-G*n=M|78s9XFN212n+2W>H zkhm7s$1OZ>0e_p!&-(uMOp!&aH@gY>dt1O;_`H3fDBMe1t ze_zXQkE$PRadlMvq88`EK;rb+7!#xF$FcnIsPTP!;l}drNAmcAU- z&jgD@QO^fGFqrg~mR<){zoNxOQT4J~oE%jz4mKq{9BO<&pS$tAmc$P%zJwa@af^4N z#=Fkq1*rZ;THF`aen-^xt}&|pI+h=VTHi%2&V|~)87xkU+P|?Z_DJF{&)oQ)p~iFF z;*+TH?6Pn%5 zYX6$WCs6J0!78M$MYX@o@@Js7f1JewC2@C)TcY}_Z*fIb`~DVZM78gORY{MDYCn?Y ze}CfIe}h`@_fYeB+2W(9?b~JX8r1eIw0JVAzYvQ%p!y5OW~5g`^;h2V3!~c4ZE-qD zoXp}FsQ$uP{OPgVzUQd%-9+_&%Hln!{+C!h4b}f>tU-DRs{ihm-xAe+eTyri=C6ds zc~R|Wwm1c<{RkF+eZ+ee;=Aa_c+R8lM-HI+*@+tGYE(Z9ES`jFcZ9|LQ0)d=Tpa_5 z%b>0UfvEO!S$BF(DnBM{fX~jJv@u5f6VfCpz5!+coC}p7>oO3UgD;x zdi5>6B5FHISezF%UzsiTLA4tfn`1Of|NX$V{{S@~moN|c$FL!8NA+zN9O*Fl|U%c1I*u>8CjHZF^OFl<~FM?$st;=UWtEzCuH0@cnzY=OHhe+{bq z42wr&PU0r0=cCHllDL@V=SKCH(c)yN`d+B^f8TTczQi2Fcd#Sv958!g2jW(^lJ}Ga zQ2ltLp1-c#T`kQsVe8PUuSq1xtcnY0};1f3fdZ_mZ>98;TL_@tt_((a$KO*{s zy+?SBvw5F94KLDuE!6j7<3w_?Z&aVK=lvvRd<>?YXxJUYn?Iwta$n5%<}355dE2~Z zUNq03-Y*`(cRa`M#ca&`MpS=euon(OJ>T}UxE1Pou&Tu+P|v3Yu@Bo56IDMP_P`&J zogc6#@e@@3MeIxYgBXH4u^+C)!8ijC^Ijtq2NHL}*7VZ?kC0vi)qYvjJQl;%tdrb0 zgxD7c;UwmDD2~LV)a#1_h}+^YY=Nt&R}ZzHD&jKY63nySFO5ch52QKj{btT+K4G6b zY$w)wuSTqKG)29qsgI$w+tuQB*q^w03?I)p-n;yX?wn;#h)KWHAB{iQ58W&dws=A; zpRo6dRq+z-84BY!k-k^M+Wl-8_6CR(ntIJMB%5$GQyQ{}iG=FR6$9$$uD^ z`qZmHJ*D@^=HvNA`HrafUBUR9xRzPoEN1$f*-_;)qUxux^q+pN-N#v-J#iTQ=E2_V z$H>?Rt7Y-=j3WJeX6I6~jJYC{tJl{oXZo10GP?YoxPt8*ilMZ3Ap`qe+nL_SGXneL zNUVt(M-Ci>ozl7T|I+$+{^jBS%Hwd-kECXuFusvE5M$tA()Xldeu*1kZ{os=F%W;U z{V_3wI7><&&llQDi8?PO#m~g?ERKSoi2tPU@qEOu_yKR@Qnup)>U?|@b)MdZx?ZeD zUEh|V?n9=c?oY;}?lVJC<$I#aw?mb0f+}AVRlX9cd{If>39FK`g~BT(DZ8nr#m zP}`FiwLN>2_;}v1J=^dtF2{Gc0N-OT)cU!W*sX^UGe2s+b|-TCd#yPee^YNF{=(t- z6Z>JN+i?wt<9Qs0CvYep#MW%@E*wI<83$t^ zYQ5h|;My5$CNz)6=lo2$dZ>ARmE9fJ4^YSTZX8E?Ssa6TaWt06;mQ?8oiFO=ba7Qw zJwF^vxt-*z-cnS(0=ZndoTzfqQS-W-@;d$|ppM)1xm~$MsP_Az%GI*;3aI)WsjuTZ zV;+|u8`WQk#Z6KDCdljBi-v0NvE{$A^aqyS$KRFfgetccwH=pm61ERyo#P!0`#lU{>&7GE65OYxBA!9HTo@8gzq|Aa`#hiy&Lh17en`dj5a$x-#W|P>H*)<*Wci<{ zKb!QII1BHh>RrTLw7bvZO{jYFE$(k|TRcv^U_6RDX;+^wEWty>Kdhf;c$)X}cg-v2 zX|q~k*M3P<{~2+ghtF$p8|}owt=Jmp<7iZSz0Ju*T>Z|d^yX$Ae8d0Ks*H=NR}vRt z0bGdLaRH`5jXMr*A&zKnrTqZz%a)+VwTbj~OH{K#5Zsi9#BmBa7)iq+?7j;YOe;a z!4|j{r&#`aTu=Pc;tP`a1a83aC44-aF$HeIHW;>EO1kwO3rn%SBjak;Wo=x_ILf2e zOHtfGy&M>}A1%KFZYO;ys=d*u{Sk^PcN}*TzrbBsy_72#8?fxS^N&Ff$e~(b}Q_=Es<0;Ztp^l%~Slf&FLhYwPc$)lPsN?Fgr5{DD|8V78 zKTnCZ9chU5ef!whu`kcPIDvRE4q&?v;sx4?8RXVSM65#kU(&ZSA18^`&N9?_X%=d{ z<5B0O!Km|6PfKr$Iv+Jc)hlo5nN9!lKAy|uKPT3C@(A%W_Sb%#M!%c!3h5OUW3CE5 zo;&>iz9+;_iSOew%Izine{9EOyhr)~yo+5>_3omci>~56w&Pbt?qeul6mO9q4t0M1 zO1{p|)hfC5y9o81Fb?&cum|;b&A;On%00#dn76VUcMfdNc%E1B3HyHMBTPrU6SdAa zqSpB$)H)xCTBp4%y`81kLapbV_yAYYuC6nosPfsXy7n_;M%qtfadON+Tnh71?hxwt zX4|n7=^HQ(uEbP4CyYb2+Y|Y`*RKOUU>;gvX4YA#6@K`v$?}~4T zZ{b5pxna!fRV>TjnL3Aho;iZ+=yxyPV7|7Yu6J`#$4!XE9Z>tV1+Jxh0BZmJP&)0z zsm^{RUWGp*Fpv0>I1eUeJ!ild#Ho>~^8Jh&&pXt3_SEq4ydr-lW@7tVnt_&HvL^S3 z47QRkC=b$mSDlwX57k1j@?FYBWAR|(96pD3^M^A$`*yc2zJBerDz#-i5C zP`pODewdr|9(bGa`PJq4d3?y!eVeQm&_pkl%F7OcQ1kJccJ!WS5Ai?J%hz}3=aM*rab-pIp8(ZgYt(tRA!-~K8u)l} z;$h5zA*l7&0kv*g<4oGAgxSgWv-FHOgY?(5qxEzTRqq0--f^5x{to<0T&kfPSAHC? zabXtP`$apMaZ@9=-&Wxi@)zT2_TOk!{Tit2MIluCd2ll2{Ln-Fv=|p~a`x?(^ zRQXVxMERchnYbhVkN6_xm46JE631!cj<4w0gE#`7<~_%c#=JM+dk~LN$KO5dN&a;_ zOa2+lpNCQCe;`K2CT4kzO1!(NtG^BVQhz-@q5cw7`$H{%Aod}@H$Eo6gXPz;{OTA& zeg#zj#Vy|tb$&{Ry~$6Gu`n^}{PaGU=Ro2Y7#km=(s!ZONo|aXIq*8`Divy-ePA9U zkiHX3Fkj12>3z%`=tcfx`pL!p+45#?JLjW*pE?64vp>h8?)N(3G~yPh>qP**WPP8) z`?UKTHJ((>-Fzm+l*F@Jxa;U-Y{B@);$GSrhB{u`V+w47DqjvY?+2-`^bM%%L?|Z5 zn&^u`sN=i@HmBV$)Qd^{9An^pjE?6~$Nh24Nx8ikjr8v=-S&RM0;Io2?Ux6r{dyX; zUk+n_^7o+Te=BPK$D_8l4r-pgQS-T=jca!{=A!%*JW0EwFnnUZ?|?dw$t4{u@))On(EJJ)Xzwx!>ac#D1mQQupS zgI%}|cwv8h)Rz55{oNRj>)sO7^{*Z#<2q6u>)c6XZ#+M1FGOo0!z#hKq96I|FcL0DwLjHtgNs-X)$t?sDxo*|Wl-ZPVR0a8zH^|)lLB?W zk^m1<|8IL&@08|rsM8?iR&i&6c|!5YLwgR8CVd%dUT2`{cR`&8+G8!| zy#?0g_^5|EKKxO~M*`HkxWl|_9sb57Y)|9fE-sEbuLNLa#_xx-sMimZQLe!NcRsFx ztLV2P#>D^dGUalk<}E8~eWx{(T6#RxI*5t-ecAZ_?)*?R#Eq+BAKoKSFSnW0{7e5z ze~n*h|E_reYcS3+w5Rt3eNgwITT#zhYjHp0x`H}>Pos|8!>Hr-)75nAJq9F66*T-VUW9izCc|+Z=kN97cd9)CZp~*s-v!VHHW(MP7pRDzc@C+0+yZ| z8xto(J^#f+J^y*3uIqP(xa;~^)H*tf4Jf}4_b`8JP}lp#sCv^;^#&=QxHYCHu8XO$ z3Z}!NrXQvyem&U7lLiZ;?jzEo%0Fkj)&5b&Gnwx!i{kAJ)2n9?Wx4t?uposa-;Am z{R}|u-!_<)a`o{J?UqAre?ipzpF=-9h}kgLNY`FwEJ%B4a4G%zpz23M)&Fhvw-al9 ztj9c*Ux7NV7UB}>jY1t)?NIk42T;!s#YS;Hpq)gR3u~j&kB;X31MTg?{JE*7qumL;L&PqH?JIzt=Q>vk!JA$wS`5#c{->azS zmQ%QccI%FF&&RD%=evct4fp-ewZ9F!P=7rhrTrDC`CovYNuP;vaT4nIY>#>$-W;FM zP94p${y5^LTwqUJp%YTg&1 z*1=xXd$(uiyUENe^YRiWFwYNBzh}CNI*(t#XtaM4b-q1_QHgiq4CZwsYJaZ5rCgVm z;sDm+EY$sQTh#mNrl|MJ3Gfa5beiJctF%JBSDAylFCCA%AH9qLjCUt$y~msG#u?L$ zf(c3gFwLdEHlLxk;~pj^{~D^?eoTN{P}{p6wXWuwV=xiglm}hRv4e(-8DkJ7pjXP%uhkg&*v~%89(PYzaBH)`KtpiVP0F}S?0AO zexRgwe5tV*{be)H~6KkEd$5gyuYk?d1oU$GUs(sXU4M)wxcf7{9 z-eGp;HPJlx9&0RW`#PYW?^>X?ry*9OUKP}RO-Zap95mm>{;2!H%&7B!5>$UNum--T zy!yR?-&ZdxZ^Glu3_ALQ1@|dP|t<6 zQTJ~Zu`2gPC9xj;j9BQ#*$=fnol)D@3N_BgsOQ+ysB!w^5Bg7wH%L!{Di_uKM!VNZ ze~c=B8#SM6@G34rZ^n0(@;=PKR;xVZGJ_L)B-Vaxhehu}x={c-O`f=Pu`W~!6ycIVR7hK}%2Vi;9 zbKphJPe~=$$8xCi%Vt!2tFbcWmf#lZ&spmB$8;=4`b1Q@kyw&A6jxEMCzc@Yge!^T zU@hXPxRdx3?X_mR`!4hG)Fizd?jXG_)*x<%>aPK+{Tlcm=@oGe>7}qVabZ;Ze^KSW zVp-DP;X2Y+VLSR6y4>aW!!qRez_sKDVSDleQ03O6+F6cODYpQ(QSPRtU&LyppTg~= z|3dv;vbR{B^qVVO{fk&h<#03QmS7j!Z-eTuEULc@X6ltLeJZNlV$^l%Eb4k5Wfk{} ztgAYx_fOUF0M8RSQR^?O#j7lTA=ab+ZmZpWa%&7G4#r;8&xyM4Ph)YCHGChA*bDXE z?jz}X4tRo>@ruQb*1PsqSO){KKIX#RY=0Kix=oKONl$^VS$7Gr zFZZ<`)b;fHI-ak||A4!wcLt|0o&>1lF(RhNFKb==8g-v~4Rya=2YX^p)cth~XKlN@} z{zcS%_bW5fMpv)ECO5yiaW&<$;&tXPHtKWff0WZa=0R;|J<|1g_8ZiGd4h$hcNdpY zZzB$-pPtwXzu_=UyqWKlU_{jVY>c{oR7HJXAP`58pTpu&sL!W*quRTKYG*Z$!dci7 zU*c#iy@mI+m=M)YRExhHcI)mvPGy`gEPjk5iSMB9E3TvV#|6~qNGDL+w@>+$+m1)r zz8UzK^ocl>^iini;-NT(xWDCh#o@&5@B{fRaUyYJi|gTN;_9f+Pb=Ya;xefHUKBSF z2jWfo&4z=BGvHLN*C|o!J_&kAkBd_%7Y#M;@K}WOUx#Ry^v|gDcNj|gb9~NmbO-f( za~KDbz6VcIekZ0boDC&Bd2X)_{5Vf8k9(3#Z4n8K{ zhaSpr!jJ6#WvKhqDX9Ca5%?Vk;y3Jq+8=FDpT{>reGXO;bzheSk6=ptf(cNczr@B- zjQjQhzTZc@9lu56Jre4^egf*gegx{iJ`I*;ToFwsgt`D71*N0Z9>%d{0g14{^HazX_QzKzA*43R;&Jn2VaW~wGtx(?s zse-x>{SS4&9Dur?Oo4ij7Z3IRIR@(e|B#cepC+jL-b|=^smw&E_aEW$C!RUs-h+%p zrH7akkGt`FJm#*~TTs`JnW%aLQT?~TbTg8I z3_^{!H!h}p2P~&?qK=O&mY)U}lAjRglOGco5Wl|2_jvFLo}r(sc$RvnQ1dk#wcY(t z{dGk3*AnMbuQ95>LYAHv=aQa5`J^YuImA)%F7sb-z#sm(flDF2#(f_e#E~_ewXey7W-g zb5kK)O@0Q{`=#W#2&19q}$9Eh5~MyUDAeBI4UYCO+;yuIPp z+Y3z1I3A+z8*ZZB-(Et!zdeqrh!5Z#;;op5cpXOPesVeLx;!4k)&pw%E9gi4_D1cu zx~TP012<8>9BLhu!i~gfZZR+1FZ{ge+G&isj!q90GcX8avc@7G#m64Hb50dZAKMw|pEQvdB8_x%496<@#! zxEFQ)-GuraxCZKb#gp&3cE@94+UbU>R~q#mp|Hi7QSBr~wG#s?^FCoO{f;Mn6|tTR zmf&XEDSe;&--JAG;1;E00@nRl)cc(Q=;67c7wY}aZQM(LwIA@DM}Aq<-@VF=(J2=j zdr*IX^7))C@k7q9?B~(AlldEpJFwu3u=}2b8J;^6J#(gi>b&~cnf8%0F-D^QDCQ5^ zQG6dS@gCwRp2Gup5trcw+(JL-#yfqqi{Rzm!sOxT!rDwDBuOHm{e2d%Ju4njw z{csa|Q2q)&BtE2={k95^ao;@}^*KX7^E~}4K8_maeseo+qurGjFEopObnO>F56_*c zQ14^TqdxE1gZjK@4rbwa33d5?jc^C+F!3js{@c=DSb90qchTQm)OmLTmh$EP1xsTS z)I4oMmAhp||H65K?fmrFjq5GG<2mCtUQEdUZO6C7oA7W_KL5sO`FS6OPpH=nA7cg7 zJf*`&ifLE<48Ui^ZBg}R;TiVJ3)K6;J*fRN_bbocQFuR#8fQ0LMt(j^&xES?0}qn^ z7K7NXOL&NWcHjlJJL)$+_n=&L^x`-xh&oQQ;inW_4>2<7oA5H_#(j6|b1?3wokn{ppUEvABoyDyaHLQSDdw<-CT68F!7}9PgMJ^}DoK zSd8&4M{W01)c9}w;rL~o2Tz^idd&crbdf7an3i1*5jN9%_4w zqvj(MhQ~Ol^Hx-hK>VJ5|FM4p|GMqWg?rhaS$LoEd`6A$AwD85{m-qle5iHigIZ@% zQRS9;`G$S&G#3xh&NSSC6Yx3fVRv|6&qLY?MwLGr&ewCDcnoU(n&3SCzS>k?83l7* z=z>c3H)EpmFVdgtJ*8c(r=zI#bR&YVX9@X7P~#tJHpBewJJuN<9-oB#t<28Irdq+{<<7pS!ZP!G6OZqR=dF3mr z-N&eQFDspPH{&DPTY(QTRuo^)3F`Gl)$4((*A`W;p3ppcVSdqkMVFB#=_Yc2Pa^348;W48`VxH zvkXQiJxO#ozWAu|ML~_@yN&ZYK4D%@;$tjJzSiAFa~bM$puc#Ob@~C1W5O8h7v`f= zOxJ!}{KWaNj$*by8#ZM7li&;1bp*^y{~xJWBs!l1;Y-r@qCe@YEqxq*q@56a$MM=8 z)!tF+YaOpdeQxs2;#(GHiRH$T9zRn*0e+%>b4zcGUr4WrA4v~I-M5^@aQth~y{PS6 zVeuQ(^};*0n~$@o^Xn>9`b^aIdla5vK3brT!*aNY{PuB~Ps#`5S@LV)87z;dv6ST( z#8bqhk3)^!Xf0Lg$p39GiKgjps2lA^} zdU^awdVYLQ`v2lH&+Lc1sQ!}S4g5sD`n!m)@C^Q<-d^N*@C{Dr(i`A!(kr6U^P$d5 zDNyZ2K(&`Rkt-h?|4=>xs{CQ{)lVs6nJBTV|C3nt@1g1+Gsh?O_1xupcqWOjCldQ@ z9V)-0d5-#*h@bfQdNMHom%JG_@kES3`8ufcQBG8UZIZe4GI*1CjIZmzHHOVcau5CggZ-in{LA#?2f@Rq$3mu1BbKxdwe1Ptvq*9V9><_u)~;{YUb3 zJYB?R9PfwmDYhiPDD79r!dMK8;9S)CU>9!WdT>kmJP#bs#`ZG5+wcnGTj1xmryHiF z|58|p`USBd7RcfocHQ5T+1HbX{N||rG%b^_=W9g12ZfrCVHw?gR7A~_ulYKIo1aFg z^egFI{VG_D_V1>1@iJ6?2x@;;vpAjkg7K=~vDrBf&~JZC!FW#PaN9WwHID3B@a4U)z~Gmpg7#WB=YBUvJDvdJODG91$}SpQWDMjXH0v!VvNoAnFNp()8`Hk_LkCR8_cUgq&Qrs1AlKVkd3-%b((+ty zzRJyg2k`+sgb^_-?VqH)9G=&mXRBZk_bnyxI{UXEzQQb+nQ~FF3iJMlc6EO_hxo1D z=li>L7!ONP|10UG@ewvntmpN!`^Y)riaR;~}_l;07{ zr{i~h*oyq>sQ*t_7UO!j4@F(S1F$K_^)}Rbej`rj_+5t8sGq$6`P9pR!RUj9DWA~d zn3#ug3`0GScR=;u81s@|2X$W)zMyZ|bNDA>J%?Y$eB|#yJ%=YJzaaagLm^*JBgR`7 zbzfZu8xj}82I!Ajx#>)a^@*dP`uj=!@u_)!!aAhi#QXU<-=OZ-_uxd%Tg&hX}B>Agqm-=|}T(4t0JzteErKRvg)j_nd{@{)vYR+5cZj*M18m zF3NU=;1l+9M|^?7_z0ilaK3MR4d;1tox$vsZ&8HvS0CmNui{dy#Jc`g)UEf8Sdwxp zEM9nhTJ0iO~m=c!%^euhZ;xI;x;~1y?GW-!D7UBEd7nytAwxT9`n%_pJ79MfK^cQ zRTA%D0N%pPsQFC8L9hLv5Cd3Gv2Zr~>qkkqUq7Pu>s>5B{xzIQ{sGiF-igzR=i)3J zfqH+?5mmmG#g!~BgEJ_X9aTRgP9rYINk{9W6h<$`_mok`Pb}2)_IJkBf^rWr7*AtM z+>Xs~AvVQv*c`iK6O3Bc*HZ&OmGSk|#9OF-u3{AWIjopXB|AlS$dCddydbXn`=gFz~hU4RBIbTm}(jTI>=MKi8y;HcFd0mMyiKkoKkBdW1 z*3Dc@!uj+f)+XMKBl)~2S$SViAKERB^+?~24OyQJEBJcGkzTG5lGohQ9+ zEniPZ;^#HP&aZxrQQsp=i&|Il>$vO24a&D-oM-V3<2Z)3@_T&uqplB4DW~s?*1*_| zYb)wHy8v~aO;XqO_m8+8?Yu=j?{*X?IwC&hwZa^*xohsPy?vwrqrYUtirUYZf-MViZ0{-qC>b zH{-5@8h--phOwKw{Sgh*GOp{*IB#>G+XuUo-yOrQTNY=t_)k-|kL`Sf%HMDCDvNue z_Gb;$eyCs;#m2Oo%S?l+eF*o4{B!2`7Vf@a6xQQ@YcT41(+jU~KiwF6P`@klGl}gvMy$`(_Td5E`)J2(!cbeKEA~S8p!v@QRN2XP0~Xw?ue?_6m|T2;Yh~4r91bf zSQdw3MjV3gySen!sPsKpkK=9}`g4EM2ZxcK8dW~DtFLDS2B7lOq4JM+;d~p1&w)|> z_37;5nyB*0FciOZ;(iz>q2kUK2QYu*iO=@pz6ckh_Cp7=iuoROKD>>39;n;f%}-Ul z&UOc366U8UYMs7AwR6_Y8sh62OZz@J8o%~soVWrjK^*{Uk;weIMQ>-i|)RYw!;7QuHRCg|~?(V>062sQGA! z+Ak$g{a@eJ|90zcIkYdr|#QwRmx;>vy)K{VAyJ9)k~whhlQ#KKOvREBX?*!u!NcP}^M^ zHI9sCQVi=KHLeqbT)f>}gc{cb)Od;vapMR;ZGR5b_9sAXXLMBie+FB7sCXx;pINB( zI$K-|)oyl+uTWp>YZa<|b*#y_whs06{Eu?;%}~^Jr;phlCz4;!;%a7TOOK8^4^AHL z&SQg7=hd!eV>6$*YnaPlh3aRK8GVGi-h1H(uJ^wwACK$m7fi){&O>}p`YlVpZ0V0E zukoKkwRgzeiW>J4i|3dVEdA9;U(X!wA9`a-?#nvkbnXv};WX+!8O3`E(pTY3;^}4| z(|e37_ZVl9e*jf}oY~mY*Nx-8lKc)>ndg@vyq=2pY^eLpS7UizB!7=tZoGRgFM^-h z-h9}W{Hz#{`^;20mvMeTJ$F9DG2EZt!qIphQzYlO#Sz5YaX7BA^w~IycnXfhQI?*3 z0`FrPPefcmfAJ=|``u{xhJJsLK7r@YQ&@}qnW+2W@u=(m5X-M=`IV`+kaC60x|pB) z&_!65_cYV-KMeVwyU#3-ODSIxzp>qgQ1_RIQTLa-F%Iit3pVHeFZv``?;Ww~J;R^W zyN{|jnS8yU8;FVc-eNaA%X^^umcAX^Q12$L#eiu%Z_-aLOiw>qEKZNg+hWAR>MB*w<3xR3mlsQb8g3w%BQm~Vg7{>p^AsOO6(xj*|o-`BH;^cSf6o$;vq z);4Aks=v}0hxTJ2OVlqi{$*SX=ehp+p~h1M_fx(U#%I4r#f7Y&?{g{7IL@QSF-bAo zb9as_zaG_ZYdpia65@Xx?-5Y-?l3Q^w-@!?vEE#0PBvSho;&I+;yHrjI}p!spO_18 zVisJ;b8TAON9>EcI3FZJop)nn36B3k_>%Kx4}5_qu{ZaJ+fetfYf6y3Ayg9aPMoL;Vb6%K4xORPvS@7LwJjJR$&kJ z(-KrWb5QM0#3SCkXGHC%mZ<&H81EC;!F*nPUaFXOf>7;5Hu*$usY=}AzYU7C1yuZQO+!tlTS(pLmU`osxfqBEZ#PM(l!|l~7f|ozcB96<1vTykSb+SQsP}S1Q18|Hq29|i zLA{p?LaonSsPb7Xj%RUn)O)#)^soA_Q19gmuW{qZjklb>=J)O*BH zn3r;cQTy?qrGLP?q`$QEbEtaV*1CEva2fqJ!i=oLAXNSAsB%%)x%KRYdjI~5^r7_s z4jLS8Itln85~CXYP?VR7PO=B*2V|KRZ#u;qxyS>`hTvMsR zsQaT=7T-r5FE=c{fRBm$Q%~dWih7UVPBGh68}<1_1=RMIR!n*URJkSil=U@lqq`1H zL|qpL;B(SD<7RAy*RUMw{8$8^5$C}dn8osaF(vN>V2S}p5(tmwf6|s-c|g^`Dg{Iy@fcI^ywB)MD;hy;sL1s z?$9pje)+b!^JPl>AN7*rM2v^p|Iu+0aRk)ikSosB9t2-SWDyuteyANBmw%_2Pu9_Q+{OLCLkuLog?os%;!d280i@5s{ltT@5OD~Gou{!2=c^#h zk%Z6Na2w?cVP5Xb{P8U1CR$K#>ySEFMh@*|+e^@#aVx!bsda#v94 zn{hAk9Mt%x;sN4*mfr&p5jR3@Pi@@Ax@*roZ{oe&NPJB{{qYr+JL9fbB~kZT1ySS8 zfk#qtJmG2D^TDLvyaz-*2Y#de6WV=`r-)zRamqhLT_0{?V#*JvysjT1n1HxDs{J`< z-SIRXvvNH3M}2R*K4v2>XK?}4b|ytX(j!~?ciNf9_Fcj(q#r=lKTUpS&SO63+`5c~ zx=;8@dTE+?gj%0VN!Rf|4t0JViMwg1r^;&_m|f$r_#lR`j(yK_9b)~)!1g>}m%s-c zpD8c6>smrAO#ibW{`4q~9W)iS;{+gZQ0utSj6Xah=MF>Zb|ncN>)@<6etu zf3n4&Q1xzMR{EcRmGSUiayoA7!|&LzAma|flzlnRp~`2mIIZbx#x{3jdFJ=UbvM47 z<|)*E*lY1}i)WeR%t2-kv$a_lwS5P#ab3an*gX^19c;sSYJ%C{tcxmF47*V-zr|Uw zEAdCh*^YWoZt>j4b{9l#Uk=o~{8Q{dV%Ud+$0CbCcfJ9Dm2n z^BGk6sdssA$98u`y{9c|#HE!K(*5b@ zsLHV&2T-4z?Z)l2H|4SW94HoQ{{KC4zDB)&xn^-Ivkq$B@|xbLc}{?u=kVtHhc3Q~ zYWF0n-Xe1(YTiRFzpJHJFtcFTet6*a!y&B0^YScgOFzRb?vGsyaKC5i@le;%ulIQ# z!+v*xt!e)!^P}_DCsh0x7gBEX8@D|@ zFf;qPu=(e;OMih{hZj)K9dpfb|7YnQpzG+OFbv+yZv`>a9F(GCn|MvywP5S$QDacs-n<2*7Db^R!c z`v1&=aTv$n(vR-_+5b@Q+m6Fx^w$sdzHJXIPF%oDhkD;O0rsaJ6ZuJ0=5QED{Op6P zUqiibdmh!_5!Cy(dr|GT;vnLyOsDJJs!#6wnt8a7{B-nZy-dX9oIiTu4(6K=Q?vd~ zqJ9q$?z20N{LN0dk>>|5QQubwVH~Ev`-SIyY?4o?_0ajNyN_sxdAV<>qnP`;LYR*@ zgT=vEiSb7d;XWY+*AJ{h+!poyd^M~}+#d(CJ}2Wz?q7DJ-g{hwC0O3esP|+~p*|0^ z{>k?>OjjLiV5@Vn?il8L?R&?vL?lC+@euyY~|( zU=8X6F+a=G1NFJDCcb9<`Qx&@{GA!p`-~sIIq##UyMjacys{DX`E@>Oxki~aQJ+`x zV>Om5IqJL~#o`aY-1d2j_t^h}EWV6)i8r9$BkPDgm|p|DL%yQLdGR)JBJ586F6*Tm zZZW5u@qcr_O1>>N#l&HKLbr=I4q<=!6voHXf_xDiN_^Mb$5Vv;e>rM>wMEq%qS_b5 zVR*^QC-gWvg{mLIqD;3IHGK)(&-F1a_M?3w)O~UURQn?y*Z(L~e_8NaCjFGa)nlXj zdGn9!9Q7bPKz~R7vOSqT3~Idl{_m=gb?OB)QZ%Dm7 zUf?`c61D&3!t=xBEk21=i4R%43#$+>!pwZ0oQCSBKeoo$=F})Yo;JkIuod2m?5v17ew#${ z@w6mg3Y%kY)PCrT9oSE!VJGt8up{1z==$r8nl2Y=z8O)=ml!+aPL`(xei(i~ zG@sDV%f)aZ+anV$Kwq4Xu~GAngqrVf#;@)78MQxlA-^S%=a{JZ%r~c5e!Rsua7cL0 zYdDX7ugCE5w5NSa)P3ix=supd#5b`6?nl*UV>=vX^`UfFR`vORZ;J``Nnf`Y%>b# zeD1+&Z0DzO>5q6VYW;M_F7#X8{7FCBPM=WQ=@`@LI3H_9jnDSx`~I)QvO!|EpH;{D zd=Fa&zhM^a$#khO06!+;cnjpbfI7dlzjAr4~tEU4>U zB-HipZbtT7rrV4<@6AP>moi~N&T}zQ`}cwju08=ru-^vaY0htHP}koWsOMsT())O- z)BcnB0ylA=d!Hr~#ZcF; zGb!DAI*7W@*o=c|HxV_yuBh=hKrMe&(;v0`d9WJ!7b#qQ3r;33gSuX%L{0C7TK+f5 zU3?YQ|1MPfxu|*v)O|%J96%faHLl<6Pov3yMUC$ss{iwNlJ(J^{YdXc6i1zBerIvV z`8U-4!v~9>q3$21;aK_^hPrR)VR2*BeS<&#M?DHo!8i0PFPR;(y11OV3-$aqS2j0} z2&i$)!I4Zi21nsu9L;k7M(sC6v%B>%C5IdDc+_}DSlkaa-t?&PCPa-lqQ#$?UgN!k zW2i5}(Ky&_WqNYD{C%cVy$JD@K(1Sb-F#!A&WGVq=fi)6+b@)x$1z<&)b!s9 zItQVat1C{z=4LgssF}s|Gh>@!&5#0a`e)`X^NhLA++fZ#Cz=Dyu4ZGis#(;`VfvXd zOfU0Zem9N_=6-Xdx!9a)4l#R}t;`yxznRlaZ6+`ynZNS6`39T!%roY0bFDewoNNv? zyO~YQYGzS0yP49AXGSo8=5^zEY2GkTnS0E2=3H}vImqm0wlJsUar^Ih)OECl#f?$d z(G)n5{pVe7=R>nCYQJxRx;`ey3BG;^pKU^X{vnx)NrW(G5v8O8ij%8lcV8Dw5G515i)nhBV~e|XBT((?q4v{k zI1Lk89L9Xh{;&Ev_J18$b5QXhb7Tb<_coiGM@*lJu0GfdTgk^$n$HDSiS@ZN4e@*o zU&|--Jz6hpN&RO{7k|aF#BVKrfn_v3ZsYoVQ2B6-58rY z4SP+ z6dwyy_r@E%ml;ycjrTQ1;5pQFi%(m;3pK7GsQ(|dBfjGEQcHY{74Q%9&5gO}HzDf& zctuq=|2bv>EJ!^$=Ets8*l+M>Ww*Z9q2AM3jQSn-4E)oR_y17uix0*GJTK~r^-}Qr zNu0y`-2rSDEobD~eEvlbR-kIWEP8 zsPz)JiK~ajea!buV>jI!)bVi_^}g0w)b`ts+TYfrrk{-Z-nBcfpk5I5cL6e5JuxmP zzq^s^e?4mY@u>IA0#Waobw~Br3bj2eqQ+kcHLf#^Pyg@jgr=@tZ?l=15;a{yJfEEB zV5sH(&U7p3=Pj|;-(A%HaT(SAQ8U->B5M9eP~%%-@od!g7>Rm6q8IA@h&onp)!c2* zJ}unyi?;ZL{iP;G;B#tm42O9n&xJDL2|l-^!0_Y~VHk{Q^$_|COB{^e*rFBdhjBH; zEA(3k^*wfW{8WhdpsgMruTsC%($$ZnJ|FH;%=78FsQo#I)zex%DGp*k{=odz?=$>J zzjtsj`LZ2-Jl}b~m;*hGCn>%p4v&BELkG89cTmqUkKrrw8}JRz!rwR)`}6)}N4!N` z8?`=);a%bkcn9O6-qZNo-pBKv_$8{}D;P|?53k`0%TGqN?}zHIrCAxDX5qafJWcyd zcoyU1RrKIVeBF-coOlgy-~s%EtMDuShbOQH_C z4&UJne1>CD>n8v&5;w*tSQfuw4!n#>F$iPgZT#8V$MXZ9;sd;Z_i-2g#U=O_$KzA% zg|D$GYJTPM7jZ7sa`|8gaYTHKU)gV8;A8xU7x5?VLofEX)p(eAI9B2L&HhgAxzJjy z#P$3e>UT*m@fpX}BYcWCP=A*vYiIYIF%IhQRaM0;9RG(czufXIyZMB^R}~jyhvoMs zU0u8kV-kz6Yv{Rf+%g zb@Tn$$4!3&_mE$O+pvI{1-BAMuy}cIH;$pWn|ufK3diqOP|LBPmoq!=r2e|6n|>?m zJ+jvUuKy0GdTL4jMh`dLD%AXI;V$$?)$cKG^*<61k}o)b=Zh>)3RFFo`KQ0jKQK?3 zy-?Ht3grCC^!v;t1ARO@h_5oeo}Ifk~g_{R{}?j)-JhC|)B%Hsj1pMo04Ak;XvTD;KWLwJ~chGASs*dJ4% z-v3UFf$WD7aiq?#w2R1oU4r;1?dM|v?MC2U-m@Kud$2cpMdJT0LH&NC9eRkjVjix8 zzcDVKTc4udySjnb6Lb8aj=Si?IiIn=wnOz_4S#c7l*eCK5_5;)dV)H?=0;6F2v0Mv zMk8InRq#v_&J!5SbU9G(X=TLs#PKj=D$aZOhWO_Qp8qnxw^)Gp@SfpE@^?_v?MJ=e zwgX>rJ(`0$FATwB%%>l|rF|>Z`^}B<6>%Ahi{VS+w0Ma2e)x_!0)D`EjQ`6`TIT?j4$v!`8%UIAJXm!>Uy{zOL4!q7B&8f_?3D;^e5le z^7U|iBEC;Rt>#PSEC_R}Lc z7qg7xewcc4RJ*uX3u~b6d;M___eUF0``HZCdxMj3T5f(9gyDE~cL-`f?uVz?J`u;e z9x+W>X`UyoMIi_gc%M-fK;R`aNkJe8_YWaWTi~ z&;MNf1{V=OMom8xW7BRlR?W|Gh1IYJ#v$JT7t;RuWY_Nu^VTH37vTQ&AU>vDMbtP` zTKvMs@qU_{?^FE4a^JT2GX5oAZSexDPqla)YX6Ke!>y+X*oy7x!Q8B`AJe%GGksgs z`}f7LC~l*!_l;KK6V}5V?8Nh}{FW~{lkLg&FN|;5KDqG~%bNk;5U0R=><{5k=cm6+ zr{5QT!PnG-QTxqvOpu)W##!#VJ_5rq-9Yrl-WZ>HOT9L)7-<6Iw4HrDSdoX>V&jQW0SHfAONALhYvIFEWy)O&56FbnzCmT!XE zzwXW9evJKM2HwXhn4NZ`Z~@cz!fPz&P3C`y?X(QH@_B391{`1ct%zYn;X_?5*$xQX~G1~Z;U_!+C>Qw%!o)zj3DZ*_jT6Za!3o&U>K!m0^_Do6d?Or#wXI$T z(^4;nBgyB-5tzg3DKQQ8q&SRxJRFMAt^RK(&$p<5$HC-3;vjsDTE4rOiuyI|PyRdx z;t8wo#FW%GVPEpAu@5e>`czCoeLVIgKLP`Apw+uza_VidJNahV4eMLI0{T%eg>S@uJx*v8Rp9tGyY^#SsAL_q%@V*E6uh<&jp_cCfCZm1}Tav$wE%1!h_hM4& z+psD5_1FYgSbZiYp*|TKlOKbPaH!RLU}EYWu|D}$SPvUpy$U9xUKZ<+FOIdbfYmc% zLh7lo2Ki)I9phU)0w$pD!7Ai`Z0CI&{DfM*Cm5glJ*+_fI+n)^RzHaGsPDoumcWr#?~QS&cg3RQ+hGxGZuJ@%n|ehoOx_<0VG*lm#aPtSVSe(- zF&`$jdK8RFJuK!S|7RQ5GYmm3-wTXE{UPQce;c#o6{{b`=+yUNR`T013vRIbLX1Xz z7G@?t1vBATs|R9K>H(O6d?!qgt*u@MqfoDkX~~zvG+4swIWaQzOqh~ZLVAio>q;})wg#qiYUVO;XlF%C|& z`XCHPy${AD-wk76d#g9Vu+(c}RPvQD3YNBdUJOG$8%83Z9wTB3tH(ia>QON~`EVEx z|88;1_a42dzr--)AE7tivHDr`P(LQg@5g^R`J7?(m5RB~S%iPc&&J>QpVf!qU+Vqw z2l<}(9XngS3I3s87emNb!>?H0>ILyP^<4Ocd}jQNX{??Ae^HN#AIV3;59n?6&zrgL zr~Ve-k$;B4cwaI5??wDU{S>|?e;8lk9;>g#@6?y!3-a^vInJ>9DEvl!Fg_*U7oT8v ztGB=q>J9NB`C9k@D_gxNex;rd?~%`rcQJ$2li(NXaq%|!Xm|_5Tm9Q6)(7C|Q<-3V* zs9(Z;c=vM!?f#++~zvF81A8{4FMlIi6d`kTqt|WgR zSKtY&@5Cq6H{mk!t8pnVvHDbeOnp2qB0mBb;y|l+!AI2F;ym)ra4y!jdIfw)y%f$N zUl?a&9;>It2h{y=2Khud9b;QP4Bn^ydp+;}kpGHP@EvOT9$*mlTR4gQWt@m-tiBiT zQQwB+$*;$8xWei)@hgAHubVNn0#>@gaxdg z5pPjXh5gAV!$6F0^$2*Ax(EA`|FMqyFZ_gBz9)Et`aSGL{yO%=3sygf*QxKq9^^M; zcU)ujxpY1=I`P5hmeXJe> zPg9SG<;iXL@rKn;;z{ae(F?9-$r;bCM5- zIq>glw|wvMF!h(1mHZ>jf_JQb77tNBhMCCk$Bekc>MQXe^+lMD{A^5%|5<$)9-!VI zQ<3k9DY3KFo8W%xbul^lYUqdMtzHoKQO|`wJ2dp`C1qmD_gxNZl|6PBa+XK5io<*li)V$aWNeEXc!j5Tm9Qgu1C~Apf~wf z=!K6_%XbyGP(O$Nc#d!!|Kb6wZ^X^iSK)8+i}4rEvHCdNM145^AU^=VV=t?>!Hv|L z;y3d3Fa)bxy(Dg+UI@RC&yAlki`9K`J@th6k$f!tfRU~KYX#R$>R<33`Ctsj=Zaar zo4A(xC458vG`_|oR^N(isISA91z#c=}` zuzE(EMLiX+C7%q}V0^1bz?sxNxQhIbrR)#*3AKDra0c~zxSafTT!t5{eh{Zq--S!a zZ^p&A#_Dr%8ue+oi2MXxh$F4u8>dq5iu1|0!+F@;>NW5`>J@Pgd4HUZMXa6`r%+Fa zGs!2%8JO7WQE)Q#usD_cpC$B%A*khhfs?2|#L47uE5<8UKZ+Bn@52e?x8r!+VD*K{ zQ=f%n$WOu1IM(WcIG%a{jwIg+M__BK*THertKu;7jRCmD>PvAX^?BHx{B-Pw z6Rkc7M^NvBoym8@PT1b+4RAR1n%IGSC2WtSt)3T$QO|~L$*0FQn8NCDa47Yt*ou5O zY>9stx#fG0L#V&RX5=4XQ@msKvpAUgF>FkJKQ_W0R$qyOs4v0>iu@CiSSd#pFEP*quJ_>tNAB;uG_r)UE z-Rdo{7xji%hPawwdR)v)J{so1@K*n}fX@xoKVWY1 zuP_%rMlIh}>`wh0W+#6fv*7`&Z^UlYS78?Ni!n3KvHCddN_{wHAU^=pV=t?>!7kLB zVjA-GFf~@UdP(d|y%44(pBqzP7OVSWC+Z2&k9;ij#mH9wHJ{Hl)W2Xd^1+xCpQD!V zCU&5H2@{b&jS2CH)wg1M>gzBb`Q;cF7g&7~wxd28W0N0(v9O=jJ78PtEinf9Mi?Dy zTfHQhARYjJJ#Caz*}Ve}AZ zLrs_dqWiwHHR}79I`|34puSJtg8F+DA*kb}ucyf$NFSp~f@E^5Zb{y#veVvV3Y>M|&TOqoUe*qo%)d z)y?N9D!&_*Z)f@XxR&W_SX>s@5EntU3%=r}e~hci-?jK0t|C5yYS-EFEpR3Ih89=D z6~tvw?cQH@{XNCy-{nEQ_Zj&vpBs1|$qQ5Ped$l~QEB%Mqv1V_jz=t?nsy8M zyDMceBKfg+C6M>UaS(rZqTW587t?P#yiVR5o3Ne+p~kW4zT4lw1TlWvjYYnf&+LuY zXn%rsTHe33+s$}lKXBv8ix-GfnI}-=K7eYs&U}E27+<`HZd}zd2J^j)TK{1maon)I z5@I~^nQ$@ftDrCa48h!Z7|wZd4$RWJ_b$0V2<^`1on)ca8} zF$Vb`Z@8Y5e~Iev5ymHf1NHaEj$_o=yjO+Ma2e{olyR7tcHLFSdZ@o|Rvlv!=STII z1EUkCMXis>sPzyA6Ow=O+O@lf(TFc&diK{tsCEl6Hu;gLaSy_H#H~^9*)_p^oL@?# zmcJ;*rJl~>E_{Q{D^7UUms!|{$AKET*-cx|DD?}Gh+kdH29YB4?`VS zeQ+oFZm8p`A@*Rui~Qb=!`pmHUgNrGo;1%;*ZU|(FdzNw#Y6PJ1xs+=n2CQmKTO0w zI23>50MvV1-SJlv&KFiMfH@dPR?Lp+Ke*`D+ZKbmIo7<|q+d!wf7f~SdFq2^y7HUCdme~c%o$Nk9tD|v4-7v?2SVU|bz z{{=I#F!>G`miME)K5<+I@^>7Fb)J2RiZ6fRI>~xFgZlqIj^Y#6=U&WDew*cMU`f{J z*UzjE{w~%tj7z@bCm|B3M* zM*8ZO<0bP~oQPP)YQ645f8wc_pZWk)y9W4|>B^$kQw}pOYWk?C?eOOt z_a9n5tjTh}!y5R&^4BeY!SV;O6z#X-KH9BBt)Bo~jvZ0`HbrliyEJP41+1O}HExgP zKZNkPhx!F`DHbE1ghjE7#SJVjhy}=J!IGE;)n7b|qoL;ij`j6{B#qw+asBLi`)Ov1>8t=iM?)cq`OZ)OU0GqPB%P}hZ%RJP2n2dYKk3y}7j;QU? z3}4e<0sPB;nH}rU?v>_4d<-?d(Wr5SP}g<+E^2>B_RHNT6vica`TYCa_1_dr(|-vp z%Q)LmFN6Dtf6~vmKdznwm0yZWnZD9rw>m~j-rhL{)6u)b2F{y()CsQ*uG5_Tg_ z_s<;{ei*=dNQCb>&ZA=w;t2ST_#5qmSgvZ`zM;oaIV?*5C2$7wkBcklZ-tkywpV69 z)O-KWJ-(hz_=bKeGv7g|{~sa1Y-iRtYv3#1f2@pEIX}OmU)^s#MBNu&Lft2(3ga8v zUp1V{d~;z5{vOQru)d*x-{v&x_x(pK-hujk|5VidUtO$2KV?wA^Ur0mFY0&xURay@ zQTnZgbIk$fXX^SKl{%bn==*FNQ0>Z@?@;%rk0ZPB+{XH>uM4Q(Bk#g`wBLYr@meG| zo{Om8lWwtiJ?i(Qaj^mI-b8eEK#jjO>i40~Blvn667M$)qw4uk^=;wZ_@-lh@&hgI zU^X%nMDY#1pNficxc+^O<{SFE=|rgIdl1#x9cvQzrClTJY=({D*6*k2uH7Z`GG%%xy>}@YY-%NMEGAILw%^X&h( zQTLITu{ilN*cgxEIqJ*sb|0SOU?leY88{^`?^B|#!#yxB?K|Rj@|RNjdYUtzMX3L$ zWCH5_-2up-cFNol_5Xx4vwS&hN&5oW0yAPO3`yZUj;ilK)u*EVzDPUsNpg-S_NVsf z$LFo0n1FUkP@fxa`uTdQ<0(wYadQ||UyeH7=9rVr!De67|3}gdD=~cr)N+0B4Ly$I zEkS)QnrYTH%bUM_d_Ad|?iyyq#hAg5&*Rva^-#dYnV%(d{oFCPo2$)ssD3J<`bmZA z=Uh@Z-C=VX>N-9Ti?KbX<5{*}N2@nAlcM^IfEDmd64&opRKJ5#`+B;vob9j&R>baD z9J^t5t6xHG|5Mn6{o*j{|MlB}+J2GJIE$m&<;TN}D+lWTKa7;l*VB=9!D)Rxt;s(} ztFTHFJcNHy#4 z6KBI9^AhTJo5wLL`R$kmo6%msYpsc!h|6FA{S-Cx;0E%eQRmYOsQr8^>i;hC8O#mZbC^5XGMJSW4Y{J!lorlh|WIam+$ zHyiWNZX{mfzM&sx=f1x)e&p}$x4;y9zNm@%J9{N@9pn3vo#T(`Zeo-EjNjtD7{Yeg zhU#}Ys^96Ten+D2(*sfcwnz1s54HSjvbp1Sp*hVQWA?+2fqXBAwXux(A**lb=k0sg zNaMi{xEZ_Q80?Jwuq$@KF4z=%VnN)^IFjdNKT68;46ML$907N+pL*~R{$Tl4|A_kh z{}}hN-<-u4#7$|Z=L3~d&kY{scGs1gIHNn~Pu$Dj**lFoFCWI~$se^AlGyo<}%< z>E@d8P`@*dfNQ8PV7d(SlP@3Zmv*U8<4TGLu}6N6LwrTN0B_(mj^q7Uj_DVo#xV}d z5-+3uVA{>Vr`Vx@TmLO^9rcE|i|thd^?al}KEa%*_6aQxW_pd|B6jM}dP98L8yLu)bI`c zJDzRKDya5_B<*)schjv#O*aD{QXh*EIsdjnZPz+D7o(us{j28MeMYrwhL5Oc#o73{ zD(552hW#-e-e-Hp#Hy^<`fqFbh8Eu{ z=h~e^)%&B``{H8aYGr*rORxy)c}ym3(4YOYjIU=t@uSjiJDkObY=>j0`DQ|G*XRDe zp?^p9FeW7~i+Vo$u#`K_uA%043^o5k=8uwY`s1kS#^5Z>jN0z;a0SPqHwF=ZDB<{}<^|iQ+`ZBAJ!^PA)S-k-+rC!tO{by7`m7jnb=MdENRZz=&yM@b-M(sZx@irc6?o5T+pQ54mr|-?&{!|9% z6Mt#y#`_kvKW#@HH%&1i*O555iARM$nm8+=^6AWjjos(RI*oio|L&(Z{$jjO8#;%Z z*Xp}*Hb$+tgsAoWp`KfR15x{FPSo-xLA85Y*VSjD)^AbN`b~om7;jXJPaMt+sY5@k zmszNO8lcV}HL)_|^0#_n)cGnr>U{FLwmYA!#VWL$ggX9*n|;kTW>eJhUjT10y*Fm# zx)#FuTHEzSTerM-QOhwOHJ+AcR`XpOU(W^dXD}JgL!EC&Vnz1%CaAx2SQp3OFZLfT z{|j8l{?)Rh+g^20`$q-T{7P89YX>*qT;{*_F20A_&g1bS?Hi*X#zT$gLpwK~gQ)SW z#`27(1Zw_Sa0~NKiTb;RJNvl%`Hi@YcB@eL@6%EH@fg(d7eviBBQEyh_u#!ne9L)fJ+{fi`w^Ih@5c+` z8}i9e^YdV4{=Mqr>uF27AiTo;>o$BvyJo2CXJyPryZqRic7HqjdR|k%C^;{TM_pf= z;c2XZwfP-)Zi`dmP(Dv2M14N_*U2~Z?||PxJwM%snr=C^WV$)ni_aZhQO7|$)Nv32 z^||jW`?)^%Jwlz=&zL(*zkY6g#4*F8_LHA|-TraH9E92r+M>39bzIN(FN0doDKU_I zOw{O$#FOkt zSn^nwGW?|Ix*LN ze>;rzhzC*Atu@=BrmJnH#)Z^>59Pjv@!v-shlf$ivlX@f%`-=!mamI>k?o=L=3!jL z@-0Da-`->0_G^mTekD=!O^sowpBv+r;}9yp9yQLcmM>{>R$R$;ON46YjoMz{N4f3w z8IQ7_R->N76+msTw5aVBG}3LaeW>j<0=2zbp_Z>EYJWR5!Y#*ET*-3GLv5!i=14Qp z3_xwCE~xFaZ-U!SYf;P52DP0UpvGO+@~_6b?Q;;deWs(@4>3!l+Q&m}moMXNyP&qq zDb%?4<3Yx~6!knSCTctUWc{vX{0~su;T&rFJ)Z2wcO5mqDX8&{K+Uha<^53m&*w>Q ze0xys2cg%UEw8RaJ#~(GGB2!&I*-`yI{?DB!&fzB7 z?ML;y2G#Fu)cC7oE=;C8&qHG1a_SNB0D9qc>OZEq=OM3gv(^J@+-EQ+^&`NZ zXX6Xv;i&IR`=h=uZH&5a%P^noKKow^)O2xB-#@*d=lZ>jnr|nIYhrHVV)&cyi*C*J z4gKEmAS&Mn^}S(h%tKto%#E5)X4H6mP~RKIM}2P?18bqj@*#6v{yi!mg!;bhGVUcl zj{3fA5NbYMaS3r-)N<6bxEgAHDKS6oqM^oldN%tN*U1K`=}Tii^fvd*^7RxVo`VIk zmBl42PKf#*F(Q^k4{E;eXS(%a7VmUQKt;Nv@#w z+asvsyU{dvd}qZu#F0_Q`EB;ESvUl>A9lfw><|AfaG%?UqdvC}Kz(lSVsQ=Z%YIM_ zcjV=L7q<5d+FeKGPoTbksDipaZ=qdE>Jb;Z=g=8(9`Qmx{ zJlw(*^uG%AUQj#KbGz!O=NuVO?*+xc*5-&V|j5o^>nzI_663m{fIZCo`i-p;hrb!mRE)>=8i5UHpKQIa zXCmW?iQ};nu4Y_sQ2%f5Gi=H@f^aVFFXB8rjP3L5cbu$W;yI}ICZ?jsGa4f?-4NW6 zi1oUG&u8=-vXA4L_45u}GQSu2hvRu4ZqoX|ncP<|LY-HK;EKGwkA`ij*Rgy)%crn> zB+EbF>)KyJwcm;AXPV^)TE3O#OISXW<)fkI?`3i1J#PA6yE)G?j!(E8Z{h6ZtPh-p zt8gXxp{VuH2RCzH(ZK3OcDa6%pq3{bYJ3-Wy8Jp+eg-Pv4tHQf+>3>AI{QaP+(Vqq zj9`A;&iu$MTYPn^>t`1Rvwb(?J6wYAaV~zqo~ZTO0X5#JslCEsNXJkIvr>@gQD7oiC5! zA>4)?`*XcOy{{4DB+uP=t`$O@it|n|rp5*2eQAGDvc1Ec;`)X;Q0M=jsP{)cVRYhD zrx^$D3s*#azG{hyu>tD;`8b67{}pHAJ3fDxI^*v5v!c$&sZi(HIH=FqTcr ze9Hcq4j*G;yh8tvF1Y)MVP*nUe?QMV^Ws(7#luc4*Y9(DAH(#gQ28ntdOu>OHG|K( z`;P-=2h@FtuX&YmDvo%S?=hKQ82ra}`hA7!Q<0uZL zpK17w_T5m=N3t+pwf93^*Y==4_e+bg1nv8v{?1&xYkVI@TnDeCKXzn4h>7~VHXXNd ziB5Ih^%Ea&&@Mcd=6?P&buC{2vD&vm^*06mso%Wq>gQ0;^~Rv?3ya_#Oo!T^lcMem z@7{9x@RQ~Nv-b2DmsQbhfsLz9?QTH!7Fo^At3iVtn2I~3P`y1{#%}X4^@q7Z+ z&l*%egHiqXq56r6_vq&@<5xfTaWvE2L`}cvj$58Sc#h}L9kBz?oyy}M)~6r7XZ=UV z9vrtEirT;0nQiX7>v99sbIQL#?tO-@*qL^>P|ueRqs}W&AG!Oo zPN?;C{-L{n8-h!S`=HJXtx@-D1+gxs!3OyJfxBNjkGfx*h4nB7E=x*(jAK4dL#>y> zkKK7U4{ATpf_h#(8{-oXHUm)K|2;=7_g&Qfc@(pikv}zq7tuqwWJ=;aIlcJsgS`aWuAn&hbHg zAZmQSQOC!v7hDh7ZYxmBHyb0deEm@4uVeL9FS%c1IpUx`XZpW(&l?JuSUS1f-*A3mzgdF%|0(BUE%vKXIDmLCeq;VMOn+4S9N3?FMhu~z z2=)I{eq+A+oyjxoM|=U*en0B}tK5O=e=X|&t6YYfeje)os~i-}`eD8Fz;|}H%h^e_A#z*xV1&7jZJ?$US@6dOy|6Zv6yP*1S zi|W5Bs-M`Xewx4MIz&J9u?+1>qRyX5QJ*8?VrlYT=#Q_NPWAJs`f)5peg<{D=dk&M zJ3lQ%{oVBm7=!avAo^en)P7OhEQvRme|FS)(HH*_$3p#``hWDR{UaE4y}FBO>F4in)DI%@f@f8_c?{Q#E5aLkXr zFg*rfBGhpl6}#cTubc-l1l!>&?1%TTJ6^;tcm(_7cIQM*k3)UzbpEKy#5~TC)D4geS`XYv`&UEV6^VdxuLagaNSpGSxT{`M&_XriA zHMg6+t=i>BN#@%^2K2Y21B(CJRIfOgOud#S3 z?jj!P@eBPswSzGZ`#~Sn->L0{`a89)FdzF#S=9C}j{1F0Uew>I&4${a(xd)P?G^mV z{&Et3;7~6=PhqBSgWCTpVnJemEPzFDAipoli-)-%$%guUQ3NbRJ*l@}=yJqDJtv8b zMaX}ruJ|JsB|bv_KU|5L&v;BpJOZcUK+MhG-|mg6h`Zti)=SnfexBLH2~f{dVq*)= zH{Yr2eAk~iCEH;Vrel3C!sOgXTt{8sy~Fy2?r$%M^*LuCu{Z0fE#{}+s;GV|V14?{ zj~7^PlaZ&jndf6H+=x2P4SdH`5AB(?QTs|Vp%l=vft5eU5 zO)wiiW4k56yuvsKhFoYe>8l9KjZs(KH>}fg4ggf9>$xv0iWP3yn{pWHg?2oSQ}qpF$}>BcnRa; zQ~Vpx&vO+&;cI-3L3j!8;xRmqyYM8g!;82SkK#-`gG2BNcEBT83om0)e2zKs0;a`# z7z+>Jueg4mWB3dY;YB=$yYV0{#p^f|Z{RpQfrIcgw!>#w0}o>ve1`?`6lTR>Oo{g~ z8lFWje1&gV@8|IWKESJZ3s2%B+=~x!BYwrD_!ej4Cme^5aS*=59{3*H;C}3r&>d&{ z5;1@FpKaKX`^xorll^-p>betvdQZBpSpfC^a!!k5S$qfeyVg^v&*h_iSU%!mIGH#Q z3vql`L*37o#@hj0*RenQXAa!S_m3H|A9-*5#eM9@WX^}E@fAx#p!?C!7ajd}KTtDXGFU;iUmM5AS&Mb?? zSWoq^IJQS``Uylm2lq?vrYnkdb$-Bp+!yS`G2DMeN#Ww(7FQu|K)Yh7`Vgz|t@FG_Jo3sOLl*P=BvKUs}J=-=Ac|)~x>o*ox`?P;ZHU ziS@iK1UnKZNXL1a{i!gvA)bQgIG;90KhDpS)BA<~ZodiYed_$!g!S;3y1xJZY`!#u z%pJ7T{LY}B4|+0jeq#DE{CGt1b$;X##-rasu-(bWLT|2{Q)s8(^LNKiOy3+?#hI&G zyaQjeoiAqg^K_@a54+)7tcPCws6pR5bjPm5ZSWfB`KB0y=O-C3fP7Nyg&(m8UPJ8{ zN6ihW?O!CTTMt?A9ODSUp0sa{xrw7?bM;NwoBRSS&VErLyKDal$I{OiWD{imgDq&+ zI|uhYxCnK=IE6)-ZaenidKfn+_Z>V3jeqPP-W94opLS5sn}~8Rz35OiR88YP@0da-T>X zOe{;5;Jk@N(3|}?uf;hqEb-UkuAlQbis`rDXq;#E!iY>?6lakCSIq6_2T}1r)HsTp zsm-rNxn8l~+{RhdFXJ5CXZf8tn|LE`q}?o>OZ=}0_Z?UgXJR~5KjBdQJSgnqqo{Z< zF2EI*UySN^Hmcu2xRCg9A=htORKMQ~x_%y@`WcIdxu5Vy9mm%SaNT6N+oR$?`Q7+~ zQR8`un(jQRzcHwGRZ-(9hH6(3)y@yq?p{9EE-z}mCcs7HZ?WAp{YF$g1NA$r^5{dm zT-i{ZJ#R;?xAj(Efm(l~6w^;T zR6ltw&RO1$PvRh+rwu07arz8(etC%TnNJvgEU5EkBh+!19@Ty=s{QPW%%Aq1kV8Im zbL>k#XC>}Sh*RQH;uy%OBy%wJCB%=h54Iw&>-K8Yd448x3eCKsvb(OVz@seZLiEnd z=VyGv{08DN^1bmd_cm&BUepuKH zZyv_z+!u_g>e_ckUAO9DLdH=B1Bo+N=l+!Gy>S(0spjWdfp=>7c{bn)RDCMyIyn(9 zGXCKhneEgYHIAk@1pQI%is5iYht0nZ&U1Y$&~oBx*hEL(O+P#$Uo$GUt@!8@q^>q*VYY6VbjHvs({f*sy;C9q~;P6K7zN8cCexfSs{?6Yl zV5T#ZV?>W9bCafg4xxP#b31DPnuFRet~BFwBHQUWYJCmFBjnqo)<;o1j9F0Y;TO{# z!a~itUSL|>gTAQGQBlp0v|rEl#I99M^77UhBO$vF@L9qPEu-)VP*lTO5OWuXTvUZ7gnr zRe4WoTzj4;v3z|{_p!A)@VtTPO5zpliW=Wy)aQ%qsP*w3&tc|{ZoLiehPrkY%_3%O^O;T8dKk~C=(i>YV?~Rz;2YvJ z7?$&YVynltID~#wzd@|;Pi9~k+W8LWxf=Q0n3;d;=D6$YGCalcJ|Dxfzs*36cOu5- zco>Dn$mc^3{rsKnJZ6r3Fbsoxz_c#vH;(PMGsPkDEj6i&CmU9MfAs&Xh?gipj zY;E-tsOwNJGmRO`j5gCm=Jy82sQ`GaD zl30@CBNu+AeNy~{kx_pyBxt%D_a)Tz?J%mJKB#^woB2`Chr*%yy*|~?GmQ49QJ-h` zne)xeSc>hD2=%-m5;msYy8qm`7of(~88v-#RDbDkB*w;+toMIY_ zf>8U-b<}>71+{<0L~WP5W88W50O~$@y*USU9vq0;ZdFnD6QxkwD}v>}jCT7=SzJuN zxp6rr#<~~=m*J;TE}nxm5ug!zHe@lfQ@bO63&kfXlFU=o0oZDgp2#27x~Jl>uG7!^*xj2+i-kq`Z9C5{%{}tj^kGAvm^0lyotIlpF&-i zcVRZR%UaZRJJCGuE4Yp%ozL}$>-~4)KeYRRCmHW648wRIOX^oq+x;Bsd#P2Z_KWZY z?Pse_`~OhwOX78&)8@k8w5!g1biOT&I!-Sv;(HFkAc7W)u4 zK+S(jVk3OM*v)T)QS~RG=Er?d=cQV>j`XCs7LPA-%Ug&_?}sYi43&SE{`|y+cohGz z9G%C!m%4dU3e-F)Atq$~isNaG*_C7Q1h#~sQHxd zGPj&mc#Y*G#>6b=FZqAyPjh132i3&yCBkc@7hcbKobB>ropU#8zZi?U&QwR8*Ak%ip98_} zIp#);#C|yvwSNYfEiJvA`E`vu51cSVQ0MPq*n;-rpz`)cklS2{5Y}vdOix5x-C`p2acoIq~a_F8>)mBR-4qs2_rDdG9+0;}UnbxT#s)9M3q! zB!46QR{0zu&bg@dn~a)2H40^(M*B7K9#+7QSPC_6`SCMxHvE9;@D3)!PZ$f|V`NnM z@4MOGiC^Oze1b~9k8g>u;5$5lukZlA#$Bj+=sLVhyj(HnM2+8`U2c6gqsFx=YCPiZ zbnEqchqJ3$#!PO0-R|-?nGMZsn22@~ntxdjjn_N#p?PYrTaQDi{i*^cq+T*}*&esO zrlGcHqkXQOxaKjl{C<}{^?++{G~S~80KAD^@dmcR>(~&(Fh8naDb45BPP|iY-Wd%~ zP|kxKY>Z;?_P7JIT$rBXo{K_ltMiZ8TB9i!qVoMv>~5hZRxR^IwPD`TV{4#Jp(+U~~`j zOw@JvG~=NAqyDU~)~^-n{8b-yy((+wGQCji+5R-&e=rVBFg513I3+gWJIr{Pob}IjLTe%!MIF8 zo$t${<_)<~^Z343c%DRhYt+0qvBe&Xr(Jf>h1%j|@*AUv{!~EC=O0~i%|?6&zDK7@K6foYpB1w z7>`5AAA)yyF4`K4a=ovE*V&F`QSFq#;gm~{s{fYd>HpGS#}bUkHdOzbv;0+912ukk z@322{o;ZlnNUvv>#9M5ye0Y*^&5obQPleHGZ_jPsPqKY#n91(C>vl(+M!8xKsL%M6 z!^_lvf1l^Xq(4TT56<9e48%j22lYJi!#(Cxcmu!Teq4qj7=S~u7nZg37?vIZzmmS` zG3V!0yyrv@{XFx?9cP`)9S_}h>x;uE9}6`u*XXC>FVxd`zQ>V_=Uptx^Ps#>+&nos z>UU}npuRU)jZLUG2=)G=y~RtPyY&x5t$%6M`sYWjzZYu#A3byH|3B3Fmq)FC4%GT5 zLal#v)cU`B>ehcdDt$02y$@>rr@V5@9f4YIPSkRJQOk{mTJFV{Zn^zX%PoLfZfewW zBcR&<^1`*>6E*JnQRzSFzn1$EwcJ{--T6Kr=4QW0jk-^Wi@Hy^!EzhnLDYF?)jQYE zd8mF?K=rdIs-Njm{e1b>^>Ye_j}NM!*--sVfa*_FRDb@wamV>%yiI&kF~>_N=4H9v zQO9v}%tM?TwO()Nr`icYwX+VjUZ3cP&KtKR?VLfivmez?%lGcQ+z79*9bX3mGnFx+`KsphL9cy^V7~}@-+_bun^mM9TvwxEQS-YC@%Qz_Mbq! zNdG5c9QL0vsP}I}@HqEj{qZ^H^Ny%?T3{p2LzS>3@g`JzH?ahsz}P%#qW1reSQ=kr89Z&a|LdMx*GFBq3!$#pcRb#n-pm7zqaXb|fa!4;>i;7w zM7@t6h?z+5jTx~E=3;)(7NanZ%`pMjy9TInt%>XSjx9UtJK}hlfqKzV-F}^5}wEueMm0_$PXb@pqy4m;0zk zkzD&1QOiGy+CD2SUV!>;V>}+@@0JFje*dwt<=2Sp9sa(e9BSN(V-Ci_CyICY^~(!~ zaQ%v5-F;;rw;46kXX)(<{kcbK;uz=w=@FvcSU_s zf4Ah1^@*#Y{$8jU4kkT6>hFTG;2`2ymj8qHhZBE9wet-1_eu9r<*%duKItUobziqQ zx_9{Vl^M8)^of{?evU>xPw9%=S#D0$-w_?h$J8qx$JNV?s+R>-&lgoMHR}CO9MpYn z6!aqhPi*h-?*YG}@}Hx=3w&Vd$5GoU)C@w+6XxP1o|{Zo%s7w4bkqyL`0U>qu@u|Q zgZfVJK`d`iN#e<bci&)c*$6k*Oqe|QxYGvcmeL> zJ)T#5w>=`E`gxgp8mBSDRXC4zmeebX?X;c=ygh9&E4IbdSb_D7W$`b{l_%b4{2S~^`c>?Q`>`AQO%Qe=o`U_c9|mA|EJMHApq^V+ z!H6txKI>J1?LHmrI81?@Fs-2stcFv>P*@GIF4Om70-v-A}ZUPR$ zzBmm1u}xB*tKd-LGN|>-h0ab55)}r1{4C=~vIoOT$ zUWj)|AB4Fm-v?E`6;>y`4(j|{3Vq1;VEA#G$sNB#u|4JcpqASavs11Ws-2oxm3FeC z);FzrF{A7MAk_L+HvKRI^*?5C%UOq8Xtx!1r@vM4i28$5C>H~Blm5fcr9Z>Tq!+;; z%Ed(OchAy$d%j^w)VMwKb>n>nbzKTV^?yF*rhXu*|07W2PziN?%!BF4|KsEOHw(4@ zOh)z3AJw1O*b85KbH2wjI4Lv7pSiWqSH%UacY5?C|9J|RUlx_04tJBk$F3_G3%T*}Ld{1Kp~gD~ zYF<$pwS5O;5!#z*E-=@bJ5k&F1s12=4>M+A7pF8&psr(EP}i}=sBxQNjx~p(u4AoG z*RdL?>sT?%&x_iBv!c$MKd}VMja9^%%FJq(K&?j)EJe9t=2UZuc^Qk5|H%AgMlR~o znU^0%AE%&TU>V%!I5JDKs#pX4ijsl}7cr>O7PF5y7(Qx|vf zX>%S9;QAZCgxhX^h_%1hBG&#?43}a)%fFABhu^}f%)>9Bo@eeuz3<(ME4V+MgDWvo zNpDYN=1<>4(x2$KfcP`%?U}bdK+PY|;X>Sl^KcEeBYzgoC!U0J zu?6+ZFt^h zb3A}8a6LXN$aCDX+)wa5#+NeQ;lD3l8#gjeMasGBQCie@tFiv^_GD&1y-2)^_sVgcv{M=N{9qGqCtij-aVGAz&sB#}s38^gbs zwDiH~VS7Zb%>0h}e`rVjE<~*L%7X`qy|FXnQU`UPRjZ2YM-kL=a+n!V^`c-1<(^tQ z>rv%an3GWJm9C|`uS|ftuZ)Rx+1`;*_m#g|upQa&KVfguU*kZwZ!jL9{$kYf0#WUc z#_;jR{p8>Ecj+Nmllt@Vh?a{wZzsVaq{qdhr2lQs@xcE07z-z7K98!`8dWa^YB@16 zHU4eJeu-aE<9Y*I(BGq|-%T2VjTpCr*pc*%ScmpXH+AQGKh*uI7wZ1zZ4(zi#m21X z8Hyz29`b`w>9Z{Tf0pi##n_)}qV~J&sP}A1@jT}V4{A9F8gSkw4#i%qZyy$&A*lVOAJ%7_>RDV3>k+52I1$z*eq6(C z@6~1l)ZZOfz>l<-AH6UxYP;>O&hbS18&Lf!fcibG?AV$1epmAj|2?dgsNcitjUT9A z50~Jrs;-@esQoZ44rIOJSlo=``XuSoQSFaMz3*IZ>AhRInd9{q0-_o<; zE7EIrV17!wp`G0Gimk}Mob+0UXIZ~M)N|UnuWygd=Ber!BW`6#IRe>%GIUokrMucCej=N#&Ha8{z~Ey5Gjn~kbB74@8C zJVvGb2-I>1VHD!}7!7OSf7J6*I^~n%N#b~@cB11c;s_X-@;?}l)5IS!67fZhfv4~o z>7%>2`NS|>#`(J&YP{;;QsUCMk~jk{B2J7tzd!Hn<|7wzG3f_z1?85Z=1EiWH*qh; zd&=!5UO2&3}bn9%nFwOhJL8Mkv);~(LTJd ze)V?G4?|JU$<|{jo*xFGo*z!dwn_Q!5jFqoje36Qk9vMsMN+RY>iJ2;bA<>d^H&L{BSw;B>jJ==ZC#f&kq};o*$M)JwMEX zdhX|odhVAT_1y0->!<5$?mo;nSl@2gpY72S`{EkBP5L2>&irx*M#IQ`nXi-om3RQQ zAlCbue^Ad`i(nhZZ7FKKr{hYNKLJ>ENf=AH5zpGytUr@gqs$N0VahnTu-1fqk^!GN7r`}Q2 za(7@@JigntfNQTb>OEZ%+(UgI)cGnR z>V4Ty%4>i6gg@!;YgB)qppO5$sPje`mSCK=qv~zMP}*CKs<#wXZyu`N3{<^|_=Eha z1Kqe+z=e!^e$;WF5a$zn@H^$+(=VkTzy+jlK&3CX^nWSWIe_Q6*cCV9Th{wHe#N8z z+Bl;6y9q-J@%znKn0N;6CGLj1u^|>Dy%ruIE{es8^P!H56xfULii%pVzk@lRDfbQa z_r~v0$H!^Z@{XeR?+vJNUxhmYpCsV9$O^jdrj2%A42tOA*$Rg+(o%5mfj8b5jQ~fuO=QOE@=6= z@Gx--)cPdEQ0`MQ58*v4$5C@EjT2DEV-Nhsc4$4+?Vq(!*X44k{PY&5!q5oZ&!XP1 zexsh=uUOQ^%>OMXb>OMXm>OTG(?dm@M zH}MVDFX>3`&sgtR7z>Ny1JWzv6Rd}?aU$ydT~E||#&4+m)@K$k8O`>gTp()v$C|xS z_pNPE>(|8Ms;F@*YjHl*{p-?EY*(HwQ+9;oZz>@n{6pN_ho55q)^XJgcJh|TC9 zz;y<7oxW)CDU0Kdr626i8F4xHLp5K@8kZvDm=EC6@$S9R0(?rjnHEpQC&ZmGCGF?J6qpIMyin>Z{i?->QRBGX zjQl^h|7SwYpFg8F<)@(jFIrF3eMXrH-r>*T@?u)@7opZ`C~AFrnrBh%A2Pq9%4L}7 z((7Rp#-%)_r=3w2_p*2~s{f}^^YNXi`FNE{ZX8l$7V=|ZGTebGw;WY2$7DC28BpVy z7B!xUQRCSIHJ%Sq?OZ^$lXRN9ANfAj`3lwVOQ`kPYVkaa2U^_F;>uHDPgZEH8uS$ZMlJlJ3;vds_ zK1KWl^*hqn@DFZ9^?$KB1t;-4Qp2$w=ZO}mami?LOpCA4uIdG$?(b$`Cywv2c!>SH z3F`jt2kO2vcc43tvS9?SkKUL%CEwjz`eghc=_9cz=dUi<1nZ#Q=O>?uJdg9B&R-u$ zU&Zy|CGH^oip6JfCvgue*B0}0yf#N2_tjD7!wMFU!~$&JWV77-D>~|Y5doL6K3~W$ zNcqROg!m3F#!Hxo^nIxEJ8&uK>rmyZP+$Elg@uR<<8tzcT6!NmzrL_gK6QLx?}japfMN=9jlo^ULF?ejY&eb2aLEKN{~9;`?LVOu7D8oN_&I z3vox(cU-No6USc@)Hvn9jpVnU>z3CL)vsEp^)888ULn--Mq^yA9|JKC2IFe>#~oOj z@oX@U{f73+q0ZO2aW`=q+=)}L2K`-t|4=@|d{-_mYQ7x9C6Xn=Hs1l9&rnc6E9#tWjT>h?foHr7Wp4h`}YM5B7Zxo9~mgOj{fJx%Je7VLRarM z@f_;C#0o6`Kip2eEw~LA;0_#z>Tf?RN4X5tUqgE(P|wd>p{`RSusa4>oOcoPI^qnd z{1n&#V`E$VOSzU9W3k&VKS|F^`=4+%%e{rccnsIzCd^I#8r1PI14|H3#QPkd+pV3o zsO`A|wLPb!?$0OSDB2l-dfw0r^?ahpQn&nUn2&OPIEwuz2CgUn;}XUX@8SkLfrTk| z2-gz#qMX)y=`y#SC*e%Sbr6=NTvOC`YJeKYf3OtkS+FF=#KE-lg?1_u-^5CIope3l zDa=Lw5cz(n{q5Ij_g?JEHkRTG^qCW9e3q7 zU_1J|9F;!}m7fdSkRJCK&%cSE9OZi!Jd1;IHg?5v7{u@W^up=Holx~7SbpdcHxF5B z&M`k7;&~F~&fr8$jcPA8>bmpyfQuub<}vB_x%G{`hv%4-dmYOD$aUiwP9n~XZ*c!^ zu2(n*)oxRqg6Z)U{@Uf7fGXbrm49fbrJHrlbmr_G94GW+0=8tF2BY53cExP$Z|zX; zXX|1W_788=dL+iuJa>7u-EHTqsCFh|3(9}p=Ei*mE}$R&*n{*GIFPt>2-kZ|gA;Jk zRyThgYj#KNNBJ#IZvNil_LHmFo&3qD{c?dV^d4BdGT#TTuJwEcB;;lTrQq zwBF@EL)E*58n-j3@&{4->vq)sRvXoya;W{eu;pj8{Dp*)V%Bno@4v2MXl#>)Oxl-t$$tAdX+)-GXrY9(xBGsX)yD3%KeMA zD3=3uUP+JY*YY*a$*6V)qS|SSx?f3vTJG)DuHVB@&*S@`+An44uUEPB`>1}0qV9i3 zq1x?%YPSvQIduWlbHntge(Vn7yB40~R6_lKmz1dg@3MO($2;@IEvRzEaVO>Wt>E|} ze+hPEd}g5j??^4w|0Q|K`BLR>q28-qz<=q-NjyqFLU9G>=}p*z^XD@QWuE7dKM{4m*%p;v2vy$K@<-F|cgE#TWS{WwCeLFh?q`nRGU{(aeJ8XMwV%zy ztn_aNYQGtdmD&E~QRCym)lu2Lk$gM}*zUbCKITFlXVGvj=eN2MeLR7TOAcIw@o*`= zi{Rr4!b9d*AeG1@2ZS*(GL@{9w{;6ApVZ`H}h7?%}0OQZHwwhQPlDh zC?9YCa@XC~sQwl}<;TXR_~@tmUiB*WVchqk#&Hs^Bflx?I$i>2pdae|90S$P-5<=? z@i1!rmzdpA%WH~b7_WM`gZY)Or6<6;8|hh4$4?r?^e3V6IX+{e*6YW6 zH%`Y<^R5M`<01#Deq7v$!SCFD(igRzt5}>8n-Kqe>+-ju_Q!#!aoPUb<*z_(=TWHr ztp@5i$Y}A0S8hLDgxU@>P{;W=%*=Kej_PlBti*O0_|mOU4^+C}3+7j}cltT=B3y_q zNpFancg07|yM8_6yu}+vJEz0afO-T$GEvjI4UaqWh^IX-KnwtF7b_D*H- zi-&GI9>ERdS3zyBEU5N;Q0@JC;KuDfYJEypI4~;=ss$G zwH`H3S&EvEOtJiqW;3%oYTQep<{8N>{ntIWo!?_2w(|?r_6)-&Z0G+_%iDnZ{$UAL zAUy&OVm&_Hb@SFvW*k)ccXwQWZ=>R~sQykx^>-BNyP2-2^Fm`(xqN0uGdZf?pKiN( z&^2t&@{eN<+Ut)mxo$N?tyeM3PP#94pjaa`UCtc!(l1QP0-`upQ;9q5jYP z>6^B`_>Q=h#RXB%4YObj=3miK^S-bfuH1aod@c@ZKKJpu`#vKOH9s4VI-Z8$P{z4G zYJS!MmvFz_3^hN?gPNZ`3UmE9fU36*3sP?bYWpley>}XqI$npM%Js&=lO-)KZDwT_Mx7? z1fjk&TZHQ86r90$jzYa(`w`u(S1rs#xh!~*<%dS|34e||9<|>8qSm_?4yQkzQSCLw z6|`3iwccq^>)oF99*A{u0A`Ql;xwpu6kg{3=@#n$ZhkkD#dYyz97(y&sCnf~i+kgE z(!0d-@r=N9=J_N(;lBfO1ob;|_=DxET;kL|;lGa< z5ASn+h>ZGu#9pafc|Y@bO2(V=X;I_xCxwq^9DX$Gqn^{hNbc&@L-n&J>h}>Nqw*Id zbNS`Wze#;OV<`6k)!zf=a`PkoQTiP-)GXsgKk08lOvH1$%xPS?SHvoR$((FghejDq^+23{`I`PN!UNJVm+P_#YPVamQ&URCzDlMfrrNzyFMk$JMUYyNGK4FX=iT zyhGJ{jG@%Kp_upQJ5Ybm8jQ0Uw`q8Sb^?%oWN(IQ$IsUtCm&Jmyur=1^ANZ3J1v)S zC*!al%QBB%X6Z9nzYMc}Lxqe19v*2mc3*s59fT|yYTK+~{ z!uD8!fh<2z>8wv5Ow4^sM@)ogGx~V?u)l3W)tiq~8Q-25K)Y@6HS1B>@^hft^+lEY zoWYeli<kAYxSIO&aTeu=<4oEefTJ1D9;o)(T7DJFFNLGX&wxusf!C)&T`cI@+o+e`cF{h!cfaQgNrEFHM2|afJ(2A z3rH`C+J4z_eG1OMsQoxs7Vba!yCpx=-z^;{Ju8kQUPJ!^a5V-NaQnk}9LC?Ljj*^s z{!84$;`TV0xCQEbRU3yAm&GAi4DXT74(^%4eN_h3^(QT=e0&^8xfuA6I0DY5+>iV| zo=yBe+mER8!AqP=`Xk&(`UTYAf&35k++?7|-B8Cv9@PKO$cX7#zgPKOd><9>w>Sj9 zQ*N%slPzv&adlMr{N}H`TvsXo7`6QCsO23--A``AL9EXx)O}BDd_ehf_!cu@8|K?z z^SE~QqT1PPt~3L&A>{^G+!OV8j1{pK=C}0hsB&p6KL+{}f6wjXX^a;!C+@(cxERC# ze#RVY4#ISdV;9ul%`~#~q8N!d8#cidsK4Kfi}CSWE*HN*m3x3qaXMDVQ5HAF`os+| zknLE|(o>m{%$GS`{Xoo1`6)Pq^3^aQaVboWxh+nITEDoc_J8Hzyhiyu*o=5Dsz1w7 z`HOHC`4cQ2gENWSqS`Hus+S&BFS4b7&hFB~Q0XD4^3$*yjzsmZ9~Qv&78gQopUhYp z<6C|N%fFheB}7n{(Bd-9WUU0;;kHa$C%HZLmiiIF^K)4PeC7#H~W7_^uq?``XW9aAL6BW zm-)*?e2#rFBk4_1$6qPTK%5R$E~fdjFvm6V6IA+n^B}h4@B2346Vex%Q}90VKvcc9 zsCre+f|l=tsu$nXZm)f8g=lN#%un^~OOh#PI;_|59ugZ(lIPd!6R7{QfJ%lJYh4@c%cfS3EF=+o5 z?jwH>e#R|$hx1DiuA_f*EuLiYzgU~!zvyaKMV;qMpw9DYP~REFLVc(5p_%g<>b!pf z)&5>o`ILe%!@gEL7_k2COmeOG=HDt!zpJr=ISSM|6) z;~CVrZ$ypb3e-4`#f!|#`(jaIf7CdXL5)K$)P9@>bv#6|_+wocKSt%BMve0pbCx*( zRj(zgTtzHE`}tAhnH8U*m!-$D^lNq8_@6+H|2kCpm8kKbZRtZSy*g_AQ=zu+@7g|| zeAK&v8n;b2hqx66Vp7yNzpUlb_oC7t)#SR5XK+65!=bnpztMhOi}RbWYxsDUlfN5P zZzihU9u_x3wR5#P*8yCGD%TJP(9cNtiFV&t^YMJeyV!>GFpCdiXX1d0+<%h)yMinK z20s#CN2Q-N7ohsNxjgeY_Ph3Y9UEg9mcnZo1=rG#r~kPA24EiIvZ!=FOAjmOj?bo; zi}cE7R@As&Ez5a^^Z?X)*RePTYWe%hxaDs~Eq^HvVSTFORpPQZkl17K)zUs5eP=TV z^>^64P=ANr42NKCGbifrvc1hjW)yRADc7H2sO9v;0Lpj5dCcePqxw?`=MsD2HsU0x zc~xYL!g=v`Nsb@#zu;}spJ8Ou@1x3{$4JB{a6aV@p~`K>h@|(zg7mu@M&&(6Au|u& zV>^8*;XH>L{{yJ?9*%qMLfXW}Eg$NkV= z)VzBdYP+|>w*&Y;$Jm$g%8OZf9{Rhzb3g9kx!4XINx6oodKFN=OH~Sk=}#Wi?^0#O z&pa}Vh${EK9nV`xe}O7@7xlYSVW@V`qJDR39I9V~%^u39dbJ z&cKPR-zeNc+|lxzSbj~MKz?bNE_=I>X^&hYv8*nP?S)?cDQT88i)ciEI`MW#w z1ooFZ<~*!OzY}-!@l?PoU0pm5D-rjwI1}o+nht}raX*faS?)i*+nloSe;+q$fq5LwVK5bJSagdOkQ3&lA5#J*T^XdQMliAL~zC0`JBjY{F-z9$}_hVP_F7aX1?$9h!2@Z$~DPJqQdP|Mpqi2am$f#yVfNxhM%{tiU7lNX;*?ke?e<5|oT zg};x-8^o8$-_LW<{rH^t!C<%jZr~cm`x1U-d;B5)Df!XE zMZsU>zoqzJm4_nK#fw{wFNWcyt==wnHnN&-JDWuBUum^yax@5u8hU zUQ5qr>4{O>AvVqeq{R$ALrvK!SOH{f05n@b$-lZvV=UKZsY;FD-WxYCX=Q_S64R z*NOM|h4dAZ-FhuRt=CM{dW}cbZ-OZ~ACyEb_va*ce2ho!Zxt*qiYkA1q8qopLy{~nm)+6zI|4>BiPdUn+I@I$rtoqnjjH@KMgo}$_dL$&vka^H#n zBKtx1WK-RFw;ERFe7g~&FmGxz&CUC2;{~o09p<_7VFA?nvhQ4;%QHVogovF@nHQgP9m#?E z|1B|5>-l#E$1m&o4Yi*?$3yJrcToSI<3Eg$j``qp?nhW&S=9QyXT9{h{XX*<5B9H= zxQp~gsD4dd;LgM2Q0L*{sPphF@^$_lgF62XTIkll6~?AsA-uzSU!=U^jEmfLrVE~6 zp3n+MVr`^<*_Yrd+MkOJ*^fqJ`08Dr7!O&AmZhdRI4K$S~~T5e3# zauY0b=Zom5{JAVg`O{GOZ7}>gKz=COz4&sDNBWT*wY}q*5zViZQ~F)h|3%-0{e%}aO1if^AIP;bgW-|EWmMdX}uel9;k8azs~uA{%gECZ+6?GCgvtC zi0V%k(+fi*&>rR_Jrd?Xzb&p_Osv8D>JRC?c#ioJTN8(2TRe(wa0{wj5Kh8LSPMs) z6=+BOpJVO*i`qY;Y<0_dV(FJGJss&9&qA0F7h1Uy_<{YlFK!~e1NNa`{$_pLKzhay zciu>gKE$<9|Cg!@7URBS`#J8zxUP;s{awXCY|M3|s>S6{`(;Xt6JjIsADwmOZ(&2? zEfxo31L9#82Vi~T>K2#Bdc>(MPKG?s}VP|xE@v|&SJ3-Rw4d$%C+|jD-&8#;?MutcwkB5Ll*DG62t>6?uo^TV_O^|^=Slk1%6PLHR1ZE>nY;kPNN_^_DYws{- zAs%7zK+H^B(&B=ciTKwcSN;=bBtB;GKFmNIXz@h!Bd%g`SxiqH-C_^sD#G?T=-S(h zIf(~b+y`?I=e0O1W+#4ez?FZ1*@$;qya|12e~iUL(1*CR#f8zE_}6~xKc*wzVev*x zOWe!iPMC%`m&KXTi}=kxSN{p7CSGUp3QR@Z$>LU+lDL4yIWPtByS=XdGfYmr#o}Pp z@ifxnL70sEx)xW(q{MM8j*2ROV~=a^A|@d}(Bg@hn7F#d<@J z;$apCU;^S=7FWXf#K|mEM9i||z^KHPEiQvmh*Me|7b6qD z-Qns##Yn_QusG+BD(5+GU@2034KzsD>AH2gn{SfK5aRzGMGY*^3UaX65p8tt* z!?<3iBc9B4bsy?_wg5}BoJyB@PQg5+80tPLABHeb$&L|eClO|#+^Fy)$;WL(d9cPk$6#p=eW3fKV8Guj8?}hb4b=DB zXYm8)nZwAx>hhX{FUjwL{Hw0)Z7?hSD)q@dcgTvl**;;(e8bPnGtB{bg!0``$9Fqi z$#R?Fa;$6VHES$a}jPaNCg$hejGTT)+7Fuq4U|9^!i zSkK26-@_pCuUmW>R}h~;?dOMZ8*wN`VLd}Is0iPIqQ-9qYWyZ*1oGQq4&GNZG%K1p zQOnPQZ(06}Brbl8tEqnn^&QX|Tu6KjIbS5Xme|*`mT_BYHo{=ya_Em4@iguIOyuiH z&$!=1J*T>YXGlMbjVN~*N3);o!1csyaUCwkL@al_xh0{md!K~bzXGv;A%1Te)&FsL zigsgJ92HLzzewQgSwnl5QT0YSkI4|S-dWH~R#gX*$ zC|)4m8_)H#GwMB8Qrt)SH~!h+3Ve*K@v_C+aTN7e<0{fqVGzd0@whFHiu&C#;9z06=+nBzd|L{6$Ke&i`@3RZ9 zrRO~_s(yJ?`TVHz*-_<_;&sZ!Gk?Z#%Xx=-u5}VsZl}4~3^teJZrYoPnveB1%UOPL zi;qNi<39k^ox?m;at7#FgX35LZ)-74a_V@3w&)%eVyNUfL~yy03Yi!q+oK&(%@$t6}(@c||w8Nx7pw?s~Tu ze-S4~wfD-~c@j0AJ5cBIHTaowvv4H$N8^;wIQO%BfBZ!L$8@fK9Bj*cVRc&0Ys`OU zU=glE191lJbwSND+v0TM7HNDvQ!pFO#(3B@A@6xnfB${ci}pzm!CAN*)vuZOk>&o2 z>Q@(3ziOh&7eKY+hx&WyG`N-RofO|u?_6rv-yk!lPPWpLv+ z6}25xXY}=qWjp>P*7!a}t{yMg$H{7I6 z#5eT!wB;wy<>n9bb2_KsAI(L)5(a8fw0L z3N>FoV)^?~^W|+8uSd<7gDjqpnl}fc=513@^W-}EEiJB#8kb_I_4Kv$ zc;?&uZhiKm+SzXLB#RrM=4o+J%ln(pwf7RYlYSc2?nG4m5oQ3Yd`HwgttIZD{3DK6 zmAh@8F*l>;Y3nRriJGS^#4NNk)6z$q#W}9@J}w99eOw*X`?oQu=PI31_bqEt`^gp5 zyeN8c&TH&{?}>+Tee^2nj?3h@l>IY-#j$Y-aTJSxl%PH0kEs3pF={`*gWAupq4x8O zxQz5u79Yb+#OqPpp*3ndRzhv3AM{7#^a8bAH(OiT;-g^heZp ziZ9Wd^V1{T%=Pd(4&}U?yqufgWy6#_Hwi#pS6gFVt`Bu_KXElYfV(QX?LG{rQ@%uVJBb1tghDAe<#e{m@FUX*wB!pvi4h?xs@y-0_8eiZ*7 z=6%dV$5(RwDv$rtjvp%hC2C&(5Pxv~y@g9y{|oq?_#`eSj$fJcKF{qlSLJ%g_48E~ zHxAdZ4C7D_HLr<+YX2eSH7~n@+V0-f*si4irM`}n$Ef%iYCDv#;r6T2sN%6FZ!|nBtqSn z-k`sV`=E}CcC@Q{wNU$O2x|F3sO2w4Eq_%lw;l^n$Hz?6@i7T?e2hUIA45^~yP=Mc z_Ne-|YP#i|MBSGLqn6hi)t_3Z!G3c~IZMMnqkIK9L{Y!+DMPB5@Nld0pS|zaxm+*sbr6M$B8O_YpO( zev10e|14gnUM^Jq9}Ve0=a+@3xR=F=Q04A4aDJ%Id6akoUc=d_zZ2+XaaYve3Bv5y0tJf0M&!%{r_9CLzvwstppUJ#SKdw^l1Zw?vn8D^(`lIw`=1sF)OLv|s zjQahAh^<_?^TaBD$Q)<3H)FPO_p9w%`+7!Dt~zR-TnP(ve#nEvNquA#8@%$=CDqHK_B!QPQBQC|778kPEWAU^0F8>Uw{5Fe=qWXW9o2E_paH6dgMQ)yw<;CH@AOOLB*+1?tddB~KcVEvl(jVYc3^nJNea-4-7Biap zh;~$OGd{ruJzT%iqLx>%r(2I~sP}MwsOx|i>OEXi)O)xal)q2;i>UW-vq{(Wati7_ z;yBcM#FnUXjZp6oTlD8VMtV)u{56|7s2}?m_gkTTojq^^^UkKYj`H=)%(#{~6$ays zKAdl8e*nJ0vKD8+m3%jy*3#eicFWs<|MH!tZ!cfZE6VQ;VBS%P@365qPQ%>T3-$eV zd(`hhnX`{a$^bnIl$L5fZwHgh1=6>7oeU$C_sy5EDEswcoI(CJ?92FX!0E(mM!4rs zeQ`E%L)3kFP1N(J^!SPN-^1PWr&p-wPj^typN^sWwGGv;xv26(QSEd?J%4JCI*<9I zo#)W3HMHM?M^ehqqb91)Ob`!ZKtBB z@yM=x);pEuM@DU@Ig?#GTPC^fR1NifqYxHkJEcW!rv#|ygfUUuDau5*oi0pp+bIM! zzUxriX&7q#8{sUhi0W4n)OPYg^(z6YU!VWy%HKq_a}u?k4x`2+6t$iDpte&L)5{z> z-j(Zt+D>gy+odMX!>krxVm!5-j-s~HOjJK7GOo>WF!sT{)7<7C+!lzr)@HY7!W^&%ZdiVm%;B(B0k1;jA#2EM#J@^E_vixUwA0J@|=_xrct;ZDj z7XL7Q(P#O3QWO6sPKANQzJ<8HV_FPAZ)}U{ur~T&B}{{xXOo|c|L=o|>3<*=<9=*B zHZ8^f4ZxyF`K}AA@cWzj=D7UKsO^;omH(Rjs^m{2PD4M&pcfv(bhrc4VywB`Ke7KM z$M}37;D<4Z^I%jgiSa!AUI0GhxNd|INMAai{ep3rj8||FUd9f14(s75EQ4pUFot0U zyo&Mh5dN6wj=T5fO*}yQMLdRk@C*jwew>G=aTK1!0KA4>Fce$kL2Q6~u{!>TWpED` z!1I_6FJMeOjDJ|Kqxc#3;d4BKm+(3s$K$vUPv923fkAi)=ix1!j5l!v?#5;d-Eq?p zpR;|+V^a1{U))4~JbX&}?*$ys{JrP{d_sKQ;w|`$c#g#rDL;tg>MH8^`VW)S-a*vy z9)#L&p5rg}$7GA#b*~5NJo_KEz_;kdc3i*M*OO}y^BdHC*-+GT|A|ZKAJ2OSV8X~e zM=*;lap`fFvEQ=){3YER{kOXNs>XOUfd5ZoadkXGT*2Zpc$m1T#Rc#XaZZb~;6dW- zTi9-x5cQnw(`M&Wa}4Ty+Z&Hl&L7thmp60aF76AxQO~E6;CA9io80q;yQsgDo{xI2 zJsS0Q(iP2UxQF&4qMmC{+vw^ILp|3XfO`JW9`#(i1@g)*dluC4yf7Q>4c*}CbwfSp zZjY+h6!o0D9%?xiP|vw@q1MX}kFj3Q*K_{Rc0wO4hgq-y4rl*KgMP%ZQ0w=4om=l+ zsB$xK80ChduAf~{^;%k7%ktBs+NrhH*VBpp>QylB6YwBr*78vAQ}(ZM?^A+t1nta0 z-H(q)jkhmmqI^VDdnZt6&+{oa67?Ko2p(Ylt6)azeGhW! zpKw3vOEClKBT(&nq3W+$>B^s3!G8FEmhL*NiY1Q2_z}TYuv@MQC@NwrnAm|GD0U}y zV|RCAi(+?ocQ~Xe@<#&P!#}e{=k6`$*L1y1P*OsXeM(Y1ICj#qm6lcqHoc z)SZ}@^w-w>+fDmJF!uQm-N~1a0o3zj{@q;fxem2L9p8c0 z(y0A61br#rAN6_OBGhx_M$~iZ9n^DTfj#EEaZ1#@jKX51*F!z8joNRXmwTa}m%E^z z!&;%9mm8y=m*4F({k)0l=K&k9v~h@y>)Y7h#@TGVdavnMaV*02uc_C;^YVGrcvqt4 z>GlEB&OuZ=Gi^M?#>)~(`?Yt+BT?!k=M}7YHuarmZ=Xl>y>&hq0#X1{p;}@vU^&Z;z4(fBg zYpD0>r%|8p9YB4)w-e*D{U+4sd&|*>>*rL|-%E|eR@e_)VrOiD%~8jDMQlp!Z{wjQ zJz~$Nej?%*9ULBNt_B*?=C+xzOAUw4cDRGyN03O z+s;H?-!B*Th&{h|V`b_ci|S7cn_dm4aDElW#-w*EWa{mN`ke7tL66w)x#UE(n;M%_ z?r#BOoBSTJ>uE{Ux>6W*y-AK*SN`NP?Jh^1XDw0Ji!9dosP*%!uSe|t%sJF^$wX^A ztC#g-UXyiqe9Tmp|0a+a3JYnsO_tu z$`?YF_eLE*DR2mJJnJtf)6N6b_E)V(Z2D#lC4HhzKO4u?v){VIy3x7{2UC7N>iMys zwX)3*uyGn2C&HnW|K~9EzPCQZQ_S048*f1Mud9uNt#wh`SF&+@RJj!~yidj+=*j&> z7u5KxTm4Y==dp2i)Vw*P#{2r8DSyElff`Q_8+WpCfQ`LTpIfs~Vhywwvw9=vmyd^yGvi~vkC7U4QJy%~;Vd?(SH z^JtrmH)2lWIX0e-IfzT6`f>gzpD*AV{LX&qh`JxGZsRV&g`551wFWF<)n*ba|oCSX{{u!Umd^beJX|VzM4s1+(^OJd> zy8{(Zv~d9Hx&Gfrlm7;_KhL3_(>I{*9|qa{PI%9S`ykZ1o!h3TM{RfLgZX=eDX8m8 z^Y_LgsCDxBJKiVYLF-)9eM%M7{YC-Q{RTg@9(%u$8g;)B^)`F#{l-(&{l+NN{YE9! z{Y5d<{e=hW{=yw|ao)wjJLKbz}wkME0M9aP->ZuZ#Um#Ay4gtbWbKs{I8zirB&LzNFl)!PR( z{+p5JJ;rIANIy2C_QNPt{`FhgW1j zWBYB>YuNN3*UkHx&v=!2dt>95c%Ar>jql<$;$v6MakU+9a$K#!7JS~?;fksM#$|IJ zu0Zv>y^TxT*v-Z-E}8sYsP%6Rj%VEUQO8F)9KiA9i#pDST`=W(;yB7RLCsHI)I7SN z+6z8!%6p-nL*Ab==fy45c~Q~Ed2Q^9I_@r?HIBwk#OqmIAz zsN-)W>i8RiI{tE@j=!|1iMiIHe7) zJ=mYPe@)ZR5~%C1H>&-!sN?Vxb|gMm%Om#p0&1gvFTkyi>0fkh)4%hm{`rxv`_j&+ z_ZE#Xn0jiX{!hme)cdNDsNcmst(fCy54NXV!n!;c&|U>>N4x~Ju1-L$vqP{p_OYJE zw#0j|4Sq!ZUeFV4O`N2jc|R0{>R&Z$DeExQbIw*&zviI&^~C1iw3e>VaY%ix7)1YW z2ATI(Cs6Ny52D`xZb!ZU-GF-k8-O})yiw3Wap7Hmv_dJlY-^zP&@M~%|D9?NRT8^EPIC>ODa@%|n8wX5QYAuX$TZ+?#S?*b4_*8(VW?Ptt2O zGxc91Rz1fa;O_n&T~-v3-degEk!>ibVqQ0wm))c2pNH8=BK4)y(~5~%M#rAC!Y ziZ4lTg8E#eM@!RAN7VOPTi{Y`WYcS)zRy|-^b+!c)cY_m)c3sIZJYu1 zebzXr<9}BR^SrnU^*lHq_4@%G(39t`lsjdn{2P+=nC$ozO%TL?=c)g zecx#d-XcA2D|7zkLbaD1_54=}^?ctF^}DHK+nDhVLVf?W59<4`A*k=awnKgYwK;0M zHBjGwt%Mry_SUBU<*4g-e^fiZsBvV*Ydlw`Mm<-0w>8JZFSg&uxX5$? zZ%2L3Q@_1AE~}u9OE2pi^2ZV1$FX<=^KgCMNWR{eMWC+FOYk4{JVuRUMh6ea1j_$H z{ci17)N%0v)z7q@OgrB?8qZtTTPIn&SOcvYQ0GUY&ZfUHww?#pgVx2?_Nel8D6h{! zilXit^IF}ycsSm&e-fhJ4_zWXhPW=VuFEA+^H(**wC9hSpY+ymMAUqZ z#GK66z;32oBWn?BO6!NNCjWwUgLSyIrM0*mby)pHRO(Cz{-y_xOyz zpLIen563sgIRL+4S=4pI4|N^Lh5DXhX4LtW0^J;(zu1EJfbV;9-1_sqd%Wq!dWYI> zEB>LrH8_UtW}&tljXFR3;&1W;aW31J#ZSa>Q1yK6Vd{B;s^>PUo^z;r_Txtnt{6+#l+TV10a!Dz~JM zsdpl({4iAco~ZH-Q1zBZl`nuQmjhKUJ*wP4>Q}ulQRR~LHR=AS^1i6@%~99e6R7z= zjPJP*+K6+w51NY~h)3J_Eo$B~^<%we`&M|A^Q;;UiyVATtR;O{;Ye&`2XOj z`m5q4;$nE0&(*y#(v|Pi;APT(u$|Ihq0+aIuKR%LsNb`>jrty3qk*O$zSiuRh4*3c zaW(Bm58!%$_b@K=bpv0Me+E~PK9q9$eWZR^lKac~4J{=~e{O?d>wDlpX{4G@Z%UFo=XD|un*IO4_yQAK( zw8j4Pvl((h@TqGpjq4bf53a>jsDA!oJn}29A^kb3KNqYgZTeGyidAFyT~ zY}!kPnpbDs&HnZsZPwXbSf6>!j?bCblvuqx@AFZggF0g%@!wH=-hwWx8; z!)??%9)qZ71a2qpjv8kfRJpvUa_(4;rT=#G*#c`yU@d>X>% z+r%eO^R&ad7FF*`tV_K;a3gVYRDIXjkBa-FwvQUaddL2HiUE{AiaO83QGXvg)mq-B zd*WX5Q{rxngS+q#`@1aLpTK>@b?_k89B1yQs$v=P%i%ZHmtxq1|7Y-dEYH)N7t8T5 ztvt51Eb~RAjl|yZp2#>Q}$MI(Usf1d8zEiL2*^7s;2j!H0dZHQUF)T-Y z`%(8>8?gfMDqP3^KUshp_fXXLB%0wKwy%I1cTv>1^PtAAxQyi`f_>lcs8Fl~E6ZPJ|Ek0pgYKjLazZP|Wu@E)CCsF-OHO0fR zpE!nCenYMA*HP_OAz$qj!2|p~wYPOAY8{V2)w>wq;RO80bL>ELE6(?zP`@*sa;n)M ziLoN%b;iN0OYh0g&pL7(1412(l20?`5@Kb_IpGk>J)yjg@9wDmJIs~~#Y&XxjX&AH z9Z|mz9gM;3=cTCQvEy_P#|ZX!4a}a7?*ZZ*`jr(24dU}&oXmQf5ZiG+zhOIFm!=YH zKF6RwKN*6W&s(^aa-T6L&*@Q^1GmrMIe_$yn4J582-JOe7@o+=-y`68#xn-fXXJaf zc!9VjKIgg+$HuRzXFcDy-iZH54@Z@og?`LW1H4E-o>IP*AJ-eaL3{wO;ab$V=HhkY zQFs;S%=U1c#gTXhyWN7AvAN>i(n)YCc=yDdsa6<8%C$ zo5y`0`#V3XoCm5O&Nlu{Ih`L-c!ckFM&fb(egUd{80Ah9$DeQZixd7~zCVzDhISs~ zIlPKzF)#VIX>T|dVf&M)>)}DH%J_ESP3G$->bm+72N1tN-LKq1-LGU?YR>OJOU(KF z6xE-t)^OCk&cUOUZ;B7GwzYya58fwz>0;{TIj|wd2DHDM}H42H0e7~$9Xt@CVc`XV7pL^hc5Vl?cXdg{oI3!JEQtn z7dtRdDbShn+r!u&q%X(27>Ysks|wyB4!}mtr#~JeF3xS5&+kwS6e6eNU`Qep;I!wVLyca*I*@o`C6z8(~BI4}&lrmL14_&MNLt zh=Wk=*TkXJmlSpVc^1L*E9tjT@d$iNy`AtK7RFZO|6Iv)9e%_N)caa7^EzT3=LPBg zu{w6e(%1&8VK8RKdKidRvAlkV1vSp@>y1J9p7yGt+Vw{DBMrX6mza?4&td{Rg5OBr zgCn`$+>BM?aUY3=$e)1^xNc0q`%WAm8_ayB#ZPSKiyyF=O)rNZiHD;<>s2o-&+#`G zKa+kEwLjM37vf*|74M?9E4GRE8P2SqsD7o#Ul<2};-`&f`={tk|E^#&j@Ps3L%a{; zVgx#2OMJ%rr(m`}#5gLV{*TQ9{6T&DQ2n`T?Yr6B*Z06*)Y}PvQ!W@C)K}7)4{LJ0 zO^7k%e`R~MKZf`Z@nZaopHcOn#iz8pAODe_af?Y$iW=9st!8~ZhI46mKkmRCsQ=Hh z2=yLvHZCH43MTO5`4krt55f4vbx`}U3hFovz=j-O|6u_a)_aUYKVQAcOf*BaGc6I6S3QSAky+AE40pD(Ii7gT+dQ1km4_5Iu3_?@`lc2j>F)PAjm zF7#)`4m0md(24V+52}ByQS%#!!HgrXjW=Oa`Vn_0<7E3c#OlX!V!0A^d@n>-oQcUW z6hAp}eqmDL7MKL9VPY(4Z-lig>T{5K7(jj*EQ7BpujAK!w<-VDmVb^~ zR~nP9|NC^r=1;bc#+2kw*u!%q*YV`2{(mCfjr4uQ4>)cXVXFVg-)r)}5vPg6eG?|9 z+;vp@1<8*feH&_BU5!cEPqS_MTTDgy$CwFI?c@4|PM8+AqSnK@`%OCy4zNy7%ePIPPs~q!!RSSLW%R^JsQq;qSMzr&5x5rP9yaMw#OsLfSx4FQ&Zu>+IjY^d zn2Y*~p*Q+sPRxwjuTzegc^ioNNpFi<_nM*Bom!}MuQ+Pm`^9!z_cju1zHee4JdL@r z&QWu|RY$FJCDE7k0@hrp^Vk{llKz41)J`j6T_1donf1yO=dpbj)OwW`wO)OooYsRV z)H?JCwGJIatwZZj>(H9xrk-V}buSE6&rDQ3p{RAQ7it~qf?9`Kqt>A&sCB3$YJABs zb{#^s`cc!vNIv^(1Otc!fGHZ=%kN6sK6H=xETp9M=04@A|M=Zs1JNUZyb0XFW87dfsQqn;lsqsrgMvXrZS)@+v# z^&FiM%aa~MemVSxIxf4AUV(U-Ek6@iQ_o);Kfu`ctf=$6&pA_XFjgY2fzjNL7q)R8 zYj$e}>tU=+`K{Jf_>}j(AMq;p7xys?E1oy?XGUFbT~YhF1#0};P~%)?<75}i{gyN8 zKI@-N|6vliwU4vY&QeHsv;99m=ghmFt7I z$iSXu>)=?_`+yD_2k}kRd*+>}_sm_dne(k3p5nM}j{1LZ#Zkwp2i9e~5m*mTqTZiu z!C_9^uifT;FdyIhjO2NO_Ltw{y#)KAfi*v>e?@Pa{C_u$(^3C7wg=uI-`}P`yKc&# zM9u#ZbYWh%qULo3zNNiIw5$8_*;s=9-a}pgu47H&(Ra+a2BXH+7d5U*sB!sVbG9G- zko$4glMvK<`wm!=_8MSm-YXQx62#uvBpctKM1SIc54ew|KM$}e+n>N@xDiW{zfkFv zAB1`j(Ha|IRcwd_u_)!TVld_6U_H`b-{<;8dL*j-z34~08udBP2rNk4-Nse17;!OF zJ>J+Dov;b@y}HNok5{n{9>n^%3iGqwY*f7=7)*LStc%65IeK7m%B4W{=gVE5lSsdd zjqo@YAb%^Wo=I4Ucp$2LFt(vwIV?hYew&^W8GhV?Oe)q3ZE`#C;&g#Td*@ zes|RVX^TrK7mUra@jeFkaQ(kz^Uq>M@^|Ab-lsjmWgL$`akG3bzg5 z@6u53g?6CUh1r;%>;E*o+=u=3#9Uu;;ScIbkI(3zGwQkIHsxC5Vq(=h6DLvcB;1Un z@dxh@+M(XdHATIbtB<+3POL^)Kg7!ghyI=bigglb#5pN&jKfuM(djK7$u< zKc2!(*any5F`SL(a2%e%Q0#$S@e;N~wKw4z>o@I%V{V@3=V31ViQ#^{ufb(_AD3g3 z=X}n9m2oYGqd%TR9Z%_Aa38_;Nih#jereuU4Mhk0xj&|)Tq9&&QkTR2?AH?LN_tMz z`@XE0oH#M+_Y$1ZjrargrobE6oA(xbF%9<-+fe&+Jw8b9$h;DhQEoA+-PBRM-(tTe zz|)umuQ2}&aV6K8!Pt)SeX%_*!%oc0MjV2-QSaR@;&YDkQy46_0t5Lw{?^!+`p@G8%6&)G^9Co<{&Q6S z(!Sw%;=Z|{q<_`17v+Po54K14ug_?F%z3xfx(eS8;P^nDk56z5@%Fc@3v4$BXJb)o z()V1SDfj0c>lD|EH>mS53};Yo2DT!7BDQ6}j6&UCre!<*AN8OQ+#j(%Rm35*QyQNT z=f}asxiE}+Vkj>^qRKzOLFC`UFs%e9kCz!mgVmpFh_d62S`6kFwcwe4f*|S`EEFnxC82U#YUrk=dkW)jw||6 z1(#qcT#N-Viu*win;-Sbl-ptLhsqDKadphf{AEV1XV<8IAs)dRq%Tu_^m{%QWqzNb z+Pi{kFWDD!-}H%C@3qR>cpNIf7p}mszqpU4o)1`^dS9XT|6^Rh`0k*dH?E(1iQ2A?&Cg@a zgxW5W_H;a*#Q)eXzr!>3y!j8S5~oLB&KQ%E$ z2-h`S#&xSO>ikKM+TTgAGsi)+v!|mB=hH)Mt@~Bfb*zs~?`YEt;sdTLU*dW??r|Tm z7j=KT1LJdkhT|9NAA<3?el$nj-~V;;bj;KEFfHwz!EzXeb4l-oWr=-J_rp2xKJ_O? z_3K_7PscjaYop4)W}J%8ViEE;Wissyvo=B9ufNL3co^qC45a)zRDZ*a7AtRHod1K9pf#6IcP5%Zl}HD=}h}U zl5&2i`lHjD`uC#h--@b#DXRX-sQQbewtJbz)V~O|eJX2MYEMTp+HHalwu?#P=}3jQQR7%+?SX1H!1^Vzi5FONp`JV6CGw1Y{yT*_UU#65%Sov1 zol*0>IH4)u0q?L~NmTjVsPYdInEVJ-ekdxxBPu^NZX+Ha-&h;BX5;xLo=wLs#3OJs z_QVa8_rguY?zj=t;d;_9a~`YQBrkLP^+p|kRZ-`wGipBnc$)qA8Z~dXQ2TK@>NsnI z+K(wc%=z*myV))ZwLfp7_U9Z_`TnSRanEMTWx%AAON^?2Lsqk20#N(K6}4Zg{^#j% zCI0Mg=IJDAp5~$EX$)$fGN9(^mJjW5Jg!BxR{>++U*<9G?n51)Yf$aZL5-^cs-O8$ z|htN?1f&ZzNzV$sler=Z5$xUd;tb=0{3L$#9#)s7RYo$rNAJ7ZAo zG)2u%R>f?0x1cG14K+VUQ2pPCnx8tT?Gm8o=T-r;{hjDPqP|u7cSQX;AZVt-RTrwTuKpnTUQS~=QjUxr>czRXF zlzWV^=QnDeCZgsk6xHs-(q_C{P~)9|8gGBpcvGSFY>il)TsWrp~m~K zn(0q8YP@|>?bSw&H>|1|S4Y%1%c1Ivs$#Bd6H(`HHPmsL4^@9o)b%VqYP=6CoAJ&; zjW+~Ut}SZ3!Km@NqS}wCWZG$s+P{TS<4uMd@1Kfhyz@}wom<}=wRavdt2KakJC`=XnWLt%z+wLGSqhQ zP~-Yt%Z#f$YFwF6^EaxdnYYZS@!hUr#4F+x$p)UW&mH+O=|Ij4Trq&} zjbd`@Ylr&WDhTztRW#;c{C80EaT#?U??D|08&LBztDUF*HL%YRJcfNSG4*#tSL$ty zkGapSi-|}tgc@HS?92Evp!VDMw%mtupZ*3DQtmnG{_z?nqn=%ug!IieeKER`-Wjh_ z&dd6~ji=)X@ohYW7x5r=Lbcl#`_OKE)cz=ii5Tx_2BZEDM)kihs{gG}{SQX!n9i*HBTi`^W=q^ zr>o699Xlv@5Y@jusB&vi6S)cm_3&b*OPHMU5jhs@S5U*3t&HALVY4R&r& zzJq)5EbbzI0PZ2~iMufa?!%O*av`0}@e+hOzG|Y5uga+7s}Sn=%7Z$-;-U7(hmK}m zqEPd46SY6Kq2^^ZYF?J1=4C2sUV5SCrHf4uM$JnOyg|A59gHVXGhV^QO3 zgBn*O)VS)P##IJ2E)UeWGTZdTsBuMh@pN3K+)`^_)VP|X##IkBt}UI-xE7$=pMx6L z7}U7Bp~f|`hZ$E#)VNxr#ubd(Ulmc~Duo)CJF4HQQ2kDd>i6&Nrr#G(TAQN!TM^aY;;8=4>uJV60@eOt)c8YC`>g?L{B8rxxW4r_<9df0 z*Gts6uA#i8jsPQF3jqguCGrq&9`B{akX9;S4 zCZp!39cuf=sClS|+P*Am|Nidl={Qe(z&Zyt5B*W|5Q3VA!-LHDB2dTWV$}HNqQ*B8 zHNH^P_?n>Ft&Qq;RaCphQ2Qkjs^1?&O}}5E`h5%4?+ti{{18+3KMFPe$Ef^E zsPRw4!^DAB57hp1Le0bX!Db##(7$`!|2?;s7|we`@_q3Xdg4jUgvYTfs{C%`R>ddW z#?w&$cjr02BK;cb{;=H$bKh4V)qWwXhfPm_sxSFSbD#L$#*b{dju<#m*Y8{i)V3?%^!qUh}}nG>ckK`>8iIrs@@%_^tGt%!cgO%imHDUsvggA zW?bn|>B&&-x}c7au{M98&F^XRJE6w;2UYK98^1!ecL!D9WmG>djW_Xe)OK4@e>#QMB$FY5D?)u_)$#$tYKf-f+^bkErDC$_;?w9^RnIei^mkJV70)8|2bPM;n1 zIekXd=k)t#n9mi~qCV#fM}4j^74ec6b zk*IQ~P@nT1M%B9m^*P^0)OO2oC~?G0)BiBsPdpQ~eoR7ruGJfNvV9Tsdzolzx$xtZ-(l32~@u`pvomg_1g(m?|0f&zdxY1dy4A! zq1n7oXS?avXSkdFc4dy)e;ZNXN1lfIzHn1?p?r00#`a0DHL>$tPe(`MZ^ZS8GZX9k z>DA{U`?WH5BHvpv=~+?VJCBQTDIZOFCk#a$H&s#fR-EtYh+z8yc#-t%_=WVO_!)n& zy&Q%Y$X`af)`h9K3Ll4=`M8Xl=QF7J*oT_u?f8}L$6G^D^Vb12&n;2&RTnkSKB#$4 zhAQ`$b~Ml5Q1wQm=J^?FyPK$aPP5RIf4;yo_IKRRqkhMIH|Ay@Mq8_)wkv}p*{%fJ z>36KpEi>ogF`P#Fe*DFGu?5{Zf7fCmfA0HHe{T?iTF+ZqlcPSb`?u6H_WRJ`*pP8_ z!ys&l<*BDA>hBglE%A)~dx=-5{k$2cQEoL(CvJoKyOVmTdW)jIx10oD;>yLwaj5*R zHm+=au!!@8^q#1B48cmY-v~92^{^swVN|>MumbT&=HokYo#m__Y+nMOV+LHqy#2-= zd_N%ye^D+~xToU}_QhWu4_)yA^VR}2KNYOL%BS2U{ENd^b6w!`$3gg-xGFwj`wIAy z@t3l(AHEi@z)C?8>@6YD9);d9}w=)fj6zp~BuL?_bMbI`}o?o#}R z(^21(?Sb*g_s016awX>vjz`5FsP>Yh+FP`O=ThQ6sBx4+{a#W&Yc^{t>pI4-@0Cuc z|1Q*b-+Br4IeOq4&)Dyqx5U_X(V23?Y1pSTff+q(_Z^zm2P}H|uQxYQ6PGt+xeH>+PR)X1(2qT5lVn z&Z{aof^u#fxsK3}csPOh#|BTwSUiO~9(Uq6;s{K__(oVeV`Ab4IDq_OsPZ{+3~?6J z@tO!n6ThK9Dt`+{5uZkt--Q#2SE0&>;dtUw^ydNnDv0{tN6t-V91hfWzeztxxhPCZ zy-P5F@4HMQU*j2p2gtvJuH+xY+SET{GxJIQModonT-4u9d_}Fdk(h$?%UFlw;|vyX zVIA6H=D8TIq~81(osPAb9VMfv`Vixp4 zeNQ`yjhCXHKTe~{?Zph(V!NrQG5(?-mC&8^64pYf<0BcW-WP1=Lp|MzN3b58KpjU5 zQQu3Rf|*s$rbnXse`Ti`?-`s+J4aF9PuYh$u9l*X-+8FxcRK3$9fvx8hog?)K-Blm z%c17CIO==wDX{?a`h5rM0R20P8s~IW|2w1l^@eilkJm1ib_k_i!DhzV_B8IGDI7ok)&4?M`(tq+?G8irV*slC_SlQK1?qmNKB~PMn2Y?f)}q!tsB-CT zoXGlnKkr9KkHQV~=c3gg3s8?M>U-ch_jx+9^Sr;2{igjj$$Ab|@3NzwvEQGoV|_<@ zeztFS%$!HHaW&_~n&W2unuod%n~u89k3`*v4Z<+?Pi<>C)Owc>bsy%9TE8=*?!&%P zukOQcqRO2>-G?1S)w>OKAGRK~-D1>zSnvs+o9JIT)OH0>+vP@Wml?HPJXE;_Cr!DI z7(;q()O}k?)c=)FWW7vzwR0ME-}Z|1YJMDNr_J`saUbc4Q0@Fa#d~bx7q|x>qSDXf zZsHTD_NU`q#(ACXqBum(<4onFlOLZyp5yyRtZ$#JyHV%+1`MHG1nT|FTujdUnMtVM zHAsP4x8tMMiA874eRM4>Lc9K07=NEJ>1$ExV^Qh-un@Mj*0cIsb6DG-H`k@6*p>d2 zLS63)VmIP2e8{*aV+Z0fsC6dCWu7BRPmcpSalN)4y2N@%yR&ef6Zbth7elZWNw&nEJk92jWN@U&AiMdr{-rWYgDTd(y*j3h7gA`UGr8dS9GFdIKDb zrExaq!xrQ}W*&<(Pgijn>HE>2xHR(^!Mt|E`@HWug9SoqAKf{ww_p~WVbde8nEiJV z|FD1Np!Q!V{wA(|)vTj=@fr8k&RB!|c-PE&`;YiJ=~1ZT@F}L?IJ}Op)AJmIFUT)T zd0n4#U>W+^4E6U>A*lBU1@CfSLV6aghwtu~`wGXqQ*RB_b)hV_ zX56W7n{_v?^<$)2r=M7FTGwNF+8K{8sjnxNBX&pCclQ?eRmA75hp`s%4y=i*tP3%e z^*IC+k>1>z9}^NM#_H(6*Yx-2P1a4?dxrzr?j_bB|DN@V%|B+{irRh^4xoGw)OubI zbv-VNx*li3eQ|hRy#eVXluCjHv38U znWs_PEoZTM#eC1fkL;JJxE;r#?xTjI&hG)(lJuT7Zi71Co8nXQ>*ELVYhWKg&SUhW zpFXJLH#shK;{BcV>q~PyN1=}MK{$*2)>xVCiee?~{lcV|M5X6Nr9XVmx{di!+dZU{ zN^gTzuqx_&$&P`3+Vm0FoAkPf%LBj7cy^=yPyH4f zN8nxJ$rwbrRH(n3yz$FyH^SNol^zdO?%q%1>K{B;5{Kg*>KSa~{&<@>9X2HY(sxte zD(evIclxRSPydK^Rc-=5y27FBGYB8BeM@Xcx-aT_w3HuXX^Jzg15oqR44Yt}^^C(S zw!iJLG3lwSQ8Ave@nP!(>+64J9MADS?Jh@+*B3Q^*Z&&VSw~uHSzrD!`Kz%J<)_+s zfVI7~TwJf%`U+XytyA#<;~s^2AF<4)N1?`l88z<1))~&Go*-)_YbI+F>kSt#2Zx+b z6Vy07t>2QFd47k7_&cyWsN-lqzU6w=1MgD)b5bvdJHLN-9u;pwro^WzKIb?)m&D8Q z0!yLd&xyTazc1boW1kaI&!Nq2Tnp9C$wXeU*ZHxi>vag~I$a5MeiT4mZ*$;af4={n zkbZIgzeGL9K14moUbpFIZTeB0z8&=(yAXAM(HC`|bw)i$wy|*&)b+m(>VBdu>i)tP zb>ETQn#!8M=KoD#%DqEv_Y?`xqodY%hJ-G@}LaW-pORDax1 z&zUaPuklU%9JT!|8y~msK|N=#MctRAz!q$u2sPiU<9WqC$G5<1l=~0$yqUq(?570Q zq~s z^QilR$dq2O>*`@_O}r6x{ePUol#4)>n~Pe1YopfR@Z=`H9xDBwo0p?4oOom483IY3CejJ#S>Kl*Z)eL8bp^O_@>} zjKHn+~^ye6^!VT7OsPY{#lF$9B z;dOMu9;C0JKOs01Yf@i~yJ`137NFe^SeAB=p|)F$+AfB6RbTf1OuHGaZBTz7S|9z` zt_Bvva#$}3-%~_Ar*K~zSy63a$ z<94WWMNsQWZq#~`%En2s75S5CN9)H0R6n+(?qAm9U*YIXkKiCsv*uFIOqupOQy<(r^zG7{j<6fYi7RJjhQzoT+PmH+2u%D+L4XSLN0Q_=oSPg8y$>U+MkY&^imK^RH8 zJF5Hv#;N+lQ0YTa+oj88<}WGg{_Br7<6*pCu^r<&kJ_I*u`lVHup9M_MeWD_sQuFp zwI3VcEc#mwwS74o7ek$Axo`mW1lx8e<6zPU;UG+%o8yt~{}B%%zH9SO+Wghz|Kz>S zQXEQtKOZm0Fsz5(arykz`ZEYNGr&0c8VY9wG#088i67?Sb3Ti#yj9R}}V;JenQ2m^N zs;4*Vy+JNizf)oa>0b+Z#s2;0ZPa`DsaU{;>p7|)=L>qp{(a|4RP2WO`_69#yc|>L zS0sAV?k-gR3e@>CABQvk8L0OhBe5sPeSg&Vv6`X2H&qTtP_6{3oDcS*TsBm>1gLVK z=DU2g6CL<2R3B=8DBE~6hwm_?mxtz);y))(Y`*J6- z1?%ZSY>u080sk_14aQ}EO+qK!R)YIU^4FotEyQH}?&)mQ`@j*XaSpWkU2!4xv`4L@ zm2G+n)c+?cj6ayCyf!}z>iZ+fQNL%K5Oc-l`@pon-H&-M$@)#Ze@S0Nz2C4O>CbQ* z@qO%1yqrg5A3^?SJVyKmmlJOzU%z9p0Kbqv3qRvz zTuJ^IRKJH}IPp(Z|6b!k%00yc7>O&$PhH0B@9L=iQ5JRIQ5=U+t|PX^Wj22fu4cQb zn1^(y0Mp(_;u>uK2Ah`Q|A?UeUZoZJ+JC{Q{TGO9*}eiUW&51C1m~gJpNy)14Em6s zx-9oQq<?!_5#l>IL%;ig`kjgM_=o(?Y_EEo;s)XdsQD?5`hAD< zsQKKETiI>{ZovrLO!+0K^7C*b@e|2)!mXUC*9CQ-@{jbYY*&j|^BsWduRrR3&KI|^ z{UTIsY6IU?n;GgnlJ^PLsS)CbG zdgfi(Tqm+(+kt$aAKNicA1Zmp{*Kmd)H-?*XAIzTNz{GF4s_7&A}mHc8=tej48z@c zqoS8%Kd#5dw9_8<5huc&IEVhVr=2>um$(@1?!gaLy&SuoxV~Zv=C7TN^PwAYa#VeL zs(3kEiMyi8=eBWD8%I;0w!ehRUxLYqN7XX(F%)&5)E#yI^R}j!BQf>fLER@+L|q5` zQTIu{sB$i-`V7AQjXwsO_%!N%Xd3E1DIcnQ zQk(v^nkg4rpX(+2rwca3TB!Y8(E6~Rd2YUi1)0Z1Hm+}V!Pxg?xQqSxrY_ed%H6`e zxEp&yOK64Z5d$|2kp9dDPo~zCMDckKq)wdK?-#}D-T~ME!24O$it%YBx zuL|ZSy(oSlc0)b)N3%b4ygkAo#(5icyq&^e<|kfDbKU*dg7c01@3@nCKcKF=moNe8 zr!gtzkD#7+_Fz2Hx8hUU>xaXg_}mip-sVqp)-mGzn2`5_=}`OgV>6TA6L~f36M|8+ z*A8``(+qo4ZxD8+y&BkyxRQ;%QP;;rsNajf)s*#{aUVq0-w_WIH^g#`(+PEaA8o?% zNxTx3?}sTcKh~xGT&Vks=*C`-`~3fcnbzsStlN}}hleTmyOHsO^|>_+b^MI8@gQq= zYg20jEEkvi34F!xEfvRFnfM$H_5XbyH#GHJL*0KKN2TvXeSdKUUSK{)quT3$>fhEN z6VE^&`q{_E%`q==VjE9x;KfZC-}}Oo%u8QuXDm;8bJX!t4_mNZb=2`v99#SIy(5m7 z!?fp(^T^MJ(?}nUN7;YX@e2E47ak&BfU*By4E6kd8CS8tgIk&Fi$Cu3qh8#DdGIXj zvnTE+&Vr|j)8b@eH#|wa5l_*NY^_Z_aq&0#e@Op@U-1vVLw~MMFYzz&J#5YW!6eG- z`qLZZ)Bg}mi0x42n_~jvhIoedB2m}bYgm@`>on^3!q(wX>h)`5>dT6%F9XKIl&JcW zpz3o$)#ucf`z-4FO#FQS>j%!Fp4<41cq@LzaQuR^@H39aPk4^)b$woknwJ%*>)j%} zLj7~F6X{d2Fzt`SZN$T|h#TKSXlL3F!88LIH>Rh5b@34Od*Dw@jq1lC)b({Us@^r& z5f|e{<}=3Tf50iEzrwTlz~)D^XT4(krFet>&BK%APry?+2v1`Vyh?t3JV9Iok7Fg& zILhD|Vn0;7RXUh@%cAZV3gdV3bK(z7hTkwgYJUFMdcNXM(%;#7){w8?d0TIU^_eK?D{o*YB9vjufMsnV6} zFMnU`kKb6QKXf-g_NDz4z*X z`aWzW)c0XMP~V4b*u$(Z)o~8}s)$<$@ID9iJ-#fc=b{v-@6{(lJr~`=67>HV#-;ta zsQZ)|n1%g35+8FM^y*3bjK3}F{<0zJc&Uq(DHnk6($fxprJj|Tfp({3M!bM}j(&rh z?{~e-_3i~Ork@WnA=~vr9S@Z;6aK~6b-uSb{~BR$%GFVfl`x9_?LpmFFGJnu&cs)w zPePp+>HC=VDGp9#yI-VFz|Z)Ga&J)eKF8O@wJ4{0Dqu8mDZEL3chr6IXk5ho-)Ypk zum{JGzZKQqDtyOwckw;@Fm{%};g z3sL z+s(mv)ISyVey1nu{m%R$=KaoeRQ)4R?{`8`^>;wszqYXX^)Np5R7dTPyf!@>>itee z)cc)OHs2Ywj(w*+z2A9{TE}kUcKZ2_e2xDpCZOJX*pKwHsP{X^us`wap=KT?V{AWB z?{`8`?{_-d^k%5{J3*-TJ5_9YQA|kv`S2O(sZsBD(hf7{?GNJE{eyaM@EQ|Q{weCc z!9CP_gBy5-?JuI<8-%cZ?Eb^Vly8Wdmy)RC_#*1O-HCc{unD)|YD`Lf%TVRRQ11=y z4mbPb8fu)!QTyWns())x`(v5SpN)DCGX+&okWH_K+8^an`=g}I_d)HC|4{oQ9cq8X z(7yIZgArz)YoOXMjcUIbt|#9Gb$snbjcYk>AYOnvFJ|Gt^t@+6^=FKvA6Z74^6^mX zZVc(8@dvWrX8wp{iC<$J=CLH@G~ThO^`buxC%=bHZ-;-`?ySw_Gbo+L03#odm*UnV+Z_EhVMDy+w`onsD4~U_2W2d-8z8daVx5w_M_RJ z{FZo{^Rp4E-Rh|OX&)PVVRyE3N7a)K<4`_1_9RY(`u)&tsPRE*2$e)23=x^LH z=D7Px{GEAtXUknf9d~WW*Zv7ajkf~UWcyO+l7YV`lA0G(eQQwdEwJgctm7r)%Q4oR zC-G6+Ij}SJ{Ul%g|76QYqsIFTyO4h$vrvB<%IiF7gzm(3FpT_9qf;@f2lv~k{df%3j~$qker!bbquNAso|Z$Mr-f11 zg}kWt<5_p1-m7jxm0N*P>3MI5s%HQ$pdT@){r>@Vyu8A0jPC*J{75m0`#k2c2dch~ zsQQ|r+6_XrTM)HAY(t$-8?hYwZ6WIU#BVa=<+_$1_4(OZ8z04djC+^$gUw$!#eC0Y z7Tz4dx`Jt_zxZ@>KUxqUlAZ?>lb#hH5NE(l#IAUsI00rP{yUB50pf3%fjAP2((Ybt z%zKnYsL%f*rn2snJ_-wC6I6OOYtxyg{rdQv`fA{R)aQ$Ouj7TPHyx_pn=?#&3RTY% zRQ(NYoEg>5EBdMY*RxIiPbBrMw)p*S}dNeri3B>em)jf3nOm{YZn6)a#1rsMi_w-mJdOuWs`z+Wg`+fAT!D{b;5WkRtA(1+vZ(osYvV7AO#RnT z^Eb}Mfv9;*ZR01D*K_4X)N|y_C8oYssQu!L0hG^xWpD?o{4!MeQcF#_Mb^~IO!ef!)2R1(hp-Ci+psdO!b&(F zlaN2iZeQ722CI{Q0~3&c0@eQmsK4jhjuYu$I2Iy58mm!0!%EYS7-Cn_zZ2_wbMLVU zCD?ST*UtY8H|C{*U6^WL5*iz1n(0_?}MqSza!QpZhy816e$qSD>h z@}8F8`#nMYmi>K-xFO?uv(C)(ZM;hQVGLj#+p#J6>rwN$2%8X(wQ+wNx5DzIS3w;g zB~iymer$|cFc?!{MRcI%@eA!YBF??uyvIt6Es5vhQ|4j3bth{4xA7$JlYKUDJX0<+ zDm{UX+oSedbNoa74X`B7v=6d`e>Ux|4J8`{EjJm$R zrrZtoYb_gB!MVg2QSH9Qcf?7za37BO@B>cTP5T^YL-88-Q9ZFR{q2bQeqbeQaqRFv zOZNh1)!4srd{Z)NWTG-@%9LuRG@W!drHG=a2uUqPF;Y5+CQTIeHl0H!>8OKbN;(-8 zMv`KpGBijhA%uxA65j7U&;7sN>;Jj#=eM3`t@Z4+*Is+=HDR3k%2?Cwm!ifmjk@1< z>~%ixxt>{zYF~_laEu*{%~`HDYP|0F0H&k*oof$l4(rKBjq`@{TIVIsQ*i?GF-n>3 z9prk1T5m_^R?dm2?LV+7ET4}We~U8y5B0osALo|#+l|~mr9L0E+!$29%bYJl?a$5) z!Of`sdKtC+B0Cw??{Vi|_7>a0*0E*m>Gfg#$FOAk?R}{6Zn0OR_PZf!{h#wXYx$2+ z%e~?}$BuLRSzbS#UwXU|u1C{R*P{(^68CpfP{&y=>OSNK$@SiHv3L>pUL|B_g#1o=atU1XYsyx;?3~+wS61cpDfoCxvot6h`K({o<-dk-_CNo z_z3y~)vwN5!C&956C2C^w9O08Z>`2;-k&exQ@k%G;V9~lp!$9KPN?s}3DjT1@zh_y z2Kdx=zDKa0LR4<`Zk<>|d<(Tb&*Kw}^C)J~-WRo8pB;Su=)WI@wR!)xK;0L81hxH# z>}BuqyB^1PbDTxL#yEI1-zTvH^L!e${0Y?c^#SLP?VE1Tab9kRy&pd32I1YKcn%Qt z{izpz%Inf=XPww{Z2wg9Jl1<9ld0dkuE1AVJ_&nr{(1y;|2zY)V?X+#-p{v6>YGse zbsF{k;Tx<)`yspnKSBL|Q+_wkrEtEjj`}=!8MVH-_!8@@%p~h~x^g&|^_0dL^ly(p zmF9BN@cfT!+7~+~c%gw};O`mT!rA-7DfbwEvgSd4>EV zYTU2!8J7D1U!{F3j>G4%6w4=|*7FnNucdt)JW5jrWG%W$I!Z#;J)nu{~8$*DIG`TiWBXGwttv%=w7* zZoqWfbMQvm>tjpCy8uVCy~i2%$3EUi9A7`;F}~+LOS^s#NGjm>A;$gjli&f=@syA1 z{~oIU8>s$kQT?ySrSxlq{n)?e*q{ANXS{0|_f=d?eKBgDXQIZPfW27$3DoO41n;I_ z&rf;oj{lxoQ{2k(DX8U>a5~FZLM>kgr?UKWsNaRgw0PVdFhWFz?Uxw?V?bz{L&X1_;nQEx(%?fxG>pKti z@BS?Ng6lixV>ZrUKQ2bi&-pl=97D~|&!6-Co#WtroX2*Lwb$UkEME_&vHTTySt-Ux zogaQ;KlFU&QPlQyITWswTjMQk*UPB$6ZW)#0#wMV!oX z7vdFI?B##*@`o^+<;NTguh%eK#`X=wwRj)Kx8nXJKFs^J0{(g)#{pi>`*q(@eox}{ ze-HoVzTh&fb{XHhkA(J3_@CNQ?US$z+t~}x(C-#}k@Xy9`^xZlF)w0G#+`_lV*Rhf zJlDW!Z2x7b{Va!5*zVQG!|#!!@kxF+yb1Mvt|orKy#3(%2dMu}UHfmsagvUOjMofx zoYX@dCrPN|WDM@5e}wxvAI-;)$h%SJr?vPox!Skky7*u6UjBaW4)Q+Q-$33 z_ppYgRldH4xA7x!az)}!riftvsJKXW{g8=+pG>UfA;L|w1bEve4vdogNzF2q$VR|fSu{r-D6u6{*e zwri#HQs+6S*Y{!6@zNZ1Je9&vY5(;!?^8UC>R*WZ9{M)wbzXt$-xIZbN7VAypq8(X zpOb6b3aIszK^;d&e+$cfY=xY3ayh8$_{sKe*Lyf$>3k_(d_LzV=l^~U;}@ac zM?X4$gxdaj&e?Vxs{bhGuBhcsp9=509jN1eD{BAd+wrLJGo2qo&C6}5{cP>_I<^dI ze+r7iID1fex${UoOuxpc_0>d;S042~{Oy-8?grF$ylfYvmY<1wUuL7;msMS_XiM8) zdEcr3Asm7SP|tJhcKaK41n;M#oYz0a?Hp(CpzimbR6FDMDh|ir?U>8)R~z-ZU5a`x z?_$(*d7JQS+UMhOyyq|eUIDL09j{k8pO53U@_*J$;%RO;^O3B}^j>4nN3@g42sJ-1 zpO+Hr#JpdMnx}tCr^HU;ul6R?{>&&9`d^IN-V0HG_q*!cP(K&7eOu27K8Qb%Z*{)L zHnuh6!g80`GIluXdjA2uzF9^$>bp4Qh(LQJ2V>unqJL@qO_WbzMJvg1@p{d)gau|E~!)#49gM zDLHN`+9KL@9OXGbX1^*Q+Ml;i+N`(e1yC@~ro$J#tP@VsQP~+WfYuHI_zmCfkwo}V}n-q@Aqp0KZGt_Ze6V?Cys=+7lG`SAyxLkT! z*zZaBJMB-{gH^)*bjFhYiD7%UqmIk_P{-|oOG7=&*1+Ew=X~cAY@hn)*~Dt$_`48w z{8g_W=D#xb<@?ZuIIlI=v(!IJ;CzK=>Awe`;&|DB`g@KS@E_V|;wa|fdip7+{YmdP0nj@ zF?o*jbX-Ip={y7%l6yLL!v*A4&W-T}@@38!<9za&%ftGA#plU~QTzV|ZhM^THPrrZ z!>!~+sQu4G?SBtmpY*EChn-m`B{qQXEw87f#L7^gj_nw4blsF#KG$iPsVT8!z6Twr zy&0eHn`oEcq5j=~2d_+tmBs6AQ+u>tO6(%qU&it{8!yCh7>^^c9QLRmjstY*~AZ{yLtw*hQ#*lc<**=cx6+VN)B1T&__{ z$#dsFlJ)&9qj5^?VwQ`uyQwR$z?+ztDcBj0Q6G`S{TZCid~U~%v~R^5v0RgslIzIE zSc(33G);-6(!LC5vHYlJVcyH3=DUdYHnjgk*1S(>o)UY4@8dPGs@9KF`F=mS1;-Wb z@u>E4tx{rf_;bs!pC4lt@+){AK82;RJ(j}E)?xe@YCc}Z#(aKE!({RiEV=K5Z*zR@ z!%ZBAORhsh-8x9YiPY`}8s@ivaU=YPOuoUnJ?Bjp> zuOI%8eEr<48RA;OK(ppx&E7n|31QV)~NBjp~g=`^&iqB^zVb}Umn%}JJxp( z9%s3Sa5p~5_xhf9g!k|DsO?{Y&3K>9$ENrv>UWP5sPC6Y@kd^-&+t0_4&$~vxlZEw zv}^DHPQ_9jUk!V*JXXgKd7b~Fy&l^$nXKp3hT~6+^AMiI{;20U`=FlBx&ve6pHR=o zoxtZfUwni*U)+3GO6+>ZOUDx|UkAU#qxd!LpQC=K-jCnYz8UrV^b+h${WNNOF6zbm zgYg^m=6L7*@YCHXvH$oT^cg%oh~pBEk?+D6skg+H_&5Eu++zHl$2gqB za(^(+e%>F2IGel^56AHw7M5qZ=~xyY#W+0Om-7qz^DSP>aWJM|xDM!px(--}Z&6RZ zk9or1@8$Z5K=)1^d^Ve$|-Iwb+;bE3qFg@OWoXzl(owk6?dt z0qT9zs6XdduJfwny|fQPjdL%m-$c~=;Q+2@y&u{?F@^2yI)K*?U$TE;65Dg={xH9v z;{xXCeH_UA=3=Wv{$2tX(mvEV9nW%of66X-AiO`aQRks?sQ2CD*ogj*;HAv(Abgl{ z+q&KYE79Hv2h&~`E0b&DAo4amm+d<*Bb@L4B&&ZBYWz=8&toQ1XFX}>JeU$2#ytE? zmS5TT+&b~*bo(86H+lE4aGrY;bw6ga^J>)h z-e>SJmiudHSnoE}_2(exw$24Z!g4RzoQK2r-Y%F)|Bk5dy)~Vyp}zNS8k`avNxd^_ zzpL2egF^0#`ri8++o9zuWrpv)33!xzF6w*lJtM>Nm)X}I<9itOGN^g@{!z}W_=UX^ zwI8`7LcjW`?My*^-`)R6s6U9>t_n7PIIkx;2i5+Zead#!_RyY=`o236wVn*re2>iH z{tM#|#U$zj@Hjcbs^mLSpVwXSDD9mvk@gChMf>-oQ(~j>Ssa58quxIaa1@?{58&&M zhvlC{)!X4cxMWl~Pdtk{Pn>4EG*0H2uv{tBIG?e;0k{S4$F>u~b~VSZ*{+6o8QWDE zHU5I}Tp#oMVg^1*u4WHB9r8pROM3=t`@VjP>nz?MTTuDWaa_k@o*jm&_p-IzzH%(r zk=!?!h?lYbFFxu0L$#MdwZHL1Xdj50ug<9Pe)N8PjmOxJgIIh+j}+O7+oKbf2o>rMM0)cL#z>UEklDI7mNQ2qYP4)q^U^{*#-J~4y(lc?oxK#f-& zd*KoGN5|nhRK9Xr==V7O$^Dl!}Z(aIDuU0S?=@k?_ZU%A3qavo?T<-+y1t@ZEI`WFBmtQ zao-v*xnmauX6|d zllD_>1p(k?*;D-~4_9*Gc5nsN?nyd=@LO=lTwpy%rpYYHz=p>r`xp z#k`&klraVM?>P z{P0FNUca=)A`~soXHmyQuko1hxIW-JWirVZEC(-PUFAH`f&F)K6mjo)OGSI)b;jU)OGR`_z3lM9Er8?Q9Qypk6~5D;qTDXPNK&7 z3N_BBsBw0LdbL+j<5hZ#&mZ1LQ&E2}I|lW4pb_SW0=B`w-r+g`kD%^@y^meUYw<<;zl15|XYqOR6x91? z1UACEu?Kd*>oEiVAi6_(}S{q98j)hu@%PI{2-ch1BK zZYO_fa01zc#9WWjsm$_dgH)Hz7H# z6srG#gQ0(CRR8Nx{mY~J|Mw-=FZ6#MbsVe+Iqg@*RsZC#`1~!yae|BR99+Zqv=`~$ z%9TB-U_Joo{O!|=X2vwSnpCKr~N{It@qBO zp?@1x|7NKEF;xFkNBI1u|BI;Yo*8o5A;wkz&R>WAjZyvUqWYgc7W#jKqv^j8)qhIJ zX@!ih{;j?V{VzxLzZBK~*zwT+6C6wbDX9LVLQdPsder~iZ~2_(I5kb7<22@H zJPx4#Abv)^ljT0b_PCM#Psfirt}py9%=-uA!Q7{O1vTH(P~#0o&3g}))BB_=PGa6W zq0TF9Q0LEvm`(c()a&yE{>pX@$6Al_9QuiH-l&Pme9rz$ds+TnnVndLd>!rG>u`Ld z*7FozKz%eW;{B6>dVlRgjh~BEslWDpSUv|gu-t6CndP3sF8By`##>S2-i+&6t~qMC zD_lR#c=hXYUm1^G$-hHI`zL(gP5B|LuL>ryzI&W+!D{4cKZbED;3mdBL%X)~C~hWy z;QSK4PM+!9f#ttuds<^X*4xYDEU_=(Yb>9Q8gCPhVV-_){U~bwKf|%qFFWb&K(&{_ zakO`J`wect8Z{ql+`be~UBmC`sQGx>^)K*8w(lcs!hXJwX?6KK*q?ac(;kPKpG5qD zTmyf`n^FDR;#Kr(fmhNm6E*)2V^i86z=pKXa{FX#PTuIe8e5PHoIk*pRZ}z19%I>#s+Sl-P z`u$N9-nR$wFu4HrzFmw*$TRU!S*|}(@7snUr;YiAc0ll z%JF>y)juWVv{9!*|HR)z|9?-1{(qqQzk}+(9=p@OGpc{{kkhhRuh!q1{(tj&Jb-## z?!^z8&%05_PdC*2`ocfL=j$o5K3_A)T0X+PEPp4y!u;R+XZT#b7Dw>;-3+z-8S47H z{hgf2`#Y}~c`jldj=)t|#C5=PIFkId+b_pQ$bHX*&%2(u{9&#iabrEcU*Tia6Yx=t zLyh;xU!na6RGx+!=P4YH592UwjYIJY9E}xXsj-(BzbxuHp%m)+r{`fA+Mhv= zrlaPeJ8C}Lqx!c(^-pp8<<3i(7p-qLYMcqEaqd8kvyt^_`*Q3&yqoveWE?}i#d)c* zHJmpZ;<$LukEK&%bNPMnbxdGBuXk?dTmi?@@7GePv0oYY0P4R>xd(qBZ$i!6cZ}a+ zbZlYGGGV!jc!KuxQT66{0molA)a%s=|K@dUkNWoo?vm6Was44IqTb*2EWD8V9M`Ag zkJKl+z7{W{zRUGI{Ehk>uJ6MN)PHpSYy6k`LDx^?CDhBGAGWUy{!INp*IUM=mfY97 z3I`A6-$kH)EBB$^#h!TM1)<&nRWD+>;j|w^)hE!d&&?5di1*K69M5w1*8phJ3M`1YAg#+;N#`__o`6m&!HiwZKwYz>fIAU{}!nJ4N?8iTon5Mj4#oD z3abBOA*bzPJ?h`KLU_Ge;WeYU?~a=1df1kH1!i%+c$;yD@w?b_sMm2g?Rp*W#ld{P zm~e4wtT*qkhw;L!SevhCzZ9Rrc-|-LY1g=`aX-s1L(NNzOH*UDhx5B2D%V9VR|9L& zewo`VU}bVy=QEX4V@Fx82$N|)g2TCwy$$cjHFyV3!C^QIt6^8X9qZV`l~Q8^$Qx1r zU8?1H1>-%6mt$YNlX??uf@xTj_Nu7mD`O4vd03bI{H9`RYzX(qj$mKf^KfQO&Tpvk zez_!U&u6IZ*^Kw$6{zicvTB%*Ow@b~L(Rv7sQI|p?RTN(<5uU+sQGA*nvcdfl<~@= z=HtK1c%R~7d=T?d>tBsp?*!WxH6NFt_U~NOe0)_UZ2x}+MdR!?Wus8j~Tqq+OBsm5A(4NH6NQ$^RWgsA1mFy z5H%ljoM)isV*+YEM&KaE>xP<-_V^H{pw?d=wf>XU!+PJh<5BZ*7i#}Hq2{A1>h&yz zgQ$~byHWE|8#UgHq_91sP}_4CYCaC|I%+<; zT#*{9!*bW7=A$iYKANNUzoFYNLA@V-tQq!q59)o8gR}S?T8bmdb5QS-p{VtBN3AE- zep@5#|9aH%{XFXZa6Q(-R@jI2E=>;OPeG0IFlxI$suQ;Nebn~mp|&>{wY{&oeHQ9? z9g2E=?nJ#V*P^z!1!{ZiqmJV;sP!DL9k%y1I|TK5wMNbNWvJtIXRWZkTTt6u8#Vq# zsBwN_zO=m^>V@rXgWBHasO@cl+TIkmmqi^<-_{M=`!Q;~ZK&;i4Yj>1QO8*}YCZR( z=JzUlDm85HHq`bmKpjt=Q1hFP+TNE^!uZdi#uo5<`;klaS zsQaHY@B;F!7{iXJ`|ycaME?^_L;F{_qbYxXiRwSq?c?x0+UqwD^IHRNVBA|#`_mD% zeTVRT`W0Xq`~c&ye~Yku8)SYf<)Z3qQT2)~!+c(Zw=>BVLzS^_zG`f`wDR$`7EAdxqYp|@$)`DMtdGEYsmE&ZsL0V6&yjo zWjGk8;6~bq-~g^ay4yC`hU@T)FdfUaPA$2wQwED!&tJ6vi9cdZuKO#|{s`mM#u&E1 ztLc}I`ri1qU4*w&?|3!e2RL5RP~VUKm(F>dw5wa6c0UEGG+o{g?AwiE3jd%JCk>R%u0 zU=7sxrCk5*uCSh?sO|X}Q>gF4BJ#U9mhIkxr^uV|NpcQq`Gt169cPE2_Im*8_=!-* z&z*QB<6nTOxT`nWrYePQVj_Vl49c-^h9nXJWlUnk9{&Q6Rux)T0>U;kE&cl0$?eB~_j&f1+z7{p_ zFQMjr33g{aKMxGY&$oCJ`BT(!w#E4s*Oy^u>T_M6j5m^pV<#MpTF-r`_4G!q=XUHu zy=z7ow;gKU>!If1`v*e%VO0AEsP<-VuVE|L!u!MWk6=Ic@2>%2USG9s?3w;=cFUOp>I^Q}X)UQO<*P`}sIconF zqV{hN>Ue7KXxOjIaT@gm`v>(ena4tWgY92WyVg4eHEzwvLjK$NS?7mP^>ast`j^hb zojYU6b~|r%o|qY4zb8?z-#xZ9YP;&^YWz^^11*p%x zzv)+j`p>A((LK0`adzU`OZlFK*YNrG3hMK92I}+mVcQG!`Pvcn`8t$wOYR5Y7}h@l zM>6hw)cR-RdyKQf`7L~$_D}IKd}U0S$7T2(+c6vUc{vg_uS48k3-vkKbDa$?n|im?TfgDepB5(1iP|)60TwS<730?SquMQ{;MhD zwNHiPqAKe6`vFU~3$|)e*jmKBnuK}p-i+eik_rK(w)c?ebc->dhu5lKj#u;sg zpvJl1HbRZF1;?}gO<0cSCqKZo^h+7f{UO>fNBw&bi8zY>6|geL%bzSKzqA8s*ZaC3 zKF9UT9atri=UY(6$sE*iItg{0j>c+i?+Tnm{ZqUZ-$7lU<)Z$sf9!;?Kbffg>1kV_ z_U8=CX+O4-wVutW^}LK)&kI8g~)ud&_XVnfkHm z!KYB)O9o>X+8d+3xBM_Id~cb6st-lg7qOnsIBsUR51obcn1>yx_t6Hd{3ze&o(cIZ z`4Vyw>UYfMv}+z4qkbo;qvhy76w?^@17+%O;KeMz2G#FZ)c4sR@Er2jsPB0-o(^#2L^1IdhIDo%b%*Fnf@!vy6y>5L%PFu}* z_fc=~Lg-%+)juB9|G@mve-}Pa|9+_cT|!P<#QN0#yv3pa(M4gNR^T+AC+>(^z8N;D z%I`J{!~A6681C2ZUJ#ZWfm-f9)N*xD^YbO!q4_zxB#eIywS8Zpwr>TNOX7WoWs~^) z!IJfboc1)^bpiF`FNXdfp!#n|^`D07{{&u4|K_OvwL(rCwlwtrd%5=y)&Fx;|K+Iu zv(--jTB!aPg`C!JS?Hg(B7EOW#V+kRAEI8r$KC!Y-c0*I)c4T4QNOdk=6Vj^LVYQ! z-#hps$IDwUh3#67+O7qt?Ro&UT|KcY+jRkIyZ&5RlGCn7&C8mXL;vSc{imS%-+}7i z5qHqPcva~CEt1okqWZ6VCG?+)>OUUUzbmSLJKRP8pH_$dUm`iJE~@_?>U#gahYLn> zp2GRf`2E@Khj9+=g>FA5CoKOLc_Hn;y1lB~FTvTg$D_t+=Jqt4OM4x+cXfM5oJV^* zw?F9ie)v4?z1;q^+ehOf+DEv3q1$KU3$#yn`|ECh6=%`D%I*8yzFV30?QVZ(ZJ5WG zQ1iGLHID=FA-o$Otj2R}sMqnFkkf8i!~H7iudWOIXQTR0L-p^8>VG2^(ErS+|m?%+2I^8r*=tY!BmpiW+wh zYTS9KaVMdUpVp{xQ$tRB?42-flXt_oHSu-EtBjlQ8Pwh3>!JGZ*&X_CK=pqG)&DV6{|E588a%g-+W(WgN^)9TRR60#2-n5UQNKGjM4i`C zP`^7Sqkea+f^XO0{fl{+g_@rccoo;1gRu|SE4@(jGS~GPScQ5v)@{vmbNOL=vr*eS z7PY;dF_V8Uq&1G@-=979Vc6ciNKUJUkKxRZLjT85{U1j4Z-we#4KsQ&d){j1^s=>O5a(0?0} z)5@ayPcI1lN1*x-LiKNf>Ys|)^nd4*&_4&sY5y{=`fn}_{hvj>-$$d~?_E*v_qPs& zelO$sIm>IvXX&TqWm|Hwvur~??JU#DMb7eS@=0gentZ}p zwjv*QmMzIgoMj7gC$?iE>zDP(9h~I?_NSe*e1V+qEV+b?Z|N+*Zq52}66486TEDYw zsP#L`2IPazGL2m5EVVra&hkp~UT0a4obN38_if^LIm^1#cR0&ba-OqHA#Zb*b;!BS zvNpNr#ie3X*&kW6c`Uw%v#dex<}8!RU7Y3RMSdy#p1J_Wdil_&hjGiSZ7(DoaHPp zBxgFyc=8Bm`BRHn{7`3Ej`|>HS(cpPEH5A@RxA~p!}iK;Y=1>(xs{yYEVq#3o#h+k zIA@tlF6}H|C&!%SX7X9qtM$oE5d?ROhgk0ZQ z9wMhY%Y)=v&hiU#va>8CCppW{$l3Tj>yx#aukp^Z7J00*yn>wNENhZ8on;O32xpm0 z9_lPFC$Ga7SfBi`aV$Q^S*|Cqa+Ythd?7AmdAXYTDR7oAllMByRpdsMO2rnlylj0X z^W`jCkyD*zOL8q|*@B$xESr;)oMkg|qO)vDj;~xQwv6@3TgY+F@@8^rXW4}ubC%~f z<9J~l^_QKg7dy+F$j4c31$CKTpYyM?yqbK_S+*t@I?Gn%0%zHhyw_Q_Am=;F=Hy+@ zvKe`YvusMvbCy?;w>iruO?^;esaOunOU-|Vv()_e zcb1y}zRptf-`iPg{(Cx0&3_MPsrm2bEH(dKoTcW!le5(PcW{=P|8~w&^Plc4HUBN0 zrRKk>v()@Ia+aF^`p#1GpXw|%|9QBU`H@4(+nnVPa;~#{n7q+h4koX2mV?MS&hjDh zDrY&6Jg*ApP1YwDlV>^0MdX>zav^!Dvs^&Vc9t)YkK-oBlPk$boaGAgL1(#~T<9#9 zkqeyVi{!n|aw$2Pe;oLA#+Pxt-;@Aj;f3ZE|onXZaqvhjWSKZqD*uau;X0 zo!rS;zC-TdEc3|ioaNi(bZ7Y%xuvswlibu*OS7xtW~kEH{xWI?IjZ1ZTN{9PcdGljEG_Yvj_-aveG5EMFy`tsagCxt3h)EZ2}v zJIfq$k+Xb-e9~F2CZBMYFO!cu%T?qf&hjPlL1(#=T<9!UkPDpUa`Ikhxs06eEMFw= za+XWUJDlYba-OqXOy1@!7m;(FEg zMQ3>rIl);*L5$fmQRrLo#hzvE@zoV z-r+1qlk=P<{~h=Ev-k=7BQvQNJIj&e)6ViSavXm=Tfp*iGP$&~oJ7_i*QzeF$rbTa zvYbUuaF)-J?(OGKwJS=2+xs<%kSuP>xI?Ki6jm~lrd7ZOd zNX~JV3&^XS9^iL-p3yuew`BhPb|bIG%u_mg`%%YEb?&T=ogo3s3w+{IabMDFA)_mDd{ z%Y1S>XZayH-C2G>Zs{y{lbbrrUF1g2@_llBXStJ{>MY+Q@2JD;!0{=MbN8J=Q_)yTF$Z)IoVluBquq`8_0>y@_KSbXW4zt*2FUoP2`n_nCv()cJS!rA+us*5tbEdOQ;QDWbv)s(@ zSwo%WCh{O>xsjaVEH{w*JInRtzRvPBa&Kq3j@;8(zDn-lEZ35|ImwMxY_mQ_b%e~}WXZbOCW<%~Hus-<= z_iv{<%bB{L>nvxG$2-gEu$r;XaBDue_ z{2#fmvz$Qg?JUQWdpgUf$vvE9ZO(VyoaIy0yEw~nX2YA1Bv$mZQk2&N7o+%UO;jCp*i>$VtxfQF5ZQ96_$=EFU2!ILqPW zcxO3`9Oo>Dl1n>FozG*=QlB4t@mC$csNWy*ouz(%*ySws`@;@rsox*+oTYw$INhjJ z>@?%aMZ6!1oaGSeC!OWPzrj@a*ngq_o-FR@*e8Ton=H` z;w<}+7dT5@KhJZPy{RWQ<~ox3m-_vuqO;WRKMBrKzyHLp;<}LKrOqd3n}jTNJ}GvV zI-i_&mO7slIZK^SPC84SPfj>XollNCOPx=SI7^*R4mwMnPYRu-&L;)VQsU^@!S?YX}<1BSPS>-HsK3VQ8 zbv{|*EOkCv;4F1MnddBZKAGh#bv~KtEOkDa>MV6W$##}HpNw~wI-iVnmO7tgIZK^S zGM%N)CnKDt&L=~irOqc^IF8P8JeA1uot)+0Uw>Lv()u^p0m{T`Zi~&>-Ah`sq6KP&QjOw>zt*o z*NgC6)+cp6aMD@oe)I`vsr%8LnsVM`dHD>vgR`7TZs#m#kkg&zbaG2)IgQ-ZSxzN4 za+XubL$M6&lREwfIm=q)3}<--c^<~Gywv{8a+cbkna)!ClaFOtUgnW^Im@@nJDlZP z}V!`8bOeSzZ>ik2uT9XL*X;!C4lO+d0c$$m!1V zXL3ttS@OIfR%iU7Sn_^w9)uhdc|Tw>%g@7&j5o_!ZXnNemg~vMEjjP7ywvNR z@C>UrS=XQ}6f72a?aW3fn6mBo{l&4DxAb`2e}dS!#bzI?MaXC!FN~@^NR`pM1nw-bX&@Ebk>3 zI?I0K0%zHmyw_RYL(X@W5qX!h>_gt+ET^^NeCaHEQ{Uz+?YwzIs2Jl8S-9dc^*06S(Ya6a+amYJDlaYVED#XQ}(Svz(>w=gxGNOUYB6QulKQIZNHo&2W};$^D(B?&tP(mb#zY+ga*Zaxy%zOz@>OzgXStT#(^;+|kGPim z1Z@4-XLz1)9^A3s5QqMb7be4MFA;DSdd53sssplQyoTZ+3DD5ouyhF@c z>UoE=?ZfLU^}Iu|v()nrr=6vqcPMg}?~+eCOFi#!!ddEhhvUvNk9@>g>UoEQ&Qi}i z6go>i?@-_@b-#A6v()|MsU7%U#_=g1=J~^HXE~TW-dPSJk9C$0k+YoTKys$De2_fC zS!R%jI?D&hgPi64>Yx3j#L+|yb1BlmEYeaYRNvBEyBf&_PqaM#BY5U~{>IuO}##3+Vy4*;; zWiXN#Qt$1$+(f-^Fp}l@-+0&MX6o6&NM1xe$94HS^>x8WCQvVMUFK5fZ`5TZD^Ne{ zx_pDWUQ~?a#nfw|_D^o1&SO9_l9y2L;kw*Py=O3z6{(MRU2dbE9gJip>N&2s}+ zMzS*X0@vkR)C+@=yp;M`*X7&PbSNvKsZ$ya}{@@;&Nt!AR!RX8T>2JE=Dc zMzT8nd%G^*r`|Uh$u;yJ@4DPYJv$i5wbXN5m%FL23r6x)>IJUL52zOgBe{^T$dkF&kRO#BX#~8NG0RTkEt&S zMsgGN9j?p0)OQ6VxtaP&*X2IyMZrkEPQ4;08EwDZPdzah$z1B`uFFrTw+lw{a$cYQ zuFC@I8No;#dY~P^=`pP)~252y8MFr*kB~OF&zypnpB>+%TovB5~zr@q{Ed6fF9U?kJ1 z7q~8uQ7;TevH|tdd`OgRKYmR;E*Qy%)SJ34k5g|MjASF~{au&eP|pZPvN83kuFG$! z&kRPg3H5ER%kQY?1tWPC^^>m46V!`>k!(smi4QStzxEm;kx{l`mSIk+fqO2y8MlLQ81F%P*37R zzGQy!H1*_QB->H%;=25udbeOC+f&bSUH(CRY%r47QqOT+{z-jZFp}3%Kj^wFrhX(C z$qv-xxyaD=$-k&41S5Gp^>o+e8S3qVk-UNWAlK#J)Q1Km*^&AJ*X3F2OM;Q?L_Obi z`49EI!ARan{j}@yU+TrdNZv%f78gOg$4$yoGv!>#`K}!eAu3QZLO#Sjq8=rK!gSBiW65eN*_(Pi7rEMgS%G>&Fp_UgOTh@eWUBL67}3*B>Pc6=(?;-{YWs9_fjv-MR>{ag_lx~3r6xj z>h)chiPRefBiWyN57%WC>OF&z96&wGb$J=}vB5~*Pkp)TvMTje!AL$po&Od^$@a-4 z>U)Ec%%FbSbym{DMsfu80@r0->V?5bK1%&8 zYWrn9>iSZKk$jALeNbgv$J~J4}QPj7&E*ntK z3r6yB>L*>74XGCeBRQISMZP3z`(z{PiNQ!_QRm-=FR9DM)Y}CkIfi*JUf}*}+Iopq}HpY)yS#Fp~eHUf{aCntEX{k`t+y z=1aD=U#3%!3q~@VdVSYr8|saMk(@-mhwHK}^`5~R*X6a;byEN%Ih}ef)c(oqsHX-aIfHr^*JTIl-GY&vNqvOt z@_Oo-!AL$seSz!p2I@bruGe2)4_*JUT_MZrkUqF#}k7}|b$BlW~! zBxh4kcU|5@yQh~pU8v6tMsgnYjjqd^spkeG`8@T5uFG4f z9|=ZsKK0VvWGOkmuq*YrU?g9lUf*@uje4VCBo|Qcf$A^2Q|}p!czoGE~TDSEo`5>gL-l>k}p#4;JUn% zdZ%C{mr)<&y6j1PXfTq?sn2p<-bH<0Fp?{%Z*yJtqMjFwRjXF5 zTD5A`s^9Cq_vf$YV~^M4Y@c)Od!4hLo$I^*qc3NdpQf+akVnyrp6~f(BfZ#$9HCcb zm!F|m+mJ`o8?(!xH`$Q?rgvwTpQZQMkjKzRv&$y>m<>5fpU*BoM_;fZ|3lx*EV)8*-AqE4%y_eYXvH z8oe{SJeb~PL!M3_&Mpt3kJylB&}XyDcKVzRIYnR3E)S(|*pO$^%U z*P+&*Jd9p%L!M1<%`Q9WZ8qdIy+6DB4t>CeJcmA+U4EB7Wka4zU(PNMr?1$M=h2H^ z?D=FTz1W7Fp;u*>-=kOCkmu7Iv&-+(n{3Dn=-t`n59mEM=d;Tn z(id#Vi|Cu#<&Wrk(G){oOy7=M=Rf|KzQcyRgx-){cGGv-kaP6*?D8jc_8yiYFQpG= zmq*ZtY{<*#)7j;b^cfrSa{6j^*+XBmA?N8OFY)~Hr}R=A@(OxQcKI`Utqpl4y*a!5 zIlaY(yo%nNUG~!ZY{&&Vui%U{x$Y{+Zq1uymO<*(?4HsrPR zitMtFUTH%v(syN-zozfDA+MwJzg)KFlfR*N*^t-MhqKGy(noB_8|bsyWj}q+hFqer zXP3XDZ`hDG(#u}vuP=X3FSj9YqSs}Yf1uafkT=s?v&#W`n+>^4@6Rs(NFT5vZ=p|S zmw%#9*^sx=m$S=1(^qWB+vr6*Jii>I7u%34^eWW(BmY9Lwjpn)H)fZAr8n7-chI}D z%fHckY{)z5quJ#UeawbjrL(8@*4LMRr?Y*x40#uQGrRl;U4N9okayF!iz@Oq z>1D6*{PJizd)~^B576tf%YW1BZO8}dt=Z)<^fnvvA$osyIZ7X}Avfrg+2w!eQ#Rzo z^yTdGSo(?$`3Sw}m7ZVzmtJf`K1yegTdyx1qqAqO47o{f%r1|kH`$Pn(Yv$DV6 z^imtLkY1Bro<^^=A@`#Fmk3HNQNA&K`d< zVs?2ZeaVJ=GQHr{zP&t)UT8xeK(ELy&!$(}kWZnrXWiD^`1>D}4oIrJVI z@~QOE?DAatm<{Ft z-)TcWlir?PUPxz;HyQF-boMyg`uuX1K4e4k9-jlIv&)O<>=`9PKAX-SWLvkF7t_~l z$mh^YD&6HJ^imu0x%8Usa*keWLzdB-v&&2AEjHxy=)KwHW%NE9^7-`f?DBH@gbn!u z`eJrDPhYYj%jpHL_5AV*dZ7*ZLV87Zc_qElhI|oyS9W<7eYXwyVtQwGxj^r-A-B_q zv&*aLBR1qq=(E}7HFWlTkRe}6U(YVDrEl1fFQb>e&i79)(#vhg9rU{F@;Z9G4f%3< zYj$}(z0HPv1-(DJyn#MoL%xzenO!c?r)Urn#d zE^nq++mNrJH)fa1^d=j!lHQ$N-a_xOAzw=$%`R`HkJ*r~qt9oTx6v1D$k)?1v&$8_ z{^*Y(tLWQt>-@*t={s!5H_#ih%RA^hZOAv$+q26%=^ZxYo9Kht5OE%W1XR}M*@K7{oLpIR4 z25Rg0$UW#>Qzb)wfX+2~TV3u+FSj8-NUzH-_oCO^kRPJAXO{)^4jXbOoojTqKEK?X zK4e3Fm_D6d?n9rkAwNQ2%`W$)ui20vrI)7&`@3+Q7u!G>(5Z)TS-r0Y#z81n1%?YQ;)h%ch=upz%e zZ^$lROy6lkev{swU2dm$*pO}X!R+!S^dTGaTlDGd@}=|{8}eZKYIgZD`kD=S2)*R( zo?q^um)el+^qTDQ<@8z`@=$tncKHf=iw*g0dT)05N_w9Sc^G{>yR4v3*pMCc#q9D` z^d%eeJM@ABJ->W4z0ijIF1;eVd=0(QhCH0UE4!?u@3tX3>7Ci-Yw2A!q+2!l# zBR1ss>9g78>*;eg$1x?((7%=AJJR0%Qw;6 zY{(ze`?Jex`hX4DO`psz-%OvfA%8+&&Mx0VU$G&NpclQv^UJr=i*3jw=~dZf4ZYfi z?4dVimv5st*^ob_cW0Mxr}x;9KckOkmj}|vY{;L}=d;UN`hpGFOW({c-$B=#Dlz0Q z=oP5*U%r!GX+!>!zAL+Y7k#%4`73&7c3DU7vLXBEquJ%V>0>tJuj#yJeCzAW_t1F{ zw+#6kI`666>hd7^ws&nA^0)Nuxb^sj_4FM!WIw$jyL>Nwrw#c#dV6;HK6-}@`FlFA z>27^~`F{G44fzK;uXSv7*+8GMAqVLEPO#PG2k88aE<^s2&U5Bgmmj3_9415liO!nZ z>heQ$zQ;1;pXtrn7`@tt{5!odyZku4$%gy~y*s=71iiIy(YW-JiXS2JeJ;^U4DVy zVnhCy-kV*r28;S^$T9k4cKJp6lnr?teL1`Q5`D#nJf2=upX&?1OfR+}PoP(2m#q1s zY8!H#-ke>2h2COAo=ES_F273evmyUSAI~noMxU@DPoghom#y?A8*+kP@Lta^zfLc- zAy1}PWS8HdSK5%L(065*-=y!hAy1`uW|wXBE*o-^KAc^Ci#}pQo<^U|E)S;9*^sBx z*R#t*=o>cV8T7LE`TogvdbtfbMX$>)52e@JkZ00cv&(PO+ib|Q=!4niVe}yz@@)Ea zcG*Fnu_34FtJ&pu=xa9QIrNhE=lOx(rI*@}=hADk%fsolHspEq=IpYQ-eN<}(0jAX z@6r2g$n)uw+2!}?Q#RxU^yTdG2lN#i@y*s=7F}=rzyo5fQU3SyQY{)tKe0KR0`hpF4DSb1$Jc6!^5-{Xt^zFFy z_=`uTh1EJAE~~{2P7EhP;Db@?p;} zhv=m?^m>~e&@+lIWK-kDta#dTVz1UwWGj z`3Su~yBwnr*pQFXC$r1r=u3G`wc@^N}qcFFG$Mb$Rs z6ZFRH@&DrHy^cEZP$@Jdr@@#sa4S4{4 zJiDBxPuP%8p)Y2a=g^mI$WwU!Df&dNFFcoCY(t((ugWgZqgUII#hO36oT0bakWZ!e zXP4*G2W-fv(I>OZ3+Pie7&`@9DU4&d^UYPyS$XXU_(BKzL{NKM%P7&81lLF?YMP* z;N|okHe?ySA-kNX@3bMGM{mzAub_9>kk6+NW|vpehiu3f(5JJ@tLQT}WI263yIi1e z*pM%zZ~s)zk5|)o*pM%x@5(N(q3^aKUrg`LF0ZBc*pS=lquJ#meawb@34K1hypFzL zL%x*0nO$B_*F~Ke@@4exxOM#T2Ko*gatFO3yIi90v>{(kZ_h4oq<7emub>ZRmp9Re zY{*yAr?bnO=`%KD1${NUT&AztkguYbG(-a%ioAzx1~_>AY5chU=O$SQh8cDYKgv?1R> z-<4h7Mc-{hzLDOUUEWRavLW9@AI>iCp^w;*)%4lya*aM`L%x~5o?YHc->@OyLN5#7 zKY1U$+=hHBy)L`FpI&c6*3etC%XNC24f!^De|Gr*eZYo%JAE>{e2_k6Lmo(9&MqIK zuh@{a^rFvtez`#}wjtj^ugWeTrdQjL@1!?omygh!Y{+-fyR*wj={+{&B+pNy+2tmE z%!aJv_Vd~0WAp_Z^4;`;rd(h6IK9w@d=I@MyL^IPX+s`F-<4gmp+V7Z8?v6>iF*8y zd(gXV$oJBRv&%i{BR1sw=(E}7Ui3K|^8NJn?6QEqVM8|1%RZOu3-_j%+mIiiH)NOl z(0AI9AEdWum;2H?Y{(DM2eZpU`j8E|lRlkY?nj@oAwNuC%`W$+ui20vp_hE#^UEjE zOKr%H(rdCyUIQBHY?DFaK78~-@^xo{Ugx+UEHqytl%V*Fh zY{<{hm$S=f(pPNApqDh~{P-+-sSWvAdR=x|O0Tyeo9OM?<+JG>Hst5%gW2VC=tDN- z=jpTA<#XwCHslxR>)B-)eZz)qrf>hE=an4pHJUuLwV|{2IM3yWCE%w;@~U zt=Z*E=xsLS*Xe`V(_6F4SJK;T$V2FZ*<}TN$cAjE&t{jeqR-iohtk)x%U9DkY{+lZ%UW`N zd=0(ahCGa3mt9uU>utymdTVz1T6&ue`5pRTcKJH`kPZ1=`fPUjditCVc{qJDyX0?t zMcUK?Lw3?DP|rW|4fIMI@-&`58?(zd(wl6^?{WL??D9?Y9vkup^zrPnnm%Dee(P|4 zzRND(Okc7g52hD=)$_@>(2H%zL+Dl6W=!@Cqf%GLCvWxp)@HNjbYw3kHJT{**qNUA~V#W<&mrKA&B_pT1y2{+wR$^_(9Y=!G_9FTEnW z`~bbuhWrJ+F}wUAy~&3BCA~Mh{1Cm*hWr(MGP~SKpRytQ=&RY~hv{oJb$^w#Wh7ro7f?57WAmmi}K*^s}ZPiL1Or_b1szo)Nem!F`o z*^qyrmweOn%iZ)+8*+eNlU;t2UTZ`Ck=~qLeu~~=L;i{0n_YgI-e*JpnLe3aHqxhT z$U*vYcKI3liVgV}dQqF_mq9PKA^%FR$}T@kueKroMsLh6dCx>qlMOjU@6IkiNAIyA z|4tvxEE}QAv)CWTj)3>7@|K%6yJ8Z~*(HpYMFVT0} zkpD+-&n~}A@30|{q7P=5E%YH9a)dseU4Df=V?!QIU(GJRN?)@f&*1T|+}{I@+^99cKHo@pAC67eLTDTCVj$&oTe{kmu>VV8}b6JF*vGiTpc{m$&No!(_bo=YFjE)S)T*pTPZ zXS2(1)8}l+8Txv5c^G}eh8$zQvUcA;*+DP2A&;ZiWtZQf*V~ZC)7!Jl@6tPL$P?(p z+2!H%5gT%xKAT;3(&uc*6Y1;O<@e|tHst^4Wrybc_K6i)?;&?{}oIr^^ba)7?uhP;&CnO**o-ep5x zMjy^D|3n|LAup%TXP1AbFW8Xt^v&#YkgiSJFys~V?YMP*;9uxFY{)C=yRyr_(s$dC zSJ6AO%fHdPY{&)raCSLFAF&~?rq5=Vf2Ysckk`=Hv&(1BuK`GNnWm)nqw z^t$YFm|kx~UPo`uF8@Vuvmvji_h;XdKA?{|e)0zTWOjKJeaePhqAzEcBlHy;@9<-h6GHssCp#_aMKdXo*gOz+MvN9jE_Fn|p`iu>EKYca3Je9s?L$1?He&G4#B)!yze1Kk)U7kj- zwILs*H)ofp(_3uFhv>c85JLrne-(a@)3GLm*()Y{)0*v#2i5qtDrp z+xQoJ>!>bg=o>cV9`v#wy36zFG=^t$Zw0(!j-xfi`PyS$LzWhHsmwtHQD8L^jaJ8ne^uD@_KrU4f!m3Z+3YDz0Za$rH^NqOY{jF^4avo?D9tX zk`4JBdcjXTzr2ZFXhS}iUX@+mOs}>f%jnJ766*zee@|C@)h*u?DBs4iVgWndQndve_W>*+mIFXs_gOsdbJJt zDtdEv`5?W;hI}=>Kf8R0K43$>hCZELZqR3J$V&QZcKI-U&4zp}z3iu+Up_)Fw;^9g zugfkUrPte#ucxj$}Jsi@S3tftpwmwV7_ZOAv%o3qP3=`A+oTj;&n4Kll7{A9|q;`F46mcDXOT(uO>czAL*dr0=#NYw4ZY<$m-o8}c3W;p}pM z`iKqrPWo(i`6T+B4f!tmdUjbv->@O;=w-dRzVONPavSp9^oH#60QycF@;&s*=%E)GYg=o>cV`{-rA$ocW<^l}^W{q(x*vV>l5 zLpIP`v&(1D+ib`W(EGE?XVM33$Pdydv&(1Er)MwxszV>OV2N#O)s_~ zKTNO6E}uiMwjn=4Z_F;AOK-9vKT7Y;F3adWHsmh)Xmz8UrleaA-_cL%`RU<@3SGlOdroKE9nz9WD9*UyL>Hu$%gz2z2G;VU%rlBXhVLL zUX@+Go?dN3evRIkT~^VXY{*u6cXs&(dXEkHb^3UA`9}JL4fzfFVs`l^`jQR#O?uI9 z^Y~*mz1W6qqgQ2@Z>Cq4i4rx9Jtx<$?4{8}cxEV|H0fZ?Yjf=-t`nJLo+&aY>>GRp;yXXrx2fZk$5{)FC}U4D?>XG0!AAI~m7M4zxBkEAbVmpkc8He?UI;19XJ@Wb>% z8}g_0itO?u^hz7@XY^g!Bp^pZb&e)&~;sSWuLdR=z; zHF~`b`A>R#cG*hrupx)(gW2WR=|eW;zv$E1*$fN14+2z6XHXHKa^#1Jf5c+@(c?^9zyJU}xq8S@9!g)c zA^$@!`AZ&u{5HMRhCG&DlU*K0ueBlnOK;6C*;Ava&4wJK_h*;ip%2)Q$I&OV%kR>s zY{=v3%h~1O^c5TO1bWe5J-_Uv7u%5I^s4Ogd-Q4>@Nm*^m?T#q9Ej^d%eeWO~8hJiq)Az0ig{g+^C-g2G@-+Hzc6kJS#D+YbKAT-0NuRSJ&!Deomp$|i8*++XHk9WF{*+#BL!L>m z%PxOLueTx3qPJ$3Kc~0ZkZ05Tv&&xkfDJiKpUf_QL7%cA&!I18m%pU1*pTPai~gSL z3x7o~wjs}>S7n!d^lBS&hTfQ6{+ixoL!M9X&MtpL@3A2-ppRykzon1akQdVDv&(+^ zf(1#IR<@Az&dVV=bFSQ}(={4EqU+A?qJW7ut~5&?~abf6^;$ z$ZP4lvddxmZX0ru-kDwgi{52JUPm9!z9oG`AM^Wzyq-RrT^>cBvmtMwuVXYz1)VpkzSWw{+nKJL*7Jh%`T6jx7m<4)BCf_QTl)lxlEtTF8@QHvLSDw zFK3s>(pPNATj@pr=lSJ->BTnWZS<<_a*SSWL$1&pv&-Y?O*Z81^zQ8PczTZwc?W$o zyF7tDW<%adpU*DG=?gaGDt$A%JdwWbs4YX@McEE^*pTH4Q$81jC41!{gdNw2ga*Xg^m z%hTw)ZO8}c-Pz^o^d1}XLHc-hc?NyLhJ1*=m|afMmu$!ldePCje(+3su?_h!y(+sr zi(YL*K0mfg^pbyjet90f z)P{V5UXxwU&}(hTZ3WDqU7k;Gu_5=M_hy$D(EDu2J?Z1w<%RSK8*(rDVs<%8U$P+! z=talm@yCnk#Wv*L^qTDQVtTC&xevWHyS#+nW<%~vAIvW2=tDMSA$>Nxyp%p?L+(dk z&n_>cZ`hFg)5}IZzr37YZbLqaUYA|Y)9Y=>B6@3fc?G@AhI}%;KfAn=K43#0K%dMm zucA-ckWZm6XO|1~6&tdcUi6SLyXOcV4tm*f zIX~V@FSj9IPOr-@@1xh-kguS(W|#NV+ib{J()+W^b^3q}SwWx7E+3#z*^sZIFK3qz z(pPNASJR7*_x$o9da(`p8hTZBxk0bCAuH+4+2zCZ78~-l^xo|95qh5u`8xV!cKIlM z%7%PBeL1__q_5bJRrHb*a{c3D^imu04fLAq@^N~t4f#fTb9VUzy~T!n6TLsX+;$Mh z--fKFPiB{U(5Gz3H`7T@`$u0}%wKil8y*azwo8DqW zzK!0SUG78gvmxJ3AI~oLrBB$92hta_%R>5+4OvSsIMMUV{pf`@ z^j+EIljyr`$am2@v&$lSmkn7*AI>hHOdqi!-%X#*E)Ss3*^uv{Z)TTIq3fTLV#tH& z+i~mXXDp`gup#T|4cX;W={s%6_tHDF%cs%1Y{>V~hqKG4(?@K`_tWRIOZJ#8TCgD- z=mjU`@yBP-3vI{`(5te`XVR-}$PdyRv&(1En{3Dr(Yv!t_OvbPu_1TT$Fs|4(v>`u9ugET6M6a|VFW~)gyRyp{(|6mD zpW^o2+2wY6j}7^0`e=6f68e}8*+`$yE?-JtupvJ~-^?ywM&EYImLY?_9k87TkO$M7vrG2SE^4tM525#F zmv5u@*^uq@@$B;L^a&gCQ2Jtac_4kshWs|Y;B?O~Yw3kH1k%k#@m(u-}#K6+Jl`6+s}4f$(&b9VV@dW#MD z8+vbc*+}oRA%9CB&n`bhpRghO>5JKA(3fn;-_Z-s_Wbg*^gXtWkzQy+4$>>K z%P-L@ZOFgScV(Afrth{P|4Q%9E?ek5Hss&vquJ$G=wmkI5PdPb{3?CPhWtCd=$u?X z_%(X54fzjxRd(4*ueKroNpH+9zfNzmA&2SR+2uFrJvQXO=%d-?H|b+G~TeKWiK7Jb{fTZSB=Z^y02S3H=$!-hPX-jH1$Lf>ga{+r&OUAEIZY{+BigW2Vw z^dTE^ls=tZew#jHL;i=pnq3}7U$Y^PrI(!N`DF*a)Q0>oy(YW-4!zcf9HTd9m*1tg z*pSE3d$Y^K>3ufj@$|{;vXee#L!Lli%`U%3U$Y^{=_NBcKYpKHYD1n#ugNZdK(DnS z|3`1mF1zS0Hsne4-t6*+^gbJMfI(dcg&r zU;d0;_ZOF6fo!R9t=v_ACG<`U`{3U(FhCGKpn_d2j zK4(LoOJC0}`{)}sN zHspo$>Fn}%^cfp+mcE)@{+_;OLtaELna%S9|3ELbAup!aWtRi=dK>Z*dTVz1M|ztL zIY;l$F8@Ryupuv{PiB{Yrcc?Bm(iEA%R%~z4S6}e=%PG7@GtaY8*-jrm0kXoUTs5O zL2u43|3+`IA+MzOW|u?sJ{$5X`gnHvclv}4xjD4ymwe-g9@?Z2O8*-7}oqbDsk3Q!0EqNV%G`l>CK4wE+PhZR~N9ap7R(ez>)a*1A(UH+S1YeU{hZ_O@`p|{zPH_->P%TfA}4S6$tI=lQ2ea41drmtp~ z$I{nq$Xn=TbDm%RmtJl|-b$~_F30HgHso#e*6i{)dYcV-A+PTYW|zm)hiu3dZa8{dfBBpKb}Z0w;}JO*JYRgqu1Mzv&`3?U7kemupw8u{a|)E zK_9Xq@1jp)GWg^bH&G9(vhjIX|9CFSjAr=yloUB)#5-yqDgdU7kko zup#fG4`!FA(}!%x`{}dU~7HoH8BK4(KdOkd9~&!unJkdM&I=JWXDdGvA{ z@=#UMhJ2hpn_XT=pR*yKps#0_v-Axca@*d_ ze?`uZ7tzaY$UW$F+2zIbdK+?2dTVxh3BApR+>73yUCz-5Y{&xoWOjKeeaeR1o4%S| zUPfQDA@`w|U77Ra<@9nJa$kB~b~#V4w;>DZt=Z)j^fnuEKYD+5c_n?ohTNY%on2l< zpRpmIL|@M?7w8){WD&jWs+=FMrkC50Po~#pm)FqiZO8-Yt=Z+Z^fnvvDfGeYa*;k{ zLl)C#v&-w~b2j8t>Fe3$_4ExJ@@e$4g`6L6pqJZ_Pp8*qmrL||8?uDnnqA&VZ?hqv zLGRBlZ=w&_kk6z~W|ue9r)=*2eVv*}gY<*oE;8}d2y z#_aModXo+LTzYqQxkB%;A5bXtKJ+FV@-6i4>~ddvj}7@&`gnF(NT0AFYv{|_<$m-P8}e=Rq8mKF+@D@- zL%y9}m0doGUTs4jNN>z8i|9=@WG%fryL>Xe$A)|deKfl~fIenJzLP$mT|R}rU_-u( zzL{MX)3+^c8M2PP9k9g78Gw5?R)B-)eZz*_NiVx8=f~&K%WcRH(;KqO=hJuEkRPFU zW|uFZciE61r4MJ9<@6C7au`uEugET6Os}*dKSAG> zU2doEwjp=ZJG0A|(7SBNPtu38%a_teY{*a1XS2(f(dTT)Pt(`4%N_I$8?upJww%Ww zUrsN#AwNT}%PwC*ueTwC-kx2)lHOrMewIF%T~^SCY{(}1baweF`iu?vIr?gL`D*%_ z4f%O`$t|8=zJ^|ELw0LHt zD}6Y-d^3H-hWt8xHoJTaea?pb27Nudd@Fs!hWsYI?6zEASVJ$jA=~J6+2z~l^)}?U z=&jl1+v#mKWJ7+3KAT;>hdyURewV(UT^>Z=uptkpZ@=C1 z%X<0_8?uw$kX^o)zSD;M9=$!gd>_5ThWtK#FuQy|eaMFV0ev>RY@pBCkX`i6?D7Nj zZFg)L@`v>8xb^&uAEfWFA%8?~$Syxb-)TesnBJaU?xc6vklpmb?DE6(Asg~1^x5q4 zBlI~N@(B8RcKK2Ih7EZnz3k3hKe&rtZbSCa>$1y_(d%uFm=?&TCr|COw$Y0Srv&%+$ zmkrrRAI>g6Lm#mre@&myE`z>cL;i-onO%OCzU{6pL;jXtfm%PZiC$?#_R|})%g@o9 zY{=iyd$Y^W)B9}5-_ysl%P-I;Y{);*7qiP|`jQPfKrg!6^T{vLi*3k1(yOw|FVU-Q z$Uo5=v&%2jn{3EG(|fba7J8ozIY=MRF26#bup$3KU(7DQN?)=e|4J{o$Megt(F<+J zztO9*%T{`|4LL+_%r3u9Z?Yl(PVdexzd`S@A^$-i%`U%5AG0C0R zyZjb?+uD{P|3%-9TaQ0@Fnxy&`G53=?D7!$P8;$ldV6-+PVcZGN9cpu<)QQ;8}exS zbawe|`iu?vZ~AI>c^G}ohCGH|cCY7`9rSV=a+F?|U4DmNZ$tiv-kx24m)>DR9!nq0 zE)S;<*^vLGPiL2%^cfp+jJ}#(eviIpLmo#jyD#U*@6*d|$m8jC+2s%D^)}=Q^w#XM zi{55Kj???I%OBDQY{(PoliB5u=upAu^~^Tk7k!W^f4Q9lD?Q-{*=CCL!L%2Soi$$XY@iF z@^pGtcKLI9wGDX&y*az=rMK9SQ}q7q@)z_08}dy0bawem`iu>E7JW6l{1tu8hCG{I z_CT&5?4y_4kkjZ_dV6;H8+wNgc`ki8yZkME#D+YNKA&Co(-&;W8Tw{+ z`8)cy2e%A)K7BiGJ^tYD={s!53+TJD%RkU}+mIL1JG09HdY273OCQcI|41LPAupoO zW|x1W&)JX{)7P`hKhrmC$V=#D59RU4L3+6jIY+O{F8@NWw;?a3w`P}rrMKCTm(d5a z%fHcwY{<*$v)Sbkea?oQr>|$1f2VKQkXO*lHgbOa2ff^eypmp*UH+3^Z$n;1Z_O@; z>1{UT0=+-G{1<(|hP;|SnSD$8ls>NC7V;YUa&~zXeZ_{nmR|I*=a(b&VjFUiUXxuO zO|P{fucJ3-m;a`>*pS!L`?Jeq=mR$74fN^ka+E$}LoU%*v&;X`*KEie=_QYNet9gt z)P}r?UXxw^mtJc_-b`=KF30FCHsmtBH@iHJ-e*JJLLbjAkEc)Akhjtov&$3cOE%E$-$J@mTla*|$eL$1+Vv&+-yZ8qe+^#1Jf zbozh|c^`c;yF7zFWkcRiU(PP4=qonlI=$qvTwi!5z0`($fL@bbo<*;zYY{-Y{i`nJ5^d%ee5qi<%o?o6vFSa2crPpMaGxS;; za+BViU7k;Gu^}I$_hy$D(EDu2$LW*V<%RSq8}bSIYIZqGU$Y^%?Zf(cBG(UIL@&1? z_nA5sSUX=y(YVyr`Ot$h4kj^@(Oy34Y?n^H@m!&-e*JZPoK;#ucA-ckWZp7 zXO|1~6&tdMUbKhjmsit^ZOA9ntFp^$=+!pl0rbY~@>+V64fzy$cXqi*@3A3^>7&`@ zb@VYC@~QO2?DBg0k`4JZdcmHaU*143v>~5PugWf$=+!o43B579ypi5yLq3Dvon78U z@3A4DNgvNHZ>CS!kk6toW|zzKB^$DoUa(irkGIeZZOCWSE3(U5>6JF*bLhLW%iHL? zZOG@+JG09bdY27ZMjy^DZ>Nvgkk6yfW|w!+=WNL5)7P`hJLwxX^fnvvMfCpc@*ett4f$gFWOlhmpRysh)0eZ$d+94So(_3uF9rWJp@&S6E4f%5Vcy{?9eZq!(1${BQ ze2BheL%xz;uurZp+@KfQkQMZb?DAoHr49Ki`mXHq5&CW$^40Xt?DA21mks$E`fzr+ zNguHxE9tY@MUzLnmcT^7=NY{(k=Xm+_Deawb@8+|^z+@HQ+L%yB9nO#1KzHPrP zLmo)qj$6OKViA3Z4OvTX$S$8u-)Td>gWjH99zgG~A>T8r&4zq8y<~sSFP}y)wISa_ugNZ-POr5g5280`mnHNT8?v6>n_WKR|5>!- zuv+J|4a3b$GeR?(5kd$dgb+dqA%qY@9wCGfLI@#*5JCtcpAbR_A%qY@2qA=+5JF5d zzUyAk^VfNFT*te+*X#GLwf3H&x49;FrT0gd%hLy3le^I;qstZOQ?AL~>B&p`ewjf} zaZQ%ebEC@@>3OcnJ?Q1pGRR$s`Lfd2 zy3C=sxF##nkIK4Bv+=$-gnmmF&99`zoM_iND^x5cgWBQzH@<@96GQMAK zLeFqb9z`#VE;pqYxh9XM*G8B5^g7pM4ZS_O+>GAgnmmR+99?csA8}0{OP`G{x1i6t zCXb`1r^S9Opl7%yYw3m2<(Bj!*W~f^>gaMSdW~!H1bS<9xi!7bHF+YvKe{ZW54a}l z=#$aqHuNdit)!nmnC8A6*vH7hIDK^vr+x>ytatvs{yB&`YDso#|z+$usHo z(d91m2G`_S^v>wAgx=+vY@`oIm%GwOT$5+hXQRvA=yR^gbLi>I#`(hC=^3ucbLoZA zWhuSLHQ7Y3jxP70*SIFnqqjzvd(zunljqa>qszVM1Fp#n=#$Z98GXt%*-TGPkMo6l z(^FiN7t(X1%YEp1uE~q&<@LIYv`5HWfi^3HQ7#Y zjxG5I{2H9cvCgeE)a*_ilz#3SiBuE`td zrP1Y4^fK4vjr98H@@RU4Yw{*~XLMOZ?{ZDPz82>zx;%zH=9=u}`uXVcSo(r%@@9Hw zMw~A^j-KV3yoFvIUDnb|T$8ubYop8K>2=w|HF+C-FuFXEKIEFbojx61 z*3oBNlXuWlSB&$8C(+Yflil?E=<;NGfot+kdS!HZ3cboT`G550=(3*P;+njR-XC3_ zN*{1d_RuGz%hTvnuF1RU$t(GOc{)ACHF*y`H@a+~=eZ{DrB_CmXV9x$lfCrj=<-Z@ zi)->edT(@j7QN3kc|UzJx@@FRxh5Z=r>-3LAJ3+zxhDJQ`O)P$^a9u9gY?Si@?3hA zYw{s_YjoK}Z*xsPOz)2_&!Z2xCj04=(dGH{Dc9s9^yJLA|9AmC#WndTJvX{+rsugP zAETE?mlx72T$2Oz#^~}QdXsDNae8-jc`?1mHTeX6G`eh|kGUqFq|Zl}m(UknlY{ik zRs8kIOX*pz$*1VW(dA|I64&I@^xEjMm0stXe1_g0U0zP_a7_-;2cyd?=tHi_XX(?? z<(2dq*W`2b)K%krVH-WoHTgU}Kf1h%Uf`M>rdLLnSJSIplP}PlqswdPEw0HI>Alfq zJH5{}`4W9Ry1bS?;hG$wC$ARg3$LT6xF%nw=SG*;)AL-Duh1)_%MN;#Yw}fkb98wF zy~Q;-O7D*@Z=?^nCSRjZN0&FzXIzu7)6=tjzwD%ExF+AA7e|*j(@R{FWAxhS@)mlX zYw}Hcdvtj#y~8#67JV?f?4l33Cf}w{N0+zJXIzux^wibk{NU~MG}q)i^!(`Z4tjxW z@?CmmblFX>a!tNRZ;meSq_?;xC+NM=6Vm(i^R7uI-=~j9mv_-8T$3Nr7o*D_deRyR zO@2tv#>Dpzyqlimnw+GUN0;}|D_oNw(Ho=7d+ANC$&cy1(Pb~a&o%i8eKNYdk3Qv^ zoT4YM>HFmU^c2_Rr}X^j@&S5*Yw|OCWpvp`uX0U(PH&AaAEdXrCa3BB(d9$*0oUXg z^vUS*VfvJ7@=JPhcI?M~dWviED|&u(`3SwhH914Cj4mIgSGgv?rZ-2IkI`FPlW*|- zt~a_Ip!c~Zzv24v=<;#;glqEO^u_4%33}362~Ez@b5Z9{y<-hE{EtzYbP}MBRv-r`|(+No@??a zdUYYw}lm@;Y&T@I`uxYjS~} z8(qFc&vQ-wMlX*pN9Yx<$=~UX(dEnZCfDSD=)KY9EA&3sR zSGguvpf^XCU(#D#lNt2>=<+N2fNOF^`ebxDL!WX@u0&7XAokD|%gPxKzwG3-l(}eZTxOJRc7 zk1mtx4X(+}>7CK#U+G=0$t~!^(dFOhBd*B;`fPN$1bxmmxg|Y)6W=dW=ozlbF}@!b zN0&>|OI(v%aeZxcxfH$5HMuptJ-S?)-r<@oqz^`ysq`V&?%f z`jl(3n4X#+`!SuK=9=7zo*!K8(pqQpL0#_Mo-@?&JV6c&u~rdPA`luSEd)aCQIqn(PbvR#x=PIy*0XAh2G|x z+>_oPU9L(Wa82$-pNuY7qffae%jn6Q`+k{4PjOA|P0x)kSEuK>CikJ2N0)2RD_oQN z(i@}8HR(;R$#QycbeT=>b4~6?ACE5AqEEOc_opXs5&Lm%dWviE0D5k8xeh(gHCaKg zj4pHNRj$bc>8;V_y7V^JGjd&X7mQv;Yly4;pN=bAi`p1!s3m)p@ZT$6S5;^?x7UgDZOiC!OFZclG; zO`c5ej4pSecey4{p$|uwJJLs7llAo3=(3nT=bAi~o?aOHaVL6)Yw|RDVRX4Oy~s8B zCZFH6(d91mI@jdsT;CpDme4y~lMVF2=yF&3kZbY``gC-;8-2z#c_uw|8{aQ?r>D6l z-(p{3bXiI-a!sDa_0`ek9`qX5WFx&by4;iA=9)a4-XC4=MIUfYowlUa!p=DZ;mbxqPMsvFQ)fK zmj~1PT$3&I@#wOWKH-|Ygq~a!`|%KZifi&xdTw-S^gP$(W%Tms@=$t(YqFKz7+qG; zn_QEZ)4QX~!{|M($t&oi(dFUvG1ugk^u_4%2zt`?2~D=qb20JvH>{@TxhAiomq(XJ z(kon(SJNA#%cJN`uE}fY-O=UI^d8q_JAE{|tf7y&CaN0-OY7hIFq(KC1O{qk6P zmTU5QdU14l9KFOf*+H+5E^FxxuE`tdozdm-^e)%rjr7sz@&x*rYw{-gd~|steZe)^ zNzdFd_G2AA%Qbm3y)?Q!iC*TKyoFvLU7k#Da82Gy?~E=_p?A3^yXeEwWj%ewHF+C- zKDs=WzTld?ot|Cn`{il$9M|L>^wQ|^bb6U}iqswM` zoon(zdS`TbA-&5r`4D|Ly1a-!;+lMi_xIW8@?!d&Yw}^PPv0f>V+%dQHQ7%uj4m&s z7r7=Mp;t$jm(puolaJC{qszJdT(@jHNDR@`80hzy1a%y;hKDg zp1iB?m+kZv*W?gAH@du*p68l;mR=rRUPrHRO+H6&j4rRIH@POCr*}t}9rPa80S zy1aot=9+wgz8GEJNKe`=p~)BNxtRET!<*=NuF03^<Bf7CSRs^ zN0+zIdt8&R&_|=oTj^u2$ye#~(PbBX!8JKb&)nVj%iHK#uF2Qv#nI*M^b*(P>-5^_ z@(y~PYw`_xXLQ+3?{ZC!(TAhUJLw~?$v5e<(G$|=^z&{>Cf}l`m->Er7d^u@`8K^c zy6mBsxF*Nx_0i?s^aj`DJM`}8@*aARYw}(CXmoimeatoa9(^&o?4>8|kJsT5$ zf5!XhIj+g~>7~)-{q!=|PSQuC%LnOWuE~$+^U>u) z^aa=C$MnoSs*tc(mSKeN9kRz$C@5WFnz`~IY&?3+xN>C=xMIWAL#kf<%{$J*W{1% z%INYXdX;PPCwg;qIYMu7P0rJMqsy1+eXhx$>EqGmEA$E1gZ0=+!Ce2re=n*5F47+t7hIEnp=XxIew?6Zxh9k8#nI*a^b*(PU+J~c^w#L|D|(x2a#?zRbU8yGa80Jur=!cS=`*g$<>;vg_z8fw3Qdp=Y=z*Ps_hm%q}BT$5|ktE0;WdW~x`o8BH>{zmU`O|C^BjxK+v zkGLk+rq4!~|Dn&hCfA{-9~Ap>k)Gk2%%K-Xm;a>~xhB`8S4Wrsqu015*Q2*amw(XP zT$Ah5`=iUG-8uiR$z1wmbonRxlxuPWdh)@(U;de%;+ou$o*P~Mg`Ve{+=yNtT_)2j zT$6e9#^~~|^d{Hj#`NCk@^AD$*W@Pj@#u01`h;t8Q~F|bnLQ0ew8W{5yTZHMu2yF}nN*J?W5y zCbyzzV`4upL(g$dZcQ(ZF4O2`uE|1reRTOxdV_0n8+vDS`7e5xYjRuqaCEsWeZ)1n z9ep;sOsCJeCX49l7S9JRN6&CgZci_cE|;g5xF&a?*G88s(Cb{2JJQ>u%M5ylYqFR= z7+tPNA979ZM4yf>SEA3jCU>T%9_st$%JekXIa7~uchoj52=p(Mlz3H>j<=XT)*W^C*^uuC5u0zjoP3}uCj4pHN zMXt$mdUbTUF1^MzxgWhXx?GRm=9=7}-XC4APakki9zdUrE_3NquE`2|^5MQ;Za`0Q zO&&0}|guE~1(VsyDXJ?ZF#CQqg3 zV&eQ`DLv0Mc^bVuy4-_a;hH?1-WXl(NpEsZHqg7H%f0A5uE{g#qtRs)W$*bvu(d9ApA=l(J^y%pGSo(}>vYnn< z>-*(#^fcGxweo<<*YO?J^2qs!CjNhc&Uc^f?&6QAGMK+kba-cB!#F3+HsxhC(R*GHFU z(i>cp-SqD0@+^9fYw}L|Xmr^~A9GFqAALT$Je$7Yn!Jmid7|%^=g_lUlRfm}=<-~8 ziEHw1dTn&sM6YvA-a~JXF3+QPxF+wV4@Q^g(}!G>z4Y1W@&fvtYw|vNdY$i=&GZb{ zWQIA3@bJs*sh(L1Bd zc6yg<@@e{Tba^d(#5MU0eKxwhjy~s_9HOV666XuAr)Rh(pQRT@mmTyX*W`2b+UW8I zdYxge)TdW~!HWqNyb*+uVgO};`OjxKMbkGLjZrO!r}x6|iblcV(XQ{(>Q9rO&> zuX0VkLvM~Qd+9B%$#?1f(dB*g0oUYv z^y%pGe)^1Sa)O?EdhEvs=xMIW_vwYvWgorBHTeO(I=Xz2UgMhlklq?yK16SGO-|DL zqsxcs1Fp%B=#$Z9KYhwI`7u4Y!S~BY=qawrPw2VP<)idG*W?tvGP-<>Ugetnl-?R$ z4$#|Nlb_N1qszzX1Fp#l{{A@`T|Pmda!r2D^~q<%eteRi;+mYM=SG)<^gP$(7xePz z@+o?SYw}BaV|4j6y~#EC6}>yUe1_iRnw+7JMwdhMG1uhR^!e!WS^9!&@*8^Qng06Z zbM!3N64&G`y*9cWrq{V9zooZFmoLyeT$A6?2cydu=|ir`@9ERgpoFK|u%NUw}8U!hmICV!&0MwhSB+gy|L^#15_ls@2^ z{Fy!(UA{)2a!vk1Pi~C!g|E|7T$8`j^P|f*=moCH1$t$4IYzH?P5wr2jxOJ%x40&M zr}sveZ_)c)lmDTQN0)EYCtQ<@^u_3MoSt-cLX-ccXJg{~Ile>BaZUb@UK(A#OD}Ux z{y}eyF5ja!xh9jAdTn(15xvee`8Rrdbonv8!!@}CeK5NGgg)e&OrcLlms9i^*W{A) z)N|wcz)$IEuF0k7`O)QP^a9u9()7yc@^gBXYciGI8eLA)+gy`>r}syfU(g3!lmDPk zMwegGr(BcE(36|u`M|H}DXz&hdTw+%L(g+f{*zuFU4Bika83S;-WXkeLvM0TE=%u@ zF8@vMaZRSvN2AMG`j~5SIr?IB`7J%^yo4r~r{`kg-w*LSdY)@?1$udO`8~bDHJL$g zjxOiuEw0HG>AlhA5A;6QRO@y~y{=RC=0ga#MPKboqCBfon3KUKw5f zgI?vD+>G8FT`og!aZPSc?~N|g=zXrqE$HLXRlg#l-s) zE=$jIO>RXmk1o^c6|Tt-Ilqn3<#O~U*W}h*-yK~pPw#O}7ShL~%N6JouE}lai_v8U zJ*g$3$!+P`n0SA}73n#y$?fRn(dA0?3fE*2y)n96ncn1@+@9VWU1rkzT$4M{$D_+t z=o7BV9qEhF<*M|gOA?ware|YfKdwg4aZT<-FO4p<=w+_So$2+_s*t&^XIommpSwf*JLSuFuGiqKIEF*gFYQyu1BA7O@7SpPrc0d%k}ALuE{;QzA(DX zr5Cv-_oCNEmmARQT$5$=&ggPOdY5Z*Z~AC-xe?=*7|Hw)7I$19qAda$trqbbXiOWGkyVA29x`2?({m>WDUJDx-6x4xh9XHk4Be!(8pYp$I|Dc%RT7}uF2!**;n~~xfeahHCan9 zjV{aRWvGjd&-t-37M#74#w3gZ7d-!^(dA+EGS}qUTwfnu9!_s?O`b#VjxLX&_qZm{rH@9J z)$}pftvGgI=5TY6=5 zc>=x4HTfOAIl4TN-r}0PfY;X>UDnb2T$9c8@#yj-`h;upd;a{z=<;NG()9^VUdZ*? zm^fc}3O&a)c@e!dx~!*{xhCiM^XsF_Q|S$^$sg#Q(dB9MF4yFb^x^38boz*E@?w7f zY;@T`pL0#N(9=77zdVDU;hMaJUKm}TNiT9u{>1OEjxNul*SIDx<@(m>vXS2An!JoY z7+s!CA978$(r2T~bLexf$;;{KH^hECm!9F8yn!Zu_=nbyPHhOn- zc|N_zH961gAB`?AppUsGuj2ao=(3r<;F`Reo_%ASAH0yB_Rt5T%bVy!uF1RU z)6r!oea1C;4?Xo3-!E^br@1EYrRPVNx6lh*lfCrH=<-&2m22`odUJHyMQ?FU-cRq3 zE^ng`xF#Q5b77 z(wp>iX_Co)dT(@j7roCl`3QYHy6mA(xF#Q^FGiPl)04UqntY6&jfu}Uyoa9SnjD~) zMwj=}%UqL>)9a(lUV4LT@(Frpba@}W%Qg8VeK@+jpFZN69Hh@imk-eAT$4}H({JKp*W@t0FuHt5^<6Z8Ss zd&=<-?mm}~M4`h0Zx9DTtxIY!U!j^_iPr{}mP-=vpEm&5c5*W_FD z#^~||dXsDNZF+Zf`69i?H91Znk1k)LPq-%Ep)W?4BlM&@6PkRNo{fp;8(*g9xF+AD zmqwSb(92wt6ZHD%@>P0+Yw~@1XLLDA?{ZCkKp&1SU!#w>CO@RlMwhSC=UkJM^z{FW z=L6rMXSgOmq8CP&WAq}|vVg5Kqt{E|K#UA|8r zaZP?jpN}p-pf9*4XXx2IaenYadX8)IYkFyPIY}>bO@2dfj4nT-H@PPNP4A5^Kc@G& zCTHoB(d8%fDc9t;^yIsJpPZtnxF)}&=SG*G((_!C-_y&Z%g^W)uE{xiV|4jBy~#EC z1HC)CoTm475Bs4is&&I^_i(k=mT$4Z3OQXvfdYNnT z7kYhk`8B=4HTf&OJG%Ua-s75FppQqF|E5p4CV!(R-y8QIXXz=f$=~Vu(dD=F0@vh! z=#|mscl0XP2t2hztYq1 zi~YDj&u~rtjb0dC{zflyO)f#NjxK+v*SIEA=5I{2GCk>mgeLz*&&I^_i+`o(xF(mSmqwR=qnEiR)9H=T z1D3TmFSJp<=^Q|uE~|@-O=Sg=sm8huxUmuu2RQ( zk1p4y54a{brB6qf>(FOhllk=YN8`Ka%g8`85}lUvhEqsxuxWvkE;pukxhA)z4@Z}q&_`U8+tFvE%T4KXuE`>L=3}uR^XXZx$?fT-(dB0J zGS}n|^!n&>b9#eoaz}b+bh!n+%Qaa{AC4{y=p(Mlo#?aC<(Bk0*W}Lh^no}(xD`Fa zHMtADFuL5DUgVlAp;t$jh4dQNxjTI_y4;RF<(e#| zr#|lcWf48iHMu7}Kf2tWUf`PCi(VOB?m(|{O_tGHqstxXZLZ0^>HX1VF@3-_xet9Z zy4;CA<(k}=p8SOGmpju_T$APW+~{%_dY)@?KYDp|SwgRHP3})`j4pSjH@PMcpm#@? zyU}}GlNI#Q=yG@Zm}~Mt`h0X*N?&kI9z@T6(qEt4gP!A>JeXb{UG7P*a7|Xyo1@FU z=q;|vL+HKHWf{HCHEHz8=yGrRlxy-(dh%f0f82+j;+m|Y=SP?O(hFRZhtVse%W`^^ zYw~bN%6!{|+}$rI__(dFUv9@k_YeKfi}fzua!sB}?~X2O=sm8<)99no z)bb4{K_Z;vid zpm(??8|j15<%#qm*W}ss>FBbKKI57^ho1VZ@0Tah(_EA1((|Lslj#Mn$tHSrba@KB z#x;2!y*0Y5r?5PezxG^eNZmrS#5b846TQhbc?G>Yx;&5Gy$eK5Mb zoId25yoo*?U0y+-aZPs8(_f7JcqKilef}4qsy!5 zU9QP4`fzl44SmElc^iE;x@@PIJ^kgl|9Bfc!!`K; zy)e4GonGXc?4#F4mv_+XT$2yd+oQ{FdWUQBA^Ko+c_)3yHTf`oI(kC-jDFrD$z(r0 z^%dVQ@1m!8hu-3ve2nXRqsx2geXhv? z`gnBNOP_E}K2BeZF7Kl!y_(SE6ZBk6yno{T^gP$(ll02y@&S64YjTj@99{O&TU?V* z(R-uI2kCvT$*1Y#(d9$*3D@K^^u_4%VS3VNLX$)EY}9_)PtS2pK1(l+E+3(nxh9{Z z*GHF+(i>cp&(k}j%g5+luE}BgaCA99A8}2-K%b2+AE(c`CSRndzvlbp6Z8z%1r&mXp&(UjKlW)*lqs!;%ZLY~N`e1Z9OdoPhzDb{sE?=O} zxF+ACr@j&U@kM%?Yw~S+esuW~y}&g&POpwGN9Z-K$#>}O(dEnZ4%g(n^ug%z75b2C z@;&-=bonZM#x*%XPali(gQN5e*W~;3!szlfdXa1L1A29I`8vJEHTfaEHM)F*-sYN| zqz^`yWAq`{0A8~!=o4#MZMbC0geoQZpF5jk?xF$cL*G8A)^g7q% z6umRLe23oUn*5YL8eP6iA9GE9MxT!^-=iLKnU(!3H%Ma;YuF0?H!_nm=eZ)06L!XTL9dQ3|3a^EO)f)kjV_bvZLY~Q`e1bVSNf1^@}KnS=<;v$8Q0{$=&2vXeq4f{ z=9*lVUKm}b(2HD?>GbO8a!GoPYjQbyYjn93z0EbbJiR}{Q5^eNZms`TVZ-!GS?r?@6pqvuAK>GV9;WEQPK;Ya7B8WYciXjA6>3QFK|t+MX!u5SEg6FCfBAn zN0*uO7T4rD^xo)l6?&g*GKW4MU9L)>a80gDUyLqSqbGfw(ByjbY)pKBG@wHhsi3xeRbCj4s!w zCru?Zxj8)>6Zao;={c^+E$F4uRXWjxO`) zBd*D<>9f)0#`HPYWFbBCQ{OK)p=Y@!x1pCtmz&bdT$9_<>!ZtjdV_0nJ9=kyxf#97 zHCaR-jxIN+kGLkcr_V;0ThQlRlRMDUKa2B&1@sKph=yFSXk!!M;UL9R-MXzy9 z?nG~mF1Mz)xh8j}_eYn7^a0o8F7(OhavS=TYqEr%{JHO!+tO29le^M$qs#5+d9KOb z=#|lB5xvSaxjVfzy4;@L=9(;}_eYmI&<9+Td(fw&%N^-6uE{;=>C0oP;&eKNY- zi$3L=JdmFJWt<-@qo=qg52EKrmwVImT$2aW%cIME=oPNXN_t~-xi7uRHF*fVJGv~V z_qZm1=fB@*bh#gW%r*HR`h0Y`KYhV9Y5e)wU-|2k2hej|lZVnvqst0N1lSxHZtNocZ~o{fpm2RwwH^zrEOF#3dR@)-JJba^;E>Fb0hkELg0Vm}^1 z&v8vI^53sKx~!&GxF(O|`o`$;NP3fNvXd6b4{K=ACE4NrcbygPoytKmo@aH zZxWjPFZ;4Fu^*42=eQ>8xV|*HJeFSOnmmc#7+oGmZ*onZOz(~^Yw10%$y4Z~(dF^< zG1uh(*tZy6oy)?S4qnEiRPovjImnYF1T$88MJEO~! z>0PeL2Ks1pc?x~ZHF*YoKDw-@FSsVpq-W0het9ZA%Qblxy*Ro&jb7rKY^2vlm#5R~ zT$5+h+oQ_{dWUQB9Qt5%c?NyRHF++5I=VcQKI58fqNjfA`{h~mG}q*L^!(_ukzU}M zJfB`2U7k&^aZO%8Z;vj|p?A0@o9Tnm<+=1B*W`ut+32!~KIfXeh@SqP@0aJ%GhCAw z(+i`^^XWyd$rgHbba?^2#x;2fy*0XQrnk8!FQxZKmlx6pT$7j4C!@=Y=u@uAR(kUH zzF%HUPjO9NPS1@lTj+VN$t&pP(d8xd3fJV7^v3A&QhJkXvW?yyU0z1-aZO%DAB`?s z>0_?RtLgL6<>mAR*W@+y%(-|z@CtgCYqFhQ99>>XFL6y?ORtSC+vs(!$?NFt(dAY2 z4%g)M^ug%zYWk3CvV%SyU0y?<(hFRZH_ zuE|b%b98w^xWw3CVHN0 z@-}*TblFL-a82G$Z;UQ)rZ>4J@1S=_m$%S+T$A1O(dhD4`j~6-PWpUw*+pM)P5vJ} z^QSmpcpE*-HF+1kIJ&%@UgDbUq1Q&2chKuxlXuhGqswl3himd4`e1ZGQr{-bK%FP2NW@jxKxXC9cW)>9x`2-Sj%w;7uE~e!=|9JQypNvYntYgE7+u~^FLF)x)2pM)2k14f$w%m| z(PbaK%{BQbeK5LwkUr#^e2hLFT|PvgaZL`;Q-AUO@?m|D{z05WFEWJLu9Hck6CZD5sMwd^~yIhmc(?_Grr|Dy^$zl3@bomT@ z!8Q2;J#)eL%OQG}Yw|^Uadi1Cy~H*761_IMe2!k{njE3GN0-mjJ6w}5(+8u=Vfv73 z@)i1Qbol~(&NcZeJ^iTkjYjTX9`g=SdI7(0Ze-`aHy7#$`RjXFr>Q<{(ty;Be)zYe4-D=gURjXF5S~Xl;TwDyps#U92 zhMupz-hVyLJ>$A&0(i?2ZJLsL+<)7$XHsqc3!R+$S^dTE^ z3w<)XoTE?KkayANv&-A*3pV84^wMYY{P7NYnGJaly*|6VlipxMZl$+pms{u^HsrnZ z{_OHD`hX32AAK^ryqi8{L*7rH&o1wwFW8XV=*6pf{s<8cKUdBxs5(yLq1I3mR&wT-)=)bLN9#Q`{jf5A{+8idUbaB z5WU8RoTs;Dm)q%WHsoXU-t6*WdY=vXIDJ!g`3QZp4fzCpOLqAveX9+*KrehQ_v1Xh z$cB89UY%V&Mz66UpQ5*BmygriY{;kSz1igx^gbJMkv^JTF3`tp$iL8Mv&$#xb2j8( z>8si0Q}lx8*9`eLdNu0jgM6A^V?!>{*JYQB^z}C6-{~8&%fHY!+K~UCZ^|zJO5bcl z{*%5fyZjq{yA8QaFD%$`ZJ%7C7uk^iqE}~^f2Y^jkpHH)W|#kYq4#E&|D^ZX zkSp{}+2t~Qvkm!Q`j+hSU-Ydu$HuAM*rhhAetuF_kx%N2T? z4f!m+H@o~Vz0Zbxj=m|o{2zU@4f#BMOLqATeX9-0+Pzk@%T;>8j%$Y8fnJGgpD*xP zdX){iBfT}de2(5`L+(WH%`Ts(_t}tz^wI3H;A-x_4Y@OYOLn;feX9+*3w<@a+>u_e z)0!c7rB~wGe%y&(WkVLxo3qP8dW#LY8@)Tb+?n2EL+(x=%`SJLkJ*rW&}XyDUFmZ+ zWHEg?yDXxw*pPeDD+_Z!?nbY&A@`y;XP3LvTWrX^>D}4o9`qg?vV=aIT^7?vY{-4+ z)7j;o^cfp+U;1KpxfgxOhTM-{zO(nsz3CM;WGTHlyDXu%*pU0vyR*xE=sh;%0rcVQ za$ow04S67aI=kGDK4U|c(HFDJQu>k&c@VvPm)wv0(<^MqgXxXg zzR`wkppR#l_4ElF@&fvNc6ly+!G^q$Uc9IG$@AzXHsnS0+U)XtdYui~NN>+B8|WQ2 z+2zIb78~+% zdUtkt3BAXLyn;TOU0zBbvmu-5v)N@6ea?owlD?c>UPfQBA+MsB@9q8aa(aagc{RN` zyS#$lVnepjyR*w?dXEix4ShJfypld*Ltaat&MvQ_&)AUH(U-H!tLZB?WGlVAB==(r zy~2jPp5B;UUPEuPA#b2}W|!B}yKKlC>4Vwjb@U+{vW-5OUAEGvY{;AF^V#L~^aUI8 zW_s~HdH?YSdWj8r3%xeGypdjKL$0H@XP0gC4jb}TdVh9#6Mevj4ElI>c{6>&hI|2i zTXuO1eY*|0o?f`G_sezkA{+9B^y=*LR(g#M`67C2b{X_G8}h~U4cX-j=o@XwcKUdB zxt=~@L%xK*ExUXneY*|$QhMQjxgTFdFR~$DMz78;UrevDAv@@;*=0Mu&4zqAy*Imj z3BAvTd5q%!cfw&t{h|qtDrpuc9w!mmTyK8?xXS-XEp;{=k>hD{RPD^L%4= z`3icI4fz^+XLk8YdY28^MIX#AJLy9<6B`+L89 z4ZX~U?55XemtFJ*8}beG_U!Vt^bQ;Hjr9KP@^$n98}d!`@$B;T^a&fXhrTVl?51zG zA>T|dJRt8EzJXq3L%xMxon5|>USmVPmEM|NzKPyuL+-$T-woMi4}GHzxg&i%yL>Z! z!iL<5KA&B_g}z`z7Sc-(%=5>$(#vefUiLL+m%a2R8**o!@60aWM(?sAccBkwmv5(! z*pP4I>(6GF@1W1wkh}8ya(3BAU$G(I&hzDEdH?a9^a>mD9rWhx@?G>68?ukyon5}0 z-eW_)lRlhXZlI6Yknf^TXP57x&)AUfrY~lf@1-xwwPjAmIKSJ-YAwNX#&n^e(12*J`>EqeuN9hwbE@4fzTB zw(N3mnjoz4D zZlX8YkYA^FW|!ZjciE8Npbux4-=dG$kele!+2yzCGdAQm>5JLrX8Mv1`7L^Rh4;(v z&?{`nZ_}Hz%kR=#Y{<>@?(Fh=^d1}XJM`h~a-2S5Lw=V&on3yPK4U|EkG_~){(!z@ zLypr+kI3`KAJWTg$nVqZv&#v3gAMrudV6;HBYKAo`9u0(cKKuakPSIOpUf_QLZ7lB ze?*_pE+^>=Hsp`##YcL-{3*S}hWrV=HoN>8z0QW5q_4{^e@QhWt5wOLqB7`c@lqioTj%{)%33)S4lGL9aypenn2xt8B<$(p$63U(?%c z$Y0TWv&-Mm`)tT*`ljsixAe_6a&eD5q$lue4@iw~rBYnh%`~!U&Z==gU(PwPPS^6^G zMwfr4uh@`(q?aGL*7mA&o1w! z57?0R(8sgO`{)xkiQwb|tZ^g0{zetLU$`5?W+ zhTKN)&n_RL57>|o&?mFY?er-d@~bf1n+>@Gy*Ilor1#m7JJLt9%bn?CHsnt9+3a!``kW0}NMFt_ccrh`kUP`M zPs;m+Mf3_Aau<4IcDWn9$%fpO-kDwQPVcfIi|B*dzXG88uUzc5$(AV3Ld(k&!m;2B++K_wGH)WUm z(l^_XCG;)X<$m<7Hsn6^)$FpAUQn}U$bIRRsLwBQe|nV-xgWhbyF7s2VndeFyR*v! z={+{&{`BGOvWz}rLmoh%&Mpt4&)AR$(igMKgXv2)WEs8m6z`XZ(93MdgXs0yWjVdU zhCGizNvdXWuz zIK4W%Jd$2xLl*J-#n$ZdD0-U>xf{JVyR4-5*^s-_N3+YL>0>tJ9`xDl@)-J@4OvWI z&MuFouh@`#(#uct>yuUV3LCP5*VmX`9!GDoA&;PUW|zm)yKKlK>4Vwj3G^Ww@+kUb zc3DlIvLP$!^V#Kz^aUI8XnJw2_sf&$B{t+S^xEw5WO|(qc`SWhc3DGTZ$s|I`E1B8 zPoZzLA@`^?n|%4wf8@sPOq{d_oFvw zmuJvhY{)8JUw3wSCcVdoJdQq`UDnY@Y{=v3)7j-&^cfrS1o~ojc{Y8?hODNSp5guS z9D11zc_O_&yR4@-*pMgD+q27a=^ZxY$@Kp0@;v&04Ov4U&o0lWPuP&B(6?om4fO3c z`8|Z^|yOrEj(&8|hoJ%j@V{ZODu1g=gpe!d7~b4S5N@HoLr@ zUS~sIN^j3DZ=iSBkWKXd?D9tXfDL&WeKNajqfgn8m(%C7%bVy6Hslrb;&bx+@n(97 z4cSbu&n|DFH`tI@(%ZAkb@UD!@+x|Nc6lp(z=ph%CvDrMPy*VD(d%P#ta4f#U)w(Rn?^zAm}i|B>t=YD)0y~u`qF}*swd_BF!hHR&=%Pza= z>ut!F&^Kh4Z=i3qAzw=0lwH1&zS)L+8GTE3`6l{S8?uAGnqBtL3mVo8`Eq(Cu6_Q% zH`A+Z$XC#tv&*;8TWrWz(z~l& z#)f=7&o5_}8|W)GWH-J1!rYJVp;y?DZ=g43m+z%F*^qCfcV?IGqj%YmZ=w%pmmBFL zHe?TdI=g&7ea41-Gkr0;`~ZE)hI|XX^dj$ukt( z(br{{AE&RkA>U2!&n^e)12*Ia`gnHv3HpQ$`5yYV?DCWJ?Kb3l>BSf4e*6@@#D;ty zy*|4fqBq!(8|m%Y<)`T#Hst&1{n_Pb=mR$72k4X8HYFI^b#BLTlCuO^0)Ll8}cx|{<`dPhQ8j0{5H>T$S!|J-)KV~&hwkH z%iq&C+mM@ieoJ=w2l`eU@;mg^>~fY~aMhY2ze}&g+w}Wy{3E@}hWsAAIlKH5y~Tzc zr*~(Uf2Q}?kl&{dXP0yI5gYOc^y%#KcKVDB`9u0*c6kSV$%d@pd`hqOet9Ro%!WLI zUY}iVp*Pr&6MX&l?D8&phYk57dVh9#H+{f{{4sqzyS#@!VMG3ezAd}lO5binPSOio zykFi+FR~$jO0Ui?@1xh)kUyihW|#NV+ib|6(|fbaZS+1Ha*95hT|Ph`vmt*$pUo~G zq|e!qzoai`mk-fbY{*~H%dhe4liTSPHsmzDF}r-2-eg1mn%+2!BqD>md^^zzocKll%Ng$;Q( zy)nD|C%wsryocVMT`tpmY{;$j;q3BX^bs5KUix%)`EUA+4S64ZF}wT^eaVKrpI&-> zomDuk^<3au0fw4f!{EXLeak@3JA6 z=!4nip7bFb^6&KN>~b&qj1Bn@`eJsuH+{*5{3pHiro2B`LNBu+m+AG{%n{*PXr zT^>lUu_2$Kw`P}R^fnuEmA)anJcz#0hJ2Pjo?RYHpRggHqt9oThtL;n$mi+Bx8(iD za(amkS+EzMU$e_Y>2)^b4)k@|qy}^dulir?P9#8MEA@`#9XO}0?2W-f_ z>EqdDHGRT{ETM19E>EOyw;}hT7e?NHJc(XpL+(qj&Mr@;*VvHz(Oa|28hV=zSxVoK zU7kYUXhZH#-;`aRO5bcl9zfrcU7kkYYC|4KU(GIS=>;!XGh`XP8uj-dc{;tuhCGPg znq8hjZ?ho}ruSx-XVUv@$V2F(*<~Gl%!Vwd&t{ir(dTT)L+Pv8<=OOt^=pPaj9!Ur ze}BVs=v6l4;q>P0vYy^zLsrmxv&(boeKzC~^wI3{Jo=aoc_e){yF8yhXG0!EU(GHX z=mjraGh`*b8rRMrFQC`hkVn&7v&#$VZ8qdF^xo|9B6^<FaIC zI{Jp}@_PD48}cmrcy@UMeZq!3o4zf(ypg`$hCGK}{E|F>Y@?UhkoENX?D8ghgAI8u zy)(PKncihXo<|?fE^nca*pTPbr?bm-^cfqnfxehs-b!DxAuphpztsC>&?{`n3+av7 zpBoFQkvzkQdWuv&$FJ=WNJJ=*!vVi|H#i@+I^p8}c%GcXs(wdXEixIej#{d>MVrhP;A4n_YI$=WNJk`f7Iha(Y3> znjx>GSK@8@{T#l6US&gGMQ_e7UrBGVA+M%)XP2Gy9viZSKAK&=iausTUPGVFE?-Tb zvmvjguV$C8p%=V-&5+m8D{*Z7Ci-+v#04C@R|AAQD#Y^N`0m+z#n*pM%wS9a$8!FSQCY{-|= zTeHh|)7xywm(hE(%MJ8C8?uAGDZ6|ReX|Yua{89+^1bw}HsmYltJ&rI=moD@Gvq7j z)u{U~H_~ft$WD4|cKLpKn+^FYdT)050eYVe`D*%TcKJd2m<{B+2yC{OEzRLy}T>WA3sB{up!?@Z_X}1OK-6u-%jt& zE{EwoHsm|#!`bEM=p!~{AALHz{5*ZehI}V|F}wT%eaVJ=7rpegdHy&;FS8-vO|Q=` zzesPeAve(5v&%2hJ8a1J(EGE?FVhEX$oJC6v&&KXgbn#V`nK%yEA;I)%4zW zdXfHoO+m=_)2p+~uhMI5$PduhWtU_0^)}=O=^L`kuhBQ!kp1*c+2z;in{CJs(YIxn z-=J@|AwNtne0}c6P4prg@+0)>?DCuR8XIze-kM#0i{55Kew5yuU4EP1XG4CBKAK%_ zrjOZ>AE(b|m*1h!*^q;IZkh~AwNa$&Mv=C z@3A3==%d-?59nhy=*!vV1bxMZ{4Blv4Y?nGM6a+Rhw07P<&Wtt zHst5%-Pz?&=sh;%=jp@QF5 z(Fe238Tyb7`E~kqcKJK{j1Bn> z`eJtZd-{?Mxrtuhll$=x^a>mDoAk!)a+cm?Lw<|inO**o-ep66n?9Ib{)s+hLvE%| zXP1Ab&)AUPp)Y5bbMzG(^1Jl%H|Ku5onB!>evjUqUEV=&u_4Flz1iiR^gbK%`}EQ5 zatnRThWr72HoLrwK4(MzkiMK<-c4VzAt&hNZ^`|5552;M{1Lq|yWC1|vLSy=@6Imo zrT5s7KcSCim-o@fY{*IaY<77+ea?pbDSbJ++(uuqA%8|Me{1f?2j~?x2o&ZujtF!jb{+V9* zcJGsar5D+dbM)Hm@^ADy8}fE~dv>`*@30~7p!a8&f2R-FkayC@v&(x5D7`bg+>zd8 zL(bEOv&)_6BR1q?^y%!fkUnEWK2BfEE_bFc*^p1rOW&3IaTj`-4Y@$C&n|bRH`tI* z(%ZAkB6^1n`4qiByWEXFU_(AlpUf_Ir%&0Ci}c0pau52F4fz*(>AQ137SqdY$iLDX zv&%i{O*Z7;=-t`nUi2Ota)~~gUG7aEvmyUZ-;!OH(6`!<|DdmCm;2BQHmn))pY%%9 z?@#2u^eP*2ncj@I(dB;h78~+k^lrS3E=%b>HsrtQqj(!#?oS`HA^$_4#oOre0Q#H_ zxk6vX+vxH@dck|v4EbMrHLA-pdW{YFKYD9+c@VwLhJ1$Jn_V7E@3SFS>7&`@A@ngD z@>%+9c3DoJvmu|OFK3sB(pPNA=jr9|^?rF6y~2hp*qiguE)S=-*pNHWyR*v*dXEjc zBYil#Jc2%AL+(VM&MuFn&)ATK^u_G*DEg8Oxih`|eYqbi=@mBQF7)Q?@@RUC4Y@15 zJG(rF-eW@+(TB6kW9cI{lU)9bU# z6X*>#oAI>gMq>tE;d(&sL%aiDHHe?BXIlDZWzG6e}L$7?l_sbf3 zl?}Nsy*ax)h2COA?nm#=E>ETR*pQ|4;q3A>`iKp=KYcp8tfkM`kO$Bgv&+-zOE%4hKkepyd1vLO$nS7(>!(rawU!|AQr<$3fr8?u7ln_Zqy@3SF~ppRyk z4fHV^@<{q@c6kAP&W1dSzMNfNNMErbE9vF^etq&HdW8*nG`%sqY@|2YkjKzFv&)O= zT{h&g^ug@%68ex0Sw)}BE-$4|*^tN4=d;Tu`hpF4JiYis-Y+ksm)MXe&}*~H%jtDC zWHo(Vc6kMTy$yLHeM5HHOy6ijoBHIOP4p2P@*Mhf zc6l>>#)hn?FJ_mw(3fn;bLpi6-Y?hD%WTN===IsvT>9yJAi|KVX$moKN+ z*pOGyTeHho(A#XtW_oXS`AT}94S6MfG`sAikJ*q{(Py*ESJCHe$gAnA+2yP01s`8C zWDC6#*WMra8hVutc@4cayX>O3*^t-Ld$Y^e()(=4>*$-Z%h%C2+mNmFZQ14P>Dz6{ z>*|^!e=a9rOho@`d!$PkO)XqnFu`FQV6Hm+z!E*pM%#cV?IGqIcPl?exLy z^4;_y8}cRe$?S3ieaeP>DSbY>d=GuWhI|>l_*335-%BsCAv@@`+2#A_bvES7>Fct~ zjr8?4`{@NkYleI^y%N{n zzxW|~l@0kCdUJO9VS0-V*+uWpEfZ=p#1d>*&+j~fIaVne=x=ex7ZPtbd8$T!l5v&&D?M{LM9(WkS^ zPtj*=$R7G)b~!{}vLWA0Fa1ouKk(D^G8^(O^v3M+GxR1K@~!mF?DDhpE*r9!KA2q& z(}!%xx6voF%g@oLY{<9M=d;Vt(-&;WchHMJo9_?&0=>kB?4#Famm~B#8}gm>b=lFaICchUQ^%P-LfY{+-h$Fs{X(CvGYj*indYcWok=~nKj?w#U$oJDXWtU&0Z?+*nK;M#Gex1J6hWsFXHM{%< zz2I|ehU}+T;@bNgH_@wX$Pdw*v&(PNTWrV=)4Q|FZ_#^f$dAy6v&(POM{LLe`gC@= znLcAfew4nPU4DnYVncq6UjBLSm*1sV*pMHmH)faLqc_=*gY?eqa-7~}Lw~e~}-iG`leM5Hn3;ISI@=Nsb?DCiN2^;du^!e=aSM&uNa+F^D#oUk6^b#BL zEA;y8^4IhR8}c@KXLk7;dY29PRr+vt`CIyk4LL@i%`Ru?b2jAH=&RY~@8|_zS~KL= z>D8$Bulzl|#)kX`eO-3>2l{#&audBjyPTyD*pT0(PiB{Yq)*w9-=Z&Omw%!!*^u9+ zmw(y&M+Jkl&>bW|w!+hiu62(I>OZJLyw42)^b59#Z&%X{eSZO94whU{`HeWMNeBl@Q7 z@?QF88}i5WE!pLL^sP4JPw1=J<^A-6udEqzl3tCs>Hgq0dW{YFQ+jK5`2fAmhWr`5 zH@ke0-e*JpoIaXeK13h0A*blG+2wZnoDKO4`f_&pFnz^_{3X5ow!B~X2))9F{1v@9 zyL^=1Vna^TyR*xAdXEixG@lQLv&+ZmBR1r(d44v#e4IXKL;i-onq59YFZk-3A%9D+ z#sM zeey5#G8^)b^v3M+uk{z08Juh~Ai87F@^q+mPGo-Pz?1^d1}X zVft`(xg&kVhJ1uRon7ukpRpkyr7vceh4dvGa-LqgDfi>f^fDXrF?wTmxeL9?hJ2jf znO*Km@3JAEpbux4Mf4FHa)CabUG7Gou_2$NFJ_m!)0b?>r|6~M%>B3rz08Jun%S zY{-Ap%fIdY@<4ip4f!8>b9PxqZ?Pd)=)KwHLG(Tw^1t-a?DAmxm<{owpJd|E#Lq1Dy&Mpt5x7d)+(Yv$D!|6RXB!gSx29+AL*XL+I_66*zdGsk8@-X^*c6mO1 z!G=7XUi^bRe{7(a*pLb57>}L(I>OZM*5Tu zSxH~aE-$7p*^o!m%YW$o@)CN54S5W`IlH`+-eN-@OYhDuo9I0@WEFihyS$7(WIc`Cg*yS$FxVnd!r@6Ik; z={+`NEqyq&=<4I8|h0nmzL;I!N?)=e&!w0CB==*`%WTN= z==Is<3+N3t~cN5!-j024`!Dyqz~DU7tp7(%NNmSY{(1gi`nIi=}R``MfB3i z+>h<_G8?jyUY}jQgx+97UQBP#E?-LTupuv@4`!DyqYv4Tm(r)R%MSXC4cSCr%r0L} zU$P-DqnG|P_v0(*Wj5sH^v3M+mGmYX@(OxqcG*eqvLT!4gW2V)=tDN-mGsH%^40Vy z8}cgpVs`l&`jQQKHNE_2-Y>i86*goGy*aylExpBtyoTPJUA~UqXG2~~AI&abPam@( zucOaqm)-O^8?u$YoL#&joxBI-b(My zF5gb?vmt}NDZ6|JeX|Yu0{XV>vX8#qhFniC{Dt?)chZY&$QRP9v&(nUYi!6D(Oa|2 zchlQ!$QRQ$WS1N08*RvT`ljsiJ@m~s9qIDL3)`D*-fv{EB-$)aa5=(E}7=jn4cmdi=#{_8`;Q~^DjTwo-kM#0k=|xQ zzLUNoyZjP;qYe2k`ljsi%k<4Q_3#yBwqU*pM6P!`bE6=p#1d`{~o!<=5#mHslBB%h}~O=qonl z2kDhFxgR&tt8B=AdUJO9O?rzB`5}6DcKI!Oj}7@@`fzsnZTg4}`4RebcDb28V?z$m z7qiRn(3fn;kJ3wj=l$}#^fDXrWAys$@_Y0K8}j4y_Uv+;-eE%y(g(B4@6(5D$WPFx zv&$dQXKct%(igMKAJUg>$WPHrf1mqtf?j4r4$rX)&(Qm` z%b(B(Y{<{j$Fs{x`h*QROy8DW{*=DmhWs48@DJWEe?~8|AwN&A&MtpWudyM&Kwp<# zPSMxfkR$XB+2t?j8*Ruh(l=$7zoc)rA-_c5l3o6azSV~OGJQ3>oTeAdt{HNaUX6Nx z%U{!LY{;+B*JYQ#p|7_gZ=-L>E`LkkXhVLLzA3w$p>MV!$LQO#%iqzr+mK(Q7ydEN zAAe6TvLU}tugxz1K(DhQzd>J@UCz?i+mM^+8?wtk(l^?W-=vRcmw%#9*pT0%Z_6(K zOy6!pew$wWC-0YY^b#9#Grcyuyq#WWLw<+8F1x&gzTSrXE`39Gc_)3N4f#F#rtESH zeX|WYPT!JU-bLSPLw=vWnqA&aFZlDCA%8%x#I>Ifcn`hGhWsJDIlJ6SZ?PdK=)KwH zz4SgC@<;Sd+2wuo%{JtZ>D#i)`{~%ZKQFHssIgo3hL8^vyQp6n$HE`7nLE4fzXt;qAE}AE6i7kiVo?XP1xC zYi!70(Oa|2d3u`-IZfY?T|P$NXhZ&*zA3wWoW9wH{0)6ucKHN-yAAnUdf^?p9~bCF zHslPwHoJV1US~u8j^3VKK1J`aA%9Qr&n};)57>}@ppR#li}VQ_a+W@yUH*l>U_<_q zUVNwb%fHe~Y{);+>$A(h(Hm^YKhxW@%O!e;4LL{e&o2K?AFv^Br%z^=|DaFVkay7M zv&(BU=eKQ7ZtY{)J2+U)XQ^g0{zE_!=*`EPoM4S6@cKfC-7eZYpihd!BI zuF$7!$gT9n?DD_#B^&Zydih=6FaJlcup#fGH)og6&|7TC`{}*ejbF40%B%YEnt_pTZ8@AOJs z`}vCd(yMI9f6!aA%l+tWHsn9)z1d|cz0ZbRrjKTq`_sp4$bZpiv&#eMb2j9^>C4&W zf%Fv{@;~(Q`||!^8NI@WJcj@OtTDShh~8vFuJC+!c6l(p$A47p0L#I^Is!{}8urnWFdV+ zc6khaqYb$;eLTB7mOf!a?n0l>F01GZHsr4K(g(ax9!D>;A&cns+2!%{1{-oWdV6+x z0=>hA+@0Q^T~^ZvY{)(6liB5o^eG#%m_DCfon{3E~>D}4ox%3_z@(}uPc6lCs#D*-VPiL3s(`RhRL+Ojz zWdnW5hCGa3{&1c@UO=y~ArGfFW|tSzn{3DmdS`Zd5xvWXJc2%$T{hB(Y{(<&liB6P z^eG$iDEeY{c?o^VhODHQK9c8;m(t5@$fN0v*<};G$%Z_J-kDuqM(?sAkEIW0mzUFr zY{)A5WOjK4eaePBjy|7VHq#eu$m8k7k9xnnl3rp%okSEc{v&(Df6E@_@^ljPYwe;;aWDUJ|KKJ8w^b#BL6ncGj*-CG)Ay1{Z zXP4L0J8a0)=>6H{4fFvUvX(xcUEWBaupv*U&u5oy^aUI840`cnxgT$$m)MYJ(rdHJ zo9T5nWF5UdyS#KJgW2Va=tDMS1AQ{Pd@+5>hOFZI^L%#MPG7Jg zFW~v&C-VI9CG-*-@GWvQOvXQHEv>`91Z^|xTPTy=p zUP9lJUA}_8)rP#3zM5UWl3uW|X2>RbCEligzraptJ&pi=><=&8S*N6C9dtq*U_tN$gAni+2!l$ zEjDBey*saf$%edv-kDv#h2CXD-bf$JF5gNYvLV~(li6i2eaeQsi9VlQzKy8eLvZpL9(g$FHCI zW1JssrKh9wxO8hS@`c^$peHF+X^Ai8X$54t8#qR&K^ z*VAWRlPA-&e~SByH_&rjleP5n=<-H-g=_K@dP8*CPH%Kgo=WeDE^ngux+YJfk3^R@ z(??yCb@aLD@)mm1bV8G-({nL#zOjRz=bAi&UKw59O0RNFo=IRt2|JnD+JLnm%$xZ0R(dC`=64&He{Q5P~sjthEOrA?m{l)jod+2Gd$@A#>(PcNiz%_Y3y)wGI zmtN(XY^1kDm-o?IU6U8k`=ZPH>HV(B3+ZFgWe~`{+Z_<$LsD*W~^5x#;qJdeUDBP4>{U zF|i*%py#+IAE1{;m!tGD*W`orhUoG`dZTOdA$nJI`4PR_HQ7rai7r2;kGduwrq4x} zWAvoI6PkR4o{QQqKcVNjCLg6&Mwg$`t6Y9|fZh^aeot?8 zP3H0b+813;(feJK&vX4)bom2)+%>rw*C+q$`{j@H6xZbD^xWw3CwiW1@&&$sd2~5V zuW(Inq4)pj@@IOZYw|^|?}{#ep?A9`2k1l5<*)Q%*W^p|ndowcKI@u%nV$WhzdrdJ zJ;ycq3cWnK{GDFmnjEAzMVEijn_ZKy(tD!IS$eN)@-_NMbonQJ)HV4!eJ;BEi=LFU zh%`Aw&&9;^i+|JeT$69m%cILVdWCE9O?p#w`47F>HTf33FS`7f-tU?mrjJFJ|Ix=? zlW)_L7xH~F=|IkpYw{g>essAIy}&j3F1<3kT$oEo`+_vxt%`+m6?J21;F67+W0 z3QU*MYjhCUHpu1ueFO-|BN7mfRm8T2&Q1fa&`KsYw}0>Ty(hx zJ!!FoCV!%5W8(7(gsple6@;=rV`i z?wb6QJ`i1QKp%8X{zadPE;po4yC(mpr>Dg8fg8~?T$6M3!ss%WUgVnmhh80BZcLx& zn*5jE5?yXWZ*@)nNAHU+H>LNxCX<%u{WZGGqmR2L7osOG;rr!g^c2_R!t~tea&vl~ zYjP2Kd33o2y}~t_OmB!T^XZMQ$wld1(dCx(Zr9{u^r7f-EBdf&a&h`xbh$M>X~~2p zQ|Q^4cs{Uzp5vNaf?gV3ZbL6~O)g2Vi!QgN*SjW{qIX1>+tE8+ld1H9=(3PL=$c%b zJ{4VVPoH*8E<;aWD$W<~K+kYZE=wZIrl+|kSELt4m%Gx7T$3x&tE0=^=<{5YE7Mz| z%iZa%uE`8~UvybQ?{`hELLZAR_n?ovCRe2=FCEVZ?nzH^O|C}IjV|}1=eZ^`>E+R7 zDZRoqxjMZmy4;)I?3!GI-Vu1Oz>F88I6x+b&ebJ1lPJ!zSQCfA~8W8(S1 z{pdNa$+hXF(dGX1GS}of^t$Ns0D8S^GMnBNU6#|kU6bq5hoZ{^>BFwc_2@IvJQJeZ#4n%t7lpT*H-1--;InZxxp(d8lZTG!-OT;CR59!hU_O>V&T^P|hd z=nGtv8`7tu%S!sRYjPv)PmBHdKYEsHGM8Q)T^hZ_HMudpCb~SFUhA6Ngx(QdR?$0M zlbg~9qRS)bgRaRu`b>0rBz@L3xfwlkx!8|K(X(8Wo70P<%W8UwYjO*EU37Ugz1}sM zPw$8>kD+(ECby&yM3=|X2VIj}(PyH|dGuM=^jg>Cw)D2>vWDL7n%s^)Ke{}TzQ8qENS}%>Poht|Cby?&t`Ph2WO|lsatC^G zbXiL;aZT<>uZb>Cq1U=5i|B39<*D>`*W^z0`O)QR^aZZTo#|82WgUImHMt8tGd=d> z>GUkuWHG%sx;%qk;+ou*UKd@SNw0TJ?ndv5F6-&tuF2i$L(%0~^kLUz34JEIJexl2 zn%sk)xnk_cbLd&F$vx@C(Paa@#5K7Wy)L>umtOChETwlum*>$tU6Xs$hoZ~#>BFwc zedu%1Wg|UlrGzH;rDtQ}{U0x&=eQ=z=;hJnh4c#7Uf`NMh+Z9CHq+<1CJ&~!MVFV++g+0t z^nvK|a{8ca@(}t=ba@4R)-`!3Jv$@rFSgKgT$6{1D3TN_t&%c@@3hHTge! zM|62Lz0);m^nvKIl|Ja2Je)oiU0y?2%(^v8R@>+U^Yw`$saddedy~H(nB)u-W zY@^q^CXb?bM3>joJ6)62^r7hT2KumT@@V=@ba^9v)-`zyJ$u!-|JY8?aZMgeFOM#7 zqF1;k=g}LY%bV$quF2!*J<;VY^j_EG@$`}CvV%VAnmmD?yjq-Zyp^8fnyjJcN0+zJ z3tW>Y(kr9O+v!!V$&=_!(PbyS*)@4Gy(hZ7gWl_!tfh}cmv_=fU6ZHKlQUyK-bGJw zO`b~6jV`1D3Tv*``dWe>g4HF*xbE4qAu-tC%f zpbtft57LKSljqWBqRWTqv#!bW=$UK8e(a@ZxhBu27e|*5(@R{Fjr5x6@)3HiYw`km zM|Alpz0);$A$=&i?4u96CNHATM3;}zXI+z9^Z7e-&Df8R)3aQYO9wxOOXzLU<&*Sw*W{)2`O)Q5^aZZTX8J^Q`80jfHF+65HOu$Q`Sdi`4wAtLS6V<@5A$*W}go+URbomm!*)@3`y(hYSncnM~Y@?4vm#@%A zU6a?-lh=;@I7m-%P2NDyjV@oM=eZ_tq?bpRuhA=9lkN0|=<;=XqigaedRKHgMDKP@ z-b^2gF5jRJyC!d;&qSAR(q~-9Y=rhsf2z}Nyc_%$PJNDyy^c>gZUG&oE@_l-lYqE>p z5M6#iZ*)!GP49{>N9o3`BeIUC0iazL?e3U*FU4BiU zc1`xtGuMy(_zgYFHTf95IJ%sqm$)V$r`JW7-_q+{lTXk)qRa2-ovz7#`apE~J$=wM z`6PWNx}2iVx+b5ZXXp5S`2#)2HTg8XJi7dmUg4UYPj84Wf1)?KCZC~qMVHg`Zr9|q z^r7hTXZo;f@;UlUbomQ?)-}0+p1DEXfBco6<(hn+UL0M{&`VsCFVO3v%irkruE`ha z9nt0Q^iJ300DU03{DVH|ntX{q6J5^IXI+yo)3Y~>`;ULpb6k_J(95ICzvvaN$w7KU zbon>E(KY!hy(_w$qj$R|U!xC2m;ca*U6ZfV=c3Dh=}8+UG&w}i#>AiB@jrTwYw`_x zd32d{5c^$|Z_=Bh%Z2F8uF1FPJ<;XD^j_EGFnuJtT!cRAntYp{oa_5!GCjpL`3^ll zx?GfA;F^4wUKw33Mz3;Bj?kN;%f;!L+`GL4?$n*5Yr7+o$$FLF(OMz4u3m#5ddCdcV*(d7#CcGu+R^nvIyoj&NA z{DM9cU9L!1D3TujqBrWd^<8HTgBYBf4CL-szhB zhCUEou1X(tO-|BhqRZ9jv#!Z+>DhU)A2aDWuF3D{<JbeTiXb4~tEFOM!a zpjWsi|DZQSmmAU>U6Zr)p6GHTdarBpPx?r7nM)saP5woni!L{&CvB0?K zgr4V`oTHaVmz&ZnT$BIM8=}iRdZTOdUwT(`xf#9NHTfTXB)Z(3KI)oGT7mu1w!y(7BZn%?P}T$DZ#T^7&> zU6YH^r=rVk=+myr#p&r=`hK}BJ;ODbLNAOix1$%iCYPXBN0){4d9KMN=`GRa_ViZQ zNFR4iE=^C~DxME4qNlhfm!aoImpjq(T$9Vv%cIMk=@qWY zGUDSg^Cxhg%q zAkG)=P0w&mu0}78F886AxF$2{HPPk1^jg>C>hzB2vW(v8np}fE5MAy^A9PKwNuP=? z_oq+0CbQ`2+r)l6fS%!+T#H^9U6#{}T$5|ltE0;U>GNEZ>(E=G%Y*2xuE}hAUvzme zz27ytE`1`pte{W2CfB2nqbxr2c`=ZOE=>4wA&FEv%Wi@@=HMu!GxzP8^qv+iDUCyI7yC%1y_e7V+(R*E!Thm9P%j4;zuE_#=^7gSGPoSr`CbyyI zN0&A90@viW^vdY+M0%BLayxoUba@iJ)iqg2?~5)^ruVxhx2I1;m$mds*W?cL^c~{- z;3@PB*W`}$!szl;dXa0gh+Z9Co<^VNn%s%r5?$8OTV0bo)BB>!)9L-L$zAAU(d8NR zao1!qJ$c8t|9B=n#WlGrJvX|nr{}pQccYg_muJx{T$8)g8=}jz>5Z<*5_(s3c@DkX zHMs|UB)V*%kGdxJq|Zf{=hBmk5}MqLo{fp0Z+IR($2D0>FO4qGr4nkd#q=WA z`cQOvHGSAM`9Jzx zblFNz+9jb$qi18{eBm|p9M|OG^wQ|^T6&plvWnh-x?WyKZ*)x_LGOw#+vwe{$s_4Q z(dG5@Vb|nQ^ttHr26|F)LX*|>Y)tIO8|gW&$)o9|(PcZm%r$uoy)L@EiC*uTJeJ-O zUEWOZbWP5q4@8%@&<9D=+)8X z?euxB$rI@<(PbyS)irq%eSUO#2YrES@?`o%ba^Lz(luF2Purcb&iFQcdK8RrY<)6-m&m(%m3%V+2XuE{It zmC@z1^eWe63%x12e2(7in!J+U6J0K#_qrypqK`zE&(lX;lULK{qRSWPNqZ$U*-FpG z#QQJ4NY8OiUPCX9E(hpkuE}fZbCP4tfFa){pPn!K4l6kWbS zA9hXNLZ68)-=xpFCOhcad&m99x9B;p$y@2A(d96`%r$u%y)L?Zn_lmlyq(?^UA{x_ zc1?EDN21Gj>7%a6JLq%Kb|~Dend}mO?J}@qsx!!MXt$v={3>i7`@gt zc^|zky8MLR?wY)xK0mtrl)k_<*+ZX-EX_QPHUCz7=vO^(nfqRSNeq-*j$diue>UoJtze$Y z-WFZ1NpE*ePSNK_ms#`$uE`(h6Vc^b^hwv`kMz{Te7{_qp5~hTiJl)_u0tze$PJ`!E7Pakzn&d}$g%N%-AWkQp`(X%n} z^BFgw=eQ<+rT8`8^MlYh|bqRWlw^{&ZTdRKIrOYe3~{z)H-E;ptRyC(ml&qSA- z&}Utff73Jn7v~E%rDwS&=jf%;WgflEHTe&{F1p-|UhkUxm);RwZcguXP5wt8h%UFF z54t9k()oNBUFOrLU6TvZGcESxmh>#wgZGW7E3a%Xyl zYjRn7Lv*I)i|O62$>r!n(dDl6Vb|pH^qJ^#H~Oq=as_(k5pjNScY2m< zGM!!=U6#;GT$3x(Yog0N=(VoNmFR8J<(~9**W}9df#`BC`k-qvgFY2qmeQwPldI6v zkM#X=Z+eDna#eb9bh!_`#5K7Zy(YTcmtO0d%%rzPmu2*J*W~K-`O)Qm^aZZTHRu!3 z<^J?Z*W{Y?^rK=w9zf46%=JJ`i0V zOdoVjX49vl%L@9mYjRzBdUfo_L+BZ<$@S=k(dD7^BG=^l^qT1MFnX?px3%4 zH=(yhmq*guU6Y&A=SP=E(HFQT^XL=NWi@@$HMto*^%&nTkEW-&CO4<&N0-OY3tW?1 z&?}?MW9e0{$$WZKbUBaS?3&z?-VJZM3-mN8(ovT)4QU}bLic! z$rAcdblE^3c1`XK4bf#Iz0ozf zH@z#mynx>An%svz6kT3OA9hXdOP`4@FQU)7Cd=rVC-{EZM9*?f?nf_&}&_j2hiK1%S-9)uE}!x{OGcozQ8qkAbl#jyo^5WnmmY}UgP`a<@5~K`=ZOM=>4wA!{`&y<<;~_*JLF<{lwUh zt@I4n!QnR>GiJ3!|5H-<#qH<*JKraAi8X$54t9gpif1Y*VCt6 zlSk4sPm1${H_)?OlSk2uqstrVC9cV8dR=tcPOo=O9!>9vE^nfDx+agI4@H+Z(}!J? z$I@q_%UkHPuE}}y?2~=J?4akkCXb_+N0+zKD_oPu)0?8p+vv@%$rI>3(dF&*Ue{y| zeJr}{q>sBMPo$^T`aXFFJ~GwB1-<^A+Q*JM3?D!S~UPrD}1qGz5O`|$yKmTU5CdU165Aicyjc@DiU zx_pRU@0x6&cSV=I^lsPWx%8pv@?rY0Yw|q$Omz7OebzO3K0Wia*pH9Wvs{yn^y28U zk6z-MyntR8T|P#ycTHYM?}#oRr+2z0FQN}bmru|KU6W1pspztwKJA*kn4Vb|`|(M7 zmTU47dU1656urbXc`3anx_p{m>zZt)w?&up>Fut`%jg5q zXQImi`mAg68hYj#u^(TeXSpV?rI$vRFVo9hlh@JfqRUt4^{&Y_dRKHgNbhz{UQZv2 zE?=b&yC!d-&qSB6(Pv$gH_|iDjQ#jJJC>*sTj}ZbzF)pg&u~rNMlX&o-=UYdCU2+LMVIf= z>s^zb^p5Cqgx=|zyn{XvUA{*jbWPq#pNcNur%$^k@1m!l75ni6dWLJVi(VLAj?#-< zlXuf=qRS8IwXVtkqjyA?AJIEqllRbvqRWrz!>-A0`doB5Mo&6Bp~-vcxtRF-4g7?j z=bF5aULIY3O0RHD-cN6eEDAHYG<}|H@)>$tbon#A-8K0veIUC0 zg+Az-e2zX7UH(d+bxkgyXP)Q#=<}n?S^5IkE=_AqQqV!SM#NS`w;`AKXbSh+Z6BE<-PIO@2(Ti7uC=*SaRh=pE5z8okps z`3Zd>x?GMv=$ibLJ`-IoPoH&7en!u{DE8wD^eorpIK4Q!OsAK)CO@awM3*blYh9CH z&^w~bmFS(W$uH>x(dEkYLD%F2eI~lhpwGG{zoKV1#reTi=sB**uj%E{<*M`w*W@?! zhUjuNdZTM{lHL_vX41P|li$)uqRZ9kqpr#C=yTEK8uX-#6Po;(B>XlhgF6=rWr=?V9|Vo_R@} zA6%E7<(mA3UL0MnM=x~zv)BK<)-vu z*W?_1Cc4a{&$=f6p=UP7e%y?n<(mALUK(9)PA_v!{ztEiF1Mi9yC#!XDav`pti7vOI&$=cTre|Ij`*CY}mTPhmdU14FKreAkCe!Pp%WdfO zuE|B|9ns~s^iJ30V)UWtay$C4YjSb=Ty$ATPr5vz$rO4vCZ1p1o}S~HT!LO2UG6|H zb4@NuuZu2sq}RJ9m!fw>mqqkW*JLVvD7xHfq%h9`{%iZYRuF2);L(%2#^kLWJ3iP??vV@-0lF(#2 zJsT7EANQc=xF%PmmqwR+(#u?vE72RG%f0B0uE~|@J<(+;z1KCFK_7`O_ok1!CRd@) zMVI@~ldeo?a#eaZCidgL^c>gZYV^|RvW#Bln#`m(M3?)~8(ovD)4QU}{psDV$u;Oh z(d7a3Vb|oE^qJ_goIdNC%%W#s75ni(dX8&yEqZx$c@VwAHMusuDY`tE-t3xOhu#-m zR?z!hliBpK=<*QyxNCA+?<|$P3*^G z={c^+E$HRZ7Kx1)DOm$me6*JL4mD7rj_KJ1#@ zo<0{{o=Q);E}_XC=-HS!KX@8F$2GYly)?S4qnEiRi|7r}<>~ZB*W^z0uITa%dbewG zXZlcdc_w|>HMt9YF1oCzC$%LsSxnDG?U!fK^IVg=(kr9Ov*}f?$=&Ep(d9YxX4mBI z^uFk_f!^<$ETK(aU6XszQ?K`Z@;rK)YjRI|esp<0y}&iO7ripNY@}DYCQIo} z(d7m7X4mB2^q%PQLVB-jav%Cwba@ed+%>r`J^6+>|JX!NaZQ%dbEC_P>3Ocn{pjV< z8Ury{m0AcX|BnG==ss* z74!nvC!))%>65O>!|18)u^(IM zX|BmidSP^V4ZX-U`9FG1ba^ek)-`GLj_C3_dZ%mhaQZ-W*+w69O;*vTqRZ>))2_)Q z=;=54et82u!!>y%y*RqOkzV4OJc?cuUAEI}U6a-Hj_C3xdZ%mhX!<~Oc{6>`HF*qu zD!ROdKJA)3mY#ld?8gpzhHG*jy)e4Gm0skUJdR!yUEW5obxj^mZ;LK(r?-dSGgu@=`GRa z-Sk%1lin9y_R#xXllAnm=<)&jxNGt(dh)HlUp`1raZR30&yOx2 zq8GR(&!JaFm%a2V*JJ~|DY|@^-t3w@m);j$K0@zzO`b;|i!L9fkGm$%rzhVQ`>~In z;+kxv=SG*0(eqrB7tkxC%g5zPXYw~jX zNObueebhC11${2MTtH9iOlY!&o{fpmZ}>bt$2EB+y*#>nfnMR7yo%lwUA{PQ z?};u4=)JDVR{BVE`4WB9HF*tvF1mb~o^(e-lh@L7G4c5gU!mu@Ca23fE*C zy&<}MmEP!@yq?|@UA{)|bxqztABiqsr;oZOZ=}yfmqYZVI}@60r)Oj0{^J|;9M|Mc z^wQ|^O?sJY@@9Hnbomy&-Zgm(y(79Drgyp~JLm(^<=gZ@*W|7Asp#?@`m}5EHhSh= zzF)pe&vH%PPA`ovN9bj)$xeDhbom~=(KUGoy(hYSpWf@5ypui>U4B3xbxqzypNlR> z=}BD)O?J_9F>!wILwcTT@@{&0bomjz!ZrDS^rqD6lpP=VQms9it z*JMAvGP?YMUges6lHL?u{zz|jO+H2Mi7tPl_qryZrjJFJ)AVuIJ!zte|ZlP}O` zqRT(%v#!Y(>6!QX>yxweEZ5`!y)?S~lV0YUe2HEcUH(O{cTK)b?}#q{rgyp~x8?6Q z2BOP3`k-s_6|SF(F8`rVyCw(e>G#F+f&bDoT$8WT3!}^b=tZu{*XY&JWzr!$AFj#Q z=`GRaLiASG(^FiNZ_#t3%SGvVuE}9~ zWpue1y~;KDHoYmjT%6wQntX@e6J4gzdtH<7(nq4pCFrBB$q{;TPwdAf=_#(s_vpFN znV#jE{DNK_U1rcrT$5kYYog0l=(VoN33^*}xhlQg zHTe~NessASeSvH8Yx+cVnMt2?O@2d9f5`XC)#(|o$?bUmD2y)GpclC&C%L{lx?Gb! z&o%iiy(PNLqPMyx3;F(i(dAn7e%Iu8+8Wz%@BdpNcMX=+myrpXr$o$N9kx=vl7G z?YTdt(dCBpGS}oUTwfPmZbYwlP5w&nh%R&Kovz6p^z$LQ+?YP-nw-)8=yDVKv}^J= z?SCZp+7P+t?Biy$-lY2Bf2c0ce*Bb z*8Ptzx1kTZCg-?*D!Sa3KJA+Pho0US=O4GDXSgPJ;rkaxmxc5q*JLrhCc507UhA6N zmEIOz?m%yMP5#TTKR>$Mk-oq+`5%2Ex-6nkx+arWV*g{YA9tc>xF#2(7e|*n(@R{F z3)AbO%U$U8uE|B{UD0JRz1uaJOdp9ZccqWICU@iY&qbHJ(UTreXmU}m&&I^hFWjA; z<61(lFO4os=w+_S#k4=V+=E{4np|A_qsu+%-LAJOSC__ETtzsk~RQf=4xgUMdHMul> zD!SaCKJA)ZhMwLZ=LZjzZ7S-WFXRL~nOZE>E8y zT^>wd;F?^4J`r73&?jA!dvgC%pY;9m5PF(xGM(!Sqsv3-MXt#e={3>iVf0$pERbxF$EIH$|7H(VJb9o6vir%Q||mYjRWiSaf+hecUyf zM^An>_Tw4!6xZZt^xWw3OnRPca&vllbXiZYa82&T^WP9%o<(nTO>V*UUD4&)^lsN= zK7A;9elMLVD%`-!CtsXSpV~rx!<;P4p7iYCh@-WOe7N$+<}?nWPrF0Z1GyC!$1r@r9( z<<;~w*JKGjKe}wC7q}+(pjSqh*U+n6lY7#eqRVUP&92G4=zY=Ub@YDMWGQ_tx@@D5 zyC(OhC%@?X<@NLw*W^C*-01QKdY)@?UwUP9c_Y2bHCaY)i7wmet**)a=zY=UP4s@( z3kbCJ&-FM3=YG8(otJ z(|e-J+v&Zo$qM>dblFKCcTFBbPkt%(;~n%A*W{t}-01R7dY)_YFnW1(c^AFHHCah- zh%US6jjqZ6(YvC{yXoDoNuv)%Pe>ou*M}sTJe)ogUEV{Vbxl^$Ghg=CC%frcuE`_l z#nI)x^b*(Pk@TAA@;-X4Yw{?1TXcCpz1=lgO`jiK_Rtr&CXc31M3)cHCtZ`r&{JRW z{qjM2nrre{dVX~I5WT=PIgef$UG~zeT$9Jqo1)8y>CLXmaXqZdb)^XVn7$E?=M* zxF*k`S4NjF(yLsP4fLkya)93Knmm`@6J5SU?{!U{M<0nUU#5?`CeNoQzwZ0xEA$lC zWFtK{x*VkExh5~5S4Nkw(yLsP7t&jz%h%|wuE~q&ebMFX^nTZ56MZbY9HNiACNHKZ z55<0bgP!7=yo8<~UA{>#a7|uHuZ%9=qF1>lo9Qjll2-tU^coIVj< zzC)jMO5 zc6w!W`3=3wHQ7mTiY_PV&92Ei=zY=UxAcD3X_QPzaIuJ`!CnOdoYkK24vCE*GIEy_eABe0nw}?ms5eb6k_p(95IC zMd=l;$!F;e(dA8dOmB%UGw7|Z$+zi!(d8=ie%ItX z^oi(lRr;iB@?CoBhp``5qo=thN9g&{WhTAAHTfRBGP+!yUges6pWYN*u0d~hO@2V{ zi7wZq_qrxW=_Ao)7Jbw;`5}ESx?GE%^ie{SAJMZh@%-Z2^c>gZ$Mn+Zavge^YjTWU z7hPu4>s^zd&^w~bb?Ke1$xrD6(dBydLD%GG^r`4_efqR(a-5$2vG12T^bFVJ=k&tp zaszsiYw`k9H90}=i!O8N{jSNc=ws34#`JO5!Tz1z>@2Y>%N8(nTipL0#_rN1BkAnqUBnx5gB{7(C$ z%WddIuF3DUKe{ZW*SIF<>8;V_w)8gF_@mL~ z&h#Y>rx!<;CG-;42i1np}!r z9bN8CuW?N#(_5p z5IyOWgeF&^XJg{`A0AB4aZRSv%cILf=oPNXgW1;@T~^YYT$8JEzBjr&l-}o>T#Y^+ zT^fDDHJL$Ao{sB}htX49ldIG7qsuCKfopPYdUbSpIK9R-xemQOx;%p3;hJ2RJ{(;h zNgr`dR`UF3qswagoNF?h^XZ?){f|e{GhCDF(Tk(Yqv<8C$@S^A(d9ApI@e?ly*;|D zp?A0@H>3|om&ejaT$3BqXQRvG=yR^gTzckbzF!_s&vH#}LNAUkYw0Df$xZ3?(d7yB z2G?XBy*s)*k>2B)+>AaRU7kdra7`Y{^*z_JCp4MQ`CLr=`36s>=eZ^~rHX1VJ$=A6SwNqRE>ELRxhA)wC(p$Fji=L7T$9_-bEC^M z=y|TmLV9_0*+8#wO>RqXjxNunx40&^r}sveXVLpylSTB&=<;m(lxuPadg>RxUpCUy zT$4M}^P|gi=moCHo#>U(<+=1K*JLrhHM%^H-sYOD;^*HVT{h7NT$4LP_i(d9+-7T4tN^#17bV)}q< zau51sba@GV$~9R^PyQ9(hFRZd(o?-%gg9BuE{cbdvtj@y~8!R z4}CDYY^4vmCikaLN0(R7XIzs9(NkyR`s0=KG}q)2T;KfY@+x|PYw}>uS4Wp^^cvUX zk(_UhF0ZDyxhAW1|3sJ9&<9+T)!H9jUQ3^GO&+cNU&nrIr>D6lYv_g1<#qHT*W^)r z|LW-SdU}m(@@VakE^nZ>xh7BG@du;J4*HO5vQGP>%Nyx4uE~?>>EHN%c@sUuHF*r* zzc9MInO@|YJcaYM(PbyS&NX=|y)(MJh2G_wtfvo0m$%YKT$43?|JmsBHu{`v@-)t8 ze(U>X7d^{0c?P{Sy1boU=9+AvH%6Ct(3@P7XVH73%RA|PuF13MlhI{2eaba?4n29! z_sP5HDXz(L>G{zU(hKzU!AU01qgO|lchhTJlgH}*h%S5RZLZ1V=>5^K{oloYypNvZn!J#n8(sF&^IVh7^vdY+etMN_@?v^xbol_i%{6%meK5Lw zkUr#^yp%p0UG~xET$7j4Gry1f10SMixh5~CmqwQl)5~0wt@Os|@)3HIYw}8ZcXZiL z?{Q6DMIVnYAEi&YCfn$X(dA?Gq#qKRyqcbiiO(@5(!{qik(ifi&=9zQp_e4C!H=$LOQc<$vj8uF1#g^U>vd^aa=C06p^;e|~b3p5>Z+ zf?gV3zE3Z6O+HDlk1ju;H@GIBqIX7@AJV&AlY{i(=yHla;+lM#J{w(rM4xj_K0{Cc zHSRC`n4aO9e3o7qU4B9@a!n4=tE0sfj${s zeomiqO%BtOe~bGIXXq)e$_vZm@>_b2Yw}fkd2~5PuW(KNhu#=n zen)R|O}<9&jxN8a_qZm<=%dl)5A-qDeL=yIOE;F^4cp80#cKJZ6+mTR(s>suUM z{zNZvO}@$b+UW9UdYxoTM*CmrKx-{zz!@eR?(~{{9n}r02LMKcJUJmrK#hT$3Nt>!ZtLdV_0niryJr zE=})pO@2fljxLv>kGLj3rq4!~%hKmulb_MkladqrWePpRH912sj4qd>7r7?CpjSti z%hPLIlV8%?qstZO9j?i*=)=)vDt*K?`89n$y8IJ;!8Q2}J#z`)FaJ!>a!r0qFO4o& zq?frS=jip(Wg5M~HTfOAGrC-f-sPJ7o<1C1u1p_sP5wZijV@QA&$%Y&>FG?%*`jl(( zJl-FYm-78`4SI@e@;A=sN0)2T3tW?n^y=s`lV0PR{GHw!U9LrMb4~t1AB-;lN*{7f zp3lDN=<;v$8Q0_z8N5Fw`+k{4PjgK!Nzaci*QOV^CYPdDMwjc*t6Y=G^ycVtU3!aa zav6GWbeT=>b4@NwACE5AqffXdQ|QS{$Mwhc=_#(s<>|T6uP^=SxE12 zO=i;vqswjSL$1m7=(Ew~cJw*dPtR~oZa^=LE{o_zuE`vFb#%D{y~Z`U zA-y%a+>zeqn%s!qA6@Q5A8<|P(kG+KV)~S8aua&;^1fg0Oiyu5Zc5LME_b2lxh5~? z=T{zG?n3OcnE$HRZ<(~8k*W{M;=IC-SdW&nafZiWn?oA(XO>RY>j4sRQQ?ALa>B*_F zANQfBxF)xu=SG+N((_!Ch4k|1azA>7YjQh!V{}C7faz}dhpZxjB3VM!fawmFeba@cH%r#j|ua7PdrZ>1Iccynomxs`M zT$8QbpX1SGC4Is*xeMnPqsv3-{6wV5UFq4F`23AV&v8wb&`YDs!{}wM$=&Gn(Pb6A z!8N%%y)(KzoZjV{yn_9s(d7~JG1ufCoL`JCkEAE9n9yV?JsT7Iv6`Oan%t9K8eJYm zFLO=qMQ@BQkES=dCikXyN0-OYdt8%c^wH?DhCb$++=o6NT^>tca82$@&rI|E@;G{y zYjQt&adde+y~H(HPOpzHYv~QH$^Gfw(d7yB9@pdn^zrEOMEZnl@<4j>O1@8?L{D)| zR?u^!%Q||VYw{p^d31R)y}~tlFuggtJcZuknmmNw8(p4C?{iI7(#NCAdisQG@=$v6 z%CR3$qo=qg`9s>D^P|ht=>@LI!|0XK`eJl>Ha%&TgeH%oXJg|2$3}XNYw~D%d31RWy}~tl481YBJeS_&nyjIB zN0;Z(dt8&p(nq7qCi<9b@;Lf@ba_5~!8Lh2Ju^M-f4qR6<(jOe7e|*D(o0;EC(vu7 z%Vv6=Yw|>TXLNZHy~{Ou5`8qfyqG@bnyjPGN0*n-7hIF4&@=xM`>}uF2Er?a}4s^bXf#1AREUY^9I5Ca>iEbvC-Zf3UM=o_Y^UeACY$J`(dBjYGS}q!^!n)XdU}Iv@&bBiba?~4%Qbl+eK@-8ppUpF zo9VOB<&E??*W^X?^bFrGZ=z?oCNHKJMwd6!i(HeJ(5s`%PI`@NvW4CnUEV@(b4^}K z?~g8Tr4P6!FQZRJm$%WUT$7j6lUMisvWuSLnrx-#MwhqK^IVfx(95ICJLnaz$t&rN z(dC`=CfDRu^zP`go8IG^Y@?4xmv_;}T$5MR7o#VnC#}Kr(dQ$)hMujj`R}9T-SiyS zlQ+{xqsxcrW3I_g z`h0ZxFnz%_c?&%=)A!3q=vl7GTj|BoWk0>dHF+DoHoAP2Ugw(ZqIX7@kI}naleg1{ zqszzXBd*Ci=(Ew~0DaCic_%${t=NxG(6d~V-Spz<@=1D$Yw|97ZFKn*z0NiHfAsd~ za**EPn!KAn7+pS1A979h(5IuzXXrDo$$RLjfA#(HS$djl@?LsjbU8#Xa!uYxuZ}LC zqu015d+Dvw<@5A5*W~^5{^;@r`haWl0s3TgIZU5&O+H9Z{+sWYFVa(7lYR8u=<+3c zo@??UdUcSo21qW8Ea`{|?6<-h4;uE|H~^U>ui^aa=C zWAx0dxW90ep5>Z+oL(GVzDh4~O%Bj&qs#x$>s*sh(A%TS*XSLt$tUT9(d8I@$Tj&C zeLA{)oj&859HghO?fc~$^bFVJ)AYjV@=bb?Yw{U-b#ysSuW?O2OK*)X-=epbSH@!Hz zoT8VwCSRe~MwcJa>s*tg^!DiTV|s^c@>Tj^bomK=$Tj&N`gC+TO`ma1zD7^Y_Wklx zdYWspjo**?(dB3K0@vgi=PRSj&*@dJ$=B)4(d7)i#Wnc`y+6AAfb^a9u9+w{ul@@smPYw{g>b9DI)y~Q;-LGO(&zoqxN zCf}uxN0)Q-3D@L*>5I|jcl4z76PkRFo{fpmC-^-*$2EC1KcCX*@&|gEYjTqF_0i=# zy}>nk4d*+f%OB}ouF3Z~KO9~DL?3ZYen6j%E`O%axh6lPr*Gi<3ztZbmlONODqs!mu9j?hw=!4PaB7Mj;IZdCAE`O)bxF$cPr{~0e{2x8T zHTfC6FuMGMUgVnmoL(JWCROtO>zbUQw?>ys(A!*-U(oxb%O&XpuE{Uy)6wNp^cmOW zSM<~keZNemr@1Dt)$2RDT$*0snw;f)Wpud=y~;KDHN82yT$bMAn*4^|A6=%<2V9fi z(kG+K<>*tc$vJxRM!sJzPfu}8en-!ZE?1!ExhB7-mq(YW^a|JH5A??9@=x?8*W^6C zJG%Tcy~j2ABYiZwT#-KJn*52r7+t2(lQvFh@@INBCSKpT5LKnztTIS%XE5|Yw|bxaCG?>`iN_Ckvo)y3C|6xF(mPXKoVv zaV>h5YciQ$8eRUCUgnxynqD7W{*B(?np}q78C_=4yIhmY(ubqVwdo_S$rSp0bh!?F z!8N%YJ#*98kL%L2T$9VwOQXwddYNl-1$tw2xgNdAHJM89jV{-x_qitjM4yZ7q3=uNK4 z40?BT`44)JYjSn^Xmt5c`j~5S4fDicg|G~}aIj+e}dTDgI1-;BQ zxfZ=Xy4;f9;F|m^y)(Kjpm(_@|3)8wj^aa=C+Vt#y#D3g{p5vNa zhh7?87ShXHlk3v!qswjS4X(*-dS`UG9lgsnxgLEuy4;>V;+kBaJ{w&Y(dS%~8_?7L z>HFml^bFTzJHMX`qstxXMXt#l&R0j5JJD-glN-`oqswA?n`?3-dVh4eGkw4{xiNh* zy4;06<(kZ;C+GWqxhp-zHMt2rH@YmL=eZ^~rI$ySyU{CLlYgf-Mwh$On_QE5^zP_# z4|uE~6QX>_?az05VaIlVr* zETcELCbyt>Mwk20yIhl7(nq7qed%Ma$pZR(bh#gW!8Lgu_fO^)zF(Hpvs{x~alSaZ z+@D_Jn%tUR8(khiuX9aqLvN2R52SavCJX6<(PagF$ThhweKxv0h(70<+>V~UWxPJ{ zV0wmYa(jAVba@E9$Te9+uZ}J&={2s&9q6sm<)QR8*W`}${^-)^1Fp%P=#$aqVe~22 zEPF zxhD6e*GHEp(HmTo`_Vh2%Q||OYqFd^99^DFA8}3YPoIr0PodAbCJ&&eZxgQ%Je8i| znmmwR99`DaOI(u`^xEk1Gy@eK5K_gFfV%JcK?ST{h5XT$7db z)I#4c&!nfhCJ&_-Mwe&Ni(HdNuZ}Lyrq{S8Z{+9S9$hxlJ6w~8aeg?uJcmBwnyjMF zMwjQ(=UkIF@%ZW6#`VYZ=ozlb!?i!UY@!#rCXdkm=<8;Ua z3%$)Xc^thzy1bM=;F>(1J{etJMxSy`*3y%=kNtQ#J;gP70zEgnY^CS9CQqc7N0(R7 zD_oN&(Ho=7E9p(H$vS#(ba@rM&oy~6eLT8sqffXdPoXbHmsiu1iV~VUm7a}>_b0rD zp5vOVrT*V4;elc&)eqsw-BlWX#HdUter9lggjc?Nwny1bq~=9+Av&qtRx&=*{j zXVNow@cpubp5>Z6i(VRC-bgQVO`c7!k1lVbH@GGn>7CK#&GatU===(3YO;+i~{ zJ{w)$LZ5R@o<~pL(f7++=^3ucCVF9Xc^kdRHF-Y0I=bwl*SIDxptnbtx6?aZlNZtl zqsu$!L$1kY`gC-8Cw;~>c@aHzC*Lo->1nRXi|P5%5I|jz4WBwgeF_*xv1BNypNven!JKu z9$og*D_oOT(i@}8`{_-t$*bty(d7g59@k_WeKfj!kUr*`yqZ2AUG~uzT$9((Gk5m= z@*#SbYw}upadi1Gy~H)yPOptFAEDQ|Ca_Ijm)MVw)3aQY9rWVpa)4gqn!J%-8(ls@uX9b_MDL6)pQLxWCU2&XMwd^~ z$6S-0^u_3Mke;+_LX)@9voZ1hiciyXT$8ub%cIL@=oPNX+vtta<+JoA*JKyHJGvaA z_qZl+r;kUM&(SAblXuV;qs!;%NhJwQ-bv5K#D08%p5vPArk6&S!}K!O6OvtJM=2ounjEC(MwgTHJlEvY^vdY+eR`E^@)>$_bol|j#WndXy+6AA zkUrp=9HLK0ms9i^*W`2b)IH<+<45!~*W~l`{OIyydVy>51$t$4`3b$sH91UgjxML^ zEw0HI>AlhAr}RG8U+H3IRm%r2dT$3Nr z$D_;t(I;G!AJP}2%RlHz`zACwMbE~>{f|k9a{s#~KcbgLmrKygT$3Nu>!Zsh=?$*Q zPw1V|GUeso+%M5yoYw{O*ZgjaiJ>MaszsuYchr29$n_pJ6w~?(TAhU4e2AU$>r&@(d9<;IoIS0^vr`|KWO|C@G zk1jW(7q})@rdLOo|De~nCRd@iN0BG@wK7GVB`4{?pbh$Zw!8N%mJ^K*f zFSnrQxF%PlmqwRc(#u?v8T9(-vVh*;np~aU8C`Bg?{ZD9K_8ATx2BJ{CfB6TMwi>r z=UkJS^z=&KFAM1zuF19Nh0*1<^di^fU+LA+<#zNM*W};mtbE{o|kuF3W2?a}4V^bXhL z`t-r*au@oLYjOknY;?IRea4;iSxO&rO>RP;jxP74&$uQxrKcVi*B|$yr@1EoPS1}n_of%PCiCdk z(PbIE#x=Pay*0Yrhu-Fz{0Dt7y4;sOul2HMu3dIl4TM-r|}pp!Y_X74$yW;R?|CN zlRMJ~qsyb{L$1kP=+n{V(exSD3y!rQu=swSxcXAP3}owj4n^0CsijjxfeYf6Mufg6X`jw z$-U{N(d9|>GS_4oy*|3Eqc^xF_n~)2mnYM^T$B6Khoj3==p(Ml{phpN<*D>J*JL?8 z{V3lr>**P;$^Get(dB9MBG=>r^y=vHbb5_z@<4iPba@87%{5s;?~g7U=mW0FgXojd z<(c#;*W|(Uc{n{cx;&qr=bAi%ULIXuK(BC3cJj|}nxo4L z=`F6wBRSt6T{hDPT$9!G$>{PT`jl((D0*s*@0SgZsr2&bvYlSxnyjZcN0-;pTU?W;(R-uI>*;;2$qL)TbNH5dZhbEc4 zm|h=U-c4_CO zr;+njI-XC2)Kp${TUP+&hE+3@NxF)Znr=H~dWFI}vHQ7cl zj4mId7r7>{rdLOo57TR0lh@E&qsvF=ZLY~{>HX1VKYhS8*-oE~E+3^&xhAipr`E-O ze2kvvn!KJ~7+pS2FLF)ZK(CH22k14f$qssJbom6m%{6(8{{4jL@=5xTYw||UPe+$e z(PvzfH__8i_Wg2@p5dCjnO+!OK20xjO?J|2qswRLb*{-<=aoboml}z%_XneKNXynLg#3{6Bi~slH#1&{JHKchhsD%YV`HT$4TY^62v4^a|JH zJ@m%t@)dfMYw})tcXT;Q?{Q7uM<0zYU!{+^CVT0N(dB>WN%aX$-cQfQ#QP7vM$d6g zK0q&xF30F)uE_`KjnU=n^d{G2AH6%ee1qQOntX^p9$mgkpKwh+Oka#H$LUF@B{ca6 zJsT7I@hy6eYqFnS8eP6kFLO;kO0SPD-=R0SCLg1BMwb)xF4yGa^x^38UHXV?a)3S? zUH+Fo=bC(io_V_Om+#TDT$4}IOQXw4dYNnTDSCZ$`98hDH91J{j4nT*cey5?rVmG# zAJRu$lh4p+qsuA!oNMw~dioi@Uw%Z-a7_-;3!}@A=|!%|=jheZ8TCAUw%$cb4|WP&yOx==moCHm+6(!BKH!>spFSB~{z0E|O@2U6ZuI?<|7%uiifi&idVX}d1iipDIYqCGE|;WNxh6lN zH%FIC(OX=TAJhAz%Vhe1Yw{ENbac5iea1C8O;0_?_seDIX|Bmn>G{#+vh)JiwX z^aa=Ccl6Bje7{_Up5>bSo?aYXrqfGYlRwaFqszb0>s*ub^!Dg-ReFbO@<;k$bh#RR z$Tj&BeKxwxpwGD`f2OB5`F^=NJ;OD*Krf6g*Ps`abh#FNz%{u@pNua5N}qB~{!ULm-}lSE(NkQL|D)$dms#{Y*W@4c^5}AHdWCB; zX-)30=yDx;lWTGbdUtfWF1^P!xg>owy3D4Jxh9vQ&qtT*(HC5k$@I(%;{L+*=~=GH zrRl}duE{iddUNc@f6y~rlPl2+qsxENi(Hc{)2pM)e0q&*aus@Obh$ab%{7@$?~g9G zpbxkv|3aURF1Mu5xF%Pnr(WdyWdS|SHMtr+Kf2tCUf`O{pjStiThnV?ldIEPqswjR zZLY~R=>5@UA$`C#xh8!wy4;pN<(kZ-CtvLQ<#zNG*W_CC+~{(9dY)_Yuk`ZhvWQ;c zn*1BRF}mD=-sGChqIXA^JJNexlWWsQqsyJ>W3I_{==0HKF@3=`xh_5P5`TVjXL^=v zGMio+UG73Jb4{*CZ;UQ?r8l`I*Qa+!mnHNb*W?ED(dcqF`j~4nhdv)&?oMBDO>Rif zY>EB22R+L*xe>iMx-6xaxF$EI*G89n((7E4x%BqvaxZ#^YjP9%V05`ReaJPrDSbA& zEThl4CjU;)yfpUXKJ+ZtWFEaZy4;su;+ouyUK?HRN3U~D-pb#fbw-!v^e)%rKR7=e zUG7gGaZUb{J|A5kKwof8=F>ATi~V>YJs*st(mSKe zgXvwa$pZRlba@DU%r&_ceLlLZq%XK8x29)b?)&AT^c>gZHuTcy(&%Nb$wGQ#ba@!P z$u+qxy*s+BqW8Eax1*0nmxt5GT$9_=7o*D~=t->!O%~C!G4c5okEG|gCU>BhN0-&~ z3fJV0^v3A&D0-7?awmFsba^zr$2D0@AB`@Lp^v#Hccw2!mo@aHD-xRAg`SOx{dg=r z$2GYty)?Q!j$Y=PETPv&m&el^T$8)eJEO~5dY5Z*clvO2c>;aJHMs|UHo82KKIfV& zrKex%`{haW4A2fvU7k#@aZT<`Z;dWbp|`mv%jo^l<*D=m*W^C* z$>_44KINL+m!5o;@0X|1Q(Tk#(Q~8A)9HDx$#QySba@87$~Cz^y*0XQptrdu51{u) zmuJ!kT$2aVC!@===u@uA3VLdr@0VxO(_E7W(etCrMtXs3@?d&pba@WF$~Aciy*au( zm)_!$3T$6{=C!@nkBE37hyqezQnmma<8eLvPA9GFC z(HEo3Yw1bt2~D0%&&I@lY^UeACQqT4N0-;pD_oPO(i@}8>*-Cd$$ENkba?~4&oy}( zeKNZ2pij9bPp79|7xzEjNKbQ3o z99`Z*A8}2dO`nY}Z>7(s2JJLvP#7&h zm(S7XT$8ua(>vq(4VYb zOY|YvWH)^}x_p^Fy8Ji2$~DZ+gkBn5zD+N4P4?64qsw>b4X(*Y>7CK#1ii~O`51jPx_p;D=9+w*z8GEpm!8y> z(BuF;7ZcYX-=pWbCZC{}N0*cI3fJV5^v3A&eR`8?@+o?Ebol|j$2B=fACE3Sq))ge zpQbNHms9kl+Y_36hMtXy&u91%J;ycqEWI?k{Fq+mnjE6nN0*<_8(fpm(L1BdX?mAy z@_G7jbonWL#5MT>eKxxMj6Ua@9Hyt=;rr$1^bFVJi}b?ia)w^yntX{~9bJAwuW?Pj zOmB@YzofUhCP(P~(dAe40oUZe=#$aqEPcu~`EPpioxWdwO;2%6zCzE9F2AAYxh6;H z<6zXB z{Ny}6%Qg81y*Rr3kzV4Oe3M=qUH(L`b4`xZ+oQ{$=^d`gx9Ee>Nd3W4jxGX)(HTfyMIJ!)s zm$)WBqt`~4%hBsxlb_Q&qs!&#U9QO)`fzl)0)50a`2~GGx=f`nxF)}(XZFN?{1ZLP zHTf02IJ*2Zy~H&+ORtSCSESduCcmb)N0({z4%g&2^x^1oCHjbK@>}|Rbh$Ep!8JKY z&%7u0<0|wl*W`Ef;^;D+UgDbko?aVW{)JxWn*4#@9$l_V?{H1d(+8u=)#yX6$sg&{ z(PajG#x?m9J^fzaFIT5$xF&z57e|+C&`VsC3-sFPa!q=jYw{O*dvuve?{H22N*|0a z*P;)(CV!((N0)!4&$uQR>8bbme)%_gnrrfRdVX}7MK5qo{*PW6U9L^9a!vk0Z;me4 zp|`julQQ}J7hSGPA8<`BL7$E;v*|Og$tCHjy|EwHqo=thm!juKm+R9DT$9Q4%IIRTThYs0lYgPtN0(dE8(fpC(mSKe zZRlOD$<^q?(Pbfh#5I{gpN%fJrO&x0Z|C`E_W6Ff9X-o6xjN^Iqs#5-C9cUe=(W*h z5xveexhB0cy4-=@<(kZ-k4Bd}(#KqrYta{@%bn;+4<$7DS9&%ku0Iyjb6k^uqnAdP zJJZWtlUek}=yDf&lWTHqdUtfWE4{}xxek3ax-6lOxhB`8&qtTL(HC5k+4RhZhSkn%tD$8(o&u`&^TM zr;kUM`_m^}lXr0cFGiOK(3AQTn!J;qjfwjU52WX~CcEjS(Pag_%r%+E_pgsG5281? zCO4yZN0$fFdt8(MppQnEhtS7dlmDd8N0*iK1=nOgJ@e7Hzwl6cmTPizdU14V^b*(P z7WCTa@-TXxYjR6^dvsYv?{G~P&zcIUDnduT$4M|`=iSf=mW0FV)|rs zc_MwvHMuiAdBFF}ljtd~$zABV(PbSy&o#L#y*#=+nO@m#5I1T$8)eyQ9lf z={>H=-RYyzWj%e&HMs|UKDs=OzTlcHrDr}7uMa$(p5>a{lU^EKoc`O)a|Ec%#hvWz|-U7k%}a82$*&wkSP%SL*RYjR(DX>@rG zz05VaAH6=hJeS_!nk=VxN0;Z(dt8(I(?_GrCi<9b@&Ni`ba_5K>8XS!52R;f;{6pb zpy#+IE9m9X<%RSL*W^L;=IFAS-r|}(nBE^oO&&s@j4m&xPq`*5>B)n>PhLV# zaZMgd&yOx!=moAxqgO_km(r_TlZVk;qszHX2=)${?^7ok zdXsDN6nb}bc?-SAHF+w1G`hT%KIWRNr_V>1x6v0|lc&+Mhy3};E_#k@@^pG>ba^|y z%r$uiy)nAHgWlwtY@qi>mv_?pT$5+g$D_+``h;upEPC>DasBZwdWviEY@LI3+R>6<^A+3*W`ut=IHVPdW&nancf>+K1lC#O8UToetd|Y=9;{OUKm|IOfPaxw$N*%%SY&SuE|U3ozZ1Ky~{Ou8GSUme3U-sn!KF8 z7+pR_PZ~~WvX!2T`u!vyr{}pQub@{(mjm=F*W{J-*68vHdYfzVD*9k_`6PYFHQ7d= zjV_;}&$%YArf0tB`{W=!%Qbloy)?RfnqKCbyq4Y=T|Pr^a!t0=yQ9lz={>H=>*%A= zjFc_Y0xx*Vq0xh8L-cSe^l z(z{%fH`9ls%a`aQuE|dNY;^fDeaBZ6Izvv~d$=m4l(dEDC z4X(*9dUtgB3cbfQc{_bPx*VlXxF+wQFGiQI(vwCKn!J;qjfu}+_#b+XYqFbO9$mgh zuW(J?MQ@HS$LKAt$^WDGMwhSC`&^TE)5oLBH|P_t$sYP*bonMd>0b#=-b2sE#C{y7 z=eQ>CrI$vRZ_&$KllRfe@AH6iXe2-q{ntX`f7+p@%n_QC*)4QX~_vt;Z$w%m;(d7s9G1p{2 zeLlMUkiOuWe3YK~itm?G^eorpWAx(a@*{eQYw~e=eRTOTy}>m(K<|t$KcRQICZC`W zN0-y|5!d9C^x5e0Q~I21@+o@ysPC7b(KB3=gY?4a@^gBTYw~G&b#ysHuW?O2LvM{P zzo56dCZDAbMwegGhg_3G^y%pGEBcIU@;Q3ytG-{(($id%&(rgx%dhDLuE`hZmC@xl z^eWfn-Te8rHM;zk-sYMd=6rv2IY%FGO}A%qY@$SZ^pLS~woW~P~G2qA(vx5I{qj3{ifi&;^xWw3dwQO0vWI<@(d9h7$~8H{_07@c5A+t-_pr^PdN9noI<hC`Yw{I(e{{J>A8<{M(I=zJ-{@1W$ye#AV{v})cY2y@@-=#XbomFpz%}_gy)wE? zs^b2;CdcW`(d82K7T4q(^xo)lNqV1a@=f}9bh#9L!ZrC8J^9tR|CmfqaZOIp^P|h9 z=>@LIx9OG9G{#+D)a)^U*p#F9M|Mh^wQ`uk6z}QOs3aIm)p=AT$4-FJEO~O>0PeLW$44v<#zND z*W|MF+2}H#KIfWDp{Kv?`{nlZ4A?%t`jl&OC3^BZzF+P_PjOAIOwWxj3+Z{T$uxR-bh#_N!Zo=H zy*awvjo#v#T$SD%UG7frb4{*BACE4J=o7BVboyd+xd%Pz-GnArr)Oj0eBqw-9M|L; z^wQ{ZFM644a!q=DbXiPqa7|{=JEP0J>0PeLwdljq4nkde)J;OuXb4_kTZ;vjG-r<_umOdC=9!DQ?O+L)eU(?ZL6@A7v`3OCA%J<9T>1nRX zN9p;|iS#PhWG~k@N0-&~7T4rs^xo+5Bzm7~@^Sijba^s;!ZrB> zeKEQ`g`V_bLX&;;Y)pK9VGTXUHTfjHG`c*MUgny7ie4XGo zxj)0vWi5TgHMu=~Ho826KIfX;fu8Go<%QmO%~8=qsuyaoojL@ zdV6$vHoe0&xift@x;%$I;+ourJ{w)0OP_O17Shu{j{R6q&u~rdN-vBq&!ZQ)CU>J( zN0;Z*Yh07N(_5p<3+QdG$s&4xblE^3a82$(pNuXqq))jf_oSyz$NK{>qNlkg_oC-V zmlx9uT$9E0%ILC@UgetHo8BB+ zL{D)|?oZE;E-#}OxF!#vS4WqZ(`#IlrS#V5@(OyJYw|#Pe{|VQA8<_`M4yZyy{hvs{x$(u2t2hN_yr@?8jT^S+2=r>BZ4yJH5m;Y4rN& z@>Y6-Yw|dHXLNZRy~{OOMIVkXZ>NvACXc7jMwcD*IoIR~^z_etzr2H<;hH>=UL0NC zNiT6tR?};v%e&}xuE~?=?a^f?y~8zmGJP<*yqiAcnmmO*9bMi-pK(q0^ZZHwBKG6G z^bFTz4c8Y(mtFJ{*W{`6+UW8=dYx2N;Y^IM#mxJ^P*W{J-#pv=SdeS!uO1nRXo9Tto<$vf!uE|^IwbA8&>2{E|NAn(U`9Mwhen zq@NO+e1@KjiO+ZZik|11e3o7rU4Bika!o!*Z;md%p|`ju2k8CL8XppU#>t;b4@A%JO$5rSVuE_~{adf#Vy~H*7HoZQ&T#eq~ntX@e9bKl=dt8(6 z(nq7q)#+od$w~Trbh!q7!8Q3FJ@a?pFW01JxhCJI7e|*F^b*(P2lV>raxHp;YjTR- z8C|YT?{ZCkNFR+Z*P)NOCO@LjN0*uO1=r-q^z1);zg(A|hNmqwTC(aT(upU~^0 z%k}9EuE|g7-O*(hy~j2A8GSsu+<-penw+68Mwc7XlaiK}CO@a=V&eIQ8`1MzlV8v) zqswf1m22`#dUJHSF}=k#IZN-2E;pg~xhB7&k4KlA(kEP#U(=J9@O?6ep5mJPhMpf? zZbmO~P0rCPqsz_dRj$cz>CMsQ7W5X^W=eZ_-q?bpRdGrd`Zcq!&k*JJ3s9lfThxqstxXb*{7CJK0lmvL z`3HSCy4;CA;+jlakLOo(xifvvHMs;mJ=yomUFaFE$>;R>A6*vGi(HdSa(!)dxhuWS zHMtbMJ-XbD-r<@|rVmG#yVFNplS|WQqst=toNIC!div6_ANQbVxF(mS7e<$R(u-V^ zDfH^-axZ#~YjQbydvsY$?{G~nPalph_ok1yCRd=(N0j4qF(7r7=krq@Q7RrEU7ENRMNjxJB8x40&A z>HX2=Df9u?UxF)xz7e|+;(Mw#DdGy-o@^pHgYjPWU zXLMOh?{ZCUOCOCc&!CUFCby%{N0(>P7hIG1^vo4~zdVbc<(k}{UK(B2(aT(uJJ1`W z%d_cCuE`zgz0u`4^gh>Q0ew8WJeNM?n%tE>8eLvUA9GFaMxT!^FQPBFCU>W2t{nFt zFQ#X?CX49B(PbmO#5K7Gy*|3Ugx=tq+>_oNUH*yQG<=CXb}2ujc#ZE%Xf6WCguAx@@PHxF(OH z*GHGP(i>cpN7K8b%iHKZuE}HQqtWH<^fA|DC4Div?4T#5Cp391Jr@(tC%l86=bAKn zd31Rvy}~tl9KAWZyo=uAnyjMtMwgxRKG)>&^zrEOZu*34@&x)~ba@XwY4wCAPo!sK z;{A*F(sNvs)%4QnvWs5knmmbKA6?!@Z*WbXOz(^?@27XUCQqRcN0$%KM_iLN^x5dL zn?C27Je8ilMw}mfke=b1JdIu$Jt4hFU-SD1c{;s1x_pRUye^fuSz8T9_> z@?rXbYw}F`WOVrmeaba?7Cm`Q-!C7fr?@8T=(*8lFFnsSc{aT=x_pdY<(fQ)-W**% zPH%Bdo=fkIE}x+HxhCuBjlhNf%^eNZm z<@DsW<9y+t=_#(sE9kk=BZ6IKj|f|$?NE~(dEDBb*{-) zdV6#^Lho=*UQZv4F8@s*a!uYqpN=m7L!WU?-bhc)^!@U`^fcFG8$Ca|9HkeyCU2rw zMwkDiSGgu{rZ-2IFVkCGlef@&qsv$5eXhxN`gn9XMxSs^-b!DLE?=c5t((x~ZS-tR zy#MhvdX8)Ic6w=a`8vJKHQ7P0k1ogQ4X(*M=$+B!8}u&MmL`fPOh z7Jbe&*-6h_FU}WE(6d~VchgIw%eU!euE~4o_0i=!^aj`Dz4XrL@?CnDYqES* zM_iNl(PyK}_vmx3$@}T)>-&EBK0U)V`2f8zy8M7%qcHTh3^^2WYjE=5mqP5z6XA6+KX3tW>U^vdXR zX?m4w^5694=yDl)i)->f^xo)lS$dyq^1t-)=rV;q;hG$!CvOt_aXEU5Yw~~e+~{(7 zdY)_YWqNsZxdOeyHTep?F}h5pH@POq=-tufiu4}W_>?z05WF2E9JIT$SG7ntYSq8C|YM?{ZDPMIVkX)9E9w z$qD*wbh$cx&NcZqJw37qh=}oT5kLlgfWfr~1H91WmjV?E!kGUp4q0dK`8`2kClb_NvH}}^kH=<{`CO@MW zN0-_364&Gmy*9esm|o|a{G8q%U2a0}a7}(eAB-+Hr4P9#zobt`mpSwq*W@fcbqn7w zH>0PyCcmN=Mwgq@i(Hdm)2pM)E$B6_$#3Yb(Pb{Z%{4hk?~g9Gqz||zzokz`ms`=N zT$A6?lXK&I;nwsN*W~x~{OB@|Uf`OXr&mUo+t90AlRwa#qswjSEw0HQ>AlhAcJw~i z_?Gz05WFE4@CtETA{I zCKu_Q(dAC`F4yF5^x^1oXZnb1@^|`dbh!(C&NcZ5J$){xfH!Wx-6m(xF(b7lhNfK^eNZm()8r5<9y+s^c2_R zGW6W&axZ$GYjRn7d30G!uW(JK&>N%6z3EM^$>r$X(d9n$9@pgZ^zrC&U;2b=as_&F zUhKybdWvf@m7X76?nf_hO|D3D|%g zq4XZtQNa80gFZ;URF zq&K-H*P(YumlgCL*JLJrJi0uJKH-{Nm%bQX9!*c$E}_Zw=((8KkH^sST$Ah5%cILm zdWCB;i{2Pr9!qa>O>RK%jxLSfZ%aiGIuF1{m z>D&8$c?vzlHMs@7IJ&H%m$)W#>Gjd&sq_ZdRf;jxOuyJ+8@o`e<}{ zHhs)BxjlV8x;%%z;F{clp1EV3A3T?y<(k})UL0N4(@R{F1@zkJ@;rK-YjP)gdvtj| zy~8!RGkq|+ynsIBn%spx9bGoiXIzto^z?!_KX@TM!!@}py)e4Gh+gEH+>KrxU0zJD zaZT<{Z;dV+>20pbB6@#xc?o^MHMs|UGP?W|eabbtCp~$mIA3@vJ;gP-7d#O_tKzqswdP9j?g(>4VYbwe%s^dg?B|U$)ZIT$5$={OIy}dVy>55PD^Fc>}%5HF+q#Il8=&-r|}(jNThv zw$b}sljZdB=<+7|glqC}`eJl>Gd-y=p~)lY*{J8AyoH|Qnmm$T8eO*2%UqKc^!n)X zR(gYL@+f*|ba@-S%Qbm4eK@+joj&54Jcd3SU3SptT$7db^j&?wyn~+Mnmm?X7+u~; zFLF&9y*j$Qi(ccJJdWNPU3SvjT$5Gw{^;^<`haWlc=~j7c@KTYHF*L(eYe<;_tG<5 zlPA&(qsuOOk!!M=UL9TDN3U^Bo2>FX1cOrAzBk1ijgSGXomr#D8IJ@h8mWG%frx_p@4&-p1DWt$EWC7uF3Q1rP1Zn^fK4v1@y+~ zvY+1MnrxtVN0-mgdt8$j(nq7qXX#_E$&2Xo(dBdW1=r-o^vpeDKMv5dT$7FT(&+Me zdYNnT5_)}f`2xMcHTfrcXLR`@y~{OuDSbG)9Hfu9CY$K<(dA3@1=r+d^z6NSzx*>j z$2EC5y)?S~3%$%Wc?G>Ox*Vc6xh9+G-O=S=={>H=E9v9W<=^NNuF0$D$;G};{+*uU zn!K8x8(j|5^IVfH^vdY+AM`5M=<=WR7T4sp^xo+5U-UlL>Y)m}g@IUk%*W?ZK(&+NP^fK4vjr98Ha+KcSnrx$YMwkDicey5S zq7O%xFVja{lQ+|6qsv$5bFRr-=;{0TemO?Za80(;i=)d|=_RhoTj{mY{ql2qmTU4cdTDg|1-;BQ`8d5Xy8M#f|6@>%+Lboo7f!ZrCEJ-O8P$$5H;YjS{|8(scD&vQ*aPp^zFf23ErCSRa8 zN0&d*TU?Vb(tD%J1$v)ra*#eAUH(j;a815MUyLq)p(h=f(Bz-#*_b&0_$xifHTf5M zX>_?rFLO-}(d(nj-{=jl$-mM&qs!mvU9QQ$(TAhUKj}M_iNtrq4!~ z%h2aslmDToAME?(vh)ns%T)T5YjTX9To&&ST#=sQntYX>8(pqM&vQ+_MlX*pSEg6ECSRvFMwe;y zCfDRRy*s*Gh2GP~R`trl+|k z->2tCm+R0AT$3NrE2GOydX;N(iryMsu1jxoO@2u4k1p4v54a{jqEAMb>(i%PlONNQ z4~z4KS@aaw1Izo&ObmwEIq*W^5XG`ie|KIWSIfj%EyZcATqP5wyFJi_0_?RU+MGFWdVJ`HMvO7JTms4|;=Za%p;Jbh#(J%Qd+SeK@+@i$3C-T$Vl` zT^7?9T$3sE%%fsI?oH2fO}@bYk1dTZ_o0`$CYR&-`si|BdV_0nd3twrSwin|O|C#6 zk1qG4Pq-#i>5I|j{`91y6PjF+o{fq3FCIY8aZRp7FO4os>1D3TmFe}-<$?4D*JK*K zGrBy8-sPHHg+3fz9!wu`O|D9xk1osT3$Dr4=$XgF{l`P-S+2=+dTDfdD80-zxjMZu zx;%{DxhB`5 zmq(Ws^a|JH+Vtk=@+f+XYjPcWZ*+Myz0Wn7Ngt0ckD*VvCfB7eMwgZJq+=7BT#ufO ziSvWU(sNvs>(fi4OQV;$CI|KZ$D_;R=uNK4EUxd4F01H0uE`DPqtWH@^fA}uhV=R9 z@&x*VYjPucw#9xtk)Gq4%%+z{m(}z#*W||Z`snf`dV_0n6MAQKc{07rHMuE$IJ!KA zKH{3pq0dK`HS`77EMExhA)u*GHG9(;Hlqx%BSnvX*+JD$(K04smJ?%c^*B@HMu?4=SP?4(+gaa zJJ2hm%M0jLuE{_1=eI_e4fHnGW& zo*4V_GJ2Y8vWT7^U0zNva82$(uZ}LSpx3x2|DyXJT{hF(T$6ipeSdU$C4Im(xfgvh zy1a@$<(e#}Cs+G^c{M%7HMuuEKe}w87q}+(p;tzi*U+n6ll#(}qswdQEw0HDdT(@j z9lg&rxgUKzx@@ISxF+|fFGiQw)00k0Xz~DhHYT1AcmqAhHCak8jV^Dbm$@bnq&G&F zZS*GB7&tQ2Yt*nc?5kvy1awF;F>&=o_R{_$2;j+ zuE`2|addeXy~H(n6umaO?4;MZCXc4KN0)cgJ6w~;&F%Px9`YjTM9XJK@CAHB#mXC@5Wlk^$aUuT|P}Oa7~^?uZ%AH z=~b@DI(ln#`3$|yHF-9@Ke~LDKH!=>hdvoyK1ZK&O`c0nuJ!$LfS%%-tf%Kjm(SDl zT$AU~%cIK|=oPNX^XZMz<%{$t*W?BC?&xxm-s75VppQqFFVQDllNZt#qsu?jlg>zJ z@*;XRCY}%Y7kZ9s@?v^7p=(wkh9m(Y8o%fHe4T$6vIPezx2r%$;i zFQq4+8TTKD=_#(sCVFmk`44)YYw|LBWpw#ZdX;PPa(ZiY`7e5#Yw`+ue{?xQA8<`J z(j4ns%Rj$da>CMsQ|L85Q z$rgHVbony9&oy}seLT8+g+Ae$yq3NgU5?R{>Jpl~j-HK)^MkL_b6k_H^z!KPHF||> z@_Kq>bon~H$u)Tcy*s)br}wxfZ={b#mv7L=T$63|#pv=)deYemP2NP$MeUbw(eqrB zH`6Pl%L#gwYw{L)b9DJOy~Q=zPVbE_-=X)pCU2#WN0;x?CtQ=a(HEo3NqW*b2~FNk z&&I_4$M@(tuE`F1X>|EMz05Uv2faSJ{D9uzn!Jp8C`x#?{ZDvM<0$Z zKckPhChw=uN0&471=r*Q^z8b$|M)pQ$2HkaFO4q0pqIHOAEY-%mtWGGT$BGt?~N{J z>3y!rhv?(c!wI8+wjw@)3G@bU8<_a7{i+Z;md% zrMI{yd+EK=<#+Tx*W_dL@#yk<`h;upar$C(IZsbIKcUGd=-HUqk3Z0JT$6qD(&+L> zdYNnTNqT*B`4hdtHTe|1JGxw;_qZmXrjJIKKhwutll}Dh=<*l(f@|^_diDjeAAhCi zxF(;amqwS1^fK4vbM(gO@;7>uYjS|z9bNuT?{Q5&Palsi|DaE}CSRZ@H~2o8RL%3( zHTfbvH@aMcp68kzq?bpROVTS`lP}R5qsyh}O|Hp5)4QX~WO|Ql@-Ou9=yGZLgllq$ zo_t~K$7Sd#uF1dBbEC^;>3OcnztJnB%M^N*Yx3{(*64CMdYfx9nFP5y&E z8(pqIpL0$Alb(K&@0Y3c4AwxF-KgpN%e8q0hM{N9pMo$9`Oup5dDOAH6ubT#a7hntYjF8(pT;>s*ts(A%TS z)#)9s$uat1bh!q7$Tj&YeKxvWlRoE~e2t#j==)^`JRKf2t2KH!?1q)$ed8`7s-lkd@!|K$7RM)VZdD;# znw+K=N0*z^OI(wm(CeeiE$9ud$xrE>(Pb{Z%Qg8KeKfk=moCHMS5j)xhK8KHTfI8IlA17 z-r}14o!%Q=7SsD&lYh|1qszVN6Rydm4LCp10PeLrRl@bwayfc!ba^nn&NaC_y*;`tqj$I_SD+6@mxs`YT$8Ev>FDxM`iyIG zMSAL0alY^{dYWr;C3=2zSxzr-O|DF@j4ltSSGgwB=*`jP5%d<<T$I#1MlWWlHqsvNqgKKh4 zdS`TbEWOJ$nL!_pE{#6onp}%M8(khppL0#FO;2y}{j!Rl;hJ2BUKm{-PcL#!X3}e; z%M<8zuE}-jozdlq^e)%rdi2rgvYI~Tnp~egA6=eAUvN!k(X+3K`;RBnb6k@f&`YDs zQ|M)`$qniC(Pa(2!8N%Ny)(KzmEPr=%%%@Vm#5K3T$3BqXQRv0>2t2hP3Y;@#{I`y zdWLIqQ+jc9c?P}2HJL-NjV{lm*SRJ)qqj$wXVE)clbh3rqsuz_h--2S`fPN0Hhs=D znM+Td1Z&!e}wCiCe1(dGH{0oUX< z^vUS*0{WC|a$9<8tM8W$^fcGxcJ%z{@9@ zMwgBBA=l)N^x5e068fBLvVfj>z3-QQqG!1#ccK?ZmzUB@T$4M~>!ZsidV_0n7kX!O zc^SRSHCad>jV>>zkGUpyr7uR8SJ0DgNN935dM+k@e!*sXo@;Vet$8#yoR21V?vXAaeX!>KL7DrdX8(d zm|h-TUPrHRP3}!^j4oU0O|Hp(=-tuf_4FRs3!}?UdXa1L2zqsNc{jbrHF+exHM+cq-sYODpbtiu_tJ-4 zlSk2KqsuP(oNMxEdipKCU*1R0a7`XVFN`klrx&>Dicge&G;3$2EBoy)?S~E4|D$c`>~{y8Iix!8O@P?~X42 zPVaF|UP2#_E{Ew8uE{^q7o*F6(39>+X!25eE++0j{*#{Pnrxz%N0nn_l6XyoKHzUA{waaZR?<`=iTu=>x9GTj`V0O^y=vH1A2{X@(y}?bU8)ua82GxAB-+Pqz}0!@1jpf zmmkq*T$7#j)O%t-eoRkuP2NqPl$xVR|+u_TwBq$2Iu~y)?S~ zmR{zXe3V`vU4BPza835oyQ9nR={>H=$LQnH4Id9KN4>E+SoZ}bY+Fm!xO8CI{)o(dAO~64&HQ^xEh$nO^6b{4>2hx?Gyx;hOvl zeK@*YhCbq&9HP%gm&?-UT$986e4pO!`(+9}!!`L=t}l!(m!lWCCjUmSjxLv{*SIGC zPH&AaSD?4KCWq<$(Pb)qz%}^~`ebyuB7Mp=`A>TCgK@raC3=c$@?Z4)=yGLxfopPv zUKw4c(W_jO|E4!bm#ffQT$BHy_ePhi()(PK|D}&dm#fhyT$7{p#pp7fp7ehSP5zIb zjfu}ET%DfdntYjF8eOhIFLO=4La&c5*Q7VNCdcTV(Paj`%Qg8beK@*Yi$3C-e2qRE zU9L@^b4|WZPk$)R7p_Cka7~WW3!}?SdXa1L4SIESxh}oNHTfpJHM(4n-sYNoi{2ky zu1_CuO-|4!qsuJ%lxy;BdU8*kFWi8h;+lMio*P|mNY8UkzDqBUE;piAxF#p*&Cz8x zy~Q>89=$iZ+?d|yntY!=9$juipKwinKwpe5H>D>%oY3SHJsT6}3v=i>uE`JSrP1YP z^fK4vNA&vWa&vlvYw}}yC+g3aThO~)lhgF!=rWf+;+p(~J{w(bNuP5~eo9Y&B+eIZ zMbB_eenu~hF1Mx^xh7}mwb5lBz0NiHIlVKw+=kxen*4%399?cpA8}27NuP}_x1-Ow zCTHpCkH&t?r)Rh(zoHjLm)p~eT$5kZtE0;u=ryj%Z|JSj<&N|=*W?_%Ke{ZS54a}3 zrB6neJJF|Hli$&kdwsv$nV#aB{GOg0UG759b4||E%cILedWCE92YPdKxhuWJHTfgG zH@e)7-shV9i9Q)!?oOX_O)k)rAB+81L{D)|{!Gt}F8844xh8+1mq(X-(kon(ztS6{ z%f0ALuE|AucXU}y?{Q83MjwqX_ok1zCV!{TN0!Zv4=nbyPCFz~f<^J?8*W^<4;pp-J`iN^XnLZy~meLnolS|XHpNRc< zAU(%5xeUEDx;%(p=9*lVULRc^OmA>arqDa1%QAYGYjQdIaCCVHeZ)1nJbga8Je0oR znp}aN-52}uFnW$_GL>G6`h1k-^fK4viuC&E@^E^CYjP!eXLNZ4y~{PZGJQC@Jd!@* znoOh5Mwb=zIoISW^zO)qgxu12qoE{~ztxhB);?a^f=y~8!R zI(;y@JeEG>np}fE9bFoI#x=PnJ@qNyFOQ?Axh6B{`O#$+y}&iO7QHgMJf2?Vnp~US z99^D3Z*fhoL+_0)Po(#`CNt^d(PcG#!Zo=reKEQ`iJtUyLX+#!voZ1f#*^teuF3W3 zrP1Xn^fK3E7QH^Ytf4o!CO4pWMwh43yIhkS(ubqV)953v$&Ki<(dFs%IoD)1J-t89 z7uM18a1e`NDJPX|BmF==ss*x%2|pWG=ljx~!*HxhA)yw?>!e(c4^;ThRxj%k$|& zuF0+G)2Q!Zu7=?$*QB6??Z*+TDfP3}P-jxMjEkGLlHq|Zl}*U}eUlY7xK zpZERpI(n9CvY1{RUAEFoT$6j#Yop8S>2*W|wR!RYcv`jBg~ggzZz zw$W!?ll#$AUx@RCH__8vll#;2qsyD=1+K{h=#|msE%YkaWGTHlx@@PnxF!#z_ePhu z()(PK2hk^^%iHKvuE~Sx$uIhTc{@GDHCaZ_jV?Rrd9KMr=;f&MC-0zFxF!#!H%6Ct z(wkh9hta#E%e&}3uE}!xXmr_0A9GC}PG5{J@1`dWCNy~jJsT7654?w-R?^d7^1okp z(=%L?$I=U<%LnO2u1TX;M^8wv(bp#>nLLi(8eKj_Z*xulKTCHUANOGYar_Vj6+v(a z4n9wxOR{GrNatXcJHF++*GrD|;o^wr}M_(LW{)XP~nmnJrJi2_CKJ1#z z(kG+K0s53{@&bDG6Mp~XBlMJO@^y1CG@fA@(=WqYw}Y1jDlake3V}4nrx@fjxGo3b*{$LKAt$;;^r zqsu?iyIhl3(3eD)f1(e#CKu3GM3+PK5!d9E^i|R2pXrGwr!{#MeI`zS{o~{G8rS62 z^v3A&33`)jvV*=Lx-8H;T$9((7e$v(()(PK-=QyyE}x zPkEQi=tzP1YcfY)8eJCYgRaRR&{sy6 z&(TL+lh@J9p7!gP&(q6Ylh@N{N0%?q>s*ry>GPt?<@6TUBse1ksan*0&H`We4}@=bcmHQ7UNh%QIy z8Q0|P^tR~oEqc3a@(y}$bon+t@0$EEeOYw*4!!7_?4^%Kmn-QLuF0R!tNs#SANVdk z>6*NgULRe)M^C#Ze@btQF5joOyC(DW-sp0ao_9^&MIVYTKcE*}lXug{qRYS1ORmX# z=vB|g_2Y;1q-$~!y*|1eqo-Yy_tINYuOIRwde$}hGkSM)`7yo6HTiS;(&+LN`k-sF zkG?XxEYU|@llReQ6#e7NPwADe$zRZCN0*<`>s*t+q|b{k|3+_dO)jP{MBP6*PVaI} z{))ady8JtR&^7sg^p(-&=k!t6y=(zC9~ zXZZVRcXas=dXH=J0d7AOUH+3^a7{i)ACE34=@YKWCG_g&{rcs<=qcCaL-fYz^566( z*W_>Lozdlg=sDNq!}KN54wAKhal2mu2)3*W?hr>_xvmxhB2b zHTh@y?C5eWdYx(B>WlTXrDM3?K*M_iLn z(N{&6>(LW0O>6RL`b^Z$mzDHU*JP1i_HsP_xFNmVHTfKUR&==$z1B7PJbhktxiP)PHTeR4VRTtV?{ZBp zr!R>vH=z%>CSRnlh%Ps!kGLjZqL&TF_2Xvra@XX`^jXnml3weY9H!5WE;pw)yCz?u zcSe_6&~vWISLutR%Pr~suF2Qv%cIL``mk$q1${EQ+=@QsntYvJ{fgf|xivlIntX%a z7+r2dZ*on(Nna3Mrsy56$r1XZ=yF?npKJ0h`ts;95cKcu%tm$T?u*W?(zH@e)7o_9@tL?4PScc&Lz zlONN^qRTz#CD-I9^r{tc{a8y+x+Y8XhUjundd4;RDSbh7xfi{|HTfBRQFOUCz0WoI z7k++N7G2J!7hRKo`lKuIfq{Enw+A~iY^bO*SaRZ zqR)*k52H7`Ccmb4MwboroNMwM`r_#FaC*OMaut1fba@1Q*fsfI`l{&iNP1#qT9e<> zXX5ntU(C>JT$BH!H%6C7(VJY8iS2p*N0&#_J6w~i(HBLR$I$y+ldIF0MVF2AqHA&u z`gnACEPcW?Sw^pV%dcM^M^CyY*QD1+m&eo7uF19Ntl-$U7kTtyCyfHw?>!q z=vmj~#`Ny!@=SVBlyUCyVc zU6VoZcN>oRLSiY{B}1=r-3^s(sjTzbhhSxukuZd^Z}N3V2E zZbhFRU7k;`b4_kdZ;dXq^sH-g8+vzic>%r0HJPF>jV>>w54t9|rLT-GFQSjSCby%{ zcrUIW+vt_9$?fU0qsxowb*{;o^m)`iN_CfBLHE@_KsWuhW`5fIbtazyIPwdW~!HKzd_z zc>}%4HCa#Zj4p4a=UkHq(HBRTH_`iDlLyn6N0(jnVb|m#^vUS*X8M$CGEJ}k(63+K zLQlCS=g=FX%UkIg*W{t}1<_?Uy~8zm7=3Ycc^kdoHQ7L45ncX}KH{1@oW3f${1H7d zHm%7c=reKp@y8x|jcf8q`rPR9c6zgGGDGi-F7Ke{T$4x97e|*rruVxhkESn=E_><2 zuE}HQlhNf*=u@uAM*7T;;`;GUdW~!HSbAf0`BQq6Yw|eyg6J|&?{G~XPhS*W-bL?o zO*YY&MVEKei>}EN=;P7lJ@g6Jrg3%xtKe1P8Lnw(D`iY_0d7hIEP)5oLBCG-i`=JPyPDkL-eF; zvXx#RUH*oic1@m3Z;LJ;rnkE$&!hK7mjm>?Yw~>hP;~hSz2KV6(#N99-_lF2$qVQ+ zKJ)9BzoS>WCNHGVjxLwd>s*r;(dR{%zo)mjCfn%U(d8fLJ+8@%=|j=wqx6Dn@)G)3 zbU8>bxh5~A&-hzhKR!mUbWOI?XGfQRq}RD7FQd7%a6E9qt9@%+ap=;f}-tLU?%%L2X5HF-6?HM)F~o^?%j(0ilH zr|5atXd>+pqe1Tr+n!JuaJGxv> zuX9aaPoEcEzDRFzO)jJ_j4ofIcey5Spf8CoU#1VZCU2y#h%SfeBd*Dt=&Pd3SLlf^ zrZw3`pNZ2yKj5qM8rS5_^v3A&HF}e4@)mk$bh(0_b4}h#UlLuuP9JbhcGFixmv7KV zT$8ua%O>Lak8je;U6Vhg&x$Tb=(VoNAJOMUmv7NqT$4TYh0*2P^e)%r?ewM5I%lGJYuF0R!=S7$A(_37VchVO|m!tG9 z*W^#>OQOpU=mW0FJbh(!`B(a=Yw|97*+1g(#}Db{uF1RUv!cr}daY~n9{Swq@*{e) zYjP32GrIhko^ws!OJ5vaenRheP5z9&Ji08=hh39Dr%y(gpVFsXlYR8+fBOBCpV3pU z$@}Py(dFOhO|Hpb&=*9PC2+a&*??i6-jCy*|49lAd-=_S0LV%YV?buF3o9-O=Sg={>H=2k1+q%Srm6Yw|(* zSakU>ddW4pgg)b6e*N;_^h(#{L-g6v<$vgPuF2of=S7!O^cL6T!}NvG_w zNp$%&eZV#O2z^C#`3-%Z|laJDuN0+P7hh39{^vURQb^4TR@-h0%|HSp<8uS|1 zvVLwe3NS)?zHE;pk0yC$Eb zFOM!arVqO&pQleomsRvB*W?TI>aYF!0<^CSRiW zMwdx?-Zl9$eJHxzoL+EE4%5e@%Pr^=uE|&ERp0pa%Pr|i*W|18`slKno_0;XMsJNS zx1wiVlPl=G(dE|kyle7x`m*S98+y?-`38MFx=hh0T$69ot5(JJ6(0x-Vj~Z&@-;d_vvlX<<9hW*W@U@H@e(~o_9@tKp%=Occm9xlYga;MVGVaCD-JK z^cmm!^~>Gpm9EJ#`t0a(cY2*`@*{d{bh!sT>ze$S-W^@m(tBK!pU{^^mwVC&U6UpH z%II=0`lxI2Q+nC|{QBkI^m5naXY^UoBFwcf6*tS%R}f>uE~GXt5=Kb$22|Vn*0yF zA-bGH&$uS1=xx#Eq4ajw#^t5a8TY77BnW1N0lmDZ4N0&#@dt8%=nS6ajmq*hFU6ZTPS4Nk| z&_`X9tJBNY@avb2^m5na8uVGw<+1cy*JK%eZghDZz1cOnCcQJdJf5C&O|C^>99=fi z`(2Z3)0an=C(wsoljZcu=<-DRlxuPw`ph!FfAS=HjcamUdSi4sm)_)>T#vpWx;&ZQ z;hLO5Uld)QLho};u1{YUU7kuWx+W{=gkH8*JiqWPdbw+I zQ~IpvvV~sjn%s;&H@cipZ+1;4=?kOFv*}%~$<66YqRVsW1Fp#}=qsYjR{Dr*a!dNE z=<-~8V(n>7R?}zV^v}0=9=*mjxfOkGba_6#*)_Q}y)(MZ(sQoKZRks)%M0iOuE`XA zMRa)~eZ)1nEqzsVc@aHPKCQ{^=reKp`mv2(HV(B9qG%X%Xa#(YjP+0WOR8MeabaiL!Y@$Tt8k;uW?Q8OmB=Xub?-%CU>DP zh%Oh-qJ| z@6l7P$$jVz(dGB)8Q0{#^tR|SM{jpc?nm#9E`LDJyC&=CL(%1R^nz=0fBJZIc|Co? zHF*HNdPZD7E~KYilLyipqstrUO|Hp$`hw{4MtX;9@*w)+=<+6dziaYf`tsdRe7kzg$EwcTJu| zpA}u+ORsfJ&ZWgPS3d}PoXc4F8k>HuE|sB%cINt=)!}@gWeWh{)*o2nw&@PjXo_sulf9h$usFg z(dDn{1=pm}$D+%AddW3;7JbG>e*N-(dZlZ!g+4pFe1Kl(nw(Fc7hOI`Z*fhYO0ljqXQHjd{PK1?rnO`b=e6pi!T32FS;f#qmM_If1*#g zCNHN~ZQ|E2hv-Syv}KO@5y~6kRT-7hID$`dD=NBE96A`~kfx8IM1{L{GXVucOyTmoL-P zuF31^ZPDd0z1=mrklq_zzCzEtCU2k*MVGJA3$DrMdHlzt%h%`=uE`s@ebwf1{kVdj zbWPqwua7QYr>9+$FL3_0=<*GEyKAyb*B@QJNzc0`Z>BGcE=TA^*W@kq@#yj``h;up zR(jPIasBulhNhJ^eNY5o?cz;_fLL8Pq`-VqBlgBC3?m+c{jZ+ zy8M*h?wY)Z-Wy$hM$fw@7tx2J%fHbJuE~4pW6|X}z2utw8GXi9e*N7pA(VJY8zosvUF8@vMa835p7e|->q4&Ec@24-1 zE~n_juE_`JlhNf@^eNZmgY@cc;`xPN(^Ia=CG^JV@*8@SYw{ubg6MJ;y~8#68~Wnt z^1t+c*W|!ZuH z>1o&GWAwJ@vYg)Tn*1ZZH@aMho_9_Di9Qrvu1hbtCWq+b(dByd3D@MG>DAlCze!vy*s+xgx=$te3m{GU2aM*xF(DA zvFLI$ddW5U9KC90Tt6o1N!R4_^!n&>b9&k}`2xK)y4-@Ebxkg(cSo07(tBK!FVdGr zm(}z^*W^p|mC@x^^ikL3%k&vL`1Q-J>6Na@VS0UZxeYz-ntX-c8eOL7S=Z#N^xo)l zTYBC#`5JvFy4;Rla80hDk42Z;(@U<&*XdO|#^aAO=}Fh*8}$0K`*%`KcLU3iRTa2(koq) zf2GfkF88F@xh6lP&x*!h6hj$Y%MOzgn#XVK;H z^k&!OYV^+NvWcE^O|DK~99^D3?{`hEL0=wSo=6{dO_tFoqsx=%Q?AK1>D9aY^~<^R zlxuP=dSi5XGQG()xt!nsJEO}}=sDNq+T4C|ba^Vh-!)lIUmjgH(}!J?>(Ez4m#5Ja zdrWI`UHVL%{{00{r`Nb9*Q3vkF3+GhyC!GQ7e<%!=v}VK_32BZ%QNW%uE`4eis;hl zBd*B}=w-Ejeex`NxofhLJ}bIxq1U=5H>A&tF6Yx*T$3Bo7e<$7)4N=g8`GCWm*>z2 zT$5Gw713oYeZ)1n34K*`c`iM%=d>m_rO!e={_;F}t!r{K`n>4!e0qy(GD+`_F0=F= z*W~8(rP1XD^g-9;7W9?T<%RT7*W{M;vc2N*$BXFYuE}cp?C7$MUgw(JiryMsUQExr zCby>dMwge+^RCHl=tI%vrSyVpGDRPYF5BrP*W|YJs=fXCJ>#0(ncfy%UPEtpP3}VPjV`}K&$}jfr4L1y*U}5F$yxNV=(3Yua!u|=pRtc$ zzx*z}(lxm|eRg#DJ$jvMau52v=<@sY7T07gy*s+h(R*Bzd(wxZ%OB7SuF1XVW6|Yx z^pb0GZ~BaVdZlY}Hhp$8;V_t@NyGvYy@>U3Sy+ zuE~Sw%c9HM=tbA$!SwOy@`v;Z*W@Aes=9doZsZqRXGt`&^Sv^kvayAHC?BJb^wQ zUEW8Za7~^_uR1WEU-%1p(lvP!y*|49B|Yt$oJ((wE*I0YuE~?>-O=T*=sm8h zPfH)voK2WKmA*2%{55^lHQ7urtB>aw_S4HS=VHi-W^>I(tBK!7tohRmygj0U6U8mS4NkA zq>s8LFQS(n63;LE6TRFu*+!ogT@KM}U6U8n=SG)*rZ>ALFQIovmygqPuE|U3i=)dY z=>4wAcKV9wvOphkO6VD%fmY#G?cF^mi%OXAPn!JYI8eKj| z&$=eRL+_0)pQq}E|`ebyuoId56{4TxvP``fpB0c4r{2sj_x_pVA zaZP@oz971Mncm@=%+VJ`m&5cv*W?fA%cILz=)*$lw<*W25*W~r|>cist@iltN zHMx-95M8dIXIzsv(A%QR*Xix9$s6gt(d8TTyle6%`cQQFCcWUA?4plFmm~C&Yw~9L zj0V4c`4+v>HF*oYKDvCHo_0;%N^gxW-=Sw+lil>*=yD}J@0z@gJ``QPOE0)4e@GvX zF5jb1xF&x@uRc5;e|(>wa!vNo8=}imdd4+*JAFZP`2oGdHF*bpQFQrNdY^0Z$Mj{< z<%jg5YqFO<9$k*nCtQ<1p;sNT*7WO({D_`(P2Ndwh%P^-XIzs%rME?wpU~S~lX-e? zbXlV3U6XgwhoZ|*=>^y1-Sn~O@-uqLHF*!c>d3f${2M*#np{M$k1ogQY1ibv^tR~o z@AP)pSgYjQEYH@cjp=UtP(qA!as|3xplCjXB<9$o&MKH-}DHNEPnc>M7{ z^rUODpI#qbPSMk@$@}T8(dAe4tZVWCdUtgBHND3*`5^si?6@{@>O7P4fAvxGQG) zI{QPYeYqz41=r+1H%(N$60>}R{YlimT#NlF*W`cLU#D^UxXCx!pNZO+YqMYDn*4_S z{bQCR?9bD2_GLNyEw0H^=$FMT-(v1Y?aOu8?{Q6@O202=`8M+qYG1C)e!(@lO7}Nr z`40QzsC~H}`xCCoZ`oh%*y-aYSF&G?+LtrfPq`*n-z-tFXUy_l_8U?Aa((ujT$Agv zKR;&q9{USX`?7-lF4yD?_V0>WzR&&;YF}=^e!(@lKKrl4EJxX&MD5E;_NQEv73{Bb z-1KpiAFw|YwJ$ehzs5CL$^QN^%fGTe54A5hV!y>Txgq@P>{%PRJVU6Wg||3S?1BlgRV_kFnu`{l05E!p2ZX8AGu^{Dg9P1#SoCac*$ zA!hjr`wLL}ax?ZjT$5X|e{;;T#QtK`zD%;;@0#42{l{XKpR&IawJ$ekf7CU(4f|il zEI(tvs>%1|7VIZolPUIhj#>VV{YKRJ<(BL>xhBt`&yQJ-GcQE#%WC$!T$4L-{<~t9 ze`kLPwJ*0~zu=nOh5c7zmY=gfiQ1Q2vp?mU+=KmfPMAJ!@(cE7q4woA?AN*`_hNre z%yNSLR@A;sv7dEK?#=!+G0QL6??vs)ZQ0MeCXIf7%<>=1%TfDsJNAcNlV{OCh*|!V zx$H#Wm)o;n?wUM+>)AYJImv!K>ilvh`)SwY!R((9v-}tP3sC!V2lhK$lNt7Jj#>Vj z{UxYqT$5+Ae^<;hu@mnDq4s4h`-84YWB<9B*JKO(d&Vr+V80Qk?=SAnev@l*KKt`ymSyaBqW0x%_H(Yuv)R8rX1ON& zOHliAANB`aljpGiWXy6c_E)0z<-Y8Xx+c$M|I3)=+U(Cb#rNfY>{q%b&u4$zm}NQp z4XE?WI`%WJ$qU#&EoQk6`<*y_e{p~IbFRq?*}pwzxi0%lQTy@$_6J>)7qS0b%yK>U z$5H$8K=vnGlWpv;cIxzTlQY<#iQ1R-?AN#^FJXWGnC1HH&qeLagV=9&OV%fvXcE(sC}7cKhZp`$xik+j9G5T z{w&nKoWp*tYcj|FoS5ZC?6;!!<)Q3nU6VJke@)DCWA+!J_T^#h_qis!*ncEuS;hVe z)V^$Bf5bI;8~dNeEH`0)#%aDU4`;v9HF*)QAKS((H)X#8b$)pS`x)2d9i0EPnB`{d zccS*?k?iMOlRswv_Lyao{UxY@P&^%SQIQT$2y6e^<VTTa%=X-QTy^Z_9tAE53|488Pms2Zo~de)V@5P{TkQgBkb=VvrMr+ z54A6w*l%%7E@l6+nB}(Y_oDXY3GC-xlh3e!f6Q___Lrgd<%#SUU6aqU|5nU$d-f+$ z`|>3Ar(BcIvA@o|>EkA6vOf#8FXysf>zaI?{W&qq9oV0T+LtG@-{P8loBhjTmOHZF zjoO!|u;1gFyq2$*`(l8Ag zXZgN7oBc}HWFpDyZOn3S_8U;=m*=pbaZRqt{%JAG+3YVs?aNm7J6x0Nuzz#Rav%1W zp!Vgt><_pmujBqc8MEA%{V~+OJdgd7YjS%tas%DpnC1TLccS*?1?=ZslN+;td(83x_Lt!F{lyE}A8<`pvHxVu@<8^- zaQgn@MeLVclbf*rRm`%U{p$I?FWcBpxh6Mdf6tiZLF~^(onKzeezR+GGxjftSsu*( zLe##zg#9kp^GwJ<<;yrxh5}Te}2p|!~R0lzU*MX%Qblw`*+1Gk79o*YF}Q%{-A5}YWAOtSsu;) z7;0aBhy9XkvSD*RzcI^W*spH&eR(bWDc59%{XJurjqJ}wonLmc-|U(^YAZg!G0S7w zPw<}u>h)6K)`l58kmD_Q5cc2$iA2Q!{tSo13H(3i%GDBypJFZEgH5;?+wmdn!QbEj z-iyQdFizmFa0(CM<5aHh)?k`BjdQRW&&Kw!E9?sg!{M+LCf4xVCBxb<6SjmMVNci} z7Q&Hm0uSRl%F7ao226!@VH37;JR9c1d^ix6@L=xuC=Tjzh~wq_&m*rshx3MYVH0L` z-Y^&D!-23Ej)qfVCEwn3``s4$6D;c-LM0B4pj_CFXA4|1>7C`qmSSbT=xWKu)N$&g>_+5m<@Ab9(DVHuo#Yp zmFpxD3-~+K6!Vd*aX*-^W=`TaTt^dL!CZ%H)7$YX=4Q+=_u%Es9k>qj0A9(Q$IY0B z@e<}itYn_ROPNRTQ0B^Y6N!tNrDL%9_(Q5 zz*gow>g#zREQV8fA-A8vE3kwY<0xK+$@LP6i?9+GU^!lj32etYY{Oc-5^L}hOyT9& zg4NiJTVfiI;d;7oE9M+-j#=E8;{$QLAGhFmPaGe_%eemGuoUu>>GbhrSQ}>WSoT}O zj<6@}4-4T)I1!ew@3&9k({s3=VN;k5b74Ll2uJZ3Tz?6#n5_1N1yIjoKnEPVxLhTn~?vFkib1{0N($8Oto?_-HT#-f&RkTFU z;Pl6fIU92yKFIZT;njS+DSUKIo}aj!<0ZTuM{xyx1iP4ramx$2|ESv+@GzeL{iyRK zH{|Px;|V;MxgB-hEMCX)7Sws0@dwxx$1}JU=S`z-Ux$3}sYs#D(}Vi^WC!YTE}_ml zifO*jkD$&wj1N_FeK?2X1>A=74x(;9fckvpQRgY&i0A*7+;8UZGPf}6yv;bk_xC2$ zc{BJLJsrpEa9hq>i@JRcHgLU_sPp9Tg-sF_eYhM8cpsmaA|A)r%V;~>=4~xtt+?kI%id*6cZjHmZ85VIzEZ|q%k3mc^*HtAFyJ9VFjy1Ry zrf^eC;!LbW-L4$BW$r?LHmJzq7TAH?U_0t|S=<3za22;}#_gC#a2FiLBo?t63#jWH z#GP;eb-RAto;kHiBJsNf*Mq;sN?eFj^xb%zYnYGc@l0bQw&Ty~J@{)Jz+d7p_TdEH ziItnWwP91(9`=L-nAh#`ZrvX5((N}(B<{yrRByt5Y{wfe79@llSC z;C6>{zObAh0QG&6-$@cDU|raRCo*TlT$m3B!eTfYPKA}c=HQVJXx%)9L#k)`pp|CF}@$!v1gsALMy3g#(z_n&%VGgCu@7hvyUC zjP1CTp2go`3;q@}_y~63sXSi&xb}9u&V>1}2X8Cm`H#2rI#s~a*dM{uaRSf4@@?EY z+<@1;6jopw=h2(Pc0BD+zW&3$a4;MWOJO4A`?a_(=S$)`SchkF-llK_yVvIH18>D5 z-hu_Z83(Zo2k<8B#~ZN^Z@@gR*nzJ%T*%yoPx01D4zFj%+UT3ID-<9e#=JnBn!P2am)7JOYRDaGb#6I-GaAMB*HNKFH#|JMp;TBFx}D zSci9G4e~3@TFI~jEBSo)U=#L-1w4UyB%BD#xA)`xe^Mo0SeyHc&m;dIWr^po1Nm9L zq8*>bEdB*s@EL5zW!QvIV+Q#hpdyV=VI4k+Ddcy7iahE%2Et;Pn3+iI$M3UK%#}P2 zqqqThErkX4!&0t^521)z8(KvkZJih@ze5egQw-+NKQK#mhZ^-qxJdvL|$tu zrZ_&2$72GY--z$K*vau>+?(sl#C{r0k0XAEUW?c2=L4LJm3St-3w8b+&S&nx`|0iY z0A}$%Y(jpQtLVYA_58q-un>;msmv2$`A$Cbw~XoIyr(#AQ*=rud@e@nz%iRWQ0>Uajv zs^|HDS21^B3v*9cz*qUY?Z;QJh(F?WYBbF3!uuQh@%0_H<9u%4hu`Dlbm1mzaDDh) z=6>wNQCyGfZ{F2E-%a@P7F-X$glYU2&(k{8Uah=}`++agQ#izVlK3aA#6My=K86V# z#6G-Y8y+vb3VUz?cHw-?;nmoIPq5#Dk7GaT{g@HFj*mZzdf#IztenNq&CE4nI&2Qx z!>(`;_5M^Je$Drn%H90ywH%jk%k`qZUZ?0^ay=8s_q>V{u6_|8A9ec?oWt!4sPiPb zovx!6^}b3bYzaH?JbDl6`%QmX2uH$+uzYvlONDh|Q<%dwc^+i347*U@Z~DSPJfC?u zEQNaWL+{Td!`d(twuBwHA@`#n%lP{2(aiHlZ?5R~hAC!#mZ_LPJzgc;k3NcD^Sl_r zt$DnLQMWJRzVrdqdCEDD&YueF!lp1A=E8h95EjGHa4M|a)6ZKIro-m2J?skm!ohGj zEQN`^{CvrJhovwv+s|8zhx0fmu>tFFQ?92e%!WB^o3`fJteG-ZH^m%7~7n96- ze$|F8cp%3!cmU>bH$H9_XJH@CgT$?a4;MWOJQ<9UZ41RsS>Zma$JB3yaMZR zO+H>Nmg(c-8koY>u^G?f{xspan88*|<2l%YP1ugdV-}CY7CaVncp2B94+p|xI2xwv zcpOqZ9{7;17nfiYPH-I=`~uVXIo9CcF^4y@*MT=+J1)d#ydDSeEDU!(5mT2f|`F8cv0k z2l#n1IKp|;_$IdF8<@q{u>*i!l$xJd6kM^-;q2cj9@D3%Fh7fjkee zCQRd+{9N0FS9828=8iBM=A#dU#c&D}T-PXm#p9W%=Y2WOlMHL|8fIRj6KBx*86a^w z_FyAFcX#1#yq*rAzORm=-p3okA@LGKHeVoouChdCX`YfvA*1&e$?&BgI7 zp37ce%w4FxLd^X!kH%b#IdO=;FPK7o+;Y@;(lOWI^vA<1xIei#o{i&usQ0zH@IbD= z5WOFDe@0_2qRx{@$Nh^r#jMAp9QAmlqu1c{$Bj7?b1vp=%zZI;#azG?=NrY(_Eh(x~&+;s5x)Rf|WkUxQC_-W2NgN&F>y3DkMo z@o28Q8TIpN5p}%0EI2m5gj$NTVU&YMTwz6bB7cc9Kw!VP(S9LB}EzQg>y zb*T3{Yf}65s8NrSDcm@15$7>t>yfyd$a|(6dB;Jpeal9O#_=U1AKt{AN1e9^Z^W)Rp2HV7ZwKo3?YIz|QRgY*=X&1Y zw|w2C4)^mWaf0KOsPmTN|6u~Z;P@2#FLK_AxP1wKMIVmyq}khw&sPmD;&>i)y*>DI z<}TEEbNDmtz%AKt$Co*87Ipg;yqBIqoo5h##^c_H`n{*}2tRK*>iLjBop*|U3r?Vp zm+%$NJBqsf2;NLDpw3gv?Tq`C#2+$up{_TFcQALL&fAVXn8g#=Z^73%Z!_xlP52{v z9qK&&cp}fc9{h^OH*ut&cZzwHo{y;Wmhc+lPXx8vr_&6va<+zdNn9>6N* zJn}c)isVs=#HTy)e8dt?ar_f3;p%)x9>I^9i+J1qTo>NT@6#RZ>wUR))cbN-)cbNR zsQ2ZXQSZw&q28Cv;8VO_r%~_A)u7&&%i})0p7-Hyhw^yfJibp1;to7+HAnm7mqI;$ zNz~(4iGQG%$MFPy#N#&=x1Ye@(?{Yw8TzA~w-49g@y+Aq+wu6|9W!};;#=(J;&=ys z!ui@!x69%Py@2=X`wu?C^%Sv&HvCytGeAEv_=)a`OH_l1RUG)x>9w-3`{OPIr1`uM2x6>wJ^jX80= z-;WgT%<(kVU`v=o-LF2>{Vc>h8YY_J`7HxFvSs7TAHCV-}OxjQad!a5LsQ+!Sl# zcoH{ZF2^dII>Gl#xH0nxZiGeL5C^dm`*8!z80+vL ztigIr;(=I>I?ohe2L~{hQ1b}x&s@Yh?VZZ&6~8ytVHdA=DdgX1RW#$idc8)ypPt7D zcpdA(i^{n!ybuR*Q@+3T;W+yR)cyosMz3t<`zn7|uf^?|llVvWnlQy&hp+PS+VMrc zpZDO_9G}7;)^Oc;8;)Q%7V%ab#7rHJ8-AZTkJs{erB37VDChccA9@xa=lfDK-pO7D ze}Z+`i#7OT?87~{t}c9(*YAEjhsR|EbLHGG{65y6?%!`}Q2$;bh5CMz#2;W~952V+ z+IZbY-F}MOr@5b_ah@iQ|B;VVhmT=1>V2>Fun&LB@h*Hs*AvGJ;RN2MpMS9%r{Z|! z8GfELUdr(ryaY3GyhX>kUmbWhAFn6u4-2TjAB==8^Y}fA$E6uR)#nXMn88mljUQtj zeuT9+hBf#+e+Nn7hs;U*D^}tMSdODO!N++YN0{HjVdUSGRTS|}EZ`eBh_B-SuE2hL z4g2s_%;PKAgZg__7ru-+dma7^I333qYq)+~j{T^glk)fia~D339rzq(v53vM zhF)io_ogc9P+z|__$++{Z{YeSP@k{zv)oiz7q;VVy8n16?-w-TEnIgG{)pop_(RO2 zzHSG?B3{M$NAV`CY~gjdoW}u`T;$2uIrcWSub_%;sWjojaUY}5V5Ecd4i zFUAf$9~1NWeTc`s#H`1^oSFA*DpGhe)`d-B7B}Pbm<#iG3ws0MC|=ChO%dBLaW?N4 zVG2*hay$iVa68VE4x7VvEaP}r*cT3BHy>v>EQN`4{CEN;RXGpPU*#@kG0Ufdx zFJ3%&@c;)12Mb<23=R|zu(7}x1TVvi7dyY;WsFh0c=6)Ji}#>K2EWh!^z+yIb=`91 zzS1;F<=gLo_7ZP{4c-c;cuSmN7{AnwMi1Gyx3#AO&2^-;PIay;-D>Nh`@9{^@ENQl z#iwJ5Ps0&D6{mQ6oZ#)S!LZ(iuJM7yJB=TYd4C6{21-bp5v=q@uUD)^j;{yyI6IL?1KPdMMJ?*W>^F9Of!AxD!s{vkzIKgXUAFqWyye4+>8kk}jKhzS#efU@#UFaIa`1lFj zHy&gi#Nl&_A#r&BD97;rM~2~kG{uY2Kd?Q)i$0q5V3^;-4`MsCGp@3|FkWNGyTXun zi6QR-L*BXVGrTx?8w`1;81mK_@@_C3XW>if!L|xuiggQ35V2X0Q?T88$J7r(@P%><{6o8jAWhxep^i}%0{-W{VS@%*H}jn5=s zPY0UoNNeOXr9)GlrUe*@B6!& zXr_f$I?@ezH2;( z{+-58hPo!cX7=r?k)UZ8*cX;u1ebfBbYLZs9o?;YYEJ zAy0#CYouXl}>btPre|>)pPde!44jNe;LDh zFvh3Q-?BZzw{RZZId6;n&Cj6$?K!W5hjYi|@q}!+Cm$;rzV9aGqac zsBeLxzBz{T{LJPm8_3_nb1}ky;g0@);u`;f1KN*be1b9d z@ks39A#CGCu*4&9ga@&}131J8XLw<3@Er0^@j}ECydYM10i5IaI389SKbQ9rX>Z}x zv5(>V0X+=g56JL-)SuvE`Tf8V-iH1hKf!jE81~l!Z%g|e!~UA#fVi=JiZk}t1jGC> z-Uv$!dA2wV`{T5Iz68Vm?_Jldr}wzrwp>fg#TtZ$bVAev<9=t9{-c-a4!cL*5SFinxup z#2C*ZZwtfx2ycKJ^JK)~?`#r$@D*4ehV@P{{GHAOL*6mI`*_xeH>176IeAMw{C7Th z@K_!f40&ew2A(GyJdy3K@d{x*&*Sq3Y+)DM_zRAQ9{v&sn&XDJ#``d?(o#owZ`#Lr z1kc+k{)+J{49CkH!|}4l@O`Nr{)Ybe`Fp$gTjC*x@15j$p>Vw6)7p?5~~kws;!-1KMAK6AXFAj;}G~sqmHb zm$r}a+vF)Q%p2m%agL{8`vtsS3){!@T!8K4OKFerWw>KpXy4*@$g^?Y8lORbpK&k7 z8bh86!}td0t^&;+fSZ5dCjy?Pf?E}qqq_xg5%v)oa zx52+MFRJ&p@vgic?dd>s9ciso{2TM<7+%k<@SnKV){8lB5O=hX=Mtwn)KbUV=t9@J z)A%L(JY7xj-{j4-&`Kvd!~ZaDsT+-6x^Hi5PY0UoNNb(yTvxi)*30&JJKEP&hg#}b z8(rvHcN)KZpSP=tW?E>a6P@W&HyZx}Rj7wY7&WwllyB zV6G#)AaSizo$E@s+IsDNd`J75;^D_%OC95d$=~Qg*SgdAb^CE$O*GR&E1l>}m%7pL z$EjhvZSCm*!#Z;v=@i5F9UBavYc23GoHy5a5%TObo^W0#PB7fBbTQno4Dd+Wa~)w! zT;owV$B=)4A^+O;9Ue`8{D!?^Q&UC38jo!E)-^TF1U{42{>qu*z z>Rea4)z+K#`8wLyREJvXSQ}knct3HiJB{DGZ|`b?|3|%<7Fy{tUGR#g8#R#*nAN z&ti$6!5WXF{wZeczd2r#c%|*PaX%O{AHT==7Je7E^k0Jbges$r+oi_aa|1K6FdPkEws`JUY7nDUJjSK(eOv$p}mb^Tu%phdEy+y z_C|OGtnoyg8qe`0;+1Z-^^Sde2d_wfAFqU|4)MywrH-}Hg|2m{@jLhPx|(RFg;qMz znJ#ss;g8+Jer#(`2b$|hYn|#`SGv{KyZ3oJ+SgQvTIyIEUFceO8vpM;Z&wq|w9rZ? zI@6_YH2jFt;rg|w1I=}$wN7=eE8S|Vv3~7qszWVxjMw6EXmp`#yf*DSjo-76yPDv2 z=+Cs!N+&wgrEWC*C_|Xv)}9VD*OAsb)w!;8tF8C#^LDhasSdT&u{OHUweB>2|2}V5 z6V0^H3a?9D6P@W&HyV9_@70C+v5!3+Xs#ozb*gh+=~i1G+~@0PUsD}wsbg(0oL?5Y z)}6*5+V^)g(M$`ibfPo7K6#hA(eUG0p}mba2=(hga~)}|Q=RKdx7zyfK3_-sn(9zX z9peqzexnOr>rUgd_T##mXr_f$I?a6P@W&HyV9>pRcVw9cZp2t#zt%UFlX^pV;T^XkSwu zYN=ywbfIhAY5Ym+*F-Zdw9<*L@h^OCzS1TBnRteO!VTVp{U3db@2`gEgZA(;;c>yM zUxfP}JP{{&Z5-nTu*M5wg%>`N`x-nNNBGDix!=P}(LcmT6X*C?9N=TH^J(4(qrZ(E zjPZKd!i!*phj7RE3zBz>hj4=-{~AO76^8svd=$t5A#}UtPNZjDVaEuSdg8V)Dhj;?!cwNl!;+W#GIKYrU!H~a?A%71;{w{|69ef0~ zFyvq3wdh~r6>y2y!37?PbBu9@A%BA*{}e<135NV*4Ebw(IF2ynPe051p!5&$vY6lv zu#ZP!50Az!ws>4S7-Jhl{usmK+rsepM)(likUu=W8F4sH3$1jbGwm<<964+c-x9Wm zQ|#ayu#IoS7~hO7Ov3hXLcAl-n{bP-#|_?;{w3Z7r;K|A?Gt=Hj`7u4VI@P(ZbgQi|?(=rEuc;2T)Uh_Y&@~QN?@r?{?c=T{nrVTzWqhR* zo#|3H8hv>`zO6kSXs#ozb*gh+=~i1`+2`$OUsD}wsbjny>uz+RYrK7^AMb$iGK%;c z+e2LpucH&qutQvEr4ya$Qa2iXbw97IJsoJS4c?LCd5U+y3BHTtevFsoyi()sY2RWP zx4|%OjsGt^Pw>)=TjK3#?|p4Qu8Uz@2iuHm<7F5Z<85g#@JQkzUI=r%6lQolrZ`|+ zgU1k0@gg|EOW+uf!y0eHxGmlaH+Xn`$ZuyJTH(cTiMOP`_jS&r%u!ARH8#@@| zEf|;LJ(*YFb$Q>V#*;X&GeEDevRN-{AZ6wD&N4UoXY*xlj?>8JFSR zu*QdDgNMJThtFi*44;8p{Bg+lO+II5TpM3?bFK?`E!H>0Z?mon4~6%OzD504X1jPx z?BFdh#+ze==jE;QE#q%Syv78VcvGC?O|Zcu7&pNi6W4enOqqWtj>Dmj@ye`YhBv?! zo`iE;vfdr`iQC_1|6#o1{aW%wcwgMoeji-py>W^EjdQ#gHkjcA?};_u153O+7WiM7 zE0?OvUAbnuVt-wdxvoZzQe?+7nUoa2{?$9Og360eFgJOL;8 z59Y7%(!@KwB(}f9agKewD9$mgzrnEn35Ggr40V_IAT02KnBxO5#lv-Ac)XS&X1{MV z`Yz8C;x-R20H=vsFge}A91 ztBGb>Xr&XK=~6cu{a~N3tvwxRt|P5=s&ifGR$D)`e(h_jLoIczjV^SpJB@#2{hDZ| zg;qMznJ#ss(c1d8rvuG(q_s|Ut}ESY>&MoweNAPDlV?#H#YhePHKG}n>VI@P(ZbgQkO?elcBuc;2T)Uh_Y&^10h)UWZ+ z_iqu*z;^SEVTvxi)*01?p82UT-1ng_7LtUSH zAbQ(Pc|Cw{#RlJkV|+7~_$D0U8!^Q?*4WldN{6ehzooeHuz8+<3q5-2jdVQgeg7{`}hFtV2&-kKW_he zAi5u}@V+?5``{GsjWzx^j__WXV}=8~C-(3j*v7kKg#U$`zZ{6}hD*FF&hRcc!4xaJ zGZuI!%EmTVRSe$3ET+JD6Y# zZ;IPL9f)p%E4(qz@kThs8)A(&z!6>_bL`^)uZKOnF1GPH7~!>X^Tz|xwQz~o#2H=# zC)mRZuZ{&?4KutdCU_O>;*~MRE8*_{4n$YPHFj}}Te!gUV}s|zF`gGoJP!`>2u$%H z_VECAFv1r8=O)zuy93d`afRpN9RGz={3q7<4;;UBQT-(!Zq!vueeUHlEk_-ow#=0Nl-T;m28_)Bc?7dXbBV~Ib* zA^sFo{0a8)$JjxByX;U4e}vm#ABcX4EBpb@@%uQ%?_rJK#Swl7b6nv7zl}Zo7Pj%5 z7~wZ?^Q!~V*Kvto!x?@RC%D84zk&sR88iG6Ciq3{;ukQ+&*N@$Ao?7xk>6Z9w7}0| zgP*}Mei}>s6b|u|nBpg}j~~Yl@>_0)TKF;C{_;R{4zBQ{ILEVbiXXum&%zOY7;~KA z06&C1{2;dR0~q1^ar27<(fe?T@5LFu2PfEIh5ru={9nxQ-I(CJu#4}+7~g@rpC5?c zj%%Fa0^f!Wz7@y#7A*12IK($$if_a|z5zQp!4|$Aw?E@P09W{0oa1Y7im%2R&%_bF z3UeIe0AGncdJFTw&}h#8)N3BCZkcsj=TeBAwn z`v6>Hg$q0l8+o*6LtNm)u)&Ao7$1TqJ{X7iAWZRr*vAK82Xk!U{c-z4uK&2g`{Eq$gHyaW*7)Bz z!h2zk84mEC*u#5Z8}E)0{uge3!1W)Ocvqa^U2uXaR(NMD@J^WF9WlW>U>9$XG2RY$ z-{<;|YaHMLZ-Wiq8pn7mEb*2 LsBH^)BS3_F-$3vY_s?{WRd72X) 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 O1(Vtbc8wY?#P!HJ@;>_d`Z!hcYI2k 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,Ic1~C>~OWfcAKk)kV;@$zD@fF|j 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

  2. kuPwh-K+Vsf9h`%bu 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%0Dvc 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�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 ItxGQbKhkTOtN;K2 delta 12187 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