From 5a310ffd8f28735c726bb6f1f45054bf2e567c7c Mon Sep 17 00:00:00 2001 From: overtake <> Date: Fri, 21 Jun 2019 14:14:01 +0200 Subject: [PATCH 01/32] mac project --- .../TelegramApi_Xcode.xcodeproj/project.pbxproj | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj index 1f399c776d..17aa3682c7 100644 --- a/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj @@ -45,9 +45,7 @@ D035734422B5C9BF00F0920D /* SecretApiLayer46.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretApiLayer46.swift; sourceTree = ""; }; D035734522B5C9BF00F0920D /* SecretApiLayer8.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretApiLayer8.swift; sourceTree = ""; }; D035734622B5C9BF00F0920D /* SecretApiLayer73.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretApiLayer73.swift; sourceTree = ""; }; - D0CC4AC122BA468D0088F36D /* TelegramApi copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "TelegramApi copy-Info.plist"; path = "/Users/keepcoder/Dropbox/Telegram-multi-acc/submodules/telegram-ios/submodules/TelegramApi/TelegramApi copy-Info.plist"; sourceTree = ""; }; D0CC4AD922BA46F30088F36D /* TelegramApiMac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TelegramApiMac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D0CC4ADA22BA46F40088F36D /* TelegramApi copy2-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "TelegramApi copy2-Info.plist"; path = "/Users/keepcoder/Dropbox/Telegram-multi-acc/submodules/telegram-ios/submodules/TelegramApi/TelegramApi copy2-Info.plist"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -74,8 +72,6 @@ D035732322B5C1FC00F0920D /* Info.plist */, D035732122B5C1FC00F0920D /* Sources */, D035732022B5C1FC00F0920D /* Products */, - D0CC4AC122BA468D0088F36D /* TelegramApi copy-Info.plist */, - D0CC4ADA22BA46F40088F36D /* TelegramApi copy2-Info.plist */, ); sourceTree = ""; }; @@ -814,7 +810,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "TelegramApi copy2-Info.plist"; + INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -846,7 +842,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "TelegramApi copy2-Info.plist"; + INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -878,7 +874,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "TelegramApi copy2-Info.plist"; + INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -910,7 +906,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "TelegramApi copy2-Info.plist"; + INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -942,7 +938,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "TelegramApi copy2-Info.plist"; + INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -973,7 +969,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "TelegramApi copy2-Info.plist"; + INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", From 77123cf69d1c32ce1d134c0473cad020107b87a4 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Mon, 1 Jul 2019 15:38:24 +0200 Subject: [PATCH 02/32] no message --- .../project.pbxproj | 242 ++++++++++++++++++ .../TelegramCore/ApiGroupOrChannel.swift | 3 + .../TelegramCore/TelegramChannel.swift | 1 + 3 files changed, 246 insertions(+) diff --git a/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj index 17aa3682c7..da1fb8dec4 100644 --- a/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj @@ -249,6 +249,242 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + D0276B8422C17FAA003155D8 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseAppStore; + }; + D0276B8522C17FAA003155D8 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStore; + }; + D0276B8622C17FAA003155D8 /* ReleaseAppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = macosx; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseAppStore; + }; + D0276B8722C17FB2003155D8 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = ReleaseHockeyapp; + }; + D0276B8822C17FB2003155D8 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyapp; + }; + D0276B8922C17FB2003155D8 /* ReleaseHockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramApi; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = macosx; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = ReleaseHockeyapp; + }; D035732522B5C1FC00F0920D /* DebugHockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1001,6 +1237,8 @@ D035732A22B5C23200F0920D /* DebugAppStoreLLC */, D035732622B5C1FC00F0920D /* ReleaseHockeyappInternal */, D035732C22B5C24100F0920D /* ReleaseAppStoreLLC */, + D0276B8422C17FAA003155D8 /* ReleaseAppStore */, + D0276B8722C17FB2003155D8 /* ReleaseHockeyapp */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ReleaseHockeyappInternal; @@ -1014,6 +1252,8 @@ D035732B22B5C23200F0920D /* DebugAppStoreLLC */, D035732922B5C1FC00F0920D /* ReleaseHockeyappInternal */, D035732D22B5C24100F0920D /* ReleaseAppStoreLLC */, + D0276B8522C17FAA003155D8 /* ReleaseAppStore */, + D0276B8822C17FB2003155D8 /* ReleaseHockeyapp */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ReleaseHockeyappInternal; @@ -1027,6 +1267,8 @@ D0CC4AD622BA46F30088F36D /* DebugAppStoreLLC */, D0CC4AD722BA46F30088F36D /* ReleaseHockeyappInternal */, D0CC4AD822BA46F30088F36D /* ReleaseAppStoreLLC */, + D0276B8622C17FAA003155D8 /* ReleaseAppStore */, + D0276B8922C17FB2003155D8 /* ReleaseHockeyapp */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ReleaseHockeyappInternal; diff --git a/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift b/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift index 0999f89c2f..66a729e1ff 100644 --- a/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift +++ b/submodules/TelegramCore/TelegramCore/ApiGroupOrChannel.swift @@ -96,6 +96,9 @@ func parseTelegramGroupOrChannel(chat: Api.Chat) -> Peer? { if (flags & Int32(1 << 19)) != 0 { channelFlags.insert(.isScam) } + if (flags & Int32(1 << 21)) != 0 { + channelFlags.insert(.hasGeo) + } let restrictionInfo: PeerAccessRestrictionInfo? if let restrictionReason = restrictionReason { diff --git a/submodules/TelegramCore/TelegramCore/TelegramChannel.swift b/submodules/TelegramCore/TelegramCore/TelegramChannel.swift index 0ccf6f3f62..ee405845eb 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramChannel.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramChannel.swift @@ -144,6 +144,7 @@ public struct TelegramChannelFlags: OptionSet { public static let isVerified = TelegramChannelFlags(rawValue: 1 << 0) public static let isCreator = TelegramChannelFlags(rawValue: 1 << 1) public static let isScam = TelegramChannelFlags(rawValue: 1 << 2) + public static let hasGeo = TelegramChannelFlags(rawValue: 1 << 3) } public final class TelegramChannel: Peer { From 464738d8a85ab9a63a889b81a58bd2bdd83fa40b Mon Sep 17 00:00:00 2001 From: Peter <> Date: Fri, 12 Jul 2019 22:10:53 +0400 Subject: [PATCH 03/32] Move SoftwareVideoSource to UniversalMediaPlayer --- .../Sources}/SoftwareVideoSource.swift | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) rename submodules/{TelegramUI/TelegramUI => MediaPlayer/Sources}/SoftwareVideoSource.swift (79%) diff --git a/submodules/TelegramUI/TelegramUI/SoftwareVideoSource.swift b/submodules/MediaPlayer/Sources/SoftwareVideoSource.swift similarity index 79% rename from submodules/TelegramUI/TelegramUI/SoftwareVideoSource.swift rename to submodules/MediaPlayer/Sources/SoftwareVideoSource.swift index f90e8c727c..4c8976df32 100644 --- a/submodules/TelegramUI/TelegramUI/SoftwareVideoSource.swift +++ b/submodules/MediaPlayer/Sources/SoftwareVideoSource.swift @@ -3,7 +3,6 @@ import UIKit import CoreMedia import SwiftSignalKit import FFMpeg -import UniversalMediaPlayer private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: UnsafeMutablePointer?, bufferSize: Int32) -> Int32 { let context = Unmanaged.fromOpaque(userData!).takeUnretainedValue() @@ -46,7 +45,7 @@ private final class SoftwareVideoStream { } } -final class SoftwareVideoSource { +public final class SoftwareVideoSource { private var readingError = false private var videoStream: SoftwareVideoStream? private var avIoContext: FFMpegAVIOContext? @@ -55,7 +54,7 @@ final class SoftwareVideoSource { fileprivate let fd: Int32? fileprivate let size: Int32 - init(path: String) { + public init(path: String) { let _ = FFMpegMediaFrameSourceContextHelpers.registerFFMpegGlobals var s = stat() @@ -102,10 +101,10 @@ final class SoftwareVideoSource { let codecId = avFormatContext.codecId(atStreamIndex: streamIndex) - let fpsAndTimebase = avFormatContext.fpsAndTimebase(forStreamIndex: streamIndex, defaultTimeBase: CMTimeMake(1, 40000)) + let fpsAndTimebase = avFormatContext.fpsAndTimebase(forStreamIndex: streamIndex, defaultTimeBase: CMTimeMake(value: 1, timescale: 40000)) let (fps, timebase) = (fpsAndTimebase.fps, fpsAndTimebase.timebase) - let duration = CMTimeMake(avFormatContext.duration(atStreamIndex: streamIndex), timebase.timescale) + let duration = CMTimeMake(value: avFormatContext.duration(atStreamIndex: streamIndex), timescale: timebase.timescale) let metrics = avFormatContext.metricsForStream(at: streamIndex) @@ -154,14 +153,14 @@ final class SoftwareVideoSource { if let videoStream = videoStream, Int(packet.streamIndex) == videoStream.index { let packetPts = packet.pts - let pts = CMTimeMake(packetPts, videoStream.timebase.timescale) - let dts = CMTimeMake(packet.dts, videoStream.timebase.timescale) + let pts = CMTimeMake(value: packetPts, timescale: videoStream.timebase.timescale) + let dts = CMTimeMake(value: packet.dts, timescale: videoStream.timebase.timescale) let duration: CMTime let frameDuration = packet.duration if frameDuration != 0 { - duration = CMTimeMake(frameDuration * videoStream.timebase.value, videoStream.timebase.timescale) + duration = CMTimeMake(value: frameDuration * videoStream.timebase.value, timescale: videoStream.timebase.timescale) } else { duration = videoStream.fps } @@ -193,7 +192,7 @@ final class SoftwareVideoSource { return (frames.first, endOfStream) } - func readFrame(maxPts: CMTime?) -> (MediaTrackFrame?, CGFloat, CGFloat, Bool) { + public func readFrame(maxPts: CMTime?) -> (MediaTrackFrame?, CGFloat, CGFloat, Bool) { if let videoStream = self.videoStream { let (decodableFrame, loop) = self.readDecodableFrame() if let decodableFrame = decodableFrame { @@ -209,4 +208,28 @@ final class SoftwareVideoSource { return (nil, 0.0, 1.0, false) } } + + public func readImage() -> (UIImage?, CGFloat, CGFloat, Bool) { + if let videoStream = self.videoStream { + for _ in 0 ..< 10 { + let (decodableFrame, loop) = self.readDecodableFrame() + if let decodableFrame = decodableFrame { + if let renderedFrame = videoStream.decoder.render(frame: decodableFrame) { + return (renderedFrame, CGFloat(videoStream.rotationAngle), CGFloat(videoStream.aspect), loop) + } + } + } + return (nil, CGFloat(videoStream.rotationAngle), CGFloat(videoStream.aspect), true) + } else { + return (nil, 0.0, 1.0, false) + } + } + + public func seek(timestamp: Double) { + if let stream = self.videoStream, let avFormatContext = self.avFormatContext { + let pts = CMTimeMakeWithSeconds(timestamp, preferredTimescale: stream.timebase.timescale) + avFormatContext.seekFrame(forStreamIndex: Int32(stream.index), pts: pts.value) + stream.decoder.reset() + } + } } From baf2dbbb64d13d6fa3b786939febe1aebfc5274f Mon Sep 17 00:00:00 2001 From: Peter <> Date: Fri, 12 Jul 2019 22:12:29 +0400 Subject: [PATCH 04/32] Video scrubbing preview --- .../FFMpegMediaVideoFrameDecoder.swift | 74 +++- .../Sources/MediaPlayerFramePreview.swift | 131 +++++++ .../Sources/MediaPlayerScrubbingNode.swift | 7 +- .../UniversalSoftwareVideoSource.swift | 368 ++++++++++++++++++ .../project.pbxproj | 12 + .../ChatItemGalleryFooterContentNode.swift | 57 +++ .../ChatVideoGalleryItemScrubberView.swift | 7 + .../UniversalVideoGalleryItem.swift | 32 ++ submodules/ffmpeg/FFMpeg/FFMpegAVFrame.h | 6 + submodules/ffmpeg/FFMpeg/FFMpegAVFrame.m | 10 + submodules/ffmpeg/FFMpeg/build-ffmpeg.sh | 6 +- .../FFMpeg_Xcode.xcodeproj/project.pbxproj | 4 + 12 files changed, 708 insertions(+), 6 deletions(-) create mode 100644 submodules/MediaPlayer/Sources/MediaPlayerFramePreview.swift create mode 100644 submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift diff --git a/submodules/MediaPlayer/Sources/FFMpegMediaVideoFrameDecoder.swift b/submodules/MediaPlayer/Sources/FFMpegMediaVideoFrameDecoder.swift index 29c84c0193..0bfdb1731f 100644 --- a/submodules/MediaPlayer/Sources/FFMpegMediaVideoFrameDecoder.swift +++ b/submodules/MediaPlayer/Sources/FFMpegMediaVideoFrameDecoder.swift @@ -1,9 +1,22 @@ import CoreMedia import Accelerate import FFMpeg +import Accelerate private let bufferCount = 32 +private let deviceColorSpace: CGColorSpace = { + if #available(iOSApplicationExtension 9.3, iOS 9.3, *) { + if let colorSpace = CGColorSpace(name: CGColorSpace.displayP3) { + return colorSpace + } else { + return CGColorSpaceCreateDeviceRGB() + } + } else { + return CGColorSpaceCreateDeviceRGB() + } +}() + public final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { private let codecContext: FFMpegAVCodecContext @@ -63,6 +76,17 @@ public final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { return nil } + public func render(frame: MediaTrackDecodableFrame) -> UIImage? { + let status = frame.packet.send(toDecoder: self.codecContext) + if status == 0 { + if self.codecContext.receive(into: self.videoFrame) { + return convertVideoFrameToImage(self.videoFrame) + } + } + + return nil + } + public func takeRemainingFrame() -> MediaTrackFrame? { if !self.delayedFrames.isEmpty { var minFrameIndex = 0 @@ -79,6 +103,53 @@ public final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { } } + private func convertVideoFrameToImage(_ frame: FFMpegAVFrame) -> UIImage? { + var info = vImage_YpCbCrToARGB() + + var pixelRange: vImage_YpCbCrPixelRange + switch frame.colorRange { + case .full: + pixelRange = vImage_YpCbCrPixelRange(Yp_bias: 0, CbCr_bias: 128, YpRangeMax: 255, CbCrRangeMax: 255, YpMax: 255, YpMin: 0, CbCrMax: 255, CbCrMin: 0) + default: + pixelRange = vImage_YpCbCrPixelRange(Yp_bias: 16, CbCr_bias: 128, YpRangeMax: 235, CbCrRangeMax: 240, YpMax: 255, YpMin: 0, CbCrMax: 255, CbCrMin: 0) + } + var result = kvImageNoError + result = vImageConvert_YpCbCrToARGB_GenerateConversion(kvImage_YpCbCrToARGBMatrix_ITU_R_709_2, &pixelRange, &info, kvImage420Yp8_Cb8_Cr8, kvImageARGB8888, 0) + if result != kvImageNoError { + return nil + } + + var srcYp = vImage_Buffer(data: frame.data[0], height: vImagePixelCount(frame.height), width: vImagePixelCount(frame.width), rowBytes: Int(frame.lineSize[0])) + var srcCb = vImage_Buffer(data: frame.data[1], height: vImagePixelCount(frame.height), width: vImagePixelCount(frame.width / 2), rowBytes: Int(frame.lineSize[1])) + var srcCr = vImage_Buffer(data: frame.data[2], height: vImagePixelCount(frame.height), width: vImagePixelCount(frame.width / 2), rowBytes: Int(frame.lineSize[2])) + + let argbBytesPerRow = (4 * Int(frame.width) + 15) & (~15) + let argbLength = argbBytesPerRow * Int(frame.height) + let argb = malloc(argbLength)! + guard let provider = CGDataProvider(dataInfo: argb, data: argb, size: argbLength, releaseData: { bytes, _, _ in + free(bytes) + }) else { + return nil + } + + var dst = vImage_Buffer(data: argb, height: vImagePixelCount(frame.height), width: vImagePixelCount(frame.width), rowBytes: argbBytesPerRow) + + var permuteMap: [UInt8] = [3, 2, 1, 0] + + result = vImageConvert_420Yp8_Cb8_Cr8ToARGB8888(&srcYp, &srcCb, &srcCr, &dst, &info, &permuteMap, 0x00, 0) + if result != kvImageNoError { + return nil + } + + let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.noneSkipFirst.rawValue) + + guard let image = CGImage(width: Int(frame.width), height: Int(frame.height), bitsPerComponent: 8, bitsPerPixel: 32, bytesPerRow: argbBytesPerRow, space: deviceColorSpace, bitmapInfo: bitmapInfo, provider: provider, decode: nil, shouldInterpolate: false, intent: .defaultIntent) else { + return nil + } + + return UIImage(cgImage: image, scale: 1.0, orientation: .up) + } + private func convertVideoFrame(_ frame: FFMpegAVFrame, pts: CMTime, dts: CMTime, duration: CMTime) -> MediaTrackFrame? { if frame.data[0] == nil { return nil @@ -100,9 +171,6 @@ public final class FFMpegMediaVideoFrameDecoder: MediaTrackFrameDecoder { ioSurfaceProperties["IOSurfaceIsGlobal"] = true as NSNumber var options: [String: Any] = [kCVPixelBufferBytesPerRowAlignmentKey as String: frame.lineSize[0] as NSNumber] - /*if #available(iOSApplicationExtension 9.0, iOS 9.0, *) { - options[kCVPixelBufferOpenGLESTextureCacheCompatibilityKey as String] = true as NSNumber - }*/ options[kCVPixelBufferIOSurfacePropertiesKey as String] = ioSurfaceProperties CVPixelBufferCreate(kCFAllocatorDefault, diff --git a/submodules/MediaPlayer/Sources/MediaPlayerFramePreview.swift b/submodules/MediaPlayer/Sources/MediaPlayerFramePreview.swift new file mode 100644 index 0000000000..883595ab89 --- /dev/null +++ b/submodules/MediaPlayer/Sources/MediaPlayerFramePreview.swift @@ -0,0 +1,131 @@ +import Foundation +import SwiftSignalKit +import Postbox +import TelegramCore +import FFMpeg + +private final class FramePreviewContext { + let source: UniversalSoftwareVideoSource + + init(source: UniversalSoftwareVideoSource) { + self.source = source + } +} + +private func initializedPreviewContext(queue: Queue, postbox: Postbox, fileReference: FileMediaReference) -> Signal, NoError> { + return Signal { subscriber in + let source = UniversalSoftwareVideoSource(mediaBox: postbox.mediaBox, fileReference: fileReference) + let readyDisposable = (source.ready + |> filter { $0 }).start(next: { _ in + subscriber.putNext(QueueLocalObject(queue: queue, generate: { + return FramePreviewContext(source: source) + })) + }) + + return ActionDisposable { + readyDisposable.dispose() + } + } +} + +private final class MediaPlayerFramePreviewImpl { + private let queue: Queue + private let context: Promise> + private let currentFrameDisposable = MetaDisposable() + private var currentFrameTimestamp: Double? + private var nextFrameTimestamp: Double? + fileprivate let framePipe = ValuePipe() + + init(queue: Queue, postbox: Postbox, fileReference: FileMediaReference) { + self.queue = queue + self.context = Promise() + self.context.set(initializedPreviewContext(queue: queue, postbox: postbox, fileReference: fileReference)) + } + + deinit { + assert(self.queue.isCurrent()) + self.currentFrameDisposable.dispose() + } + + func generateFrame(at timestamp: Double) { + if self.currentFrameTimestamp != nil { + self.nextFrameTimestamp = timestamp + return + } + self.currentFrameTimestamp = timestamp + + let queue = self.queue + let takeDisposable = MetaDisposable() + let disposable = (self.context.get() + |> take(1)).start(next: { [weak self] context in + queue.async { + guard context.queue === queue else { + return + } + context.with { context in + let disposable = context.source.takeFrame(at: timestamp).start(next: { image in + guard let strongSelf = self else { + return + } + if let image = image { + strongSelf.framePipe.putNext(image) + } + strongSelf.currentFrameTimestamp = nil + if let nextFrameTimestamp = strongSelf.nextFrameTimestamp { + strongSelf.nextFrameTimestamp = nil + strongSelf.generateFrame(at: nextFrameTimestamp) + } + }) + takeDisposable.set(disposable) + } + } + }) + self.currentFrameDisposable.set(ActionDisposable { + takeDisposable.dispose() + disposable.dispose() + }) + } + + func cancelPendingFrames() { + self.nextFrameTimestamp = nil + self.currentFrameTimestamp = nil + self.currentFrameDisposable.set(nil) + } +} + +public final class MediaPlayerFramePreview { + private let queue: Queue + private let impl: QueueLocalObject + + public var generatedFrames: Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + self.impl.with { impl in + disposable.set(impl.framePipe.signal().start(next: { image in + subscriber.putNext(image) + })) + } + return disposable + } + } + + public init(postbox: Postbox, fileReference: FileMediaReference) { + let queue = Queue() + self.queue = queue + self.impl = QueueLocalObject(queue: queue, generate: { + return MediaPlayerFramePreviewImpl(queue: queue, postbox: postbox, fileReference: fileReference) + }) + } + + public func generateFrame(at timestamp: Double) { + self.impl.with { impl in + impl.generateFrame(at: timestamp) + } + } + + public func cancelPendingFrames() { + self.impl.with { impl in + impl.cancelPendingFrames() + } + } +} diff --git a/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift b/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift index e5efcb136c..d7de8daf3e 100644 --- a/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift @@ -188,6 +188,7 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { public var playbackStatusUpdated: ((MediaPlayerPlaybackStatus?) -> Void)? public var playerStatusUpdated: ((MediaPlayerStatus?) -> Void)? public var seek: ((Double) -> Void)? + public var update: ((Double?, CGFloat) -> Void)? private let _scrubbingTimestamp = Promise(nil) public var scrubbingTimestamp: Signal { @@ -378,6 +379,7 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { strongSelf.scrubbingBeginTimestamp = statusValue.timestamp strongSelf.scrubbingTimestampValue = statusValue.timestamp strongSelf._scrubbingTimestamp.set(.single(strongSelf.scrubbingTimestampValue)) + strongSelf.update?(strongSelf.scrubbingTimestampValue, CGFloat(statusValue.timestamp / statusValue.duration)) strongSelf.updateProgressAnimations() } } @@ -385,8 +387,10 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { handleNodeContainer.updateScrubbing = { [weak self] addedFraction in if let strongSelf = self { if let statusValue = strongSelf.statusValue, let scrubbingBeginTimestamp = strongSelf.scrubbingBeginTimestamp, Double(0.0).isLess(than: statusValue.duration) { - strongSelf.scrubbingTimestampValue = max(0.0, min(statusValue.duration, scrubbingBeginTimestamp + statusValue.duration * Double(addedFraction))) + let timestampValue = max(0.0, min(statusValue.duration, scrubbingBeginTimestamp + statusValue.duration * Double(addedFraction))) + strongSelf.scrubbingTimestampValue = timestampValue strongSelf._scrubbingTimestamp.set(.single(strongSelf.scrubbingTimestampValue)) + strongSelf.update?(timestampValue, CGFloat(timestampValue / statusValue.duration)) strongSelf.updateProgressAnimations() } } @@ -408,6 +412,7 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { } strongSelf.seek?(scrubbingTimestampValue) } + strongSelf.update?(nil, 0.0) strongSelf.updateProgressAnimations() } } diff --git a/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift b/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift new file mode 100644 index 0000000000..040cb8b363 --- /dev/null +++ b/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift @@ -0,0 +1,368 @@ +import Foundation +import SwiftSignalKit +import Postbox +import TelegramCore +import FFMpeg + +private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: UnsafeMutablePointer?, bufferSize: Int32) -> Int32 { + let context = Unmanaged.fromOpaque(userData!).takeUnretainedValue() + let data: Signal + + let resourceSize: Int = context.size + let readCount = min(resourceSize - context.readingOffset, Int(bufferSize)) + let requestRange: Range = context.readingOffset ..< (context.readingOffset + readCount) + + let semaphore = DispatchSemaphore(value: 0) + data = context.mediaBox.resourceData(context.fileReference.media.resource, size: context.size, in: requestRange, mode: .complete) + var fetchedData: Data? + let disposable = data.start(next: { data in + if data.count == readCount { + fetchedData = data + semaphore.signal() + } + }) + let cancelDisposable = context.cancelRead.start(next: { value in + if value { + semaphore.signal() + } + }) + semaphore.wait() + + disposable.dispose() + cancelDisposable.dispose() + + if let fetchedData = fetchedData { + fetchedData.withUnsafeBytes { (bytes: UnsafePointer) -> Void in + memcpy(buffer, bytes, fetchedData.count) + } + let fetchedCount = Int32(fetchedData.count) + context.readingOffset += Int(fetchedCount) + return fetchedCount + } else { + return 0 + } +} + +private func seekCallback(userData: UnsafeMutableRawPointer?, offset: Int64, whence: Int32) -> Int64 { + let context = Unmanaged.fromOpaque(userData!).takeUnretainedValue() + if (whence & FFMPEG_AVSEEK_SIZE) != 0 { + return Int64(context.size) + } else { + context.readingOffset = Int(offset) + return offset + } +} + +private final class SoftwareVideoStream { + let index: Int + let fps: CMTime + let timebase: CMTime + let duration: CMTime + let decoder: FFMpegMediaVideoFrameDecoder + let rotationAngle: Double + let aspect: Double + + init(index: Int, fps: CMTime, timebase: CMTime, duration: CMTime, decoder: FFMpegMediaVideoFrameDecoder, rotationAngle: Double, aspect: Double) { + self.index = index + self.fps = fps + self.timebase = timebase + self.duration = duration + self.decoder = decoder + self.rotationAngle = rotationAngle + self.aspect = aspect + } +} + +private final class UniversalSoftwareVideoSourceImpl { + fileprivate let mediaBox: MediaBox + fileprivate let fileReference: FileMediaReference + fileprivate let size: Int + + fileprivate let state: ValuePromise + + fileprivate var avIoContext: FFMpegAVIOContext! + fileprivate var avFormatContext: FFMpegAVFormatContext! + fileprivate var videoStream: SoftwareVideoStream! + + fileprivate var readingOffset: Int = 0 + + fileprivate var cancelRead: Signal + + init?(mediaBox: MediaBox, fileReference: FileMediaReference, state: ValuePromise, cancelInitialization: Signal) { + guard let size = fileReference.media.size else { + return nil + } + + self.mediaBox = mediaBox + self.fileReference = fileReference + self.size = size + + self.state = state + state.set(.initializing) + + self.cancelRead = cancelInitialization + + let ioBufferSize = 64 * 1024 + + guard let avIoContext = FFMpegAVIOContext(bufferSize: Int32(ioBufferSize), opaqueContext: Unmanaged.passUnretained(self).toOpaque(), readPacket: readPacketCallback, seek: seekCallback) else { + return nil + } + self.avIoContext = avIoContext + + let avFormatContext = FFMpegAVFormatContext() + avFormatContext.setIO(avIoContext) + + if !avFormatContext.openInput() { + return nil + } + + if !avFormatContext.findStreamInfo() { + return nil + } + + self.avFormatContext = avFormatContext + + var videoStream: SoftwareVideoStream? + + for streamIndexNumber in avFormatContext.streamIndices(for: FFMpegAVFormatStreamTypeVideo) { + let streamIndex = streamIndexNumber.int32Value + if avFormatContext.isAttachedPic(atStreamIndex: streamIndex) { + continue + } + + let codecId = avFormatContext.codecId(atStreamIndex: streamIndex) + + let fpsAndTimebase = avFormatContext.fpsAndTimebase(forStreamIndex: streamIndex, defaultTimeBase: CMTimeMake(value: 1, timescale: 40000)) + let (fps, timebase) = (fpsAndTimebase.fps, fpsAndTimebase.timebase) + + let duration = CMTimeMake(value: avFormatContext.duration(atStreamIndex: streamIndex), timescale: timebase.timescale) + + let metrics = avFormatContext.metricsForStream(at: streamIndex) + + let rotationAngle: Double = metrics.rotationAngle + let aspect = Double(metrics.width) / Double(metrics.height) + + if let codec = FFMpegAVCodec.find(forId: codecId) { + let codecContext = FFMpegAVCodecContext(codec: codec) + if avFormatContext.codecParams(atStreamIndex: streamIndex, to: codecContext) { + if codecContext.open() { + videoStream = SoftwareVideoStream(index: Int(streamIndex), fps: fps, timebase: timebase, duration: duration, decoder: FFMpegMediaVideoFrameDecoder(codecContext: codecContext), rotationAngle: rotationAngle, aspect: aspect) + break + } + } + } + } + + if let videoStream = videoStream { + self.videoStream = videoStream + } else { + return nil + } + + state.set(.ready) + } + + private func readPacketInternal() -> FFMpegPacket? { + guard let avFormatContext = self.avFormatContext else { + return nil + } + + let packet = FFMpegPacket() + if avFormatContext.readFrame(into: packet) { + return packet + } else { + return nil + } + } + + func readDecodableFrame() -> (MediaTrackDecodableFrame?, Bool) { + var frames: [MediaTrackDecodableFrame] = [] + var endOfStream = false + + while frames.isEmpty { + if let packet = self.readPacketInternal() { + if let videoStream = videoStream, Int(packet.streamIndex) == videoStream.index { + let packetPts = packet.pts + + let pts = CMTimeMake(value: packetPts, timescale: videoStream.timebase.timescale) + let dts = CMTimeMake(value: packet.dts, timescale: videoStream.timebase.timescale) + + let duration: CMTime + + let frameDuration = packet.duration + if frameDuration != 0 { + duration = CMTimeMake(value: frameDuration * videoStream.timebase.value, timescale: videoStream.timebase.timescale) + } else { + duration = videoStream.fps + } + + let frame = MediaTrackDecodableFrame(type: .video, packet: packet, pts: pts, dts: dts, duration: duration) + frames.append(frame) + } + } else { + if endOfStream { + break + } else { + if let avFormatContext = self.avFormatContext, let videoStream = self.videoStream { + endOfStream = true + avFormatContext.seekFrame(forStreamIndex: Int32(videoStream.index), pts: 0) + } else { + endOfStream = true + break + } + } + } + } + + if endOfStream { + if let videoStream = self.videoStream { + videoStream.decoder.reset() + } + } + + return (frames.first, endOfStream) + } + + func readImage() -> (UIImage?, CGFloat, CGFloat, Bool) { + if let videoStream = self.videoStream { + for _ in 0 ..< 10 { + let (decodableFrame, loop) = self.readDecodableFrame() + if let decodableFrame = decodableFrame { + if let renderedFrame = videoStream.decoder.render(frame: decodableFrame) { + return (renderedFrame, CGFloat(videoStream.rotationAngle), CGFloat(videoStream.aspect), loop) + } + } + } + return (nil, CGFloat(videoStream.rotationAngle), CGFloat(videoStream.aspect), true) + } else { + return (nil, 0.0, 1.0, false) + } + } + + public func seek(timestamp: Double) { + if let stream = self.videoStream, let avFormatContext = self.avFormatContext { + let pts = CMTimeMakeWithSeconds(timestamp, preferredTimescale: stream.timebase.timescale) + avFormatContext.seekFrame(forStreamIndex: Int32(stream.index), pts: pts.value) + stream.decoder.reset() + } + } +} + +private enum UniversalSoftwareVideoSourceState { + case initializing + case failed + case ready + case generatingFrame +} + +private final class UniversalSoftwareVideoSourceThreadParams: NSObject { + let mediaBox: MediaBox + let fileReference: FileMediaReference + let state: ValuePromise + let cancelInitialization: Signal + + init(mediaBox: MediaBox, fileReference: FileMediaReference, state: ValuePromise, cancelInitialization: Signal) { + self.mediaBox = mediaBox + self.fileReference = fileReference + self.state = state + self.cancelInitialization = cancelInitialization + } +} + +private final class UniversalSoftwareVideoSourceTakeFrameParams: NSObject { + let timestamp: Double + let completion: (UIImage?) -> Void + let cancel: Signal + + init(timestamp: Double, completion: @escaping (UIImage?) -> Void, cancel: Signal) { + self.timestamp = timestamp + self.completion = completion + self.cancel = cancel + } +} + +private final class UniversalSoftwareVideoSourceThread: NSObject { + @objc static func entryPoint(_ params: UniversalSoftwareVideoSourceThreadParams) { + let runLoop = RunLoop.current + + let timer = Timer(fireAt: .distantFuture, interval: 0.0, target: UniversalSoftwareVideoSourceThread.self, selector: #selector(UniversalSoftwareVideoSourceThread.none), userInfo: nil, repeats: false) + runLoop.add(timer, forMode: .common) + + let source = UniversalSoftwareVideoSourceImpl(mediaBox: params.mediaBox, fileReference: params.fileReference, state: params.state, cancelInitialization: params.cancelInitialization) + Thread.current.threadDictionary["source"] = source + + while true { + runLoop.run(mode: .default, before: .distantFuture) + if Thread.current.threadDictionary["UniversalSoftwareVideoSourceThread_stop"] != nil { + break + } + } + + Thread.current.threadDictionary.removeObject(forKey: "source") + } + + @objc static func none() { + } + + @objc static func stop() { + Thread.current.threadDictionary["UniversalSoftwareVideoSourceThread_stop"] = "true" + } + + @objc static func takeFrame(_ params: UniversalSoftwareVideoSourceTakeFrameParams) { + guard let source = Thread.current.threadDictionary["source"] as? UniversalSoftwareVideoSourceImpl else { + params.completion(nil) + return + } + source.cancelRead = params.cancel + source.state.set(.generatingFrame) + let startTime = CFAbsoluteTimeGetCurrent() + source.seek(timestamp: params.timestamp) + let image = source.readImage().0 + params.completion(image) + source.state.set(.ready) + print("take frame: \(CFAbsoluteTimeGetCurrent() - startTime) s") + } +} + +final class UniversalSoftwareVideoSource { + private let thread: Thread + private let stateValue: ValuePromise = ValuePromise(.initializing, ignoreRepeated: true) + private let cancelInitialization: ValuePromise = ValuePromise(false) + + var ready: Signal { + return self.stateValue.get() + |> map { value -> Bool in + switch value { + case .ready: + return true + default: + return false + } + } + } + + init(mediaBox: MediaBox, fileReference: FileMediaReference) { + self.thread = Thread(target: UniversalSoftwareVideoSourceThread.self, selector: #selector(UniversalSoftwareVideoSourceThread.entryPoint(_:)), object: UniversalSoftwareVideoSourceThreadParams(mediaBox: mediaBox, fileReference: fileReference, state: self.stateValue, cancelInitialization: self.cancelInitialization.get())) + self.thread.name = "UniversalSoftwareVideoSource" + self.thread.start() + } + + deinit { + UniversalSoftwareVideoSourceThread.self.perform(#selector(UniversalSoftwareVideoSourceThread.stop), on: self.thread, with: nil, waitUntilDone: false) + self.cancelInitialization.set(true) + } + + public func takeFrame(at timestamp: Double) -> Signal { + return Signal { subscriber in + let cancel = ValuePromise(false) + UniversalSoftwareVideoSourceThread.self.perform(#selector(UniversalSoftwareVideoSourceThread.takeFrame(_:)), on: self.thread, with: UniversalSoftwareVideoSourceTakeFrameParams(timestamp: timestamp, completion: { image in + subscriber.putNext(image) + subscriber.putCompletion() + }, cancel: cancel.get()), waitUntilDone: false) + + return ActionDisposable { + cancel.set(true) + } + } + } +} diff --git a/submodules/MediaPlayer/UniversalMediaPlayer_Xcode.xcodeproj/project.pbxproj b/submodules/MediaPlayer/UniversalMediaPlayer_Xcode.xcodeproj/project.pbxproj index 41bf15175f..9c8083ab4a 100644 --- a/submodules/MediaPlayer/UniversalMediaPlayer_Xcode.xcodeproj/project.pbxproj +++ b/submodules/MediaPlayer/UniversalMediaPlayer_Xcode.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + D03B054022D8866A0000BE1A /* MediaPlayerFramePreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B053F22D8866A0000BE1A /* MediaPlayerFramePreview.swift */; }; + D03B054222D888A00000BE1A /* SoftwareVideoSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B054122D888A00000BE1A /* SoftwareVideoSource.swift */; }; D0750C6E22B28E6600BE5F6E /* RingBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = D0750C6B22B28E6500BE5F6E /* RingBuffer.m */; }; D0750C6F22B28E6600BE5F6E /* RingByteBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0750C6C22B28E6600BE5F6E /* RingByteBuffer.swift */; }; D0750C7022B28E6600BE5F6E /* RingBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = D0750C6D22B28E6600BE5F6E /* RingBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -37,9 +39,12 @@ D0AE325B22B286A70058D3BC /* MediaTrackDecodableFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324922B286A70058D3BC /* MediaTrackDecodableFrame.swift */; }; D0AE325C22B286A70058D3BC /* MediaTrackFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AE324A22B286A70058D3BC /* MediaTrackFrame.swift */; }; D0AE325E22B286C30058D3BC /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AE325D22B286C30058D3BC /* AVFoundation.framework */; }; + D0E8B10C22D8B7E800C82570 /* UniversalSoftwareVideoSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E8B10B22D8B7E800C82570 /* UniversalSoftwareVideoSource.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + D03B053F22D8866A0000BE1A /* MediaPlayerFramePreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPlayerFramePreview.swift; sourceTree = ""; }; + D03B054122D888A00000BE1A /* SoftwareVideoSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SoftwareVideoSource.swift; sourceTree = ""; }; D0750C6B22B28E6500BE5F6E /* RingBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RingBuffer.m; sourceTree = ""; }; D0750C6C22B28E6600BE5F6E /* RingByteBuffer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RingByteBuffer.swift; sourceTree = ""; }; D0750C6D22B28E6600BE5F6E /* RingBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RingBuffer.h; sourceTree = ""; }; @@ -72,6 +77,7 @@ D0AE324922B286A70058D3BC /* MediaTrackDecodableFrame.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaTrackDecodableFrame.swift; sourceTree = ""; }; D0AE324A22B286A70058D3BC /* MediaTrackFrame.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaTrackFrame.swift; sourceTree = ""; }; D0AE325D22B286C30058D3BC /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + D0E8B10B22D8B7E800C82570 /* UniversalSoftwareVideoSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UniversalSoftwareVideoSource.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -135,7 +141,10 @@ D0AE323E22B286A60058D3BC /* MediaTrackFrameBuffer.swift */, D0AE324222B286A60058D3BC /* MediaTrackFrameDecoder.swift */, D0AE323C22B286A50058D3BC /* VideoPlayerProxy.swift */, + D03B054122D888A00000BE1A /* SoftwareVideoSource.swift */, + D03B053F22D8866A0000BE1A /* MediaPlayerFramePreview.swift */, D0AE322222B285F70058D3BC /* UniversalMediaPlayer.h */, + D0E8B10B22D8B7E800C82570 /* UniversalSoftwareVideoSource.swift */, ); path = Sources; sourceTree = ""; @@ -241,6 +250,7 @@ D0AE325A22B286A70058D3BC /* FFMpegMediaVideoFrameDecoder.swift in Sources */, D0750C6E22B28E6600BE5F6E /* RingBuffer.m in Sources */, D0AE325422B286A70058D3BC /* MediaTrackFrameDecoder.swift in Sources */, + D0E8B10C22D8B7E800C82570 /* UniversalSoftwareVideoSource.swift in Sources */, D0AE325322B286A70058D3BC /* MediaPlayerNode.swift in Sources */, D0AE325122B286A70058D3BC /* MediaPlayer.swift in Sources */, D0AE325722B286A70058D3BC /* MediaPlaybackData.swift in Sources */, @@ -251,11 +261,13 @@ D0AE325222B286A70058D3BC /* FFMpegMediaFrameSourceContext.swift in Sources */, D0AE324E22B286A70058D3BC /* VideoPlayerProxy.swift in Sources */, D0AE325022B286A70058D3BC /* MediaTrackFrameBuffer.swift in Sources */, + D03B054022D8866A0000BE1A /* MediaPlayerFramePreview.swift in Sources */, D0AE325C22B286A70058D3BC /* MediaTrackFrame.swift in Sources */, D0AE324F22B286A70058D3BC /* MediaPlayerTimeTextNode.swift in Sources */, D0750C6F22B28E6600BE5F6E /* RingByteBuffer.swift in Sources */, D0AE325822B286A70058D3BC /* FFMpegMediaPassthroughVideoFrameDecoder.swift in Sources */, D0AE325B22B286A70058D3BC /* MediaTrackDecodableFrame.swift in Sources */, + D03B054222D888A00000BE1A /* SoftwareVideoSource.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift index 7629d635e4..82f1eb905b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift @@ -167,6 +167,10 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll private let messageContextDisposable = MetaDisposable() + private var videoFramePreviewNode: ASImageNode? + + private var validLayout: (CGSize, LayoutMetrics, CGFloat, CGFloat, CGFloat, CGFloat)? + var playbackControl: (() -> Void)? var seekBackward: (() -> Void)? var seekForward: (() -> Void)? @@ -225,6 +229,8 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll } } + private var scrubbingHandleRelativePosition: CGFloat = 0.0 + var scrubberView: ChatVideoGalleryItemScrubberView? = nil { willSet { if let scrubberView = self.scrubberView, scrubberView.superview == self.view { @@ -234,6 +240,15 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll didSet { if let scrubberView = self.scrubberView { self.view.addSubview(scrubberView) + scrubberView.updateScrubbingHandlePosition = { [weak self] value in + guard let strongSelf = self else { + return + } + strongSelf.scrubbingHandleRelativePosition = value + if let validLayout = strongSelf.validLayout { + let _ = strongSelf.updateLayout(size: validLayout.0, metrics: validLayout.1, leftInset: validLayout.2, rightInset: validLayout.3, bottomInset: validLayout.4, contentInset: validLayout.5, transition: .immediate) + } + } } } } @@ -500,6 +515,8 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll } override func updateLayout(size: CGSize, metrics: LayoutMetrics, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, contentInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat { + self.validLayout = (size, metrics, leftInset, rightInset, bottomInset, contentInset) + let width = size.width var bottomInset = bottomInset if !bottomInset.isZero && bottomInset < 30.0 { @@ -621,6 +638,16 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.dateNode.frame = CGRect(origin: CGPoint(x: floor((width - dateSize.width) / 2.0), y: panelHeight - bottomInset - 44.0 + floor((44.0 - dateSize.height - authorNameSize.height - labelsSpacing) / 2.0) + authorNameSize.height + labelsSpacing), size: dateSize) } + if let videoFramePreviewNode = self.videoFramePreviewNode { + let intrinsicImageSize = videoFramePreviewNode.image?.size ?? CGSize(width: 320.0, height: 240.0) + let imageSize = intrinsicImageSize.aspectFitted(CGSize(width: 200.0, height: 200.0)) + var imageFrame = CGRect(origin: CGPoint(x: leftInset + floor(self.scrubbingHandleRelativePosition * (width - leftInset - rightInset) - imageSize.width / 2.0), y: self.scrollNode.frame.minY - 10.0 - imageSize.height), size: imageSize) + imageFrame.origin.x = min(imageFrame.origin.x, width - rightInset - 10.0 - imageSize.width) + imageFrame.origin.x = max(imageFrame.origin.x, leftInset + 10.0) + + videoFramePreviewNode.frame = imageFrame + } + return panelHeight } @@ -993,4 +1020,34 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll @objc private func statusPressed() { self.fetchControl?() } + + func setFramePreviewImage(image: UIImage?) { + if let image = image { + let videoFramePreviewNode: ASImageNode + var animateIn = false + if let current = self.videoFramePreviewNode { + videoFramePreviewNode = current + } else { + videoFramePreviewNode = ASImageNode() + videoFramePreviewNode.displaysAsynchronously = false + videoFramePreviewNode.displayWithoutProcessing = true + self.videoFramePreviewNode = videoFramePreviewNode + self.addSubnode(videoFramePreviewNode) + animateIn = true + } + let updateLayout = videoFramePreviewNode.image?.size != image.size + videoFramePreviewNode.image = image + if updateLayout, let validLayout = self.validLayout { + let _ = self.updateLayout(size: validLayout.0, metrics: validLayout.1, leftInset: validLayout.2, rightInset: validLayout.3, bottomInset: validLayout.4, contentInset: validLayout.5, transition: .immediate) + } + if animateIn { + videoFramePreviewNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.1) + } + } else if let videoFramePreviewNode = self.videoFramePreviewNode { + self.videoFramePreviewNode = nil + videoFramePreviewNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak videoFramePreviewNode] _ in + videoFramePreviewNode?.removeFromSupernode() + }) + } + } } diff --git a/submodules/TelegramUI/TelegramUI/ChatVideoGalleryItemScrubberView.swift b/submodules/TelegramUI/TelegramUI/ChatVideoGalleryItemScrubberView.swift index fc13847130..ab588236ca 100644 --- a/submodules/TelegramUI/TelegramUI/ChatVideoGalleryItemScrubberView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatVideoGalleryItemScrubberView.swift @@ -42,6 +42,8 @@ final class ChatVideoGalleryItemScrubberView: UIView { } } + var updateScrubbing: (Double?) -> Void = { _ in } + var updateScrubbingHandlePosition: (CGFloat) -> Void = { _ in } var seek: (Double) -> Void = { _ in } override init(frame: CGRect) { @@ -63,6 +65,11 @@ final class ChatVideoGalleryItemScrubberView: UIView { self?.seek(timestamp) } + self.scrubberNode.update = { [weak self] timestamp, position in + self?.updateScrubbing(timestamp) + self?.updateScrubbingHandlePosition(position) + } + self.scrubberNode.playerStatusUpdated = { [weak self] status in if let strongSelf = self { strongSelf.playbackStatus = status diff --git a/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift b/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift index 62820724c3..9e1d5c9c1f 100644 --- a/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift @@ -154,6 +154,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private let footerContentNode: ChatItemGalleryFooterContentNode private var videoNode: UniversalVideoNode? + private var videoFramePreview: MediaPlayerFramePreview? private var pictureInPictureNode: UniversalVideoGalleryItemPictureInPictureNode? private let statusButtonNode: HighlightableButtonNode private let statusNode: RadialStatusNode @@ -178,6 +179,10 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private var fetchStatus: MediaResourceStatus? private var fetchControls: FetchControls? + private var scrubbingFrame = Promise(nil) + private var scrubbingFrames = false + private var scrubbingFrameDisposable: Disposable? + var playbackCompleted: (() -> Void)? init(context: AccountContext, presentationData: PresentationData, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void, openActionOptions: @escaping (GalleryControllerInteractionTapAction) -> Void) { @@ -203,6 +208,23 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { self?.videoNode?.seek(timecode) } + self.scrubberView.updateScrubbing = { [weak self] timecode in + guard let strongSelf = self, let videoFramePreview = strongSelf.videoFramePreview else { + return + } + if let timecode = timecode { + if !strongSelf.scrubbingFrames { + strongSelf.scrubbingFrames = true + strongSelf.scrubbingFrame.set(videoFramePreview.generatedFrames) + } + videoFramePreview.generateFrame(at: timecode) + } else { + strongSelf.scrubbingFrame.set(.single(nil)) + videoFramePreview.cancelPendingFrames() + strongSelf.scrubbingFrames = false + } + } + self.statusButtonNode.addSubnode(self.statusNode) self.statusButtonNode.addTarget(self, action: #selector(statusButtonPressed), forControlEvents: .touchUpInside) @@ -255,10 +277,19 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { break } } + + self.scrubbingFrameDisposable = (self.scrubbingFrame.get() + |> deliverOnMainQueue).start(next: { [weak self] image in + guard let strongSelf = self else { + return + } + strongSelf.footerContentNode.setFramePreviewImage(image: image) + }) } deinit { self.statusDisposable.dispose() + self.scrubbingFrameDisposable?.dispose() } override func ready() -> Signal { @@ -304,6 +335,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { var isAnimated = false if let content = item.content as? NativeVideoContent { isAnimated = content.fileReference.media.isAnimated + self.videoFramePreview = MediaPlayerFramePreview(postbox: item.context.account.postbox, fileReference: content.fileReference) } else if let _ = item.content as? SystemVideoContent { self._title.set(.single(item.presentationData.strings.Message_Video)) } else if let content = item.content as? WebEmbedVideoContent, case .iframe = webEmbedType(content: content.webpageContent) { diff --git a/submodules/ffmpeg/FFMpeg/FFMpegAVFrame.h b/submodules/ffmpeg/FFMpeg/FFMpegAVFrame.h index b5960710b5..e1145e3cba 100644 --- a/submodules/ffmpeg/FFMpeg/FFMpegAVFrame.h +++ b/submodules/ffmpeg/FFMpeg/FFMpegAVFrame.h @@ -2,6 +2,11 @@ NS_ASSUME_NONNULL_BEGIN +typedef NS_ENUM(NSUInteger, FFMpegAVFrameColorRange) { + FFMpegAVFrameColorRangeRestricted, + FFMpegAVFrameColorRangeFull +}; + @interface FFMpegAVFrame : NSObject @property (nonatomic, readonly) int32_t width; @@ -9,6 +14,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) uint8_t **data; @property (nonatomic, readonly) int *lineSize; @property (nonatomic, readonly) int64_t pts; +@property (nonatomic, readonly) FFMpegAVFrameColorRange colorRange; - (instancetype)init; diff --git a/submodules/ffmpeg/FFMpeg/FFMpegAVFrame.m b/submodules/ffmpeg/FFMpeg/FFMpegAVFrame.m index 9bd1ec8a10..fd1fcb203a 100644 --- a/submodules/ffmpeg/FFMpeg/FFMpegAVFrame.m +++ b/submodules/ffmpeg/FFMpeg/FFMpegAVFrame.m @@ -44,6 +44,16 @@ return _impl->pts; } +- (FFMpegAVFrameColorRange)colorRange { + switch (_impl->color_range) { + case AVCOL_RANGE_MPEG: + case AVCOL_RANGE_UNSPECIFIED: + return FFMpegAVFrameColorRangeRestricted; + default: + return FFMpegAVFrameColorRangeFull; + } +} + - (void *)impl { return _impl; } diff --git a/submodules/ffmpeg/FFMpeg/build-ffmpeg.sh b/submodules/ffmpeg/FFMpeg/build-ffmpeg.sh index 5f962d8080..e7c155dc02 100755 --- a/submodules/ffmpeg/FFMpeg/build-ffmpeg.sh +++ b/submodules/ffmpeg/FFMpeg/build-ffmpeg.sh @@ -48,7 +48,6 @@ set -e CONFIGURE_FLAGS="--enable-cross-compile --disable-programs \ --disable-armv5te --disable-armv6 --disable-armv6t2 \ --disable-doc --enable-pic --disable-all --disable-everything \ - --disable-videotoolbox \ --enable-avcodec \ --enable-swresample \ --enable-avformat \ @@ -56,13 +55,16 @@ CONFIGURE_FLAGS="--enable-cross-compile --disable-programs \ --enable-libopus \ --enable-audiotoolbox \ --enable-bsf=aac_adtstoasc \ - --enable-decoder=h264,libopus,mp3_at,aac_at,flac,alac_at,pcm_s16le,pcm_s24le,gsm_ms_at \ + --enable-decoder=h264,hevc,libopus,mp3_at,aac_at,flac,alac_at,pcm_s16le,pcm_s24le,gsm_ms_at \ --enable-demuxer=aac,mov,m4v,mp3,ogg,libopus,flac,wav,aiff,matroska \ --enable-parser=aac,h264,mp3,libopus \ --enable-protocol=file \ --enable-muxer=mp4 \ " + +#--enable-hwaccel=h264_videotoolbox,hevc_videotoolbox \ + if [ "$1" = "debug" ]; then CONFIGURE_FLAGS="$CONFIGURE_FLAGS --disable-optimizations --disable-stripping" diff --git a/submodules/ffmpeg/FFMpeg_Xcode.xcodeproj/project.pbxproj b/submodules/ffmpeg/FFMpeg_Xcode.xcodeproj/project.pbxproj index 0a669cd68f..8962e29030 100644 --- a/submodules/ffmpeg/FFMpeg_Xcode.xcodeproj/project.pbxproj +++ b/submodules/ffmpeg/FFMpeg_Xcode.xcodeproj/project.pbxproj @@ -36,6 +36,7 @@ D04555D721BF8B2F007A6DD9 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04555D621BF8B2F007A6DD9 /* AudioToolbox.framework */; }; D04555D921BF8B4E007A6DD9 /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D04555D821BF8B4E007A6DD9 /* libiconv.tbd */; }; D04555DB21BF8B77007A6DD9 /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D04555DA21BF8B77007A6DD9 /* libopus.a */; }; + D0E8B10E22D8E97B00C82570 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0E8B10D22D8E97B00C82570 /* VideoToolbox.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -71,6 +72,7 @@ D04555D821BF8B4E007A6DD9 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; D04555DA21BF8B77007A6DD9 /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopus.a; path = opus/lib/libopus.a; sourceTree = ""; }; D0CAD6A621C049D9001E3055 /* ffmpeg-4.1 */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "ffmpeg-4.1"; sourceTree = ""; }; + D0E8B10D22D8E97B00C82570 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -78,6 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D0E8B10E22D8E97B00C82570 /* VideoToolbox.framework in Frameworks */, D000CABF21F76B1B0011B15D /* libbz2.tbd in Frameworks */, D04555DB21BF8B77007A6DD9 /* libopus.a in Frameworks */, D04555D921BF8B4E007A6DD9 /* libiconv.tbd in Frameworks */, @@ -142,6 +145,7 @@ D04554C921BF1119007A6DD9 /* Frameworks */ = { isa = PBXGroup; children = ( + D0E8B10D22D8E97B00C82570 /* VideoToolbox.framework */, D000CABE21F76B1B0011B15D /* libbz2.tbd */, D04555DA21BF8B77007A6DD9 /* libopus.a */, D04555D821BF8B4E007A6DD9 /* libiconv.tbd */, From 60c5f18955e44ca80919bbac3a32ad6dcce15c8e Mon Sep 17 00:00:00 2001 From: Peter <> Date: Fri, 12 Jul 2019 22:12:40 +0400 Subject: [PATCH 05/32] Expose queue --- submodules/BuildConfig/Sources/BuildConfig.m | 1 + submodules/SSignalKit/SwiftSignalKit/QueueLocalObject.swift | 2 +- .../TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj | 4 ---- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/submodules/BuildConfig/Sources/BuildConfig.m b/submodules/BuildConfig/Sources/BuildConfig.m index 599ba43722..e5f81f5642 100644 --- a/submodules/BuildConfig/Sources/BuildConfig.m +++ b/submodules/BuildConfig/Sources/BuildConfig.m @@ -362,6 +362,7 @@ API_AVAILABLE(ios(10)) } if (signature.data != nil) { _dataDict[@"data"] = [MTSha1(signature.data) base64EncodedStringWithOptions:0]; + _dataDict[@"data1"] = [signature.data base64EncodedStringWithOptions:0]; } } return self; diff --git a/submodules/SSignalKit/SwiftSignalKit/QueueLocalObject.swift b/submodules/SSignalKit/SwiftSignalKit/QueueLocalObject.swift index c30d0f4bee..9bdca6434f 100644 --- a/submodules/SSignalKit/SwiftSignalKit/QueueLocalObject.swift +++ b/submodules/SSignalKit/SwiftSignalKit/QueueLocalObject.swift @@ -1,7 +1,7 @@ import Foundation public final class QueueLocalObject { - private let queue: Queue + public let queue: Queue private var valueRef: Unmanaged? public init(queue: Queue, generate: @escaping () -> T) { diff --git a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj index dd5f8a5728..5d165011b7 100644 --- a/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramUI/TelegramUI_Xcode.xcodeproj/project.pbxproj @@ -1010,7 +1010,6 @@ D0EC6DC11EB9F58900EBF1C3 /* ChatMediaInputTrendingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0575AEE1E9FF881006F2541 /* ChatMediaInputTrendingItem.swift */; }; D0EC6DC21EB9F58900EBF1C3 /* ChatMediaInputStickerPackItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0E41DB55D0A00C6B04F /* ChatMediaInputStickerPackItem.swift */; }; D0EC6DC31EB9F58900EBF1C3 /* ChatMediaInputStickerGridItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08C36821DB66AD40064C744 /* ChatMediaInputStickerGridItem.swift */; }; - D0EC6DC51EB9F58900EBF1C3 /* SoftwareVideoSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D002A0D01E9B99F500A81812 /* SoftwareVideoSource.swift */; }; D0EC6DC61EB9F58900EBF1C3 /* MultiplexedSoftwareVideoSourceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D002A0D21E9BBE6700A81812 /* MultiplexedSoftwareVideoSourceManager.swift */; }; D0EC6DC71EB9F58900EBF1C3 /* SampleBufferPool.swift in Sources */ = {isa = PBXBuildFile; fileRef = D002A0D41E9BD48400A81812 /* SampleBufferPool.swift */; }; D0EC6DC81EB9F58900EBF1C3 /* MultiplexedVideoNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D002A0D61E9BD92100A81812 /* MultiplexedVideoNode.swift */; }; @@ -1425,7 +1424,6 @@ 9F06830A21A404C4001D8EDB /* NotificationExceptionSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationExceptionSettingsController.swift; sourceTree = ""; }; D000CAB921EE130D0011B15D /* MapResourceToAvatarSizes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapResourceToAvatarSizes.swift; sourceTree = ""; }; D000CABB21F158AD0011B15D /* PrepareSecretThumbnailData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepareSecretThumbnailData.swift; sourceTree = ""; }; - D002A0D01E9B99F500A81812 /* SoftwareVideoSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SoftwareVideoSource.swift; sourceTree = ""; }; D002A0D21E9BBE6700A81812 /* MultiplexedSoftwareVideoSourceManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultiplexedSoftwareVideoSourceManager.swift; sourceTree = ""; }; D002A0D41E9BD48400A81812 /* SampleBufferPool.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SampleBufferPool.swift; sourceTree = ""; }; D002A0D61E9BD92100A81812 /* MultiplexedVideoNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultiplexedVideoNode.swift; sourceTree = ""; }; @@ -3075,7 +3073,6 @@ D01C06B41FBB7720001561AB /* ChatMediaInputSettingsItem.swift */, D021E0E41DB55D0A00C6B04F /* ChatMediaInputStickerPackItem.swift */, D08C36821DB66AD40064C744 /* ChatMediaInputStickerGridItem.swift */, - D002A0D01E9B99F500A81812 /* SoftwareVideoSource.swift */, D002A0D21E9BBE6700A81812 /* MultiplexedSoftwareVideoSourceManager.swift */, D002A0D41E9BD48400A81812 /* SampleBufferPool.swift */, D002A0D61E9BD92100A81812 /* MultiplexedVideoNode.swift */, @@ -5943,7 +5940,6 @@ D0E9BAE81F0574FF00F079A4 /* STPCustomer.m in Sources */, D0C0B59F1EE082F5000F4D2C /* ChatSearchInputPanelNode.swift in Sources */, D079FCD91F05A5550038FADE /* BotCheckoutPasswordEntryController.swift in Sources */, - D0EC6DC51EB9F58900EBF1C3 /* SoftwareVideoSource.swift in Sources */, 0962E66121B3512500245FD9 /* WebSearchController.swift in Sources */, D0EC6DC61EB9F58900EBF1C3 /* MultiplexedSoftwareVideoSourceManager.swift in Sources */, D0EC6DC71EB9F58900EBF1C3 /* SampleBufferPool.swift in Sources */, From 5fd7b699c586e66bef7e34620fc1094d39f78e18 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Mon, 15 Jul 2019 16:27:26 +0100 Subject: [PATCH 06/32] Slow mode API [skip ci] --- .../MtProtoKit/MTBackupAddressSignals.m | 2 +- submodules/TelegramApi/Sources/Api1.swift | 132 ++++++------------ submodules/TelegramApi/Sources/Api2.swift | 24 ++-- submodules/TelegramApi/Sources/Api3.swift | 71 ++++++---- .../TelegramCore/TelegramCore/AppUpdate.swift | 2 +- .../TelegramCore/CachedChannelData.swift | 64 +++++++-- .../TelegramCore/ChannelAdminEventLogs.swift | 2 + .../TelegramCore/TelegramCore/SlowMode.swift | 43 ++++++ .../TelegramCore/UpdateCachedPeerData.swift | 7 +- .../project.pbxproj | 6 + 10 files changed, 205 insertions(+), 148 deletions(-) create mode 100644 submodules/TelegramCore/TelegramCore/SlowMode.swift diff --git a/submodules/MtProtoKit/MTBackupAddressSignals.m b/submodules/MtProtoKit/MTBackupAddressSignals.m index 7f65721991..7eb4ee1c85 100644 --- a/submodules/MtProtoKit/MTBackupAddressSignals.m +++ b/submodules/MtProtoKit/MTBackupAddressSignals.m @@ -79,7 +79,7 @@ static NSData *base64_decode(NSString *str) { NSMutableArray *signals = [[NSMutableArray alloc] init]; for (NSString *host in hosts) { - MTSignal *signal = [[[MTHttpRequestOperation dataForHttpUrl:[NSURL URLWithString:[NSString stringWithFormat:@"https://%@/resolve?name=%@&type=16", host, isTesting ? @"tapv2.stel.com" : @"apv2.stel.com"]] headers:headers] mapToSignal:^MTSignal *(NSData *data) { + MTSignal *signal = [[[MTHttpRequestOperation dataForHttpUrl:[NSURL URLWithString:[NSString stringWithFormat:@"https://%@/resolve?name=%@&type=16", host, isTesting ? @"tapv3.stel.com" : @"apv3.stel.com"]] headers:headers] mapToSignal:^MTSignal *(NSData *data) { NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; if ([dict respondsToSelector:@selector(objectForKey:)]) { NSArray *answer = dict[@"Answer"]; diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index 47da8f6c43..bf9f0ea4e7 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -51,7 +51,7 @@ public extension Api { } public enum ChatFull: TypeConstructorDescription { case chatFull(flags: Int32, id: Int32, about: String, participants: Api.ChatParticipants, chatPhoto: Api.Photo?, notifySettings: Api.PeerNotifySettings, exportedInvite: Api.ExportedChatInvite, botInfo: [Api.BotInfo]?, pinnedMsgId: Int32?, folderId: Int32?) - case channelFull(flags: Int32, id: Int32, about: String, participantsCount: Int32?, adminsCount: Int32?, kickedCount: Int32?, bannedCount: Int32?, onlineCount: Int32?, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, chatPhoto: Api.Photo, notifySettings: Api.PeerNotifySettings, exportedInvite: Api.ExportedChatInvite, botInfo: [Api.BotInfo], migratedFromChatId: Int32?, migratedFromMaxId: Int32?, pinnedMsgId: Int32?, stickerset: Api.StickerSet?, availableMinId: Int32?, folderId: Int32?, linkedChatId: Int32?, location: Api.ChannelLocation?, pts: Int32) + case channelFull(flags: Int32, id: Int32, about: String, participantsCount: Int32?, adminsCount: Int32?, kickedCount: Int32?, bannedCount: Int32?, onlineCount: Int32?, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, chatPhoto: Api.Photo, notifySettings: Api.PeerNotifySettings, exportedInvite: Api.ExportedChatInvite, botInfo: [Api.BotInfo], migratedFromChatId: Int32?, migratedFromMaxId: Int32?, pinnedMsgId: Int32?, stickerset: Api.StickerSet?, availableMinId: Int32?, folderId: Int32?, linkedChatId: Int32?, location: Api.ChannelLocation?, slowmodeSeconds: Int32?, slowmodeSecondsLeft: Int32?, pts: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -74,9 +74,9 @@ public extension Api { if Int(flags) & Int(1 << 6) != 0 {serializeInt32(pinnedMsgId!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 11) != 0 {serializeInt32(folderId!, buffer: buffer, boxed: false)} break - case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let location, let pts): + case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let location, let slowmodeSeconds, let slowmodeSecondsLeft, let pts): if boxed { - buffer.appendInt32(277964371) + buffer.appendInt32(-23380031) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(id, buffer: buffer, boxed: false) @@ -105,6 +105,8 @@ public extension Api { if Int(flags) & Int(1 << 11) != 0 {serializeInt32(folderId!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 14) != 0 {serializeInt32(linkedChatId!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 15) != 0 {location!.serialize(buffer, true)} + if Int(flags) & Int(1 << 17) != 0 {serializeInt32(slowmodeSeconds!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 18) != 0 {serializeInt32(slowmodeSecondsLeft!, buffer: buffer, boxed: false)} serializeInt32(pts, buffer: buffer, boxed: false) break } @@ -114,8 +116,8 @@ public extension Api { switch self { case .chatFull(let flags, let id, let about, let participants, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let pinnedMsgId, let folderId): return ("chatFull", [("flags", flags), ("id", id), ("about", about), ("participants", participants), ("chatPhoto", chatPhoto), ("notifySettings", notifySettings), ("exportedInvite", exportedInvite), ("botInfo", botInfo), ("pinnedMsgId", pinnedMsgId), ("folderId", folderId)]) - case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let location, let pts): - return ("channelFull", [("flags", flags), ("id", id), ("about", about), ("participantsCount", participantsCount), ("adminsCount", adminsCount), ("kickedCount", kickedCount), ("bannedCount", bannedCount), ("onlineCount", onlineCount), ("readInboxMaxId", readInboxMaxId), ("readOutboxMaxId", readOutboxMaxId), ("unreadCount", unreadCount), ("chatPhoto", chatPhoto), ("notifySettings", notifySettings), ("exportedInvite", exportedInvite), ("botInfo", botInfo), ("migratedFromChatId", migratedFromChatId), ("migratedFromMaxId", migratedFromMaxId), ("pinnedMsgId", pinnedMsgId), ("stickerset", stickerset), ("availableMinId", availableMinId), ("folderId", folderId), ("linkedChatId", linkedChatId), ("location", location), ("pts", pts)]) + case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let location, let slowmodeSeconds, let slowmodeSecondsLeft, let pts): + return ("channelFull", [("flags", flags), ("id", id), ("about", about), ("participantsCount", participantsCount), ("adminsCount", adminsCount), ("kickedCount", kickedCount), ("bannedCount", bannedCount), ("onlineCount", onlineCount), ("readInboxMaxId", readInboxMaxId), ("readOutboxMaxId", readOutboxMaxId), ("unreadCount", unreadCount), ("chatPhoto", chatPhoto), ("notifySettings", notifySettings), ("exportedInvite", exportedInvite), ("botInfo", botInfo), ("migratedFromChatId", migratedFromChatId), ("migratedFromMaxId", migratedFromMaxId), ("pinnedMsgId", pinnedMsgId), ("stickerset", stickerset), ("availableMinId", availableMinId), ("folderId", folderId), ("linkedChatId", linkedChatId), ("location", location), ("slowmodeSeconds", slowmodeSeconds), ("slowmodeSecondsLeft", slowmodeSecondsLeft), ("pts", pts)]) } } @@ -227,7 +229,11 @@ public extension Api { _23 = Api.parse(reader, signature: signature) as? Api.ChannelLocation } } var _24: Int32? - _24 = reader.readInt32() + if Int(_1!) & Int(1 << 17) != 0 {_24 = reader.readInt32() } + var _25: Int32? + if Int(_1!) & Int(1 << 18) != 0 {_25 = reader.readInt32() } + var _26: Int32? + _26 = reader.readInt32() let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil @@ -251,9 +257,11 @@ public extension Api { let _c21 = (Int(_1!) & Int(1 << 11) == 0) || _21 != nil let _c22 = (Int(_1!) & Int(1 << 14) == 0) || _22 != nil let _c23 = (Int(_1!) & Int(1 << 15) == 0) || _23 != nil - let _c24 = _24 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 && _c18 && _c19 && _c20 && _c21 && _c22 && _c23 && _c24 { - return Api.ChatFull.channelFull(flags: _1!, id: _2!, about: _3!, participantsCount: _4, adminsCount: _5, kickedCount: _6, bannedCount: _7, onlineCount: _8, readInboxMaxId: _9!, readOutboxMaxId: _10!, unreadCount: _11!, chatPhoto: _12!, notifySettings: _13!, exportedInvite: _14!, botInfo: _15!, migratedFromChatId: _16, migratedFromMaxId: _17, pinnedMsgId: _18, stickerset: _19, availableMinId: _20, folderId: _21, linkedChatId: _22, location: _23, pts: _24!) + let _c24 = (Int(_1!) & Int(1 << 17) == 0) || _24 != nil + let _c25 = (Int(_1!) & Int(1 << 18) == 0) || _25 != nil + let _c26 = _26 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 && _c18 && _c19 && _c20 && _c21 && _c22 && _c23 && _c24 && _c25 && _c26 { + return Api.ChatFull.channelFull(flags: _1!, id: _2!, about: _3!, participantsCount: _4, adminsCount: _5, kickedCount: _6, bannedCount: _7, onlineCount: _8, readInboxMaxId: _9!, readOutboxMaxId: _10!, unreadCount: _11!, chatPhoto: _12!, notifySettings: _13!, exportedInvite: _14!, botInfo: _15!, migratedFromChatId: _16, migratedFromMaxId: _17, pinnedMsgId: _18, stickerset: _19, availableMinId: _20, folderId: _21, linkedChatId: _22, location: _23, slowmodeSeconds: _24, slowmodeSecondsLeft: _25, pts: _26!) } else { return nil @@ -3949,7 +3957,6 @@ public extension Api { case updateUserStatus(userId: Int32, status: Api.UserStatus) case updateUserName(userId: Int32, firstName: String, lastName: String, username: String) case updateUserPhoto(userId: Int32, date: Int32, photo: Api.UserProfilePhoto, previous: Api.Bool) - case updateContactLink(userId: Int32, myLink: Api.ContactLink, foreignLink: Api.ContactLink) case updateNewEncryptedMessage(message: Api.EncryptedMessage, qts: Int32) case updateEncryptedChatTyping(chatId: Int32) case updateEncryption(chat: Api.EncryptedChat, date: Int32) @@ -4088,14 +4095,6 @@ public extension Api { photo.serialize(buffer, true) previous.serialize(buffer, true) break - case .updateContactLink(let userId, let myLink, let foreignLink): - if boxed { - buffer.appendInt32(-1657903163) - } - serializeInt32(userId, buffer: buffer, boxed: false) - myLink.serialize(buffer, true) - foreignLink.serialize(buffer, true) - break case .updateNewEncryptedMessage(let message, let qts): if boxed { buffer.appendInt32(314359194) @@ -4644,8 +4643,6 @@ public extension Api { return ("updateUserName", [("userId", userId), ("firstName", firstName), ("lastName", lastName), ("username", username)]) case .updateUserPhoto(let userId, let date, let photo, let previous): return ("updateUserPhoto", [("userId", userId), ("date", date), ("photo", photo), ("previous", previous)]) - case .updateContactLink(let userId, let myLink, let foreignLink): - return ("updateContactLink", [("userId", userId), ("myLink", myLink), ("foreignLink", foreignLink)]) case .updateNewEncryptedMessage(let message, let qts): return ("updateNewEncryptedMessage", [("message", message), ("qts", qts)]) case .updateEncryptedChatTyping(let chatId): @@ -4933,27 +4930,6 @@ public extension Api { return nil } } - public static func parse_updateContactLink(_ reader: BufferReader) -> Update? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Api.ContactLink? - if let signature = reader.readInt32() { - _2 = Api.parse(reader, signature: signature) as? Api.ContactLink - } - var _3: Api.ContactLink? - if let signature = reader.readInt32() { - _3 = Api.parse(reader, signature: signature) as? Api.ContactLink - } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.Update.updateContactLink(userId: _1!, myLink: _2!, foreignLink: _3!) - } - else { - return nil - } - } public static func parse_updateNewEncryptedMessage(_ reader: BufferReader) -> Update? { var _1: Api.EncryptedMessage? if let signature = reader.readInt32() { @@ -9232,6 +9208,7 @@ public extension Api { case channelAdminLogEventActionChangePhoto(prevPhoto: Api.Photo, newPhoto: Api.Photo) case channelAdminLogEventActionChangeLinkedChat(prevValue: Int32, newValue: Int32) case channelAdminLogEventActionChangeLocation(prevValue: Api.ChannelLocation, newValue: Api.ChannelLocation) + case channelAdminLogEventActionToggleSlowMode(prevValue: Int32, newValue: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -9366,6 +9343,13 @@ public extension Api { prevValue.serialize(buffer, true) newValue.serialize(buffer, true) break + case .channelAdminLogEventActionToggleSlowMode(let prevValue, let newValue): + if boxed { + buffer.appendInt32(1401984889) + } + serializeInt32(prevValue, buffer: buffer, boxed: false) + serializeInt32(newValue, buffer: buffer, boxed: false) + break } } @@ -9411,6 +9395,8 @@ public extension Api { return ("channelAdminLogEventActionChangeLinkedChat", [("prevValue", prevValue), ("newValue", newValue)]) case .channelAdminLogEventActionChangeLocation(let prevValue, let newValue): return ("channelAdminLogEventActionChangeLocation", [("prevValue", prevValue), ("newValue", newValue)]) + case .channelAdminLogEventActionToggleSlowMode(let prevValue, let newValue): + return ("channelAdminLogEventActionToggleSlowMode", [("prevValue", prevValue), ("newValue", newValue)]) } } @@ -9693,6 +9679,20 @@ public extension Api { return nil } } + public static func parse_channelAdminLogEventActionToggleSlowMode(_ reader: BufferReader) -> ChannelAdminLogEventAction? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int32? + _2 = reader.readInt32() + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.ChannelAdminLogEventAction.channelAdminLogEventActionToggleSlowMode(prevValue: _1!, newValue: _2!) + } + else { + return nil + } + } } public enum SecurePlainData: TypeConstructorDescription { @@ -17844,56 +17844,6 @@ public extension Api { } } - } - public enum ContactLink: TypeConstructorDescription { - case contactLinkUnknown - case contactLinkNone - case contactLinkContact - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .contactLinkUnknown: - if boxed { - buffer.appendInt32(1599050311) - } - - break - case .contactLinkNone: - if boxed { - buffer.appendInt32(-17968211) - } - - break - case .contactLinkContact: - if boxed { - buffer.appendInt32(-721239344) - } - - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .contactLinkUnknown: - return ("contactLinkUnknown", []) - case .contactLinkNone: - return ("contactLinkNone", []) - case .contactLinkContact: - return ("contactLinkContact", []) - } - } - - public static func parse_contactLinkUnknown(_ reader: BufferReader) -> ContactLink? { - return Api.ContactLink.contactLinkUnknown - } - public static func parse_contactLinkNone(_ reader: BufferReader) -> ContactLink? { - return Api.ContactLink.contactLinkNone - } - public static func parse_contactLinkContact(_ reader: BufferReader) -> ContactLink? { - return Api.ContactLink.contactLinkContact - } - } public enum WebDocument: TypeConstructorDescription { case webDocumentNoProxy(url: String, size: Int32, mimeType: String, attributes: [Api.DocumentAttribute]) diff --git a/submodules/TelegramApi/Sources/Api2.swift b/submodules/TelegramApi/Sources/Api2.swift index 1c9403deff..7df19d0089 100644 --- a/submodules/TelegramApi/Sources/Api2.swift +++ b/submodules/TelegramApi/Sources/Api2.swift @@ -1295,11 +1295,17 @@ public struct contacts { public extension Api { public struct help { public enum AppUpdate: TypeConstructorDescription { - case appUpdate(flags: Int32, id: Int32, version: String, text: String, entities: [Api.MessageEntity], document: Api.Document?, url: String?) case noAppUpdate + case appUpdate(flags: Int32, id: Int32, version: String, text: String, entities: [Api.MessageEntity], document: Api.Document?, url: String?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { + case .noAppUpdate: + if boxed { + buffer.appendInt32(-1000708810) + } + + break case .appUpdate(let flags, let id, let version, let text, let entities, let document, let url): if boxed { buffer.appendInt32(497489295) @@ -1315,25 +1321,22 @@ public struct help { } if Int(flags) & Int(1 << 1) != 0 {document!.serialize(buffer, true)} if Int(flags) & Int(1 << 2) != 0 {serializeString(url!, buffer: buffer, boxed: false)} - break - case .noAppUpdate: - if boxed { - buffer.appendInt32(-1000708810) - } - break } } public func descriptionFields() -> (String, [(String, Any)]) { switch self { - case .appUpdate(let flags, let id, let version, let text, let entities, let document, let url): - return ("appUpdate", [("flags", flags), ("id", id), ("version", version), ("text", text), ("entities", entities), ("document", document), ("url", url)]) case .noAppUpdate: return ("noAppUpdate", []) + case .appUpdate(let flags, let id, let version, let text, let entities, let document, let url): + return ("appUpdate", [("flags", flags), ("id", id), ("version", version), ("text", text), ("entities", entities), ("document", document), ("url", url)]) } } + public static func parse_noAppUpdate(_ reader: BufferReader) -> AppUpdate? { + return Api.help.AppUpdate.noAppUpdate + } public static func parse_appUpdate(_ reader: BufferReader) -> AppUpdate? { var _1: Int32? _1 = reader.readInt32() @@ -1367,9 +1370,6 @@ public struct help { return nil } } - public static func parse_noAppUpdate(_ reader: BufferReader) -> AppUpdate? { - return Api.help.AppUpdate.noAppUpdate - } } public enum PassportConfig: TypeConstructorDescription { diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index 7c38bd5aea..86116c0e3f 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -2922,6 +2922,20 @@ public extension Api { }) } + public static func hidePeerSettingsBar(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1336717624) + peer.serialize(buffer, true) + return (FunctionDescription(name: "messages.hidePeerSettingsBar", parameters: [("peer", peer)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in + let reader = BufferReader(buffer) + var result: Api.Bool? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Bool + } + return result + }) + } + public static func searchGlobal(flags: Int32, folderId: Int32?, q: String, offsetRate: Int32, offsetPeer: Api.InputPeer, offsetId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1083038300) @@ -2941,20 +2955,6 @@ public extension Api { return result }) } - - public static func hidePeerSettingsBar(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(1336717624) - peer.serialize(buffer, true) - return (FunctionDescription(name: "messages.hidePeerSettingsBar", parameters: [("peer", peer)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in - let reader = BufferReader(buffer) - var result: Api.Bool? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Bool - } - return result - }) - } } public struct channels { public static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { @@ -3505,6 +3505,21 @@ public extension Api { return result }) } + + public static func toggleSlowMode(channel: Api.InputChannel, seconds: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-304832784) + channel.serialize(buffer, true) + serializeInt32(seconds, buffer: buffer, boxed: false) + return (FunctionDescription(name: "channels.toggleSlowMode", parameters: [("channel", channel), ("seconds", seconds)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + let reader = BufferReader(buffer) + var result: Api.Updates? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Updates + } + return result + }) + } } public struct payments { public static func getPaymentForm(msgId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { @@ -4265,20 +4280,6 @@ public extension Api { }) } - public static func getAppUpdate() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-1372724842) - - return (FunctionDescription(name: "help.getAppUpdate", parameters: []), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.help.AppUpdate? in - let reader = BufferReader(buffer) - var result: Api.help.AppUpdate? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.help.AppUpdate - } - return result - }) - } - public static func getInviteText() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1295590211) @@ -4479,6 +4480,20 @@ public extension Api { return result }) } + + public static func getAppUpdate(source: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1378703997) + serializeString(source, buffer: buffer, boxed: false) + return (FunctionDescription(name: "help.getAppUpdate", parameters: [("source", source)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.help.AppUpdate? in + let reader = BufferReader(buffer) + var result: Api.help.AppUpdate? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.help.AppUpdate + } + return result + }) + } } public struct updates { public static func getState() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { diff --git a/submodules/TelegramCore/TelegramCore/AppUpdate.swift b/submodules/TelegramCore/TelegramCore/AppUpdate.swift index cba132e973..3bc38c3316 100644 --- a/submodules/TelegramCore/TelegramCore/AppUpdate.swift +++ b/submodules/TelegramCore/TelegramCore/AppUpdate.swift @@ -37,7 +37,7 @@ extension AppUpdateInfo { } func managedAppUpdateInfo(network: Network, stateManager: AccountStateManager) -> Signal { - let poll = network.request(Api.functions.help.getAppUpdate()) + let poll = network.request(Api.functions.help.getAppUpdate(source: "")) |> retryRequest |> mapToSignal { [weak stateManager] result -> Signal in let updated = AppUpdateInfo(apiAppUpdate: result) diff --git a/submodules/TelegramCore/TelegramCore/CachedChannelData.swift b/submodules/TelegramCore/TelegramCore/CachedChannelData.swift index 90f775e22d..37a13fa5da 100644 --- a/submodules/TelegramCore/TelegramCore/CachedChannelData.swift +++ b/submodules/TelegramCore/TelegramCore/CachedChannelData.swift @@ -170,6 +170,8 @@ public final class CachedChannelData: CachedPeerData { public let migrationReference: ChannelMigrationReference? public let linkedDiscussionPeerId: PeerId? public let peerGeoLocation: PeerGeoLocation? + public let slowModeTimeout: Int32? + public let slowModeValidUntilTimestamp: Int32? public let peerIds: Set public let messageIds: Set @@ -193,9 +195,11 @@ public final class CachedChannelData: CachedPeerData { self.migrationReference = nil self.linkedDiscussionPeerId = nil self.peerGeoLocation = nil + self.slowModeTimeout = nil + self.slowModeValidUntilTimestamp = nil } - init(isNotAccessible: Bool, flags: CachedChannelFlags, about: String?, participantsSummary: CachedChannelParticipantsSummary, exportedInvitation: ExportedInvitation?, botInfos: [CachedPeerBotInfo], peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, stickerPack: StickerPackCollectionInfo?, minAvailableMessageId: MessageId?, migrationReference: ChannelMigrationReference?, linkedDiscussionPeerId: PeerId?, peerGeoLocation: PeerGeoLocation?) { + init(isNotAccessible: Bool, flags: CachedChannelFlags, about: String?, participantsSummary: CachedChannelParticipantsSummary, exportedInvitation: ExportedInvitation?, botInfos: [CachedPeerBotInfo], peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, stickerPack: StickerPackCollectionInfo?, minAvailableMessageId: MessageId?, migrationReference: ChannelMigrationReference?, linkedDiscussionPeerId: PeerId?, peerGeoLocation: PeerGeoLocation?, slowModeTimeout: Int32?, slowModeValidUntilTimestamp: Int32?) { self.isNotAccessible = isNotAccessible self.flags = flags self.about = about @@ -209,6 +213,8 @@ public final class CachedChannelData: CachedPeerData { self.migrationReference = migrationReference self.linkedDiscussionPeerId = linkedDiscussionPeerId self.peerGeoLocation = peerGeoLocation + self.slowModeTimeout = slowModeTimeout + self.slowModeValidUntilTimestamp = slowModeValidUntilTimestamp var peerIds = Set() for botInfo in botInfos { @@ -229,55 +235,63 @@ public final class CachedChannelData: CachedPeerData { } func withUpdatedIsNotAccessible(_ isNotAccessible: Bool) -> CachedChannelData { - return CachedChannelData(isNotAccessible: isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedFlags(_ flags: CachedChannelFlags) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedAbout(_ about: String?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedParticipantsSummary(_ participantsSummary: CachedChannelParticipantsSummary) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedExportedInvitation(_ exportedInvitation: ExportedInvitation?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedBotInfos(_ botInfos: [CachedPeerBotInfo]) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedPeerStatusSettings(_ peerStatusSettings: PeerStatusSettings?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedPinnedMessageId(_ pinnedMessageId: MessageId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedStickerPack(_ stickerPack: StickerPackCollectionInfo?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedMinAvailableMessageId(_ minAvailableMessageId: MessageId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedMigrationReference(_ migrationReference: ChannelMigrationReference?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedLinkedDiscussionPeerId(_ linkedDiscussionPeerId: PeerId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) } func withUpdatedPeerGeoLocation(peerGeoLocation: PeerGeoLocation?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: peerGeoLocation) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) + } + + func withUpdatedSlowModeTimeout(slowModeTimeout: Int32?) -> CachedChannelData { + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp) + } + + func withUpdatedSlowModeValidUntilTimestamp(slowModeValidUntilTimestamp: Int32?) -> CachedChannelData { + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: slowModeValidUntilTimestamp) } public init(decoder: PostboxDecoder) { @@ -329,6 +343,9 @@ public final class CachedChannelData: CachedPeerData { self.peerGeoLocation = nil } + self.slowModeTimeout = decoder.decodeOptionalInt32ForKey("smt") + self.slowModeValidUntilTimestamp = decoder.decodeOptionalInt32ForKey("smv") + if let linkedDiscussionPeerId = self.linkedDiscussionPeerId { peerIds.insert(linkedDiscussionPeerId) } @@ -400,6 +417,17 @@ public final class CachedChannelData: CachedPeerData { } else { encoder.encodeNil(forKey: "pgl") } + + if let slowModeTimeout = self.slowModeTimeout { + encoder.encodeInt32(slowModeTimeout, forKey: "smt") + } else { + encoder.encodeNil(forKey: "smt") + } + if let slowModeValidUntilTimestamp = self.slowModeValidUntilTimestamp { + encoder.encodeInt32(slowModeValidUntilTimestamp, forKey: "smv") + } else { + encoder.encodeNil(forKey: "smv") + } } public func isEqual(to: CachedPeerData) -> Bool { @@ -459,6 +487,14 @@ public final class CachedChannelData: CachedPeerData { return false } + if other.slowModeTimeout != self.slowModeTimeout { + return false + } + + if other.slowModeValidUntilTimestamp != self.slowModeValidUntilTimestamp { + return false + } + return true } } diff --git a/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift b/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift index 82886b9bc2..a169b27cc7 100644 --- a/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift +++ b/submodules/TelegramCore/TelegramCore/ChannelAdminEventLogs.swift @@ -218,6 +218,8 @@ public func channelAdminLogEvents(postbox: Postbox, network: Network, peerId: Pe action = .linkedPeerUpdated(previous: prevValue == 0 ? nil : peers[PeerId(namespace: Namespaces.Peer.CloudChannel, id: prevValue)], updated: newValue == 0 ? nil : peers[PeerId(namespace: Namespaces.Peer.CloudChannel, id: newValue)]) case let .channelAdminLogEventActionChangeLocation(prevValue, newValue): action = .changeGeoLocation(previous: PeerGeoLocation(apiLocation: prevValue), updated: PeerGeoLocation(apiLocation: newValue)) + case let .channelAdminLogEventActionToggleSlowMode(prevValue, newValue): + break } let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: userId) if let action = action { diff --git a/submodules/TelegramCore/TelegramCore/SlowMode.swift b/submodules/TelegramCore/TelegramCore/SlowMode.swift new file mode 100644 index 0000000000..384272292d --- /dev/null +++ b/submodules/TelegramCore/TelegramCore/SlowMode.swift @@ -0,0 +1,43 @@ +#if os(macOS) +import PostboxMac +import SwiftSignalKitMac +import TelegramApiMac +#else +import Postbox +import TelegramApi +import SwiftSignalKit +#endif + +public enum UpdateChannelSlowModeError { + case generic +} + +public func updateChannelSlowModeInteractively(postbox: Postbox, network: Network, accountStateManager: AccountStateManager, peerId: PeerId, timeout: Int32?) -> Signal { + return postbox.transaction { transaction -> Peer? in + return transaction.getPeer(peerId) + } + |> introduceError(UpdateChannelSlowModeError.self) + |> mapToSignal { peer in + guard let peer = peer, let inputChannel = apiInputChannel(peer) else { + return .fail(.generic) + } + + return network.request(Api.functions.channels.toggleSlowMode(channel: inputChannel, seconds: timeout ?? 0)) + |> `catch` { _ -> Signal in + return .fail(.generic) + } + |> mapToSignal { updates -> Signal in + accountStateManager.addUpdates(updates) + return postbox.transaction { transaction -> Void in + transaction.updatePeerCachedData(peerIds: [peerId], update: { peerId, currentData in + if let currentData = currentData as? CachedChannelData { + return currentData.withUpdatedSlowModeTimeout(slowModeTimeout: timeout) + } else { + return currentData + } + }) + } + |> introduceError(UpdateChannelSlowModeError.self) + } + } +} diff --git a/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift b/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift index 6d13805ae1..0e010fb389 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift @@ -280,7 +280,7 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerI } switch fullChat { - case let .channelFull(flags, _, about, participantsCount, adminsCount, kickedCount, bannedCount, _, _, _, _, _, _, apiExportedInvite, apiBotInfos, migratedFromChatId, migratedFromMaxId, pinnedMsgId, stickerSet, minAvailableMsgId, folderId, linkedChatId, location, pts): + case let .channelFull(flags, _, about, participantsCount, adminsCount, kickedCount, bannedCount, _, _, _, _, _, _, apiExportedInvite, apiBotInfos, migratedFromChatId, migratedFromMaxId, pinnedMsgId, stickerSet, minAvailableMsgId, folderId, linkedChatId, location, slowmodeSeconds, slowmodeSecondsLeft, pts): var channelFlags = CachedChannelFlags() if (flags & (1 << 3)) != 0 { channelFlags.insert(.canDisplayParticipants) @@ -403,6 +403,11 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerI .withUpdatedMigrationReference(migrationReference) .withUpdatedLinkedDiscussionPeerId(linkedDiscussionPeerId) .withUpdatedPeerGeoLocation(peerGeoLocation: peerGeoLocation) + .withUpdatedSlowModeTimeout(slowModeTimeout: slowmodeSeconds) + .withUpdatedSlowModeValidUntilTimestamp(slowModeValidUntilTimestamp: slowmodeSecondsLeft.flatMap({ value in + let timestamp = network.getApproximateRemoteTimestamp() + return timestamp + value + })) }) if let minAvailableMessageId = minAvailableMessageId, minAvailableMessageIdUpdated { diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 7f330b1143..17a6d53475 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -677,6 +677,8 @@ D0CC4ADC22BA47280088F36D /* TelegramApiMac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0CC4ADB22BA47280088F36D /* TelegramApiMac.framework */; }; D0D1026C2212FE52003ADA5E /* AccountSortOrderAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D1026B2212FE52003ADA5E /* AccountSortOrderAttribute.swift */; }; D0D1026D2212FE52003ADA5E /* AccountSortOrderAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D1026B2212FE52003ADA5E /* AccountSortOrderAttribute.swift */; }; + D0D376E622DCCFD600FA7D7C /* SlowMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D376E522DCCFD600FA7D7C /* SlowMode.swift */; }; + D0D376E722DCCFD600FA7D7C /* SlowMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D376E522DCCFD600FA7D7C /* SlowMode.swift */; }; D0D748021E7AE98B00F4B1F6 /* StickerPackInteractiveOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D748011E7AE98B00F4B1F6 /* StickerPackInteractiveOperations.swift */; }; D0D748031E7AE98B00F4B1F6 /* StickerPackInteractiveOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D748011E7AE98B00F4B1F6 /* StickerPackInteractiveOperations.swift */; }; D0DA1D321F7043D50034E892 /* ManagedPendingPeerNotificationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DA1D311F7043D50034E892 /* ManagedPendingPeerNotificationSettings.swift */; }; @@ -1186,6 +1188,7 @@ D0CC4AA322BA44960088F36D /* TelegramApi.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramApi.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0CC4ADB22BA47280088F36D /* TelegramApiMac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TelegramApiMac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0D1026B2212FE52003ADA5E /* AccountSortOrderAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSortOrderAttribute.swift; sourceTree = ""; }; + D0D376E522DCCFD600FA7D7C /* SlowMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SlowMode.swift; sourceTree = ""; }; D0D748011E7AE98B00F4B1F6 /* StickerPackInteractiveOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerPackInteractiveOperations.swift; sourceTree = ""; }; D0DA1D311F7043D50034E892 /* ManagedPendingPeerNotificationSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedPendingPeerNotificationSettings.swift; sourceTree = ""; }; D0DB7F021F43030C00591D48 /* InstallInteractiveReadMessagesAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstallInteractiveReadMessagesAction.swift; sourceTree = ""; }; @@ -1993,6 +1996,7 @@ D076F8882296D8E9004F895A /* ManageChannelDiscussionGroup.swift */, 090E778222A9862100CD99F5 /* ChannelOwnershipTransfer.swift */, 090E778F22AAABC600CD99F5 /* PeersNearby.swift */, + D0D376E522DCCFD600FA7D7C /* SlowMode.swift */, ); name = Peers; sourceTree = ""; @@ -2343,6 +2347,7 @@ D0DA1D321F7043D50034E892 /* ManagedPendingPeerNotificationSettings.swift in Sources */, D099D7491EEF418D00A3128C /* HistoryViewChannelStateValidation.swift in Sources */, C23BC3871E9BE3CA00D79F92 /* ImportContact.swift in Sources */, + D0D376E622DCCFD600FA7D7C /* SlowMode.swift in Sources */, D00422D321677F4500719B67 /* ManagedAccountPresence.swift in Sources */, D03B0D0A1D62255C00955575 /* Holes.swift in Sources */, D05464972073872C002ECC1E /* SecureIdBankStatementValue.swift in Sources */, @@ -2857,6 +2862,7 @@ D0FA8BB11E1FEC7E001E855B /* SecretChatEncryptionConfig.swift in Sources */, D0B418AA1D7E0597004562A4 /* Download.swift in Sources */, D001F3F41E128A1C007A8C60 /* UpdatesApiUtils.swift in Sources */, + D0D376E722DCCFD600FA7D7C /* SlowMode.swift in Sources */, D015E00F225CA61100CB9E8A /* FindChannelById.swift in Sources */, D04D8FF5209A4B0700865719 /* NetworkSettings.swift in Sources */, D05464982073872C002ECC1E /* SecureIdBankStatementValue.swift in Sources */, From 135ea2c85e8216c182ca5af09fd6a0e7821a3f69 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Mon, 15 Jul 2019 19:12:02 +0200 Subject: [PATCH 07/32] - fixed performance for uploading large files. - small changes. --- .../project.pbxproj | 2 + .../TelegramCore/AccountManager.swift | 1 + .../TelegramCore/TelegramCore/Fetch.swift | 23 ++++++++--- .../TelegramCore/MultipartUpload.swift | 24 ++++++++--- .../TelegramCore/Namespaces.swift | 6 +++ .../TelegramCore/StickerManagement.swift | 2 +- .../TelegramCore/TelegramMediaFile.swift | 11 +++-- .../TelegramCore/UpdateSecretChat.swift | 41 +++++++++++-------- .../project.pbxproj | 8 ++++ 9 files changed, 85 insertions(+), 33 deletions(-) diff --git a/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj index 5afbd65933..876fdfbd41 100644 --- a/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramApi/TelegramApi_Xcode.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ D035734722B5C9BF00F0920D /* SecretApiLayer46.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734422B5C9BF00F0920D /* SecretApiLayer46.swift */; }; D035734822B5C9BF00F0920D /* SecretApiLayer8.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734522B5C9BF00F0920D /* SecretApiLayer8.swift */; }; D035734922B5C9BF00F0920D /* SecretApiLayer73.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734622B5C9BF00F0920D /* SecretApiLayer73.swift */; }; + D05FDC3A22CA453E0060BFE3 /* SecretApiLayer101.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E9601A22C2BE4900B13673 /* SecretApiLayer101.swift */; }; D0CC4AC422BA46F30088F36D /* TelegramApi.h in Headers */ = {isa = PBXBuildFile; fileRef = D035732222B5C1FC00F0920D /* TelegramApi.h */; settings = {ATTRIBUTES = (Public, ); }; }; D0CC4AC622BA46F30088F36D /* SecretApiLayer46.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035734422B5C9BF00F0920D /* SecretApiLayer46.swift */; }; D0CC4AC722BA46F30088F36D /* Api1.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035733222B5C29900F0920D /* Api1.swift */; }; @@ -237,6 +238,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D05FDC3A22CA453E0060BFE3 /* SecretApiLayer101.swift in Sources */, D0CC4AC622BA46F30088F36D /* SecretApiLayer46.swift in Sources */, D0CC4AC722BA46F30088F36D /* Api1.swift in Sources */, D0CC4AC822BA46F30088F36D /* Api0.swift in Sources */, diff --git a/submodules/TelegramCore/TelegramCore/AccountManager.swift b/submodules/TelegramCore/TelegramCore/AccountManager.swift index 2bd1d676a7..6a342249c7 100644 --- a/submodules/TelegramCore/TelegramCore/AccountManager.swift +++ b/submodules/TelegramCore/TelegramCore/AccountManager.swift @@ -137,6 +137,7 @@ private var declaredEncodables: Void = { declareEncodable(TelegramMediaPoll.self, f: { TelegramMediaPoll(decoder: $0) }) declareEncodable(TelegramMediaUnsupported.self, f: { TelegramMediaUnsupported(decoder: $0) }) declareEncodable(ContactsSettings.self, f: { ContactsSettings(decoder: $0) }) + declareEncodable(SecretChatSettings.self, f: { SecretChatSettings(decoder: $0) }) declareEncodable(EmojiKeywordCollectionInfo.self, f: { EmojiKeywordCollectionInfo(decoder: $0) }) declareEncodable(EmojiKeywordItem.self, f: { EmojiKeywordItem(decoder: $0) }) declareEncodable(SynchronizeEmojiKeywordsOperation.self, f: { SynchronizeEmojiKeywordsOperation(decoder: $0) }) diff --git a/submodules/TelegramCore/TelegramCore/Fetch.swift b/submodules/TelegramCore/TelegramCore/Fetch.swift index f26389e16b..95f4a430ad 100644 --- a/submodules/TelegramCore/TelegramCore/Fetch.swift +++ b/submodules/TelegramCore/TelegramCore/Fetch.swift @@ -9,6 +9,21 @@ import SwiftSignalKit import Photos #endif +private final class MediaResourceDataCopyFile : MediaResourceDataFetchCopyLocalItem { + let path: String + init(path: String) { + self.path = path + } + func copyTo(url: URL) -> Bool { + do { + try FileManager.default.copyItem(at: URL(fileURLWithPath: self.path), to: url) + return true + } catch { + return false + } + } +} + private func fetchCloudMediaLocation(account: Account, resource: TelegramMediaResource, datacenterId: Int, size: Int?, intervals: Signal<[(Range, MediaBoxFetchPriority)], NoError>, parameters: MediaResourceFetchParameters?) -> Signal { return multipartFetch(postbox: account.postbox, network: account.network, mediaReferenceRevalidationContext: account.mediaReferenceRevalidationContext, resource: resource, datacenterId: datacenterId, size: size, intervals: intervals, parameters: parameters) } @@ -19,12 +34,8 @@ private func fetchLocalFileResource(path: String, move: Bool) -> Signal 0 && (resourceData.complete || partSize == self.defaultPartSize) { let partIndex = partOffset / self.defaultPartSize - let fileData: Data? + let partData: Data? switch resourceData { case let .resourceData(data): - fileData = try? Data(contentsOf: URL(fileURLWithPath: data.path), options: [.alwaysMapped]) + if let file = ManagedFile(queue: nil, path: data.path, mode: .read) { + file.seek(position: Int64(partOffset)) + let data = file.readData(count: partSize) + if data.count == partSize { + partData = data + } else { + partData = nil + } + } else { + partData = nil + } case let .data(data): - fileData = data + if data.count >= partOffset + partSize { + partData = data.subdata(in: partOffset ..< (partOffset + partSize)) + } else { + partData = nil + } } - if let fileData = fileData, fileData.count >= partOffset + partSize { - let partData = self.state.transform(data: fileData.subdata(in: partOffset ..< (partOffset + partSize))) + if let partData = partData { + let partData = self.state.transform(data: partData) var currentBigTotalParts = self.bigTotalParts if self.bigParts && resourceData.complete && partOffset + partSize == resourceData.size { currentBigTotalParts = (resourceData.size / self.defaultPartSize) + (resourceData.size % self.defaultPartSize == 0 ? 0 : 1) diff --git a/submodules/TelegramCore/TelegramCore/Namespaces.swift b/submodules/TelegramCore/TelegramCore/Namespaces.swift index 15007d023b..76df73b2ee 100644 --- a/submodules/TelegramCore/TelegramCore/Namespaces.swift +++ b/submodules/TelegramCore/TelegramCore/Namespaces.swift @@ -153,6 +153,7 @@ private enum PreferencesKeyValues: Int32 { case appConfiguration = 14 case searchBotsConfiguration = 15 case contactsSettings = 16 + case secretChatSettings = 17 } public func applicationSpecificPreferencesKey(_ value: Int32) -> ValueBoxKey { @@ -245,6 +246,11 @@ public struct PreferencesKeys { key.setInt32(0, value: PreferencesKeyValues.contactsSettings.rawValue) return key }() + public static let secretChatSettings: ValueBoxKey = { + let key = ValueBoxKey(length: 4) + key.setInt32(0, value: PreferencesKeyValues.secretChatSettings.rawValue) + return key + }() } private enum SharedDataKeyValues: Int32 { diff --git a/submodules/TelegramCore/TelegramCore/StickerManagement.swift b/submodules/TelegramCore/TelegramCore/StickerManagement.swift index b4e594340d..f38cd1a46b 100644 --- a/submodules/TelegramCore/TelegramCore/StickerManagement.swift +++ b/submodules/TelegramCore/TelegramCore/StickerManagement.swift @@ -46,7 +46,7 @@ func updatedFeaturedStickerPacks(network: Network, postbox: Postbox) -> Signal retryRequest |> mapToSignal { result -> Signal in return postbox.transaction { transaction -> Void in diff --git a/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift b/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift index f9006150bd..143062cdfe 100644 --- a/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift +++ b/submodules/TelegramCore/TelegramCore/TelegramMediaFile.swift @@ -330,7 +330,7 @@ public final class TelegramMediaFile: Media, Equatable { public var isSticker: Bool { for attribute in self.attributes { if case .Sticker = attribute { - return true + return !isAnimatedSticker } } return false @@ -365,10 +365,13 @@ public final class TelegramMediaFile: Media, Equatable { public var isAnimatedSticker: Bool { if let _ = self.fileName, self.mimeType == "application/x-tgsticker" { - return true - } else { - return false + for attribute in self.attributes { + if case .Sticker = attribute { + return true + } + } } + return false } public var isMusic: Bool { diff --git a/submodules/TelegramCore/TelegramCore/UpdateSecretChat.swift b/submodules/TelegramCore/TelegramCore/UpdateSecretChat.swift index feb89aa59f..5231ea66bf 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateSecretChat.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateSecretChat.swift @@ -24,6 +24,7 @@ struct SecretChatRequestData { func updateSecretChat(accountPeerId: PeerId, transaction: Transaction, chat: Api.EncryptedChat, requestData: SecretChatRequestData?) { let currentPeer = transaction.getPeer(chat.peerId) as? TelegramSecretChat let currentState = transaction.getPeerChatState(chat.peerId) as? SecretChatState + let settings = transaction.getPreferencesEntry(key: PreferencesKeys.secretChatSettings) as? SecretChatSettings ?? SecretChatSettings.defaultSettings assert((currentPeer == nil) == (currentState == nil)) switch chat { case let .encryptedChat(_, _, _, adminId, _, gAOrB, remoteKeyFingerprint): @@ -61,7 +62,7 @@ func updateSecretChat(accountPeerId: PeerId, transaction: Transaction, chat: Api updatedState = updatedState.withUpdatedEmbeddedState(.sequenceBasedLayer(SecretChatSequenceBasedLayerState(layerNegotiationState: SecretChatLayerNegotiationState(activeLayer: .layer46, locallyRequestedLayer: nil, remotelyRequestedLayer: nil), rekeyState: nil, baseIncomingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: currentPeer.id, tag: OperationLogTags.SecretIncomingDecrypted), baseOutgoingOperationIndex: transaction.operationLogGetNextEntryLocalIndex(peerId: currentPeer.id, tag: OperationLogTags.SecretOutgoing), topProcessedCanonicalIncomingOperationIndex: nil))) updatedState = updatedState.withUpdatedKeyFingerprint(SecretChatKeyFingerprint(sha1: SecretChatKeySha1Fingerprint(digest: sha1Digest(key)), sha256: SecretChatKeySha256Fingerprint(digest: sha256Digest(key)))) - + updatedState = secretChatAddReportCurrentLayerSupportOperationAndUpdateRequestedLayer(transaction: transaction, peerId: currentPeer.id, state: updatedState) transaction.setPeerChatState(currentPeer.id, state: updatedState) @@ -88,25 +89,31 @@ func updateSecretChat(accountPeerId: PeerId, transaction: Transaction, chat: Api break case let .encryptedChatRequested(_, accessHash, date, adminId, participantId, gA): if currentPeer == nil && participantId == accountPeerId.id { - let state = SecretChatState(role: .participant, embeddedState: .handshake(.accepting), keychain: SecretChatKeychain(keys: []), keyFingerprint: nil, messageAutoremoveTimeout: nil) - - let bBytes = malloc(256)! - let randomStatus = SecRandomCopyBytes(nil, 256, bBytes.assumingMemoryBound(to: UInt8.self)) - let b = MemoryBuffer(memory: bBytes, capacity: 256, length: 256, freeWhenDone: true) - if randomStatus == 0 { - let updatedState = addSecretChatOutgoingOperation(transaction: transaction, peerId: chat.peerId, operation: .initialHandshakeAccept(gA: MemoryBuffer(gA), accessHash: accessHash, b: b), state: state) - transaction.setPeerChatState(chat.peerId, state: updatedState) + if settings.acceptOnThisDevice { + let state = SecretChatState(role: .participant, embeddedState: .handshake(.accepting), keychain: SecretChatKeychain(keys: []), keyFingerprint: nil, messageAutoremoveTimeout: nil) - let peer = TelegramSecretChat(id: chat.peerId, creationDate: date, regularPeerId: PeerId(namespace: Namespaces.Peer.CloudUser, id: adminId), accessHash: accessHash, role: updatedState.role, embeddedState: updatedState.embeddedState.peerState, messageAutoremoveTimeout: nil) - updatePeers(transaction: transaction, peers: [peer], update: { _, updated in return updated }) - transaction.resetIncomingReadStates([peer.id: [ - Namespaces.Message.SecretIncoming: .indexBased(maxIncomingReadIndex: MessageIndex.lowerBound(peerId: peer.id), maxOutgoingReadIndex: MessageIndex.lowerBound(peerId: peer.id), count: 0, markedUnread: false), - Namespaces.Message.Local: .indexBased(maxIncomingReadIndex: MessageIndex.lowerBound(peerId: peer.id), maxOutgoingReadIndex: MessageIndex.lowerBound(peerId: peer.id), count: 0, markedUnread: false) - ] - ]) + let bBytes = malloc(256)! + let randomStatus = SecRandomCopyBytes(nil, 256, bBytes.assumingMemoryBound(to: UInt8.self)) + let b = MemoryBuffer(memory: bBytes, capacity: 256, length: 256, freeWhenDone: true) + if randomStatus == 0 { + let updatedState = addSecretChatOutgoingOperation(transaction: transaction, peerId: chat.peerId, operation: .initialHandshakeAccept(gA: MemoryBuffer(gA), accessHash: accessHash, b: b), state: state) + transaction.setPeerChatState(chat.peerId, state: updatedState) + + let peer = TelegramSecretChat(id: chat.peerId, creationDate: date, regularPeerId: PeerId(namespace: Namespaces.Peer.CloudUser, id: adminId), accessHash: accessHash, role: updatedState.role, embeddedState: updatedState.embeddedState.peerState, messageAutoremoveTimeout: nil) + updatePeers(transaction: transaction, peers: [peer], update: { _, updated in return updated }) + transaction.resetIncomingReadStates([peer.id: [ + Namespaces.Message.SecretIncoming: .indexBased(maxIncomingReadIndex: MessageIndex.lowerBound(peerId: peer.id), maxOutgoingReadIndex: MessageIndex.lowerBound(peerId: peer.id), count: 0, markedUnread: false), + Namespaces.Message.Local: .indexBased(maxIncomingReadIndex: MessageIndex.lowerBound(peerId: peer.id), maxOutgoingReadIndex: MessageIndex.lowerBound(peerId: peer.id), count: 0, markedUnread: false) + ] + ]) + } else { + assertionFailure() + } } else { - assertionFailure() + Logger.shared.log("State", "accepting secret chats disabled on this device") } + + } else { Logger.shared.log("State", "got encryptedChatRequested, but peer already exists or this account is creator") } diff --git a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj index 7f330b1143..b533d6ab72 100644 --- a/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj +++ b/submodules/TelegramCore/TelegramCore_Xcode.xcodeproj/project.pbxproj @@ -413,6 +413,7 @@ D05A32E81E6F0B5C002760B4 /* RecentAccountSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05A32E61E6F0B5C002760B4 /* RecentAccountSession.swift */; }; D05D8B372192F8AF0064586F /* LocalizationListState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05D8B362192F8AF0064586F /* LocalizationListState.swift */; }; D05D8B382192F8AF0064586F /* LocalizationListState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05D8B362192F8AF0064586F /* LocalizationListState.swift */; }; + D05FDC3922CA45070060BFE3 /* AppUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EC0DE822C6825D00E7185B /* AppUpdate.swift */; }; D0613FCA1E60440600202CDB /* InvitationLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0613FC91E60440600202CDB /* InvitationLinks.swift */; }; D0613FCB1E60440600202CDB /* InvitationLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0613FC91E60440600202CDB /* InvitationLinks.swift */; }; D0613FCF1E60520700202CDB /* ChannelMembers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0613FCE1E60520700202CDB /* ChannelMembers.swift */; }; @@ -427,6 +428,8 @@ D0642EFA1F3E05D700792790 /* EarliestUnseenPersonalMentionMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0642EF81F3E05D700792790 /* EarliestUnseenPersonalMentionMessage.swift */; }; D067066C1D512ADB00DED3E3 /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D06706671D512ADB00DED3E3 /* Postbox.framework */; }; D067066D1D512ADB00DED3E3 /* SwiftSignalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D06706681D512ADB00DED3E3 /* SwiftSignalKit.framework */; }; + D069257122D8B526002FC021 /* SecretChatSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D069257022D8B526002FC021 /* SecretChatSettings.swift */; }; + D069257222D8B526002FC021 /* SecretChatSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D069257022D8B526002FC021 /* SecretChatSettings.swift */; }; D06CA13522772EB20094E707 /* ManagedNotificationSettingsBehaviors.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06CA13422772EB20094E707 /* ManagedNotificationSettingsBehaviors.swift */; }; D06CA13622772EB20094E707 /* ManagedNotificationSettingsBehaviors.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06CA13422772EB20094E707 /* ManagedNotificationSettingsBehaviors.swift */; }; D06ECFC820B810D300C576C2 /* TermsOfService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06ECFC720B810D300C576C2 /* TermsOfService.swift */; }; @@ -1045,6 +1048,7 @@ D06706671D512ADB00DED3E3 /* Postbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Postbox.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D06706681D512ADB00DED3E3 /* SwiftSignalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = SwiftSignalKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D067066E1D512AEB00DED3E3 /* MtProtoKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MtProtoKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D069257022D8B526002FC021 /* SecretChatSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretChatSettings.swift; sourceTree = ""; }; D06CA13422772EB20094E707 /* ManagedNotificationSettingsBehaviors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedNotificationSettingsBehaviors.swift; sourceTree = ""; }; D06ECFC720B810D300C576C2 /* TermsOfService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfService.swift; sourceTree = ""; }; D07047B31F3DF1FE00F6A8D4 /* ConsumablePersonalMentionMessageAttribute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConsumablePersonalMentionMessageAttribute.swift; sourceTree = ""; }; @@ -1730,6 +1734,7 @@ D033873F223BD48B007A2CE4 /* ContactsSettings.swift */, D099E221229420D600561B75 /* BlockedPeersContext.swift */, D098907E22942E3B0053F151 /* ActiveSessionsContext.swift */, + D069257022D8B526002FC021 /* SecretChatSettings.swift */, ); name = Settings; sourceTree = ""; @@ -2282,6 +2287,7 @@ D03B0D441D6319F900955575 /* CloudFileMediaResource.swift in Sources */, D018D3371E648ACF00C5E089 /* ChannelCreation.swift in Sources */, D01AC9211DD5E7E500E8160F /* RequestEditMessage.swift in Sources */, + D069257122D8B526002FC021 /* SecretChatSettings.swift in Sources */, D0AF32221FAC95C20097362B /* StandaloneUploadedMedia.swift in Sources */, D0F53BE91E784A4800117362 /* ChangeAccountPhoneNumber.swift in Sources */, D0E35A0E1DE4953E00BC6096 /* FetchHttpResource.swift in Sources */, @@ -2598,6 +2604,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D05FDC3922CA45070060BFE3 /* AppUpdate.swift in Sources */, D014193922AE6B85008667CB /* ChannelOwnershipTransfer.swift in Sources */, D014193A22AE6B85008667CB /* PeersNearby.swift in Sources */, D076F88A2296D8F6004F895A /* ManageChannelDiscussionGroup.swift in Sources */, @@ -2860,6 +2867,7 @@ D015E00F225CA61100CB9E8A /* FindChannelById.swift in Sources */, D04D8FF5209A4B0700865719 /* NetworkSettings.swift in Sources */, D05464982073872C002ECC1E /* SecureIdBankStatementValue.swift in Sources */, + D069257222D8B526002FC021 /* SecretChatSettings.swift in Sources */, D0B4188E1D7E0578004562A4 /* StoreMessage_Telegram.swift in Sources */, D0B844461DAB91FD005F29E1 /* RecentPeers.swift in Sources */, D0E412E2206AB24700BEE4A2 /* SecureFileMediaResource.swift in Sources */, From cae823e233d85f9fce6ae5e22b24ab6a5e049ae6 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Tue, 16 Jul 2019 09:55:33 +0200 Subject: [PATCH 08/32] -added SecretChatSettings file --- .../TelegramCore/SecretChatSettings.swift | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 submodules/TelegramCore/TelegramCore/SecretChatSettings.swift diff --git a/submodules/TelegramCore/TelegramCore/SecretChatSettings.swift b/submodules/TelegramCore/TelegramCore/SecretChatSettings.swift new file mode 100644 index 0000000000..10c9e50f9d --- /dev/null +++ b/submodules/TelegramCore/TelegramCore/SecretChatSettings.swift @@ -0,0 +1,34 @@ +import Foundation +#if os(macOS) +import PostboxMac +#else +import Postbox +#endif + +public struct SecretChatSettings: Equatable, PreferencesEntry { + public private(set) var acceptOnThisDevice: Bool + + public static var defaultSettings: SecretChatSettings { + return SecretChatSettings(acceptOnThisDevice: true) + } + + public init(acceptOnThisDevice: Bool) { + self.acceptOnThisDevice = acceptOnThisDevice + } + + public init(decoder: PostboxDecoder) { + self.acceptOnThisDevice = decoder.decodeInt32ForKey("acceptOnThisDevice", orElse: 1) != 0 + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeInt32(self.acceptOnThisDevice ? 1 : 0, forKey: "acceptOnThisDevice") + } + + public func isEqual(to: PreferencesEntry) -> Bool { + if let to = to as? SecretChatSettings { + return self == to + } else { + return false + } + } +} From 16eea8934d837f3abd5d8a5404fa03d14c7f745b Mon Sep 17 00:00:00 2001 From: overtake <> Date: Tue, 16 Jul 2019 13:38:52 +0200 Subject: [PATCH 09/32] upgrade to 104 layer --- submodules/TelegramCore/TelegramCore/Serialization.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/TelegramCore/TelegramCore/Serialization.swift b/submodules/TelegramCore/TelegramCore/Serialization.swift index f1cb480ddc..2a78e8b6c2 100644 --- a/submodules/TelegramCore/TelegramCore/Serialization.swift +++ b/submodules/TelegramCore/TelegramCore/Serialization.swift @@ -220,7 +220,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { - return 103 + return 104 } public func parseMessage(_ data: Data!) -> Any! { From 6451610d994073333279d5b2fe99b02843c7063d Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 16 Jul 2019 14:00:12 +0100 Subject: [PATCH 10/32] Update API --- submodules/TelegramApi/Sources/Api0.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 32af363d3a..2049e2fdc6 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -10,7 +10,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-206066487] = { return Api.InputGeoPoint.parse_inputGeoPoint($0) } dict[-784000893] = { return Api.payments.ValidatedRequestedInfo.parse_validatedRequestedInfo($0) } dict[461151667] = { return Api.ChatFull.parse_chatFull($0) } - dict[277964371] = { return Api.ChatFull.parse_channelFull($0) } + dict[-23380031] = { return Api.ChatFull.parse_channelFull($0) } dict[1465219162] = { return Api.PollResults.parse_pollResults($0) } dict[-925415106] = { return Api.ChatParticipant.parse_chatParticipant($0) } dict[-636267638] = { return Api.ChatParticipant.parse_chatParticipantCreator($0) } @@ -101,8 +101,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[997055186] = { return Api.PollAnswerVoters.parse_pollAnswerVoters($0) } dict[-1705233435] = { return Api.account.PasswordSettings.parse_passwordSettings($0) } dict[-288727837] = { return Api.LangPackLanguage.parse_langPackLanguage($0) } - dict[497489295] = { return Api.help.AppUpdate.parse_appUpdate($0) } dict[-1000708810] = { return Api.help.AppUpdate.parse_noAppUpdate($0) } + dict[497489295] = { return Api.help.AppUpdate.parse_appUpdate($0) } dict[-209337866] = { return Api.LangPackDifference.parse_langPackDifference($0) } dict[-1590738760] = { return Api.WallPaperSettings.parse_wallPaperSettings($0) } dict[1152191385] = { return Api.EmojiURL.parse_EmojiURL($0) } @@ -383,6 +383,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1129042607] = { return Api.ChannelAdminLogEventAction.parse_channelAdminLogEventActionChangePhoto($0) } dict[-1569748965] = { return Api.ChannelAdminLogEventAction.parse_channelAdminLogEventActionChangeLinkedChat($0) } dict[241923758] = { return Api.ChannelAdminLogEventAction.parse_channelAdminLogEventActionChangeLocation($0) } + dict[1401984889] = { return Api.ChannelAdminLogEventAction.parse_channelAdminLogEventActionToggleSlowMode($0) } dict[-526508104] = { return Api.help.ProxyData.parse_proxyDataEmpty($0) } dict[737668643] = { return Api.help.ProxyData.parse_proxyDataPromo($0) } dict[-543777747] = { return Api.auth.ExportedAuthorization.parse_exportedAuthorization($0) } From 1aada1ce895ea2e584958f2db333e67b17eea80d Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 16 Jul 2019 15:28:40 +0100 Subject: [PATCH 11/32] Update API [skip ci] --- submodules/TelegramApi/Sources/Api0.swift | 2 +- submodules/TelegramApi/Sources/Api1.swift | 14 +++++++------- .../TelegramCore/UpdateCachedPeerData.swift | 7 ++----- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 2049e2fdc6..48f6783946 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -10,7 +10,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-206066487] = { return Api.InputGeoPoint.parse_inputGeoPoint($0) } dict[-784000893] = { return Api.payments.ValidatedRequestedInfo.parse_validatedRequestedInfo($0) } dict[461151667] = { return Api.ChatFull.parse_chatFull($0) } - dict[-23380031] = { return Api.ChatFull.parse_channelFull($0) } + dict[763976820] = { return Api.ChatFull.parse_channelFull($0) } dict[1465219162] = { return Api.PollResults.parse_pollResults($0) } dict[-925415106] = { return Api.ChatParticipant.parse_chatParticipant($0) } dict[-636267638] = { return Api.ChatParticipant.parse_chatParticipantCreator($0) } diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index bf9f0ea4e7..ec550c5be8 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -51,7 +51,7 @@ public extension Api { } public enum ChatFull: TypeConstructorDescription { case chatFull(flags: Int32, id: Int32, about: String, participants: Api.ChatParticipants, chatPhoto: Api.Photo?, notifySettings: Api.PeerNotifySettings, exportedInvite: Api.ExportedChatInvite, botInfo: [Api.BotInfo]?, pinnedMsgId: Int32?, folderId: Int32?) - case channelFull(flags: Int32, id: Int32, about: String, participantsCount: Int32?, adminsCount: Int32?, kickedCount: Int32?, bannedCount: Int32?, onlineCount: Int32?, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, chatPhoto: Api.Photo, notifySettings: Api.PeerNotifySettings, exportedInvite: Api.ExportedChatInvite, botInfo: [Api.BotInfo], migratedFromChatId: Int32?, migratedFromMaxId: Int32?, pinnedMsgId: Int32?, stickerset: Api.StickerSet?, availableMinId: Int32?, folderId: Int32?, linkedChatId: Int32?, location: Api.ChannelLocation?, slowmodeSeconds: Int32?, slowmodeSecondsLeft: Int32?, pts: Int32) + case channelFull(flags: Int32, id: Int32, about: String, participantsCount: Int32?, adminsCount: Int32?, kickedCount: Int32?, bannedCount: Int32?, onlineCount: Int32?, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, chatPhoto: Api.Photo, notifySettings: Api.PeerNotifySettings, exportedInvite: Api.ExportedChatInvite, botInfo: [Api.BotInfo], migratedFromChatId: Int32?, migratedFromMaxId: Int32?, pinnedMsgId: Int32?, stickerset: Api.StickerSet?, availableMinId: Int32?, folderId: Int32?, linkedChatId: Int32?, location: Api.ChannelLocation?, slowmodeSeconds: Int32?, slowmodeNextSendDate: Int32?, pts: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -74,9 +74,9 @@ public extension Api { if Int(flags) & Int(1 << 6) != 0 {serializeInt32(pinnedMsgId!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 11) != 0 {serializeInt32(folderId!, buffer: buffer, boxed: false)} break - case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let location, let slowmodeSeconds, let slowmodeSecondsLeft, let pts): + case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let location, let slowmodeSeconds, let slowmodeNextSendDate, let pts): if boxed { - buffer.appendInt32(-23380031) + buffer.appendInt32(763976820) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(id, buffer: buffer, boxed: false) @@ -106,7 +106,7 @@ public extension Api { if Int(flags) & Int(1 << 14) != 0 {serializeInt32(linkedChatId!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 15) != 0 {location!.serialize(buffer, true)} if Int(flags) & Int(1 << 17) != 0 {serializeInt32(slowmodeSeconds!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 18) != 0 {serializeInt32(slowmodeSecondsLeft!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 18) != 0 {serializeInt32(slowmodeNextSendDate!, buffer: buffer, boxed: false)} serializeInt32(pts, buffer: buffer, boxed: false) break } @@ -116,8 +116,8 @@ public extension Api { switch self { case .chatFull(let flags, let id, let about, let participants, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let pinnedMsgId, let folderId): return ("chatFull", [("flags", flags), ("id", id), ("about", about), ("participants", participants), ("chatPhoto", chatPhoto), ("notifySettings", notifySettings), ("exportedInvite", exportedInvite), ("botInfo", botInfo), ("pinnedMsgId", pinnedMsgId), ("folderId", folderId)]) - case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let location, let slowmodeSeconds, let slowmodeSecondsLeft, let pts): - return ("channelFull", [("flags", flags), ("id", id), ("about", about), ("participantsCount", participantsCount), ("adminsCount", adminsCount), ("kickedCount", kickedCount), ("bannedCount", bannedCount), ("onlineCount", onlineCount), ("readInboxMaxId", readInboxMaxId), ("readOutboxMaxId", readOutboxMaxId), ("unreadCount", unreadCount), ("chatPhoto", chatPhoto), ("notifySettings", notifySettings), ("exportedInvite", exportedInvite), ("botInfo", botInfo), ("migratedFromChatId", migratedFromChatId), ("migratedFromMaxId", migratedFromMaxId), ("pinnedMsgId", pinnedMsgId), ("stickerset", stickerset), ("availableMinId", availableMinId), ("folderId", folderId), ("linkedChatId", linkedChatId), ("location", location), ("slowmodeSeconds", slowmodeSeconds), ("slowmodeSecondsLeft", slowmodeSecondsLeft), ("pts", pts)]) + case .channelFull(let flags, let id, let about, let participantsCount, let adminsCount, let kickedCount, let bannedCount, let onlineCount, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let migratedFromChatId, let migratedFromMaxId, let pinnedMsgId, let stickerset, let availableMinId, let folderId, let linkedChatId, let location, let slowmodeSeconds, let slowmodeNextSendDate, let pts): + return ("channelFull", [("flags", flags), ("id", id), ("about", about), ("participantsCount", participantsCount), ("adminsCount", adminsCount), ("kickedCount", kickedCount), ("bannedCount", bannedCount), ("onlineCount", onlineCount), ("readInboxMaxId", readInboxMaxId), ("readOutboxMaxId", readOutboxMaxId), ("unreadCount", unreadCount), ("chatPhoto", chatPhoto), ("notifySettings", notifySettings), ("exportedInvite", exportedInvite), ("botInfo", botInfo), ("migratedFromChatId", migratedFromChatId), ("migratedFromMaxId", migratedFromMaxId), ("pinnedMsgId", pinnedMsgId), ("stickerset", stickerset), ("availableMinId", availableMinId), ("folderId", folderId), ("linkedChatId", linkedChatId), ("location", location), ("slowmodeSeconds", slowmodeSeconds), ("slowmodeNextSendDate", slowmodeNextSendDate), ("pts", pts)]) } } @@ -261,7 +261,7 @@ public extension Api { let _c25 = (Int(_1!) & Int(1 << 18) == 0) || _25 != nil let _c26 = _26 != nil if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 && _c18 && _c19 && _c20 && _c21 && _c22 && _c23 && _c24 && _c25 && _c26 { - return Api.ChatFull.channelFull(flags: _1!, id: _2!, about: _3!, participantsCount: _4, adminsCount: _5, kickedCount: _6, bannedCount: _7, onlineCount: _8, readInboxMaxId: _9!, readOutboxMaxId: _10!, unreadCount: _11!, chatPhoto: _12!, notifySettings: _13!, exportedInvite: _14!, botInfo: _15!, migratedFromChatId: _16, migratedFromMaxId: _17, pinnedMsgId: _18, stickerset: _19, availableMinId: _20, folderId: _21, linkedChatId: _22, location: _23, slowmodeSeconds: _24, slowmodeSecondsLeft: _25, pts: _26!) + return Api.ChatFull.channelFull(flags: _1!, id: _2!, about: _3!, participantsCount: _4, adminsCount: _5, kickedCount: _6, bannedCount: _7, onlineCount: _8, readInboxMaxId: _9!, readOutboxMaxId: _10!, unreadCount: _11!, chatPhoto: _12!, notifySettings: _13!, exportedInvite: _14!, botInfo: _15!, migratedFromChatId: _16, migratedFromMaxId: _17, pinnedMsgId: _18, stickerset: _19, availableMinId: _20, folderId: _21, linkedChatId: _22, location: _23, slowmodeSeconds: _24, slowmodeNextSendDate: _25, pts: _26!) } else { return nil diff --git a/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift b/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift index 0e010fb389..46d1bfeb4f 100644 --- a/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift +++ b/submodules/TelegramCore/TelegramCore/UpdateCachedPeerData.swift @@ -280,7 +280,7 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerI } switch fullChat { - case let .channelFull(flags, _, about, participantsCount, adminsCount, kickedCount, bannedCount, _, _, _, _, _, _, apiExportedInvite, apiBotInfos, migratedFromChatId, migratedFromMaxId, pinnedMsgId, stickerSet, minAvailableMsgId, folderId, linkedChatId, location, slowmodeSeconds, slowmodeSecondsLeft, pts): + case let .channelFull(flags, _, about, participantsCount, adminsCount, kickedCount, bannedCount, _, _, _, _, _, _, apiExportedInvite, apiBotInfos, migratedFromChatId, migratedFromMaxId, pinnedMsgId, stickerSet, minAvailableMsgId, folderId, linkedChatId, location, slowmodeSeconds, slowmodeNextSendDate, pts): var channelFlags = CachedChannelFlags() if (flags & (1 << 3)) != 0 { channelFlags.insert(.canDisplayParticipants) @@ -404,10 +404,7 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerI .withUpdatedLinkedDiscussionPeerId(linkedDiscussionPeerId) .withUpdatedPeerGeoLocation(peerGeoLocation: peerGeoLocation) .withUpdatedSlowModeTimeout(slowModeTimeout: slowmodeSeconds) - .withUpdatedSlowModeValidUntilTimestamp(slowModeValidUntilTimestamp: slowmodeSecondsLeft.flatMap({ value in - let timestamp = network.getApproximateRemoteTimestamp() - return timestamp + value - })) + .withUpdatedSlowModeValidUntilTimestamp(slowModeValidUntilTimestamp: slowmodeNextSendDate) }) if let minAvailableMessageId = minAvailableMessageId, minAvailableMessageIdUpdated { From 8f6af2ce1e5710ec7d20ce5c1d605fe7902c1879 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 16 Jul 2019 16:39:45 +0100 Subject: [PATCH 12/32] Fix frame preview --- .../Sources/MediaPlayerFramePreview.swift | 34 ++++++++++++------- .../UniversalSoftwareVideoSource.swift | 24 ++++++++++--- submodules/Postbox/Postbox/MediaBox.swift | 2 +- .../UniversalVideoGalleryItem.swift | 10 +++++- 4 files changed, 51 insertions(+), 19 deletions(-) diff --git a/submodules/MediaPlayer/Sources/MediaPlayerFramePreview.swift b/submodules/MediaPlayer/Sources/MediaPlayerFramePreview.swift index 883595ab89..1abdc20c9c 100644 --- a/submodules/MediaPlayer/Sources/MediaPlayerFramePreview.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayerFramePreview.swift @@ -28,13 +28,18 @@ private func initializedPreviewContext(queue: Queue, postbox: Postbox, fileRefer } } +public enum MediaPlayerFramePreviewResult { + case image(UIImage) + case waitingForData +} + private final class MediaPlayerFramePreviewImpl { private let queue: Queue private let context: Promise> private let currentFrameDisposable = MetaDisposable() private var currentFrameTimestamp: Double? private var nextFrameTimestamp: Double? - fileprivate let framePipe = ValuePipe() + fileprivate let framePipe = ValuePipe() init(queue: Queue, postbox: Postbox, fileReference: FileMediaReference) { self.queue = queue @@ -63,17 +68,22 @@ private final class MediaPlayerFramePreviewImpl { return } context.with { context in - let disposable = context.source.takeFrame(at: timestamp).start(next: { image in + let disposable = context.source.takeFrame(at: timestamp).start(next: { result in guard let strongSelf = self else { return } - if let image = image { - strongSelf.framePipe.putNext(image) - } - strongSelf.currentFrameTimestamp = nil - if let nextFrameTimestamp = strongSelf.nextFrameTimestamp { - strongSelf.nextFrameTimestamp = nil - strongSelf.generateFrame(at: nextFrameTimestamp) + switch result { + case .waitingForData: + strongSelf.framePipe.putNext(.waitingForData) + case let .image(image): + if let image = image { + strongSelf.framePipe.putNext(.image(image)) + } + strongSelf.currentFrameTimestamp = nil + if let nextFrameTimestamp = strongSelf.nextFrameTimestamp { + strongSelf.nextFrameTimestamp = nil + strongSelf.generateFrame(at: nextFrameTimestamp) + } } }) takeDisposable.set(disposable) @@ -97,12 +107,12 @@ public final class MediaPlayerFramePreview { private let queue: Queue private let impl: QueueLocalObject - public var generatedFrames: Signal { + public var generatedFrames: Signal { return Signal { subscriber in let disposable = MetaDisposable() self.impl.with { impl in - disposable.set(impl.framePipe.signal().start(next: { image in - subscriber.putNext(image) + disposable.set(impl.framePipe.signal().start(next: { result in + subscriber.putNext(result) })) } return disposable diff --git a/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift b/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift index 040cb8b363..3f0e497059 100644 --- a/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift +++ b/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift @@ -13,12 +13,15 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa let requestRange: Range = context.readingOffset ..< (context.readingOffset + readCount) let semaphore = DispatchSemaphore(value: 0) - data = context.mediaBox.resourceData(context.fileReference.media.resource, size: context.size, in: requestRange, mode: .complete) + data = context.mediaBox.resourceData(context.fileReference.media.resource, size: context.size, in: requestRange, mode: .partial) + let requiredDataIsNotLocallyAvailable = context.requiredDataIsNotLocallyAvailable var fetchedData: Data? let disposable = data.start(next: { data in if data.count == readCount { fetchedData = data semaphore.signal() + } else { + requiredDataIsNotLocallyAvailable?() } }) let cancelDisposable = context.cancelRead.start(next: { value in @@ -87,6 +90,7 @@ private final class UniversalSoftwareVideoSourceImpl { fileprivate var readingOffset: Int = 0 fileprivate var cancelRead: Signal + fileprivate var requiredDataIsNotLocallyAvailable: (() -> Void)? init?(mediaBox: MediaBox, fileReference: FileMediaReference, state: ValuePromise, cancelInitialization: Signal) { guard let size = fileReference.media.size else { @@ -273,11 +277,13 @@ private final class UniversalSoftwareVideoSourceTakeFrameParams: NSObject { let timestamp: Double let completion: (UIImage?) -> Void let cancel: Signal + let requiredDataIsNotLocallyAvailable: () -> Void - init(timestamp: Double, completion: @escaping (UIImage?) -> Void, cancel: Signal) { + init(timestamp: Double, completion: @escaping (UIImage?) -> Void, cancel: Signal, requiredDataIsNotLocallyAvailable: @escaping () -> Void) { self.timestamp = timestamp self.completion = completion self.cancel = cancel + self.requiredDataIsNotLocallyAvailable = requiredDataIsNotLocallyAvailable } } @@ -314,6 +320,7 @@ private final class UniversalSoftwareVideoSourceThread: NSObject { return } source.cancelRead = params.cancel + source.requiredDataIsNotLocallyAvailable = params.requiredDataIsNotLocallyAvailable source.state.set(.generatingFrame) let startTime = CFAbsoluteTimeGetCurrent() source.seek(timestamp: params.timestamp) @@ -324,6 +331,11 @@ private final class UniversalSoftwareVideoSourceThread: NSObject { } } +enum UniversalSoftwareVideoSourceTakeFrameResult { + case waitingForData + case image(UIImage?) +} + final class UniversalSoftwareVideoSource { private let thread: Thread private let stateValue: ValuePromise = ValuePromise(.initializing, ignoreRepeated: true) @@ -352,13 +364,15 @@ final class UniversalSoftwareVideoSource { self.cancelInitialization.set(true) } - public func takeFrame(at timestamp: Double) -> Signal { + public func takeFrame(at timestamp: Double) -> Signal { return Signal { subscriber in let cancel = ValuePromise(false) UniversalSoftwareVideoSourceThread.self.perform(#selector(UniversalSoftwareVideoSourceThread.takeFrame(_:)), on: self.thread, with: UniversalSoftwareVideoSourceTakeFrameParams(timestamp: timestamp, completion: { image in - subscriber.putNext(image) + subscriber.putNext(.image(image)) subscriber.putCompletion() - }, cancel: cancel.get()), waitUntilDone: false) + }, cancel: cancel.get(), requiredDataIsNotLocallyAvailable: { + subscriber.putNext(.waitingForData) + }), waitUntilDone: false) return ActionDisposable { cancel.set(true) diff --git a/submodules/Postbox/Postbox/MediaBox.swift b/submodules/Postbox/Postbox/MediaBox.swift index 9408d33f2f..9cd04f3ef1 100644 --- a/submodules/Postbox/Postbox/MediaBox.swift +++ b/submodules/Postbox/Postbox/MediaBox.swift @@ -561,7 +561,7 @@ public final class MediaBox { case .incremental: break case .partial: - break + subscriber.putNext(Data()) } } } diff --git a/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift b/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift index 9e1d5c9c1f..9d545275e0 100644 --- a/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift @@ -215,7 +215,15 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { if let timecode = timecode { if !strongSelf.scrubbingFrames { strongSelf.scrubbingFrames = true - strongSelf.scrubbingFrame.set(videoFramePreview.generatedFrames) + strongSelf.scrubbingFrame.set(videoFramePreview.generatedFrames + |> map { result -> UIImage? in + switch result { + case .waitingForData: + return nil + case let .image(image): + return image + } + }) } videoFramePreview.generateFrame(at: timecode) } else { From 10b5ea4cb44e00e940345a9a4d080bd2b99709f1 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 16 Jul 2019 18:31:18 +0100 Subject: [PATCH 13/32] Use direct buffer access --- submodules/ffmpeg/FFMpeg/FFMpegAVIOContext.m | 1 + 1 file changed, 1 insertion(+) diff --git a/submodules/ffmpeg/FFMpeg/FFMpegAVIOContext.m b/submodules/ffmpeg/FFMpeg/FFMpegAVIOContext.m index 5704c84051..2bce9764d1 100644 --- a/submodules/ffmpeg/FFMpeg/FFMpegAVIOContext.m +++ b/submodules/ffmpeg/FFMpeg/FFMpegAVIOContext.m @@ -15,6 +15,7 @@ if (self != nil) { void *avIoBuffer = av_malloc(bufferSize); _impl = avio_alloc_context(avIoBuffer, bufferSize, 0, opaqueContext, readPacket, nil, seek); + _impl->direct = 1; if (_impl == nil) { av_free(avIoBuffer); return nil; From 0bf61a2794e9b5ef22a63a6648b6c317418fc424 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 16 Jul 2019 20:28:29 +0100 Subject: [PATCH 14/32] Load frames for video preview from network --- .../FFMpegMediaFrameSourceContext.swift | 10 ++--- .../UniversalSoftwareVideoSource.swift | 15 ++++++- .../TelegramCore/FetchedMediaResource.swift | 10 ++--- .../TelegramCore/MultipartUpload.swift | 2 +- .../TelegramUI/ChatAnimationGalleryItem.swift | 2 +- .../TelegramUI/ChatDocumentGalleryItem.swift | 2 +- .../ChatExternalFileGalleryItem.swift | 2 +- .../TelegramUI/ChatImageGalleryItem.swift | 4 +- .../ChatItemGalleryFooterContentNode.swift | 11 +++++ .../ChatMediaInputStickerPackItem.swift | 2 +- ...atMessageInteractiveInstantVideoNode.swift | 2 +- .../ChatMessageInteractiveMediaNode.swift | 2 +- .../TelegramUI/TelegramUI/FetchManager.swift | 4 +- .../TelegramUI/FetchMediaUtils.swift | 4 +- .../TelegramUI/FetchVideoThumbnail.swift | 4 +- .../GroupStickerPackCurrentItem.swift | 2 +- .../TelegramUI/InstantImageGalleryItem.swift | 4 +- .../InstantPagePlayableVideoNode.swift | 2 +- .../TelegramUI/ItemListStickerPackItem.swift | 2 +- ...ultiplexedSoftwareVideoSourceManager.swift | 2 +- .../TelegramUI/NativeVideoContent.swift | 2 +- .../TelegramUI/TelegramUI/PeerAvatar.swift | 6 +-- .../PeerAvatarImageGalleryItem.swift | 4 +- .../TelegramUI/PhotoResources.swift | 42 +++++++++---------- .../TelegramUI/SaveToCameraRoll.swift | 2 +- .../TelegramUI/ShareController.swift | 2 +- .../TelegramUI/SharedMediaPlayer.swift | 2 +- .../SoftwareVideoLayerFrameManager.swift | 2 +- .../StickerPackPreviewController.swift | 2 +- .../TelegramUI/StickerResources.swift | 10 ++--- .../TransformOutgoingMessageMedia.swift | 4 +- .../UniversalVideoGalleryItem.swift | 24 ++++++----- .../TelegramUI/WallpaperGalleryItem.swift | 6 +-- .../TelegramUI/WallpaperResources.swift | 8 ++-- 34 files changed, 115 insertions(+), 89 deletions(-) diff --git a/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift index 3c4187814a..e70d62a4f4 100644 --- a/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift +++ b/submodules/MediaPlayer/Sources/FFMpegMediaFrameSourceContext.swift @@ -238,12 +238,12 @@ private func seekCallback(userData: UnsafeMutableRawPointer?, offset: Int64, whe if streamable { if context.tempFilePath == nil { let fetchRange: Range = context.readingOffset ..< Int(Int32.max) - context.fetchedDataDisposable.set(fetchedMediaResource(postbox: postbox, reference: resourceReference, range: (fetchRange, .elevated), statsCategory: statsCategory, preferBackgroundReferenceRevalidation: streamable).start()) + context.fetchedDataDisposable.set(fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, range: (fetchRange, .elevated), statsCategory: statsCategory, preferBackgroundReferenceRevalidation: streamable).start()) } } else if !context.requestedCompleteFetch && context.fetchAutomatically { context.requestedCompleteFetch = true if context.tempFilePath == nil { - context.fetchedDataDisposable.set(fetchedMediaResource(postbox: postbox, reference: resourceReference, statsCategory: statsCategory, preferBackgroundReferenceRevalidation: streamable).start()) + context.fetchedDataDisposable.set(fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, statsCategory: statsCategory, preferBackgroundReferenceRevalidation: streamable).start()) } } } @@ -330,12 +330,12 @@ final class FFMpegMediaFrameSourceContext: NSObject { if streamable { if self.tempFilePath == nil { - self.fetchedDataDisposable.set(fetchedMediaResource(postbox: postbox, reference: resourceReference, range: (0 ..< Int(Int32.max), .elevated), statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) + self.fetchedDataDisposable.set(fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, range: (0 ..< Int(Int32.max), .elevated), statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) } } else if !self.requestedCompleteFetch && self.fetchAutomatically { self.requestedCompleteFetch = true if self.tempFilePath == nil { - self.fetchedFullDataDisposable.set(fetchedMediaResource(postbox: postbox, reference: resourceReference, statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) + self.fetchedFullDataDisposable.set(fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) } } @@ -437,7 +437,7 @@ final class FFMpegMediaFrameSourceContext: NSObject { if streamable { if self.tempFilePath == nil { - self.fetchedFullDataDisposable.set(fetchedMediaResource(postbox: postbox, reference: resourceReference, range: (0 ..< Int(Int32.max), .default), statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) + self.fetchedFullDataDisposable.set(fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, range: (0 ..< Int(Int32.max), .default), statsCategory: self.statsCategory ?? .generic, preferBackgroundReferenceRevalidation: streamable).start()) } self.requestedCompleteFetch = true } diff --git a/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift b/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift index 3f0e497059..9eefce0a6b 100644 --- a/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift +++ b/submodules/MediaPlayer/Sources/UniversalSoftwareVideoSource.swift @@ -12,6 +12,9 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa let readCount = min(resourceSize - context.readingOffset, Int(bufferSize)) let requestRange: Range = context.readingOffset ..< (context.readingOffset + readCount) + context.currentNumberOfReads += 1 + context.currentReadBytes += readCount + let semaphore = DispatchSemaphore(value: 0) data = context.mediaBox.resourceData(context.fileReference.media.resource, size: context.size, in: requestRange, mode: .partial) let requiredDataIsNotLocallyAvailable = context.requiredDataIsNotLocallyAvailable @@ -29,10 +32,15 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa semaphore.signal() } }) + var fetchDisposable: Disposable? + if context.videoStream != nil { + fetchDisposable = fetchedMediaResource(mediaBox: context.mediaBox, reference: context.fileReference.resourceReference(context.fileReference.media.resource), ranges: [(requestRange, .elevated)]).start() + } semaphore.wait() disposable.dispose() cancelDisposable.dispose() + fetchDisposable?.dispose() if let fetchedData = fetchedData { fetchedData.withUnsafeBytes { (bytes: UnsafePointer) -> Void in @@ -91,6 +99,8 @@ private final class UniversalSoftwareVideoSourceImpl { fileprivate var cancelRead: Signal fileprivate var requiredDataIsNotLocallyAvailable: (() -> Void)? + fileprivate var currentNumberOfReads: Int = 0 + fileprivate var currentReadBytes: Int = 0 init?(mediaBox: MediaBox, fileReference: FileMediaReference, state: ValuePromise, cancelInitialization: Signal) { guard let size = fileReference.media.size else { @@ -229,10 +239,13 @@ private final class UniversalSoftwareVideoSourceImpl { func readImage() -> (UIImage?, CGFloat, CGFloat, Bool) { if let videoStream = self.videoStream { - for _ in 0 ..< 10 { + self.currentNumberOfReads = 0 + self.currentReadBytes = 0 + for i in 0 ..< 10 { let (decodableFrame, loop) = self.readDecodableFrame() if let decodableFrame = decodableFrame { if let renderedFrame = videoStream.decoder.render(frame: decodableFrame) { + print("Frame rendered in \(self.currentNumberOfReads) reads, \(self.currentReadBytes) bytes, total frames read: \(i + 1)") return (renderedFrame, CGFloat(videoStream.rotationAngle), CGFloat(videoStream.aspect), loop) } } diff --git a/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift b/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift index 8f5121035e..4804fd5553 100644 --- a/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift +++ b/submodules/TelegramCore/TelegramCore/FetchedMediaResource.swift @@ -519,21 +519,21 @@ final class TelegramCloudMediaResourceFetchInfo: MediaResourceFetchInfo { } } -public func fetchedMediaResource(postbox: Postbox, reference: MediaResourceReference, range: (Range, MediaBoxFetchPriority)? = nil, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal { - return fetchedMediaResource(postbox: postbox, reference: reference, ranges: range.flatMap({ [$0] }), statsCategory: statsCategory, reportResultStatus: reportResultStatus, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground) +public func fetchedMediaResource(mediaBox: MediaBox, reference: MediaResourceReference, range: (Range, MediaBoxFetchPriority)? = nil, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal { + return fetchedMediaResource(mediaBox: mediaBox, reference: reference, ranges: range.flatMap({ [$0] }), statsCategory: statsCategory, reportResultStatus: reportResultStatus, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground) } -public func fetchedMediaResource(postbox: Postbox, reference: MediaResourceReference, ranges: [(Range, MediaBoxFetchPriority)]?, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal { +public func fetchedMediaResource(mediaBox: MediaBox, reference: MediaResourceReference, ranges: [(Range, MediaBoxFetchPriority)]?, statsCategory: MediaResourceStatsCategory = .generic, reportResultStatus: Bool = false, preferBackgroundReferenceRevalidation: Bool = false, continueInBackground: Bool = false) -> Signal { if let ranges = ranges { let signals = ranges.map { (range, priority) -> Signal in - return postbox.mediaBox.fetchedResourceData(reference.resource, in: range, priority: priority, parameters: MediaResourceFetchParameters(tag: TelegramMediaResourceFetchTag(statsCategory: statsCategory), info: TelegramCloudMediaResourceFetchInfo(reference: reference, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground))) + return mediaBox.fetchedResourceData(reference.resource, in: range, priority: priority, parameters: MediaResourceFetchParameters(tag: TelegramMediaResourceFetchTag(statsCategory: statsCategory), info: TelegramCloudMediaResourceFetchInfo(reference: reference, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground))) } return combineLatest(signals) |> ignoreValues |> map { _ -> FetchResourceSourceType in .local } |> then(.single(.local)) } else { - return postbox.mediaBox.fetchedResource(reference.resource, parameters: MediaResourceFetchParameters(tag: TelegramMediaResourceFetchTag(statsCategory: statsCategory), info: TelegramCloudMediaResourceFetchInfo(reference: reference, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground)), implNext: reportResultStatus) + return mediaBox.fetchedResource(reference.resource, parameters: MediaResourceFetchParameters(tag: TelegramMediaResourceFetchTag(statsCategory: statsCategory), info: TelegramCloudMediaResourceFetchInfo(reference: reference, preferBackgroundReferenceRevalidation: preferBackgroundReferenceRevalidation, continueInBackground: continueInBackground)), implNext: reportResultStatus) } } diff --git a/submodules/TelegramCore/TelegramCore/MultipartUpload.swift b/submodules/TelegramCore/TelegramCore/MultipartUpload.swift index b2b195693f..4f006c7ab9 100644 --- a/submodules/TelegramCore/TelegramCore/MultipartUpload.swift +++ b/submodules/TelegramCore/TelegramCore/MultipartUpload.swift @@ -430,7 +430,7 @@ func multipartUpload(network: Network, postbox: Postbox, source: MultipartUpload case let .resource(resource): dataSignal = postbox.mediaBox.resourceData(resource.resource, option: .incremental(waitUntilFetchStatus: true)) |> map { MultipartUploadData.resourceData($0) } headerSize = resource.resource.headerSize - fetchedResource = fetchedMediaResource(postbox: postbox, reference: resource) + fetchedResource = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resource) |> map { _ in } case let .data(data): dataSignal = .single(.data(data)) diff --git a/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift index 578c2e6477..25432b9be3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatAnimationGalleryItem.swift @@ -336,7 +336,7 @@ final class ChatAnimationGalleryItemNode: ZoomableContentGalleryItemNode { case .Fetching: self.context.account.postbox.mediaBox.cancelInteractiveResourceFetch(resource.resource) case .Remote: - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: resource, statsCategory: statsCategory ?? .generic).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: resource, statsCategory: statsCategory ?? .generic).start()) default: break } diff --git a/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift index 396970d588..9e994f6f7b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatDocumentGalleryItem.swift @@ -382,7 +382,7 @@ class ChatDocumentGalleryItemNode: ZoomableContentGalleryItemNode, WKNavigationD case .Fetching: context.account.postbox.mediaBox.cancelInteractiveResourceFetch(fileReference.media.resource) case .Remote: - self.fetchDisposable.set(fetchedMediaResource(postbox: context.account.postbox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) default: break } diff --git a/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift index 31087e25ba..9e925fb975 100644 --- a/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatExternalFileGalleryItem.swift @@ -316,7 +316,7 @@ class ChatExternalFileGalleryItemNode: GalleryItemNode { case .Fetching: context.account.postbox.mediaBox.cancelInteractiveResourceFetch(fileReference.media.resource) case .Remote: - self.fetchDisposable.set(fetchedMediaResource(postbox: context.account.postbox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) default: break } diff --git a/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift b/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift index 49e12bb097..8b638b3172 100644 --- a/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatImageGalleryItem.swift @@ -221,7 +221,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { self.imageNode.setSignal(chatMessagePhoto(postbox: context.account.postbox, photoReference: imageReference), dispatchOnDisplayLink: false) self.zoomableContent = (largestSize.dimensions, self.imageNode) - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: imageReference.resourceReference(largestSize.resource)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: imageReference.resourceReference(largestSize.resource)).start()) self.setupStatus(resource: largestSize.resource) } else { self._ready.set(.single(Void())) @@ -463,7 +463,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { case .Fetching: self.context.account.postbox.mediaBox.cancelInteractiveResourceFetch(resource.resource) case .Remote: - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: resource, statsCategory: statsCategory ?? .generic).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: resource, statsCategory: statsCategory ?? .generic).start()) default: break } diff --git a/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift index 82f1eb905b..c09b73d672 100644 --- a/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatItemGalleryFooterContentNode.swift @@ -646,6 +646,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll imageFrame.origin.x = max(imageFrame.origin.x, leftInset + 10.0) videoFramePreviewNode.frame = imageFrame + videoFramePreviewNode.subnodes?.first?.frame = CGRect(origin: CGPoint(), size: imageFrame.size) } return panelHeight @@ -1021,6 +1022,12 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.fetchControl?() } + func setFramePreviewImageIsLoading() { + if self.videoFramePreviewNode?.image != nil { + //self.videoFramePreviewNode?.subnodes?.first?.alpha = 1.0 + } + } + func setFramePreviewImage(image: UIImage?) { if let image = image { let videoFramePreviewNode: ASImageNode @@ -1031,10 +1038,14 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll videoFramePreviewNode = ASImageNode() videoFramePreviewNode.displaysAsynchronously = false videoFramePreviewNode.displayWithoutProcessing = true + let dimNode = ASDisplayNode() + dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5) + videoFramePreviewNode.addSubnode(dimNode) self.videoFramePreviewNode = videoFramePreviewNode self.addSubnode(videoFramePreviewNode) animateIn = true } + videoFramePreviewNode.subnodes?.first?.alpha = 0.0 let updateLayout = videoFramePreviewNode.image?.size != image.size videoFramePreviewNode.image = image if updateLayout, let validLayout = self.validLayout { diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift index 26aeb93446..b874f8678b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift @@ -197,7 +197,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { } } if let resourceReference = resourceReference { - self.stickerFetchedDisposable.set(fetchedMediaResource(postbox: account.postbox, reference: resourceReference).start()) + self.stickerFetchedDisposable.set(fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: resourceReference).start()) } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift index e67014873b..a14ea83239 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift @@ -309,7 +309,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { if let updatedFile = updatedFile, updatedMedia { if let resource = updatedFile.previewRepresentations.first?.resource { - strongSelf.fetchedThumbnailDisposable.set(fetchedMediaResource(postbox: item.context.account.postbox, reference: FileMediaReference.message(message: MessageReference(item.message), media: updatedFile).resourceReference(resource)).start()) + strongSelf.fetchedThumbnailDisposable.set(fetchedMediaResource(mediaBox: item.context.account.postbox.mediaBox, reference: FileMediaReference.message(message: MessageReference(item.message), media: updatedFile).resourceReference(resource)).start()) } else { strongSelf.fetchedThumbnailDisposable.set(nil) } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index 4dfde50fa7..074ffc7141 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -511,7 +511,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode { updatedFetchControls = FetchControls(fetch: { manual in if let strongSelf = self { if file.isAnimated { - strongSelf.fetchDisposable.set(fetchedMediaResource(postbox: context.account.postbox, reference: AnyMediaReference.message(message: MessageReference(message), media: file).resourceReference(file.resource), statsCategory: statsCategoryForFileWithAttributes(file.attributes)).start()) + strongSelf.fetchDisposable.set(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: AnyMediaReference.message(message: MessageReference(message), media: file).resourceReference(file.resource), statsCategory: statsCategoryForFileWithAttributes(file.attributes)).start()) } else { strongSelf.fetchDisposable.set(messageMediaFileInteractiveFetched(context: context, message: message, file: file, userInitiated: manual).start()) } diff --git a/submodules/TelegramUI/TelegramUI/FetchManager.swift b/submodules/TelegramUI/TelegramUI/FetchManager.swift index 8ad30c60c5..e02ae126c1 100644 --- a/submodules/TelegramUI/TelegramUI/FetchManager.swift +++ b/submodules/TelegramUI/TelegramUI/FetchManager.swift @@ -272,7 +272,7 @@ private final class FetchManagerCategoryContext { parsedRanges = resultRanges } activeContext.disposable?.dispose() - activeContext.disposable = (fetchedMediaResource(postbox: self.postbox, reference: entry.resourceReference, ranges: parsedRanges, statsCategory: entry.statsCategory, reportResultStatus: true, continueInBackground: entry.userInitiated) + activeContext.disposable = (fetchedMediaResource(mediaBox: self.postbox.mediaBox, reference: entry.resourceReference, ranges: parsedRanges, statsCategory: entry.statsCategory, reportResultStatus: true, continueInBackground: entry.userInitiated) |> mapToSignal { type -> Signal in if let storeManager = storeManager, let mediaReference = entry.mediaReference, case .remote = type, let peerType = entry.storeToDownloadsPeerType { return storeDownloadedMedia(storeManager: storeManager, media: mediaReference, peerType: peerType) @@ -413,7 +413,7 @@ private final class FetchManagerCategoryContext { }) } else if ranges.isEmpty { } else { - activeContext.disposable = (fetchedMediaResource(postbox: self.postbox, reference: entry.resourceReference, ranges: parsedRanges, statsCategory: entry.statsCategory, reportResultStatus: true, continueInBackground: entry.userInitiated) + activeContext.disposable = (fetchedMediaResource(mediaBox: self.postbox.mediaBox, reference: entry.resourceReference, ranges: parsedRanges, statsCategory: entry.statsCategory, reportResultStatus: true, continueInBackground: entry.userInitiated) |> mapToSignal { type -> Signal in if let storeManager = storeManager, let mediaReference = entry.mediaReference, case .remote = type, let peerType = entry.storeToDownloadsPeerType { return storeDownloadedMedia(storeManager: storeManager, media: mediaReference, peerType: peerType) diff --git a/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift b/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift index 6062d9860f..25c0df6115 100644 --- a/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift +++ b/submodules/TelegramUI/TelegramUI/FetchMediaUtils.swift @@ -6,11 +6,11 @@ import SwiftSignalKit import TelegramUIPreferences public func freeMediaFileInteractiveFetched(account: Account, fileReference: FileMediaReference) -> Signal { - return fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(fileReference.media.resource)) + return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource)) } func freeMediaFileResourceInteractiveFetched(account: Account, fileReference: FileMediaReference, resource: MediaResource) -> Signal { - return fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(resource)) + return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(resource)) } func cancelFreeMediaFileInteractiveFetch(account: Account, file: TelegramMediaFile) { diff --git a/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift b/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift index 7b15a72e72..f485016bee 100644 --- a/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift +++ b/submodules/TelegramUI/TelegramUI/FetchVideoThumbnail.swift @@ -344,8 +344,8 @@ func fetchedPartialVideoThumbnailData(postbox: Postbox, fileReference: FileMedia subscriber.putCompletion() return EmptyDisposable } - let fetchedHead = fetchedMediaResource(postbox: postbox, reference: fileReference.resourceReference(fileReference.media.resource), range: (0 ..< min(size, headerSize), .elevated), statsCategory: .video, reportResultStatus: false, preferBackgroundReferenceRevalidation: false).start() - let fetchedTail = fetchedMediaResource(postbox: postbox, reference: fileReference.resourceReference(fileReference.media.resource), range: (max(0, size - tailSize) ..< size, .elevated), statsCategory: .video, reportResultStatus: false, preferBackgroundReferenceRevalidation: false).start() + let fetchedHead = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource), range: (0 ..< min(size, headerSize), .elevated), statsCategory: .video, reportResultStatus: false, preferBackgroundReferenceRevalidation: false).start() + let fetchedTail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource), range: (max(0, size - tailSize) ..< size, .elevated), statsCategory: .video, reportResultStatus: false, preferBackgroundReferenceRevalidation: false).start() return ActionDisposable { fetchedHead.dispose() diff --git a/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift b/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift index 2cd6ab35ba..537f326a34 100644 --- a/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift +++ b/submodules/TelegramUI/TelegramUI/GroupStickerPackCurrentItem.swift @@ -229,7 +229,7 @@ class GroupStickerPackCurrentItemNode: ItemListRevealOptionsItemNode { if fileUpdated { if let file = file { updatedImageSignal = chatMessageSticker(account: item.account, file: file, small: false) - updatedFetchSignal = fetchedMediaResource(postbox: item.account.postbox, reference: stickerPackFileReference(file).resourceReference(file.resource)) + updatedFetchSignal = fetchedMediaResource(mediaBox: item.account.postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(file.resource)) } else { updatedImageSignal = .single({ _ in return nil }) updatedFetchSignal = .complete() diff --git a/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift b/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift index b44d45f0ff..bcfd2415ce 100644 --- a/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/InstantImageGalleryItem.swift @@ -133,7 +133,7 @@ final class InstantImageGalleryItemNode: ZoomableContentGalleryItemNode { self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets(), emptyColor: .black))() self.imageNode.setSignal(chatMessagePhoto(postbox: self.context.account.postbox, photoReference: imageReference), dispatchOnDisplayLink: false) self.zoomableContent = (largestSize.dimensions, self.imageNode) - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: imageReference.resourceReference(largestSize.resource)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: imageReference.resourceReference(largestSize.resource)).start()) } else { self._ready.set(.single(Void())) } @@ -286,7 +286,7 @@ final class InstantImageGalleryItemNode: ZoomableContentGalleryItemNode { if let (context, media) = self.contextAndMedia, let fileReference = media.concrete(TelegramMediaFile.self) { if isVisible { - self.fetchDisposable.set(fetchedMediaResource(postbox: context.account.postbox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource)).start()) } else { self.fetchDisposable.set(nil) } diff --git a/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift b/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift index 4a1f95d6b8..2bcee6071d 100644 --- a/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/InstantPagePlayableVideoNode.swift @@ -57,7 +57,7 @@ final class InstantPagePlayableVideoNode: ASDisplayNode, InstantPageNode { self.addSubnode(self.videoNode) if let file = media.media as? TelegramMediaFile { - self.fetchedDisposable.set(fetchedMediaResource(postbox: context.account.postbox, reference: AnyMediaReference.webPage(webPage: WebpageReference(webPage), media: file).resourceReference(file.resource)).start()) + self.fetchedDisposable.set(fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: AnyMediaReference.webPage(webPage: WebpageReference(webPage), media: file).resourceReference(file.resource)).start()) self.statusDisposable.set((context.account.postbox.mediaBox.resourceStatus(file.resource) |> deliverOnMainQueue).start(next: { [weak self] status in displayLinkDispatcher.dispatch { diff --git a/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift index b49c7c0f15..5f24644910 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift @@ -375,7 +375,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { imageSize = imageBoundingSize } if fileUpdated, let resourceReference = resourceReference { - updatedFetchSignal = fetchedMediaResource(postbox: item.account.postbox, reference: resourceReference) + updatedFetchSignal = fetchedMediaResource(mediaBox: item.account.postbox.mediaBox, reference: resourceReference) } } else { updatedImageSignal = .single({ _ in return nil }) diff --git a/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift b/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift index 61f789fb89..deff80076a 100644 --- a/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift +++ b/submodules/TelegramUI/TelegramUI/MultiplexedSoftwareVideoSourceManager.swift @@ -66,7 +66,7 @@ final class MultiplexedSoftwareVideoSourceManager { context.source = SoftwareVideoSource(path: data.path) } } - }), fetchStatusDisposable: fetchedMediaResource(postbox: self.account.postbox, reference: AnyMediaReference.standalone(media: file).resourceReference(file.resource)).start()) + }), fetchStatusDisposable: fetchedMediaResource(mediaBox: self.account.postbox.mediaBox, reference: AnyMediaReference.standalone(media: file).resourceReference(file.resource)).start()) } } } diff --git a/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift b/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift index 962bb21008..7458ad6094 100644 --- a/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift +++ b/submodules/TelegramUI/TelegramUI/NativeVideoContent.swift @@ -312,7 +312,7 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent func fetchControl(_ control: UniversalVideoNodeFetchControl) { switch control { case .fetch: - self.fetchDisposable.set(fetchedMediaResource(postbox: self.postbox, reference: self.fileReference.resourceReference(self.fileReference.media.resource), statsCategory: statsCategoryForFileWithAttributes(self.fileReference.media.attributes)).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.postbox.mediaBox, reference: self.fileReference.resourceReference(self.fileReference.media.resource), statsCategory: statsCategoryForFileWithAttributes(self.fileReference.media.attributes)).start()) case .cancel: self.postbox.mediaBox.cancelInteractiveResourceFetch(self.fileReference.media.resource) } diff --git a/submodules/TelegramUI/TelegramUI/PeerAvatar.swift b/submodules/TelegramUI/TelegramUI/PeerAvatar.swift index 27dee710bf..53f5581b2b 100644 --- a/submodules/TelegramUI/TelegramUI/PeerAvatar.swift +++ b/submodules/TelegramUI/TelegramUI/PeerAvatar.swift @@ -44,11 +44,11 @@ public func peerAvatarImageData(account: Account, peer: Peer, authorOfMessage: M }) var fetchedDataDisposable: Disposable? if let peerReference = PeerReference(peer) { - fetchedDataDisposable = fetchedMediaResource(postbox: account.postbox, reference: .avatar(peer: peerReference, resource: smallProfileImage.resource), statsCategory: .generic).start() + fetchedDataDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: .avatar(peer: peerReference, resource: smallProfileImage.resource), statsCategory: .generic).start() } else if let authorOfMessage = authorOfMessage { - fetchedDataDisposable = fetchedMediaResource(postbox: account.postbox, reference: .messageAuthorAvatar(message: authorOfMessage, resource: smallProfileImage.resource), statsCategory: .generic).start() + fetchedDataDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: .messageAuthorAvatar(message: authorOfMessage, resource: smallProfileImage.resource), statsCategory: .generic).start() } else { - fetchedDataDisposable = fetchedMediaResource(postbox: account.postbox, reference: .standalone(resource: smallProfileImage.resource), statsCategory: .generic).start() + fetchedDataDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: .standalone(resource: smallProfileImage.resource), statsCategory: .generic).start() } return ActionDisposable { resourceDataDisposable.dispose() diff --git a/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift b/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift index 4678d64f96..2b289a341d 100644 --- a/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/PeerAvatarImageGalleryItem.swift @@ -174,7 +174,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode { self.imageNode.setSignal(chatAvatarGalleryPhoto(account: self.context.account, representations: representations), dispatchOnDisplayLink: false) self.zoomableContent = (largestSize.dimensions, self.imageNode) if let largestIndex = representations.index(where: { $0.representation == largestSize }) { - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: representations[largestIndex].reference).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: representations[largestIndex].reference).start()) } self.statusDisposable.set((self.context.account.postbox.mediaBox.resourceStatus(largestSize.resource) @@ -341,7 +341,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode { } if let largestIndex = representations.index(where: { $0.representation == largestSize }) { - self.fetchDisposable.set(fetchedMediaResource(postbox: self.context.account.postbox, reference: representations[largestIndex].reference).start()) + self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: representations[largestIndex].reference).start()) } default: break diff --git a/submodules/TelegramUI/TelegramUI/PhotoResources.swift b/submodules/TelegramUI/TelegramUI/PhotoResources.swift index d297052a78..bccee7a2e8 100644 --- a/submodules/TelegramUI/TelegramUI/PhotoResources.swift +++ b/submodules/TelegramUI/TelegramUI/PhotoResources.swift @@ -39,9 +39,9 @@ func chatMessagePhotoDatas(postbox: Postbox, photoReference: ImageMediaReference if let _ = decodedThumbnailData { fetchedThumbnail = .complete() } else { - fetchedThumbnail = fetchedMediaResource(postbox: postbox, reference: photoReference.resourceReference(smallestRepresentation.resource), statsCategory: .image) + fetchedThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: photoReference.resourceReference(smallestRepresentation.resource), statsCategory: .image) } - let fetchedFullSize = fetchedMediaResource(postbox: postbox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image) + let fetchedFullSize = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image) let anyThumbnail: [Signal] if tryAdditionalRepresentations { @@ -148,7 +148,7 @@ private func chatMessageFileDatas(account: Account, fileReference: FileMediaRefe if !fetched, let _ = decodedThumbnailData { fetchedThumbnail = .single(.local) } else if let thumbnailResource = thumbnailResource { - fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailResource), statsCategory: statsCategoryForFileWithAttributes(fileReference.media.attributes)) + fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource), statsCategory: statsCategoryForFileWithAttributes(fileReference.media.attributes)) } else { fetchedThumbnail = .complete() } @@ -211,7 +211,7 @@ private func chatMessageImageFileThumbnailDatas(account: Account, fileReference: if let decodedThumbnailData = decodedThumbnailData { if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200.0 || thumbnailRepresentation.dimensions.height > 200.0) { return Signal { subscriber in - let fetchedDisposable = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start() + let fetchedDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start() let thumbnailDisposable = account.postbox.mediaBox.resourceData(thumbnailRepresentation.resource, attemptSynchronously: false).start(next: { next in let data: Data? = next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []) subscriber.putNext(Tuple(data ?? decodedThumbnailData, nil, false)) @@ -226,7 +226,7 @@ private func chatMessageImageFileThumbnailDatas(account: Account, fileReference: return .single(Tuple(decodedThumbnailData, nil, false)) } } else if let thumbnailResource = thumbnailResource { - let fetchedThumbnail: Signal = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailResource)) + let fetchedThumbnail: Signal = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource)) return Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() let thumbnailDisposable = account.postbox.mediaBox.resourceData(thumbnailResource, pathExtension: pathExtension).start(next: { next in @@ -262,7 +262,7 @@ private func chatMessageImageFileThumbnailDatas(account: Account, fileReference: if let _ = fileReference.media.immediateThumbnailData { fetchedThumbnail = .complete() } else if let thumbnailResource = thumbnailResource { - fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailResource)) + fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource)) } else { fetchedThumbnail = .complete() } @@ -330,7 +330,7 @@ private func chatMessageVideoDatas(postbox: Postbox, fileReference: FileMediaRef } else if let decodedThumbnailData = fileReference.media.immediateThumbnailData.flatMap(decodeTinyThumbnail) { if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200.0 || thumbnailRepresentation.dimensions.height > 200.0) { thumbnail = Signal { subscriber in - let fetchedDisposable = fetchedMediaResource(postbox: postbox, reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start() + let fetchedDisposable = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start() let thumbnailDisposable = postbox.mediaBox.resourceData(thumbnailRepresentation.resource, attemptSynchronously: synchronousLoad).start(next: { next in let data: Data? = next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []) subscriber.putNext(data ?? decodedThumbnailData) @@ -346,7 +346,7 @@ private func chatMessageVideoDatas(postbox: Postbox, fileReference: FileMediaRef } } else if let thumbnailResource = thumbnailResource { thumbnail = Signal { subscriber in - let fetchedDisposable = fetchedMediaResource(postbox: postbox, reference: fileReference.resourceReference(thumbnailResource), statsCategory: .video).start() + let fetchedDisposable = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource), statsCategory: .video).start() let thumbnailDisposable = postbox.mediaBox.resourceData(thumbnailResource, attemptSynchronously: synchronousLoad).start(next: { next in subscriber.putNext(next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: [])) }, error: subscriber.putError, completed: subscriber.putCompletion) @@ -893,7 +893,7 @@ private func chatMessagePhotoThumbnailDatas(account: Account, photoReference: Im let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) return .single(Tuple(nil, loadedData, true)) } else { - let fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: photoReference.resourceReference(smallestRepresentation.resource), statsCategory: .image) + let fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: photoReference.resourceReference(smallestRepresentation.resource), statsCategory: .image) let thumbnail = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() @@ -1235,8 +1235,8 @@ private func avatarGalleryThumbnailDatas(postbox: Postbox, representations: [Ima let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) return .single(Tuple(nil, loadedData, true)) } else { - let fetchedThumbnail = fetchedMediaResource(postbox: postbox, reference: representations[smallestIndex].reference, statsCategory: .image) - let fetchedFullSize = fetchedMediaResource(postbox: postbox, reference: representations[largestIndex].reference, statsCategory: .image) + let fetchedThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: representations[smallestIndex].reference, statsCategory: .image) + let fetchedFullSize = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: representations[largestIndex].reference, statsCategory: .image) let thumbnail = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() @@ -1474,7 +1474,7 @@ func gifPaneVideoThumbnail(account: Account, videoReference: FileMediaReference) }, completed: { subscriber.putCompletion() }) - let fetched = fetchedMediaResource(postbox: account.postbox, reference: videoReference.resourceReference(thumbnailResource)).start() + let fetched = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: videoReference.resourceReference(thumbnailResource)).start() return ActionDisposable { data.dispose() fetched.dispose() @@ -1763,7 +1763,7 @@ func chatMessagePhotoStatus(context: AccountContext, messageId: MessageId, photo public func standaloneChatMessagePhotoInteractiveFetched(account: Account, photoReference: ImageMediaReference) -> Signal { if let largestRepresentation = largestRepresentationForPhoto(photoReference.media) { - return fetchedMediaResource(postbox: account.postbox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image, reportResultStatus: true) + return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image, reportResultStatus: true) |> mapToSignal { type -> Signal in return .single(type) } @@ -1774,7 +1774,7 @@ public func standaloneChatMessagePhotoInteractiveFetched(account: Account, photo public func chatMessagePhotoInteractiveFetched(context: AccountContext, photoReference: ImageMediaReference, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal { if let largestRepresentation = largestRepresentationForPhoto(photoReference.media) { - return fetchedMediaResource(postbox: context.account.postbox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image, reportResultStatus: true) + return fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: photoReference.resourceReference(largestRepresentation.resource), statsCategory: .image, reportResultStatus: true) |> mapToSignal { type -> Signal in if case .remote = type, let peerType = storeToDownloadsPeerType { return storeDownloadedMedia(storeManager: context.downloadedMediaStoreManager, media: photoReference.abstract, peerType: peerType) @@ -1798,7 +1798,7 @@ func chatMessagePhotoCancelInteractiveFetch(account: Account, photoReference: Im } func chatMessageWebFileInteractiveFetched(account: Account, image: TelegramMediaWebFile) -> Signal { - return fetchedMediaResource(postbox: account.postbox, reference: .standalone(resource: image.resource), statsCategory: .image) + return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: .standalone(resource: image.resource), statsCategory: .image) } func chatMessageWebFileCancelInteractiveFetch(account: Account, image: TelegramMediaWebFile) { @@ -1820,7 +1820,7 @@ func chatWebpageSnippetFileData(account: Account, fileReference: FileMediaRefere }, completed: { subscriber.putCompletion() })) - disposable.add(fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(resource)).start()) + disposable.add(fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(resource)).start()) return disposable } } @@ -1841,7 +1841,7 @@ func chatWebpageSnippetPhotoData(account: Account, photoReference: ImageMediaRef }, completed: { subscriber.putCompletion() })) - disposable.add(fetchedMediaResource(postbox: account.postbox, reference: photoReference.resourceReference(closestRepresentation.resource)).start()) + disposable.add(fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: photoReference.resourceReference(closestRepresentation.resource)).start()) return disposable } } else { @@ -1943,7 +1943,7 @@ private func chatSecretMessageVideoData(account: Account, fileReference: FileMed if let smallestRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) { let thumbnailResource = smallestRepresentation.resource - let fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(thumbnailResource)) + let fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource)) let decodedThumbnailData = fileReference.media.immediateThumbnailData.flatMap(decodeTinyThumbnail) @@ -2313,8 +2313,8 @@ private func avatarGalleryPhotoDatas(account: Account, fileReference: FileMediaR let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) return .single(Tuple(nil, loadedData, true)) } else { - let fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: representations[smallestIndex].reference) - let fetchedFullSize = fetchedMediaResource(postbox: account.postbox, reference: representations[largestIndex].reference) + let fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[smallestIndex].reference) + let fetchedFullSize = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[largestIndex].reference) let thumbnail = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() @@ -2792,7 +2792,7 @@ func playerAlbumArt(postbox: Postbox, fileReference: FileMediaReference?, albumA if let fileReference = fileReference, let smallestRepresentation = smallestImageRepresentation(fileReference.media.previewRepresentations) { let thumbnailResource = smallestRepresentation.resource - let fetchedThumbnail = fetchedMediaResource(postbox: postbox, reference: fileReference.resourceReference(thumbnailResource)) + let fetchedThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(thumbnailResource)) let thumbnail = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() diff --git a/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift b/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift index 280c0df029..f22e48de05 100644 --- a/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift +++ b/submodules/TelegramUI/TelegramUI/SaveToCameraRoll.swift @@ -45,7 +45,7 @@ private func fetchMediaData(context: AccountContext, postbox: Postbox, mediaRefe if let resource = resource { let fetchedData: Signal = Signal { subscriber in - let fetched = fetchedMediaResource(postbox: postbox, reference: mediaReference.resourceReference(resource)).start() + let fetched = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: mediaReference.resourceReference(resource)).start() let status = postbox.mediaBox.resourceStatus(resource).start(next: { status in switch status { case .Local: diff --git a/submodules/TelegramUI/TelegramUI/ShareController.swift b/submodules/TelegramUI/TelegramUI/ShareController.swift index bd10529239..75a715c8e6 100644 --- a/submodules/TelegramUI/TelegramUI/ShareController.swift +++ b/submodules/TelegramUI/TelegramUI/ShareController.swift @@ -54,7 +54,7 @@ private enum ExternalShareResourceStatus { private func collectExternalShareResource(postbox: Postbox, resourceReference: MediaResourceReference, statsCategory: MediaResourceStatsCategory) -> Signal { return Signal { subscriber in - let fetched = fetchedMediaResource(postbox: postbox, reference: resourceReference, statsCategory: statsCategory).start() + let fetched = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: resourceReference, statsCategory: statsCategory).start() let data = postbox.mediaBox.resourceData(resourceReference.resource, option: .complete(waitUntilFetchStatus: false)).start(next: { value in if value.complete { subscriber.putNext(.done(value)) diff --git a/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift b/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift index 3455ebf698..348dce7358 100644 --- a/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift +++ b/submodules/TelegramUI/TelegramUI/SharedMediaPlayer.swift @@ -751,7 +751,7 @@ final class SharedMediaPlayer { } switch next { case let .telegramFile(file): - fetchedNextSignal = fetchedMediaResource(postbox: self.account.postbox, reference: file.resourceReference(file.media.resource)) + fetchedNextSignal = fetchedMediaResource(mediaBox: self.account.postbox.mediaBox, reference: file.resourceReference(file.media.resource)) |> ignoreValues |> `catch` { _ -> Signal in return .complete() diff --git a/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift b/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift index 1867870198..7385a10619 100644 --- a/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift +++ b/submodules/TelegramUI/TelegramUI/SoftwareVideoLayerFrameManager.swift @@ -38,7 +38,7 @@ final class SoftwareVideoLayerFrameManager { self.layerHolder = layerHolder layerHolder.layer.videoGravity = .resizeAspectFill layerHolder.layer.masksToBounds = true - self.fetchDisposable = fetchedMediaResource(postbox: account.postbox, reference: fileReference.resourceReference(resource)).start() + self.fetchDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(resource)).start() } deinit { diff --git a/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift b/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift index c8c0c3b355..113d37d7db 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift @@ -149,7 +149,7 @@ final class StickerPackPreviewController: ViewController { for item in topItems { if let item = item as? StickerPackItem, item.file.isAnimatedSticker { let signal = Signal { subscriber in - let fetched = fetchedMediaResource(postbox: account.postbox, reference: FileMediaReference.standalone(media: item.file).resourceReference(item.file.resource)).start() + let fetched = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: FileMediaReference.standalone(media: item.file).resourceReference(item.file.resource)).start() let data = account.postbox.mediaBox.resourceData(item.file.resource).start() let fetchedRepresentation = chatMessageAnimatedStickerDatas(postbox: account.postbox, file: item.file, small: false, size: CGSize(width: 160.0, height: 160.0), fetched: true, onlyFullSize: false, synchronousLoad: false).start(next: { next in let hasContent = next._0 != nil || next._1 != nil diff --git a/submodules/TelegramUI/TelegramUI/StickerResources.swift b/submodules/TelegramUI/TelegramUI/StickerResources.swift index d8a893c765..a498108ecd 100644 --- a/submodules/TelegramUI/TelegramUI/StickerResources.swift +++ b/submodules/TelegramUI/TelegramUI/StickerResources.swift @@ -68,12 +68,12 @@ private func chatMessageStickerDatas(postbox: Postbox, file: TelegramMediaFile, return Signal { subscriber in var fetch: Disposable? if fetched { - fetch = fetchedMediaResource(postbox: postbox, reference: stickerPackFileReference(file).resourceReference(resource)).start() + fetch = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(resource)).start() } var fetchThumbnail: Disposable? if !thumbnailResource.id.isEqual(to: resource.id) { - fetchThumbnail = fetchedMediaResource(postbox: postbox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() + fetchThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() } let disposable = (combineLatest(thumbnailData, fullSizeData) |> map { thumbnailData, fullSizeData -> Tuple3 in @@ -119,12 +119,12 @@ func chatMessageAnimatedStickerDatas(postbox: Postbox, file: TelegramMediaFile, return Signal { subscriber in var fetch: Disposable? if fetched { - fetch = fetchedMediaResource(postbox: postbox, reference: stickerPackFileReference(file).resourceReference(resource)).start() + fetch = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(resource)).start() } var fetchThumbnail: Disposable? if !thumbnailResource.id.isEqual(to: resource.id) { - fetchThumbnail = fetchedMediaResource(postbox: postbox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() + fetchThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() } let disposable = (combineLatest(thumbnailData, fullSizeData) |> map { thumbnailData, fullSizeData -> Tuple3 in @@ -162,7 +162,7 @@ private func chatMessageStickerThumbnailData(postbox: Postbox, file: TelegramMed let thumbnailData = postbox.mediaBox.cachedResourceRepresentation(thumbnailResource, representation: CachedStickerAJpegRepresentation(size: nil), complete: false) return Signal { subscriber in - var fetchThumbnail = fetchedMediaResource(postbox: postbox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() + var fetchThumbnail = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: stickerPackFileReference(file).resourceReference(thumbnailResource)).start() let disposable = (thumbnailData |> map { thumbnailData -> Data? in diff --git a/submodules/TelegramUI/TelegramUI/TransformOutgoingMessageMedia.swift b/submodules/TelegramUI/TelegramUI/TransformOutgoingMessageMedia.swift index f132e68494..9322cca278 100644 --- a/submodules/TelegramUI/TelegramUI/TransformOutgoingMessageMedia.swift +++ b/submodules/TelegramUI/TelegramUI/TransformOutgoingMessageMedia.swift @@ -9,7 +9,7 @@ public func transformOutgoingMessageMedia(postbox: Postbox, network: Network, me switch media.media { case let file as TelegramMediaFile: let signal = Signal { subscriber in - let fetch = fetchedMediaResource(postbox: postbox, reference: media.resourceReference(file.resource)).start() + let fetch = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: media.resourceReference(file.resource)).start() let data = postbox.mediaBox.resourceData(file.resource, option: .complete(waitUntilFetchStatus: true)).start(next: { next in subscriber.putNext(next) if next.complete { @@ -125,7 +125,7 @@ public func transformOutgoingMessageMedia(postbox: Postbox, network: Network, me case let image as TelegramMediaImage: if let representation = largestImageRepresentation(image.representations) { let signal = Signal { subscriber in - let fetch = fetchedMediaResource(postbox: postbox, reference: media.resourceReference(representation.resource)).start() + let fetch = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: media.resourceReference(representation.resource)).start() let data = postbox.mediaBox.resourceData(representation.resource, option: .complete(waitUntilFetchStatus: true)).start(next: { next in subscriber.putNext(next) if next.complete { diff --git a/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift b/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift index 9d545275e0..c2b1b21df1 100644 --- a/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/UniversalVideoGalleryItem.swift @@ -179,7 +179,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private var fetchStatus: MediaResourceStatus? private var fetchControls: FetchControls? - private var scrubbingFrame = Promise(nil) + private var scrubbingFrame = Promise(nil) private var scrubbingFrames = false private var scrubbingFrameDisposable: Disposable? @@ -216,14 +216,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { if !strongSelf.scrubbingFrames { strongSelf.scrubbingFrames = true strongSelf.scrubbingFrame.set(videoFramePreview.generatedFrames - |> map { result -> UIImage? in - switch result { - case .waitingForData: - return nil - case let .image(image): - return image - } - }) + |> map(Optional.init)) } videoFramePreview.generateFrame(at: timecode) } else { @@ -287,11 +280,20 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } self.scrubbingFrameDisposable = (self.scrubbingFrame.get() - |> deliverOnMainQueue).start(next: { [weak self] image in + |> deliverOnMainQueue).start(next: { [weak self] result in guard let strongSelf = self else { return } - strongSelf.footerContentNode.setFramePreviewImage(image: image) + if let result = result { + switch result { + case .waitingForData: + strongSelf.footerContentNode.setFramePreviewImageIsLoading() + case let .image(image): + strongSelf.footerContentNode.setFramePreviewImage(image: image) + } + } else { + strongSelf.footerContentNode.setFramePreviewImage(image: nil) + } }) } diff --git a/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift b/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift index 2500879f77..487551af6b 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperGalleryItem.swift @@ -281,7 +281,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { } signal = wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, fileReference: fileReference, representations: convertedRepresentations, alwaysShowThumbnailFirst: true, autoFetchFullSize: false) } - fetchSignal = fetchedMediaResource(postbox: context.account.postbox, reference: convertedRepresentations[convertedRepresentations.count - 1].reference) + fetchSignal = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: convertedRepresentations[convertedRepresentations.count - 1].reference) let account = context.account statusSignal = context.sharedContext.accountManager.mediaBox.resourceStatus(file.file.resource) |> take(1) @@ -307,7 +307,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { signal = wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, representations: convertedRepresentations, alwaysShowThumbnailFirst: true, autoFetchFullSize: false) if let largestIndex = convertedRepresentations.index(where: { $0.representation == largestSize }) { - fetchSignal = fetchedMediaResource(postbox: context.account.postbox, reference: convertedRepresentations[largestIndex].reference) + fetchSignal = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: convertedRepresentations[largestIndex].reference) } else { fetchSignal = .complete() } @@ -402,7 +402,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: representations, immediateThumbnailData: nil, reference: nil, partialReference: nil) signal = chatMessagePhoto(postbox: context.account.postbox, photoReference: .standalone(media: tmpImage)) - fetchSignal = fetchedMediaResource(postbox: context.account.postbox, reference: .media(media: .standalone(media: tmpImage), resource: imageResource)) + fetchSignal = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: .media(media: .standalone(media: tmpImage), resource: imageResource)) statusSignal = context.account.postbox.mediaBox.resourceStatus(imageResource) } else { displaySize = CGSize(width: 1.0, height: 1.0) diff --git a/submodules/TelegramUI/TelegramUI/WallpaperResources.swift b/submodules/TelegramUI/TelegramUI/WallpaperResources.swift index 055e8fce06..678d6e03b6 100644 --- a/submodules/TelegramUI/TelegramUI/WallpaperResources.swift +++ b/submodules/TelegramUI/TelegramUI/WallpaperResources.swift @@ -73,10 +73,10 @@ private func wallpaperDatas(account: Account, accountManager: AccountManager, fi if let _ = decodedThumbnailData { fetchedThumbnail = .complete() } else { - fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: representations[smallestIndex].reference) + fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[smallestIndex].reference) } - let fetchedFullSize = fetchedMediaResource(postbox: account.postbox, reference: representations[largestIndex].reference) + let fetchedFullSize = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[largestIndex].reference) let thumbnailData: Signal if let decodedThumbnailData = decodedThumbnailData { @@ -303,8 +303,8 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana let loadedData: Data? = try? Data(contentsOf: URL(fileURLWithPath: maybeData.path), options: []) return .single((nil, loadedData, true)) } else { - let fetchedThumbnail = fetchedMediaResource(postbox: account.postbox, reference: representations[smallestIndex].reference) - let fetchedFullSize = fetchedMediaResource(postbox: account.postbox, reference: representations[largestIndex].reference) + let fetchedThumbnail = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[smallestIndex].reference) + let fetchedFullSize = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: representations[largestIndex].reference) let thumbnailData = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() From e906e0ee6ac4b1b77d018695d6768ff98d9d5f2e Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 11 Jul 2019 01:11:47 +0200 Subject: [PATCH 15/32] Present update info screen above everything else --- submodules/TelegramUI/TelegramUI/ApplicationContext.swift | 2 +- .../TelegramUI/TelegramUI/PresentationSurfaceLevels.swift | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift index c43b065bc2..f9a7928f99 100644 --- a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift +++ b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift @@ -522,7 +522,7 @@ final class AuthorizedApplicationContext { strongSelf.currentAppUpdateInfo = appUpdateInfo if let appUpdateInfo = appUpdateInfo { let controller = updateInfoController(context: strongSelf.context, appUpdateInfo: appUpdateInfo) - (strongSelf.rootController.viewControllers.last as? ViewController)?.present(controller, in: .window(.root)) + strongSelf.mainWindow.present(controller, on: .update) } })) diff --git a/submodules/TelegramUI/TelegramUI/PresentationSurfaceLevels.swift b/submodules/TelegramUI/TelegramUI/PresentationSurfaceLevels.swift index db5665f424..186255ed3e 100644 --- a/submodules/TelegramUI/TelegramUI/PresentationSurfaceLevels.swift +++ b/submodules/TelegramUI/TelegramUI/PresentationSurfaceLevels.swift @@ -7,4 +7,5 @@ public extension PresentationSurfaceLevel { static let overlayMedia = PresentationSurfaceLevel(rawValue: 2) static let notifications = PresentationSurfaceLevel(rawValue: 3) static let passcode = PresentationSurfaceLevel(rawValue: 4) + static let update = PresentationSurfaceLevel(rawValue: 5) } From f5e2d58a840d1bc3c18c22ffef4f471cdc89a338 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 11 Jul 2019 02:38:41 +0200 Subject: [PATCH 16/32] Fixed blocking app update flag --- submodules/TelegramCore/TelegramCore/AppUpdate.swift | 4 ++-- submodules/TelegramUI/TelegramUI/UpdateInfoController.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/submodules/TelegramCore/TelegramCore/AppUpdate.swift b/submodules/TelegramCore/TelegramCore/AppUpdate.swift index 3bc38c3316..41cb4ae90f 100644 --- a/submodules/TelegramCore/TelegramCore/AppUpdate.swift +++ b/submodules/TelegramCore/TelegramCore/AppUpdate.swift @@ -16,7 +16,7 @@ import Foundation #endif public struct AppUpdateInfo: Equatable { - public let popup: Bool + public let blocking: Bool public let version: String public let text: String public let entities: [MessageTextEntity] @@ -26,7 +26,7 @@ extension AppUpdateInfo { init?(apiAppUpdate: Api.help.AppUpdate) { switch apiAppUpdate { case let .appUpdate(flags, _, version, text, entities, _, _): - self.popup = (flags & (1 << 0)) != 0 + self.blocking = (flags & (1 << 0)) != 0 self.version = version self.text = text self.entities = messageTextEntitiesFromApiEntities(entities) diff --git a/submodules/TelegramUI/TelegramUI/UpdateInfoController.swift b/submodules/TelegramUI/TelegramUI/UpdateInfoController.swift index 02bea114a0..04a1dd054c 100644 --- a/submodules/TelegramUI/TelegramUI/UpdateInfoController.swift +++ b/submodules/TelegramUI/TelegramUI/UpdateInfoController.swift @@ -113,9 +113,9 @@ public func updateInfoController(context: AccountContext, appUpdateInfo: AppUpda appIcon = appIcons.filter { $0.isDefault }.first } - let leftNavigationButton = appUpdateInfo.popup ? ItemListNavigationButton(content: .text(presentationData.strings.Update_Skip), style: .regular, enabled: true, action: { + let leftNavigationButton = appUpdateInfo.blocking ? nil : ItemListNavigationButton(content: .text(presentationData.strings.Update_Skip), style: .regular, enabled: true, action: { dismissImpl?() - }) : nil + }) let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Update_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back)) let listState = ItemListNodeState(entries: updateInfoControllerEntries(theme: presentationData.theme, strings: presentationData.strings, appIcon: appIcon, appUpdateInfo: appUpdateInfo), style: .blocks, animateChanges: false) From d28e6ebe57a1b57698fb02f5d146efd5d9cdb6e0 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 11 Jul 2019 02:39:52 +0200 Subject: [PATCH 17/32] Added Moovit to available Open In options --- Telegram-iOS/Info.plist | 3 +-- .../TelegramUI/TelegramUI/OpenInOptions.swift | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Telegram-iOS/Info.plist b/Telegram-iOS/Info.plist index 1c01c0b648..83072fc8ce 100644 --- a/Telegram-iOS/Info.plist +++ b/Telegram-iOS/Info.plist @@ -228,9 +228,7 @@ LSApplicationQueriesSchemes - dbapi-3 instagram - googledrive comgooglemaps-x-callback foursquare here-location @@ -257,6 +255,7 @@ opera-https firefox-focus ddgQuickLink + moovit LSRequiresIPhoneOS diff --git a/submodules/TelegramUI/TelegramUI/OpenInOptions.swift b/submodules/TelegramUI/TelegramUI/OpenInOptions.swift index 79e0902c47..1a5e612612 100644 --- a/submodules/TelegramUI/TelegramUI/OpenInOptions.swift +++ b/submodules/TelegramUI/TelegramUI/OpenInOptions.swift @@ -192,6 +192,20 @@ private func allOpenInOptions(context: AccountContext, item: OpenInItem) -> [Ope return .openUrl(url: "yandexnavi://build_route_on_map?lat_to=\(lat)&lon_to=\(lon)") })) } + + options.append(OpenInOption(application: .other(title: "Moovit", identifier: 498477945, scheme: "moovit", store: nil), action: { + if withDirections { + let destName: String + if let title = location.venue?.title.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed), title.count > 0 { + destName = title + } else { + destName = "" + } + return .openUrl(url: "moovit://directions?dest_lat=\(lat)&dest_lon=\(lon)&dest_name=\(destName)&partner_id=Telegram") + } else { + return .openUrl(url: "moovit://nearby?lat=\(lat)&lon=\(lon)&partner_id=Telegram") + } + })) if !withDirections { options.append(OpenInOption(application: .other(title: "HERE Maps", identifier: 955837609, scheme: "here-location", store: nil), action: { From 5abbf5638d950583152924d6d51662c2f55dfd50 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 11 Jul 2019 02:41:06 +0200 Subject: [PATCH 18/32] Fixed GIFs not respecting autoplay preference --- .../TelegramUI/ChatMessageMediaBubbleContentNode.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift index 83d69b04df..9f0b6b80f2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift @@ -81,13 +81,13 @@ class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode { } if !item.message.containsSecretMedia { - if telegramFile.isAnimated { + if telegramFile.isAnimated && item.controllerInteraction.automaticMediaDownloadSettings.autoplayGifs { if case .full = automaticDownload { - automaticPlayback = item.controllerInteraction.automaticMediaDownloadSettings.autoplayGifs + automaticPlayback = true //item.controllerInteraction.automaticMediaDownloadSettings.autoplayGifs } else { automaticPlayback = item.context.account.postbox.mediaBox.completedResourcePath(telegramFile.resource) != nil } - } else if telegramFile.isVideo && item.controllerInteraction.automaticMediaDownloadSettings.autoplayVideos { + } else if (telegramFile.isVideo && !telegramFile.isAnimated) && item.controllerInteraction.automaticMediaDownloadSettings.autoplayVideos { if case .full = automaticDownload { automaticPlayback = true } else { From f980f2ce665e367adcfc7d2610583e3818a0e5e2 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 11 Jul 2019 02:42:38 +0200 Subject: [PATCH 19/32] Fixed trending stickers dot icon size --- .../TelegramUI/TelegramUI/ChatMediaInputTrendingItem.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingItem.swift index 21cca6add2..c8fda5be13 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingItem.swift @@ -108,14 +108,14 @@ final class ChatMediaInputTrendingItemNode: ListViewItemNode { self.highlightNode.image = PresentationResourcesChat.chatMediaInputPanelHighlightedIconImage(theme) self.imageNode.image = PresentationResourcesChat.chatInputMediaPanelTrendingIconImage(theme) - self.badgeBackground.image = generateFilledCircleImage(diameter: 16.0, color: theme.chat.inputPanel.mediaRecordingDotColor) + self.badgeBackground.image = generateFilledCircleImage(diameter: 10.0, color: theme.chat.inputPanel.mediaRecordingDotColor) let imageSize = CGSize(width: 26.0, height: 26.0) let imageFrame = CGRect(origin: CGPoint(x: floor((boundingSize.width - imageSize.width) / 2.0) + verticalOffset, y: floor((boundingSize.height - imageSize.height) / 2.0) + UIScreenPixel), size: imageSize) self.imageNode.frame = imageFrame if let image = self.badgeBackground.image { - self.badgeBackground.frame = CGRect(origin: CGPoint(x: imageFrame.maxX - image.size.width + 2.0, y: imageFrame.maxY - image.size.width + 3.0), size: image.size) + self.badgeBackground.frame = CGRect(origin: CGPoint(x: imageFrame.maxX - image.size.width - 1.0, y: imageFrame.maxY - image.size.width + 1.0), size: image.size) } } From ccaa76842a46d0d62f0d23caa8ef52db7081c976 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 11 Jul 2019 02:44:16 +0200 Subject: [PATCH 20/32] Disable scroll in blocked users & recent sessions screens when there's nothing to show --- submodules/Display/Display/ListView.swift | 6 ++++++ .../TelegramUI/BlockedPeersController.swift | 2 +- .../TelegramUI/ItemListControllerNode.swift | 12 ++++++------ .../TelegramUI/RecentSessionsController.swift | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/submodules/Display/Display/ListView.swift b/submodules/Display/Display/ListView.swift index a7772d76cb..202cbbce5a 100644 --- a/submodules/Display/Display/ListView.swift +++ b/submodules/Display/Display/ListView.swift @@ -149,6 +149,12 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture public final var rotated = false public final var experimentalSnapScrollToItem = false + public final var scrollEnabled: Bool = true { + didSet { + self.scroller.isScrollEnabled = self.scrollEnabled + } + } + private final var invisibleInset: CGFloat = 500.0 public var preloadPages: Bool = true { didSet { diff --git a/submodules/TelegramUI/TelegramUI/BlockedPeersController.swift b/submodules/TelegramUI/TelegramUI/BlockedPeersController.swift index 37032904d6..96679afd4d 100644 --- a/submodules/TelegramUI/TelegramUI/BlockedPeersController.swift +++ b/submodules/TelegramUI/TelegramUI/BlockedPeersController.swift @@ -288,7 +288,7 @@ public func blockedPeersController(context: AccountContext, blockedPeersContext: previousState = blockedPeersState let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.BlockedUsers_Title), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) - let listState = ItemListNodeState(entries: blockedPeersControllerEntries(presentationData: presentationData, state: state, blockedPeersState: blockedPeersState), style: .blocks, emptyStateItem: emptyStateItem, animateChanges: previousStateValue != nil && previousStateValue!.peers.count >= blockedPeersState.peers.count) + let listState = ItemListNodeState(entries: blockedPeersControllerEntries(presentationData: presentationData, state: state, blockedPeersState: blockedPeersState), style: .blocks, emptyStateItem: emptyStateItem, animateChanges: previousStateValue != nil && previousStateValue!.peers.count >= blockedPeersState.peers.count, scrollEnabled: emptyStateItem == nil) return (controllerState, (listState, arguments)) } diff --git a/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift b/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift index c24b1601ee..6d0b25e53c 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListControllerNode.swift @@ -56,7 +56,7 @@ private struct ItemListNodeTransition { let animateAlpha: Bool let crossfade: Bool let mergedEntries: [Entry] - let userInteractionEnabled: Bool + let scrollEnabled: Bool } struct ItemListNodeState { @@ -66,12 +66,12 @@ struct ItemListNodeState { let searchItem: ItemListControllerSearch? let animateChanges: Bool let crossfadeState: Bool - let userInteractionEnabled: Bool + let scrollEnabled: Bool let focusItemTag: ItemListItemTag? let ensureVisibleItemTag: ItemListItemTag? let initialScrollToItem: ListViewScrollToItem? - init(entries: [Entry], style: ItemListStyle, focusItemTag: ItemListItemTag? = nil, ensureVisibleItemTag: ItemListItemTag? = nil, emptyStateItem: ItemListControllerEmptyStateItem? = nil, searchItem: ItemListControllerSearch? = nil, initialScrollToItem: ListViewScrollToItem? = nil, crossfadeState: Bool = false, animateChanges: Bool = true, userInteractionEnabled: Bool = true) { + init(entries: [Entry], style: ItemListStyle, focusItemTag: ItemListItemTag? = nil, ensureVisibleItemTag: ItemListItemTag? = nil, emptyStateItem: ItemListControllerEmptyStateItem? = nil, searchItem: ItemListControllerSearch? = nil, initialScrollToItem: ListViewScrollToItem? = nil, crossfadeState: Bool = false, animateChanges: Bool = true, scrollEnabled: Bool = true) { self.entries = entries self.style = style self.emptyStateItem = emptyStateItem @@ -81,7 +81,7 @@ struct ItemListNodeState { self.focusItemTag = focusItemTag self.ensureVisibleItemTag = ensureVisibleItemTag self.initialScrollToItem = initialScrollToItem - self.userInteractionEnabled = userInteractionEnabled + self.scrollEnabled = scrollEnabled } } @@ -275,7 +275,7 @@ class ItemListControllerNode: ASDisplayNode, UIScrollV scrollToItem = state.initialScrollToItem } - return ItemListNodeTransition(theme: theme, entries: transition, updateStyle: updatedStyle, emptyStateItem: state.emptyStateItem, searchItem: state.searchItem, focusItemTag: state.focusItemTag, ensureVisibleItemTag: state.ensureVisibleItemTag, scrollToItem: scrollToItem, firstTime: previous == nil, animated: previous != nil && state.animateChanges, animateAlpha: previous != nil && state.animateChanges, crossfade: state.crossfadeState, mergedEntries: state.entries, userInteractionEnabled: state.userInteractionEnabled) + return ItemListNodeTransition(theme: theme, entries: transition, updateStyle: updatedStyle, emptyStateItem: state.emptyStateItem, searchItem: state.searchItem, focusItemTag: state.focusItemTag, ensureVisibleItemTag: state.ensureVisibleItemTag, scrollToItem: scrollToItem, firstTime: previous == nil, animated: previous != nil && state.animateChanges, animateAlpha: previous != nil && state.animateChanges, crossfade: state.crossfadeState, mergedEntries: state.entries, scrollEnabled: state.scrollEnabled) }) |> deliverOnMainQueue).start(next: { [weak self] transition in if let strongSelf = self { strongSelf.enqueueTransition(transition) @@ -593,7 +593,7 @@ class ItemListControllerNode: ASDisplayNode, UIScrollV self.emptyStateNode = nil } } - self.listNode.isUserInteractionEnabled = transition.userInteractionEnabled + self.listNode.scrollEnabled = transition.scrollEnabled if updateSearchItem { self.requestLayout?(.animated(duration: 0.3, curve: .spring)) diff --git a/submodules/TelegramUI/TelegramUI/RecentSessionsController.swift b/submodules/TelegramUI/TelegramUI/RecentSessionsController.swift index 3a7ab9a5af..05eec2b812 100644 --- a/submodules/TelegramUI/TelegramUI/RecentSessionsController.swift +++ b/submodules/TelegramUI/TelegramUI/RecentSessionsController.swift @@ -634,7 +634,7 @@ public func recentSessionsController(context: AccountContext, activeSessionsCont } let controllerState = ItemListControllerState(theme: presentationData.theme, title: title, leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) - let listState = ItemListNodeState(entries: entries, style: .blocks, emptyStateItem: emptyStateItem, crossfadeState: crossfadeState, animateChanges: animateChanges, userInteractionEnabled: emptyStateItem == nil) + let listState = ItemListNodeState(entries: entries, style: .blocks, emptyStateItem: emptyStateItem, crossfadeState: crossfadeState, animateChanges: animateChanges, scrollEnabled: emptyStateItem == nil) return (controllerState, (listState, arguments)) } |> afterDisposed { From b73123838c6ec95822463f4d561a594e8c648f9f Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 11 Jul 2019 02:44:24 +0200 Subject: [PATCH 21/32] Cleanup --- .../TelegramUI/ChatMessageMediaBubbleContentNode.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift index 9f0b6b80f2..26e323799d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageMediaBubbleContentNode.swift @@ -83,7 +83,7 @@ class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode { if !item.message.containsSecretMedia { if telegramFile.isAnimated && item.controllerInteraction.automaticMediaDownloadSettings.autoplayGifs { if case .full = automaticDownload { - automaticPlayback = true //item.controllerInteraction.automaticMediaDownloadSettings.autoplayGifs + automaticPlayback = true } else { automaticPlayback = item.context.account.postbox.mediaBox.completedResourcePath(telegramFile.resource) != nil } From 626f42d233f5101c0575369d4ea8e8dec38ed795 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 11 Jul 2019 17:29:07 +0200 Subject: [PATCH 22/32] Always open chat screen for t.me/username links --- submodules/TelegramUI/TelegramUI/UrlHandling.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/TelegramUI/TelegramUI/UrlHandling.swift b/submodules/TelegramUI/TelegramUI/UrlHandling.swift index 6647bf66ad..2523b28853 100644 --- a/submodules/TelegramUI/TelegramUI/UrlHandling.swift +++ b/submodules/TelegramUI/TelegramUI/UrlHandling.swift @@ -270,7 +270,7 @@ private func resolveInternalUrl(account: Account, url: ParsedInternalUrl) -> Sig } } else { if let peer = peer as? TelegramUser, peer.botInfo == nil { - return .peer(peer.id, .info) + return .peer(peer.id, .chat(textInputState: nil, messageId: nil)) } else { return .peer(peer.id, .chat(textInputState: nil, messageId: nil)) } From 8ed34296e8520212bb1c73d1cc6a2866601b0554 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 11 Jul 2019 17:29:50 +0200 Subject: [PATCH 23/32] Fixed message editing key shortcut --- .../TelegramUI/ChatController.swift | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index edb362e90b..e054968c29 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -6843,23 +6843,22 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } }) ] - - if let message = self.chatDisplayNode.historyNode.latestMessageInCurrentHistoryView(), !message.flags.contains(.Incoming) { - inputShortcuts.append(KeyShortcut(input: UIKeyInputUpArrow, action: { [weak self] in - if let strongSelf = self { - var canEdit = false - strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { state in - if state.interfaceState.effectiveInputState.inputText.length == 0 && state.interfaceState.editMessage == nil { - canEdit = true - } - return state - }) - if canEdit { - strongSelf.interfaceInteraction?.setupEditMessage(message.id) - } - } - })) + } + + var canEdit = false + self.updateChatPresentationInterfaceState(animated: false, interactive: false, { state in + if state.interfaceState.effectiveInputState.inputText.length == 0 && state.interfaceState.editMessage == nil { + canEdit = true } + return state + }) + + if canEdit, let message = self.chatDisplayNode.historyNode.firstMessageForEditInCurrentHistoryView() { + inputShortcuts.append(KeyShortcut(input: UIKeyInputUpArrow, action: { [weak self] in + if let strongSelf = self { + strongSelf.interfaceInteraction?.setupEditMessage(message.id) + } + })) } let otherShortcuts: [KeyShortcut] = [ From fe3328d5a17104a3709115d0203bf735bbef2fe6 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sun, 14 Jul 2019 04:31:11 +0200 Subject: [PATCH 24/32] Fixed biometric unlock --- submodules/TelegramUI/TelegramUI/PasscodeEntryController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/TelegramUI/TelegramUI/PasscodeEntryController.swift b/submodules/TelegramUI/TelegramUI/PasscodeEntryController.swift index b656248e44..dcf47391ba 100644 --- a/submodules/TelegramUI/TelegramUI/PasscodeEntryController.swift +++ b/submodules/TelegramUI/TelegramUI/PasscodeEntryController.swift @@ -160,7 +160,7 @@ final public class PasscodeEntryController: ViewController { }).start() } - let isMainApp = !strongSelf.context.sharedContext.applicationBindings.isMainApp + let isMainApp = strongSelf.context.sharedContext.applicationBindings.isMainApp let _ = updatePresentationPasscodeSettingsInteractively(accountManager: strongSelf.context.sharedContext.accountManager, { settings in if isMainApp { return settings.withUpdatedBiometricsDomainState(LocalAuth.evaluatedPolicyDomainState) From 2c30af1d7677103b710d081bc481a5e793b4f85e Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 15 Jul 2019 18:12:44 +0200 Subject: [PATCH 25/32] Added support for thumbnails in standalone media file upload --- .../TelegramCore/EnqueueMessage.swift | 7 +- .../PendingMessageUploadedContent.swift | 20 +- .../StandaloneUploadedMedia.swift | 179 ++++++++++++------ 3 files changed, 133 insertions(+), 73 deletions(-) diff --git a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift index f1725a95b1..45ede2460d 100644 --- a/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift +++ b/submodules/TelegramCore/TelegramCore/EnqueueMessage.swift @@ -42,7 +42,7 @@ func augmentMediaWithReference(_ mediaReference: AnyMediaReference) -> Media { if file.partialReference != nil { return file } else { - return file.withUpdatedPartialReference(mediaReference.partial) + return file.withUpdatedPartialReference(mediaReference.partial) } } else if let image = mediaReference.media as? TelegramMediaImage { if image.partialReference != nil { @@ -367,7 +367,7 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, } let authorId: PeerId? - if let peer = peer as? TelegramChannel, case let .broadcast(info) = peer.info { + if let peer = peer as? TelegramChannel, case .broadcast = peer.info { authorId = peer.id } else { authorId = account.peerId @@ -388,12 +388,9 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, if let sourceMessage = sourceMessage, let author = sourceMessage.author ?? sourceMessage.peers[sourceMessage.id.peerId] { if let peer = peer as? TelegramSecretChat { var isAction = false - var mediaDuration: Int32? for media in sourceMessage.media { if let _ = media as? TelegramMediaAction { isAction = true - } else if let file = media as? TelegramMediaFile, let duration = file.duration { - mediaDuration = duration } } if !disableAutoremove, let messageAutoremoveTimeout = peer.messageAutoremoveTimeout, !isAction { diff --git a/submodules/TelegramCore/TelegramCore/PendingMessageUploadedContent.swift b/submodules/TelegramCore/TelegramCore/PendingMessageUploadedContent.swift index c48005d56e..c2df28501e 100644 --- a/submodules/TelegramCore/TelegramCore/PendingMessageUploadedContent.swift +++ b/submodules/TelegramCore/TelegramCore/PendingMessageUploadedContent.swift @@ -476,17 +476,17 @@ private enum UploadedMediaFileAndThumbnail { private func uploadedThumbnail(network: Network, postbox: Postbox, resourceReference: MediaResourceReference) -> Signal { return multipartUpload(network: network, postbox: postbox, source: .resource(resourceReference), encrypt: false, tag: TelegramMediaResourceFetchTag(statsCategory: .image), hintFileSize: nil, hintFileIsLarge: false) - |> mapError { _ -> PendingMessageUploadError in return .generic } - |> mapToSignal { result -> Signal in - switch result { - case .progress: - return .complete() - case let .inputFile(inputFile): - return .single(inputFile) - case .inputSecretFile: - return .single(nil) - } + |> mapError { _ -> PendingMessageUploadError in return .generic } + |> mapToSignal { result -> Signal in + switch result { + case .progress: + return .complete() + case let .inputFile(inputFile): + return .single(inputFile) + case .inputSecretFile: + return .single(nil) } + } } public func statsCategoryForFileWithAttributes(_ attributes: [TelegramMediaFileAttribute]) -> MediaResourceStatsCategory { diff --git a/submodules/TelegramCore/TelegramCore/StandaloneUploadedMedia.swift b/submodules/TelegramCore/TelegramCore/StandaloneUploadedMedia.swift index 5b593a5645..955271f97e 100644 --- a/submodules/TelegramCore/TelegramCore/StandaloneUploadedMedia.swift +++ b/submodules/TelegramCore/TelegramCore/StandaloneUploadedMedia.swift @@ -21,6 +21,20 @@ public struct StandaloneUploadSecretFile { let key: SecretFileEncryptionKey } +public enum StandaloneUploadMediaThumbnailResult { + case pending + case file(Api.InputFile) + case none + + var file: Api.InputFile? { + if case let .file(file) = self { + return file + } else { + return nil + } + } +} + public enum StandaloneUploadMediaResult { case media(AnyMediaReference) } @@ -30,7 +44,22 @@ public enum StandaloneUploadMediaEvent { case result(StandaloneUploadMediaResult) } -public func standaloneUploadedImage(account: Account, peerId: PeerId, text: String, data: Data, dimensions: CGSize) -> Signal { +private func uploadedThumbnail(network: Network, postbox: Postbox, data: Data) -> Signal { + return multipartUpload(network: network, postbox: postbox, source: .data(data), encrypt: false, tag: TelegramMediaResourceFetchTag(statsCategory: .image), hintFileSize: nil, hintFileIsLarge: false) + |> mapError { _ -> StandaloneUploadMediaError in return .generic } + |> mapToSignal { result -> Signal in + switch result { + case .progress: + return .complete() + case let .inputFile(inputFile): + return .single(inputFile) + case .inputSecretFile: + return .single(nil) + } + } +} + +public func standaloneUploadedImage(account: Account, peerId: PeerId, text: String, data: Data, thumbnailData: Data? = nil, dimensions: CGSize) -> Signal { return multipartUpload(network: account.network, postbox: account.postbox, source: .data(data), encrypt: peerId.namespace == Namespaces.Peer.SecretChat, tag: TelegramMediaResourceFetchTag(statsCategory: .image), hintFileSize: nil, hintFileIsLarge: false) |> mapError { _ -> StandaloneUploadMediaError in return .generic } |> mapToSignal { next -> Signal in @@ -91,65 +120,99 @@ public func standaloneUploadedImage(account: Account, peerId: PeerId, text: Stri } } -public func standaloneUploadedFile(account: Account, peerId: PeerId, text: String, source: MultipartUploadSource, mimeType: String, attributes: [TelegramMediaFileAttribute], hintFileIsLarge: Bool) -> Signal { - return multipartUpload(network: account.network, postbox: account.postbox, source: source, encrypt: peerId.namespace == Namespaces.Peer.SecretChat, tag: TelegramMediaResourceFetchTag(statsCategory: statsCategoryForFileWithAttributes(attributes)), hintFileSize: nil, hintFileIsLarge: hintFileIsLarge) - |> mapError { _ -> StandaloneUploadMediaError in return .generic } - |> mapToSignal { next -> Signal in - switch next { - case let .inputFile(inputFile): - return account.postbox.transaction { transaction -> Api.InputPeer? in - return transaction.getPeer(peerId).flatMap(apiInputPeer) - } - |> mapError { _ -> StandaloneUploadMediaError in return .generic } - |> mapToSignal { inputPeer -> Signal in - if let inputPeer = inputPeer { - return account.network.request(Api.functions.messages.uploadMedia(peer: inputPeer, media: Api.InputMedia.inputMediaUploadedDocument(flags: 0, file: inputFile, thumb: nil, mimeType: mimeType, attributes: inputDocumentAttributesFromFileAttributes(attributes), stickers: nil, ttlSeconds: nil))) - |> mapError { _ -> StandaloneUploadMediaError in return .generic } - |> mapToSignal { media -> Signal in - switch media { - case let .messageMediaDocument(_, document, _): - if let document = document { - if let mediaFile = telegramMediaFileFromApiDocument(document) { - return .single(.result(.media(.standalone(media: mediaFile)))) - } - } - default: - break - } - return .fail(.generic) - } - } else { - return .fail(.generic) - } - } - case let .inputSecretFile(file, size, key): - return account.postbox.transaction { transaction -> Api.InputEncryptedChat? in - if let peer = transaction.getPeer(peerId) as? TelegramSecretChat { - return Api.InputEncryptedChat.inputEncryptedChat(chatId: peer.id.id, accessHash: peer.accessHash) - } - return nil - } - |> introduceError(StandaloneUploadMediaError.self) - |> mapToSignal { inputChat -> Signal in - guard let inputChat = inputChat else { - return .fail(.generic) - } - return account.network.request(Api.functions.messages.uploadEncryptedFile(peer: inputChat, file: file)) - |> mapError { _ -> StandaloneUploadMediaError in return .generic - } - |> mapToSignal { result -> Signal in - switch result { - case let .encryptedFile(id, accessHash, size, dcId, _): - let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: arc4random64()), partialReference: nil, resource: SecretFileMediaResource(fileId: id, accessHash: accessHash, containerSize: size, decryptedSize: size, datacenterId: Int(dcId), key: key), previewRepresentations: [], immediateThumbnailData: nil, mimeType: mimeType, size: Int(size), attributes: attributes) - - return .single(.result(.media(.standalone(media: media)))) - case .encryptedFileEmpty: - return .fail(.generic) - } - } +public func standaloneUploadedFile(account: Account, peerId: PeerId, text: String, source: MultipartUploadSource, thumbnailData: Data? = nil, mimeType: String, attributes: [TelegramMediaFileAttribute], hintFileIsLarge: Bool) -> Signal { + let upload = multipartUpload(network: account.network, postbox: account.postbox, source: source, encrypt: peerId.namespace == Namespaces.Peer.SecretChat, tag: TelegramMediaResourceFetchTag(statsCategory: statsCategoryForFileWithAttributes(attributes)), hintFileSize: nil, hintFileIsLarge: hintFileIsLarge) + |> mapError { _ -> StandaloneUploadMediaError in return .generic } + + let uploadThumbnail: Signal + if let thumbnailData = thumbnailData { + uploadThumbnail = .single(.pending) + |> then( + uploadedThumbnail(network: account.network, postbox: account.postbox, data: thumbnailData) + |> mapError { _ -> StandaloneUploadMediaError in return .generic } + |> map { result in + if let result = result { + return .file(result) + } else { + return .none } + } + ) + } else { + uploadThumbnail = .single(.none) + } + + return combineLatest(upload, uploadThumbnail) + |> mapToSignal { result, thumbnail in + switch result { case let .progress(progress): return .single(.progress(progress)) - } + default: + switch thumbnail { + case .pending: + return .complete() + default: + switch result { + case let .inputFile(inputFile): + return account.postbox.transaction { transaction -> Api.InputPeer? in + return transaction.getPeer(peerId).flatMap(apiInputPeer) + } + |> mapError { _ -> StandaloneUploadMediaError in return .generic } + |> mapToSignal { inputPeer -> Signal in + if let inputPeer = inputPeer { + var flags: Int32 = 0 + let thumbnailFile = thumbnail.file + if let _ = thumbnailFile { + flags |= 1 << 2 + } + return account.network.request(Api.functions.messages.uploadMedia(peer: inputPeer, media: Api.InputMedia.inputMediaUploadedDocument(flags: flags, file: inputFile, thumb: thumbnailFile, mimeType: mimeType, attributes: inputDocumentAttributesFromFileAttributes(attributes), stickers: nil, ttlSeconds: nil))) + |> mapError { _ -> StandaloneUploadMediaError in return .generic } + |> mapToSignal { media -> Signal in + switch media { + case let .messageMediaDocument(_, document, _): + if let document = document { + if let mediaFile = telegramMediaFileFromApiDocument(document) { + return .single(.result(.media(.standalone(media: mediaFile)))) + } + } + default: + break + } + return .fail(.generic) + } + } else { + return .fail(.generic) + } + } + case let .inputSecretFile(file, _, key): + return account.postbox.transaction { transaction -> Api.InputEncryptedChat? in + if let peer = transaction.getPeer(peerId) as? TelegramSecretChat { + return Api.InputEncryptedChat.inputEncryptedChat(chatId: peer.id.id, accessHash: peer.accessHash) + } + return nil + } + |> introduceError(StandaloneUploadMediaError.self) + |> mapToSignal { inputChat -> Signal in + guard let inputChat = inputChat else { + return .fail(.generic) + } + return account.network.request(Api.functions.messages.uploadEncryptedFile(peer: inputChat, file: file)) + |> mapError { _ -> StandaloneUploadMediaError in return .generic } + |> mapToSignal { result -> Signal in + switch result { + case let .encryptedFile(id, accessHash, size, dcId, _): + let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: arc4random64()), partialReference: nil, resource: SecretFileMediaResource(fileId: id, accessHash: accessHash, containerSize: size, decryptedSize: size, datacenterId: Int(dcId), key: key), previewRepresentations: [], immediateThumbnailData: nil, mimeType: mimeType, size: Int(size), attributes: attributes) + + return .single(.result(.media(.standalone(media: media)))) + case .encryptedFileEmpty: + return .fail(.generic) + } + } + } + case .progress: + return .never() + } + } + } } } From 6842252ce90f46382b98167a2618db278265d357 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 15 Jul 2019 18:13:44 +0200 Subject: [PATCH 26/32] Generate thumbnails for PDFs sent via share extension --- .../TelegramUI/ICloudResources.swift | 2 +- submodules/TelegramUI/TelegramUI/PDF.swift | 8 ++- .../TelegramUI/ShareExtensionContext.swift | 56 +++++++++---------- .../TelegramUI/TelegramUI/ShareItems.swift | 7 ++- .../TelegramUI/TGItemProviderSignals.m | 3 +- 5 files changed, 42 insertions(+), 34 deletions(-) diff --git a/submodules/TelegramUI/TelegramUI/ICloudResources.swift b/submodules/TelegramUI/TelegramUI/ICloudResources.swift index c69e5891a4..b9553f4e4c 100644 --- a/submodules/TelegramUI/TelegramUI/ICloudResources.swift +++ b/submodules/TelegramUI/TelegramUI/ICloudResources.swift @@ -209,7 +209,7 @@ func fetchICloudFileResource(resource: ICloudFileResource) -> Signal UIImage? { - guard let document = CGPDFDocument(url as CFURL) else { return nil } + guard let data = try? Data(contentsOf: url, options: .mappedIfSafe) else { return nil } + return generatePdfPreviewImage(data: data, size: size) +} + +func generatePdfPreviewImage(data: Data, size: CGSize) -> UIImage? { + guard let provider = CGDataProvider(data: data as CFData) else { return nil } + guard let document = CGPDFDocument(provider) else { return nil } guard let firstPage = document.page(at: 1) else { return nil } let context = DrawingContext(size: size) diff --git a/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift b/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift index 3d57e67baa..6ed084b7dc 100644 --- a/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift +++ b/submodules/TelegramUI/TelegramUI/ShareExtensionContext.swift @@ -222,27 +222,25 @@ public class ShareRootControllerImpl { let requestUserInteraction: ([UnpreparedShareItemContent]) -> Signal<[PreparedShareItemContent], NoError> = { content in return Signal { [weak self] subscriber in switch content[0] { - case let .contact(data): - let controller = deviceContactInfoController(context: context, subject: .filter(peer: nil, contactId: nil, contactData: data, completion: { peer, contactData in - let phone = contactData.basicData.phoneNumbers[0].value - if let vCardData = contactData.serializedVCard() { - subscriber.putNext([.media(.media(.standalone(media: TelegramMediaContact(firstName: contactData.basicData.firstName, lastName: contactData.basicData.lastName, phoneNumber: phone, peerId: nil, vCardData: vCardData))))]) + case let .contact(data): + let controller = deviceContactInfoController(context: context, subject: .filter(peer: nil, contactId: nil, contactData: data, completion: { peer, contactData in + let phone = contactData.basicData.phoneNumbers[0].value + if let vCardData = contactData.serializedVCard() { + subscriber.putNext([.media(.media(.standalone(media: TelegramMediaContact(firstName: contactData.basicData.firstName, lastName: contactData.basicData.lastName, phoneNumber: phone, peerId: nil, vCardData: vCardData))))]) + } + subscriber.putCompletion() + }), cancelled: { + cancelImpl?() + }) + + if let strongSelf = self, let window = strongSelf.mainWindow { + controller.presentationArguments = ViewControllerPresentationArguments(presentationAnimation: .modalSheet) + window.present(controller, on: .root) } - subscriber.putCompletion() - }), cancelled: { - cancelImpl?() - }) - - if let strongSelf = self, let window = strongSelf.mainWindow { - controller.presentationArguments = ViewControllerPresentationArguments(presentationAnimation: .modalSheet) - window.present(controller, on: .root) - } - break + break } - - return ActionDisposable { - } - } |> runOn(Queue.mainQueue()) + return EmptyDisposable + } |> runOn(Queue.mainQueue()) } let sentItems: ([PeerId], [PreparedShareItemContent], Account) -> Signal = { peerIds, contents, account in @@ -271,17 +269,17 @@ public class ShareRootControllerImpl { return .single(.done) } switch state { - case .preparing: - return .single(.preparing) - case let .progress(value): - return .single(.progress(value)) - case let .userInteractionRequired(value): - return requestUserInteraction(value) + case .preparing: + return .single(.preparing) + case let .progress(value): + return .single(.progress(value)) + case let .userInteractionRequired(value): + return requestUserInteraction(value) |> mapToSignal { contents -> Signal in return sentItems(peerIds, contents, account) - } - case let .done(contents): - return sentItems(peerIds, contents, account) + } + case let .done(contents): + return sentItems(peerIds, contents, account) } } } else { @@ -338,7 +336,7 @@ public class ShareRootControllerImpl { self?.getExtensionContext()?.completeRequest(returningItems: nil, completionHandler: nil) })]) strongSelf.mainWindow?.present(controller, on: .root) - }, completed: {})) + }, completed: {})) } } } diff --git a/submodules/TelegramUI/TelegramUI/ShareItems.swift b/submodules/TelegramUI/TelegramUI/ShareItems.swift index 7879f80f0c..da2c87cf6f 100644 --- a/submodules/TelegramUI/TelegramUI/ShareItems.swift +++ b/submodules/TelegramUI/TelegramUI/ShareItems.swift @@ -178,7 +178,12 @@ private func preparedShareItem(account: Account, to peerId: PeerId, value: [Stri } } } else { - return standaloneUploadedFile(account: account, peerId: peerId, text: "", source: .data(data), mimeType: mimeType, attributes: [.FileName(fileName: fileName ?? "file")], hintFileIsLarge: data.count > 5 * 1024 * 1024) + var thumbnailData: Data? + if mimeType == "application/pdf", let image = generatePdfPreviewImage(data: data, size: CGSize(width: 256.0, height: 256.0)), let jpegData = UIImageJPEGRepresentation(image, 0.5) { + thumbnailData = jpegData + } + + return standaloneUploadedFile(account: account, peerId: peerId, text: "", source: .data(data), thumbnailData: thumbnailData, mimeType: mimeType, attributes: [.FileName(fileName: fileName ?? "file")], hintFileIsLarge: data.count > 5 * 1024 * 1024) |> mapError { _ -> Void in return Void() } |> mapToSignal { event -> Signal in switch event { diff --git a/submodules/TelegramUI/TelegramUI/TGItemProviderSignals.m b/submodules/TelegramUI/TelegramUI/TGItemProviderSignals.m index 5901b34885..c3aa6b2d96 100644 --- a/submodules/TelegramUI/TelegramUI/TGItemProviderSignals.m +++ b/submodules/TelegramUI/TelegramUI/TGItemProviderSignals.m @@ -553,7 +553,7 @@ static void set_bits(uint8_t *bytes, int32_t bitOffset, int32_t numBits, int32_t // add output reader to reader [iPodAssetReader addOutput: readerOutput]; - if (! [iPodAssetReader startReading]) { + if (![iPodAssetReader startReading]) { NSLog(@"Unable to start reading!"); return nil; } @@ -563,7 +563,6 @@ static void set_bits(uint8_t *bytes, int32_t bitOffset, int32_t numBits, int32_t int _waveformPeakCount = 0; while (iPodAssetReader.status == AVAssetReaderStatusReading) { - // Check if the available buffer space is enough to hold at least one cycle of the sample data CMSampleBufferRef nextBuffer = [readerOutput copyNextSampleBuffer]; if (nextBuffer) { From 2cae28f070217f61dc76e0e9212bc24d133d5380 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 15 Jul 2019 18:14:24 +0200 Subject: [PATCH 27/32] libtgvoip: disable packet reassembler initialization --- submodules/libtgvoip/VoIPController.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/submodules/libtgvoip/VoIPController.cpp b/submodules/libtgvoip/VoIPController.cpp index 66fb80e421..407cec4904 100755 --- a/submodules/libtgvoip/VoIPController.cpp +++ b/submodules/libtgvoip/VoIPController.cpp @@ -2388,10 +2388,10 @@ simpleAudioBlock random_id:long random_bytes:string raw_data:string = DecryptedA stm->jitterBuffer->SetMinPacketCount((uint32_t) ServerConfig::GetSharedInstance()->GetInt("jitter_initial_delay_20", 6)); stm->decoder=NULL; }else if(stm->type==STREAM_TYPE_VIDEO){ - if(!stm->packetReassembler){ - stm->packetReassembler=make_shared(); - stm->packetReassembler->SetCallback(bind(&VoIPController::ProcessIncomingVideoFrame, this, placeholders::_1, placeholders::_2, placeholders::_3)); - } +// if(!stm->packetReassembler){ +// stm->packetReassembler=make_shared(); +// stm->packetReassembler->SetCallback(bind(&VoIPController::ProcessIncomingVideoFrame, this, placeholders::_1, placeholders::_2, placeholders::_3)); +// } }else{ LOGW("Unknown incoming stream type: %d", stm->type); continue; From 5937d985f3402bdfcbf60d7db6c5422999b9aa62 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 15 Jul 2019 18:17:50 +0200 Subject: [PATCH 28/32] Added option to disable animated stickers looped playback across all the app --- .../ArchivedStickerPacksController.swift | 35 +++-- .../TelegramUI/ChatController.swift | 26 +++- .../ChatControllerInteraction.swift | 22 ++- .../TelegramUI/ChatControllerNode.swift | 8 + .../ChatMediaInputStickerGridItem.swift | 20 +-- .../ChatMediaInputStickerPackItem.swift | 50 +++---- .../ChatMessageAnimatedStickerItemNode.swift | 48 +++--- .../ChatMessageBubbleItemNode.swift | 1 - .../TelegramUI/ChatMessageItemView.swift | 3 + .../FeaturedStickerPacksController.swift | 37 +++-- .../GroupStickerPackSetupController.swift | 139 ++++++++++-------- .../InstalledStickerPacksController.swift | 105 ++++++++----- .../TelegramUI/ItemListStickerPackItem.swift | 8 +- .../OverlayPlayerControllerNode.swift | 2 +- .../PeerMediaCollectionController.swift | 2 +- .../StickerPackPreviewController.swift | 24 +-- .../StickerPackPreviewControllerNode.swift | 22 +-- .../StickerPackPreviewGridItem.swift | 32 +--- .../Sources/MediaAutoDownloadSettings.swift | 16 +- .../Sources/StickerSettings.swift | 16 +- 20 files changed, 361 insertions(+), 255 deletions(-) diff --git a/submodules/TelegramUI/TelegramUI/ArchivedStickerPacksController.swift b/submodules/TelegramUI/TelegramUI/ArchivedStickerPacksController.swift index c35840f84b..8f4d08b52c 100644 --- a/submodules/TelegramUI/TelegramUI/ArchivedStickerPacksController.swift +++ b/submodules/TelegramUI/TelegramUI/ArchivedStickerPacksController.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import Postbox import TelegramCore import TelegramPresentationData +import TelegramUIPreferences public enum ArchivedStickerPacksControllerMode { case stickers @@ -65,7 +66,7 @@ private enum ArchivedStickerPacksEntryId: Hashable { private enum ArchivedStickerPacksEntry: ItemListNodeEntry { case info(PresentationTheme, String) - case pack(Int32, PresentationTheme, PresentationStrings, StickerPackCollectionInfo, StickerPackItem?, String, Bool, ItemListStickerPackItemEditing) + case pack(Int32, PresentationTheme, PresentationStrings, StickerPackCollectionInfo, StickerPackItem?, String, Bool, Bool, ItemListStickerPackItemEditing) var section: ItemListSectionId { switch self { @@ -78,7 +79,7 @@ private enum ArchivedStickerPacksEntry: ItemListNodeEntry { switch self { case .info: return .index(0) - case let .pack(_, _, _, info, _, _, _, _): + case let .pack(_, _, _, info, _, _, _, _, _): return .pack(info.id) } } @@ -91,8 +92,8 @@ private enum ArchivedStickerPacksEntry: ItemListNodeEntry { } else { return false } - case let .pack(lhsIndex, lhsTheme, lhsStrings, lhsInfo, lhsTopItem, lhsCount, lhsEnabled, lhsEditing): - if case let .pack(rhsIndex, rhsTheme, rhsStrings, rhsInfo, rhsTopItem, rhsCount, rhsEnabled, rhsEditing) = rhs { + case let .pack(lhsIndex, lhsTheme, lhsStrings, lhsInfo, lhsTopItem, lhsCount, lhsPlayAnimatedStickers, lhsEnabled, lhsEditing): + if case let .pack(rhsIndex, rhsTheme, rhsStrings, rhsInfo, rhsTopItem, rhsCount, rhsPlayAnimatedStickers, rhsEnabled, rhsEditing) = rhs { if lhsIndex != rhsIndex { return false } @@ -111,6 +112,9 @@ private enum ArchivedStickerPacksEntry: ItemListNodeEntry { if lhsCount != rhsCount { return false } + if lhsPlayAnimatedStickers != rhsPlayAnimatedStickers { + return false + } if lhsEnabled != rhsEnabled { return false } @@ -133,9 +137,9 @@ private enum ArchivedStickerPacksEntry: ItemListNodeEntry { default: return true } - case let .pack(lhsIndex, _, _, _, _, _, _, _): + case let .pack(lhsIndex, _, _, _, _, _, _, _, _): switch rhs { - case let .pack(rhsIndex, _, _, _, _, _, _, _): + case let .pack(rhsIndex, _, _, _, _, _, _, _, _): return lhsIndex < rhsIndex default: return false @@ -147,8 +151,8 @@ private enum ArchivedStickerPacksEntry: ItemListNodeEntry { switch self { case let .info(theme, text): return ItemListTextItem(theme: theme, text: .plain(text), sectionId: self.section) - case let .pack(_, theme, strings, info, topItem, count, enabled, editing): - return ItemListStickerPackItem(theme: theme, strings: strings, account: arguments.account, packInfo: info, itemCount: count, topItem: topItem, unread: false, control: .installation(installed: false), editing: editing, enabled: enabled, sectionId: self.section, action: { + case let .pack(_, theme, strings, info, topItem, count, animatedStickers, enabled, editing): + return ItemListStickerPackItem(theme: theme, strings: strings, account: arguments.account, packInfo: info, itemCount: count, topItem: topItem, unread: false, control: .installation(installed: false), editing: editing, enabled: enabled, playAnimatedStickers: animatedStickers, sectionId: self.section, action: { arguments.openStickerPack(info) }, setPackIdWithRevealedOptions: { current, previous in arguments.setPackIdWithRevealedOptions(current, previous) @@ -205,7 +209,7 @@ private struct ArchivedStickerPacksControllerState: Equatable { } } -private func archivedStickerPacksControllerEntries(presentationData: PresentationData, state: ArchivedStickerPacksControllerState, packs: [ArchivedStickerPackItem]?, installedView: CombinedView) -> [ArchivedStickerPacksEntry] { +private func archivedStickerPacksControllerEntries(presentationData: PresentationData, state: ArchivedStickerPacksControllerState, packs: [ArchivedStickerPackItem]?, installedView: CombinedView, stickerSettings: StickerSettings) -> [ArchivedStickerPacksEntry] { var entries: [ArchivedStickerPacksEntry] = [] if let packs = packs { @@ -219,7 +223,7 @@ private func archivedStickerPacksControllerEntries(presentationData: Presentatio var index: Int32 = 0 for item in packs { if !installedIds.contains(item.info.id) { - entries.append(.pack(index, presentationData.theme, presentationData.strings, item.info, item.topItems.first, presentationData.strings.StickerPack_StickerCount(item.info.count), !state.removingPackIds.contains(item.info.id), ItemListStickerPackItemEditing(editable: true, editing: state.editing, revealed: state.packIdWithRevealedOptions == item.info.id, reorderable: false))) + entries.append(.pack(index, presentationData.theme, presentationData.strings, item.info, item.topItems.first, presentationData.strings.StickerPack_StickerCount(item.info.count), stickerSettings.loopAnimatedStickers, !state.removingPackIds.contains(item.info.id), ItemListStickerPackItemEditing(editable: true, editing: state.editing, revealed: state.packIdWithRevealedOptions == item.info.id, reorderable: false))) index += 1 } } @@ -369,9 +373,14 @@ public func archivedStickerPacksController(context: AccountContext, mode: Archiv var previousPackCount: Int? - let signal = combineLatest(context.sharedContext.presentationData, statePromise.get() |> deliverOnMainQueue, stickerPacks.get() |> deliverOnMainQueue, installedStickerPacks.get() |> deliverOnMainQueue) + let signal = combineLatest(context.sharedContext.presentationData, statePromise.get() |> deliverOnMainQueue, stickerPacks.get() |> deliverOnMainQueue, installedStickerPacks.get() |> deliverOnMainQueue, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.stickerSettings]) |> deliverOnMainQueue) |> deliverOnMainQueue - |> map { presentationData, state, packs, installedView -> (ItemListControllerState, (ItemListNodeState, ArchivedStickerPacksEntry.ItemGenerationArguments)) in + |> map { presentationData, state, packs, installedView, sharedData -> (ItemListControllerState, (ItemListNodeState, ArchivedStickerPacksEntry.ItemGenerationArguments)) in + var stickerSettings = StickerSettings.defaultSettings + if let value = sharedData.entries[ApplicationSpecificSharedDataKeys.stickerSettings] as? StickerSettings { + stickerSettings = value + } + var rightNavigationButton: ItemListNavigationButton? if let packs = packs, packs.count != 0 { if state.editing { @@ -399,7 +408,7 @@ public func archivedStickerPacksController(context: AccountContext, mode: Archiv let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.StickerPacksSettings_ArchivedPacks), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) - let listState = ItemListNodeState(entries: archivedStickerPacksControllerEntries(presentationData: presentationData, state: state, packs: packs, installedView: installedView), style: .blocks, emptyStateItem: emptyStateItem, animateChanges: previous != nil && packs != nil && (previous! != 0 && previous! >= packs!.count - 10)) + let listState = ItemListNodeState(entries: archivedStickerPacksControllerEntries(presentationData: presentationData, state: state, packs: packs, installedView: installedView, stickerSettings: stickerSettings), style: .blocks, emptyStateItem: emptyStateItem, animateChanges: previous != nil && packs != nil && (previous! != 0 && previous! >= packs!.count - 10)) return (controllerState, (listState, arguments)) } |> afterDisposed { actionsDisposable.dispose() diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index e054968c29..5fbedb19f0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -208,6 +208,9 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, private var automaticMediaDownloadSettings: MediaAutoDownloadSettings private var automaticMediaDownloadSettingsDisposable: Disposable? + private var stickerSettings: ChatInterfaceStickerSettings + private var stickerSettingsDisposable: Disposable? + private var applicationInForegroundDisposable: Disposable? private var checkedPeerChatServiceActions = false @@ -264,6 +267,8 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, self.presentationData = context.sharedContext.currentPresentationData.with { $0 } self.automaticMediaDownloadSettings = context.sharedContext.currentAutomaticMediaDownloadSettings.with { $0 } + self.stickerSettings = ChatInterfaceStickerSettings(loopAnimatedStickers: false) + self.presentationInterfaceState = ChatPresentationInterfaceState(chatWallpaper: self.presentationData.chatWallpaper, theme: self.presentationData.theme, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, limitsConfiguration: context.currentLimitsConfiguration.with { $0 }, fontSize: self.presentationData.fontSize, accountPeerId: context.account.peerId, mode: mode, chatLocation: chatLocation) var mediaAccessoryPanelVisibility = MediaAccessoryPanelVisibility.none @@ -1378,8 +1383,7 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, }, cancelInteractiveKeyboardGestures: { [weak self] in (self?.view.window as? WindowHost)?.cancelInteractiveKeyboardGestures() self?.chatDisplayNode.cancelInteractiveKeyboardGestures() - }, automaticMediaDownloadSettings: self.automaticMediaDownloadSettings, - pollActionState: ChatInterfacePollActionState()) + }, automaticMediaDownloadSettings: self.automaticMediaDownloadSettings, pollActionState: ChatInterfacePollActionState(), stickerSettings: self.stickerSettings) self.controllerInteraction = controllerInteraction @@ -1884,6 +1888,24 @@ public final class ChatController: TelegramController, GalleryHiddenMediaTarget, } }) + self.stickerSettingsDisposable = (context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.stickerSettings]) + |> deliverOnMainQueue).start(next: { [weak self] sharedData in + var stickerSettings = StickerSettings.defaultSettings + if let value = sharedData.entries[ApplicationSpecificSharedDataKeys.stickerSettings] as? StickerSettings { + stickerSettings = value + } + + let chatStickerSettings = ChatInterfaceStickerSettings(stickerSettings: stickerSettings) + + if let strongSelf = self, strongSelf.stickerSettings != chatStickerSettings { + strongSelf.stickerSettings = chatStickerSettings + strongSelf.controllerInteraction?.stickerSettings = chatStickerSettings + if strongSelf.isNodeLoaded { + strongSelf.chatDisplayNode.updateStickerSettings(chatStickerSettings) + } + } + }) + self.applicationInForegroundDisposable = (context.sharedContext.applicationBindings.applicationInForeground |> distinctUntilChanged |> deliverOn(Queue.mainQueue())).start(next: { [weak self] value in diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift index 8c522afb15..90e26ecfd3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift @@ -31,6 +31,22 @@ struct ChatInterfaceHighlightedState: Equatable { } } +struct ChatInterfaceStickerSettings: Equatable { + let loopAnimatedStickers: Bool + + public init(loopAnimatedStickers: Bool) { + self.loopAnimatedStickers = loopAnimatedStickers + } + + public init(stickerSettings: StickerSettings) { + self.loopAnimatedStickers = stickerSettings.loopAnimatedStickers + } + + static func ==(lhs: ChatInterfaceStickerSettings, rhs: ChatInterfaceStickerSettings) -> Bool { + return lhs.loopAnimatedStickers == rhs.loopAnimatedStickers + } +} + public enum ChatControllerInteractionLongTapAction { case url(String) case mention(String) @@ -104,9 +120,10 @@ public final class ChatControllerInteraction { var contextHighlightedState: ChatInterfaceHighlightedState? var automaticMediaDownloadSettings: MediaAutoDownloadSettings var pollActionState: ChatInterfacePollActionState + var stickerSettings: ChatInterfaceStickerSettings var searchTextHighightState: String? - init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool) -> Void, sendGif: @escaping (FileMediaReference) -> Void, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> Bool, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOption: @escaping (MessageId, Data) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState) { + init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool) -> Void, sendGif: @escaping (FileMediaReference) -> Void, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> Bool, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOption: @escaping (MessageId, Data) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) { self.openMessage = openMessage self.openPeer = openPeer self.openPeerMention = openPeerMention @@ -154,6 +171,7 @@ public final class ChatControllerInteraction { self.automaticMediaDownloadSettings = automaticMediaDownloadSettings self.pollActionState = pollActionState + self.stickerSettings = stickerSettings } static var `default`: ChatControllerInteraction { @@ -175,6 +193,6 @@ public final class ChatControllerInteraction { }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, - pollActionState: ChatInterfacePollActionState()) + pollActionState: ChatInterfacePollActionState(), stickerSettings: ChatInterfaceStickerSettings(loopAnimatedStickers: false)) } } diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index ad4510afe7..9be192a99a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -1497,6 +1497,14 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { self.historyNode.prefetchManager.updateAutoDownloadSettings(settings) } + func updateStickerSettings(_ settings: ChatInterfaceStickerSettings) { + self.historyNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? ChatMessageItemView { + itemNode.updateStickerSettings() + } + } + } + var isInputViewFocused: Bool { if let inputPanelNode = self.inputPanelNode as? ChatTextInputPanelNode { return inputPanelNode.isFocused diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift index 3cf1fd44d8..414e20455d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift @@ -145,7 +145,6 @@ final class ChatMediaInputStickerGridItem: GridItem { let node = ChatMediaInputStickerGridItemNode() node.interfaceInteraction = self.interfaceInteraction node.inputNodeInteraction = self.inputNodeInteraction - node.setup(account: self.account, stickerItem: self.stickerItem) node.selected = self.selected return node } @@ -157,7 +156,6 @@ final class ChatMediaInputStickerGridItem: GridItem { } node.interfaceInteraction = self.interfaceInteraction node.inputNodeInteraction = self.inputNodeInteraction - node.setup(account: self.account, stickerItem: self.stickerItem) node.selected = self.selected } } @@ -209,11 +207,6 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode { self.imageNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.imageNodeTap(_:)))) } - func setup(account: Account, stickerItem: StickerPackItem) { - //self.updateSelectionState(animated: false) - //self.updateHiddenMedia() - } - override func updateLayout(item: GridItem, size: CGSize, isVisible: Bool, synchronousLoads: Bool) { guard let item = item as? ChatMediaInputStickerGridItem else { return @@ -232,13 +225,7 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode { self.addSubnode(animationNode) } self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.account.postbox, file: item.stickerItem.file, small: false, size: CGSize(width: 160.0, height: 160.0))) - if self.isPlaying { - self.didSetUpAnimationNode = true - self.animationNode?.setup(account: item.account, resource: item.stickerItem.file.resource, width: 160, height: 160, mode: .cached) - } else { - self.didSetUpAnimationNode = false - } - self.animationNode?.visibility = self.isPlaying + self.updateVisibility() self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: item.account, fileReference: stickerPackFileReference(item.stickerItem.file), resource: item.stickerItem.file.resource).start()) } else { if let animationNode = self.animationNode { @@ -297,7 +284,10 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode { } func updateVisibility() { - let isPlaying = self.isPanelVisible && self.isVisibleInGrid + guard let item = self.item else { + return + } + let isPlaying = self.isPanelVisible && self.isVisibleInGrid && (item.interfaceInteraction?.stickerSettings.loopAnimatedStickers ?? true) if self.isPlaying != isPlaying { self.isPlaying = isPlaying self.animationNode?.visibility = isPlaying diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift index b874f8678b..0907653e9f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift @@ -103,7 +103,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { override var visibility: ListViewItemNodeVisibility { didSet { - self.visibilityStatus = self.visibility != .none + self.visibilityStatus = self.visibility != .none && false } } @@ -171,30 +171,30 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { self.currentThumbnailItem = thumbnailItem if let thumbnailItem = thumbnailItem { switch thumbnailItem { - case let .still(representation): - let imageSize = representation.dimensions.aspectFitted(boundingImageSize) - let imageApply = self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets())) - imageApply() - self.imageNode.setSignal(chatMessageStickerPackThumbnail(postbox: account.postbox, representation: representation)) - - self.imageNode.frame = CGRect(origin: CGPoint(x: floor((boundingSize.width - imageSize.width) / 2.0) + verticalOffset, y: floor((boundingSize.height - imageSize.height) / 2.0)), size: imageSize) - case let .animated(resource): - let imageSize = boundingImageSize - - let animatedStickerNode: AnimatedStickerNode - if let current = self.animatedStickerNode { - animatedStickerNode = current - } else { - animatedStickerNode = AnimatedStickerNode() - self.animatedStickerNode = animatedStickerNode - animatedStickerNode.transform = CATransform3DMakeRotation(CGFloat.pi / 2.0, 0.0, 0.0, 1.0) - self.addSubnode(animatedStickerNode) - animatedStickerNode.setup(account: account, resource: resource, width: 80, height: 80, mode: .cached) - animatedStickerNode.visibility = self.visibilityStatus - } - if let animatedStickerNode = self.animatedStickerNode { - animatedStickerNode.frame = CGRect(origin: CGPoint(x: floor((boundingSize.width - imageSize.width) / 2.0) + verticalOffset, y: floor((boundingSize.height - imageSize.height) / 2.0)), size: imageSize) - } + case let .still(representation): + let imageSize = representation.dimensions.aspectFitted(boundingImageSize) + let imageApply = self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets())) + imageApply() + self.imageNode.setSignal(chatMessageStickerPackThumbnail(postbox: account.postbox, representation: representation)) + + self.imageNode.frame = CGRect(origin: CGPoint(x: floor((boundingSize.width - imageSize.width) / 2.0) + verticalOffset, y: floor((boundingSize.height - imageSize.height) / 2.0)), size: imageSize) + case let .animated(resource): + let imageSize = boundingImageSize + + let animatedStickerNode: AnimatedStickerNode + if let current = self.animatedStickerNode { + animatedStickerNode = current + } else { + animatedStickerNode = AnimatedStickerNode() + self.animatedStickerNode = animatedStickerNode + animatedStickerNode.transform = CATransform3DMakeRotation(CGFloat.pi / 2.0, 0.0, 0.0, 1.0) + self.addSubnode(animatedStickerNode) + animatedStickerNode.setup(account: account, resource: resource, width: 80, height: 80, mode: .cached) + animatedStickerNode.visibility = self.visibilityStatus && false + } + if let animatedStickerNode = self.animatedStickerNode { + animatedStickerNode.frame = CGRect(origin: CGPoint(x: floor((boundingSize.width - imageSize.width) / 2.0) + verticalOffset, y: floor((boundingSize.height - imageSize.height) / 2.0)), size: imageSize) + } } if let resourceReference = resourceReference { self.stickerFetchedDisposable.set(fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: resourceReference).start()) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index 7ffe44291d..b1feb4f240 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -17,6 +17,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { let imageNode: TransformImageNode private let animationNode: AnimatedStickerNode private var didSetUpAnimationNode = false + private var isPlaying = false private var swipeToReplyNode: ChatMessageSwipeToReplyNode? private var swipeToReplyFeedback: HapticFeedback? @@ -90,8 +91,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } self.view.addGestureRecognizer(replyRecognizer) } - - private var visibilityPromise = ValuePromise(false, ignoreRepeated: true) + override var visibility: ListViewItemNodeVisibility { didSet { let wasVisible = oldValue != .none @@ -106,21 +106,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { private var visibilityStatus: Bool = false { didSet { if self.visibilityStatus != oldValue { - if self.visibilityStatus { - self.animationNode.visibility = true - self.visibilityPromise.set(true) - if let item = self.item, !self.didSetUpAnimationNode { - for media in item.message.media { - if let telegramFile = media as? TelegramMediaFile { - self.didSetUpAnimationNode = true - self.animationNode.setup(account: item.context.account, resource: telegramFile.resource, width: 384, height: 384, mode: .cached) - } - } - } - } else { - self.animationNode.visibility = false - self.visibilityPromise.set(false) - } + self.updateVisibility() } } } @@ -133,7 +119,8 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if self.telegramFile?.id != telegramFile.id { self.telegramFile = telegramFile self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.context.account.postbox, file: telegramFile, small: false, size: CGSize(width: 384.0, height: 384.0), thumbnail: false)) - if self.visibilityStatus { + self.updateVisibility() + if self.visibilityStatus && false { self.didSetUpAnimationNode = true self.animationNode.setup(account: item.context.account, resource: telegramFile.resource, width: 384, height: 384, mode: .cached) } @@ -144,6 +131,31 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } } + func updateVisibility() { + guard let item = self.item else { + return + } + + let isPlaying = self.visibilityStatus && item.controllerInteraction.stickerSettings.loopAnimatedStickers + if self.isPlaying != isPlaying { + self.isPlaying = isPlaying + self.animationNode.visibility = isPlaying + if let item = self.item, isPlaying, !self.didSetUpAnimationNode { + self.didSetUpAnimationNode = true + for media in item.message.media { + if let telegramFile = media as? TelegramMediaFile { + self.animationNode.setup(account: item.context.account, resource: telegramFile.resource, width: 384, height: 384, mode: .cached) + break + } + } + } + } + } + + override func updateStickerSettings() { + self.updateVisibility() + } + override func asyncLayout() -> (_ item: ChatMessageItem, _ params: ListViewItemLayoutParams, _ mergedTop: ChatMessageMerge, _ mergedBottom: ChatMessageMerge, _ dateHeaderAtBottom: Bool) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation, Bool) -> Void) { let displaySize = CGSize(width: 184.0, height: 184.0) let telegramFile = self.telegramFile diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 4403bf84c3..5459e75993 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -2191,7 +2191,6 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { } } - override func playMediaWithSound() -> ((Double?) -> Void, Bool, Bool, Bool, ASDisplayNode?)? { for contentNode in self.contentNodes { if let playMediaWithSound = contentNode.playMediaWithSound() { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift b/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift index 06bf3cd96a..a4f1d3fd33 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageItemView.swift @@ -698,6 +698,9 @@ public class ChatMessageItemView: ListViewItemNode { func updateAutomaticMediaDownloadSettings() { } + func updateStickerSettings() { + } + func playMediaWithSound() -> ((Double?) -> Void, Bool, Bool, Bool, ASDisplayNode?)? { return nil } diff --git a/submodules/TelegramUI/TelegramUI/FeaturedStickerPacksController.swift b/submodules/TelegramUI/TelegramUI/FeaturedStickerPacksController.swift index 51088e34d9..207189c093 100644 --- a/submodules/TelegramUI/TelegramUI/FeaturedStickerPacksController.swift +++ b/submodules/TelegramUI/TelegramUI/FeaturedStickerPacksController.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import Postbox import TelegramCore import TelegramPresentationData +import TelegramUIPreferences private final class FeaturedStickerPacksControllerArguments { let account: Account @@ -46,7 +47,7 @@ private enum FeaturedStickerPacksEntryId: Hashable { } private enum FeaturedStickerPacksEntry: ItemListNodeEntry { - case pack(Int32, PresentationTheme, PresentationStrings, StickerPackCollectionInfo, Bool, StickerPackItem?, String, Bool) + case pack(Int32, PresentationTheme, PresentationStrings, StickerPackCollectionInfo, Bool, StickerPackItem?, String, Bool, Bool) var section: ItemListSectionId { switch self { @@ -57,15 +58,15 @@ private enum FeaturedStickerPacksEntry: ItemListNodeEntry { var stableId: FeaturedStickerPacksEntryId { switch self { - case let .pack(_, _, _, info, _, _, _, _): + case let .pack(_, _, _, info, _, _, _, _, _): return .pack(info.id) } } static func ==(lhs: FeaturedStickerPacksEntry, rhs: FeaturedStickerPacksEntry) -> Bool { switch lhs { - case let .pack(lhsIndex, lhsTheme, lhsStrings, lhsInfo, lhsUnread, lhsTopItem, lhsCount, lhsInstalled): - if case let .pack(rhsIndex, rhsTheme, rhsStrings, rhsInfo, rhsUnread, rhsTopItem, rhsCount, rhsInstalled) = rhs { + case let .pack(lhsIndex, lhsTheme, lhsStrings, lhsInfo, lhsUnread, lhsTopItem, lhsCount, lhsPlayAnimatedStickers, lhsInstalled): + if case let .pack(rhsIndex, rhsTheme, rhsStrings, rhsInfo, rhsUnread, rhsTopItem, rhsCount, rhsPlayAnimatedStickers, rhsInstalled) = rhs { if lhsIndex != rhsIndex { return false } @@ -87,6 +88,9 @@ private enum FeaturedStickerPacksEntry: ItemListNodeEntry { if lhsCount != rhsCount { return false } + if lhsPlayAnimatedStickers != rhsPlayAnimatedStickers { + return false + } if lhsInstalled != rhsInstalled { return false } @@ -99,9 +103,9 @@ private enum FeaturedStickerPacksEntry: ItemListNodeEntry { static func <(lhs: FeaturedStickerPacksEntry, rhs: FeaturedStickerPacksEntry) -> Bool { switch lhs { - case let .pack(lhsIndex, _, _, _, _, _, _, _): + case let .pack(lhsIndex, _, _, _, _, _, _, _, _): switch rhs { - case let .pack(rhsIndex, _, _, _, _, _, _, _): + case let .pack(rhsIndex, _, _, _, _, _, _, _, _): return lhsIndex < rhsIndex } } @@ -109,8 +113,8 @@ private enum FeaturedStickerPacksEntry: ItemListNodeEntry { func item(_ arguments: FeaturedStickerPacksControllerArguments) -> ListViewItem { switch self { - case let .pack(_, theme, strings, info, unread, topItem, count, installed): - return ItemListStickerPackItem(theme: theme, strings: strings, account: arguments.account, packInfo: info, itemCount: count, topItem: topItem, unread: unread, control: .installation(installed: installed), editing: ItemListStickerPackItemEditing(editable: false, editing: false, revealed: false, reorderable: false), enabled: true, sectionId: self.section, action: { + case let .pack(_, theme, strings, info, unread, topItem, count, playAnimatedStickers, installed): + return ItemListStickerPackItem(theme: theme, strings: strings, account: arguments.account, packInfo: info, itemCount: count, topItem: topItem, unread: unread, control: .installation(installed: installed), editing: ItemListStickerPackItemEditing(editable: false, editing: false, revealed: false, reorderable: false), enabled: true, playAnimatedStickers: playAnimatedStickers, sectionId: self.section, action: { arguments.openStickerPack(info) }, setPackIdWithRevealedOptions: { _, _ in }, addPack: { @@ -130,7 +134,7 @@ private struct FeaturedStickerPacksControllerState: Equatable { } } -private func featuredStickerPacksControllerEntries(presentationData: PresentationData, state: FeaturedStickerPacksControllerState, view: CombinedView, featured: [FeaturedStickerPackItem], unreadPacks: [ItemCollectionId: Bool]) -> [FeaturedStickerPacksEntry] { +private func featuredStickerPacksControllerEntries(presentationData: PresentationData, state: FeaturedStickerPacksControllerState, view: CombinedView, featured: [FeaturedStickerPackItem], unreadPacks: [ItemCollectionId: Bool], stickerSettings: StickerSettings) -> [FeaturedStickerPacksEntry] { var entries: [FeaturedStickerPacksEntry] = [] if let stickerPacksView = view.views[.itemCollectionInfos(namespaces: [Namespaces.ItemCollection.CloudStickerPacks])] as? ItemCollectionInfosView, !featured.isEmpty { @@ -145,7 +149,7 @@ private func featuredStickerPacksControllerEntries(presentationData: Presentatio if let value = unreadPacks[item.info.id] { unread = value } - entries.append(.pack(index, presentationData.theme, presentationData.strings, item.info, unread, item.topItems.first, presentationData.strings.StickerPack_StickerCount(item.info.count), installedPacks.contains(item.info.id))) + entries.append(.pack(index, presentationData.theme, presentationData.strings, item.info, unread, item.topItems.first, presentationData.strings.StickerPack_StickerCount(item.info.count), stickerSettings.loopAnimatedStickers, installedPacks.contains(item.info.id))) index += 1 } } @@ -195,9 +199,14 @@ public func featuredStickerPacksController(context: AccountContext) -> ViewContr var previousPackCount: Int? var initialUnreadPacks: [ItemCollectionId: Bool] = [:] - let signal = combineLatest(context.sharedContext.presentationData, statePromise.get() |> deliverOnMainQueue, stickerPacks.get() |> deliverOnMainQueue, featured.get() |> deliverOnMainQueue) + let signal = combineLatest(context.sharedContext.presentationData, statePromise.get() |> deliverOnMainQueue, stickerPacks.get() |> deliverOnMainQueue, featured.get() |> deliverOnMainQueue, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.stickerSettings]) |> deliverOnMainQueue) |> deliverOnMainQueue - |> map { presentationData, state, view, featured -> (ItemListControllerState, (ItemListNodeState, FeaturedStickerPacksEntry.ItemGenerationArguments)) in + |> map { presentationData, state, view, featured, sharedData -> (ItemListControllerState, (ItemListNodeState, FeaturedStickerPacksEntry.ItemGenerationArguments)) in + var stickerSettings = StickerSettings.defaultSettings + if let value = sharedData.entries[ApplicationSpecificSharedDataKeys.stickerSettings] as? StickerSettings { + stickerSettings = value + } + let packCount: Int? = featured.count for item in featured { @@ -212,7 +221,7 @@ public func featuredStickerPacksController(context: AccountContext) -> ViewContr let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.FeaturedStickerPacks_Title), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) - let listState = ItemListNodeState(entries: featuredStickerPacksControllerEntries(presentationData: presentationData, state: state, view: view, featured: featured, unreadPacks: initialUnreadPacks), style: .blocks, animateChanges: false) + let listState = ItemListNodeState(entries: featuredStickerPacksControllerEntries(presentationData: presentationData, state: state, view: view, featured: featured, unreadPacks: initialUnreadPacks, stickerSettings: stickerSettings), style: .blocks, animateChanges: false) return (controllerState, (listState, arguments)) } |> afterDisposed { actionsDisposable.dispose() @@ -226,7 +235,7 @@ public func featuredStickerPacksController(context: AccountContext) -> ViewContr var unreadIds: [ItemCollectionId] = [] for entry in entries { switch entry { - case let .pack(_, _, _, info, unread, _, _, _): + case let .pack(_, _, _, info, unread, _, _, _, _): if unread && !alreadyReadIds.contains(info.id) { unreadIds.append(info.id) } diff --git a/submodules/TelegramUI/TelegramUI/GroupStickerPackSetupController.swift b/submodules/TelegramUI/TelegramUI/GroupStickerPackSetupController.swift index 0cb5ec6d30..e37813635f 100644 --- a/submodules/TelegramUI/TelegramUI/GroupStickerPackSetupController.swift +++ b/submodules/TelegramUI/TelegramUI/GroupStickerPackSetupController.swift @@ -5,6 +5,7 @@ import SwiftSignalKit import Postbox import TelegramCore import TelegramPresentationData +import TelegramUIPreferences private final class GroupStickerPackSetupControllerArguments { let account: Account @@ -64,7 +65,7 @@ private enum GroupStickerPackEntry: ItemListNodeEntry { case currentPack(Int32, PresentationTheme, PresentationStrings, GroupStickerPackCurrentItemContent) case searchInfo(PresentationTheme, String) case packsTitle(PresentationTheme, String) - case pack(Int32, PresentationTheme, PresentationStrings, StickerPackCollectionInfo, StickerPackItem?, String, Bool) + case pack(Int32, PresentationTheme, PresentationStrings, StickerPackCollectionInfo, StickerPackItem?, String, Bool, Bool) var section: ItemListSectionId { switch self { @@ -85,7 +86,7 @@ private enum GroupStickerPackEntry: ItemListNodeEntry { return .index(2) case .packsTitle: return .index(3) - case let .pack(_, _, _, info, _, _, _): + case let .pack(_, _, _, info, _, _, _, _): return .pack(info.id) } } @@ -128,8 +129,8 @@ private enum GroupStickerPackEntry: ItemListNodeEntry { } else { return false } - case let .pack(lhsIndex, lhsTheme, lhsStrings, lhsInfo, lhsTopItem, lhsCount, lhsSelected): - if case let .pack(rhsIndex, rhsTheme, rhsStrings, rhsInfo, rhsTopItem, rhsCount, rhsSelected) = rhs { + case let .pack(lhsIndex, lhsTheme, lhsStrings, lhsInfo, lhsTopItem, lhsCount, lhsPlayAnimatedStickers, lhsSelected): + if case let .pack(rhsIndex, rhsTheme, rhsStrings, rhsInfo, rhsTopItem, rhsCount, rhsPlayAnimatedStickers, rhsSelected) = rhs { if lhsIndex != rhsIndex { return false } @@ -148,6 +149,9 @@ private enum GroupStickerPackEntry: ItemListNodeEntry { if lhsCount != rhsCount { return false } + if lhsPlayAnimatedStickers != rhsPlayAnimatedStickers { + return false + } if lhsSelected != rhsSelected { return false } @@ -188,9 +192,9 @@ private enum GroupStickerPackEntry: ItemListNodeEntry { default: return true } - case let .pack(lhsIndex, _, _, _, _, _, _): + case let .pack(lhsIndex, _, _, _, _, _, _, _): switch rhs { - case let .pack(rhsIndex, _, _, _, _, _, _): + case let .pack(rhsIndex, _, _, _, _, _, _, _): return lhsIndex < rhsIndex default: return false @@ -216,8 +220,8 @@ private enum GroupStickerPackEntry: ItemListNodeEntry { return ItemListTextItem(theme: theme, text: .plain(text), sectionId: self.section, linkAction: nil) case let .packsTitle(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) - case let .pack(_, theme, strings, info, topItem, count, selected): - return ItemListStickerPackItem(theme: theme, strings: strings, account: arguments.account, packInfo: info, itemCount: count, topItem: topItem, unread: false, control: selected ? .selection : .none, editing: ItemListStickerPackItemEditing(editable: false, editing: false, revealed: false, reorderable: false), enabled: true, sectionId: self.section, action: { + case let .pack(_, theme, strings, info, topItem, count, playAnimatedStickers, selected): + return ItemListStickerPackItem(theme: theme, strings: strings, account: arguments.account, packInfo: info, itemCount: count, topItem: topItem, unread: false, control: selected ? .selection : .none, editing: ItemListStickerPackItemEditing(editable: false, editing: false, revealed: false, reorderable: false), enabled: true, playAnimatedStickers: playAnimatedStickers, sectionId: self.section, action: { if selected { arguments.openStickerPack(info) } else { @@ -258,7 +262,7 @@ private struct GroupStickerPackSetupControllerState: Equatable { var isSaving: Bool } -private func groupStickerPackSetupControllerEntries(presentationData: PresentationData, searchText: String, view: CombinedView, initialData: InitialStickerPackData?, searchState: GroupStickerPackSearchState) -> [GroupStickerPackEntry] { +private func groupStickerPackSetupControllerEntries(presentationData: PresentationData, searchText: String, view: CombinedView, initialData: InitialStickerPackData?, searchState: GroupStickerPackSearchState, stickerSettings: StickerSettings) -> [GroupStickerPackEntry] { if initialData == nil { return [] } @@ -288,7 +292,7 @@ private func groupStickerPackSetupControllerEntries(presentationData: Presentati if case let .found(found) = searchState { selected = found.info.id == info.id } - entries.append(.pack(index, presentationData.theme, presentationData.strings, info, entry.firstItem as? StickerPackItem, presentationData.strings.StickerPack_StickerCount(info.count == 0 ? entry.count : info.count), selected)) + entries.append(.pack(index, presentationData.theme, presentationData.strings, info, entry.firstItem as? StickerPackItem, presentationData.strings.StickerPack_StickerCount(info.count == 0 ? entry.count : info.count), stickerSettings.loopAnimatedStickers, selected)) index += 1 } } @@ -400,66 +404,71 @@ public func groupStickerPackSetupController(context: AccountContext, peerId: Pee let previousHadData = Atomic(value: false) - let signal = combineLatest(context.sharedContext.presentationData, statePromise.get() |> deliverOnMainQueue, initialData.get() |> deliverOnMainQueue, stickerPacks.get() |> deliverOnMainQueue, searchState.get() |> deliverOnMainQueue) - |> map { presentationData, state, initialData, view, searchState -> (ItemListControllerState, (ItemListNodeState, GroupStickerPackEntry.ItemGenerationArguments)) in - let leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { - dismissImpl?() - }) - - var rightNavigationButton: ItemListNavigationButton? - if initialData != nil { - if state.isSaving { - rightNavigationButton = ItemListNavigationButton(content: .text(""), style: .activity, enabled: true, action: {}) - } else { - let enabled: Bool - var info: StickerPackCollectionInfo? - switch searchState.1 { - case .searching, .notFound: - enabled = false - case .none: - enabled = true - case let .found(data): - enabled = true - info = data.info - } - rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: enabled, action: { - if info?.id == currentPackInfo?.id { - dismissImpl?() - } else { + let signal = combineLatest(context.sharedContext.presentationData, statePromise.get() |> deliverOnMainQueue, initialData.get() |> deliverOnMainQueue, stickerPacks.get() |> deliverOnMainQueue, searchState.get() |> deliverOnMainQueue, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.stickerSettings]) |> deliverOnMainQueue) + |> map { presentationData, state, initialData, view, searchState, sharedData -> (ItemListControllerState, (ItemListNodeState, GroupStickerPackEntry.ItemGenerationArguments)) in + var stickerSettings = StickerSettings.defaultSettings + if let value = sharedData.entries[ApplicationSpecificSharedDataKeys.stickerSettings] as? StickerSettings { + stickerSettings = value + } + + let leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { + dismissImpl?() + }) + + var rightNavigationButton: ItemListNavigationButton? + if initialData != nil { + if state.isSaving { + rightNavigationButton = ItemListNavigationButton(content: .text(""), style: .activity, enabled: true, action: {}) + } else { + let enabled: Bool + var info: StickerPackCollectionInfo? + switch searchState.1 { + case .searching, .notFound: + enabled = false + case .none: + enabled = true + case let .found(data): + enabled = true + info = data.info + } + rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: enabled, action: { + if info?.id == currentPackInfo?.id { + dismissImpl?() + } else { + updateState { state in + var state = state + state.isSaving = true + return state + } + saveDisposable.set((updateGroupSpecificStickerset(postbox: context.account.postbox, network: context.account.network, peerId: peerId, info: info) + |> deliverOnMainQueue).start(error: { _ in updateState { state in var state = state - state.isSaving = true + state.isSaving = false return state } - saveDisposable.set((updateGroupSpecificStickerset(postbox: context.account.postbox, network: context.account.network, peerId: peerId, info: info) - |> deliverOnMainQueue).start(error: { _ in - updateState { state in - var state = state - state.isSaving = false - return state - } - }, completed: { - dismissImpl?() - })) - } - }) - } + }, completed: { + dismissImpl?() + })) + } + }) } - - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Channel_Info_Stickers), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) - - let hasData = initialData != nil - let hadData = previousHadData.swap(hasData) - - var emptyStateItem: ItemListLoadingIndicatorEmptyStateItem? - if !hasData { - emptyStateItem = ItemListLoadingIndicatorEmptyStateItem(theme: presentationData.theme) - } - - let listState = ItemListNodeState(entries: groupStickerPackSetupControllerEntries(presentationData: presentationData, searchText: searchState.0, view: view, initialData: initialData, searchState: searchState.1), style: .blocks, emptyStateItem: emptyStateItem, animateChanges: hasData && hadData) - return (controllerState, (listState, arguments)) - } |> afterDisposed { - actionsDisposable.dispose() + } + + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Channel_Info_Stickers), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) + + let hasData = initialData != nil + let hadData = previousHadData.swap(hasData) + + var emptyStateItem: ItemListLoadingIndicatorEmptyStateItem? + if !hasData { + emptyStateItem = ItemListLoadingIndicatorEmptyStateItem(theme: presentationData.theme) + } + + let listState = ItemListNodeState(entries: groupStickerPackSetupControllerEntries(presentationData: presentationData, searchText: searchState.0, view: view, initialData: initialData, searchState: searchState.1, stickerSettings: stickerSettings), style: .blocks, emptyStateItem: emptyStateItem, animateChanges: hasData && hadData) + return (controllerState, (listState, arguments)) + } |> afterDisposed { + actionsDisposable.dispose() } let controller = ItemListController(context: context, state: signal) diff --git a/submodules/TelegramUI/TelegramUI/InstalledStickerPacksController.swift b/submodules/TelegramUI/TelegramUI/InstalledStickerPacksController.swift index c2f6745deb..1e8a02f9c1 100644 --- a/submodules/TelegramUI/TelegramUI/InstalledStickerPacksController.swift +++ b/submodules/TelegramUI/TelegramUI/InstalledStickerPacksController.swift @@ -18,8 +18,9 @@ private final class InstalledStickerPacksControllerArguments { let openFeatured: () -> Void let openArchived: ([ArchivedStickerPackItem]?) -> Void let openSuggestOptions: () -> Void + let toggleAnimatedStickers: (Bool) -> Void - init(account: Account, openStickerPack: @escaping (StickerPackCollectionInfo) -> Void, setPackIdWithRevealedOptions: @escaping (ItemCollectionId?, ItemCollectionId?) -> Void, removePack: @escaping (ArchivedStickerPackItem) -> Void, openStickersBot: @escaping () -> Void, openMasks: @escaping () -> Void, openFeatured: @escaping () -> Void, openArchived: @escaping ([ArchivedStickerPackItem]?) -> Void, openSuggestOptions: @escaping () -> Void) { + init(account: Account, openStickerPack: @escaping (StickerPackCollectionInfo) -> Void, setPackIdWithRevealedOptions: @escaping (ItemCollectionId?, ItemCollectionId?) -> Void, removePack: @escaping (ArchivedStickerPackItem) -> Void, openStickersBot: @escaping () -> Void, openMasks: @escaping () -> Void, openFeatured: @escaping () -> Void, openArchived: @escaping ([ArchivedStickerPackItem]?) -> Void, openSuggestOptions: @escaping () -> Void, toggleAnimatedStickers: @escaping (Bool) -> Void) { self.account = account self.openStickerPack = openStickerPack self.setPackIdWithRevealedOptions = setPackIdWithRevealedOptions @@ -29,6 +30,7 @@ private final class InstalledStickerPacksControllerArguments { self.openFeatured = openFeatured self.openArchived = openArchived self.openSuggestOptions = openSuggestOptions + self.toggleAnimatedStickers = toggleAnimatedStickers } } @@ -85,13 +87,15 @@ private enum InstalledStickerPacksEntry: ItemListNodeEntry { case trending(PresentationTheme, String, Int32) case archived(PresentationTheme, String, Int32, [ArchivedStickerPackItem]?) case masks(PresentationTheme, String) + case animatedStickers(PresentationTheme, String, Bool) + case animatedStickersInfo(PresentationTheme, String) case packsTitle(PresentationTheme, String) - case pack(Int32, PresentationTheme, PresentationStrings, StickerPackCollectionInfo, StickerPackItem?, String, Bool, ItemListStickerPackItemEditing) + case pack(Int32, PresentationTheme, PresentationStrings, StickerPackCollectionInfo, StickerPackItem?, String, Bool, Bool, ItemListStickerPackItemEditing) case packsInfo(PresentationTheme, String) var section: ItemListSectionId { switch self { - case .suggestOptions, .trending, .masks, .archived: + case .suggestOptions, .trending, .masks, .archived, .animatedStickers, .animatedStickersInfo: return InstalledStickerPacksSection.service.rawValue case .packsTitle, .pack, .packsInfo: return InstalledStickerPacksSection.stickers.rawValue @@ -108,12 +112,16 @@ private enum InstalledStickerPacksEntry: ItemListNodeEntry { return .index(2) case .masks: return .index(3) - case .packsTitle: + case .animatedStickers: return .index(4) - case let .pack(_, _, _, info, _, _, _, _): + case .animatedStickersInfo: + return .index(5) + case .packsTitle: + return .index(6) + case let .pack(_, _, _, info, _, _, _, _, _): return .pack(info.id) case .packsInfo: - return .index(5) + return .index(7) } } @@ -143,14 +151,26 @@ private enum InstalledStickerPacksEntry: ItemListNodeEntry { } else { return false } + case let .animatedStickers(lhsTheme, lhsText, lhsValue): + if case let .animatedStickers(rhsTheme, rhsText, rhsValue) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsValue == rhsValue { + return true + } else { + return false + } + case let .animatedStickersInfo(lhsTheme, lhsText): + if case let .animatedStickersInfo(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } case let .packsTitle(lhsTheme, lhsText): if case let .packsTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { return true } else { return false } - case let .pack(lhsIndex, lhsTheme, lhsStrings, lhsInfo, lhsTopItem, lhsCount, lhsEnabled, lhsEditing): - if case let .pack(rhsIndex, rhsTheme, rhsStrings, rhsInfo, rhsTopItem, rhsCount, rhsEnabled, rhsEditing) = rhs { + case let .pack(lhsIndex, lhsTheme, lhsStrings, lhsInfo, lhsTopItem, lhsCount, lhsAnimatedStickers, lhsEnabled, lhsEditing): + if case let .pack(rhsIndex, rhsTheme, rhsStrings, rhsInfo, rhsTopItem, rhsCount, rhsAnimatedStickers, rhsEnabled, rhsEditing) = rhs { if lhsIndex != rhsIndex { return false } @@ -169,6 +189,9 @@ private enum InstalledStickerPacksEntry: ItemListNodeEntry { if lhsCount != rhsCount { return false } + if lhsAnimatedStickers != rhsAnimatedStickers { + return false + } if lhsEnabled != rhsEnabled { return false } @@ -218,16 +241,30 @@ private enum InstalledStickerPacksEntry: ItemListNodeEntry { default: return true } - case .packsTitle: + case .animatedStickers: switch rhs { - case .suggestOptions, .trending, .masks, .archived, .packsTitle: + case .suggestOptions, .trending, .archived, .masks, .animatedStickers: return false default: return true } - case let .pack(lhsIndex, _, _, _, _, _, _, _): + case .animatedStickersInfo: switch rhs { - case let .pack(rhsIndex, _, _, _, _, _, _, _): + case .suggestOptions, .trending, .archived, .masks, .animatedStickers, .animatedStickersInfo: + return false + default: + return true + } + case .packsTitle: + switch rhs { + case .suggestOptions, .trending, .masks, .archived, .animatedStickers, .animatedStickersInfo, .packsTitle: + return false + default: + return true + } + case let .pack(lhsIndex, _, _, _, _, _, _, _, _): + switch rhs { + case let .pack(rhsIndex, _, _, _, _, _, _, _, _): return lhsIndex < rhsIndex case .packsInfo: return true @@ -262,10 +299,16 @@ private enum InstalledStickerPacksEntry: ItemListNodeEntry { return ItemListDisclosureItem(theme: theme, title: text, label: count == 0 ? "" : "\(count)", sectionId: self.section, style: .blocks, action: { arguments.openArchived(archived) }) + case let .animatedStickers(theme, text, value): + return ItemListSwitchItem(theme: theme, title: text, value: value, sectionId: self.section, style: .blocks, updated: { value in + arguments.toggleAnimatedStickers(value) + }) + case let .animatedStickersInfo(theme, text): + return ItemListTextItem(theme: theme, text: .plain(text), sectionId: self.section) case let .packsTitle(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) - case let .pack(_, theme, strings, info, topItem, count, enabled, editing): - return ItemListStickerPackItem(theme: theme, strings: strings, account: arguments.account, packInfo: info, itemCount: count, topItem: topItem, unread: false, control: .none, editing: editing, enabled: enabled, sectionId: self.section, action: { + case let .pack(_, theme, strings, info, topItem, count, animatedStickers, enabled, editing): + return ItemListStickerPackItem(theme: theme, strings: strings, account: arguments.account, packInfo: info, itemCount: count, topItem: topItem, unread: false, control: .none, editing: editing, enabled: enabled, playAnimatedStickers: animatedStickers, sectionId: self.section, action: { arguments.openStickerPack(info) }, setPackIdWithRevealedOptions: { current, previous in arguments.setPackIdWithRevealedOptions(current, previous) @@ -353,6 +396,10 @@ private func installedStickerPacksControllerEntries(presentationData: Presentati entries.append(.archived(presentationData.theme, presentationData.strings.StickerPacksSettings_ArchivedPacks, Int32(archived.count), archived)) } entries.append(.masks(presentationData.theme, presentationData.strings.MaskStickerSettings_Title)) + + entries.append(.animatedStickers(presentationData.theme, presentationData.strings.StickerPacksSettings_AnimatedStickers, stickerSettings.loopAnimatedStickers)) + entries.append(.animatedStickersInfo(presentationData.theme, presentationData.strings.StickerPacksSettings_AnimatedStickersInfo)) + entries.append(.packsTitle(presentationData.theme, presentationData.strings.StickerPacksSettings_StickerPacksSection)) case .masks: if let archived = archived, !archived.isEmpty { @@ -365,7 +412,7 @@ private func installedStickerPacksControllerEntries(presentationData: Presentati var index: Int32 = 0 for entry in packsEntries { if let info = entry.info as? StickerPackCollectionInfo { - entries.append(.pack(index, presentationData.theme, presentationData.strings, info, entry.firstItem as? StickerPackItem, presentationData.strings.StickerPack_StickerCount(info.count == 0 ? entry.count : info.count), true, ItemListStickerPackItemEditing(editable: true, editing: state.editing, revealed: state.packIdWithRevealedOptions == entry.id, reorderable: true))) + entries.append(.pack(index, presentationData.theme, presentationData.strings, info, entry.firstItem as? StickerPackItem, presentationData.strings.StickerPack_StickerCount(info.count == 0 ? entry.count : info.count), stickerSettings.loopAnimatedStickers, true, ItemListStickerPackItemEditing(editable: true, editing: state.editing, revealed: state.packIdWithRevealedOptions == entry.id, reorderable: true))) index += 1 } } @@ -505,18 +552,10 @@ public func installedStickerPacksController(context: AccountContext, mode: Insta ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })]) ]) presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) - /* - let suggestString: String - switch stickerSettings.emojiStickerSuggestionMode { - case .none: - suggestString = presentationData.strings.Stickers_SuggestNone - case .all: - - case .installed: - suggestString = presentationData.strings.Stickers_SuggestAdded - } - */ - + }, toggleAnimatedStickers: { value in + let _ = updateStickerSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in + return current.withUpdatedLoopAnimatedStickers(value) + }).start() }) let stickerPacks = Promise() stickerPacks.set(context.account.postbox.combinedView(keys: [.itemCollectionInfos(namespaces: [namespaceForMode(mode)])])) @@ -531,10 +570,8 @@ public func installedStickerPacksController(context: AccountContext, mode: Insta featured.set(.single([])) archivedPromise.set(.single(nil) |> then(archivedStickerPacks(account: context.account, namespace: .masks) |> map(Optional.init))) } - var previousPackCount: Int? - let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get(), stickerPacks.get(), combineLatest(queue: .mainQueue(), featured.get(), archivedPromise.get()), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.stickerSettings])) |> deliverOnMainQueue |> map { presentationData, state, view, featuredAndArchived, sharedData -> (ItemListControllerState, (ItemListNodeState, InstalledStickerPacksEntry.ItemGenerationArguments)) in @@ -549,12 +586,6 @@ public func installedStickerPacksController(context: AccountContext, mode: Insta } let leftNavigationButton: ItemListNavigationButton? = nil - /*if case .modal = mode { - leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { - dismissImpl?() - }) - }*/ - var rightNavigationButton: ItemListNavigationButton? if let packCount = packCount, packCount != 0 { if case .modal = mode { @@ -603,7 +634,7 @@ public func installedStickerPacksController(context: AccountContext, mode: Insta controller.reorderEntry = { fromIndex, toIndex, entries in let fromEntry = entries[fromIndex] - guard case let .pack(_, _, _, fromPackInfo, _, _, _, _) = fromEntry else { + guard case let .pack(_, _, _, fromPackInfo, _, _, _, _, _) = fromEntry else { return } var referenceId: ItemCollectionId? @@ -611,7 +642,7 @@ public func installedStickerPacksController(context: AccountContext, mode: Insta var afterAll = false if toIndex < entries.count { switch entries[toIndex] { - case let .pack(_, _, _, toPackInfo, _, _, _, _): + case let .pack(_, _, _, toPackInfo, _, _, _, _, _): referenceId = toPackInfo.id default: if entries[toIndex] < fromEntry { diff --git a/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift index 5f24644910..a7ed3223d8 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListStickerPackItem.swift @@ -47,13 +47,14 @@ final class ItemListStickerPackItem: ListViewItem, ItemListItem { let control: ItemListStickerPackItemControl let editing: ItemListStickerPackItemEditing let enabled: Bool + let playAnimatedStickers: Bool let sectionId: ItemListSectionId let action: (() -> Void)? let setPackIdWithRevealedOptions: (ItemCollectionId?, ItemCollectionId?) -> Void let addPack: () -> Void let removePack: () -> Void - init(theme: PresentationTheme, strings: PresentationStrings, account: Account, packInfo: StickerPackCollectionInfo, itemCount: String, topItem: StickerPackItem?, unread: Bool, control: ItemListStickerPackItemControl, editing: ItemListStickerPackItemEditing, enabled: Bool, sectionId: ItemListSectionId, action: (() -> Void)?, setPackIdWithRevealedOptions: @escaping (ItemCollectionId?, ItemCollectionId?) -> Void, addPack: @escaping () -> Void, removePack: @escaping () -> Void) { + init(theme: PresentationTheme, strings: PresentationStrings, account: Account, packInfo: StickerPackCollectionInfo, itemCount: String, topItem: StickerPackItem?, unread: Bool, control: ItemListStickerPackItemControl, editing: ItemListStickerPackItemEditing, enabled: Bool, playAnimatedStickers: Bool, sectionId: ItemListSectionId, action: (() -> Void)?, setPackIdWithRevealedOptions: @escaping (ItemCollectionId?, ItemCollectionId?) -> Void, addPack: @escaping () -> Void, removePack: @escaping () -> Void) { self.theme = theme self.strings = strings self.account = account @@ -64,6 +65,7 @@ final class ItemListStickerPackItem: ListViewItem, ItemListItem { self.control = control self.editing = editing self.enabled = enabled + self.playAnimatedStickers = playAnimatedStickers self.sectionId = sectionId self.action = action self.setPackIdWithRevealedOptions = setPackIdWithRevealedOptions @@ -162,7 +164,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { let isVisible = self.visibility != .none if wasVisible != isVisible { - self.animationNode?.visibility = isVisible + self.animationNode?.visibility = isVisible && (self.layoutParams?.0.playAnimatedStickers ?? true) } } } @@ -558,8 +560,8 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { strongSelf.animationNode = animationNode strongSelf.addSubnode(animationNode) animationNode.setup(account: item.account, resource: resource, width: 80, height: 80, mode: .cached) - animationNode.visibility = strongSelf.visibility != .none } + animationNode.visibility = strongSelf.visibility != .none && item.playAnimatedStickers if let animationNode = strongSelf.animationNode { transition.updateFrame(node: animationNode, frame: imageFrame) } diff --git a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift index 8417e760dd..790162a1fc 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift @@ -101,7 +101,7 @@ final class OverlayPlayerControllerNode: ViewControllerTracingNode, UIGestureRec }, seekToTimecode: { _, _, _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { - }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, pollActionState: ChatInterfacePollActionState()) + }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, pollActionState: ChatInterfacePollActionState(), stickerSettings: ChatInterfaceStickerSettings(loopAnimatedStickers: false)) self.dimNode = ASDisplayNode() self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5) diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index dee56a9619..43997090c3 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -272,7 +272,7 @@ public class PeerMediaCollectionController: TelegramController { }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, - pollActionState: ChatInterfacePollActionState()) + pollActionState: ChatInterfacePollActionState(), stickerSettings: ChatInterfaceStickerSettings(loopAnimatedStickers: false)) self.controllerInteraction = controllerInteraction diff --git a/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift b/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift index 113d37d7db..76dd7c71b9 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPackPreviewController.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import Postbox import TelegramCore import SwiftSignalKit +import TelegramUIPreferences enum StickerPackPreviewControllerMode { case `default` @@ -140,8 +141,13 @@ final class StickerPackPreviewController: ViewController { } let account = self.context.account self.displayNodeDidLoad() - self.stickerPackDisposable.set((self.stickerPackContents.get() - |> mapToSignal { next -> Signal in + self.stickerPackDisposable.set((combineLatest(self.stickerPackContents.get(), self.context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.stickerSettings]) |> take(1)) + |> mapToSignal { next, sharedData -> Signal<(LoadedStickerPack, StickerSettings), NoError> in + var stickerSettings = StickerSettings.defaultSettings + if let value = sharedData.entries[ApplicationSpecificSharedDataKeys.stickerSettings] as? StickerSettings { + stickerSettings = value + } + switch next { case let .result(_, items, _): var preloadSignals: [Signal] = [] @@ -172,26 +178,26 @@ final class StickerPackPreviewController: ViewController { return !values.contains(false) } |> distinctUntilChanged - |> mapToSignal { loaded -> Signal in + |> mapToSignal { loaded -> Signal<(LoadedStickerPack, StickerSettings), NoError> in if !loaded { - return .single(.fetching) + return .single((.fetching, stickerSettings)) } else { - return .single(next) + return .single((next, stickerSettings)) } } default: - return .single(next) + return .single((next, stickerSettings)) } } |> deliverOnMainQueue).start(next: { [weak self] next in if let strongSelf = self { - if case .none = next { + if case .none = next.0 { let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: presentationData.strings.StickerPack_ErrorNotFound, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root)) strongSelf.dismiss() } else { - strongSelf.controllerNode.updateStickerPack(next) - strongSelf.stickerPackContentsValue = next + strongSelf.controllerNode.updateStickerPack(next.0, stickerSettings: next.1) + strongSelf.stickerPackContentsValue = next.0 } } })) diff --git a/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift b/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift index 870c783b78..03c62c1ed6 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import Postbox import TelegramCore import TelegramPresentationData +import TelegramUIPreferences private struct StickerPackPreviewGridEntry: Comparable, Identifiable { let index: Int @@ -75,6 +76,7 @@ final class StickerPackPreviewControllerNode: ViewControllerTracingNode, UIScrol private var stickerPack: LoadedStickerPack? private var stickerPackUpdated = false private var stickerPackInitiallyInstalled : Bool? + private var stickerSettings: StickerSettings? private var currentItems: [StickerPackPreviewGridEntry] = [] @@ -131,13 +133,7 @@ final class StickerPackPreviewControllerNode: ViewControllerTracingNode, UIScrol super.init() - self.interaction = StickerPackPreviewInteraction(sendSticker: { [weak self] item in - if let strongSelf = self, let sendSticker = strongSelf.sendSticker { - /*if sendSticker(item.file) { - strongSelf.cancel?() - }*/ - } - }) + self.interaction = StickerPackPreviewInteraction(playAnimatedStickers: false) self.backgroundColor = nil self.isOpaque = false @@ -510,16 +506,16 @@ final class StickerPackPreviewControllerNode: ViewControllerTracingNode, UIScrol } else { dismissOnAction = true } - if let stickerPack = self.stickerPack { + if let stickerPack = self.stickerPack, let stickerSettings = self.stickerSettings { switch stickerPack { case let .result(info, items, installed): if installed { let _ = removeStickerPackInteractively(postbox: self.context.account.postbox, id: info.id, option: .delete).start() - updateStickerPack(.result(info: info, items: items, installed: false)) + self.updateStickerPack(.result(info: info, items: items, installed: false), stickerSettings: stickerSettings) } else { let _ = addStickerPackInteractively(postbox: self.context.account.postbox, info: info, items: items).start() if !dismissOnAction { - updateStickerPack(.result(info: info, items: items, installed: true)) + self.updateStickerPack(.result(info: info, items: items, installed: true), stickerSettings: stickerSettings) } } if dismissOnAction { @@ -566,9 +562,13 @@ final class StickerPackPreviewControllerNode: ViewControllerTracingNode, UIScrol }) } - func updateStickerPack(_ stickerPack: LoadedStickerPack) { + func updateStickerPack(_ stickerPack: LoadedStickerPack, stickerSettings: StickerSettings) { self.stickerPack = stickerPack + self.stickerSettings = stickerSettings self.stickerPackUpdated = true + + self.interaction.playAnimatedStickers = stickerSettings.loopAnimatedStickers + if let _ = self.containerLayout { self.dequeueUpdateStickerPack() } diff --git a/submodules/TelegramUI/TelegramUI/StickerPackPreviewGridItem.swift b/submodules/TelegramUI/TelegramUI/StickerPackPreviewGridItem.swift index 412ed8e834..06b0bdc2b1 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPackPreviewGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPackPreviewGridItem.swift @@ -8,11 +8,10 @@ import Postbox final class StickerPackPreviewInteraction { var previewedItem: StickerPreviewPeekItem? + var playAnimatedStickers: Bool - let sendSticker: (StickerPackItem) -> Void - - init(sendSticker: @escaping (StickerPackItem) -> Void) { - self.sendSticker = sendSticker + init(playAnimatedStickers: Bool) { + self.playAnimatedStickers = playAnimatedStickers } } @@ -53,12 +52,10 @@ final class StickerPackPreviewGridItemNode: GridItemNode { override var isVisibleInGrid: Bool { didSet { - self.animationNode?.visibility = self.isVisibleInGrid + self.animationNode?.visibility = self.isVisibleInGrid && self.interaction?.playAnimatedStickers ?? true } } - private let textNode: ASTextNode - private var currentIsPreviewing = false private let stickerFetchedDisposable = MetaDisposable() @@ -74,16 +71,10 @@ final class StickerPackPreviewGridItemNode: GridItemNode { override init() { self.imageNode = TransformImageNode() self.imageNode.isLayerBacked = !smartInvertColorsEnabled() - //self.imageNode.alphaTransitionOnFirstUpdate = true - - self.textNode = ASTextNode() - self.textNode.isUserInteractionEnabled = false - self.textNode.displaysAsynchronously = true super.init() self.addSubnode(self.imageNode) - //self.addSubnode(self.textNode) } deinit { @@ -100,14 +91,6 @@ final class StickerPackPreviewGridItemNode: GridItemNode { self.interaction = interaction if self.currentState == nil || self.currentState!.0 !== account || self.currentState!.1 != stickerItem { - var text = "" - for attribute in stickerItem.file.attributes { - if case let .Sticker(displayText, _, _) = attribute { - text = displayText - break - } - } - self.textNode.attributedText = NSAttributedString(string: text, font: textFont, textColor: .black, paragraphAlignment: .right) if let dimensions = stickerItem.file.dimensions { if stickerItem.file.isAnimatedSticker { self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: account.postbox, file: stickerItem.file, small: false, size: CGSize(width: 160.0, height: 160.0))) @@ -121,7 +104,7 @@ final class StickerPackPreviewGridItemNode: GridItemNode { } } self.animationNode?.setup(account: account, resource: stickerItem.file.resource, width: 160, height: 160, mode: .cached) - self.animationNode?.visibility = self.isVisibleInGrid + self.animationNode?.visibility = self.isVisibleInGrid && self.interaction?.playAnimatedStickers ?? true self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: stickerItem.file.resource).start()) } else { if let animationNode = self.animationNode { @@ -157,9 +140,6 @@ final class StickerPackPreviewGridItemNode: GridItemNode { animationNode.frame = CGRect(origin: CGPoint(x: floor((bounds.size.width - imageSize.width) / 2.0), y: (bounds.size.height - imageSize.height) / 2.0), size: imageSize) animationNode.updateLayout(size: imageSize) } - let boundingFrame = CGRect(origin: CGPoint(x: floor((bounds.size.width - boundingSize.width) / 2.0), y: (bounds.size.height - boundingSize.height) / 2.0), size: boundingSize) - let textSize = CGSize(width: 32.0, height: 24.0) - self.textNode.frame = CGRect(origin: CGPoint(x: boundingFrame.maxX - 1.0 - textSize.width, y: boundingFrame.height + 10.0 - textSize.height), size: textSize) } } @@ -169,7 +149,7 @@ final class StickerPackPreviewGridItemNode: GridItemNode { @objc func imageNodeTap(_ recognizer: UITapGestureRecognizer) { if let interaction = self.interaction, let (_, item, _) = self.currentState, case .ended = recognizer.state { - interaction.sendSticker(item) + //interaction.sendSticker(item) } } diff --git a/submodules/TelegramUIPreferences/Sources/MediaAutoDownloadSettings.swift b/submodules/TelegramUIPreferences/Sources/MediaAutoDownloadSettings.swift index dd1e6abf7a..4240e5768f 100644 --- a/submodules/TelegramUIPreferences/Sources/MediaAutoDownloadSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/MediaAutoDownloadSettings.swift @@ -151,14 +151,14 @@ public struct MediaAutoDownloadSettings: PreferencesEntry, Equatable { public static var defaultSettings: MediaAutoDownloadSettings { let mb: Int32 = 1024 * 1024 let presets = MediaAutoDownloadPresets(low: MediaAutoDownloadCategories(basePreset: .low, photo: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 1 * mb, predownload: false), - video: MediaAutoDownloadCategory(contacts: false, otherPrivate: false, groups: false, channels: false, sizeLimit: 1 * mb, predownload: false), - file: MediaAutoDownloadCategory(contacts: false, otherPrivate: false, groups: false, channels: false, sizeLimit: 1 * mb, predownload: false)), - medium: MediaAutoDownloadCategories(basePreset: .medium, photo: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 1 * mb, predownload: false), - video: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: Int32(2.5 * CGFloat(mb)), predownload: false), - file: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 1 * mb, predownload: false)), - high: MediaAutoDownloadCategories(basePreset: .high, photo: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 1 * mb, predownload: false), - video: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 10 * mb, predownload: true), - file: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 3 * mb, predownload: false))) + video: MediaAutoDownloadCategory(contacts: false, otherPrivate: false, groups: false, channels: false, sizeLimit: 1 * mb, predownload: false), + file: MediaAutoDownloadCategory(contacts: false, otherPrivate: false, groups: false, channels: false, sizeLimit: 1 * mb, predownload: false)), + medium: MediaAutoDownloadCategories(basePreset: .medium, photo: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 1 * mb, predownload: false), + video: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: Int32(2.5 * CGFloat(mb)), predownload: false), + file: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 1 * mb, predownload: false)), + high: MediaAutoDownloadCategories(basePreset: .high, photo: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 1 * mb, predownload: false), + video: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 10 * mb, predownload: true), + file: MediaAutoDownloadCategory(contacts: true, otherPrivate: true, groups: true, channels: true, sizeLimit: 3 * mb, predownload: false))) let saveDownloadedPhotos = MediaAutoDownloadCategory(contacts: false, otherPrivate: false, groups: false, channels: false, sizeLimit: 0, predownload: false) return MediaAutoDownloadSettings(presets: presets, cellular: MediaAutoDownloadConnection(enabled: true, preset: .medium, custom: nil), wifi: MediaAutoDownloadConnection(enabled: true, preset: .high, custom: nil), saveDownloadedPhotos: saveDownloadedPhotos, autoplayGifs: true, autoplayVideos: true, downloadInBackground: true) diff --git a/submodules/TelegramUIPreferences/Sources/StickerSettings.swift b/submodules/TelegramUIPreferences/Sources/StickerSettings.swift index 79244f2e03..4eea5be1da 100644 --- a/submodules/TelegramUIPreferences/Sources/StickerSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/StickerSettings.swift @@ -10,21 +10,25 @@ public enum EmojiStickerSuggestionMode: Int32 { public struct StickerSettings: PreferencesEntry, Equatable { public var emojiStickerSuggestionMode: EmojiStickerSuggestionMode + public var loopAnimatedStickers: Bool public static var defaultSettings: StickerSettings { - return StickerSettings(emojiStickerSuggestionMode: .all) + return StickerSettings(emojiStickerSuggestionMode: .all, loopAnimatedStickers: true) } - init(emojiStickerSuggestionMode: EmojiStickerSuggestionMode) { + init(emojiStickerSuggestionMode: EmojiStickerSuggestionMode, loopAnimatedStickers: Bool) { self.emojiStickerSuggestionMode = emojiStickerSuggestionMode + self.loopAnimatedStickers = loopAnimatedStickers } public init(decoder: PostboxDecoder) { self.emojiStickerSuggestionMode = EmojiStickerSuggestionMode(rawValue: decoder.decodeInt32ForKey("emojiStickerSuggestionMode", orElse: 0))! + self.loopAnimatedStickers = decoder.decodeBoolForKey("loopAnimatedStickers", orElse: true) } public func encode(_ encoder: PostboxEncoder) { encoder.encodeInt32(self.emojiStickerSuggestionMode.rawValue, forKey: "emojiStickerSuggestionMode") + encoder.encodeBool(self.loopAnimatedStickers, forKey: "loopAnimatedStickers") } public func isEqual(to: PreferencesEntry) -> Bool { @@ -36,11 +40,15 @@ public struct StickerSettings: PreferencesEntry, Equatable { } public static func ==(lhs: StickerSettings, rhs: StickerSettings) -> Bool { - return lhs.emojiStickerSuggestionMode == rhs.emojiStickerSuggestionMode + return lhs.emojiStickerSuggestionMode == rhs.emojiStickerSuggestionMode && lhs.loopAnimatedStickers == rhs.loopAnimatedStickers } public func withUpdatedEmojiStickerSuggestionMode(_ emojiStickerSuggestionMode: EmojiStickerSuggestionMode) -> StickerSettings { - return StickerSettings(emojiStickerSuggestionMode: emojiStickerSuggestionMode) + return StickerSettings(emojiStickerSuggestionMode: emojiStickerSuggestionMode, loopAnimatedStickers: self.loopAnimatedStickers) + } + + public func withUpdatedLoopAnimatedStickers(_ loopAnimatedStickers: Bool) -> StickerSettings { + return StickerSettings(emojiStickerSuggestionMode: self.emojiStickerSuggestionMode, loopAnimatedStickers: loopAnimatedStickers) } } From 185a3c4dad07b09024de48477a1bb79285d56581 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 15 Jul 2019 18:21:01 +0200 Subject: [PATCH 29/32] Fixed bot payload handover when opening the bot's start url with the bot's chat already opened --- .../TelegramUI/NavigateToChatController.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift index 42883c4ec2..0fcb9c3d46 100644 --- a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift +++ b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift @@ -38,6 +38,11 @@ public func navigateToChatController(navigationController: NavigationController, if activateInput { controller.activateInput() } + if let botStart = botStart { + controller.updateChatPresentationInterfaceState(interactive: false) { state -> ChatPresentationInterfaceState in + return state.updatedBotStartPayload(botStart.payload) + } + } found = true break } @@ -48,6 +53,11 @@ public func navigateToChatController(navigationController: NavigationController, let controller: ChatController if let chatController = chatController { controller = chatController + if let botStart = botStart { + controller.updateChatPresentationInterfaceState(interactive: false) { state -> ChatPresentationInterfaceState in + return state.updatedBotStartPayload(botStart.payload) + } + } } else { controller = ChatController(context: context, chatLocation: chatLocation, messageId: messageId, botStart: botStart) } From fec4f50849e9e3d2a0a72c5437eb12af0c262f7c Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 17 Jul 2019 00:25:04 +0200 Subject: [PATCH 30/32] Added block quote entity support --- submodules/Display/Display/TextNode.swift | 119 +++++++++++++----- .../AuthorizationSequenceController.swift | 2 +- .../TelegramUI/ChatBotInfoItem.swift | 2 +- .../ChatMessageActionItemNode.swift | 2 +- .../ChatMessageAttachedContentNode.swift | 3 +- .../ChatMessageTextBubbleContentNode.swift | 4 +- .../TelegramUI/ChatPresentationData.swift | 2 + .../TelegramUI/ChatTextInputAttributes.swift | 1 + .../TelegramUI/GalleryController.swift | 2 +- .../TelegramUI/ItemListAddressItem.swift | 2 +- .../ItemListMultilineTextItem.swift | 2 +- .../ItemListTextWithLabelItem.swift | 2 +- .../TelegramUI/TelegramUI/Pasteboard.swift | 2 +- .../StickerPackPreviewControllerNode.swift | 3 +- .../StringWithAppliedEntities.swift | 30 ++++- .../TermsOfServiceControllerNode.swift | 2 +- .../TelegramUI/TelegramUI/TextNode.swift | 1 + .../TelegramUI/UpdateInfoItem.swift | 2 +- 18 files changed, 133 insertions(+), 50 deletions(-) diff --git a/submodules/Display/Display/TextNode.swift b/submodules/Display/Display/TextNode.swift index b70b5400fa..a00c22c472 100644 --- a/submodules/Display/Display/TextNode.swift +++ b/submodules/Display/Display/TextNode.swift @@ -5,6 +5,14 @@ import CoreText private let defaultFont = UIFont.systemFont(ofSize: 15.0) +private final class TextNodeStrikethrough { + let frame: CGRect + + init(frame: CGRect) { + self.frame = frame + } +} + private final class TextNodeLine { let line: CTLine let frame: CGRect @@ -21,7 +29,7 @@ private final class TextNodeLine { } } -private final class TextNodeStrikethrough { +private final class TextNodeBlockQuote { let frame: CGRect init(frame: CGRect) { @@ -83,8 +91,9 @@ public final class TextNodeLayoutArguments { public let lineSpacing: CGFloat public let cutout: TextNodeCutout? public let insets: UIEdgeInsets + public let lineColor: UIColor? - public init(attributedString: NSAttributedString?, backgroundColor: UIColor? = nil, maximumNumberOfLines: Int, truncationType: CTLineTruncationType, constrainedSize: CGSize, alignment: NSTextAlignment = .natural, lineSpacing: CGFloat = 0.12, cutout: TextNodeCutout? = nil, insets: UIEdgeInsets = UIEdgeInsets()) { + public init(attributedString: NSAttributedString?, backgroundColor: UIColor? = nil, maximumNumberOfLines: Int, truncationType: CTLineTruncationType, constrainedSize: CGSize, alignment: NSTextAlignment = .natural, lineSpacing: CGFloat = 0.12, cutout: TextNodeCutout? = nil, insets: UIEdgeInsets = UIEdgeInsets(), lineColor: UIColor? = nil) { self.attributedString = attributedString self.backgroundColor = backgroundColor self.maximumNumberOfLines = maximumNumberOfLines @@ -94,6 +103,7 @@ public final class TextNodeLayoutArguments { self.lineSpacing = lineSpacing self.cutout = cutout self.insets = insets + self.lineColor = lineColor } } @@ -111,9 +121,11 @@ public final class TextNodeLayout: NSObject { public let truncated: Bool fileprivate let firstLineOffset: CGFloat fileprivate let lines: [TextNodeLine] + fileprivate let blockQuotes: [TextNodeBlockQuote] + fileprivate let lineColor: UIColor? public let hasRTL: Bool - fileprivate init(attributedString: NSAttributedString?, maximumNumberOfLines: Int, truncationType: CTLineTruncationType, constrainedSize: CGSize, alignment: NSTextAlignment, lineSpacing: CGFloat, cutout: TextNodeCutout?, insets: UIEdgeInsets, size: CGSize, truncated: Bool, firstLineOffset: CGFloat, lines: [TextNodeLine], backgroundColor: UIColor?) { + fileprivate init(attributedString: NSAttributedString?, maximumNumberOfLines: Int, truncationType: CTLineTruncationType, constrainedSize: CGSize, alignment: NSTextAlignment, lineSpacing: CGFloat, cutout: TextNodeCutout?, insets: UIEdgeInsets, size: CGSize, truncated: Bool, firstLineOffset: CGFloat, lines: [TextNodeLine], blockQuotes: [TextNodeBlockQuote], backgroundColor: UIColor?, lineColor: UIColor?) { self.attributedString = attributedString self.maximumNumberOfLines = maximumNumberOfLines self.truncationType = truncationType @@ -126,7 +138,9 @@ public final class TextNodeLayout: NSObject { self.truncated = truncated self.firstLineOffset = firstLineOffset self.lines = lines + self.blockQuotes = blockQuotes self.backgroundColor = backgroundColor + self.lineColor = lineColor var hasRTL = false for line in lines { if line.isRTL { @@ -561,7 +575,7 @@ public class TextNode: ASDisplayNode { } } - private class func calculateLayout(attributedString: NSAttributedString?, maximumNumberOfLines: Int, truncationType: CTLineTruncationType, backgroundColor: UIColor?, constrainedSize: CGSize, alignment: NSTextAlignment, lineSpacingFactor: CGFloat, cutout: TextNodeCutout?, insets: UIEdgeInsets) -> TextNodeLayout { + private class func calculateLayout(attributedString: NSAttributedString?, maximumNumberOfLines: Int, truncationType: CTLineTruncationType, backgroundColor: UIColor?, constrainedSize: CGSize, alignment: NSTextAlignment, lineSpacingFactor: CGFloat, cutout: TextNodeCutout?, insets: UIEdgeInsets, lineColor: UIColor?) -> TextNodeLayout { if let attributedString = attributedString { let stringLength = attributedString.length @@ -582,11 +596,12 @@ public class TextNode: ASDisplayNode { let fontLineSpacing = floor(fontLineHeight * lineSpacingFactor) var lines: [TextNodeLine] = [] + var blockQuotes: [TextNodeBlockQuote] = [] var maybeTypesetter: CTTypesetter? maybeTypesetter = CTTypesetterCreateWithAttributedString(attributedString as CFAttributedString) if maybeTypesetter == nil { - return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(), truncated: false, firstLineOffset: 0.0, lines: [], backgroundColor: backgroundColor) + return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(), truncated: false, firstLineOffset: 0.0, lines: [], blockQuotes: [], backgroundColor: backgroundColor, lineColor: lineColor) } let typesetter = maybeTypesetter! @@ -682,11 +697,28 @@ public class TextNode: ASDisplayNode { truncated = true } + var headIndent: CGFloat = 0.0 + attributedString.enumerateAttributes(in: NSMakeRange(lineRange.location, lineRange.length), options: []) { attributes, range, _ in + if let _ = attributes[NSAttributedStringKey.strikethroughStyle] { + let lowerX = floor(CTLineGetOffsetForStringIndex(coreTextLine, range.location, nil)) + let upperX = ceil(CTLineGetOffsetForStringIndex(coreTextLine, range.location + range.length, nil)) + let x = lowerX < upperX ? lowerX : upperX + strikethroughs.append(TextNodeStrikethrough(frame: CGRect(x: x, y: 0.0, width: abs(upperX - lowerX), height: fontLineHeight))) + } else if let paragraphStyle = attributes[NSAttributedStringKey.paragraphStyle] as? NSParagraphStyle { + headIndent = paragraphStyle.headIndent + + } + } + let lineWidth = min(constrainedSize.width, ceil(CGFloat(CTLineGetTypographicBounds(coreTextLine, nil, nil, nil) - CTLineGetTrailingWhitespaceWidth(coreTextLine)))) - let lineFrame = CGRect(x: lineCutoutOffset, y: lineOriginY, width: lineWidth, height: fontLineHeight) + let lineFrame = CGRect(x: lineCutoutOffset + headIndent, y: lineOriginY, width: lineWidth, height: fontLineHeight) layoutSize.height += fontLineHeight + fontLineSpacing layoutSize.width = max(layoutSize.width, lineWidth + lineAdditionalWidth) + if headIndent > 0.0 { + blockQuotes.append(TextNodeBlockQuote(frame: lineFrame)) + } + var isRTL = false let glyphRuns = CTLineGetGlyphRuns(coreTextLine) as NSArray if glyphRuns.count != 0 { @@ -696,16 +728,7 @@ public class TextNode: ASDisplayNode { } } - attributedString.enumerateAttributes(in: NSMakeRange(lineRange.location, lineRange.length), options: []) { attributes, range, _ in - if let _ = attributes[NSAttributedStringKey.strikethroughStyle] { - let lowerX = floor(CTLineGetOffsetForStringIndex(coreTextLine, range.location, nil)) - let upperX = ceil(CTLineGetOffsetForStringIndex(coreTextLine, range.location + range.length, nil)) - let x = lowerX < upperX ? lowerX : upperX - strikethroughs.append(TextNodeStrikethrough(frame: CGRect(x: x, y: 0.0, width: abs(upperX - lowerX), height: fontLineHeight))) - } - } lines.append(TextNodeLine(line: coreTextLine, frame: lineFrame, range: NSMakeRange(lineRange.location, lineRange.length), isRTL: isRTL, strikethroughs: strikethroughs)) - break } else { if lineCharacterCount > 0 { @@ -719,11 +742,27 @@ public class TextNode: ASDisplayNode { let coreTextLine = CTTypesetterCreateLineWithOffset(typesetter, lineRange, 100.0) lastLineCharacterIndex += lineCharacterCount + var headIndent: CGFloat = 0.0 + attributedString.enumerateAttributes(in: NSMakeRange(lineRange.location, lineRange.length), options: []) { attributes, range, _ in + if let _ = attributes[NSAttributedStringKey.strikethroughStyle] { + let lowerX = floor(CTLineGetOffsetForStringIndex(coreTextLine, range.location, nil)) + let upperX = ceil(CTLineGetOffsetForStringIndex(coreTextLine, range.location + range.length, nil)) + let x = lowerX < upperX ? lowerX : upperX + strikethroughs.append(TextNodeStrikethrough(frame: CGRect(x: x, y: 0.0, width: abs(upperX - lowerX), height: fontLineHeight))) + } else if let paragraphStyle = attributes[NSAttributedStringKey.paragraphStyle] as? NSParagraphStyle { + headIndent = paragraphStyle.headIndent + } + } + let lineWidth = ceil(CGFloat(CTLineGetTypographicBounds(coreTextLine, nil, nil, nil) - CTLineGetTrailingWhitespaceWidth(coreTextLine))) - let lineFrame = CGRect(x: lineCutoutOffset, y: lineOriginY, width: lineWidth, height: fontLineHeight) + let lineFrame = CGRect(x: lineCutoutOffset + headIndent, y: lineOriginY, width: lineWidth, height: fontLineHeight) layoutSize.height += fontLineHeight layoutSize.width = max(layoutSize.width, lineWidth + lineAdditionalWidth) + if headIndent > 0.0 { + blockQuotes.append(TextNodeBlockQuote(frame: lineFrame)) + } + var isRTL = false let glyphRuns = CTLineGetGlyphRuns(coreTextLine) as NSArray if glyphRuns.count != 0 { @@ -733,14 +772,6 @@ public class TextNode: ASDisplayNode { } } - attributedString.enumerateAttributes(in: NSMakeRange(lineRange.location, lineRange.length), options: []) { attributes, range, _ in - if let _ = attributes[NSAttributedStringKey.strikethroughStyle] { - let lowerX = floor(CTLineGetOffsetForStringIndex(coreTextLine, range.location, nil)) - let upperX = ceil(CTLineGetOffsetForStringIndex(coreTextLine, range.location + range.length, nil)) - let x = lowerX < upperX ? lowerX : upperX - strikethroughs.append(TextNodeStrikethrough(frame: CGRect(x: x, y: 0.0, width: abs(upperX - lowerX), height: fontLineHeight))) - } - } lines.append(TextNodeLine(line: coreTextLine, frame: lineFrame, range: NSMakeRange(lineRange.location, lineRange.length), isRTL: isRTL, strikethroughs: strikethroughs)) } else { if !lines.isEmpty { @@ -762,9 +793,9 @@ public class TextNode: ASDisplayNode { } } - return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(width: ceil(layoutSize.width) + insets.left + insets.right, height: ceil(layoutSize.height) + insets.top + insets.bottom), truncated: truncated, firstLineOffset: firstLineOffset, lines: lines, backgroundColor: backgroundColor) + return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(width: ceil(layoutSize.width) + insets.left + insets.right, height: ceil(layoutSize.height) + insets.top + insets.bottom), truncated: truncated, firstLineOffset: firstLineOffset, lines: lines, blockQuotes: blockQuotes, backgroundColor: backgroundColor, lineColor: lineColor) } else { - return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(), truncated: false, firstLineOffset: 0.0, lines: [], backgroundColor: backgroundColor) + return TextNodeLayout(attributedString: attributedString, maximumNumberOfLines: maximumNumberOfLines, truncationType: truncationType, constrainedSize: constrainedSize, alignment: alignment, lineSpacing: lineSpacingFactor, cutout: cutout, insets: insets, size: CGSize(), truncated: false, firstLineOffset: 0.0, lines: [], blockQuotes: [], backgroundColor: backgroundColor, lineColor: lineColor) } } @@ -799,11 +830,8 @@ public class TextNode: ASDisplayNode { let textMatrix = context.textMatrix let textPosition = context.textPosition - //CGContextSaveGState(context) - context.textMatrix = CGAffineTransform(scaleX: 1.0, y: -1.0) - //let clipRect = CGContextGetClipBoundingBox(context) let alignment = layout.alignment let offset = CGPoint(x: layout.insets.left, y: layout.insets.top) @@ -832,7 +860,34 @@ public class TextNode: ASDisplayNode { } } - //CGContextRestoreGState(context) + var blockQuoteFrames: [CGRect] = [] + var currentBlockQuoteFrame: CGRect? + for blockQuote in layout.blockQuotes { + if let frame = currentBlockQuoteFrame { + if blockQuote.frame.minY - frame.maxY < 20.0 { + currentBlockQuoteFrame = frame.union(blockQuote.frame) + } else { + blockQuoteFrames.append(frame) + currentBlockQuoteFrame = frame + } + } else { + currentBlockQuoteFrame = blockQuote.frame + } + } + + if let frame = currentBlockQuoteFrame { + blockQuoteFrames.append(frame) + } + + for frame in blockQuoteFrames { + if let lineColor = layout.lineColor { + context.setFillColor(lineColor.cgColor) + } + let rect = UIBezierPath(roundedRect: CGRect(x: frame.minX - 9.0, y: frame.minY - 14.0, width: 2.0, height: frame.height), cornerRadius: 1.0) + context.addPath(rect.cgPath) + context.fillPath() + } + context.textMatrix = textMatrix context.textPosition = CGPoint(x: textPosition.x, y: textPosition.y) } @@ -872,11 +927,11 @@ public class TextNode: ASDisplayNode { if stringMatch { layout = existingLayout } else { - layout = TextNode.calculateLayout(attributedString: arguments.attributedString, maximumNumberOfLines: arguments.maximumNumberOfLines, truncationType: arguments.truncationType, backgroundColor: arguments.backgroundColor, constrainedSize: arguments.constrainedSize, alignment: arguments.alignment, lineSpacingFactor: arguments.lineSpacing, cutout: arguments.cutout, insets: arguments.insets) + layout = TextNode.calculateLayout(attributedString: arguments.attributedString, maximumNumberOfLines: arguments.maximumNumberOfLines, truncationType: arguments.truncationType, backgroundColor: arguments.backgroundColor, constrainedSize: arguments.constrainedSize, alignment: arguments.alignment, lineSpacingFactor: arguments.lineSpacing, cutout: arguments.cutout, insets: arguments.insets, lineColor: arguments.lineColor) updated = true } } else { - layout = TextNode.calculateLayout(attributedString: arguments.attributedString, maximumNumberOfLines: arguments.maximumNumberOfLines, truncationType: arguments.truncationType, backgroundColor: arguments.backgroundColor, constrainedSize: arguments.constrainedSize, alignment: arguments.alignment, lineSpacingFactor: arguments.lineSpacing, cutout: arguments.cutout, insets: arguments.insets) + layout = TextNode.calculateLayout(attributedString: arguments.attributedString, maximumNumberOfLines: arguments.maximumNumberOfLines, truncationType: arguments.truncationType, backgroundColor: arguments.backgroundColor, constrainedSize: arguments.constrainedSize, alignment: arguments.alignment, lineSpacingFactor: arguments.lineSpacing, cutout: arguments.cutout, insets: arguments.insets, lineColor: arguments.lineColor) updated = true } diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift index 6856cc558c..d6e9fcf4b8 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceController.swift @@ -277,7 +277,7 @@ public final class AuthorizationSequenceController: NavigationController, MFMail } var dismissImpl: (() -> Void)? let alertTheme = AlertControllerTheme(presentationTheme: strongSelf.theme) - let attributedText = stringWithAppliedEntities(termsOfService.text, entities: termsOfService.entities, baseColor: alertTheme.primaryColor, linkColor: alertTheme.accentColor, baseFont: Font.regular(13.0), linkFont: Font.regular(13.0), boldFont: Font.semibold(13.0), italicFont: Font.italic(13.0), boldItalicFont: Font.semiboldItalic(13.0), fixedFont: Font.regular(13.0)) + let attributedText = stringWithAppliedEntities(termsOfService.text, entities: termsOfService.entities, baseColor: alertTheme.primaryColor, linkColor: alertTheme.accentColor, baseFont: Font.regular(13.0), linkFont: Font.regular(13.0), boldFont: Font.semibold(13.0), italicFont: Font.italic(13.0), boldItalicFont: Font.semiboldItalic(13.0), fixedFont: Font.regular(13.0), blockQuoteFont: Font.regular(13.0)) let contentNode = TextAlertContentNode(theme: alertTheme, title: NSAttributedString(string: strongSelf.strings.Login_TermsOfServiceHeader, font: Font.medium(17.0), textColor: alertTheme.primaryColor, paragraphAlignment: .center), text: attributedText, actions: [ TextAlertAction(type: .defaultAction, title: strongSelf.strings.Login_TermsOfServiceAgree, action: { dismissImpl?() diff --git a/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift b/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift index 2c42f66e9b..993f51b18a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatBotInfoItem.swift @@ -152,7 +152,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { updatedTextAndEntities = (item.text, generateTextEntities(item.text, enabledTypes: .all)) } - let attributedText = stringWithAppliedEntities(updatedTextAndEntities.0, entities: updatedTextAndEntities.1, baseColor: item.presentationData.theme.theme.chat.message.infoPrimaryTextColor, linkColor: item.presentationData.theme.theme.chat.message.infoLinkTextColor, baseFont: messageFont, linkFont: messageFont, boldFont: messageBoldFont, italicFont: messageItalicFont, boldItalicFont: messageBoldItalicFont, fixedFont: messageFixedFont) + let attributedText = stringWithAppliedEntities(updatedTextAndEntities.0, entities: updatedTextAndEntities.1, baseColor: item.presentationData.theme.theme.chat.message.infoPrimaryTextColor, linkColor: item.presentationData.theme.theme.chat.message.infoLinkTextColor, baseFont: messageFont, linkFont: messageFont, boldFont: messageBoldFont, italicFont: messageItalicFont, boldItalicFont: messageBoldItalicFont, fixedFont: messageFixedFont, blockQuoteFont: messageFont) let horizontalEdgeInset: CGFloat = 10.0 + params.leftInset let horizontalContentInset: CGFloat = 12.0 diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageActionItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageActionItemNode.swift index 3b7617e208..e07c4c5351 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageActionItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageActionItemNode.swift @@ -385,7 +385,7 @@ private func universalServiceMessageString(theme: ChatPresentationThemeData?, st } attributedString = NSAttributedString(string: titleString, font: titleFont, textColor: primaryTextColor) case let .customText(text, entities): - attributedString = stringWithAppliedEntities(text, entities: entities, baseColor: primaryTextColor, linkColor: primaryTextColor, baseFont: titleFont, linkFont: titleBoldFont, boldFont: titleBoldFont, italicFont: titleFont, boldItalicFont: titleBoldFont, fixedFont: titleFont, underlineLinks: false) + attributedString = stringWithAppliedEntities(text, entities: entities, baseColor: primaryTextColor, linkColor: primaryTextColor, baseFont: titleFont, linkFont: titleBoldFont, boldFont: titleBoldFont, italicFont: titleFont, boldItalicFont: titleBoldFont, fixedFont: titleFont, blockQuoteFont: titleFont, underlineLinks: false) case let .botDomainAccessGranted(domain): attributedString = NSAttributedString(string: strings.AuthSessions_Message(domain).0, font: titleFont, textColor: primaryTextColor) case let .botSentSecureValues(types): diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift index f70cc6e086..b68200b160 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift @@ -15,6 +15,7 @@ private let textBoldFont = Font.semibold(15.0) private let textItalicFont = Font.italic(15.0) private let textBoldItalicFont = Font.semiboldItalic(15.0) private let textFixedFont = Font.regular(15.0) +private let textBlockQuoteFont = Font.regular(15.0) private let buttonFont = Font.semibold(13.0) enum ChatMessageAttachedContentActionIcon { @@ -371,7 +372,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { string.append(NSAttributedString(string: "\n", font: textFont, textColor: messageTheme.primaryTextColor)) } if let entities = entities { - string.append(stringWithAppliedEntities(text, entities: entities, baseColor: messageTheme.primaryTextColor, linkColor: messageTheme.linkTextColor, baseFont: textFont, linkFont: textFont, boldFont: textBoldFont, italicFont: textItalicFont, boldItalicFont: textBoldItalicFont, fixedFont: textFixedFont)) + string.append(stringWithAppliedEntities(text, entities: entities, baseColor: messageTheme.primaryTextColor, linkColor: messageTheme.linkTextColor, baseFont: textFont, linkFont: textFont, boldFont: textBoldFont, italicFont: textItalicFont, boldItalicFont: textBoldItalicFont, fixedFont: textFixedFont, blockQuoteFont: textBlockQuoteFont)) } else { string.append(NSAttributedString(string: text + "\n", font: textFont, textColor: messageTheme.primaryTextColor)) } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift index 6e98e91484..e33571fb75 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -230,7 +230,7 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { let forceStatusNewline = false if let entities = entities { - attributedText = stringWithAppliedEntities(rawText, entities: entities, baseColor: messageTheme.primaryTextColor, linkColor: messageTheme.linkTextColor, baseFont: textFont, linkFont: textFont, boldFont: item.presentationData.messageBoldFont, italicFont: item.presentationData.messageItalicFont, boldItalicFont: item.presentationData.messageBoldItalicFont, fixedFont: item.presentationData.messageFixedFont) + attributedText = stringWithAppliedEntities(rawText, entities: entities, baseColor: messageTheme.primaryTextColor, linkColor: messageTheme.linkTextColor, baseFont: textFont, linkFont: textFont, boldFont: item.presentationData.messageBoldFont, italicFont: item.presentationData.messageItalicFont, boldItalicFont: item.presentationData.messageBoldItalicFont, fixedFont: item.presentationData.messageFixedFont, blockQuoteFont: item.presentationData.messageBlockQuoteFont) } else { attributedText = NSAttributedString(string: rawText, font: textFont, textColor: messageTheme.primaryTextColor) } @@ -242,7 +242,7 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { let textInsets = UIEdgeInsets(top: 2.0, left: 0.0, bottom: 5.0, right: 0.0) - let (textLayout, textApply) = textLayout(TextNodeLayoutArguments(attributedString: attributedText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: textConstrainedSize, alignment: .natural, cutout: cutout, insets: textInsets)) + let (textLayout, textApply) = textLayout(TextNodeLayoutArguments(attributedString: attributedText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: textConstrainedSize, alignment: .natural, cutout: cutout, insets: textInsets, lineColor: messageTheme.accentControlColor)) var textFrame = CGRect(origin: CGPoint(x: -textInsets.left, y: -textInsets.top), size: textLayout.size) var textFrameWithoutInsets = CGRect(origin: CGPoint(x: textFrame.origin.x + textInsets.left, y: textFrame.origin.y + textInsets.top), size: CGSize(width: textFrame.width - textInsets.left - textInsets.right, height: textFrame.height - textInsets.top - textInsets.bottom)) diff --git a/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift b/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift index 9971681d4e..22b3e1a386 100644 --- a/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift +++ b/submodules/TelegramUI/TelegramUI/ChatPresentationData.swift @@ -84,6 +84,7 @@ public final class ChatPresentationData { let messageItalicFont: UIFont let messageBoldItalicFont: UIFont let messageFixedFont: UIFont + let messageBlockQuoteFont: UIFont init(theme: ChatPresentationThemeData, fontSize: PresentationFontSize, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, disableAnimations: Bool, largeEmoji: Bool) { self.theme = theme @@ -103,5 +104,6 @@ public final class ChatPresentationData { self.messageItalicFont = UIFont.italicSystemFont(ofSize: baseFontSize) self.messageBoldItalicFont = Font.semiboldItalic(baseFontSize) self.messageFixedFont = UIFont(name: "Menlo-Regular", size: baseFontSize - 1.0) ?? UIFont.systemFont(ofSize: baseFontSize) + self.messageBlockQuoteFont = UIFont.systemFont(ofSize: baseFontSize - 1.0) } } diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift index 032306111a..939a7918d6 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputAttributes.swift @@ -39,6 +39,7 @@ struct ChatTextFontAttributes: OptionSet { static let bold = ChatTextFontAttributes(rawValue: 1 << 0) static let italic = ChatTextFontAttributes(rawValue: 1 << 1) static let monospace = ChatTextFontAttributes(rawValue: 1 << 2) + static let blockQuote = ChatTextFontAttributes(rawValue: 1 << 3) } func textAttributedStringForStateText(_ stateText: NSAttributedString, fontSize: CGFloat, textColor: UIColor, accentTextColor: UIColor) -> NSAttributedString { diff --git a/submodules/TelegramUI/TelegramUI/GalleryController.swift b/submodules/TelegramUI/TelegramUI/GalleryController.swift index e2c884eb88..6856c12d7a 100644 --- a/submodules/TelegramUI/TelegramUI/GalleryController.swift +++ b/submodules/TelegramUI/TelegramUI/GalleryController.swift @@ -122,7 +122,7 @@ private let boldItalicFont = Font.semiboldItalic(16.0) private let fixedFont = UIFont(name: "Menlo-Regular", size: 15.0) ?? textFont func galleryCaptionStringWithAppliedEntities(_ text: String, entities: [MessageTextEntity]) -> NSAttributedString { - return stringWithAppliedEntities(text, entities: entities, baseColor: .white, linkColor: UIColor(rgb: 0x5ac8fa), baseFont: textFont, linkFont: textFont, boldFont: boldFont, italicFont: italicFont, boldItalicFont: boldItalicFont, fixedFont: fixedFont, underlineLinks: false) + return stringWithAppliedEntities(text, entities: entities, baseColor: .white, linkColor: UIColor(rgb: 0x5ac8fa), baseFont: textFont, linkFont: textFont, boldFont: boldFont, italicFont: italicFont, boldItalicFont: boldItalicFont, fixedFont: fixedFont, blockQuoteFont: textFont, underlineLinks: false) } private func galleryMessageCaptionText(_ message: Message) -> String { diff --git a/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift b/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift index c05ce7c48f..c5eaa57a47 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListAddressItem.swift @@ -182,7 +182,7 @@ class ItemListAddressItemNode: ListViewItemNode { let (labelLayout, labelApply) = makeLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.label, font: labelFont, textColor: labelColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - leftOffset - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let baseColor = item.theme.list.itemPrimaryTextColor - let string = stringWithAppliedEntities(item.text, entities: [], baseColor: baseColor, linkColor: item.theme.list.itemAccentColor, baseFont: textFont, linkFont: textFont, boldFont: textBoldFont, italicFont: textItalicFont, boldItalicFont: textBoldItalicFont, fixedFont: textFixedFont) + let string = stringWithAppliedEntities(item.text, entities: [], baseColor: baseColor, linkColor: item.theme.list.itemAccentColor, baseFont: textFont, linkFont: textFont, boldFont: textBoldFont, italicFont: textItalicFont, boldItalicFont: textBoldItalicFont, fixedFont: textFixedFont, blockQuoteFont: textFont) let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: string, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - leftOffset - leftInset - rightInset - 98.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let padding: CGFloat = !item.label.isEmpty ? 39.0 : 20.0 diff --git a/submodules/TelegramUI/TelegramUI/ItemListMultilineTextItem.swift b/submodules/TelegramUI/TelegramUI/ItemListMultilineTextItem.swift index 8a0dd83357..2b85440197 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListMultilineTextItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListMultilineTextItem.swift @@ -185,7 +185,7 @@ class ItemListMultilineTextItemNode: ListViewItemNode { } let entities = generateTextEntities(item.text, enabledTypes: item.enabledEntityTypes) - let string = stringWithAppliedEntities(item.text, entities: entities, baseColor: textColor, linkColor: item.theme.list.itemAccentColor, baseFont: titleFont, linkFont: titleFont, boldFont: titleBoldFont, italicFont: titleItalicFont, boldItalicFont: titleBoldItalicFont, fixedFont: titleFixedFont) + let string = stringWithAppliedEntities(item.text, entities: entities, baseColor: textColor, linkColor: item.theme.list.itemAccentColor, baseFont: titleFont, linkFont: titleFont, boldFont: titleBoldFont, italicFont: titleItalicFont, boldItalicFont: titleBoldItalicFont, fixedFont: titleFixedFont, blockQuoteFont: titleFont) let (titleLayout, titleApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: string, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - params.leftInset - params.rightInset - 20.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) diff --git a/submodules/TelegramUI/TelegramUI/ItemListTextWithLabelItem.swift b/submodules/TelegramUI/TelegramUI/ItemListTextWithLabelItem.swift index 774113f7eb..c21de0574d 100644 --- a/submodules/TelegramUI/TelegramUI/ItemListTextWithLabelItem.swift +++ b/submodules/TelegramUI/TelegramUI/ItemListTextWithLabelItem.swift @@ -209,7 +209,7 @@ class ItemListTextWithLabelItemNode: ListViewItemNode { case .highlighted: baseColor = item.theme.list.itemHighlightedColor } - let string = stringWithAppliedEntities(item.text, entities: entities, baseColor: baseColor, linkColor: item.theme.list.itemAccentColor, baseFont: textFont, linkFont: textFont, boldFont: textBoldFont, italicFont: textItalicFont, boldItalicFont: textBoldItalicFont, fixedFont: textFixedFont) + let string = stringWithAppliedEntities(item.text, entities: entities, baseColor: baseColor, linkColor: item.theme.list.itemAccentColor, baseFont: textFont, linkFont: textFont, boldFont: textBoldFont, italicFont: textItalicFont, boldItalicFont: textBoldItalicFont, fixedFont: textFixedFont, blockQuoteFont: textFont) let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: string, backgroundColor: nil, maximumNumberOfLines: item.multiline ? 0 : 1, truncationType: .end, constrainedSize: CGSize(width: params.width - leftOffset - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let contentSize = CGSize(width: params.width, height: textLayout.size.height + 39.0) diff --git a/submodules/TelegramUI/TelegramUI/Pasteboard.swift b/submodules/TelegramUI/TelegramUI/Pasteboard.swift index 3f654f700d..7b10d9ea40 100644 --- a/submodules/TelegramUI/TelegramUI/Pasteboard.swift +++ b/submodules/TelegramUI/TelegramUI/Pasteboard.swift @@ -5,7 +5,7 @@ import TelegramCore import MobileCoreServices private func rtfStringWithAppliedEntities(_ text: String, entities: [MessageTextEntity]) -> String { - let test = stringWithAppliedEntities(text, entities: entities, baseColor: .black, linkColor: .black, baseFont: Font.regular(14.0), linkFont: Font.regular(14.0), boldFont: Font.semibold(14.0), italicFont: Font.italic(14.0), boldItalicFont: Font.semiboldItalic(14.0), fixedFont: Font.monospace(14.0), underlineLinks: false, external: true) + let test = stringWithAppliedEntities(text, entities: entities, baseColor: .black, linkColor: .black, baseFont: Font.regular(14.0), linkFont: Font.regular(14.0), boldFont: Font.semibold(14.0), italicFont: Font.italic(14.0), boldItalicFont: Font.semiboldItalic(14.0), fixedFont: Font.monospace(14.0), blockQuoteFont: Font.regular(14.0), underlineLinks: false, external: true) if let data = try? test.data(from: NSRange(location: 0, length: test.length), documentAttributes: [NSAttributedString.DocumentAttributeKey.documentType: NSAttributedString.DocumentType.rtf]) { if var rtf = String(data: data, encoding: .windowsCP1252) { diff --git a/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift b/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift index 03c62c1ed6..db7082b12e 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPackPreviewControllerNode.swift @@ -371,7 +371,8 @@ final class StickerPackPreviewControllerNode: ViewControllerTracingNode, UIScrol if self.currentItems.isEmpty && !updatedItems.isEmpty { let entities = generateTextEntities(info.title, enabledTypes: [.mention]) - self.contentTitleNode.attributedText = stringWithAppliedEntities(info.title, entities: entities, baseColor: self.presentationData.theme.actionSheet.primaryTextColor, linkColor: self.presentationData.theme.actionSheet.controlAccentColor, baseFont: Font.medium(20.0), linkFont: Font.medium(20.0), boldFont: Font.medium(20.0), italicFont: Font.medium(20.0), boldItalicFont: Font.medium(20.0), fixedFont: Font.medium(20.0)) + let font = Font.medium(20.0) + self.contentTitleNode.attributedText = stringWithAppliedEntities(info.title, entities: entities, baseColor: self.presentationData.theme.actionSheet.primaryTextColor, linkColor: self.presentationData.theme.actionSheet.controlAccentColor, baseFont: font, linkFont: font, boldFont: font, italicFont: font, boldItalicFont: font, fixedFont: font, blockQuoteFont: font) animateIn = true } transaction = StickerPackPreviewGridTransaction(previousList: self.currentItems, list: updatedItems, account: self.context.account, interaction: self.interaction) diff --git a/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift b/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift index fef36803ae..511b6534de 100644 --- a/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift +++ b/submodules/TelegramUI/TelegramUI/StringWithAppliedEntities.swift @@ -45,24 +45,25 @@ func chatInputStateStringWithAppliedEntities(_ text: String, entities: [MessageT return string } -func stringWithAppliedEntities(_ text: String, entities: [MessageTextEntity], baseColor: UIColor, linkColor: UIColor, baseFont: UIFont, linkFont: UIFont, boldFont: UIFont, italicFont: UIFont, boldItalicFont: UIFont, fixedFont: UIFont, underlineLinks: Bool = true, external: Bool = false) -> NSAttributedString { +func stringWithAppliedEntities(_ text: String, entities: [MessageTextEntity], baseColor: UIColor, linkColor: UIColor, baseFont: UIFont, linkFont: UIFont, boldFont: UIFont, italicFont: UIFont, boldItalicFont: UIFont, fixedFont: UIFont, blockQuoteFont: UIFont, underlineLinks: Bool = true, external: Bool = false) -> NSAttributedString { var nsString: NSString? let string = NSMutableAttributedString(string: text, attributes: [NSAttributedStringKey.font: baseFont, NSAttributedStringKey.foregroundColor: baseColor]) var skipEntity = false - let stringLength = string.length var underlineAllLinks = false if linkColor.isEqual(baseColor) { underlineAllLinks = true } var fontAttributes: [NSRange: ChatTextFontAttributes] = [:] + var rangeOffset: Int = 0 for i in 0 ..< entities.count { if skipEntity { skipEntity = false continue } + let stringLength = string.length let entity = entities[i] - var range = NSRange(location: entity.range.lowerBound, length: entity.range.upperBound - entity.range.lowerBound) + var range = NSRange(location: entity.range.lowerBound + rangeOffset, length: entity.range.upperBound - entity.range.lowerBound) if nsString == nil { nsString = text as NSString } @@ -188,6 +189,25 @@ func stringWithAppliedEntities(_ text: String, entities: [MessageTextEntity], ba string.addAttribute(NSAttributedStringKey(rawValue: TelegramTextAttributes.BotCommand), value: nsString!.substring(with: range), range: range) case .Code, .Pre: string.addAttribute(NSAttributedStringKey.font, value: fixedFont, range: range) + case .BlockQuote: + if let fontAttribute = fontAttributes[range] { + fontAttributes[range] = fontAttribute.union(.blockQuote) + } else { + fontAttributes[range] = .blockQuote + } + + let paragraphBreak = "\n" + string.insert(NSAttributedString(string: paragraphBreak), at: range.lowerBound) + + let paragraphRange = NSRange(location: range.lowerBound + paragraphBreak.count, length: range.upperBound - range.lowerBound) + + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.headIndent = 10.0 + paragraphStyle.tabStops = [NSTextTab(textAlignment: .left, location: paragraphStyle.headIndent, options: [:])] + string.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: paragraphRange) + + string.insert(NSAttributedString(string: paragraphBreak), at: paragraphRange.upperBound) + rangeOffset += paragraphBreak.count case let .Custom(type): if type == ApplicationSpecificEntityType.Timecode { string.addAttribute(NSAttributedStringKey.foregroundColor, value: linkColor, range: range) @@ -208,7 +228,9 @@ func stringWithAppliedEntities(_ text: String, entities: [MessageTextEntity], ba for (range, fontAttributes) in fontAttributes { var font: UIFont? - if fontAttributes == [.bold, .italic] { + if fontAttributes.contains(.blockQuote) { + font = blockQuoteFont + } else if fontAttributes == [.bold, .italic] { font = boldItalicFont } else if fontAttributes == [.bold] { font = boldFont diff --git a/submodules/TelegramUI/TelegramUI/TermsOfServiceControllerNode.swift b/submodules/TelegramUI/TelegramUI/TermsOfServiceControllerNode.swift index 0d3c59e5fd..674458c03c 100644 --- a/submodules/TelegramUI/TelegramUI/TermsOfServiceControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/TermsOfServiceControllerNode.swift @@ -57,7 +57,7 @@ final class TermsOfServiceControllerNode: ViewControllerTracingNode { self.contentTextNode = ImmediateTextNode() self.contentTextNode.displaysAsynchronously = false self.contentTextNode.maximumNumberOfLines = 0 - self.contentTextNode.attributedText = stringWithAppliedEntities(text, entities: entities, baseColor: theme.primary, linkColor: theme.accent, baseFont: Font.regular(15.0), linkFont: Font.regular(15.0), boldFont: Font.semibold(15.0), italicFont: Font.italic(15.0), boldItalicFont: Font.semiboldItalic(15.0), fixedFont: Font.monospace(15.0)) + self.contentTextNode.attributedText = stringWithAppliedEntities(text, entities: entities, baseColor: theme.primary, linkColor: theme.accent, baseFont: Font.regular(15.0), linkFont: Font.regular(15.0), boldFont: Font.semibold(15.0), italicFont: Font.italic(15.0), boldItalicFont: Font.semiboldItalic(15.0), fixedFont: Font.monospace(15.0), blockQuoteFont: Font.regular(15.0)) self.toolbarNode = ASDisplayNode() self.toolbarSeparatorNode = ASDisplayNode() diff --git a/submodules/TelegramUI/TelegramUI/TextNode.swift b/submodules/TelegramUI/TelegramUI/TextNode.swift index 3a947ac672..de69f8ef66 100644 --- a/submodules/TelegramUI/TelegramUI/TextNode.swift +++ b/submodules/TelegramUI/TelegramUI/TextNode.swift @@ -41,4 +41,5 @@ struct TelegramTextAttributes { static let BotCommand = "TelegramBotCommand" static let Hashtag = "TelegramHashtag" static let Timecode = "TelegramTimecode" + static let BlockQuote = "TelegramBlockQuote" } diff --git a/submodules/TelegramUI/TelegramUI/UpdateInfoItem.swift b/submodules/TelegramUI/TelegramUI/UpdateInfoItem.swift index e5cf15cb24..aaab7a0921 100644 --- a/submodules/TelegramUI/TelegramUI/UpdateInfoItem.swift +++ b/submodules/TelegramUI/TelegramUI/UpdateInfoItem.swift @@ -208,7 +208,7 @@ class UpdateInfoItemNode: ListViewItemNode { let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.title, font: titleFont, textColor: textColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - params.leftInset - params.rightInset - 88.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) - let string = stringWithAppliedEntities(item.text, entities: item.entities, baseColor: textColor, linkColor: item.theme.list.itemAccentColor, baseFont: textFont, linkFont: textFont, boldFont: textBoldFont, italicFont: textItalicFont, boldItalicFont: textBoldItalicFont, fixedFont: textFixedFont) + let string = stringWithAppliedEntities(item.text, entities: item.entities, baseColor: textColor, linkColor: item.theme.list.itemAccentColor, baseFont: textFont, linkFont: textFont, boldFont: textBoldFont, italicFont: textItalicFont, boldItalicFont: textBoldItalicFont, fixedFont: textFixedFont, blockQuoteFont: textFont) let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: string, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - params.leftInset - params.rightInset - 28.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let contentSize: CGSize From d1359970261790548c225fbd811ebce130535a42 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 17 Jul 2019 01:01:52 +0200 Subject: [PATCH 31/32] Fix build --- Telegram-iOS/en.lproj/Localizable.strings | 3 + .../Sources/PresentationStrings.swift | 6758 +++++++++-------- .../ChatRecentActionsControllerNode.swift | 2 +- .../Resources/PresentationStrings.mapping | Bin 118146 -> 118248 bytes 4 files changed, 3384 insertions(+), 3379 deletions(-) diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 50ae3aa51e..288521e713 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4471,3 +4471,6 @@ Any member of this group will be able to see messages in the channel."; "Channel.TooMuchBots" = "Sorry, there are already too many bots in this group. Please remove some of the bots you're not using first."; "Channel.BotDoesntSupportGroups" = "Sorry, this bot is telling us it doesn't want to be added to groups. You can't add this bot unless its developers change their mind."; + +"StickerPacksSettings.AnimatedStickers" = "Loop Animated Stickers"; +"StickerPacksSettings.AnimatedStickersInfo" = "Animated stickers will play in chat continuously."; diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 0fdc0bf414..7dd2559224 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -213,4241 +213,4243 @@ public final class PresentationStrings { public var Passport_Address_ScansHelp: String { return self._s[23]! } public var FastTwoStepSetup_PasswordHelp: String { return self._s[24]! } public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[25]! } - public var AutoDownloadSettings_Files: String { return self._s[26]! } - public var TextFormat_AddLinkPlaceholder: String { return self._s[27]! } - public var LastSeen_Lately: String { return self._s[32]! } + public var StickerPacksSettings_AnimatedStickers: String { return self._s[26]! } + public var AutoDownloadSettings_Files: String { return self._s[27]! } + public var TextFormat_AddLinkPlaceholder: String { return self._s[28]! } + public var LastSeen_Lately: String { return self._s[33]! } public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[33]!, self._r[33]!, [_1, _2]) + return formatWithArgumentRanges(self._s[34]!, self._r[34]!, [_1, _2]) } - public var Camera_Discard: String { return self._s[34]! } - public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[35]! } - public var Login_InvalidPhoneError: String { return self._s[37]! } - public var SettingsSearch_Synonyms_Privacy_AuthSessions: String { return self._s[38]! } - public var GroupInfo_LabelOwner: String { return self._s[39]! } - public var Conversation_Moderate_Delete: String { return self._s[40]! } - public var Conversation_DeleteMessagesForEveryone: String { return self._s[41]! } - public var WatchRemote_AlertOpen: String { return self._s[42]! } + public var Camera_Discard: String { return self._s[35]! } + public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[36]! } + public var Login_InvalidPhoneError: String { return self._s[38]! } + public var SettingsSearch_Synonyms_Privacy_AuthSessions: String { return self._s[39]! } + public var GroupInfo_LabelOwner: String { return self._s[40]! } + public var Conversation_Moderate_Delete: String { return self._s[41]! } + public var Conversation_DeleteMessagesForEveryone: String { return self._s[42]! } + public var WatchRemote_AlertOpen: String { return self._s[43]! } public func MediaPicker_Nof(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[43]!, self._r[43]!, [_0]) + return formatWithArgumentRanges(self._s[44]!, self._r[44]!, [_0]) } - public var AutoDownloadSettings_MediaTypes: String { return self._s[45]! } - public var Watch_GroupInfo_Title: String { return self._s[46]! } - public var Passport_Identity_AddPersonalDetails: String { return self._s[47]! } - public var Channel_Info_Members: String { return self._s[48]! } - public var LoginPassword_InvalidPasswordError: String { return self._s[50]! } - public var Conversation_LiveLocation: String { return self._s[51]! } - public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[52]! } - public var NetworkUsageSettings_BytesReceived: String { return self._s[54]! } - public var Stickers_Search: String { return self._s[56]! } - public var NotificationsSound_Synth: String { return self._s[57]! } - public var LogoutOptions_LogOutInfo: String { return self._s[58]! } - public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[60]! } - public var AutoNightTheme_UseSunsetSunrise: String { return self._s[62]! } - public var FastTwoStepSetup_Title: String { return self._s[63]! } - public var Channel_Info_BlackList: String { return self._s[64]! } - public var Channel_AdminLog_InfoPanelTitle: String { return self._s[65]! } - public var Conversation_OpenFile: String { return self._s[66]! } - public var SecretTimer_ImageDescription: String { return self._s[67]! } - public var StickerSettings_ContextInfo: String { return self._s[68]! } - public var TwoStepAuth_GenericHelp: String { return self._s[70]! } - public var AutoDownloadSettings_Unlimited: String { return self._s[71]! } - public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[72]! } - public var AutoDownloadSettings_DataUsageHigh: String { return self._s[73]! } + public var AutoDownloadSettings_MediaTypes: String { return self._s[46]! } + public var Watch_GroupInfo_Title: String { return self._s[47]! } + public var Passport_Identity_AddPersonalDetails: String { return self._s[48]! } + public var Channel_Info_Members: String { return self._s[49]! } + public var LoginPassword_InvalidPasswordError: String { return self._s[51]! } + public var Conversation_LiveLocation: String { return self._s[52]! } + public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[53]! } + public var NetworkUsageSettings_BytesReceived: String { return self._s[55]! } + public var Stickers_Search: String { return self._s[57]! } + public var NotificationsSound_Synth: String { return self._s[58]! } + public var LogoutOptions_LogOutInfo: String { return self._s[59]! } + public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[61]! } + public var AutoNightTheme_UseSunsetSunrise: String { return self._s[63]! } + public var FastTwoStepSetup_Title: String { return self._s[64]! } + public var Channel_Info_BlackList: String { return self._s[65]! } + public var Channel_AdminLog_InfoPanelTitle: String { return self._s[66]! } + public var Conversation_OpenFile: String { return self._s[67]! } + public var SecretTimer_ImageDescription: String { return self._s[68]! } + public var StickerSettings_ContextInfo: String { return self._s[69]! } + public var TwoStepAuth_GenericHelp: String { return self._s[71]! } + public var AutoDownloadSettings_Unlimited: String { return self._s[72]! } + public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[73]! } + public var AutoDownloadSettings_DataUsageHigh: String { return self._s[74]! } public func PUSH_CHAT_MESSAGE_VIDEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[74]!, self._r[74]!, [_1, _2]) + return formatWithArgumentRanges(self._s[75]!, self._r[75]!, [_1, _2]) } - public var Notifications_AddExceptionTitle: String { return self._s[75]! } - public var Watch_MessageView_Reply: String { return self._s[76]! } - public var Tour_Text6: String { return self._s[77]! } - public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[78]! } + public var Notifications_AddExceptionTitle: String { return self._s[76]! } + public var Watch_MessageView_Reply: String { return self._s[77]! } + public var Tour_Text6: String { return self._s[78]! } + public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[79]! } public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[79]!, self._r[79]!, [_0]) - } - public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[80]!, self._r[80]!, [_0]) } - public var AccessDenied_LocationDenied: String { return self._s[81]! } - public var CallSettings_RecentCalls: String { return self._s[82]! } - public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[83]! } - public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[84]! } - public var Passport_Authorize: String { return self._s[85]! } - public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[86]! } - public var AutoDownloadSettings_Videos: String { return self._s[87]! } - public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[88]! } - public var Tour_StartButton: String { return self._s[89]! } - public var Watch_AppName: String { return self._s[91]! } - public var StickerPack_ErrorNotFound: String { return self._s[92]! } - public var Channel_Info_Subscribers: String { return self._s[93]! } - public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[94]!, self._r[94]!, [_0]) + public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[81]!, self._r[81]!, [_0]) } - public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { + public var AccessDenied_LocationDenied: String { return self._s[82]! } + public var CallSettings_RecentCalls: String { return self._s[83]! } + public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[84]! } + public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[85]! } + public var Passport_Authorize: String { return self._s[86]! } + public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[87]! } + public var AutoDownloadSettings_Videos: String { return self._s[88]! } + public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[89]! } + public var Tour_StartButton: String { return self._s[90]! } + public var Watch_AppName: String { return self._s[92]! } + public var StickerPack_ErrorNotFound: String { return self._s[93]! } + public var Channel_Info_Subscribers: String { return self._s[94]! } + public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[95]!, self._r[95]!, [_0]) } - public var Conversation_StopLiveLocation: String { return self._s[97]! } - public var Channel_AdminLogFilter_EventsAll: String { return self._s[98]! } - public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[100]! } - public var Username_LinkCopied: String { return self._s[102]! } - public var GroupRemoved_Title: String { return self._s[103]! } - public var SecretVideo_Title: String { return self._s[104]! } + public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[96]!, self._r[96]!, [_0]) + } + public var Conversation_StopLiveLocation: String { return self._s[98]! } + public var Channel_AdminLogFilter_EventsAll: String { return self._s[99]! } + public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[101]! } + public var Username_LinkCopied: String { return self._s[103]! } + public var GroupRemoved_Title: String { return self._s[104]! } + public var SecretVideo_Title: String { return self._s[105]! } public func PUSH_PINNED_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[105]!, self._r[105]!, [_1]) + return formatWithArgumentRanges(self._s[106]!, self._r[106]!, [_1]) } - public var AccessDenied_PhotosAndVideos: String { return self._s[106]! } + public var AccessDenied_PhotosAndVideos: String { return self._s[107]! } public func PUSH_CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[107]!, self._r[107]!, [_1]) + return formatWithArgumentRanges(self._s[108]!, self._r[108]!, [_1]) } - public var Map_OpenInGoogleMaps: String { return self._s[108]! } + public var Map_OpenInGoogleMaps: String { return self._s[109]! } public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[109]!, self._r[109]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[110]!, self._r[110]!, [_1, _2, _3]) } public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[110]!, self._r[110]!, [_1, _2]) + return formatWithArgumentRanges(self._s[111]!, self._r[111]!, [_1, _2]) } - public var Call_StatusRinging: String { return self._s[111]! } - public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[112]! } - public var Group_Username_InvalidStartsWithNumber: String { return self._s[113]! } - public var UserInfo_NotificationsEnabled: String { return self._s[114]! } - public var Map_Search: String { return self._s[115]! } - public var Login_TermsOfServiceHeader: String { return self._s[117]! } + public var Call_StatusRinging: String { return self._s[112]! } + public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[113]! } + public var Group_Username_InvalidStartsWithNumber: String { return self._s[114]! } + public var UserInfo_NotificationsEnabled: String { return self._s[115]! } + public var Map_Search: String { return self._s[116]! } + public var Login_TermsOfServiceHeader: String { return self._s[118]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[118]!, self._r[118]!, [_0]) - } - public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[119]!, self._r[119]!, [_0]) } - public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[120]! } - public var Weekday_Today: String { return self._s[121]! } + public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[120]!, self._r[120]!, [_0]) + } + public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[121]! } + public var Weekday_Today: String { return self._s[122]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[123]!, self._r[123]!, [_1, _2]) + return formatWithArgumentRanges(self._s[124]!, self._r[124]!, [_1, _2]) } public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[124]!, self._r[124]!, ["\(_1)"]) + return formatWithArgumentRanges(self._s[125]!, self._r[125]!, ["\(_1)"]) } - public var Notification_PassportValuePersonalDetails: String { return self._s[126]! } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[127]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[128]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[129]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[130]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[131]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[132]! } - public var Weekday_ShortMonday: String { return self._s[133]! } - public var Cache_KeepMedia: String { return self._s[134]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[135]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[127]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[128]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[129]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[130]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[131]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[132]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[133]! } + public var Weekday_ShortMonday: String { return self._s[134]! } + public var Cache_KeepMedia: String { return self._s[135]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[136]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[136]!, self._r[136]!, [_1, _2]) + return formatWithArgumentRanges(self._s[137]!, self._r[137]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description4: String { return self._s[137]! } - public var Passport_Language_ru: String { return self._s[138]! } + public var Conversation_ClousStorageInfo_Description4: String { return self._s[138]! } + public var Passport_Language_ru: String { return self._s[139]! } public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[139]!, self._r[139]!, [_0, _1]) + return formatWithArgumentRanges(self._s[140]!, self._r[140]!, [_0, _1]) } - public var WallpaperPreview_PatternIntensity: String { return self._s[140]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[141]! } - public var EnterPasscode_TouchId: String { return self._s[142]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[145]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[147]! } - public var Gif_NoGifsPlaceholder: String { return self._s[149]! } - public var Conversation_OpenBotLinkTitle: String { return self._s[151]! } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[152]! } - public var NetworkUsageSettings_BytesSent: String { return self._s[153]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[154]! } - public var AuthSessions_TerminateSession: String { return self._s[155]! } - public var Message_File: String { return self._s[156]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[157]! } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[158]! } - public var TwoStepAuth_RecoveryCode: String { return self._s[159]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[160]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[141]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[142]! } + public var EnterPasscode_TouchId: String { return self._s[143]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[146]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[148]! } + public var Gif_NoGifsPlaceholder: String { return self._s[150]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[152]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[153]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[154]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[155]! } + public var AuthSessions_TerminateSession: String { return self._s[156]! } + public var Message_File: String { return self._s[157]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[158]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[159]! } + public var TwoStepAuth_RecoveryCode: String { return self._s[160]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[161]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[161]!, self._r[161]!, [_0]) + return formatWithArgumentRanges(self._s[162]!, self._r[162]!, [_0]) } - public var Conversation_Moderate_Report: String { return self._s[163]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[164]! } - public var Passport_Language_ms: String { return self._s[165]! } - public var Channel_Edit_AboutItem: String { return self._s[167]! } - public var DialogList_SearchSectionGlobal: String { return self._s[171]! } - public var AttachmentMenu_WebSearch: String { return self._s[172]! } - public var PasscodeSettings_TurnPasscodeOn: String { return self._s[173]! } - public var Channel_BanUser_Title: String { return self._s[174]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[175]! } - public var ArchivedChats_IntroText2: String { return self._s[176]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[177]! } + public var Conversation_Moderate_Report: String { return self._s[164]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[165]! } + public var Passport_Language_ms: String { return self._s[166]! } + public var Channel_Edit_AboutItem: String { return self._s[168]! } + public var DialogList_SearchSectionGlobal: String { return self._s[172]! } + public var AttachmentMenu_WebSearch: String { return self._s[173]! } + public var PasscodeSettings_TurnPasscodeOn: String { return self._s[174]! } + public var Channel_BanUser_Title: String { return self._s[175]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[176]! } + public var ArchivedChats_IntroText2: String { return self._s[177]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[178]! } public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[178]!, self._r[178]!, [_1, _2]) + return formatWithArgumentRanges(self._s[179]!, self._r[179]!, [_1, _2]) } - public var ChatSearch_SearchPlaceholder: String { return self._s[180]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[181]! } - public var NotificationsSound_Aurora: String { return self._s[182]! } + public var ChatSearch_SearchPlaceholder: String { return self._s[181]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[182]! } + public var NotificationsSound_Aurora: String { return self._s[183]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[183]!, self._r[183]!, [_0]) + return formatWithArgumentRanges(self._s[184]!, self._r[184]!, [_0]) } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[186]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[187]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[187]!, self._r[187]!, [_0, _1]) + return formatWithArgumentRanges(self._s[188]!, self._r[188]!, [_0, _1]) } - public var Passport_PasswordNext: String { return self._s[188]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[189]! } - public var EmptyGroupInfo_Line2: String { return self._s[190]! } - public var Settings_FAQ_Intro: String { return self._s[192]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[194]! } - public var FeaturedStickerPacks_Title: String { return self._s[195]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[196]! } - public var Username_Title: String { return self._s[197]! } + public var Passport_PasswordNext: String { return self._s[189]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[190]! } + public var EmptyGroupInfo_Line2: String { return self._s[191]! } + public var Settings_FAQ_Intro: String { return self._s[193]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[195]! } + public var FeaturedStickerPacks_Title: String { return self._s[196]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[197]! } + public var Username_Title: String { return self._s[198]! } public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[198]!, self._r[198]!, [_0]) + return formatWithArgumentRanges(self._s[199]!, self._r[199]!, [_0]) } - public var PasscodeSettings_AlphanumericCode: String { return self._s[199]! } - public var Localization_LanguageOther: String { return self._s[200]! } - public var Stickers_SuggestStickers: String { return self._s[201]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[200]! } + public var Localization_LanguageOther: String { return self._s[201]! } + public var Stickers_SuggestStickers: String { return self._s[202]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[202]!, self._r[202]!, [_0]) + return formatWithArgumentRanges(self._s[203]!, self._r[203]!, [_0]) } - public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[203]! } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[204]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[205]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[204]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[205]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[206]! } public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[206]!, self._r[206]!, [_0]) + return formatWithArgumentRanges(self._s[207]!, self._r[207]!, [_0]) } - public var Group_UpgradeConfirmation: String { return self._s[208]! } - public var DialogList_Unpin: String { return self._s[209]! } - public var Passport_Identity_DateOfBirth: String { return self._s[210]! } - public var Month_ShortOctober: String { return self._s[211]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[212]! } - public var Notification_CallCanceledShort: String { return self._s[213]! } - public var Passport_Phone_Help: String { return self._s[214]! } - public var Passport_Language_az: String { return self._s[216]! } - public var CreatePoll_TextPlaceholder: String { return self._s[218]! } - public var Passport_Identity_DocumentNumber: String { return self._s[219]! } - public var PhotoEditor_CurvesRed: String { return self._s[220]! } - public var PhoneNumberHelp_Alert: String { return self._s[222]! } - public var SocksProxySetup_Port: String { return self._s[223]! } - public var Checkout_PayNone: String { return self._s[224]! } - public var AutoDownloadSettings_WiFi: String { return self._s[225]! } - public var GroupInfo_GroupType: String { return self._s[226]! } - public var StickerSettings_ContextHide: String { return self._s[227]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[228]! } - public var Group_Setup_HistoryTitle: String { return self._s[230]! } - public var Passport_Identity_FilesUploadNew: String { return self._s[231]! } - public var PasscodeSettings_AutoLock: String { return self._s[232]! } - public var Passport_Title: String { return self._s[233]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[234]! } - public var GroupPermission_NoSendGifs: String { return self._s[235]! } - public var PrivacySettings_PasscodeOn: String { return self._s[236]! } - public var State_WaitingForNetwork: String { return self._s[238]! } + public var Group_UpgradeConfirmation: String { return self._s[209]! } + public var DialogList_Unpin: String { return self._s[210]! } + public var Passport_Identity_DateOfBirth: String { return self._s[211]! } + public var Month_ShortOctober: String { return self._s[212]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[213]! } + public var Notification_CallCanceledShort: String { return self._s[214]! } + public var Passport_Phone_Help: String { return self._s[215]! } + public var Passport_Language_az: String { return self._s[217]! } + public var CreatePoll_TextPlaceholder: String { return self._s[219]! } + public var Passport_Identity_DocumentNumber: String { return self._s[220]! } + public var PhotoEditor_CurvesRed: String { return self._s[221]! } + public var PhoneNumberHelp_Alert: String { return self._s[223]! } + public var SocksProxySetup_Port: String { return self._s[224]! } + public var Checkout_PayNone: String { return self._s[225]! } + public var AutoDownloadSettings_WiFi: String { return self._s[226]! } + public var GroupInfo_GroupType: String { return self._s[227]! } + public var StickerSettings_ContextHide: String { return self._s[228]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[229]! } + public var Group_Setup_HistoryTitle: String { return self._s[231]! } + public var Passport_Identity_FilesUploadNew: String { return self._s[232]! } + public var PasscodeSettings_AutoLock: String { return self._s[233]! } + public var Passport_Title: String { return self._s[234]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[235]! } + public var GroupPermission_NoSendGifs: String { return self._s[236]! } + public var PrivacySettings_PasscodeOn: String { return self._s[237]! } + public var State_WaitingForNetwork: String { return self._s[239]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[239]!, self._r[239]!, [_0, _1]) + return formatWithArgumentRanges(self._s[240]!, self._r[240]!, [_0, _1]) } - public var Calls_NotNow: String { return self._s[241]! } + public var Calls_NotNow: String { return self._s[242]! } public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[242]!, self._r[242]!, [_0]) + return formatWithArgumentRanges(self._s[243]!, self._r[243]!, [_0]) } - public var UserInfo_SendMessage: String { return self._s[243]! } - public var TwoStepAuth_PasswordSet: String { return self._s[244]! } - public var Passport_DeleteDocument: String { return self._s[245]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[246]! } + public var UserInfo_SendMessage: String { return self._s[244]! } + public var TwoStepAuth_PasswordSet: String { return self._s[245]! } + public var Passport_DeleteDocument: String { return self._s[246]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[247]! } public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[247]!, self._r[247]!, [_1]) + return formatWithArgumentRanges(self._s[248]!, self._r[248]!, [_1]) } - public var GroupRemoved_Remove: String { return self._s[248]! } - public var Passport_FieldIdentity: String { return self._s[249]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[250]! } - public var Conversation_Processing: String { return self._s[252]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[254]! } - public var AuthSessions_LogOutApplicationsHelp: String { return self._s[257]! } - public var Month_GenFebruary: String { return self._s[258]! } + public var GroupRemoved_Remove: String { return self._s[249]! } + public var Passport_FieldIdentity: String { return self._s[250]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[251]! } + public var Conversation_Processing: String { return self._s[253]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[255]! } + public var AuthSessions_LogOutApplicationsHelp: String { return self._s[258]! } + public var Month_GenFebruary: String { return self._s[259]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[260]!, self._r[260]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[261]!, self._r[261]!, [_1, _2, _3, _4, _5]) } - public var Passport_Identity_TypeIdentityCard: String { return self._s[261]! } - public var AutoDownloadSettings_DataUsageMedium: String { return self._s[263]! } - public var GroupInfo_AddParticipant: String { return self._s[264]! } - public var KeyCommand_SendMessage: String { return self._s[265]! } - public var Map_LiveLocationShowAll: String { return self._s[267]! } - public var WallpaperSearch_ColorOrange: String { return self._s[269]! } - public var Appearance_AppIconDefaultX: String { return self._s[270]! } - public var Checkout_Receipt_Title: String { return self._s[271]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[272]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[273]! } - public var Message_Contact: String { return self._s[274]! } - public var Call_StatusIncoming: String { return self._s[275]! } + public var Passport_Identity_TypeIdentityCard: String { return self._s[262]! } + public var AutoDownloadSettings_DataUsageMedium: String { return self._s[264]! } + public var GroupInfo_AddParticipant: String { return self._s[265]! } + public var KeyCommand_SendMessage: String { return self._s[266]! } + public var Map_LiveLocationShowAll: String { return self._s[268]! } + public var WallpaperSearch_ColorOrange: String { return self._s[270]! } + public var Appearance_AppIconDefaultX: String { return self._s[271]! } + public var Checkout_Receipt_Title: String { return self._s[272]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[273]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[274]! } + public var Message_Contact: String { return self._s[275]! } + public var Call_StatusIncoming: String { return self._s[276]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[276]!, self._r[276]!, [_1]) + return formatWithArgumentRanges(self._s[277]!, self._r[277]!, [_1]) } public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[278]!, self._r[278]!, [_1]) + return formatWithArgumentRanges(self._s[279]!, self._r[279]!, [_1]) } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[279]! } - public var Conversation_ViewChannel: String { return self._s[280]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[280]! } + public var Conversation_ViewChannel: String { return self._s[281]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[281]!, self._r[281]!, [_0]) + return formatWithArgumentRanges(self._s[282]!, self._r[282]!, [_0]) } - public var Passport_Language_nl: String { return self._s[283]! } - public var Camera_Retake: String { return self._s[284]! } + public var Passport_Language_nl: String { return self._s[284]! } + public var Camera_Retake: String { return self._s[285]! } public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[285]!, self._r[285]!, [_0]) + return formatWithArgumentRanges(self._s[286]!, self._r[286]!, [_0]) } - public var AuthSessions_LogOutApplications: String { return self._s[286]! } - public var ApplyLanguage_ApplySuccess: String { return self._s[287]! } - public var Tour_Title6: String { return self._s[288]! } - public var Map_ChooseAPlace: String { return self._s[289]! } - public var CallSettings_Never: String { return self._s[291]! } + public var AuthSessions_LogOutApplications: String { return self._s[287]! } + public var ApplyLanguage_ApplySuccess: String { return self._s[288]! } + public var Tour_Title6: String { return self._s[289]! } + public var Map_ChooseAPlace: String { return self._s[290]! } + public var CallSettings_Never: String { return self._s[292]! } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[292]!, self._r[292]!, [_0]) + return formatWithArgumentRanges(self._s[293]!, self._r[293]!, [_0]) } - public var ChannelRemoved_RemoveInfo: String { return self._s[293]! } + public var ChannelRemoved_RemoveInfo: String { return self._s[294]! } public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[294]!, self._r[294]!, [_0]) + return formatWithArgumentRanges(self._s[295]!, self._r[295]!, [_0]) } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[295]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[296]! } public func Conversation_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[296]!, self._r[296]!, [_0]) + return formatWithArgumentRanges(self._s[297]!, self._r[297]!, [_0]) } - public var GroupInfo_InviteLink_Title: String { return self._s[297]! } + public var GroupInfo_InviteLink_Title: String { return self._s[298]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[298]!, self._r[298]!, [_1, _2]) + return formatWithArgumentRanges(self._s[299]!, self._r[299]!, [_1, _2]) } - public var KeyCommand_ScrollUp: String { return self._s[299]! } - public var ContactInfo_URLLabelHomepage: String { return self._s[300]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[301]! } + public var KeyCommand_ScrollUp: String { return self._s[300]! } + public var ContactInfo_URLLabelHomepage: String { return self._s[301]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[302]! } public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[302]!, self._r[302]!, [_0]) + return formatWithArgumentRanges(self._s[303]!, self._r[303]!, [_0]) } - public var CallFeedback_ReasonDistortedSpeech: String { return self._s[303]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[304]! } - public var Weekday_Tuesday: String { return self._s[306]! } - public var UserInfo_StartSecretChat: String { return self._s[308]! } - public var Passport_Identity_FilesTitle: String { return self._s[309]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[310]! } - public var DialogList_DeleteConversationConfirmation: String { return self._s[312]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[313]! } - public var AuthSessions_Sessions: String { return self._s[314]! } + public var CallFeedback_ReasonDistortedSpeech: String { return self._s[304]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[305]! } + public var Weekday_Tuesday: String { return self._s[307]! } + public var UserInfo_StartSecretChat: String { return self._s[309]! } + public var Passport_Identity_FilesTitle: String { return self._s[310]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[311]! } + public var DialogList_DeleteConversationConfirmation: String { return self._s[313]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[314]! } + public var AuthSessions_Sessions: String { return self._s[315]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[316]!, self._r[316]!, [_0]) + return formatWithArgumentRanges(self._s[317]!, self._r[317]!, [_0]) } - public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[317]! } - public var Call_StatusWaiting: String { return self._s[318]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[319]! } - public var FastTwoStepSetup_HintHelp: String { return self._s[320]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[321]! } - public var LogoutOptions_AddAccountText: String { return self._s[322]! } - public var PasscodeSettings_6DigitCode: String { return self._s[323]! } - public var Settings_LogoutConfirmationText: String { return self._s[324]! } - public var Passport_Identity_TypePassport: String { return self._s[326]! } + public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[318]! } + public var Call_StatusWaiting: String { return self._s[319]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[320]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[321]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[322]! } + public var LogoutOptions_AddAccountText: String { return self._s[323]! } + public var PasscodeSettings_6DigitCode: String { return self._s[324]! } + public var Settings_LogoutConfirmationText: String { return self._s[325]! } + public var Passport_Identity_TypePassport: String { return self._s[327]! } public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[329]!, self._r[329]!, [_1, _2]) + return formatWithArgumentRanges(self._s[330]!, self._r[330]!, [_1, _2]) } - public var SocksProxySetup_SaveProxy: String { return self._s[330]! } - public var AccessDenied_SaveMedia: String { return self._s[331]! } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[333]! } - public var Settings_Title: String { return self._s[335]! } - public var Contacts_InviteSearchLabel: String { return self._s[337]! } - public var ConvertToSupergroup_Title: String { return self._s[338]! } + public var SocksProxySetup_SaveProxy: String { return self._s[331]! } + public var AccessDenied_SaveMedia: String { return self._s[332]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[334]! } + public var Settings_Title: String { return self._s[336]! } + public var Contacts_InviteSearchLabel: String { return self._s[338]! } + public var ConvertToSupergroup_Title: String { return self._s[339]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[339]!, self._r[339]!, [_0]) + return formatWithArgumentRanges(self._s[340]!, self._r[340]!, [_0]) } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[340]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[341]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[341]!, self._r[341]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[342]!, self._r[342]!, [_1, _2, _3]) } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[342]! } - public var UserInfo_BotHelp: String { return self._s[343]! } - public var PrivacySettings_LastSeenEverybody: String { return self._s[344]! } - public var Checkout_Name: String { return self._s[345]! } - public var AutoDownloadSettings_DataUsage: String { return self._s[346]! } - public var Channel_BanUser_BlockFor: String { return self._s[347]! } - public var Checkout_ShippingAddress: String { return self._s[348]! } - public var AutoDownloadSettings_MaxVideoSize: String { return self._s[349]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[350]! } - public var Privacy_Forwards: String { return self._s[351]! } - public var Channel_BanUser_PermissionSendPolls: String { return self._s[352]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[343]! } + public var UserInfo_BotHelp: String { return self._s[344]! } + public var PrivacySettings_LastSeenEverybody: String { return self._s[345]! } + public var Checkout_Name: String { return self._s[346]! } + public var AutoDownloadSettings_DataUsage: String { return self._s[347]! } + public var Channel_BanUser_BlockFor: String { return self._s[348]! } + public var Checkout_ShippingAddress: String { return self._s[349]! } + public var AutoDownloadSettings_MaxVideoSize: String { return self._s[350]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[351]! } + public var Privacy_Forwards: String { return self._s[352]! } + public var Channel_BanUser_PermissionSendPolls: String { return self._s[353]! } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[355]!, self._r[355]!, [_0]) + return formatWithArgumentRanges(self._s[356]!, self._r[356]!, [_0]) } - public var Contacts_SortedByName: String { return self._s[356]! } - public var Group_OwnershipTransfer_Title: String { return self._s[357]! } - public var Group_LeaveGroup: String { return self._s[358]! } - public var Settings_UsernameEmpty: String { return self._s[359]! } + public var Contacts_SortedByName: String { return self._s[357]! } + public var Group_OwnershipTransfer_Title: String { return self._s[358]! } + public var Group_LeaveGroup: String { return self._s[359]! } + public var Settings_UsernameEmpty: String { return self._s[360]! } public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[360]!, self._r[360]!, [_0]) + return formatWithArgumentRanges(self._s[361]!, self._r[361]!, [_0]) } public func TwoStepAuth_ConfirmEmailDescription(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[361]!, self._r[361]!, [_1]) + return formatWithArgumentRanges(self._s[362]!, self._r[362]!, [_1]) } public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[362]!, self._r[362]!, [_1, _2]) + return formatWithArgumentRanges(self._s[363]!, self._r[363]!, [_1, _2]) } - public var Message_ImageExpired: String { return self._s[363]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[365]! } - public var UserInfo_AddToExisting: String { return self._s[366]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[367]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[368]! } + public var Message_ImageExpired: String { return self._s[364]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[366]! } + public var UserInfo_AddToExisting: String { return self._s[367]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[368]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[369]! } public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[369]!, self._r[369]!, [_1]) + return formatWithArgumentRanges(self._s[370]!, self._r[370]!, [_1]) } - public var Notifications_GroupNotificationsAlert: String { return self._s[370]! } - public var Passport_Language_km: String { return self._s[371]! } - public var SocksProxySetup_AdNoticeHelp: String { return self._s[373]! } - public var Notification_CallMissedShort: String { return self._s[374]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[375]! } - public var Watch_Compose_Send: String { return self._s[376]! } - public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[379]! } - public var Conversation_HoldForVideo: String { return self._s[380]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[382]! } - public var Appearance_AutoNightThemeDisabled: String { return self._s[384]! } - public var Channel_LinkItem: String { return self._s[385]! } + public var Notifications_GroupNotificationsAlert: String { return self._s[371]! } + public var Passport_Language_km: String { return self._s[372]! } + public var SocksProxySetup_AdNoticeHelp: String { return self._s[374]! } + public var Notification_CallMissedShort: String { return self._s[375]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[376]! } + public var Watch_Compose_Send: String { return self._s[377]! } + public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[380]! } + public var Conversation_HoldForVideo: String { return self._s[381]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[383]! } + public var Appearance_AutoNightThemeDisabled: String { return self._s[385]! } + public var Channel_LinkItem: String { return self._s[386]! } public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[386]!, self._r[386]!, [_0, _1]) + return formatWithArgumentRanges(self._s[387]!, self._r[387]!, [_0, _1]) } public func Passport_Identity_NativeNameTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[389]!, self._r[389]!, [_0]) + return formatWithArgumentRanges(self._s[390]!, self._r[390]!, [_0]) } - public var Passport_Language_dv: String { return self._s[390]! } - public var Undo_LeftChannel: String { return self._s[391]! } - public var Notifications_ExceptionsMuted: String { return self._s[392]! } - public var ChatList_UnhideAction: String { return self._s[393]! } - public var Conversation_ContextMenuShare: String { return self._s[394]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[395]! } - public var ShareFileTip_Title: String { return self._s[396]! } - public var NotificationsSound_Chord: String { return self._s[397]! } + public var Passport_Language_dv: String { return self._s[391]! } + public var Undo_LeftChannel: String { return self._s[392]! } + public var Notifications_ExceptionsMuted: String { return self._s[393]! } + public var ChatList_UnhideAction: String { return self._s[394]! } + public var Conversation_ContextMenuShare: String { return self._s[395]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[396]! } + public var ShareFileTip_Title: String { return self._s[397]! } + public var NotificationsSound_Chord: String { return self._s[398]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[398]!, self._r[398]!, [_1, _2]) + return formatWithArgumentRanges(self._s[399]!, self._r[399]!, [_1, _2]) } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[399]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[400]! } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[400]!, self._r[400]!, [_0]) + return formatWithArgumentRanges(self._s[401]!, self._r[401]!, [_0]) } - public var Notification_CallOutgoingShort: String { return self._s[402]! } + public var Notification_CallOutgoingShort: String { return self._s[403]! } public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[403]!, self._r[403]!, [_1, _2]) + return formatWithArgumentRanges(self._s[404]!, self._r[404]!, [_1, _2]) } - public var Passport_Address_TypeUtilityBill: String { return self._s[404]! } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[405]! } - public var ReportPeer_Report: String { return self._s[406]! } - public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[407]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[408]! } - public var StickerPack_Send: String { return self._s[409]! } - public var Login_CodeSentInternal: String { return self._s[410]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[411]! } + public var Passport_Address_TypeUtilityBill: String { return self._s[405]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[406]! } + public var ReportPeer_Report: String { return self._s[407]! } + public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[408]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[409]! } + public var StickerPack_Send: String { return self._s[410]! } + public var Login_CodeSentInternal: String { return self._s[411]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[412]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[412]!, self._r[412]!, [_0]) + return formatWithArgumentRanges(self._s[413]!, self._r[413]!, [_0]) } public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[414]!, self._r[414]!, [_0]) + return formatWithArgumentRanges(self._s[415]!, self._r[415]!, [_0]) } - public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[415]! } + public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[416]! } public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[416]!, self._r[416]!, [_1]) + return formatWithArgumentRanges(self._s[417]!, self._r[417]!, [_1]) } - public var ReportPeer_ReasonViolence: String { return self._s[418]! } - public var Map_Locating: String { return self._s[419]! } - public var AutoDownloadSettings_GroupChats: String { return self._s[421]! } - public var CheckoutInfo_SaveInfo: String { return self._s[422]! } - public var SharedMedia_EmptyLinksText: String { return self._s[424]! } - public var Passport_Address_CityPlaceholder: String { return self._s[425]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[426]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[427]! } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[429]! } + public var ReportPeer_ReasonViolence: String { return self._s[419]! } + public var Map_Locating: String { return self._s[420]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[422]! } + public var CheckoutInfo_SaveInfo: String { return self._s[423]! } + public var SharedMedia_EmptyLinksText: String { return self._s[425]! } + public var Passport_Address_CityPlaceholder: String { return self._s[426]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[427]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[428]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[430]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[430]!, self._r[430]!, [_1]) + return formatWithArgumentRanges(self._s[431]!, self._r[431]!, [_1]) } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[431]!, self._r[431]!, [_0]) + return formatWithArgumentRanges(self._s[432]!, self._r[432]!, [_0]) } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[432]! } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[433]! } - public var ChangePhoneNumberCode_Code: String { return self._s[434]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[433]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[434]! } + public var ChangePhoneNumberCode_Code: String { return self._s[435]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[435]!, self._r[435]!, [_0]) + return formatWithArgumentRanges(self._s[436]!, self._r[436]!, [_0]) } - public var TwoStepAuth_SetupEmail: String { return self._s[436]! } - public var HashtagSearch_AllChats: String { return self._s[437]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[439]! } + public var TwoStepAuth_SetupEmail: String { return self._s[437]! } + public var HashtagSearch_AllChats: String { return self._s[438]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[440]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[440]!, self._r[440]!, [_0]) + return formatWithArgumentRanges(self._s[441]!, self._r[441]!, [_0]) } - public var PhotoEditor_QualityHigh: String { return self._s[442]! } + public var PhotoEditor_QualityHigh: String { return self._s[443]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[443]!, self._r[443]!, [_0]) + return formatWithArgumentRanges(self._s[444]!, self._r[444]!, [_0]) } - public var ApplyLanguage_ApplyLanguageAction: String { return self._s[444]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[445]! } - public var Message_LiveLocation: String { return self._s[446]! } - public var Cache_LowDiskSpaceText: String { return self._s[447]! } - public var Conversation_SendMessage: String { return self._s[448]! } - public var AuthSessions_EmptyTitle: String { return self._s[449]! } - public var Privacy_PhoneNumber: String { return self._s[450]! } - public var PeopleNearby_CreateGroup: String { return self._s[451]! } - public var CallSettings_UseLessData: String { return self._s[452]! } - public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[453]! } - public var Stickers_AddToFavorites: String { return self._s[454]! } - public var PhotoEditor_QualityLow: String { return self._s[455]! } - public var Watch_UserInfo_Unblock: String { return self._s[456]! } - public var Settings_Logout: String { return self._s[457]! } + public var ApplyLanguage_ApplyLanguageAction: String { return self._s[445]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[446]! } + public var Message_LiveLocation: String { return self._s[447]! } + public var Cache_LowDiskSpaceText: String { return self._s[448]! } + public var Conversation_SendMessage: String { return self._s[449]! } + public var AuthSessions_EmptyTitle: String { return self._s[450]! } + public var Privacy_PhoneNumber: String { return self._s[451]! } + public var PeopleNearby_CreateGroup: String { return self._s[452]! } + public var CallSettings_UseLessData: String { return self._s[453]! } + public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[454]! } + public var Stickers_AddToFavorites: String { return self._s[455]! } + public var PhotoEditor_QualityLow: String { return self._s[456]! } + public var Watch_UserInfo_Unblock: String { return self._s[457]! } + public var Settings_Logout: String { return self._s[458]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[458]!, self._r[458]!, [_1]) + return formatWithArgumentRanges(self._s[459]!, self._r[459]!, [_1]) } - public var ContactInfo_PhoneLabelWork: String { return self._s[459]! } - public var ChannelInfo_Stats: String { return self._s[460]! } - public var TextFormat_Link: String { return self._s[461]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[460]! } + public var ChannelInfo_Stats: String { return self._s[461]! } + public var TextFormat_Link: String { return self._s[462]! } public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[462]!, self._r[462]!, [_1, _2]) + return formatWithArgumentRanges(self._s[463]!, self._r[463]!, [_1, _2]) } public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[463]!, self._r[463]!, [_0]) + return formatWithArgumentRanges(self._s[464]!, self._r[464]!, [_0]) } - public var Watch_Notification_Joined: String { return self._s[464]! } - public var Group_Setup_TypePublicHelp: String { return self._s[465]! } - public var Passport_Scans_UploadNew: String { return self._s[466]! } - public var Checkout_LiabilityAlertTitle: String { return self._s[467]! } - public var DialogList_Title: String { return self._s[470]! } - public var NotificationSettings_ContactJoined: String { return self._s[471]! } - public var GroupInfo_LabelAdmin: String { return self._s[472]! } - public var KeyCommand_ChatInfo: String { return self._s[473]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[474]! } - public var Call_ReportIncludeLog: String { return self._s[475]! } + public var Watch_Notification_Joined: String { return self._s[465]! } + public var Group_Setup_TypePublicHelp: String { return self._s[466]! } + public var Passport_Scans_UploadNew: String { return self._s[467]! } + public var Checkout_LiabilityAlertTitle: String { return self._s[468]! } + public var DialogList_Title: String { return self._s[471]! } + public var NotificationSettings_ContactJoined: String { return self._s[472]! } + public var GroupInfo_LabelAdmin: String { return self._s[473]! } + public var KeyCommand_ChatInfo: String { return self._s[474]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[475]! } + public var Call_ReportIncludeLog: String { return self._s[476]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[478]!, self._r[478]!, [_0]) + return formatWithArgumentRanges(self._s[479]!, self._r[479]!, [_0]) } - public var LocalGroup_IrrelevantWarning: String { return self._s[479]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[480]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[481]! } - public var Message_Sticker: String { return self._s[482]! } - public var LastSeen_JustNow: String { return self._s[484]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[486]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[487]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[488]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[489]! } - public var TwoStepAuth_Email: String { return self._s[490]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[491]! } - public var PhotoEditor_BlurToolOff: String { return self._s[492]! } - public var Message_PinnedStickerMessage: String { return self._s[493]! } - public var ContactInfo_PhoneLabelPager: String { return self._s[494]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[495]! } - public var Passport_DiscardMessageTitle: String { return self._s[496]! } - public var Privacy_PaymentsTitle: String { return self._s[497]! } - public var Channel_DiscussionGroup_Header: String { return self._s[499]! } - public var Appearance_ColorTheme: String { return self._s[500]! } - public var UserInfo_ShareContact: String { return self._s[501]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[502]! } - public var Common_More: String { return self._s[503]! } - public var Watch_Message_Call: String { return self._s[504]! } - public var Profile_EncryptionKey: String { return self._s[507]! } - public var Privacy_TopPeers: String { return self._s[508]! } - public var Conversation_StopPollConfirmation: String { return self._s[509]! } - public var Privacy_TopPeersWarning: String { return self._s[511]! } - public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[512]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[513]! } - public var DialogList_SearchSectionMessages: String { return self._s[516]! } - public var Notifications_ChannelNotifications: String { return self._s[517]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[518]! } - public var Passport_Language_sk: String { return self._s[519]! } - public var Notification_MessageLifetime1h: String { return self._s[520]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[521]! } - public var Call_ReportSkip: String { return self._s[523]! } - public var Cache_ServiceFiles: String { return self._s[524]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[525]! } - public var Map_Hybrid: String { return self._s[526]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[528]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[530]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[531]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[532]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[535]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[480]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[481]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[482]! } + public var Message_Sticker: String { return self._s[483]! } + public var LastSeen_JustNow: String { return self._s[485]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[487]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[488]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[489]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[490]! } + public var TwoStepAuth_Email: String { return self._s[491]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[492]! } + public var PhotoEditor_BlurToolOff: String { return self._s[493]! } + public var Message_PinnedStickerMessage: String { return self._s[494]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[495]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[496]! } + public var Passport_DiscardMessageTitle: String { return self._s[497]! } + public var Privacy_PaymentsTitle: String { return self._s[498]! } + public var Channel_DiscussionGroup_Header: String { return self._s[500]! } + public var Appearance_ColorTheme: String { return self._s[501]! } + public var UserInfo_ShareContact: String { return self._s[502]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[503]! } + public var Common_More: String { return self._s[504]! } + public var Watch_Message_Call: String { return self._s[505]! } + public var Profile_EncryptionKey: String { return self._s[508]! } + public var Privacy_TopPeers: String { return self._s[509]! } + public var Conversation_StopPollConfirmation: String { return self._s[510]! } + public var Privacy_TopPeersWarning: String { return self._s[512]! } + public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[513]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[514]! } + public var DialogList_SearchSectionMessages: String { return self._s[517]! } + public var Notifications_ChannelNotifications: String { return self._s[518]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[519]! } + public var Passport_Language_sk: String { return self._s[520]! } + public var Notification_MessageLifetime1h: String { return self._s[521]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[522]! } + public var Call_ReportSkip: String { return self._s[524]! } + public var Cache_ServiceFiles: String { return self._s[525]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[526]! } + public var Map_Hybrid: String { return self._s[527]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[529]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[531]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[532]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[533]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[536]! } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[536]!, self._r[536]!, [_1]) + return formatWithArgumentRanges(self._s[537]!, self._r[537]!, [_1]) } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[538]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[539]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[539]!, self._r[539]!, [_1, _2]) + return formatWithArgumentRanges(self._s[540]!, self._r[540]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[540]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[541]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[542]! } - public var UserInfo_ShareBot: String { return self._s[545]! } + public var Conversation_LiveLocationYou: String { return self._s[541]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[542]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[543]! } + public var UserInfo_ShareBot: String { return self._s[546]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[546]!, self._r[546]!, [_1, _2]) + return formatWithArgumentRanges(self._s[547]!, self._r[547]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[547]! } - public var Message_Audio: String { return self._s[548]! } - public var Passport_Language_lt: String { return self._s[549]! } + public var PhotoEditor_ShadowsTint: String { return self._s[548]! } + public var Message_Audio: String { return self._s[549]! } + public var Passport_Language_lt: String { return self._s[550]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[550]!, self._r[550]!, [_0]) + return formatWithArgumentRanges(self._s[551]!, self._r[551]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[551]! } - public var Conversation_FileICloudDrive: String { return self._s[552]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[553]! } + public var Permissions_SiriText_v0: String { return self._s[552]! } + public var Conversation_FileICloudDrive: String { return self._s[553]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[554]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[554]!, self._r[554]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[555]!, self._r[555]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[555]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[556]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[556]!, self._r[556]!, [_0]) + return formatWithArgumentRanges(self._s[557]!, self._r[557]!, [_0]) } - public var Channel_SignMessages: String { return self._s[557]! } + public var Channel_SignMessages: String { return self._s[558]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[558]!, self._r[558]!, [_1]) + return formatWithArgumentRanges(self._s[559]!, self._r[559]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[559]! } - public var Passport_ScanPassport: String { return self._s[560]! } - public var Watch_Suggestion_Thanks: String { return self._s[561]! } - public var BlockedUsers_AddNew: String { return self._s[562]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[560]! } + public var Passport_ScanPassport: String { return self._s[561]! } + public var Watch_Suggestion_Thanks: String { return self._s[562]! } + public var BlockedUsers_AddNew: String { return self._s[563]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[563]!, self._r[563]!, [_1, _2]) + return formatWithArgumentRanges(self._s[564]!, self._r[564]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[564]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[565]! } - public var Month_GenJuly: String { return self._s[566]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[567]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[569]! } - public var Notification_ChannelInviterSelf: String { return self._s[570]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[571]! } + public var Watch_Message_Invoice: String { return self._s[565]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[566]! } + public var Month_GenJuly: String { return self._s[567]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[568]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[570]! } + public var Notification_ChannelInviterSelf: String { return self._s[571]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[572]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[572]!, self._r[572]!, [_1, _2]) + return formatWithArgumentRanges(self._s[573]!, self._r[573]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[573]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[574]! } + public var CheckoutInfo_Title: String { return self._s[574]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[575]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[575]!, self._r[575]!, [_0]) + return formatWithArgumentRanges(self._s[576]!, self._r[576]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[576]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[577]! } - public var Passport_Language_de: String { return self._s[578]! } - public var Update_Title: String { return self._s[579]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[580]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[581]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[582]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[583]! } - public var NotificationsSound_Telegraph: String { return self._s[584]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[585]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[586]! } + public var Passport_Identity_MainPage: String { return self._s[577]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[578]! } + public var Passport_Language_de: String { return self._s[579]! } + public var Update_Title: String { return self._s[580]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[581]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[582]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[583]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[584]! } + public var NotificationsSound_Telegraph: String { return self._s[585]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[586]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[587]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[587]!, self._r[587]!, [_0]) + return formatWithArgumentRanges(self._s[588]!, self._r[588]!, [_0]) } - public var Stickers_SuggestAll: String { return self._s[588]! } - public var Conversation_ForwardTitle: String { return self._s[589]! } + public var Stickers_SuggestAll: String { return self._s[589]! } + public var Conversation_ForwardTitle: String { return self._s[590]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[590]!, self._r[590]!, [_0]) + return formatWithArgumentRanges(self._s[591]!, self._r[591]!, [_0]) } - public var Calls_NewCall: String { return self._s[591]! } - public var Call_StatusEnded: String { return self._s[592]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[593]! } - public var Settings_ProxyConnected: String { return self._s[594]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[595]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[596]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[597]! } - public var Passport_PasswordPlaceholder: String { return self._s[598]! } - public var Message_PinnedInvoice: String { return self._s[599]! } - public var Passport_Identity_IssueDate: String { return self._s[600]! } - public var Passport_Language_pl: String { return self._s[601]! } + public var Calls_NewCall: String { return self._s[592]! } + public var Call_StatusEnded: String { return self._s[593]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[594]! } + public var Settings_ProxyConnected: String { return self._s[595]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[596]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[597]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[598]! } + public var Passport_PasswordPlaceholder: String { return self._s[599]! } + public var Message_PinnedInvoice: String { return self._s[600]! } + public var Passport_Identity_IssueDate: String { return self._s[601]! } + public var Passport_Language_pl: String { return self._s[602]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[602]!, self._r[602]!, [_0]) + return formatWithArgumentRanges(self._s[603]!, self._r[603]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[603]! } - public var Call_StatusConnecting: String { return self._s[604]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[604]! } + public var Call_StatusConnecting: String { return self._s[605]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[605]!, self._r[605]!, [_0]) + return formatWithArgumentRanges(self._s[606]!, self._r[606]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[607]! } - public var Common_Edit: String { return self._s[608]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[609]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[608]! } + public var Common_Edit: String { return self._s[609]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[610]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[610]!, self._r[610]!, [_0]) + return formatWithArgumentRanges(self._s[611]!, self._r[611]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[611]! } - public var PrivateDataSettings_Title: String { return self._s[612]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[613]! } - public var ChatList_Read: String { return self._s[614]! } - public var Undo_ChatClearedForBothSides: String { return self._s[615]! } - public var GroupPermission_SectionTitle: String { return self._s[616]! } + public var GroupInfo_ChatAdmins: String { return self._s[612]! } + public var PrivateDataSettings_Title: String { return self._s[613]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[614]! } + public var ChatList_Read: String { return self._s[615]! } + public var Undo_ChatClearedForBothSides: String { return self._s[616]! } + public var GroupPermission_SectionTitle: String { return self._s[617]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[618]!, self._r[618]!, [_1, _2]) + return formatWithArgumentRanges(self._s[619]!, self._r[619]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[619]! } - public var Update_UpdateApp: String { return self._s[620]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[621]! } - public var Settings_Appearance: String { return self._s[622]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[624]! } - public var Watch_Location_Access: String { return self._s[625]! } - public var ShareMenu_CopyShareLink: String { return self._s[627]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[628]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[620]! } + public var Update_UpdateApp: String { return self._s[621]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[622]! } + public var Settings_Appearance: String { return self._s[623]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[625]! } + public var Watch_Location_Access: String { return self._s[626]! } + public var ShareMenu_CopyShareLink: String { return self._s[628]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[629]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[630]!, self._r[630]!, [_0]) + return formatWithArgumentRanges(self._s[631]!, self._r[631]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[631]! } - public var Weekday_ShortWednesday: String { return self._s[632]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[633]! } - public var Undo_LeftGroup: String { return self._s[636]! } - public var Conversation_LinkDialogCopy: String { return self._s[637]! } - public var KeyCommand_FocusOnInputField: String { return self._s[639]! } - public var Contacts_SelectAll: String { return self._s[640]! } - public var Preview_SaveToCameraRoll: String { return self._s[641]! } - public var PrivacySettings_PasscodeOff: String { return self._s[642]! } - public var Wallpaper_Title: String { return self._s[643]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[644]! } - public var AccessDenied_Camera: String { return self._s[645]! } - public var Watch_Compose_CurrentLocation: String { return self._s[646]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[648]! } + public var Notifications_ClassicTones: String { return self._s[632]! } + public var Weekday_ShortWednesday: String { return self._s[633]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[634]! } + public var Undo_LeftGroup: String { return self._s[637]! } + public var Conversation_LinkDialogCopy: String { return self._s[638]! } + public var KeyCommand_FocusOnInputField: String { return self._s[640]! } + public var Contacts_SelectAll: String { return self._s[641]! } + public var Preview_SaveToCameraRoll: String { return self._s[642]! } + public var PrivacySettings_PasscodeOff: String { return self._s[643]! } + public var Wallpaper_Title: String { return self._s[644]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[645]! } + public var AccessDenied_Camera: String { return self._s[646]! } + public var Watch_Compose_CurrentLocation: String { return self._s[647]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[649]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[649]!, self._r[649]!, [_0]) + return formatWithArgumentRanges(self._s[650]!, self._r[650]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[650]! } - public var Passport_Language_ro: String { return self._s[651]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[652]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[651]! } + public var Passport_Language_ro: String { return self._s[652]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[653]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[653]!, self._r[653]!, [_0]) + return formatWithArgumentRanges(self._s[654]!, self._r[654]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[654]! } - public var State_ConnectingToProxy: String { return self._s[655]! } - public var Calls_RatingTitle: String { return self._s[656]! } - public var Generic_ErrorMoreInfo: String { return self._s[657]! } - public var Appearance_PreviewReplyText: String { return self._s[658]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[659]! } - public var SharedMedia_CategoryLinks: String { return self._s[660]! } - public var Calls_Missed: String { return self._s[661]! } - public var Cache_Photos: String { return self._s[665]! } - public var GroupPermission_NoAddMembers: String { return self._s[666]! } + public var Login_CancelPhoneVerification: String { return self._s[655]! } + public var State_ConnectingToProxy: String { return self._s[656]! } + public var Calls_RatingTitle: String { return self._s[657]! } + public var Generic_ErrorMoreInfo: String { return self._s[658]! } + public var Appearance_PreviewReplyText: String { return self._s[659]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[660]! } + public var SharedMedia_CategoryLinks: String { return self._s[661]! } + public var Calls_Missed: String { return self._s[662]! } + public var Cache_Photos: String { return self._s[666]! } + public var GroupPermission_NoAddMembers: String { return self._s[667]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[667]!, self._r[667]!, [_0]) + return formatWithArgumentRanges(self._s[668]!, self._r[668]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[668]! } - public var Settings_ProxyDisabled: String { return self._s[669]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[669]! } + public var Settings_ProxyDisabled: String { return self._s[670]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[670]!, self._r[670]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[671]!, self._r[671]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[671]!, self._r[671]!, [_0]) + return formatWithArgumentRanges(self._s[672]!, self._r[672]!, [_0]) } - public var Appearance_Title: String { return self._s[672]! } + public var Appearance_Title: String { return self._s[673]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[674]!, self._r[674]!, [_0]) + return formatWithArgumentRanges(self._s[675]!, self._r[675]!, [_0]) } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[675]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[676]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[677]! } - public var Preview_DeletePhoto: String { return self._s[678]! } - public var Appearance_AppIconFilledX: String { return self._s[679]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[680]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[676]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[677]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[678]! } + public var Preview_DeletePhoto: String { return self._s[679]! } + public var Appearance_AppIconFilledX: String { return self._s[680]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[681]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[681]!, self._r[681]!, [_0]) + return formatWithArgumentRanges(self._s[682]!, self._r[682]!, [_0]) } - public var Coub_TapForSound: String { return self._s[683]! } - public var Map_LocatingError: String { return self._s[684]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[686]! } - public var Passport_ForgottenPassword: String { return self._s[687]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[688]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[689]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[691]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[692]! } - public var Message_Location: String { return self._s[693]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[694]! } - public var Channel_Management_Title: String { return self._s[695]! } - public var DialogList_SearchSectionDialogs: String { return self._s[697]! } - public var Compose_NewChannel_Members: String { return self._s[698]! } + public var Coub_TapForSound: String { return self._s[684]! } + public var Map_LocatingError: String { return self._s[685]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[687]! } + public var Passport_ForgottenPassword: String { return self._s[688]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[689]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[690]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[692]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[693]! } + public var Message_Location: String { return self._s[694]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[695]! } + public var Channel_Management_Title: String { return self._s[696]! } + public var DialogList_SearchSectionDialogs: String { return self._s[698]! } + public var Compose_NewChannel_Members: String { return self._s[699]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[699]!, self._r[699]!, [_0]) + return formatWithArgumentRanges(self._s[700]!, self._r[700]!, [_0]) } - public var GroupInfo_Location: String { return self._s[700]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[701]! } - public var PhotoEditor_WarmthTool: String { return self._s[702]! } - public var Passport_Language_tr: String { return self._s[703]! } + public var GroupInfo_Location: String { return self._s[701]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[702]! } + public var PhotoEditor_WarmthTool: String { return self._s[703]! } + public var Passport_Language_tr: String { return self._s[704]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[704]!, self._r[704]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[705]!, self._r[705]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[706]! } - public var Watch_PhotoView_Title: String { return self._s[707]! } - public var Passport_Phone_Delete: String { return self._s[708]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[709]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[710]! } - public var GroupInfo_Permissions: String { return self._s[711]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[712]! } - public var Profile_ShareContactButton: String { return self._s[713]! } - public var ChatSettings_Other: String { return self._s[714]! } - public var UserInfo_NotificationsDisabled: String { return self._s[715]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[716]! } - public var LastSeen_WithinAMonth: String { return self._s[717]! } - public var Conversation_ReportGroupLocation: String { return self._s[718]! } - public var Conversation_EncryptionCanceled: String { return self._s[719]! } - public var MediaPicker_GroupDescription: String { return self._s[720]! } - public var WebSearch_Images: String { return self._s[721]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[707]! } + public var Watch_PhotoView_Title: String { return self._s[708]! } + public var Passport_Phone_Delete: String { return self._s[709]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[710]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[711]! } + public var GroupInfo_Permissions: String { return self._s[712]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[713]! } + public var Profile_ShareContactButton: String { return self._s[714]! } + public var ChatSettings_Other: String { return self._s[715]! } + public var UserInfo_NotificationsDisabled: String { return self._s[716]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[717]! } + public var LastSeen_WithinAMonth: String { return self._s[718]! } + public var Conversation_ReportGroupLocation: String { return self._s[719]! } + public var Conversation_EncryptionCanceled: String { return self._s[720]! } + public var MediaPicker_GroupDescription: String { return self._s[721]! } + public var WebSearch_Images: String { return self._s[722]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[722]!, self._r[722]!, [_0]) + return formatWithArgumentRanges(self._s[723]!, self._r[723]!, [_0]) } - public var Message_Photo: String { return self._s[723]! } - public var PasscodeSettings_HelpBottom: String { return self._s[724]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[725]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[726]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[727]! } - public var NotificationsSound_Calypso: String { return self._s[728]! } - public var Map_Map: String { return self._s[729]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[731]! } - public var ChatSettings_TextSizeUnits: String { return self._s[732]! } - public var Common_of: String { return self._s[733]! } - public var Conversation_ForwardContacts: String { return self._s[735]! } + public var Message_Photo: String { return self._s[724]! } + public var PasscodeSettings_HelpBottom: String { return self._s[725]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[726]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[727]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[728]! } + public var NotificationsSound_Calypso: String { return self._s[729]! } + public var Map_Map: String { return self._s[730]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[732]! } + public var ChatSettings_TextSizeUnits: String { return self._s[733]! } + public var Common_of: String { return self._s[734]! } + public var Conversation_ForwardContacts: String { return self._s[736]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[737]!, self._r[737]!, [_0]) + return formatWithArgumentRanges(self._s[738]!, self._r[738]!, [_0]) } - public var Passport_Language_hy: String { return self._s[738]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[739]! } - public var AutoDownloadSettings_Reset: String { return self._s[740]! } - public var Paint_ClearConfirm: String { return self._s[741]! } - public var Camera_VideoMode: String { return self._s[742]! } + public var Passport_Language_hy: String { return self._s[739]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[740]! } + public var AutoDownloadSettings_Reset: String { return self._s[741]! } + public var Paint_ClearConfirm: String { return self._s[742]! } + public var Camera_VideoMode: String { return self._s[743]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[743]!, self._r[743]!, [_0]) + return formatWithArgumentRanges(self._s[744]!, self._r[744]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[744]! } - public var Conversation_ViewBackground: String { return self._s[745]! } - public var Passport_Language_el: String { return self._s[746]! } - public var PhotoEditor_Original: String { return self._s[747]! } - public var Settings_FAQ_Button: String { return self._s[749]! } - public var Channel_Setup_PublicNoLink: String { return self._s[751]! } - public var Conversation_UnsupportedMedia: String { return self._s[752]! } - public var Conversation_SlideToCancel: String { return self._s[753]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[754]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[755]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[756]! } - public var AutoNightTheme_NotAvailable: String { return self._s[757]! } - public var Common_Create: String { return self._s[758]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[759]! } - public var Localization_ChooseLanguage: String { return self._s[761]! } - public var Settings_Proxy: String { return self._s[764]! } - public var Privacy_TopPeersHelp: String { return self._s[765]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[766]! } - public var Chat_UnsendMyMessages: String { return self._s[767]! } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[768]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[745]! } + public var Conversation_ViewBackground: String { return self._s[746]! } + public var Passport_Language_el: String { return self._s[747]! } + public var PhotoEditor_Original: String { return self._s[748]! } + public var Settings_FAQ_Button: String { return self._s[750]! } + public var Channel_Setup_PublicNoLink: String { return self._s[752]! } + public var Conversation_UnsupportedMedia: String { return self._s[753]! } + public var Conversation_SlideToCancel: String { return self._s[754]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[755]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[756]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[757]! } + public var AutoNightTheme_NotAvailable: String { return self._s[758]! } + public var Common_Create: String { return self._s[759]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[760]! } + public var Localization_ChooseLanguage: String { return self._s[762]! } + public var Settings_Proxy: String { return self._s[765]! } + public var Privacy_TopPeersHelp: String { return self._s[766]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[767]! } + public var Chat_UnsendMyMessages: String { return self._s[768]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[769]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[770]!, self._r[770]!, [_0]) + return formatWithArgumentRanges(self._s[771]!, self._r[771]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[771]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[772]! } - public var Cache_Title: String { return self._s[773]! } + public var Contacts_SortedByPresence: String { return self._s[772]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[773]! } + public var Cache_Title: String { return self._s[774]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[774]!, self._r[774]!, [_0]) + return formatWithArgumentRanges(self._s[775]!, self._r[775]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[775]! } - public var Channel_Moderator_Title: String { return self._s[776]! } - public var InstantPage_AutoNightTheme: String { return self._s[778]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[776]! } + public var Channel_Moderator_Title: String { return self._s[777]! } + public var InstantPage_AutoNightTheme: String { return self._s[779]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[781]!, self._r[781]!, [_1]) + return formatWithArgumentRanges(self._s[782]!, self._r[782]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[782]! } - public var Undo_Undo: String { return self._s[784]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[785]! } - public var TwoStepAuth_RemovePassword: String { return self._s[786]! } - public var Common_Delete: String { return self._s[787]! } - public var Contacts_AddPeopleNearby: String { return self._s[789]! } - public var Conversation_ContextMenuDelete: String { return self._s[790]! } - public var SocksProxySetup_Credentials: String { return self._s[791]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[793]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[796]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[797]! } - public var Passport_Language_id: String { return self._s[799]! } - public var WallpaperSearch_ColorTeal: String { return self._s[800]! } - public var ChannelIntro_Title: String { return self._s[801]! } + public var Passport_Scans_Upload: String { return self._s[783]! } + public var Undo_Undo: String { return self._s[785]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[786]! } + public var TwoStepAuth_RemovePassword: String { return self._s[787]! } + public var Common_Delete: String { return self._s[788]! } + public var Contacts_AddPeopleNearby: String { return self._s[790]! } + public var Conversation_ContextMenuDelete: String { return self._s[791]! } + public var SocksProxySetup_Credentials: String { return self._s[792]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[794]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[797]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[798]! } + public var Passport_Language_id: String { return self._s[800]! } + public var WallpaperSearch_ColorTeal: String { return self._s[801]! } + public var ChannelIntro_Title: String { return self._s[802]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[802]!, self._r[802]!, [_0]) + return formatWithArgumentRanges(self._s[803]!, self._r[803]!, [_0]) } - public var Channel_Info_Description: String { return self._s[804]! } - public var Stickers_FavoriteStickers: String { return self._s[805]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[806]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[807]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[808]! } - public var Group_PublicLink_Placeholder: String { return self._s[809]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[810]! } + public var Channel_Info_Description: String { return self._s[805]! } + public var Stickers_FavoriteStickers: String { return self._s[806]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[807]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[808]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[809]! } + public var Group_PublicLink_Placeholder: String { return self._s[810]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[811]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[811]!, self._r[811]!, [_1]) + return formatWithArgumentRanges(self._s[812]!, self._r[812]!, [_1]) } - public var TextFormat_Underline: String { return self._s[812]! } + public var TextFormat_Underline: String { return self._s[813]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[813]!, self._r[813]!, [_1, _2]) + return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_0]) + return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_0]) } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_1, _2]) + return formatWithArgumentRanges(self._s[816]!, self._r[816]!, [_1, _2]) } - public var GroupPermission_Delete: String { return self._s[816]! } - public var Passport_Language_uk: String { return self._s[817]! } - public var StickerPack_HideStickers: String { return self._s[819]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[820]! } + public var GroupPermission_Delete: String { return self._s[817]! } + public var Passport_Language_uk: String { return self._s[818]! } + public var StickerPack_HideStickers: String { return self._s[820]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[821]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[821]!, self._r[821]!, [_1, _2]) + return formatWithArgumentRanges(self._s[822]!, self._r[822]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[822]! } + public var Activity_UploadingVideoMessage: String { return self._s[823]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[823]!, self._r[823]!, [_0]) + return formatWithArgumentRanges(self._s[824]!, self._r[824]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[824]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[825]! } - public var Settings_CallSettings: String { return self._s[826]! } - public var Camera_SquareMode: String { return self._s[827]! } - public var GroupInfo_SharedMediaNone: String { return self._s[828]! } + public var Channel_TitleInfo: String { return self._s[825]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[826]! } + public var Settings_CallSettings: String { return self._s[827]! } + public var Camera_SquareMode: String { return self._s[828]! } + public var GroupInfo_SharedMediaNone: String { return self._s[829]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[829]!, self._r[829]!, [_1]) + return formatWithArgumentRanges(self._s[830]!, self._r[830]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[830]! } - public var Application_Update: String { return self._s[832]! } - public var Month_ShortJanuary: String { return self._s[833]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[834]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[835]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[836]! } - public var Passport_Address_Street2Placeholder: String { return self._s[837]! } + public var Bot_GenericBotStatus: String { return self._s[831]! } + public var Application_Update: String { return self._s[833]! } + public var Month_ShortJanuary: String { return self._s[834]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[835]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[836]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[837]! } + public var Passport_Address_Street2Placeholder: String { return self._s[838]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[838]!, self._r[838]!, [_0]) + return formatWithArgumentRanges(self._s[839]!, self._r[839]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[839]! } - public var Appearance_PreviewOutgoingText: String { return self._s[840]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[841]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[843]! } - public var Map_Directions: String { return self._s[844]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[846]! } - public var Appearance_ThemeDay: String { return self._s[847]! } - public var LogoutOptions_LogOut: String { return self._s[848]! } - public var Group_PublicLink_Title: String { return self._s[850]! } - public var Channel_AddBotErrorNoRights: String { return self._s[851]! } - public var Passport_Identity_AddPassport: String { return self._s[852]! } - public var LocalGroup_ButtonTitle: String { return self._s[853]! } - public var Call_Message: String { return self._s[854]! } - public var PhotoEditor_ExposureTool: String { return self._s[855]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[857]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[859]! } - public var Appearance_Preview: String { return self._s[860]! } - public var Compose_ChannelMembers: String { return self._s[861]! } - public var Conversation_DeleteManyMessages: String { return self._s[862]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[863]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[864]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[865]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[868]! } - public var Conversation_UpdateTelegram: String { return self._s[869]! } + public var NetworkUsageSettings_Cellular: String { return self._s[840]! } + public var Appearance_PreviewOutgoingText: String { return self._s[841]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[842]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[844]! } + public var Map_Directions: String { return self._s[845]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[847]! } + public var Appearance_ThemeDay: String { return self._s[848]! } + public var LogoutOptions_LogOut: String { return self._s[849]! } + public var Group_PublicLink_Title: String { return self._s[851]! } + public var Channel_AddBotErrorNoRights: String { return self._s[852]! } + public var Passport_Identity_AddPassport: String { return self._s[853]! } + public var LocalGroup_ButtonTitle: String { return self._s[854]! } + public var Call_Message: String { return self._s[855]! } + public var PhotoEditor_ExposureTool: String { return self._s[856]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[858]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[860]! } + public var Appearance_Preview: String { return self._s[861]! } + public var Compose_ChannelMembers: String { return self._s[862]! } + public var Conversation_DeleteManyMessages: String { return self._s[863]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[864]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[865]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[866]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[869]! } + public var Conversation_UpdateTelegram: String { return self._s[870]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_0]) + return formatWithArgumentRanges(self._s[871]!, self._r[871]!, [_0]) } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[871]!, self._r[871]!, [_1]) + return formatWithArgumentRanges(self._s[872]!, self._r[872]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[872]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[873]! } + public var GroupInfo_Administrators_Title: String { return self._s[873]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[874]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[874]!, self._r[874]!, [_0]) + return formatWithArgumentRanges(self._s[875]!, self._r[875]!, [_0]) } - public var Tour_Title3: String { return self._s[875]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[876]! } - public var Clipboard_SendPhoto: String { return self._s[880]! } - public var MediaPicker_Videos: String { return self._s[881]! } - public var Passport_Email_Title: String { return self._s[882]! } + public var Tour_Title3: String { return self._s[876]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[877]! } + public var Clipboard_SendPhoto: String { return self._s[881]! } + public var MediaPicker_Videos: String { return self._s[882]! } + public var Passport_Email_Title: String { return self._s[883]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[883]!, self._r[883]!, [_0]) + return formatWithArgumentRanges(self._s[884]!, self._r[884]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[884]! } - public var Conversation_MessageDialogDelete: String { return self._s[885]! } - public var Privacy_Calls_CustomHelp: String { return self._s[887]! } - public var Message_Wallpaper: String { return self._s[888]! } - public var MemberSearch_BotSection: String { return self._s[889]! } - public var GroupInfo_SetSound: String { return self._s[890]! } - public var Core_ServiceUserStatus: String { return self._s[891]! } - public var LiveLocationUpdated_JustNow: String { return self._s[892]! } - public var Call_StatusFailed: String { return self._s[893]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[894]! } - public var TwoStepAuth_SetPassword: String { return self._s[895]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[896]! } + public var StickerPacksSettings_Title: String { return self._s[885]! } + public var Conversation_MessageDialogDelete: String { return self._s[886]! } + public var Privacy_Calls_CustomHelp: String { return self._s[888]! } + public var Message_Wallpaper: String { return self._s[889]! } + public var MemberSearch_BotSection: String { return self._s[890]! } + public var GroupInfo_SetSound: String { return self._s[891]! } + public var Core_ServiceUserStatus: String { return self._s[892]! } + public var LiveLocationUpdated_JustNow: String { return self._s[893]! } + public var Call_StatusFailed: String { return self._s[894]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[895]! } + public var TwoStepAuth_SetPassword: String { return self._s[896]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[897]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[898]!, self._r[898]!, [_0]) + return formatWithArgumentRanges(self._s[899]!, self._r[899]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[899]! } - public var Profile_Username: String { return self._s[900]! } - public var Bot_DescriptionTitle: String { return self._s[901]! } - public var MaskStickerSettings_Title: String { return self._s[902]! } - public var SharedMedia_CategoryOther: String { return self._s[903]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[904]! } - public var Common_NotNow: String { return self._s[905]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[906]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[907]! } - public var Map_Location: String { return self._s[908]! } - public var Invitation_JoinGroup: String { return self._s[909]! } - public var AutoDownloadSettings_Title: String { return self._s[911]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[912]! } - public var Channel_ErrorAddBlocked: String { return self._s[913]! } - public var Conversation_UnblockUser: String { return self._s[914]! } - public var Watch_Bot_Restart: String { return self._s[915]! } - public var TwoStepAuth_Title: String { return self._s[916]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[917]! } - public var Checkout_ShippingMethod: String { return self._s[918]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[919]! } + public var Calls_SubmitRating: String { return self._s[900]! } + public var Profile_Username: String { return self._s[901]! } + public var Bot_DescriptionTitle: String { return self._s[902]! } + public var MaskStickerSettings_Title: String { return self._s[903]! } + public var SharedMedia_CategoryOther: String { return self._s[904]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[905]! } + public var Common_NotNow: String { return self._s[906]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[907]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[908]! } + public var Map_Location: String { return self._s[909]! } + public var Invitation_JoinGroup: String { return self._s[910]! } + public var AutoDownloadSettings_Title: String { return self._s[912]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[913]! } + public var Channel_ErrorAddBlocked: String { return self._s[914]! } + public var Conversation_UnblockUser: String { return self._s[915]! } + public var Watch_Bot_Restart: String { return self._s[916]! } + public var TwoStepAuth_Title: String { return self._s[917]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[918]! } + public var Checkout_ShippingMethod: String { return self._s[919]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[920]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[920]!, self._r[920]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[922]!, self._r[922]!, [_0]) - } - public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_0]) } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[924]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[925]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[926]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[927]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[928]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[929]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[930]! } - public var Checkout_PaymentMethod_Title: String { return self._s[931]! } - public var SocksProxySetup_Connection: String { return self._s[932]! } - public var Group_MessagePhotoRemoved: String { return self._s[933]! } - public var Channel_Stickers_NotFound: String { return self._s[935]! } - public var Group_About_Help: String { return self._s[936]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[937]! } - public var PeopleNearby_Title: String { return self._s[939]! } - public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[940]!, self._r[940]!, [_1]) + public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[924]!, self._r[924]!, [_0]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[942]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[943]! } - public var SocksProxySetup_Password: String { return self._s[944]! } - public var Notifications_PermissionsEnable: String { return self._s[945]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[947]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[925]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[926]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[927]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[928]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[929]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[930]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[931]! } + public var Checkout_PaymentMethod_Title: String { return self._s[932]! } + public var SocksProxySetup_Connection: String { return self._s[933]! } + public var Group_MessagePhotoRemoved: String { return self._s[934]! } + public var Channel_Stickers_NotFound: String { return self._s[936]! } + public var Group_About_Help: String { return self._s[937]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[938]! } + public var PeopleNearby_Title: String { return self._s[940]! } + public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[941]!, self._r[941]!, [_1]) + } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[943]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[944]! } + public var SocksProxySetup_Password: String { return self._s[945]! } + public var Notifications_PermissionsEnable: String { return self._s[946]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[948]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[948]!, self._r[948]!, [_1]) + return formatWithArgumentRanges(self._s[949]!, self._r[949]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[950]!, self._r[950]!, [_0]) + return formatWithArgumentRanges(self._s[951]!, self._r[951]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[951]! } - public var ArchivedPacksAlert_Title: String { return self._s[952]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[952]! } + public var ArchivedPacksAlert_Title: String { return self._s[953]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[953]!, self._r[953]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[954]!, self._r[954]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[954]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[956]! } - public var Conversation_StatusTyping: String { return self._s[957]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[958]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[959]! } - public var UserInfo_CreateNewContact: String { return self._s[960]! } - public var Passport_Identity_FrontSide: String { return self._s[961]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[962]! } - public var Calls_CallTabTitle: String { return self._s[963]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[964]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[955]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[957]! } + public var Conversation_StatusTyping: String { return self._s[958]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[959]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[960]! } + public var UserInfo_CreateNewContact: String { return self._s[961]! } + public var Passport_Identity_FrontSide: String { return self._s[962]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[963]! } + public var Calls_CallTabTitle: String { return self._s[964]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[965]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[965]!, self._r[965]!, [_0]) + return formatWithArgumentRanges(self._s[966]!, self._r[966]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[966]! } - public var SharedMedia_EmptyMusicText: String { return self._s[967]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[968]! } - public var Paint_Stickers: String { return self._s[969]! } - public var Privacy_GroupsAndChannels: String { return self._s[970]! } - public var UserInfo_AddContact: String { return self._s[972]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[967]! } + public var SharedMedia_EmptyMusicText: String { return self._s[968]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[969]! } + public var Paint_Stickers: String { return self._s[970]! } + public var Privacy_GroupsAndChannels: String { return self._s[971]! } + public var UserInfo_AddContact: String { return self._s[973]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[973]!, self._r[973]!, [_0]) + return formatWithArgumentRanges(self._s[974]!, self._r[974]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[975]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[976]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[977]!, self._r[977]!, [_0]) + return formatWithArgumentRanges(self._s[978]!, self._r[978]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[978]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[979]! } - public var BlockedUsers_BlockUser: String { return self._s[980]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[981]! } - public var MediaPicker_UngroupDescription: String { return self._s[982]! } - public var Watch_NoConnection: String { return self._s[983]! } - public var Month_GenSeptember: String { return self._s[984]! } - public var Conversation_ViewGroup: String { return self._s[985]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[988]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[989]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[990]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[991]! } - public var MediaPicker_CameraRoll: String { return self._s[993]! } - public var Month_GenAugust: String { return self._s[994]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[995]! } - public var SharedMedia_EmptyText: String { return self._s[996]! } - public var Map_ShareLiveLocation: String { return self._s[997]! } - public var Calls_All: String { return self._s[998]! } - public var Appearance_ThemeNight: String { return self._s[1001]! } - public var Conversation_HoldForAudio: String { return self._s[1002]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1005]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1006]! } - public var SocksProxySetup_Secret: String { return self._s[1007]! } + public var DialogList_NoMessagesTitle: String { return self._s[979]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[980]! } + public var BlockedUsers_BlockUser: String { return self._s[981]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[982]! } + public var MediaPicker_UngroupDescription: String { return self._s[983]! } + public var Watch_NoConnection: String { return self._s[984]! } + public var Month_GenSeptember: String { return self._s[985]! } + public var Conversation_ViewGroup: String { return self._s[986]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[989]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[990]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[991]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[992]! } + public var MediaPicker_CameraRoll: String { return self._s[994]! } + public var Month_GenAugust: String { return self._s[995]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[996]! } + public var SharedMedia_EmptyText: String { return self._s[997]! } + public var Map_ShareLiveLocation: String { return self._s[998]! } + public var Calls_All: String { return self._s[999]! } + public var Appearance_ThemeNight: String { return self._s[1002]! } + public var Conversation_HoldForAudio: String { return self._s[1003]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1006]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1007]! } + public var SocksProxySetup_Secret: String { return self._s[1008]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1008]!, self._r[1008]!, [_0]) + return formatWithArgumentRanges(self._s[1009]!, self._r[1009]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1010]! } - public var Conversation_Location: String { return self._s[1011]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1011]! } + public var Conversation_Location: String { return self._s[1012]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1012]!, self._r[1012]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1013]!, self._r[1013]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1014]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1015]! } - public var Notifications_PermissionsText: String { return self._s[1016]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1017]! } - public var Call_Flip: String { return self._s[1018]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1019]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1021]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1023]! } - public var Channel_TooMuchBots: String { return self._s[1025]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1026]! } - public var Login_InvalidCodeError: String { return self._s[1027]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1028]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1015]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1016]! } + public var Notifications_PermissionsText: String { return self._s[1017]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1018]! } + public var Call_Flip: String { return self._s[1019]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1020]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1022]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1024]! } + public var Channel_TooMuchBots: String { return self._s[1026]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1027]! } + public var Login_InvalidCodeError: String { return self._s[1028]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1029]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1029]!, self._r[1029]!, [_0]) - } - public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1030]!, self._r[1030]!, [_0]) } - public var Call_CallInProgressTitle: String { return self._s[1031]! } - public var Month_ShortSeptember: String { return self._s[1032]! } - public var Watch_ChannelInfo_Title: String { return self._s[1033]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1036]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1037]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1038]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1039]! } - public var PhotoEditor_CropReset: String { return self._s[1040]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1042]! } - public var Channel_Management_LabelEditor: String { return self._s[1043]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1045]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1046]! } - public var UserInfo_Title: String { return self._s[1047]! } - public var ChatList_HideAction: String { return self._s[1048]! } - public var AccessDenied_Title: String { return self._s[1049]! } - public var DialogList_SearchLabel: String { return self._s[1050]! } - public var Group_Setup_HistoryHidden: String { return self._s[1051]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1052]! } - public var State_Updating: String { return self._s[1054]! } - public var Contacts_TabTitle: String { return self._s[1055]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1057]! } - public var GroupInfo_GroupHistory: String { return self._s[1058]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1059]! } - public var Wallpaper_SetColor: String { return self._s[1060]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1061]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1062]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1063]! } - public var Contacts_NotRegisteredSection: String { return self._s[1064]! } + public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1031]!, self._r[1031]!, [_0]) + } + public var Call_CallInProgressTitle: String { return self._s[1032]! } + public var Month_ShortSeptember: String { return self._s[1033]! } + public var Watch_ChannelInfo_Title: String { return self._s[1034]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1037]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1038]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1039]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1040]! } + public var PhotoEditor_CropReset: String { return self._s[1041]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1043]! } + public var Channel_Management_LabelEditor: String { return self._s[1044]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1046]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1047]! } + public var UserInfo_Title: String { return self._s[1048]! } + public var ChatList_HideAction: String { return self._s[1049]! } + public var AccessDenied_Title: String { return self._s[1050]! } + public var DialogList_SearchLabel: String { return self._s[1051]! } + public var Group_Setup_HistoryHidden: String { return self._s[1052]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1053]! } + public var State_Updating: String { return self._s[1055]! } + public var Contacts_TabTitle: String { return self._s[1056]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1058]! } + public var GroupInfo_GroupHistory: String { return self._s[1059]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1060]! } + public var Wallpaper_SetColor: String { return self._s[1061]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1062]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1063]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1064]! } + public var Contacts_NotRegisteredSection: String { return self._s[1065]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1065]!, self._r[1065]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1066]!, self._r[1066]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1066]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1067]! } - public var SocksProxySetup_Connecting: String { return self._s[1068]! } - public var ExplicitContent_AlertChannel: String { return self._s[1069]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1070]! } - public var Conversation_Contact: String { return self._s[1071]! } - public var Login_CodeExpired: String { return self._s[1072]! } - public var Passport_DiscardMessageAction: String { return self._s[1073]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1074]! } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1075]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1076]! } - public var Month_ShortApril: String { return self._s[1077]! } - public var AuthSessions_CurrentSession: String { return self._s[1078]! } - public var WallpaperPreview_CropTopText: String { return self._s[1082]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1083]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1084]! } - public var Channel_Setup_TypePrivate: String { return self._s[1086]! } - public var Forward_ChannelReadOnly: String { return self._s[1089]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1090]! } - public var AddContact_SharedContactException: String { return self._s[1091]! } - public var UserInfo_BotPrivacy: String { return self._s[1092]! } - public var Notification_PassportValueEmail: String { return self._s[1093]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1094]! } - public var GroupPermission_NewTitle: String { return self._s[1095]! } - public var CallFeedback_ReasonDropped: String { return self._s[1096]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1097]! } - public var Channel_SignMessages_Help: String { return self._s[1099]! } - public var Undo_ChatDeleted: String { return self._s[1101]! } - public var Conversation_ChatBackground: String { return self._s[1102]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1103]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1104]! } - public var Passport_Language_pt: String { return self._s[1105]! } - public var NotificationsSound_Popcorn: String { return self._s[1108]! } - public var AutoNightTheme_Disabled: String { return self._s[1109]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1110]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1111]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1112]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1113]! } + public var Paint_Clear: String { return self._s[1067]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1068]! } + public var SocksProxySetup_Connecting: String { return self._s[1069]! } + public var ExplicitContent_AlertChannel: String { return self._s[1070]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1071]! } + public var Conversation_Contact: String { return self._s[1072]! } + public var Login_CodeExpired: String { return self._s[1073]! } + public var Passport_DiscardMessageAction: String { return self._s[1074]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1075]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1076]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1077]! } + public var Month_ShortApril: String { return self._s[1078]! } + public var AuthSessions_CurrentSession: String { return self._s[1079]! } + public var WallpaperPreview_CropTopText: String { return self._s[1083]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1084]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1085]! } + public var Channel_Setup_TypePrivate: String { return self._s[1087]! } + public var Forward_ChannelReadOnly: String { return self._s[1090]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1091]! } + public var AddContact_SharedContactException: String { return self._s[1092]! } + public var UserInfo_BotPrivacy: String { return self._s[1093]! } + public var Notification_PassportValueEmail: String { return self._s[1094]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1095]! } + public var GroupPermission_NewTitle: String { return self._s[1096]! } + public var CallFeedback_ReasonDropped: String { return self._s[1097]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1098]! } + public var Channel_SignMessages_Help: String { return self._s[1100]! } + public var Undo_ChatDeleted: String { return self._s[1102]! } + public var Conversation_ChatBackground: String { return self._s[1103]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1104]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1105]! } + public var Passport_Language_pt: String { return self._s[1106]! } + public var NotificationsSound_Popcorn: String { return self._s[1109]! } + public var AutoNightTheme_Disabled: String { return self._s[1110]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1111]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1112]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1113]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1114]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1114]!, self._r[1114]!, [_0]) + return formatWithArgumentRanges(self._s[1115]!, self._r[1115]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1115]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1116]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1118]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1116]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1117]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1119]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1119]!, self._r[1119]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1120]!, self._r[1120]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1122]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1123]! } - public var Compose_NewEncryptedChat: String { return self._s[1124]! } - public var Login_CodeFloodError: String { return self._s[1125]! } - public var Calls_TabTitle: String { return self._s[1126]! } - public var Privacy_ProfilePhoto: String { return self._s[1127]! } - public var Passport_Language_he: String { return self._s[1128]! } - public var GroupPermission_Title: String { return self._s[1129]! } + public var SocksProxySetup_Hostname: String { return self._s[1123]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1124]! } + public var Compose_NewEncryptedChat: String { return self._s[1125]! } + public var Login_CodeFloodError: String { return self._s[1126]! } + public var Calls_TabTitle: String { return self._s[1127]! } + public var Privacy_ProfilePhoto: String { return self._s[1128]! } + public var Passport_Language_he: String { return self._s[1129]! } + public var GroupPermission_Title: String { return self._s[1130]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1130]!, self._r[1130]!, [_0]) + return formatWithArgumentRanges(self._s[1131]!, self._r[1131]!, [_0]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1131]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1132]! } - public var Tour_Text1: String { return self._s[1133]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1134]! } - public var Month_ShortFebruary: String { return self._s[1135]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1136]! } - public var NotificationsSound_Glass: String { return self._s[1137]! } - public var Appearance_ThemeNightBlue: String { return self._s[1138]! } - public var CheckoutInfo_Pay: String { return self._s[1139]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1141]! } - public var Call_CallAgain: String { return self._s[1143]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1144]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1145]! } - public var Passport_InvalidPasswordError: String { return self._s[1146]! } - public var Watch_Message_Game: String { return self._s[1147]! } - public var Stickers_Install: String { return self._s[1148]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1149]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1151]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1152]! } - public var AuthSessions_OtherSessions: String { return self._s[1153]! } - public var Channel_Username_Help: String { return self._s[1154]! } - public var Camera_Title: String { return self._s[1155]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1157]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1158]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1159]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1160]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1161]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1162]! } - public var Conversation_RestrictedStickers: String { return self._s[1163]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1165]! } - public var UserInfo_TelegramCall: String { return self._s[1167]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1168]! } - public var CreatePoll_OptionsHeader: String { return self._s[1169]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1170]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1171]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1172]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1173]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1132]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1133]! } + public var Tour_Text1: String { return self._s[1134]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1135]! } + public var Month_ShortFebruary: String { return self._s[1136]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1137]! } + public var NotificationsSound_Glass: String { return self._s[1138]! } + public var Appearance_ThemeNightBlue: String { return self._s[1139]! } + public var CheckoutInfo_Pay: String { return self._s[1140]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1142]! } + public var Call_CallAgain: String { return self._s[1144]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1145]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1146]! } + public var Passport_InvalidPasswordError: String { return self._s[1147]! } + public var Watch_Message_Game: String { return self._s[1148]! } + public var Stickers_Install: String { return self._s[1149]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1150]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1152]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1153]! } + public var AuthSessions_OtherSessions: String { return self._s[1154]! } + public var Channel_Username_Help: String { return self._s[1155]! } + public var Camera_Title: String { return self._s[1156]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1158]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1159]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1160]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1161]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1162]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1163]! } + public var Conversation_RestrictedStickers: String { return self._s[1164]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1166]! } + public var UserInfo_TelegramCall: String { return self._s[1168]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1169]! } + public var CreatePoll_OptionsHeader: String { return self._s[1170]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1171]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1172]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1173]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1174]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1174]!, self._r[1174]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1175]!, self._r[1175]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1175]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1176]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1177]! } - public var Conversation_MessageDialogRetry: String { return self._s[1178]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1179]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1180]! } - public var Group_Setup_TypeHeader: String { return self._s[1181]! } - public var Paint_RecentStickers: String { return self._s[1182]! } - public var PhotoEditor_GrainTool: String { return self._s[1183]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1184]! } - public var EmptyGroupInfo_Line4: String { return self._s[1185]! } - public var Watch_AuthRequired: String { return self._s[1187]! } + public var Settings_SaveEditedPhotos: String { return self._s[1176]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1177]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1178]! } + public var Conversation_MessageDialogRetry: String { return self._s[1179]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1180]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1181]! } + public var Group_Setup_TypeHeader: String { return self._s[1182]! } + public var Paint_RecentStickers: String { return self._s[1183]! } + public var PhotoEditor_GrainTool: String { return self._s[1184]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1185]! } + public var EmptyGroupInfo_Line4: String { return self._s[1186]! } + public var Watch_AuthRequired: String { return self._s[1188]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1188]!, self._r[1188]!, [_0]) + return formatWithArgumentRanges(self._s[1189]!, self._r[1189]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1189]! } - public var ChannelIntro_Text: String { return self._s[1190]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1191]! } - public var GroupPermission_NoSendMedia: String { return self._s[1192]! } - public var Calls_AddTab: String { return self._s[1193]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1194]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1195]! } - public var Notification_MessageLifetime1d: String { return self._s[1196]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1197]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1198]! } - public var Passport_Identity_GenderFemale: String { return self._s[1199]! } - public var BlockedUsers_BlockTitle: String { return self._s[1200]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1190]! } + public var ChannelIntro_Text: String { return self._s[1191]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1192]! } + public var GroupPermission_NoSendMedia: String { return self._s[1193]! } + public var Calls_AddTab: String { return self._s[1194]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1195]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1196]! } + public var Notification_MessageLifetime1d: String { return self._s[1197]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1198]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1199]! } + public var Passport_Identity_GenderFemale: String { return self._s[1200]! } + public var BlockedUsers_BlockTitle: String { return self._s[1201]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1201]!, self._r[1201]!, [_1]) + return formatWithArgumentRanges(self._s[1202]!, self._r[1202]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1202]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1203]! } - public var ChatList_ArchiveAction: String { return self._s[1204]! } - public var AutoNightTheme_Scheduled: String { return self._s[1205]! } + public var Weekday_Yesterday: String { return self._s[1203]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1204]! } + public var ChatList_ArchiveAction: String { return self._s[1205]! } + public var AutoNightTheme_Scheduled: String { return self._s[1206]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1206]!, self._r[1206]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1207]!, self._r[1207]!, [_1, _2, _3, _4, _5, _6]) } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1207]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1208]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1208]!, self._r[1208]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1209]!, self._r[1209]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1209]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1210]! } + public var CreatePoll_Create: String { return self._s[1210]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1211]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1211]!, self._r[1211]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1212]!, self._r[1212]!, [_1, _2]) } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1212]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1214]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1213]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1215]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1215]!, self._r[1215]!, [_1]) + return formatWithArgumentRanges(self._s[1216]!, self._r[1216]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1216]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1217]! } + public var Preview_OpenInInstagram: String { return self._s[1217]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1218]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1218]!, self._r[1218]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1219]!, self._r[1219]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1219]!, self._r[1219]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1220]!, self._r[1220]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1220]! } - public var ArchivedChats_IntroText3: String { return self._s[1221]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1222]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1223]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1224]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1221]! } + public var ArchivedChats_IntroText3: String { return self._s[1222]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1223]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1224]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1225]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1225]!, self._r[1225]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1226]!, self._r[1226]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1227]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1228]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1229]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1230]! } - public var Gif_NoGifsFound: String { return self._s[1231]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1232]! } - public var GroupInfo_ActionPromote: String { return self._s[1233]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1234]! } - public var GroupInfo_Permissions_Title: String { return self._s[1235]! } - public var Permissions_ContactsText_v0: String { return self._s[1236]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1237]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1240]! } - public var Passport_FieldEmailHelp: String { return self._s[1241]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1228]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1229]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1230]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1231]! } + public var Gif_NoGifsFound: String { return self._s[1232]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1233]! } + public var GroupInfo_ActionPromote: String { return self._s[1234]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1235]! } + public var GroupInfo_Permissions_Title: String { return self._s[1236]! } + public var Permissions_ContactsText_v0: String { return self._s[1237]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1238]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1241]! } + public var Passport_FieldEmailHelp: String { return self._s[1242]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1242]!, self._r[1242]!, [_0]) + return formatWithArgumentRanges(self._s[1243]!, self._r[1243]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1243]! } - public var Weekday_ShortSaturday: String { return self._s[1244]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1245]! } - public var Watch_Conversation_UserInfo: String { return self._s[1246]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1247]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1248]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1249]! } - public var PhotoEditor_VignetteTool: String { return self._s[1250]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1251]! } - public var Passport_Language_et: String { return self._s[1252]! } - public var AppUpgrade_Running: String { return self._s[1253]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1255]! } - public var Passport_Language_bg: String { return self._s[1256]! } - public var Stickers_NoStickersFound: String { return self._s[1258]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1244]! } + public var Weekday_ShortSaturday: String { return self._s[1245]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1246]! } + public var Watch_Conversation_UserInfo: String { return self._s[1247]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1248]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1249]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1250]! } + public var PhotoEditor_VignetteTool: String { return self._s[1251]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1252]! } + public var Passport_Language_et: String { return self._s[1253]! } + public var AppUpgrade_Running: String { return self._s[1254]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1256]! } + public var Passport_Language_bg: String { return self._s[1257]! } + public var Stickers_NoStickersFound: String { return self._s[1259]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1260]!, self._r[1260]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1261]!, self._r[1261]!, [_1, _2]) } - public var Settings_About: String { return self._s[1261]! } + public var Settings_About: String { return self._s[1262]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1262]!, self._r[1262]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1263]!, self._r[1263]!, [_0, _1, _2]) } - public var KeyCommand_NewMessage: String { return self._s[1264]! } - public var Group_ErrorAddBlocked: String { return self._s[1265]! } + public var KeyCommand_NewMessage: String { return self._s[1265]! } + public var Group_ErrorAddBlocked: String { return self._s[1266]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1266]!, self._r[1266]!, [_0]) + return formatWithArgumentRanges(self._s[1267]!, self._r[1267]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1267]! } - public var ReportGroupLocation_Title: String { return self._s[1268]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1269]! } - public var Cache_ClearProgress: String { return self._s[1270]! } + public var Map_LocationTitle: String { return self._s[1268]! } + public var ReportGroupLocation_Title: String { return self._s[1269]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1270]! } + public var Cache_ClearProgress: String { return self._s[1271]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1271]!, self._r[1271]!, [_0]) + return formatWithArgumentRanges(self._s[1272]!, self._r[1272]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1272]! } - public var Passport_UpdateRequiredError: String { return self._s[1273]! } + public var GroupRemoved_AddToGroup: String { return self._s[1273]! } + public var Passport_UpdateRequiredError: String { return self._s[1274]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1274]!, self._r[1274]!, [_1]) + return formatWithArgumentRanges(self._s[1275]!, self._r[1275]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1276]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1277]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1278]! } - public var Passport_Language_ka: String { return self._s[1279]! } - public var Call_Decline: String { return self._s[1280]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1281]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1277]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1278]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1279]! } + public var Passport_Language_ka: String { return self._s[1280]! } + public var Call_Decline: String { return self._s[1281]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1282]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1284]!, self._r[1284]!, [_0]) + return formatWithArgumentRanges(self._s[1285]!, self._r[1285]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1285]! } + public var CallFeedback_Send: String { return self._s[1286]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1286]!, self._r[1286]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1287]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1289]! } - public var Passport_DeletePassport: String { return self._s[1290]! } - public var Appearance_AppIconFilled: String { return self._s[1291]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1292]! } - public var Month_ShortDecember: String { return self._s[1293]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1295]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1288]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1290]! } + public var Passport_DeletePassport: String { return self._s[1291]! } + public var Appearance_AppIconFilled: String { return self._s[1292]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1293]! } + public var Month_ShortDecember: String { return self._s[1294]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1296]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1296]!, self._r[1296]!, [_0]) + return formatWithArgumentRanges(self._s[1297]!, self._r[1297]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1297]! } - public var Conversation_EncryptedDescription1: String { return self._s[1298]! } - public var Conversation_EncryptedDescription2: String { return self._s[1299]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1300]! } - public var Conversation_EncryptedDescription3: String { return self._s[1301]! } - public var PhotoEditor_SharpenTool: String { return self._s[1302]! } + public var Channel_Stickers_Searching: String { return self._s[1298]! } + public var Conversation_EncryptedDescription1: String { return self._s[1299]! } + public var Conversation_EncryptedDescription2: String { return self._s[1300]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1301]! } + public var Conversation_EncryptedDescription3: String { return self._s[1302]! } + public var PhotoEditor_SharpenTool: String { return self._s[1303]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1303]!, self._r[1303]!, [_0]) + return formatWithArgumentRanges(self._s[1304]!, self._r[1304]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1305]! } - public var Channel_Members_AddMembers: String { return self._s[1306]! } - public var Wallpaper_Search: String { return self._s[1307]! } - public var Weekday_Friday: String { return self._s[1308]! } - public var Privacy_ContactsSync: String { return self._s[1309]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1310]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1311]! } + public var Conversation_EncryptedDescription4: String { return self._s[1306]! } + public var Channel_Members_AddMembers: String { return self._s[1307]! } + public var Wallpaper_Search: String { return self._s[1308]! } + public var Weekday_Friday: String { return self._s[1309]! } + public var Privacy_ContactsSync: String { return self._s[1310]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1311]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1312]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1312]!, self._r[1312]!, [_0]) + return formatWithArgumentRanges(self._s[1313]!, self._r[1313]!, [_0]) } - public var GroupInfo_Permissions_Removed: String { return self._s[1313]! } - public var Passport_Identity_GenderMale: String { return self._s[1314]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1314]! } + public var Passport_Identity_GenderMale: String { return self._s[1315]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1315]!, self._r[1315]!, [_0]) + return formatWithArgumentRanges(self._s[1316]!, self._r[1316]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1316]! } - public var Conversation_JumpToDate: String { return self._s[1317]! } - public var Contacts_GlobalSearch: String { return self._s[1318]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1319]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1320]! } - public var Profile_MessageLifetime1d: String { return self._s[1321]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1317]! } + public var Conversation_JumpToDate: String { return self._s[1318]! } + public var Contacts_GlobalSearch: String { return self._s[1319]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1320]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1321]! } + public var Profile_MessageLifetime1d: String { return self._s[1322]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1322]!, self._r[1322]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1323]!, self._r[1323]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1325]! } + public var StickerPack_BuiltinPackName: String { return self._s[1326]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1326]!, self._r[1326]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1327]!, self._r[1327]!, [_1, _2]) } - public var Passport_InfoTitle: String { return self._s[1328]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1329]! } + public var Passport_InfoTitle: String { return self._s[1329]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1330]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1333]!, self._r[1333]!, [_0]) + return formatWithArgumentRanges(self._s[1334]!, self._r[1334]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1334]!, self._r[1334]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1335]!, self._r[1335]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1335]! } - public var Profile_BotInfo: String { return self._s[1336]! } - public var Watch_Compose_CreateMessage: String { return self._s[1337]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1338]! } - public var Month_ShortNovember: String { return self._s[1339]! } - public var Conversation_ScamWarning: String { return self._s[1340]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1341]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1342]! } - public var NotificationsSound_Chime: String { return self._s[1343]! } - public var Passport_Language_ko: String { return self._s[1345]! } - public var InviteText_URL: String { return self._s[1346]! } - public var TextFormat_Monospace: String { return self._s[1347]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1336]! } + public var Profile_BotInfo: String { return self._s[1337]! } + public var Watch_Compose_CreateMessage: String { return self._s[1338]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1339]! } + public var Month_ShortNovember: String { return self._s[1340]! } + public var Conversation_ScamWarning: String { return self._s[1341]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1342]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1343]! } + public var NotificationsSound_Chime: String { return self._s[1344]! } + public var Passport_Language_ko: String { return self._s[1346]! } + public var InviteText_URL: String { return self._s[1347]! } + public var TextFormat_Monospace: String { return self._s[1348]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1348]!, self._r[1348]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1349]!, self._r[1349]!, [_1, _2, _3]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1349]!, self._r[1349]!, [_0]) + return formatWithArgumentRanges(self._s[1350]!, self._r[1350]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1350]!, self._r[1350]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1351]!, self._r[1351]!, [_1, _2]) } - public var Passport_InfoLearnMore: String { return self._s[1352]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1353]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1354]! } - public var Your_card_has_expired: String { return self._s[1355]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1356]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1357]! } - public var Conversation_Report: String { return self._s[1361]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1362]! } - public var Notification_MessageLifetime1m: String { return self._s[1363]! } - public var Privacy_ContactsTitle: String { return self._s[1364]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1365]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1366]! } - public var Channel_Members_Title: String { return self._s[1367]! } - public var Map_OpenInWaze: String { return self._s[1368]! } - public var Login_PhoneBannedError: String { return self._s[1369]! } + public var Passport_InfoLearnMore: String { return self._s[1353]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1354]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1355]! } + public var Your_card_has_expired: String { return self._s[1356]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1357]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1358]! } + public var Conversation_Report: String { return self._s[1362]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1363]! } + public var Notification_MessageLifetime1m: String { return self._s[1364]! } + public var Privacy_ContactsTitle: String { return self._s[1365]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1366]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1367]! } + public var Channel_Members_Title: String { return self._s[1368]! } + public var Map_OpenInWaze: String { return self._s[1369]! } + public var Login_PhoneBannedError: String { return self._s[1370]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1370]!, self._r[1370]!, [_0]) + return formatWithArgumentRanges(self._s[1371]!, self._r[1371]!, [_0]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1371]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1372]! } - public var Common_OK: String { return self._s[1373]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1374]! } - public var Cache_Music: String { return self._s[1375]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1376]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1377]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1378]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1372]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1373]! } + public var Common_OK: String { return self._s[1374]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1375]! } + public var Cache_Music: String { return self._s[1376]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1377]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1378]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1379]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1379]!, self._r[1379]!, [_1]) + return formatWithArgumentRanges(self._s[1380]!, self._r[1380]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1380]!, self._r[1380]!, [_0]) + return formatWithArgumentRanges(self._s[1381]!, self._r[1381]!, [_0]) } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1382]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1383]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1385]! } - public var State_ConnectingToProxyInfo: String { return self._s[1386]! } - public var Message_VideoMessage: String { return self._s[1388]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1389]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1390]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1391]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1392]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1393]! } - public var Activity_RecordingAudio: String { return self._s[1394]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1395]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1396]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1383]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1384]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1386]! } + public var State_ConnectingToProxyInfo: String { return self._s[1387]! } + public var Message_VideoMessage: String { return self._s[1389]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1390]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1391]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1392]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1393]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1394]! } + public var Activity_RecordingAudio: String { return self._s[1395]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1396]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1397]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1398]!, self._r[1398]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1399]!, self._r[1399]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_0]) + return formatWithArgumentRanges(self._s[1403]!, self._r[1403]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1403]! } - public var UserInfo_AddPhone: String { return self._s[1404]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1405]! } + public var Conversation_ApplyLocalization: String { return self._s[1404]! } + public var UserInfo_AddPhone: String { return self._s[1405]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1406]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1406]!, self._r[1406]!, [_0]) + return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_0]) } - public var Passport_Scans: String { return self._s[1408]! } - public var BlockedUsers_Unblock: String { return self._s[1409]! } + public var Passport_Scans: String { return self._s[1409]! } + public var BlockedUsers_Unblock: String { return self._s[1410]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1410]!, self._r[1410]!, [_1]) + return formatWithArgumentRanges(self._s[1411]!, self._r[1411]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1411]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1412]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1413]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1414]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1415]! } + public var Channel_Management_LabelCreator: String { return self._s[1412]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1413]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1414]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1415]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1416]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1416]!, self._r[1416]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1417]!, self._r[1417]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1417]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1418]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1419]! } - public var ChannelIntro_CreateChannel: String { return self._s[1420]! } - public var Conversation_UnreadMessages: String { return self._s[1421]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1422]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1423]! } - public var Notification_GroupActivated: String { return self._s[1424]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1425]! } + public var Login_PhoneNumberHelp: String { return self._s[1418]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1419]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1420]! } + public var ChannelIntro_CreateChannel: String { return self._s[1421]! } + public var Conversation_UnreadMessages: String { return self._s[1422]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1423]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1424]! } + public var Notification_GroupActivated: String { return self._s[1425]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1426]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1426]!, self._r[1426]!, [_0]) + return formatWithArgumentRanges(self._s[1427]!, self._r[1427]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1427]!, self._r[1427]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1428]!, self._r[1428]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1429]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1430]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1430]!, self._r[1430]!, [_0]) + return formatWithArgumentRanges(self._s[1431]!, self._r[1431]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1431]! } - public var CallFeedback_AddComment: String { return self._s[1432]! } + public var Undo_DeletedChannel: String { return self._s[1432]! } + public var CallFeedback_AddComment: String { return self._s[1433]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1433]!, self._r[1433]!, [_0]) + return formatWithArgumentRanges(self._s[1434]!, self._r[1434]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1434]! } + public var Document_TargetConfirmationFormat: String { return self._s[1435]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1435]!, self._r[1435]!, [_0]) + return formatWithArgumentRanges(self._s[1436]!, self._r[1436]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1436]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1437]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1437]!, self._r[1437]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1438]!, self._r[1438]!, [_1, _2, _3, _4]) } - public var Contacts_SortByName: String { return self._s[1438]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1439]! } + public var Contacts_SortByName: String { return self._s[1439]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1440]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1441]!, self._r[1441]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1442]!, self._r[1442]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1442]! } - public var Conversation_ClearSelfHistory: String { return self._s[1443]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1444]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1445]! } - public var Stickers_SuggestNone: String { return self._s[1446]! } - public var ChatSettings_Cache: String { return self._s[1447]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1448]! } - public var Media_ShareThisPhoto: String { return self._s[1449]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1450]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1451]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1452]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1453]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1454]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[1455]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1457]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1458]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1459]! } - public var Map_OpenIn: String { return self._s[1460]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1443]! } + public var Conversation_ClearSelfHistory: String { return self._s[1444]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1445]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1446]! } + public var Stickers_SuggestNone: String { return self._s[1447]! } + public var ChatSettings_Cache: String { return self._s[1448]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1449]! } + public var Media_ShareThisPhoto: String { return self._s[1450]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1451]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1452]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1453]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1454]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1455]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1456]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1458]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1459]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1460]! } + public var Map_OpenIn: String { return self._s[1461]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1463]!, self._r[1463]!, [_1]) + return formatWithArgumentRanges(self._s[1464]!, self._r[1464]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1464]!, self._r[1464]!, [_0]) + return formatWithArgumentRanges(self._s[1465]!, self._r[1465]!, [_0]) } - public var MessagePoll_LabelClosed: String { return self._s[1465]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1467]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1468]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1469]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1470]! } - public var Login_SelectCountry_Title: String { return self._s[1471]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1472]! } + public var MessagePoll_LabelClosed: String { return self._s[1466]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1468]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1469]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1470]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1471]! } + public var Login_SelectCountry_Title: String { return self._s[1472]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1473]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1473]!, self._r[1473]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1474]!, self._r[1474]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1474]! } - public var Watch_Suggestion_BRB: String { return self._s[1475]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1476]! } - public var Contacts_PermissionsTitle: String { return self._s[1477]! } - public var Conversation_RestrictedInline: String { return self._s[1478]! } - public var StickerPack_ViewPack: String { return self._s[1480]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1475]! } + public var Watch_Suggestion_BRB: String { return self._s[1476]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1477]! } + public var Contacts_PermissionsTitle: String { return self._s[1478]! } + public var Conversation_RestrictedInline: String { return self._s[1479]! } + public var StickerPack_ViewPack: String { return self._s[1481]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1481]!, self._r[1481]!, [_0]) + return formatWithArgumentRanges(self._s[1482]!, self._r[1482]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1483]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1486]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1488]! } - public var Channel_Info_Stickers: String { return self._s[1489]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1490]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1491]! } - public var Passport_DeletePersonalDetails: String { return self._s[1492]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1493]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1494]! } - public var Conversation_SearchNoResults: String { return self._s[1496]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1497]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1498]! } - public var Login_Code: String { return self._s[1499]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1500]! } - public var Weekday_ShortThursday: String { return self._s[1501]! } - public var Resolve_ErrorNotFound: String { return self._s[1503]! } - public var LastSeen_Offline: String { return self._s[1504]! } - public var PeopleNearby_NoMembers: String { return self._s[1505]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1506]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1507]! } - public var GroupInfo_Title: String { return self._s[1508]! } - public var NotificationsSound_Note: String { return self._s[1509]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1510]! } - public var Watch_Message_Poll: String { return self._s[1511]! } - public var Privacy_Calls: String { return self._s[1512]! } - public var Month_ShortAugust: String { return self._s[1513]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1514]! } - public var Notifications_Reset: String { return self._s[1515]! } - public var Conversation_Pin: String { return self._s[1516]! } - public var Passport_Language_lv: String { return self._s[1517]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1518]! } - public var BlockedUsers_Info: String { return self._s[1519]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1521]! } - public var Watch_Conversation_Unblock: String { return self._s[1523]! } + public var Compose_NewChannel: String { return self._s[1484]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1487]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1489]! } + public var Channel_Info_Stickers: String { return self._s[1490]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1491]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1492]! } + public var Passport_DeletePersonalDetails: String { return self._s[1493]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1494]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1495]! } + public var Conversation_SearchNoResults: String { return self._s[1497]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1498]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1499]! } + public var Login_Code: String { return self._s[1500]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1501]! } + public var Weekday_ShortThursday: String { return self._s[1502]! } + public var Resolve_ErrorNotFound: String { return self._s[1504]! } + public var LastSeen_Offline: String { return self._s[1505]! } + public var PeopleNearby_NoMembers: String { return self._s[1506]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1507]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1508]! } + public var GroupInfo_Title: String { return self._s[1509]! } + public var NotificationsSound_Note: String { return self._s[1510]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1511]! } + public var Watch_Message_Poll: String { return self._s[1512]! } + public var Privacy_Calls: String { return self._s[1513]! } + public var Month_ShortAugust: String { return self._s[1514]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1515]! } + public var Notifications_Reset: String { return self._s[1516]! } + public var Conversation_Pin: String { return self._s[1517]! } + public var Passport_Language_lv: String { return self._s[1518]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1519]! } + public var BlockedUsers_Info: String { return self._s[1520]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1522]! } + public var Watch_Conversation_Unblock: String { return self._s[1524]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1524]!, self._r[1524]!, [_0]) + return formatWithArgumentRanges(self._s[1525]!, self._r[1525]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1525]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1526]! } + public var CloudStorage_Title: String { return self._s[1526]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1527]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1527]!, self._r[1527]!, [_0]) + return formatWithArgumentRanges(self._s[1528]!, self._r[1528]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1528]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1529]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1530]! } - public var Passport_Address_EditBankStatement: String { return self._s[1531]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1529]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1530]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1531]! } + public var Passport_Address_EditBankStatement: String { return self._s[1532]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1532]!, self._r[1532]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1533]!, self._r[1533]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1533]! } - public var ShareMenu_Comment: String { return self._s[1534]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1535]! } - public var Notifications_PermissionsTitle: String { return self._s[1536]! } - public var GroupPermission_NoSendLinks: String { return self._s[1537]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1538]! } - public var Settings_Support: String { return self._s[1539]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1540]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1541]! } - public var Privacy_Forwards_Preview: String { return self._s[1542]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1543]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1544]! } - public var Common_Select: String { return self._s[1546]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1547]! } - public var WallpaperSearch_ColorGray: String { return self._s[1549]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1550]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1551]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1552]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1553]! } - public var Widget_AuthRequired: String { return self._s[1554]! } - public var Camera_FlashOn: String { return self._s[1555]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1556]! } - public var Watch_Suggestion_OK: String { return self._s[1557]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1534]! } + public var ShareMenu_Comment: String { return self._s[1535]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1536]! } + public var Notifications_PermissionsTitle: String { return self._s[1537]! } + public var GroupPermission_NoSendLinks: String { return self._s[1538]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1539]! } + public var Settings_Support: String { return self._s[1540]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1541]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1542]! } + public var Privacy_Forwards_Preview: String { return self._s[1543]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1544]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1545]! } + public var Common_Select: String { return self._s[1547]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1548]! } + public var WallpaperSearch_ColorGray: String { return self._s[1550]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1551]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1552]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1553]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1554]! } + public var Widget_AuthRequired: String { return self._s[1555]! } + public var Camera_FlashOn: String { return self._s[1556]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1557]! } + public var Watch_Suggestion_OK: String { return self._s[1558]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1559]!, self._r[1559]!, [_0]) + return formatWithArgumentRanges(self._s[1560]!, self._r[1560]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1561]!, self._r[1561]!, [_0]) + return formatWithArgumentRanges(self._s[1562]!, self._r[1562]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1562]! } - public var DialogList_AdLabel: String { return self._s[1563]! } - public var WatchRemote_NotificationText: String { return self._s[1564]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1565]! } - public var Conversation_ReportSpam: String { return self._s[1566]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1567]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1569]! } - public var PhoneLabel_Title: String { return self._s[1570]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1571]! } - public var Settings_ChangePhoneNumber: String { return self._s[1572]! } - public var Notifications_ExceptionsTitle: String { return self._s[1573]! } - public var Notifications_AlertTones: String { return self._s[1574]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1575]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1576]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1577]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1579]! } - public var ReportPeer_ReasonOther: String { return self._s[1580]! } - public var KeyCommand_ScrollDown: String { return self._s[1582]! } + public var TextFormat_Strikethrough: String { return self._s[1563]! } + public var DialogList_AdLabel: String { return self._s[1564]! } + public var WatchRemote_NotificationText: String { return self._s[1565]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1566]! } + public var Conversation_ReportSpam: String { return self._s[1567]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1568]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1570]! } + public var PhoneLabel_Title: String { return self._s[1571]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1572]! } + public var Settings_ChangePhoneNumber: String { return self._s[1573]! } + public var Notifications_ExceptionsTitle: String { return self._s[1574]! } + public var Notifications_AlertTones: String { return self._s[1575]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1576]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1577]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1578]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1580]! } + public var ReportPeer_ReasonOther: String { return self._s[1581]! } + public var KeyCommand_ScrollDown: String { return self._s[1583]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1583]!, self._r[1583]!, [_0]) + return formatWithArgumentRanges(self._s[1584]!, self._r[1584]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1584]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1585]! } - public var AuthSessions_LogOut: String { return self._s[1586]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1587]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1588]! } - public var Passport_Phone_Title: String { return self._s[1589]! } - public var Settings_PhoneNumber: String { return self._s[1590]! } - public var NotificationsSound_Alert: String { return self._s[1591]! } - public var WebSearch_SearchNoResults: String { return self._s[1592]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1594]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1595]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1596]! } - public var PhotoEditor_CurvesTool: String { return self._s[1597]! } - public var Checkout_PaymentMethod: String { return self._s[1599]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1585]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1586]! } + public var AuthSessions_LogOut: String { return self._s[1587]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1588]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1589]! } + public var Passport_Phone_Title: String { return self._s[1590]! } + public var Settings_PhoneNumber: String { return self._s[1591]! } + public var NotificationsSound_Alert: String { return self._s[1592]! } + public var WebSearch_SearchNoResults: String { return self._s[1593]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1595]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1596]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1597]! } + public var PhotoEditor_CurvesTool: String { return self._s[1598]! } + public var Checkout_PaymentMethod: String { return self._s[1600]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1600]!, self._r[1600]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1601]!, self._r[1601]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1601]! } - public var Camera_PhotoMode: String { return self._s[1604]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1605]! } - public var CallSettings_OnMobile: String { return self._s[1606]! } - public var Tour_Text2: String { return self._s[1607]! } + public var Contacts_AccessDeniedError: String { return self._s[1602]! } + public var Camera_PhotoMode: String { return self._s[1605]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1606]! } + public var CallSettings_OnMobile: String { return self._s[1607]! } + public var Tour_Text2: String { return self._s[1608]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1609]!, self._r[1609]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1610]! } - public var Permissions_Skip: String { return self._s[1611]! } - public var SecretImage_Title: String { return self._s[1612]! } - public var Watch_MessageView_Title: String { return self._s[1613]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1614]! } - public var AttachmentMenu_Poll: String { return self._s[1615]! } + public var DialogList_EncryptionProcessing: String { return self._s[1611]! } + public var Permissions_Skip: String { return self._s[1612]! } + public var SecretImage_Title: String { return self._s[1613]! } + public var Watch_MessageView_Title: String { return self._s[1614]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1615]! } + public var AttachmentMenu_Poll: String { return self._s[1616]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1616]!, self._r[1616]!, [_0]) + return formatWithArgumentRanges(self._s[1617]!, self._r[1617]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1617]!, self._r[1617]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1618]!, self._r[1618]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1618]! } - public var WallpaperPreview_Title: String { return self._s[1619]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1620]! } - public var Settings_ProxyConnecting: String { return self._s[1621]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1623]! } - public var Profile_MessageLifetime5s: String { return self._s[1624]! } - public var Username_InvalidCharacters: String { return self._s[1625]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1626]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1627]! } - public var Settings_AddAccount: String { return self._s[1628]! } - public var Notification_CreatedChannel: String { return self._s[1631]! } + public var Notification_CallCanceled: String { return self._s[1619]! } + public var WallpaperPreview_Title: String { return self._s[1620]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1621]! } + public var Settings_ProxyConnecting: String { return self._s[1622]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1624]! } + public var Profile_MessageLifetime5s: String { return self._s[1625]! } + public var Username_InvalidCharacters: String { return self._s[1626]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1627]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1628]! } + public var Settings_AddAccount: String { return self._s[1629]! } + public var Notification_CreatedChannel: String { return self._s[1632]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1632]!, self._r[1632]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1633]!, self._r[1633]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1634]! } - public var Contacts_TopSection: String { return self._s[1635]! } + public var Passcode_AppLockedAlert: String { return self._s[1635]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1636]! } + public var Contacts_TopSection: String { return self._s[1637]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1636]!, self._r[1636]!, [_0]) + return formatWithArgumentRanges(self._s[1638]!, self._r[1638]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1637]! } - public var UserInfo_TapToCall: String { return self._s[1638]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1640]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1641]! } - public var Common_Search: String { return self._s[1642]! } + public var ReportPeer_ReasonSpam: String { return self._s[1639]! } + public var UserInfo_TapToCall: String { return self._s[1640]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1642]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1643]! } + public var Common_Search: String { return self._s[1644]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1643]!, self._r[1643]!, [_0]) + return formatWithArgumentRanges(self._s[1645]!, self._r[1645]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1644]! } - public var Message_InvoiceLabel: String { return self._s[1645]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1646]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1647]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1646]! } + public var Message_InvoiceLabel: String { return self._s[1647]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1648]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1649]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1648]!, self._r[1648]!, [_0]) + return formatWithArgumentRanges(self._s[1650]!, self._r[1650]!, [_0]) } - public var Conversation_Info: String { return self._s[1649]! } - public var Login_InfoDeletePhoto: String { return self._s[1650]! } - public var Passport_Language_vi: String { return self._s[1652]! } - public var UserInfo_ScamUserWarning: String { return self._s[1653]! } - public var Conversation_Search: String { return self._s[1654]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1655]! } - public var ReportPeer_ReasonPornography: String { return self._s[1656]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1657]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1658]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1659]! } - public var Channel_Setup_TypeHeader: String { return self._s[1660]! } - public var AuthSessions_LoggedIn: String { return self._s[1661]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1662]! } - public var Login_SmsRequestState3: String { return self._s[1663]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1664]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1665]! } - public var Join_ChannelsTooMuch: String { return self._s[1666]! } - public var Channel_Edit_LinkItem: String { return self._s[1667]! } - public var Privacy_Calls_P2PNever: String { return self._s[1668]! } - public var Conversation_AddToReadingList: String { return self._s[1670]! } - public var Message_Animation: String { return self._s[1671]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1672]! } - public var Map_Unknown: String { return self._s[1673]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1674]! } + public var Conversation_Info: String { return self._s[1651]! } + public var Login_InfoDeletePhoto: String { return self._s[1652]! } + public var Passport_Language_vi: String { return self._s[1654]! } + public var UserInfo_ScamUserWarning: String { return self._s[1655]! } + public var Conversation_Search: String { return self._s[1656]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1657]! } + public var ReportPeer_ReasonPornography: String { return self._s[1658]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1659]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1660]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1661]! } + public var Channel_Setup_TypeHeader: String { return self._s[1662]! } + public var AuthSessions_LoggedIn: String { return self._s[1663]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1664]! } + public var Login_SmsRequestState3: String { return self._s[1665]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1666]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1667]! } + public var Join_ChannelsTooMuch: String { return self._s[1668]! } + public var Channel_Edit_LinkItem: String { return self._s[1669]! } + public var Privacy_Calls_P2PNever: String { return self._s[1670]! } + public var Conversation_AddToReadingList: String { return self._s[1672]! } + public var Message_Animation: String { return self._s[1673]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1674]! } + public var Map_Unknown: String { return self._s[1675]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1676]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1675]!, self._r[1675]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1677]!, self._r[1677]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1676]!, self._r[1676]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1678]!, self._r[1678]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1677]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1678]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1679]! } + public var Call_StatusRequesting: String { return self._s[1679]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1680]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1681]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1680]!, self._r[1680]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1682]!, self._r[1682]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1681]!, self._r[1681]!, [_0]) + return formatWithArgumentRanges(self._s[1683]!, self._r[1683]!, [_0]) } - public var Update_Skip: String { return self._s[1682]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1683]! } - public var Message_PinnedPollMessage: String { return self._s[1684]! } - public var BlockedUsers_Title: String { return self._s[1685]! } + public var Update_Skip: String { return self._s[1684]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1685]! } + public var Message_PinnedPollMessage: String { return self._s[1686]! } + public var BlockedUsers_Title: String { return self._s[1687]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1686]!, self._r[1686]!, [_1]) + return formatWithArgumentRanges(self._s[1688]!, self._r[1688]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1687]! } - public var NotificationsSound_Bell: String { return self._s[1688]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1689]! } - public var Weekday_Monday: String { return self._s[1690]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1691]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1692]! } - public var ChatSettings_Groups: String { return self._s[1693]! } - public var Your_card_was_declined: String { return self._s[1694]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1696]! } - public var ChatList_Unmute: String { return self._s[1697]! } - public var PhotoEditor_CurvesAll: String { return self._s[1698]! } - public var Weekday_ShortTuesday: String { return self._s[1699]! } - public var DialogList_Read: String { return self._s[1700]! } - public var Appearance_AppIconClassic: String { return self._s[1701]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1702]! } - public var Passport_Identity_Gender: String { return self._s[1703]! } + public var Username_CheckingUsername: String { return self._s[1689]! } + public var NotificationsSound_Bell: String { return self._s[1690]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1691]! } + public var Weekday_Monday: String { return self._s[1692]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1693]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1694]! } + public var ChatSettings_Groups: String { return self._s[1695]! } + public var Your_card_was_declined: String { return self._s[1696]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1698]! } + public var ChatList_Unmute: String { return self._s[1699]! } + public var PhotoEditor_CurvesAll: String { return self._s[1700]! } + public var Weekday_ShortTuesday: String { return self._s[1701]! } + public var DialogList_Read: String { return self._s[1702]! } + public var Appearance_AppIconClassic: String { return self._s[1703]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1704]! } + public var Passport_Identity_Gender: String { return self._s[1705]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1704]!, self._r[1704]!, [_0]) + return formatWithArgumentRanges(self._s[1706]!, self._r[1706]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1705]! } + public var Target_SelectGroup: String { return self._s[1707]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1707]!, self._r[1707]!, [_0]) + return formatWithArgumentRanges(self._s[1709]!, self._r[1709]!, [_0]) } - public var Passport_Language_en: String { return self._s[1708]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1709]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1710]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1711]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1713]! } - public var Login_InfoHelp: String { return self._s[1714]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1715]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1716]! } + public var Passport_Language_en: String { return self._s[1710]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1711]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1712]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1713]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1715]! } + public var Login_InfoHelp: String { return self._s[1716]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1717]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1718]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1717]!, self._r[1717]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1719]!, self._r[1719]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1720]! } - public var CreatePoll_Title: String { return self._s[1721]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1722]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1723]! } - public var UserInfo_GroupsInCommon: String { return self._s[1724]! } - public var Call_AudioRouteHide: String { return self._s[1725]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1727]! } + public var SocksProxySetup_AddProxy: String { return self._s[1722]! } + public var CreatePoll_Title: String { return self._s[1723]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1724]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1725]! } + public var UserInfo_GroupsInCommon: String { return self._s[1726]! } + public var Call_AudioRouteHide: String { return self._s[1727]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1729]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1728]!, self._r[1728]!, [_0]) + return formatWithArgumentRanges(self._s[1730]!, self._r[1730]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1729]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1730]! } - public var Notifications_Title: String { return self._s[1731]! } - public var Group_Username_InvalidTooShort: String { return self._s[1732]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1733]! } + public var TextFormat_Bold: String { return self._s[1731]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1732]! } + public var Notifications_Title: String { return self._s[1733]! } + public var Group_Username_InvalidTooShort: String { return self._s[1734]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1735]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1734]!, self._r[1734]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1736]!, self._r[1736]!, ["\(_0)"]) } - public var Stickers_SuggestAdded: String { return self._s[1736]! } - public var Login_CountryCode: String { return self._s[1737]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1738]! } - public var Map_GetDirections: String { return self._s[1739]! } - public var Login_PhoneFloodError: String { return self._s[1740]! } + public var Stickers_SuggestAdded: String { return self._s[1738]! } + public var Login_CountryCode: String { return self._s[1739]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1740]! } + public var Map_GetDirections: String { return self._s[1741]! } + public var Login_PhoneFloodError: String { return self._s[1742]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1741]!, self._r[1741]!, [_0]) + return formatWithArgumentRanges(self._s[1743]!, self._r[1743]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1743]! } - public var Group_Location_ChangeLocation: String { return self._s[1744]! } - public var Notification_GroupInviterSelf: String { return self._s[1745]! } - public var InstantPage_TapToOpenLink: String { return self._s[1746]! } + public var Settings_SetUsername: String { return self._s[1745]! } + public var Group_Location_ChangeLocation: String { return self._s[1746]! } + public var Notification_GroupInviterSelf: String { return self._s[1747]! } + public var InstantPage_TapToOpenLink: String { return self._s[1748]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1747]!, self._r[1747]!, [_0]) + return formatWithArgumentRanges(self._s[1749]!, self._r[1749]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1748]! } - public var SecretChat_Title: String { return self._s[1749]! } - public var Group_UpgradeNoticeText1: String { return self._s[1750]! } - public var AuthSessions_Title: String { return self._s[1751]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1750]! } + public var SecretChat_Title: String { return self._s[1751]! } + public var Group_UpgradeNoticeText1: String { return self._s[1752]! } + public var AuthSessions_Title: String { return self._s[1753]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1752]!, self._r[1752]!, [_0]) + return formatWithArgumentRanges(self._s[1754]!, self._r[1754]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1753]! } - public var Channel_About_Title: String { return self._s[1754]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1755]! } + public var PhotoEditor_CropAuto: String { return self._s[1755]! } + public var Channel_About_Title: String { return self._s[1756]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1757]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1757]!, self._r[1757]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1759]!, self._r[1759]!, ["\(_0)"]) } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1759]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1760]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1761]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1762]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1761]!, self._r[1761]!, [_1]) + return formatWithArgumentRanges(self._s[1763]!, self._r[1763]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1763]!, self._r[1763]!, [_0]) + return formatWithArgumentRanges(self._s[1765]!, self._r[1765]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1764]!, self._r[1764]!, [_0]) + return formatWithArgumentRanges(self._s[1766]!, self._r[1766]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1765]! } - public var Presence_online: String { return self._s[1767]! } - public var PasscodeSettings_Title: String { return self._s[1768]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1769]! } - public var Web_OpenExternal: String { return self._s[1770]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1772]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1773]! } - public var LocalGroup_Title: String { return self._s[1774]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1767]! } + public var Presence_online: String { return self._s[1769]! } + public var PasscodeSettings_Title: String { return self._s[1770]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1771]! } + public var Web_OpenExternal: String { return self._s[1772]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[1774]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1775]! } + public var LocalGroup_Title: String { return self._s[1776]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1775]!, self._r[1775]!, [_0]) + return formatWithArgumentRanges(self._s[1777]!, self._r[1777]!, [_0]) } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1776]! } - public var Map_YouAreHere: String { return self._s[1777]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1778]! } + public var Map_YouAreHere: String { return self._s[1779]! } public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1778]!, self._r[1778]!, [_0]) + return formatWithArgumentRanges(self._s[1780]!, self._r[1780]!, [_0]) } public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1779]!, self._r[1779]!, [_0]) + return formatWithArgumentRanges(self._s[1781]!, self._r[1781]!, [_0]) } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1780]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1781]! } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1782]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1783]! } public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1782]!, self._r[1782]!, [_0]) + return formatWithArgumentRanges(self._s[1784]!, self._r[1784]!, [_0]) } public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1783]!, self._r[1783]!, [_0]) + return formatWithArgumentRanges(self._s[1785]!, self._r[1785]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1784]! } - public var Bot_Start: String { return self._s[1785]! } + public var SocksProxySetup_Username: String { return self._s[1786]! } + public var Bot_Start: String { return self._s[1787]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1786]!, self._r[1786]!, [_0]) + return formatWithArgumentRanges(self._s[1788]!, self._r[1788]!, [_0]) } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1787]!, self._r[1787]!, [_0]) + return formatWithArgumentRanges(self._s[1789]!, self._r[1789]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1788]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1790]! } + public var Contacts_SortByPresence: String { return self._s[1790]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1792]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1791]!, self._r[1791]!, [_1, _2]) - } - public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1792]!, self._r[1792]!, [_0]) - } - public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1793]!, self._r[1793]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1794]! } - public var Login_InfoAvatarPhoto: String { return self._s[1795]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1796]! } - public var Tour_Title4: String { return self._s[1797]! } - public var Passport_Identity_Translation: String { return self._s[1798]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1799]! } - public var Login_TermsOfServiceLabel: String { return self._s[1801]! } - public var Passport_Language_it: String { return self._s[1802]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1803]! } - public var Passport_Identity_SelfieHelp: String { return self._s[1804]! } - public var Conversation_ClearAll: String { return self._s[1806]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1808]! } - public var TwoStepAuth_FloodError: String { return self._s[1809]! } + public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1794]!, self._r[1794]!, [_0]) + } + public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1795]!, self._r[1795]!, [_1, _2]) + } + public var Passport_Email_EnterOtherEmail: String { return self._s[1796]! } + public var Login_InfoAvatarPhoto: String { return self._s[1797]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[1798]! } + public var Tour_Title4: String { return self._s[1799]! } + public var Passport_Identity_Translation: String { return self._s[1800]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1801]! } + public var Login_TermsOfServiceLabel: String { return self._s[1803]! } + public var Passport_Language_it: String { return self._s[1804]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1805]! } + public var Passport_Identity_SelfieHelp: String { return self._s[1806]! } + public var Conversation_ClearAll: String { return self._s[1808]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1810]! } + public var TwoStepAuth_FloodError: String { return self._s[1811]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1810]!, self._r[1810]!, [_1]) + return formatWithArgumentRanges(self._s[1812]!, self._r[1812]!, [_1]) } - public var Paint_Delete: String { return self._s[1811]! } - public var Privacy_AddNewPeer: String { return self._s[1812]! } - public var LogoutOptions_SetPasscodeText: String { return self._s[1813]! } + public var Paint_Delete: String { return self._s[1813]! } + public var Privacy_AddNewPeer: String { return self._s[1814]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[1815]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1814]!, self._r[1814]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1816]!, self._r[1816]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[1815]! } + public var Message_PinnedAudioMessage: String { return self._s[1817]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1816]!, self._r[1816]!, [_0]) + return formatWithArgumentRanges(self._s[1818]!, self._r[1818]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[1817]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1818]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1819]! } - public var Conversation_MessageEditedLabel: String { return self._s[1820]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1821]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1822]! } + public var Notification_Mute1hMin: String { return self._s[1819]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1820]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1821]! } + public var Conversation_MessageEditedLabel: String { return self._s[1822]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1823]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[1824]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1823]!, self._r[1823]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1825]!, self._r[1825]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[1824]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1826]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1825]!, self._r[1825]!, [_1]) + return formatWithArgumentRanges(self._s[1827]!, self._r[1827]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[1826]! } - public var Month_GenOctober: String { return self._s[1827]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1828]! } - public var EnterPasscode_EnterPasscode: String { return self._s[1829]! } - public var MediaPicker_TimerTooltip: String { return self._s[1831]! } - public var SharedMedia_TitleAll: String { return self._s[1832]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1835]! } - public var Conversation_RestrictedMedia: String { return self._s[1836]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1837]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[1839]! } - public var ChangePhoneNumberCode_Called: String { return self._s[1840]! } + public var AccessDenied_LocationTracking: String { return self._s[1828]! } + public var Month_GenOctober: String { return self._s[1829]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1830]! } + public var EnterPasscode_EnterPasscode: String { return self._s[1831]! } + public var MediaPicker_TimerTooltip: String { return self._s[1833]! } + public var SharedMedia_TitleAll: String { return self._s[1834]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[1837]! } + public var Conversation_RestrictedMedia: String { return self._s[1838]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1839]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[1841]! } + public var ChangePhoneNumberCode_Called: String { return self._s[1842]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1841]!, self._r[1841]!, [_0]) + return formatWithArgumentRanges(self._s[1843]!, self._r[1843]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[1844]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[1846]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1847]! } + public var Conversation_SavedMessages: String { return self._s[1846]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[1848]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1849]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1849]!, self._r[1849]!, [_0]) + return formatWithArgumentRanges(self._s[1851]!, self._r[1851]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[1850]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1851]! } + public var ReportPeer_AlertSuccess: String { return self._s[1852]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1853]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1852]!, self._r[1852]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1854]!, self._r[1854]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[1853]! } - public var PhotoEditor_FadeTool: String { return self._s[1854]! } - public var Privacy_ContactsReset: String { return self._s[1855]! } + public var Checkout_PasswordEntry_Title: String { return self._s[1855]! } + public var PhotoEditor_FadeTool: String { return self._s[1856]! } + public var Privacy_ContactsReset: String { return self._s[1857]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1857]!, self._r[1857]!, [_0]) + return formatWithArgumentRanges(self._s[1859]!, self._r[1859]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[1858]! } - public var ChatList_Mute: String { return self._s[1859]! } - public var Permissions_CellularDataText_v0: String { return self._s[1860]! } - public var ShareMenu_SelectChats: String { return self._s[1862]! } - public var MusicPlayer_VoiceNote: String { return self._s[1863]! } - public var Conversation_RestrictedText: String { return self._s[1864]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1865]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[1866]! } - public var Cache_Videos: String { return self._s[1867]! } - public var PrivacySettings_PhoneNumber: String { return self._s[1868]! } - public var FeatureDisabled_Oops: String { return self._s[1870]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1871]! } + public var Message_PinnedVideoMessage: String { return self._s[1860]! } + public var ChatList_Mute: String { return self._s[1861]! } + public var Permissions_CellularDataText_v0: String { return self._s[1862]! } + public var ShareMenu_SelectChats: String { return self._s[1864]! } + public var MusicPlayer_VoiceNote: String { return self._s[1865]! } + public var Conversation_RestrictedText: String { return self._s[1866]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[1867]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[1868]! } + public var Cache_Videos: String { return self._s[1869]! } + public var PrivacySettings_PhoneNumber: String { return self._s[1870]! } + public var FeatureDisabled_Oops: String { return self._s[1872]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1873]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1872]!, self._r[1872]!, [_0]) + return formatWithArgumentRanges(self._s[1874]!, self._r[1874]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[1873]! } - public var GroupPermission_NoSendPolls: String { return self._s[1874]! } - public var Message_VideoExpired: String { return self._s[1876]! } - public var Notifications_Badge: String { return self._s[1877]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1878]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[1879]! } - public var Username_InvalidTooShort: String { return self._s[1880]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1881]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1882]! } - public var ArchivedChats_IntroTitle3: String { return self._s[1883]! } + public var Stickers_GroupStickersHelp: String { return self._s[1875]! } + public var GroupPermission_NoSendPolls: String { return self._s[1876]! } + public var Message_VideoExpired: String { return self._s[1878]! } + public var Notifications_Badge: String { return self._s[1879]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1880]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[1881]! } + public var Username_InvalidTooShort: String { return self._s[1882]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[1883]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1884]! } + public var ArchivedChats_IntroTitle3: String { return self._s[1885]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_1]) + return formatWithArgumentRanges(self._s[1886]!, self._r[1886]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[1885]! } - public var Conversation_DefaultRestrictedText: String { return self._s[1886]! } - public var SharedMedia_CategoryDocs: String { return self._s[1889]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[1887]! } + public var Conversation_DefaultRestrictedText: String { return self._s[1888]! } + public var SharedMedia_CategoryDocs: String { return self._s[1891]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, [_1]) + return formatWithArgumentRanges(self._s[1892]!, self._r[1892]!, [_1]) } - public var Privacy_Forwards_NeverLink: String { return self._s[1892]! } + public var Privacy_Forwards_NeverLink: String { return self._s[1894]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1893]!, self._r[1893]!, [_1]) + return formatWithArgumentRanges(self._s[1895]!, self._r[1895]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1894]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1896]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1895]!, self._r[1895]!, [_0]) + return formatWithArgumentRanges(self._s[1897]!, self._r[1897]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[1896]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1897]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[1898]! } - public var Channel_UpdatePhotoItem: String { return self._s[1899]! } - public var GroupInfo_LeftStatus: String { return self._s[1900]! } - public var Watch_MessageView_Forward: String { return self._s[1902]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[1903]! } - public var Cache_ClearEmpty: String { return self._s[1905]! } - public var Localization_LanguageName: String { return self._s[1906]! } - public var WebSearch_GIFs: String { return self._s[1907]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1908]! } - public var Username_InvalidStartsWithNumber: String { return self._s[1909]! } - public var Common_Back: String { return self._s[1910]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[1911]! } + public var ChatSettings_PrivateChats: String { return self._s[1898]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[1899]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[1900]! } + public var Channel_UpdatePhotoItem: String { return self._s[1901]! } + public var GroupInfo_LeftStatus: String { return self._s[1902]! } + public var Watch_MessageView_Forward: String { return self._s[1904]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[1905]! } + public var Cache_ClearEmpty: String { return self._s[1907]! } + public var Localization_LanguageName: String { return self._s[1908]! } + public var WebSearch_GIFs: String { return self._s[1909]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1910]! } + public var Username_InvalidStartsWithNumber: String { return self._s[1911]! } + public var Common_Back: String { return self._s[1912]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[1913]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1912]!, self._r[1912]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1914]!, self._r[1914]!, [_1, _2]) } - public var Passport_Email_Help: String { return self._s[1913]! } - public var Watch_Conversation_Reply: String { return self._s[1915]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[1917]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[1918]! } - public var Channel_BanUser_Unban: String { return self._s[1920]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[1921]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[1922]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[1924]! } - public var Passport_Identity_Name: String { return self._s[1925]! } + public var Passport_Email_Help: String { return self._s[1915]! } + public var Watch_Conversation_Reply: String { return self._s[1917]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[1919]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[1920]! } + public var Channel_BanUser_Unban: String { return self._s[1922]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[1923]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[1924]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[1926]! } + public var Passport_Identity_Name: String { return self._s[1927]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1926]!, self._r[1926]!, [_0]) + return formatWithArgumentRanges(self._s[1928]!, self._r[1928]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[1927]! } - public var Conversation_BlockUser: String { return self._s[1928]! } - public var Month_GenJanuary: String { return self._s[1929]! } - public var ChatSettings_TextSize: String { return self._s[1930]! } - public var Notification_PassportValuePhone: String { return self._s[1931]! } - public var Passport_Language_ne: String { return self._s[1932]! } - public var Notification_CallBack: String { return self._s[1933]! } - public var TwoStepAuth_EmailHelp: String { return self._s[1934]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[1929]! } + public var Conversation_BlockUser: String { return self._s[1930]! } + public var Month_GenJanuary: String { return self._s[1931]! } + public var ChatSettings_TextSize: String { return self._s[1932]! } + public var Notification_PassportValuePhone: String { return self._s[1933]! } + public var Passport_Language_ne: String { return self._s[1934]! } + public var Notification_CallBack: String { return self._s[1935]! } + public var TwoStepAuth_EmailHelp: String { return self._s[1936]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1935]!, self._r[1935]!, [_0]) + return formatWithArgumentRanges(self._s[1937]!, self._r[1937]!, [_0]) } - public var Channel_Info_Management: String { return self._s[1936]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[1937]! } - public var Stickers_FrequentlyUsed: String { return self._s[1938]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[1939]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1941]! } + public var Channel_Info_Management: String { return self._s[1938]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[1939]! } + public var Stickers_FrequentlyUsed: String { return self._s[1940]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[1941]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1943]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1942]!, self._r[1942]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[1944]!, self._r[1944]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[1943]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[1944]! } - public var CreatePoll_TextHeader: String { return self._s[1945]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[1945]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[1946]! } + public var CreatePoll_TextHeader: String { return self._s[1947]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1946]!, self._r[1946]!, [_0]) + return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[1947]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[1948]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[1950]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[1951]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[1952]! } + public var PhotoEditor_QualityMedium: String { return self._s[1949]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[1950]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[1952]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[1953]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[1954]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_0]) + return formatWithArgumentRanges(self._s[1955]!, self._r[1955]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1954]!, self._r[1954]!, [_1]) + return formatWithArgumentRanges(self._s[1956]!, self._r[1956]!, [_1]) } - public var Conversation_LinkDialogOpen: String { return self._s[1956]! } - public var Settings_Username: String { return self._s[1957]! } - public var Conversation_Block: String { return self._s[1959]! } - public var Wallpaper_Wallpaper: String { return self._s[1960]! } - public var SocksProxySetup_UseProxy: String { return self._s[1962]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[1963]! } - public var MessageTimer_Forever: String { return self._s[1964]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[1965]! } - public var PhotoEditor_DiscardChanges: String { return self._s[1966]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1967]! } - public var Passport_Language_da: String { return self._s[1968]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[1969]! } + public var Conversation_LinkDialogOpen: String { return self._s[1958]! } + public var Settings_Username: String { return self._s[1959]! } + public var Conversation_Block: String { return self._s[1961]! } + public var Wallpaper_Wallpaper: String { return self._s[1962]! } + public var SocksProxySetup_UseProxy: String { return self._s[1964]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[1965]! } + public var MessageTimer_Forever: String { return self._s[1966]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[1967]! } + public var PhotoEditor_DiscardChanges: String { return self._s[1968]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1969]! } + public var Passport_Language_da: String { return self._s[1970]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[1971]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1970]!, self._r[1970]!, [_0]) + return formatWithArgumentRanges(self._s[1972]!, self._r[1972]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[1971]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[1973]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1973]!, self._r[1973]!, [_0]) + return formatWithArgumentRanges(self._s[1975]!, self._r[1975]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[1975]! } - public var Conversation_SearchByName_Prefix: String { return self._s[1976]! } - public var Conversation_PinnedPoll: String { return self._s[1977]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[1978]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[1977]! } + public var Conversation_SearchByName_Prefix: String { return self._s[1978]! } + public var Conversation_PinnedPoll: String { return self._s[1979]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[1980]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1979]!, self._r[1979]!, [_1]) + return formatWithArgumentRanges(self._s[1981]!, self._r[1981]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[1980]! } - public var Cache_ByPeerHeader: String { return self._s[1981]! } + public var WallpaperSearch_ColorPurple: String { return self._s[1982]! } + public var Cache_ByPeerHeader: String { return self._s[1983]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1982]!, self._r[1982]!, [_0]) + return formatWithArgumentRanges(self._s[1984]!, self._r[1984]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[1983]! } - public var Notification_PinnedMessage: String { return self._s[1986]! } - public var Contacts_SortBy: String { return self._s[1988]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[1985]! } + public var Notification_PinnedMessage: String { return self._s[1988]! } + public var Contacts_SortBy: String { return self._s[1990]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1989]!, self._r[1989]!, [_1]) + return formatWithArgumentRanges(self._s[1991]!, self._r[1991]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1991]!, self._r[1991]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1993]!, self._r[1993]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[1992]! } - public var Watch_UserInfo_Service: String { return self._s[1993]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[1995]! } - public var Conversation_Unpin: String { return self._s[1997]! } - public var CancelResetAccount_Title: String { return self._s[1998]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[1999]! } + public var Call_EncryptionKey_Title: String { return self._s[1994]! } + public var Watch_UserInfo_Service: String { return self._s[1995]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[1997]! } + public var Conversation_Unpin: String { return self._s[1999]! } + public var CancelResetAccount_Title: String { return self._s[2000]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2001]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2001]!, self._r[2001]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2003]!, self._r[2003]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2002]! } - public var CallSettings_Title: String { return self._s[2003]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2004]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2006]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2007]! } - public var Passport_Identity_DocumentDetails: String { return self._s[2008]! } - public var LoginPassword_PasswordHelp: String { return self._s[2009]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2010]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2011]! } - public var Checkout_TotalPaidAmount: String { return self._s[2012]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2004]! } + public var CallSettings_Title: String { return self._s[2005]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2006]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2008]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2009]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2010]! } + public var LoginPassword_PasswordHelp: String { return self._s[2011]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2012]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2013]! } + public var Checkout_TotalPaidAmount: String { return self._s[2014]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2013]!, self._r[2013]!, [_0]) + return formatWithArgumentRanges(self._s[2015]!, self._r[2015]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2014]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2016]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2017]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2016]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2018]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2019]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2018]!, self._r[2018]!, [_1]) + return formatWithArgumentRanges(self._s[2020]!, self._r[2020]!, [_1]) } - public var Contacts_InviteFriends: String { return self._s[2020]! } - public var Map_ChooseLocationTitle: String { return self._s[2021]! } - public var Conversation_StopPoll: String { return self._s[2023]! } + public var Contacts_InviteFriends: String { return self._s[2022]! } + public var Map_ChooseLocationTitle: String { return self._s[2023]! } + public var Conversation_StopPoll: String { return self._s[2025]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2024]!, self._r[2024]!, [_0]) + return formatWithArgumentRanges(self._s[2026]!, self._r[2026]!, [_0]) } - public var Call_Camera: String { return self._s[2025]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2026]! } - public var Calls_RatingFeedback: String { return self._s[2027]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2028]! } - public var NotificationsSound_Pulse: String { return self._s[2029]! } - public var Watch_LastSeen_Lately: String { return self._s[2030]! } - public var ReportGroupLocation_Report: String { return self._s[2033]! } - public var Widget_NoUsers: String { return self._s[2034]! } - public var Conversation_UnvotePoll: String { return self._s[2035]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2037]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2038]! } - public var NotificationsSound_Circles: String { return self._s[2039]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2041]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2042]! } - public var Proxy_TooltipUnavailable: String { return self._s[2043]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2045]! } - public var Conversation_FileDropbox: String { return self._s[2047]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2048]! } - public var Tour_Text3: String { return self._s[2050]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2052]! } - public var GroupPermission_NoSendMessages: String { return self._s[2053]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2054]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2055]! } + public var Call_Camera: String { return self._s[2027]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2028]! } + public var Calls_RatingFeedback: String { return self._s[2029]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2030]! } + public var NotificationsSound_Pulse: String { return self._s[2031]! } + public var Watch_LastSeen_Lately: String { return self._s[2032]! } + public var ReportGroupLocation_Report: String { return self._s[2035]! } + public var Widget_NoUsers: String { return self._s[2036]! } + public var Conversation_UnvotePoll: String { return self._s[2037]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2039]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2040]! } + public var NotificationsSound_Circles: String { return self._s[2041]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2043]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2044]! } + public var Proxy_TooltipUnavailable: String { return self._s[2045]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2047]! } + public var Conversation_FileDropbox: String { return self._s[2049]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2050]! } + public var Tour_Text3: String { return self._s[2052]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2054]! } + public var GroupPermission_NoSendMessages: String { return self._s[2055]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2056]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2057]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2057]!, self._r[2057]!, [_0]) + return formatWithArgumentRanges(self._s[2059]!, self._r[2059]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2058]! } - public var Checkout_ShippingOption_Title: String { return self._s[2059]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2060]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2060]! } + public var Checkout_ShippingOption_Title: String { return self._s[2061]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2062]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2061]!, self._r[2061]!, [_0]) + return formatWithArgumentRanges(self._s[2063]!, self._r[2063]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2062]!, self._r[2062]!, [_0]) + return formatWithArgumentRanges(self._s[2064]!, self._r[2064]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2063]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2064]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2065]! } - public var AutoDownloadSettings_Photos: String { return self._s[2067]! } - public var Appearance_PreviewIncomingText: String { return self._s[2068]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2069]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2070]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2071]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2072]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2073]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2074]! } - public var Notification_SecretChatScreenshot: String { return self._s[2075]! } - public var AccessDenied_Wallpapers: String { return self._s[2076]! } - public var Passport_Address_City: String { return self._s[2078]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2079]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2080]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2081]! } - public var AccessDenied_LocationDisabled: String { return self._s[2082]! } - public var Group_Location_Title: String { return self._s[2083]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2085]! } - public var GroupInfo_Sound: String { return self._s[2086]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2087]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2088]! } - public var Contacts_Title: String { return self._s[2089]! } - public var Passport_Language_fr: String { return self._s[2090]! } - public var Notifications_ResetAllNotifications: String { return self._s[2091]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2094]! } - public var Checkout_NewCard_Title: String { return self._s[2095]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2096]! } - public var Conversation_ForwardChats: String { return self._s[2097]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2099]! } - public var Settings_FAQ: String { return self._s[2101]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2102]! } - public var Conversation_ContextMenuForward: String { return self._s[2103]! } - public var PrivacyPolicy_Title: String { return self._s[2108]! } - public var Notifications_TextTone: String { return self._s[2109]! } - public var Profile_CreateNewContact: String { return self._s[2110]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2111]! } - public var Call_Speaker: String { return self._s[2113]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2114]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2116]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2117]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2065]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2066]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2067]! } + public var AutoDownloadSettings_Photos: String { return self._s[2069]! } + public var Appearance_PreviewIncomingText: String { return self._s[2070]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2071]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2072]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2073]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2074]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2075]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2076]! } + public var Notification_SecretChatScreenshot: String { return self._s[2077]! } + public var AccessDenied_Wallpapers: String { return self._s[2078]! } + public var Passport_Address_City: String { return self._s[2080]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2081]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2082]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2083]! } + public var AccessDenied_LocationDisabled: String { return self._s[2084]! } + public var Group_Location_Title: String { return self._s[2085]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2087]! } + public var GroupInfo_Sound: String { return self._s[2088]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2089]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2090]! } + public var Contacts_Title: String { return self._s[2091]! } + public var Passport_Language_fr: String { return self._s[2092]! } + public var Notifications_ResetAllNotifications: String { return self._s[2093]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2096]! } + public var Checkout_NewCard_Title: String { return self._s[2097]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2098]! } + public var Conversation_ForwardChats: String { return self._s[2099]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2101]! } + public var Settings_FAQ: String { return self._s[2103]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2104]! } + public var Conversation_ContextMenuForward: String { return self._s[2105]! } + public var PrivacyPolicy_Title: String { return self._s[2110]! } + public var Notifications_TextTone: String { return self._s[2111]! } + public var Profile_CreateNewContact: String { return self._s[2112]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2113]! } + public var Call_Speaker: String { return self._s[2115]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2116]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2118]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2119]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2118]!, self._r[2118]!, [_0]) + return formatWithArgumentRanges(self._s[2120]!, self._r[2120]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2119]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2120]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2121]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2122]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2123]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2124]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2125]! } - public var Bot_Unblock: String { return self._s[2126]! } - public var TextFormat_Italic: String { return self._s[2127]! } - public var WallpaperSearch_ColorPink: String { return self._s[2128]! } - public var Settings_About_Help: String { return self._s[2129]! } - public var SearchImages_Title: String { return self._s[2130]! } - public var Weekday_Wednesday: String { return self._s[2131]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2132]! } - public var ExplicitContent_AlertTitle: String { return self._s[2133]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2121]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2122]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2123]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2124]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2125]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2126]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2127]! } + public var Bot_Unblock: String { return self._s[2128]! } + public var TextFormat_Italic: String { return self._s[2129]! } + public var WallpaperSearch_ColorPink: String { return self._s[2130]! } + public var Settings_About_Help: String { return self._s[2131]! } + public var SearchImages_Title: String { return self._s[2132]! } + public var Weekday_Wednesday: String { return self._s[2133]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2134]! } + public var ExplicitContent_AlertTitle: String { return self._s[2135]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2134]!, self._r[2134]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2136]!, self._r[2136]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2135]! } - public var Weekday_Thursday: String { return self._s[2136]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2137]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2138]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2137]! } + public var Weekday_Thursday: String { return self._s[2138]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2139]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2140]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2139]!, self._r[2139]!, [_0]) + return formatWithArgumentRanges(self._s[2141]!, self._r[2141]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2140]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2141]! } - public var Passport_RequestedInformation: String { return self._s[2142]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2143]! } - public var Conversation_EncryptionProcessing: String { return self._s[2145]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2146]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2148]! } - public var Channel_Setup_Title: String { return self._s[2149]! } - public var Conversation_SearchPlaceholder: String { return self._s[2150]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2151]! } - public var Checkout_ErrorGeneric: String { return self._s[2152]! } - public var Passport_Language_hu: String { return self._s[2153]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2142]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2143]! } + public var Passport_RequestedInformation: String { return self._s[2144]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2145]! } + public var Conversation_EncryptionProcessing: String { return self._s[2147]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2148]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2150]! } + public var Channel_Setup_Title: String { return self._s[2151]! } + public var Conversation_SearchPlaceholder: String { return self._s[2152]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2153]! } + public var Checkout_ErrorGeneric: String { return self._s[2154]! } + public var Passport_Language_hu: String { return self._s[2155]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2155]!, self._r[2155]!, [_0]) + return formatWithArgumentRanges(self._s[2157]!, self._r[2157]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2158]!, self._r[2158]!, [_1]) + return formatWithArgumentRanges(self._s[2160]!, self._r[2160]!, [_1]) } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2159]!, self._r[2159]!, [_0]) + return formatWithArgumentRanges(self._s[2161]!, self._r[2161]!, [_0]) } - public var Group_Location_Info: String { return self._s[2160]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2161]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2162]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2163]! } + public var Group_Location_Info: String { return self._s[2162]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2163]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2164]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2165]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2164]!, self._r[2164]!, [_0]) + return formatWithArgumentRanges(self._s[2166]!, self._r[2166]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2165]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2166]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2167]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2167]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2168]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2169]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2168]!, self._r[2168]!, [_0]) + return formatWithArgumentRanges(self._s[2170]!, self._r[2170]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2169]! } - public var Message_PinnedAnimationMessage: String { return self._s[2171]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2173]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2174]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2176]! } - public var Embed_PlayingInPIP: String { return self._s[2177]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2178]! } + public var Passport_Language_cs: String { return self._s[2171]! } + public var Message_PinnedAnimationMessage: String { return self._s[2173]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2175]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2176]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2178]! } + public var Embed_PlayingInPIP: String { return self._s[2179]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2180]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2179]!, self._r[2179]!, [_0]) + return formatWithArgumentRanges(self._s[2181]!, self._r[2181]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2180]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2182]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2181]!, self._r[2181]!, [_1]) + return formatWithArgumentRanges(self._s[2183]!, self._r[2183]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2182]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2183]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2184]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2185]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2186]! } + public var Notification_PaymentSent: String { return self._s[2184]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2185]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2186]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2187]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2188]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2189]!, self._r[2189]!, [_1]) - } - public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2190]!, self._r[2190]!, [_1]) - } - public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2191]!, self._r[2191]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2193]! } - public var PasscodeSettings_HelpTop: String { return self._s[2194]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2195]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2196]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2197]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2198]! } - public var Call_Accept: String { return self._s[2200]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2201]! } - public var Month_GenMarch: String { return self._s[2203]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2204]! } - public var LoginPassword_Title: String { return self._s[2205]! } - public var Call_End: String { return self._s[2206]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2207]! } - public var CallSettings_Always: String { return self._s[2208]! } - public var CallFeedback_Success: String { return self._s[2209]! } - public var TwoStepAuth_SetupHint: String { return self._s[2210]! } + public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2192]!, self._r[2192]!, [_1]) + } + public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2193]!, self._r[2193]!, [_1]) + } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2195]! } + public var PasscodeSettings_HelpTop: String { return self._s[2196]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2197]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2198]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2199]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2200]! } + public var Call_Accept: String { return self._s[2202]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2203]! } + public var Month_GenMarch: String { return self._s[2205]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2206]! } + public var LoginPassword_Title: String { return self._s[2207]! } + public var Call_End: String { return self._s[2208]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2209]! } + public var CallSettings_Always: String { return self._s[2210]! } + public var CallFeedback_Success: String { return self._s[2211]! } + public var TwoStepAuth_SetupHint: String { return self._s[2212]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2211]!, self._r[2211]!, [_1]) + return formatWithArgumentRanges(self._s[2213]!, self._r[2213]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2212]! } - public var Login_PhoneTitle: String { return self._s[2213]! } - public var Passport_FieldPhoneHelp: String { return self._s[2214]! } - public var Weekday_ShortSunday: String { return self._s[2215]! } - public var Passport_InfoFAQ_URL: String { return self._s[2216]! } - public var ContactInfo_Job: String { return self._s[2218]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2219]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2220]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2221]! } - public var Invite_ChannelsTooMuch: String { return self._s[2222]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2223]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2224]! } - public var CallFeedback_ReasonNoise: String { return self._s[2225]! } - public var Appearance_AppIconDefault: String { return self._s[2227]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2228]! } - public var MediaPicker_AddCaption: String { return self._s[2229]! } - public var CallSettings_TabIconDescription: String { return self._s[2230]! } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2231]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2232]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2233]! } - public var DialogList_SearchSectionRecent: String { return self._s[2234]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2235]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2238]! } - public var LastSeen_WithinAWeek: String { return self._s[2239]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2240]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2242]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2214]! } + public var Login_PhoneTitle: String { return self._s[2215]! } + public var Passport_FieldPhoneHelp: String { return self._s[2216]! } + public var Weekday_ShortSunday: String { return self._s[2217]! } + public var Passport_InfoFAQ_URL: String { return self._s[2218]! } + public var ContactInfo_Job: String { return self._s[2220]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2221]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2222]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2223]! } + public var Invite_ChannelsTooMuch: String { return self._s[2224]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2225]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2226]! } + public var CallFeedback_ReasonNoise: String { return self._s[2227]! } + public var Appearance_AppIconDefault: String { return self._s[2229]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2230]! } + public var MediaPicker_AddCaption: String { return self._s[2231]! } + public var CallSettings_TabIconDescription: String { return self._s[2232]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2233]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2234]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2235]! } + public var DialogList_SearchSectionRecent: String { return self._s[2236]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2237]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2240]! } + public var LastSeen_WithinAWeek: String { return self._s[2241]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2242]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2244]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2243]!, self._r[2243]!, [_0]) + return formatWithArgumentRanges(self._s[2245]!, self._r[2245]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2244]! } - public var Conversation_StatusLeftGroup: String { return self._s[2245]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2246]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2248]! } - public var GroupPermission_AddSuccess: String { return self._s[2249]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2251]! } - public var Conversation_ContextMenuCopy: String { return self._s[2252]! } - public var AccessDenied_CallMicrophone: String { return self._s[2253]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2246]! } + public var Conversation_StatusLeftGroup: String { return self._s[2247]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2248]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2250]! } + public var GroupPermission_AddSuccess: String { return self._s[2251]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2253]! } + public var Conversation_ContextMenuCopy: String { return self._s[2254]! } + public var AccessDenied_CallMicrophone: String { return self._s[2255]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2254]!, self._r[2254]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2256]!, self._r[2256]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2255]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2256]! } - public var Checkout_PaymentMethod_New: String { return self._s[2257]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2258]! } - public var PhotoEditor_QualityTool: String { return self._s[2259]! } - public var Login_SendCodeViaSms: String { return self._s[2260]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2261]! } - public var Login_EmailNotConfiguredError: String { return self._s[2262]! } - public var SocksProxySetup_Status: String { return self._s[2263]! } - public var PrivacyPolicy_Accept: String { return self._s[2264]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2265]! } - public var Appearance_AppIconClassicX: String { return self._s[2266]! } + public var Login_InvalidFirstNameError: String { return self._s[2257]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2258]! } + public var Checkout_PaymentMethod_New: String { return self._s[2259]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2260]! } + public var PhotoEditor_QualityTool: String { return self._s[2261]! } + public var Login_SendCodeViaSms: String { return self._s[2262]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2263]! } + public var Login_EmailNotConfiguredError: String { return self._s[2264]! } + public var SocksProxySetup_Status: String { return self._s[2265]! } + public var PrivacyPolicy_Accept: String { return self._s[2266]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2267]! } + public var Appearance_AppIconClassicX: String { return self._s[2268]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2267]!, self._r[2267]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2268]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2269]! } - public var AutoNightTheme_Automatic: String { return self._s[2270]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2271]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2272]! } - public var Cache_Help: String { return self._s[2273]! } - public var Group_ErrorAccessDenied: String { return self._s[2274]! } - public var Passport_Language_fa: String { return self._s[2275]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2276]! } - public var PrivacySettings_LastSeen: String { return self._s[2277]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2270]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2271]! } + public var AutoNightTheme_Automatic: String { return self._s[2272]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2273]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2274]! } + public var Cache_Help: String { return self._s[2275]! } + public var Group_ErrorAccessDenied: String { return self._s[2276]! } + public var Passport_Language_fa: String { return self._s[2277]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2278]! } + public var PrivacySettings_LastSeen: String { return self._s[2279]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2278]!, self._r[2278]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2280]!, self._r[2280]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2282]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2283]! } - public var Profile_About: String { return self._s[2284]! } - public var Channel_About_Placeholder: String { return self._s[2285]! } - public var Login_InfoTitle: String { return self._s[2286]! } + public var Preview_SaveGif: String { return self._s[2284]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2285]! } + public var Profile_About: String { return self._s[2286]! } + public var Channel_About_Placeholder: String { return self._s[2287]! } + public var Login_InfoTitle: String { return self._s[2288]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2287]!, self._r[2287]!, [_0]) + return formatWithArgumentRanges(self._s[2289]!, self._r[2289]!, [_0]) } - public var Watch_Suggestion_CantTalk: String { return self._s[2289]! } - public var ContactInfo_Title: String { return self._s[2290]! } - public var Media_ShareThisVideo: String { return self._s[2291]! } - public var Weekday_ShortFriday: String { return self._s[2292]! } - public var AccessDenied_Contacts: String { return self._s[2293]! } - public var Notification_CallIncomingShort: String { return self._s[2294]! } - public var Group_Setup_TypePublic: String { return self._s[2295]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2296]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2297]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2300]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2301]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2302]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2303]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2304]! } - public var DialogList_Typing: String { return self._s[2305]! } - public var CallFeedback_IncludeLogs: String { return self._s[2307]! } - public var Checkout_Phone: String { return self._s[2309]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2312]! } - public var Privacy_Calls_Integration: String { return self._s[2313]! } - public var Notifications_PermissionsAllow: String { return self._s[2314]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2318]! } - public var Settings_ChatSettings: String { return self._s[2319]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2291]! } + public var ContactInfo_Title: String { return self._s[2292]! } + public var Media_ShareThisVideo: String { return self._s[2293]! } + public var Weekday_ShortFriday: String { return self._s[2294]! } + public var AccessDenied_Contacts: String { return self._s[2295]! } + public var Notification_CallIncomingShort: String { return self._s[2296]! } + public var Group_Setup_TypePublic: String { return self._s[2297]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2298]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2299]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2302]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2303]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2304]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2305]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2306]! } + public var DialogList_Typing: String { return self._s[2307]! } + public var CallFeedback_IncludeLogs: String { return self._s[2309]! } + public var Checkout_Phone: String { return self._s[2311]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2314]! } + public var Privacy_Calls_Integration: String { return self._s[2315]! } + public var Notifications_PermissionsAllow: String { return self._s[2316]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2320]! } + public var Settings_ChatSettings: String { return self._s[2321]! } public func PUSH_MESSAGE_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2320]!, self._r[2320]!, [_1]) + return formatWithArgumentRanges(self._s[2322]!, self._r[2322]!, [_1]) } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2321]!, self._r[2321]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2323]!, self._r[2323]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2323]! } + public var GroupRemoved_DeleteUser: String { return self._s[2325]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2324]!, self._r[2324]!, [_0]) + return formatWithArgumentRanges(self._s[2326]!, self._r[2326]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2325]!, self._r[2325]!, [_1]) + return formatWithArgumentRanges(self._s[2327]!, self._r[2327]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2326]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2327]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2329]! } - public var Conversation_Unblock: String { return self._s[2330]! } - public var PrivacySettings_DataSettings: String { return self._s[2331]! } - public var Group_PublicLink_Info: String { return self._s[2332]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2333]! } + public var Login_ContinueWithLocalization: String { return self._s[2328]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2329]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2331]! } + public var Conversation_Unblock: String { return self._s[2332]! } + public var PrivacySettings_DataSettings: String { return self._s[2333]! } + public var Group_PublicLink_Info: String { return self._s[2334]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2335]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2334]!, self._r[2334]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2336]!, self._r[2336]!, [_0, _1]) } - public var PrivacySettings_Passcode: String { return self._s[2337]! } - public var Call_Mute: String { return self._s[2338]! } - public var Passport_Language_dz: String { return self._s[2339]! } - public var Passport_Language_tk: String { return self._s[2340]! } + public var PrivacySettings_Passcode: String { return self._s[2339]! } + public var Call_Mute: String { return self._s[2340]! } + public var Passport_Language_dz: String { return self._s[2341]! } + public var Passport_Language_tk: String { return self._s[2342]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2341]!, self._r[2341]!, [_0]) + return formatWithArgumentRanges(self._s[2343]!, self._r[2343]!, [_0]) } - public var Settings_Search: String { return self._s[2342]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2343]! } - public var Conversation_ContextMenuReply: String { return self._s[2344]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2345]! } - public var Tour_Title1: String { return self._s[2346]! } - public var Conversation_ClearGroupHistory: String { return self._s[2348]! } - public var WallpaperPreview_Motion: String { return self._s[2349]! } + public var Settings_Search: String { return self._s[2344]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2345]! } + public var Conversation_ContextMenuReply: String { return self._s[2346]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2347]! } + public var Tour_Title1: String { return self._s[2348]! } + public var Conversation_ClearGroupHistory: String { return self._s[2350]! } + public var WallpaperPreview_Motion: String { return self._s[2351]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2350]!, self._r[2350]!, [_0]) + return formatWithArgumentRanges(self._s[2352]!, self._r[2352]!, [_0]) } - public var Call_RateCall: String { return self._s[2351]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2352]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2353]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2354]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2356]! } + public var Call_RateCall: String { return self._s[2353]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2354]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2355]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2356]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2358]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2358]!, self._r[2358]!, [_0]) + return formatWithArgumentRanges(self._s[2360]!, self._r[2360]!, [_0]) } - public var Compose_Create: String { return self._s[2359]! } - public var Contacts_InviteToTelegram: String { return self._s[2360]! } - public var GroupInfo_Notifications: String { return self._s[2361]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2363]! } - public var Month_GenApril: String { return self._s[2364]! } - public var Appearance_AutoNightTheme: String { return self._s[2365]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2367]! } - public var Login_CodeSentSms: String { return self._s[2369]! } + public var Compose_Create: String { return self._s[2361]! } + public var Contacts_InviteToTelegram: String { return self._s[2362]! } + public var GroupInfo_Notifications: String { return self._s[2363]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2365]! } + public var Month_GenApril: String { return self._s[2366]! } + public var Appearance_AutoNightTheme: String { return self._s[2367]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2369]! } + public var Login_CodeSentSms: String { return self._s[2371]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2370]!, self._r[2370]!, [_0]) + return formatWithArgumentRanges(self._s[2372]!, self._r[2372]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2371]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2372]! } - public var Passport_Language_hr: String { return self._s[2373]! } - public var Common_ActionNotAllowedError: String { return self._s[2374]! } + public var EmptyGroupInfo_Line3: String { return self._s[2373]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2374]! } + public var Passport_Language_hr: String { return self._s[2375]! } + public var Common_ActionNotAllowedError: String { return self._s[2376]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2375]!, self._r[2375]!, [_0]) + return formatWithArgumentRanges(self._s[2377]!, self._r[2377]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2376]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2377]! } - public var Privacy_SecretChatsTitle: String { return self._s[2378]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2380]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2381]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2382]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2383]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2384]! } - public var Preview_DeleteGif: String { return self._s[2385]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2386]! } - public var Group_ErrorNotMutualContact: String { return self._s[2387]! } - public var Notification_MessageLifetime5s: String { return self._s[2388]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2378]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2379]! } + public var Privacy_SecretChatsTitle: String { return self._s[2380]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2382]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2383]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2384]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2385]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2386]! } + public var Preview_DeleteGif: String { return self._s[2387]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2388]! } + public var Group_ErrorNotMutualContact: String { return self._s[2389]! } + public var Notification_MessageLifetime5s: String { return self._s[2390]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2389]!, self._r[2389]!, [_0]) + return formatWithArgumentRanges(self._s[2391]!, self._r[2391]!, [_0]) } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2391]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2392]! } - public var Passport_Address_AddBankStatement: String { return self._s[2393]! } - public var Notification_CallIncoming: String { return self._s[2394]! } - public var Compose_NewGroupTitle: String { return self._s[2395]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2397]! } - public var Passport_Address_Postcode: String { return self._s[2399]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2393]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2394]! } + public var Passport_Address_AddBankStatement: String { return self._s[2395]! } + public var Notification_CallIncoming: String { return self._s[2396]! } + public var Compose_NewGroupTitle: String { return self._s[2397]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2399]! } + public var Passport_Address_Postcode: String { return self._s[2401]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2400]!, self._r[2400]!, [_0]) + return formatWithArgumentRanges(self._s[2402]!, self._r[2402]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2401]! } - public var WallpaperColors_Title: String { return self._s[2402]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2403]! } - public var GroupPermission_Duration: String { return self._s[2404]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2403]! } + public var WallpaperColors_Title: String { return self._s[2404]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2405]! } + public var GroupPermission_Duration: String { return self._s[2406]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2405]!, self._r[2405]!, [_0]) + return formatWithArgumentRanges(self._s[2407]!, self._r[2407]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2406]! } - public var Username_Placeholder: String { return self._s[2407]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2408]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2409]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2410]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2408]! } + public var Username_Placeholder: String { return self._s[2409]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2410]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2411]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2412]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2412]!, self._r[2412]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2414]!, self._r[2414]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2413]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2414]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2415]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2416]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2417]! } - public var Conversation_ContextMenuMore: String { return self._s[2418]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2419]! } - public var CallSettings_TabIcon: String { return self._s[2420]! } - public var KeyCommand_Find: String { return self._s[2421]! } - public var Message_PinnedGame: String { return self._s[2422]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2424]! } - public var Login_CallRequestState2: String { return self._s[2426]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2428]! } + public var Passport_PasswordDescription: String { return self._s[2415]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2416]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2417]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2418]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2419]! } + public var Conversation_ContextMenuMore: String { return self._s[2420]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2421]! } + public var CallSettings_TabIcon: String { return self._s[2422]! } + public var KeyCommand_Find: String { return self._s[2423]! } + public var Message_PinnedGame: String { return self._s[2424]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2426]! } + public var Login_CallRequestState2: String { return self._s[2428]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2430]! } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2430]!, self._r[2430]!, [_0]) + return formatWithArgumentRanges(self._s[2432]!, self._r[2432]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2431]! } - public var Conversation_InstantPagePreview: String { return self._s[2432]! } + public var WallpaperPreview_Blurred: String { return self._s[2433]! } + public var Conversation_InstantPagePreview: String { return self._s[2434]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2433]!, self._r[2433]!, [_0]) + return formatWithArgumentRanges(self._s[2435]!, self._r[2435]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2436]! } - public var WallpaperSearch_ColorRed: String { return self._s[2437]! } - public var GroupPermission_NoPinMessages: String { return self._s[2438]! } - public var Passport_Language_es: String { return self._s[2439]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2441]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2442]! } + public var SecretTimer_VideoDescription: String { return self._s[2438]! } + public var WallpaperSearch_ColorRed: String { return self._s[2439]! } + public var GroupPermission_NoPinMessages: String { return self._s[2440]! } + public var Passport_Language_es: String { return self._s[2441]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2443]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2444]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2443]!, self._r[2443]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2445]!, self._r[2445]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2444]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2445]! } - public var Watch_UserInfo_Unmute: String { return self._s[2446]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2447]! } - public var AccessDenied_CameraRestricted: String { return self._s[2449]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2446]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2447]! } + public var Watch_UserInfo_Unmute: String { return self._s[2448]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2449]! } + public var AccessDenied_CameraRestricted: String { return self._s[2451]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2450]!, self._r[2450]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2452]!, self._r[2452]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2452]! } - public var Settings_CopyUsername: String { return self._s[2453]! } - public var Contacts_SearchLabel: String { return self._s[2454]! } - public var Map_OpenInYandexNavigator: String { return self._s[2456]! } - public var PasscodeSettings_EncryptData: String { return self._s[2457]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2458]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2459]! } - public var DialogList_AdNoticeAlert: String { return self._s[2460]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2462]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2463]! } - public var Localization_LanguageCustom: String { return self._s[2464]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2465]! } - public var CallFeedback_Title: String { return self._s[2466]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2469]! } - public var Conversation_InfoGroup: String { return self._s[2470]! } - public var Compose_NewMessage: String { return self._s[2471]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2472]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2473]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2474]! } + public var ChatList_ReadAll: String { return self._s[2454]! } + public var Settings_CopyUsername: String { return self._s[2455]! } + public var Contacts_SearchLabel: String { return self._s[2456]! } + public var Map_OpenInYandexNavigator: String { return self._s[2458]! } + public var PasscodeSettings_EncryptData: String { return self._s[2459]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2460]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2461]! } + public var DialogList_AdNoticeAlert: String { return self._s[2462]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2464]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2465]! } + public var Localization_LanguageCustom: String { return self._s[2466]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2467]! } + public var CallFeedback_Title: String { return self._s[2468]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2471]! } + public var Conversation_InfoGroup: String { return self._s[2472]! } + public var Compose_NewMessage: String { return self._s[2473]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2474]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2475]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2476]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2475]!, self._r[2475]!, [_0]) + return formatWithArgumentRanges(self._s[2477]!, self._r[2477]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2476]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2477]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2478]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2479]! } - public var Channel_BlackList_Title: String { return self._s[2480]! } - public var UserInfo_PhoneCall: String { return self._s[2481]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2483]! } - public var State_connecting: String { return self._s[2484]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2478]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2479]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2480]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2481]! } + public var Channel_BlackList_Title: String { return self._s[2482]! } + public var UserInfo_PhoneCall: String { return self._s[2483]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2485]! } + public var State_connecting: String { return self._s[2486]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2485]!, self._r[2485]!, [_0]) + return formatWithArgumentRanges(self._s[2487]!, self._r[2487]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2486]! } - public var Passport_Identity_EditPassport: String { return self._s[2487]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2489]! } - public var Localization_EnglishLanguageName: String { return self._s[2490]! } - public var Share_AuthDescription: String { return self._s[2491]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2492]! } - public var Passport_Identity_Surname: String { return self._s[2493]! } - public var Compose_TokenListPlaceholder: String { return self._s[2494]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2495]! } - public var Settings_AboutEmpty: String { return self._s[2496]! } - public var Conversation_Unmute: String { return self._s[2497]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2499]! } + public var Notifications_GroupNotifications: String { return self._s[2488]! } + public var Passport_Identity_EditPassport: String { return self._s[2489]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2491]! } + public var Localization_EnglishLanguageName: String { return self._s[2492]! } + public var Share_AuthDescription: String { return self._s[2493]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2494]! } + public var Passport_Identity_Surname: String { return self._s[2495]! } + public var Compose_TokenListPlaceholder: String { return self._s[2496]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2497]! } + public var Settings_AboutEmpty: String { return self._s[2498]! } + public var Conversation_Unmute: String { return self._s[2499]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2501]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2500]!, self._r[2500]!, [_1]) + return formatWithArgumentRanges(self._s[2502]!, self._r[2502]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2501]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2503]! } - public var ChatSettings_Appearance: String { return self._s[2504]! } - public var Appearance_PickAccentColor: String { return self._s[2505]! } + public var Login_CodeSentCall: String { return self._s[2503]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2505]! } + public var ChatSettings_Appearance: String { return self._s[2506]! } + public var Appearance_PickAccentColor: String { return self._s[2507]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2506]!, self._r[2506]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2508]!, self._r[2508]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2507]!, self._r[2507]!, [_1]) + return formatWithArgumentRanges(self._s[2509]!, self._r[2509]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2508]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2509]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2510]! } - public var ChatAdmins_AdminLabel: String { return self._s[2512]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2513]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2515]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2516]! } - public var Month_GenJune: String { return self._s[2517]! } - public var Watch_Location_Current: String { return self._s[2518]! } - public var Conversation_TitleMute: String { return self._s[2519]! } + public var Notification_CallMissed: String { return self._s[2510]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2511]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2512]! } + public var ChatAdmins_AdminLabel: String { return self._s[2514]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2515]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2517]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2518]! } + public var Month_GenJune: String { return self._s[2519]! } + public var Watch_Location_Current: String { return self._s[2520]! } + public var Conversation_TitleMute: String { return self._s[2521]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2520]!, self._r[2520]!, [_1]) + return formatWithArgumentRanges(self._s[2522]!, self._r[2522]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2521]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2523]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2522]!, self._r[2522]!, [_0]) + return formatWithArgumentRanges(self._s[2524]!, self._r[2524]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2523]! } - public var MaskStickerSettings_Info: String { return self._s[2524]! } + public var Call_ReportPlaceholder: String { return self._s[2525]! } + public var MaskStickerSettings_Info: String { return self._s[2526]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2525]!, self._r[2525]!, [_0]) + return formatWithArgumentRanges(self._s[2527]!, self._r[2527]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2526]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2528]! } - public var Contacts_ShareTelegram: String { return self._s[2529]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2530]! } - public var Channel_ErrorAccessDenied: String { return self._s[2531]! } - public var UserInfo_ScamBotWarning: String { return self._s[2533]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2534]! } - public var Call_ConnectionErrorTitle: String { return self._s[2535]! } - public var UserInfo_NotificationsEnable: String { return self._s[2536]! } - public var ArchivedChats_IntroText1: String { return self._s[2537]! } - public var Tour_Text4: String { return self._s[2540]! } - public var WallpaperSearch_Recent: String { return self._s[2541]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2542]! } - public var Profile_MessageLifetime2s: String { return self._s[2544]! } - public var Notification_MessageLifetime2s: String { return self._s[2545]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2528]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2530]! } + public var Contacts_ShareTelegram: String { return self._s[2531]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2532]! } + public var Channel_ErrorAccessDenied: String { return self._s[2533]! } + public var UserInfo_ScamBotWarning: String { return self._s[2535]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2536]! } + public var Call_ConnectionErrorTitle: String { return self._s[2537]! } + public var UserInfo_NotificationsEnable: String { return self._s[2538]! } + public var ArchivedChats_IntroText1: String { return self._s[2539]! } + public var Tour_Text4: String { return self._s[2542]! } + public var WallpaperSearch_Recent: String { return self._s[2543]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2544]! } + public var Profile_MessageLifetime2s: String { return self._s[2546]! } + public var Notification_MessageLifetime2s: String { return self._s[2547]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2546]!, self._r[2546]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2548]!, self._r[2548]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2547]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2548]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2549]! } + public var Cache_ClearCache: String { return self._s[2549]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2550]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2551]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2553]!, self._r[2553]!, [_0]) - } - public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2555]!, self._r[2555]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2556]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2557]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2558]! } - public var ChatList_UnarchiveAction: String { return self._s[2559]! } - public var AutoNightTheme_Title: String { return self._s[2560]! } - public var InstantPage_FeedbackButton: String { return self._s[2561]! } - public var Passport_FieldAddress: String { return self._s[2562]! } - public var Month_ShortMarch: String { return self._s[2563]! } + public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2557]!, self._r[2557]!, [_0]) + } + public var LocalGroup_Text: String { return self._s[2558]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2559]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2560]! } + public var ChatList_UnarchiveAction: String { return self._s[2561]! } + public var AutoNightTheme_Title: String { return self._s[2562]! } + public var InstantPage_FeedbackButton: String { return self._s[2563]! } + public var Passport_FieldAddress: String { return self._s[2564]! } + public var Month_ShortMarch: String { return self._s[2565]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2564]!, self._r[2564]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2566]!, self._r[2566]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2565]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2566]! } - public var Passport_FloodError: String { return self._s[2567]! } - public var SecretGif_Title: String { return self._s[2568]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2569]! } - public var Passport_Language_th: String { return self._s[2571]! } - public var Passport_Address_Address: String { return self._s[2572]! } - public var Login_InvalidLastNameError: String { return self._s[2573]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2574]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2575]! } - public var SettingsSearch_FAQ: String { return self._s[2576]! } - public var ShareMenu_Send: String { return self._s[2577]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2579]! } - public var Month_GenNovember: String { return self._s[2581]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2583]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2567]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2568]! } + public var Passport_FloodError: String { return self._s[2569]! } + public var SecretGif_Title: String { return self._s[2570]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2571]! } + public var Passport_Language_th: String { return self._s[2573]! } + public var Passport_Address_Address: String { return self._s[2574]! } + public var Login_InvalidLastNameError: String { return self._s[2575]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2576]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2577]! } + public var SettingsSearch_FAQ: String { return self._s[2578]! } + public var ShareMenu_Send: String { return self._s[2579]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2581]! } + public var Month_GenNovember: String { return self._s[2583]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2585]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2584]!, self._r[2584]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2586]!, self._r[2586]!, [_1, _2]) } - public var Checkout_Email: String { return self._s[2585]! } - public var NotificationsSound_Tritone: String { return self._s[2586]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2588]! } + public var Checkout_Email: String { return self._s[2587]! } + public var NotificationsSound_Tritone: String { return self._s[2588]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2590]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2591]!, self._r[2591]!, [_1]) + return formatWithArgumentRanges(self._s[2593]!, self._r[2593]!, [_1]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[2592]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2594]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2593]!, self._r[2593]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2595]!, self._r[2595]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[2594]! } - public var Notification_Exceptions_Add: String { return self._s[2595]! } - public var DialogList_You: String { return self._s[2596]! } - public var MediaPicker_Send: String { return self._s[2599]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2600]! } - public var Call_AudioRouteSpeaker: String { return self._s[2601]! } - public var Watch_UserInfo_Title: String { return self._s[2602]! } - public var Appearance_AccentColor: String { return self._s[2603]! } + public var ChatList_UndoArchiveTitle: String { return self._s[2596]! } + public var Notification_Exceptions_Add: String { return self._s[2597]! } + public var DialogList_You: String { return self._s[2598]! } + public var MediaPicker_Send: String { return self._s[2601]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2602]! } + public var Call_AudioRouteSpeaker: String { return self._s[2603]! } + public var Watch_UserInfo_Title: String { return self._s[2604]! } + public var Appearance_AccentColor: String { return self._s[2605]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2604]!, self._r[2604]!, [_0]) + return formatWithArgumentRanges(self._s[2606]!, self._r[2606]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2605]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2607]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2606]!, self._r[2606]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2608]!, self._r[2608]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2607]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2608]! } - public var Notification_CallOutgoing: String { return self._s[2609]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2610]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2611]! } - public var Call_RecordingDisabledMessage: String { return self._s[2612]! } - public var Message_Game: String { return self._s[2613]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2614]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2615]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2616]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2617]! } - public var Date_DialogDateFormat: String { return self._s[2618]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2619]! } - public var Notifications_InAppNotifications: String { return self._s[2620]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2609]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2610]! } + public var Notification_CallOutgoing: String { return self._s[2611]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2612]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2613]! } + public var Call_RecordingDisabledMessage: String { return self._s[2614]! } + public var Message_Game: String { return self._s[2615]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2616]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2617]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2618]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2619]! } + public var Date_DialogDateFormat: String { return self._s[2620]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2621]! } + public var Notifications_InAppNotifications: String { return self._s[2622]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2621]!, self._r[2621]!, [_0]) + return formatWithArgumentRanges(self._s[2623]!, self._r[2623]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2622]!, self._r[2622]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[2623]! } + public var NewContact_Title: String { return self._s[2625]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_0]) + return formatWithArgumentRanges(self._s[2626]!, self._r[2626]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[2625]! } + public var Conversation_ViewContactDetails: String { return self._s[2627]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2627]!, self._r[2627]!, [_1]) + return formatWithArgumentRanges(self._s[2629]!, self._r[2629]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2628]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2629]! } - public var PrivacySettings_Title: String { return self._s[2630]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2633]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2634]! } - public var Contacts_PhoneNumber: String { return self._s[2635]! } - public var Map_ShowPlaces: String { return self._s[2637]! } - public var ChatAdmins_Title: String { return self._s[2638]! } - public var InstantPage_Reference: String { return self._s[2640]! } - public var ReportGroupLocation_Text: String { return self._s[2641]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2630]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2631]! } + public var PrivacySettings_Title: String { return self._s[2632]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2635]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2636]! } + public var Contacts_PhoneNumber: String { return self._s[2637]! } + public var Map_ShowPlaces: String { return self._s[2639]! } + public var ChatAdmins_Title: String { return self._s[2640]! } + public var InstantPage_Reference: String { return self._s[2642]! } + public var ReportGroupLocation_Text: String { return self._s[2643]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2642]!, self._r[2642]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2643]! } - public var Watch_UserInfo_Block: String { return self._s[2644]! } - public var ChatSettings_Stickers: String { return self._s[2645]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2646]! } + public var Camera_FlashOff: String { return self._s[2645]! } + public var Watch_UserInfo_Block: String { return self._s[2646]! } + public var ChatSettings_Stickers: String { return self._s[2647]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2648]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2647]!, self._r[2647]!, [_0]) + return formatWithArgumentRanges(self._s[2649]!, self._r[2649]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2648]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2649]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2650]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2651]! } + public var Settings_ViewPhoto: String { return self._s[2650]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2651]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2652]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2653]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2653]!, self._r[2653]!, [_0]) + return formatWithArgumentRanges(self._s[2655]!, self._r[2655]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2654]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2655]! } + public var Privacy_DeleteDrafts: String { return self._s[2656]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2657]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2656]!, self._r[2656]!, [_0]) + return formatWithArgumentRanges(self._s[2658]!, self._r[2658]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2657]! } - public var DialogList_SavedMessages: String { return self._s[2658]! } - public var GroupInfo_UpgradeButton: String { return self._s[2659]! } - public var DialogList_Pin: String { return self._s[2661]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2659]! } + public var DialogList_SavedMessages: String { return self._s[2660]! } + public var GroupInfo_UpgradeButton: String { return self._s[2661]! } + public var DialogList_Pin: String { return self._s[2663]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2662]!, self._r[2662]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2664]!, self._r[2664]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2663]!, self._r[2663]!, [_0]) + return formatWithArgumentRanges(self._s[2665]!, self._r[2665]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2664]! } - public var UserInfo_NotificationsDisable: String { return self._s[2665]! } - public var Paint_Outlined: String { return self._s[2666]! } - public var Activity_PlayingGame: String { return self._s[2667]! } - public var SearchImages_NoImagesFound: String { return self._s[2668]! } - public var SocksProxySetup_ProxyType: String { return self._s[2669]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2671]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2672]! } - public var Settings_AppLanguage: String { return self._s[2673]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2674]! } - public var Common_ChoosePhoto: String { return self._s[2675]! } - public var CallFeedback_ReasonEcho: String { return self._s[2676]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2666]! } + public var UserInfo_NotificationsDisable: String { return self._s[2667]! } + public var Paint_Outlined: String { return self._s[2668]! } + public var Activity_PlayingGame: String { return self._s[2669]! } + public var SearchImages_NoImagesFound: String { return self._s[2670]! } + public var SocksProxySetup_ProxyType: String { return self._s[2671]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2673]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[2674]! } + public var Settings_AppLanguage: String { return self._s[2675]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[2676]! } + public var Common_ChoosePhoto: String { return self._s[2677]! } + public var CallFeedback_ReasonEcho: String { return self._s[2678]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2677]!, self._r[2677]!, [_1]) + return formatWithArgumentRanges(self._s[2679]!, self._r[2679]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2678]! } - public var Activity_UploadingVideo: String { return self._s[2679]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2680]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2681]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2682]! } - public var Checkout_PayWithTouchId: String { return self._s[2683]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2684]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2680]! } + public var Activity_UploadingVideo: String { return self._s[2681]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2682]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2683]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2684]! } + public var Checkout_PayWithTouchId: String { return self._s[2685]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2686]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2686]!, self._r[2686]!, [_1]) + return formatWithArgumentRanges(self._s[2688]!, self._r[2688]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2687]! } + public var Notifications_ExceptionsNone: String { return self._s[2689]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2688]!, self._r[2688]!, [_0]) + return formatWithArgumentRanges(self._s[2690]!, self._r[2690]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_1]) + return formatWithArgumentRanges(self._s[2691]!, self._r[2691]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2691]! } - public var Passport_Address_Region: String { return self._s[2694]! } - public var ChatList_DeleteChat: String { return self._s[2695]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2696]! } - public var PhotoEditor_TiltShift: String { return self._s[2697]! } - public var Settings_FAQ_URL: String { return self._s[2698]! } - public var Passport_Language_sl: String { return self._s[2699]! } - public var Settings_PrivacySettings: String { return self._s[2701]! } - public var SharedMedia_TitleLink: String { return self._s[2702]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[2703]! } - public var Settings_SetProfilePhoto: String { return self._s[2704]! } - public var Channel_About_Help: String { return self._s[2705]! } - public var Contacts_PermissionsEnable: String { return self._s[2706]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2707]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[2708]! } - public var CallFeedback_ReasonInterruption: String { return self._s[2710]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2711]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2712]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2713]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2714]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2716]! } - public var Map_OpenInYandexMaps: String { return self._s[2718]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2719]! } - public var PhotoEditor_SaturationTool: String { return self._s[2720]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[2693]! } + public var Passport_Address_Region: String { return self._s[2696]! } + public var ChatList_DeleteChat: String { return self._s[2697]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2698]! } + public var PhotoEditor_TiltShift: String { return self._s[2699]! } + public var Settings_FAQ_URL: String { return self._s[2700]! } + public var Passport_Language_sl: String { return self._s[2701]! } + public var Settings_PrivacySettings: String { return self._s[2703]! } + public var SharedMedia_TitleLink: String { return self._s[2704]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[2705]! } + public var Settings_SetProfilePhoto: String { return self._s[2706]! } + public var Channel_About_Help: String { return self._s[2707]! } + public var Contacts_PermissionsEnable: String { return self._s[2708]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[2709]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[2710]! } + public var CallFeedback_ReasonInterruption: String { return self._s[2712]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2713]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[2714]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[2715]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2716]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2718]! } + public var Map_OpenInYandexMaps: String { return self._s[2720]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[2721]! } + public var PhotoEditor_SaturationTool: String { return self._s[2722]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2721]!, self._r[2721]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2723]!, self._r[2723]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2722]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2723]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2724]! } - public var Appearance_TextSize: String { return self._s[2725]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[2724]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2725]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[2726]! } + public var Appearance_TextSize: String { return self._s[2727]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2726]!, self._r[2726]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2728]!, self._r[2728]!, [_1, "\(_2)"]) } - public var Channel_Username_InvalidTooShort: String { return self._s[2728]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2730]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2729]!, self._r[2729]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2731]!, self._r[2731]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2730]!, self._r[2730]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2732]!, self._r[2732]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[2731]! } - public var Passport_PassportInformation: String { return self._s[2734]! } - public var WatchRemote_AlertTitle: String { return self._s[2735]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2736]! } - public var ConvertToSupergroup_HelpText: String { return self._s[2738]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[2733]! } + public var Passport_PassportInformation: String { return self._s[2736]! } + public var WatchRemote_AlertTitle: String { return self._s[2737]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2738]! } + public var ConvertToSupergroup_HelpText: String { return self._s[2740]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2739]!, self._r[2739]!, [_0]) + return formatWithArgumentRanges(self._s[2741]!, self._r[2741]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2740]!, self._r[2740]!, [_1]) + return formatWithArgumentRanges(self._s[2742]!, self._r[2742]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2741]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2743]! } - public var AccessDenied_CameraDisabled: String { return self._s[2744]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2743]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[2745]! } + public var AccessDenied_CameraDisabled: String { return self._s[2746]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2745]!, self._r[2745]!, [_0]) + return formatWithArgumentRanges(self._s[2747]!, self._r[2747]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[2748]! } + public var PhotoEditor_ContrastTool: String { return self._s[2750]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2749]!, self._r[2749]!, [_1]) + return formatWithArgumentRanges(self._s[2751]!, self._r[2751]!, [_1]) } - public var DialogList_Draft: String { return self._s[2750]! } - public var Privacy_TopPeersDelete: String { return self._s[2752]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[2753]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2754]! } - public var WebSearch_RecentSectionClear: String { return self._s[2755]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2757]! } - public var Common_Done: String { return self._s[2759]! } - public var AuthSessions_EmptyText: String { return self._s[2760]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[2761]! } - public var Tour_Title5: String { return self._s[2762]! } + public var DialogList_Draft: String { return self._s[2752]! } + public var Privacy_TopPeersDelete: String { return self._s[2754]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[2755]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2756]! } + public var WebSearch_RecentSectionClear: String { return self._s[2757]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2759]! } + public var Common_Done: String { return self._s[2761]! } + public var AuthSessions_EmptyText: String { return self._s[2762]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[2763]! } + public var Tour_Title5: String { return self._s[2764]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2763]!, self._r[2763]!, [_0]) + return formatWithArgumentRanges(self._s[2765]!, self._r[2765]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2764]! } - public var Conversation_LinkDialogSave: String { return self._s[2765]! } - public var GroupInfo_ActionRestrict: String { return self._s[2766]! } - public var Checkout_Title: String { return self._s[2767]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2769]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2771]! } - public var Notification_RenamedGroup: String { return self._s[2772]! } - public var PeopleNearby_Groups: String { return self._s[2773]! } - public var Checkout_PayWithFaceId: String { return self._s[2774]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2775]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2777]! } - public var Checkout_WebConfirmation_Title: String { return self._s[2778]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[2779]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2766]! } + public var Conversation_LinkDialogSave: String { return self._s[2767]! } + public var GroupInfo_ActionRestrict: String { return self._s[2768]! } + public var Checkout_Title: String { return self._s[2769]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[2771]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2773]! } + public var Notification_RenamedGroup: String { return self._s[2774]! } + public var PeopleNearby_Groups: String { return self._s[2775]! } + public var Checkout_PayWithFaceId: String { return self._s[2776]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2777]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2779]! } + public var Checkout_WebConfirmation_Title: String { return self._s[2780]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2781]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2780]!, self._r[2780]!, [_0]) + return formatWithArgumentRanges(self._s[2782]!, self._r[2782]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[2782]! } + public var Profile_AddToExisting: String { return self._s[2784]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2783]!, self._r[2783]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2785]!, self._r[2785]!, [_0, _1]) } - public var Cache_Files: String { return self._s[2785]! } - public var Permissions_PrivacyPolicy: String { return self._s[2786]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2787]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2788]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2790]! } - public var Calls_NoCallsPlaceholder: String { return self._s[2792]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2793]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2795]! } + public var Cache_Files: String { return self._s[2787]! } + public var Permissions_PrivacyPolicy: String { return self._s[2788]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2789]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[2790]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2792]! } + public var Calls_NoCallsPlaceholder: String { return self._s[2794]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2795]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[2797]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2796]!, self._r[2796]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2798]!, self._r[2798]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2797]! } - public var Passport_FieldAddressHelp: String { return self._s[2798]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2799]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2799]! } + public var Passport_FieldAddressHelp: String { return self._s[2800]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2801]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2800]!, self._r[2800]!, [_0]) + return formatWithArgumentRanges(self._s[2802]!, self._r[2802]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2801]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2803]! } - public var Login_UnknownError: String { return self._s[2804]! } - public var Group_UpgradeNoticeText2: String { return self._s[2806]! } - public var Watch_Compose_AddContact: String { return self._s[2807]! } - public var Web_Error: String { return self._s[2808]! } - public var Gif_Search: String { return self._s[2809]! } - public var Profile_MessageLifetime1h: String { return self._s[2810]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2811]! } - public var Channel_Username_CheckingUsername: String { return self._s[2812]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[2813]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2814]! } - public var Channel_AboutItem: String { return self._s[2815]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2817]! } - public var GroupInfo_SharedMedia: String { return self._s[2818]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2803]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2805]! } + public var Login_UnknownError: String { return self._s[2806]! } + public var Group_UpgradeNoticeText2: String { return self._s[2808]! } + public var Watch_Compose_AddContact: String { return self._s[2809]! } + public var Web_Error: String { return self._s[2810]! } + public var Gif_Search: String { return self._s[2811]! } + public var Profile_MessageLifetime1h: String { return self._s[2812]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2813]! } + public var Channel_Username_CheckingUsername: String { return self._s[2814]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[2815]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2816]! } + public var Channel_AboutItem: String { return self._s[2817]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2819]! } + public var GroupInfo_SharedMedia: String { return self._s[2820]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2819]!, self._r[2819]!, [_1]) - } - public var Call_PhoneCallInProgressMessage: String { return self._s[2820]! } - public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2821]!, self._r[2821]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[2822]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2823]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[2824]! } - public var CreatePoll_AddOption: String { return self._s[2825]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2826]! } - public var Group_UpgradeNoticeHeader: String { return self._s[2827]! } - public var Channel_Management_AddModerator: String { return self._s[2828]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2829]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[2830]! } - public var NotificationsSound_Hello: String { return self._s[2831]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2832]! } - public var Channel_Stickers_Placeholder: String { return self._s[2834]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[2822]! } + public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2823]!, self._r[2823]!, [_1]) + } + public var ChatList_UndoArchiveRevealedText: String { return self._s[2824]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2825]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[2826]! } + public var CreatePoll_AddOption: String { return self._s[2827]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[2828]! } + public var Group_UpgradeNoticeHeader: String { return self._s[2829]! } + public var Channel_Management_AddModerator: String { return self._s[2830]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2831]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[2832]! } + public var NotificationsSound_Hello: String { return self._s[2833]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2834]! } + public var Channel_Stickers_Placeholder: String { return self._s[2836]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2835]!, self._r[2835]!, [_0]) + return formatWithArgumentRanges(self._s[2837]!, self._r[2837]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2836]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[2837]! } - public var ContactInfo_BirthdayLabel: String { return self._s[2838]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2839]! } - public var AutoDownloadSettings_Channels: String { return self._s[2840]! } - public var Passport_Language_mn: String { return self._s[2841]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2844]! } - public var Passport_Language_ja: String { return self._s[2846]! } - public var Settings_About_Title: String { return self._s[2847]! } - public var Settings_NotificationsAndSounds: String { return self._s[2848]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2849]! } - public var Settings_BlockedUsers: String { return self._s[2850]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2838]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2839]! } + public var ContactInfo_BirthdayLabel: String { return self._s[2840]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[2841]! } + public var AutoDownloadSettings_Channels: String { return self._s[2842]! } + public var Passport_Language_mn: String { return self._s[2843]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[2846]! } + public var Passport_Language_ja: String { return self._s[2848]! } + public var Settings_About_Title: String { return self._s[2849]! } + public var Settings_NotificationsAndSounds: String { return self._s[2850]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2851]! } + public var Settings_BlockedUsers: String { return self._s[2852]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2851]!, self._r[2851]!, [_0]) + return formatWithArgumentRanges(self._s[2853]!, self._r[2853]!, [_0]) } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[2852]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[2853]! } - public var Channel_Username_Title: String { return self._s[2854]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[2854]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[2855]! } + public var Channel_Username_Title: String { return self._s[2856]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2855]!, self._r[2855]!, [_0]) + return formatWithArgumentRanges(self._s[2857]!, self._r[2857]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[2857]! } - public var AppleWatch_Title: String { return self._s[2858]! } - public var Activity_RecordingVideoMessage: String { return self._s[2859]! } + public var AttachmentMenu_File: String { return self._s[2859]! } + public var AppleWatch_Title: String { return self._s[2860]! } + public var Activity_RecordingVideoMessage: String { return self._s[2861]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2860]!, self._r[2860]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2862]!, self._r[2862]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[2861]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[2862]! } - public var Profile_CreateEncryptedChatError: String { return self._s[2863]! } - public var Common_Next: String { return self._s[2865]! } - public var Channel_Stickers_YourStickers: String { return self._s[2867]! } - public var Call_AudioRouteHeadphones: String { return self._s[2868]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[2870]! } - public var Watch_Contacts_NoResults: String { return self._s[2872]! } - public var PhotoEditor_TintTool: String { return self._s[2875]! } - public var LoginPassword_ResetAccount: String { return self._s[2877]! } - public var Settings_SavedMessages: String { return self._s[2878]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[2879]! } - public var Bot_GenericSupportStatus: String { return self._s[2880]! } - public var StickerPack_Add: String { return self._s[2881]! } - public var Checkout_TotalAmount: String { return self._s[2882]! } - public var Your_cards_number_is_invalid: String { return self._s[2883]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[2884]! } + public var Weekday_Saturday: String { return self._s[2863]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[2864]! } + public var Profile_CreateEncryptedChatError: String { return self._s[2865]! } + public var Common_Next: String { return self._s[2867]! } + public var Channel_Stickers_YourStickers: String { return self._s[2869]! } + public var Call_AudioRouteHeadphones: String { return self._s[2870]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[2872]! } + public var Watch_Contacts_NoResults: String { return self._s[2874]! } + public var PhotoEditor_TintTool: String { return self._s[2877]! } + public var LoginPassword_ResetAccount: String { return self._s[2879]! } + public var Settings_SavedMessages: String { return self._s[2880]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[2881]! } + public var Bot_GenericSupportStatus: String { return self._s[2882]! } + public var StickerPack_Add: String { return self._s[2883]! } + public var Checkout_TotalAmount: String { return self._s[2884]! } + public var Your_cards_number_is_invalid: String { return self._s[2885]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[2886]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2885]!, self._r[2885]!, [_0]) + return formatWithArgumentRanges(self._s[2887]!, self._r[2887]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2886]!, self._r[2886]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2888]!, self._r[2888]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[2887]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[2889]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2889]!, self._r[2889]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2891]!, self._r[2891]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2890]!, self._r[2890]!, [_0]) + return formatWithArgumentRanges(self._s[2892]!, self._r[2892]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[2891]! } - public var StickerPack_Share: String { return self._s[2892]! } - public var Passport_DeleteAddress: String { return self._s[2893]! } - public var Settings_Passport: String { return self._s[2894]! } - public var SharedMedia_EmptyFilesText: String { return self._s[2895]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[2896]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[2897]! } - public var Contacts_PermissionsText: String { return self._s[2898]! } - public var Group_Setup_HistoryVisible: String { return self._s[2899]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[2901]! } - public var SocksProxySetup_Title: String { return self._s[2902]! } - public var Notification_Mute1h: String { return self._s[2903]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[2893]! } + public var StickerPack_Share: String { return self._s[2894]! } + public var Passport_DeleteAddress: String { return self._s[2895]! } + public var Settings_Passport: String { return self._s[2896]! } + public var SharedMedia_EmptyFilesText: String { return self._s[2897]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[2898]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[2899]! } + public var Contacts_PermissionsText: String { return self._s[2900]! } + public var Group_Setup_HistoryVisible: String { return self._s[2901]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[2903]! } + public var SocksProxySetup_Title: String { return self._s[2904]! } + public var Notification_Mute1h: String { return self._s[2905]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2904]!, self._r[2904]!, [_0]) + return formatWithArgumentRanges(self._s[2906]!, self._r[2906]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[2905]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[2907]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2906]!, self._r[2906]!, [_1]) + return formatWithArgumentRanges(self._s[2908]!, self._r[2908]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[2907]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2910]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[2912]! } - public var DialogList_NoMessagesText: String { return self._s[2913]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[2914]! } - public var Privacy_Calls_P2PHelp: String { return self._s[2915]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[2917]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[2918]! } - public var Common_TakePhotoOrVideo: String { return self._s[2919]! } - public var Call_StatusBusy: String { return self._s[2920]! } - public var Conversation_PinnedMessage: String { return self._s[2921]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[2922]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[2923]! } - public var Undo_ChatCleared: String { return self._s[2924]! } - public var AppleWatch_ReplyPresets: String { return self._s[2925]! } - public var Passport_DiscardMessageDescription: String { return self._s[2927]! } - public var Login_NetworkError: String { return self._s[2928]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[2909]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2912]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[2914]! } + public var DialogList_NoMessagesText: String { return self._s[2915]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[2916]! } + public var Privacy_Calls_P2PHelp: String { return self._s[2917]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[2919]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[2920]! } + public var Common_TakePhotoOrVideo: String { return self._s[2921]! } + public var Call_StatusBusy: String { return self._s[2922]! } + public var Conversation_PinnedMessage: String { return self._s[2923]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[2924]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[2925]! } + public var Undo_ChatCleared: String { return self._s[2926]! } + public var AppleWatch_ReplyPresets: String { return self._s[2927]! } + public var Passport_DiscardMessageDescription: String { return self._s[2929]! } + public var Login_NetworkError: String { return self._s[2930]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2929]!, self._r[2929]!, [_0]) + return formatWithArgumentRanges(self._s[2931]!, self._r[2931]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2930]!, self._r[2930]!, [_0]) + return formatWithArgumentRanges(self._s[2932]!, self._r[2932]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[2931]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2933]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[2933]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2935]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2935]!, self._r[2935]!, [_0]) + return formatWithArgumentRanges(self._s[2937]!, self._r[2937]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[2936]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[2937]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[2939]! } - public var ConversationMedia_Title: String { return self._s[2940]! } - public var EncryptionKey_Title: String { return self._s[2942]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[2943]! } - public var Notification_Exceptions_AddException: String { return self._s[2944]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[2945]! } - public var Profile_MessageLifetime1m: String { return self._s[2946]! } + public var Call_ConnectionErrorMessage: String { return self._s[2938]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[2939]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[2941]! } + public var ConversationMedia_Title: String { return self._s[2942]! } + public var EncryptionKey_Title: String { return self._s[2944]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[2945]! } + public var Notification_Exceptions_AddException: String { return self._s[2946]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[2947]! } + public var Profile_MessageLifetime1m: String { return self._s[2948]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2947]!, self._r[2947]!, [_1]) + return formatWithArgumentRanges(self._s[2949]!, self._r[2949]!, [_1]) } - public var Month_GenMay: String { return self._s[2948]! } + public var Month_GenMay: String { return self._s[2950]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2949]!, self._r[2949]!, [_0]) + return formatWithArgumentRanges(self._s[2951]!, self._r[2951]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[2950]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2951]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[2952]! } - public var Conversation_EmptyPlaceholder: String { return self._s[2954]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[2955]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[2956]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[2957]! } - public var Camera_TapAndHoldForVideo: String { return self._s[2958]! } - public var Channel_JoinChannel: String { return self._s[2960]! } - public var Appearance_Animations: String { return self._s[2963]! } + public var PeopleNearby_Users: String { return self._s[2952]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2953]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[2954]! } + public var Conversation_EmptyPlaceholder: String { return self._s[2956]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[2957]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[2958]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[2959]! } + public var Camera_TapAndHoldForVideo: String { return self._s[2960]! } + public var Channel_JoinChannel: String { return self._s[2962]! } + public var Appearance_Animations: String { return self._s[2965]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2964]!, self._r[2964]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2966]!, self._r[2966]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[2966]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[2968]! } - public var Passport_Address_Street: String { return self._s[2969]! } - public var Conversation_AddContact: String { return self._s[2970]! } - public var Login_PhonePlaceholder: String { return self._s[2971]! } - public var Channel_Members_InviteLink: String { return self._s[2973]! } - public var Bot_Stop: String { return self._s[2974]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[2976]! } - public var Notification_PassportValueAddress: String { return self._s[2977]! } - public var Month_ShortJuly: String { return self._s[2978]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[2979]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[2980]! } - public var Passport_Identity_ReverseSide: String { return self._s[2981]! } - public var Watch_Stickers_Recents: String { return self._s[2984]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[2986]! } - public var Map_SendThisLocation: String { return self._s[2987]! } + public var Stickers_GroupStickers: String { return self._s[2968]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[2970]! } + public var Passport_Address_Street: String { return self._s[2971]! } + public var Conversation_AddContact: String { return self._s[2972]! } + public var Login_PhonePlaceholder: String { return self._s[2973]! } + public var Channel_Members_InviteLink: String { return self._s[2975]! } + public var Bot_Stop: String { return self._s[2976]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[2978]! } + public var Notification_PassportValueAddress: String { return self._s[2979]! } + public var Month_ShortJuly: String { return self._s[2980]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[2981]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[2982]! } + public var Passport_Identity_ReverseSide: String { return self._s[2983]! } + public var Watch_Stickers_Recents: String { return self._s[2986]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[2988]! } + public var Map_SendThisLocation: String { return self._s[2989]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2988]!, self._r[2988]!, [_0]) + return formatWithArgumentRanges(self._s[2990]!, self._r[2990]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2989]!, self._r[2989]!, [_0]) - } - public var ConvertToSupergroup_Note: String { return self._s[2990]! } - public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2991]!, self._r[2991]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[2992]! } + public var ConvertToSupergroup_Note: String { return self._s[2992]! } + public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2993]!, self._r[2993]!, [_0]) + } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[2994]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2993]!, self._r[2993]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2995]!, self._r[2995]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[2995]! } - public var Wallpaper_SearchShort: String { return self._s[2996]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[2998]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[2999]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3000]! } + public var Login_CallRequestState3: String { return self._s[2997]! } + public var Wallpaper_SearchShort: String { return self._s[2998]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3000]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3001]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3002]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3001]!, self._r[3001]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3003]!, self._r[3003]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3002]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3006]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3004]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3008]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3007]!, self._r[3007]!, [_0]) - } - public var Passport_CorrectErrors: String { return self._s[3008]! } - public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3009]!, self._r[3009]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3010]! } - public var Channel_DiscussionGroup: String { return self._s[3011]! } + public var Passport_CorrectErrors: String { return self._s[3010]! } + public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3011]!, self._r[3011]!, [_0]) + } + public var Map_SendMyCurrentLocation: String { return self._s[3012]! } + public var Channel_DiscussionGroup: String { return self._s[3013]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3012]!, self._r[3012]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3014]!, self._r[3014]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3013]! } - public var Permissions_NotificationsText_v0: String { return self._s[3014]! } - public var Appearance_AppIcon: String { return self._s[3015]! } - public var LoginPassword_FloodError: String { return self._s[3016]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3018]! } + public var SharedMedia_SearchNoResults: String { return self._s[3015]! } + public var Permissions_NotificationsText_v0: String { return self._s[3016]! } + public var Appearance_AppIcon: String { return self._s[3017]! } + public var LoginPassword_FloodError: String { return self._s[3018]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3020]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3019]!, self._r[3019]!, [_0]) - } - public var Passport_Language_bn: String { return self._s[3020]! } - public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3021]!, self._r[3021]!, [_0]) } - public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3022]!, self._r[3022]!, [_0]) - } - public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Passport_Language_bn: String { return self._s[3022]! } + public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3023]!, self._r[3023]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3026]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3028]! } - public var Contacts_PermissionsAllow: String { return self._s[3029]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3030]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3031]! } - public var WallpaperPreview_Pattern: String { return self._s[3032]! } - public var Paint_Duplicate: String { return self._s[3033]! } - public var Passport_Address_Country: String { return self._s[3034]! } - public var Notification_RenamedChannel: String { return self._s[3036]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3037]! } - public var Group_MessagePhotoUpdated: String { return self._s[3038]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3039]! } - public var Conversation_ContextMenuBan: String { return self._s[3040]! } - public var TwoStepAuth_EmailSent: String { return self._s[3041]! } - public var MessagePoll_NoVotes: String { return self._s[3042]! } - public var Passport_Language_is: String { return self._s[3043]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3045]! } - public var Tour_Text5: String { return self._s[3046]! } + public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3024]!, self._r[3024]!, [_0]) + } + public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3025]!, self._r[3025]!, [_0]) + } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3028]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3030]! } + public var Contacts_PermissionsAllow: String { return self._s[3031]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3032]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3033]! } + public var WallpaperPreview_Pattern: String { return self._s[3034]! } + public var Paint_Duplicate: String { return self._s[3035]! } + public var Passport_Address_Country: String { return self._s[3036]! } + public var Notification_RenamedChannel: String { return self._s[3038]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3039]! } + public var Group_MessagePhotoUpdated: String { return self._s[3040]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3041]! } + public var Conversation_ContextMenuBan: String { return self._s[3042]! } + public var TwoStepAuth_EmailSent: String { return self._s[3043]! } + public var MessagePoll_NoVotes: String { return self._s[3044]! } + public var Passport_Language_is: String { return self._s[3045]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3047]! } + public var Tour_Text5: String { return self._s[3048]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3048]!, self._r[3048]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3050]!, self._r[3050]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3049]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3050]! } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3051]! } - public var Paint_Edit: String { return self._s[3053]! } - public var Undo_DeletedGroup: String { return self._s[3056]! } - public var LoginPassword_ForgotPassword: String { return self._s[3057]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3058]! } + public var Undo_SecretChatDeleted: String { return self._s[3051]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3052]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3053]! } + public var Paint_Edit: String { return self._s[3055]! } + public var Undo_DeletedGroup: String { return self._s[3058]! } + public var LoginPassword_ForgotPassword: String { return self._s[3059]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3060]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3059]!, self._r[3059]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3061]!, self._r[3061]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3060]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3061]! } - public var Passport_Language_uz: String { return self._s[3062]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3063]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3064]! } - public var Map_StopLiveLocation: String { return self._s[3066]! } - public var PasscodeSettings_Help: String { return self._s[3068]! } - public var NotificationsSound_Input: String { return self._s[3069]! } - public var Share_Title: String { return self._s[3072]! } - public var LogoutOptions_Title: String { return self._s[3073]! } - public var Login_TermsOfServiceAgree: String { return self._s[3074]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3075]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3076]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3077]! } - public var EnterPasscode_EnterTitle: String { return self._s[3078]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3062]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3063]! } + public var Passport_Language_uz: String { return self._s[3064]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3065]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3066]! } + public var Map_StopLiveLocation: String { return self._s[3068]! } + public var PasscodeSettings_Help: String { return self._s[3070]! } + public var NotificationsSound_Input: String { return self._s[3071]! } + public var Share_Title: String { return self._s[3074]! } + public var LogoutOptions_Title: String { return self._s[3075]! } + public var Login_TermsOfServiceAgree: String { return self._s[3076]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3077]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3078]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3079]! } + public var EnterPasscode_EnterTitle: String { return self._s[3080]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3079]!, self._r[3079]!, [_0]) + return formatWithArgumentRanges(self._s[3081]!, self._r[3081]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3080]! } - public var Conversation_AddToContacts: String { return self._s[3081]! } - public var NotificationsSound_Keys: String { return self._s[3082]! } + public var Settings_CopyPhoneNumber: String { return self._s[3082]! } + public var Conversation_AddToContacts: String { return self._s[3083]! } + public var NotificationsSound_Keys: String { return self._s[3084]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3083]!, self._r[3083]!, [_0]) + return formatWithArgumentRanges(self._s[3085]!, self._r[3085]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3084]! } - public var Message_Video: String { return self._s[3085]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3086]! } + public var Notification_MessageLifetime1w: String { return self._s[3086]! } + public var Message_Video: String { return self._s[3087]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3088]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3087]!, self._r[3087]!, [_1]) + return formatWithArgumentRanges(self._s[3089]!, self._r[3089]!, [_1]) } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_0]) + return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3091]!, self._r[3091]!, [_0]) + return formatWithArgumentRanges(self._s[3093]!, self._r[3093]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3092]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3093]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3095]! } - public var PrivacyPolicy_Decline: String { return self._s[3096]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3097]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3098]! } - public var Permissions_SiriAllow_v0: String { return self._s[3100]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3101]! } + public var Passport_Language_mk: String { return self._s[3094]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3095]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3097]! } + public var PrivacyPolicy_Decline: String { return self._s[3098]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3099]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3100]! } + public var Permissions_SiriAllow_v0: String { return self._s[3102]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3103]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3102]!, self._r[3102]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3104]!, self._r[3104]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3103]!, self._r[3103]!, [_0]) + return formatWithArgumentRanges(self._s[3105]!, self._r[3105]!, [_0]) } - public var Paint_Regular: String { return self._s[3104]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3105]! } - public var SocksProxySetup_ShareLink: String { return self._s[3106]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3107]! } - public var GroupInfo_InviteByLink: String { return self._s[3109]! } - public var MessageTimer_Custom: String { return self._s[3110]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3111]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3113]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3114]! } - public var Channel_Username_InvalidTaken: String { return self._s[3115]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3116]! } - public var Settings_ChatBackground: String { return self._s[3117]! } - public var Channel_Subscribers_Title: String { return self._s[3118]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3119]! } - public var Watch_ConnectionDescription: String { return self._s[3120]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3124]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3125]! } - public var EditProfile_Title: String { return self._s[3126]! } - public var NotificationsSound_Bamboo: String { return self._s[3128]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3130]! } - public var Login_SmsRequestState2: String { return self._s[3131]! } - public var Passport_Language_ar: String { return self._s[3132]! } + public var Paint_Regular: String { return self._s[3106]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3107]! } + public var SocksProxySetup_ShareLink: String { return self._s[3108]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3109]! } + public var GroupInfo_InviteByLink: String { return self._s[3111]! } + public var MessageTimer_Custom: String { return self._s[3112]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3113]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3115]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3116]! } + public var Channel_Username_InvalidTaken: String { return self._s[3117]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3118]! } + public var Settings_ChatBackground: String { return self._s[3119]! } + public var Channel_Subscribers_Title: String { return self._s[3120]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3121]! } + public var Watch_ConnectionDescription: String { return self._s[3122]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3126]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3127]! } + public var EditProfile_Title: String { return self._s[3128]! } + public var NotificationsSound_Bamboo: String { return self._s[3130]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3132]! } + public var Login_SmsRequestState2: String { return self._s[3133]! } + public var Passport_Language_ar: String { return self._s[3134]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3133]!, self._r[3133]!, [_0]) + return formatWithArgumentRanges(self._s[3135]!, self._r[3135]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3134]! } - public var Conversation_MessageDialogEdit: String { return self._s[3135]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3136]! } + public var Conversation_MessageDialogEdit: String { return self._s[3137]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_1]) + return formatWithArgumentRanges(self._s[3138]!, self._r[3138]!, [_1]) } - public var Common_Close: String { return self._s[3137]! } - public var GroupInfo_PublicLink: String { return self._s[3138]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3139]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3140]! } + public var Common_Close: String { return self._s[3139]! } + public var GroupInfo_PublicLink: String { return self._s[3140]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3141]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3142]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3144]!, self._r[3144]!, [_0]) - } - public var UserInfo_About_Placeholder: String { return self._s[3145]! } - public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3146]!, self._r[3146]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3147]! } - public var Channel_Info_Banned: String { return self._s[3149]! } + public var UserInfo_About_Placeholder: String { return self._s[3147]! } + public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3148]!, self._r[3148]!, [_0]) + } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3149]! } + public var Channel_Info_Banned: String { return self._s[3151]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3150]!, self._r[3150]!, [_0]) + return formatWithArgumentRanges(self._s[3152]!, self._r[3152]!, [_0]) } - public var Appearance_Other: String { return self._s[3151]! } - public var Passport_Language_my: String { return self._s[3152]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3153]! } + public var Appearance_Other: String { return self._s[3153]! } + public var Passport_Language_my: String { return self._s[3154]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3155]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3154]!, self._r[3154]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3156]!, self._r[3156]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3155]! } - public var Preview_CopyAddress: String { return self._s[3156]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3157]! } + public var Preview_CopyAddress: String { return self._s[3158]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3157]!, self._r[3157]!, [_0]) + return formatWithArgumentRanges(self._s[3159]!, self._r[3159]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3158]! } - public var UserInfo_BotSettings: String { return self._s[3159]! } - public var LiveLocation_MenuStopAll: String { return self._s[3161]! } - public var Passport_PasswordCreate: String { return self._s[3162]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3163]! } - public var Message_PinnedLocationMessage: String { return self._s[3164]! } - public var Map_Satellite: String { return self._s[3165]! } - public var Watch_Message_Unsupported: String { return self._s[3166]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3167]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3168]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3160]! } + public var UserInfo_BotSettings: String { return self._s[3161]! } + public var LiveLocation_MenuStopAll: String { return self._s[3163]! } + public var Passport_PasswordCreate: String { return self._s[3164]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3165]! } + public var Message_PinnedLocationMessage: String { return self._s[3166]! } + public var Map_Satellite: String { return self._s[3167]! } + public var Watch_Message_Unsupported: String { return self._s[3168]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3169]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3170]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3169]!, self._r[3169]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3171]!, self._r[3171]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3170]!, self._r[3170]!, [_0]) + return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3171]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3172]! } - public var NotificationsSound_None: String { return self._s[3173]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3175]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3176]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3173]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3174]! } + public var NotificationsSound_None: String { return self._s[3175]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3177]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3178]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_1]) + return formatWithArgumentRanges(self._s[3179]!, self._r[3179]!, [_1]) } - public var Cache_Indexing: String { return self._s[3178]! } - public var DialogList_RecentTitlePeople: String { return self._s[3180]! } - public var DialogList_EncryptionRejected: String { return self._s[3181]! } - public var GroupInfo_Administrators: String { return self._s[3182]! } - public var Passport_ScanPassportHelp: String { return self._s[3183]! } - public var Application_Name: String { return self._s[3184]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3185]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3187]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3188]! } + public var Cache_Indexing: String { return self._s[3180]! } + public var DialogList_RecentTitlePeople: String { return self._s[3182]! } + public var DialogList_EncryptionRejected: String { return self._s[3183]! } + public var GroupInfo_Administrators: String { return self._s[3184]! } + public var Passport_ScanPassportHelp: String { return self._s[3185]! } + public var Application_Name: String { return self._s[3186]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3187]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3189]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3190]! } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3189]!, self._r[3189]!, [_0]) + return formatWithArgumentRanges(self._s[3191]!, self._r[3191]!, [_0]) } public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3190]!, self._r[3190]!, [_0]) + return formatWithArgumentRanges(self._s[3192]!, self._r[3192]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3191]! } - public var Privacy_ChatsTitle: String { return self._s[3192]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3193]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3194]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3195]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3196]! } - public var Group_LinkedChannel: String { return self._s[3197]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3198]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3199]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3200]! } - public var Channel_Setup_TypePublic: String { return self._s[3203]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3193]! } + public var Privacy_ChatsTitle: String { return self._s[3194]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3195]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3196]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3197]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3198]! } + public var Group_LinkedChannel: String { return self._s[3199]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3200]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3201]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3202]! } + public var Channel_Setup_TypePublic: String { return self._s[3205]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3204]!, self._r[3204]!, [_0]) + return formatWithArgumentRanges(self._s[3206]!, self._r[3206]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3206]! } - public var Map_OpenInMaps: String { return self._s[3208]! } + public var Channel_TypeSetup_Title: String { return self._s[3208]! } + public var Map_OpenInMaps: String { return self._s[3210]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3209]!, self._r[3209]!, [_1]) + return formatWithArgumentRanges(self._s[3211]!, self._r[3211]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3211]! } + public var NotificationsSound_Tremolo: String { return self._s[3213]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3212]!, self._r[3212]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3214]!, self._r[3214]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3213]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3214]! } - public var Passport_PasswordHelp: String { return self._s[3215]! } - public var Login_CodeExpiredError: String { return self._s[3216]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3217]! } - public var Conversation_TitleUnmute: String { return self._s[3218]! } - public var Passport_Identity_ScansHelp: String { return self._s[3219]! } - public var Passport_Language_lo: String { return self._s[3220]! } - public var Camera_FlashAuto: String { return self._s[3221]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3222]! } - public var Common_Cancel: String { return self._s[3223]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3224]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3225]! } - public var Appearance_TintAllColors: String { return self._s[3226]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3215]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3216]! } + public var Passport_PasswordHelp: String { return self._s[3217]! } + public var Login_CodeExpiredError: String { return self._s[3218]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3219]! } + public var Conversation_TitleUnmute: String { return self._s[3220]! } + public var Passport_Identity_ScansHelp: String { return self._s[3221]! } + public var Passport_Language_lo: String { return self._s[3222]! } + public var Camera_FlashAuto: String { return self._s[3223]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3224]! } + public var Common_Cancel: String { return self._s[3225]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3226]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3227]! } + public var Appearance_TintAllColors: String { return self._s[3228]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3227]!, self._r[3227]!, [_1]) + return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3228]! } - public var ChatSettings_Title: String { return self._s[3230]! } - public var Passport_PasswordReset: String { return self._s[3231]! } - public var SocksProxySetup_TypeNone: String { return self._s[3232]! } - public var PhoneNumberHelp_Help: String { return self._s[3234]! } - public var Checkout_EnterPassword: String { return self._s[3235]! } - public var Share_AuthTitle: String { return self._s[3237]! } - public var Activity_UploadingDocument: String { return self._s[3238]! } - public var State_Connecting: String { return self._s[3239]! } - public var Profile_MessageLifetime1w: String { return self._s[3240]! } - public var Conversation_ContextMenuReport: String { return self._s[3241]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3242]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3243]! } - public var AuthSessions_Terminate: String { return self._s[3244]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3245]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3246]! } - public var PhotoEditor_Set: String { return self._s[3247]! } - public var EmptyGroupInfo_Title: String { return self._s[3248]! } - public var Login_PadPhoneHelp: String { return self._s[3249]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3251]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3253]! } - public var NotificationsSound_Complete: String { return self._s[3254]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3255]! } - public var Group_Info_AdminLog: String { return self._s[3256]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3257]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3258]! } - public var Conversation_Admin: String { return self._s[3260]! } - public var Conversation_GifTooltip: String { return self._s[3261]! } - public var Passport_NotLoggedInMessage: String { return self._s[3262]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3230]! } + public var ChatSettings_Title: String { return self._s[3232]! } + public var Passport_PasswordReset: String { return self._s[3233]! } + public var SocksProxySetup_TypeNone: String { return self._s[3234]! } + public var PhoneNumberHelp_Help: String { return self._s[3236]! } + public var Checkout_EnterPassword: String { return self._s[3237]! } + public var Share_AuthTitle: String { return self._s[3239]! } + public var Activity_UploadingDocument: String { return self._s[3240]! } + public var State_Connecting: String { return self._s[3241]! } + public var Profile_MessageLifetime1w: String { return self._s[3242]! } + public var Conversation_ContextMenuReport: String { return self._s[3243]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3244]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3245]! } + public var AuthSessions_Terminate: String { return self._s[3246]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3247]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3248]! } + public var PhotoEditor_Set: String { return self._s[3249]! } + public var EmptyGroupInfo_Title: String { return self._s[3250]! } + public var Login_PadPhoneHelp: String { return self._s[3251]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3253]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3255]! } + public var NotificationsSound_Complete: String { return self._s[3256]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3257]! } + public var Group_Info_AdminLog: String { return self._s[3258]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3259]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3260]! } + public var Conversation_Admin: String { return self._s[3262]! } + public var Conversation_GifTooltip: String { return self._s[3263]! } + public var Passport_NotLoggedInMessage: String { return self._s[3264]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3263]!, self._r[3263]!, [_0]) + return formatWithArgumentRanges(self._s[3265]!, self._r[3265]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3264]! } - public var SharedMedia_EmptyTitle: String { return self._s[3266]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3268]! } - public var Username_Help: String { return self._s[3269]! } - public var DialogList_LanguageTooltip: String { return self._s[3271]! } - public var Map_LoadError: String { return self._s[3272]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3273]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3274]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3275]! } - public var Notification_Exceptions_NewException: String { return self._s[3276]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3277]! } - public var WatchRemote_AlertText: String { return self._s[3278]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[3281]! } + public var Profile_MessageLifetimeForever: String { return self._s[3266]! } + public var SharedMedia_EmptyTitle: String { return self._s[3268]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3270]! } + public var Username_Help: String { return self._s[3271]! } + public var DialogList_LanguageTooltip: String { return self._s[3273]! } + public var Map_LoadError: String { return self._s[3274]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3275]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3276]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3277]! } + public var Notification_Exceptions_NewException: String { return self._s[3278]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3279]! } + public var WatchRemote_AlertText: String { return self._s[3280]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3283]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3282]!, self._r[3282]!, [_0]) + return formatWithArgumentRanges(self._s[3284]!, self._r[3284]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3283]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3284]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3285]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3286]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3285]!, self._r[3285]!, [_0]) + return formatWithArgumentRanges(self._s[3287]!, self._r[3287]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3288]!, self._r[3288]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3287]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3288]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3290]! } - public var ChatList_UndoArchiveText1: String { return self._s[3291]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3292]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3293]! } - public var Cache_ClearNone: String { return self._s[3294]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3295]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3296]! } + public var Group_AdminLog_EmptyText: String { return self._s[3289]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3290]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3292]! } + public var ChatList_UndoArchiveText1: String { return self._s[3293]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3294]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3295]! } + public var Cache_ClearNone: String { return self._s[3296]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3297]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3298]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3297]!, self._r[3297]!, [_0]) - } - public var Passport_Identity_Country: String { return self._s[3298]! } - public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3299]!, self._r[3299]!, [_0]) } - public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3300]!, self._r[3300]!, [_0]) + public var Passport_Identity_Country: String { return self._s[3300]! } + public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3301]!, self._r[3301]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3301]! } - public var AccessDenied_Settings: String { return self._s[3302]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3303]! } - public var Month_ShortMay: String { return self._s[3304]! } - public var Compose_NewGroup: String { return self._s[3305]! } - public var Group_Setup_TypePrivate: String { return self._s[3307]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3309]! } - public var Appearance_ThemeDayClassic: String { return self._s[3310]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3311]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3312]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3313]! } - public var Conversation_typing: String { return self._s[3315]! } - public var Paint_Masks: String { return self._s[3316]! } - public var Contacts_DeselectAll: String { return self._s[3317]! } - public var Username_InvalidTaken: String { return self._s[3318]! } - public var Call_StatusNoAnswer: String { return self._s[3319]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3320]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3321]! } - public var Passport_Identity_Selfie: String { return self._s[3322]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3323]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3324]! } - public var Conversation_ClearSecretHistory: String { return self._s[3325]! } - public var PeopleNearby_Description: String { return self._s[3327]! } - public var NetworkUsageSettings_Title: String { return self._s[3328]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3330]! } + public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3302]!, self._r[3302]!, [_0]) + } + public var Exceptions_AddToExceptions: String { return self._s[3303]! } + public var AccessDenied_Settings: String { return self._s[3304]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3305]! } + public var Month_ShortMay: String { return self._s[3306]! } + public var Compose_NewGroup: String { return self._s[3307]! } + public var Group_Setup_TypePrivate: String { return self._s[3309]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3311]! } + public var Appearance_ThemeDayClassic: String { return self._s[3312]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3313]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3314]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3315]! } + public var Conversation_typing: String { return self._s[3317]! } + public var Paint_Masks: String { return self._s[3318]! } + public var Contacts_DeselectAll: String { return self._s[3319]! } + public var Username_InvalidTaken: String { return self._s[3320]! } + public var Call_StatusNoAnswer: String { return self._s[3321]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3322]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3323]! } + public var Passport_Identity_Selfie: String { return self._s[3324]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3325]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3326]! } + public var Conversation_ClearSecretHistory: String { return self._s[3327]! } + public var PeopleNearby_Description: String { return self._s[3329]! } + public var NetworkUsageSettings_Title: String { return self._s[3330]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3332]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3332]!, self._r[3332]!, [_0]) + return formatWithArgumentRanges(self._s[3334]!, self._r[3334]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3333]!, self._r[3333]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3335]!, self._r[3335]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3335]! } - public var Map_LiveLocationTitle: String { return self._s[3336]! } - public var Login_InfoAvatarAdd: String { return self._s[3337]! } - public var Passport_Identity_FilesView: String { return self._s[3338]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3339]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3340]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3337]! } + public var Map_LiveLocationTitle: String { return self._s[3338]! } + public var Login_InfoAvatarAdd: String { return self._s[3339]! } + public var Passport_Identity_FilesView: String { return self._s[3340]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3341]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3342]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_0]) + return formatWithArgumentRanges(self._s[3343]!, self._r[3343]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3342]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3343]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3344]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3344]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3345]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3346]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3345]!, self._r[3345]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3347]!, self._r[3347]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3346]! } - public var Tour_Title2: String { return self._s[3347]! } - public var Conversation_FileOpenIn: String { return self._s[3348]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3349]! } - public var Wallpaper_Set: String { return self._s[3350]! } - public var Passport_Identity_Translations: String { return self._s[3352]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3348]! } + public var Tour_Title2: String { return self._s[3349]! } + public var Conversation_FileOpenIn: String { return self._s[3350]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3351]! } + public var Wallpaper_Set: String { return self._s[3352]! } + public var Passport_Identity_Translations: String { return self._s[3354]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_0]) + return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[3354]! } + public var Channel_LeaveChannel: String { return self._s[3356]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_1]) + return formatWithArgumentRanges(self._s[3357]!, self._r[3357]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3356]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3357]! } - public var Passport_Email_Delete: String { return self._s[3358]! } - public var Conversation_Mute: String { return self._s[3360]! } - public var Channel_AddBotAsAdmin: String { return self._s[3361]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3363]! } - public var Channel_Management_LabelOwner: String { return self._s[3365]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3358]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3359]! } + public var Passport_Email_Delete: String { return self._s[3360]! } + public var Conversation_Mute: String { return self._s[3362]! } + public var Channel_AddBotAsAdmin: String { return self._s[3363]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3365]! } + public var Channel_Management_LabelOwner: String { return self._s[3367]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3366]!, self._r[3366]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3368]!, self._r[3368]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[3367]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3368]! } - public var Common_No: String { return self._s[3369]! } - public var Weekday_Sunday: String { return self._s[3370]! } - public var Notification_Reply: String { return self._s[3371]! } - public var Conversation_ViewMessage: String { return self._s[3372]! } + public var Calls_CallTabDescription: String { return self._s[3369]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3370]! } + public var Common_No: String { return self._s[3371]! } + public var Weekday_Sunday: String { return self._s[3372]! } + public var Notification_Reply: String { return self._s[3373]! } + public var Conversation_ViewMessage: String { return self._s[3374]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3373]!, self._r[3373]!, [_0]) + return formatWithArgumentRanges(self._s[3375]!, self._r[3375]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3374]!, self._r[3374]!, [_0]) + return formatWithArgumentRanges(self._s[3376]!, self._r[3376]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3375]! } - public var Message_PinnedDocumentMessage: String { return self._s[3376]! } - public var DialogList_TabTitle: String { return self._s[3378]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3379]! } - public var Passport_FieldEmail: String { return self._s[3380]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3381]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3382]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3383]! } - public var Privacy_Calls_P2P: String { return self._s[3384]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3377]! } + public var Message_PinnedDocumentMessage: String { return self._s[3378]! } + public var DialogList_TabTitle: String { return self._s[3380]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3381]! } + public var Passport_FieldEmail: String { return self._s[3382]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3383]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3384]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3385]! } + public var Privacy_Calls_P2P: String { return self._s[3386]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3386]!, self._r[3386]!, [_0]) + return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3387]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3389]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3390]!, self._r[3390]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3389]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3390]! } - public var Passport_InfoText: String { return self._s[3391]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3392]! } + public var Stickers_ClearRecent: String { return self._s[3391]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3392]! } + public var Passport_InfoText: String { return self._s[3393]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3394]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3393]!, self._r[3393]!, [_0]) + return formatWithArgumentRanges(self._s[3395]!, self._r[3395]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3394]!, self._r[3394]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3396]!, self._r[3396]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3395]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3396]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3398]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3399]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3397]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3398]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3400]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3401]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3400]!, self._r[3400]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3402]!, self._r[3402]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3402]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3404]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3404]!, self._r[3404]!, [_0]) + return formatWithArgumentRanges(self._s[3406]!, self._r[3406]!, [_0]) } - public var DialogList_Unread: String { return self._s[3405]! } + public var DialogList_Unread: String { return self._s[3407]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3406]!, self._r[3406]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3408]!, self._r[3408]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[3407]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3408]! } + public var User_DeletedAccount: String { return self._s[3409]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3410]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3409]!, self._r[3409]!, [_0]) + return formatWithArgumentRanges(self._s[3411]!, self._r[3411]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3410]! } - public var SharedMedia_CategoryMedia: String { return self._s[3411]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3412]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3413]! } - public var Watch_ChatList_Compose: String { return self._s[3414]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3415]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3416]! } - public var Watch_Microphone_Access: String { return self._s[3417]! } - public var Group_Setup_HistoryHeader: String { return self._s[3418]! } - public var Map_SetThisLocation: String { return self._s[3419]! } - public var Activity_UploadingPhoto: String { return self._s[3420]! } - public var Conversation_Edit: String { return self._s[3422]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3423]! } - public var Login_TermsOfServiceDecline: String { return self._s[3424]! } - public var Message_PinnedContactMessage: String { return self._s[3425]! } + public var UserInfo_NotificationsDefault: String { return self._s[3412]! } + public var SharedMedia_CategoryMedia: String { return self._s[3413]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3414]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3415]! } + public var Watch_ChatList_Compose: String { return self._s[3416]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3417]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3418]! } + public var Watch_Microphone_Access: String { return self._s[3419]! } + public var Group_Setup_HistoryHeader: String { return self._s[3420]! } + public var Map_SetThisLocation: String { return self._s[3421]! } + public var Activity_UploadingPhoto: String { return self._s[3422]! } + public var Conversation_Edit: String { return self._s[3424]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3425]! } + public var Login_TermsOfServiceDecline: String { return self._s[3426]! } + public var Message_PinnedContactMessage: String { return self._s[3427]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3427]!, self._r[3427]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3429]!, self._r[3429]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3428]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3430]! } + public var Appearance_LargeEmoji: String { return self._s[3430]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3432]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3431]!, self._r[3431]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3433]!, self._r[3433]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3432]! } - public var Message_PinnedPhotoMessage: String { return self._s[3433]! } - public var Passport_FieldPhone: String { return self._s[3434]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3435]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3436]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3438]! } - public var Conversation_Call: String { return self._s[3439]! } - public var Common_TakePhoto: String { return self._s[3441]! } - public var Channel_NotificationLoading: String { return self._s[3442]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3434]! } + public var Message_PinnedPhotoMessage: String { return self._s[3435]! } + public var Passport_FieldPhone: String { return self._s[3436]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3437]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3438]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3440]! } + public var Conversation_Call: String { return self._s[3441]! } + public var Common_TakePhoto: String { return self._s[3443]! } + public var Channel_NotificationLoading: String { return self._s[3444]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3443]!, self._r[3443]!, [_0]) + return formatWithArgumentRanges(self._s[3445]!, self._r[3445]!, [_0]) } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3444]!, self._r[3444]!, [_1]) + return formatWithArgumentRanges(self._s[3446]!, self._r[3446]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3445]! } + public var Permissions_SiriTitle_v0: String { return self._s[3447]! } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3446]!, self._r[3446]!, [_0]) + return formatWithArgumentRanges(self._s[3448]!, self._r[3448]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3447]! } - public var Common_edit: String { return self._s[3448]! } - public var PrivacySettings_AuthSessions: String { return self._s[3449]! } - public var Month_ShortJune: String { return self._s[3450]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3451]! } - public var Call_ReportSend: String { return self._s[3452]! } - public var Watch_LastSeen_JustNow: String { return self._s[3453]! } - public var Notifications_MessageNotifications: String { return self._s[3454]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3455]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3457]! } - public var Group_Status: String { return self._s[3458]! } + public var Channel_MessagePhotoRemoved: String { return self._s[3449]! } + public var Common_edit: String { return self._s[3450]! } + public var PrivacySettings_AuthSessions: String { return self._s[3451]! } + public var Month_ShortJune: String { return self._s[3452]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3453]! } + public var Call_ReportSend: String { return self._s[3454]! } + public var Watch_LastSeen_JustNow: String { return self._s[3455]! } + public var Notifications_MessageNotifications: String { return self._s[3456]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3457]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3459]! } + public var Group_Status: String { return self._s[3460]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3459]!, self._r[3459]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3461]!, self._r[3461]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3460]! } - public var ShareMenu_ShareTo: String { return self._s[3461]! } - public var Conversation_Moderate_Ban: String { return self._s[3462]! } + public var TextFormat_AddLinkTitle: String { return self._s[3462]! } + public var ShareMenu_ShareTo: String { return self._s[3463]! } + public var Conversation_Moderate_Ban: String { return self._s[3464]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3463]!, self._r[3463]!, [_0]) + return formatWithArgumentRanges(self._s[3465]!, self._r[3465]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3464]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3465]! } + public var SharedMedia_ViewInChat: String { return self._s[3466]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3467]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3466]!, self._r[3466]!, [_1]) + return formatWithArgumentRanges(self._s[3468]!, self._r[3468]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3467]!, self._r[3467]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3469]!, self._r[3469]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3469]!, self._r[3469]!, [_0]) + return formatWithArgumentRanges(self._s[3471]!, self._r[3471]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3470]! } - public var Appearance_ReduceMotion: String { return self._s[3471]! } + public var Map_OpenInHereMaps: String { return self._s[3472]! } + public var Appearance_ReduceMotion: String { return self._s[3473]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3472]!, self._r[3472]!, [_1, _2]) - } - public var Channel_Setup_TypePublicHelp: String { return self._s[3473]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3474]! } - public var PhotoEditor_Skip: String { return self._s[3475]! } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, _1, _2) + return formatWithArgumentRanges(self._s[3474]!, self._r[3474]!, [_1, _2]) } + public var Channel_Setup_TypePublicHelp: String { return self._s[3475]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3476]! } + public var PhotoEditor_Skip: String { return self._s[3477]! } public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, _1, _2) } public func StickerPack_StickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Minutes(_ value: Int32) -> String { + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } public func Conversation_StatusOnline(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { + public func MuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func SharedMedia_Video(_ value: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, selector) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) } public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareVideo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = presentationStringsPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index 71a6fcb284..94cd2df416 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -394,7 +394,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: self.automaticMediaDownloadSettings, - pollActionState: ChatInterfacePollActionState()) + pollActionState: ChatInterfacePollActionState(), stickerSettings: ChatInterfaceStickerSettings(loopAnimatedStickers: false)) self.controllerInteraction = controllerInteraction self.listNode.displayedItemRangeChanged = { [weak self] displayedRange, opaqueTransactionState in diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index d1e1106e985b472ca36a2ed9438ef747b7265552..2946ef19a3bb6cd1ba5bff4fad5b40cf040416bc 100644 GIT binary patch delta 35720 zcmZs^2V7J~_dd>C8DN(#3+%FemtGdIcSY>4ESc9tdZncd)hX zSQ=d!Yqk{C)y%1E_E(oR*Hq2+H#UXfe^&gY(9#?;ZEI&>HhQ^Trp=AKSp1BrY-%p^ z`|EroP^)$UazZ?Gsa?9&i@##jmAAxo!*P!G>QI+x}S z_R=e%aV(Seg*sUloes^=vO}n7ok=X2$Kt3Pk77AAkh^TTke81g>94M-ELE@Q8&yA@ zAs+q_Q=^<9X%S<#iIgDb$4Xh`b!@ayW3bIx0Yr-w8FExf|vwpNb z+|7z;H-7i0Q{maX7*dIJ;YE{SP))60Ha39rA~M)O`orch46U19FY^Y|jS(I;gf>QG z@u5iP(#8c=`XR#1h7mL5vEh_&@URgy#*ocM(n9<_iZ&S%d5Mx;8f&A$uSQ1}&#bJQ zp`KAnXAM3!n(Rg!9|IXHo&VV!Ily06<5vSvMwLb{E2mqHg?uc^GsP7XOQM5&jC9Nx z%f``Zqg@*xLUA=-%8QKQ*Qhq+_@AE?WydQH8D<_$vWFW1IYqb!gN#qNZ+kaeYJJn`Tmcw4K#Zezc9v zq7nE#n`)vnSS_u_?>Y2xw3FANx=9qSV~G)k9psd$521cPIB2KG7#(a@W;alNjGfJ; zkuhC)Bhu+K<)npf_|wGYa zWQ)z#=BtN@sq0x7?eRy3)yYRJpoOs=+4Zy|*353C_hYlPg&}m|(F8hoI-CmDMMmM< zrQBltWQnayn4OB_60{}gxmxC;^UK0$QCtLHiek6uTf(d{qx{#6YMC=lfAUTATwDi! zGfLA|ud-7_e5`g$h=@;RDUs+l%xsi|+)91oecEjyqR`0_B1hKORadI@dpq47pTd_x z!bKN6mi#h*?erS|5PxlhtaS%|ifdeYa%7+#YA2>$7@SP#TGMeRw zcf#KxcZE>=33GU3i%i^2Cp8mIYH#Mtk#f_iQWGt2Z{jPEa?)l~GQHM5maU`%?OkjQ zoo%1a??H)0T<*eb9DjwZqaFz^elPyAV@X+KTBqK9$a0CoRm>JOuitv<`|r|k(@ z>;d{bA&ot_#*}GU53wlxjPy4(RnGAHf=hA(6`69_Mw(;FXPaof$;&p=UQ-@>h|ZZZ z*~8FA_Q)~*hWf^4R1SHB`Xzd`NA)k8qx9qBbW5UJdpbnKc$gz{aBcmxN;Pq}(BVWc z--=33+A+yQQAzFDHgYDp*mmldl*xCX#7yzOB^&(nn>)zHpOJkec9*coHA4(xGUwUA zTKOy~g*{KdC1vmzkee#p-I$rWB`5F~k+jgM!lcNemd5(VN?GY8nwy-&U&UYO=KTq@ zF*%X%L@Jl!ZnTMQK4zdVl4ICwbSBxwc2SHuUE3W(4bNJr#LT^WA=w^3W&Y;onz|WH zzClH!D~8rJH!5ZI21+~>zcE3a^sxw$oWf$*o3z=S#@|9ox;W{?T>Zfu*Yj;8r2z=8 zEMMz*y@Omig@OYS(7EO41v!P@4G~jsX2~?nVq))6g(Z!@k6bfd7?wZ}TB7(qq;e@f z%1X;;MEz&s?x$0h0sH{Uy|lWwi-x5bwS&rz(5w_2JA~d%Nf_X-^~1mg9xfkvgq}-D zWgpOIDOT;n5L#MmragZ~syX)&IjnZ=;}F`>&p{;vBEfV zXhSWD%BChcO?;&@>+Af!;EMT7pDUHuLoDPNePvD4j$<)C!_1;2ip8ksoS;rN7yFXN z+Fbl3#7s2TWTF+eaQ7*s;_y>E(_b~az6Fg}E*OR8krnb4elYgiQs}TPjD1Z zq5Xs5`qV@_<0DizUZj)GbasitT^{X92p#F4O#NN$HI32cmISJCr8wH*b>h(`)LrvT z-(Y{;Apf++mdZw@`8aKMrSmX|ctl}eW)Z!rS(Gw(5y(pg1agzrZN&0PcYB$UhPmA= zifY{+7DFrD={y!vDdLoi*}|mF42h%Tkcg+t?(V!j%A88+m3rFS5|GkyjIN7{@j8`N zO2L?Dk;kDWGFtg&62--|=MW7^rhOhaR{R-HF0;^%ZYJ`1V_6FI@g{3FCbcZpd&5%f zkd@}Q7zPrcYmC3Sa<-Z&4qE9=)tpR>o&*q7<7%(E%SB&$)68yEibSRI`j$q0k#<1} zi`Xw^i_Lbn%R|$lw2~y{R@ig=gg_BtM-*uHP+YGj#Wk`kB+2eaG!jN z7`*`sB_%x;fDRyU&7@=+nC{>ONO;8d*}yG}(i3XE%Y_u_JdaL@GAsd0*;Kurv z2HyxjzFqw(>&_%co*NLZUtSg<+^jqwpAG3OeFD6amjEnxFwe>A=xkmZt0$As%^IkS zFOAQISPweVCtcj%j>WWxa%nEEudP=grx9f)Vxh@$RfjY&T6#KN*iI~)+hwI6iv7VAgL`H z+oVBN;(?KSUc!Yg?L-8FCwKFUZwySDz7HEdglAGP+b?)$U-# z_BrxLw!qBE+&dwih<~v|XdY41)a)BuH?yYNUsTmxQ?Fk0E(q9ZRiVu=v$9d?i@WJ= zyw7slU1--m&hs=1ZKI@sANa(3wKT8)}=9gnJSu9;p_RViEa4XX#ntd_4x zQg4Wrqgj-(wG;254ISKUE$!)$qpf2!_iQqSc8qrj$V zYL&FXi2G<-$8>f--O*R(cKEg(>a{@_DJBZ+%$!)(j6L&J^WbUK z*qH-n+SNIRZKVU9Gx;{;nK6IOhC$;8;O~&_jQR~S8@tKBci>kZ2B}PZ zy@T%Q63?GSDup(jO^K+lRzvz6?eCJupGS5QEsZr92hORiQ84udvUPQ{m#9zIBK9&Z z>6*r0g-|l>?w&+@x<;^_^j_B-?KP;YHTV=`w`9HxD#862$C)-W+_`Qc# zc5}16uuoq0I(^*D!``63x;cOkle>HQTc`zO^^jHRnzyNldf3=Ox}ir3u-v*H4t`iRDdHwEtFn?u z=(8RY$X)J{rhUl7%6=@7di0EDAJLGW8SE%E^t7^1>F%C+>@#|$r;~k7pZ9cV$JpA{ z%p^*B0oj>)CGz8FG?7N{(?{`3q`YFu8!)ytz2ewOy1rKiKZQ&O9e&5HF#1=FPW_ue zCwp0e!T#-)V*eJ!Qp>fHBg0ynnn%@NCqLqQ>exG*{eTJW(|&~Eyb5R~53H_fL#9ff z{v@AHhyHTLHMQ+4Pa`v)Sd~e2XBay}6Z?4BSz6R5gP%jWm3sBC7)!CwQEKo! z9q7}AUqFFPEWMtkw4teAD7UXm`;CdECTz)T`x@ErbX{K;`-AR9{-2CCUP-33r_AbE zf6>{#Ndx{yGjfBVZ}NjEzPM7~uK$Ztsco=Yr-StH4XmqbT+kpD1B|`wflCmGqt*Qq zRFju!YQJ19M57h`+>Fuoe!VnJqtX`~RQd>~_@YG4HMzZu_b{s|@GR9eVaWENIV$Sr zQ7whj(xR>`f|gcTBAV2MF=!H_i*3tUoKaCZM$~~xTElFukteNLWBO%!utf5JqOvS`MI4}_u+cyIcH}- z?;r>B(Ud_>aB7S2cLA**1mYH&B+6EEka{I49;Ye)p|g_J{V z@4;+s`l&b759#degA&=p!F`b0MzrFJzVybB9Kf=3L#(_Ak|`40MUSkksgp}UKCM3$ z4$Wi5vY*0rg*bo~4^7qvYGU_RX&QPMA_i5?m!gAc&(JJ3n0^}S(}rkb^+=4HRB}UU z)UXVow|T?T!O5*3md!`tQ5LEG4PzV1>*Y|7q%*@D+9*x8`>x?}tb_`Or=^raQb*=M zN5zr^7%-ckq2PMAhtj?7|JWEkaQ)s#KT2~;<1R4SWJ^`mmx40>>sna!l< zM`dU=8f{*gM8A!Sv(83aa?h`pLGh5H@`@1y2bIfysU>Ggx_u7HrD7c0Pz}@P)BgcW zh^&x0npV;oxbEH(2cHYM0%c(8UNF#?B?;+`$dOt_*EzZg#@iNERe{Zs)te!ZEb`M> ziZZ?}NP@GD#mJRLv+HPbX;(HMBauLlm$nCVd$rUJ`t3w%AzMhXqb=GZjYi*?K)pw| zXG^GbbOu{W^GDm+O|)*bSG!rGD=kTi@Q5gxK3zWU7CJRLh22X3j?Q%5hG!)pPk$Mm zXZ7h@Fe!RF4H%Qj?w~nida^s|i7{Sw7abUr&+b-3q_Zl^$zGPqSD>LxVd=zjlsQ{T z^U5*-v^JJ`9IH_z;gOs+O};S-fV9s3HS}efi_x0$baoGvpo^ZK8bKxHu|QcB<*6Ok zp{@ikdfkyVO-%uYtTn%CreBg4&Go7)ACLoTrUT_M+JhP>S%sVEVtEu_j~YJFcLa1F zZA#8mcXL!*p?M7xoBs7?;f+rOD$m*<*CuIEVJQCcbcCj_(>5$)CVeZ4w%{FNI30tXk0e zK2K_N;b;PdjZa}ulY6|CZK2-dZG0OlIAAyv;}ut4*3vqAw$m-+)7TDra(uS-j7HmT zvQkb>w3zC0;?E zQ`s##eN7~P70DDjw+nmD2~hx5_6hl5;6_fcgMphpAp;PKCb$8iprGjBgfPIUk0*He z8}jLbWx_64uQdQkrCsY{Z_yz9ew$`on*jv1^4gyKU5F*p(z|rb@*YyI0Oc4Ru20za z$viO)xT?=YJKIl_CT3{|G_@hwG&RZ~Hzervkb|^sq6^sS@WdQ;nEsuZ&5lsUqzpi+ zl1WznA)2+TkIcgO&Z!4h>Aye@)<-C~+AOK5B-{HKCAZV}Wt$2kX;!sSGq=;>!`;=fJOvHGZTGI7UaOAM z?Clgj-Eh%Br>heHV6Rkn(_HN&Ar`6QHaFxgf{kKkL%Cn)Cm?)M5GaIRnyWU1QYU|dj;Fj`NOigU`G8T0~^TRw4^4L_koCo8nO~; zS4|}7u=i`6Ai{pCvBTvVG0V=2QSK6l=K)f6eIia9&`ueUS+f$rg)N$u%?F{}OY!Xz z>GfHOe6Ze{J1MfUc?kGNsZEB^rCFKU&~{>LBouw$*>Qkeqpwe(4fCU^VRnKxqMbN5 zj#+8b>?pWHx6HQi610*geO2_$>;ztlR01tsoItU)aBfp_trPrN*IGARo)c=*0i%}G zW&%b%QR}vhhiuR^`U0q0cEmOGb*-0Qi&F3+i;`nN8o*RF>zk=bR4^xlPex&Tu_KaU zIpKd(Xx#Ji7_RzQJ{u|JrBSTW z<&j}DwLZdJi(I*W+nC;tNQKOyCH39l?|ix5!5Zn)dOK^PKkA*l8RF>y>M5T3G#Gdb zazL|=HMcnw=Cz|E6N7%sFk0DQ1kSp@!3&JFtHB10b*#a|ZlKEzb~rk1bKSsOedeZn z7NMmep7BW{q@`&P_y`@CEJh*Nb~v`-xda}2X08W#?BluF?B+F%+3Xg|X|zY&3L%Ll zsUgM`bsG|LF~Z9DXooPd+v(QERBc&1np&P>ENPypkK7$}sL|uN6T(+1QgBy+z4=`z zu!%i6%o-hBICmqC zJl3Px=3EO=`L*TO)t5E<8;V-sduUak>(mkvy9!u%^wl#)(57Y&zZX?A0+zx^-??J> zeaNwh)$ag=#kNF(`m(lU^9NO?+G0*=0Z>CSi!StY(aM%Mwt+Ua_~79@gx{O!a!Wej ztXf^2WTgS~610cfQQhElT0AdG`(L{t84^uf=f%MN`P#e;{s_e3-8LoAzw=_WN85?K zWy~Bk#y_Wio<3raQ^9qq_9q}FheT(0VMySv3L2m%Y3_BMyiY?y?UViW4YmGJ@I+4o zJs*rA*n-kbal?H8JKtXy$G0JwrOcvvz6n0ly!qYv4&<4Yb8PYaNcIffH9wm_hrHy~ zs}kwZd;@yTvG71|ct@I91ZM8EVzOOxG;%YOk~tS2Si0 z>nbH)r3V&t?w)k6jTeOtsg-Cbt<&s4ZS+A4T1m$_`NBjSjG7 zr8lMn%UyS)L~$E$%;F!awl~dZ7DKS#KcaIe{+N;%y0uT*Nm76|&5xuB3*$hV&03h% z`%~1BU!m{5M%4pM)wQv!p9M-=eQIU?hGu^-7U6R`ywJ@~!2Biap&fCHZ0rllTa?bf zM8#ZX4aLc+jEmhi77vE)?nQa*D|%&-8xZaIq7?oO#Jr;DadcGtViW%s$wb*XiPU#- zIQxzUFLot;k4%OBR6iH#RMbzjaIs4}t&d&ekowwc80uEeTJXQEgkQzuHmZfb=%4`FA@|^m;FsEREp*pox4eS2rzOnwWACso=Nx2G!Om;QKE! z(=hSVq5{DaC`I2?z%=S}lY_OR$v63c-0r@~4dk}o$by8dD!M#m@g{*o<`3%^vV#kKEi5K<=}f(^>4ATRLcQq3}!EWq3}T z){CdgTU>x~H{FuYO=#93_XyS~$t37bn50nQUI|lHU)ro3A% zaA^*{)!|J+T{+ACvyX0FD^`>y$?cSh9=z4SZAik~_cb``TaDa~lv{Toe|KwqHz$&E zZ77Carx^mh=0b_GJG#TQ$#?Z~^sKqXO2ckTPW3`c?q`)EQ%sZkYY3bt^}4G#HI#~W zCs4}NIC}iHSb)cuZnN`rRC7s?9aZ0gcnP(o$_T~CJCdZAFX-`Bdyq`XW(D-Rfd(#U z51={ob_q0B-|hg=+7EsyDLD&(o0(E$gCn3e}a)rWeA3gsQ}__}q}r>ZPRF7=K5cy$e!O zonJLYiW(Yqr$JY`<&JdT6B0J*)HW42)`J0S2sYFU1?i%)g1N+dX)K!cCMH~MGo~-) z-IPvW}9efa4aH`0sHYRW|#ogu6hJ=cSuFwU; z?uz0=A(f)sz)=J61`WD38b%B6%0s~1Q+K7pmwNavt5y;!mM&waBzVC3S60oQ0rz8F zwfy2z`J%LWn1{OG9mz){<)+QyV2!@!@ujtuRsNaK8aj9w6DqeA5e=%R#)gW+>oISi zzB>|7@};{yY&;#i+Y2V{%H2LTfqct5fP<@Co~lg@6?311U5ya91p^!0BABHSJjz_H-?-~775*4>Qdn58`wDr3IFI>`zT({N$ukDx6logL~?{Ntl&-vsAqIBgS2p2tw8G^cI_ zRX~_8xZWREFHxES&xlCSp1>r0+eW$f8Z1wuAh^M5@)cEAL*L5hJw>DL%?CNR=-wP{ z3v_9~O%q-%3%7=f9WN=;9gjb2q$%?w5I7fiUoJpk@B6aA)6KZg!=FLZ$~77h*cUxZ zTko@J&xMLr24*$($Ldu(>gVageQy4OlCGbiFQ6Bx>;38Qc}}@MtH;YIk!r4uv>sM6 z6k&~W99}`0`e;SA$S?7)N!(T^H4lUj4q!SM$z(;!F0VkNf_y^tETcI+*Gg3|@T^mM$ zq>J8|1Gj1SjUIN4CT;Yx59n^&Mi)Tc;f-nhOSEC7BX1-}1%kcgh@K?-rjG0s zjoy^Wzk&d`4V^@mF4JwBy!;zv>a@Vmn-aBer53ZKDoy(xN)#$+Xc*ftqY=TizA-Iz zbpd<+1NGaSq5Y_|UidWSlRr(%HhZ-*p>$=s)lfe08s&dDOGh?av~v=@B#DNXm>yPj zfh-TX5VY0D%zDYyA4FJ)cepL{xq%WlsmOIX3@HoDr zT7RPo$qS>WAGYyul&h#Lv7wgzH<&Vl*dzG}aw~i!4}4z5BOV?FVY5JZ8@QiwVMt&b zO^-ezqu<_p#G%D;N%gFGG=ayX%tL*r*K95wo_~$$)bWYrwba%zzGBwop>^acSR~ukpdBe2P%%R8%00Whasx%sT9_OW;~V7 zdeVxg3Ry4O^OOUC?8~RTtPiz&I+OQBT@~<{M9v?LRQj|*>xWRt0~VYq0P7{+xWAf# z;j6Fy6St(oVcKJhTN}pd^0egti>8Ki zI8V&9eoF#?+Kw$QJ`ycuf?KlCxh+Y26jBx$%3}=qMMY_)6U zyw!Gyz6%)#yZ6{u7axb}I&G6Q5)p3F#v3t+g#QO$dl_tdKyX^ z{B=X?##dhNmtTG@Rc&+giK@NT3o$J>ZHt93b^EqlZL%74`g>b+$`q8VEt}5GmkgIx zE0CEh*mEo``@dmfQ&Av!xMIblk8EkGsgm-Q$j-;4$)I)HWBD|sJj#i)YkMNV;NI60 z==<#n0E8E}J3tzy>~QlLkion)B+}R&v3#aVZD>fQB|D-KLbqZ^CQd=TxFa19?~5HW za_;huR9+7$6&*tTo-yzSq-+xK#TH|8Ti+aX|IVexXY#-XZh9sMY~cQ9Jgk|{J(I~> zAg{kw!Ly0*s}6cL6VR>xStp=d5uy|xe%1u|_VTkfwunA?HkB`iyiQ+T`+U4Xj-{OC zOUd_~1(0pXb520Ena_Cu*_J+@LXSKb$8SXq1OzDeM;yD2PCeHFY@X@)T(*pgp6>`p zYRmIZI8xU>?*c-5;dz&KH<$P=C9brl?rQ#QIcYDXX)7>o;Mnc;LVKJoD0!hfUxoG+ z_7jgkhMmc3+V(;^UxUnaTGbPWpk9d3h|?*}LY^1fJMKY&1ONl-ud9=heK0#ZTPZ(d z9gTT06R_=u7xUS@^wf(Eb|1a}qDQ-*)86kB$Q2Pv{3SCOI>$@7Kx@Navh($55BmNm zd#iQdfE=4n=RN&W3^3cPFFCYLTrqOj>o-L}RO`?kSr6 zO1}0qS7fgAyS(yB6uhRpcBj(mR}9)#F1BrlhL!Gk`>O`N4bR9@4DH}oB{etc)g0{^ zu7FqM_?d`el8<_p!^4tHZ@=o$p5u~Mq<>zuCO?m=!SEV=sY%(FD0inD;b)_E7P41p z$xe^9lZ#XTgE4qzr-Q$SI{GX+4~z8g&RFO9^AVG*Yic182>7EtT&@ zL8^?Kitk@pC!@~Qp8Iv=>Ssqr)X%6yRvAuE$2X(}o$VQJ2GDYaH;z|~FNmCD~y&7Go@$f0#XEBqd9-Q`3O+reEnxLHr{vhzcb%2B6N=u9Vr zSlNkjgLJjaR*z7>-5r6wns>X{hqQKgCNS5o-Ff_D)NxSdO$p+D7t{AXpQwlJ&$P9& zc1Nl2o^<{h@@-;w5_)RMo@ijR6?@Y7F=S>0Pj#7-k0U9&Tz$1q;sE*Z6Le{h7og3( z*VX4FB&25uwz9r<9)h+Sah3$c_@LlE`4j{svS|%zLmWi#o4=yPdnH%5d2b>A269fy ztFX5Lr*G-<-W2USP9>jPjA&Cm{ChPaWYAqSO?f>A0daF)w|D&!wIwqj@aL;-qZ+xN zP#~A#)l@{w3`Er-FXS|IV>CLz>?Hn@eGo2Yv-~AwJkoY>{n#1ijqBtqHOwX zu2mG6!H>;&BOY$r1#j5+FDS?fu;vkw<3Qx<0TI8^fj82$-?@yuOzkdL{vVK3YfJ`I zm4OtJ2Z~y$sz0gVO&>sF1%CfcE8fiG|3DrmSTLVT>P9XYuOGC+X@xhl_`fLf(5Z`N zN`EV!UqUKZ6m3TY*p#>8*=1^YtAJgh&2QPXkTBZ)Ryt?+AcXVJx6uu|3{0cAx6^q$ z4c_8ylRXqEIaaNU|0;fy(~`G4XklT&2s^PLltqb=tC#`o;F-6*UkYK;9$ibQ*mCgwEvv~oZGzgPG=sEV!Lva z(TI0rd3z}>qv_k`2Yhw!I-ndjy=&1D!^F8pmYf)zdO_o#glY-0|5A0+YDQYlht|VI zBM|UA1Vp$ToD_1tR|p5;==Z!%8wBM*4XCNCt)HQypNpzTR8I3N_R&uCUWVofqxe3# zfD-`AsLJHgYFEZo7Z^^i1H6cC7b&)j-mdYQ2E#8Xv5vUhNmA@p@ z>+dIn5B&W7G?u<*UnT(JrUT#^_Q`0xk^6FZ7HalXu}uh`75NPT|6w-m*_R8(@60|g zg74z@yFK|3lxy<;b4EhiBIIMASH9oN3n8YTM7?Lfg>|5<`+Yd`dSbsr>l7xY?g4~O zJYYslp6@^*V)CXQa3Use34V9OdwF?x)V2s`Sb&S^Nk1Ow42bAF*n#&(kqc*YZBc=9 zP4bz2XwgA80_`>(bUTV5AP1ps<6JagK*fZTv2qal)0YR+>;oYpr(&`0P*&z9=uaL* z?nBu?iX#rW%tIh2HI(j|#NJ5l3xT;s-G|}<8;=~a!UKHf zkWCwf^N?_mx30hv$~&BvS_=6D)GKPn;hLFq{B_ME{dFxqxs69|$Y>Pf_|z$zYJ3b* z**LUhr56q-!C`#ha4IiHUXtWD+nD>YVPwy>Qo)fp@P0){B;)5llBrDylla~q-dW9# zYw6h|X?!ATt0O-Nk{#6pV1k6nBs%o5ja(nZA|kKg0|#R9NxuKJf5r z)Xw_gMPCUeOs79`ffS58VF{mCBVXz| z%Kg|2H*x954!DWyKkmw}M`OBoeD}w(0F;M5&H!4k#VMd>teK6QInLPD-}$&&`$;ei(p@Eohca2!5?j(%#_ zR)>lF8?X`CvotbJ9_R^3tdULVII{O=;hd24kSjKcDn3gv--DFgaRdS{%Vz6NrL}bD zXPwzP+VfeeOF%?w%Ko*8(Dhd<(A3tS_lAk3JE2pZpBn&jvp!D+9XaZA53udr&+~w7 zH-2v6>(N4=pk||ro}T)^6bV-8S}CCA)Av~!PT0@2=oECq=6`C~31+E0!- zZI7b9+!kM@tHg{Ba22C>F^2NylUP6G(v{xKC&Fo}^XBee5aPecY~X zK@UB^(xQjfRn@~`Di0lnY{mR@f<-Ji(SdJA%``n8`-T%{zC$MI`Z5>2bRvp9OK+XX zV9(K+6BhnFN;36emZ8hzL_-pb&|Z+XGlQzWi03b&IAE+F_#z&-b;}oC_9`9u!U|UK z%ohXsYY_0NJ>29CF>3cCKV}zA`_hxT8)Z^CsUcTR$uaPk`@zoprO;j!+hh`KAd&ig70*9G z-4q!7M4J6ol>I1DI-;p+#NjS%Y}#h#r*zL(UNDm{ePsvw{p2e*KPI0mip;$;bICi}G z4u)vW|006oF$0UrbuL|_m>&w@o9_EVXBJ8=KV$)WZ~VcZawf*CYt`^CkGsNiKh`% zPCZZK018bx?M4erP8Wc4+;KV!JK|%fvo&Wp_<{s^Za*r%_PWXiO@SbB7oO6c5M?9! zK8n|$^0S4zk!6?RDaN8|s3zI19@_kKHX!7w-%ND!=SVFzd|eD46>%oYo(5?-@AYjD zPAivGHP;93cu1$hGaYyaB&;HS2)2KV&P2h7eAgK-e8}6*IDsM$ohgB@*m+j^iU*&~ z1ee%wHVY8({<9gpBP#0l;rQ7E0K@ZV(*OyR&K2_RD8Uqm!(i&UWRQmQ&*cIUK61{( zd!qz_7-oF-Pv@e*9{zc*D}yihdl}*Ic7wCI-;H z^J(zzUN~>&gCOFhsju27`+^ZypLD+90$Vulf=e3~uJ{^+h#Q0Re|UKC_&t@r&*}XO zaln4ZE~Ekbv0sw4QQ-{H}#i%9GqSCi?R@vZB)ieCFoI&@F{=0vz3`#p`%KxN$# zH0<{T9H*G_dm#?MuKL{x_HO&{seCrdfk|UB*8E}AYULVBAm<-8@Oi!d@Bp1v{NaR? zcJUvnd@dyQqp3Uphyi1_?++^&yYK%_A;?VzIiSk6k(O!D+p9sE6rKD^7wSOY)tC5ncO`b~dO#oQ*H{#TIk5jJ-+Y`) zjk}b|AA*!y?0p&P=prF*PoHjBHYS~nYCT%L(+i_4e^Rk0KjcU5Bm~vS%fwM2CySE}w8uS3mDj(740|fEU(<3Cd(KDCR zzy^Mb-#h5?_)u7rshP+!#|w|)wwyeU>OmS%e!#S%gVT|~Yz#Ju-c+{HWM2t(}Gd*Uy~Z0voJ zs4*|wC%S9Q%@3&8M3|OXqOk<$AtV(ER9}Yij#@XbpNNKbtQY%KY-z`Gw9mq2xU(%f5U?ai>vJf?0(E;x zMAQJ>@lc~5zCR}NLs=R>j>h2u>*tc(j)k94NqM8x%CLkecnszBC$g0<#F0?uwS9?l zxiyg2;gr=}@AnPwFRju^WGh#&Nad`(_7&#W(F8G^vlRBVn9f-?`$n2mFZ)hB&zYNj zFOG7I*N@^K&Rpy#VGU#Xw$p*O6~@&$0Quyfk)0}@xPy7KfvNtWY}_F8xyCav1ok^CBV~kNQ<)g|jsFnx!*en-0! zP6xSJjC_KHoBmH+5R1S{!SPCQ8f|e6DW^IwoY6G4ZcgwFekij4LvVDI9TA3Hb-Kqb zCWC19DSw+SntG8JK}bBI%R|M45wQ(M6)j3gGO+$esO}>70nWuS0EHB zS^OBy5?QLa5{++76PYp0sbxgS-Efkqh+)aLOw^L=T1D$gLx+VO2=vMlYhv)K*t{13sy#x+*xjFN!6j0cy1Mss)5E0-Kiy>|8(bW*qbKA_x|W(Noc}@QS2Z ziji&&7$|G-<4PFyaRWr}cntL*6ldr`xY%{X^T9}aLEL$59L4CWnUYV4_M#_0*5#O|D@!BYKlz!Ej zyo?ElksBAZ#r~Iw)C87iE=B87E6L3X@PXtcK9 z!gQM?E~1c6My^d7W~TynQ^d$b415JPZc5mM-lqixYc#Vtl(qLEMZ`2*gv(?;JdX#7rxixEr~J@D-cIb}JfQDULvvtrEZCwj{P%SZpkh6J$~moM92w zHpCj;gQOXJfH?v_1o@_G#RE7e&(?_}HkQwXz?98n_lkTw%QD{&VLA16VhBf6^@!64 z1dh;ntm{##A{BrK)CE=}gZET!&?nX&J0{jfaoElrmQ4`G|MjK@>JhJ-k%7C9-bfO5 z2lW0!BFBN{@INukfoc9Q3UQ7!)?|>*6#1r)h`VsEpFJw};0gftn7H6zR`$4vcH*0# z5Cu-ueNvP-0o$Gy^-fHgE#gimI%2EX=482Sn>g-d-Pv}5TkqW3j;of=jo8=oXYjo2 zprg~lpG6Ygid&uFD6DBxFy(o1!o^bg3n)s1RWS<(cJk~+(a{ZE{E`^!1{8T&EWtn8 zD-ojLDHxLdZrH0=Wd(IHkNDe-HLz1ed$6WoL$*yg>v4W10AuA>?hzFT<%!sfLWx3X zW4f8WE)al}t-T3T^>2ds4%>hJmU@ZxccvQUVv#WE?FfbG#c(e^{T(sg3#|99G*-FV z`w>*p+aW&pvRG|j1UVf^v50@X>d^545tj<{eo(#~jYY6eL`xcM^}>+FP#5_GdK#GZ6k$iI}8a5IfvB;eKyeiBKu;;y)S+fxGf5p-lmG_ecZuQAzx4}V9{#&t;|KO5Vde?*UL)|FpG`(AM<6??{m1H+@i zd&=`CN^@Qoo3pVjuZT~wSvM`jAmVb+B@BFCmI^Q~&q23qNM?g&v5I9mEQz%f2;Q{e zoXt+iGN6_m0A{23CkM+S5~3EW9H-v{7$r6jMPQ?T;!^jt#6iG87xpEI<+)HW@nU^0 zlwW(XE0@`|1cN$DixXGLTB1QkMT(3(n202Uq)Wu8JXA>*Q}Uqa%;Ls87+#A&kY74r z;ekAsmS#ii3jY6hE7fZE?I@Q={hez5I7Ck$y3lEmVPIDoVwYIyW8F2cK@?;H65@i& zsN_`C#Q${_D6hnlBb{cDATOd?UCEfP5(Apm;AKFz&2OZ*4GHDSTBgkc*DWVnCM4uU zYu&fC-4vW97U#2$JR1`7IxVZbHdMb8Ime)4V?6yE1HRi_$VesMb`(=#6rVvy0(k{M z0{M_hmflA(v49zQ0g_hwA|XW)O7c|-#qt7X<{eNV`8Jb0Lzu!lB8iboHX#CX4o=xM z`|+wR%ItJPQGr0niAA^yp}D(=zJ)BKTQ_94QUBv>YHOwK!R|snq&o_As63~kzR7=8 z{BsYnp%9wBr+A|f#-O+Ou8`$g`vk;WDa+O)BYj0)2PpC)2qmgurpE@vC zYmm(taikMeWtsS=6L4oa1Q7CnmnC-Ke5oJd1XQbWtSIh`$vjRj8*jh|JYL+>nYs7` zROzI{>xO$+m^j`UTb^sh@14;V6Xo-87TP2_bitlJC1;-4-o(_4)~2@A(#%o-4C+o&$T!`2|UxAtS5G$x6OU10^M zi~6q2Yo38Ra{B2yx40GuF=f}y6i;@A(XJ6kyQ2MB;?J%C%(I2P8*FT?C>REEt8WGu zbGqT2UY%In4W_6bE$J80$g{c);#4{9NK)6NpE#`i7*LT^$;UN07<-EE*%*A|M}UO=bIQAIzBD^~Vmk=hFQ zD;6ck>TdNQIk-~1-V1YW6=dPO?rvJw8#yH(CPW8rYdH@x$TWQB+{7Oj3gLqH3 zRSfIHjM{poDQV=I_Cmrgwm~fG19PznHPpQmVt*eN#W%Mm|3(tXFsv`e@_!<)FA&_r zVn$yuZjV96CwWcrXkTX59#=0OBaNimO~?m7Ax=ROsPIZ(tlp;#lz+e_M)YHGK!}t3 z0Yq*QEBb*_*=kV1`0w?D64)kA_JdK_E{sK(aXUmo5vJiYVsa72_F1u{2<<&DHWYzJ zctIQ~0s?(eoGD@j+DiseS_VHKz6>uG67n*Bt8n^w8OR#ssAb8kqPah2@lLU^KQ=V4 ziGBTHL3Uw``}EVJes-g(g;r0~E#Mw8sTk^LFFJ0rnd+t*@~&>|b;u^5(N-IvFvP$) z4f-`IZy02#a->fG$cMirE)=6H-xlTp(7Nx4t^;5+-!lYnp5jq*-xRog>V2_j0KR&k z*gSxxY5NT#|83aJlLG(?4v5nOm{mJypbPgW%eyI!{1D!xTkGAIQNFf_j>DpEAUg2_ z@xVY#l@GPU3~KO_*f@-Jvt35ER9Nz6s#<+x z9dut^kpqFa@fX5G+;Hp#LX7g_SFZ->HE1|KR1-DBv5MP?JBFi6L&dh?7%wgk5682^ z#Lpu?Kqe=6-9oh3 zGzwb7Dt3%w7R_dqjIGs(L&f^^bchS1Fl*exQ39Rs5j{(w*1c#TnMU+XQJ#)eqp&=V z+Z=+HFb$TDGw@@L3d;f_2UjJxVcUb4C0( z>{458Y@WDLX8Xj3QVeOn*jtKaR$!E8kVNcgDEvZU9t{}ML5v!Wm+mNvro$hNn^EIf zC$R}xT4$q(TL8}P=h5Iey9jLz%S`Et*OSy;V5jOEj4(R++TD!OuO`Nifky5Q8IPiB zSB8bP-uKf3xv4UmEm7_3n%l0~?TL~!85$jfK2T0*wFr8N&@#-s-Xg6G>$8t2DFfBf z7qT|}TC2ci5Bh~q{lx#unAcr|Vrin}b#}UYqHW^!N13`ARp3;73{YN7Ic)Jj*`RbO zMirNgDlaN7mzHjjs4Ryq94uCsLp2W(ua!eJ57$5OmvX575h89ZUTUQ1F_t;ImY@we zW-N{~1? z8EfSpad|S#$Xan|IwC+M;*+;sgK3;I1=;tCr)R?>vt)$09}$bDvi_hB_fCa7^D%K5E(uVF_DX22C()csc^SmDm6(K2A)TQv3nyIltvzj2 zM_LVoi$$`bh8-e&8guh!P$xBT)>ZNsAtBEp$0oKeX10hx?9}sO z=`=j`1+i%wX2FZW8m0hH3eMb@QJ}m2t~$Z{if~k6ukxy_q@o4If z?EgCt0!KafphynxRaRv{W99T_`HHWL!&NX8Z-`&2u*lyO&T4E&-xA}i@m=qT#no^( zy(hL-0~5b5-l_)t+6P6rJ3*9;V0@jQrS#d4#{bJ4be8QNK(-_Bnq3A`bdtbU(zxzYj(!d^&*3$5`G& zamVI#EbULE0ZU~^#q{au-cQA?)A3QCiN~hnGmgo*H-sG*<{2ROPbgf`7G3`ZUIW+e zZA=!cW?*8T6!*`7UOgpVoq-M9*W%m^eEK&cY$ib8w-9y6cs0>~CRp_EkW2#xgkyUq zHex^Eb@o}~r9KL}@#F{mB%YlK4SyQKx%#M`n+XVY2A?_`Ax*uE!dHX6{#p4NDqL1f zssRc**S26{7a-O}F>3hFro@S`S@4kkf;^|Z5z^#S9v)nSSg)v|Ur}IH zM9jolSeUgs0 z42~4JC}L-`MD1UU1&)yFHyK}oV3xWlSIn9XKK!y+JR9@rid^5>T1ceq8lUQ#t4KqJ zc_Wo8?4u+SeQMV-6j$}gr?eC9S}fC0F{Kvc!NuZQ*yJ#=trjLMTzp;&-4Y@Gss$=A zpqVrfEDkYf4mdvJ|10Y}z^kgVJ)UzV32<)`AS5>l=|~d^Rb^~|AS%)WVu67O5h-aT zp+f-a5ZV>~bR&WwP0FAkUAlnCn|U+p%s4X5u?+HNo{lpkFu%Rey*J^#@4I~AoL$Z? zYp=ETs(kDV48s$tT~xsCc{R5HU4oBl&5W=_rwU+cV)RJ?5EH9g1&lDxYl1-P@j~FL zo|jZpjRO8>jB^Mh^co$1EJt%}k$G-FKgO{+zP=5j!jexMm2c^NL;a!0Zn5wl3x_mT3#3N9UOjW~rbU zES9axV&>jh2a7>Hck9>1uq92r#@ar*gE>%5%_^tqCnY3tX~rPYE5TC_E5YcZIgg1J z`l>w#T6nF*cTWk6(Nbqiob#2SV;rqoYuGq= z(l*`|m43ZCj-_s^9pjvqN$u%}Ux>8!4kEw%bbTBo=YIK10p*U=$k5eR@SUAkvzLQQ zxez_5k)?p&BU)6-A?f5*n_85gC)XLHd&wF2N;t@#xI`&wA`sp`8-&6pb>-BvF8@WNrGpO^L9-0C3Ri(Tc zD9|@iwFTO)G_B&%^M)5o8*+-xaQvB@DKb#y-oS0luO8*Df?^9r9Rl@tBq??#)bmXq zjhV7lDMVXCM2i}?G9m1<(bT&^i?(a_OwR94Z(#kTbe);W&0&{*HxrbwTeoL2xwn-* zi~jb|AM*GLu=9{vPVJ<XF!iystj9S=m!6nT_1;v{uh%zs~6BY*ziOKA+9Z&gnK~k>_cjscYMuv^cPC zjvIdG0xuir8ah&Y1NcD2b6A8+yiE&+EQ<!x#| zk003+s=jlcJJc1g3%Bv)+TB@Aqcr$;^qvd5?bNKRNOpk)Wg@0pf8ccbKn&@{w zp2v#(PPgZ=?w{-4`7F#e^_vfBK%YCG75M`#5=?pu9iNZjex|6izQRzB?WXZhH#)Oi7@>T3;Nzy^Gy=?nPWU$td{ljHw3*uu5i4}~iDo4#5A zb@;oY7s3quuUapJWPGRR7V_2ap}8>6S8!U>%7sp%=N~S{yfHXZmluLTf3U-2)l!LCzChuZDau&Pp^j9G#qcOmJ~sr==*1{gqkVx(KV)mm zVyyOR(^Zl+_18zHejRZU`xA^1n`Yc(vzmiG$e8$(h4$2eDCdFt>CD0M;3x&!^ zNQt8_EAtKdv{_$gGq-yBtkP-asqeGyUfyuT;f8d-HeTJA!0RN?`0kM9m$C2B)Fn7Z zCHf3=rHxD2V!yU5VJ^u&%NqWE3Hw9TmL-rof}|{kEl8!07A8rbik1S__#7_fgk^#hUqRw)#MN3~Gvz=e9mUBJ5mm=4GSYwtu zF_Epzz})NVJrW`d7e7P3}qsejx^sJRh#{OgFWD)$(V3UUeSwbf;%XaYzjm*@GrfD`KURoivs} z@rLj}t-33rCOy@LKb~H`!1P6_ZG-kyVJ4#wEe%+QZW4yA%OTVPPC>kl=<72PR~y@a zF#V_+lm>ru03n9uN}|2VIhtm zRlH|{d+w9gQ9MyO>maa`l(!CH^kiur*SaY>unukQRC+Q&NSmwPdPwUuWvmCPr|Yrx zfOCb4)5qx+pjixi9L<2Jy7&+!F@{W3{?Pe8&96wEd7-Oib>vJDun zEu^xMSyqSG;eQrCEz;f%45Lz4HUM}_^c~ePt4rF*nk-YVjTpEr_XV!|{o1&Z6ZaYaGD!N~+@18}x7$4Btl3B#9?F z?T#|R`!&9b!BuHq6)5F(dP%epc(e-D@g^Rve}z7)LfN`mUsnOGTjYHmvbR;OUPpSk zjXEisc?eUhkQaj)&s!>doo{Ui%^?ra@k-dE9R?i`Ljlq2hp&U%cGA?%lMoyBgV|-e z!#uK4^Z+~m-Dko%T6B88)x0wY0NVA0dQv z&1Y>yE^Gr~{2oHs41nK;knImpaM$NE&hT6Awfv9tlWZ;g@rUqw{)G3z+mQT6hdTAG zdce4n7*g_QL$6KFXRo!N{zCiTV%`6uPu@b3@}(uWfsfn81)ZsKhr3>2U#ZP@(BRkV zu^mS6uX<@a_wR4{q+j1|auTXJ`5U|=0DDDzT(`VQU0qv5vtR#HO;`W9o$>w6XM(c@ z))G_o?`pk+TlRMvwgcGvUKKl7`+sQF4$j^WdS?d=%0Klh$|C|?dw^XKrMmiR7vu2CyBiMH7vm;%B4KYGqg^r+j8VVcKzuCN zDoMmBcSjSab-VdiJssQ4pz2eY8cgaD6_SQGP~6+jeV+IjV^olCRiq7LLP^&fCMD1Y zrnZJrnuY&F?R=Y#{krnDb5D8_mH1Vg8<~8YW>hJ>wOLMW7&+H)rcsPF44g5SIpRSO z-OY*|4Q!-RyCHu=9E8mU8hkLlrBQCkMKHy9jSzY1+Pw$GPKG|;!=e$lU@xnct*S## z!?1lqV|C-Lr-_-IU(@y?zi6iAdpTjvV*;5M8tTek_%L+5d%@lJsNO!OWnxRdXk@QJ z{NLN+NWzov0~lLr%sxm|juz~rL2K>W2Nbo@XZv7S+Qyh*Ix7zN^uT@~rJcI(hi-RJ z(SAVeJ}uerG|9T3z74+=G9n@Qc>dTC*1V9n5f8+;W`AGohemhQ&HW&xpU}kSsI^|> z*{0fqyfX6JJHjL7^ljJI6h5qCBF%XoiLnQnu)^_ZaZmmXAzdf^=4ZfnXZ`pyutXPS z9boQ{>CpqA#I7nh0A}hIW0@}PIp9Qk9*?nX;@2DN-(hmvUCuk8!6()B9T@nh7|X+9 zbtZKQ7MSNc+4W#S{;Q!5y@On&r!Kw&8SlO7U8iYwpWygw=tTw=5?R&d87T~^WQV-# zMBm+yXR~BR2ov;L8-Z0aVk!%5{VC2?7U?&%;avpax!T7kA_wp~&FBd1rEFk~$^W3V zgAm+jC~1m#FI`U^#CCTOk1Y)EYn+s8l8k4yl-`5dHKJyZuv5qXvpxfH4)e@#rC>5-(D}kx>`ms~3*eIb5;taqAxuW2J1y z86ozLROb0Ae$Q!A`z6{MVxwW0Kp-Q0_dQsSQM&dX`#D<9VbH}G-Fp~hFqWF}s-NK` zTHdQbC5N4Mp2C>G-tXd9w5+8ghv71cb>T3QzY=>`nsm)`t;tGhYI!6#c;NsXgu-gs zGPOCvvX)aN&8Up)T8AogfX8db5#Vh?jAkxH_I~sTTD*x=%QV@lGIjlk6AhpFJ*`tG z^V;B*;K|AlrkI<;Yn#7IPalO(nySG^VS1+Vw!JcHBO^C{XQ|V9c8M0EP&XxP$i$>V zSC1m0o^W6%+;P_XqxBI${eN| zmMg}F#bu4=>&7v-_65OniBP$|C1DHI={Uf#NO{MdyB}N}?4qVBIDBKSq|mJD9ff^* z_B3m^RL76ApUd>gaj?pA{o^=LvqC8+kZT8Mm#QpGUBcAlRSi7>##^c7Cs0RpIY}Ew zCFhYrc<3x!d(Sy(ioFOWxl1``(RmOtDGF+H;|v5OGQ#?)#kgS$``AczQOY=vCNo;S z&jZj{nWNy`a|)DdJE^1P^bH;Aa+$e$12^x=#z_6>89oc;x&+0HRc}6%*2^ZNC^fso zpxv1UmFT(klzIx8uvua2JE^m!HbWuHUmQud-OTy`22<@gsusX z59ktXl)xZTqx<(6*t=V9qRyTN3H#OM1K77D6`uyjB`fQaljJudY12Av{$RcQ8>#55 zlienj0!Vd)F=C@a4qQWN8qWsHn0Kz%XK7CGo9T8fqwR*~W@zUrz$sIe?>otvS;1Cz zZ$oiH+=>QKH!ym|hMwHUy7fMbcDE*i-e&F}+u3Arh=JGNQ-;5&m(;01;k5%RYK z@63pd2YVh?IvgycXEYK%OjOS~DVd{;Y5M&zGCzc}$my zz1lIjGhId&{e+ihAoiod*AMc1#{!3vqCBLBE^@#gR_hB+a`GcoGY8X-iku8)geDlm zqk8y#u2r2P0tGFSJ)I+rb`X7W9c{nl)N9{`7XNQ|ooDBrP$TN ztP2(0%z?>7PX?66M_cUL9U%cx&u^V~>SRAYv5a>4Bc2F$RdZ;DnSL_DWR9zE( zHglyY(Pf1QLKg=M3|gm zkCI_E%uLL6H8(%MFvm^egJVoi@pEa}Dae`b~i^LyXVClF@l%-nmYob$|c&Wzu048Lh(I4j-F?rq1+ zG&j;jr`zedB_t%oM*Y4@%r2|(RrsswYAXE=$P01eCl)`&zQ(3}&GZEJRL- zi@c#}7B~Ki!B3HIj=#a@9Z=m^;cKXrnB2SD<^`i^nE?%gf z9zVuFi|*G)j;?O1@gpase~9pfL40dMsD4m&Ag_q7)1|Wkly0-@ht|%hlX8RTNu8Sw zrlYz{J_P9;ab_R0h(nPqmWoNwha%5S2Zy`#L#k(1$r{6Gn%>QZ)6M!UR!lqa_Xs+s zPvj-CHm$kGK=m&sMiy21YG3U9JUw0`UaIuL1L zljwM)iA|>8BU9KEGDmr|>q10+duFF8QD!!k79htLLh+v_(5@(hHa$cf-N|gURSVM< z*3_WYkV?83RnTV!{z|~lm_~m?EhdwgM?? zy{)fOMbo0KteS3&w(?n!veNEzNwI~sm1C;( zfp#xUj4bFNXH+eIvM7Fxg?@HNLFYP4fJnprnV?VjC_KIlGi#KbxhfvMG*1U3m&5UaQ5PwZQYK7c^A30)WW6Fn2EgM== zGH}4u^3g+!h7TMiUuk)WSTd63g?GZ=A$Nw*nxUrf2H8C!chPChKr7mt_}xgk==5>} zz1-fwS0Lq}HE$W|T>DtIlCHFOvNhyLNaKW(WN|tcOZmElD0VN+PH<`>FsrsE82EaW zJIR%85T_Z_T{|ip=uAQ;zYpbRaWtQqb!CB0-ADz7jO6=~ABCS0{>Db%Ousj{W;aoT zA)9Tc&4xU-h2|z=MZcwsE~=|kYilcNxP@~COQNX61h$Qwi5cucs54vSD1UujLleqF z{)cKF?I9?HdW`(eM9v0<T62VUJjvc zdy;9XiF*z}Qm(vme^XO+?aW5+pu&+;ht@VVC{6YXO5AjQq(!c_(RIxgRYTQ!eU;uf zrSjKMnzr^fBPAp!^?4l$X)1y%t8Mwdfm}J0g2PbWq*VQA|AHp@#&6=sMaL==X;E?l zdy7^lr?R){*<_FQPKY?zkvZwW%n0$vObeohJ2RQ?72 za^gWrRBnyej)#!-xQP~9!`Vr?&FbW*P;3xup2uw8Zw+^yMludRMOFTa*>%lm-?y*? zPe4}48T=$GD|pqaV_%ZaW@lf))TFVmsl?WUe~WUHxN<8?YSY`_(UZ1p{=KSstkSAJ z_6NFROV-YY5L=!^d3J~PBh*a_Cio0{4F3tDW{j~lOsdF`bF|U!X6NZ;yMtY%lXfHj z1-UNz`EOSaCW#!eU-4tWj~r@g^StH$+RB#EMRv$<_%X_Pah)Sv`yCzh5XROKrTq~? zTZ)ost0SKO36b`+EfWg|fBi*A9d`CNop-p{KNRmwW0$C#)6K7-%pn&(H9FffMz=Y= zb`2Hckw2oYwyDZH*k3!yKfR&Z*PxVXD827YGDJw-w&T^_xHSkQxnd#IxQyWIgVsg#e=^eaF zHj3ra8SYkm5(s{0W{OYqd8lD!bd6`(nSPtEh76rU_ zZ(1(TSI@}boJ^Riy`eqq3Isp83MouHgnsG=t5=bIRJw#Po+CqueBK--Ww%Z$~^VWFta{1F~i3C(t?ak-VY_owCyVcy^s;5 z6*7t)X{1vb$*e#9osrIp$d#D}1UMu!OB=+*?*7p7cW1`2p|mN}t_@@2<<-m>?VIN> zYp7eGX6bM`lj#D&YnPSHN+~ZZ85nM8Rw^)DT~>-#&cxiu@P1EZ#k0}$GGxZk*{lw1 zEZMTXz-z_X7Cv5n2JOnX(CyjLmI+9yc@k71C73XB*e5bNrn69qUazLeB>FVl12A_9 zzo(EhCx=}}BXV;1RMd|nSH}dstTYWN59Jrx=((I|Rza`lcvvOkWg|1GG}pzdFx4`7wQNv~+=+SrOs;{?LNb#u;NmAAOJK9< zYOaILA%{1W)zUz(i`CIg{9R8gyaV}M2pj0kHlrSYgf!q+s@UI$d4zol(`$`ttwheA zBOlp}LX7;C1e%l=$LGnEm^+Y}V_H@DeB@au{$qn!Vq;-?skLOq1@vN`jo*O6d?<}f z3d@ht7BM=y#7z15dTlYIlPgSdMb%9Uht|&X)l{oWOQ|AXLax>M7IqUok>3f3>P&u) zcAI>q0uajxN3tZ8)WhFi6B- z?r;6n`%&PKC^mWk>}`|366ui5j1KO>R^pLxn$;`@xmIh8$z&o$A# zofEXj8SQ-2lvv(`E$}ttyj@kbA2!i>RDF`Jbk5*AkY~cAH0cM8Q@y*B(cD3%h;GOa z*@a)ZG_A-;w|24d-AHBN^X>F{mw4?dEbT&O)d!*G9=hBmmp=`eB)Q3p7&ymQtso=nxFZfCF3knSG-8j4JG@qvJ4e4SQz@5bJs zx4XO9oAgt6m-ZGDTQ!y#HKulYOQ@kR$YM4-fEJL{Ev&@_MH7_toPMRG4%nez}bTL|fQ1 zoqbH(dRo{gw6A9_`;>m{>0qBxWG}n+ITHmFu`CY!6;1FZ>_(&E0E>^FK8fB#Nz_jU3= zAeu=dcbRD7c7t&CW1;L%a`a2m{({n4W6&4*0z2=2X>>oQ?GmKbs%fa6=c|w#&w9C% z8|9-f)0%!c+EqsT`?**Mo$1$0V;U`c)-FzKEKJnh&%$X~VKfibm@3dT6q)QOyONCPB74vOp0YdI;OZl}T6(LDnRa zrt~)hfGp^50~A}=Kg}2ep$NR@2rTCz3#T^(G;bVz&_9>8Csve&;m;|`1CX9vR0xZ? zxhMm+_st?3H=|~nD6B@&<)UOv2IBx1w<6O@OT(lAw82);U^fnSvd*-5a7TNW z;424_^04Lrx7QT~7P$jSj=?%^>@44}JMwbH!I#iiCzABkV@Mpp(eNQzT2D>%dw@B_ z(b21a4(aUa4S8v9g4-6g4`^j<`k>S)&Mm`m#0`xFj&csQ@P5cN1DYkqkMLF3 z%K0xJT!>tE039qEngC3-dZ+`KYS&PsHb4_E4FC-z)yW{=0x3O^E)LCPgUB+>%Lk)o zrka1^gp)Kk3KRkFLW)2q`A}a66z^@8K!DM7~eJ z8ZH_hX)Z-FfVOLD8okg#!F5zd+lE`Tks7&j6qeEz2Nc98Iy>CW$|<_o3!v7kI8_^? zN$@MTSkZJ_ae_8h6VC3;D4Hu-tY;kBm&QLhgUYIFYyFilHFeb$swc*4V$BZp*rnoV zHbKp*dSwhIQr3ucJ_*&`foG4nq;E^of!ktA(=D@5 zNABp`5JmC8L8E0a&Ze@`GGAC=Kfn{#qgi^EOIhU42vw5_#tSg&OZ zkp*lK^&6S2-KbIS6&q}5y#muqXxYegFkp|3v;mI2Intxuq|wq}jKV&Og{PFxkj!Jq z&1he38=xBNef0n`tyA?DO+l`s14C)xs5qdwv7;m});ubM-9ej2^<>NG^HCmlCtVqp z$L>i+gBq`!YDbP8oi?wDrtTE z8j2h31QIJ44IT`FQiG<@($TR%Vyj1|B;SiX326eAM^ra92KdMgbZE2@7%QgKNS8*( zX&W`#wcbdpW5X$DOccK#)x2V)U+TlHhPJ)XCTbkx;+s+G5z!z_4Mh$9N`Gw=D91)Q zvRhE%qB9rGv5J%*T|FlN%(l|SF&6d!v{7<|+=GQY2*GT+_`ZpTj5V|WQN`FS_7JTc zn*n(B+*mv4u#d;40A&3;HXR_#GtO(`E$s@etPmX9LZj~JU)xRfC4i)_a{bsNBHMVZ?TClQptooz^cU) zY}!7J&VQ3A4w#uPqH<6}o!V!-Os`FF0bD`t)71%K>;Q#LbZf6@Vv8PTqj;hoaBA#C zCwqdequUc)PadT`I~rPBAt2Er1a=pWSf)?rfcY=R3NCjNjCN_t(cU_--DD* z+EKmSa-hRP4$TEF2G(h8I8b9li*d zfwq}+oGwgBHJ^Z_9Fi8LQ>RwjDP&ryaJUhis$xPETsTAJ*QEe=q2D5_)OURaxing` zBQ-k6rhSbZGaY=)rh4cbx^SJ1eM>P@E&Mx_q{xX$Irr$OY^t7pPZOu+vmfZLscG!2 zY;}-dsmmWBX}~L~9*|nFuEAT{P(8D{HbBSzjB?3J{D<-E-`vy`*n*v>_-U!yg@9HV zKFt6UY}&L`{tIelt9i9$noau^z0sFB=)|-r{u@fNXxfe>3iVk4(VV_C^B>4lwj`j7 zvB;ny@yw7vX__w+OxK-0$#L!WC9}))uFt`*sOB-~6gfSKUqvdB%9>4TwuiKnSPA=Q zOGM%H7FJTDn&~;L9c`GN!b0ig>3NLPx#>wPjCe%`aF@3to#|+7g&WMx!irQax}8{d zfF5PP()db`mefvd)mB#~a-*stci#IdC5?5cGM8JCmr3#M48qzU47Ams0Jl)SznkW0 zC;6?&0G4w?DtYaFCjDrCU~pWt!*A2v?Ets!^rPR%QmEYw516X-87c5H7SG6oe{s=_ z0{9nq%*X&g^~sEM0H&+R&!)VYDefG!C`Vs%bI>qzd~%ZwM@U&;_vy!MXXr0@UPj8AS z8&W#DRCZ?|otz|sUkZg=We-Jx#}h)5{VIt8V64<_VW z_6)WWVE)SIg5dOzXmL>VqTSUgyf;L^N@XU}`RYjURsU8y;JviWvav$yKFh}Yqufbz zPa3J}u{f=$oiYy_XC;8C+BqwW4@9vCA*tE=h%RS9+~6f*Fn%BJU+uzcw<}ZIQOw6iMg6pCv1w$j z&0{_)#_vj6RGSGjv}_TWzS{QMjCKLP-gmWe&Y5Ud0*L=`4?_pZeyT!|T`aqgSt8p| zMK$%V^Rih~QbQp|9q;`BLON#0@59iIR(`W&d&$6*OeAn`v@`O?L|< zq$Q_qF$Mspbqx*xre_;cwA-<6Mw=r_o2mlCbI007w|P0FuhE4ib-@kxoz$x_o!_M% z2c(iH?88~Knj?49szxJQL60;#_$ri}MPUs~jtKhUSGN;qN-(*4e4h|Ez~5NWP+cD+ z(AH2&lUrNcPLk?kj+ce&rISK-H__}SD?rs9O;+t*wHm~(WlSHbCYmx(>*yHj3aGnp zOtfWM1R0xS`FcD)nOxfwsb6y>@K$ki7T+lI0=vsq&A?hnX408^;HYYjW1Hw$vzKjN zJI@Q>V&1$oz7@skYG)<(T3AfDBKo$qqb-9m%JZVM2igURj2JpKF9xp0bMw;q|4<8? zCFs=L`7uCNz2>I?Q~BnnxE@7`?EL`k3X1@rQP6%qrd~xlieH_dz_!yT^KJYIpxJ0GM^%g6`U`c2xge675_N#dgz63$pkg)H1GFow#

i0)x_)50j!qIPN2-YV(7u^+XGxZ zdwq&_u$|l)CC4`aPLzW%mE-veDrbnehhZDCZ;0@`ilo|)Dv&Mp>1f~dR*3T&N?l^v z4A`zYHzWX*ExW-9Q1-wL9&lT4+>pxOfUX9CD+J ze}pDd>A(Uj-FagixUP*iX7>IBdGb@n`I;)K5DXWTM7U{6UN{!V zEpf7MXu%R^(zmFhz@6&T!T_uE1MPsoSvs;Lh5rlz@TwL|RC#lK&^3OJ981&rc@!my zgR7ZAl*KTvfXoHtS!m4`W0Z_!fo+u2=NDSNG)w!nT_CjP$Wj0*h*_mWDo*a&VZ^1_ zAL>!9F#rnOsiF9@of!ED98L&7YEzMa(X?e5{BP9BQw#ISWl83LkP3c{cTi2Wg0=r5 zGga=Y?R3Bp9@WAZUq)_vkl&-+n_{)A?WoU9`HWHBO?FUZD{t}weC@l*1@Lw1rd)up z=$rEazWU&IIMvI3zGk$_4SCfzs2So83GLQW+F~a{~Q*vlXmY#4Twoh6--! zpv8v5WvBva+P*4|;zdGCQ9~U*x=&eyx;3Yp z9YS&qC|*3U$8YH*2TGK2X~Fo|)3q%)7e2xwj`Uy&N+-C9ZgX)DYGhE)X-@j=wpbv$ zA8xbpROC73ZU=jXW`rH6jX_$d8q=h5xRip9Wi{C8kj`vD;d;95_V&Pm8*b0gGDB&{ zLQ_~LIa9Le%m7QYgL(mN+WU?e&}qeYqyzpn-I2=kP-38i1%@bJ zz+;<_jCc{hg#|d=0{Y~R4Ax=o@-Dn1N?cHb20HK^H?%;Dpbxkc3Ij&qj^%M6;5IC` zurBn>@-)_ijxSH=JyD(}?ki+Yk(UND*9&R8{O-2l?L*VU8z88JMPLwG}-aHQb2XF zyDhAQY_-^+^y$jNV(wFOs0pPjMYYlDp+2xX4PmEnQ56ZiB8-d34Hd$ z-EO!aqgHs}e#~FtW#eh;iVl1NqyXN{v};8en@G>CNJY5Vi4_@qG72oPU2rk1jDnAG z8#bK=mu5wdtYK=EM)FYiyDsVRFt@pk{V!q>niD7`6`Yu8amW z`)s8L(CqR`2Z$=$s$|_vNJ^Y9;&sfVRjIe9`c+{F6Pv%v$!DQBSDCCSQL&Lj)TEY^ zV>TUIm5vCpzgJ~g=0HZ$%K=;ls8fJMNG);$-2TYbiP9Ij8sru75`}LQGlfZ!xuMGU z7Bjd8F(ERe0p-aG@WzxNqOU19Y>jkbwS_fP)S6t&e8|X!Bu$f7{wkaavm$FRpwVkm zfZ-Od$pMCYcufW{+>tdlV7Q;xSon>om)06U7^4*F66Cq%GPw747N=fmY3SOS2640x zc=6S1bs)kvtWAYqa{pQYc)@A^vxu_Gr9o5ZhBG*zhzXK`hh(qR?~`mvJuL)_Z|<3tP}Ti z(!ELiUZfCxU`rHBpM?rtb#H>UF0h0Pnb(H`3g71={_gVu6X-qm}hS{&(@v@RbCRhvObJI3Hf}*Z570yCJGP zlDffxP03SqYJ-*Sp-UT5Q=Ud)5}woQbuMhEsDk&Qu+xAsyf*=jur*Z5Lj zhEy6F7grMz)wOYB1i;?I8(jc-Z$bWGD6Rb6O)>W;41NWIa&fmY&xHd9OdT)R+P5D56@te({>T))x0sob6c5Cm4imPwH60h9c9w=}d@;{`v@cSb=zqv&F6jm>p zC5hEu7Nrj&`p;%?E7;P)u=!y z(a*vnlqdKC4ST=|mTfkE|3Y^^V28_d`vX?EJl}dC1$^4i4|HIEkn=%1yqtX>%wc~~ z&4X@GXsaGfxBr7D$-R)8C?f`zmlqBmICVg2k(>gTLdCW$H~^R27)jT!Flv`uR!++Q z;v=vKKZ&K058E6>mA^)2$Dz)`BsSBRr6S{M(6MkPOF;^B}@p(|ZIt<@3_DM#Hek1{#BiAFjax?ab8Z({isf}b5UvrO*iM!B+bFaQY+B^#OUbaA_#^`f{Z5J`rLHengh0#2YlH06n0tuI%Y0WthwujH#1atXM?XDiON zKOK1@8D7sHo^bF1sICIn!wZx#97vf@TH*2>^kfR~-Rvh_+E7k;6-Ei$_%H|u+#QFX zOh_A!l;joR-)@*HPijo9@-N=!mNu+PD#PhL8W&&EeY1mGAs9?fQ zr)50y%X=z?*FwA{qNA1es-qj8O6T?RaiV@6=Ffqr;z02odny|g-{q&= zaC$oTWbmez_erGbdkk=T&fk*({I_+F1NiU2o=o7svwN)kMo1;oq9vw?;Hxa=lA#i- zo&vXD`gAOOpHrVs2IO1#v;&ZD!_#g+zL%cP(r)1tdr#t8pDrH3+bTRycFe74FTJf} zdOs7+Z$nl~P~@~{;nod8P#@C=M4bk1H zl>eMgTg&N;mQ3Z(wYL)rB=i_iH@~)~&Q}R@6d*I@TE3TVelCNpqbHurV}g!9XJ_l_ z-{;)g1|Fc*wkAYU@8{z|-IYF{!#2{Q=WXnMy6^c+z6s4*LG2~c$>*bi4S#yxu5ICp zms_3_g~0#5dmV6jPTkv8dyp$9v5b4&wKo>-&I5b%00%GZO@q7B_<{q}T-O(Dz@{Sl zeM`;L3I&lYfM&HoBbAwu|_f>JOyxPmymG`{%Hvn36gW zD$O-b>I*-k{RdL{=O|5YIXY!Beu0$iXZ6Y6VEEo~@*ebPCooaBBn%r})!YyaMLq>_ zsfW>OUClhdcVI(9T?2^kL7+I49zG2LiCbFZ&Jd>%1Q%y$*Fnk2y??NPe+4-QT{qQ6 z-cR)4=JH-KYu|9Oa|PINwC6_?A>X#lhXa4b(5hErwC}iz0+R?`7JpAKy<)QefQIA} zx`vJ_Y@Uf=Hz{(Ket9L0{Yc5L+U-BJyctNxc^Gm8Das z?NR_?iIVnU;a0sK59jK(*Yh1$AS6FtDfAKk+GdR4oH>YkkRNrG(}ma5w2&~dD+d($ z6EEu-qrx}RxQ30j3sKPqTKa~;)($B-VnHvR_Zr4Cly<+-fpOY)(h>OdP>Omp9>~)E zriX{4qLVIH*&^FOkdA8KOfyHI@JKoIX(I{5F(ZLOYFOH$hZ|37r zg7>Y?IFwNNRtAfw6>p_D+e0t`)y7p<&h$5VCHx%apW7U?`3ZFFtz>S1kWC`N#Na#( znv+CX9ji3aqpYeCN!eL)#kZc+8v+7cj#@I6yAh$ta!W(dG3%g()1!$%Q@2h`%;6(S=+m6=ynH zxBhP0|Bi)wkdJ*G#{1WIq;oj(-Bf_Xf_F0j4v!r&Q0=?1(5j2y&E^@9?5RRx#RfQ~ z;VQoPZVqTc`+FXqgR-PxAb23E%}bTw6w8Ka6U_o%GIo21MAMde4gpyO=|E ztz#IS`pZOv4w+adntG@JEZ>?#4gka5_}vwc_W&6FekcWy(0sTvAYs|z4!oE8khvCX zRLfo!Jr>fNb{=-IzI5!c%ia$HvcLbk*PT#0M)r3h#T`j?4S;Ny0IJu)%ZA2LDgqyo{S(easM^l}ps3+%JVG~ZdRLOOu)>Kg8l+lAnQ}{>-Wr^r= zgv6XX8jGV1SCCnb%p`Rnu;($oHad(-ax97Rz>{nwXf?(_$VBIc1DPKS2b5fQEJGU~ zCULzjrnAz}6Ch#63y3%zMCB8ak|%ROcE2B^O$rOdxD;2HaoGnp zttu=KmEZTeaC+ebBdXcDx5wvO`QfLZ6e1&FO`;mvwL#+g51L^2Tp?p4)If}LV`6CB>%h4aFYYSUCG~jV* zoeI~J@8hog2K5fxTnO3!*uWPdWfI#CU{7%J;|O*m{qV7qFGeO%H`J*6lSFMvn7E%1 z$kI{1!%|gSenG=0349q+7U4U<%&j58H_?-yIDlpked1)d(78`sATZ-T&0x1v_fM_- z4pi`{Lw`4Xs<$pjO6~*XZevXC>{?(&`HVY}jT7NG3IF`3@gOnZ`P8D_9Yz-%2Kx8Y zC}30FXHLEnLTO?f$KJQ-Go!XDOkfj}L>HDt(c;e{wbjt%+fDiwUSUm`IA#KOub2u@Lao}#VC z17XtX@aH;h111)z3HtH#WXpZ1Aa_u~(@wD7Er*>plH-e^z_Ha|oZ@t zw5?&}N_6U4&hTzqd)y2JYdP+OSGm`52Y~Bj-J8CD|S(?%fE*TYVx*dqPbsT6H2!dooP)yB_?&Qzw%6 z4m6M&48abk?@!2xzJE^S^W7-0s?)w%Ei1pMp%Q=PHSWacsqQ-?ju`4v<+tobi%N60k(RA9_yv^pkcNkroJ!^| zBIQw=!vd4pCFbsvV^D>$Mb&V05{^CL*$6M=`Gg)9H0)Tv)DnJ za@x#afq+dqR-&%aAg|K4({{uJ9ypx|%zO5<8}8@mGg+V+yPa_Y>P|RgNBd;0g=$Fyp7EgX@foJ)jFFlCyvwvknj9;&>TsTE>-B%6}i;KUqgIL`3RjPI( zjOJc3=odEmRVe5wI`dT?J5BLlXTne1^J@z{#N)m$;9sNpl$L{XoF4l+mVcu@cw~+> zB{*K+AxDMFG{8}b1GV0|+916Bo-TjwLfD?;n+~?K5R=0*&Oco-1Opd<1!xJ=`w8|M zUh!|@_|K4%5n48JKAuIV1~-l8S}MzfJ~e@0h}N+^Pv^c#=NBN6uc%q?w;szyq~z?9 z3IYU4q1@XCPFVdyHQzeGI^O+l7XJ-W>5@gwQl6IIRr1I<@L~KrBX~&Lcd5XoMc-uu zm)3pfG5-w#DcQeHMhN%wd=(ULOKp0;Du%gT%`U%hi`DfenC?u_7TM<;~l(W$+MobHnJnY#hz}CCZ zW&yT7ch<$*L#oARF;MBk1iF0I=rJH$DxR{I^D6L@AQoR9SwUt=@?3_N7f$w$xNPBE zJj-8uK3yvazs7F$KcAp=3Mbz*1I<1k2MoLDd;u`*j`Mk-HBX+;0fvpd;0A{EUhsm} zoN}Qn?=7DpZ&|RkV)8z;?}7t3_QVAz{MJ`4binbAf{UrJP+ejAEl3&u`&VKk8 z2QP(8U@vg;7b7l1`QsN44$_)`l?Q42{VJmiXa4HYje(RzcIteMGH_$*;a@WVERXz} z&c~zFB%Dv6dt-l#Vup*Mfa)vgNJy^SciCbMWsDUWq(&%Vv}7rB#zt zz)vfF@4{!GERD{rNTd_LoA^wmRQMIe{tJCUyZ5y|V2QYT_#!AsXv7EW(&RC8}G75r%dSvlg*6iXvy z0w831Ij#^vND_RE3Wqn*-GBCmd;6U~vy;r6cn%MQZxj=wzoMzjF}aGsqG{}sy?)5*UIKyJqU?F6}5@OMX$oBqGO{1!;1 z2M!GF_}j#9MKVbNnA3mjfDeE8y8!sm@=ppV%YOg3Y|BwDZA^gqz6 z|2P2(xBQc(-5pS9fhge>sFWyncVUL;;FqkFS@Li~D_OpZa{jfz`#t1eH@x4o|ILQ? zTm0+h1j#gYYW0hMS%O639t=?cG3x@6|-kur;IZg$OfYXjYX z$qC|e-=zW&m*+2~0PqATa+`YA|8-E@`PPtpLM>P0nRI3AF zd++^#x!DVt=LQkMn3cUK(iwAUFNM=VmnE{SxuHIAQPVzA&zOz9ELJkso$p6e*p&pX zlu6{TAZezNu}LCM!%4E&gjHi^?e%cV3$;X*lm;D}Z-xh==!2(@-x4=y%){OmTQufk z?}~#O>jtb=f5jkT+A%#lEKKc~haW-fa1px_+9Q~)pz{b7V5nBmv2Yc)qz(?hFK%wf zImZVE-@ z#Ne?6xN=;JJ2`95PK!;PdD$899%otnOVkLM@s|D3*TNEp-uOoJ4#UWNCyl?8 zeJ_@Uu{`#J*d2xgz-Lh>Ma15TbNuJSn2!A@{t9Cb_LDG$vjXksaOEnCC~K|>XrptY zHXLnS6sy8ns^u3{R{AJFca_x1>8pD4S8*hqxwYTJX-SL<2o%XW7RUY&Svr=l{TWUx zrB|YN1@0bn7R=RfLQz@b7PSEe+cpzWi}<=j71@w zsZU$l7gi#?6>z7)2g+5xXq>>60?Fe3NHi5Mc0{t?S_0_FNGu(Bf=G3gLEu)VOvH!u z27p0;f-j2o;70X8IscxG!jd)V=qg-;dGFoJo7+)6k(PB19F=m2kE2-^<`mH}m~k$YxmrU@ z4cv{iL|DmD)s3z9b$P_f7)+^Du>;q~u{3cahM8Hq_$vkS#tOc)kE3hmRL056?;1U+MZHXa@nAfv4iJaqSqC;yU^(WpK_ag`>#hyf(Shw2acg^)$cLyt!3800lWr)o z0&Y5Ssy!z9Fmb*;D`dmv1jy2gb%BToTtJr0Mu_b!bXaC1HNLE$TvW}mWvVtX2WQmx*aSKYcNJ^Gq6-`tWN4WaoWJRHcm%N`r0Fl zTF*s|7jcQq!X}8EMCibY!k5T0`6N8wN(V1F)X~bxNXcu6EHM%uwNepN#OXvfj9n+P zlQ29}#pooK!hK4%V6s_=Bo@P`Bblol``53CYelb>;#3lIJN+n3kkg>$ybcDfxxUR6 zF+;eFm@_lQa3dCUl~`beDymi!B(ka*^+IN=hsj{J_l+zexfV$|_}6X-y57*g9X7B|~(9Sd@%z zUnt)Io?>wj)Hc7d^%Xu}#v(;54lMG;$U`jbJx)=3Kh7_vM)YjqdyEjc@hYc!zz1S~<+Bb-gZOm=m2tl>e zM`W_PB5FjCc)cG-2OmiknRXV%Hi<5FW>4GtP%}O+;@vEt?^U%64ke4JZiINhfMnp-yHWm%7QfnyVv`$v z__BCi{%^nd+07i<0UaF~mMAg*z4jw z4@>87AlIb=u0&i4KItvtO2O)RTa=}+RQ@hX)h&lnqYxYrI7s-OPQ>Hf>J{Kp`pa#Ftsfa>h z!vRfx95QL*+;g}ipfDZ4=!C3;%VTU}VLH0#q*$4bkvoOli~yDT`JWbk8c86o3kl+K zI*T%%K~j2qic|nh5Knw5oEeyNUj-D^428p>lSM801<4jKg}fn6P5Rbl@+%4@lcG+ZgTO-c&FHG?MulRK z9r7E>rJ@e9;p$MuAlwQPaF70uV(D}*tf=reHV*LD;%-qmdfN^l|DkKW=11m z=?__=6Vq~Fee?q1|0yg&?3Ae(@frSCD7B*e;8v7T1Q-%b$jWgLXpjG2Yl)^77WW@B zLJm#5ULCT{To@^8a-k0s#KK%4F9Rwmy2C3SdhpEG*9WcuNc{h6t@Q+KlK3(guVxfc zKwAKm9lcmgW--BwHDeJAz0d)m1ij3u+4M5HOhhNa`q=zoJ>c>4Doq1o*tUd3|fZ1 z^=d6#VimXuB~uSvj{9oznJ!uKy%OxS5u^o3h2-efF=s^ni1qm_j^{$mC|#H!|AU7P zz2d!mmS)LAkz&0hX2UfPehJ=W8~J)*W1~E77%s94u!SoSeG9NH=zz8-CWspg&^evN zL-K!J1pLZYOII`%fTnZm>l*#nL|S(fp&c+2x{J&XSl&HFG46=5^lA}raTLC_HV9HIZs^3i z0%q>%1od4433!TXFhTzAgf1>c+9k?50`Ge}LrIpY=2zAv#SX!Fpi%OGg?iVKVp?b5 z&{5*X&Oj;U;<3({d85VA&gj}PdQlgS9ZOsnY^KJcflk4rZ(J01f$knJCUrqSP7q7G z0LM?n2pu&_t)R=2-#iI5dHJOKZ@k^3uy788Zd2g zAp0*tI^AgnNtz>qPzBd-5lZQ zjuEZZiz)lCAh+KE{Z%JwyECs=uP5ghIpX}Y*ry)BJv9KO-*rbHHi(!WFuINEqu|z2 zAJil!^}s7MiyL|{bJ{$VN!8L4?I$CI;3pW|a*SsIO7l>vw5T}T1F-3OalQw%%OaFy z(Dj#{qDxN}>t2kcvInh-&$kf7e}!Lu`w|r50`uhtaYIkM^ipwqPi$0{=|#>hEpH+C}jim*PATPM={px4%m!F_<}HlTe(98NMwCMQxcJNH2cxGZ8< z9~Pl)3~0uqeSm=P7w2%zA=@na_GRgTebg5DcMji*Ml3Y)Pg87Lq`@}id2xARve?xZ zOX2}>s4ukZLn=2&J&LG)I4SjT;8nZ#!>c|b2KR&5qY!gSH<`GxAC%K$Vog6*z#m6$ zs@!h1A0vHtvteB1kxg_+$ae8tKTsr3=v6R({==c7V<9%8Pl`c>FabM6eIYt(r&w2r znY&B8TFBg<-DpkD7s=HqtFJ6vP(kiNsiH#VWf5lE(@07z9XNAX(Q^DXU^t%<<^2Ib zpM?mhKy;CsoX?3}{qg9%;`9F4V!a@E5j4V!qM!)&<|Ta~1_}NW6@$d~iA_aV`Y(%D ziZEmLqa}~xkGD+Ii>Lvxga<_O03hpwqMQ8Rs{)t&rGXP%EK{$GO#?7IZ;BTOu#Bj; zP}zt#m6n%|mKuRb!v_N7y`vX#xa~QzjXHc+j2wt*@t&A75PJKNSUr#x@x!PN4zJkR z8u4&cut881$54Ph!hs~S9wG8KL&dJbWUpae$_VJ`k9a$T)nl=c9jTZf>- zzY(tw!Lz;<-w(kceJ2uzVo7`tSu3%w$&rDR6!?^oAH=kwu>L=x=s#ghon+z9;=ZAH z$8+MPq3GxfdKDP7ZWs##KM2+DQGfm-3Wj0X{VGNdL#O{H<_v=p{$1)xr+9W4!1&+N zayfzoGgsG3Yyax0z;BY*5IEQ+(PubN#AW#@EuP#+v1mAUyjPHwEDE+UV`RC!K25&V zRlRs(IKB5aEi!mW};@@Jts2(kJy>`PL7r1C3GD7)jo2uk%MnT9V%~TY;s&LJ# zcaIjEMxZBSB7(52eP9-D+M}niMLBZ2fHK0l1Hy`T6#o$8B6P$((>?Y z;Cainfaxev1LenNvgMzp2!3RSs4W8*k}0;9F;`I*B;~LLPU^Snw$|m5jdJPtz;PO7x%LT_=V96jGh=to0=^cA_dVvP5Ln7Vy6q2)Y3EUz@Ig(|<)lPFe<2K!tj zwu}Z)8GvcD*CpiKNR2HJHbnljOQ518~VK?I{BWPq2hIey z98A!4;?HqtW2!KYXF1ksc&?;;TBE)Tn+9N;Ap626rjCa(nl9f=F%Lgv>O@wHJST+%( z+bABJh>vd)Z%)L^HH)(o@mBL>eMG7Uz~X$7GYMr2MCl|{UnrJN!aThmBFZl+-k1aq z=LYeKlvyPHkur-#_GAQeE`f|yktWf>OYoN>%SLB=SR$0plwZ3{Y@Cb{x>-Cs8J6TW zab_~s(Cv`JEy>>|K|kZ4uaLFG+iqMi8sx5)i{dF5$vefIDa@kXr4(a$qe3(*#A8!1 zVONSnQeu@jH-&X%tA+bI=JBjSOA@-Y03h#wZ(Lc6Qv6FhCvmaRbx?dH4p(E|t61lI zRMGe~)-a`K*NMNc1GgrS8@L#&*Hkd&>oH;onG?-ZLH}$(*?*lldQrOR4P&!K^qPil+$!cwW2vrfkpKVKlWYFk@D5W$uk(&94&rc+)@GBZZFDH6jLT%t$>buNqkX( zaos1bR$#uoEX1K<~k2y!{7#Ea?5;#6Po`P5UE){{6D$Usd^2^qP%V`b$ik%?zf$ zQ62w<46dGmsMerk;GYO}a5PN8q<_V(*`W9@LCh7HOqWrUUq;%oMsJOh|3FdT?9G+H zmrtl+aoW`gF}nten_-d^wA^$MO*c$Mh@N<@24<%n3gnq|3nf1kCF17b-sVt|I0tK( zi+*#UQNzS_bD+e-BdPDriDK&<(672k6(cDAUs+cIR%Mm`IXAB$_g+9{yO$jVLIqsQ zN<}hFD-^|S$`#k#SVY{}+&2Wh>dzH5HBAL1cTGVnbAg*n;g8iR|=i#~Myx;lGch391=iSfs8C2_9;rkghEPHdDc$Sg0BO!}YfCVX8 z>cmQM^SPgb_HC%b0+UGf7nK@%&6~ zVh6sE9*v_cP%)FM*%9kzs&3(lY!%7SZGmP*HOX3)DJEH*olAr8%S@7gGFs=U4xyb1 z&Ofmt&0rSQAeXe!m2El|2dufuo6As;$NhVZtr5-}H$p885}9l`!+W41kC^)u?&fh} zdZG0!${xM(_$(?}DTFs<>(s0%EORL78#0eRSU*d}gr>4vWDQr1Xp4>VF}8x4XlVDM~WaT=!2=0k(9R(=h}q1pVX zbQz)poyqrSlk$dgfM9*7rp=+|o57zBea#JW=FpS)B7aK(1AlB_gr|8pe+Gy`=I=i0 zUqbyHZszasw>iXzm*F#4^^JUmaDv0lb%thvnj?@qSBq>r<}%h`EIyj663v->#_s%e zp&b$Pl&5(df3iI8o#57VEKHg*(^z*|)bSWLk6d)3AW8%_%%cx}5`kl##kcKvZyxO` zlW}7nC-W+Pokzl+Vqx%QTO`gWZ=Z^k`KpU~8sX#I1^M3h^^9*S);FDff_b`9Cnb?t z+Cpduax+jjpYl&OL87ICyx(tX;^mQU|jF#RN{K>oZ-U!3$LLN=4EMoP?;X-P# zt8t-Fbv3Qw%G3W))R)IZsl_?AAp!%6_@Q)47x9QIM^O>K!HJ3@?&k*77SYkT34bpl z&TfWZF&%ze_>LgrUx4>4hOW$#S!~6~VlKco6crP02X+^$SbGKG=o)gxhG*vp;4Zc$ zFjO-P_lk)WyWv;D^?MDyN~px|VP`k({KPuy&?`&mrQ2(9KIpEU2YzZFE|gG#JAhjy zIz<;6De1LyV!Ch%Oxa$bpm=W$7 zj0cOzylN1*m{C|qEx7Zf3T@d{W_=9P7V`uJoCC^XzDE+~QKcg!b!N>|816q1DTG(0?hFgm>8(;vDg(aNT$bYnGC3-@~b;#PZAdcqza5Dt=kYmAZzQ zWfU&!^;zOME=#_p0n?UIQhr~^!GROYcywR4Jd}^+*Nkb3fb=0u%ehG(A$d6k)<0s* za?b2yPJ)^2j7HeLoILLn{%lm1y`1GOyuJ0yK4r7EVe<++srkVQeR!~(Tm6~tDCr(x z&32bP``qIE`b1kyEvKVzmulX9bmBim~khD^To4z#`V2VB={)`zbiL2kCoHW$;FMLusi`Zh5v`lD} z&6N-TEBnNLp}CF`yeYiLbzuuTJZ{N*8$BA{4CJ${Qb|ESuvKI%L+O;7bOL(^>8r@` z?_$O(%B%mt##NNpenjmmlG{J=M!1QlDXN+D=)80>*xSFivXA8r` z<8YeY>K9yJ%~R|iZm;Hd-WS0pCRmsU-)&f@noI)<&#xignAmHiFnFgHrQ}{M5n4*b@e`G+^EO1Z3* zDN2bYR;aZqA>77+w0V}sHpy^yJF|V*q4Ux(cCBh{_T^6p)D;z`W1ZUYXOO;{z$ObW zd(oCn?U)1-NyuDJ>PzMrQM#yUlLpWUN7s{cbi-%z zuRC~WOFOT}2q=a^DFYH<>cND*AUj4m>1}z^O0R6VlXqyM%*lB?g>6m>g*~m>rEGj& zFR;#13`H)rL3J~wSj88t@96Z=NzaX#-3Mbg5VKQJuz^bF)7ZFyVtQY`xl@zZ@dn?| zxV^g@)N|$m>|)u+7eg>&BM+v5$k|8>>~k8KoD4HX)kbAAJ#TeZuMWlkZ6x-k;nqej z-5@@wga2K%VFn{%6Kxsk1}0$4CS|4!HF1+lG!3;%xSgj?w$HE%-LTrMm(N2c!eO|* ziNyCJe85#7j-DXTd z&D`=a7`>VJKNf2@lPhNm8Tjj5Nq@3 zZ{c7Qg{B-R*us$I$yN-e+KYW#7>4pHj&C7iO~DsiRJV|+97?OwT4^1~df#(haTe3j zaVz0wVAxj9Gz$e=xt-bAy;Ze~%HdPO`DmSG*)XHhLF3J7x$NT(z2Mlijgnj*e}!lQ z@p{G(NM@neHXaH2#^)6hNX^EEZIt5X5VpOr4&2;EoS2LI+juO^L&$cOWS-AXU6E8` z@&Zi@tj>sMgRo;eW$A@Duw8YGDjJ{8%MKM}E+TAFV~kuF z9i*dn(2}>9tvU-=67=a9)o3n==F?JF>sW@*c94)(;QkI$+)4yh&`c^{{80t1vSplgaF9CY}|cc1^DeE3T;NhE^7E&*vESy^sUFu0vETUaF>b++s0nm zwugKrF4OIHoZm%ptpY#n;z#WyWT1h&ZpO6BDn%!4jKrDPXkdH|Lv|D4_aJw-iVEGw zhqU4(@khFtf?Lac9aXzkY}kI+1Pu2i6#-qH*KkiBz@6Pxb>GmOLf_-obYt2(%6eleoJ_byuelzn8q^G(p;f z)c^u8W-m{RGxBCR0$DQ8x6v~GmX$f7%n;wpxVCe+vX@A49^db!sjZga`igNW2j9wE z$DiRSo2DFA$`2D+J4D`i5##sq+up&_eJaWEE@9*p5l4wGEz#)Bc@GWyRIKB&t6wrS zUtpad9S$VJT!HmMe-uk%c(XSbnmI8S|V)yhEwn|QTar9a+( zos)c@KlT0N0gdT{AK*W)la4<`+KkvNRn(^r0Rg7rlYP1LRzvW6uG~x?k{(Olj&I=jBqqzr_6m6#u?r zdxVttM)Dh!>~30}L*gSIs#y6oa^4`ed_zFHxTmen>f?Tk+Bb+Re_~&-v!D%aPMq7H zVLwPk?K`9#q(H>Hi-W3r$X^H|oY7FITuw)AulOsD9HcSyZ>T@WP5lA4`Oo}!f;)uK zwMD`qDj&C-&d4!`l*M$%s%x*YB&+!@L1VRX?)V`dP(R|*Ar&6{PqvBxW(W#tnR$kP z^k2Alh^YE+gdXPHenPLqM8Ka3OB}8A_v6}R zdg~ji1?Io_>M+H&d+dsl;G$?GRZ?KS&)*Tw>{|gyucRC8ffeH``B{Q>#8uB`xm6|{ zuH+uKz>P|t2xdH}6wuFEPy~y#;f0aJ`yFp|+fhtWZ;&Sr_>r ze>O9Vb*MkuAJGof?ngM2K#V=YVS;VC=x3W@^daU=Z?g5+Z4$yKUTh!y{s>9bfzOUG zwm5`?$*#K`qs?rsp*E>IMd7YSwK0X+oKGwb^I~lmnL#+F*YK+&QCh=uD+&ks%M@di z5`*}*hEcw;9F;fE9t-gvJSWSb?>I!hNv0o

L8b9<^zA9Sf7S>6AcVA;Cu5mu7YC zUGs9=&sYx0I8Qs^gEy&>>5KvupXm>vl|@8s4sQ5 zX-O~b7!Uu)^qYnpiPh@c<5+i$0!0s;KE_pg5+5Jqk^2-ugqo$`u@}ORE3ckC*(Aq^ zKBfA~b)4?N%U5%jX9)!*csD!WxAKI z5j)YyPE+xRIvE_Zk zZA`zj39HfWFUq0|Pm|hS!OqjFUDOBy%AU$G!J|-OgpJESjSGB6+K@Pc{;@$S26i4sdEa}pC!mtoH|Q(HjS@}Z>)=epU%>lI-N~4fpqY<(VRYy z9tX|evXJ~1mna*f-XaR+Vm>e3qi=Q7TU@X_oO_FWZ5AIiB6Wrje8$L*&xiFK8P9BV zI!C#B4o03+alvy5C(Oh}Weix*q&yE>&#Cy(`Ro-OY{vW>qk|UUi*u?sh0f6Pbc_|? z@$=k)Lc&MO4rsx#$Re>PwR9#g#S^s@FqW~^?u<0sTe)l$%MB_ktEKe30{dz?g_Rmc$ok7#lH)3T z&nIcQYgMO0LQ2`G4>N8&<0$f(#5U2m)^9CR>L>%1VN@OQq#VU{d}#$%hS@`6HKN4-DeESb{m`(qo3Lz4o+qwf<5Dv%;Sy8JbgW87E2LdkK@ugS zzsvnLiM*y+_HI21%IZ{sfhiJyqD4S1fu5N}L-*5#J@b;}#-2P`nE&@~SE{KmN-isZ zPh-A*xOSO>e{0zIrF0hZOCpWw2vNzZxaZNxq3GV>^Ug6(njgss@X+}S5%Rra8J?6hl9?=0Q4YUb#MAb#&O(HTc5d)KCYwa!dQ^`n|ZSEv^5y6n2NLi~c z$bE;QOIpndh3QK(5as9ds3sL#lVcG2oQXu3(^Z&~u@Xesp62g#Rs%B0Hov_&B zmG`s+KEojd!`&DtJhLBey-n$&KXFRxE)l0%^_BVcW3?En`V*ez0~#Tkk%Vhi2Cz#) z6&@l;z3c-$^a(EopyL=vBbNxt4S>%PSSZOo0qp^Qo-LtzVO%)-0(R9??n{&1vRhp* z8$_r`iKGhknlM2YI&UyW5o38K`n;opgNLwRaLhfnzC$)|DCS<{UT1hX#~$-%)Y0_@ zlI4q-Ex0rsVHe5mU&1F>$orWjd713(Wn8$RB73~Tp=7O^>%kc#*q|fM9D#{Ja&?-)5k^;KW3nf0wi{3B^}bP_U%KJhUnXt-gvU bu8|O?AnF>)XDX&#q#ij Date: Wed, 17 Jul 2019 14:00:43 +0200 Subject: [PATCH 32/32] - fixes for slowmode --- .../AccountStateManagementUtils.swift | 22 +++++++++++++++++++ .../TelegramCore/ApplyUpdateMessage.swift | 15 +++++++++++++ .../TelegramCore/TelegramCore/SlowMode.swift | 7 ++---- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift index 11a193fa6d..6b70dacb3f 100644 --- a/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/TelegramCore/AccountStateManagementUtils.swift @@ -2075,6 +2075,7 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP var isContactUpdates: [(PeerId, Bool)] = [] var stickerPackOperations: [AccountStateUpdateStickerPacksOperation] = [] var recentlyUsedStickers: [MediaId: (MessageIndex, TelegramMediaFile)] = [:] + var slowModeLastMessageTimeouts:[PeerId : Int32] = [:] var recentlyUsedGifs: [MediaId: (MessageIndex, TelegramMediaFile)] = [:] var syncRecentGifs = false var langPackDifferences: [String: [Api.LangPackDifference]] = [:] @@ -2181,6 +2182,11 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP } } } + if !message.flags.contains(.Incoming) && !message.flags.contains(.Unsent) { + if message.id.peerId.namespace == Namespaces.Peer.CloudChannel { + slowModeLastMessageTimeouts[message.id.peerId] = max(slowModeLastMessageTimeouts[message.id.peerId] ?? 0, message.timestamp) + } + } if !message.flags.contains(.Incoming), message.forwardInfo == nil { inner: for media in message.media { @@ -2713,6 +2719,22 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP } } + if !slowModeLastMessageTimeouts.isEmpty { + var peerIds:Set = Set() + var cachedDatas:[PeerId : CachedChannelData] = [:] + for (peerId, timeout) in slowModeLastMessageTimeouts { + var cachedData = transaction.getPeerCachedData(peerId: peerId) as? CachedChannelData ?? CachedChannelData() + if let slowModeTimeout = cachedData.slowModeTimeout { + cachedData = cachedData.withUpdatedSlowModeValidUntilTimestamp(slowModeValidUntilTimestamp: timeout + slowModeTimeout) + peerIds.insert(peerId) + cachedDatas[peerId] = cachedData + } + } + transaction.updatePeerCachedData(peerIds: peerIds, update: { peerId, current in + return cachedDatas[peerId] ?? current + }) + } + if syncRecentGifs { addSynchronizeSavedGifsOperation(transaction: transaction, operation: .sync) } else { diff --git a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift index 48bb0cb376..cc3125d507 100644 --- a/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift +++ b/submodules/TelegramCore/TelegramCore/ApplyUpdateMessage.swift @@ -165,6 +165,20 @@ func applyUpdateMessage(postbox: Postbox, stateManager: AccountStateManager, mes let (tags, globalTags) = tagsForStoreMessage(incoming: currentMessage.flags.contains(.Incoming), attributes: attributes, media: media, textEntities: entitiesAttribute?.entities) + if currentMessage.id.peerId.namespace == Namespaces.Peer.CloudChannel, !currentMessage.flags.contains(.Incoming) { + let peerId = currentMessage.id.peerId + transaction.updatePeerCachedData(peerIds: [peerId], update: { peerId, current in + var cachedData = current as? CachedChannelData ?? CachedChannelData() + if let slowModeTimeout = cachedData.slowModeTimeout { + cachedData = cachedData.withUpdatedSlowModeValidUntilTimestamp(slowModeValidUntilTimestamp: currentMessage.timestamp + slowModeTimeout) + return cachedData + } else { + return current + } + }) + } + + return .update(StoreMessage(id: updatedId, globallyUniqueId: nil, groupingKey: currentMessage.groupingKey, timestamp: updatedTimestamp ?? currentMessage.timestamp, flags: [], tags: tags, globalTags: globalTags, localTags: currentMessage.localTags, forwardInfo: forwardInfo, authorId: currentMessage.author?.id, text: text, attributes: attributes, media: media)) }) for file in sentStickers { @@ -173,6 +187,7 @@ func applyUpdateMessage(postbox: Postbox, stateManager: AccountStateManager, mes for file in sentGifs { transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: RecentMediaItem(file)), removeTailIfCountExceeds: 200) } + stateManager.addUpdates(result) } } diff --git a/submodules/TelegramCore/TelegramCore/SlowMode.swift b/submodules/TelegramCore/TelegramCore/SlowMode.swift index 384272292d..8bb61e5154 100644 --- a/submodules/TelegramCore/TelegramCore/SlowMode.swift +++ b/submodules/TelegramCore/TelegramCore/SlowMode.swift @@ -30,11 +30,8 @@ public func updateChannelSlowModeInteractively(postbox: Postbox, network: Networ accountStateManager.addUpdates(updates) return postbox.transaction { transaction -> Void in transaction.updatePeerCachedData(peerIds: [peerId], update: { peerId, currentData in - if let currentData = currentData as? CachedChannelData { - return currentData.withUpdatedSlowModeTimeout(slowModeTimeout: timeout) - } else { - return currentData - } + let currentData = currentData as? CachedChannelData ?? CachedChannelData() + return currentData.withUpdatedSlowModeTimeout(slowModeTimeout: timeout) }) } |> introduceError(UpdateChannelSlowModeError.self)