diff --git a/Telegram/BUILD b/Telegram/BUILD index bfd557feb6..45d52d72a5 100644 --- a/Telegram/BUILD +++ b/Telegram/BUILD @@ -1122,7 +1122,7 @@ ios_extension( ":VersionInfoPlist", ":AppNameInfoPlist", ], - minimum_os_version = "9.0", + minimum_os_version = "10.0", provisioning_profile = "//build-input/data/provisioning-profiles:NotificationContent.mobileprovision", deps = [":NotificationContentExtensionLib"], frameworks = [ @@ -1263,7 +1263,7 @@ ios_extension( ":VersionInfoPlist", ":AppNameInfoPlist", ], - minimum_os_version = "9.0", + minimum_os_version = "10.0", provisioning_profile = "//build-input/data/provisioning-profiles:Intents.mobileprovision", deps = [":IntentsExtensionLib"], frameworks = [ @@ -1519,7 +1519,6 @@ ios_application( ":MtProtoKitFramework", ":SwiftSignalKitFramework", ":PostboxFramework", - #":TelegramApiFramework", ":SyncCoreFramework", ":TelegramCoreFramework", ":AsyncDisplayKitFramework", diff --git a/Telegram/Telegram-iOS/Resources/voip_group_connecting.mp3 b/Telegram/Telegram-iOS/Resources/voip_group_connecting.mp3 new file mode 100644 index 0000000000..4e0f60b4f1 Binary files /dev/null and b/Telegram/Telegram-iOS/Resources/voip_group_connecting.mp3 differ diff --git a/Telegram/Telegram-iOS/Resources/voip_group_joined.mp3 b/Telegram/Telegram-iOS/Resources/voip_group_joined.mp3 new file mode 100644 index 0000000000..527959c9da Binary files /dev/null and b/Telegram/Telegram-iOS/Resources/voip_group_joined.mp3 differ diff --git a/Telegram/Telegram-iOS/Resources/voip_group_joined.wav b/Telegram/Telegram-iOS/Resources/voip_group_joined.wav deleted file mode 100644 index 684cb47f75..0000000000 Binary files a/Telegram/Telegram-iOS/Resources/voip_group_joined.wav and /dev/null differ diff --git a/Telegram/Telegram-iOS/Resources/voip_group_left.mp3 b/Telegram/Telegram-iOS/Resources/voip_group_left.mp3 new file mode 100644 index 0000000000..c033909587 Binary files /dev/null and b/Telegram/Telegram-iOS/Resources/voip_group_left.mp3 differ diff --git a/Telegram/Telegram-iOS/Resources/voip_group_left.wav b/Telegram/Telegram-iOS/Resources/voip_group_left.wav deleted file mode 100644 index 845b507c15..0000000000 Binary files a/Telegram/Telegram-iOS/Resources/voip_group_left.wav and /dev/null differ diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index f6ce1b9b89..19c58e5870 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -5962,7 +5962,7 @@ Sorry for the inconvenience."; "VoiceChat.InvitedPeerText" = "You invited %@ to the voice chat"; "VoiceChat.RemovedPeerText" = "You removed %@ from this group"; -"Notification.VoiceChatStarted" = "Voice chat started"; +"Notification.VoiceChatStarted" = "%1$@ started a voice chat"; "Notification.VoiceChatEnded" = "Voice chat ended (%@)"; "VoiceChat.Panel.TapToJoin" = "Tap to join"; @@ -5993,6 +5993,9 @@ Sorry for the inconvenience."; "VoiceChat.InviteMemberToGroupFirstText" = "%1$@ isn't a member of \"%2$@\" yet. Add them to the group?"; "VoiceChat.InviteMemberToGroupFirstAdd" = "Add"; +"VoiceChat.CreateNewVoiceChatText" = "Voice chat ended. Start a new one?"; +"VoiceChat.CreateNewVoiceChatStart" = "Start"; + "CHAT_VOICECHAT_START" = "%1$@ has started voice chat in the group %2$@"; "CHAT_VOICECHAT_INVITE" = "%1$@ has invited %3$@ in the group %2$@"; "CHAT_VOICECHAT_INVITE_YOU" = "%1$@ has invited you to voice chat in the group %2$@"; @@ -6021,3 +6024,5 @@ Sorry for the inconvenience."; "Channel.AdminLog.MutedNewMembers" = "%1$@ muted new members"; "Group.GroupMembersHeader" = "GROUP MEMBERS"; + +"Conversation.VoiceChatMediaRecordingRestricted" = "You can't record voice and video messages during a voice chat."; diff --git a/buildbox/build-telegram.sh b/buildbox/build-telegram.sh index 0bcdd57801..38a7bf6fd8 100644 --- a/buildbox/build-telegram.sh +++ b/buildbox/build-telegram.sh @@ -5,7 +5,7 @@ set -e BUILD_TELEGRAM_VERSION="1" MACOS_VERSION="10.15" -XCODE_VERSION="12.1" +XCODE_VERSION="12.2" GUEST_SHELL="bash" VM_BASE_NAME="macos$(echo $MACOS_VERSION | sed -e 's/\.'/_/g)_Xcode$(echo $XCODE_VERSION | sed -e 's/\.'/_/g)" diff --git a/submodules/AccountContext/Sources/ChatController.swift b/submodules/AccountContext/Sources/ChatController.swift index 159b0c44d9..9ecead34e3 100644 --- a/submodules/AccountContext/Sources/ChatController.swift +++ b/submodules/AccountContext/Sources/ChatController.swift @@ -474,6 +474,8 @@ public protocol ChatController: ViewController { func updatePresentationMode(_ mode: ChatControllerPresentationMode) func beginMessageSearch(_ query: String) func displayPromoAnnouncement(text: String) + + var isSendButtonVisible: Bool { get } } public protocol ChatMessagePreviewItemNode: class { diff --git a/submodules/AccountContext/Sources/ChatListController.swift b/submodules/AccountContext/Sources/ChatListController.swift index ec9fb811e8..45e83f463a 100644 --- a/submodules/AccountContext/Sources/ChatListController.swift +++ b/submodules/AccountContext/Sources/ChatListController.swift @@ -7,6 +7,7 @@ public protocol ChatListController: ViewController { var context: AccountContext { get } var lockViewFrame: CGRect? { get } + var isSearchActive: Bool { get } func activateSearch() func deactivateSearch(animated: Bool) func activateCompose() diff --git a/submodules/AccountContext/Sources/GalleryController.swift b/submodules/AccountContext/Sources/GalleryController.swift index 5ac13919b4..376252b271 100644 --- a/submodules/AccountContext/Sources/GalleryController.swift +++ b/submodules/AccountContext/Sources/GalleryController.swift @@ -1,4 +1,5 @@ import Foundation +import UIKit import Postbox import SwiftSignalKit import TelegramCore @@ -18,9 +19,9 @@ public final class GalleryControllerActionInteraction { public let openBotCommand: (String) -> Void public let addContact: (String) -> Void public let storeMediaPlaybackState: (MessageId, Double?) -> Void - public let editMedia: (MessageId) -> Void + public let editMedia: (MessageId, [UIView], @escaping () -> Void) -> Void - public init(openUrl: @escaping (String, Bool) -> Void, openUrlIn: @escaping (String) -> Void, openPeerMention: @escaping (String) -> Void, openPeer: @escaping (PeerId) -> Void, openHashtag: @escaping (String?, String) -> Void, openBotCommand: @escaping (String) -> Void, addContact: @escaping (String) -> Void, storeMediaPlaybackState: @escaping (MessageId, Double?) -> Void, editMedia: @escaping (MessageId) -> Void) { + public init(openUrl: @escaping (String, Bool) -> Void, openUrlIn: @escaping (String) -> Void, openPeerMention: @escaping (String) -> Void, openPeer: @escaping (PeerId) -> Void, openHashtag: @escaping (String?, String) -> Void, openBotCommand: @escaping (String) -> Void, addContact: @escaping (String) -> Void, storeMediaPlaybackState: @escaping (MessageId, Double?) -> Void, editMedia: @escaping (MessageId, [UIView], @escaping () -> Void) -> Void) { self.openUrl = openUrl self.openUrlIn = openUrlIn self.openPeerMention = openPeerMention diff --git a/submodules/AudioBlob/Sources/BlobView.swift b/submodules/AudioBlob/Sources/BlobView.swift index a0ef246af7..dc7e9823c3 100644 --- a/submodules/AudioBlob/Sources/BlobView.swift +++ b/submodules/AudioBlob/Sources/BlobView.swift @@ -84,9 +84,13 @@ public final class VoiceBlobView: UIView, TGModernConversationInputMicButtonDeco } public func setColor(_ color: UIColor) { - smallBlob.setColor(color) - mediumBlob.setColor(color.withAlphaComponent(0.3)) - bigBlob.setColor(color.withAlphaComponent(0.15)) + self.setColor(color, animated: false) + } + + public func setColor(_ color: UIColor, animated: Bool) { + smallBlob.setColor(color, animated: animated) + mediumBlob.setColor(color.withAlphaComponent(0.3), animated: animated) + bigBlob.setColor(color.withAlphaComponent(0.15), animated: animated) } public func updateLevel(_ level: CGFloat) { @@ -250,8 +254,12 @@ final class BlobView: UIView { fatalError("init(coder:) has not been implemented") } - func setColor(_ color: UIColor) { + func setColor(_ color: UIColor, animated: Bool) { + let previousColor = shapeLayer.fillColor shapeLayer.fillColor = color.cgColor + if animated, let previousColor = previousColor { + shapeLayer.animate(from: previousColor, to: color.cgColor, keyPath: "fillColor", timingFunction: CAMediaTimingFunctionName.linear.rawValue, duration: 0.3) + } } func updateSpeedLevel(to newSpeedLevel: CGFloat) { diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index 2858421307..6cb637ce68 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -1678,6 +1678,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController self.present(actionSheet, in: .window(.root)) } + public private(set) var isSearchActive: Bool = false public func activateSearch() { if self.displayNavigationBar { let _ = (combineLatest(self.chatListDisplayNode.containerNode.currentItemNode.contentsReady |> take(1), self.context.account.postbox.tailChatListView(groupId: .root, count: 16, summaryComponents: ChatListEntrySummaryComponents(tagSummary: nil, actionsSummary: nil)) |> take(1)) @@ -1729,18 +1730,14 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController (strongSelf.parent as? TabBarController)?.updateIsTabBarHidden(true, transition: .animated(duration: 0.4, curve: .spring)) }) + self.isSearchActive = true if let navigationController = self.navigationController as? NavigationController { - var voiceChatOverlayController: VoiceChatOverlayController? for controller in navigationController.globalOverlayControllers { if let controller = controller as? VoiceChatOverlayController { - voiceChatOverlayController = controller + controller.updateVisibility() break } } - - if let controller = voiceChatOverlayController { - controller.update(hidden: true, slide: true, animated: true) - } } } } @@ -1785,18 +1782,14 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController } } + self.isSearchActive = false if let navigationController = self.navigationController as? NavigationController { - var voiceChatOverlayController: VoiceChatOverlayController? for controller in navigationController.globalOverlayControllers { if let controller = controller as? VoiceChatOverlayController { - voiceChatOverlayController = controller + controller.updateVisibility() break } } - - if let controller = voiceChatOverlayController { - controller.update(hidden: false, slide: true, animated: true) - } } } } diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index d989df2a68..dda4cb7325 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -1319,7 +1319,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { } badgeSize = max(badgeSize, reorderInset) - let (authorLayout, authorApply) = authorLayout(TextNodeLayoutArguments(attributedString: hideAuthor ? nil : authorAttributedString, backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: rawContentWidth - badgeSize, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets(top: 2.0, left: 1.0, bottom: 2.0, right: 1.0))) + let (authorLayout, authorApply) = authorLayout(TextNodeLayoutArguments(attributedString: (hideAuthor && !hasDraft) ? nil : authorAttributedString, backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: rawContentWidth - badgeSize, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets(top: 2.0, left: 1.0, bottom: 2.0, right: 1.0))) var textCutout: TextNodeCutout? if !textLeftCutout.isZero { diff --git a/submodules/Display/Source/CAAnimationUtils.swift b/submodules/Display/Source/CAAnimationUtils.swift index 5682fc240e..4aecee5b73 100644 --- a/submodules/Display/Source/CAAnimationUtils.swift +++ b/submodules/Display/Source/CAAnimationUtils.swift @@ -127,7 +127,7 @@ public extension CALayer { self.add(animationGroup, forKey: key) } - func animateKeyframes(values: [AnyObject], duration: Double, keyPath: String, timingFunction: String = CAMediaTimingFunctionName.linear.rawValue, removeOnCompletion: Bool = true, additive: Bool = false, completion: ((Bool) -> Void)? = nil) { + func animateKeyframes(values: [AnyObject], duration: Double, keyPath: String, timingFunction: String = CAMediaTimingFunctionName.linear.rawValue, mediaTimingFunction: CAMediaTimingFunction? = nil, removeOnCompletion: Bool = true, additive: Bool = false, completion: ((Bool) -> Void)? = nil) { let k = Float(UIView.animationDurationFactor()) var speed: Float = 1.0 if k != 0 && k != 1 { @@ -150,7 +150,11 @@ public extension CALayer { animation.speed = speed animation.duration = duration animation.isAdditive = additive - animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName(rawValue: timingFunction)) + if let mediaTimingFunction = mediaTimingFunction { + animation.timingFunction = mediaTimingFunction + } else { + animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName(rawValue: timingFunction)) + } animation.isRemovedOnCompletion = removeOnCompletion if let completion = completion { animation.delegate = CALayerAnimationDelegate(animation: animation, completion: completion) diff --git a/submodules/Display/Source/ContainedViewLayoutTransition.swift b/submodules/Display/Source/ContainedViewLayoutTransition.swift index 6313fb29c3..bfdcc179a1 100644 --- a/submodules/Display/Source/ContainedViewLayoutTransition.swift +++ b/submodules/Display/Source/ContainedViewLayoutTransition.swift @@ -477,7 +477,7 @@ public extension ContainedViewLayoutTransition { } } - func updateAlpha(node: ASDisplayNode, alpha: CGFloat, beginWithCurrentState: Bool = false, force: Bool = false, completion: ((Bool) -> Void)? = nil) { + func updateAlpha(node: ASDisplayNode, alpha: CGFloat, beginWithCurrentState: Bool = false, force: Bool = false, delay: Double = 0.0, completion: ((Bool) -> Void)? = nil) { if node.alpha.isEqual(to: alpha) && !force { if let completion = completion { completion(true) @@ -499,7 +499,7 @@ public extension ContainedViewLayoutTransition { previousAlpha = node.alpha } node.alpha = alpha - node.layer.animateAlpha(from: previousAlpha, to: alpha, duration: duration, timingFunction: curve.timingFunction, mediaTimingFunction: curve.mediaTimingFunction, completion: { result in + node.layer.animateAlpha(from: previousAlpha, to: alpha, duration: duration, delay: delay, timingFunction: curve.timingFunction, mediaTimingFunction: curve.mediaTimingFunction, completion: { result in if let completion = completion { completion(result) } @@ -670,7 +670,7 @@ public extension ContainedViewLayoutTransition { } } - func updateTransformScale(node: ASDisplayNode, scale: CGFloat, beginWithCurrentState: Bool = false, completion: ((Bool) -> Void)? = nil) { + func updateTransformScale(node: ASDisplayNode, scale: CGFloat, beginWithCurrentState: Bool = false, delay: Double = 0.0, completion: ((Bool) -> Void)? = nil) { let t = node.layer.transform let currentScale = sqrt((t.m11 * t.m11) + (t.m12 * t.m12) + (t.m13 * t.m13)) if currentScale.isEqual(to: scale) { @@ -695,7 +695,7 @@ public extension ContainedViewLayoutTransition { previousScale = currentScale } node.layer.transform = CATransform3DMakeScale(scale, scale, 1.0) - node.layer.animateScale(from: previousScale, to: scale, duration: duration, timingFunction: curve.timingFunction, mediaTimingFunction: curve.mediaTimingFunction, completion: { result in + node.layer.animateScale(from: previousScale, to: scale, duration: duration, delay: delay, timingFunction: curve.timingFunction, mediaTimingFunction: curve.mediaTimingFunction, completion: { result in if let completion = completion { completion(result) } @@ -729,7 +729,7 @@ public extension ContainedViewLayoutTransition { } } - func updateSublayerTransformScale(node: ASDisplayNode, scale: CGFloat, completion: ((Bool) -> Void)? = nil) { + func updateSublayerTransformScale(node: ASDisplayNode, scale: CGFloat, delay: Double = 0.0, completion: ((Bool) -> Void)? = nil) { if !node.isNodeLoaded { node.subnodeTransform = CATransform3DMakeScale(scale, scale, 1.0) completion?(true) @@ -752,7 +752,7 @@ public extension ContainedViewLayoutTransition { } case let .animated(duration, curve): node.layer.sublayerTransform = CATransform3DMakeScale(scale, scale, 1.0) - node.layer.animate(from: NSValue(caTransform3D: t), to: NSValue(caTransform3D: node.layer.sublayerTransform), keyPath: "sublayerTransform", timingFunction: curve.timingFunction, duration: duration, delay: 0.0, mediaTimingFunction: curve.mediaTimingFunction, removeOnCompletion: true, additive: false, completion: { + node.layer.animate(from: NSValue(caTransform3D: t), to: NSValue(caTransform3D: node.layer.sublayerTransform), keyPath: "sublayerTransform", timingFunction: curve.timingFunction, duration: duration, delay: delay, mediaTimingFunction: curve.mediaTimingFunction, removeOnCompletion: true, additive: false, completion: { result in if let completion = completion { completion(result) diff --git a/submodules/Display/Source/Navigation/NavigationController.swift b/submodules/Display/Source/Navigation/NavigationController.swift index f45511d2db..3382813388 100644 --- a/submodules/Display/Source/Navigation/NavigationController.swift +++ b/submodules/Display/Source/Navigation/NavigationController.swift @@ -611,10 +611,7 @@ open class NavigationController: UINavigationController, ContainableController, } } } - - layout.additionalInsets.left = max(layout.intrinsicInsets.left, additionalSideInsets.left) - layout.additionalInsets.right = max(layout.intrinsicInsets.right, additionalSideInsets.right) - + if self.currentTopVisibleOverlayContainerStatusBar !== topVisibleOverlayContainerWithStatusBar { animateStatusBarStyleTransition = true self.currentTopVisibleOverlayContainerStatusBar = topVisibleOverlayContainerWithStatusBar @@ -722,6 +719,9 @@ open class NavigationController: UINavigationController, ContainableController, } } + layout.additionalInsets.left = max(layout.intrinsicInsets.left, additionalSideInsets.left) + layout.additionalInsets.right = max(layout.intrinsicInsets.right, additionalSideInsets.right) + switch navigationLayout.root { case let .flat(controllers): if let rootContainer = self.rootContainer { diff --git a/submodules/Display/Source/Navigation/NavigationSplitContainer.swift b/submodules/Display/Source/Navigation/NavigationSplitContainer.swift index 5dfa5f70ff..8a64a20b5b 100644 --- a/submodules/Display/Source/Navigation/NavigationSplitContainer.swift +++ b/submodules/Display/Source/Navigation/NavigationSplitContainer.swift @@ -94,7 +94,7 @@ final class NavigationSplitContainer: ASDisplayNode { transition.updateFrame(node: self.detailContainer, frame: CGRect(origin: CGPoint(x: masterWidth, y: 0.0), size: CGSize(width: detailWidth, height: layout.size.height))) transition.updateFrame(node: self.separator, frame: CGRect(origin: CGPoint(x: masterWidth, y: 0.0), size: CGSize(width: UIScreenPixel, height: layout.size.height))) - self.masterContainer.update(layout: ContainerViewLayout(size: CGSize(width: masterWidth, height: layout.size.height), metrics: layout.metrics, deviceMetrics: layout.deviceMetrics, intrinsicInsets: layout.intrinsicInsets, safeInsets: layout.safeInsets, additionalInsets: layout.additionalInsets, statusBarHeight: layout.statusBarHeight, inputHeight: layout.inputHeight, inputHeightIsInteractivellyChanging: layout.inputHeightIsInteractivellyChanging, inVoiceOver: layout.inVoiceOver), canBeClosed: false, controllers: masterControllers, transition: transition) + self.masterContainer.update(layout: ContainerViewLayout(size: CGSize(width: masterWidth, height: layout.size.height), metrics: layout.metrics, deviceMetrics: layout.deviceMetrics, intrinsicInsets: layout.intrinsicInsets, safeInsets: layout.safeInsets, additionalInsets: UIEdgeInsets(), statusBarHeight: layout.statusBarHeight, inputHeight: layout.inputHeight, inputHeightIsInteractivellyChanging: layout.inputHeightIsInteractivellyChanging, inVoiceOver: layout.inVoiceOver), canBeClosed: false, controllers: masterControllers, transition: transition) self.detailContainer.update(layout: ContainerViewLayout(size: CGSize(width: detailWidth, height: layout.size.height), metrics: layout.metrics, deviceMetrics: layout.deviceMetrics, intrinsicInsets: layout.intrinsicInsets, safeInsets: layout.safeInsets, additionalInsets: layout.additionalInsets, statusBarHeight: layout.statusBarHeight, inputHeight: layout.inputHeight, inputHeightIsInteractivellyChanging: layout.inputHeightIsInteractivellyChanging, inVoiceOver: layout.inVoiceOver), canBeClosed: true, controllers: detailControllers, transition: transition) var controllersUpdated = false diff --git a/submodules/GalleryUI/BUILD b/submodules/GalleryUI/BUILD index ad5f85f26d..06170f2d03 100644 --- a/submodules/GalleryUI/BUILD +++ b/submodules/GalleryUI/BUILD @@ -27,6 +27,7 @@ swift_library( "//submodules/StickerPackPreviewUI:StickerPackPreviewUI", "//submodules/OverlayStatusController:OverlayStatusController", "//submodules/PresentationDataUtils:PresentationDataUtils", + "//submodules/UrlEscaping:UrlEscaping", ], visibility = [ "//visibility:public", diff --git a/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift b/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift index 745b75decb..8e230946bf 100644 --- a/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift +++ b/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift @@ -18,6 +18,7 @@ import OpenInExternalAppUI import AppBundle import LocalizedPeerData import TextSelectionNode +import UrlEscaping private let deleteImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: .white) private let actionImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionForward"), color: .white) @@ -331,13 +332,13 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll } return nil } - self.textNode.tapAttributeAction = { [weak self] attributes, _ in - if let strongSelf = self, let action = strongSelf.actionForAttributes(attributes) { + self.textNode.tapAttributeAction = { [weak self] attributes, index in + if let strongSelf = self, let action = strongSelf.actionForAttributes(attributes, index) { strongSelf.performAction?(action) } } - self.textNode.longTapAttributeAction = { [weak self] attributes, _ in - if let strongSelf = self, let action = strongSelf.actionForAttributes(attributes) { + self.textNode.longTapAttributeAction = { [weak self] attributes, index in + if let strongSelf = self, let action = strongSelf.actionForAttributes(attributes, index) { strongSelf.openActionOptions?(action) } } @@ -391,9 +392,13 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.scrollNode.view.showsVerticalScrollIndicator = false } - private func actionForAttributes(_ attributes: [NSAttributedString.Key: Any]) -> GalleryControllerInteractionTapAction? { + private func actionForAttributes(_ attributes: [NSAttributedString.Key: Any], _ index: Int) -> GalleryControllerInteractionTapAction? { if let url = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String { - return .url(url: url, concealed: false) + var concealed = true + if let (attributeText, fullText) = self.textNode.attributeSubstring(name: TelegramTextAttributes.URL, index: index) { + concealed = !doesUrlMatchText(url: url, text: attributeText, fullText: fullText) + } + return .url(url: url, concealed: concealed) } else if let peerMention = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerMention)] as? TelegramPeerMention { return .peerMention(peerMention.peerId, peerMention.mention) } else if let peerName = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerTextMention)] as? String { diff --git a/submodules/GalleryUI/Sources/GalleryController.swift b/submodules/GalleryUI/Sources/GalleryController.swift index d58550f98f..dab45a332d 100644 --- a/submodules/GalleryUI/Sources/GalleryController.swift +++ b/submodules/GalleryUI/Sources/GalleryController.swift @@ -913,8 +913,19 @@ public class GalleryController: ViewController, StandalonePresentableController } }, editMedia: { [weak self] messageId in if let strongSelf = self { - strongSelf.dismiss(forceAway: true) - strongSelf.actionInteraction?.editMedia(messageId) + var snapshots: [UIView] = [] + if let navigationBar = strongSelf.navigationBar, let snapshotView = navigationBar.view.snapshotContentTree() { + snapshotView.frame = navigationBar.frame + snapshots.append(snapshotView) + } + if let snapshotView = strongSelf.galleryNode.footerNode.view.snapshotContentTree() { + snapshotView.frame = strongSelf.galleryNode.footerNode.frame + snapshots.append(snapshotView) + } + + strongSelf.actionInteraction?.editMedia(messageId, snapshots, { [weak self] in + self?.dismiss(forceAway: true) + }) } }) self.displayNode = GalleryControllerNode(controllerInteraction: controllerInteraction) diff --git a/submodules/ItemListStickerPackItem/BUILD b/submodules/ItemListStickerPackItem/BUILD index a53501ed9c..83a4ae4d6e 100644 --- a/submodules/ItemListStickerPackItem/BUILD +++ b/submodules/ItemListStickerPackItem/BUILD @@ -19,6 +19,7 @@ swift_library( "//submodules/AnimatedStickerNode:AnimatedStickerNode", "//submodules/TelegramAnimatedStickerNode:TelegramAnimatedStickerNode", "//submodules/PresentationDataUtils:PresentationDataUtils", + "//submodules/ShimmerEffect:ShimmerEffect", ], visibility = [ "//visibility:public", diff --git a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift index 6a691bd2bb..beb238b11d 100644 --- a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift +++ b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift @@ -12,6 +12,7 @@ import PresentationDataUtils import StickerResources import AnimatedStickerNode import TelegramAnimatedStickerNode +import ShimmerEffect public struct ItemListStickerPackItemEditing: Equatable { public var editable: Bool @@ -149,6 +150,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { fileprivate let imageNode: TransformImageNode private var animationNode: AnimatedStickerNode? + private var placeholderNode: StickerShimmerEffectNode? private let unreadNode: ASImageNode private let titleNode: TextNode private let statusNode: TextNode @@ -200,6 +202,9 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { self.imageNode = TransformImageNode() self.imageNode.isLayerBacked = !smartInvertColorsEnabled() + self.placeholderNode = StickerShimmerEffectNode() + self.placeholderNode?.isUserInteractionEnabled = false + self.titleNode = TextNode() self.titleNode.isUserInteractionEnabled = false self.titleNode.contentMode = .left @@ -231,7 +236,11 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { super.init(layerBacked: false, dynamicBounce: false, rotated: false, seeThrough: false) + if let placeholderNode = self.placeholderNode { + self.addSubnode(placeholderNode) + } self.addSubnode(self.imageNode) + self.addSubnode(self.titleNode) self.addSubnode(self.statusNode) self.addSubnode(self.unreadNode) @@ -251,12 +260,50 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { } } } + + var firstTime = true + self.imageNode.imageUpdated = { [weak self] image in + guard let strongSelf = self else { + return + } + if image != nil { + strongSelf.removePlaceholder(animated: !firstTime) + if firstTime { + strongSelf.imageNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } + } + firstTime = false + } } deinit { self.fetchDisposable.dispose() } + private func removePlaceholder(animated: Bool) { + if let placeholderNode = self.placeholderNode { + self.placeholderNode = nil + if !animated { + placeholderNode.removeFromSupernode() + } else { + placeholderNode.allowsGroupOpacity = true + placeholderNode.alpha = 0.0 + placeholderNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, completion: { [weak placeholderNode] _ in + placeholderNode?.removeFromSupernode() + placeholderNode?.allowsGroupOpacity = false + }) + } + } + } + + private var absoluteLocation: (CGRect, CGSize)? + override func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { + self.absoluteLocation = (rect, containerSize) + if let placeholderNode = placeholderNode { + placeholderNode.updateAbsoluteRect(CGRect(origin: CGPoint(x: rect.minX + placeholderNode.frame.minX, y: rect.minY + placeholderNode.frame.minY), size: placeholderNode.frame.size), within: containerSize) + } + } + func asyncLayout() -> (_ item: ItemListStickerPackItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, (Bool) -> Void) { let makeImageLayout = self.imageNode.asyncLayout() let makeTitleLayout = TextNode.asyncLayout(self.titleNode) @@ -397,14 +444,14 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { if fileUpdated { imageApply = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: stillImageSize, boundingSize: stillImageSize, intrinsicInsets: UIEdgeInsets())) - updatedImageSignal = chatMessageStickerPackThumbnail(postbox: item.account.postbox, resource: representation.resource) + updatedImageSignal = chatMessageStickerPackThumbnail(postbox: item.account.postbox, resource: representation.resource, nilIfEmpty: true) } case let .animated(resource): imageSize = imageBoundingSize if fileUpdated { imageApply = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: imageBoundingSize, boundingSize: imageBoundingSize, intrinsicInsets: UIEdgeInsets())) - updatedImageSignal = chatMessageStickerPackThumbnail(postbox: item.account.postbox, resource: resource, animated: true) + updatedImageSignal = chatMessageStickerPackThumbnail(postbox: item.account.postbox, resource: resource, animated: true, nilIfEmpty: true) } } if fileUpdated, let resourceReference = resourceReference { @@ -610,6 +657,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { animationNode = AnimatedStickerNode() strongSelf.animationNode = animationNode strongSelf.addSubnode(animationNode) + animationNode.setup(source: AnimatedStickerResourceSource(account: item.account, resource: resource), width: 80, height: 80, mode: .cached) } animationNode.visibility = strongSelf.visibility != .none && item.playAnimatedStickers @@ -619,6 +667,12 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { transition.updateFrame(node: animationNode, frame: imageFrame) } } + + if let placeholderNode = strongSelf.placeholderNode { + placeholderNode.frame = imageFrame + + placeholderNode.update(backgroundColor: nil, foregroundColor: item.presentationData.theme.list.disclosureArrowColor.blitOver(item.presentationData.theme.list.itemBlocksBackgroundColor, alpha: 0.55), shimmeringColor: item.presentationData.theme.list.itemBlocksBackgroundColor.withAlphaComponent(0.4), data: item.packInfo.immediateThumbnailData, size: imageFrame.size, small: true) + } } if let updatedImageSignal = updatedImageSignal { diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraController.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraController.h index 013ac39f3c..da8b0b9bf3 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraController.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraController.h @@ -19,7 +19,8 @@ typedef enum { TGCameraControllerPassportIdIntent, TGCameraControllerPassportMultipleIntent, TGCameraControllerAvatarIntent, - TGCameraControllerSignupAvatarIntent + TGCameraControllerSignupAvatarIntent, + TGCameraControllerGenericPhotoOnlyIntent } TGCameraControllerIntent; @interface TGCameraControllerWindow : TGOverlayControllerWindow diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGMediaPickerGalleryInterfaceView.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGMediaPickerGalleryInterfaceView.h index 062b5e8e0e..8c9bd087fe 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGMediaPickerGalleryInterfaceView.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGMediaPickerGalleryInterfaceView.h @@ -51,6 +51,7 @@ - (void)setAllInterfaceHidden:(bool)hidden delay:(NSTimeInterval)__unused delay animated:(bool)animated; - (void)setToolbarsHidden:(bool)hidden animated:(bool)animated; +- (void)immediateEditorTransitionIn; - (void)editorTransitionIn; - (void)editorTransitionOut; diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGMediaPickerGalleryModel.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGMediaPickerGalleryModel.h index af5300772c..b127c421e4 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGMediaPickerGalleryModel.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGMediaPickerGalleryModel.h @@ -51,5 +51,6 @@ - (instancetype)initWithContext:(id)context items:(NSArray *)items focusItem:(id)focusItem selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext hasCaptions:(bool)hasCaptions allowCaptionEntities:(bool)allowCaptionEntities hasTimer:(bool)hasTimer onlyCrop:(bool)onlyCrop inhibitDocumentCaptions:(bool)inhibitDocumentCaptions hasSelectionPanel:(bool)hasSelectionPanel hasCamera:(bool)hasCamera recipientName:(NSString *)recipientName; - (void)presentPhotoEditorForItem:(id)item tab:(TGPhotoEditorTab)tab; +- (void)presentPhotoEditorForItem:(id)item tab:(TGPhotoEditorTab)tab snapshots:(NSArray *)snapshots; @end diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGPhotoVideoEditor.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGPhotoVideoEditor.h index 7667dcf382..5db73d5a2b 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGPhotoVideoEditor.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGPhotoVideoEditor.h @@ -4,6 +4,6 @@ + (void)presentWithContext:(id)context parentController:(TGViewController *)parentController image:(UIImage *)image video:(NSURL *)video didFinishWithImage:(void (^)(UIImage *image))didFinishWithImage didFinishWithVideo:(void (^)(UIImage *image, NSURL *url, TGVideoEditAdjustments *adjustments))didFinishWithVideo dismissed:(void (^)(void))dismissed; -+ (void)presentWithContext:(id)context controller:(TGViewController *)controller caption:(NSString *)caption entities:(NSArray *)entities withItem:(id)item paint:(bool)paint recipientName:(NSString *)recipientName stickersContext:(id)stickersContext completion:(void (^)(id, TGMediaEditingContext *))completion dismissed:(void (^)())dismissed; ++ (void)presentWithContext:(id)context controller:(TGViewController *)controller caption:(NSString *)caption entities:(NSArray *)entities withItem:(id)item paint:(bool)paint recipientName:(NSString *)recipientName stickersContext:(id)stickersContext snapshots:(NSArray *)snapshots immediate:(bool)immediate appeared:(void (^)(void))appeared completion:(void (^)(id, TGMediaEditingContext *))completion dismissed:(void (^)())dismissed; @end diff --git a/submodules/LegacyComponents/Sources/TGCameraController.m b/submodules/LegacyComponents/Sources/TGCameraController.m index faec38dcbb..829760984f 100644 --- a/submodules/LegacyComponents/Sources/TGCameraController.m +++ b/submodules/LegacyComponents/Sources/TGCameraController.m @@ -1250,7 +1250,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus } }]; - bool hasCamera = !self.inhibitMultipleCapture && ((_intent == TGCameraControllerGenericIntent && !_shortcut) || (_intent == TGCameraControllerPassportMultipleIntent)); + bool hasCamera = !self.inhibitMultipleCapture && (((_intent == TGCameraControllerGenericIntent || _intent == TGCameraControllerGenericPhotoOnlyIntent) && !_shortcut) || (_intent == TGCameraControllerPassportMultipleIntent)); TGMediaPickerGalleryModel *model = [[TGMediaPickerGalleryModel alloc] initWithContext:windowContext items:galleryItems focusItem:focusItem selectionContext:_items.count > 1 ? selectionContext : nil editingContext:editingContext hasCaptions:self.allowCaptions allowCaptionEntities:self.allowCaptionEntities hasTimer:self.hasTimer onlyCrop:_intent == TGCameraControllerPassportIntent || _intent == TGCameraControllerPassportIdIntent || _intent == TGCameraControllerPassportMultipleIntent inhibitDocumentCaptions:self.inhibitDocumentCaptions hasSelectionPanel:true hasCamera:hasCamera recipientName:self.recipientName]; model.inhibitMute = self.inhibitMute; model.controller = galleryController; diff --git a/submodules/LegacyComponents/Sources/TGCameraMainPhoneView.m b/submodules/LegacyComponents/Sources/TGCameraMainPhoneView.m index 5f0233b629..a8cdfcb45a 100644 --- a/submodules/LegacyComponents/Sources/TGCameraMainPhoneView.m +++ b/submodules/LegacyComponents/Sources/TGCameraMainPhoneView.m @@ -110,7 +110,18 @@ CGFloat shutterButtonWidth = 66.0f; CGSize screenSize = TGScreenSize(); CGFloat widescreenWidth = MAX(screenSize.width, screenSize.height); - if (widescreenWidth == 896.0f) + if (widescreenWidth == 926.0f) + { + _topPanelOffset = 77.0f; + _topPanelHeight = 77.0f; + _bottomPanelOffset = 94.0f; + _bottomPanelHeight = 155.0f; + _modeControlOffset = 6.0f; + _modeControlHeight = 66.0f; + _counterOffset = 7.0f; + shutterButtonWidth = 72.0f; + } + else if (widescreenWidth == 896.0f) { _topPanelOffset = 33.0f; _topPanelHeight = 44.0f; @@ -121,6 +132,17 @@ _counterOffset = 7.0f; shutterButtonWidth = 72.0f; } + if (widescreenWidth == 844.0f) + { + _topPanelOffset = 33.0f; + _topPanelHeight = 44.0f; + _bottomPanelOffset = 63.0f; + _bottomPanelHeight = 123.0f; + _modeControlOffset = 3.0f; + _modeControlHeight = 40.0f; + _counterOffset = 7.0f; + shutterButtonWidth = 70.0f; + } else if (widescreenWidth == 812.0f) { _topPanelOffset = 33.0f; diff --git a/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m b/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m index 1b210ffa7d..da2484ce0f 100644 --- a/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m +++ b/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m @@ -1307,6 +1307,22 @@ } } +- (void)immediateEditorTransitionIn { + [self setSelectionInterfaceHidden:true animated:false]; + _captionMixin.inputPanel.alpha = 0.0f; + _portraitToolbarView.doneButton.alpha = 0.0f; + _landscapeToolbarView.doneButton.alpha = 0.0f; + + _portraitToolbarView.hidden = true; + _landscapeToolbarView.hidden = true; + + TGDispatchAfter(0.5, dispatch_get_main_queue(), ^ + { + _portraitToolbarView.hidden = false; + _landscapeToolbarView.hidden = false; + }); +} + - (void)editorTransitionIn { [self setSelectionInterfaceHidden:true animated:true]; diff --git a/submodules/LegacyComponents/Sources/TGMediaPickerGalleryModel.m b/submodules/LegacyComponents/Sources/TGMediaPickerGalleryModel.m index 159db145a1..8da4a30f77 100644 --- a/submodules/LegacyComponents/Sources/TGMediaPickerGalleryModel.m +++ b/submodules/LegacyComponents/Sources/TGMediaPickerGalleryModel.m @@ -344,6 +344,11 @@ } - (void)presentPhotoEditorForItem:(id)item tab:(TGPhotoEditorTab)tab +{ + [self presentPhotoEditorForItem:item tab:tab snapshots:@[]]; +} + +- (void)presentPhotoEditorForItem:(id)item tab:(TGPhotoEditorTab)tab snapshots:(NSArray *)snapshots { __weak TGMediaPickerGalleryModel *weakSelf = self; @@ -604,6 +609,15 @@ [self.controller addChildViewController:controller]; [self.controller.view addSubview:controller.view]; + + for (UIView *view in snapshots) { + [self.controller.view addSubview:view]; + [UIView animateWithDuration:0.3 animations:^{ + view.alpha = 0.0; + } completion:^(__unused BOOL finished) { + [view removeFromSuperview]; + }]; + } } - (void)_replaceItems:(NSArray *)items focusingOnItem:(id)item diff --git a/submodules/LegacyComponents/Sources/TGPhotoVideoEditor.m b/submodules/LegacyComponents/Sources/TGPhotoVideoEditor.m index 022a16f725..09a5887a24 100644 --- a/submodules/LegacyComponents/Sources/TGPhotoVideoEditor.m +++ b/submodules/LegacyComponents/Sources/TGPhotoVideoEditor.m @@ -102,7 +102,7 @@ } } -+ (void)presentWithContext:(id)context controller:(TGViewController *)controller caption:(NSString *)caption entities:(NSArray *)entities withItem:(id)item paint:(bool)paint recipientName:(NSString *)recipientName stickersContext:(id)stickersContext completion:(void (^)(id, TGMediaEditingContext *))completion dismissed:(void (^)())dismissed ++ (void)presentWithContext:(id)context controller:(TGViewController *)controller caption:(NSString *)caption entities:(NSArray *)entities withItem:(id)item paint:(bool)paint recipientName:(NSString *)recipientName stickersContext:(id)stickersContext snapshots:(NSArray *)snapshots immediate:(bool)immediate appeared:(void (^)(void))appeared completion:(void (^)(id, TGMediaEditingContext *))completion dismissed:(void (^)())dismissed { id windowManager = [context makeOverlayWindowManager]; id windowContext = [windowManager context]; @@ -112,6 +112,10 @@ TGModernGalleryController *galleryController = [[TGModernGalleryController alloc] initWithContext:windowContext]; galleryController.adjustsStatusBarVisibility = true; + galleryController.animateTransition = !immediate; + galleryController.finishedTransitionIn = ^(id item, TGModernGalleryItemView *itemView) { + appeared(); + }; //galleryController.hasFadeOutTransition = true; id galleryItem = nil; @@ -199,14 +203,20 @@ dismissed(); } }; - + + [model.interfaceView immediateEditorTransitionIn]; + + for (UIView *view in snapshots) { + [galleryController.view addSubview:view]; + } + TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithManager:windowManager parentController:controller contentController:galleryController]; controllerWindow.hidden = false; galleryController.view.clipsToBounds = true; if (paint) { TGDispatchAfter(0.05, dispatch_get_main_queue(), ^{ - [model presentPhotoEditorForItem:galleryItem tab:TGPhotoEditorPaintTab]; + [model presentPhotoEditorForItem:galleryItem tab:TGPhotoEditorPaintTab snapshots:snapshots]; }); } } diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift index 67603bbb04..422ce445e1 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift @@ -59,7 +59,7 @@ public enum LegacyAttachmentMenuMediaEditing { case file } -public func legacyMediaEditor(context: AccountContext, peer: Peer, media: AnyMediaReference, initialCaption: String, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, present: @escaping (ViewController, Any?) -> Void) { +public func legacyMediaEditor(context: AccountContext, peer: Peer, media: AnyMediaReference, initialCaption: String, snapshots: [UIView], transitionCompletion: (() -> Void)?, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, present: @escaping (ViewController, Any?) -> Void) { let _ = (fetchMediaData(context: context, postbox: context.account.postbox, mediaReference: media) |> deliverOnMainQueue).start(next: { (value, isImage) in guard case let .data(data) = value, data.complete else { @@ -103,8 +103,9 @@ public func legacyMediaEditor(context: AccountContext, peer: Peer, media: AnyMed present(legacyController, nil) - TGPhotoVideoEditor.present(with: legacyController.context, controller: emptyController, caption: initialCaption, entities: [], withItem: item, paint: true, recipientName: recipientName, stickersContext: paintStickersContext, completion: { result, editingContext in - let intent: TGMediaAssetsControllerIntent = TGMediaAssetsControllerSendMediaIntent + TGPhotoVideoEditor.present(with: legacyController.context, controller: emptyController, caption: initialCaption, entities: [], withItem: item, paint: true, recipientName: recipientName, stickersContext: paintStickersContext, snapshots: snapshots as? [Any], immediate: transitionCompletion != nil, appeared: { + transitionCompletion?() + }, completion: { result, editingContext in let signals = TGCameraController.resultSignals(for: nil, editingContext: editingContext, currentItem: result as! TGMediaSelectableItem, storeAssets: false, saveEditedPhotos: false, descriptionGenerator: legacyAssetPickerItemGenerator()) sendMessagesWithSignals(signals, false, 0) }, dismissed: { [weak legacyController] in @@ -294,16 +295,8 @@ public func legacyAttachmentMenu(context: AccountContext, peer: Peer, chatLocati navigationController.setNavigationBarHidden(true, animated: false) legacyController.bind(controller: navigationController) - var hasTimer = false - var hasSilentPosting = false - if peer.id != context.account.peerId { - if peer is TelegramUser { - hasTimer = true - } - hasSilentPosting = true - } let recipientName = peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder) - + legacyController.enableSizeClassSignal = true let presentationDisposable = context.sharedContext.presentationData.start(next: { [weak legacyController] presentationData in @@ -315,8 +308,8 @@ public func legacyAttachmentMenu(context: AccountContext, peer: Peer, chatLocati present(legacyController, nil) - TGPhotoVideoEditor.present(with: legacyController.context, controller: emptyController, caption: "", entities: [], withItem: item, paint: false, recipientName: recipientName, stickersContext: paintStickersContext, completion: { result, editingContext in - let intent: TGMediaAssetsControllerIntent = TGMediaAssetsControllerSendMediaIntent + TGPhotoVideoEditor.present(with: legacyController.context, controller: emptyController, caption: "", entities: [], withItem: item, paint: false, recipientName: recipientName, stickersContext: paintStickersContext, snapshots: [], immediate: false, appeared: { + }, completion: { result, editingContext in let signals = TGCameraController.resultSignals(for: nil, editingContext: editingContext, currentItem: result as! TGMediaSelectableItem, storeAssets: false, saveEditedPhotos: false, descriptionGenerator: legacyAssetPickerItemGenerator()) sendMessagesWithSignals(signals, false, 0) }, dismissed: { [weak legacyController] in diff --git a/submodules/MediaPlayer/Sources/MediaPlayerAudioRenderer.swift b/submodules/MediaPlayer/Sources/MediaPlayerAudioRenderer.swift index e531344f15..0af3ee7a13 100644 --- a/submodules/MediaPlayer/Sources/MediaPlayerAudioRenderer.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayerAudioRenderer.swift @@ -218,6 +218,7 @@ private final class AudioPlayerRendererContext { let lowWaterSizeInSeconds: Int = 2 let audioSession: MediaPlayerAudioSessionControl + let useVoiceProcessingMode: Bool let controlTimebase: CMTimebase let updatedRate: () -> Void let audioPaused: () -> Void @@ -250,7 +251,7 @@ private final class AudioPlayerRendererContext { } } - init(controlTimebase: CMTimebase, audioSession: MediaPlayerAudioSessionControl, playAndRecord: Bool, ambient: Bool, forceAudioToSpeaker: Bool, baseRate: Double, audioLevelPipe: ValuePipe, updatedRate: @escaping () -> Void, audioPaused: @escaping () -> Void) { + init(controlTimebase: CMTimebase, audioSession: MediaPlayerAudioSessionControl, playAndRecord: Bool, useVoiceProcessingMode: Bool, ambient: Bool, forceAudioToSpeaker: Bool, baseRate: Double, audioLevelPipe: ValuePipe, updatedRate: @escaping () -> Void, audioPaused: @escaping () -> Void) { assert(audioPlayerRendererQueue.isCurrent()) self.audioSession = audioSession @@ -263,6 +264,7 @@ private final class AudioPlayerRendererContext { self.audioPaused = audioPaused self.playAndRecord = playAndRecord + self.useVoiceProcessingMode = useVoiceProcessingMode self.ambient = ambient self.audioStreamDescription = audioRendererNativeStreamDescription() @@ -407,7 +409,11 @@ private final class AudioPlayerRendererContext { var outputNode: AUNode = 0 var outputDesc = AudioComponentDescription() outputDesc.componentType = kAudioUnitType_Output - outputDesc.componentSubType = kAudioUnitSubType_RemoteIO + if self.useVoiceProcessingMode { + outputDesc.componentSubType = kAudioUnitSubType_VoiceProcessingIO + } else { + outputDesc.componentSubType = kAudioUnitSubType_RemoteIO + } outputDesc.componentFlags = 0 outputDesc.componentFlagsMask = 0 outputDesc.componentManufacturer = kAudioUnitManufacturer_Apple @@ -753,7 +759,7 @@ public final class MediaPlayerAudioRenderer { private let audioClock: CMClock public let audioTimebase: CMTimebase - public init(audioSession: MediaPlayerAudioSessionControl, playAndRecord: Bool, ambient: Bool, forceAudioToSpeaker: Bool, baseRate: Double, audioLevelPipe: ValuePipe, updatedRate: @escaping () -> Void, audioPaused: @escaping () -> Void) { + public init(audioSession: MediaPlayerAudioSessionControl, playAndRecord: Bool, useVoiceProcessingMode: Bool = false, ambient: Bool, forceAudioToSpeaker: Bool, baseRate: Double, audioLevelPipe: ValuePipe, updatedRate: @escaping () -> Void, audioPaused: @escaping () -> Void) { var audioClock: CMClock? CMAudioClockCreate(allocator: nil, clockOut: &audioClock) if audioClock == nil { @@ -766,7 +772,7 @@ public final class MediaPlayerAudioRenderer { self.audioTimebase = audioTimebase! audioPlayerRendererQueue.async { - let context = AudioPlayerRendererContext(controlTimebase: audioTimebase!, audioSession: audioSession, playAndRecord: playAndRecord, ambient: ambient, forceAudioToSpeaker: forceAudioToSpeaker, baseRate: baseRate, audioLevelPipe: audioLevelPipe, updatedRate: updatedRate, audioPaused: audioPaused) + let context = AudioPlayerRendererContext(controlTimebase: audioTimebase!, audioSession: audioSession, playAndRecord: playAndRecord, useVoiceProcessingMode: useVoiceProcessingMode, ambient: ambient, forceAudioToSpeaker: forceAudioToSpeaker, baseRate: baseRate, audioLevelPipe: audioLevelPipe, updatedRate: updatedRate, audioPaused: audioPaused) self.contextRef = Unmanaged.passRetained(context) } } diff --git a/submodules/PeerInfoUI/Sources/ChannelMembersSearchControllerNode.swift b/submodules/PeerInfoUI/Sources/ChannelMembersSearchControllerNode.swift index b43b0f491c..6722f996b2 100644 --- a/submodules/PeerInfoUI/Sources/ChannelMembersSearchControllerNode.swift +++ b/submodules/PeerInfoUI/Sources/ChannelMembersSearchControllerNode.swift @@ -263,6 +263,16 @@ class ChannelMembersSearchControllerNode: ASDisplayNode { } var entries: [ChannelMembersSearchEntry] = [] + if case .inviteToCall = mode, !filters.contains(where: { filter in + if case .excludeNonMembers = filter { + return true + } else { + return false + } + }) { + entries.append(.copyInviteLink) + } + var index = 0 for participant in participants.participants { guard let peer = peerView.peers[participant.peerId] else { @@ -484,7 +494,13 @@ class ChannelMembersSearchControllerNode: ASDisplayNode { index += 1 } - if case .inviteToCall = mode { + if case .inviteToCall = mode, !filters.contains(where: { filter in + if case .excludeNonMembers = filter { + return true + } else { + return false + } + }) { for peer in contactsView.peers { entries.append(ChannelMembersSearchEntry.contact(index, peer, contactsView.peerPresences[peer.id] as? TelegramUserPresence)) index += 1 diff --git a/submodules/PresentationDataUtils/Sources/SpecialTabBarIcons.swift b/submodules/PresentationDataUtils/Sources/SpecialTabBarIcons.swift index 0fa053ebd0..795da5bc1e 100644 --- a/submodules/PresentationDataUtils/Sources/SpecialTabBarIcons.swift +++ b/submodules/PresentationDataUtils/Sources/SpecialTabBarIcons.swift @@ -1,5 +1,5 @@ import Foundation public func useSpecialTabBarIcons() -> Bool { - return (Date(timeIntervalSince1970: 1581638400)...Date(timeIntervalSince1970: 1581724799)).contains(Date()) + return (Date(timeIntervalSince1970: 1608800400)...Date(timeIntervalSince1970: 1609545600)).contains(Date()) } diff --git a/submodules/ShareItems/Impl/BUILD b/submodules/ShareItems/Impl/BUILD index 7d9d422737..95a6289dab 100644 --- a/submodules/ShareItems/Impl/BUILD +++ b/submodules/ShareItems/Impl/BUILD @@ -24,6 +24,8 @@ objc_library( "MobileCoreServices", "AddressBook", "AVFoundation", + ], + weak_sdk_frameworks = [ "PassKit", ], visibility = [ diff --git a/submodules/ShimmerEffect/Sources/StickerShimmerEffectNode.swift b/submodules/ShimmerEffect/Sources/StickerShimmerEffectNode.swift index 54ab7d6fdf..49f41c65b3 100644 --- a/submodules/ShimmerEffect/Sources/StickerShimmerEffectNode.swift +++ b/submodules/ShimmerEffect/Sources/StickerShimmerEffectNode.swift @@ -168,7 +168,7 @@ public class StickerShimmerEffectNode: ASDisplayNode { self.effectNode.updateAbsoluteRect(rect, within: containerSize) } - public func update(backgroundColor: UIColor?, foregroundColor: UIColor, shimmeringColor: UIColor, data: Data?, size: CGSize) { + public func update(backgroundColor: UIColor?, foregroundColor: UIColor, shimmeringColor: UIColor, data: Data?, size: CGSize, small: Bool = false) { if data == nil { return } @@ -205,7 +205,7 @@ public class StickerShimmerEffectNode: ASDisplayNode { let reader = PathDataReader(input: path) let segments = reader.read() - let scale = size.width / 512.0 + let scale = size.width / (small ? 100.0 : 512.0) context.scaleBy(x: scale, y: scale) renderPath(segments, context: context) } else { diff --git a/submodules/StickerResources/Sources/StickerResources.swift b/submodules/StickerResources/Sources/StickerResources.swift index 1a6e7c31c4..b41cfecd44 100644 --- a/submodules/StickerResources/Sources/StickerResources.swift +++ b/submodules/StickerResources/Sources/StickerResources.swift @@ -402,6 +402,10 @@ public func chatMessageSticker(postbox: Postbox, file: TelegramMediaFile, small: return nil } + if file.immediateThumbnailData != nil && fullSizeData == nil { + return nil + } + let context = DrawingContext(size: arguments.drawingSize, scale: arguments.scale ?? 0.0, clear: arguments.emptyColor == nil) let drawingRect = arguments.drawingRect diff --git a/submodules/Stripe/BUILD b/submodules/Stripe/BUILD index 9320c426ea..e4177bfd58 100644 --- a/submodules/Stripe/BUILD +++ b/submodules/Stripe/BUILD @@ -19,6 +19,9 @@ objc_library( sdk_frameworks = [ "Foundation", "UIKit", + "AddressBook", + ], + weak_sdk_frameworks = [ "PassKit", ], visibility = [ diff --git a/submodules/SyncCore/Sources/CachedGroupData.swift b/submodules/SyncCore/Sources/CachedGroupData.swift index 695e5511a2..6061e33291 100644 --- a/submodules/SyncCore/Sources/CachedGroupData.swift +++ b/submodules/SyncCore/Sources/CachedGroupData.swift @@ -55,6 +55,8 @@ public final class CachedGroupData: CachedPeerData { public let messageIds: Set public let associatedHistoryMessageId: MessageId? = nil + public let activeCall: CachedChannelData.ActiveCall? + public init() { self.participants = nil self.exportedInvitation = nil @@ -68,9 +70,11 @@ public final class CachedGroupData: CachedPeerData { self.hasScheduledMessages = false self.invitedBy = nil self.photo = nil + + self.activeCall = nil } - public init(participants: CachedGroupParticipants?, exportedInvitation: ExportedInvitation?, botInfos: [CachedPeerBotInfo], peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, about: String?, flags: CachedGroupFlags, hasScheduledMessages: Bool, invitedBy: PeerId?, photo: TelegramMediaImage?) { + public init(participants: CachedGroupParticipants?, exportedInvitation: ExportedInvitation?, botInfos: [CachedPeerBotInfo], peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, about: String?, flags: CachedGroupFlags, hasScheduledMessages: Bool, invitedBy: PeerId?, photo: TelegramMediaImage?, activeCall: CachedChannelData.ActiveCall?) { self.participants = participants self.exportedInvitation = exportedInvitation self.botInfos = botInfos @@ -81,6 +85,7 @@ public final class CachedGroupData: CachedPeerData { self.hasScheduledMessages = hasScheduledMessages self.invitedBy = invitedBy self.photo = photo + self.activeCall = activeCall var messageIds = Set() if let pinnedMessageId = self.pinnedMessageId { @@ -132,6 +137,12 @@ public final class CachedGroupData: CachedPeerData { self.photo = nil } + if let activeCall = decoder.decodeObjectForKey("activeCall", decoder: { CachedChannelData.ActiveCall(decoder: $0) }) as? CachedChannelData.ActiveCall { + self.activeCall = activeCall + } else { + self.activeCall = nil + } + var messageIds = Set() if let pinnedMessageId = self.pinnedMessageId { messageIds.insert(pinnedMessageId) @@ -196,6 +207,12 @@ public final class CachedGroupData: CachedPeerData { } else { encoder.encodeNil(forKey: "ph") } + + if let activeCall = self.activeCall { + encoder.encodeObject(activeCall, forKey: "activeCall") + } else { + encoder.encodeNil(forKey: "activeCall") + } } public func isEqual(to: CachedPeerData) -> Bool { @@ -203,46 +220,54 @@ public final class CachedGroupData: CachedPeerData { return false } + if self.activeCall != other.activeCall { + return false + } + return self.participants == other.participants && self.exportedInvitation == other.exportedInvitation && self.botInfos == other.botInfos && self.peerStatusSettings == other.peerStatusSettings && self.pinnedMessageId == other.pinnedMessageId && self.about == other.about && self.flags == other.flags && self.hasScheduledMessages == other.hasScheduledMessages && self.invitedBy == other.invitedBy } public func withUpdatedParticipants(_ participants: CachedGroupParticipants?) -> CachedGroupData { - return CachedGroupData(participants: participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo) + return CachedGroupData(participants: participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall) } public func withUpdatedExportedInvitation(_ exportedInvitation: ExportedInvitation?) -> CachedGroupData { - return CachedGroupData(participants: self.participants, exportedInvitation: exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo) + return CachedGroupData(participants: self.participants, exportedInvitation: exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall) } public func withUpdatedBotInfos(_ botInfos: [CachedPeerBotInfo]) -> CachedGroupData { - return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo) + return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall) } public func withUpdatedPeerStatusSettings(_ peerStatusSettings: PeerStatusSettings?) -> CachedGroupData { - return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo) + return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall) } public func withUpdatedPinnedMessageId(_ pinnedMessageId: MessageId?) -> CachedGroupData { - return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo) + return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall) } public func withUpdatedAbout(_ about: String?) -> CachedGroupData { - return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo) + return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall) } public func withUpdatedFlags(_ flags: CachedGroupFlags) -> CachedGroupData { - return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo) + return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall) } public func withUpdatedHasScheduledMessages(_ hasScheduledMessages: Bool) -> CachedGroupData { - return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo) + return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall) } public func withUpdatedInvitedBy(_ invitedBy: PeerId?) -> CachedGroupData { - return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: invitedBy, photo: self.photo) + return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: invitedBy, photo: self.photo, activeCall: self.activeCall) } public func withUpdatedPhoto(_ photo: TelegramMediaImage?) -> CachedGroupData { - return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: photo) + return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: photo, activeCall: self.activeCall) + } + + public func withUpdatedActiveCall(_ activeCall: CachedChannelData.ActiveCall?) -> CachedGroupData { + return CachedGroupData(participants: self.participants, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, about: self.about, flags: self.flags, hasScheduledMessages: self.hasScheduledMessages, invitedBy: self.invitedBy, photo: self.photo, activeCall: activeCall) } } diff --git a/submodules/SyncCore/Sources/EmojiSearchQueryMessageAttribute.swift b/submodules/SyncCore/Sources/EmojiSearchQueryMessageAttribute.swift new file mode 100644 index 0000000000..0306eb7a9b --- /dev/null +++ b/submodules/SyncCore/Sources/EmojiSearchQueryMessageAttribute.swift @@ -0,0 +1,20 @@ +import Foundation +import Postbox + +public class EmojiSearchQueryMessageAttribute: MessageAttribute { + public let query: String + + public var associatedMessageIds: [MessageId] = [] + + public init(query: String) { + self.query = query + } + + required public init(decoder: PostboxDecoder) { + self.query = decoder.decodeStringForKey("q", orElse: "") + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeString(self.query, forKey: "q") + } +} diff --git a/submodules/SyncCore/Sources/StickerPackCollectionInfo.swift b/submodules/SyncCore/Sources/StickerPackCollectionInfo.swift index 912192cb1a..c39c2dd528 100644 --- a/submodules/SyncCore/Sources/StickerPackCollectionInfo.swift +++ b/submodules/SyncCore/Sources/StickerPackCollectionInfo.swift @@ -1,3 +1,4 @@ +import Foundation import Postbox public struct StickerPackCollectionInfoFlags: OptionSet { @@ -40,16 +41,18 @@ public final class StickerPackCollectionInfo: ItemCollectionInfo, Equatable { public let title: String public let shortName: String public let thumbnail: TelegramMediaImageRepresentation? + public let immediateThumbnailData: Data? public let hash: Int32 public let count: Int32 - public init(id: ItemCollectionId, flags: StickerPackCollectionInfoFlags, accessHash: Int64, title: String, shortName: String, thumbnail: TelegramMediaImageRepresentation?, hash: Int32, count: Int32) { + public init(id: ItemCollectionId, flags: StickerPackCollectionInfoFlags, accessHash: Int64, title: String, shortName: String, thumbnail: TelegramMediaImageRepresentation?, immediateThumbnailData: Data?, hash: Int32, count: Int32) { self.id = id self.flags = flags self.accessHash = accessHash self.title = title self.shortName = shortName self.thumbnail = thumbnail + self.immediateThumbnailData = immediateThumbnailData self.hash = hash self.count = count } @@ -60,6 +63,7 @@ public final class StickerPackCollectionInfo: ItemCollectionInfo, Equatable { self.title = decoder.decodeStringForKey("t", orElse: "") self.shortName = decoder.decodeStringForKey("s", orElse: "") self.thumbnail = decoder.decodeObjectForKey("th", decoder: { TelegramMediaImageRepresentation(decoder: $0) }) as? TelegramMediaImageRepresentation + self.immediateThumbnailData = decoder.decodeDataForKey("itd") self.hash = decoder.decodeInt32ForKey("h", orElse: 0) self.flags = StickerPackCollectionInfoFlags(rawValue: decoder.decodeInt32ForKey("f", orElse: 0)) self.count = decoder.decodeInt32ForKey("n", orElse: 0) @@ -76,6 +80,11 @@ public final class StickerPackCollectionInfo: ItemCollectionInfo, Equatable { } else { encoder.encodeNil(forKey: "th") } + if let immediateThumbnailData = self.immediateThumbnailData { + encoder.encodeData(immediateThumbnailData, forKey: "itd") + } else { + encoder.encodeNil(forKey: "itd") + } encoder.encodeInt32(self.hash, forKey: "h") encoder.encodeInt32(self.flags.rawValue, forKey: "f") encoder.encodeInt32(self.count, forKey: "n") @@ -98,6 +107,10 @@ public final class StickerPackCollectionInfo: ItemCollectionInfo, Equatable { return false } + if lhs.immediateThumbnailData != rhs.immediateThumbnailData { + return false + } + if lhs.flags != rhs.flags { return false } diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 24d79cae50..098c54fcaa 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -11,8 +11,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-457104426] = { return Api.InputGeoPoint.parse_inputGeoPointEmpty($0) } dict[1210199983] = { return Api.InputGeoPoint.parse_inputGeoPoint($0) } dict[-784000893] = { return Api.payments.ValidatedRequestedInfo.parse_validatedRequestedInfo($0) } - dict[461151667] = { return Api.ChatFull.parse_chatFull($0) } dict[-281384243] = { return Api.ChatFull.parse_channelFull($0) } + dict[231260545] = { return Api.ChatFull.parse_chatFull($0) } dict[-1159937629] = { return Api.PollResults.parse_pollResults($0) } dict[-925415106] = { return Api.ChatParticipant.parse_chatParticipant($0) } dict[-636267638] = { return Api.ChatParticipant.parse_chatParticipantCreator($0) } @@ -266,8 +266,9 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-13975905] = { return Api.Update.parse_updateChannelUserTyping($0) } dict[-309990731] = { return Api.Update.parse_updatePinnedMessages($0) } dict[-2054649973] = { return Api.Update.parse_updatePinnedChannelMessages($0) } + dict[321954198] = { return Api.Update.parse_updateChat($0) } dict[-219423922] = { return Api.Update.parse_updateGroupCallParticipants($0) } - dict[1462009966] = { return Api.Update.parse_updateGroupCall($0) } + dict[-1537295973] = { return Api.Update.parse_updateGroupCall($0) } dict[1059076315] = { return Api.Update.parse_updateBotInlineQuery($0) } dict[136574537] = { return Api.messages.VotesList.parse_votesList($0) } dict[1558266229] = { return Api.PopularContact.parse_popularContact($0) } @@ -346,7 +347,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1494368259] = { return Api.InputBotInlineMessage.parse_inputBotInlineMessageMediaContact($0) } dict[-1768777083] = { return Api.InputBotInlineMessage.parse_inputBotInlineMessageMediaGeo($0) } dict[2002815875] = { return Api.KeyboardButtonRow.parse_keyboardButtonRow($0) } - dict[-290164953] = { return Api.StickerSet.parse_stickerSet($0) } + dict[1088567208] = { return Api.StickerSet.parse_stickerSet($0) } dict[354925740] = { return Api.SecureSecretSettings.parse_secureSecretSettings($0) } dict[539045032] = { return Api.photos.Photo.parse_photo($0) } dict[-208488460] = { return Api.InputContact.parse_inputPhoneContact($0) } @@ -379,13 +380,13 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[505969924] = { return Api.InputMedia.parse_inputMediaUploadedPhoto($0) } dict[1530447553] = { return Api.InputMedia.parse_inputMediaUploadedDocument($0) } dict[-1279654347] = { return Api.InputMedia.parse_inputMediaPhoto($0) } - dict[598418386] = { return Api.InputMedia.parse_inputMediaDocument($0) } dict[-440664550] = { return Api.InputMedia.parse_inputMediaPhotoExternal($0) } dict[-78455655] = { return Api.InputMedia.parse_inputMediaDocumentExternal($0) } dict[-122978821] = { return Api.InputMedia.parse_inputMediaContact($0) } dict[261416433] = { return Api.InputMedia.parse_inputMediaPoll($0) } dict[-428884101] = { return Api.InputMedia.parse_inputMediaDice($0) } dict[-1759532989] = { return Api.InputMedia.parse_inputMediaGeoLive($0) } + dict[860303448] = { return Api.InputMedia.parse_inputMediaDocument($0) } dict[2134579434] = { return Api.InputPeer.parse_inputPeerEmpty($0) } dict[2107670217] = { return Api.InputPeer.parse_inputPeerSelf($0) } dict[396093539] = { return Api.InputPeer.parse_inputPeerChat($0) } diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index 9b28b36b7d..fd5169dfb4 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -2052,30 +2052,11 @@ 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?, slowmodeNextSendDate: Int32?, statsDc: Int32?, pts: Int32, call: Api.InputGroupCall?) + 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?, call: Api.InputGroupCall?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .chatFull(let flags, let id, let about, let participants, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let pinnedMsgId, let folderId): - if boxed { - buffer.appendInt32(461151667) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeInt32(id, buffer: buffer, boxed: false) - serializeString(about, buffer: buffer, boxed: false) - participants.serialize(buffer, true) - if Int(flags) & Int(1 << 2) != 0 {chatPhoto!.serialize(buffer, true)} - notifySettings.serialize(buffer, true) - exportedInvite.serialize(buffer, true) - if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) - buffer.appendInt32(Int32(botInfo!.count)) - for item in botInfo! { - item.serialize(buffer, true) - }} - 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 slowmodeNextSendDate, let statsDc, let pts, let call): if boxed { buffer.appendInt32(-281384243) @@ -2113,66 +2094,38 @@ public extension Api { serializeInt32(pts, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 21) != 0 {call!.serialize(buffer, true)} break + case .chatFull(let flags, let id, let about, let participants, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let pinnedMsgId, let folderId, let call): + if boxed { + buffer.appendInt32(231260545) + } + serializeInt32(flags, buffer: buffer, boxed: false) + serializeInt32(id, buffer: buffer, boxed: false) + serializeString(about, buffer: buffer, boxed: false) + participants.serialize(buffer, true) + if Int(flags) & Int(1 << 2) != 0 {chatPhoto!.serialize(buffer, true)} + notifySettings.serialize(buffer, true) + exportedInvite.serialize(buffer, true) + if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(botInfo!.count)) + for item in botInfo! { + item.serialize(buffer, true) + }} + 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)} + if Int(flags) & Int(1 << 12) != 0 {call!.serialize(buffer, true)} + break } } public func descriptionFields() -> (String, [(String, Any)]) { 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 slowmodeNextSendDate, let statsDc, let pts, let call): 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), ("statsDc", statsDc), ("pts", pts), ("call", call)]) + case .chatFull(let flags, let id, let about, let participants, let chatPhoto, let notifySettings, let exportedInvite, let botInfo, let pinnedMsgId, let folderId, let call): + return ("chatFull", [("flags", flags), ("id", id), ("about", about), ("participants", participants), ("chatPhoto", chatPhoto), ("notifySettings", notifySettings), ("exportedInvite", exportedInvite), ("botInfo", botInfo), ("pinnedMsgId", pinnedMsgId), ("folderId", folderId), ("call", call)]) } } - public static func parse_chatFull(_ reader: BufferReader) -> ChatFull? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int32? - _2 = reader.readInt32() - var _3: String? - _3 = parseString(reader) - var _4: Api.ChatParticipants? - if let signature = reader.readInt32() { - _4 = Api.parse(reader, signature: signature) as? Api.ChatParticipants - } - var _5: Api.Photo? - if Int(_1!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() { - _5 = Api.parse(reader, signature: signature) as? Api.Photo - } } - var _6: Api.PeerNotifySettings? - if let signature = reader.readInt32() { - _6 = Api.parse(reader, signature: signature) as? Api.PeerNotifySettings - } - var _7: Api.ExportedChatInvite? - if let signature = reader.readInt32() { - _7 = Api.parse(reader, signature: signature) as? Api.ExportedChatInvite - } - var _8: [Api.BotInfo]? - if Int(_1!) & Int(1 << 3) != 0 {if let _ = reader.readInt32() { - _8 = Api.parseVector(reader, elementSignature: 0, elementType: Api.BotInfo.self) - } } - var _9: Int32? - if Int(_1!) & Int(1 << 6) != 0 {_9 = reader.readInt32() } - var _10: Int32? - if Int(_1!) & Int(1 << 11) != 0 {_10 = reader.readInt32() } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - let _c5 = (Int(_1!) & Int(1 << 2) == 0) || _5 != nil - let _c6 = _6 != nil - let _c7 = _7 != nil - let _c8 = (Int(_1!) & Int(1 << 3) == 0) || _8 != nil - let _c9 = (Int(_1!) & Int(1 << 6) == 0) || _9 != nil - let _c10 = (Int(_1!) & Int(1 << 11) == 0) || _10 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 { - return Api.ChatFull.chatFull(flags: _1!, id: _2!, about: _3!, participants: _4!, chatPhoto: _5, notifySettings: _6!, exportedInvite: _7!, botInfo: _8, pinnedMsgId: _9, folderId: _10) - } - else { - return nil - } - } public static func parse_channelFull(_ reader: BufferReader) -> ChatFull? { var _1: Int32? _1 = reader.readInt32() @@ -2279,6 +2232,59 @@ public extension Api { return nil } } + public static func parse_chatFull(_ reader: BufferReader) -> ChatFull? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int32? + _2 = reader.readInt32() + var _3: String? + _3 = parseString(reader) + var _4: Api.ChatParticipants? + if let signature = reader.readInt32() { + _4 = Api.parse(reader, signature: signature) as? Api.ChatParticipants + } + var _5: Api.Photo? + if Int(_1!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() { + _5 = Api.parse(reader, signature: signature) as? Api.Photo + } } + var _6: Api.PeerNotifySettings? + if let signature = reader.readInt32() { + _6 = Api.parse(reader, signature: signature) as? Api.PeerNotifySettings + } + var _7: Api.ExportedChatInvite? + if let signature = reader.readInt32() { + _7 = Api.parse(reader, signature: signature) as? Api.ExportedChatInvite + } + var _8: [Api.BotInfo]? + if Int(_1!) & Int(1 << 3) != 0 {if let _ = reader.readInt32() { + _8 = Api.parseVector(reader, elementSignature: 0, elementType: Api.BotInfo.self) + } } + var _9: Int32? + if Int(_1!) & Int(1 << 6) != 0 {_9 = reader.readInt32() } + var _10: Int32? + if Int(_1!) & Int(1 << 11) != 0 {_10 = reader.readInt32() } + var _11: Api.InputGroupCall? + if Int(_1!) & Int(1 << 12) != 0 {if let signature = reader.readInt32() { + _11 = Api.parse(reader, signature: signature) as? Api.InputGroupCall + } } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + let _c4 = _4 != nil + let _c5 = (Int(_1!) & Int(1 << 2) == 0) || _5 != nil + let _c6 = _6 != nil + let _c7 = _7 != nil + let _c8 = (Int(_1!) & Int(1 << 3) == 0) || _8 != nil + let _c9 = (Int(_1!) & Int(1 << 6) == 0) || _9 != nil + let _c10 = (Int(_1!) & Int(1 << 11) == 0) || _10 != nil + let _c11 = (Int(_1!) & Int(1 << 12) == 0) || _11 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 { + return Api.ChatFull.chatFull(flags: _1!, id: _2!, about: _3!, participants: _4!, chatPhoto: _5, notifySettings: _6!, exportedInvite: _7!, botInfo: _8, pinnedMsgId: _9, folderId: _10, call: _11) + } + else { + return nil + } + } } public enum PollResults: TypeConstructorDescription { @@ -6418,8 +6424,9 @@ public extension Api { case updateChannelUserTyping(flags: Int32, channelId: Int32, topMsgId: Int32?, userId: Int32, action: Api.SendMessageAction) case updatePinnedMessages(flags: Int32, peer: Api.Peer, messages: [Int32], pts: Int32, ptsCount: Int32) case updatePinnedChannelMessages(flags: Int32, channelId: Int32, messages: [Int32], pts: Int32, ptsCount: Int32) + case updateChat(chatId: Int32) case updateGroupCallParticipants(call: Api.InputGroupCall, participants: [Api.GroupCallParticipant], version: Int32) - case updateGroupCall(channelId: Int32, call: Api.GroupCall) + case updateGroupCall(chatId: Int32, call: Api.GroupCall) case updateBotInlineQuery(flags: Int32, queryId: Int64, userId: Int32, query: String, geo: Api.GeoPoint?, peerType: Api.InlineQueryPeerType?, offset: String) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { @@ -7145,6 +7152,12 @@ public extension Api { serializeInt32(pts, buffer: buffer, boxed: false) serializeInt32(ptsCount, buffer: buffer, boxed: false) break + case .updateChat(let chatId): + if boxed { + buffer.appendInt32(321954198) + } + serializeInt32(chatId, buffer: buffer, boxed: false) + break case .updateGroupCallParticipants(let call, let participants, let version): if boxed { buffer.appendInt32(-219423922) @@ -7157,11 +7170,11 @@ public extension Api { } serializeInt32(version, buffer: buffer, boxed: false) break - case .updateGroupCall(let channelId, let call): + case .updateGroupCall(let chatId, let call): if boxed { - buffer.appendInt32(1462009966) + buffer.appendInt32(-1537295973) } - serializeInt32(channelId, buffer: buffer, boxed: false) + serializeInt32(chatId, buffer: buffer, boxed: false) call.serialize(buffer, true) break case .updateBotInlineQuery(let flags, let queryId, let userId, let query, let geo, let peerType, let offset): @@ -7349,10 +7362,12 @@ public extension Api { return ("updatePinnedMessages", [("flags", flags), ("peer", peer), ("messages", messages), ("pts", pts), ("ptsCount", ptsCount)]) case .updatePinnedChannelMessages(let flags, let channelId, let messages, let pts, let ptsCount): return ("updatePinnedChannelMessages", [("flags", flags), ("channelId", channelId), ("messages", messages), ("pts", pts), ("ptsCount", ptsCount)]) + case .updateChat(let chatId): + return ("updateChat", [("chatId", chatId)]) case .updateGroupCallParticipants(let call, let participants, let version): return ("updateGroupCallParticipants", [("call", call), ("participants", participants), ("version", version)]) - case .updateGroupCall(let channelId, let call): - return ("updateGroupCall", [("channelId", channelId), ("call", call)]) + case .updateGroupCall(let chatId, let call): + return ("updateGroupCall", [("chatId", chatId), ("call", call)]) case .updateBotInlineQuery(let flags, let queryId, let userId, let query, let geo, let peerType, let offset): return ("updateBotInlineQuery", [("flags", flags), ("queryId", queryId), ("userId", userId), ("query", query), ("geo", geo), ("peerType", peerType), ("offset", offset)]) } @@ -8799,6 +8814,17 @@ public extension Api { return nil } } + public static func parse_updateChat(_ reader: BufferReader) -> Update? { + var _1: Int32? + _1 = reader.readInt32() + let _c1 = _1 != nil + if _c1 { + return Api.Update.updateChat(chatId: _1!) + } + else { + return nil + } + } public static func parse_updateGroupCallParticipants(_ reader: BufferReader) -> Update? { var _1: Api.InputGroupCall? if let signature = reader.readInt32() { @@ -8830,7 +8856,7 @@ public extension Api { let _c1 = _1 != nil let _c2 = _2 != nil if _c1 && _c2 { - return Api.Update.updateGroupCall(channelId: _1!, call: _2!) + return Api.Update.updateGroupCall(chatId: _1!, call: _2!) } else { return nil @@ -10990,13 +11016,13 @@ public extension Api { } public enum StickerSet: TypeConstructorDescription { - case stickerSet(flags: Int32, installedDate: Int32?, id: Int64, accessHash: Int64, title: String, shortName: String, thumb: Api.PhotoSize?, thumbDcId: Int32?, count: Int32, hash: Int32) + case stickerSet(flags: Int32, installedDate: Int32?, id: Int64, accessHash: Int64, title: String, shortName: String, thumbs: [Api.PhotoSize]?, thumbDcId: Int32?, count: Int32, hash: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .stickerSet(let flags, let installedDate, let id, let accessHash, let title, let shortName, let thumb, let thumbDcId, let count, let hash): + case .stickerSet(let flags, let installedDate, let id, let accessHash, let title, let shortName, let thumbs, let thumbDcId, let count, let hash): if boxed { - buffer.appendInt32(-290164953) + buffer.appendInt32(1088567208) } serializeInt32(flags, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 0) != 0 {serializeInt32(installedDate!, buffer: buffer, boxed: false)} @@ -11004,7 +11030,11 @@ public extension Api { serializeInt64(accessHash, buffer: buffer, boxed: false) serializeString(title, buffer: buffer, boxed: false) serializeString(shortName, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 4) != 0 {thumb!.serialize(buffer, true)} + if Int(flags) & Int(1 << 4) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(thumbs!.count)) + for item in thumbs! { + item.serialize(buffer, true) + }} if Int(flags) & Int(1 << 4) != 0 {serializeInt32(thumbDcId!, buffer: buffer, boxed: false)} serializeInt32(count, buffer: buffer, boxed: false) serializeInt32(hash, buffer: buffer, boxed: false) @@ -11014,8 +11044,8 @@ public extension Api { public func descriptionFields() -> (String, [(String, Any)]) { switch self { - case .stickerSet(let flags, let installedDate, let id, let accessHash, let title, let shortName, let thumb, let thumbDcId, let count, let hash): - return ("stickerSet", [("flags", flags), ("installedDate", installedDate), ("id", id), ("accessHash", accessHash), ("title", title), ("shortName", shortName), ("thumb", thumb), ("thumbDcId", thumbDcId), ("count", count), ("hash", hash)]) + case .stickerSet(let flags, let installedDate, let id, let accessHash, let title, let shortName, let thumbs, let thumbDcId, let count, let hash): + return ("stickerSet", [("flags", flags), ("installedDate", installedDate), ("id", id), ("accessHash", accessHash), ("title", title), ("shortName", shortName), ("thumbs", thumbs), ("thumbDcId", thumbDcId), ("count", count), ("hash", hash)]) } } @@ -11032,9 +11062,9 @@ public extension Api { _5 = parseString(reader) var _6: String? _6 = parseString(reader) - var _7: Api.PhotoSize? - if Int(_1!) & Int(1 << 4) != 0 {if let signature = reader.readInt32() { - _7 = Api.parse(reader, signature: signature) as? Api.PhotoSize + var _7: [Api.PhotoSize]? + if Int(_1!) & Int(1 << 4) != 0 {if let _ = reader.readInt32() { + _7 = Api.parseVector(reader, elementSignature: 0, elementType: Api.PhotoSize.self) } } var _8: Int32? if Int(_1!) & Int(1 << 4) != 0 {_8 = reader.readInt32() } @@ -11053,7 +11083,7 @@ public extension Api { let _c9 = _9 != nil let _c10 = _10 != nil if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 { - return Api.StickerSet.stickerSet(flags: _1!, installedDate: _2, id: _3!, accessHash: _4!, title: _5!, shortName: _6!, thumb: _7, thumbDcId: _8, count: _9!, hash: _10!) + return Api.StickerSet.stickerSet(flags: _1!, installedDate: _2, id: _3!, accessHash: _4!, title: _5!, shortName: _6!, thumbs: _7, thumbDcId: _8, count: _9!, hash: _10!) } else { return nil @@ -11501,13 +11531,13 @@ public extension Api { case inputMediaUploadedPhoto(flags: Int32, file: Api.InputFile, stickers: [Api.InputDocument]?, ttlSeconds: Int32?) case inputMediaUploadedDocument(flags: Int32, file: Api.InputFile, thumb: Api.InputFile?, mimeType: String, attributes: [Api.DocumentAttribute], stickers: [Api.InputDocument]?, ttlSeconds: Int32?) case inputMediaPhoto(flags: Int32, id: Api.InputPhoto, ttlSeconds: Int32?) - case inputMediaDocument(flags: Int32, id: Api.InputDocument, ttlSeconds: Int32?) case inputMediaPhotoExternal(flags: Int32, url: String, ttlSeconds: Int32?) case inputMediaDocumentExternal(flags: Int32, url: String, ttlSeconds: Int32?) case inputMediaContact(phoneNumber: String, firstName: String, lastName: String, vcard: String) case inputMediaPoll(flags: Int32, poll: Api.Poll, correctAnswers: [Buffer]?, solution: String?, solutionEntities: [Api.MessageEntity]?) case inputMediaDice(emoticon: String) case inputMediaGeoLive(flags: Int32, geoPoint: Api.InputGeoPoint, heading: Int32?, period: Int32?, proximityNotificationRadius: Int32?) + case inputMediaDocument(flags: Int32, id: Api.InputDocument, ttlSeconds: Int32?, query: String?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -11602,14 +11632,6 @@ public extension Api { id.serialize(buffer, true) if Int(flags) & Int(1 << 0) != 0 {serializeInt32(ttlSeconds!, buffer: buffer, boxed: false)} break - case .inputMediaDocument(let flags, let id, let ttlSeconds): - if boxed { - buffer.appendInt32(598418386) - } - serializeInt32(flags, buffer: buffer, boxed: false) - id.serialize(buffer, true) - if Int(flags) & Int(1 << 0) != 0 {serializeInt32(ttlSeconds!, buffer: buffer, boxed: false)} - break case .inputMediaPhotoExternal(let flags, let url, let ttlSeconds): if boxed { buffer.appendInt32(-440664550) @@ -11669,6 +11691,15 @@ public extension Api { if Int(flags) & Int(1 << 1) != 0 {serializeInt32(period!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 3) != 0 {serializeInt32(proximityNotificationRadius!, buffer: buffer, boxed: false)} break + case .inputMediaDocument(let flags, let id, let ttlSeconds, let query): + if boxed { + buffer.appendInt32(860303448) + } + serializeInt32(flags, buffer: buffer, boxed: false) + id.serialize(buffer, true) + if Int(flags) & Int(1 << 0) != 0 {serializeInt32(ttlSeconds!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 1) != 0 {serializeString(query!, buffer: buffer, boxed: false)} + break } } @@ -11692,8 +11723,6 @@ public extension Api { return ("inputMediaUploadedDocument", [("flags", flags), ("file", file), ("thumb", thumb), ("mimeType", mimeType), ("attributes", attributes), ("stickers", stickers), ("ttlSeconds", ttlSeconds)]) case .inputMediaPhoto(let flags, let id, let ttlSeconds): return ("inputMediaPhoto", [("flags", flags), ("id", id), ("ttlSeconds", ttlSeconds)]) - case .inputMediaDocument(let flags, let id, let ttlSeconds): - return ("inputMediaDocument", [("flags", flags), ("id", id), ("ttlSeconds", ttlSeconds)]) case .inputMediaPhotoExternal(let flags, let url, let ttlSeconds): return ("inputMediaPhotoExternal", [("flags", flags), ("url", url), ("ttlSeconds", ttlSeconds)]) case .inputMediaDocumentExternal(let flags, let url, let ttlSeconds): @@ -11706,6 +11735,8 @@ public extension Api { return ("inputMediaDice", [("emoticon", emoticon)]) case .inputMediaGeoLive(let flags, let geoPoint, let heading, let period, let proximityNotificationRadius): return ("inputMediaGeoLive", [("flags", flags), ("geoPoint", geoPoint), ("heading", heading), ("period", period), ("proximityNotificationRadius", proximityNotificationRadius)]) + case .inputMediaDocument(let flags, let id, let ttlSeconds, let query): + return ("inputMediaDocument", [("flags", flags), ("id", id), ("ttlSeconds", ttlSeconds), ("query", query)]) } } @@ -11901,25 +11932,6 @@ public extension Api { return nil } } - public static func parse_inputMediaDocument(_ reader: BufferReader) -> InputMedia? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Api.InputDocument? - if let signature = reader.readInt32() { - _2 = Api.parse(reader, signature: signature) as? Api.InputDocument - } - var _3: Int32? - if Int(_1!) & Int(1 << 0) != 0 {_3 = reader.readInt32() } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = (Int(_1!) & Int(1 << 0) == 0) || _3 != nil - if _c1 && _c2 && _c3 { - return Api.InputMedia.inputMediaDocument(flags: _1!, id: _2!, ttlSeconds: _3) - } - else { - return nil - } - } public static func parse_inputMediaPhotoExternal(_ reader: BufferReader) -> InputMedia? { var _1: Int32? _1 = reader.readInt32() @@ -12039,6 +12051,28 @@ public extension Api { return nil } } + public static func parse_inputMediaDocument(_ reader: BufferReader) -> InputMedia? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Api.InputDocument? + if let signature = reader.readInt32() { + _2 = Api.parse(reader, signature: signature) as? Api.InputDocument + } + var _3: Int32? + if Int(_1!) & Int(1 << 0) != 0 {_3 = reader.readInt32() } + var _4: String? + if Int(_1!) & Int(1 << 1) != 0 {_4 = parseString(reader) } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = (Int(_1!) & Int(1 << 0) == 0) || _3 != nil + let _c4 = (Int(_1!) & Int(1 << 1) == 0) || _4 != nil + if _c1 && _c2 && _c3 && _c4 { + return Api.InputMedia.inputMediaDocument(flags: _1!, id: _2!, ttlSeconds: _3, query: _4) + } + else { + return nil + } + } } public enum InputPeer: TypeConstructorDescription { diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index ed9994f049..ffb422fb09 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -7241,12 +7241,12 @@ public extension Api { }) } - public static func createGroupCall(channel: Api.InputChannel, randomId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func createGroupCall(peer: Api.InputPeer, randomId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-467076606) - channel.serialize(buffer, true) + buffer.appendInt32(-1120031776) + peer.serialize(buffer, true) serializeInt32(randomId, buffer: buffer, boxed: false) - return (FunctionDescription(name: "phone.createGroupCall", parameters: [("channel", channel), ("randomId", randomId)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + return (FunctionDescription(name: "phone.createGroupCall", parameters: [("peer", peer), ("randomId", randomId)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in let reader = BufferReader(buffer) var result: Api.Updates? if let signature = reader.readInt32() { diff --git a/submodules/TelegramBaseController/Sources/TelegramBaseController.swift b/submodules/TelegramBaseController/Sources/TelegramBaseController.swift index 8e19d8f15c..234856ab69 100644 --- a/submodules/TelegramBaseController/Sources/TelegramBaseController.swift +++ b/submodules/TelegramBaseController/Sources/TelegramBaseController.swift @@ -280,10 +280,13 @@ open class TelegramBaseController: ViewController, KeyShortcutResponder { if case let .peer(peerId) = groupCallPanelSource { availableGroupCall = context.account.viewTracker.peerView(peerId) |> map { peerView -> CachedChannelData.ActiveCall? in - guard let cachedData = peerView.cachedData as? CachedChannelData else { + if let cachedData = peerView.cachedData as? CachedChannelData { + return cachedData.activeCall + } else if let cachedData = peerView.cachedData as? CachedGroupData { + return cachedData.activeCall + } else { return nil } - return cachedData.activeCall } |> distinctUntilChanged |> mapToSignal { activeCall -> Signal in diff --git a/submodules/TelegramCallsUI/Sources/CallControllerButton.swift b/submodules/TelegramCallsUI/Sources/CallControllerButton.swift index 4315f106b6..3b1bc17a62 100644 --- a/submodules/TelegramCallsUI/Sources/CallControllerButton.swift +++ b/submodules/TelegramCallsUI/Sources/CallControllerButton.swift @@ -14,7 +14,7 @@ final class CallControllerButtonItemNode: HighlightTrackingButtonNode { enum Color: Equatable { case red case green - case custom(UInt32) + case custom(UInt32, CGFloat) } case blurred(isFilled: Bool) @@ -37,6 +37,7 @@ final class CallControllerButtonItemNode: HighlightTrackingButtonNode { case speaker case airpods case airpodsPro + case headphones case accept case end } @@ -196,8 +197,8 @@ final class CallControllerButtonItemNode: HighlightTrackingButtonNode { fillColor = UIColor(rgb: 0xd92326) case .green: fillColor = UIColor(rgb: 0x74db58) - case let .custom(color): - fillColor = UIColor(rgb: color) + case let .custom(color, alpha): + fillColor = UIColor(rgb: color, alpha: alpha) } } @@ -221,6 +222,8 @@ final class CallControllerButtonItemNode: HighlightTrackingButtonNode { image = generateTintedImage(image: UIImage(bundleImageName: "Call/CallAirpodsButton"), color: imageColor) case .airpodsPro: image = generateTintedImage(image: UIImage(bundleImageName: "Call/CallAirpodsProButton"), color: imageColor) + case .headphones: + image = generateTintedImage(image: UIImage(bundleImageName: "Call/CallHeadphonesButton"), color: imageColor) case .accept: image = generateTintedImage(image: UIImage(bundleImageName: "Call/CallAcceptButton"), color: imageColor) case .end: @@ -290,7 +293,7 @@ final class CallControllerButtonItemNode: HighlightTrackingButtonNode { fillColor = UIColor(rgb: 0xd92326).withMultipliedBrightnessBy(0.2).withAlphaComponent(0.2) case .green: fillColor = UIColor(rgb: 0x74db58).withMultipliedBrightnessBy(0.2).withAlphaComponent(0.2) - case let .custom(color): + case let .custom(color, alpha): fillColor = UIColor(rgb: color).withMultipliedBrightnessBy(0.2).withAlphaComponent(0.2) } } diff --git a/submodules/TelegramCallsUI/Sources/CallControllerButtonsNode.swift b/submodules/TelegramCallsUI/Sources/CallControllerButtonsNode.swift index 1612f1cc91..bafe04e8c3 100644 --- a/submodules/TelegramCallsUI/Sources/CallControllerButtonsNode.swift +++ b/submodules/TelegramCallsUI/Sources/CallControllerButtonsNode.swift @@ -51,6 +51,7 @@ private enum ButtonDescription: Equatable { case bluetooth case airpods case airpodsPro + case headphones } enum EndType { @@ -205,7 +206,7 @@ final class CallControllerButtonsNode: ASDisplayNode { case .speaker: soundOutput = .speaker case .headphones: - soundOutput = .bluetooth + soundOutput = .headphones case let .bluetooth(type): switch type { case .generic: @@ -296,7 +297,7 @@ final class CallControllerButtonsNode: ASDisplayNode { case .speaker: soundOutput = .speaker case .headphones: - soundOutput = .builtin + soundOutput = .headphones case let .bluetooth(type): switch type { case .generic: @@ -467,6 +468,9 @@ final class CallControllerButtonsNode: ASDisplayNode { case .airpodsPro: image = .airpodsPro title = strings.Call_Audio + case .headphones: + image = .headphones + title = strings.Call_Audio } buttonContent = CallControllerButtonItemNode.Content( appearance: .blurred(isFilled: isFilled), diff --git a/submodules/TelegramCallsUI/Sources/CallStatusBarNode.swift b/submodules/TelegramCallsUI/Sources/CallStatusBarNode.swift index 973ac2cca5..0d7daa59cb 100644 --- a/submodules/TelegramCallsUI/Sources/CallStatusBarNode.swift +++ b/submodules/TelegramCallsUI/Sources/CallStatusBarNode.swift @@ -411,9 +411,9 @@ public class CallStatusBarNodeImpl: CallStatusBarNode { } let spacing: CGFloat = 5.0 - let titleSize = self.titleNode.updateLayout(CGSize(width: 160.0, height: size.height)) - let subtitleSize = self.subtitleNode.updateLayout(size: CGSize(width: 160.0, height: size.height), animated: true) - let speakerSize = self.speakerNode.updateLayout(CGSize(width: 160.0, height: size.height)) + let titleSize = self.titleNode.updateLayout(CGSize(width: 150.0, height: size.height)) + let subtitleSize = self.subtitleNode.updateLayout(size: CGSize(width: 150.0, height: size.height), animated: true) + let speakerSize = self.speakerNode.updateLayout(CGSize(width: 150.0, height: size.height)) let totalWidth = titleSize.width + spacing + subtitleSize.width let horizontalOrigin: CGFloat = floor((size.width - totalWidth) / 2.0) diff --git a/submodules/TelegramCallsUI/Sources/GroupCallNavigationAccessoryPanel.swift b/submodules/TelegramCallsUI/Sources/GroupCallNavigationAccessoryPanel.swift index e3c6ae2b41..0455340834 100644 --- a/submodules/TelegramCallsUI/Sources/GroupCallNavigationAccessoryPanel.swift +++ b/submodules/TelegramCallsUI/Sources/GroupCallNavigationAccessoryPanel.swift @@ -296,7 +296,7 @@ public final class GroupCallNavigationAccessoryPanel: ASDisplayNode { membersText = self.strings.VoiceChat_Panel_Members(Int32(data.participantCount)) } - self.avatarsContent = self.avatarsContext.update(peers: data.topParticipants.map { $0.peer }.filter { $0.id != self.context.account.peerId }, animated: false) + self.avatarsContent = self.avatarsContext.update(peers: data.topParticipants.map { $0.peer }, animated: false) self.textNode.attributedText = NSAttributedString(string: membersText, font: Font.regular(13.0), textColor: self.theme.chat.inputPanel.secondaryTextColor) @@ -321,7 +321,7 @@ public final class GroupCallNavigationAccessoryPanel: ASDisplayNode { strongSelf.textNode.attributedText = NSAttributedString(string: membersText, font: Font.regular(13.0), textColor: strongSelf.theme.chat.inputPanel.secondaryTextColor) - strongSelf.avatarsContent = strongSelf.avatarsContext.update(peers: summaryState.topParticipants.map { $0.peer }.filter { $0.id != strongSelf.context.account.peerId }, animated: false) + strongSelf.avatarsContent = strongSelf.avatarsContext.update(peers: summaryState.topParticipants.map { $0.peer }, animated: false) if let (size, leftInset, rightInset) = strongSelf.validLayout { strongSelf.updateLayout(size: size, leftInset: leftInset, rightInset: rightInset, transition: .immediate) @@ -400,7 +400,7 @@ public final class GroupCallNavigationAccessoryPanel: ASDisplayNode { self.textNode.attributedText = NSAttributedString(string: membersText, font: Font.regular(13.0), textColor: self.theme.chat.inputPanel.secondaryTextColor) - self.avatarsContent = self.avatarsContext.update(peers: data.topParticipants.map { $0.peer }.filter { $0.id != self.context.account.peerId }, animated: false) + self.avatarsContent = self.avatarsContext.update(peers: data.topParticipants.map { $0.peer }, animated: false) updateAudioLevels = true } diff --git a/submodules/TelegramCallsUI/Sources/PresentationCall.swift b/submodules/TelegramCallsUI/Sources/PresentationCall.swift index 0f3df58856..ccb3c49aaf 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCall.swift @@ -34,7 +34,7 @@ final class PresentationCallToneRenderer { self.toneRenderer = MediaPlayerAudioRenderer(audioSession: .custom({ control in return controlImpl?(control) ?? EmptyDisposable - }), playAndRecord: false, ambient: false, forceAudioToSpeaker: false, baseRate: 1.0, audioLevelPipe: self.audioLevelPipe, updatedRate: {}, audioPaused: {}) + }), playAndRecord: false, useVoiceProcessingMode: true, ambient: false, forceAudioToSpeaker: false, baseRate: 1.0, audioLevelPipe: self.audioLevelPipe, updatedRate: {}, audioPaused: {}) controlImpl = { [weak self] control in queue.async { diff --git a/submodules/TelegramCallsUI/Sources/PresentationCallManager.swift b/submodules/TelegramCallsUI/Sources/PresentationCallManager.swift index 1675cae118..a11d234fbf 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationCallManager.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCallManager.swift @@ -82,8 +82,8 @@ public final class PresentationCallManagerImpl: PresentationCallManager { |> distinctUntilChanged } - public var hasActiveGroupCall: Bool { - return self.currentGroupCall != nil + public var hasActiveCall: Bool { + return self.currentCall != nil || self.currentGroupCall != nil } private let currentCallPromise = Promise(nil) diff --git a/submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift b/submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift index 1b42a67fd6..b8efbdfd14 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCallToneData.swift @@ -1,7 +1,7 @@ import Foundation import AVFoundation -private func loadToneData(name: String) -> Data? { +private func loadToneData(name: String, addSilenceDuration: Double = 0.0) -> Data? { let outputSettings: [String: Any] = [ AVFormatIDKey: kAudioFormatLinearPCM as NSNumber, AVSampleRateKey: 44100.0 as NSNumber, @@ -62,6 +62,15 @@ private func loadToneData(name: String) -> Data? { } } + if !addSilenceDuration.isZero { + let sampleRate = 44100 + let numberOfSamples = Int(Double(sampleRate) * addSilenceDuration) + let numberOfChannels = 2 + let numberOfBytes = numberOfSamples * 2 * numberOfChannels + + data.append(Data(count: numberOfBytes)) + } + return data } @@ -73,6 +82,7 @@ enum PresentationCallTone { case ended case groupJoined case groupLeft + case groupConnecting var loopCount: Int? { switch self { @@ -84,6 +94,8 @@ enum PresentationCallTone { return 1 case .groupJoined, .groupLeft: return 1 + case .groupConnecting: + return nil default: return nil } @@ -103,8 +115,10 @@ func presentationCallToneData(_ tone: PresentationCallTone) -> Data? { case .ended: return loadToneData(name: "voip_end.caf") case .groupJoined: - return loadToneData(name: "voip_group_joined.wav") + return loadToneData(name: "voip_group_joined.mp3") case .groupLeft: - return loadToneData(name: "voip_group_left.wav") + return loadToneData(name: "voip_group_left.mp3") + case .groupConnecting: + return loadToneData(name: "voip_group_connecting.mp3", addSilenceDuration: 2.0) } } diff --git a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift index 2f65717ca6..bec9ac61ee 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift @@ -278,7 +278,7 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { var audioLevels: [(PeerId, Float, Bool)] = [] for (peerId, level, hasVoice) in levels { - if level > 0.1 { + if level > 0.001 { audioLevels.append((peerId, level, hasVoice)) } } @@ -444,6 +444,7 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { private var removedChannelMembersDisposable: Disposable? + private var didStartConnectingOnce: Bool = false private var didConnectOnce: Bool = false private var toneRenderer: PresentationCallToneRenderer? @@ -831,10 +832,10 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { case .connected: mappedState = .connected } + let wasConnecting = strongSelf.stateValue.networkState == .connecting if strongSelf.stateValue.networkState != mappedState { strongSelf.stateValue.networkState = mappedState } - let isConnecting = mappedState == .connecting if strongSelf.isCurrentlyConnecting != isConnecting { @@ -847,12 +848,28 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { } } - if case .connected = state, !strongSelf.didConnectOnce { - strongSelf.didConnectOnce = true - - let toneRenderer = PresentationCallToneRenderer(tone: .groupJoined) - strongSelf.toneRenderer = toneRenderer - toneRenderer.setAudioSessionActive(strongSelf.isAudioSessionActive) + if (wasConnecting != isConnecting && strongSelf.didConnectOnce) { //|| !strongSelf.didStartConnectingOnce { + if isConnecting { + let toneRenderer = PresentationCallToneRenderer(tone: .groupConnecting) + strongSelf.toneRenderer = toneRenderer + toneRenderer.setAudioSessionActive(strongSelf.isAudioSessionActive) + } else { + strongSelf.toneRenderer = nil + } + } + + if isConnecting { + strongSelf.didStartConnectingOnce = true + } + + if case .connected = state { + if !strongSelf.didConnectOnce { + strongSelf.didConnectOnce = true + + let toneRenderer = PresentationCallToneRenderer(tone: .groupJoined) + strongSelf.toneRenderer = toneRenderer + toneRenderer.setAudioSessionActive(strongSelf.isAudioSessionActive) + } } })) @@ -1099,16 +1116,31 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { private func markAsCanBeRemoved() { self.callContext?.stop() - self.callContext = nil self._canBeRemoved.set(.single(true)) - let toneRenderer = PresentationCallToneRenderer(tone: .groupLeft) - self.toneRenderer = toneRenderer - toneRenderer.setAudioSessionActive(self.isAudioSessionActive) - - Queue.mainQueue().after(0.5, { - self.wasRemoved.set(.single(true)) - }) + if self.didConnectOnce { + if let callManager = self.accountContext.sharedContext.callManager { + let _ = (callManager.currentGroupCallSignal + |> take(1) + |> deliverOnMainQueue).start(next: { [weak self] call in + guard let strongSelf = self else { + return + } + if let call = call, call !== strongSelf { + strongSelf.wasRemoved.set(.single(true)) + return + } + + let toneRenderer = PresentationCallToneRenderer(tone: .groupLeft) + strongSelf.toneRenderer = toneRenderer + toneRenderer.setAudioSessionActive(strongSelf.isAudioSessionActive) + + Queue.mainQueue().after(1.0, { + strongSelf.wasRemoved.set(.single(true)) + }) + }) + } + } } public func leave(terminateIfPossible: Bool) -> Signal { diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift b/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift index 7ae3c89c7e..2b2efd4bff 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift @@ -20,8 +20,8 @@ private let areaSize = CGSize(width: 440.0, height: 440.0) private let blobSize = CGSize(width: 244.0, height: 244.0) final class VoiceChatActionButton: HighlightTrackingButtonNode { - enum State { - enum ActiveState { + enum State: Equatable { + enum ActiveState: Equatable { case cantSpeak case muted case on @@ -31,6 +31,15 @@ final class VoiceChatActionButton: HighlightTrackingButtonNode { case active(state: ActiveState) } + var stateValue: State { + return self.currentParams?.state ?? .connecting + } + var statePromise = ValuePromise() + var state: Signal { + return self.statePromise.get() + } + + let bottomNode: ASDisplayNode private let containerNode: ASDisplayNode private let backgroundNode: VoiceChatActionButtonBackgroundNode private let iconNode: VoiceChatMicrophoneNode @@ -55,6 +64,14 @@ final class VoiceChatActionButton: HighlightTrackingButtonNode { var isDisabled: Bool = false + var ignoreHierarchyChanges: Bool { + get { + return self.backgroundNode.ignoreHierarchyChanges + } set { + self.backgroundNode.ignoreHierarchyChanges = newValue + } + } + var wasActiveWhenPressed = false var pressing: Bool = false { didSet { @@ -85,6 +102,7 @@ final class VoiceChatActionButton: HighlightTrackingButtonNode { } init() { + self.bottomNode = ASDisplayNode() self.containerNode = ASDisplayNode() self.backgroundNode = VoiceChatActionButtonBackgroundNode() self.iconNode = VoiceChatMicrophoneNode() @@ -94,6 +112,7 @@ final class VoiceChatActionButton: HighlightTrackingButtonNode { super.init() + self.addSubnode(self.bottomNode) self.addSubnode(self.titleLabel) self.addSubnode(self.subtitleLabel) @@ -139,7 +158,7 @@ final class VoiceChatActionButton: HighlightTrackingButtonNode { } let updatedTitle = self.titleLabel.attributedText?.string != title - let updatedSubtitle = self.subtitleLabel.attributedText?.string != title + let updatedSubtitle = self.subtitleLabel.attributedText?.string != subtitle self.titleLabel.attributedText = NSAttributedString(string: title, font: titleFont, textColor: .white) self.subtitleLabel.attributedText = NSAttributedString(string: subtitle, font: subtitleFont, textColor: .white) @@ -167,9 +186,10 @@ final class VoiceChatActionButton: HighlightTrackingButtonNode { let subtitleSize = self.subtitleLabel.updateLayout(CGSize(width: size.width, height: .greatestFiniteMagnitude)) let totalHeight = titleSize.height + subtitleSize.height + 1.0 - self.titleLabel.frame = CGRect(origin: CGPoint(x: floor((size.width - titleSize.width) / 2.0), y: floor(size.height - totalHeight / 2.0) - 110.0), size: titleSize) + self.titleLabel.frame = CGRect(origin: CGPoint(x: floor((size.width - titleSize.width) / 2.0), y: floor(size.height - totalHeight / 2.0) - 112.0), size: titleSize) self.subtitleLabel.frame = CGRect(origin: CGPoint(x: floor((size.width - subtitleSize.width) / 2.0), y: self.titleLabel.frame.maxY + 1.0), size: subtitleSize) + self.bottomNode.frame = CGRect(origin: CGPoint(), size: size) self.containerNode.frame = CGRect(origin: CGPoint(), size: size) self.backgroundNode.bounds = CGRect(origin: CGPoint(), size: size) @@ -188,18 +208,20 @@ final class VoiceChatActionButton: HighlightTrackingButtonNode { break } - let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.2, curve: .easeInOut) : .immediate + if snap { + let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.2, curve: .easeInOut) : .immediate transition.updateTransformScale(node: self.backgroundNode, scale: active ? 0.75 : 0.5) transition.updateTransformScale(node: self.iconNode, scale: 0.5) transition.updateAlpha(node: self.titleLabel, alpha: 0.0) transition.updateAlpha(node: self.subtitleLabel, alpha: 0.0) transition.updateAlpha(layer: self.backgroundNode.maskProgressLayer, alpha: 0.0) } else { - transition.updateTransformScale(node: self.backgroundNode, scale: small ? 0.85 : 1.0) - transition.updateTransformScale(node: self.iconNode, scale: self.pressing ? 0.9 : 1.0) - transition.updateAlpha(node: self.titleLabel, alpha: 1.0) - transition.updateAlpha(node: self.subtitleLabel, alpha: 1.0) + let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.2, curve: .easeInOut) : .immediate + transition.updateTransformScale(node: self.backgroundNode, scale: small ? 0.85 : 1.0, delay: 0.05) + transition.updateTransformScale(node: self.iconNode, scale: self.pressing ? 0.9 : 1.0, delay: 0.05) + transition.updateAlpha(node: self.titleLabel, alpha: 1.0, delay: 0.05) + transition.updateAlpha(node: self.subtitleLabel, alpha: 1.0, delay: 0.05) transition.updateAlpha(layer: self.backgroundNode.maskProgressLayer, alpha: 1.0) } @@ -209,7 +231,7 @@ final class VoiceChatActionButton: HighlightTrackingButtonNode { } private func applyIconParams() { - guard let (size, _, state, _, small, title, subtitle, snap) = self.currentParams else { + guard let (_, _, state, _, _, _, _, snap) = self.currentParams else { return } @@ -250,6 +272,8 @@ final class VoiceChatActionButton: HighlightTrackingButtonNode { let previousState = previous?.state self.currentParams = (size, buttonSize, state, dark, small, title, subtitle, previous?.snap ?? false) + self.statePromise.set(state) + var backgroundState: VoiceChatActionButtonBackgroundNode.State switch state { case let .active(state): @@ -392,6 +416,7 @@ private final class VoiceChatActionButtonBackgroundNode: ASDisplayNode { private var state: State private var hasState = false + private var transition: State? var audioLevel: CGFloat = 0.0 { @@ -422,6 +447,7 @@ private final class VoiceChatActionButtonBackgroundNode: ASDisplayNode { private let hierarchyTrackingNode: HierarchyTrackingNode private var isCurrentlyInHierarchy = false + var ignoreHierarchyChanges = false override init() { self.state = .connecting @@ -483,7 +509,7 @@ private final class VoiceChatActionButtonBackgroundNode: ASDisplayNode { self.maskCircleLayer.isHidden = true updateInHierarchy = { [weak self] value in - if let strongSelf = self { + if let strongSelf = self, !strongSelf.ignoreHierarchyChanges { strongSelf.isCurrentlyInHierarchy = value strongSelf.updateAnimations() } diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatActionItem.swift b/submodules/TelegramCallsUI/Sources/VoiceChatActionItem.swift index 5519f41c0e..e7384f0e41 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatActionItem.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatActionItem.swift @@ -149,7 +149,7 @@ class VoiceChatActionItemNode: ListViewItemNode { updatedTheme = item.presentationData.theme } - let titleFont = Font.regular(item.presentationData.fontSize.itemListBaseFontSize) + let titleFont = Font.regular(17.0) var leftInset: CGFloat = 16.0 + params.leftInset if case .generic = item.icon { diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift index adfc9ac56b..dd65f0e9fc 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift @@ -106,7 +106,7 @@ private final class VoiceChatControllerTitleNode: ASDisplayNode { self.titleNode.attributedText = NSAttributedString(string: title, font: Font.medium(17.0), textColor: UIColor(rgb: 0xffffff)) self.infoNode.attributedText = NSAttributedString(string: subtitle, font: Font.regular(13.0), textColor: UIColor(rgb: 0xffffff, alpha: 0.5)) - let constrainedSize = CGSize(width: size.width - 80.0, height: size.height) + let constrainedSize = CGSize(width: size.width - 120.0, height: size.height) let titleSize = self.titleNode.measure(constrainedSize) let infoSize = self.infoNode.measure(constrainedSize) let titleInfoSpacing: CGFloat = 0.0 @@ -128,7 +128,6 @@ public final class VoiceChatController: ViewController { let isEmpty: Bool let crossFade: Bool let count: Int - let isExpanded: Bool let animated: Bool } @@ -363,14 +362,14 @@ public final class VoiceChatController: ViewController { } } - private func preparedTransition(from fromEntries: [ListEntry], to toEntries: [ListEntry], isLoading: Bool, isEmpty: Bool, crossFade: Bool, context: AccountContext, presentationData: PresentationData, interaction: Interaction, isExpanded: Bool) -> ListTransition { + private func preparedTransition(from fromEntries: [ListEntry], to toEntries: [ListEntry], isLoading: Bool, isEmpty: Bool, crossFade: Bool, context: AccountContext, presentationData: PresentationData, interaction: Interaction) -> ListTransition { let (deleteIndices, indicesAndItems, updateIndices) = mergeListsStableWithUpdates(leftList: fromEntries, rightList: toEntries) let deletions = deleteIndices.map { ListViewDeleteItem(index: $0, directionHint: nil) } let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, presentationData: presentationData, interaction: interaction), directionHint: nil) } let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, presentationData: presentationData, interaction: interaction), directionHint: nil) } - return ListTransition(deletions: deletions, insertions: insertions, updates: updates, isLoading: isLoading, isEmpty: isEmpty, crossFade: crossFade, count: toEntries.count, isExpanded: isExpanded, animated: true) + return ListTransition(deletions: deletions, insertions: insertions, updates: updates, isLoading: isLoading, isEmpty: isEmpty, crossFade: crossFade, count: toEntries.count, animated: true) } private weak var controller: VoiceChatController? @@ -394,8 +393,8 @@ public final class VoiceChatController: ViewController { fileprivate let bottomPanelNode: ASDisplayNode private let bottomPanelBackgroundNode: ASDisplayNode private let bottomCornersNode: ASImageNode - private let audioOutputNode: CallControllerButtonItemNode - private let leaveNode: CallControllerButtonItemNode + fileprivate let audioOutputNode: CallControllerButtonItemNode + fileprivate let leaveNode: CallControllerButtonItemNode fileprivate let actionButton: VoiceChatActionButton private let leftBorderNode: ASDisplayNode private let rightBorderNode: ASDisplayNode @@ -414,7 +413,6 @@ public final class VoiceChatController: ViewController { private var currentCallMembers: [GroupCallParticipantsContext.Participant]? private var currentInvitedPeers: [Peer]? private var currentSpeakingPeers: Set? - private var currentIsExpanded: Bool = false private var currentContentOffset: CGFloat? private var ignoreScrolling = false private var accountPeer: Peer? @@ -476,6 +474,7 @@ public final class VoiceChatController: ViewController { self.listNode = ListView() self.listNode.verticalScrollIndicatorColor = UIColor(white: 1.0, alpha: 0.3) self.listNode.clipsToBounds = true + self.listNode.scroller.bounces = false self.topPanelNode = ASDisplayNode() self.topPanelNode.clipsToBounds = false @@ -563,7 +562,7 @@ public final class VoiceChatController: ViewController { guard let strongSelf = self else { return } - guard let groupPeer = groupPeer as? TelegramChannel else { + guard let groupPeer = groupPeer else { return } @@ -571,8 +570,14 @@ public final class VoiceChatController: ViewController { if let currentCallMembers = strongSelf.currentCallMembers { filters.append(.disable(Array(currentCallMembers.map { $0.peer.id }))) } - if !groupPeer.hasPermission(.inviteMembers) { - filters.append(.excludeNonMembers) + if let groupPeer = groupPeer as? TelegramChannel { + if !groupPeer.hasPermission(.inviteMembers) { + filters.append(.excludeNonMembers) + } + } else if let groupPeer = groupPeer as? TelegramGroup { + if groupPeer.hasBannedPermission(.banAddMembers) { + filters.append(.excludeNonMembers) + } } filters.append(.excludeBots) @@ -599,73 +604,143 @@ public final class VoiceChatController: ViewController { return } - let selfController = strongSelf.controller - let inviteDisposable = strongSelf.inviteDisposable - var inviteSignal = strongSelf.context.peerChannelMemberCategoriesContextsManager.addMembers(account: strongSelf.context.account, peerId: groupPeer.id, memberIds: [peer.id]) - var cancelImpl: (() -> Void)? - let progressSignal = Signal { [weak selfController] subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { - cancelImpl?() - })) - selfController?.present(controller, in: .window(.root)) - return ActionDisposable { [weak controller] in - Queue.mainQueue().async() { - controller?.dismiss() + if let groupPeer = groupPeer as? TelegramChannel { + let selfController = strongSelf.controller + let inviteDisposable = strongSelf.inviteDisposable + var inviteSignal = strongSelf.context.peerChannelMemberCategoriesContextsManager.addMembers(account: strongSelf.context.account, peerId: groupPeer.id, memberIds: [peer.id]) + var cancelImpl: (() -> Void)? + let progressSignal = Signal { [weak selfController] subscriber in + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + cancelImpl?() + })) + selfController?.present(controller, in: .window(.root)) + return ActionDisposable { [weak controller] in + Queue.mainQueue().async() { + controller?.dismiss() + } } } - } - |> runOn(Queue.mainQueue()) - |> delay(0.15, queue: Queue.mainQueue()) - let progressDisposable = progressSignal.start() - - inviteSignal = inviteSignal - |> afterDisposed { - Queue.mainQueue().async { - progressDisposable.dispose() - } - } - cancelImpl = { - inviteDisposable.set(nil) - } - - inviteDisposable.set((inviteSignal |> deliverOnMainQueue).start(error: { error in - dismissController?() - guard let strongSelf = self else { - return - } - let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } + |> runOn(Queue.mainQueue()) + |> delay(0.15, queue: Queue.mainQueue()) + let progressDisposable = progressSignal.start() - let text: String - switch error { - case .limitExceeded: - text = presentationData.strings.Channel_ErrorAddTooMuch - case .tooMuchJoined: - text = presentationData.strings.Invite_ChannelsTooMuch - case .generic: - text = presentationData.strings.Login_UnknownError - case .restricted: - text = presentationData.strings.Channel_ErrorAddBlocked - case .notMutualContact: - text = presentationData.strings.GroupInfo_AddUserLeftError - case .botDoesntSupportGroups: - text = presentationData.strings.Channel_BotDoesntSupportGroups - case .tooMuchBots: - text = presentationData.strings.Channel_TooMuchBots - case .bot: - text = presentationData.strings.Login_UnknownError + inviteSignal = inviteSignal + |> afterDisposed { + Queue.mainQueue().async { + progressDisposable.dispose() + } } - strongSelf.controller?.present(textAlertController(context: strongSelf.context, forceTheme: strongSelf.darkTheme, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root)) - }, completed: { - guard let strongSelf = self else { + cancelImpl = { + inviteDisposable.set(nil) + } + + inviteDisposable.set((inviteSignal |> deliverOnMainQueue).start(error: { error in dismissController?() - return + guard let strongSelf = self else { + return + } + let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } + + let text: String + switch error { + case .limitExceeded: + text = presentationData.strings.Channel_ErrorAddTooMuch + case .tooMuchJoined: + text = presentationData.strings.Invite_ChannelsTooMuch + case .generic: + text = presentationData.strings.Login_UnknownError + case .restricted: + text = presentationData.strings.Channel_ErrorAddBlocked + case .notMutualContact: + text = presentationData.strings.GroupInfo_AddUserLeftError + case .botDoesntSupportGroups: + text = presentationData.strings.Channel_BotDoesntSupportGroups + case .tooMuchBots: + text = presentationData.strings.Channel_TooMuchBots + case .bot: + text = presentationData.strings.Login_UnknownError + } + strongSelf.controller?.present(textAlertController(context: strongSelf.context, forceTheme: strongSelf.darkTheme, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + }, completed: { + guard let strongSelf = self else { + dismissController?() + return + } + dismissController?() + + if strongSelf.call.invitePeer(peer.id) { + strongSelf.controller?.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .invitedToVoiceChat(context: strongSelf.context, peer: peer, text: strongSelf.presentationData.strings.VoiceChat_InvitedPeerText(peer.displayTitle(strings: strongSelf.presentationData.strings, displayOrder: strongSelf.presentationData.nameDisplayOrder)).0), elevatedLayout: false, action: { _ in return false }), in: .current) + } + })) + } else if let groupPeer = groupPeer as? TelegramGroup { + let selfController = strongSelf.controller + let inviteDisposable = strongSelf.inviteDisposable + var inviteSignal = addGroupMember(account: strongSelf.context.account, peerId: groupPeer.id, memberId: peer.id) + var cancelImpl: (() -> Void)? + let progressSignal = Signal { [weak selfController] subscriber in + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + cancelImpl?() + })) + selfController?.present(controller, in: .window(.root)) + return ActionDisposable { [weak controller] in + Queue.mainQueue().async() { + controller?.dismiss() + } + } } - dismissController?() + |> runOn(Queue.mainQueue()) + |> delay(0.15, queue: Queue.mainQueue()) + let progressDisposable = progressSignal.start() - if strongSelf.call.invitePeer(peer.id) { - strongSelf.controller?.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .invitedToVoiceChat(context: strongSelf.context, peer: peer, text: strongSelf.presentationData.strings.VoiceChat_InvitedPeerText(peer.displayTitle(strings: strongSelf.presentationData.strings, displayOrder: strongSelf.presentationData.nameDisplayOrder)).0), elevatedLayout: false, action: { _ in return false }), in: .current) + inviteSignal = inviteSignal + |> afterDisposed { + Queue.mainQueue().async { + progressDisposable.dispose() + } } - })) + cancelImpl = { + inviteDisposable.set(nil) + } + + inviteDisposable.set((inviteSignal |> deliverOnMainQueue).start(error: { error in + dismissController?() + guard let strongSelf = self else { + return + } + let context = strongSelf.context + let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } + + switch error { + case .privacy: + let _ = (strongSelf.context.account.postbox.loadedPeerWithId(peer.id) + |> deliverOnMainQueue).start(next: { peer in + self?.controller?.present(textAlertController(context: context, title: nil, text: presentationData.strings.Privacy_GroupsAndChannels_InviteToGroupError(peer.compactDisplayTitle, peer.compactDisplayTitle).0, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + }) + case .notMutualContact: + let _ = (strongSelf.context.account.postbox.loadedPeerWithId(peer.id) + |> deliverOnMainQueue).start(next: { peer in + self?.controller?.present(textAlertController(context: context, title: nil, text: presentationData.strings.GroupInfo_AddUserLeftError, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + }) + case .tooManyChannels: + let _ = (strongSelf.context.account.postbox.loadedPeerWithId(peer.id) + |> deliverOnMainQueue).start(next: { peer in + self?.controller?.present(textAlertController(context: context, title: nil, text: presentationData.strings.Invite_ChannelsTooMuch, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + }) + case .groupFull, .generic: + strongSelf.controller?.present(textAlertController(context: strongSelf.context, forceTheme: strongSelf.darkTheme, title: nil, text: presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + } + }, completed: { + guard let strongSelf = self else { + dismissController?() + return + } + dismissController?() + + if strongSelf.call.invitePeer(peer.id) { + strongSelf.controller?.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .invitedToVoiceChat(context: strongSelf.context, peer: peer, text: strongSelf.presentationData.strings.VoiceChat_InvitedPeerText(peer.displayTitle(strings: strongSelf.presentationData.strings, displayOrder: strongSelf.presentationData.nameDisplayOrder)).0), elevatedLayout: false, action: { _ in return false }), in: .current) + } + })) + } })]), in: .window(.root)) } }) @@ -886,7 +961,7 @@ public final class VoiceChatController: ViewController { } } - strongSelf.updateMembers(muteState: strongSelf.effectiveMuteState, callMembers: callMembers?.participants ?? [], invitedPeers: invitedPeers, speakingPeers: callMembers?.speakingParticipants ?? [], isExpanded: strongSelf.currentIsExpanded) + strongSelf.updateMembers(muteState: strongSelf.effectiveMuteState, callMembers: callMembers?.participants ?? [], invitedPeers: invitedPeers, speakingPeers: callMembers?.speakingParticipants ?? []) let subtitle = strongSelf.presentationData.strings.VoiceChat_Panel_Members(Int32(max(1, callMembers?.totalCount ?? 0))) strongSelf.currentSubtitle = subtitle @@ -907,13 +982,22 @@ public final class VoiceChatController: ViewController { } if !strongSelf.didSetDataReady { strongSelf.accountPeer = accountPeer - strongSelf.updateMembers(muteState: strongSelf.effectiveMuteState, callMembers: strongSelf.currentCallMembers ?? [], invitedPeers: strongSelf.currentInvitedPeers ?? [], speakingPeers: strongSelf.currentSpeakingPeers ?? Set(), isExpanded: strongSelf.currentIsExpanded) + strongSelf.updateMembers(muteState: strongSelf.effectiveMuteState, callMembers: strongSelf.currentCallMembers ?? [], invitedPeers: strongSelf.currentInvitedPeers ?? [], speakingPeers: strongSelf.currentSpeakingPeers ?? Set()) - if let peer = peerViewMainPeer(view), let channel = peer as? TelegramChannel { - let addressName = channel.addressName ?? "" - if !addressName.isEmpty || (channel.flags.contains(.isCreator) || channel.hasPermission(.inviteMembers)) { - if addressName.isEmpty { + if let peer = peerViewMainPeer(view) { + if let channel = peer as? TelegramChannel { + let addressName = channel.addressName ?? "" + if channel.flags.contains(.isCreator) || channel.hasPermission(.inviteMembers) { + if addressName.isEmpty { + let _ = ensuredExistingPeerExportedInvitation(account: strongSelf.context.account, peerId: call.peerId).start() + } + } + } else if let group = peer as? TelegramGroup { + switch group.role { + case .creator, .admin: let _ = ensuredExistingPeerExportedInvitation(account: strongSelf.context.account, peerId: call.peerId).start() + default: + break } } } @@ -922,13 +1006,24 @@ public final class VoiceChatController: ViewController { strongSelf.controller?.dataReady.set(true) } - if let peer = peerViewMainPeer(view), let channel = peer as? TelegramChannel { - if channel.hasPermission(.manageCalls) { - strongSelf.optionsButton.isUserInteractionEnabled = true - strongSelf.optionsButton.alpha = 1.0 - } else { - strongSelf.optionsButton.isUserInteractionEnabled = false - strongSelf.optionsButton.alpha = 0.0 + if let peer = peerViewMainPeer(view) { + if let channel = peer as? TelegramChannel { + if channel.hasPermission(.manageCalls) { + strongSelf.optionsButton.isUserInteractionEnabled = true + strongSelf.optionsButton.alpha = 1.0 + } else { + strongSelf.optionsButton.isUserInteractionEnabled = false + strongSelf.optionsButton.alpha = 0.0 + } + } else if let group = peer as? TelegramGroup { + switch group.role { + case .creator, .admin: + strongSelf.optionsButton.isUserInteractionEnabled = true + strongSelf.optionsButton.alpha = 1.0 + default: + strongSelf.optionsButton.isUserInteractionEnabled = false + strongSelf.optionsButton.alpha = 0.0 + } } } }) @@ -1022,36 +1117,6 @@ public final class VoiceChatController: ViewController { items.append(.separator) } - items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.VoiceChat_Share, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Link"), color: theme.actionSheet.primaryTextColor) - }, action: { [weak self] _, f in - f(.dismissWithoutContent) - - guard let strongSelf = self else { - return - } - - let _ = (strongSelf.context.account.postbox.transaction { transaction -> String? in - if let peer = transaction.getPeer(call.peerId), let addressName = peer.addressName, !addressName.isEmpty { - return "https://t.me/\(addressName)" - } else if let cachedData = transaction.getPeerCachedData(peerId: call.peerId) { - if let cachedData = cachedData as? CachedChannelData { - return cachedData.exportedInvitation?.link - } else if let cachedData = cachedData as? CachedGroupData { - return cachedData.exportedInvitation?.link - } - } - return nil - } |> deliverOnMainQueue).start(next: { link in - if let link = link { - if let strongSelf = self { - let shareController = ShareController(context: strongSelf.context, subject: .url(link), forcedTheme: strongSelf.darkTheme, forcedActionTitle: strongSelf.presentationData.strings.VoiceChat_CopyInviteLink) - strongSelf.controller?.present(shareController, in: .window(.root)) - } - } - }) - }))) - if let callState = strongSelf.callState, callState.canManageCall { items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.VoiceChat_EndVoiceChat, textColor: .destructive, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Clear"), color: theme.actionSheet.destructiveActionTextColor) @@ -1100,40 +1165,11 @@ public final class VoiceChatController: ViewController { self.listNode.updateFloatingHeaderOffset = { [weak self] offset, transition in if let strongSelf = self { strongSelf.currentContentOffset = offset - strongSelf.updateFloatingHeaderOffset(offset: offset, transition: transition) - } - } - - self.listNode.endedInteractiveDragging = { [weak self] in - guard let strongSelf = self else { - return - } - if strongSelf.ignoreScrolling { - Queue.mainQueue().after(0.5) { - strongSelf.ignoreScrolling = false + if strongSelf.animation == nil && !strongSelf.animatingExpansion { + strongSelf.updateFloatingHeaderOffset(offset: offset, transition: transition) } } } - - self.listNode.visibleContentOffsetChanged = { [weak self] offset in - guard let strongSelf = self else { - return - } - switch offset { - case let .known(value): -// strongSelf.updateFloatingHeaderOffset(offset: -value + strongSelf.listNode.insets.top, transition: strongSelf.listNode.isTracking ? .immediate : .animated(duration: 0.4, curve: .linear)) - - if value > 5, !strongSelf.currentIsExpanded && strongSelf.listNode.isTracking && !strongSelf.ignoreScrolling { - strongSelf.updateMembers(muteState: strongSelf.effectiveMuteState, callMembers:strongSelf.currentCallMembers ?? [], invitedPeers: strongSelf.currentInvitedPeers ?? [], speakingPeers: strongSelf.currentSpeakingPeers ?? Set(), isExpanded: true) - strongSelf.ignoreScrolling = true - } else if value < -5, strongSelf.currentIsExpanded && strongSelf.listNode.isTracking && !strongSelf.ignoreScrolling { - strongSelf.updateMembers(muteState: strongSelf.effectiveMuteState, callMembers: strongSelf.currentCallMembers ?? [], invitedPeers: strongSelf.currentInvitedPeers ?? [], speakingPeers: strongSelf.currentSpeakingPeers ?? [], isExpanded: false) - strongSelf.ignoreScrolling = true - } - default: - break - } - } } deinit { @@ -1223,7 +1259,7 @@ public final class VoiceChatController: ViewController { self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.3, curve: .spring)) } - self.updateMembers(muteState: self.effectiveMuteState, callMembers: self.currentCallMembers ?? [], invitedPeers: self.currentInvitedPeers ?? [], speakingPeers: self.currentSpeakingPeers ?? Set(), isExpanded: self.currentIsExpanded) + self.updateMembers(muteState: self.effectiveMuteState, callMembers: self.currentCallMembers ?? [], invitedPeers: self.currentInvitedPeers ?? [], speakingPeers: self.currentSpeakingPeers ?? Set()) } @objc private func actionButtonPressGesture(_ gestureRecognizer: UILongPressGestureRecognizer) { @@ -1268,7 +1304,7 @@ public final class VoiceChatController: ViewController { if let (layout, navigationHeight) = self.validLayout { self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.3, curve: .spring)) } - self.updateMembers(muteState: self.effectiveMuteState, callMembers: self.currentCallMembers ?? [], invitedPeers: self.currentInvitedPeers ?? [], speakingPeers: self.currentSpeakingPeers ?? Set(), isExpanded: self.currentIsExpanded) + self.updateMembers(muteState: self.effectiveMuteState, callMembers: self.currentCallMembers ?? [], invitedPeers: self.currentInvitedPeers ?? [], speakingPeers: self.currentSpeakingPeers ?? Set()) default: break } @@ -1341,7 +1377,7 @@ public final class VoiceChatController: ViewController { } } - private func updateFloatingHeaderOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) { + private func updateFloatingHeaderOffset(offset: CGFloat, transition: ContainedViewLayoutTransition, completion: (() -> Void)? = nil) { guard let (layout, _) = self.validLayout else { return } @@ -1351,20 +1387,39 @@ public final class VoiceChatController: ViewController { let listTopInset = layoutTopInset + topPanelHeight let bottomAreaHeight: CGFloat = 268.0 let bottomPanelHeight = bottomAreaHeight + layout.intrinsicInsets.bottom - let listSize = CGSize(width: layout.size.width, height: layout.size.height - listTopInset - bottomPanelHeight) - let topInset = self.topInset ?? listSize.height - var offset = offset + topInset + var size = layout.size + if case .regular = layout.metrics.widthClass { + size.width = floor(min(size.width, size.height) * 0.5) + } + + let listSize = CGSize(width: size.width, height: layout.size.height - listTopInset - bottomPanelHeight) + let topInset: CGFloat + if let (panInitialTopInset, panOffset) = self.panGestureArguments { + if self.isExpanded { + topInset = min(self.topInset ?? listSize.height, panInitialTopInset + max(0.0, panOffset)) + } else { + topInset = max(0.0, panInitialTopInset + min(0.0, panOffset)) + } + } else if let _ = self.animation { + topInset = self.listNode.frame.minY - listTopInset + } else if let currentTopInset = self.topInset { + topInset = self.isExpanded ? 0.0 : currentTopInset + } else { + topInset = listSize.height + } + + let offset = offset + topInset self.floatingHeaderOffset = offset let rawPanelOffset = offset + listTopInset - topPanelHeight let panelOffset = max(layoutTopInset, rawPanelOffset) - let topPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: panelOffset), size: CGSize(width: layout.size.width, height: topPanelHeight)) + let topPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: panelOffset), size: CGSize(width: size.width, height: topPanelHeight)) - let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: topPanelFrame.maxY), size: CGSize(width: layout.size.width, height: layout.size.height)) + let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: topPanelFrame.maxY), size: CGSize(width: size.width, height: layout.size.height)) let sideInset: CGFloat = 16.0 let leftBorderFrame = CGRect(origin: CGPoint(x: 0.0, y: topPanelFrame.maxY - 16.0), size: CGSize(width: sideInset, height: layout.size.height)) - let rightBorderFrame = CGRect(origin: CGPoint(x: layout.size.width - sideInset, y: topPanelFrame.maxY - 16.0), size: CGSize(width: sideInset, height: layout.size.height)) + let rightBorderFrame = CGRect(origin: CGPoint(x: size.width - sideInset, y: topPanelFrame.maxY - 16.0), size: CGSize(width: sideInset, height: layout.size.height)) let previousTopPanelFrame = self.topPanelNode.frame let previousBackgroundFrame = self.backgroundNode.frame @@ -1374,7 +1429,7 @@ public final class VoiceChatController: ViewController { if !topPanelFrame.equalTo(previousTopPanelFrame) { self.topPanelNode.frame = topPanelFrame let positionDelta = CGPoint(x: 0.0, y: topPanelFrame.minY - previousTopPanelFrame.minY) - transition.animateOffsetAdditive(node: self.topPanelNode, offset: positionDelta.y) + transition.animateOffsetAdditive(layer: self.topPanelNode.layer, offset: positionDelta.y, completion: completion) self.backgroundNode.frame = backgroundFrame let backgroundPositionDelta = CGPoint(x: 0.0, y: previousBackgroundFrame.minY - backgroundFrame.minY) @@ -1387,8 +1442,10 @@ public final class VoiceChatController: ViewController { self.rightBorderNode.frame = rightBorderFrame let rightBorderPositionDelta = CGPoint(x: 0.0, y: previousRightBorderFrame.minY - rightBorderFrame.minY) transition.animatePositionAdditive(node: self.rightBorderNode, offset: rightBorderPositionDelta) + } else { + completion?() } - self.topPanelBackgroundNode.frame = CGRect(x: 0.0, y: topPanelHeight - 24.0, width: layout.size.width, height: 24.0) + self.topPanelBackgroundNode.frame = CGRect(x: 0.0, y: topPanelHeight - 24.0, width: size.width, height: 24.0) var bottomEdge: CGFloat = 0.0 self.listNode.forEachItemNode { itemNode in @@ -1399,21 +1456,22 @@ public final class VoiceChatController: ViewController { } } } - + let listMaxY = listTopInset + listSize.height if bottomEdge.isZero { bottomEdge = listMaxY } + var bottomOffset: CGFloat = 0.0 - if bottomEdge < listMaxY { + if bottomEdge < listMaxY && (self.panGestureArguments != nil || self.isExpanded) { bottomOffset = bottomEdge - listMaxY } - let bottomCornersFrame = CGRect(origin: CGPoint(x: sideInset, y: -50.0 + bottomOffset), size: CGSize(width: layout.size.width - sideInset * 2.0, height: 50.0)) + let bottomCornersFrame = CGRect(origin: CGPoint(x: sideInset, y: -50.0 + bottomOffset), size: CGSize(width: size.width - sideInset * 2.0, height: 50.0)) let previousBottomCornersFrame = self.bottomCornersNode.frame if !bottomCornersFrame.equalTo(previousBottomCornersFrame) { self.bottomCornersNode.frame = bottomCornersFrame - self.bottomPanelBackgroundNode.frame = CGRect(x: 0.0, y: bottomOffset, width: layout.size.width, height: 2000.0) + self.bottomPanelBackgroundNode.frame = CGRect(x: 0.0, y: bottomOffset, width: size.width, height: 2000.0) let positionDelta = CGPoint(x: 0.0, y: previousBottomCornersFrame.minY - bottomCornersFrame.minY) transition.animatePositionAdditive(node: self.bottomCornersNode, offset: positionDelta) @@ -1422,39 +1480,43 @@ public final class VoiceChatController: ViewController { } var isFullscreen = false - func updateColors(fullscreen: Bool) { - guard self.isFullscreen != fullscreen, let (layout, _) = self.validLayout else { + func updateIsFullscreen(_ isFullscreen: Bool) { + guard self.isFullscreen != isFullscreen, let (layout, _) = self.validLayout else { return } - self.isFullscreen = fullscreen + self.isFullscreen = isFullscreen - self.controller?.statusBar.statusBarStyle = fullscreen ? .White : .Ignore - - let transition: ContainedViewLayoutTransition = .animated(duration: 0.3, curve: .linear) + self.controller?.statusBar.statusBarStyle = isFullscreen ? .White : .Ignore + + var size = layout.size + if case .regular = layout.metrics.widthClass { + size.width = floor(min(size.width, size.height) * 0.5) + } let topPanelHeight: CGFloat = 63.0 let topEdgeFrame: CGRect - if self.isFullscreen { + if isFullscreen { let offset: CGFloat if let statusBarHeight = layout.statusBarHeight { offset = statusBarHeight } else { offset = 44.0 } - topEdgeFrame = CGRect(x: 0.0, y: -offset, width: layout.size.width, height: topPanelHeight + offset) + topEdgeFrame = CGRect(x: 0.0, y: -offset, width: size.width, height: topPanelHeight + offset) } else { - topEdgeFrame = CGRect(x: 0.0, y: 0.0, width: layout.size.width, height: topPanelHeight) + topEdgeFrame = CGRect(x: 0.0, y: 0.0, width: size.width, height: topPanelHeight) } + + let transition: ContainedViewLayoutTransition = .animated(duration: 0.3, curve: .linear) transition.updateFrame(node: self.topPanelEdgeNode, frame: topEdgeFrame) - transition.updateCornerRadius(node: self.topPanelEdgeNode, cornerRadius: fullscreen ? layout.deviceMetrics.screenCornerRadius - 0.5 : 12.0) -// transition.updateBackgroundColor(node: self.dimNode, color: fullscreen ? fullscreenBackgroundColor : dimColor) - transition.updateBackgroundColor(node: self.topPanelBackgroundNode, color: fullscreen ? fullscreenBackgroundColor : panelBackgroundColor) - transition.updateBackgroundColor(node: self.topPanelEdgeNode, color: fullscreen ? fullscreenBackgroundColor : panelBackgroundColor) - transition.updateBackgroundColor(node: self.backgroundNode, color: fullscreen ? panelBackgroundColor : secondaryPanelBackgroundColor) - transition.updateBackgroundColor(node: self.bottomPanelBackgroundNode, color: fullscreen ? fullscreenBackgroundColor : panelBackgroundColor) - transition.updateBackgroundColor(node: self.leftBorderNode, color: fullscreen ? fullscreenBackgroundColor : panelBackgroundColor) - transition.updateBackgroundColor(node: self.rightBorderNode, color: fullscreen ? fullscreenBackgroundColor : panelBackgroundColor) - transition.updateBackgroundColor(node: self.rightBorderNode, color: fullscreen ? fullscreenBackgroundColor : panelBackgroundColor) + transition.updateCornerRadius(node: self.topPanelEdgeNode, cornerRadius: isFullscreen ? layout.deviceMetrics.screenCornerRadius - 0.5 : 12.0) + transition.updateBackgroundColor(node: self.topPanelBackgroundNode, color: isFullscreen ? fullscreenBackgroundColor : panelBackgroundColor) + transition.updateBackgroundColor(node: self.topPanelEdgeNode, color: isFullscreen ? fullscreenBackgroundColor : panelBackgroundColor) + transition.updateBackgroundColor(node: self.backgroundNode, color: isFullscreen ? panelBackgroundColor : secondaryPanelBackgroundColor) + transition.updateBackgroundColor(node: self.bottomPanelBackgroundNode, color: isFullscreen ? fullscreenBackgroundColor : panelBackgroundColor) + transition.updateBackgroundColor(node: self.leftBorderNode, color: isFullscreen ? fullscreenBackgroundColor : panelBackgroundColor) + transition.updateBackgroundColor(node: self.rightBorderNode, color: isFullscreen ? fullscreenBackgroundColor : panelBackgroundColor) + transition.updateBackgroundColor(node: self.rightBorderNode, color: isFullscreen ? fullscreenBackgroundColor : panelBackgroundColor) if let snapshotView = self.topCornersNode.view.snapshotContentTree() { snapshotView.frame = self.topCornersNode.frame @@ -1464,7 +1526,7 @@ public final class VoiceChatController: ViewController { snapshotView?.removeFromSuperview() }) } - self.topCornersNode.image = cornersImage(top: true, bottom: false, dark: fullscreen) + self.topCornersNode.image = cornersImage(top: true, bottom: false, dark: isFullscreen) if let snapshotView = self.bottomCornersNode.view.snapshotContentTree() { snapshotView.frame = self.bottomCornersNode.bounds @@ -1474,10 +1536,10 @@ public final class VoiceChatController: ViewController { snapshotView?.removeFromSuperview() }) } - self.bottomCornersNode.image = cornersImage(top: false, bottom: true, dark: fullscreen) + self.bottomCornersNode.image = cornersImage(top: false, bottom: true, dark: isFullscreen) - self.optionsButton.setImage(optionsButtonImage(dark: fullscreen), animated: transition.isAnimated) - self.closeButton.setImage(closeButtonImage(dark: fullscreen), animated: transition.isAnimated) + self.optionsButton.setImage(optionsButtonImage(dark: isFullscreen), animated: transition.isAnimated) + self.closeButton.setImage(closeButtonImage(dark: isFullscreen), animated: transition.isAnimated) self.updateTitle(transition: transition) } @@ -1497,15 +1559,20 @@ public final class VoiceChatController: ViewController { } } - self.titleNode.update(size: CGSize(width: layout.size.width, height: 44.0), title: title, subtitle: self.currentSubtitle, transition: transition) + var size = layout.size + if case .regular = layout.metrics.widthClass { + size.width = floor(min(size.width, size.height) * 0.5) + } + + self.titleNode.update(size: CGSize(width: size.width, height: 44.0), title: title, subtitle: self.currentSubtitle, transition: transition) } private func updateButtons(transition: ContainedViewLayoutTransition) { let audioButtonAppearance: CallControllerButtonItemNode.Content.Appearance if let color = self.currentAudioButtonColor { - audioButtonAppearance = .color(.custom(color.rgb)) + audioButtonAppearance = .color(.custom(color.rgb, 1.0)) } else { - audioButtonAppearance = .color(.custom(self.isFullscreen ? 0x1c1c1e : 0x2c2c2e)) + audioButtonAppearance = .color(.custom(self.isFullscreen ? 0x1c1c1e : 0x2c2c2e, 1.0)) } var audioMode: CallControllerButtonsSpeakerMode = .none @@ -1536,6 +1603,7 @@ public final class VoiceChatController: ViewController { let soundImage: CallControllerButtonItemNode.Content.Image var soundAppearance: CallControllerButtonItemNode.Content.Appearance = audioButtonAppearance + var soundTitle: String = self.presentationData.strings.Call_Speaker switch audioMode { case .none, .builtin: soundImage = .speaker @@ -1543,7 +1611,8 @@ public final class VoiceChatController: ViewController { soundImage = .speaker soundAppearance = .blurred(isFilled: true) case .headphones: - soundImage = .bluetooth + soundImage = .headphones + soundTitle = self.presentationData.strings.Call_Audio case let .bluetooth(type): switch type { case .generic: @@ -1553,26 +1622,32 @@ public final class VoiceChatController: ViewController { case .airpodsPro: soundImage = .airpodsPro } + soundTitle = self.presentationData.strings.Call_Audio } let sideButtonSize = CGSize(width: 60.0, height: 60.0) - self.audioOutputNode.update(size: sideButtonSize, content: CallControllerButtonItemNode.Content(appearance: soundAppearance, image: soundImage), text: self.presentationData.strings.VoiceChat_Audio, transition: .animated(duration: 0.3, curve: .linear)) + self.audioOutputNode.update(size: sideButtonSize, content: CallControllerButtonItemNode.Content(appearance: soundAppearance, image: soundImage), text: soundTitle, transition: .animated(duration: 0.3, curve: .linear)) - self.leaveNode.update(size: sideButtonSize, content: CallControllerButtonItemNode.Content(appearance: .color(.custom(0x602522)), image: .end), text: self.presentationData.strings.VoiceChat_Leave, transition: .immediate) + self.leaveNode.update(size: sideButtonSize, content: CallControllerButtonItemNode.Content(appearance: .color(.custom(0xff3b30, 0.3)), image: .end), text: self.presentationData.strings.VoiceChat_Leave, transition: .immediate) } func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) { let isFirstTime = self.validLayout == nil self.validLayout = (layout, navigationHeight) + var size = layout.size + if case .regular = layout.metrics.widthClass { + size.width = floor(min(size.width, size.height) * 0.5) + } + self.updateTitle(transition: transition) - transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: 0.0, y: 10.0), size: CGSize(width: layout.size.width, height: 44.0))) + transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: 0.0, y: 10.0), size: CGSize(width: size.width, height: 44.0))) transition.updateFrame(node: self.optionsButton, frame: CGRect(origin: CGPoint(x: 20.0, y: 18.0), size: CGSize(width: 28.0, height: 28.0))) - transition.updateFrame(node: self.closeButton, frame: CGRect(origin: CGPoint(x: layout.size.width - 20.0 - 28.0, y: 18.0), size: CGSize(width: 28.0, height: 28.0))) + transition.updateFrame(node: self.closeButton, frame: CGRect(origin: CGPoint(x: size.width - 20.0 - 28.0, y: 18.0), size: CGSize(width: 28.0, height: 28.0))) transition.updateFrame(node: self.dimNode, frame: CGRect(origin: CGPoint(), size: layout.size)) - transition.updateFrame(node: self.contentContainer, frame: CGRect(origin: CGPoint(), size: layout.size)) + transition.updateFrame(node: self.contentContainer, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((layout.size.width - size.width) / 2.0), y: 0.0), size: size)) let bottomAreaHeight: CGFloat = 268.0 let layoutTopInset: CGFloat = max(layout.statusBarHeight ?? 0.0, layout.safeInsets.top) @@ -1583,40 +1658,58 @@ public final class VoiceChatController: ViewController { insets.right = layout.safeInsets.right + sideInset let topPanelHeight: CGFloat = 63.0 - let topEdgeFrame: CGRect - if self.isFullscreen { - let offset: CGFloat - if let statusBarHeight = layout.statusBarHeight { - offset = statusBarHeight - } else { - offset = 44.0 - } - topEdgeFrame = CGRect(x: 0.0, y: -offset, width: layout.size.width, height: topPanelHeight + offset) + if let _ = self.panGestureArguments { } else { - topEdgeFrame = CGRect(x: 0.0, y: 0.0, width: layout.size.width, height: topPanelHeight) + let topEdgeFrame: CGRect + if self.isFullscreen { + let offset: CGFloat + if let statusBarHeight = layout.statusBarHeight { + offset = statusBarHeight + } else { + offset = 44.0 + } + topEdgeFrame = CGRect(x: 0.0, y: -offset, width: size.width, height: topPanelHeight + offset) + } else { + topEdgeFrame = CGRect(x: 0.0, y: 0.0, width: size.width, height: topPanelHeight) + } + transition.updateFrame(node: self.topPanelEdgeNode, frame: topEdgeFrame) } - transition.updateFrame(node: self.topPanelEdgeNode, frame: topEdgeFrame) let bottomPanelHeight = bottomAreaHeight + layout.intrinsicInsets.bottom let listTopInset = layoutTopInset + topPanelHeight - let listSize = CGSize(width: layout.size.width, height: layout.size.height - listTopInset - bottomPanelHeight) - - transition.updateFrame(node: self.listNode, frame: CGRect(origin: CGPoint(x: 0.0, y: listTopInset + (self.topInset ?? listSize.height)), size: listSize)) + let listSize = CGSize(width: size.width, height: layout.size.height - listTopInset - bottomPanelHeight) + + let topInset: CGFloat + if let (panInitialTopInset, panOffset) = self.panGestureArguments { + if self.isExpanded { + topInset = min(self.topInset ?? listSize.height, panInitialTopInset + max(0.0, panOffset)) + } else { + topInset = max(0.0, panInitialTopInset + min(0.0, panOffset)) + } + } else if let currentTopInset = self.topInset { + topInset = self.isExpanded ? 0.0 : currentTopInset + } else { + topInset = listSize.height + } + + if self.animation == nil { + transition.updateFrame(node: self.listNode, frame: CGRect(origin: CGPoint(x: 0.0, y: listTopInset + topInset), size: listSize)) + } let (duration, curve) = listViewAnimationDurationAndCurve(transition: transition) let updateSizeAndInsets = ListViewUpdateSizeAndInsets(size: listSize, insets: insets, duration: duration, curve: curve) self.listNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: nil, updateSizeAndInsets: updateSizeAndInsets, stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in }) - transition.updateFrame(node: self.topCornersNode, frame: CGRect(origin: CGPoint(x: sideInset, y: 63.0), size: CGSize(width: layout.size.width - sideInset * 2.0, height: 50.0))) + transition.updateFrame(node: self.topCornersNode, frame: CGRect(origin: CGPoint(x: sideInset, y: 63.0), size: CGSize(width: size.width - sideInset * 2.0, height: 50.0))) - let bottomPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - bottomPanelHeight), size: CGSize(width: layout.size.width, height: bottomPanelHeight)) + let bottomPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - bottomPanelHeight), size: CGSize(width: size.width, height: bottomPanelHeight)) transition.updateFrame(node: self.bottomPanelNode, frame: bottomPanelFrame) let sideButtonSize = CGSize(width: 60.0, height: 60.0) let centralButtonSize = CGSize(width: 440.0, height: 440.0) - let actionButtonFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((layout.size.width - centralButtonSize.width) / 2.0), y: floorToScreenPixels((bottomAreaHeight - centralButtonSize.height) / 2.0)), size: centralButtonSize) + let actionButtonFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - centralButtonSize.width) / 2.0), y: floorToScreenPixels((bottomAreaHeight - centralButtonSize.height) / 2.0)), size: centralButtonSize) let actionButtonState: VoiceChatActionButton.State let actionButtonTitle: String @@ -1657,7 +1750,7 @@ public final class VoiceChatController: ViewController { } self.actionButton.isDisabled = !actionButtonEnabled - self.actionButton.update(size: centralButtonSize, buttonSize: CGSize(width: 144.0, height: 144.0), state: actionButtonState, title: actionButtonTitle, subtitle: actionButtonSubtitle, dark: self.isFullscreen, small: layout.size.width < 330.0, animated: true) + self.actionButton.update(size: centralButtonSize, buttonSize: CGSize(width: 144.0, height: 144.0), state: actionButtonState, title: actionButtonTitle, subtitle: actionButtonSubtitle, dark: self.isFullscreen, small: size.width < 330.0, animated: true) if self.actionButton.supernode === self.bottomPanelNode { transition.updateFrame(node: self.actionButton, frame: actionButtonFrame) @@ -1666,12 +1759,13 @@ public final class VoiceChatController: ViewController { self.updateButtons(transition: transition) let sideButtonMinimalInset: CGFloat = 16.0 - let sideButtonOffset = min(36.0, floor((((layout.size.width - 144.0) / 2.0) - sideButtonSize.width) / 2.0)) - let sideButtonOrigin = max(sideButtonMinimalInset, floor((layout.size.width - 144.0) / 2.0) - sideButtonOffset - sideButtonSize.width) - - transition.updateFrame(node: self.audioOutputNode, frame: CGRect(origin: CGPoint(x: sideButtonOrigin, y: floor((bottomAreaHeight - sideButtonSize.height) / 2.0)), size: sideButtonSize)) - transition.updateFrame(node: self.leaveNode, frame: CGRect(origin: CGPoint(x: layout.size.width - sideButtonOrigin - sideButtonSize.width, y: floor((bottomAreaHeight - sideButtonSize.height) / 2.0)), size: sideButtonSize)) + let sideButtonOffset = min(36.0, floor((((size.width - 144.0) / 2.0) - sideButtonSize.width) / 2.0)) + let sideButtonOrigin = max(sideButtonMinimalInset, floor((size.width - 144.0) / 2.0) - sideButtonOffset - sideButtonSize.width) + if self.audioOutputNode.supernode === self.bottomPanelNode { + transition.updateFrame(node: self.audioOutputNode, frame: CGRect(origin: CGPoint(x: sideButtonOrigin, y: floor((bottomAreaHeight - sideButtonSize.height) / 2.0)), size: sideButtonSize)) + transition.updateFrame(node: self.leaveNode, frame: CGRect(origin: CGPoint(x: size.width - sideButtonOrigin - sideButtonSize.width, y: floor((bottomAreaHeight - sideButtonSize.height) / 2.0)), size: sideButtonSize)) + } if isFirstTime { while !self.enqueuedTransitions.isEmpty { self.dequeueTransition() @@ -1694,8 +1788,16 @@ public final class VoiceChatController: ViewController { self.contentContainer.view.bounds = initialBounds }, completion: { _ in if self.actionButton.supernode !== self.bottomPanelNode { + self.actionButton.ignoreHierarchyChanges = true + self.audioOutputNode.isHidden = false + self.leaveNode.isHidden = false + self.audioOutputNode.layer.removeAllAnimations() + self.leaveNode.layer.removeAllAnimations() + self.bottomPanelNode.addSubnode(self.audioOutputNode) + self.bottomPanelNode.addSubnode(self.leaveNode) self.bottomPanelNode.addSubnode(self.actionButton) - self.containerLayoutUpdated(layout, navigationHeight:navigationHeight, transition: .immediate) + self.containerLayoutUpdated(layout, navigationHeight :navigationHeight, transition: .immediate) + self.actionButton.ignoreHierarchyChanges = false } self.controller?.currentOverlayController?.dismiss() @@ -1724,6 +1826,7 @@ public final class VoiceChatController: ViewController { } let topPanelFrame = self.topPanelNode.view.convert(self.topPanelNode.bounds, to: self.view) + let offset: CGFloat = self.contentContainer.bounds.minY self.contentContainer.layer.animateBoundsOriginYAdditive(from: self.contentContainer.bounds.origin.y, to: -(layout.size.height - topPanelFrame.minY) - 44.0, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in offsetCompleted = true @@ -1751,7 +1854,8 @@ public final class VoiceChatController: ViewController { self.enqueuedTransitions.remove(at: 0) var options = ListViewDeleteAndInsertOptions() - if self.isFirstTime { + let isFirstTime = self.isFirstTime + if isFirstTime { self.isFirstTime = false } else { if transition.crossFade { @@ -1764,7 +1868,7 @@ public final class VoiceChatController: ViewController { options.insert(.LowLatency) options.insert(.PreferSynchronousResourceLoading) - var itemsHeight: CGFloat = 46.0 + CGFloat(transition.count - 1) * 56.0 + let itemsHeight: CGFloat = 46.0 + CGFloat(transition.count - 1) * 56.0 let bottomAreaHeight: CGFloat = 268.0 let layoutTopInset: CGFloat = max(layout.statusBarHeight ?? 0.0, layout.safeInsets.top) @@ -1774,28 +1878,38 @@ public final class VoiceChatController: ViewController { insets.left = layout.safeInsets.left + sideInset insets.right = layout.safeInsets.right + sideInset + var size = layout.size + if case .regular = layout.metrics.widthClass { + size.width = floor(min(size.width, size.height) * 0.5) + } + let bottomPanelHeight = bottomAreaHeight + layout.intrinsicInsets.bottom let listTopInset = layoutTopInset + 63.0 - let listSize = CGSize(width: layout.size.width, height: layout.size.height - listTopInset - bottomPanelHeight) + let listSize = CGSize(width: size.width, height: layout.size.height - listTopInset - bottomPanelHeight) - let previousIsExpanded = self.currentIsExpanded - self.currentIsExpanded = transition.isExpanded - self.topInset = max(0.0, transition.isExpanded ? 0.0 : max(listSize.height - itemsHeight, listSize.height - 46.0 - floor(56.0 * 3.5))) + self.topInset = max(0.0, max(listSize.height - itemsHeight, listSize.height - 46.0 - floor(56.0 * 3.5))) - let frameTransition: ContainedViewLayoutTransition - if previousIsExpanded != self.currentIsExpanded { - frameTransition = .animated(duration: 0.4, curve: .spring) - } else { - frameTransition = .animated(duration: 0.4, curve: .easeInOut) + let targetY = listTopInset + (self.topInset ?? listSize.height) + + if isFirstTime { + var frame = self.listNode.frame + frame.origin.y = targetY + self.listNode.frame = frame + } else if !self.isExpanded { + if self.listNode.frame.minY != targetY && !self.animatingExpansion && self.panGestureArguments == nil { + self.animation = ListViewAnimation(from: self.listNode.frame.minY, to: targetY, duration: 0.4, curve: listViewAnimationCurveEaseInOut, beginAt: CACurrentMediaTime(), update: { [weak self] _, currentValue in + if let strongSelf = self { + var frame = strongSelf.listNode.frame + frame.origin.y = currentValue + strongSelf.listNode.frame = frame + strongSelf.updateFloatingHeaderOffset(offset: strongSelf.currentContentOffset ?? 0.0, transition: .immediate) + } + }) + self.updateAnimation() + } } - frameTransition.updateFrame(node: self.listNode, frame: CGRect(origin: CGPoint(x: 0.0, y: listTopInset + (self.topInset ?? listSize.height)), size: listSize)) - - let (duration, curve) = listViewAnimationDurationAndCurve(transition: frameTransition) - let updateSizeAndInsets = ListViewUpdateSizeAndInsets(size: listSize, insets: insets, duration: duration, curve: curve) - - self.updateColors(fullscreen: transition.isExpanded) - - self.listNode.transaction(deleteIndices: transition.deletions, insertIndicesAndItems: transition.insertions, updateIndicesAndItems: transition.updates, options: options, scrollToItem: nil, updateSizeAndInsets: updateSizeAndInsets, updateOpaqueState: nil, completion: { [weak self] _ in + + self.listNode.transaction(deleteIndices: transition.deletions, insertIndicesAndItems: transition.insertions, updateIndicesAndItems: transition.updates, options: options, scrollToItem: nil, updateSizeAndInsets: nil, updateOpaqueState: nil, completion: { [weak self] _ in guard let strongSelf = self else { return } @@ -1804,12 +1918,42 @@ public final class VoiceChatController: ViewController { strongSelf.controller?.contentsReady.set(true) } }) - if previousIsExpanded != self.currentIsExpanded { - self.updateFloatingHeaderOffset(offset: self.currentContentOffset ?? 0.0, transition: frameTransition) + } + + + private var animator: ConstantDisplayLinkAnimator? + private var animation: ListViewAnimation? + private func updateAnimation() { + var animate = false + let timestamp = CACurrentMediaTime() + + if let animation = self.animation { + animation.applyAt(timestamp) + + if animation.completeAt(timestamp) { + self.animation = nil + } else { + animate = true + } + } + + if animate { + let animator: ConstantDisplayLinkAnimator + if let current = self.animator { + animator = current + } else { + animator = ConstantDisplayLinkAnimator(update: { [weak self] in + self?.updateAnimation() + }) + self.animator = animator + } + animator.isPaused = false + } else { + self.animator?.isPaused = true } } - private func updateMembers(muteState: GroupCallParticipantsContext.Participant.MuteState?, callMembers: [GroupCallParticipantsContext.Participant], invitedPeers: [Peer], speakingPeers: Set, isExpanded: Bool) { + private func updateMembers(muteState: GroupCallParticipantsContext.Participant.MuteState?, callMembers: [GroupCallParticipantsContext.Participant], invitedPeers: [Peer], speakingPeers: Set) { self.currentCallMembers = callMembers self.currentSpeakingPeers = speakingPeers self.currentInvitedPeers = invitedPeers @@ -1854,6 +1998,17 @@ public final class VoiceChatController: ViewController { index += 1 } + if let accountPeer = self.accountPeer, !processedPeerIds.contains(accountPeer.id) { + entries.insert(.peer(PeerEntry( + peer: accountPeer, + presence: nil, + activityTimestamp: Int32.max - 1 - index, + state: .listening, + muteState: GroupCallParticipantsContext.Participant.MuteState(canUnmute: true), + canManageCall: callState?.canManageCall ?? false + )), at: 1) + } + for peer in invitedPeers { if processedPeerIds.contains(peer.id) { continue @@ -1874,64 +2029,186 @@ public final class VoiceChatController: ViewController { self.currentEntries = entries let presentationData = self.presentationData.withUpdated(theme: self.darkTheme) - let transition = preparedTransition(from: previousEntries, to: entries, isLoading: false, isEmpty: false, crossFade: false, context: self.context, presentationData: presentationData, interaction: self.itemInteraction!, isExpanded: isExpanded ?? self.currentIsExpanded) + let transition = preparedTransition(from: previousEntries, to: entries, isLoading: false, isEmpty: false, crossFade: false, context: self.context, presentationData: presentationData, interaction: self.itemInteraction!) self.enqueueTransition(transition) } override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { -// if let callState = self.callState, case .connected = callState.networkState, let muteState = callState.muteState, !muteState.canUnmute { -// return false -// } - if let recognizer = gestureRecognizer as? UIPanGestureRecognizer { - let location = recognizer.location(in: self.view) - if let view = super.hitTest(location, with: nil) { - if let gestureRecognizers = view.gestureRecognizers, view != self.view { - for gestureRecognizer in gestureRecognizers { - if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer, gestureRecognizer.isEnabled { - if panGestureRecognizer.state != .began { - panGestureRecognizer.isEnabled = false - panGestureRecognizer.isEnabled = true - } - } - } - } + if gestureRecognizer is DirectionalPanGestureRecognizer { + let location = gestureRecognizer.location(in: self.bottomPanelNode.view) + if self.audioOutputNode.frame.contains(location) || self.leaveNode.frame.contains(location) { + return false } } return true } + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + if gestureRecognizer is UIPanGestureRecognizer && otherGestureRecognizer is UIPanGestureRecognizer { + return true + } + return false + } + + private var isExpanded = false + private var animatingExpansion = false + private var panGestureArguments: (topInset: CGFloat, offset: CGFloat)? + @objc func panGesture(_ recognizer: UIPanGestureRecognizer) { switch recognizer.state { case .began: - break + let topInset: CGFloat + if self.isExpanded { + topInset = 0.0 + } else if let currentTopInset = self.topInset { + topInset = currentTopInset + } else { + topInset = self.listNode.frame.height + } + self.panGestureArguments = (topInset, 0.0) case .changed: + var translation = recognizer.translation(in: self.contentContainer.view).y + var topInset: CGFloat = 0.0 + if let (currentTopInset, currentPanOffset) = self.panGestureArguments { + topInset = currentTopInset + + if case let .known(value) = self.listNode.visibleContentOffset(), value > 0 { + translation = currentPanOffset + if self.isExpanded { + recognizer.setTranslation(CGPoint(), in: self.contentContainer.view) + } + } + + self.panGestureArguments = (currentTopInset, translation) + } + + let currentOffset = topInset + translation + if currentOffset < 20.0 { + self.updateIsFullscreen(true) + } else if currentOffset > 40.0 { + self.updateIsFullscreen(false) + } + + if self.isExpanded { + + } else { + if currentOffset > 0.0 { + self.listNode.scroller.panGestureRecognizer.setTranslation(CGPoint(), in: self.listNode.scroller) + } + } + + if let (layout, navigationHeight) = self.validLayout { + self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .immediate) + self.updateFloatingHeaderOffset(offset: self.currentContentOffset ?? 0.0, transition: .immediate) + } + + if !self.isExpanded { + var bounds = self.contentContainer.bounds + bounds.origin.y = -translation + bounds.origin.y = min(0.0, bounds.origin.y) + self.contentContainer.bounds = bounds + } + case .ended: let translation = recognizer.translation(in: self.contentContainer.view) + var velocity = recognizer.velocity(in: self.contentContainer.view) + + if case let .known(value) = self.listNode.visibleContentOffset(), value > 0 { + velocity = CGPoint() + } + var bounds = self.contentContainer.bounds bounds.origin.y = -translation.y bounds.origin.y = min(0.0, bounds.origin.y) - self.contentContainer.bounds = bounds - case .ended: - let translation = recognizer.translation(in: self.contentContainer.view) - var bounds = self.contentContainer.bounds - bounds.origin.y = -translation.y - let velocity = recognizer.velocity(in: self.contentContainer.view) - - if (bounds.minY < -60.0 || velocity.y > 300.0) { - self.controller?.dismiss(closing: false) + let offset: CGFloat + if let (inset, panOffset) = self.panGestureArguments { + offset = inset + panOffset } else { - var bounds = self.contentContainer.bounds - let previousBounds = bounds - bounds.origin.y = 0.0 - self.contentContainer.bounds = bounds - self.contentContainer.layer.animateBounds(from: previousBounds, to: self.contentContainer.bounds, duration: 0.3, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) + offset = 0.0 + } + + let topInset: CGFloat + if let currentTopInset = self.topInset { + topInset = currentTopInset + } else { + topInset = self.listNode.frame.height + } + + if self.isExpanded { + self.panGestureArguments = nil + if velocity.y > 300.0 || offset > topInset / 2.0 { + self.isExpanded = false + self.updateIsFullscreen(false) + self.animatingExpansion = true + + if let (layout, navigationHeight) = self.validLayout { + self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.3, curve: .easeInOut)) + } + self.updateFloatingHeaderOffset(offset: self.currentContentOffset ?? 0.0, transition: .animated(duration: 0.3, curve: .easeInOut), completion: { + self.animatingExpansion = false + }) + } else { + self.updateIsFullscreen(true) + self.animatingExpansion = true + + if let (layout, navigationHeight) = self.validLayout { + self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.3, curve: .easeInOut)) + } + self.updateFloatingHeaderOffset(offset: self.currentContentOffset ?? 0.0, transition: .animated(duration: 0.3, curve: .easeInOut), completion: { + self.animatingExpansion = false + }) + } + } else { + self.panGestureArguments = nil + var dismissing = false + if bounds.minY < -60 || (bounds.minY < 0.0 && velocity.y > 300.0) { + self.controller?.dismiss(closing: false, manual: true) + dismissing = true + } else if velocity.y < -300.0 || offset < topInset / 2.0 { + self.isExpanded = true + self.updateIsFullscreen(true) + self.animatingExpansion = true + + if let (layout, navigationHeight) = self.validLayout { + self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.3, curve: .easeInOut)) + } + self.updateFloatingHeaderOffset(offset: self.currentContentOffset ?? 0.0, transition: .animated(duration: 0.3, curve: .easeInOut), completion: { + self.animatingExpansion = false + }) + } else { + self.updateIsFullscreen(false) + self.animatingExpansion = true + + if let (layout, navigationHeight) = self.validLayout { + self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.3, curve: .easeInOut)) + } + self.updateFloatingHeaderOffset(offset: self.currentContentOffset ?? 0.0, transition: .animated(duration: 0.3, curve: .easeInOut), completion: { + self.animatingExpansion = false + }) + } + if !dismissing { + var bounds = self.contentContainer.bounds + let previousBounds = bounds + bounds.origin.y = 0.0 + self.contentContainer.bounds = bounds + self.contentContainer.layer.animateBounds(from: previousBounds, to: self.contentContainer.bounds, duration: 0.3, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) + } } case .cancelled: + self.panGestureArguments = nil + let previousBounds = self.contentContainer.bounds var bounds = self.contentContainer.bounds bounds.origin.y = 0.0 self.contentContainer.bounds = bounds self.contentContainer.layer.animateBounds(from: previousBounds, to: self.contentContainer.bounds, duration: 0.3, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) + + if let (layout, navigationHeight) = self.validLayout { + self.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.3, curve: .easeInOut)) + } + self.updateFloatingHeaderOffset(offset: self.currentContentOffset ?? 0.0, transition: .animated(duration: 0.3, curve: .easeInOut), completion: { + self.animatingExpansion = false + }) default: break } @@ -1941,7 +2218,7 @@ public final class VoiceChatController: ViewController { let result = super.hitTest(point, with: event) if result === self.topPanelNode.view { - return self.listNode.view + return self.view } if result === self.bottomPanelNode.view { @@ -2066,16 +2343,29 @@ public final class VoiceChatController: ViewController { } } - public func dismiss(closing: Bool) { - if !closing { + private var dismissedManually: Bool = false + public func dismiss(closing: Bool, manual: Bool = false) { + if closing { + self.isDisconnected = true + } else { if let navigationController = self.navigationController as? NavigationController { let count = navigationController.viewControllers.count if count == 2 || navigationController.viewControllers[count - 2] is ChatController { - self.detachActionButton() + if case .active(.cantSpeak) = self.controllerNode.actionButton.stateValue { + } else if let chatController = navigationController.viewControllers[count - 2] as? ChatController, chatController.isSendButtonVisible { + } else if let tabBarController = navigationController.viewControllers[count - 2] as? TabBarController, let chatListController = tabBarController.controllers[tabBarController.selectedIndex] as? ChatListController, chatListController.isSearchActive { + } else { + if manual { + self.dismissedManually = true + Queue.mainQueue().after(0.05) { + self.detachActionButton() + } + } else { + self.detachActionButton() + } + } } } - } else { - self.isDisconnected = true } self.dismiss() @@ -2086,18 +2376,27 @@ public final class VoiceChatController: ViewController { return } - let overlayController = VoiceChatOverlayController(actionButton: self.controllerNode.actionButton, navigationController: self.navigationController as? NavigationController) + let overlayController = VoiceChatOverlayController(actionButton: self.controllerNode.actionButton, audioOutputNode: self.controllerNode.audioOutputNode, leaveNode: self.controllerNode.leaveNode, navigationController: self.navigationController as? NavigationController, initiallyHidden: self.dismissedManually) if let navigationController = self.navigationController as? NavigationController { navigationController.presentOverlay(controller: overlayController, inGlobal: true, blockInteraction: false) } self.currentOverlayController = overlayController + self.dismissedManually = false self.reclaimActionButton = { [weak self, weak overlayController] in if let strongSelf = self { overlayController?.animateOut(reclaim: true, completion: { [weak self] immediate in if let strongSelf = self, immediate { + strongSelf.controllerNode.actionButton.ignoreHierarchyChanges = true strongSelf.controllerNode.bottomPanelNode.addSubnode(strongSelf.controllerNode.actionButton) + strongSelf.controllerNode.bottomPanelNode.addSubnode(strongSelf.controllerNode.audioOutputNode) + strongSelf.controllerNode.bottomPanelNode.addSubnode(strongSelf.controllerNode.leaveNode) + + if immediate, let layout = strongSelf.validLayout { + strongSelf.containerLayoutUpdated(layout, transition: .immediate) + } + strongSelf.controllerNode.actionButton.ignoreHierarchyChanges = false } }) strongSelf.reclaimActionButton = nil diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatOverlayController.swift b/submodules/TelegramCallsUI/Sources/VoiceChatOverlayController.swift index 69b440f7d4..05446e94ea 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatOverlayController.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatOverlayController.swift @@ -39,10 +39,16 @@ public final class VoiceChatOverlayController: ViewController { return } - if self.isButtonHidden == hidden || (!slide && self.isSlidOffscreen) { + if self.isButtonHidden == hidden { return } self.isButtonHidden = hidden + + var slide = slide + if self.isSlidOffscreen && !hidden { + slide = true + } + self.isSlidOffscreen = hidden && slide guard actionButton.supernode === self else { @@ -53,6 +59,7 @@ public final class VoiceChatOverlayController: ViewController { let transition: ContainedViewLayoutTransition = .animated(duration: 0.4, curve: .spring) if hidden { if slide { + actionButton.isHidden = false transition.updateSublayerTransformOffset(layer: actionButton.layer, offset: CGPoint(x: slideOffset, y: 0.0)) } else { actionButton.layer.removeAllAnimations() @@ -64,10 +71,10 @@ public final class VoiceChatOverlayController: ViewController { } } else { actionButton.isHidden = false + actionButton.layer.removeAllAnimations() if slide { transition.updateSublayerTransformOffset(layer: actionButton.layer, offset: CGPoint()) } else { - actionButton.layer.removeAllAnimations() actionButton.layer.animateSpring(from: 0.01 as NSNumber, to: 1.0 as NSNumber, keyPath: "transform.scale", duration: 0.4) } } @@ -85,21 +92,50 @@ public final class VoiceChatOverlayController: ViewController { } } } - + + private var initialLeftButtonPosition: CGPoint? + private var initialRightButtonPosition: CGPoint? + func animateIn(from: CGRect) { - guard let actionButton = self.controller?.actionButton else { + guard let actionButton = self.controller?.actionButton, let leftButton = self.controller?.audioOutputNode, let rightButton = self.controller?.leaveNode else { return } - actionButton.update(snap: true, animated: !self.isSlidOffscreen) + self.initialLeftButtonPosition = leftButton.position + self.initialRightButtonPosition = rightButton.position + + actionButton.update(snap: true, animated: !self.isSlidOffscreen && !self.isButtonHidden) if self.isSlidOffscreen { + leftButton.isHidden = true + rightButton.isHidden = true actionButton.layer.sublayerTransform = CATransform3DMakeTranslation(slideOffset, 0.0, 0.0) return + } else if self.isButtonHidden { + leftButton.isHidden = true + rightButton.isHidden = true + actionButton.isHidden = true + return } + let center = CGPoint(x: actionButton.frame.width / 2.0, y: actionButton.frame.height / 2.0) + leftButton.layer.animatePosition(from: leftButton.position, to: center, duration: 0.15, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, removeOnCompletion: false, completion: { [weak leftButton] _ in + leftButton?.isHidden = true + leftButton?.textNode.layer.removeAllAnimations() + leftButton?.layer.removeAllAnimations() + }) + leftButton.layer.animateScale(from: 1.0, to: 0.5, duration: 0.15, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) + rightButton.layer.animatePosition(from: rightButton.position, to: center, duration: 0.15, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, removeOnCompletion: false, completion: { [weak rightButton] _ in + rightButton?.isHidden = true + rightButton?.textNode.layer.removeAllAnimations() + rightButton?.layer.removeAllAnimations() + }) + rightButton.layer.animateScale(from: 1.0, to: 0.5, duration: 0.15, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) + leftButton.textNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false) + rightButton.textNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false) + let targetPosition = actionButton.position let sourcePoint = CGPoint(x: from.midX, y: from.midY) - let midPoint = CGPoint(x: (sourcePoint.x + targetPosition.x) / 2.0, y: sourcePoint.y + 120.0) + let midPoint = CGPoint(x: (sourcePoint.x + targetPosition.x) / 2.0, y: sourcePoint.y + 90.0) let x1 = sourcePoint.x let y1 = sourcePoint.y @@ -125,12 +161,14 @@ public final class VoiceChatOverlayController: ViewController { } private var animating = false + private var dismissed = false func animateOut(reclaim: Bool, completion: @escaping (Bool) -> Void) { - guard let actionButton = self.controller?.actionButton, let layout = self.validLayout else { + guard let actionButton = self.controller?.actionButton, let leftButton = self.controller?.audioOutputNode, let rightButton = self.controller?.leaveNode, let layout = self.validLayout else { return } if reclaim { + self.dismissed = true let targetPosition = CGPoint(x: layout.size.width / 2.0, y: layout.size.height - layout.intrinsicInsets.bottom - 268.0 / 2.0) if self.isSlidOffscreen { self.isSlidOffscreen = false @@ -138,38 +176,67 @@ public final class VoiceChatOverlayController: ViewController { actionButton.layer.sublayerTransform = CATransform3DIdentity actionButton.update(snap: false, animated: false) actionButton.position = CGPoint(x: targetPosition.x, y: 268.0 / 2.0) + + leftButton.isHidden = false + rightButton.isHidden = false + if let leftButtonPosition = self.initialLeftButtonPosition { + leftButton.position = CGPoint(x: actionButton.position.x + leftButtonPosition.x, y: actionButton.position.y) + } + if let rightButtonPosition = self.initialRightButtonPosition { + rightButton.position = CGPoint(x: actionButton.position.x + rightButtonPosition.x, y: actionButton.position.y) + } + completion(true) + } else if self.isButtonHidden { + actionButton.isHidden = false + actionButton.layer.removeAllAnimations() + actionButton.layer.sublayerTransform = CATransform3DIdentity + actionButton.update(snap: false, animated: false) + actionButton.position = CGPoint(x: targetPosition.x, y: 268.0 / 2.0) + + leftButton.isHidden = false + rightButton.isHidden = false + if let leftButtonPosition = self.initialLeftButtonPosition { + leftButton.position = CGPoint(x: actionButton.position.x + leftButtonPosition.x, y: actionButton.position.y) + } + if let rightButtonPosition = self.initialRightButtonPosition { + rightButton.position = CGPoint(x: actionButton.position.x + rightButtonPosition.x, y: actionButton.position.y) + } completion(true) } else { self.animating = true + let sourcePoint = actionButton.position - var midPoint = CGPoint(x: (sourcePoint.x + targetPosition.x) / 2.0 - 60.0, y: sourcePoint.y) - if sourcePoint.y < layout.size.height - 100.0 { - midPoint.x = (sourcePoint.x + targetPosition.x) / 2.0 + 30.0 - midPoint.y = (sourcePoint.y + targetPosition.y) / 2.0 + 40.0 - } - - let x1 = sourcePoint.x - let y1 = sourcePoint.y - let x2 = midPoint.x - let y2 = midPoint.y - let x3 = targetPosition.x - let y3 = targetPosition.y - - let a = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / ((x1 - x2) * (x1 - x3) * (x2 - x3)) - let b = (x1 * x1 * (y2 - y3) + x3 * x3 * (y1 - y2) + x2 * x2 * (y3 - y1)) / ((x1 - x2) * (x1 - x3) * (x2 - x3)) - let c = (x2 * x2 * (x3 * y1 - x1 * y3) + x2 * (x1 * x1 * y3 - x3 * x3 * y1) + x1 * x3 * (x3 - x1) * y2) / ((x1 - x2) * (x1 - x3) * (x2 - x3)) - - var keyframes: [AnyObject] = [] - for i in 0 ..< 10 { - let k = CGFloat(i) / CGFloat(10 - 1) - let x = sourcePoint.x * (1.0 - k) + targetPosition.x * k - let y = a * x * x + b * x + c - keyframes.append(NSValue(cgPoint: CGPoint(x: x, y: y))) + let transitionNode = ASDisplayNode() + transitionNode.position = sourcePoint + transitionNode.addSubnode(actionButton) + actionButton.position = CGPoint() + self.addSubnode(transitionNode) + + if let leftButtonPosition = self.initialLeftButtonPosition, let rightButtonPosition = self.initialRightButtonPosition { + let center = CGPoint(x: actionButton.frame.width / 2.0, y: actionButton.frame.height / 2.0) + + leftButton.isHidden = false + rightButton.isHidden = false + + leftButton.layer.animatePosition(from: center, to: leftButtonPosition, duration: 0.26, delay: 0.07, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, removeOnCompletion: false) + rightButton.layer.animatePosition(from: center, to: rightButtonPosition, duration: 0.26, delay: 0.07, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, removeOnCompletion: false) + + leftButton.layer.animateScale(from: 0.55, to: 1.0, duration: 0.26, delay: 0.06, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) + rightButton.layer.animateScale(from: 0.55, to: 1.0, duration: 0.26, delay: 0.06, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue) + + leftButton.textNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.1, delay: 0.05) + rightButton.textNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.1, delay: 0.05) } actionButton.update(snap: false, animated: true) - actionButton.position = targetPosition - actionButton.layer.animateKeyframes(values: keyframes, duration: 0.34, keyPath: "position", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, completion: { _ in + actionButton.position = CGPoint(x: targetPosition.x - sourcePoint.x, y: 80.0) + + let transition = ContainedViewLayoutTransition.animated(duration: 0.4, curve: .spring) + transition.animateView { + transitionNode.position = CGPoint(x: transitionNode.position.x, y: targetPosition.y - 80.0) + } + + actionButton.layer.animatePosition(from: CGPoint(), to: actionButton.position, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, completion: { _ in self.animating = false completion(false) }) @@ -193,76 +260,79 @@ public final class VoiceChatOverlayController: ViewController { return nil } + private var didAnimateIn = false func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { self.validLayout = layout - if let actionButton = self.controller?.actionButton, !self.animating { + if let actionButton = self.controller?.actionButton, let leftButton = self.controller?.audioOutputNode, let rightButton = self.controller?.leaveNode, !self.animating && !self.dismissed { let convertedRect = actionButton.view.convert(actionButton.bounds, to: self.view) - let insets = layout.insets(options: [.input]) + let insets = layout.insets(options: [.input]) + + if !self.didAnimateIn { + let leftButtonFrame = leftButton.view.convert(leftButton.bounds, to: actionButton.bottomNode.view) + actionButton.bottomNode.addSubnode(leftButton) + leftButton.frame = leftButtonFrame + + let rightButtonFrame = rightButton.view.convert(rightButton.bounds, to: actionButton.bottomNode.view) + actionButton.bottomNode.addSubnode(rightButton) + rightButton.frame = rightButtonFrame + } + transition.updatePosition(node: actionButton, position: CGPoint(x: layout.size.width - layout.safeInsets.right - 21.0, y: layout.size.height - insets.bottom - 22.0)) - if actionButton.supernode !== self { + if actionButton.supernode !== self && !self.didAnimateIn { + self.didAnimateIn = true + actionButton.ignoreHierarchyChanges = true self.addSubnode(actionButton) - + var hidden = false + if let initiallyHidden = self.controller?.initiallyHidden, initiallyHidden { + hidden = initiallyHidden + } + if hidden { + self.update(hidden: true, slide: true, animated: false) + } self.animateIn(from: convertedRect) + if hidden { + self.controller?.setupVisibilityUpdates() + } + actionButton.ignoreHierarchyChanges = false } } } } private weak var actionButton: VoiceChatActionButton? + private weak var audioOutputNode: CallControllerButtonItemNode? + private weak var leaveNode: CallControllerButtonItemNode? private var controllerNode: Node { return self.displayNode as! Node } private var disposable: Disposable? - - init(actionButton: VoiceChatActionButton, navigationController: NavigationController?) { + + private weak var parentNavigationController: NavigationController? + private var currentParams: ([UIViewController], [UIViewController], VoiceChatActionButton.State)? + fileprivate var initiallyHidden: Bool + + init(actionButton: VoiceChatActionButton, audioOutputNode: CallControllerButtonItemNode, leaveNode: CallControllerButtonItemNode, navigationController: NavigationController?, initiallyHidden: Bool) { self.actionButton = actionButton + self.audioOutputNode = audioOutputNode + self.leaveNode = leaveNode + self.parentNavigationController = navigationController + self.initiallyHidden = initiallyHidden super.init(navigationBarPresentationData: nil) self.statusBar.statusBarStyle = .Ignore - self.additionalSideInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 75.0) - if let navigationController = navigationController { - let controllers: Signal<[UIViewController], NoError> = .single([]) - |> then(navigationController.viewControllersSignal) - let overlayControllers: Signal<[UIViewController], NoError> = .single([]) - |> then(navigationController.overlayControllersSignal) - - self.disposable = (combineLatest(queue: Queue.mainQueue(), controllers, overlayControllers)).start(next: { [weak self] controllers, overlayControllers in - if let strongSelf = self { - var hasVoiceChatController = false - var overlayControllersCount = 0 - for controller in controllers { - if controller is VoiceChatController { - hasVoiceChatController = true - } - } - for controller in overlayControllers { - if controller is TooltipController || controller is TooltipScreen || controller is AlertController { - } else { - overlayControllersCount += 1 - } - } - - var hidden = true - var animated = true - if controllers.count == 1 || controllers.last is ChatController { - hidden = false - } - if overlayControllersCount > 0 { - hidden = true - } - if hasVoiceChatController { - hidden = false - animated = false - } - strongSelf.controllerNode.update(hidden: hidden, slide: true, animated: animated) - } - }) + if case .active(.cantSpeak) = actionButton.stateValue { + } else if !initiallyHidden { + self.additionalSideInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 75.0) + } + + if !self.initiallyHidden { + self.setupVisibilityUpdates() } } @@ -279,6 +349,22 @@ public final class VoiceChatOverlayController: ViewController { self.displayNodeDidLoad() } + private func setupVisibilityUpdates() { + if let navigationController = self.parentNavigationController, let actionButton = self.actionButton { + let controllers: Signal<[UIViewController], NoError> = .single([]) + |> then(navigationController.viewControllersSignal) + let overlayControllers: Signal<[UIViewController], NoError> = .single([]) + |> then(navigationController.overlayControllersSignal) + + self.disposable = (combineLatest(queue: Queue.mainQueue(), controllers, overlayControllers, actionButton.state)).start(next: { [weak self] controllers, overlayControllers, state in + if let strongSelf = self { + strongSelf.currentParams = (controllers, overlayControllers, state) + strongSelf.updateVisibility() + } + }) + } + } + public override func dismiss(completion: (() -> Void)? = nil) { super.dismiss(completion: completion) self.presentingViewController?.dismiss(animated: false, completion: nil) @@ -289,7 +375,69 @@ public final class VoiceChatOverlayController: ViewController { self.controllerNode.animateOut(reclaim: reclaim, completion: completion) } + public func updateVisibility() { + guard let (controllers, overlayControllers, state) = self.currentParams else { + return + } + var hasVoiceChatController = false + var overlayControllersCount = 0 + for controller in controllers { + if controller is VoiceChatController { + hasVoiceChatController = true + } + } + for controller in overlayControllers { + if controller is TooltipController || controller is TooltipScreen || controller is AlertController { + } else { + overlayControllersCount += 1 + } + } + + var slide = true + var hidden = true + var animated = true + var animateInsets = true + if controllers.count == 1 || controllers.last is ChatController { + if let chatController = controllers.last as? ChatController { + slide = false + if !chatController.isSendButtonVisible { + hidden = false + } + } else { + hidden = false + } + } + if let tabBarController = controllers.last as? TabBarController { + if let chatListController = tabBarController.controllers[tabBarController.selectedIndex] as? ChatListController, chatListController.isSearchActive { + hidden = true + } + } + if overlayControllersCount > 0 { + hidden = true + } + + if case .active(.cantSpeak) = state { + hidden = true + } + if hasVoiceChatController { + hidden = false + animated = self.initiallyHidden + self.initiallyHidden = false + } + + self.controllerNode.update(hidden: hidden, slide: slide, animated: animated) + + let previousInsets = self.additionalSideInsets + self.additionalSideInsets = hidden ? UIEdgeInsets() : UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 75.0) + + if previousInsets != self.additionalSideInsets { + self.parentNavigationController?.requestLayout(transition: .animated(duration: 0.3, curve: .easeInOut)) + } + } + + private let hiddenPromise = ValuePromise() public func update(hidden: Bool, slide: Bool, animated: Bool) { + self.hiddenPromise.set(hidden) self.controllerNode.update(hidden: hidden, slide: slide, animated: animated) } diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatParticipantItem.swift b/submodules/TelegramCallsUI/Sources/VoiceChatParticipantItem.swift index e5e18e3c65..9ddd978bdb 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatParticipantItem.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatParticipantItem.swift @@ -169,7 +169,8 @@ class VoiceChatParticipantItemNode: ItemListRevealOptionsItemNode { private var peerPresenceManager: PeerPresenceStatusManager? private var layoutParams: (VoiceChatParticipantItem, ListViewItemLayoutParams, Bool, Bool)? - + private var wavesColor: UIColor? + init() { self.topStripeNode = ASDisplayNode() self.topStripeNode.isLayerBacked = true @@ -296,8 +297,8 @@ class VoiceChatParticipantItemNode: ItemListRevealOptionsItemNode { let statusFontSize: CGFloat = floor(item.presentationData.fontSize.itemListBaseFontSize * 14.0 / 17.0) - let titleFont = Font.regular(item.presentationData.fontSize.itemListBaseFontSize) - let statusFont = Font.regular(statusFontSize) + let titleFont = Font.regular(17.0) + let statusFont = Font.regular(14.0) var titleAttributedString: NSAttributedString? var statusAttributedString: NSAttributedString? @@ -334,6 +335,7 @@ class VoiceChatParticipantItemNode: ItemListRevealOptionsItemNode { titleAttributedString = NSAttributedString(string: channel.title, font: currentBoldFont, textColor: titleColor) } + var wavesColor = UIColor(rgb: 0x34c759) switch item.text { case .presence: if let user = item.peer as? TelegramUser, let botInfo = user.botInfo { @@ -358,6 +360,7 @@ class VoiceChatParticipantItemNode: ItemListRevealOptionsItemNode { textColorValue = item.presentationData.theme.list.itemSecondaryTextColor case .accent: textColorValue = item.presentationData.theme.list.itemAccentColor + wavesColor = textColorValue case .constructive: textColorValue = UIColor(rgb: 0x34c759) } @@ -435,6 +438,7 @@ class VoiceChatParticipantItemNode: ItemListRevealOptionsItemNode { return (layout, { [weak self] synchronousLoad, animated in if let strongSelf = self { strongSelf.layoutParams = (item, params, first, last) + strongSelf.wavesColor = wavesColor let nonExtractedRect = CGRect(origin: CGPoint(), size: CGSize(width: layout.contentSize.width - 16.0, height: layout.contentSize.height)) let extractedRect = CGRect(origin: CGPoint(), size: layout.contentSize).insetBy(dx: 16.0 + params.leftInset, dy: 0.0) @@ -561,7 +565,7 @@ class VoiceChatParticipantItemNode: ItemListRevealOptionsItemNode { playbackMaskLayer.path = maskPath.cgPath audioLevelView.layer.mask = playbackMaskLayer - audioLevelView.setColor(UIColor(rgb: 0x34c759)) + audioLevelView.setColor(wavesColor) strongSelf.audioLevelView = audioLevelView strongSelf.offsetContainerNode.view.insertSubview(audioLevelView, at: 0) } @@ -574,6 +578,9 @@ class VoiceChatParticipantItemNode: ItemListRevealOptionsItemNode { if value > 0.0 { audioLevelView.startAnimating() avatarScale = 1.03 + level * 0.13 + if let wavesColor = strongSelf.wavesColor { + audioLevelView.setColor(wavesColor, animated: true) + } } else { audioLevelView.stopAnimating(duration: 0.5) avatarScale = 1.0 diff --git a/submodules/TelegramCore/Sources/AccountManager.swift b/submodules/TelegramCore/Sources/AccountManager.swift index 038a86654c..fc054406a1 100644 --- a/submodules/TelegramCore/Sources/AccountManager.swift +++ b/submodules/TelegramCore/Sources/AccountManager.swift @@ -168,6 +168,7 @@ private var declaredEncodables: Void = { declareEncodable(Country.CountryCode.self, f: { Country.CountryCode(decoder: $0) }) declareEncodable(CountriesList.self, f: { CountriesList(decoder: $0) }) declareEncodable(ValidationMessageAttribute.self, f: { ValidationMessageAttribute(decoder: $0) }) + declareEncodable(EmojiSearchQueryMessageAttribute.self, f: { EmojiSearchQueryMessageAttribute(decoder: $0) }) return }() diff --git a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift index 7cceb32127..6148122312 100644 --- a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift @@ -1001,6 +1001,8 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo updatedState.readOutbox(MessageId(peerId: PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId), namespace: Namespaces.Message.Cloud, id: maxId), timestamp: nil) case let .updateChannel(channelId): updatedState.addExternallyUpdatedPeerId(PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId)) + case let .updateChat(chatId): + updatedState.addExternallyUpdatedPeerId(PeerId(namespace: Namespaces.Peer.CloudGroup, id: chatId)) case let .updateReadHistoryInbox(_, folderId, peer, maxId, stillUnreadCount, pts, _): updatedState.resetIncomingReadState(groupId: PeerGroupId(rawValue: folderId ?? 0), peerId: peer.peerId, namespace: Namespaces.Message.Cloud, maxIncomingReadId: maxId, count: stillUnreadCount, pts: pts) case let .updateReadHistoryOutbox(peer, maxId, _, _): @@ -1334,6 +1336,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo } case let .updateGroupCall(channelId, call): updatedState.updateGroupCall(peerId: PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId), call: call) + updatedState.updateGroupCall(peerId: PeerId(namespace: Namespaces.Peer.CloudGroup, id: channelId), call: call) case let .updateLangPackTooLong(langCode): updatedState.updateLangPack(langCode: langCode, difference: nil) case let .updateLangPack(difference): @@ -2966,6 +2969,8 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in if let current = current as? CachedChannelData { return current.withUpdatedActiveCall(CachedChannelData.ActiveCall(id: info.id, accessHash: info.accessHash)) + } else if let current = current as? CachedGroupData { + return current.withUpdatedActiveCall(CachedChannelData.ActiveCall(id: info.id, accessHash: info.accessHash)) } else { return current } @@ -2997,6 +3002,12 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP } else { return current } + } else if let current = current as? CachedGroupData { + if let activeCall = current.activeCall, activeCall.id == callId { + return current.withUpdatedActiveCall(nil) + } else { + return current + } } else { return current } diff --git a/submodules/TelegramCore/Sources/ChannelAdminEventLogs.swift b/submodules/TelegramCore/Sources/ChannelAdminEventLogs.swift index c159d53cd6..61e071d4af 100644 --- a/submodules/TelegramCore/Sources/ChannelAdminEventLogs.swift +++ b/submodules/TelegramCore/Sources/ChannelAdminEventLogs.swift @@ -224,10 +224,10 @@ public func channelAdminLogEvents(postbox: Postbox, network: Network, peerId: Pe action = .endGroupCall case let .channelAdminLogEventActionParticipantMute(participant): let parsedParticipant = GroupCallParticipantsContext.Update.StateUpdate.ParticipantUpdate(participant) - action = .groupCallUpdateParticipantMuteStatus(peerId: parsedParticipant.peerId, isMuted: parsedParticipant.muteState != nil) + action = .groupCallUpdateParticipantMuteStatus(peerId: parsedParticipant.peerId, isMuted: true) case let .channelAdminLogEventActionParticipantUnmute(participant): let parsedParticipant = GroupCallParticipantsContext.Update.StateUpdate.ParticipantUpdate(participant) - action = .groupCallUpdateParticipantMuteStatus(peerId: parsedParticipant.peerId, isMuted: parsedParticipant.muteState != nil) + action = .groupCallUpdateParticipantMuteStatus(peerId: parsedParticipant.peerId, isMuted: false) case let .channelAdminLogEventActionToggleGroupCallSetting(joinMuted): action = .updateGroupCallSettings(joinMuted: joinMuted == .boolTrue) } diff --git a/submodules/TelegramCore/Sources/EnqueueMessage.swift b/submodules/TelegramCore/Sources/EnqueueMessage.swift index 78e7581da3..b957258705 100644 --- a/submodules/TelegramCore/Sources/EnqueueMessage.swift +++ b/submodules/TelegramCore/Sources/EnqueueMessage.swift @@ -93,6 +93,8 @@ private func filterMessageAttributesForOutgoingMessage(_ attributes: [MessageAtt return true case _ as EmbeddedMediaStickersMessageAttribute: return true + case _ as EmojiSearchQueryMessageAttribute: + return true default: return false } diff --git a/submodules/TelegramCore/Sources/GroupCalls.swift b/submodules/TelegramCore/Sources/GroupCalls.swift index 15ca920269..195df48f49 100644 --- a/submodules/TelegramCore/Sources/GroupCalls.swift +++ b/submodules/TelegramCore/Sources/GroupCalls.swift @@ -126,8 +126,8 @@ public enum CreateGroupCallError { } public func createGroupCall(account: Account, peerId: PeerId) -> Signal { - return account.postbox.transaction { transaction -> Api.InputChannel? in - return transaction.getPeer(peerId).flatMap(apiInputChannel) + return account.postbox.transaction { transaction -> Api.InputPeer? in + return transaction.getPeer(peerId).flatMap(apiInputPeer) } |> castError(CreateGroupCallError.self) |> mapToSignal { inputPeer -> Signal in @@ -135,7 +135,7 @@ public func createGroupCall(account: Account, peerId: PeerId) -> Signal mapError { error -> CreateGroupCallError in if error.errorDescription == "ANONYMOUS_CALLS_DISABLED" { return .anonymousNotAllowed @@ -162,6 +162,8 @@ public func createGroupCall(account: Account, peerId: PeerId) -> Signal CachedPeerData? in if let cachedData = cachedData as? CachedChannelData { return cachedData.withUpdatedActiveCall(CachedChannelData.ActiveCall(id: callInfo.id, accessHash: callInfo.accessHash)) + } else if let cachedData = cachedData as? CachedGroupData { + return cachedData.withUpdatedActiveCall(CachedChannelData.ActiveCall(id: callInfo.id, accessHash: callInfo.accessHash)) } else { return cachedData } @@ -283,23 +285,71 @@ public func joinGroupCall(account: Account, peerId: PeerId, callId: Int64, acces return .generic } |> mapToSignal { updates -> Signal in - let admins = account.postbox.transaction { transaction -> Api.InputChannel? in - return transaction.getPeer(peerId).flatMap(apiInputChannel) - } - |> castError(JoinGroupCallError.self) - |> mapToSignal { inputChannel -> Signal in - guard let inputChannel = inputChannel else { - return .fail(.generic) + + let admins: Signal<(Set, [Api.User]), JoinGroupCallError> + if peerId.namespace == Namespaces.Peer.CloudChannel { + admins = account.postbox.transaction { transaction -> Api.InputChannel? in + return transaction.getPeer(peerId).flatMap(apiInputChannel) } - - return account.network.request(Api.functions.channels.getParticipants(channel: inputChannel, filter: .channelParticipantsAdmins, offset: 0, limit: 100, hash: 0)) - |> mapError { _ -> JoinGroupCallError in - return .generic + |> castError(JoinGroupCallError.self) + |> mapToSignal { inputChannel -> Signal in + guard let inputChannel = inputChannel else { + return .fail(.generic) + } + + return account.network.request(Api.functions.channels.getParticipants(channel: inputChannel, filter: .channelParticipantsAdmins, offset: 0, limit: 100, hash: 0)) + |> mapError { _ -> JoinGroupCallError in + return .generic + } } + |> map { admins -> (Set, [Api.User]) in + var adminIds = Set() + var apiUsers: [Api.User] = [] + + switch admins { + case let .channelParticipants(_, participants, users): + apiUsers.append(contentsOf: users) + + for participant in participants { + let parsedParticipant = ChannelParticipant(apiParticipant: participant) + switch parsedParticipant { + case .creator: + adminIds.insert(parsedParticipant.peerId) + case let .member(_, _, adminInfo, _, _): + if let adminInfo = adminInfo, adminInfo.rights.flags.contains(.canManageCalls) { + adminIds.insert(parsedParticipant.peerId) + } + } + } + default: + break + } + + return (adminIds, apiUsers) + } + } else if peerId.namespace == Namespaces.Peer.CloudGroup { + admins = account.postbox.transaction { transaction -> (Set, [Api.User]) in + var result = Set() + if let cachedData = transaction.getPeerCachedData(peerId: peerId) as? CachedGroupData { + if let participants = cachedData.participants { + for participant in participants.participants { + if case .creator = participant { + result.insert(participant.peerId) + } else if case .admin = participant { + result.insert(participant.peerId) + } + } + } + } + return (result, []) + } + |> castError(JoinGroupCallError.self) + } else { + admins = .fail(.generic) } - let channel = account.postbox.transaction { transaction -> TelegramChannel? in - return transaction.getPeer(peerId) as? TelegramChannel + let peer = account.postbox.transaction { transaction -> Peer? in + return transaction.getPeer(peerId) } |> castError(JoinGroupCallError.self) @@ -313,15 +363,23 @@ public func joinGroupCall(account: Account, peerId: PeerId, callId: Int64, acces return .generic }, admins, - channel + peer ) - |> mapToSignal { result, state, admins, channel -> Signal in - guard let channel = channel else { + |> mapToSignal { result, state, admins, peer -> Signal in + guard let peer = peer else { return .fail(.generic) } var state = state - state.isCreator = channel.flags.contains(.isCreator) + if let channel = peer as? TelegramChannel { + state.isCreator = channel.flags.contains(.isCreator) + } else if let group = peer as? TelegramGroup { + if case .creator = group.role { + state.isCreator = true + } else { + state.isCreator = false + } + } account.stateManager.addUpdates(updates) @@ -351,26 +409,9 @@ public func joinGroupCall(account: Account, peerId: PeerId, callId: Int64, acces } var apiUsers: [Api.User] = [] - var adminIds = Set() - switch admins { - case let .channelParticipants(_, participants, users): - apiUsers.append(contentsOf: users) - - for participant in participants { - let parsedParticipant = ChannelParticipant(apiParticipant: participant) - switch parsedParticipant { - case .creator: - adminIds.insert(parsedParticipant.peerId) - case let .member(_, _, adminInfo, _, _): - if let adminInfo = adminInfo, adminInfo.rights.flags.contains(.canManageCalls) { - adminIds.insert(parsedParticipant.peerId) - } - } - } - default: - break - } + let (adminIds, adminUsers) = admins + apiUsers.append(contentsOf: adminUsers) state.adminIds = adminIds @@ -440,6 +481,8 @@ public func stopGroupCall(account: Account, peerId: PeerId, callId: Int64, acces transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, cachedData -> CachedPeerData? in if let cachedData = cachedData as? CachedChannelData { return cachedData.withUpdatedActiveCall(nil) + } else if let cachedData = cachedData as? CachedGroupData { + return cachedData.withUpdatedActiveCall(nil) } else { return cachedData } @@ -955,6 +998,8 @@ public final class GroupCallParticipantsContext { } } + updatedTotalCount = max(updatedTotalCount, updatedParticipants.count) + var updatedOverlayState = strongSelf.stateValue.overlayState for peerId in update.removePendingMuteStates { updatedOverlayState.pendingMuteStateChanges.removeValue(forKey: peerId) diff --git a/submodules/TelegramCore/Sources/PendingMessageUploadedContent.swift b/submodules/TelegramCore/Sources/PendingMessageUploadedContent.swift index 275e03300c..5250d68b56 100644 --- a/submodules/TelegramCore/Sources/PendingMessageUploadedContent.swift +++ b/submodules/TelegramCore/Sources/PendingMessageUploadedContent.swift @@ -126,13 +126,23 @@ func mediaContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods: } |> mapToSignal { validatedResource -> Signal in if let validatedResource = validatedResource.updatedResource as? TelegramCloudMediaResourceWithFileReference, let reference = validatedResource.fileReference { - return .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .media(Api.InputMedia.inputMediaDocument(flags: 0, id: Api.InputDocument.inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: reference)), ttlSeconds: nil), text), reuploadInfo: nil))) + return .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .media(Api.InputMedia.inputMediaDocument(flags: 0, id: Api.InputDocument.inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: reference)), ttlSeconds: nil, query: nil), text), reuploadInfo: nil))) } else { return .fail(.generic) } } } - return .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .media(Api.InputMedia.inputMediaDocument(flags: 0, id: Api.InputDocument.inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference ?? Data())), ttlSeconds: nil), text), reuploadInfo: nil))) + + var flags: Int32 = 0 + var emojiSearchQuery: String? + for attribute in attributes { + if let attribute = attribute as? EmojiSearchQueryMessageAttribute { + emojiSearchQuery = attribute.query + flags |= (1 << 1) + } + } + + return .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .media(Api.InputMedia.inputMediaDocument(flags: flags, id: Api.InputDocument.inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference ?? Data())), ttlSeconds: nil, query: emojiSearchQuery), text), reuploadInfo: nil))) } } else { return uploadedMediaFileContent(network: network, postbox: postbox, auxiliaryMethods: auxiliaryMethods, transformOutgoingMessageMedia: transformOutgoingMessageMedia, messageMediaPreuploadManager: messageMediaPreuploadManager, forceReupload: forceReupload, isGrouped: isGrouped, peerId: peerId, messageId: messageId, text: text, attributes: attributes, file: file) @@ -587,7 +597,7 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili if !forceReupload, let file = media as? TelegramMediaFile, let resource = file.resource as? CloudDocumentMediaResource, let fileReference = resource.fileReference { return .single(.progress(1.0)) |> then( - .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .media(Api.InputMedia.inputMediaDocument(flags: 0, id: Api.InputDocument.inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: fileReference)), ttlSeconds: nil), text), reuploadInfo: nil))) + .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .media(Api.InputMedia.inputMediaDocument(flags: 0, id: Api.InputDocument.inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: fileReference)), ttlSeconds: nil, query: nil), text), reuploadInfo: nil))) ) } case let .localReference(key): @@ -771,7 +781,7 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili switch result { case let .messageMediaDocument(_, document, _): if let document = document, let mediaFile = telegramMediaFileFromApiDocument(document), let resource = mediaFile.resource as? CloudDocumentMediaResource, let fileReference = resource.fileReference { - return maybeCacheUploadedResource(postbox: postbox, key: referenceKey, result: .content(PendingMessageUploadedContentAndReuploadInfo(content: .media(.inputMediaDocument(flags: 0, id: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: fileReference)), ttlSeconds: nil), text), reuploadInfo: nil)), media: mediaFile) + return maybeCacheUploadedResource(postbox: postbox, key: referenceKey, result: .content(PendingMessageUploadedContentAndReuploadInfo(content: .media(.inputMediaDocument(flags: 0, id: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: fileReference)), ttlSeconds: nil, query: nil), text), reuploadInfo: nil)), media: mediaFile) } default: break diff --git a/submodules/TelegramCore/Sources/StickerPack.swift b/submodules/TelegramCore/Sources/StickerPack.swift index 5d60dce51a..1c50f6fa9e 100644 --- a/submodules/TelegramCore/Sources/StickerPack.swift +++ b/submodules/TelegramCore/Sources/StickerPack.swift @@ -5,39 +5,44 @@ import SwiftSignalKit import SyncCore import MtProtoKit -func telegramStickerPackThumbnailRepresentationFromApiSize(datacenterId: Int32, size: Api.PhotoSize) -> TelegramMediaImageRepresentation? { - switch size { - case let .photoCachedSize(_, location, w, h, _): - switch location { - case let .fileLocationToBeDeprecated(volumeId, localId): - let resource = CloudStickerPackThumbnailMediaResource(datacenterId: datacenterId, volumeId: volumeId, localId: localId) - return TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: w, height: h), resource: resource, progressiveSizes: []) - } - case let .photoSize(_, location, w, h, _): - switch location { - case let .fileLocationToBeDeprecated(volumeId, localId): - let resource = CloudStickerPackThumbnailMediaResource(datacenterId: datacenterId, volumeId: volumeId, localId: localId) - return TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: w, height: h), resource: resource, progressiveSizes: []) - } - case let .photoSizeProgressive(_, location, w, h, sizes): - switch location { - case let .fileLocationToBeDeprecated(volumeId, localId): - let resource = CloudStickerPackThumbnailMediaResource(datacenterId: datacenterId, volumeId: volumeId, localId: localId) - return TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: w, height: h), resource: resource, progressiveSizes: sizes) - } - case let .photoPathSize(_, data): - return nil - case .photoStrippedSize: - return nil - case .photoSizeEmpty: - return nil +func telegramStickerPackThumbnailRepresentationFromApiSizes(datacenterId: Int32, sizes: [Api.PhotoSize]) -> (immediateThumbnail: Data?, representations: [TelegramMediaImageRepresentation]) { + var immediateThumbnailData: Data? + var representations: [TelegramMediaImageRepresentation] = [] + for size in sizes { + switch size { + case let .photoCachedSize(_, location, w, h, _): + switch location { + case let .fileLocationToBeDeprecated(volumeId, localId): + let resource = CloudStickerPackThumbnailMediaResource(datacenterId: datacenterId, volumeId: volumeId, localId: localId) + representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: w, height: h), resource: resource, progressiveSizes: [])) + } + case let .photoSize(_, location, w, h, _): + switch location { + case let .fileLocationToBeDeprecated(volumeId, localId): + let resource = CloudStickerPackThumbnailMediaResource(datacenterId: datacenterId, volumeId: volumeId, localId: localId) + representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: w, height: h), resource: resource, progressiveSizes: [])) + } + case let .photoSizeProgressive(_, location, w, h, sizes): + switch location { + case let .fileLocationToBeDeprecated(volumeId, localId): + let resource = CloudStickerPackThumbnailMediaResource(datacenterId: datacenterId, volumeId: volumeId, localId: localId) + representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: w, height: h), resource: resource, progressiveSizes: sizes)) + } + case let .photoPathSize(_, data): + immediateThumbnailData = data.makeData() + case .photoStrippedSize: + break + case .photoSizeEmpty: + break + } } + return (immediateThumbnailData, representations) } extension StickerPackCollectionInfo { convenience init(apiSet: Api.StickerSet, namespace: ItemCollectionId.Namespace) { switch apiSet { - case let .stickerSet(flags, _, id, accessHash, title, shortName, thumb, thumbDcId, count, nHash): + case let .stickerSet(flags, _, id, accessHash, title, shortName, thumbs, thumbDcId, count, nHash): var setFlags: StickerPackCollectionInfoFlags = StickerPackCollectionInfoFlags() if (flags & (1 << 2)) != 0 { setFlags.insert(.isOfficial) @@ -50,11 +55,14 @@ extension StickerPackCollectionInfo { } var thumbnailRepresentation: TelegramMediaImageRepresentation? - if let thumb = thumb, let thumbDcId = thumbDcId { - thumbnailRepresentation = telegramStickerPackThumbnailRepresentationFromApiSize(datacenterId: thumbDcId, size: thumb) + var immediateThumbnailData: Data? + if let thumbs = thumbs, let thumbDcId = thumbDcId { + let (data, representations) = telegramStickerPackThumbnailRepresentationFromApiSizes(datacenterId: thumbDcId, sizes: thumbs) + thumbnailRepresentation = representations.first + immediateThumbnailData = data } - self.init(id: ItemCollectionId(namespace: namespace, id: id), flags: setFlags, accessHash: accessHash, title: title, shortName: shortName, thumbnail: thumbnailRepresentation, hash: nHash, count: count) + self.init(id: ItemCollectionId(namespace: namespace, id: id), flags: setFlags, accessHash: accessHash, title: title, shortName: shortName, thumbnail: thumbnailRepresentation, immediateThumbnailData: immediateThumbnailData, hash: nHash, count: count) } } } diff --git a/submodules/TelegramCore/Sources/StickerPackInteractiveOperations.swift b/submodules/TelegramCore/Sources/StickerPackInteractiveOperations.swift index 14b0b46ffa..bc360ef827 100644 --- a/submodules/TelegramCore/Sources/StickerPackInteractiveOperations.swift +++ b/submodules/TelegramCore/Sources/StickerPackInteractiveOperations.swift @@ -18,7 +18,7 @@ public func addStickerPackInteractively(postbox: Postbox, info: StickerPackColle if let namespace = namespace { var mappedInfo = info if items.isEmpty { - mappedInfo = StickerPackCollectionInfo(id: info.id, flags: info.flags, accessHash: info.accessHash, title: info.title, shortName: info.shortName, thumbnail: info.thumbnail, hash: Int32(bitPattern: arc4random()), count: info.count) + mappedInfo = StickerPackCollectionInfo(id: info.id, flags: info.flags, accessHash: info.accessHash, title: info.title, shortName: info.shortName, thumbnail: info.thumbnail, immediateThumbnailData: info.immediateThumbnailData, hash: Int32(bitPattern: arc4random()), count: info.count) } addSynchronizeInstalledStickerPacksOperation(transaction: transaction, namespace: namespace, content: .add([mappedInfo.id]), noDelay: items.isEmpty) var updatedInfos = transaction.getItemCollectionsInfos(namespace: mappedInfo.id.namespace).map { $0.1 as! StickerPackCollectionInfo } diff --git a/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift b/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift index 115c935d53..ba0857acb9 100644 --- a/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift +++ b/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift @@ -292,6 +292,14 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerI hasScheduledMessages = true } + var updatedActiveCall: CachedChannelData.ActiveCall? + if let inputCall = chatFull.call { + switch inputCall { + case let .inputGroupCall(id, accessHash): + updatedActiveCall = CachedChannelData.ActiveCall(id: id, accessHash: accessHash) + } + } + transaction.updatePeerCachedData(peerIds: [peerId], update: { _, current in let previous: CachedGroupData if let current = current as? CachedGroupData { @@ -309,6 +317,7 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerI .withUpdatedHasScheduledMessages(hasScheduledMessages) .withUpdatedInvitedBy(invitedBy) .withUpdatedPhoto(photo) + .withUpdatedActiveCall(updatedActiveCall) }) case .channelFull: break diff --git a/submodules/TelegramCore/Sources/UpdatesApiUtils.swift b/submodules/TelegramCore/Sources/UpdatesApiUtils.swift index 44c7a8bc40..530995e259 100644 --- a/submodules/TelegramCore/Sources/UpdatesApiUtils.swift +++ b/submodules/TelegramCore/Sources/UpdatesApiUtils.swift @@ -251,6 +251,8 @@ extension Api.Update { switch self { case let .updateChannel(channelId): return [PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId)] + case let .updateChat(chatId): + return [PeerId(namespace: Namespaces.Peer.CloudGroup, id: chatId)] case let .updateChannelTooLong(_, channelId, _): return [PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId)] case let .updateChatParticipantAdd(chatId, userId, inviterId, _, _): diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift index 57901a166d..798ac27100 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkPresentationTheme.swift @@ -413,8 +413,8 @@ public func makeDefaultDarkPresentationTheme(extendingThemeReference: Presentati selectionControlColors: PresentationThemeFillStrokeForeground(fillColor: UIColor(rgb: 0xffffff), strokeColor: UIColor(rgb: 0xffffff), foregroundColor: UIColor(rgb: 0x000000)), deliveryFailedColors: PresentationThemeFillForeground(fillColor: UIColor(rgb: 0xeb5545), foregroundColor: UIColor(rgb: 0xffffff)), mediaHighlightOverlayColor: UIColor(white: 1.0, alpha: 0.6), - stickerPlaceholderColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)), - stickerPlaceholderShimmerColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0x000000, alpha: 0.5), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.5)) + stickerPlaceholderColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0xffffff, alpha: 0.1), withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.1)), + stickerPlaceholderShimmerColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0xffffff, alpha: 0.1), withoutWallpaper: UIColor(rgb: 0xffffff, alpha: 0.1)) ) let serviceMessage = PresentationThemeServiceMessage( diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift index ef439e9114..4b8bb06293 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift @@ -668,8 +668,8 @@ public func makeDefaultDarkTintedPresentationTheme(extendingThemeReference: Pres selectionControlColors: PresentationThemeFillStrokeForeground(fillColor: accentColor, strokeColor: .white, foregroundColor: .white), deliveryFailedColors: PresentationThemeFillForeground(fillColor: UIColor(rgb: 0xff6767), foregroundColor: .white), mediaHighlightOverlayColor: UIColor(white: 1.0, alpha: 0.6), - stickerPlaceholderColor: PresentationThemeVariableColor(color: additionalBackgroundColor.withAlphaComponent(0.5)), - stickerPlaceholderShimmerColor: PresentationThemeVariableColor(color: additionalBackgroundColor.withAlphaComponent(0.5)) + stickerPlaceholderColor: PresentationThemeVariableColor(color: mainBackgroundColor.withAlphaComponent(0.5)), + stickerPlaceholderShimmerColor: PresentationThemeVariableColor(color: UIColor(rgb: 0xffffff, alpha: 0.05)) ) let serviceMessage = PresentationThemeServiceMessage( diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index af104defa3..2555a99f5b 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -549,8 +549,8 @@ public func makeDefaultDayPresentationTheme(extendingThemeReference: Presentatio selectionControlColors: PresentationThemeFillStrokeForeground(fillColor: UIColor(rgb: 0x007ee5), strokeColor: UIColor(rgb: 0xc7c7cc), foregroundColor: UIColor(rgb: 0xffffff)), deliveryFailedColors: PresentationThemeFillForeground(fillColor: UIColor(rgb: 0xff3b30), foregroundColor: UIColor(rgb: 0xffffff)), mediaHighlightOverlayColor: UIColor(white: 1.0, alpha: 0.6), - stickerPlaceholderColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x748391, alpha: 0.45)), - stickerPlaceholderShimmerColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x748391, alpha: 0.45)) + stickerPlaceholderColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor.withAlphaComponent(0.3), withoutWallpaper: UIColor(rgb: 0x748391, alpha: 0.25)), + stickerPlaceholderShimmerColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0xffffff, alpha: 0.2), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.1)) ) let messageDay = PresentationThemeChatMessage( @@ -617,8 +617,8 @@ public func makeDefaultDayPresentationTheme(extendingThemeReference: Presentatio selectionControlColors: PresentationThemeFillStrokeForeground(fillColor: UIColor(rgb: 0x007ee5), strokeColor: UIColor(rgb: 0xc7c7cc), foregroundColor: UIColor(rgb: 0xffffff)), deliveryFailedColors: PresentationThemeFillForeground(fillColor: UIColor(rgb: 0xff3b30), foregroundColor: UIColor(rgb: 0xffffff)), mediaHighlightOverlayColor: UIColor(rgb: 0xffffff, alpha: 0.6), - stickerPlaceholderColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x748391, alpha: 0.45)), - stickerPlaceholderShimmerColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor, withoutWallpaper: UIColor(rgb: 0x748391, alpha: 0.45)) + stickerPlaceholderColor: PresentationThemeVariableColor(withWallpaper: serviceBackgroundColor.withAlphaComponent(0.3), withoutWallpaper: UIColor(rgb: 0xf7f7f7)), + stickerPlaceholderShimmerColor: PresentationThemeVariableColor(withWallpaper: UIColor(rgb: 0xffffff, alpha: 0.2), withoutWallpaper: UIColor(rgb: 0x000000, alpha: 0.1)) ) let serviceMessage = PresentationThemeServiceMessage( diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 6ff013f90f..0b573d3e71 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -1777,7 +1777,9 @@ public final class PresentationStrings: Equatable { public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1479]!, self._r[1479]!, [_0]) } - public var Notification_VoiceChatStarted: String { return self._s[1480]! } + public func Notification_VoiceChatStarted(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_1]) + } public var FastTwoStepSetup_HintHelp: String { return self._s[1481]! } public var WallpaperSearch_ColorRed: String { return self._s[1482]! } public var Watch_ConnectionDescription: String { return self._s[1483]! } @@ -2232,3801 +2234,3804 @@ public final class PresentationStrings: Equatable { public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1904]! } public var Wallet_Month_GenMay: String { return self._s[1905]! } public var Common_of: String { return self._s[1906]! } - public var PeerInfo_ButtonUnmute: String { return self._s[1909]! } + public var VoiceChat_CreateNewVoiceChatText: String { return self._s[1907]! } + public var PeerInfo_ButtonUnmute: String { return self._s[1910]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1910]!, self._r[1910]!, [_0]) + return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_0]) } - public var ChatList_AddChatsToFolder: String { return self._s[1911]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[1912]! } - public var Settings_Title: String { return self._s[1914]! } - public var AutoDownloadSettings_Contacts: String { return self._s[1916]! } - public var Appearance_BubbleCornersSetting: String { return self._s[1917]! } - public var Privacy_Calls_AlwaysAllow: String { return self._s[1918]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1920]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1921]! } - public var SecretTimer_VideoDescription: String { return self._s[1922]! } - public var WallpaperPreview_Blurred: String { return self._s[1923]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[1924]! } - public var ChatListFolder_ExcludedSectionHeader: String { return self._s[1926]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1927]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[1928]! } - public var NetworkUsageSettings_CallDataSection: String { return self._s[1929]! } - public var SettingsSearch_Synonyms_Wallet: String { return self._s[1930]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[1931]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[1932]! } - public var SocksProxySetup_Connection: String { return self._s[1933]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[1934]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[1935]! } - public var Conversation_Unpin: String { return self._s[1936]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[1937]! } - public var TwoFactorSetup_Hint_Placeholder: String { return self._s[1938]! } - public var Call_ReportSkip: String { return self._s[1939]! } + public var ChatList_AddChatsToFolder: String { return self._s[1912]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[1913]! } + public var Settings_Title: String { return self._s[1915]! } + public var AutoDownloadSettings_Contacts: String { return self._s[1917]! } + public var Appearance_BubbleCornersSetting: String { return self._s[1918]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[1919]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1921]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1922]! } + public var SecretTimer_VideoDescription: String { return self._s[1923]! } + public var WallpaperPreview_Blurred: String { return self._s[1924]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[1925]! } + public var ChatListFolder_ExcludedSectionHeader: String { return self._s[1927]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1928]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[1929]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[1930]! } + public var SettingsSearch_Synonyms_Wallet: String { return self._s[1931]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[1932]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[1933]! } + public var SocksProxySetup_Connection: String { return self._s[1934]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[1935]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[1936]! } + public var Conversation_Unpin: String { return self._s[1937]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[1938]! } + public var TwoFactorSetup_Hint_Placeholder: String { return self._s[1939]! } + public var Call_ReportSkip: String { return self._s[1940]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1940]!, self._r[1940]!, [_0]) + return formatWithArgumentRanges(self._s[1941]!, self._r[1941]!, [_0]) } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1942]!, self._r[1942]!, [_0]) + return formatWithArgumentRanges(self._s[1943]!, self._r[1943]!, [_0]) } - public var AutoNightTheme_Automatic: String { return self._s[1943]! } - public var Wallet_TransactionInfo_AddressCopied: String { return self._s[1944]! } - public var Wallet_Month_GenMarch: String { return self._s[1945]! } - public var Passport_Language_az: String { return self._s[1946]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[1947]! } - public var Watch_UserInfo_Unmute: String { return self._s[1948]! } - public var Channel_Stickers_YourStickers: String { return self._s[1949]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[1950]! } - public var Tour_Text1: String { return self._s[1951]! } - public var Common_Delete: String { return self._s[1952]! } - public var Settings_EditPhoto: String { return self._s[1953]! } - public var Common_Edit: String { return self._s[1954]! } - public var ShareMenu_ShareTo: String { return self._s[1956]! } - public var Passport_Identity_ExpiryDate: String { return self._s[1957]! } + public var AutoNightTheme_Automatic: String { return self._s[1944]! } + public var Wallet_TransactionInfo_AddressCopied: String { return self._s[1945]! } + public var Wallet_Month_GenMarch: String { return self._s[1946]! } + public var Passport_Language_az: String { return self._s[1947]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[1948]! } + public var Watch_UserInfo_Unmute: String { return self._s[1949]! } + public var Channel_Stickers_YourStickers: String { return self._s[1950]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[1951]! } + public var Tour_Text1: String { return self._s[1952]! } + public var Common_Delete: String { return self._s[1953]! } + public var Settings_EditPhoto: String { return self._s[1954]! } + public var Common_Edit: String { return self._s[1955]! } + public var ShareMenu_ShareTo: String { return self._s[1957]! } + public var Passport_Identity_ExpiryDate: String { return self._s[1958]! } public func Channel_AdminLog_MutedNewMembers(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1958]!, self._r[1958]!, [_1]) + return formatWithArgumentRanges(self._s[1959]!, self._r[1959]!, [_1]) } - public var Preview_DeleteGif: String { return self._s[1959]! } - public var WallpaperPreview_PatternPaternDiscard: String { return self._s[1960]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[1961]! } - public var Conversation_ViewReply: String { return self._s[1962]! } - public var Stats_LoadingText: String { return self._s[1963]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[1964]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[1965]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[1966]! } + public var Preview_DeleteGif: String { return self._s[1960]! } + public var WallpaperPreview_PatternPaternDiscard: String { return self._s[1961]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[1962]! } + public var Conversation_ViewReply: String { return self._s[1963]! } + public var Stats_LoadingText: String { return self._s[1964]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[1965]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[1966]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[1967]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1967]!, self._r[1967]!, [_0]) - } - public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1968]!, self._r[1968]!, [_0]) } + public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1969]!, self._r[1969]!, [_0]) + } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1970]!, self._r[1970]!, [_0]) + return formatWithArgumentRanges(self._s[1971]!, self._r[1971]!, [_0]) } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[1971]! } - public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1974]! } - public var IntentsSettings_MainAccount: String { return self._s[1975]! } - public var Group_MessagePhotoRemoved: String { return self._s[1978]! } - public var Conversation_ContextMenuSelect: String { return self._s[1979]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[1981]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[1982]! } - public var Contacts_PermissionsEnable: String { return self._s[1983]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[1984]! } - public var Common_NotNow: String { return self._s[1985]! } - public var Notification_CreatedChannel: String { return self._s[1986]! } - public var Stats_ViewsBySourceTitle: String { return self._s[1988]! } - public var Appearance_AppIconClassic: String { return self._s[1989]! } - public var PhotoEditor_QualityTool: String { return self._s[1990]! } - public var ClearCache_ClearCache: String { return self._s[1991]! } - public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[1992]! } - public var AutoDownloadSettings_Videos: String { return self._s[1993]! } - public var GroupPermission_Duration: String { return self._s[1994]! } - public var ChatList_Read: String { return self._s[1995]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[1972]! } + public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1975]! } + public var IntentsSettings_MainAccount: String { return self._s[1976]! } + public var Group_MessagePhotoRemoved: String { return self._s[1979]! } + public var Conversation_ContextMenuSelect: String { return self._s[1980]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[1982]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[1983]! } + public var Contacts_PermissionsEnable: String { return self._s[1984]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[1985]! } + public var Common_NotNow: String { return self._s[1986]! } + public var Notification_CreatedChannel: String { return self._s[1987]! } + public var Stats_ViewsBySourceTitle: String { return self._s[1989]! } + public var Appearance_AppIconClassic: String { return self._s[1990]! } + public var PhotoEditor_QualityTool: String { return self._s[1991]! } + public var ClearCache_ClearCache: String { return self._s[1992]! } + public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[1993]! } + public var AutoDownloadSettings_Videos: String { return self._s[1994]! } + public var GroupPermission_Duration: String { return self._s[1995]! } + public var ChatList_Read: String { return self._s[1996]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1996]!, self._r[1996]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1997]!, self._r[1997]!, [_1, _2]) } - public var CallFeedback_Send: String { return self._s[1997]! } - public var Channel_Stickers_Searching: String { return self._s[1998]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[1999]! } - public var FastTwoStepSetup_HintSection: String { return self._s[2000]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2001]! } - public var EditTheme_CreateTitle: String { return self._s[2002]! } - public var Application_Name: String { return self._s[2003]! } - public var Paint_Stickers: String { return self._s[2004]! } - public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[2005]! } - public var Call_StatusFailed: String { return self._s[2006]! } - public var Stickers_FavoriteStickers: String { return self._s[2007]! } - public var ClearCache_Clear: String { return self._s[2008]! } - public var Passport_Language_mn: String { return self._s[2009]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[2010]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2011]! } - public var TwoFactorSetup_Hint_Text: String { return self._s[2014]! } - public var WallpaperPreview_PatternIntensity: String { return self._s[2015]! } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2016]! } - public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2017]! } - public var Passport_Address_AddBankStatement: String { return self._s[2018]! } + public var CallFeedback_Send: String { return self._s[1998]! } + public var Channel_Stickers_Searching: String { return self._s[1999]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[2000]! } + public var FastTwoStepSetup_HintSection: String { return self._s[2001]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2002]! } + public var EditTheme_CreateTitle: String { return self._s[2003]! } + public var Application_Name: String { return self._s[2004]! } + public var Paint_Stickers: String { return self._s[2005]! } + public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[2006]! } + public var Call_StatusFailed: String { return self._s[2007]! } + public var Stickers_FavoriteStickers: String { return self._s[2008]! } + public var ClearCache_Clear: String { return self._s[2009]! } + public var Passport_Language_mn: String { return self._s[2010]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[2011]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2012]! } + public var TwoFactorSetup_Hint_Text: String { return self._s[2015]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[2016]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2017]! } + public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2018]! } + public var Passport_Address_AddBankStatement: String { return self._s[2019]! } public func Conversation_TitleRepliesFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2020]!, self._r[2020]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2021]!, self._r[2021]!, [_1, _2]) } - public var ChatListFolderSettings_RecommendedNewFolder: String { return self._s[2021]! } - public var UserInfo_ShareContact: String { return self._s[2022]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[2023]! } - public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[2025]! } - public var Call_RateCall: String { return self._s[2026]! } - public var Contacts_AccessDeniedError: String { return self._s[2027]! } - public var Invite_ChannelsTooMuch: String { return self._s[2028]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[2029]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2030]! } - public var Cache_NoLimit: String { return self._s[2032]! } - public var Conversation_EmptyPlaceholder: String { return self._s[2036]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2037]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2039]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[2040]! } + public var ChatListFolderSettings_RecommendedNewFolder: String { return self._s[2022]! } + public var UserInfo_ShareContact: String { return self._s[2023]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[2024]! } + public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[2026]! } + public var Call_RateCall: String { return self._s[2027]! } + public var Contacts_AccessDeniedError: String { return self._s[2028]! } + public var Invite_ChannelsTooMuch: String { return self._s[2029]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[2030]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2031]! } + public var Cache_NoLimit: String { return self._s[2033]! } + public var Conversation_EmptyPlaceholder: String { return self._s[2037]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2038]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2040]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[2041]! } public func PUSH_VIDEO_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2041]!, self._r[2041]!, [_1]) + return formatWithArgumentRanges(self._s[2042]!, self._r[2042]!, [_1]) } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[2042]! } - public var Theme_ThemeChanged: String { return self._s[2043]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2045]! } - public var AutoDownloadSettings_MediaTypes: String { return self._s[2046]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[2043]! } + public var Theme_ThemeChanged: String { return self._s[2044]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2046]! } + public var AutoDownloadSettings_MediaTypes: String { return self._s[2047]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2047]!, self._r[2047]!, [_0]) + return formatWithArgumentRanges(self._s[2048]!, self._r[2048]!, [_0]) } - public var Channel_AdminLog_InfoPanelTitle: String { return self._s[2048]! } - public var Passport_Language_da: String { return self._s[2050]! } - public var Wallet_Receive_AmountText: String { return self._s[2051]! } - public var Chat_SlowmodeSendError: String { return self._s[2052]! } - public var Application_Update: String { return self._s[2054]! } - public var SocksProxySetup_SaveProxy: String { return self._s[2055]! } + public var Channel_AdminLog_InfoPanelTitle: String { return self._s[2049]! } + public var Passport_Language_da: String { return self._s[2051]! } + public var Wallet_Receive_AmountText: String { return self._s[2052]! } + public var Chat_SlowmodeSendError: String { return self._s[2053]! } + public var Application_Update: String { return self._s[2055]! } + public var SocksProxySetup_SaveProxy: String { return self._s[2056]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2056]!, self._r[2056]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2057]!, self._r[2057]!, [_1, _2]) } - public var Wallet_Receive_ShareAddress: String { return self._s[2058]! } - public var Privacy_AddNewPeer: String { return self._s[2059]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[2061]! } - public var Wallet_Receive_CommentInfo: String { return self._s[2062]! } - public var Channel_Members_Title: String { return self._s[2063]! } - public var Settings_LogoutConfirmationText: String { return self._s[2064]! } - public var Chat_UnsendMyMessages: String { return self._s[2065]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2067]! } - public var ChatListFilter_AddChatsTitle: String { return self._s[2068]! } - public var Passport_FloodError: String { return self._s[2069]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[2070]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2071]! } - public var CallSettings_TabIconDescription: String { return self._s[2072]! } - public var Wallet_Intro_Text: String { return self._s[2073]! } - public var Group_Setup_HistoryHeader: String { return self._s[2075]! } - public var TwoStepAuth_EmailTitle: String { return self._s[2076]! } - public var GroupInfo_Permissions_Removed: String { return self._s[2077]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[2078]! } + public var Wallet_Receive_ShareAddress: String { return self._s[2059]! } + public var Privacy_AddNewPeer: String { return self._s[2060]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[2062]! } + public var Wallet_Receive_CommentInfo: String { return self._s[2063]! } + public var Channel_Members_Title: String { return self._s[2064]! } + public var Settings_LogoutConfirmationText: String { return self._s[2065]! } + public var Chat_UnsendMyMessages: String { return self._s[2066]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2068]! } + public var ChatListFilter_AddChatsTitle: String { return self._s[2069]! } + public var Passport_FloodError: String { return self._s[2070]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[2071]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2072]! } + public var CallSettings_TabIconDescription: String { return self._s[2073]! } + public var Wallet_Intro_Text: String { return self._s[2074]! } + public var Group_Setup_HistoryHeader: String { return self._s[2076]! } + public var TwoStepAuth_EmailTitle: String { return self._s[2077]! } + public var GroupInfo_Permissions_Removed: String { return self._s[2078]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[2079]! } public func Channel_AdminLog_AllowedNewMembersToSpeak(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2079]!, self._r[2079]!, [_1]) + return formatWithArgumentRanges(self._s[2080]!, self._r[2080]!, [_1]) } - public var Contacts_Title: String { return self._s[2081]! } + public var Contacts_Title: String { return self._s[2082]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2082]!, self._r[2082]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_0, _1]) } - public var ChatList_PeerTypeBot: String { return self._s[2085]! } + public var ChatList_PeerTypeBot: String { return self._s[2086]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2087]!, self._r[2087]!, [_1, _2]) } - public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[2087]! } + public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[2088]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2088]!, self._r[2088]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2089]!, self._r[2089]!, [_1, _2, _3]) } - public var Camera_PhotoMode: String { return self._s[2090]! } + public var Camera_PhotoMode: String { return self._s[2091]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2091]!, self._r[2091]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2092]!, self._r[2092]!, [_1, _2, _3]) } - public var ContactInfo_PhoneLabelPager: String { return self._s[2092]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[2093]! } - public var Call_CallAgain: String { return self._s[2094]! } - public var TwoStepAuth_PasswordSet: String { return self._s[2095]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[2093]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[2094]! } + public var Call_CallAgain: String { return self._s[2095]! } + public var TwoStepAuth_PasswordSet: String { return self._s[2096]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2096]!, self._r[2096]!, [_0]) + return formatWithArgumentRanges(self._s[2097]!, self._r[2097]!, [_0]) } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[2097]! } - public var ClearCache_FreeSpaceDescription: String { return self._s[2098]! } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2099]! } - public var Group_LeaveGroup: String { return self._s[2100]! } - public var Wallet_WordImport_IncorrectText: String { return self._s[2103]! } - public var GroupInfo_LabelAdmin: String { return self._s[2104]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[2106]! } - public var Notification_PassportValuePersonalDetails: String { return self._s[2107]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[2098]! } + public var ClearCache_FreeSpaceDescription: String { return self._s[2099]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2100]! } + public var Group_LeaveGroup: String { return self._s[2101]! } + public var Wallet_WordImport_IncorrectText: String { return self._s[2104]! } + public var GroupInfo_LabelAdmin: String { return self._s[2105]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[2107]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[2108]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2108]!, self._r[2108]!, [_0]) + return formatWithArgumentRanges(self._s[2109]!, self._r[2109]!, [_0]) } - public var Stats_GroupNewMembersBySourceTitle: String { return self._s[2109]! } - public var Appearance_Preview: String { return self._s[2110]! } - public var VoiceOver_Chat_Contact: String { return self._s[2111]! } - public var Passport_Language_th: String { return self._s[2112]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2115]! } - public var LastSeen_Offline: String { return self._s[2118]! } - public var Map_OpenInHereMaps: String { return self._s[2119]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[2120]! } - public var AutoDownloadSettings_Reset: String { return self._s[2122]! } - public var Wallet_Month_GenFebruary: String { return self._s[2123]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[2124]! } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[2125]! } + public var Stats_GroupNewMembersBySourceTitle: String { return self._s[2110]! } + public var Appearance_Preview: String { return self._s[2111]! } + public var VoiceOver_Chat_Contact: String { return self._s[2112]! } + public var Passport_Language_th: String { return self._s[2113]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2116]! } + public var LastSeen_Offline: String { return self._s[2119]! } + public var Map_OpenInHereMaps: String { return self._s[2120]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[2121]! } + public var AutoDownloadSettings_Reset: String { return self._s[2123]! } + public var Wallet_Month_GenFebruary: String { return self._s[2124]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[2125]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[2126]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2126]!, self._r[2126]!, [_0]) - } - public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2127]!, self._r[2127]!, [_0]) } - public var Passport_Identity_EditDriversLicense: String { return self._s[2128]! } - public var ChatListFolder_NameNonMuted: String { return self._s[2129]! } - public var Username_Placeholder: String { return self._s[2130]! } + public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2128]!, self._r[2128]!, [_0]) + } + public var Passport_Identity_EditDriversLicense: String { return self._s[2129]! } + public var ChatListFolder_NameNonMuted: String { return self._s[2130]! } + public var Username_Placeholder: String { return self._s[2131]! } public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2131]!, self._r[2131]!, [_1]) + return formatWithArgumentRanges(self._s[2132]!, self._r[2132]!, [_1]) } - public var Wallet_Send_NetworkErrorText: String { return self._s[2132]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[2133]! } - public var Passport_Language_it: String { return self._s[2134]! } + public var Wallet_Send_NetworkErrorText: String { return self._s[2133]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[2134]! } + public var Passport_Language_it: String { return self._s[2135]! } public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2135]!, self._r[2135]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2136]!, self._r[2136]!, [_1, _2]) } - public var NotificationsSound_Pulse: String { return self._s[2136]! } - public var MessagePoll_NoVotes: String { return self._s[2140]! } - public var Message_Wallpaper: String { return self._s[2141]! } - public var Wallet_Created_Proceed: String { return self._s[2142]! } - public var Appearance_Other: String { return self._s[2143]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[2145]! } - public var Group_PublicLink_Placeholder: String { return self._s[2148]! } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2149]! } - public var VoiceOver_Recording_StopAndPreview: String { return self._s[2150]! } - public var ChatListFolder_NameBots: String { return self._s[2151]! } - public var Conversation_StopPollConfirmation: String { return self._s[2152]! } - public var UserInfo_DeleteContact: String { return self._s[2153]! } + public var NotificationsSound_Pulse: String { return self._s[2137]! } + public var MessagePoll_NoVotes: String { return self._s[2141]! } + public var Message_Wallpaper: String { return self._s[2142]! } + public var Wallet_Created_Proceed: String { return self._s[2143]! } + public var Appearance_Other: String { return self._s[2144]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[2146]! } + public var Group_PublicLink_Placeholder: String { return self._s[2149]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2150]! } + public var VoiceOver_Recording_StopAndPreview: String { return self._s[2151]! } + public var ChatListFolder_NameBots: String { return self._s[2152]! } + public var Conversation_StopPollConfirmation: String { return self._s[2153]! } + public var UserInfo_DeleteContact: String { return self._s[2154]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2154]!, self._r[2154]!, [_0]) + return formatWithArgumentRanges(self._s[2155]!, self._r[2155]!, [_0]) } - public var Wallpaper_Wallpaper: String { return self._s[2156]! } + public var Wallpaper_Wallpaper: String { return self._s[2157]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2157]!, self._r[2157]!, [_1]) + return formatWithArgumentRanges(self._s[2158]!, self._r[2158]!, [_1]) } - public var LoginPassword_ForgotPassword: String { return self._s[2158]! } - public var FeaturedStickerPacks_Title: String { return self._s[2159]! } - public var Paint_Pen: String { return self._s[2160]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2161]! } - public var ChatListFolderSettings_Info: String { return self._s[2162]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2163]! } - public var PhotoEditor_CurvesAll: String { return self._s[2165]! } - public var Wallet_Info_UnknownTransaction: String { return self._s[2166]! } + public var LoginPassword_ForgotPassword: String { return self._s[2159]! } + public var FeaturedStickerPacks_Title: String { return self._s[2160]! } + public var Paint_Pen: String { return self._s[2161]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2162]! } + public var ChatListFolderSettings_Info: String { return self._s[2163]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2164]! } + public var PhotoEditor_CurvesAll: String { return self._s[2166]! } + public var Wallet_Info_UnknownTransaction: String { return self._s[2167]! } public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2168]!, self._r[2168]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2169]!, self._r[2169]!, [_1, _2, _3]) } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2170]! } - public var Message_ImageExpired: String { return self._s[2171]! } - public var Call_ConnectionErrorMessage: String { return self._s[2172]! } - public var SearchImages_NoImagesFound: String { return self._s[2174]! } - public var PeerInfo_PaneGifs: String { return self._s[2175]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2176]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2177]! } - public var PhotoEditor_VignetteTool: String { return self._s[2178]! } - public var Passport_Language_dz: String { return self._s[2179]! } - public var Notifications_ChannelNotificationsHelp: String { return self._s[2180]! } - public var Conversation_BlockUser: String { return self._s[2181]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2171]! } + public var Message_ImageExpired: String { return self._s[2172]! } + public var Call_ConnectionErrorMessage: String { return self._s[2173]! } + public var SearchImages_NoImagesFound: String { return self._s[2175]! } + public var PeerInfo_PaneGifs: String { return self._s[2176]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2177]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2178]! } + public var PhotoEditor_VignetteTool: String { return self._s[2179]! } + public var Passport_Language_dz: String { return self._s[2180]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[2181]! } + public var Conversation_BlockUser: String { return self._s[2182]! } public func Wallet_Send_Balance(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2183]!, self._r[2183]!, [_0]) + return formatWithArgumentRanges(self._s[2184]!, self._r[2184]!, [_0]) } - public var GroupPermission_PermissionDisabledByDefault: String { return self._s[2185]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2187]! } + public var GroupPermission_PermissionDisabledByDefault: String { return self._s[2186]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2188]! } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2188]!, self._r[2188]!, [_0]) + return formatWithArgumentRanges(self._s[2189]!, self._r[2189]!, [_0]) } - public var KeyCommand_NewMessage: String { return self._s[2189]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[2192]! } + public var KeyCommand_NewMessage: String { return self._s[2190]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[2193]! } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2194]!, self._r[2194]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2195]!, self._r[2195]!, [_1, _2]) } - public var ContactList_Context_StartSecretChat: String { return self._s[2195]! } - public var VoiceOver_Chat_File: String { return self._s[2196]! } - public var ChatList_EditFolder: String { return self._s[2198]! } - public var Appearance_BubbleCorners_Title: String { return self._s[2199]! } - public var PeerInfo_PaneAudio: String { return self._s[2200]! } - public var Wallet_SecureStorageReset_Title: String { return self._s[2201]! } - public var ChatListFolder_CategoryContacts: String { return self._s[2203]! } + public var ContactList_Context_StartSecretChat: String { return self._s[2196]! } + public var VoiceOver_Chat_File: String { return self._s[2197]! } + public var ChatList_EditFolder: String { return self._s[2199]! } + public var Appearance_BubbleCorners_Title: String { return self._s[2200]! } + public var PeerInfo_PaneAudio: String { return self._s[2201]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[2202]! } + public var ChatListFolder_CategoryContacts: String { return self._s[2204]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2204]!, self._r[2204]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[2205]!, self._r[2205]!, [_1, _2, _3, _4, _5]) } - public var ChatList_PeerTypeChannel: String { return self._s[2205]! } - public var VoiceOver_Navigation_Search: String { return self._s[2206]! } - public var Settings_Search: String { return self._s[2207]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2208]! } - public var Login_PhoneBannedError: String { return self._s[2209]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2210]! } - public var Passport_Language_fa: String { return self._s[2211]! } - public var Settings_About: String { return self._s[2212]! } - public var Wallet_Configuration_Title: String { return self._s[2213]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2214]! } - public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[2215]! } - public var AutoDownloadSettings_DataUsageHigh: String { return self._s[2216]! } + public var ChatList_PeerTypeChannel: String { return self._s[2206]! } + public var VoiceOver_Navigation_Search: String { return self._s[2207]! } + public var Settings_Search: String { return self._s[2208]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2209]! } + public var Login_PhoneBannedError: String { return self._s[2210]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2211]! } + public var Passport_Language_fa: String { return self._s[2212]! } + public var Settings_About: String { return self._s[2213]! } + public var Wallet_Configuration_Title: String { return self._s[2214]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2215]! } + public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[2216]! } + public var AutoDownloadSettings_DataUsageHigh: String { return self._s[2217]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2217]!, self._r[2217]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2218]!, self._r[2218]!, [_1, _2, _3]) } - public var Common_OK: String { return self._s[2218]! } - public var Contacts_SortBy: String { return self._s[2219]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[2220]! } + public var Common_OK: String { return self._s[2219]! } + public var Contacts_SortBy: String { return self._s[2220]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[2221]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2222]!, self._r[2222]!, [_0]) + return formatWithArgumentRanges(self._s[2223]!, self._r[2223]!, [_0]) } - public var CallFeedback_IncludeLogs: String { return self._s[2225]! } + public var CallFeedback_IncludeLogs: String { return self._s[2226]! } public func External_OpenIn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2226]!, self._r[2226]!, [_0]) + return formatWithArgumentRanges(self._s[2227]!, self._r[2227]!, [_0]) } - public var Passcode_AppLockedAlert: String { return self._s[2228]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[2229]! } - public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2230]! } - public var Channel_NotificationLoading: String { return self._s[2232]! } - public var Passport_Identity_DocumentNumber: String { return self._s[2233]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2234]! } - public var VoiceOver_Chat_OpenHint: String { return self._s[2235]! } - public var Weekday_ShortFriday: String { return self._s[2236]! } - public var Wallet_CreateInvoice_Title: String { return self._s[2237]! } - public var Conversation_TitleMute: String { return self._s[2238]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2239]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[2240]! } - public var DialogList_LanguageTooltip: String { return self._s[2241]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[2243]! } + public var Passcode_AppLockedAlert: String { return self._s[2229]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[2230]! } + public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2231]! } + public var Channel_NotificationLoading: String { return self._s[2233]! } + public var Passport_Identity_DocumentNumber: String { return self._s[2234]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2235]! } + public var VoiceOver_Chat_OpenHint: String { return self._s[2236]! } + public var Weekday_ShortFriday: String { return self._s[2237]! } + public var Wallet_CreateInvoice_Title: String { return self._s[2238]! } + public var Conversation_TitleMute: String { return self._s[2239]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2240]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[2241]! } + public var DialogList_LanguageTooltip: String { return self._s[2242]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[2244]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2244]!, self._r[2244]!, [_0]) + return formatWithArgumentRanges(self._s[2245]!, self._r[2245]!, [_0]) } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[2246]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[2247]! } - public var Settings_EditVideo: String { return self._s[2248]! } - public var VoiceOver_Common_Off: String { return self._s[2249]! } - public var Stickers_FrequentlyUsed: String { return self._s[2250]! } - public var GroupPermission_Title: String { return self._s[2251]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2252]! } - public var Appearance_ThemeCarouselDay: String { return self._s[2253]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[2247]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[2248]! } + public var Settings_EditVideo: String { return self._s[2249]! } + public var VoiceOver_Common_Off: String { return self._s[2250]! } + public var Stickers_FrequentlyUsed: String { return self._s[2251]! } + public var GroupPermission_Title: String { return self._s[2252]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2253]! } + public var Appearance_ThemeCarouselDay: String { return self._s[2254]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2254]!, self._r[2254]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2255]!, self._r[2255]!, [_1, _2]) } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2255]! } - public var Tour_Title6: String { return self._s[2256]! } - public var EmptyGroupInfo_Title: String { return self._s[2257]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2256]! } + public var Tour_Title6: String { return self._s[2257]! } + public var EmptyGroupInfo_Title: String { return self._s[2258]! } public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2258]!, self._r[2258]!, [_0]) + return formatWithArgumentRanges(self._s[2259]!, self._r[2259]!, [_0]) } - public var Passport_Language_sk: String { return self._s[2259]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[2260]! } - public var Preview_SaveToCameraRoll: String { return self._s[2261]! } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[2262]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2263]! } - public var Conversation_ContextMenuMore: String { return self._s[2264]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[2265]! } - public var Channel_AdminLog_CanBeAnonymous: String { return self._s[2266]! } - public var CallFeedback_ReasonSilentLocal: String { return self._s[2268]! } + public var Passport_Language_sk: String { return self._s[2260]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[2261]! } + public var Preview_SaveToCameraRoll: String { return self._s[2262]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[2263]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2264]! } + public var Conversation_ContextMenuMore: String { return self._s[2265]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[2266]! } + public var Channel_AdminLog_CanBeAnonymous: String { return self._s[2267]! } + public var CallFeedback_ReasonSilentLocal: String { return self._s[2269]! } public func Channel_AdminLog_UnmutedMutedParticipant(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2270]!, self._r[2270]!, [_1, _2]) } - public var UserInfo_NotificationsDisable: String { return self._s[2270]! } + public var UserInfo_NotificationsDisable: String { return self._s[2271]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2272]!, self._r[2272]!, [_0]) + return formatWithArgumentRanges(self._s[2273]!, self._r[2273]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[2273]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[2274]! } public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2275]!, self._r[2275]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2276]!, self._r[2276]!, [_1, _2]) } - public var WallpaperSearch_ColorPrefix: String { return self._s[2276]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2277]! } public func Message_ForwardedPsa_covid(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2277]!, self._r[2277]!, [_0]) + return formatWithArgumentRanges(self._s[2278]!, self._r[2278]!, [_0]) } - public var Conversation_RestrictedMedia: String { return self._s[2279]! } - public var Group_MessageVideoUpdated: String { return self._s[2280]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2281]! } - public var GroupInfo_DeleteAndExit: String { return self._s[2282]! } - public var TwoFactorSetup_Email_Action: String { return self._s[2283]! } - public var Media_ShareThisVideo: String { return self._s[2285]! } - public var DialogList_Replies: String { return self._s[2286]! } + public var Conversation_RestrictedMedia: String { return self._s[2280]! } + public var Group_MessageVideoUpdated: String { return self._s[2281]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2282]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2283]! } + public var TwoFactorSetup_Email_Action: String { return self._s[2284]! } + public var Media_ShareThisVideo: String { return self._s[2286]! } + public var DialogList_Replies: String { return self._s[2287]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2287]!, self._r[2287]!, [_0]) + return formatWithArgumentRanges(self._s[2288]!, self._r[2288]!, [_0]) } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2288]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[2289]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2290]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2289]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[2290]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2291]! } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2291]!, self._r[2291]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2292]!, self._r[2292]!, [_1, _2]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2292]!, self._r[2292]!, [_0]) + return formatWithArgumentRanges(self._s[2293]!, self._r[2293]!, [_0]) } - public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[2293]! } - public var Conversation_WalletRequiredSetup: String { return self._s[2294]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2295]! } - public var Channel_Members_InviteLink: String { return self._s[2296]! } - public var ChatList_Search_NoResultsFitlerMedia: String { return self._s[2297]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[2298]! } - public var Wallet_Info_Receive: String { return self._s[2299]! } - public var WatchRemote_AlertText: String { return self._s[2300]! } + public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[2294]! } + public var Conversation_WalletRequiredSetup: String { return self._s[2295]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2296]! } + public var Channel_Members_InviteLink: String { return self._s[2297]! } + public var ChatList_Search_NoResultsFitlerMedia: String { return self._s[2298]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[2299]! } + public var Wallet_Info_Receive: String { return self._s[2300]! } + public var WatchRemote_AlertText: String { return self._s[2301]! } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2301]!, self._r[2301]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2302]!, self._r[2302]!, [_1, _2]) } - public var Conversation_Pin: String { return self._s[2302]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2303]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2304]! } + public var Conversation_Pin: String { return self._s[2303]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2304]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2305]! } public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2305]!, self._r[2305]!, [_0]) + return formatWithArgumentRanges(self._s[2306]!, self._r[2306]!, [_0]) } - public var Appearance_AppIconFilled: String { return self._s[2306]! } - public var StickerPack_ErrorNotFound: String { return self._s[2307]! } + public var Appearance_AppIconFilled: String { return self._s[2307]! } + public var StickerPack_ErrorNotFound: String { return self._s[2308]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2308]!, self._r[2308]!, [_1]) + return formatWithArgumentRanges(self._s[2309]!, self._r[2309]!, [_1]) } - public var Passport_Identity_AddIdentityCard: String { return self._s[2309]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[2310]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2310]!, self._r[2310]!, [_1]) + return formatWithArgumentRanges(self._s[2311]!, self._r[2311]!, [_1]) } - public var Call_Camera: String { return self._s[2311]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2313]! } - public var Group_Location_Info: String { return self._s[2314]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[2315]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[2316]! } + public var Call_Camera: String { return self._s[2312]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2314]! } + public var Group_Location_Info: String { return self._s[2315]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[2316]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[2317]! } public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2317]!, self._r[2317]!, [_0]) + return formatWithArgumentRanges(self._s[2318]!, self._r[2318]!, [_0]) } - public var Weekday_Yesterday: String { return self._s[2318]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[2319]! } - public var ArchivedPacksAlert_Title: String { return self._s[2320]! } - public var PeerInfo_PaneMembers: String { return self._s[2321]! } - public var PhotoEditor_SelectCoverFrame: String { return self._s[2322]! } + public var Weekday_Yesterday: String { return self._s[2319]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[2320]! } + public var ArchivedPacksAlert_Title: String { return self._s[2321]! } + public var PeerInfo_PaneMembers: String { return self._s[2322]! } + public var PhotoEditor_SelectCoverFrame: String { return self._s[2323]! } public func Location_ProximityAlertSetTextGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2323]!, self._r[2323]!, [_0]) + return formatWithArgumentRanges(self._s[2324]!, self._r[2324]!, [_0]) } - public var ContactInfo_PhoneLabelMain: String { return self._s[2324]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[2325]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2325]!, self._r[2325]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2326]!, self._r[2326]!, [_1, _2, _3]) } - public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[2326]! } - public var Channel_DiscussionGroup: String { return self._s[2327]! } - public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[2328]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[2330]! } - public var VoiceOver_MessageContextForward: String { return self._s[2331]! } - public var SocksProxySetup_TypeNone: String { return self._s[2332]! } - public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[2334]! } - public var ProfilePhoto_OpenInEditor: String { return self._s[2336]! } - public var WallpaperSearch_ColorPurple: String { return self._s[2337]! } - public var ChatListFolder_IncludeChatsTitle: String { return self._s[2338]! } - public var Group_Username_InvalidTooShort: String { return self._s[2339]! } - public var Location_ProximityNotification_DistanceM: String { return self._s[2340]! } + public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[2327]! } + public var Channel_DiscussionGroup: String { return self._s[2328]! } + public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[2329]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[2331]! } + public var VoiceOver_MessageContextForward: String { return self._s[2332]! } + public var SocksProxySetup_TypeNone: String { return self._s[2333]! } + public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[2335]! } + public var ProfilePhoto_OpenInEditor: String { return self._s[2337]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2338]! } + public var ChatListFolder_IncludeChatsTitle: String { return self._s[2339]! } + public var Group_Username_InvalidTooShort: String { return self._s[2340]! } + public var Location_ProximityNotification_DistanceM: String { return self._s[2341]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2341]!, self._r[2341]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[2342]!, self._r[2342]!, [_0, _1, _2]) } - public var Passport_Language_tk: String { return self._s[2342]! } - public var ConvertToSupergroup_Title: String { return self._s[2343]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[2344]! } - public var Cache_KeepMediaHelp: String { return self._s[2345]! } - public var Channel_Management_Title: String { return self._s[2346]! } + public var Passport_Language_tk: String { return self._s[2343]! } + public var ConvertToSupergroup_Title: String { return self._s[2344]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[2345]! } + public var Cache_KeepMediaHelp: String { return self._s[2346]! } + public var Channel_Management_Title: String { return self._s[2347]! } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2347]!, self._r[2347]!, [_1]) + return formatWithArgumentRanges(self._s[2348]!, self._r[2348]!, [_1]) } - public var Conversation_ForwardChats: String { return self._s[2348]! } - public var Passport_Language_bg: String { return self._s[2349]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2350]! } - public var Permissions_PrivacyPolicy: String { return self._s[2351]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2352]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[2353]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2354]! } - public var Conversation_ContextMenuOpenChannel: String { return self._s[2355]! } - public var Activity_UploadingVideo: String { return self._s[2356]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[2358]! } - public var Wallet_Sending_Text: String { return self._s[2359]! } - public var SocksProxySetup_Credentials: String { return self._s[2361]! } - public var Preview_SaveGif: String { return self._s[2362]! } - public var Cache_Photos: String { return self._s[2363]! } - public var Channel_AdminLogFilter_EventsCalls: String { return self._s[2364]! } - public var Conversation_ContextMenuCancelEditing: String { return self._s[2365]! } - public var Wallet_Intro_NotNow: String { return self._s[2366]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[2367]! } - public var Passport_Language_lt: String { return self._s[2368]! } - public var Passport_DeleteDocument: String { return self._s[2370]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2371]! } + public var Conversation_ForwardChats: String { return self._s[2349]! } + public var Passport_Language_bg: String { return self._s[2350]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2351]! } + public var Permissions_PrivacyPolicy: String { return self._s[2352]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2353]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[2354]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2355]! } + public var Conversation_ContextMenuOpenChannel: String { return self._s[2356]! } + public var Activity_UploadingVideo: String { return self._s[2357]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[2359]! } + public var Wallet_Sending_Text: String { return self._s[2360]! } + public var SocksProxySetup_Credentials: String { return self._s[2362]! } + public var Preview_SaveGif: String { return self._s[2363]! } + public var Cache_Photos: String { return self._s[2364]! } + public var Channel_AdminLogFilter_EventsCalls: String { return self._s[2365]! } + public var Conversation_ContextMenuCancelEditing: String { return self._s[2366]! } + public var Wallet_Intro_NotNow: String { return self._s[2367]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[2368]! } + public var Passport_Language_lt: String { return self._s[2369]! } + public var Passport_DeleteDocument: String { return self._s[2371]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2372]! } public func Location_ProximityNotification_NotifyLong(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2372]!, self._r[2372]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2373]!, self._r[2373]!, [_1, _2]) } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[2373]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[2374]! } public func PeopleNearby_VisibleUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2374]!, self._r[2374]!, [_0]) + return formatWithArgumentRanges(self._s[2375]!, self._r[2375]!, [_0]) } - public var AccessDenied_VideoCallCamera: String { return self._s[2375]! } + public var AccessDenied_VideoCallCamera: String { return self._s[2376]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2376]!, self._r[2376]!, [_0]) + return formatWithArgumentRanges(self._s[2377]!, self._r[2377]!, [_0]) } - public var PhotoEditor_SharpenTool: String { return self._s[2377]! } + public var PhotoEditor_SharpenTool: String { return self._s[2378]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2378]!, self._r[2378]!, [_1]) + return formatWithArgumentRanges(self._s[2379]!, self._r[2379]!, [_1]) } - public var DialogList_Unpin: String { return self._s[2379]! } - public var Stickers_NoStickersFound: String { return self._s[2380]! } - public var UserInfo_AddContact: String { return self._s[2382]! } + public var DialogList_Unpin: String { return self._s[2380]! } + public var Stickers_NoStickersFound: String { return self._s[2381]! } + public var UserInfo_AddContact: String { return self._s[2383]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2384]!, self._r[2384]!, [_0]) - } - public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2385]!, self._r[2385]!, [_0]) } - public var CallFeedback_VideoReasonDistorted: String { return self._s[2386]! } - public var Tour_Text2: String { return self._s[2387]! } + public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2386]!, self._r[2386]!, [_0]) + } + public var CallFeedback_VideoReasonDistorted: String { return self._s[2387]! } + public var Tour_Text2: String { return self._s[2388]! } public func Conversation_TitleCommentsFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2389]!, self._r[2389]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2390]!, self._r[2390]!, [_1, _2]) } - public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[2390]! } - public var Paint_Delete: String { return self._s[2392]! } + public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[2391]! } + public var Paint_Delete: String { return self._s[2393]! } public func Call_VoiceChatInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2393]!, self._r[2393]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2394]!, self._r[2394]!, [_1, _2]) } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2394]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2395]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2396]!, self._r[2396]!, [_0]) + return formatWithArgumentRanges(self._s[2397]!, self._r[2397]!, [_0]) } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2397]! } - public var Notification_CallOutgoingShort: String { return self._s[2398]! } - public var Checkout_PasswordEntry_Title: String { return self._s[2399]! } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[2400]! } - public var Notification_MessageLifetime1m: String { return self._s[2401]! } - public var Wallet_TransactionInfo_CommentHeader: String { return self._s[2403]! } - public var BlockedUsers_AddNew: String { return self._s[2404]! } - public var Wallet_Intro_CreateErrorText: String { return self._s[2405]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[2406]! } - public var Settings_SaveEditedPhotos: String { return self._s[2407]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[2408]! } - public var Channel_AboutItem: String { return self._s[2409]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[2410]! } - public var Privacy_Calls_P2PNever: String { return self._s[2412]! } - public var Wallet_Weekday_Yesterday: String { return self._s[2413]! } - public var Passport_Language_uk: String { return self._s[2414]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2415]! } - public var Conversation_Moderate_Report: String { return self._s[2416]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2417]! } - public var VoiceOver_Chat_SeenByRecipients: String { return self._s[2418]! } - public var Permissions_SiriText_v0: String { return self._s[2419]! } - public var Theme_Colors_Background: String { return self._s[2420]! } - public var Notification_CallMissed: String { return self._s[2421]! } - public var Stats_ZoomOut: String { return self._s[2422]! } - public var Profile_AddToExisting: String { return self._s[2423]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2426]! } - public var VoiceChat_RemovePeerRemove: String { return self._s[2427]! } - public var Undo_DeletedChannel: String { return self._s[2428]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2398]! } + public var Notification_CallOutgoingShort: String { return self._s[2399]! } + public var Checkout_PasswordEntry_Title: String { return self._s[2400]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[2401]! } + public var Notification_MessageLifetime1m: String { return self._s[2402]! } + public var Wallet_TransactionInfo_CommentHeader: String { return self._s[2404]! } + public var BlockedUsers_AddNew: String { return self._s[2405]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[2406]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[2407]! } + public var Settings_SaveEditedPhotos: String { return self._s[2408]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[2409]! } + public var Channel_AboutItem: String { return self._s[2410]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[2411]! } + public var Privacy_Calls_P2PNever: String { return self._s[2413]! } + public var Wallet_Weekday_Yesterday: String { return self._s[2414]! } + public var Passport_Language_uk: String { return self._s[2415]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2416]! } + public var Conversation_Moderate_Report: String { return self._s[2417]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2418]! } + public var VoiceOver_Chat_SeenByRecipients: String { return self._s[2419]! } + public var Permissions_SiriText_v0: String { return self._s[2420]! } + public var Theme_Colors_Background: String { return self._s[2421]! } + public var Notification_CallMissed: String { return self._s[2422]! } + public var Stats_ZoomOut: String { return self._s[2423]! } + public var Profile_AddToExisting: String { return self._s[2424]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2427]! } + public var VoiceChat_RemovePeerRemove: String { return self._s[2428]! } + public var Undo_DeletedChannel: String { return self._s[2429]! } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2429]!, self._r[2429]!, [_0]) + return formatWithArgumentRanges(self._s[2430]!, self._r[2430]!, [_0]) } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2430]! } - public var Map_LiveLocationGroupDescription: String { return self._s[2431]! } - public var Passport_InfoFAQ_URL: String { return self._s[2432]! } - public var IntentsSettings_SuggestedChats: String { return self._s[2434]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2431]! } + public var Map_LiveLocationGroupDescription: String { return self._s[2432]! } + public var Passport_InfoFAQ_URL: String { return self._s[2433]! } + public var IntentsSettings_SuggestedChats: String { return self._s[2435]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2435]!, self._r[2435]!, [_1]) + return formatWithArgumentRanges(self._s[2436]!, self._r[2436]!, [_1]) } - public var State_connecting: String { return self._s[2436]! } - public var Passport_Identity_Country: String { return self._s[2437]! } - public var Passport_PasswordDescription: String { return self._s[2438]! } - public var ChatList_PsaLabel_covid: String { return self._s[2439]! } + public var State_connecting: String { return self._s[2437]! } + public var Passport_Identity_Country: String { return self._s[2438]! } + public var Passport_PasswordDescription: String { return self._s[2439]! } + public var ChatList_PsaLabel_covid: String { return self._s[2440]! } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2440]!, self._r[2440]!, [_1]) + return formatWithArgumentRanges(self._s[2441]!, self._r[2441]!, [_1]) } - public var Contacts_AddPeopleNearby: String { return self._s[2441]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[2442]! } - public var ClearCache_Description: String { return self._s[2443]! } - public var Localization_LanguageName: String { return self._s[2444]! } + public var Contacts_AddPeopleNearby: String { return self._s[2442]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[2443]! } + public var ClearCache_Description: String { return self._s[2444]! } + public var Localization_LanguageName: String { return self._s[2445]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2445]!, self._r[2445]!, [_0]) + return formatWithArgumentRanges(self._s[2446]!, self._r[2446]!, [_0]) } - public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[2446]! } - public var UserInfo_CreateNewContact: String { return self._s[2447]! } - public var Channel_Stickers_NotFound: String { return self._s[2449]! } - public var Watch_Message_Poll: String { return self._s[2450]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[2451]! } + public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[2447]! } + public var UserInfo_CreateNewContact: String { return self._s[2448]! } + public var Channel_Stickers_NotFound: String { return self._s[2450]! } + public var Watch_Message_Poll: String { return self._s[2451]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[2452]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2452]!, self._r[2452]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_0, _1]) } - public var Login_InfoDeletePhoto: String { return self._s[2453]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[2454]! } - public var InstantPage_FeedbackButton: String { return self._s[2455]! } - public var Appearance_PreviewReplyText: String { return self._s[2456]! } - public var Passport_FieldPhoneHelp: String { return self._s[2457]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2458]! } - public var Media_SendingOptionsTooltip: String { return self._s[2459]! } - public var ScheduledMessages_ScheduledOnline: String { return self._s[2460]! } - public var Notifications_Badge: String { return self._s[2461]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[2462]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2463]! } - public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[2464]! } + public var Login_InfoDeletePhoto: String { return self._s[2454]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[2455]! } + public var InstantPage_FeedbackButton: String { return self._s[2456]! } + public var Appearance_PreviewReplyText: String { return self._s[2457]! } + public var Passport_FieldPhoneHelp: String { return self._s[2458]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2459]! } + public var Media_SendingOptionsTooltip: String { return self._s[2460]! } + public var ScheduledMessages_ScheduledOnline: String { return self._s[2461]! } + public var Notifications_Badge: String { return self._s[2462]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[2463]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2464]! } + public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[2465]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2466]!, self._r[2466]!, [_0]) + return formatWithArgumentRanges(self._s[2467]!, self._r[2467]!, [_0]) } - public var Wallet_Info_Send: String { return self._s[2467]! } - public var Passport_InfoLearnMore: String { return self._s[2468]! } - public var EnterPasscode_EnterTitle: String { return self._s[2469]! } - public var Appearance_EditTheme: String { return self._s[2470]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[2471]! } - public var Stats_FollowersTitle: String { return self._s[2472]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[2473]! } - public var Channel_Subscribers_Title: String { return self._s[2474]! } - public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2475]! } + public var Wallet_Info_Send: String { return self._s[2468]! } + public var Passport_InfoLearnMore: String { return self._s[2469]! } + public var EnterPasscode_EnterTitle: String { return self._s[2470]! } + public var Appearance_EditTheme: String { return self._s[2471]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[2472]! } + public var Stats_FollowersTitle: String { return self._s[2473]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[2474]! } + public var Channel_Subscribers_Title: String { return self._s[2475]! } + public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2476]! } public func Wallet_Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2476]!, self._r[2476]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2477]!, self._r[2477]!, [_1, _2, _3]) } - public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[2477]! } - public var Wallet_Intro_CreateWallet: String { return self._s[2478]! } - public var Conversation_AddToReadingList: String { return self._s[2479]! } - public var EditTheme_Create_Preview_IncomingText: String { return self._s[2480]! } + public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[2478]! } + public var Wallet_Intro_CreateWallet: String { return self._s[2479]! } + public var Conversation_AddToReadingList: String { return self._s[2480]! } + public var EditTheme_Create_Preview_IncomingText: String { return self._s[2481]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2481]!, self._r[2481]!, [_0]) + return formatWithArgumentRanges(self._s[2482]!, self._r[2482]!, [_0]) } - public var Group_AdminLog_EmptyText: String { return self._s[2482]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[2483]! } - public var Wallet_Sending_Title: String { return self._s[2484]! } - public var Watch_Location_Current: String { return self._s[2485]! } - public var PrivacyPolicy_Title: String { return self._s[2486]! } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2493]! } - public var Channel_TypeSetup_Title: String { return self._s[2496]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[2497]! } - public var Passport_Language_ja: String { return self._s[2498]! } - public var ReportPeer_ReasonSpam: String { return self._s[2499]! } - public var Widget_GalleryDescription: String { return self._s[2500]! } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[2501]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[2503]! } - public var Channel_AdminLog_ChangeInfo: String { return self._s[2504]! } - public var ChatListFolder_NameNonContacts: String { return self._s[2505]! } - public var Call_Audio: String { return self._s[2506]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2507]! } - public var Wallet_Updated_JustNow: String { return self._s[2508]! } - public var ChatList_Search_NoResultsFitlerFiles: String { return self._s[2509]! } - public var Settings_PrivacySettings: String { return self._s[2510]! } - public var Stats_Followers: String { return self._s[2511]! } - public var Notifications_AddExceptionTitle: String { return self._s[2512]! } - public var TwoFactorSetup_Password_Title: String { return self._s[2513]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2514]! } - public var OldChannels_NoticeText: String { return self._s[2515]! } - public var Conversation_SavedMessages: String { return self._s[2516]! } + public var Group_AdminLog_EmptyText: String { return self._s[2483]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[2484]! } + public var Wallet_Sending_Title: String { return self._s[2485]! } + public var Watch_Location_Current: String { return self._s[2486]! } + public var PrivacyPolicy_Title: String { return self._s[2487]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2494]! } + public var Channel_TypeSetup_Title: String { return self._s[2497]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[2498]! } + public var Passport_Language_ja: String { return self._s[2499]! } + public var ReportPeer_ReasonSpam: String { return self._s[2500]! } + public var Widget_GalleryDescription: String { return self._s[2501]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[2502]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[2504]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[2505]! } + public var ChatListFolder_NameNonContacts: String { return self._s[2506]! } + public var Call_Audio: String { return self._s[2507]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2508]! } + public var Wallet_Updated_JustNow: String { return self._s[2509]! } + public var ChatList_Search_NoResultsFitlerFiles: String { return self._s[2510]! } + public var Settings_PrivacySettings: String { return self._s[2511]! } + public var Stats_Followers: String { return self._s[2512]! } + public var Notifications_AddExceptionTitle: String { return self._s[2513]! } + public var TwoFactorSetup_Password_Title: String { return self._s[2514]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2515]! } + public var OldChannels_NoticeText: String { return self._s[2516]! } + public var Conversation_SavedMessages: String { return self._s[2517]! } public func Conversation_PeerNearbyTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2518]!, self._r[2518]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2519]!, self._r[2519]!, [_1, _2]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2519]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2520]! } public func Wallet_Info_TransactionBlockchainFee(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2520]!, self._r[2520]!, [_0]) + return formatWithArgumentRanges(self._s[2521]!, self._r[2521]!, [_0]) } - public var Appearance_ThemeNightBlue: String { return self._s[2521]! } - public var Notification_ChannelInviterSelf: String { return self._s[2522]! } - public var Watch_UserInfo_Service: String { return self._s[2524]! } - public var ChatList_Context_Back: String { return self._s[2525]! } - public var Passport_Email_Title: String { return self._s[2526]! } - public var Wallet_Month_ShortDecember: String { return self._s[2527]! } - public var Stats_GroupTopAdmin_Promote: String { return self._s[2528]! } + public var Appearance_ThemeNightBlue: String { return self._s[2522]! } + public var Notification_ChannelInviterSelf: String { return self._s[2523]! } + public var Watch_UserInfo_Service: String { return self._s[2525]! } + public var ChatList_Context_Back: String { return self._s[2526]! } + public var Passport_Email_Title: String { return self._s[2527]! } + public var Wallet_Month_ShortDecember: String { return self._s[2528]! } + public var Stats_GroupTopAdmin_Promote: String { return self._s[2529]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2529]!, self._r[2529]!, [_1]) + return formatWithArgumentRanges(self._s[2530]!, self._r[2530]!, [_1]) } - public var Conversation_UnsupportedMedia: String { return self._s[2530]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2531]! } - public var Privacy_TopPeersHelp: String { return self._s[2533]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[2534]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2535]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[2536]! } + public var Conversation_UnsupportedMedia: String { return self._s[2531]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2532]! } + public var Privacy_TopPeersHelp: String { return self._s[2534]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[2535]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2536]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[2537]! } public func Location_ProximityNotification_AlreadyClose(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2537]!, self._r[2537]!, [_0]) + return formatWithArgumentRanges(self._s[2538]!, self._r[2538]!, [_0]) } - public var Notification_PassportValueProofOfAddress: String { return self._s[2538]! } - public var Map_Map: String { return self._s[2539]! } - public var WallpaperSearch_ColorBlue: String { return self._s[2540]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[2541]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2542]! } - public var ChatList_Search_FilterMusic: String { return self._s[2543]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[2544]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2545]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[2547]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[2539]! } + public var Map_Map: String { return self._s[2540]! } + public var WallpaperSearch_ColorBlue: String { return self._s[2541]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[2542]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2543]! } + public var ChatList_Search_FilterMusic: String { return self._s[2544]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[2545]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2546]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[2548]! } public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2548]!, self._r[2548]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2549]!, self._r[2549]!, [_1, _2]) } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2549]!, self._r[2549]!, [_0]) + return formatWithArgumentRanges(self._s[2550]!, self._r[2550]!, [_0]) } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2550]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2551]! } - public var GroupInfo_Location: String { return self._s[2554]! } - public var Passport_Language_ka: String { return self._s[2555]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2551]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2552]! } + public var GroupInfo_Location: String { return self._s[2555]! } + public var Passport_Language_ka: String { return self._s[2556]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2556]!, self._r[2556]!, [_0]) + return formatWithArgumentRanges(self._s[2557]!, self._r[2557]!, [_0]) } - public var Conversation_ContextMenuOpenChannelProfile: String { return self._s[2557]! } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[2560]! } - public var DialogList_SearchSectionRecent: String { return self._s[2561]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[2562]! } - public var Conversation_Timer_Send: String { return self._s[2563]! } - public var ChatState_Updating: String { return self._s[2565]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[2566]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2567]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[2568]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2569]! } - public var ChatListFolderSettings_AddRecommended: String { return self._s[2571]! } - public var ChatList_Search_NoResults: String { return self._s[2572]! } - public var ChangePhoneNumberCode_Called: String { return self._s[2573]! } - public var PeerInfo_GroupAboutItem: String { return self._s[2574]! } - public var Wallet_Info_YourBalance: String { return self._s[2576]! } + public var Conversation_ContextMenuOpenChannelProfile: String { return self._s[2558]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[2561]! } + public var DialogList_SearchSectionRecent: String { return self._s[2562]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[2563]! } + public var Conversation_Timer_Send: String { return self._s[2564]! } + public var ChatState_Updating: String { return self._s[2566]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[2567]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2568]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[2569]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2570]! } + public var ChatListFolderSettings_AddRecommended: String { return self._s[2572]! } + public var ChatList_Search_NoResults: String { return self._s[2573]! } + public var ChangePhoneNumberCode_Called: String { return self._s[2574]! } + public var PeerInfo_GroupAboutItem: String { return self._s[2575]! } + public var Wallet_Info_YourBalance: String { return self._s[2577]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2577]!, self._r[2577]!, [_0]) + return formatWithArgumentRanges(self._s[2578]!, self._r[2578]!, [_0]) } - public var PrivacySettings_AuthSessions: String { return self._s[2578]! } - public var Passport_Address_Postcode: String { return self._s[2579]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2580]! } - public var Passport_Address_Street2Placeholder: String { return self._s[2581]! } - public var Group_Location_Title: String { return self._s[2582]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[2583]! } - public var PeopleNearby_UsersEmpty: String { return self._s[2584]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[2586]! } + public var PrivacySettings_AuthSessions: String { return self._s[2579]! } + public var Passport_Address_Postcode: String { return self._s[2580]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2581]! } + public var Passport_Address_Street2Placeholder: String { return self._s[2582]! } + public var Group_Location_Title: String { return self._s[2583]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[2584]! } + public var PeopleNearby_UsersEmpty: String { return self._s[2585]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[2587]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2588]!, self._r[2588]!, [_0]) + return formatWithArgumentRanges(self._s[2589]!, self._r[2589]!, [_0]) } - public var Proxy_TooltipUnavailable: String { return self._s[2589]! } - public var Map_Search: String { return self._s[2590]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2591]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2592]! } + public var Proxy_TooltipUnavailable: String { return self._s[2590]! } + public var Map_Search: String { return self._s[2591]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2592]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2593]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2593]!, self._r[2593]!, [_0]) + return formatWithArgumentRanges(self._s[2594]!, self._r[2594]!, [_0]) } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[2594]! } - public var ProfilePhoto_MainPhoto: String { return self._s[2595]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2596]! } - public var SharedMedia_EmptyMusicText: String { return self._s[2597]! } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[2598]! } - public var NetworkUsageSettings_BytesReceived: String { return self._s[2599]! } - public var Channel_AdminLog_EmptyText: String { return self._s[2600]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2601]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[2602]! } - public var Notifications_GroupNotifications: String { return self._s[2603]! } - public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[2604]! } - public var Wallet_AccessDenied_Title: String { return self._s[2605]! } - public var AccessDenied_SaveMedia: String { return self._s[2606]! } - public var GroupInfo_LabelOwner: String { return self._s[2607]! } - public var Passport_Language_id: String { return self._s[2608]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2609]! } - public var Conversation_UnpinMessageAlert: String { return self._s[2610]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[2595]! } + public var ProfilePhoto_MainPhoto: String { return self._s[2596]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2597]! } + public var SharedMedia_EmptyMusicText: String { return self._s[2598]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[2599]! } + public var NetworkUsageSettings_BytesReceived: String { return self._s[2600]! } + public var Channel_AdminLog_EmptyText: String { return self._s[2601]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2602]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[2603]! } + public var Notifications_GroupNotifications: String { return self._s[2604]! } + public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[2605]! } + public var Wallet_AccessDenied_Title: String { return self._s[2606]! } + public var AccessDenied_SaveMedia: String { return self._s[2607]! } + public var GroupInfo_LabelOwner: String { return self._s[2608]! } + public var Passport_Language_id: String { return self._s[2609]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2610]! } + public var Conversation_UnpinMessageAlert: String { return self._s[2611]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2611]!, self._r[2611]!, [_0]) - } - public func Call_RemoteVideoPaused(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2612]!, self._r[2612]!, [_0]) } - public var TwoFactorSetup_Done_Text: String { return self._s[2613]! } + public func Call_RemoteVideoPaused(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2613]!, self._r[2613]!, [_0]) + } + public var TwoFactorSetup_Done_Text: String { return self._s[2614]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2614]!, self._r[2614]!, [_0]) + return formatWithArgumentRanges(self._s[2615]!, self._r[2615]!, [_0]) } - public var Wallet_Words_Title: String { return self._s[2615]! } - public var NetworkUsageSettings_BytesSent: String { return self._s[2616]! } - public var OwnershipTransfer_Transfer: String { return self._s[2617]! } + public var Wallet_Words_Title: String { return self._s[2616]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[2617]! } + public var OwnershipTransfer_Transfer: String { return self._s[2618]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2618]!, self._r[2618]!, [_0]) + return formatWithArgumentRanges(self._s[2619]!, self._r[2619]!, [_0]) } - public var Passport_Language_pt: String { return self._s[2619]! } - public var PrivacySettings_WebSessions: String { return self._s[2620]! } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[2622]! } - public var TwoFactorSetup_Hint_Title: String { return self._s[2623]! } + public var Passport_Language_pt: String { return self._s[2620]! } + public var PrivacySettings_WebSessions: String { return self._s[2621]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[2623]! } + public var TwoFactorSetup_Hint_Title: String { return self._s[2624]! } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_0]) + return formatWithArgumentRanges(self._s[2625]!, self._r[2625]!, [_0]) } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2625]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2626]! } - public var AutoNightTheme_Scheduled: String { return self._s[2627]! } - public var CreatePoll_ExplanationHeader: String { return self._s[2628]! } - public var Calls_TabTitle: String { return self._s[2629]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[2630]! } - public var Notification_VideoCallCanceled: String { return self._s[2631]! } - public var Login_CodeSentInternal: String { return self._s[2632]! } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[2633]! } - public var Call_RecordingDisabledMessage: String { return self._s[2635]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2626]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2627]! } + public var AutoNightTheme_Scheduled: String { return self._s[2628]! } + public var CreatePoll_ExplanationHeader: String { return self._s[2629]! } + public var Calls_TabTitle: String { return self._s[2630]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[2631]! } + public var Notification_VideoCallCanceled: String { return self._s[2632]! } + public var Login_CodeSentInternal: String { return self._s[2633]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[2634]! } + public var Call_RecordingDisabledMessage: String { return self._s[2636]! } public func VoiceChat_RemovedPeerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2636]!, self._r[2636]!, [_0]) + return formatWithArgumentRanges(self._s[2637]!, self._r[2637]!, [_0]) } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2638]! } - public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[2639]! } - public var Channel_Info_Stickers: String { return self._s[2640]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[2641]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2639]! } + public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[2640]! } + public var Channel_Info_Stickers: String { return self._s[2641]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[2642]! } public func Conversation_PeerNearbyDistance(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2642]!, self._r[2642]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2643]!, self._r[2643]!, [_1, _2]) } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[2643]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[2644]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_0]) + return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_0]) } - public var Passport_DiscardMessageTitle: String { return self._s[2645]! } - public var Localization_LanguageOther: String { return self._s[2646]! } - public var Conversation_EncryptionCanceled: String { return self._s[2647]! } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[2648]! } + public var Passport_DiscardMessageTitle: String { return self._s[2646]! } + public var Localization_LanguageOther: String { return self._s[2647]! } + public var Conversation_EncryptionCanceled: String { return self._s[2648]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[2649]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2650]!, self._r[2650]!, [_0]) + return formatWithArgumentRanges(self._s[2651]!, self._r[2651]!, [_0]) } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2652]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2653]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2653]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2654]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2654]!, self._r[2654]!, [_1]) + return formatWithArgumentRanges(self._s[2655]!, self._r[2655]!, [_1]) } - public var Conversation_ScamWarning: String { return self._s[2656]! } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[2657]! } - public var LocalGroup_Title: String { return self._s[2658]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[2660]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[2661]! } - public var Login_PhoneFloodError: String { return self._s[2662]! } - public var Conversation_PinMessageAlert_PinAndNotifyMembers: String { return self._s[2663]! } - public var Username_InvalidTaken: String { return self._s[2665]! } - public var SocksProxySetup_AddProxy: String { return self._s[2667]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[2668]! } - public var MediaPicker_UngroupDescription: String { return self._s[2669]! } - public var Login_CodeExpired: String { return self._s[2670]! } - public var Localization_ChooseLanguage: String { return self._s[2671]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[2672]! } + public var Conversation_ScamWarning: String { return self._s[2657]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[2658]! } + public var LocalGroup_Title: String { return self._s[2659]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[2661]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[2662]! } + public var Login_PhoneFloodError: String { return self._s[2663]! } + public var Conversation_PinMessageAlert_PinAndNotifyMembers: String { return self._s[2664]! } + public var Username_InvalidTaken: String { return self._s[2666]! } + public var SocksProxySetup_AddProxy: String { return self._s[2668]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[2669]! } + public var MediaPicker_UngroupDescription: String { return self._s[2670]! } + public var Login_CodeExpired: String { return self._s[2671]! } + public var Localization_ChooseLanguage: String { return self._s[2672]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[2673]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2673]!, self._r[2673]!, [_0]) - } - public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2674]!, self._r[2674]!, [_0]) } - public var ReportPeer_ReasonOther_Title: String { return self._s[2676]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[2677]! } + public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2675]!, self._r[2675]!, [_0]) + } + public var ReportPeer_ReasonOther_Title: String { return self._s[2677]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[2678]! } public func VoiceChat_UserInvited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2678]!, self._r[2678]!, [_0]) + return formatWithArgumentRanges(self._s[2679]!, self._r[2679]!, [_0]) } - public var PeerInfo_ButtonDiscuss: String { return self._s[2679]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[2680]! } - public var Call_StatusNoAnswer: String { return self._s[2681]! } - public var ScheduledMessages_DeleteMany: String { return self._s[2683]! } - public var Channel_DiscussionGroupInfo: String { return self._s[2684]! } - public var Conversation_UnarchiveDone: String { return self._s[2685]! } - public var LogoutOptions_AddAccountText: String { return self._s[2686]! } - public var Message_PinnedContactMessage: String { return self._s[2687]! } + public var PeerInfo_ButtonDiscuss: String { return self._s[2680]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[2681]! } + public var Call_StatusNoAnswer: String { return self._s[2682]! } + public var ScheduledMessages_DeleteMany: String { return self._s[2684]! } + public var Channel_DiscussionGroupInfo: String { return self._s[2685]! } + public var Conversation_UnarchiveDone: String { return self._s[2686]! } + public var LogoutOptions_AddAccountText: String { return self._s[2687]! } + public var Message_PinnedContactMessage: String { return self._s[2688]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_0]) + return formatWithArgumentRanges(self._s[2690]!, self._r[2690]!, [_0]) } - public var Stats_GroupLanguagesTitle: String { return self._s[2690]! } - public var Passport_FieldAddressHelp: String { return self._s[2691]! } + public var Stats_GroupLanguagesTitle: String { return self._s[2691]! } + public var Passport_FieldAddressHelp: String { return self._s[2692]! } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2692]!, self._r[2692]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2693]!, self._r[2693]!, [_1, _2]) } - public var ChatSettings_OpenLinksIn: String { return self._s[2694]! } - public var TwoFactorSetup_Hint_SkipAction: String { return self._s[2695]! } - public var Message_Photo: String { return self._s[2696]! } - public var Media_LimitedAccessManage: String { return self._s[2698]! } - public var MediaPicker_AddCaption: String { return self._s[2699]! } - public var LogoutOptions_Title: String { return self._s[2700]! } + public var ChatSettings_OpenLinksIn: String { return self._s[2695]! } + public var TwoFactorSetup_Hint_SkipAction: String { return self._s[2696]! } + public var Message_Photo: String { return self._s[2697]! } + public var Media_LimitedAccessManage: String { return self._s[2699]! } + public var MediaPicker_AddCaption: String { return self._s[2700]! } + public var LogoutOptions_Title: String { return self._s[2701]! } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2701]!, self._r[2701]!, [_1]) + return formatWithArgumentRanges(self._s[2702]!, self._r[2702]!, [_1]) } - public var Conversation_StatusKickedFromGroup: String { return self._s[2702]! } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[2703]! } - public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2704]! } - public var Channel_AdminLogFilter_Title: String { return self._s[2705]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[2706]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[2703]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[2704]! } + public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2705]! } + public var Channel_AdminLogFilter_Title: String { return self._s[2706]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[2707]! } public func Wallet_Info_TransactionDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2707]!, self._r[2707]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2708]!, self._r[2708]!, [_1, _2]) } - public var Compose_GroupTokenListPlaceholder: String { return self._s[2708]! } - public var Wallet_Words_NotDoneResponse: String { return self._s[2709]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2710]! } - public var ChannelIntro_Title: String { return self._s[2711]! } - public var Stats_Message_Views: String { return self._s[2712]! } - public var Stickers_Install: String { return self._s[2713]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[2709]! } + public var Wallet_Words_NotDoneResponse: String { return self._s[2710]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2711]! } + public var ChannelIntro_Title: String { return self._s[2712]! } + public var Stats_Message_Views: String { return self._s[2713]! } + public var Stickers_Install: String { return self._s[2714]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2714]!, self._r[2714]!, [_0]) + return formatWithArgumentRanges(self._s[2715]!, self._r[2715]!, [_0]) } - public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[2715]! } - public var Conversation_SwipeToReplyHintTitle: String { return self._s[2717]! } - public var Settings_Username: String { return self._s[2720]! } - public var FastTwoStepSetup_Title: String { return self._s[2721]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2722]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[2723]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2724]! } - public var CallFeedback_ReasonEcho: String { return self._s[2725]! } + public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[2716]! } + public var Conversation_SwipeToReplyHintTitle: String { return self._s[2718]! } + public var Settings_Username: String { return self._s[2721]! } + public var FastTwoStepSetup_Title: String { return self._s[2722]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2723]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[2724]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2725]! } + public var CallFeedback_ReasonEcho: String { return self._s[2726]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2726]!, self._r[2726]!, [_0]) + return formatWithArgumentRanges(self._s[2727]!, self._r[2727]!, [_0]) } - public var Conversation_OpenBotLinkTitle: String { return self._s[2727]! } - public var SocksProxySetup_Title: String { return self._s[2728]! } - public var CallFeedback_Success: String { return self._s[2729]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[2731]! } - public var InstantPage_AutoNightTheme: String { return self._s[2733]! } - public var Watch_Conversation_Reply: String { return self._s[2734]! } - public var VoiceChat_Share: String { return self._s[2736]! } - public var Chat_PanelUnpinAllMessages: String { return self._s[2737]! } - public var WallpaperPreview_Pattern: String { return self._s[2738]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[2739]! } - public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[2740]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[2728]! } + public var SocksProxySetup_Title: String { return self._s[2729]! } + public var CallFeedback_Success: String { return self._s[2730]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[2732]! } + public var InstantPage_AutoNightTheme: String { return self._s[2734]! } + public var Watch_Conversation_Reply: String { return self._s[2735]! } + public var VoiceChat_Share: String { return self._s[2737]! } + public var Chat_PanelUnpinAllMessages: String { return self._s[2738]! } + public var WallpaperPreview_Pattern: String { return self._s[2739]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[2740]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[2741]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2741]!, self._r[2741]!, [_0]) + return formatWithArgumentRanges(self._s[2742]!, self._r[2742]!, [_0]) } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[2742]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[2744]! } - public var Update_Title: String { return self._s[2745]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[2746]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[2743]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[2745]! } + public var Update_Title: String { return self._s[2746]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[2747]! } public func Wallet_WordCheck_Text(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2747]!, self._r[2747]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2748]!, self._r[2748]!, [_1, _2, _3]) } - public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2748]! } - public var WallpaperPreview_CropTopText: String { return self._s[2750]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[2751]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2752]! } - public var ChatListFolder_DiscardCancel: String { return self._s[2753]! } - public var Message_PinnedPhotoMessage: String { return self._s[2754]! } - public var Appearance_ThemeDayClassic: String { return self._s[2755]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[2756]! } - public var AccessDenied_Wallpapers: String { return self._s[2762]! } + public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2749]! } + public var WallpaperPreview_CropTopText: String { return self._s[2751]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[2752]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2753]! } + public var ChatListFolder_DiscardCancel: String { return self._s[2754]! } + public var Message_PinnedPhotoMessage: String { return self._s[2755]! } + public var Appearance_ThemeDayClassic: String { return self._s[2756]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[2757]! } + public var AccessDenied_Wallpapers: String { return self._s[2763]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2763]!, self._r[2763]!, [_0]) + return formatWithArgumentRanges(self._s[2764]!, self._r[2764]!, [_0]) } - public var Weekday_Sunday: String { return self._s[2764]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[2766]! } - public var PeopleNearby_MakeVisibleDescription: String { return self._s[2767]! } - public var AccessDenied_LocationDisabled: String { return self._s[2768]! } - public var Tour_Text3: String { return self._s[2769]! } - public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2770]! } + public var Weekday_Sunday: String { return self._s[2765]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[2767]! } + public var PeopleNearby_MakeVisibleDescription: String { return self._s[2768]! } + public var AccessDenied_LocationDisabled: String { return self._s[2769]! } + public var Tour_Text3: String { return self._s[2770]! } + public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2771]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2771]!, self._r[2771]!, [_0]) + return formatWithArgumentRanges(self._s[2772]!, self._r[2772]!, [_0]) } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2772]! } - public var Conversation_ClearCache: String { return self._s[2773]! } - public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[2774]! } - public var ChatList_Tabs_AllChats: String { return self._s[2775]! } - public var DialogList_RecentTitlePeople: String { return self._s[2776]! } - public var Stickers_AddToFavorites: String { return self._s[2777]! } - public var ChatList_Context_RemoveFromFolder: String { return self._s[2778]! } - public var Settings_RemoveVideo: String { return self._s[2779]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2780]! } - public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[2781]! } - public var VoiceOver_Chat_YourFile: String { return self._s[2782]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[2783]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[2784]! } - public var Channel_AdminLog_AddMembers: String { return self._s[2785]! } - public var Map_SendThisLocation: String { return self._s[2787]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[2789]! } - public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2790]! } - public var CloudStorage_Title: String { return self._s[2791]! } - public var TwoFactorSetup_Password_Action: String { return self._s[2792]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[2793]! } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[2795]! } - public var Undo_LeftGroup: String { return self._s[2796]! } - public var Conversation_StopLiveLocation: String { return self._s[2798]! } - public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[2799]! } - public var Message_PinnedInvoice: String { return self._s[2800]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[2801]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2773]! } + public var Conversation_ClearCache: String { return self._s[2774]! } + public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[2775]! } + public var ChatList_Tabs_AllChats: String { return self._s[2776]! } + public var DialogList_RecentTitlePeople: String { return self._s[2777]! } + public var Stickers_AddToFavorites: String { return self._s[2778]! } + public var ChatList_Context_RemoveFromFolder: String { return self._s[2779]! } + public var Settings_RemoveVideo: String { return self._s[2780]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2781]! } + public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[2782]! } + public var VoiceOver_Chat_YourFile: String { return self._s[2783]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[2784]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[2785]! } + public var Channel_AdminLog_AddMembers: String { return self._s[2786]! } + public var Map_SendThisLocation: String { return self._s[2788]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[2790]! } + public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2791]! } + public var CloudStorage_Title: String { return self._s[2792]! } + public var TwoFactorSetup_Password_Action: String { return self._s[2793]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[2794]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[2796]! } + public var Undo_LeftGroup: String { return self._s[2797]! } + public var Conversation_StopLiveLocation: String { return self._s[2799]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[2800]! } + public var Message_PinnedInvoice: String { return self._s[2801]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[2802]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2802]!, self._r[2802]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2803]!, self._r[2803]!, [_1, _2]) } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2803]!, self._r[2803]!, [_0]) + return formatWithArgumentRanges(self._s[2804]!, self._r[2804]!, [_0]) } - public var Weekday_Tuesday: String { return self._s[2804]! } - public var ChangePhoneNumberCode_Code: String { return self._s[2805]! } - public var VoiceOver_Chat_YourMessage: String { return self._s[2806]! } - public var Calls_CallTabDescription: String { return self._s[2807]! } - public var SocksProxySetup_UseProxy: String { return self._s[2809]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2810]! } - public var PasscodeSettings_AlphanumericCode: String { return self._s[2811]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[2812]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[2814]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2815]! } - public var Exceptions_AddToExceptions: String { return self._s[2816]! } - public var UserInfo_Title: String { return self._s[2817]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[2819]! } - public var ChatList_Unmute: String { return self._s[2821]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[2822]! } - public var Stats_GroupTopPostersTitle: String { return self._s[2823]! } - public var Username_CheckingUsername: String { return self._s[2824]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2825]! } - public var AuthSessions_AddedDeviceTerminate: String { return self._s[2829]! } - public var Location_ProximityAlertSetTitle: String { return self._s[2830]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[2831]! } - public var Settings_ChangePhoneNumber: String { return self._s[2832]! } - public var PeerInfo_PaneLinks: String { return self._s[2833]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2836]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[2838]! } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[2839]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[2840]! } - public var Wallet_RestoreFailed_Title: String { return self._s[2841]! } - public var Stats_FollowersBySourceTitle: String { return self._s[2843]! } + public var Weekday_Tuesday: String { return self._s[2805]! } + public var ChangePhoneNumberCode_Code: String { return self._s[2806]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[2807]! } + public var Calls_CallTabDescription: String { return self._s[2808]! } + public var SocksProxySetup_UseProxy: String { return self._s[2810]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2811]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[2812]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[2813]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[2815]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2816]! } + public var Exceptions_AddToExceptions: String { return self._s[2817]! } + public var UserInfo_Title: String { return self._s[2818]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[2820]! } + public var ChatList_Unmute: String { return self._s[2822]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[2823]! } + public var Stats_GroupTopPostersTitle: String { return self._s[2824]! } + public var Username_CheckingUsername: String { return self._s[2825]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2826]! } + public var AuthSessions_AddedDeviceTerminate: String { return self._s[2830]! } + public var Location_ProximityAlertSetTitle: String { return self._s[2831]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[2832]! } + public var Settings_ChangePhoneNumber: String { return self._s[2833]! } + public var PeerInfo_PaneLinks: String { return self._s[2834]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2837]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[2839]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[2840]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[2841]! } + public var Wallet_RestoreFailed_Title: String { return self._s[2842]! } + public var Stats_FollowersBySourceTitle: String { return self._s[2844]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2844]!, self._r[2844]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2845]!, self._r[2845]!, [_0, _1]) } - public var Compose_NewEncryptedChatTitle: String { return self._s[2845]! } - public var Channel_CommentsGroup_Header: String { return self._s[2847]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[2846]! } + public var Channel_CommentsGroup_Header: String { return self._s[2848]! } public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2851]!, self._r[2851]!, [_0]) + return formatWithArgumentRanges(self._s[2852]!, self._r[2852]!, [_0]) } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2852]!, self._r[2852]!, [_1]) + return formatWithArgumentRanges(self._s[2853]!, self._r[2853]!, [_1]) } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[2854]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[2855]! } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2855]!, self._r[2855]!, [_0]) + return formatWithArgumentRanges(self._s[2856]!, self._r[2856]!, [_0]) } - public var Conversation_OpenBotLinkOpen: String { return self._s[2856]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[2857]! } - public var PrivacySettings_LastSeen: String { return self._s[2859]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[2860]! } - public var Theme_Colors_Proceed: String { return self._s[2861]! } - public var UserInfo_ScamBotWarning: String { return self._s[2862]! } - public var LogoutOptions_LogOut: String { return self._s[2864]! } - public var Conversation_SendMessage: String { return self._s[2865]! } - public var Passport_Address_Region: String { return self._s[2867]! } - public var MediaPicker_CameraRoll: String { return self._s[2869]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[2857]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[2858]! } + public var PrivacySettings_LastSeen: String { return self._s[2860]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[2861]! } + public var Theme_Colors_Proceed: String { return self._s[2862]! } + public var UserInfo_ScamBotWarning: String { return self._s[2863]! } + public var LogoutOptions_LogOut: String { return self._s[2865]! } + public var Conversation_SendMessage: String { return self._s[2866]! } + public var Passport_Address_Region: String { return self._s[2868]! } + public var MediaPicker_CameraRoll: String { return self._s[2870]! } public func VoiceOver_Chat_ForwardedFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2871]!, self._r[2871]!, [_0]) + return formatWithArgumentRanges(self._s[2872]!, self._r[2872]!, [_0]) } - public var Call_ReportSend: String { return self._s[2873]! } - public var Month_ShortJune: String { return self._s[2874]! } - public var AutoDownloadSettings_GroupChats: String { return self._s[2875]! } + public var Call_ReportSend: String { return self._s[2874]! } + public var Month_ShortJune: String { return self._s[2875]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[2876]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2878]!, self._r[2878]!, [_0]) + return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) } - public var TwoStepAuth_DisableSuccess: String { return self._s[2879]! } - public var Cache_KeepMedia: String { return self._s[2880]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[2880]! } + public var Cache_KeepMedia: String { return self._s[2881]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2882]!, self._r[2882]!, [_1, _2, _3]) } - public var Wallet_Alert_OK: String { return self._s[2882]! } - public var Appearance_LargeEmoji: String { return self._s[2883]! } + public var Wallet_Alert_OK: String { return self._s[2883]! } + public var Appearance_LargeEmoji: String { return self._s[2884]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2884]!, self._r[2884]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[2885]!, self._r[2885]!, [_1, _2, _3, _4, _5, _6]) } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2885]! } - public var Wallet_Navigation_Close: String { return self._s[2886]! } - public var Call_CameraConfirmationText: String { return self._s[2887]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2886]! } + public var Wallet_Navigation_Close: String { return self._s[2887]! } + public var Call_CameraConfirmationText: String { return self._s[2888]! } public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2889]!, self._r[2889]!, [_0]) + return formatWithArgumentRanges(self._s[2890]!, self._r[2890]!, [_0]) } - public var VoiceOver_MessageContextReport: String { return self._s[2891]! } - public var VoiceChat_RemovePeer: String { return self._s[2892]! } - public var ChatListFolder_ExcludeChatsTitle: String { return self._s[2893]! } - public var NotificationsSound_Tritone: String { return self._s[2895]! } - public var Wallet_Configuration_BlockchainIdHeader: String { return self._s[2896]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2899]! } - public var Stats_GroupTopAdmin_Actions: String { return self._s[2900]! } - public var PeerInfo_AddToContacts: String { return self._s[2901]! } - public var AccessDenied_Title: String { return self._s[2902]! } - public var Tour_Title1: String { return self._s[2903]! } - public var VoiceOver_AttachMedia: String { return self._s[2904]! } + public var VoiceOver_MessageContextReport: String { return self._s[2892]! } + public var VoiceChat_RemovePeer: String { return self._s[2893]! } + public var ChatListFolder_ExcludeChatsTitle: String { return self._s[2894]! } + public var NotificationsSound_Tritone: String { return self._s[2896]! } + public var Wallet_Configuration_BlockchainIdHeader: String { return self._s[2897]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2900]! } + public var Stats_GroupTopAdmin_Actions: String { return self._s[2901]! } + public var PeerInfo_AddToContacts: String { return self._s[2902]! } + public var AccessDenied_Title: String { return self._s[2903]! } + public var Tour_Title1: String { return self._s[2904]! } + public var VoiceOver_AttachMedia: String { return self._s[2905]! } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2906]!, self._r[2906]!, [_0]) + return formatWithArgumentRanges(self._s[2907]!, self._r[2907]!, [_0]) } - public var Chat_Gifs_SavedSectionHeader: String { return self._s[2907]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2908]! } + public var Chat_Gifs_SavedSectionHeader: String { return self._s[2908]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2909]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2909]!, self._r[2909]!, [_0]) + return formatWithArgumentRanges(self._s[2910]!, self._r[2910]!, [_0]) } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[2910]! } - public var Wallet_Send_AddressText: String { return self._s[2911]! } - public var OldChannels_Title: String { return self._s[2912]! } - public var LoginPassword_FloodError: String { return self._s[2913]! } - public var Checkout_ErrorPaymentFailed: String { return self._s[2915]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[2911]! } + public var Wallet_Send_AddressText: String { return self._s[2912]! } + public var OldChannels_Title: String { return self._s[2913]! } + public var LoginPassword_FloodError: String { return self._s[2914]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[2916]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2916]!, self._r[2916]!, [_0]) + return formatWithArgumentRanges(self._s[2917]!, self._r[2917]!, [_0]) } - public var VoiceOver_Media_PlaybackPlay: String { return self._s[2919]! } - public var Passport_CorrectErrors: String { return self._s[2921]! } + public var VoiceOver_Media_PlaybackPlay: String { return self._s[2920]! } + public var Passport_CorrectErrors: String { return self._s[2922]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2922]!, self._r[2922]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2923]!, self._r[2923]!, [_1, _2]) } - public var ChatListFolderSettings_Title: String { return self._s[2923]! } + public var ChatListFolderSettings_Title: String { return self._s[2924]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2924]!, self._r[2924]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2925]!, self._r[2925]!, [_1, _2]) } - public var PhotoEditor_HighlightsTool: String { return self._s[2925]! } - public var Contacts_NotRegisteredSection: String { return self._s[2928]! } + public var PhotoEditor_HighlightsTool: String { return self._s[2926]! } + public var Contacts_NotRegisteredSection: String { return self._s[2929]! } public func Call_VoiceChatInProgressCallMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2929]!, self._r[2929]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2930]!, self._r[2930]!, [_1, _2]) } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2930]!, self._r[2930]!, [_1]) + return formatWithArgumentRanges(self._s[2931]!, self._r[2931]!, [_1]) } - public var User_DeletedAccount: String { return self._s[2931]! } - public var Conversation_ViewContactDetails: String { return self._s[2932]! } - public var Conversation_Dice_u1F3B3: String { return self._s[2933]! } - public var WebSearch_GIFs: String { return self._s[2934]! } - public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2935]! } - public var Appearance_PreviewOutgoingText: String { return self._s[2936]! } - public var Calls_CallTabTitle: String { return self._s[2937]! } - public var Call_VoiceChatInProgressTitle: String { return self._s[2938]! } + public var User_DeletedAccount: String { return self._s[2932]! } + public var Conversation_ViewContactDetails: String { return self._s[2933]! } + public var Conversation_Dice_u1F3B3: String { return self._s[2934]! } + public var WebSearch_GIFs: String { return self._s[2935]! } + public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2936]! } + public var Appearance_PreviewOutgoingText: String { return self._s[2937]! } + public var Calls_CallTabTitle: String { return self._s[2938]! } + public var Call_VoiceChatInProgressTitle: String { return self._s[2939]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2939]!, self._r[2939]!, [_0]) + return formatWithArgumentRanges(self._s[2940]!, self._r[2940]!, [_0]) } - public var Channel_Status: String { return self._s[2940]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[2942]! } - public var VoiceOver_Chat_OptionSelected: String { return self._s[2943]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2944]! } + public var Channel_Status: String { return self._s[2941]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[2943]! } + public var VoiceOver_Chat_OptionSelected: String { return self._s[2944]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2945]! } public func ClearCache_Success(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2945]!, self._r[2945]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2946]!, self._r[2946]!, [_0, _1]) } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2947]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[2949]! } - public var Month_ShortDecember: String { return self._s[2950]! } - public var Username_Help: String { return self._s[2951]! } - public var Login_InfoAvatarAdd: String { return self._s[2952]! } - public var Month_ShortMay: String { return self._s[2953]! } - public var DialogList_UnknownPinLimitError: String { return self._s[2954]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[2955]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[2956]! } - public var Weekday_ShortSunday: String { return self._s[2957]! } - public var Channel_Username_InvalidTooShort: String { return self._s[2958]! } - public var AuthSessions_TerminateSession: String { return self._s[2959]! } - public var Passport_Identity_FilesTitle: String { return self._s[2960]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2948]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[2950]! } + public var Month_ShortDecember: String { return self._s[2951]! } + public var Username_Help: String { return self._s[2952]! } + public var Login_InfoAvatarAdd: String { return self._s[2953]! } + public var Month_ShortMay: String { return self._s[2954]! } + public var DialogList_UnknownPinLimitError: String { return self._s[2955]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[2956]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[2957]! } + public var Weekday_ShortSunday: String { return self._s[2958]! } + public var Channel_Username_InvalidTooShort: String { return self._s[2959]! } + public var AuthSessions_TerminateSession: String { return self._s[2960]! } + public var Passport_Identity_FilesTitle: String { return self._s[2961]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2961]!, self._r[2961]!, [_0]) + return formatWithArgumentRanges(self._s[2962]!, self._r[2962]!, [_0]) } - public var PeopleNearby_MakeVisible: String { return self._s[2963]! } + public var PeopleNearby_MakeVisible: String { return self._s[2964]! } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2964]!, self._r[2964]!, [_0]) + return formatWithArgumentRanges(self._s[2965]!, self._r[2965]!, [_0]) } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2965]!, self._r[2965]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2966]!, self._r[2966]!, [_1, _2]) } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2966]!, self._r[2966]!, [_0]) + return formatWithArgumentRanges(self._s[2967]!, self._r[2967]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2967]! } - public var Conversation_ContextMenuForward: String { return self._s[2968]! } - public var Channel_AdminLog_CanManageCalls: String { return self._s[2969]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2968]! } + public var Conversation_ContextMenuForward: String { return self._s[2969]! } + public var Channel_AdminLog_CanManageCalls: String { return self._s[2970]! } public func PUSH_CHAT_MESSAGE_QUIZ(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2971]!, self._r[2971]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2972]!, self._r[2972]!, [_1, _2, _3]) } - public var Notification_GroupInviterSelf: String { return self._s[2972]! } - public var Privacy_Forwards_NeverLink: String { return self._s[2974]! } - public var AuthSessions_CurrentSession: String { return self._s[2975]! } - public var Passport_Address_EditPassportRegistration: String { return self._s[2976]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2977]! } - public var ChatSearch_ResultsTooltip: String { return self._s[2979]! } - public var CheckoutInfo_Pay: String { return self._s[2980]! } + public var Notification_GroupInviterSelf: String { return self._s[2973]! } + public var Privacy_Forwards_NeverLink: String { return self._s[2975]! } + public var AuthSessions_CurrentSession: String { return self._s[2976]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2977]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2978]! } + public var ChatSearch_ResultsTooltip: String { return self._s[2980]! } + public var CheckoutInfo_Pay: String { return self._s[2981]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2982]!, self._r[2982]!, [_0]) + return formatWithArgumentRanges(self._s[2983]!, self._r[2983]!, [_0]) } - public var GroupInfo_AddParticipant: String { return self._s[2983]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[2984]! } - public var ChatList_UndoArchiveText1: String { return self._s[2985]! } - public var Localization_LanguageCustom: String { return self._s[2986]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[2987]! } - public var Settings_UsernameEmpty: String { return self._s[2988]! } - public var Settings_FAQ_URL: String { return self._s[2989]! } + public var GroupInfo_AddParticipant: String { return self._s[2984]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[2985]! } + public var ChatList_UndoArchiveText1: String { return self._s[2986]! } + public var Localization_LanguageCustom: String { return self._s[2987]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[2988]! } + public var Settings_UsernameEmpty: String { return self._s[2989]! } + public var Settings_FAQ_URL: String { return self._s[2990]! } public func Conversation_PinMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2990]!, self._r[2990]!, [_0]) + return formatWithArgumentRanges(self._s[2991]!, self._r[2991]!, [_0]) } - public var Common_Select: String { return self._s[2992]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[2993]! } - public var Notification_PassportValueAddress: String { return self._s[2994]! } - public var Conversation_MessageDialogDelete: String { return self._s[2995]! } - public var Map_OpenInYandexNavigator: String { return self._s[2997]! } - public var DialogList_SearchSectionDialogs: String { return self._s[2998]! } - public var AccessDenied_Contacts: String { return self._s[2999]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[3001]! } - public var Passport_ScanPassportHelp: String { return self._s[3002]! } - public var Chat_PinnedListPreview_HidePinnedMessages: String { return self._s[3003]! } - public var ChatListFolder_NameChannels: String { return self._s[3004]! } - public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[3005]! } + public var Common_Select: String { return self._s[2993]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[2994]! } + public var Notification_PassportValueAddress: String { return self._s[2995]! } + public var Conversation_MessageDialogDelete: String { return self._s[2996]! } + public var Map_OpenInYandexNavigator: String { return self._s[2998]! } + public var DialogList_SearchSectionDialogs: String { return self._s[2999]! } + public var AccessDenied_Contacts: String { return self._s[3000]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[3002]! } + public var Passport_ScanPassportHelp: String { return self._s[3003]! } + public var Chat_PinnedListPreview_HidePinnedMessages: String { return self._s[3004]! } + public var ChatListFolder_NameChannels: String { return self._s[3005]! } + public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[3006]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3006]!, self._r[3006]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3007]!, self._r[3007]!, [_1, _2]) } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[3007]! } - public var Conversation_GifTooltip: String { return self._s[3008]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[3008]! } + public var Conversation_GifTooltip: String { return self._s[3009]! } public func VoiceChat_InviteMemberToGroupFirstText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3009]!, self._r[3009]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3010]!, self._r[3010]!, [_1, _2]) } public func CHAT_VOICECHAT_INVITE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3010]!, self._r[3010]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3011]!, self._r[3011]!, [_1, _2, _3]) } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3012]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3013]! } - public var VoiceChat_Connecting: String { return self._s[3014]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3015]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3016]! } - public var CreatePoll_Quiz: String { return self._s[3017]! } - public var TwoFactorSetup_Email_Placeholder: String { return self._s[3018]! } - public var Watch_Message_Invoice: String { return self._s[3019]! } - public var Settings_AddAnotherAccount_Help: String { return self._s[3020]! } - public var Watch_Message_Unsupported: String { return self._s[3021]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3013]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3014]! } + public var VoiceChat_Connecting: String { return self._s[3015]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3016]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3017]! } + public var CreatePoll_Quiz: String { return self._s[3018]! } + public var TwoFactorSetup_Email_Placeholder: String { return self._s[3019]! } + public var Watch_Message_Invoice: String { return self._s[3020]! } + public var Settings_AddAnotherAccount_Help: String { return self._s[3021]! } + public var Watch_Message_Unsupported: String { return self._s[3022]! } public func Call_CameraOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3023]!, self._r[3023]!, [_0]) + return formatWithArgumentRanges(self._s[3024]!, self._r[3024]!, [_0]) } - public var AuthSessions_TerminateOtherSessions: String { return self._s[3024]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[3026]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[3027]! } - public var Call_IncomingVoiceCall: String { return self._s[3028]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[3025]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[3027]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[3028]! } + public var Call_IncomingVoiceCall: String { return self._s[3029]! } public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3029]!, self._r[3029]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_1, _2]) } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[3030]! } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[3031]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[3032]! } - public var Group_ErrorAccessDenied: String { return self._s[3033]! } - public var PasscodeSettings_HelpTop: String { return self._s[3034]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3035]! } - public var AddContact_SharedContactException: String { return self._s[3036]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[3037]! } - public var Privacy_TopPeers: String { return self._s[3038]! } - public var Web_OpenExternal: String { return self._s[3039]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[3040]! } - public var Channel_Management_LabelAdministrator: String { return self._s[3041]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[3031]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[3032]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[3033]! } + public var Group_ErrorAccessDenied: String { return self._s[3034]! } + public var PasscodeSettings_HelpTop: String { return self._s[3035]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3036]! } + public var AddContact_SharedContactException: String { return self._s[3037]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[3038]! } + public var Privacy_TopPeers: String { return self._s[3039]! } + public var Web_OpenExternal: String { return self._s[3040]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[3041]! } + public var Channel_Management_LabelAdministrator: String { return self._s[3042]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3042]!, self._r[3042]!, [_0]) + return formatWithArgumentRanges(self._s[3043]!, self._r[3043]!, [_0]) } - public var Permissions_Skip: String { return self._s[3043]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3044]! } - public var PeopleNearby_Title: String { return self._s[3045]! } - public var GroupInfo_SharedMediaNone: String { return self._s[3046]! } + public var Permissions_Skip: String { return self._s[3044]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3045]! } + public var PeopleNearby_Title: String { return self._s[3046]! } + public var GroupInfo_SharedMediaNone: String { return self._s[3047]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3048]!, self._r[3048]!, [_1]) + return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_1]) } - public var Profile_MessageLifetime1w: String { return self._s[3049]! } + public var Profile_MessageLifetime1w: String { return self._s[3050]! } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3050]!, self._r[3050]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3051]!, self._r[3051]!, [_1, _2, _3]) } - public var WebBrowser_DefaultBrowser: String { return self._s[3051]! } - public var Conversation_PinOlderMessageAlertTitle: String { return self._s[3053]! } - public var EditTheme_Edit_BottomInfo: String { return self._s[3054]! } - public var Privacy_Forwards_Preview: String { return self._s[3055]! } - public var Settings_EditAccount: String { return self._s[3056]! } + public var WebBrowser_DefaultBrowser: String { return self._s[3052]! } + public var Conversation_PinOlderMessageAlertTitle: String { return self._s[3054]! } + public var EditTheme_Edit_BottomInfo: String { return self._s[3055]! } + public var Privacy_Forwards_Preview: String { return self._s[3056]! } + public var Settings_EditAccount: String { return self._s[3057]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3057]!, self._r[3057]!, [_0]) + return formatWithArgumentRanges(self._s[3058]!, self._r[3058]!, [_0]) } - public var TwoFactorSetup_Intro_Title: String { return self._s[3058]! } + public var TwoFactorSetup_Intro_Title: String { return self._s[3059]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3060]!, self._r[3060]!, [_1]) + return formatWithArgumentRanges(self._s[3061]!, self._r[3061]!, [_1]) } - public var PeerInfo_ButtonVideoCall: String { return self._s[3061]! } + public var PeerInfo_ButtonVideoCall: String { return self._s[3062]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3062]!, self._r[3062]!, [_0]) + return formatWithArgumentRanges(self._s[3063]!, self._r[3063]!, [_0]) } - public var Login_InfoHelp: String { return self._s[3063]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[3064]! } - public var VoiceChat_SpeakPermissionEveryone: String { return self._s[3065]! } - public var Profile_MessageLifetime1d: String { return self._s[3066]! } - public var Group_UpgradeConfirmation: String { return self._s[3067]! } + public var Login_InfoHelp: String { return self._s[3064]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[3065]! } + public var VoiceChat_SpeakPermissionEveryone: String { return self._s[3066]! } + public var Profile_MessageLifetime1d: String { return self._s[3067]! } + public var Group_UpgradeConfirmation: String { return self._s[3068]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3068]!, self._r[3068]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3069]!, self._r[3069]!, [_1, _2]) } - public var Appearance_RemoveThemeColor: String { return self._s[3069]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3070]! } - public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3071]! } + public var Appearance_RemoveThemeColor: String { return self._s[3070]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3071]! } + public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3072]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3072]!, self._r[3072]!, [_0]) + return formatWithArgumentRanges(self._s[3073]!, self._r[3073]!, [_0]) } - public var UserInfo_BotSettings: String { return self._s[3073]! } + public var UserInfo_BotSettings: String { return self._s[3074]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3075]!, self._r[3075]!, [_0]) + return formatWithArgumentRanges(self._s[3076]!, self._r[3076]!, [_0]) } - public var Permissions_ContactsText_v0: String { return self._s[3076]! } - public var Conversation_PinMessagesForMe: String { return self._s[3077]! } - public var VoiceChat_PanelJoin: String { return self._s[3078]! } - public var Conversation_DiscussionStarted: String { return self._s[3080]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[3081]! } - public var SharedMedia_SearchNoResults: String { return self._s[3083]! } + public var Permissions_ContactsText_v0: String { return self._s[3077]! } + public var Conversation_PinMessagesForMe: String { return self._s[3078]! } + public var VoiceChat_PanelJoin: String { return self._s[3079]! } + public var Conversation_DiscussionStarted: String { return self._s[3081]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[3082]! } + public var SharedMedia_SearchNoResults: String { return self._s[3084]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3085]!, self._r[3085]!, [_0]) + return formatWithArgumentRanges(self._s[3086]!, self._r[3086]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3087]!, self._r[3087]!, [_0]) + return formatWithArgumentRanges(self._s[3088]!, self._r[3088]!, [_0]) } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[3088]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3089]! } - public var Call_AudioRouteHeadphones: String { return self._s[3090]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[3089]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3090]! } + public var Call_AudioRouteHeadphones: String { return self._s[3091]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_1]) + return formatWithArgumentRanges(self._s[3093]!, self._r[3093]!, [_1]) } - public var Passport_Identity_FilesView: String { return self._s[3093]! } - public var TwoStepAuth_SetupEmail: String { return self._s[3094]! } - public var Widget_ApplicationStartRequired: String { return self._s[3095]! } - public var PhotoEditor_Original: String { return self._s[3096]! } - public var Call_YourMicrophoneOff: String { return self._s[3097]! } - public var Permissions_ContactsAllow_v0: String { return self._s[3098]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[3099]! } - public var PrivacyPolicy_Decline: String { return self._s[3100]! } - public var SettingsSearch_Synonyms_ChatFolders: String { return self._s[3101]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[3102]! } - public var ChatListFolder_IncludeSectionInfo: String { return self._s[3103]! } + public var Passport_Identity_FilesView: String { return self._s[3094]! } + public var TwoStepAuth_SetupEmail: String { return self._s[3095]! } + public var Widget_ApplicationStartRequired: String { return self._s[3096]! } + public var PhotoEditor_Original: String { return self._s[3097]! } + public var Call_YourMicrophoneOff: String { return self._s[3098]! } + public var Permissions_ContactsAllow_v0: String { return self._s[3099]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[3100]! } + public var PrivacyPolicy_Decline: String { return self._s[3101]! } + public var SettingsSearch_Synonyms_ChatFolders: String { return self._s[3102]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[3103]! } + public var ChatListFolder_IncludeSectionInfo: String { return self._s[3104]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3104]!, self._r[3104]!, [_0]) + return formatWithArgumentRanges(self._s[3105]!, self._r[3105]!, [_0]) } - public var Passport_Identity_Name: String { return self._s[3105]! } - public var WallpaperPreview_PatternTitle: String { return self._s[3107]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[3108]! } - public var WallpaperSearch_ColorOrange: String { return self._s[3110]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[3111]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[3112]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3113]! } - public var IntentsSettings_ResetAll: String { return self._s[3114]! } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3116]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3117]! } - public var Notification_Exceptions_Add: String { return self._s[3118]! } - public var Cache_Help: String { return self._s[3119]! } - public var Call_AudioRouteMute: String { return self._s[3120]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[3121]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[3122]! } + public var Passport_Identity_Name: String { return self._s[3106]! } + public var WallpaperPreview_PatternTitle: String { return self._s[3108]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[3109]! } + public var WallpaperSearch_ColorOrange: String { return self._s[3111]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[3112]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[3113]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3114]! } + public var IntentsSettings_ResetAll: String { return self._s[3115]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3117]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3118]! } + public var Notification_Exceptions_Add: String { return self._s[3119]! } + public var Cache_Help: String { return self._s[3120]! } + public var Call_AudioRouteMute: String { return self._s[3121]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[3122]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[3123]! } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3123]!, self._r[3123]!, [_1]) + return formatWithArgumentRanges(self._s[3124]!, self._r[3124]!, [_1]) } public func VoiceChat_Status_MembersFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3124]!, self._r[3124]!, [_1, _2]) - } - public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3125]!, self._r[3125]!, [_1, _2]) } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3126]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[3127]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[3128]! } + public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3126]!, self._r[3126]!, [_1, _2]) + } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3127]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[3128]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[3129]! } public func Wallet_Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3129]!, self._r[3129]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3130]!, self._r[3130]!, [_1, _2, _3]) } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[3130]! } - public var ClearCache_StorageFree: String { return self._s[3131]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[3131]! } + public var ClearCache_StorageFree: String { return self._s[3132]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3132]!, self._r[3132]!, [_0]) + return formatWithArgumentRanges(self._s[3133]!, self._r[3133]!, [_0]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[3133]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[3135]! } - public var DialogList_Typing: String { return self._s[3136]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[3134]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[3136]! } + public var DialogList_Typing: String { return self._s[3137]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3137]!, self._r[3137]!, [_0]) + return formatWithArgumentRanges(self._s[3138]!, self._r[3138]!, [_0]) } - public var Target_SelectGroup: String { return self._s[3138]! } - public var AuthSessions_IncompleteAttempts: String { return self._s[3139]! } + public var Target_SelectGroup: String { return self._s[3139]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[3140]! } public func Notification_ProximityReached(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3140]!, self._r[3140]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3141]!, self._r[3141]!, [_1, _2, _3]) } - public var Chat_PinnedListPreview_ShowAllMessages: String { return self._s[3141]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[3142]! } + public var Chat_PinnedListPreview_ShowAllMessages: String { return self._s[3142]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[3143]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3143]!, self._r[3143]!, [_0]) + return formatWithArgumentRanges(self._s[3144]!, self._r[3144]!, [_0]) } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3144]! } - public var TwoFactorSetup_EmailVerification_Title: String { return self._s[3145]! } - public var ChatSettings_TextSize: String { return self._s[3146]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[3148]! } - public var Map_SendThisPlace: String { return self._s[3149]! } - public var Conversation_TextCopied: String { return self._s[3150]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3151]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3152]! } - public var Call_ShareStats: String { return self._s[3153]! } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3155]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[3156]! } - public var Settings_Support: String { return self._s[3157]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3158]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3145]! } + public var TwoFactorSetup_EmailVerification_Title: String { return self._s[3146]! } + public var ChatSettings_TextSize: String { return self._s[3147]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[3149]! } + public var Map_SendThisPlace: String { return self._s[3150]! } + public var Conversation_TextCopied: String { return self._s[3151]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3152]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3153]! } + public var Call_ShareStats: String { return self._s[3154]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3156]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[3157]! } + public var Settings_Support: String { return self._s[3158]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3159]! } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3160]!, self._r[3160]!, [_0]) + return formatWithArgumentRanges(self._s[3161]!, self._r[3161]!, [_0]) } - public var Watch_Conversation_GroupInfo: String { return self._s[3161]! } - public var Tour_Text4: String { return self._s[3162]! } - public var PasscodeSettings_AutoLock: String { return self._s[3164]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3165]! } - public var Bot_DescriptionTitle: String { return self._s[3166]! } - public var Map_LocationTitle: String { return self._s[3167]! } - public var ChatListFolder_ExcludeSectionInfo: String { return self._s[3168]! } + public var Watch_Conversation_GroupInfo: String { return self._s[3162]! } + public var Tour_Text4: String { return self._s[3163]! } + public var PasscodeSettings_AutoLock: String { return self._s[3165]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3166]! } + public var Bot_DescriptionTitle: String { return self._s[3167]! } + public var Map_LocationTitle: String { return self._s[3168]! } + public var ChatListFolder_ExcludeSectionInfo: String { return self._s[3169]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3169]!, self._r[3169]!, [_1]) + return formatWithArgumentRanges(self._s[3170]!, self._r[3170]!, [_1]) } - public var Login_EmailNotConfiguredError: String { return self._s[3170]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[3171]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[3172]! } - public var Permissions_CellularDataText_v0: String { return self._s[3173]! } - public var Conversation_EncryptionProcessing: String { return self._s[3174]! } - public var GroupPermission_Delete: String { return self._s[3175]! } - public var Contacts_SortByName: String { return self._s[3176]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[3177]! } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[3178]! } - public var Group_Management_AddModeratorHelp: String { return self._s[3180]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[3181]! } - public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3182]! } + public var Login_EmailNotConfiguredError: String { return self._s[3171]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[3172]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[3173]! } + public var Permissions_CellularDataText_v0: String { return self._s[3174]! } + public var Conversation_EncryptionProcessing: String { return self._s[3175]! } + public var GroupPermission_Delete: String { return self._s[3176]! } + public var Contacts_SortByName: String { return self._s[3177]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[3178]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[3179]! } + public var Group_Management_AddModeratorHelp: String { return self._s[3181]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[3182]! } + public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3183]! } public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3184]!, self._r[3184]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3185]!, self._r[3185]!, [_1, _2, _3]) } - public var CallFeedback_IncludeLogsInfo: String { return self._s[3185]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[3186]! } public func PUSH_CHANNEL_MESSAGE_QUIZ(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3186]!, self._r[3186]!, [_1]) + return formatWithArgumentRanges(self._s[3187]!, self._r[3187]!, [_1]) } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3187]!, self._r[3187]!, [_0]) + return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_0]) } - public var ChatList_Context_Delete: String { return self._s[3188]! } - public var VoiceChat_InviteMember: String { return self._s[3189]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[3190]! } - public var Conversation_Processing: String { return self._s[3191]! } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[3192]! } - public var ChatSettings_Stickers: String { return self._s[3193]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[3194]! } - public var Passport_Language_cs: String { return self._s[3195]! } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3197]! } - public var Conversation_Contact: String { return self._s[3198]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[3199]! } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[3200]! } - public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[3201]! } - public var Theme_Unsupported: String { return self._s[3202]! } - public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[3203]! } - public var Privacy_TopPeersWarning: String { return self._s[3204]! } + public var ChatList_Context_Delete: String { return self._s[3189]! } + public var VoiceChat_InviteMember: String { return self._s[3190]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[3191]! } + public var Conversation_Processing: String { return self._s[3192]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[3193]! } + public var ChatSettings_Stickers: String { return self._s[3194]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3195]! } + public var Passport_Language_cs: String { return self._s[3196]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3198]! } + public var Conversation_Contact: String { return self._s[3199]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[3200]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[3201]! } + public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[3202]! } + public var Theme_Unsupported: String { return self._s[3203]! } + public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[3204]! } + public var Privacy_TopPeersWarning: String { return self._s[3205]! } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3206]!, self._r[3206]!, [_0]) + return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_0]) } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3207]! } - public var TwoStepAuth_RemovePassword: String { return self._s[3208]! } - public var Settings_CheckPhoneNumberText: String { return self._s[3209]! } - public var PeopleNearby_Users: String { return self._s[3210]! } - public var Appearance_TextSize_UseSystem: String { return self._s[3211]! } - public var Settings_SetProfilePhoto: String { return self._s[3212]! } - public var Conversation_ContextMenuBan: String { return self._s[3213]! } - public var KeyCommand_ScrollUp: String { return self._s[3214]! } - public var Settings_ChatSettings: String { return self._s[3216]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3208]! } + public var TwoStepAuth_RemovePassword: String { return self._s[3209]! } + public var Settings_CheckPhoneNumberText: String { return self._s[3210]! } + public var PeopleNearby_Users: String { return self._s[3211]! } + public var Appearance_TextSize_UseSystem: String { return self._s[3212]! } + public var Settings_SetProfilePhoto: String { return self._s[3213]! } + public var Conversation_ContextMenuBan: String { return self._s[3214]! } + public var KeyCommand_ScrollUp: String { return self._s[3215]! } + public var Settings_ChatSettings: String { return self._s[3217]! } public func PUSH_CHAT_MESSAGE_VIDEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3217]!, self._r[3217]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3218]!, self._r[3218]!, [_1, _2]) } - public var Stats_GroupTopInvitersTitle: String { return self._s[3218]! } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3219]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[3221]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3222]! } - public var Stats_GroupTopPoster_Promote: String { return self._s[3223]! } - public var Cache_Title: String { return self._s[3224]! } - public var Clipboard_SendPhoto: String { return self._s[3225]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[3227]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3228]! } - public var WatchRemote_AlertTitle: String { return self._s[3229]! } - public var Appearance_ReduceMotion: String { return self._s[3230]! } + public var Stats_GroupTopInvitersTitle: String { return self._s[3219]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3220]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[3222]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3223]! } + public var Stats_GroupTopPoster_Promote: String { return self._s[3224]! } + public var Cache_Title: String { return self._s[3225]! } + public var Clipboard_SendPhoto: String { return self._s[3226]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[3228]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3229]! } + public var WatchRemote_AlertTitle: String { return self._s[3230]! } + public var Appearance_ReduceMotion: String { return self._s[3231]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3234]!, self._r[3234]!, [_1, _2]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[3234]! } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[3235]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[3236]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[3235]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[3236]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[3237]! } public func Call_CallInProgressVoiceChatMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3237]!, self._r[3237]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3238]!, self._r[3238]!, [_1, _2]) } - public var Wallet_TransactionInfo_CopyAddress: String { return self._s[3239]! } + public var Wallet_TransactionInfo_CopyAddress: String { return self._s[3240]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3240]!, self._r[3240]!, [_0]) + return formatWithArgumentRanges(self._s[3241]!, self._r[3241]!, [_0]) } - public var ChatListFolder_DiscardConfirmation: String { return self._s[3241]! } + public var ChatListFolder_DiscardConfirmation: String { return self._s[3242]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3242]!, self._r[3242]!, [_0]) + return formatWithArgumentRanges(self._s[3243]!, self._r[3243]!, [_0]) } - public var ChatState_WaitingForNetwork: String { return self._s[3243]! } - public var GroupInfo_Sound: String { return self._s[3244]! } - public var NotificationsSound_Telegraph: String { return self._s[3245]! } - public var NotificationsSound_Hello: String { return self._s[3246]! } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[3247]! } - public var Wallet_Settings_BackupWallet: String { return self._s[3248]! } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[3249]! } - public var Conversation_HoldForVideo: String { return self._s[3250]! } - public var Conversation_PinOlderMessageAlertText: String { return self._s[3251]! } - public var Wallet_Configuration_ApplyErrorTextURLInvalidData: String { return self._s[3252]! } - public var Wallet_RestoreFailed_EnterWords: String { return self._s[3253]! } - public var Appearance_ShareTheme: String { return self._s[3254]! } - public var TwoStepAuth_SetupHint: String { return self._s[3255]! } - public var Wallet_Created_Text: String { return self._s[3258]! } - public var Stats_GrowthTitle: String { return self._s[3259]! } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3260]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[3261]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[3262]! } - public var GroupPermission_NoSendMessages: String { return self._s[3265]! } - public var Conversation_SetReminder_Title: String { return self._s[3266]! } - public var Privacy_Calls_CustomHelp: String { return self._s[3267]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3268]! } + public var ChatState_WaitingForNetwork: String { return self._s[3244]! } + public var GroupInfo_Sound: String { return self._s[3245]! } + public var NotificationsSound_Telegraph: String { return self._s[3246]! } + public var NotificationsSound_Hello: String { return self._s[3247]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[3248]! } + public var Wallet_Settings_BackupWallet: String { return self._s[3249]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[3250]! } + public var Conversation_HoldForVideo: String { return self._s[3251]! } + public var Conversation_PinOlderMessageAlertText: String { return self._s[3252]! } + public var Wallet_Configuration_ApplyErrorTextURLInvalidData: String { return self._s[3253]! } + public var Wallet_RestoreFailed_EnterWords: String { return self._s[3254]! } + public var Appearance_ShareTheme: String { return self._s[3255]! } + public var TwoStepAuth_SetupHint: String { return self._s[3256]! } + public var Wallet_Created_Text: String { return self._s[3259]! } + public var Stats_GrowthTitle: String { return self._s[3260]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3261]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[3262]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[3263]! } + public var GroupPermission_NoSendMessages: String { return self._s[3266]! } + public var Conversation_SetReminder_Title: String { return self._s[3267]! } + public var Privacy_Calls_CustomHelp: String { return self._s[3268]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3269]! } public func ClearCache_StorageTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3269]!, self._r[3269]!, [_0]) + return formatWithArgumentRanges(self._s[3270]!, self._r[3270]!, [_0]) } - public var Undo_SecretChatDeleted: String { return self._s[3271]! } - public var PhotoEditor_ContrastTool: String { return self._s[3272]! } - public var Privacy_Forwards: String { return self._s[3273]! } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[3274]! } - public var KeyCommand_SendMessage: String { return self._s[3276]! } + public var Undo_SecretChatDeleted: String { return self._s[3272]! } + public var PhotoEditor_ContrastTool: String { return self._s[3273]! } + public var Privacy_Forwards: String { return self._s[3274]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[3275]! } + public var KeyCommand_SendMessage: String { return self._s[3277]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3277]!, self._r[3277]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3278]!, self._r[3278]!, [_1, _2]) } - public var GroupPermission_NoSendGifs: String { return self._s[3278]! } - public var Wallet_Month_ShortJune: String { return self._s[3279]! } - public var Notification_MessageLifetime2s: String { return self._s[3280]! } - public var Message_Theme: String { return self._s[3281]! } - public var Conversation_Dice_u1F3AF: String { return self._s[3284]! } + public var GroupPermission_NoSendGifs: String { return self._s[3279]! } + public var Wallet_Month_ShortJune: String { return self._s[3280]! } + public var Notification_MessageLifetime2s: String { return self._s[3281]! } + public var Message_Theme: String { return self._s[3282]! } + public var Conversation_Dice_u1F3AF: String { return self._s[3285]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3285]!, self._r[3285]!, [_0]) + return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_0]) } - public var Group_UpgradeNoticeHeader: String { return self._s[3287]! } - public var PeerInfo_BioExpand: String { return self._s[3288]! } - public var Passport_DeletePersonalDetails: String { return self._s[3289]! } - public var Widget_NoUsers: String { return self._s[3290]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[3291]! } - public var Login_TermsOfServiceDecline: String { return self._s[3292]! } - public var CreatePoll_QuizTip: String { return self._s[3294]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[3295]! } - public var MessagePoll_SubmitVote: String { return self._s[3297]! } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[3298]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[3299]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3300]! } - public var Conversation_UpdateTelegram: String { return self._s[3301]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3288]! } + public var PeerInfo_BioExpand: String { return self._s[3289]! } + public var Passport_DeletePersonalDetails: String { return self._s[3290]! } + public var Widget_NoUsers: String { return self._s[3291]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[3292]! } + public var Login_TermsOfServiceDecline: String { return self._s[3293]! } + public var CreatePoll_QuizTip: String { return self._s[3295]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[3296]! } + public var MessagePoll_SubmitVote: String { return self._s[3298]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[3299]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[3300]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3301]! } + public var Conversation_UpdateTelegram: String { return self._s[3302]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3302]!, self._r[3302]!, [_0]) + return formatWithArgumentRanges(self._s[3303]!, self._r[3303]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3303]! } - public var CallSettings_Always: String { return self._s[3304]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[3305]! } - public var Login_TermsOfServiceHeader: String { return self._s[3306]! } - public var KeyCommand_ChatInfo: String { return self._s[3307]! } - public var MessagePoll_LabelPoll: String { return self._s[3308]! } - public var Paint_Clear: String { return self._s[3309]! } - public var PeerInfo_ButtonMute: String { return self._s[3310]! } - public var LastSeen_WithinAWeek: String { return self._s[3311]! } - public var Passport_Identity_FrontSide: String { return self._s[3312]! } - public var Stickers_GroupStickers: String { return self._s[3313]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[3314]! } + public var UserInfo_About_Placeholder: String { return self._s[3304]! } + public var CallSettings_Always: String { return self._s[3305]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[3306]! } + public var Login_TermsOfServiceHeader: String { return self._s[3307]! } + public var KeyCommand_ChatInfo: String { return self._s[3308]! } + public var MessagePoll_LabelPoll: String { return self._s[3309]! } + public var Paint_Clear: String { return self._s[3310]! } + public var PeerInfo_ButtonMute: String { return self._s[3311]! } + public var LastSeen_WithinAWeek: String { return self._s[3312]! } + public var Passport_Identity_FrontSide: String { return self._s[3313]! } + public var Stickers_GroupStickers: String { return self._s[3314]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[3315]! } public func Map_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3315]!, self._r[3315]!, [_0]) + return formatWithArgumentRanges(self._s[3316]!, self._r[3316]!, [_0]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3318]!, self._r[3318]!, [_1]) + return formatWithArgumentRanges(self._s[3319]!, self._r[3319]!, [_1]) } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[3319]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[3320]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[3320]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[3321]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_0]) + return formatWithArgumentRanges(self._s[3322]!, self._r[3322]!, [_0]) } - public var Wallet_Send_AmountText: String { return self._s[3322]! } - public var WebSearch_SearchNoResults: String { return self._s[3324]! } - public var Channel_DiscussionGroup_Create: String { return self._s[3325]! } - public var Passport_Language_es: String { return self._s[3326]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[3327]! } - public var Wallet_Intro_Title: String { return self._s[3328]! } - public var Map_LiveLocationShowAll: String { return self._s[3329]! } - public var Cache_MaximumCacheSizeHelp: String { return self._s[3331]! } - public var Map_OpenInGoogleMaps: String { return self._s[3332]! } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[3334]! } - public var EditTheme_Create_BottomInfo: String { return self._s[3335]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[3336]! } + public var Wallet_Send_AmountText: String { return self._s[3323]! } + public var WebSearch_SearchNoResults: String { return self._s[3325]! } + public var Channel_DiscussionGroup_Create: String { return self._s[3326]! } + public var Passport_Language_es: String { return self._s[3327]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[3328]! } + public var Wallet_Intro_Title: String { return self._s[3329]! } + public var Map_LiveLocationShowAll: String { return self._s[3330]! } + public var Cache_MaximumCacheSizeHelp: String { return self._s[3332]! } + public var Map_OpenInGoogleMaps: String { return self._s[3333]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[3335]! } + public var EditTheme_Create_BottomInfo: String { return self._s[3336]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[3337]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3337]!, self._r[3337]!, [_0]) + return formatWithArgumentRanges(self._s[3338]!, self._r[3338]!, [_0]) } - public var Passport_Phone_Delete: String { return self._s[3338]! } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[3339]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[3340]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3341]! } + public var Passport_Phone_Delete: String { return self._s[3339]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[3340]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[3341]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3342]! } public func EncryptionKey_Description(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3342]!, self._r[3342]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3343]!, self._r[3343]!, [_1, _2]) } - public var LogoutOptions_LogOutInfo: String { return self._s[3343]! } - public var Wallet_Month_GenAugust: String { return self._s[3344]! } - public var Cache_ByPeerHeader: String { return self._s[3345]! } - public var Username_InvalidCharacters: String { return self._s[3346]! } - public var Wallet_Qr_Title: String { return self._s[3348]! } - public var Checkout_ShippingAddress: String { return self._s[3349]! } + public var LogoutOptions_LogOutInfo: String { return self._s[3344]! } + public var Wallet_Month_GenAugust: String { return self._s[3345]! } + public var Cache_ByPeerHeader: String { return self._s[3346]! } + public var Username_InvalidCharacters: String { return self._s[3347]! } + public var Wallet_Qr_Title: String { return self._s[3349]! } + public var Checkout_ShippingAddress: String { return self._s[3350]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3350]!, self._r[3350]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[3351]!, self._r[3351]!, [_1, _2, _3, _4]) } - public var Conversation_AddContact: String { return self._s[3352]! } - public var Passport_Address_EditUtilityBill: String { return self._s[3353]! } - public var Message_Video: String { return self._s[3354]! } + public var Conversation_AddContact: String { return self._s[3353]! } + public var Passport_Address_EditUtilityBill: String { return self._s[3354]! } + public var Message_Video: String { return self._s[3355]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_0]) + return formatWithArgumentRanges(self._s[3356]!, self._r[3356]!, [_0]) } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3356]!, self._r[3356]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[3357]!, self._r[3357]!, ["\(_0)"]) } - public var Passport_Language_km: String { return self._s[3357]! } + public var Passport_Language_km: String { return self._s[3358]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3358]!, self._r[3358]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3359]!, self._r[3359]!, [_1, _2, _3]) } - public var EmptyGroupInfo_Line4: String { return self._s[3359]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3361]! } - public var Notification_CallCanceledShort: String { return self._s[3362]! } - public var PhotoEditor_FadeTool: String { return self._s[3363]! } - public var Group_PublicLink_Info: String { return self._s[3364]! } - public var Contacts_DeselectAll: String { return self._s[3365]! } - public var Conversation_Moderate_Delete: String { return self._s[3366]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3367]! } - public var NotificationsSound_Note: String { return self._s[3370]! } + public var EmptyGroupInfo_Line4: String { return self._s[3360]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3362]! } + public var Notification_CallCanceledShort: String { return self._s[3363]! } + public var PhotoEditor_FadeTool: String { return self._s[3364]! } + public var Group_PublicLink_Info: String { return self._s[3365]! } + public var Contacts_DeselectAll: String { return self._s[3366]! } + public var Conversation_Moderate_Delete: String { return self._s[3367]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3368]! } + public var NotificationsSound_Note: String { return self._s[3371]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3371]!, self._r[3371]!, [_0]) + return formatWithArgumentRanges(self._s[3372]!, self._r[3372]!, [_0]) } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3372]! } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3374]! } - public var DialogList_SearchSectionGlobal: String { return self._s[3375]! } - public var AccessDenied_Settings: String { return self._s[3376]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3377]! } - public var AuthSessions_EmptyTitle: String { return self._s[3378]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[3379]! } - public var GroupInfo_GroupType: String { return self._s[3380]! } - public var Calls_Missed: String { return self._s[3381]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3382]! } - public var Passport_Language_uz: String { return self._s[3383]! } - public var Conversation_StopQuizConfirmationTitle: String { return self._s[3384]! } - public var PhotoEditor_BlurToolPortrait: String { return self._s[3385]! } - public var Map_ChooseLocationTitle: String { return self._s[3386]! } - public var Checkout_EnterPassword: String { return self._s[3387]! } - public var GroupInfo_ConvertToSupergroup: String { return self._s[3388]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[3389]! } - public var NetworkUsageSettings_Title: String { return self._s[3390]! } - public var Location_ProximityAlertCancelled: String { return self._s[3391]! } - public var SettingsSearch_Synonyms_ChatSettings_IntentsSettings: String { return self._s[3392]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[3393]! } - public var Compose_NewChannel: String { return self._s[3394]! } - public var Privacy_PaymentsClearInfo: String { return self._s[3396]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3373]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3375]! } + public var DialogList_SearchSectionGlobal: String { return self._s[3376]! } + public var AccessDenied_Settings: String { return self._s[3377]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3378]! } + public var AuthSessions_EmptyTitle: String { return self._s[3379]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[3380]! } + public var GroupInfo_GroupType: String { return self._s[3381]! } + public var Calls_Missed: String { return self._s[3382]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3383]! } + public var Passport_Language_uz: String { return self._s[3384]! } + public var Conversation_StopQuizConfirmationTitle: String { return self._s[3385]! } + public var PhotoEditor_BlurToolPortrait: String { return self._s[3386]! } + public var Map_ChooseLocationTitle: String { return self._s[3387]! } + public var Checkout_EnterPassword: String { return self._s[3388]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[3389]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[3390]! } + public var NetworkUsageSettings_Title: String { return self._s[3391]! } + public var Location_ProximityAlertCancelled: String { return self._s[3392]! } + public var SettingsSearch_Synonyms_ChatSettings_IntentsSettings: String { return self._s[3393]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[3394]! } + public var Compose_NewChannel: String { return self._s[3395]! } + public var Privacy_PaymentsClearInfo: String { return self._s[3397]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3397]!, self._r[3397]!, [_1]) + return formatWithArgumentRanges(self._s[3398]!, self._r[3398]!, [_1]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[3398]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3399]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[3402]! } - public var WallpaperSearch_ColorBrown: String { return self._s[3403]! } - public var Appearance_AppIconDefault: String { return self._s[3404]! } - public var Wallet_Month_GenJune: String { return self._s[3407]! } - public var StickerSettings_ContextInfo: String { return self._s[3408]! } - public var Channel_AddBotErrorNoRights: String { return self._s[3409]! } - public var Passport_FieldPhone: String { return self._s[3411]! } - public var Contacts_PermissionsTitle: String { return self._s[3412]! } - public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3413]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3399]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3400]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[3403]! } + public var WallpaperSearch_ColorBrown: String { return self._s[3404]! } + public var Appearance_AppIconDefault: String { return self._s[3405]! } + public var Wallet_Month_GenJune: String { return self._s[3408]! } + public var StickerSettings_ContextInfo: String { return self._s[3409]! } + public var Channel_AddBotErrorNoRights: String { return self._s[3410]! } + public var Passport_FieldPhone: String { return self._s[3412]! } + public var Contacts_PermissionsTitle: String { return self._s[3413]! } + public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3414]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3414]!, self._r[3414]!, [_0]) + return formatWithArgumentRanges(self._s[3415]!, self._r[3415]!, [_0]) } - public var Bot_Unblock: String { return self._s[3415]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[3416]! } - public var Passport_PasswordHelp: String { return self._s[3417]! } - public var Watch_Conversation_UserInfo: String { return self._s[3418]! } + public var Bot_Unblock: String { return self._s[3416]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[3417]! } + public var Passport_PasswordHelp: String { return self._s[3418]! } + public var Watch_Conversation_UserInfo: String { return self._s[3419]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3422]!, self._r[3422]!, [_0]) + return formatWithArgumentRanges(self._s[3423]!, self._r[3423]!, [_0]) } - public var State_Connecting: String { return self._s[3424]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3425]! } - public var TextFormat_AddLinkPlaceholder: String { return self._s[3426]! } - public var Conversation_Dice_u1F3B2: String { return self._s[3427]! } + public var State_Connecting: String { return self._s[3425]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3426]! } + public var TextFormat_AddLinkPlaceholder: String { return self._s[3427]! } + public var Conversation_Dice_u1F3B2: String { return self._s[3428]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_0]) + return formatWithArgumentRanges(self._s[3429]!, self._r[3429]!, [_0]) } - public var Conversation_SendingOptionsTooltip: String { return self._s[3429]! } - public var ChatList_UndoArchiveTitle: String { return self._s[3430]! } - public var ChatList_EmptyChatListNewMessage: String { return self._s[3431]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3433]! } - public var PhotoEditor_BlurToolOff: String { return self._s[3434]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[3435]! } - public var Weekday_Saturday: String { return self._s[3436]! } - public var DialogList_Unread: String { return self._s[3437]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[3438]! } - public var Stats_GroupPosters: String { return self._s[3439]! } + public var Conversation_SendingOptionsTooltip: String { return self._s[3430]! } + public var ChatList_UndoArchiveTitle: String { return self._s[3431]! } + public var ChatList_EmptyChatListNewMessage: String { return self._s[3432]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3434]! } + public var PhotoEditor_BlurToolOff: String { return self._s[3435]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[3436]! } + public var Weekday_Saturday: String { return self._s[3437]! } + public var DialogList_Unread: String { return self._s[3438]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[3439]! } + public var Stats_GroupPosters: String { return self._s[3440]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3440]!, self._r[3440]!, [_1]) + return formatWithArgumentRanges(self._s[3441]!, self._r[3441]!, [_1]) } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3443]!, self._r[3443]!, [_0]) + return formatWithArgumentRanges(self._s[3444]!, self._r[3444]!, [_0]) } - public var ReportPeer_ReasonChildAbuse: String { return self._s[3444]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[3445]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3445]!, self._r[3445]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3446]!, self._r[3446]!, [_1, _2]) } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[3446]! } - public var AutoNightTheme_UseSunsetSunrise: String { return self._s[3448]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[3449]! } - public var Passport_Language_dv: String { return self._s[3450]! } - public var GroupPermission_AddSuccess: String { return self._s[3453]! } - public var Passport_Email_Help: String { return self._s[3454]! } - public var Call_ReportPlaceholder: String { return self._s[3455]! } - public var CreatePoll_AddOption: String { return self._s[3456]! } - public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3457]! } - public var PeerInfo_ButtonLeave: String { return self._s[3458]! } - public var PhotoEditor_TiltShift: String { return self._s[3461]! } - public var SecretGif_Title: String { return self._s[3463]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[3464]! } - public var SocksProxySetup_Connecting: String { return self._s[3465]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3466]! } - public var ContactInfo_PhoneLabelWork: String { return self._s[3467]! } - public var Stats_GroupTopHoursTitle: String { return self._s[3468]! } - public var Compose_NewMessage: String { return self._s[3469]! } - public var VoiceOver_Common_SwitchHint: String { return self._s[3470]! } - public var NotificationsSound_Synth: String { return self._s[3471]! } - public var Conversation_FileOpenIn: String { return self._s[3472]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[3473]! } - public var UserInfo_SendMessage: String { return self._s[3474]! } - public var Checkout_PayWithFaceId: String { return self._s[3475]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[3447]! } + public var AutoNightTheme_UseSunsetSunrise: String { return self._s[3449]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[3450]! } + public var Passport_Language_dv: String { return self._s[3451]! } + public var GroupPermission_AddSuccess: String { return self._s[3454]! } + public var Passport_Email_Help: String { return self._s[3455]! } + public var Call_ReportPlaceholder: String { return self._s[3456]! } + public var CreatePoll_AddOption: String { return self._s[3457]! } + public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3458]! } + public var PeerInfo_ButtonLeave: String { return self._s[3459]! } + public var PhotoEditor_TiltShift: String { return self._s[3462]! } + public var SecretGif_Title: String { return self._s[3464]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[3465]! } + public var SocksProxySetup_Connecting: String { return self._s[3466]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3467]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[3468]! } + public var Stats_GroupTopHoursTitle: String { return self._s[3469]! } + public var Compose_NewMessage: String { return self._s[3470]! } + public var VoiceOver_Common_SwitchHint: String { return self._s[3471]! } + public var NotificationsSound_Synth: String { return self._s[3472]! } + public var Conversation_FileOpenIn: String { return self._s[3473]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[3474]! } + public var UserInfo_SendMessage: String { return self._s[3475]! } + public var Checkout_PayWithFaceId: String { return self._s[3476]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3476]!, self._r[3476]!, [_0]) + return formatWithArgumentRanges(self._s[3477]!, self._r[3477]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[3477]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[3478]! } - public var Conversation_ViewChannel: String { return self._s[3479]! } + public var TextFormat_Strikethrough: String { return self._s[3478]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[3479]! } + public var Conversation_ViewChannel: String { return self._s[3480]! } public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3480]!, self._r[3480]!, [_0]) + return formatWithArgumentRanges(self._s[3481]!, self._r[3481]!, [_0]) } - public var Channel_Stickers_Placeholder: String { return self._s[3481]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3482]! } - public var Camera_FlashAuto: String { return self._s[3483]! } - public var Conversation_EncryptedDescription1: String { return self._s[3484]! } - public var LocalGroup_Text: String { return self._s[3485]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[3486]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[3487]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[3488]! } - public var Conversation_EncryptedDescription2: String { return self._s[3489]! } - public var Notification_GroupActivated: String { return self._s[3490]! } - public var LastSeen_Lately: String { return self._s[3491]! } - public var Conversation_EncryptedDescription3: String { return self._s[3492]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[3493]! } - public var Conversation_SwipeToReplyHintText: String { return self._s[3494]! } - public var Conversation_EncryptedDescription4: String { return self._s[3495]! } - public var SharedMedia_EmptyTitle: String { return self._s[3496]! } - public var Wallet_Configuration_Apply: String { return self._s[3497]! } - public var Appearance_CreateTheme: String { return self._s[3498]! } - public var Stats_SharesPerPost: String { return self._s[3499]! } - public var Contacts_TabTitle: String { return self._s[3500]! } - public var Weekday_ShortThursday: String { return self._s[3501]! } - public var MessageTimer_Forever: String { return self._s[3502]! } - public var ChatListFolder_CategoryArchived: String { return self._s[3503]! } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3504]! } - public var EditTheme_Create_TopInfo: String { return self._s[3506]! } - public var Month_GenDecember: String { return self._s[3507]! } - public var EnterPasscode_EnterPasscode: String { return self._s[3508]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3509]! } - public var PeopleNearby_CreateGroup: String { return self._s[3511]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3512]! } - public var Paint_ClearConfirm: String { return self._s[3513]! } - public var ChatList_ReadAll: String { return self._s[3514]! } - public var ChatSettings_IntentsSettings: String { return self._s[3515]! } - public var Passport_PassportInformation: String { return self._s[3517]! } - public var Login_CheckOtherSessionMessages: String { return self._s[3519]! } - public var Location_ProximityNotification_DistanceMI: String { return self._s[3522]! } - public var PhotoEditor_ExposureTool: String { return self._s[3523]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[3524]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[3525]! } - public var Stats_GroupTopPoster_History: String { return self._s[3526]! } - public var UserInfo_AddPhone: String { return self._s[3527]! } - public var Media_SendWithTimer: String { return self._s[3529]! } - public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[3530]! } - public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3531]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[3532]! } - public var ChatList_Context_Unarchive: String { return self._s[3534]! } + public var Channel_Stickers_Placeholder: String { return self._s[3482]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3483]! } + public var Camera_FlashAuto: String { return self._s[3484]! } + public var Conversation_EncryptedDescription1: String { return self._s[3485]! } + public var LocalGroup_Text: String { return self._s[3486]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[3487]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[3488]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[3489]! } + public var Conversation_EncryptedDescription2: String { return self._s[3490]! } + public var Notification_GroupActivated: String { return self._s[3491]! } + public var LastSeen_Lately: String { return self._s[3492]! } + public var Conversation_EncryptedDescription3: String { return self._s[3493]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[3494]! } + public var Conversation_SwipeToReplyHintText: String { return self._s[3495]! } + public var Conversation_EncryptedDescription4: String { return self._s[3496]! } + public var SharedMedia_EmptyTitle: String { return self._s[3497]! } + public var Wallet_Configuration_Apply: String { return self._s[3498]! } + public var Appearance_CreateTheme: String { return self._s[3499]! } + public var Stats_SharesPerPost: String { return self._s[3500]! } + public var Contacts_TabTitle: String { return self._s[3501]! } + public var Weekday_ShortThursday: String { return self._s[3502]! } + public var MessageTimer_Forever: String { return self._s[3503]! } + public var ChatListFolder_CategoryArchived: String { return self._s[3504]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3505]! } + public var EditTheme_Create_TopInfo: String { return self._s[3507]! } + public var Month_GenDecember: String { return self._s[3508]! } + public var EnterPasscode_EnterPasscode: String { return self._s[3509]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3510]! } + public var PeopleNearby_CreateGroup: String { return self._s[3512]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3513]! } + public var Paint_ClearConfirm: String { return self._s[3514]! } + public var ChatList_ReadAll: String { return self._s[3515]! } + public var ChatSettings_IntentsSettings: String { return self._s[3516]! } + public var Passport_PassportInformation: String { return self._s[3518]! } + public var Login_CheckOtherSessionMessages: String { return self._s[3520]! } + public var Location_ProximityNotification_DistanceMI: String { return self._s[3523]! } + public var PhotoEditor_ExposureTool: String { return self._s[3524]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[3525]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[3526]! } + public var Stats_GroupTopPoster_History: String { return self._s[3527]! } + public var UserInfo_AddPhone: String { return self._s[3528]! } + public var Media_SendWithTimer: String { return self._s[3530]! } + public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[3531]! } + public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3532]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[3533]! } + public var ChatList_Context_Unarchive: String { return self._s[3535]! } public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3535]!, self._r[3535]!, [_0]) + return formatWithArgumentRanges(self._s[3536]!, self._r[3536]!, [_0]) } - public var BlockedUsers_Title: String { return self._s[3537]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[3538]! } - public var Media_ShareThisPhoto: String { return self._s[3539]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[3540]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[3541]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3545]! } - public var CallFeedback_ReasonNoise: String { return self._s[3547]! } - public var WebBrowser_Title: String { return self._s[3548]! } + public var BlockedUsers_Title: String { return self._s[3538]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[3539]! } + public var Media_ShareThisPhoto: String { return self._s[3540]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[3541]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[3542]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3546]! } + public var CallFeedback_ReasonNoise: String { return self._s[3548]! } + public var WebBrowser_Title: String { return self._s[3549]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3549]!, self._r[3549]!, [_0]) + return formatWithArgumentRanges(self._s[3550]!, self._r[3550]!, [_0]) } - public var Notification_MessageLifetime5s: String { return self._s[3550]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3551]! } - public var Profile_MessageLifetime1m: String { return self._s[3552]! } - public var Stats_LoadingTitle: String { return self._s[3554]! } - public var Passport_ScanPassport: String { return self._s[3555]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3558]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[3559]! } - public var Login_InvalidFirstNameError: String { return self._s[3560]! } - public var Undo_ChatCleared: String { return self._s[3562]! } + public var Notification_MessageLifetime5s: String { return self._s[3551]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3552]! } + public var Profile_MessageLifetime1m: String { return self._s[3553]! } + public var Stats_LoadingTitle: String { return self._s[3555]! } + public var Passport_ScanPassport: String { return self._s[3556]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3559]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[3560]! } + public var Login_InvalidFirstNameError: String { return self._s[3561]! } + public var Undo_ChatCleared: String { return self._s[3563]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3564]!, self._r[3564]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3565]!, self._r[3565]!, [_1, _2]) } - public var Conversation_PinMessageAlertPin: String { return self._s[3565]! } + public var Conversation_PinMessageAlertPin: String { return self._s[3566]! } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3566]!, self._r[3566]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3567]!, self._r[3567]!, [_1, _2, _3, _4, _5]) } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3567]!, self._r[3567]!, [_1]) + return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_1]) } - public var Share_MultipleMessagesDisabled: String { return self._s[3568]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[3569]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3571]! } + public var Share_MultipleMessagesDisabled: String { return self._s[3569]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[3570]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3572]! } public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3572]!, self._r[3572]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3573]!, self._r[3573]!, [_1, _2, _3]) } - public var CallSettings_RecentCalls: String { return self._s[3573]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[3574]! } - public var AuthSessions_OtherSessions: String { return self._s[3575]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3576]! } - public var Tour_Text5: String { return self._s[3577]! } - public var Login_PadPhoneHelp: String { return self._s[3578]! } - public var Wallpaper_PhotoLibrary: String { return self._s[3580]! } - public var Conversation_ViewGroup: String { return self._s[3581]! } - public var PeopleNearby_MakeVisibleTitle: String { return self._s[3583]! } - public var VoiceOver_Chat_YourContact: String { return self._s[3584]! } - public var Watch_AuthRequired: String { return self._s[3585]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3586]! } - public var Conversation_ForwardContacts: String { return self._s[3587]! } - public var Conversation_InputTextPlaceholder: String { return self._s[3588]! } + public var CallSettings_RecentCalls: String { return self._s[3574]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[3575]! } + public var AuthSessions_OtherSessions: String { return self._s[3576]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3577]! } + public var Tour_Text5: String { return self._s[3578]! } + public var Login_PadPhoneHelp: String { return self._s[3579]! } + public var Wallpaper_PhotoLibrary: String { return self._s[3581]! } + public var Conversation_ViewGroup: String { return self._s[3582]! } + public var PeopleNearby_MakeVisibleTitle: String { return self._s[3584]! } + public var VoiceOver_Chat_YourContact: String { return self._s[3585]! } + public var Watch_AuthRequired: String { return self._s[3586]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3587]! } + public var Conversation_ForwardContacts: String { return self._s[3588]! } + public var Conversation_InputTextPlaceholder: String { return self._s[3589]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3589]!, self._r[3589]!, [_1]) + return formatWithArgumentRanges(self._s[3590]!, self._r[3590]!, [_1]) } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3590]!, self._r[3590]!, [_0]) + return formatWithArgumentRanges(self._s[3591]!, self._r[3591]!, [_0]) } - public var Channel_Setup_TypePrivate: String { return self._s[3591]! } + public var Channel_Setup_TypePrivate: String { return self._s[3592]! } public func Conversation_NoticeInvitedByInChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3592]!, self._r[3592]!, [_0]) + return formatWithArgumentRanges(self._s[3593]!, self._r[3593]!, [_0]) } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[3593]! } - public var Wallet_ContextMenuCopy: String { return self._s[3594]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[3595]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3596]! } - public var UserInfo_StartSecretChatStart: String { return self._s[3597]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[3594]! } + public var Wallet_ContextMenuCopy: String { return self._s[3595]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[3596]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3597]! } + public var UserInfo_StartSecretChatStart: String { return self._s[3598]! } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3598]!, self._r[3598]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3599]!, self._r[3599]!, [_1, _2]) } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3599]!, self._r[3599]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[3600]!, self._r[3600]!, [_0, _1, _2]) } - public var PrivacySettings_AutoArchiveTitle: String { return self._s[3600]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[3601]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[3602]! } - public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[3603]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[3605]! } - public var NewContact_Title: String { return self._s[3608]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[3609]! } - public var VoiceChat_StatusSpeaking: String { return self._s[3610]! } - public var Notifications_PermissionsKeepDisabled: String { return self._s[3611]! } + public var PrivacySettings_AutoArchiveTitle: String { return self._s[3601]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[3602]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[3603]! } + public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[3604]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[3606]! } + public var NewContact_Title: String { return self._s[3609]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[3610]! } + public var VoiceChat_StatusSpeaking: String { return self._s[3611]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[3612]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3612]!, self._r[3612]!, [_0]) + return formatWithArgumentRanges(self._s[3613]!, self._r[3613]!, [_0]) } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3613]!, self._r[3613]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3614]!, self._r[3614]!, [_0, _1]) } - public var Chat_SlowmodeTooltipPending: String { return self._s[3614]! } - public var Wallet_WordCheck_TryAgain: String { return self._s[3615]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3617]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[3618]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[3619]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[3615]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[3616]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3618]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[3619]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[3620]! } public func PUSH_MESSAGE_DOCS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3621]!, self._r[3621]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3622]!, self._r[3622]!, [_1, "\(_2)"]) } - public var Conversation_MessageEditedLabel: String { return self._s[3622]! } - public var Wallet_Settings_DeleteWalletInfo: String { return self._s[3623]! } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3624]! } - public var ChatList_Context_AddToContacts: String { return self._s[3625]! } - public var Passport_Language_is: String { return self._s[3626]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[3627]! } - public var Wallet_Month_ShortOctober: String { return self._s[3628]! } - public var PhotoEditor_CurvesBlue: String { return self._s[3629]! } + public var Conversation_MessageEditedLabel: String { return self._s[3623]! } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[3624]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3625]! } + public var ChatList_Context_AddToContacts: String { return self._s[3626]! } + public var Passport_Language_is: String { return self._s[3627]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[3628]! } + public var Wallet_Month_ShortOctober: String { return self._s[3629]! } + public var PhotoEditor_CurvesBlue: String { return self._s[3630]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3630]!, self._r[3630]!, [_0]) + return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[3631]! } - public var Login_SmsRequestState3: String { return self._s[3632]! } - public var Message_PinnedVideoMessage: String { return self._s[3633]! } - public var SharedMedia_TitleLink: String { return self._s[3634]! } - public var Passport_FieldIdentity: String { return self._s[3635]! } - public var Wallet_Configuration_SourceInfo: String { return self._s[3636]! } + public var SocksProxySetup_Username: String { return self._s[3632]! } + public var Login_SmsRequestState3: String { return self._s[3633]! } + public var Message_PinnedVideoMessage: String { return self._s[3634]! } + public var SharedMedia_TitleLink: String { return self._s[3635]! } + public var Passport_FieldIdentity: String { return self._s[3636]! } + public var Wallet_Configuration_SourceInfo: String { return self._s[3637]! } public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3640]!, self._r[3640]!, [_0]) + return formatWithArgumentRanges(self._s[3641]!, self._r[3641]!, [_0]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[3643]! } - public var ReportSpam_DeleteThisChat: String { return self._s[3644]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3645]! } - public var Passport_Identity_DateOfBirth: String { return self._s[3646]! } - public var Call_StatusIncoming: String { return self._s[3647]! } - public var Wallet_TransactionInfo_NoAddress: String { return self._s[3648]! } - public var ChatAdmins_AdminLabel: String { return self._s[3649]! } - public var Wallet_WordCheck_IncorrectHeader: String { return self._s[3650]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[3644]! } + public var ReportSpam_DeleteThisChat: String { return self._s[3645]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3646]! } + public var Passport_Identity_DateOfBirth: String { return self._s[3647]! } + public var Call_StatusIncoming: String { return self._s[3648]! } + public var Wallet_TransactionInfo_NoAddress: String { return self._s[3649]! } + public var ChatAdmins_AdminLabel: String { return self._s[3650]! } + public var Wallet_WordCheck_IncorrectHeader: String { return self._s[3651]! } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3652]!, self._r[3652]!, [_0]) + return formatWithArgumentRanges(self._s[3653]!, self._r[3653]!, [_0]) } - public var Message_PinnedAnimationMessage: String { return self._s[3653]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[3654]! } - public var Preview_CopyAddress: String { return self._s[3655]! } - public var MediaPlayer_UnknownTrack: String { return self._s[3656]! } - public var Login_CancelSignUpConfirmation: String { return self._s[3657]! } - public var Map_OpenInYandexMaps: String { return self._s[3659]! } + public var Message_PinnedAnimationMessage: String { return self._s[3654]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[3655]! } + public var Preview_CopyAddress: String { return self._s[3656]! } + public var MediaPlayer_UnknownTrack: String { return self._s[3657]! } + public var Login_CancelSignUpConfirmation: String { return self._s[3658]! } + public var Map_OpenInYandexMaps: String { return self._s[3660]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3662]!, self._r[3662]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3663]!, self._r[3663]!, [_1, _2, _3]) } - public var GroupRemoved_Remove: String { return self._s[3663]! } - public var ChatListFolder_TitleCreate: String { return self._s[3664]! } + public var GroupRemoved_Remove: String { return self._s[3664]! } + public var ChatListFolder_TitleCreate: String { return self._s[3665]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3666]!, self._r[3666]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3667]!, self._r[3667]!, [_1, _2]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[3667]! } - public var Group_UpgradeNoticeText2: String { return self._s[3669]! } - public var Stats_GroupGrowthTitle: String { return self._s[3670]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3673]! } - public var Month_GenOctober: String { return self._s[3674]! } - public var Conversation_TitleCommentsEmpty: String { return self._s[3675]! } - public var Settings_Appearance: String { return self._s[3676]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[3668]! } + public var Group_UpgradeNoticeText2: String { return self._s[3670]! } + public var Stats_GroupGrowthTitle: String { return self._s[3671]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3674]! } + public var Month_GenOctober: String { return self._s[3675]! } + public var Conversation_TitleCommentsEmpty: String { return self._s[3676]! } + public var Settings_Appearance: String { return self._s[3677]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3677]!, self._r[3677]!, [_0]) + return formatWithArgumentRanges(self._s[3678]!, self._r[3678]!, [_0]) } - public var Wallet_Completed_Title: String { return self._s[3678]! } - public var UserInfo_AddToExisting: String { return self._s[3679]! } - public var Call_PhoneCallInProgressMessage: String { return self._s[3680]! } - public var Map_HomeAndWorkInfo: String { return self._s[3681]! } - public var Paint_Arrow: String { return self._s[3682]! } - public var CancelResetAccount_Title: String { return self._s[3683]! } - public var NotificationsSound_Circles: String { return self._s[3684]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[3685]! } - public var ChatState_Connecting: String { return self._s[3687]! } - public var Profile_MessageLifetime5s: String { return self._s[3688]! } + public var Wallet_Completed_Title: String { return self._s[3679]! } + public var UserInfo_AddToExisting: String { return self._s[3680]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3681]! } + public var Map_HomeAndWorkInfo: String { return self._s[3682]! } + public var Paint_Arrow: String { return self._s[3683]! } + public var CancelResetAccount_Title: String { return self._s[3684]! } + public var NotificationsSound_Circles: String { return self._s[3685]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[3686]! } + public var ChatState_Connecting: String { return self._s[3688]! } + public var Profile_MessageLifetime5s: String { return self._s[3689]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3689]!, self._r[3689]!, [_0]) + return formatWithArgumentRanges(self._s[3690]!, self._r[3690]!, [_0]) } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[3690]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[3691]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3692]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[3693]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[3694]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[3691]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[3692]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3693]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[3694]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[3695]! } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3695]!, self._r[3695]!, [_0]) + return formatWithArgumentRanges(self._s[3696]!, self._r[3696]!, [_0]) } - public var Passport_Phone_Help: String { return self._s[3696]! } - public var Privacy_ContactsSync: String { return self._s[3697]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3698]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[3699]! } - public var Map_SendMyCurrentLocation: String { return self._s[3700]! } - public var Map_AddressOnMap: String { return self._s[3701]! } + public var Passport_Phone_Help: String { return self._s[3697]! } + public var Privacy_ContactsSync: String { return self._s[3698]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3699]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[3700]! } + public var Map_SendMyCurrentLocation: String { return self._s[3701]! } + public var Map_AddressOnMap: String { return self._s[3702]! } public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3702]!, self._r[3702]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3703]!, self._r[3703]!, [_1, _2, _3]) } - public var DialogList_SearchLabel: String { return self._s[3704]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3705]! } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3706]! } - public var ChatList_Search_ShowMore: String { return self._s[3707]! } - public var DialogList_EncryptionRejected: String { return self._s[3708]! } - public var Wallet_WordImport_Text: String { return self._s[3709]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[3710]! } - public var VoiceChat_InviteLinkCopiedText: String { return self._s[3711]! } - public var Privacy_TopPeersDelete: String { return self._s[3712]! } - public var AttachmentMenu_SendAsFile: String { return self._s[3713]! } - public var ChatList_GenericPsaAlert: String { return self._s[3715]! } - public var SecretTimer_ImageDescription: String { return self._s[3717]! } + public var DialogList_SearchLabel: String { return self._s[3705]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3706]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3707]! } + public var ChatList_Search_ShowMore: String { return self._s[3708]! } + public var DialogList_EncryptionRejected: String { return self._s[3709]! } + public var Wallet_WordImport_Text: String { return self._s[3710]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[3711]! } + public var VoiceChat_InviteLinkCopiedText: String { return self._s[3712]! } + public var Privacy_TopPeersDelete: String { return self._s[3713]! } + public var AttachmentMenu_SendAsFile: String { return self._s[3714]! } + public var ChatList_GenericPsaAlert: String { return self._s[3716]! } + public var SecretTimer_ImageDescription: String { return self._s[3718]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3718]!, self._r[3718]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3719]!, self._r[3719]!, [_0, _1]) } - public var ChatSettings_TextSizeUnits: String { return self._s[3719]! } - public var Notification_RenamedGroup: String { return self._s[3720]! } - public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3721]! } - public var Tour_Title2: String { return self._s[3722]! } - public var Settings_CopyUsername: String { return self._s[3723]! } - public var Compose_NewEncryptedChat: String { return self._s[3724]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[3725]! } - public var Month_ShortSeptember: String { return self._s[3726]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[3727]! } - public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[3728]! } - public var Settings_Wallet: String { return self._s[3729]! } - public var Call_StatusConnecting: String { return self._s[3731]! } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[3732]! } - public var Map_ShareLiveLocationHelp: String { return self._s[3733]! } - public var Cache_Files: String { return self._s[3734]! } - public var Notifications_Reset: String { return self._s[3735]! } + public var ChatSettings_TextSizeUnits: String { return self._s[3720]! } + public var Notification_RenamedGroup: String { return self._s[3721]! } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3722]! } + public var Tour_Title2: String { return self._s[3723]! } + public var Settings_CopyUsername: String { return self._s[3724]! } + public var Compose_NewEncryptedChat: String { return self._s[3725]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[3726]! } + public var Month_ShortSeptember: String { return self._s[3727]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[3728]! } + public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[3729]! } + public var Settings_Wallet: String { return self._s[3730]! } + public var Call_StatusConnecting: String { return self._s[3732]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[3733]! } + public var Map_ShareLiveLocationHelp: String { return self._s[3734]! } + public var Cache_Files: String { return self._s[3735]! } + public var Notifications_Reset: String { return self._s[3736]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3736]!, self._r[3736]!, [_0]) + return formatWithArgumentRanges(self._s[3737]!, self._r[3737]!, [_0]) } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[3737]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[3738]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3738]!, self._r[3738]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3739]!, self._r[3739]!, [_1, _2]) } - public var Notification_CallIncomingShort: String { return self._s[3739]! } - public var UserInfo_BotPrivacy: String { return self._s[3741]! } - public var Appearance_BubbleCorners_Apply: String { return self._s[3742]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[3743]! } - public var Conversation_ContextMenuLookUp: String { return self._s[3744]! } - public var Calls_RatingTitle: String { return self._s[3745]! } - public var SecretImage_Title: String { return self._s[3746]! } - public var Weekday_Monday: String { return self._s[3747]! } + public var Notification_CallIncomingShort: String { return self._s[3740]! } + public var UserInfo_BotPrivacy: String { return self._s[3742]! } + public var Appearance_BubbleCorners_Apply: String { return self._s[3743]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[3744]! } + public var Conversation_ContextMenuLookUp: String { return self._s[3745]! } + public var Calls_RatingTitle: String { return self._s[3746]! } + public var SecretImage_Title: String { return self._s[3747]! } + public var Weekday_Monday: String { return self._s[3748]! } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3749]!, self._r[3749]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3750]!, self._r[3750]!, [_1, _2]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3750]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3751]! } public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3751]!, self._r[3751]!, [_0]) + return formatWithArgumentRanges(self._s[3752]!, self._r[3752]!, [_0]) } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3752]!, self._r[3752]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3753]!, self._r[3753]!, [_1, _2]) } - public var Stats_GroupMembers: String { return self._s[3753]! } - public var Camera_Retake: String { return self._s[3754]! } - public var Conversation_SearchPlaceholder: String { return self._s[3756]! } + public var Stats_GroupMembers: String { return self._s[3754]! } + public var Camera_Retake: String { return self._s[3755]! } + public var Conversation_SearchPlaceholder: String { return self._s[3757]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3757]!, self._r[3757]!, [_0]) + return formatWithArgumentRanges(self._s[3758]!, self._r[3758]!, [_0]) } - public var Channel_DiscussionGroup_Info: String { return self._s[3758]! } - public var SocksProxySetup_Hostname: String { return self._s[3759]! } - public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3760]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3761]! } - public var Privacy_DeleteDrafts: String { return self._s[3762]! } + public var Channel_DiscussionGroup_Info: String { return self._s[3759]! } + public var SocksProxySetup_Hostname: String { return self._s[3760]! } + public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3761]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3762]! } + public var Privacy_DeleteDrafts: String { return self._s[3763]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3764]!, self._r[3764]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[3765]!, self._r[3765]!, [_1, _1, _1, _2]) } - public var Wallet_RestoreFailed_Text: String { return self._s[3765]! } - public var Wallet_Settings_DeleteWallet: String { return self._s[3766]! } - public var Login_CancelPhoneVerification: String { return self._s[3767]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[3769]! } + public var Wallet_RestoreFailed_Text: String { return self._s[3766]! } + public var Wallet_Settings_DeleteWallet: String { return self._s[3767]! } + public var Login_CancelPhoneVerification: String { return self._s[3768]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[3770]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3770]!, self._r[3770]!, [_0]) + return formatWithArgumentRanges(self._s[3771]!, self._r[3771]!, [_0]) } - public var TwoStepAuth_EmailSent: String { return self._s[3771]! } - public var Cache_Indexing: String { return self._s[3772]! } - public var Notifications_ExceptionsNone: String { return self._s[3773]! } - public var MessagePoll_LabelQuiz: String { return self._s[3774]! } - public var Call_EncryptionKey_Title: String { return self._s[3775]! } - public var Common_Yes: String { return self._s[3776]! } - public var Channel_ErrorAddBlocked: String { return self._s[3777]! } - public var Month_GenJanuary: String { return self._s[3778]! } - public var Checkout_NewCard_Title: String { return self._s[3779]! } - public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[3780]! } + public var TwoStepAuth_EmailSent: String { return self._s[3772]! } + public var Cache_Indexing: String { return self._s[3773]! } + public var Notifications_ExceptionsNone: String { return self._s[3774]! } + public var MessagePoll_LabelQuiz: String { return self._s[3775]! } + public var Call_EncryptionKey_Title: String { return self._s[3776]! } + public var Common_Yes: String { return self._s[3777]! } + public var Channel_ErrorAddBlocked: String { return self._s[3778]! } + public var Month_GenJanuary: String { return self._s[3779]! } + public var Checkout_NewCard_Title: String { return self._s[3780]! } + public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[3781]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3781]!, self._r[3781]!, [_0]) + return formatWithArgumentRanges(self._s[3782]!, self._r[3782]!, [_0]) } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3783]! } - public var Conversation_SendDice: String { return self._s[3784]! } - public var Conversation_InputTextPlaceholderReply: String { return self._s[3785]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3784]! } + public var Conversation_SendDice: String { return self._s[3785]! } + public var Conversation_InputTextPlaceholderReply: String { return self._s[3786]! } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3786]!, self._r[3786]!, [_0]) - } - public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3787]!, self._r[3787]!, [_0]) } - public var Weekday_Wednesday: String { return self._s[3788]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[3789]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[3790]! } - public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[3791]! } - public var OldChannels_NoticeTitle: String { return self._s[3792]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[3793]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[3794]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[3795]! } - public var Passport_Address_AddUtilityBill: String { return self._s[3796]! } + public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3788]!, self._r[3788]!, [_0]) + } + public var Weekday_Wednesday: String { return self._s[3789]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[3790]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[3791]! } + public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[3792]! } + public var OldChannels_NoticeTitle: String { return self._s[3793]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[3794]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[3795]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[3796]! } + public var Passport_Address_AddUtilityBill: String { return self._s[3797]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3798]!, self._r[3798]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3799]!, self._r[3799]!, [_1, _2, _3]) } - public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[3800]! } - public var Stats_GroupTopAdminsTitle: String { return self._s[3801]! } - public var Paint_Regular: String { return self._s[3802]! } - public var Message_Contact: String { return self._s[3803]! } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[3804]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[3805]! } - public var Notification_Mute1hMin: String { return self._s[3806]! } + public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[3801]! } + public var Stats_GroupTopAdminsTitle: String { return self._s[3802]! } + public var Paint_Regular: String { return self._s[3803]! } + public var Message_Contact: String { return self._s[3804]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[3805]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[3806]! } + public var Notification_Mute1hMin: String { return self._s[3807]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3807]!, self._r[3807]!, [_0]) + return formatWithArgumentRanges(self._s[3808]!, self._r[3808]!, [_0]) } - public var Profile_MessageLifetime1h: String { return self._s[3808]! } - public var TwoStepAuth_GenericHelp: String { return self._s[3809]! } - public var TextFormat_Monospace: String { return self._s[3810]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[3812]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3813]! } - public var ChatList_DeleteChat: String { return self._s[3814]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[3817]! } + public var Profile_MessageLifetime1h: String { return self._s[3809]! } + public var TwoStepAuth_GenericHelp: String { return self._s[3810]! } + public var TextFormat_Monospace: String { return self._s[3811]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[3813]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3814]! } + public var ChatList_DeleteChat: String { return self._s[3815]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[3818]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3818]!, self._r[3818]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[3819]!, self._r[3819]!, [_1, _2, _3, _4]) } - public var Login_CancelPhoneVerificationStop: String { return self._s[3819]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[3820]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[3821]! } - public var Wallet_Settings_Configuration: String { return self._s[3822]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[3823]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[3820]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[3821]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[3822]! } + public var Wallet_Settings_Configuration: String { return self._s[3823]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[3824]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3824]!, self._r[3824]!, [_0]) + return formatWithArgumentRanges(self._s[3825]!, self._r[3825]!, [_0]) } - public var Wallet_Sent_ViewWallet: String { return self._s[3825]! } - public var StickerPack_ViewPack: String { return self._s[3828]! } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[3830]! } - public var EditTheme_Expand_Preview_IncomingText: String { return self._s[3831]! } - public var Notifications_Title: String { return self._s[3832]! } - public var Wallet_WordImport_Continue: String { return self._s[3833]! } - public var GroupInfo_PublicLink: String { return self._s[3834]! } - public var Conversation_InputTextPlaceholderComment: String { return self._s[3835]! } - public var VoiceOver_DiscardPreparedContent: String { return self._s[3836]! } - public var Conversation_Moderate_Ban: String { return self._s[3840]! } + public var Wallet_Sent_ViewWallet: String { return self._s[3826]! } + public var StickerPack_ViewPack: String { return self._s[3829]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[3831]! } + public var EditTheme_Expand_Preview_IncomingText: String { return self._s[3832]! } + public var Notifications_Title: String { return self._s[3833]! } + public var Wallet_WordImport_Continue: String { return self._s[3834]! } + public var GroupInfo_PublicLink: String { return self._s[3835]! } + public var Conversation_InputTextPlaceholderComment: String { return self._s[3836]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[3837]! } + public var Conversation_Moderate_Ban: String { return self._s[3841]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3841]!, self._r[3841]!, [_0]) + return formatWithArgumentRanges(self._s[3842]!, self._r[3842]!, [_0]) } - public var TextFormat_Underline: String { return self._s[3842]! } + public var TextFormat_Underline: String { return self._s[3843]! } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3843]!, self._r[3843]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3844]!, self._r[3844]!, [_0, _1]) } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3844]!, self._r[3844]!, [_1]) + return formatWithArgumentRanges(self._s[3845]!, self._r[3845]!, [_1]) } - public var PollResults_Collapse: String { return self._s[3846]! } - public var Contacts_GlobalSearch: String { return self._s[3847]! } + public var PollResults_Collapse: String { return self._s[3847]! } + public var Contacts_GlobalSearch: String { return self._s[3848]! } public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3848]!, self._r[3848]!, [_0]) + return formatWithArgumentRanges(self._s[3849]!, self._r[3849]!, [_0]) } - public var Channel_Management_LabelEditor: String { return self._s[3849]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[3851]! } - public var Conversation_Theme: String { return self._s[3852]! } + public var Channel_Management_LabelEditor: String { return self._s[3850]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[3852]! } + public var Conversation_Theme: String { return self._s[3853]! } public func PUSH_CHANNEL_MESSAGE_DOCS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3853]!, self._r[3853]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3854]!, self._r[3854]!, [_1, "\(_2)"]) } - public var Conversation_LinkDialogSave: String { return self._s[3854]! } - public var EnterPasscode_TouchId: String { return self._s[3855]! } - public var Stats_MessageOverview: String { return self._s[3856]! } - public var Privacy_Calls_P2PAlways: String { return self._s[3858]! } - public var Message_Sticker: String { return self._s[3859]! } - public var Conversation_Mute: String { return self._s[3861]! } - public var VoiceChat_AnonymousDisabledAlertText: String { return self._s[3862]! } - public var ContactInfo_Title: String { return self._s[3863]! } + public var Conversation_LinkDialogSave: String { return self._s[3855]! } + public var EnterPasscode_TouchId: String { return self._s[3856]! } + public var Conversation_VoiceChatMediaRecordingRestricted: String { return self._s[3857]! } + public var Stats_MessageOverview: String { return self._s[3858]! } + public var Privacy_Calls_P2PAlways: String { return self._s[3860]! } + public var Message_Sticker: String { return self._s[3861]! } + public var Conversation_Mute: String { return self._s[3863]! } + public var VoiceChat_AnonymousDisabledAlertText: String { return self._s[3864]! } + public var ContactInfo_Title: String { return self._s[3865]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3864]!, self._r[3864]!, [_1]) + return formatWithArgumentRanges(self._s[3866]!, self._r[3866]!, [_1]) } - public var Channel_Setup_TypeHeader: String { return self._s[3865]! } - public var AuthSessions_LogOut: String { return self._s[3866]! } - public var Wallet_WordCheck_ViewWords: String { return self._s[3867]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3868]! } - public var ChatListFolderSettings_NewFolder: String { return self._s[3870]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3871]! } - public var CreatePoll_Title: String { return self._s[3872]! } - public var EditTheme_EditTitle: String { return self._s[3873]! } - public var ChatListFolderSettings_RecommendedFoldersSection: String { return self._s[3874]! } - public var TwoStepAuth_SetPassword: String { return self._s[3875]! } - public var Wallet_Words_Done: String { return self._s[3876]! } + public var Channel_Setup_TypeHeader: String { return self._s[3867]! } + public var AuthSessions_LogOut: String { return self._s[3868]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[3869]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3870]! } + public var ChatListFolderSettings_NewFolder: String { return self._s[3872]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3873]! } + public var CreatePoll_Title: String { return self._s[3874]! } + public var EditTheme_EditTitle: String { return self._s[3875]! } + public var ChatListFolderSettings_RecommendedFoldersSection: String { return self._s[3876]! } + public var TwoStepAuth_SetPassword: String { return self._s[3877]! } + public var Wallet_Words_Done: String { return self._s[3878]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3877]!, self._r[3877]!, [_0]) + return formatWithArgumentRanges(self._s[3879]!, self._r[3879]!, [_0]) } - public var BlockedUsers_Info: String { return self._s[3878]! } - public var AuthSessions_Sessions: String { return self._s[3879]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3880]! } + public var BlockedUsers_Info: String { return self._s[3880]! } + public var AuthSessions_Sessions: String { return self._s[3881]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3882]! } public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3881]!, self._r[3881]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3883]!, self._r[3883]!, [_1, _2, _3]) } - public var Common_ActionNotAllowedError: String { return self._s[3882]! } - public var WebPreview_GettingLinkInfo: String { return self._s[3883]! } - public var Appearance_AppIconFilledX: String { return self._s[3884]! } - public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[3885]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[3886]! } - public var FeaturedStickers_OtherSection: String { return self._s[3887]! } - public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[3888]! } - public var Profile_Username: String { return self._s[3889]! } - public var Appearance_RemoveTheme: String { return self._s[3890]! } - public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[3891]! } - public var Message_PinnedStickerMessage: String { return self._s[3892]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3893]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[3894]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[3895]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[3896]! } - public var TwoStepAuth_Title: String { return self._s[3897]! } - public var Checkout_WebConfirmation_Title: String { return self._s[3898]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[3899]! } - public var ChatListFolder_CategoryGroups: String { return self._s[3901]! } - public var Stats_GroupTopInviter_Promote: String { return self._s[3902]! } - public var Conversation_EditingPhotoPanelTitle: String { return self._s[3903]! } - public var Month_GenJuly: String { return self._s[3904]! } - public var Passport_Identity_Gender: String { return self._s[3905]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3906]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[3907]! } + public var Common_ActionNotAllowedError: String { return self._s[3884]! } + public var WebPreview_GettingLinkInfo: String { return self._s[3885]! } + public var Appearance_AppIconFilledX: String { return self._s[3886]! } + public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[3887]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[3888]! } + public var FeaturedStickers_OtherSection: String { return self._s[3889]! } + public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[3890]! } + public var Profile_Username: String { return self._s[3891]! } + public var Appearance_RemoveTheme: String { return self._s[3892]! } + public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[3893]! } + public var Message_PinnedStickerMessage: String { return self._s[3894]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3895]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[3896]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[3897]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[3898]! } + public var TwoStepAuth_Title: String { return self._s[3899]! } + public var Checkout_WebConfirmation_Title: String { return self._s[3900]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[3901]! } + public var ChatListFolder_CategoryGroups: String { return self._s[3903]! } + public var Stats_GroupTopInviter_Promote: String { return self._s[3904]! } + public var Conversation_EditingPhotoPanelTitle: String { return self._s[3905]! } + public var Month_GenJuly: String { return self._s[3906]! } + public var Passport_Identity_Gender: String { return self._s[3907]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3908]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[3909]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3908]!, self._r[3908]!, [_0]) + return formatWithArgumentRanges(self._s[3910]!, self._r[3910]!, [_0]) } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3909]!, self._r[3909]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[3911]!, self._r[3911]!, [_0, _1, _2]) } - public var Login_CodeSentSms: String { return self._s[3910]! } + public var Login_CodeSentSms: String { return self._s[3912]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3912]!, self._r[3912]!, [_0]) + return formatWithArgumentRanges(self._s[3914]!, self._r[3914]!, [_0]) } - public var Login_CallRequestState2: String { return self._s[3913]! } - public var Channel_DiscussionGroup_Header: String { return self._s[3914]! } + public var Login_CallRequestState2: String { return self._s[3915]! } + public var Channel_DiscussionGroup_Header: String { return self._s[3916]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3915]!, self._r[3915]!, [_0]) + return formatWithArgumentRanges(self._s[3917]!, self._r[3917]!, [_0]) } - public var Passport_Language_ms: String { return self._s[3916]! } - public var PeopleNearby_MakeInvisible: String { return self._s[3918]! } - public var ChatList_Search_FilterVoice: String { return self._s[3920]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3922]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[3923]! } + public var Passport_Language_ms: String { return self._s[3918]! } + public var PeopleNearby_MakeInvisible: String { return self._s[3920]! } + public var ChatList_Search_FilterVoice: String { return self._s[3922]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3924]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[3925]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3924]!, self._r[3924]!, [_0]) + return formatWithArgumentRanges(self._s[3926]!, self._r[3926]!, [_0]) } public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3925]!, self._r[3925]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3927]!, self._r[3927]!, [_1, _2, _3]) } - public var Wallet_Info_TransactionTo: String { return self._s[3926]! } + public var Wallet_Info_TransactionTo: String { return self._s[3928]! } public func Call_VoiceChatInProgressMessageCall(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3927]!, self._r[3927]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3929]!, self._r[3929]!, [_1, _2]) } - public var Map_Locating: String { return self._s[3928]! } + public var Map_Locating: String { return self._s[3930]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3930]!, self._r[3930]!, [_0]) + return formatWithArgumentRanges(self._s[3932]!, self._r[3932]!, [_0]) } - public var Passport_Identity_TypeInternalPassport: String { return self._s[3932]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3933]! } - public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[3934]! } - public var Stickers_Installed: String { return self._s[3935]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[3936]! } - public var StickerPackActionInfo_RemovedTitle: String { return self._s[3937]! } - public var CallSettings_Never: String { return self._s[3939]! } - public var Wallet_AccessDenied_Camera: String { return self._s[3940]! } - public var Channel_Setup_TypePublicHelp: String { return self._s[3941]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[3934]! } + public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3935]! } + public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[3936]! } + public var Stickers_Installed: String { return self._s[3937]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[3938]! } + public var StickerPackActionInfo_RemovedTitle: String { return self._s[3939]! } + public var CallSettings_Never: String { return self._s[3941]! } + public var Wallet_AccessDenied_Camera: String { return self._s[3942]! } + public var Channel_Setup_TypePublicHelp: String { return self._s[3943]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3943]!, self._r[3943]!, [_0]) + return formatWithArgumentRanges(self._s[3945]!, self._r[3945]!, [_0]) } - public var Message_Game: String { return self._s[3944]! } - public var Call_Message: String { return self._s[3945]! } + public var Message_Game: String { return self._s[3946]! } + public var Call_Message: String { return self._s[3947]! } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3946]!, self._r[3946]!, [_1]) + return formatWithArgumentRanges(self._s[3948]!, self._r[3948]!, [_1]) } - public var ChannelIntro_Text: String { return self._s[3947]! } - public var StickerPack_Send: String { return self._s[3948]! } - public var Share_AuthDescription: String { return self._s[3949]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[3950]! } - public var CallFeedback_WhatWentWrong: String { return self._s[3951]! } - public var Common_Create: String { return self._s[3954]! } - public var Passport_Language_hy: String { return self._s[3955]! } - public var CreatePoll_Explanation: String { return self._s[3956]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[3957]! } - public var Undo_ChatClearedForBothSides: String { return self._s[3958]! } - public var DialogList_NoMessagesTitle: String { return self._s[3959]! } - public var GroupInfo_Title: String { return self._s[3961]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[3962]! } - public var PhoneNumberHelp_Help: String { return self._s[3963]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3964]! } - public var Settings_Logout: String { return self._s[3965]! } - public var Privacy_PaymentsTitle: String { return self._s[3966]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[3967]! } - public var Tour_Text6: String { return self._s[3968]! } - public var Channel_Username_Help: String { return self._s[3970]! } - public var Wallet_Info_RefreshErrorTitle: String { return self._s[3971]! } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[3972]! } - public var AttachmentMenu_Poll: String { return self._s[3973]! } - public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[3974]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[3975]! } - public var Passport_DeletePassport: String { return self._s[3976]! } - public var Login_Code: String { return self._s[3977]! } - public var Notification_SecretChatScreenshot: String { return self._s[3978]! } - public var Login_CodeFloodError: String { return self._s[3979]! } + public var ChannelIntro_Text: String { return self._s[3949]! } + public var StickerPack_Send: String { return self._s[3950]! } + public var Share_AuthDescription: String { return self._s[3951]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[3952]! } + public var CallFeedback_WhatWentWrong: String { return self._s[3953]! } + public var Common_Create: String { return self._s[3956]! } + public var Passport_Language_hy: String { return self._s[3957]! } + public var CreatePoll_Explanation: String { return self._s[3958]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[3959]! } + public var Undo_ChatClearedForBothSides: String { return self._s[3960]! } + public var DialogList_NoMessagesTitle: String { return self._s[3961]! } + public var GroupInfo_Title: String { return self._s[3963]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[3964]! } + public var PhoneNumberHelp_Help: String { return self._s[3965]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3966]! } + public var Settings_Logout: String { return self._s[3967]! } + public var Privacy_PaymentsTitle: String { return self._s[3968]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[3969]! } + public var Tour_Text6: String { return self._s[3970]! } + public var Channel_Username_Help: String { return self._s[3972]! } + public var Wallet_Info_RefreshErrorTitle: String { return self._s[3973]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[3974]! } + public var AttachmentMenu_Poll: String { return self._s[3975]! } + public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[3976]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[3977]! } + public var Passport_DeletePassport: String { return self._s[3978]! } + public var Login_Code: String { return self._s[3979]! } + public var Notification_SecretChatScreenshot: String { return self._s[3980]! } + public var Login_CodeFloodError: String { return self._s[3981]! } public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3980]!, self._r[3980]!, [_0]) + return formatWithArgumentRanges(self._s[3982]!, self._r[3982]!, [_0]) } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3981]!, self._r[3981]!, [_0]) + return formatWithArgumentRanges(self._s[3983]!, self._r[3983]!, [_0]) } - public var Watch_Stickers_Recents: String { return self._s[3982]! } - public var Generic_ErrorMoreInfo: String { return self._s[3983]! } + public var Watch_Stickers_Recents: String { return self._s[3984]! } + public var Generic_ErrorMoreInfo: String { return self._s[3985]! } public func Call_AccountIsLoggedOnCurrentDevice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3984]!, self._r[3984]!, [_0]) + return formatWithArgumentRanges(self._s[3986]!, self._r[3986]!, [_0]) } - public var AutoDownloadSettings_DataUsage: String { return self._s[3985]! } - public var Conversation_ViewTheme: String { return self._s[3986]! } - public var Contacts_InviteSearchLabel: String { return self._s[3987]! } - public var Settings_CancelUpload: String { return self._s[3989]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[3990]! } + public var AutoDownloadSettings_DataUsage: String { return self._s[3987]! } + public var Conversation_ViewTheme: String { return self._s[3988]! } + public var Contacts_InviteSearchLabel: String { return self._s[3989]! } + public var Settings_CancelUpload: String { return self._s[3991]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[3992]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3991]!, self._r[3991]!, [_0]) + return formatWithArgumentRanges(self._s[3993]!, self._r[3993]!, [_0]) } - public var ChatList_AddFolder: String { return self._s[3992]! } - public var Conversation_Location: String { return self._s[3994]! } - public var Appearance_BubbleCorners_AdjustAdjacent: String { return self._s[3995]! } - public var DialogList_AdLabel: String { return self._s[3996]! } + public var ChatList_AddFolder: String { return self._s[3994]! } + public var Conversation_Location: String { return self._s[3996]! } + public var Appearance_BubbleCorners_AdjustAdjacent: String { return self._s[3997]! } + public var DialogList_AdLabel: String { return self._s[3998]! } public func Time_TomorrowAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3998]!, self._r[3998]!, [_0]) + return formatWithArgumentRanges(self._s[4000]!, self._r[4000]!, [_0]) } - public var Message_InvoiceLabel: String { return self._s[3999]! } - public var Channel_TooMuchBots: String { return self._s[4000]! } + public var Message_InvoiceLabel: String { return self._s[4001]! } + public var Channel_TooMuchBots: String { return self._s[4002]! } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4002]!, self._r[4002]!, [_0]) + return formatWithArgumentRanges(self._s[4004]!, self._r[4004]!, [_0]) } - public var Wallet_Month_ShortAugust: String { return self._s[4003]! } - public var Call_IncomingVideoCall: String { return self._s[4004]! } - public var Conversation_LiveLocation: String { return self._s[4005]! } - public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[4006]! } - public var Passport_Identity_EditPassport: String { return self._s[4007]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[4009]! } - public var ChatList_Search_NoResultsFitlerVoice: String { return self._s[4010]! } - public var GroupInfo_Permissions_AddException: String { return self._s[4011]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[4013]! } - public var Channel_MessageVideoUpdated: String { return self._s[4014]! } - public var GroupInfo_Permissions_EditingDisabled: String { return self._s[4015]! } - public var AccessDenied_Camera: String { return self._s[4018]! } + public var Wallet_Month_ShortAugust: String { return self._s[4005]! } + public var Call_IncomingVideoCall: String { return self._s[4006]! } + public var Conversation_LiveLocation: String { return self._s[4007]! } + public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[4008]! } + public var Passport_Identity_EditPassport: String { return self._s[4009]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[4011]! } + public var ChatList_Search_NoResultsFitlerVoice: String { return self._s[4012]! } + public var GroupInfo_Permissions_AddException: String { return self._s[4013]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[4015]! } + public var Channel_MessageVideoUpdated: String { return self._s[4016]! } + public var GroupInfo_Permissions_EditingDisabled: String { return self._s[4017]! } + public var AccessDenied_Camera: String { return self._s[4020]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4019]!, self._r[4019]!, [_0]) + return formatWithArgumentRanges(self._s[4021]!, self._r[4021]!, [_0]) } - public var Theme_Context_ChangeColors: String { return self._s[4020]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[4021]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[4022]! } - public var Login_CodeExpiredError: String { return self._s[4023]! } - public var State_ConnectingToProxy: String { return self._s[4024]! } - public var TextFormat_Link: String { return self._s[4025]! } - public var Passport_Language_lv: String { return self._s[4026]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[4027]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[4028]! } - public var ProfilePhoto_SetMainVideo: String { return self._s[4029]! } - public var AutoDownloadSettings_Cellular: String { return self._s[4031]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[4032]! } + public var Theme_Context_ChangeColors: String { return self._s[4022]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[4023]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[4024]! } + public var Login_CodeExpiredError: String { return self._s[4025]! } + public var State_ConnectingToProxy: String { return self._s[4026]! } + public var TextFormat_Link: String { return self._s[4027]! } + public var Passport_Language_lv: String { return self._s[4028]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[4029]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[4030]! } + public var ProfilePhoto_SetMainVideo: String { return self._s[4031]! } + public var AutoDownloadSettings_Cellular: String { return self._s[4033]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[4034]! } public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4033]!, self._r[4033]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4035]!, self._r[4035]!, [_1, _2]) } - public var ChatList_EmptyChatListFilterTitle: String { return self._s[4034]! } - public var Checkout_PayNone: String { return self._s[4035]! } - public var NotificationsSound_Complete: String { return self._s[4037]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[4038]! } - public var AuthSessions_DevicesTitle: String { return self._s[4039]! } + public var ChatList_EmptyChatListFilterTitle: String { return self._s[4036]! } + public var Checkout_PayNone: String { return self._s[4037]! } + public var NotificationsSound_Complete: String { return self._s[4039]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[4040]! } + public var AuthSessions_DevicesTitle: String { return self._s[4041]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4040]!, self._r[4040]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4042]!, self._r[4042]!, [_0, _1]) } - public var Message_LiveLocation: String { return self._s[4041]! } - public var Watch_Suggestion_BRB: String { return self._s[4042]! } - public var Channel_BanUser_Title: String { return self._s[4043]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[4044]! } - public var Conversation_Dice_u1F3C0: String { return self._s[4045]! } - public var Conversation_ClearSelfHistory: String { return self._s[4046]! } - public var ProfilePhoto_OpenGallery: String { return self._s[4047]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[4048]! } - public var Weekday_Thursday: String { return self._s[4049]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[4050]! } - public var Privacy_ProfilePhoto: String { return self._s[4052]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[4053]! } + public var Message_LiveLocation: String { return self._s[4043]! } + public var Watch_Suggestion_BRB: String { return self._s[4044]! } + public var Channel_BanUser_Title: String { return self._s[4045]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[4046]! } + public var Conversation_Dice_u1F3C0: String { return self._s[4047]! } + public var Conversation_ClearSelfHistory: String { return self._s[4048]! } + public var ProfilePhoto_OpenGallery: String { return self._s[4049]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[4050]! } + public var Weekday_Thursday: String { return self._s[4051]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[4052]! } + public var Privacy_ProfilePhoto: String { return self._s[4054]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[4055]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4054]!, self._r[4054]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4056]!, self._r[4056]!, [_1, _2]) } - public var Message_Audio: String { return self._s[4055]! } - public var Conversation_Info: String { return self._s[4056]! } - public var Cache_Videos: String { return self._s[4057]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[4058]! } - public var Channel_ErrorAddTooMuch: String { return self._s[4059]! } + public var Message_Audio: String { return self._s[4057]! } + public var Conversation_Info: String { return self._s[4058]! } + public var Cache_Videos: String { return self._s[4059]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[4060]! } + public var Channel_ErrorAddTooMuch: String { return self._s[4061]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4060]!, self._r[4060]!, [_0]) + return formatWithArgumentRanges(self._s[4062]!, self._r[4062]!, [_0]) } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[4062]! } - public var ScheduledMessages_Title: String { return self._s[4064]! } - public var ShareFileTip_Title: String { return self._s[4067]! } - public var Chat_Gifs_TrendingSectionHeader: String { return self._s[4068]! } - public var ChatList_RemoveFolderConfirmation: String { return self._s[4069]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[4064]! } + public var ScheduledMessages_Title: String { return self._s[4066]! } + public var ShareFileTip_Title: String { return self._s[4069]! } + public var Chat_Gifs_TrendingSectionHeader: String { return self._s[4070]! } + public var ChatList_RemoveFolderConfirmation: String { return self._s[4071]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4070]!, self._r[4070]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4072]!, self._r[4072]!, [_1, _2]) } - public var Conversation_ContextViewStats: String { return self._s[4072]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[4073]! } - public var PasscodeSettings_Title: String { return self._s[4074]! } - public var Channel_AdminLog_SendPolls: String { return self._s[4075]! } - public var LastSeen_ALongTimeAgo: String { return self._s[4076]! } + public var Conversation_ContextViewStats: String { return self._s[4074]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[4075]! } + public var PasscodeSettings_Title: String { return self._s[4076]! } + public var Channel_AdminLog_SendPolls: String { return self._s[4077]! } + public var LastSeen_ALongTimeAgo: String { return self._s[4078]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4077]!, self._r[4077]!, [_1]) + return formatWithArgumentRanges(self._s[4079]!, self._r[4079]!, [_1]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4078]! } - public var CallFeedback_VideoReasonLowQuality: String { return self._s[4079]! } - public var Conversation_PinnedPreviousMessage: String { return self._s[4080]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[4081]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[4082]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4080]! } + public var CallFeedback_VideoReasonLowQuality: String { return self._s[4081]! } + public var Conversation_PinnedPreviousMessage: String { return self._s[4082]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[4083]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[4084]! } public func ChatList_RemovedFromFolderTooltip(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4083]!, self._r[4083]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4085]!, self._r[4085]!, [_1, _2]) } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4084]!, self._r[4084]!, [_0]) + return formatWithArgumentRanges(self._s[4086]!, self._r[4086]!, [_0]) } - public var Passport_Identity_GenderFemale: String { return self._s[4085]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[4088]! } - public var Location_ProximityNotification_DistanceKM: String { return self._s[4089]! } - public var VoiceChat_Audio: String { return self._s[4090]! } - public var SharedMedia_TitleAll: String { return self._s[4091]! } - public var Settings_Context_Logout: String { return self._s[4092]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[4094]! } - public var Settings_About_Title: String { return self._s[4095]! } - public var StickerSettings_ContextHide: String { return self._s[4096]! } + public var Passport_Identity_GenderFemale: String { return self._s[4087]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[4090]! } + public var Location_ProximityNotification_DistanceKM: String { return self._s[4091]! } + public var VoiceChat_Audio: String { return self._s[4092]! } + public var SharedMedia_TitleAll: String { return self._s[4093]! } + public var Settings_Context_Logout: String { return self._s[4094]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[4096]! } + public var Settings_About_Title: String { return self._s[4097]! } + public var StickerSettings_ContextHide: String { return self._s[4098]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4097]!, self._r[4097]!, [_0]) + return formatWithArgumentRanges(self._s[4099]!, self._r[4099]!, [_0]) } public func Conversation_LiveLocationYouAndOther(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4098]!, self._r[4098]!, [_0]) + return formatWithArgumentRanges(self._s[4100]!, self._r[4100]!, [_0]) } - public var Common_Cancel: String { return self._s[4100]! } - public var CallFeedback_Title: String { return self._s[4102]! } + public var Common_Cancel: String { return self._s[4102]! } + public var CallFeedback_Title: String { return self._s[4104]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4103]!, self._r[4103]!, [_0]) + return formatWithArgumentRanges(self._s[4105]!, self._r[4105]!, [_0]) } - public var Activity_UploadingVideoMessage: String { return self._s[4104]! } - public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[4105]! } - public var MediaPicker_Send: String { return self._s[4106]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[4107]! } - public var Conversation_LiveLocationYou: String { return self._s[4108]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[4109]! } + public var Activity_UploadingVideoMessage: String { return self._s[4106]! } + public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[4107]! } + public var MediaPicker_Send: String { return self._s[4108]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[4109]! } + public var Conversation_LiveLocationYou: String { return self._s[4110]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[4111]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4110]!, self._r[4110]!, [_0]) + return formatWithArgumentRanges(self._s[4112]!, self._r[4112]!, [_0]) } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4111]!, self._r[4111]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4113]!, self._r[4113]!, [_1, _2]) } - public var Conversation_ViewBackground: String { return self._s[4112]! } - public var ChatSettings_PrivateChats: String { return self._s[4115]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[4116]! } - public var Wallet_Receive_AmountInfo: String { return self._s[4117]! } - public var Appearance_ThemeNight: String { return self._s[4118]! } - public var Common_Search: String { return self._s[4119]! } - public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[4120]! } - public var ChangePhoneNumberNumber_Help: String { return self._s[4122]! } - public var Stickers_SuggestAdded: String { return self._s[4123]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[4126]! } - public var NetworkUsageSettings_Cellular: String { return self._s[4127]! } - public var CheckoutInfo_Title: String { return self._s[4128]! } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[4129]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[4130]! } + public var Conversation_ViewBackground: String { return self._s[4114]! } + public var ChatSettings_PrivateChats: String { return self._s[4117]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[4118]! } + public var Wallet_Receive_AmountInfo: String { return self._s[4119]! } + public var Appearance_ThemeNight: String { return self._s[4120]! } + public var Common_Search: String { return self._s[4121]! } + public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[4122]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[4124]! } + public var Stickers_SuggestAdded: String { return self._s[4125]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[4128]! } + public var NetworkUsageSettings_Cellular: String { return self._s[4129]! } + public var CheckoutInfo_Title: String { return self._s[4130]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[4131]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[4132]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4131]!, self._r[4131]!, [_0]) + return formatWithArgumentRanges(self._s[4133]!, self._r[4133]!, [_0]) } - public var MaskStickerSettings_Info: String { return self._s[4133]! } - public var GroupRemoved_DeleteUser: String { return self._s[4135]! } - public var Contacts_ShareTelegram: String { return self._s[4136]! } - public var Group_UpgradeNoticeText1: String { return self._s[4137]! } + public var MaskStickerSettings_Info: String { return self._s[4135]! } + public var GroupRemoved_DeleteUser: String { return self._s[4137]! } + public var Contacts_ShareTelegram: String { return self._s[4138]! } + public var Group_UpgradeNoticeText1: String { return self._s[4139]! } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4138]!, self._r[4138]!, [_1]) + return formatWithArgumentRanges(self._s[4140]!, self._r[4140]!, [_1]) } - public var PrivacyLastSeenSettings_Title: String { return self._s[4139]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[4143]! } - public var PhotoEditor_TintTool: String { return self._s[4144]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[4146]! } - public var GroupPermission_NoSendPolls: String { return self._s[4147]! } - public var NotificationsSound_None: String { return self._s[4148]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[4141]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[4145]! } + public var PhotoEditor_TintTool: String { return self._s[4146]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[4148]! } + public var GroupPermission_NoSendPolls: String { return self._s[4149]! } + public var NotificationsSound_None: String { return self._s[4150]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4149]!, self._r[4149]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[4151]!, self._r[4151]!, [_1, "\(_2)"]) } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[4151]! } - public var ExplicitContent_AlertChannel: String { return self._s[4153]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[4154]! } - public var Contacts_SortedByPresence: String { return self._s[4155]! } - public var WallpaperSearch_ColorGray: String { return self._s[4156]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[4157]! } - public var Conversation_ReportSpam: String { return self._s[4158]! } - public var ChatList_Search_NoResultsFilter: String { return self._s[4161]! } - public var WallpaperSearch_ColorBlack: String { return self._s[4162]! } - public var ArchivedChats_IntroTitle3: String { return self._s[4163]! } - public var Conversation_DefaultRestrictedText: String { return self._s[4164]! } - public var Settings_Devices: String { return self._s[4165]! } - public var Call_AudioRouteSpeaker: String { return self._s[4166]! } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[4167]! } - public var Passport_Address_Country: String { return self._s[4169]! } - public var Cache_MaximumCacheSize: String { return self._s[4170]! } - public var Chat_PanelHidePinnedMessages: String { return self._s[4171]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[4172]! } - public var Wallet_Receive_CreateInvoice: String { return self._s[4174]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4175]! } - public var Login_TermsOfServiceLabel: String { return self._s[4176]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[4177]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[4178]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[4179]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[4180]! } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[4181]! } - public var ConvertToSupergroup_Note: String { return self._s[4183]! } - public var Settings_SetNewProfilePhotoOrVideo: String { return self._s[4184]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[4185]! } - public var Common_More: String { return self._s[4186]! } - public var ShareMenu_SelectChats: String { return self._s[4188]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[4153]! } + public var ExplicitContent_AlertChannel: String { return self._s[4155]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[4156]! } + public var Contacts_SortedByPresence: String { return self._s[4157]! } + public var WallpaperSearch_ColorGray: String { return self._s[4158]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[4159]! } + public var Conversation_ReportSpam: String { return self._s[4160]! } + public var ChatList_Search_NoResultsFilter: String { return self._s[4163]! } + public var WallpaperSearch_ColorBlack: String { return self._s[4164]! } + public var ArchivedChats_IntroTitle3: String { return self._s[4165]! } + public var Conversation_DefaultRestrictedText: String { return self._s[4166]! } + public var Settings_Devices: String { return self._s[4167]! } + public var Call_AudioRouteSpeaker: String { return self._s[4168]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[4169]! } + public var Passport_Address_Country: String { return self._s[4171]! } + public var Cache_MaximumCacheSize: String { return self._s[4172]! } + public var Chat_PanelHidePinnedMessages: String { return self._s[4173]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[4174]! } + public var Wallet_Receive_CreateInvoice: String { return self._s[4176]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4177]! } + public var Login_TermsOfServiceLabel: String { return self._s[4178]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[4179]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[4180]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[4181]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[4182]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[4183]! } + public var ConvertToSupergroup_Note: String { return self._s[4185]! } + public var Settings_SetNewProfilePhotoOrVideo: String { return self._s[4186]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[4187]! } + public var Common_More: String { return self._s[4188]! } + public var ShareMenu_SelectChats: String { return self._s[4190]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4190]!, self._r[4190]!, [_0]) + return formatWithArgumentRanges(self._s[4192]!, self._r[4192]!, [_0]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4191]!, self._r[4191]!, [_0]) + return formatWithArgumentRanges(self._s[4193]!, self._r[4193]!, [_0]) } - public var Contacts_PermissionsKeepDisabled: String { return self._s[4193]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[4195]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4194]!, self._r[4194]!, [_0]) + return formatWithArgumentRanges(self._s[4196]!, self._r[4196]!, [_0]) } - public var WatchRemote_AlertOpen: String { return self._s[4195]! } + public var WatchRemote_AlertOpen: String { return self._s[4197]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4196]!, self._r[4196]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4198]!, self._r[4198]!, [_1, _2, _3]) } - public var Channel_Members_AddMembersHelp: String { return self._s[4197]! } - public var Shortcut_SwitchAccount: String { return self._s[4198]! } - public var Map_LiveLocationFor8Hours: String { return self._s[4199]! } + public var Channel_Members_AddMembersHelp: String { return self._s[4199]! } + public var Shortcut_SwitchAccount: String { return self._s[4200]! } + public var Map_LiveLocationFor8Hours: String { return self._s[4201]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4200]!, self._r[4200]!, [_0]) + return formatWithArgumentRanges(self._s[4202]!, self._r[4202]!, [_0]) } - public var Compose_NewGroupTitle: String { return self._s[4201]! } - public var DialogList_You: String { return self._s[4202]! } - public var ReportPeer_ReasonViolence: String { return self._s[4203]! } + public var Compose_NewGroupTitle: String { return self._s[4203]! } + public var DialogList_You: String { return self._s[4204]! } + public var ReportPeer_ReasonViolence: String { return self._s[4205]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4204]!, self._r[4204]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4206]!, self._r[4206]!, [_1, _2]) } - public var VoiceChat_Reconnecting: String { return self._s[4207]! } - public var KeyCommand_ScrollDown: String { return self._s[4209]! } - public var ChatSettings_DownloadInBackground: String { return self._s[4210]! } - public var Wallpaper_ResetWallpapers: String { return self._s[4211]! } - public var Channel_BanList_RestrictedTitle: String { return self._s[4212]! } - public var ArchivedChats_IntroText3: String { return self._s[4213]! } - public var HashtagSearch_AllChats: String { return self._s[4215]! } - public var VoiceChat_EndVoiceChat: String { return self._s[4216]! } - public var Channel_Info_BlackList: String { return self._s[4218]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[4219]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[4220]! } - public var Paint_Neon: String { return self._s[4222]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[4223]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[4224]! } + public var VoiceChat_Reconnecting: String { return self._s[4209]! } + public var KeyCommand_ScrollDown: String { return self._s[4211]! } + public var ChatSettings_DownloadInBackground: String { return self._s[4212]! } + public var Wallpaper_ResetWallpapers: String { return self._s[4213]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[4214]! } + public var ArchivedChats_IntroText3: String { return self._s[4215]! } + public var HashtagSearch_AllChats: String { return self._s[4217]! } + public var VoiceChat_EndVoiceChat: String { return self._s[4218]! } + public var Channel_Info_BlackList: String { return self._s[4220]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[4221]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[4222]! } + public var Paint_Neon: String { return self._s[4224]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[4225]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[4226]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4226]!, self._r[4226]!, [_0]) + return formatWithArgumentRanges(self._s[4228]!, self._r[4228]!, [_0]) } - public var Map_StopLiveLocation: String { return self._s[4227]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[4228]! } - public var Channel_Username_InvalidCharacters: String { return self._s[4229]! } - public var InstantPage_Reference: String { return self._s[4230]! } - public var ChatList_HideAction: String { return self._s[4232]! } - public var Conversation_FileICloudDrive: String { return self._s[4234]! } + public var Map_StopLiveLocation: String { return self._s[4229]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[4230]! } + public var Channel_Username_InvalidCharacters: String { return self._s[4231]! } + public var InstantPage_Reference: String { return self._s[4232]! } + public var ChatList_HideAction: String { return self._s[4234]! } + public var Conversation_FileICloudDrive: String { return self._s[4236]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4235]!, self._r[4235]!, [_1]) + return formatWithArgumentRanges(self._s[4237]!, self._r[4237]!, [_1]) } - public var Passport_PasswordReset: String { return self._s[4237]! } - public var ChatList_Context_UnhideArchive: String { return self._s[4239]! } - public var ConvertToSupergroup_HelpText: String { return self._s[4240]! } - public var Calls_AddTab: String { return self._s[4241]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[4242]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[4243]! } - public var Privacy_GroupsAndChannels: String { return self._s[4246]! } - public var AutoNightTheme_Disabled: String { return self._s[4247]! } - public var CreatePoll_MultipleChoice: String { return self._s[4248]! } + public var Passport_PasswordReset: String { return self._s[4239]! } + public var ChatList_Context_UnhideArchive: String { return self._s[4241]! } + public var ConvertToSupergroup_HelpText: String { return self._s[4242]! } + public var Calls_AddTab: String { return self._s[4243]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[4244]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[4245]! } + public var Privacy_GroupsAndChannels: String { return self._s[4248]! } + public var AutoNightTheme_Disabled: String { return self._s[4249]! } + public var CreatePoll_MultipleChoice: String { return self._s[4250]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4249]!, self._r[4249]!, [_1]) + return formatWithArgumentRanges(self._s[4251]!, self._r[4251]!, [_1]) } - public var Watch_Bot_Restart: String { return self._s[4251]! } + public var Watch_Bot_Restart: String { return self._s[4253]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4252]!, self._r[4252]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[4254]!, self._r[4254]!, ["\(_0)"]) } - public var GroupInfo_ScamGroupWarning: String { return self._s[4254]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[4255]! } - public var Appearance_PreviewIncomingText: String { return self._s[4256]! } - public var ChatSettings_WidgetSettings: String { return self._s[4257]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[4258]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[4260]! } - public var Stats_GroupOverview: String { return self._s[4262]! } - public var ScheduledMessages_EditTime: String { return self._s[4265]! } - public var Month_GenFebruary: String { return self._s[4266]! } - public var ChatList_AutoarchiveSuggestion_OpenSettings: String { return self._s[4267]! } - public var Stickers_ClearRecent: String { return self._s[4268]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[4269]! } - public var Stats_Message_PublicShares: String { return self._s[4270]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[4256]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[4257]! } + public var Appearance_PreviewIncomingText: String { return self._s[4258]! } + public var ChatSettings_WidgetSettings: String { return self._s[4259]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[4260]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[4262]! } + public var Stats_GroupOverview: String { return self._s[4264]! } + public var ScheduledMessages_EditTime: String { return self._s[4267]! } + public var Month_GenFebruary: String { return self._s[4268]! } + public var ChatList_AutoarchiveSuggestion_OpenSettings: String { return self._s[4269]! } + public var Stickers_ClearRecent: String { return self._s[4270]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[4271]! } + public var Stats_Message_PublicShares: String { return self._s[4272]! } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4271]!, self._r[4271]!, [_0]) + return formatWithArgumentRanges(self._s[4273]!, self._r[4273]!, [_0]) } - public var Login_TermsOfServiceSignupDecline: String { return self._s[4272]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[4273]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[4274]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[4275]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[4277]! } - public var CreatePoll_Create: String { return self._s[4278]! } - public var ChatList_Search_FilterLinks: String { return self._s[4279]! } - public var Your_cards_number_is_invalid: String { return self._s[4280]! } - public var Month_ShortApril: String { return self._s[4281]! } - public var SocksProxySetup_UseForCalls: String { return self._s[4282]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[4283]! } - public var SocksProxySetup_Status: String { return self._s[4284]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[4285]! } - public var ChatListFolder_CategoryBots: String { return self._s[4286]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[4288]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[4289]! } - public var Chat_PinnedListPreview_UnpinAllMessages: String { return self._s[4290]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[4291]! } - public var Conversation_TitleUnmute: String { return self._s[4292]! } - public var Group_Setup_TypeHeader: String { return self._s[4293]! } - public var Stats_ViewsPerPost: String { return self._s[4294]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[4295]! } - public var Passport_Identity_TranslationHelp: String { return self._s[4296]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[4274]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[4275]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[4276]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[4277]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[4279]! } + public var CreatePoll_Create: String { return self._s[4280]! } + public var ChatList_Search_FilterLinks: String { return self._s[4281]! } + public var Your_cards_number_is_invalid: String { return self._s[4282]! } + public var Month_ShortApril: String { return self._s[4283]! } + public var SocksProxySetup_UseForCalls: String { return self._s[4284]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[4285]! } + public var SocksProxySetup_Status: String { return self._s[4286]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[4287]! } + public var ChatListFolder_CategoryBots: String { return self._s[4288]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[4290]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[4291]! } + public var Chat_PinnedListPreview_UnpinAllMessages: String { return self._s[4292]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[4293]! } + public var Conversation_TitleUnmute: String { return self._s[4294]! } + public var Group_Setup_TypeHeader: String { return self._s[4295]! } + public var Stats_ViewsPerPost: String { return self._s[4296]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[4297]! } + public var Passport_Identity_TranslationHelp: String { return self._s[4298]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4297]!, self._r[4297]!, [_1]) + return formatWithArgumentRanges(self._s[4299]!, self._r[4299]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[4298]! } + public var GroupInfo_Administrators_Title: String { return self._s[4300]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4299]!, self._r[4299]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4301]!, self._r[4301]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4300]!, self._r[4300]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4302]!, self._r[4302]!, [_1, _2, _3]) } - public var Wallet_Receive_Title: String { return self._s[4301]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[4302]! } - public var Passport_Language_my: String { return self._s[4304]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[4305]! } - public var Map_PlacesNearby: String { return self._s[4306]! } - public var Channel_About_Help: String { return self._s[4307]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[4308]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[4309]! } - public var Channel_Username_Title: String { return self._s[4310]! } - public var Activity_RecordingVideoMessage: String { return self._s[4311]! } + public var Wallet_Receive_Title: String { return self._s[4303]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[4304]! } + public var Passport_Language_my: String { return self._s[4306]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[4307]! } + public var Map_PlacesNearby: String { return self._s[4308]! } + public var Channel_About_Help: String { return self._s[4309]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[4310]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[4311]! } + public var Channel_Username_Title: String { return self._s[4312]! } + public var Activity_RecordingVideoMessage: String { return self._s[4313]! } public func StickerPackActionInfo_RemovedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4312]!, self._r[4312]!, [_0]) + return formatWithArgumentRanges(self._s[4314]!, self._r[4314]!, [_0]) } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[4313]! } - public var Passport_DiscardMessageDescription: String { return self._s[4314]! } - public var Conversation_LinkDialogOpen: String { return self._s[4315]! } - public var ChatList_Context_HideArchive: String { return self._s[4316]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[4315]! } + public var Passport_DiscardMessageDescription: String { return self._s[4316]! } + public var Conversation_LinkDialogOpen: String { return self._s[4317]! } + public var ChatList_Context_HideArchive: String { return self._s[4318]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4317]!, self._r[4317]!, [_0]) + return formatWithArgumentRanges(self._s[4319]!, self._r[4319]!, [_0]) } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[4318]! } - public var Conversation_Admin: String { return self._s[4319]! } - public var DialogList_TabTitle: String { return self._s[4320]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[4320]! } + public var Conversation_Admin: String { return self._s[4321]! } + public var DialogList_TabTitle: String { return self._s[4322]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4321]!, self._r[4321]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4323]!, self._r[4323]!, [_1, _2]) } - public var Notifications_PermissionsUnreachableText: String { return self._s[4322]! } - public var Passport_Identity_GenderMale: String { return self._s[4324]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4326]! } - public var PhoneNumberHelp_Alert: String { return self._s[4327]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[4328]! } - public var Notifications_InAppNotifications: String { return self._s[4329]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[4324]! } + public var Passport_Identity_GenderMale: String { return self._s[4326]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4328]! } + public var PhoneNumberHelp_Alert: String { return self._s[4329]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[4330]! } + public var Notifications_InAppNotifications: String { return self._s[4331]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4330]!, self._r[4330]!, [_0]) + return formatWithArgumentRanges(self._s[4332]!, self._r[4332]!, [_0]) } - public var Notification_VideoCallOutgoing: String { return self._s[4331]! } - public var Login_InvalidCodeError: String { return self._s[4332]! } - public var Conversation_PrivateChannelTimeLimitedAlertJoin: String { return self._s[4333]! } + public var Notification_VideoCallOutgoing: String { return self._s[4333]! } + public var Login_InvalidCodeError: String { return self._s[4334]! } + public var Conversation_PrivateChannelTimeLimitedAlertJoin: String { return self._s[4335]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4334]!, self._r[4334]!, [_0]) + return formatWithArgumentRanges(self._s[4336]!, self._r[4336]!, [_0]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[4336]! } - public var ReportPeer_Report: String { return self._s[4337]! } - public var Camera_FlashOff: String { return self._s[4340]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[4343]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[4346]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[4347]! } - public var Passport_FieldEmail: String { return self._s[4348]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[4338]! } + public var ReportPeer_Report: String { return self._s[4339]! } + public var Camera_FlashOff: String { return self._s[4342]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[4345]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[4348]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[4349]! } + public var Passport_FieldEmail: String { return self._s[4350]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4349]!, self._r[4349]!, [_1]) + return formatWithArgumentRanges(self._s[4351]!, self._r[4351]!, [_1]) } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[4350]! } - public var PeerInfo_PaneVoiceAndVideo: String { return self._s[4351]! } - public var Group_OwnershipTransfer_Title: String { return self._s[4352]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[4353]! } - public var Login_PhoneNumberHelp: String { return self._s[4355]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[4356]! } - public var Conversation_PinnedQuiz: String { return self._s[4357]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[4358]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[4359]! } - public var Group_MessagePhotoUpdated: String { return self._s[4360]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[4361]! } - public var Passport_Identity_Translations: String { return self._s[4363]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[4364]! } - public var ChannelInfo_DeleteChannel: String { return self._s[4366]! } - public var PasscodeSettings_HelpBottom: String { return self._s[4367]! } - public var Channel_Members_AddMembers: String { return self._s[4368]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[4369]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[4371]! } - public var Conversation_HoldForAudio: String { return self._s[4372]! } - public var Watch_LastSeen_Lately: String { return self._s[4374]! } - public var ChatList_Context_MarkAsRead: String { return self._s[4375]! } - public var Conversation_PinnedMessage: String { return self._s[4376]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[4377]! } - public var Passport_UpdateRequiredError: String { return self._s[4379]! } - public var PrivacySettings_Passcode: String { return self._s[4380]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[4352]! } + public var PeerInfo_PaneVoiceAndVideo: String { return self._s[4353]! } + public var Group_OwnershipTransfer_Title: String { return self._s[4354]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[4355]! } + public var Login_PhoneNumberHelp: String { return self._s[4357]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[4358]! } + public var Conversation_PinnedQuiz: String { return self._s[4359]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[4360]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[4361]! } + public var Group_MessagePhotoUpdated: String { return self._s[4362]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[4363]! } + public var Passport_Identity_Translations: String { return self._s[4365]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[4366]! } + public var ChannelInfo_DeleteChannel: String { return self._s[4368]! } + public var PasscodeSettings_HelpBottom: String { return self._s[4369]! } + public var Channel_Members_AddMembers: String { return self._s[4370]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[4371]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[4373]! } + public var Conversation_HoldForAudio: String { return self._s[4374]! } + public var Watch_LastSeen_Lately: String { return self._s[4376]! } + public var ChatList_Context_MarkAsRead: String { return self._s[4377]! } + public var Conversation_PinnedMessage: String { return self._s[4378]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[4379]! } + public var Passport_UpdateRequiredError: String { return self._s[4381]! } + public var PrivacySettings_Passcode: String { return self._s[4382]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4381]!, self._r[4381]!, [_0]) + return formatWithArgumentRanges(self._s[4383]!, self._r[4383]!, [_0]) } - public var AutoNightTheme_NotAvailable: String { return self._s[4382]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[4383]! } - public var VoiceOver_Common_On: String { return self._s[4384]! } - public var LoginPassword_InvalidPasswordError: String { return self._s[4385]! } - public var ChatListFolder_IncludedSectionHeader: String { return self._s[4386]! } - public var Channel_SignMessages_Help: String { return self._s[4387]! } - public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[4388]! } - public var Conversation_TitleNoComments: String { return self._s[4389]! } - public var MediaPicker_LivePhotoDescription: String { return self._s[4390]! } - public var GroupInfo_Permissions: String { return self._s[4391]! } - public var GroupPermission_NoSendLinks: String { return self._s[4394]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[4395]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[4397]! } - public var ChatList_ArchiveAction: String { return self._s[4398]! } + public var AutoNightTheme_NotAvailable: String { return self._s[4384]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[4385]! } + public var VoiceOver_Common_On: String { return self._s[4386]! } + public var LoginPassword_InvalidPasswordError: String { return self._s[4387]! } + public var ChatListFolder_IncludedSectionHeader: String { return self._s[4388]! } + public var Channel_SignMessages_Help: String { return self._s[4389]! } + public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[4390]! } + public var Conversation_TitleNoComments: String { return self._s[4391]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[4392]! } + public var GroupInfo_Permissions: String { return self._s[4393]! } + public var GroupPermission_NoSendLinks: String { return self._s[4396]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[4397]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[4399]! } + public var ChatList_ArchiveAction: String { return self._s[4400]! } public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4399]!, self._r[4399]!, [_0]) + return formatWithArgumentRanges(self._s[4401]!, self._r[4401]!, [_0]) } - public var GroupInfo_GroupHistory: String { return self._s[4400]! } + public var GroupInfo_GroupHistory: String { return self._s[4402]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4402]!, self._r[4402]!, [_0]) + return formatWithArgumentRanges(self._s[4404]!, self._r[4404]!, [_0]) } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[4404]! } - public var Channel_Info_Banned: String { return self._s[4405]! } - public var Paint_RecentStickers: String { return self._s[4406]! } - public var VoiceOver_MessageContextSend: String { return self._s[4407]! } - public var Group_ErrorNotMutualContact: String { return self._s[4408]! } - public var ReportPeer_ReasonOther: String { return self._s[4410]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[4411]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[4413]! } - public var KeyCommand_Find: String { return self._s[4414]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[4406]! } + public var Channel_Info_Banned: String { return self._s[4407]! } + public var Paint_RecentStickers: String { return self._s[4408]! } + public var VoiceOver_MessageContextSend: String { return self._s[4409]! } + public var Group_ErrorNotMutualContact: String { return self._s[4410]! } + public var ReportPeer_ReasonOther: String { return self._s[4412]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[4413]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[4415]! } + public var KeyCommand_Find: String { return self._s[4416]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4415]!, self._r[4415]!, [_0]) + return formatWithArgumentRanges(self._s[4417]!, self._r[4417]!, [_0]) } - public var ChatList_Context_Unmute: String { return self._s[4416]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[4417]! } - public var Stickers_GroupStickersHelp: String { return self._s[4418]! } - public var Wallet_Configuration_BlockchainIdPlaceholder: String { return self._s[4419]! } - public var Checkout_Title: String { return self._s[4420]! } - public var Activity_RecordingAudio: String { return self._s[4421]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4422]! } - public var BlockedUsers_BlockTitle: String { return self._s[4423]! } - public var Wallet_Month_ShortFebruary: String { return self._s[4425]! } - public var Calls_All: String { return self._s[4426]! } - public var DialogList_SavedMessagesHelp: String { return self._s[4428]! } - public var Settings_FAQ_Button: String { return self._s[4429]! } - public var Conversation_Dice_u1F3B0: String { return self._s[4431]! } + public var ChatList_Context_Unmute: String { return self._s[4418]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[4419]! } + public var Stickers_GroupStickersHelp: String { return self._s[4420]! } + public var Wallet_Configuration_BlockchainIdPlaceholder: String { return self._s[4421]! } + public var Checkout_Title: String { return self._s[4422]! } + public var Activity_RecordingAudio: String { return self._s[4423]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4424]! } + public var BlockedUsers_BlockTitle: String { return self._s[4425]! } + public var Wallet_Month_ShortFebruary: String { return self._s[4427]! } + public var Calls_All: String { return self._s[4428]! } + public var DialogList_SavedMessagesHelp: String { return self._s[4430]! } + public var Settings_FAQ_Button: String { return self._s[4431]! } + public var Conversation_Dice_u1F3B0: String { return self._s[4433]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4432]!, self._r[4432]!, [_0]) + return formatWithArgumentRanges(self._s[4434]!, self._r[4434]!, [_0]) } - public var Conversation_ReportGroupLocation: String { return self._s[4433]! } - public var Passport_Scans_Upload: String { return self._s[4434]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[4436]! } - public var ChatList_UnarchiveAction: String { return self._s[4437]! } - public var Stats_GroupTopInviter_History: String { return self._s[4438]! } - public var GroupInfo_Permissions_Title: String { return self._s[4439]! } - public var Passport_Language_el: String { return self._s[4440]! } + public var Conversation_ReportGroupLocation: String { return self._s[4435]! } + public var Passport_Scans_Upload: String { return self._s[4436]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[4438]! } + public var ChatList_UnarchiveAction: String { return self._s[4439]! } + public var Stats_GroupTopInviter_History: String { return self._s[4440]! } + public var GroupInfo_Permissions_Title: String { return self._s[4441]! } + public var VoiceChat_CreateNewVoiceChatStart: String { return self._s[4442]! } + public var Passport_Language_el: String { return self._s[4443]! } public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4441]!, self._r[4441]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4444]!, self._r[4444]!, [_1, _2, _3]) } - public var Channel_DiscussionMessageUnavailable: String { return self._s[4442]! } - public var GroupInfo_ActionPromote: String { return self._s[4443]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[4444]! } + public var Channel_DiscussionMessageUnavailable: String { return self._s[4445]! } + public var GroupInfo_ActionPromote: String { return self._s[4446]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[4447]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4445]!, self._r[4445]!, [_0]) + return formatWithArgumentRanges(self._s[4448]!, self._r[4448]!, [_0]) } - public var VoiceOver_Chat_Reply: String { return self._s[4446]! } - public var Month_GenMay: String { return self._s[4447]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[4448]! } - public var Chat_PsaTooltip_covid: String { return self._s[4449]! } - public var Watch_Suggestion_CantTalk: String { return self._s[4450]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[4451]! } - public var AppUpgrade_Running: String { return self._s[4452]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[4455]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[4456]! } - public var SharedMedia_EmptyText: String { return self._s[4457]! } - public var Passport_Address_EditResidentialAddress: String { return self._s[4458]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[4459]! } - public var Message_PinnedGame: String { return self._s[4460]! } - public var KeyCommand_SearchInChat: String { return self._s[4461]! } - public var Appearance_ThemeCarouselNewNight: String { return self._s[4462]! } - public var ChatList_Search_FilterMedia: String { return self._s[4463]! } - public var Message_PinnedAudioMessage: String { return self._s[4464]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[4465]! } + public var VoiceOver_Chat_Reply: String { return self._s[4449]! } + public var Month_GenMay: String { return self._s[4450]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[4451]! } + public var Chat_PsaTooltip_covid: String { return self._s[4452]! } + public var Watch_Suggestion_CantTalk: String { return self._s[4453]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[4454]! } + public var AppUpgrade_Running: String { return self._s[4455]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[4458]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[4459]! } + public var SharedMedia_EmptyText: String { return self._s[4460]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[4461]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[4462]! } + public var Message_PinnedGame: String { return self._s[4463]! } + public var KeyCommand_SearchInChat: String { return self._s[4464]! } + public var Appearance_ThemeCarouselNewNight: String { return self._s[4465]! } + public var ChatList_Search_FilterMedia: String { return self._s[4466]! } + public var Message_PinnedAudioMessage: String { return self._s[4467]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[4468]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4466]!, self._r[4466]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4469]!, self._r[4469]!, [_1, _2]) } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4467]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4470]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4468]!, self._r[4468]!, [_0]) + return formatWithArgumentRanges(self._s[4471]!, self._r[4471]!, [_0]) } - public var Wallet_Receive_AddressCopied: String { return self._s[4469]! } + public var Wallet_Receive_AddressCopied: String { return self._s[4472]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4470]!, self._r[4470]!, [_0]) + return formatWithArgumentRanges(self._s[4473]!, self._r[4473]!, [_0]) } - public var Settings_AddAccount: String { return self._s[4471]! } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[4472]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[4473]! } - public var Channel_JoinChannel: String { return self._s[4474]! } - public var Watch_UserInfo_Unblock: String { return self._s[4475]! } - public var PhoneLabel_Title: String { return self._s[4476]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[4478]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[4479]! } + public var Settings_AddAccount: String { return self._s[4474]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[4475]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[4476]! } + public var Channel_JoinChannel: String { return self._s[4477]! } + public var Watch_UserInfo_Unblock: String { return self._s[4478]! } + public var PhoneLabel_Title: String { return self._s[4479]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[4481]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[4482]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4480]!, self._r[4480]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[4483]!, self._r[4483]!, [_1, _2, _3, _4, _5, _6]) } - public var Wallet_Month_GenOctober: String { return self._s[4481]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[4482]! } - public var ChatList_TabIconFoldersTooltipNonEmptyFolders: String { return self._s[4483]! } - public var DialogList_EncryptionProcessing: String { return self._s[4484]! } - public var ChatList_Search_FilterChats: String { return self._s[4485]! } - public var WatchRemote_NotificationText: String { return self._s[4486]! } - public var EditTheme_ChangeColors: String { return self._s[4487]! } - public var GroupRemoved_ViewUserInfo: String { return self._s[4488]! } - public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[4489]! } - public var CallSettings_OnMobile: String { return self._s[4491]! } - public var Month_ShortFebruary: String { return self._s[4493]! } - public var VoiceOver_MessageContextReply: String { return self._s[4494]! } + public var Wallet_Month_GenOctober: String { return self._s[4484]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[4485]! } + public var ChatList_TabIconFoldersTooltipNonEmptyFolders: String { return self._s[4486]! } + public var DialogList_EncryptionProcessing: String { return self._s[4487]! } + public var ChatList_Search_FilterChats: String { return self._s[4488]! } + public var WatchRemote_NotificationText: String { return self._s[4489]! } + public var EditTheme_ChangeColors: String { return self._s[4490]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[4491]! } + public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[4492]! } + public var CallSettings_OnMobile: String { return self._s[4494]! } + public var Month_ShortFebruary: String { return self._s[4496]! } + public var VoiceOver_MessageContextReply: String { return self._s[4497]! } public func PUSH_VIDEO_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4495]!, self._r[4495]!, [_1]) + return formatWithArgumentRanges(self._s[4498]!, self._r[4498]!, [_1]) } - public var Group_Location_ChangeLocation: String { return self._s[4496]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[4498]! } - public var Wallet_Send_EncryptComment: String { return self._s[4499]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[4500]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[4501]! } + public var Group_Location_ChangeLocation: String { return self._s[4499]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[4501]! } + public var Wallet_Send_EncryptComment: String { return self._s[4502]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[4503]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[4504]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4503]!, self._r[4503]!, [_0]) + return formatWithArgumentRanges(self._s[4506]!, self._r[4506]!, [_0]) } - public var PhotoEditor_WarmthTool: String { return self._s[4504]! } - public var Login_InfoAvatarPhoto: String { return self._s[4505]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[4506]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[4507]! } - public var Map_PlacesInThisArea: String { return self._s[4508]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[4509]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[4510]! } + public var PhotoEditor_WarmthTool: String { return self._s[4507]! } + public var Login_InfoAvatarPhoto: String { return self._s[4508]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[4509]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[4510]! } + public var Map_PlacesInThisArea: String { return self._s[4511]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[4512]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[4513]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4511]!, self._r[4511]!, [_1]) - } - public var ShareMenu_Send: String { return self._s[4512]! } - public var Username_InvalidStartsWithNumber: String { return self._s[4513]! } - public func Channel_AdminLog_StartedVoiceChat(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4514]!, self._r[4514]!, [_1]) } - public var Appearance_AppIconClassicX: String { return self._s[4515]! } + public var ShareMenu_Send: String { return self._s[4515]! } + public var Username_InvalidStartsWithNumber: String { return self._s[4516]! } + public func Channel_AdminLog_StartedVoiceChat(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4517]!, self._r[4517]!, [_1]) + } + public var Appearance_AppIconClassicX: String { return self._s[4518]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4516]!, self._r[4516]!, [_1]) + return formatWithArgumentRanges(self._s[4519]!, self._r[4519]!, [_1]) } - public var Conversation_StopPoll: String { return self._s[4517]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[4519]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[4520]! } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[4521]! } - public var Wallet_WordCheck_Title: String { return self._s[4522]! } - public var Conversation_Timer_Title: String { return self._s[4523]! } - public var Common_Next: String { return self._s[4524]! } - public var Notification_Exceptions_NewException: String { return self._s[4525]! } + public var Conversation_StopPoll: String { return self._s[4520]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[4522]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[4523]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[4524]! } + public var Wallet_WordCheck_Title: String { return self._s[4525]! } + public var Conversation_Timer_Title: String { return self._s[4526]! } + public var Common_Next: String { return self._s[4527]! } + public var Notification_Exceptions_NewException: String { return self._s[4528]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4526]!, self._r[4526]!, [_0]) + return formatWithArgumentRanges(self._s[4529]!, self._r[4529]!, [_0]) } - public var AccessDenied_CallMicrophone: String { return self._s[4527]! } - public var VoiceChat_UnmutePeer: String { return self._s[4528]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[4529]! } - public var ChangePhoneNumberCode_Help: String { return self._s[4530]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[4531]! } - public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[4532]! } - public var BlockedUsers_LeavePrefix: String { return self._s[4533]! } + public var AccessDenied_CallMicrophone: String { return self._s[4530]! } + public var VoiceChat_UnmutePeer: String { return self._s[4531]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[4532]! } + public var ChangePhoneNumberCode_Help: String { return self._s[4533]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[4534]! } + public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[4535]! } + public var BlockedUsers_LeavePrefix: String { return self._s[4536]! } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4534]!, self._r[4534]!, [_0]) + return formatWithArgumentRanges(self._s[4537]!, self._r[4537]!, [_0]) } - public var Group_About_Help: String { return self._s[4535]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[4536]! } - public var Tour_Title3: String { return self._s[4537]! } - public var Watch_Conversation_Unblock: String { return self._s[4538]! } - public var Watch_UserInfo_Block: String { return self._s[4539]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[4540]! } - public var TwoFactorSetup_Hint_Action: String { return self._s[4541]! } - public var IntentsSettings_SuggestedChatsInfo: String { return self._s[4542]! } - public var Wallet_Alert_Cancel: String { return self._s[4543]! } - public var TextFormat_AddLinkTitle: String { return self._s[4544]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[4545]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[4546]! } - public var FastTwoStepSetup_PasswordSection: String { return self._s[4547]! } - public var Compose_ChannelMembers: String { return self._s[4548]! } - public var Conversation_ForwardTitle: String { return self._s[4549]! } + public var Group_About_Help: String { return self._s[4538]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[4539]! } + public var Tour_Title3: String { return self._s[4540]! } + public var Watch_Conversation_Unblock: String { return self._s[4541]! } + public var Watch_UserInfo_Block: String { return self._s[4542]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[4543]! } + public var TwoFactorSetup_Hint_Action: String { return self._s[4544]! } + public var IntentsSettings_SuggestedChatsInfo: String { return self._s[4545]! } + public var Wallet_Alert_Cancel: String { return self._s[4546]! } + public var TextFormat_AddLinkTitle: String { return self._s[4547]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[4548]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[4549]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[4550]! } + public var Compose_ChannelMembers: String { return self._s[4551]! } + public var Conversation_ForwardTitle: String { return self._s[4552]! } public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4550]!, self._r[4550]!, [_0]) - } - public var Conversation_PinnedPoll: String { return self._s[4552]! } - public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4553]!, self._r[4553]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4554]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4555]! } - public var Stats_Overview: String { return self._s[4556]! } - public var Map_HomeAndWorkTitle: String { return self._s[4557]! } - public var Wallet_Intro_Terms: String { return self._s[4558]! } + public var Conversation_PinnedPoll: String { return self._s[4555]! } + public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4556]!, self._r[4556]!, [_0]) + } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4557]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4558]! } + public var Stats_Overview: String { return self._s[4559]! } + public var Map_HomeAndWorkTitle: String { return self._s[4560]! } + public var Wallet_Intro_Terms: String { return self._s[4561]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4559]!, self._r[4559]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4562]!, self._r[4562]!, [_1, _2, _3]) } - public var Passport_Address_CityPlaceholder: String { return self._s[4560]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[4561]! } - public var Privacy_PhoneNumber: String { return self._s[4562]! } - public var ChatList_Search_FilterFiles: String { return self._s[4563]! } - public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[4564]! } - public var ChannelIntro_CreateChannel: String { return self._s[4565]! } - public var Conversation_InputTextAnonymousPlaceholder: String { return self._s[4566]! } + public var Passport_Address_CityPlaceholder: String { return self._s[4563]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[4564]! } + public var Privacy_PhoneNumber: String { return self._s[4565]! } + public var ChatList_Search_FilterFiles: String { return self._s[4566]! } + public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[4567]! } + public var ChannelIntro_CreateChannel: String { return self._s[4568]! } + public var Conversation_InputTextAnonymousPlaceholder: String { return self._s[4569]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4567]!, self._r[4567]!, [_0]) + return formatWithArgumentRanges(self._s[4570]!, self._r[4570]!, [_0]) } - public var Weekday_ShortMonday: String { return self._s[4568]! } - public var Passport_Language_ar: String { return self._s[4570]! } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4571]! } - public var TwoFactorSetup_Done_Title: String { return self._s[4572]! } - public var Calls_RatingFeedback: String { return self._s[4573]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[4574]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[4577]! } - public var Watch_Compose_Send: String { return self._s[4578]! } - public var PasscodeSettings_ChangePasscode: String { return self._s[4579]! } - public var WebSearch_RecentSectionClear: String { return self._s[4580]! } + public var Weekday_ShortMonday: String { return self._s[4571]! } + public var Passport_Language_ar: String { return self._s[4573]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4574]! } + public var TwoFactorSetup_Done_Title: String { return self._s[4575]! } + public var Calls_RatingFeedback: String { return self._s[4576]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[4577]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[4580]! } + public var Watch_Compose_Send: String { return self._s[4581]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[4582]! } + public var WebSearch_RecentSectionClear: String { return self._s[4583]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4581]!, self._r[4581]!, [_0]) + return formatWithArgumentRanges(self._s[4584]!, self._r[4584]!, [_0]) } - public var WallpaperSearch_ColorTeal: String { return self._s[4582]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[4583]! } - public var Permissions_ContactsTitle_v0: String { return self._s[4584]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[4586]! } - public var Settings_SavedMessages: String { return self._s[4587]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[4588]! } - public var Month_ShortMarch: String { return self._s[4589]! } - public var Message_Location: String { return self._s[4590]! } + public var WallpaperSearch_ColorTeal: String { return self._s[4585]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[4586]! } + public var Permissions_ContactsTitle_v0: String { return self._s[4587]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[4589]! } + public var Settings_SavedMessages: String { return self._s[4590]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[4591]! } + public var Month_ShortMarch: String { return self._s[4592]! } + public var Message_Location: String { return self._s[4593]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4591]!, self._r[4591]!, [_1]) + return formatWithArgumentRanges(self._s[4594]!, self._r[4594]!, [_1]) } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4592]!, self._r[4592]!, [_1, _2]) - } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[4594]! } - public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4595]!, self._r[4595]!, [_1, _2]) } - public var GroupPermission_NoSendMedia: String { return self._s[4596]! } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[4597]! } - public var SharedMedia_CategoryDocs: String { return self._s[4598]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[4599]! } - public var Paint_Framed: String { return self._s[4600]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[4601]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[4602]! } - public var Channel_SignMessages: String { return self._s[4603]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[4604]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[4605]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[4597]! } + public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4598]!, self._r[4598]!, [_1, _2]) + } + public var GroupPermission_NoSendMedia: String { return self._s[4599]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[4600]! } + public var SharedMedia_CategoryDocs: String { return self._s[4601]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[4602]! } + public var Paint_Framed: String { return self._s[4603]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[4604]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[4605]! } + public var Channel_SignMessages: String { return self._s[4606]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[4607]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[4608]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4606]!, self._r[4606]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4609]!, self._r[4609]!, [_1, _2]) } - public var GroupInfo_UpgradeButton: String { return self._s[4607]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[4608]! } - public var AutoDownloadSettings_Files: String { return self._s[4609]! } + public var GroupInfo_UpgradeButton: String { return self._s[4610]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[4611]! } + public var AutoDownloadSettings_Files: String { return self._s[4612]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4610]!, self._r[4610]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4613]!, self._r[4613]!, [_0, _1]) } - public var Login_SendCodeViaSms: String { return self._s[4612]! } - public var Update_UpdateApp: String { return self._s[4613]! } - public var Channel_Setup_TypePublic: String { return self._s[4614]! } - public var Watch_Compose_CreateMessage: String { return self._s[4615]! } + public var Login_SendCodeViaSms: String { return self._s[4615]! } + public var Update_UpdateApp: String { return self._s[4616]! } + public var Channel_Setup_TypePublic: String { return self._s[4617]! } + public var Watch_Compose_CreateMessage: String { return self._s[4618]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4616]!, self._r[4616]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4619]!, self._r[4619]!, [_1, _2, _3]) } - public var StickerPacksSettings_ManagingHelp: String { return self._s[4617]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[4620]! } public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4618]!, self._r[4618]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4621]!, self._r[4621]!, [_1, _2, _3]) } - public var VoiceOver_Chat_Video: String { return self._s[4619]! } - public var Forward_ChannelReadOnly: String { return self._s[4620]! } - public var StickerPack_HideStickers: String { return self._s[4621]! } - public var ChatListFolder_NameContacts: String { return self._s[4622]! } - public var Profile_BotInfo: String { return self._s[4623]! } - public var Document_TargetConfirmationFormat: String { return self._s[4624]! } - public var GroupInfo_InviteByLink: String { return self._s[4625]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[4626]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[4627]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[4628]! } - public var Passport_NotLoggedInMessage: String { return self._s[4629]! } - public var Conversation_StopQuizConfirmation: String { return self._s[4630]! } - public var Checkout_PaymentMethod: String { return self._s[4631]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[4635]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[4636]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[4637]! } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[4638]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[4639]! } - public var Camera_Title: String { return self._s[4640]! } - public var Map_Directions: String { return self._s[4641]! } - public var Wallet_Intro_ImportExisting: String { return self._s[4642]! } - public var Stats_MessagePublicForwardsTitle: String { return self._s[4644]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[4645]! } - public var Profile_EncryptionKey: String { return self._s[4646]! } + public var VoiceOver_Chat_Video: String { return self._s[4622]! } + public var Forward_ChannelReadOnly: String { return self._s[4623]! } + public var StickerPack_HideStickers: String { return self._s[4624]! } + public var ChatListFolder_NameContacts: String { return self._s[4625]! } + public var Profile_BotInfo: String { return self._s[4626]! } + public var Document_TargetConfirmationFormat: String { return self._s[4627]! } + public var GroupInfo_InviteByLink: String { return self._s[4628]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[4629]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[4630]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[4631]! } + public var Passport_NotLoggedInMessage: String { return self._s[4632]! } + public var Conversation_StopQuizConfirmation: String { return self._s[4633]! } + public var Checkout_PaymentMethod: String { return self._s[4634]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[4638]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[4639]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[4640]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[4641]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[4642]! } + public var Camera_Title: String { return self._s[4643]! } + public var Map_Directions: String { return self._s[4644]! } + public var Wallet_Intro_ImportExisting: String { return self._s[4645]! } + public var Stats_MessagePublicForwardsTitle: String { return self._s[4647]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[4648]! } + public var Profile_EncryptionKey: String { return self._s[4649]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4647]!, self._r[4647]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[4650]!, self._r[4650]!, [_1, "\(_2)"]) } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4648]!, self._r[4648]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4651]!, self._r[4651]!, [_0, _1]) } - public var Passport_Identity_TypePassport: String { return self._s[4649]! } - public var CreatePoll_QuizOptionsHeader: String { return self._s[4651]! } - public var Common_No: String { return self._s[4652]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[4653]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[4654]! } - public var Settings_AboutEmpty: String { return self._s[4655]! } - public var TwoStepAuth_FloodError: String { return self._s[4657]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[4658]! } + public var Passport_Identity_TypePassport: String { return self._s[4652]! } + public var CreatePoll_QuizOptionsHeader: String { return self._s[4654]! } + public var Common_No: String { return self._s[4655]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[4656]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[4657]! } + public var Settings_AboutEmpty: String { return self._s[4658]! } + public var TwoStepAuth_FloodError: String { return self._s[4660]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[4661]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4660]!, self._r[4660]!, [_1]) + return formatWithArgumentRanges(self._s[4663]!, self._r[4663]!, [_1]) } - public var Conversation_Edit: String { return self._s[4663]! } - public var CheckoutInfo_SaveInfo: String { return self._s[4664]! } - public var VoiceOver_Chat_AnonymousPoll: String { return self._s[4665]! } - public var Call_CameraTooltip: String { return self._s[4667]! } - public var InstantPage_FeedbackButtonShort: String { return self._s[4668]! } - public var Contacts_InviteToTelegram: String { return self._s[4669]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[4670]! } - public var Notifications_ResetAllNotifications: String { return self._s[4671]! } - public var Calls_NewCall: String { return self._s[4672]! } - public var VoiceOver_Chat_Music: String { return self._s[4675]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[4676]! } - public var Channel_Edit_AboutItem: String { return self._s[4677]! } - public var Message_VideoExpired: String { return self._s[4678]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[4679]! } + public var Conversation_Edit: String { return self._s[4666]! } + public var CheckoutInfo_SaveInfo: String { return self._s[4667]! } + public var VoiceOver_Chat_AnonymousPoll: String { return self._s[4668]! } + public var Call_CameraTooltip: String { return self._s[4670]! } + public var InstantPage_FeedbackButtonShort: String { return self._s[4671]! } + public var Contacts_InviteToTelegram: String { return self._s[4672]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[4673]! } + public var Notifications_ResetAllNotifications: String { return self._s[4674]! } + public var Calls_NewCall: String { return self._s[4675]! } + public var VoiceOver_Chat_Music: String { return self._s[4678]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[4679]! } + public var Channel_Edit_AboutItem: String { return self._s[4680]! } + public var Message_VideoExpired: String { return self._s[4681]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[4682]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4680]!, self._r[4680]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4683]!, self._r[4683]!, [_1, _2]) } - public var NotificationsSound_Input: String { return self._s[4682]! } - public var Notifications_ClassicTones: String { return self._s[4683]! } - public var Conversation_StatusTyping: String { return self._s[4684]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[4685]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[4686]! } - public var Wallet_Month_ShortSeptember: String { return self._s[4687]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4688]! } - public var Conversation_MessageLeaveComment: String { return self._s[4689]! } - public var UserInfo_TapToCall: String { return self._s[4690]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[4691]! } - public var Conversation_ClearAll: String { return self._s[4693]! } - public var UserInfo_NotificationsDefault: String { return self._s[4694]! } - public var Wallet_Send_OwnAddressAlertText: String { return self._s[4695]! } - public var Location_ProximityGroupTip: String { return self._s[4696]! } - public var Map_ChooseAPlace: String { return self._s[4697]! } + public var NotificationsSound_Input: String { return self._s[4685]! } + public var Notifications_ClassicTones: String { return self._s[4686]! } + public var Conversation_StatusTyping: String { return self._s[4687]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[4688]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[4689]! } + public var Wallet_Month_ShortSeptember: String { return self._s[4690]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4691]! } + public var Conversation_MessageLeaveComment: String { return self._s[4692]! } + public var UserInfo_TapToCall: String { return self._s[4693]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[4694]! } + public var Conversation_ClearAll: String { return self._s[4696]! } + public var UserInfo_NotificationsDefault: String { return self._s[4697]! } + public var Wallet_Send_OwnAddressAlertText: String { return self._s[4698]! } + public var Location_ProximityGroupTip: String { return self._s[4699]! } + public var Map_ChooseAPlace: String { return self._s[4700]! } public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4698]!, self._r[4698]!, [_0]) + return formatWithArgumentRanges(self._s[4701]!, self._r[4701]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[4699]! } - public var ChatList_PeerTypeNonContact: String { return self._s[4700]! } - public var Conversation_SlideToCancel: String { return self._s[4701]! } - public var Month_ShortJuly: String { return self._s[4702]! } - public var SocksProxySetup_ProxyType: String { return self._s[4703]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[4702]! } + public var ChatList_PeerTypeNonContact: String { return self._s[4703]! } + public var Conversation_SlideToCancel: String { return self._s[4704]! } + public var Month_ShortJuly: String { return self._s[4705]! } + public var SocksProxySetup_ProxyType: String { return self._s[4706]! } public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4704]!, self._r[4704]!, [_0]) + return formatWithArgumentRanges(self._s[4707]!, self._r[4707]!, [_0]) } - public var ChatList_EditFolders: String { return self._s[4705]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[4706]! } - public var Wallet_Send_ConfirmationConfirm: String { return self._s[4708]! } - public var Wallet_Created_ExportErrorTitle: String { return self._s[4709]! } + public var ChatList_EditFolders: String { return self._s[4708]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[4709]! } + public var Wallet_Send_ConfirmationConfirm: String { return self._s[4711]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[4712]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4710]!, self._r[4710]!, [_0]) - } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[4711]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[4712]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[4713]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[4715]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[4716]! } - public var Passport_DeleteAddress: String { return self._s[4718]! } - public var Passport_DeletePassportConfirmation: String { return self._s[4719]! } - public var Passport_Identity_ReverseSide: String { return self._s[4720]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[4721]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[4722]! } - public var Passport_FieldAddress: String { return self._s[4723]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[4724]! } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[4727]! } - public var Map_Home: String { return self._s[4729]! } - public var VoiceChat_Panel_TapToJoin: String { return self._s[4730]! } - public var PollResults_Title: String { return self._s[4731]! } - public var ArchivedChats_IntroText2: String { return self._s[4733]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[4734]! } - public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[4735]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[4737]! } - public var VoiceChat_Muted: String { return self._s[4738]! } - public var Passport_Identity_AddPersonalDetails: String { return self._s[4740]! } - public var Group_Info_AdminLog: String { return self._s[4742]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[4743]! } - public var Appearance_Animations: String { return self._s[4744]! } - public var Appearance_TextSizeSetting: String { return self._s[4745]! } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_ContextViewReplies(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminKicks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminBans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_TitleComments(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceChat_Panel_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveMonth(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminDeletions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_DOCS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_MessageViewComments(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_DOCS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_Leave(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceChat_Status_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupShowMoreTopInviters(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessageFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveYear(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func OldChannels_GroupFormat(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_Search_Messages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + return formatWithArgumentRanges(self._s[4713]!, self._r[4713]!, [_0]) } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[4714]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[4715]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[4716]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[4718]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[4719]! } + public var Passport_DeleteAddress: String { return self._s[4721]! } + public var Passport_DeletePassportConfirmation: String { return self._s[4722]! } + public var Passport_Identity_ReverseSide: String { return self._s[4723]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[4724]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[4725]! } + public var Passport_FieldAddress: String { return self._s[4726]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[4727]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[4730]! } + public var Map_Home: String { return self._s[4732]! } + public var VoiceChat_Panel_TapToJoin: String { return self._s[4733]! } + public var PollResults_Title: String { return self._s[4734]! } + public var ArchivedChats_IntroText2: String { return self._s[4736]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[4737]! } + public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[4738]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[4740]! } + public var VoiceChat_Muted: String { return self._s[4741]! } + public var Passport_Identity_AddPersonalDetails: String { return self._s[4743]! } + public var Group_Info_AdminLog: String { return self._s[4745]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[4746]! } + public var Appearance_Animations: String { return self._s[4747]! } + public var Appearance_TextSizeSetting: String { return self._s[4748]! } public func UserCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = getPluralizationForm(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 = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Stats_MessageViews(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopPosterMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_InviteContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PollResults_ShowMore(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_QuizCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } public func Stats_GroupTopPosterChars(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessageVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_TitlePinnedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessageMusic(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_TitleReplies(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeletedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupShowMoreTopPosters(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, _1, _2) } public func MessageTimer_Months(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveWeek(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func VoiceOver_Chat_MessagesSelected(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } public func Notifications_Exceptions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func PUSH_CHAT_MESSAGE_DOCS_FIX1(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Theme_UsersCount(_ value: Int32) -> String { + public func ChatList_Search_Messages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + public func AttachmentMenu_SendItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } public func Stats_GroupShowMoreTopAdmins(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[127 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessagePhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[129 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[131 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_MessageForwards(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[133 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_ContextMenuSelectAll(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[134 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[135 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[136 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[137 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[138 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[139 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[141 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[142 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InstantPage_Views(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[143 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[144 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[145 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[146 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[147 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[148 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[149 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } public func Notification_GameScoreSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[150 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortHours(_ value: Int32) -> String { + public func Notification_GameScoreExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[151 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + public func SharedMedia_Generic(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[152 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + public func ForwardedLocations(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[153 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { + public func ForwardedVideoMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[154 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedContacts(_ value: Int32) -> String { + public func SharedMedia_Photo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[155 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + public func Stats_GroupTopAdminDeletions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[156 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopAdminBans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_ContextMenuSelectAll(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[157 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(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_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_MessagePhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupShowMoreTopPosters(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ChatList_MessageFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveYear(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_QuizCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveMonth(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveWeek(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InstantPage_Views(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ChatList_MessageVideos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_TitleComments(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_DOCS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Stats_MessageViews(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_GroupFormat(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_MessageForwards(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Conversation_ContextViewReplies(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_Leave(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_MessageMusic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Conversation_TitleReplies(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_MessagesSelected(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopAdminKicks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Chat_TitlePinnedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceChat_Panel_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeletedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_DOCS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceChat_Status_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[127 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_MessagesUnpinned(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[129 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[131 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[133 * 6 + Int(form.rawValue)]!, _0, _1) } public func Stats_GroupTopInviterInvites(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[134 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[135 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[136 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[137 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[138 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[139 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PollResults_ShowMore(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[141 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_MessageViewComments(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[142 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[143 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[144 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[145 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[146 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[147 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[148 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[149 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_InviteContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[150 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[151 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[152 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[153 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Theme_UsersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[154 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[155 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[156 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[157 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Stats_GroupShowMoreTopInviters(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[158 * 6 + Int(form.rawValue)]!, stringValue) } - public func Chat_MessagesUnpinned(_ value: Int32) -> String { + public func Stats_GroupTopPosterMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[159 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramStringFormatting/Sources/ServiceMessageStrings.swift b/submodules/TelegramStringFormatting/Sources/ServiceMessageStrings.swift index e5c00e5c38..3b261715b7 100644 --- a/submodules/TelegramStringFormatting/Sources/ServiceMessageStrings.swift +++ b/submodules/TelegramStringFormatting/Sources/ServiceMessageStrings.swift @@ -405,13 +405,14 @@ public func universalServiceMessageString(presentationData: (PresentationTheme, } attributedString = NSAttributedString(string: titleString, font: titleFont, textColor: primaryTextColor) case let .groupPhoneCall(_, _, duration): - let titleString: String if let duration = duration { - titleString = strings.Notification_VoiceChatEnded(callDurationString(strings: strings, value: duration)).0 + let titleString = strings.Notification_VoiceChatEnded(callDurationString(strings: strings, value: duration)).0 + attributedString = NSAttributedString(string: titleString, font: titleFont, textColor: primaryTextColor) } else { - titleString = strings.Notification_VoiceChatStarted + var attributePeerIds: [(Int, PeerId?)] = [(0, message.author?.id)] + let titleString = strings.Notification_VoiceChatStarted(authorName) + attributedString = addAttributesToStringWithRanges(titleString, body: bodyAttributes, argumentAttributes: peerMentionsAttributes(primaryTextColor: primaryTextColor, peerIds: attributePeerIds)) } - 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, blockQuoteFont: titleFont, underlineLinks: false) case let .botDomainAccessGranted(domain): diff --git a/submodules/TelegramUI/Images.xcassets/Call/CallHeadphonesButton.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Call/CallHeadphonesButton.imageset/Contents.json new file mode 100644 index 0000000000..8a2ae5a641 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Call/CallHeadphonesButton.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_call_headphones.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Call/CallHeadphonesButton.imageset/ic_call_headphones.pdf b/submodules/TelegramUI/Images.xcassets/Call/CallHeadphonesButton.imageset/ic_call_headphones.pdf new file mode 100644 index 0000000000..dd818b59bc Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Call/CallHeadphonesButton.imageset/ic_call_headphones.pdf differ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Calls@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Calls@2x.png new file mode 100644 index 0000000000..3d12d7e27b Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Calls@2x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Calls@3x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Calls@3x.png new file mode 100644 index 0000000000..06f12c914e Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Calls@3x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Contents.json index 6fe332016d..802b6afe81 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Contents.json @@ -1,7 +1,18 @@ { "images" : [ { - "idiom" : "universal" + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Calls@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Calls@3x.png", + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Contents.json index 6fe332016d..b0d2ce266b 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Contents.json @@ -1,7 +1,18 @@ { "images" : [ { - "idiom" : "universal" + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Messages@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Messages@3x.png", + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Messages@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Messages@2x.png new file mode 100644 index 0000000000..ffa49c3ae1 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Messages@2x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Messages@3x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Messages@3x.png new file mode 100644 index 0000000000..324a417e72 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Messages@3x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contacts@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contacts@2x.png new file mode 100644 index 0000000000..115d8526c5 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contacts@2x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contacts@3x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contacts@3x.png new file mode 100644 index 0000000000..aaddd096eb Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contacts@3x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contents.json index 6fe332016d..1cc3b663ca 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contents.json @@ -1,7 +1,18 @@ { "images" : [ { - "idiom" : "universal" + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Contacts@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Contacts@3x.png", + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Contents.json index 6fe332016d..2ea1fc8abd 100644 --- a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Contents.json @@ -1,7 +1,18 @@ { "images" : [ { - "idiom" : "universal" + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Settings@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Settings@3x.png", + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Settings@2x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Settings@2x.png new file mode 100644 index 0000000000..c00ec0876d Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Settings@2x.png differ diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Settings@3x.png b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Settings@3x.png new file mode 100644 index 0000000000..27cad3a239 Binary files /dev/null and b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Settings@3x.png differ diff --git a/submodules/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/Resources/PresentationStrings.mapping index 5574fc0627..70fb376282 100644 Binary files a/submodules/TelegramUI/Resources/PresentationStrings.mapping and b/submodules/TelegramUI/Resources/PresentationStrings.mapping differ diff --git a/submodules/TelegramUI/Sources/AccountContext.swift b/submodules/TelegramUI/Sources/AccountContext.swift index b1a07fb36f..23b7f36815 100644 --- a/submodules/TelegramUI/Sources/AccountContext.swift +++ b/submodules/TelegramUI/Sources/AccountContext.swift @@ -318,7 +318,7 @@ public final class AccountContextImpl: AccountContext { } let presentationData = strongSelf.sharedContext.currentPresentationData.with { $0 } if let current = current { - if current is TelegramChannel { + if current is TelegramChannel || current is TelegramGroup { strongSelf.sharedContext.mainWindow?.present(textAlertController(context: strongSelf, title: presentationData.strings.Call_VoiceChatInProgressTitle, text: presentationData.strings.Call_VoiceChatInProgressMessage(current.compactDisplayTitle, peer.compactDisplayTitle).0, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: { guard let strongSelf = self else { return @@ -364,7 +364,7 @@ public final class AccountContextImpl: AccountContext { } let presentationData = strongSelf.sharedContext.currentPresentationData.with { $0 } if let current = current { - if current is TelegramChannel { + if current is TelegramChannel || current is TelegramGroup { strongSelf.sharedContext.mainWindow?.present(textAlertController(context: strongSelf, title: presentationData.strings.Call_VoiceChatInProgressTitle, text: presentationData.strings.Call_VoiceChatInProgressCallMessage(current.compactDisplayTitle, peer.compactDisplayTitle).0, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: { guard let strongSelf = self else { return diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index b6e24a1502..9f8ca8a6a3 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -229,6 +229,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private var shareStatusDisposable: MetaDisposable? private var clearCacheDisposable: MetaDisposable? private var bankCardDisposable: MetaDisposable? + private var hasActiveGroupCallDisposable: Disposable? private let editingMessage = ValuePromise(nil, ignoreRepeated: true) private let startingBot = ValuePromise(false, ignoreRepeated: true) @@ -362,6 +363,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private let peekData: ChatPeekTimeout? private let peekTimerDisposable = MetaDisposable() + private let createVoiceChatDisposable = MetaDisposable() + private var shouldDisplayDownButton = false private var hasEmbeddedTitleContent = false @@ -429,7 +432,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G 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.chatFontSize, bubbleCorners: self.presentationData.chatBubbleCorners, accountPeerId: context.account.peerId, mode: mode, chatLocation: chatLocation, subject: subject, peerNearbyData: peerNearbyData, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil) + 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.chatFontSize, bubbleCorners: self.presentationData.chatBubbleCorners, accountPeerId: context.account.peerId, mode: mode, chatLocation: chatLocation, subject: subject, peerNearbyData: peerNearbyData, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false) var mediaAccessoryPanelVisibility = MediaAccessoryPanelVisibility.none if case .standard = mode { @@ -501,14 +504,66 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G break } } - case let .groupPhoneCall(callId, accessHash, nil), let .inviteToGroupPhoneCall(callId, accessHash, _): - guard strongSelf.presentationInterfaceState.activeGroupCallInfo?.activeCall.id == callId else { - return true + case let .groupPhoneCall(callId, accessHash, _), let .inviteToGroupPhoneCall(callId, accessHash, _): + if let activeCall = strongSelf.presentationInterfaceState.activeGroupCallInfo?.activeCall { + strongSelf.context.joinGroupCall(peerId: message.id.peerId, activeCall: CachedChannelData.ActiveCall(id: activeCall.id, accessHash: activeCall.accessHash)) + } else { + var canManageGroupCalls = false + if let channel = strongSelf.presentationInterfaceState.renderedPeer?.chatMainPeer as? TelegramChannel { + if case .group = channel.info, channel.flags.contains(.isCreator) || channel.hasPermission(.manageCalls) { + canManageGroupCalls = true + } + } else if let group = strongSelf.presentationInterfaceState.renderedPeer?.chatMainPeer as? TelegramGroup { + if case .creator = group.role { + canManageGroupCalls = true + } else if case let .admin(rights, _) = group.role { + if rights.flags.contains(.canManageCalls) { + canManageGroupCalls = true + } + } + } + + if canManageGroupCalls { + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.VoiceChat_CreateNewVoiceChatText, actions: [TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.VoiceChat_CreateNewVoiceChatStart, action: { + if let strongSelf = self { + var dismissStatus: (() -> Void)? + let statusController = OverlayStatusController(theme: strongSelf.presentationData.theme, type: .loading(cancelled: { + dismissStatus?() + })) + dismissStatus = { [weak self, weak statusController] in + self?.createVoiceChatDisposable.set(nil) + statusController?.dismiss() + } + strongSelf.present(statusController, in: .window(.root)) + strongSelf.createVoiceChatDisposable.set((createGroupCall(account: strongSelf.context.account, peerId: message.id.peerId) + |> deliverOnMainQueue).start(next: { [weak self] info in + guard let strongSelf = self else { + return + } + strongSelf.context.joinGroupCall(peerId: message.id.peerId, activeCall: CachedChannelData.ActiveCall(id: info.id, accessHash: info.accessHash)) + }, error: { [weak self] error in + dismissStatus?() + + guard let strongSelf = self else { + return + } + + let text: String + switch error { + case .generic: + text = strongSelf.presentationData.strings.Login_UnknownError + case .anonymousNotAllowed: + text = strongSelf.presentationData.strings.VoiceChat_AnonymousDisabledAlertText + } + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + }, completed: { [weak self] in + dismissStatus?() + })) + } + })]), in: .window(.root)) + } } - - let peerId = message.id.peerId - - strongSelf.context.joinGroupCall(peerId: peerId, activeCall: CachedChannelData.ActiveCall(id: callId, accessHash: accessHash)) + return true default: break } @@ -555,7 +610,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G }, enqueueMessage: { message in self?.sendMessages([message]) }, sendSticker: canSendMessagesToChat(strongSelf.presentationInterfaceState) ? { fileReference, sourceNode, sourceRect in - return self?.controllerInteraction?.sendSticker(fileReference, false, sourceNode, sourceRect) ?? false + return self?.controllerInteraction?.sendSticker(fileReference, nil, false, sourceNode, sourceRect) ?? false } : nil, setupTemporaryHiddenMedia: { signal, centralIndex, galleryMedia in if let strongSelf = self { strongSelf.temporaryHiddenGalleryMediaDisposable.set((signal |> deliverOnMainQueue).start(next: { entry in @@ -598,7 +653,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }, actionInteraction: GalleryControllerActionInteraction(openUrl: { [weak self] url, concealed in if let strongSelf = self { - strongSelf.controllerInteraction?.openUrl(url, concealed, nil, nil) + strongSelf.openUrl(url, concealed: concealed, message: nil) } }, openUrlIn: { [weak self] url in if let strongSelf = self { @@ -633,7 +688,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G storedState = MediaPlaybackStoredState(timestamp: timestamp, playbackRate: .x1) } let _ = updateMediaPlaybackStoredStateInteractively(postbox: strongSelf.context.account.postbox, messageId: messageId, state: storedState).start() - }, editMedia: { [weak self] messageId in + }, editMedia: { [weak self] messageId, snapshots, transitionCompletion in guard let strongSelf = self else { return } @@ -653,7 +708,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } if let mediaReference = mediaReference, let peer = message.peers[message.id.peerId] { - legacyMediaEditor(context: strongSelf.context, peer: peer, media: mediaReference, initialCaption: message.text, presentStickers: { [weak self] completion in + legacyMediaEditor(context: strongSelf.context, peer: peer, media: mediaReference, initialCaption: message.text, snapshots: snapshots, transitionCompletion: { + transitionCompletion() + }, presentStickers: { [weak self] completion in if let strongSelf = self { let controller = DrawingStickersScreen(context: strongSelf.context, selectSticker: { fileReference, node, rect in completion(fileReference.media, fileReference.media.isAnimatedSticker, node.view, rect) @@ -855,7 +912,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G attributes.append(TextEntitiesMessageAttribute(entities: entities)) } strongSelf.sendMessages([.message(text: text, attributes: attributes, mediaReference: nil, replyToMessageId: strongSelf.presentationInterfaceState.interfaceState.replyMessageId, localGroupingKey: nil)]) - }, sendSticker: { [weak self] fileReference, clearInput, sourceNode, sourceRect in + }, sendSticker: { [weak self] fileReference, query, clearInput, sourceNode, sourceRect in guard let strongSelf = self else { return false } @@ -887,7 +944,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G }) } }) - strongSelf.sendMessages([.message(text: "", attributes: [], mediaReference: fileReference.abstract, replyToMessageId: strongSelf.presentationInterfaceState.interfaceState.replyMessageId, localGroupingKey: nil)]) + + var attributes: [MessageAttribute] = [] + if let query = query { + attributes.append(EmojiSearchQueryMessageAttribute(query: query)) + } + + strongSelf.sendMessages([.message(text: "", attributes: attributes, mediaReference: fileReference.abstract, replyToMessageId: strongSelf.presentationInterfaceState.interfaceState.replyMessageId, localGroupingKey: nil)]) return true }, sendGif: { [weak self] fileReference, sourceNode, sourceRect in if let strongSelf = self { @@ -2322,7 +2385,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } if let mediaReference = mediaReference, let peer = message.peers[message.id.peerId] { - legacyMediaEditor(context: strongSelf.context, peer: peer, media: mediaReference, initialCaption: message.text, presentStickers: { [weak self] completion in + legacyMediaEditor(context: strongSelf.context, peer: peer, media: mediaReference, initialCaption: message.text, snapshots: [], transitionCompletion: nil, presentStickers: { [weak self] completion in if let strongSelf = self { let controller = DrawingStickersScreen(context: strongSelf.context, selectSticker: { fileReference, node, rect in completion(fileReference.media, fileReference.media.isAnimatedSticker, node.view, rect) @@ -3338,6 +3401,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.keepPeerInfoScreenDataHotDisposable.dispose() self.preloadAvatarDisposable.dispose() self.peekTimerDisposable.dispose() + self.hasActiveGroupCallDisposable?.dispose() + self.createVoiceChatDisposable.dispose() } public func updatePresentationMode(_ mode: ChatControllerPresentationMode) { @@ -3753,6 +3818,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G pinnedMessageId = cachedData.pinnedMessageId } else if let cachedData = combinedInitialData.cachedData as? CachedGroupData { pinnedMessageId = cachedData.pinnedMessageId + if let activeCall = cachedData.activeCall { + activeGroupCallInfo = ChatActiveGroupCallInfo(activeCall: activeCall) + } } else if let _ = combinedInitialData.cachedData as? CachedSecretChatData { } @@ -3908,6 +3976,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G pinnedMessageId = cachedData.pinnedMessageId } else if let cachedData = cachedData as? CachedGroupData { pinnedMessageId = cachedData.pinnedMessageId + if let activeCall = cachedData.activeCall { + activeGroupCallInfo = ChatActiveGroupCallInfo(activeCall: activeCall) + } } else if let _ = cachedData as? CachedSecretChatData { } @@ -5036,6 +5107,29 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G subjectFlags = .banSendMedia } + if case .mediaRecording = subject, let _ = strongSelf.presentationInterfaceState.activeGroupCallInfo { + let rect = strongSelf.chatDisplayNode.frameForInputActionButton() + if let rect = rect { + strongSelf.mediaRestrictedTooltipController?.dismiss() + let tooltipController = TooltipController(content: .text(strongSelf.presentationInterfaceState.strings.Conversation_VoiceChatMediaRecordingRestricted), baseFontSize: strongSelf.presentationData.listsFontSize.baseDisplaySize) + strongSelf.mediaRestrictedTooltipController = tooltipController + strongSelf.mediaRestrictedTooltipControllerMode = false + tooltipController.dismissed = { [weak tooltipController] _ in + if let strongSelf = self, let tooltipController = tooltipController, strongSelf.mediaRestrictedTooltipController === tooltipController { + strongSelf.mediaRestrictedTooltipController = nil + } + } + strongSelf.present(tooltipController, in: .window(.root), with: TooltipControllerPresentationArguments(sourceNodeAndRect: { + if let strongSelf = self { + return (strongSelf.chatDisplayNode, rect) + } + return nil + })) + } + + return + } + let bannedPermission: (Int32, Bool)? if let channel = strongSelf.presentationInterfaceState.renderedPeer?.peer as? TelegramChannel { bannedPermission = channel.hasBannedPermission(subjectFlags) @@ -5193,7 +5287,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } }, sendSticker: { [weak self] file, sourceNode, sourceRect in if let strongSelf = self, canSendMessagesToChat(strongSelf.presentationInterfaceState) { - return strongSelf.controllerInteraction?.sendSticker(file, true, sourceNode, sourceRect) ?? false + return strongSelf.controllerInteraction?.sendSticker(file, nil, true, sourceNode, sourceRect) ?? false } else { return false } @@ -6221,9 +6315,25 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } - let shouldBeActive = combineLatest(self.context.sharedContext.mediaManager.audioSession.isPlaybackActive() |> deliverOnMainQueue, self.chatDisplayNode.historyNode.hasVisiblePlayableItemNodes) - |> mapToSignal { [weak self] isPlaybackActive, hasVisiblePlayableItemNodes -> Signal in - if hasVisiblePlayableItemNodes && !isPlaybackActive { + let hasActiveCalls: Signal + if let callManager = self.context.sharedContext.callManager as? PresentationCallManagerImpl { + hasActiveCalls = callManager.hasActiveCalls + + self.hasActiveGroupCallDisposable = ((callManager.currentGroupCallSignal + |> map { call -> Bool in + return call != nil + }) |> deliverOnMainQueue).start(next: { [weak self] hasActiveGroupCall in + self?.updateChatPresentationInterfaceState(animated: true, interactive: false, { state in + return state.updatedHasActiveGroupCall(hasActiveGroupCall) + }) + }) + } else { + hasActiveCalls = .single(false) + } + + let shouldBeActive = combineLatest(self.context.sharedContext.mediaManager.audioSession.isPlaybackActive() |> deliverOnMainQueue, self.chatDisplayNode.historyNode.hasVisiblePlayableItemNodes, hasActiveCalls) + |> mapToSignal { [weak self] isPlaybackActive, hasVisiblePlayableItemNodes, hasActiveCalls -> Signal in + if hasVisiblePlayableItemNodes && !isPlaybackActive && !hasActiveCalls { return Signal { [weak self] subscriber in guard let strongSelf = self else { subscriber.putCompletion() @@ -7060,7 +7170,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.saveInterfaceState(includeScrollState: false) } - if let navigationController = self.navigationController as? NavigationController { + if let navigationController = self.navigationController as? NavigationController, isTopmostChatController(self) { var voiceChatOverlayController: VoiceChatOverlayController? for controller in navigationController.globalOverlayControllers { if let controller = controller as? VoiceChatOverlayController { @@ -7070,11 +7180,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } if let controller = voiceChatOverlayController { - var hidden = false - if self.presentationInterfaceState.interfaceState.editMessage != nil || self.presentationInterfaceState.interfaceState.forwardMessageIds != nil || self.presentationInterfaceState.interfaceState.composeInputState.inputText.string.count > 0 { - hidden = true - } - controller.update(hidden: hidden, slide: false, animated: true) + controller.updateVisibility() } } } @@ -7669,11 +7775,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G }) }, openCamera: { [weak self] cameraView, menuController in if let strongSelf = self, let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer { - if let callManager = strongSelf.context.sharedContext.callManager as? PresentationCallManagerImpl, callManager.hasActiveGroupCall { - return + var photoOnly = false + if let callManager = strongSelf.context.sharedContext.callManager as? PresentationCallManagerImpl, callManager.hasActiveCall { + photoOnly = true } - presentedLegacyCamera(context: strongSelf.context, peer: peer, chatLocation: strongSelf.chatLocation, cameraView: cameraView, menuController: menuController, parentController: strongSelf, editingMedia: editMediaOptions != nil, saveCapturedPhotos: settings.storeEditedPhotos, mediaGrouping: true, initialCaption: inputText.string, hasSchedule: strongSelf.presentationInterfaceState.subject != .scheduledMessages && peer.id.namespace != Namespaces.Peer.SecretChat, sendMessagesWithSignals: { [weak self] signals, silentPosting, scheduleTime in + presentedLegacyCamera(context: strongSelf.context, peer: peer, chatLocation: strongSelf.chatLocation, cameraView: cameraView, menuController: menuController, parentController: strongSelf, editingMedia: editMediaOptions != nil, saveCapturedPhotos: settings.storeEditedPhotos, mediaGrouping: true, initialCaption: inputText.string, hasSchedule: strongSelf.presentationInterfaceState.subject != .scheduledMessages && peer.id.namespace != Namespaces.Peer.SecretChat, photoOnly: photoOnly, sendMessagesWithSignals: { [weak self] signals, silentPosting, scheduleTime in if let strongSelf = self { if editMediaOptions != nil { strongSelf.editMessageMediaWithLegacySignals(signals!) @@ -11307,6 +11414,14 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G //return self.chatDisplayNode.acceptEmbeddedTitlePeekContent(content: content) return false } + + public var isSendButtonVisible: Bool { + if self.presentationInterfaceState.interfaceState.editMessage != nil || self.presentationInterfaceState.interfaceState.forwardMessageIds != nil || self.presentationInterfaceState.interfaceState.composeInputState.inputText.string.count > 0 { + return true + } else { + return false + } + } } private final class ContextControllerContentSourceImpl: ContextControllerContentSource { diff --git a/submodules/TelegramUI/Sources/ChatControllerInteraction.swift b/submodules/TelegramUI/Sources/ChatControllerInteraction.swift index ed9093bba4..d2917c50a5 100644 --- a/submodules/TelegramUI/Sources/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/Sources/ChatControllerInteraction.swift @@ -60,7 +60,7 @@ public final class ChatControllerInteraction { let toggleMessagesSelection: ([MessageId], Bool) -> Void let sendCurrentMessage: (Bool) -> Void let sendMessage: (String) -> Void - let sendSticker: (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool + let sendSticker: (FileMediaReference, String?, Bool, ASDisplayNode, CGRect) -> Bool let sendGif: (FileMediaReference, ASDisplayNode, CGRect) -> Bool let sendBotContextResultAsGif: (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool let requestMessageActionCallback: (MessageId, MemoryBuffer?, Bool, Bool) -> Void @@ -149,7 +149,7 @@ public final class ChatControllerInteraction { toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendCurrentMessage: @escaping (Bool) -> Void, sendMessage: @escaping (String) -> Void, - sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, + sendSticker: @escaping (FileMediaReference, String?, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, sendBotContextResultAsGif: @escaping (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool, Bool) -> Void, @@ -295,7 +295,7 @@ public final class ChatControllerInteraction { static var `default`: ChatControllerInteraction { return ChatControllerInteraction(openMessage: { _, _ in - return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in + return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { return nil }, chatControllerNode: { diff --git a/submodules/TelegramUI/Sources/ChatInterfaceInputContextPanels.swift b/submodules/TelegramUI/Sources/ChatInterfaceInputContextPanels.swift index 90ddfeb0cf..9c72469569 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceInputContextPanels.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceInputContextPanels.swift @@ -71,14 +71,16 @@ func inputContextPanelForChatPresentationIntefaceState(_ chatPresentationInterfa switch inputQueryResult { case let .stickers(results): if !results.isEmpty { + let query = chatPresentationInterfaceState.interfaceState.composeInputState.inputText.string + if let currentPanel = currentPanel as? InlineReactionSearchPanel { - currentPanel.updateResults(results: results.map({ $0.file })) + currentPanel.updateResults(results: results.map({ $0.file }), query: query) return currentPanel } else { let panel = InlineReactionSearchPanel(context: context, theme: chatPresentationInterfaceState.theme, strings: chatPresentationInterfaceState.strings, fontSize: chatPresentationInterfaceState.fontSize) panel.controllerInteraction = controllerInteraction panel.interfaceInteraction = interfaceInteraction - panel.updateResults(results: results.map({ $0.file })) + panel.updateResults(results: results.map({ $0.file }), query: query) return panel } } diff --git a/submodules/TelegramUI/Sources/ChatMediaInputNode.swift b/submodules/TelegramUI/Sources/ChatMediaInputNode.swift index 3db7dff3f3..40ffa8ebce 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputNode.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputNode.swift @@ -238,7 +238,7 @@ func chatMediaInputGridEntries(view: ItemCollectionsView, savedStickers: Ordered if view.lower == nil { var savedStickerIds = Set() if let savedStickers = savedStickers, !savedStickers.items.isEmpty { - let packInfo = StickerPackCollectionInfo(id: ItemCollectionId(namespace: ChatMediaInputPanelAuxiliaryNamespace.savedStickers.rawValue, id: 0), flags: [], accessHash: 0, title: strings.Stickers_FavoriteStickers.uppercased(), shortName: "", thumbnail: nil, hash: 0, count: 0) + let packInfo = StickerPackCollectionInfo(id: ItemCollectionId(namespace: ChatMediaInputPanelAuxiliaryNamespace.savedStickers.rawValue, id: 0), flags: [], accessHash: 0, title: strings.Stickers_FavoriteStickers.uppercased(), shortName: "", thumbnail: nil, immediateThumbnailData: nil, hash: 0, count: 0) for i in 0 ..< savedStickers.items.count { if let item = savedStickers.items[i].contents as? SavedStickerItem { savedStickerIds.insert(item.file.fileId.id) @@ -250,7 +250,7 @@ func chatMediaInputGridEntries(view: ItemCollectionsView, savedStickers: Ordered } if let recentStickers = recentStickers, !recentStickers.items.isEmpty { - let packInfo = StickerPackCollectionInfo(id: ItemCollectionId(namespace: ChatMediaInputPanelAuxiliaryNamespace.recentStickers.rawValue, id: 0), flags: [], accessHash: 0, title: strings.Stickers_FrequentlyUsed.uppercased(), shortName: "", thumbnail: nil, hash: 0, count: 0) + let packInfo = StickerPackCollectionInfo(id: ItemCollectionId(namespace: ChatMediaInputPanelAuxiliaryNamespace.recentStickers.rawValue, id: 0), flags: [], accessHash: 0, title: strings.Stickers_FrequentlyUsed.uppercased(), shortName: "", thumbnail: nil, immediateThumbnailData: nil, hash: 0, count: 0) var addedCount = 0 for i in 0 ..< recentStickers.items.count { if addedCount >= 20 { @@ -278,7 +278,7 @@ func chatMediaInputGridEntries(view: ItemCollectionsView, savedStickers: Ordered if let peerSpecificPack = peerSpecificPack { for i in 0 ..< peerSpecificPack.items.count { - let packInfo = StickerPackCollectionInfo(id: ItemCollectionId(namespace: ChatMediaInputPanelAuxiliaryNamespace.peerSpecific.rawValue, id: 0), flags: [], accessHash: 0, title: strings.Stickers_GroupStickers, shortName: "", thumbnail: nil, hash: 0, count: 0) + let packInfo = StickerPackCollectionInfo(id: ItemCollectionId(namespace: ChatMediaInputPanelAuxiliaryNamespace.peerSpecific.rawValue, id: 0), flags: [], accessHash: 0, title: strings.Stickers_GroupStickers, shortName: "", thumbnail: nil, immediateThumbnailData: nil, hash: 0, count: 0) if let item = peerSpecificPack.items[i] as? StickerPackItem { let index = ItemCollectionItemIndex(index: Int32(i), id: item.file.fileId.id) @@ -535,7 +535,7 @@ final class ChatMediaInputNode: ChatInputNode { sendSticker: { fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) } else { return false } @@ -806,7 +806,7 @@ final class ChatMediaInputNode: ChatInputNode { let packReference: StickerPackReference = .id(id: info.id.id, accessHash: info.accessHash) let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.controllerInteraction.navigationController(), sendSticker: { fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) } else { return false } @@ -1088,7 +1088,7 @@ final class ChatMediaInputNode: ChatInputNode { menuItems = [ PeekControllerMenuItem(title: strongSelf.strings.StickerPack_Send, color: .accent, font: .bold, action: { node, rect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), false, node, rect) + return strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), nil, false, node, rect) } else { return false } @@ -1111,7 +1111,7 @@ final class ChatMediaInputNode: ChatInputNode { if let packReference = packReference { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.controllerInteraction.navigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(file, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(file, nil, false, sourceNode, sourceRect) } else { return false } @@ -1172,7 +1172,7 @@ final class ChatMediaInputNode: ChatInputNode { menuItems = [ PeekControllerMenuItem(title: strongSelf.strings.StickerPack_Send, color: .accent, font: .bold, action: { node, rect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), false, node, rect) + return strongSelf.controllerInteraction.sendSticker(.standalone(media: item.file), nil, false, node, rect) } else { return false } @@ -1195,7 +1195,7 @@ final class ChatMediaInputNode: ChatInputNode { if let packReference = packReference { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.controllerInteraction.navigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(file, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(file, nil, false, sourceNode, sourceRect) } else { return false } diff --git a/submodules/TelegramUI/Sources/ChatMediaInputStickerGridItem.swift b/submodules/TelegramUI/Sources/ChatMediaInputStickerGridItem.swift index 3b86d1d263..e4aa206ec3 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputStickerGridItem.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputStickerGridItem.swift @@ -336,7 +336,7 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode { return } if let interfaceInteraction = self.interfaceInteraction, let (_, item, _) = self.currentState, case .ended = recognizer.state { - let _ = interfaceInteraction.sendSticker(.standalone(media: item.file), false, self, self.bounds) + let _ = interfaceInteraction.sendSticker(.standalone(media: item.file), nil, false, self, self.bounds) self.imageNode.layer.animateAlpha(from: 0.5, to: 1.0, duration: 1.0) } } diff --git a/submodules/TelegramUI/Sources/ChatMediaInputStickerPackItem.swift b/submodules/TelegramUI/Sources/ChatMediaInputStickerPackItem.swift index e71e34f069..974fa82321 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputStickerPackItem.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputStickerPackItem.swift @@ -76,8 +76,7 @@ private let verticalOffset: CGFloat = 3.0 final class ChatMediaInputStickerPackItemNode: ListViewItemNode { private let imageNode: TransformImageNode private var animatedStickerNode: AnimatedStickerNode? - private var placeholderNode: ShimmerEffectNode? - private var placeholderImageNode: ASImageNode? + private var placeholderNode: StickerShimmerEffectNode? private let highlightNode: ASImageNode var inputNodeInteraction: ChatMediaInputNodeInteraction? @@ -109,11 +108,9 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { self.imageNode = TransformImageNode() self.imageNode.isLayerBacked = !smartInvertColorsEnabled() - - self.placeholderImageNode = ASImageNode() - self.placeholderImageNode?.isUserInteractionEnabled = false - - //self.placeholderNode = ShimmerEffectNode() + + self.placeholderNode = StickerShimmerEffectNode() + self.placeholderNode?.transform = CATransform3DMakeRotation(CGFloat.pi / 2.0, 0.0, 0.0, 1.0) self.highlightNode.frame = CGRect(origin: CGPoint(x: floor((boundingSize.width - highlightSize.width) / 2.0) + verticalOffset - UIScreenPixel, y: floor((boundingSize.height - highlightSize.height) / 2.0) - UIScreenPixel), size: highlightSize) @@ -124,9 +121,6 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { self.addSubnode(self.highlightNode) self.addSubnode(self.imageNode) - if let placeholderImageNode = self.placeholderImageNode { - self.addSubnode(placeholderImageNode) - } if let placeholderNode = self.placeholderNode { self.addSubnode(placeholderNode) } @@ -138,6 +132,9 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { } if image != nil { strongSelf.removePlaceholder(animated: !firstTime) + if firstTime { + strongSelf.imageNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } } firstTime = false } @@ -159,17 +156,6 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { }) } } - if let placeholderImageNode = self.placeholderImageNode { - self.placeholderImageNode = nil - if !animated { - placeholderImageNode.removeFromSupernode() - } else { - placeholderImageNode.alpha = 0.0 - placeholderImageNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, completion: { [weak placeholderImageNode] _ in - placeholderImageNode?.removeFromSupernode() - }) - } - } } func updateStickerPackItem(account: Account, info: StickerPackCollectionInfo, item: StickerPackItem?, collectionId: ItemCollectionId, theme: PresentationTheme) { @@ -244,24 +230,13 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { self.stickerFetchedDisposable.set(fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: resourceReference).start()) } } - - if let placeholderImageNode = self.placeholderImageNode { - if placeholderImageNode.image == nil { - placeholderImageNode.image = generateStretchableFilledCircleImage(diameter: 10.0, color: theme.chat.inputMediaPanel.panelHighlightedIconBackgroundColor.withMultipliedAlpha(0.3)) - } - let size = boundingSize - let imageSize = boundingImageSize - let placeholderFrame = CGRect(origin: CGPoint(x: floor((boundingSize.width - imageSize.width) / 2.0) + verticalOffset, y: floor((boundingSize.height - imageSize.height) / 2.0)), size: imageSize) - placeholderImageNode.frame = placeholderFrame - } - + if let placeholderNode = self.placeholderNode { - let size = boundingSize let imageSize = boundingImageSize let placeholderFrame = CGRect(origin: CGPoint(x: floor((boundingSize.width - imageSize.width) / 2.0) + verticalOffset, y: floor((boundingSize.height - imageSize.height) / 2.0)), size: imageSize) - placeholderNode.frame = CGRect(origin: CGPoint(), size: size) + placeholderNode.frame = placeholderFrame - placeholderNode.update(backgroundColor: theme.chat.inputPanel.panelBackgroundColor, foregroundColor: theme.chat.inputMediaPanel.stickersSectionTextColor.blitOver(theme.chat.inputPanel.panelBackgroundColor, alpha: 0.4), shimmeringColor: theme.chat.inputMediaPanel.panelHighlightedIconBackgroundColor.withMultipliedAlpha(0.2), shapes: [.roundedRect(rect: placeholderFrame, cornerRadius: 5.0)], size: bounds.size) + placeholderNode.update(backgroundColor: nil, foregroundColor: theme.chat.inputMediaPanel.stickersSectionTextColor.blitOver(theme.chat.inputPanel.panelBackgroundColor, alpha: 0.4), shimmeringColor: theme.chat.inputMediaPanel.panelHighlightedIconBackgroundColor.withMultipliedAlpha(0.2), data: info.immediateThumbnailData, size: imageSize, small: true) } self.updateIsHighlighted() @@ -270,7 +245,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { override func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { if let placeholderNode = self.placeholderNode { - //placeholderNode.updateAbsoluteRect(rect, within: containerSize) + placeholderNode.updateAbsoluteRect(rect, within: containerSize) } } diff --git a/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift b/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift index 0d8833b55c..dd111fbed5 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift @@ -329,7 +329,7 @@ final class ChatMediaInputTrendingPane: ChatMediaInputPane { let packReference: StickerPackReference = .id(id: info.id.id, accessHash: info.accessHash) let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.controllerInteraction.navigationController(), sendSticker: { fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) } else { return false } diff --git a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift index 3ede0c1793..79ea783f10 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -964,7 +964,9 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } if let immediateThumbnailData = file?.immediateThumbnailData, let placeholderNode = strongSelf.placeholderNode { - placeholderNode.update(backgroundColor: nil, foregroundColor: UIColor(rgb: 0x748391, alpha: 0.2), shimmeringColor: UIColor(rgb: 0x748391, alpha: 0.35), data: immediateThumbnailData, size: animationNodeFrame.size) + let foregroundColor = bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.stickerPlaceholderColor, wallpaper: item.presentationData.theme.wallpaper) + let shimmeringColor = bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.stickerPlaceholderShimmerColor, wallpaper: item.presentationData.theme.wallpaper) + placeholderNode.update(backgroundColor: nil, foregroundColor: foregroundColor, shimmeringColor: shimmeringColor, data: immediateThumbnailData, size: animationNodeFrame.size) placeholderNode.frame = animationNodeFrame } diff --git a/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift index aa3eb8bea8..a6080de5b2 100644 --- a/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageStickerItemNode.swift @@ -58,6 +58,17 @@ class ChatMessageStickerItemNode: ChatMessageItemView { super.init(layerBacked: false) + var firstTime = true + self.imageNode.imageUpdated = { [weak self] image in + guard let strongSelf = self else { + return + } + if image != nil { + strongSelf.removePlaceholder(animated: !firstTime) + } + firstTime = false + } + self.containerNode.shouldBegin = { [weak self] location in guard let strongSelf = self else { return false @@ -215,6 +226,19 @@ class ChatMessageStickerItemNode: ChatMessageItemView { } } + private var absoluteRect: (CGRect, CGSize)? + override func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { + self.absoluteRect = (rect, containerSize) + if !self.contextSourceNode.isExtractedToContextPreview { + var rect = rect + rect.origin.y = containerSize.height - rect.maxY + self.insets.top + + if let placeholderNode = self.placeholderNode { + placeholderNode.updateAbsoluteRect(CGRect(origin: CGPoint(x: rect.minX + placeholderNode.frame.minX, y: rect.minY + placeholderNode.frame.minY), size: placeholderNode.frame.size), within: containerSize) + } + } + } + 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 @@ -578,6 +602,15 @@ class ChatMessageStickerItemNode: ChatMessageItemView { transition.updateFrame(node: strongSelf.imageNode, frame: updatedImageFrame) imageApply() + if let immediateThumbnailData = telegramFile?.immediateThumbnailData, let placeholderNode = strongSelf.placeholderNode { + let foregroundColor = bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.stickerPlaceholderColor, wallpaper: item.presentationData.theme.wallpaper) + let shimmeringColor = bubbleVariableColor(variableColor: item.presentationData.theme.theme.chat.message.stickerPlaceholderShimmerColor, wallpaper: item.presentationData.theme.wallpaper) + + let placeholderFrame = updatedImageFrame.insetBy(dx: innerImageInset, dy: innerImageInset) + placeholderNode.update(backgroundColor: nil, foregroundColor: foregroundColor, shimmeringColor: shimmeringColor, data: immediateThumbnailData, size: placeholderFrame.size) + placeholderNode.frame = placeholderFrame + } + strongSelf.containerNode.frame = CGRect(origin: CGPoint(), size: layoutSize) strongSelf.contextSourceNode.frame = CGRect(origin: CGPoint(), size: layoutSize) strongSelf.contextSourceNode.contentNode.frame = CGRect(origin: CGPoint(), size: layoutSize) diff --git a/submodules/TelegramUI/Sources/ChatPresentationInterfaceState.swift b/submodules/TelegramUI/Sources/ChatPresentationInterfaceState.swift index e36d10ff14..b3edea64b7 100644 --- a/submodules/TelegramUI/Sources/ChatPresentationInterfaceState.swift +++ b/submodules/TelegramUI/Sources/ChatPresentationInterfaceState.swift @@ -343,8 +343,9 @@ final class ChatPresentationInterfaceState: Equatable { let peerNearbyData: ChatPeerNearbyData? let pendingUnpinnedAllMessages: Bool let activeGroupCallInfo: ChatActiveGroupCallInfo? + let hasActiveGroupCall: Bool - init(chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, accountPeerId: PeerId, mode: ChatControllerPresentationMode, chatLocation: ChatLocation, subject: ChatControllerSubject?, peerNearbyData: ChatPeerNearbyData?, pendingUnpinnedAllMessages: Bool, activeGroupCallInfo: ChatActiveGroupCallInfo?) { + init(chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, accountPeerId: PeerId, mode: ChatControllerPresentationMode, chatLocation: ChatLocation, subject: ChatControllerSubject?, peerNearbyData: ChatPeerNearbyData?, pendingUnpinnedAllMessages: Bool, activeGroupCallInfo: ChatActiveGroupCallInfo?, hasActiveGroupCall: Bool) { self.interfaceState = ChatInterfaceState() self.inputTextPanelState = ChatTextInputPanelState() self.editMessageState = nil @@ -390,9 +391,10 @@ final class ChatPresentationInterfaceState: Equatable { self.peerNearbyData = peerNearbyData self.pendingUnpinnedAllMessages = pendingUnpinnedAllMessages self.activeGroupCallInfo = activeGroupCallInfo + self.hasActiveGroupCall = hasActiveGroupCall } - init(interfaceState: ChatInterfaceState, chatLocation: ChatLocation, renderedPeer: RenderedPeer?, isNotAccessible: Bool, explicitelyCanPinMessages: Bool, contactStatus: ChatContactStatus?, hasBots: Bool, isArchived: Bool, inputTextPanelState: ChatTextInputPanelState, editMessageState: ChatEditInterfaceMessageState?, recordedMediaPreview: ChatRecordedMediaPreview?, inputQueryResults: [ChatPresentationInputQueryKind: ChatPresentationInputQueryResult], inputMode: ChatInputMode, titlePanelContexts: [ChatTitlePanelContext], keyboardButtonsMessage: Message?, pinnedMessageId: MessageId?, pinnedMessage: ChatPinnedMessage?, peerIsBlocked: Bool, peerIsMuted: Bool, peerDiscussionId: PeerId?, peerGeoLocation: PeerGeoLocation?, callsAvailable: Bool, callsPrivate: Bool, slowmodeState: ChatSlowmodeState?, chatHistoryState: ChatHistoryNodeHistoryState?, botStartPayload: String?, urlPreview: (String, TelegramMediaWebpage)?, editingUrlPreview: (String, TelegramMediaWebpage)?, search: ChatSearchData?, searchQuerySuggestionResult: ChatPresentationInputQueryResult?, chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, accountPeerId: PeerId, mode: ChatControllerPresentationMode, hasScheduledMessages: Bool, subject: ChatControllerSubject?, peerNearbyData: ChatPeerNearbyData?, pendingUnpinnedAllMessages: Bool, activeGroupCallInfo: ChatActiveGroupCallInfo?) { + init(interfaceState: ChatInterfaceState, chatLocation: ChatLocation, renderedPeer: RenderedPeer?, isNotAccessible: Bool, explicitelyCanPinMessages: Bool, contactStatus: ChatContactStatus?, hasBots: Bool, isArchived: Bool, inputTextPanelState: ChatTextInputPanelState, editMessageState: ChatEditInterfaceMessageState?, recordedMediaPreview: ChatRecordedMediaPreview?, inputQueryResults: [ChatPresentationInputQueryKind: ChatPresentationInputQueryResult], inputMode: ChatInputMode, titlePanelContexts: [ChatTitlePanelContext], keyboardButtonsMessage: Message?, pinnedMessageId: MessageId?, pinnedMessage: ChatPinnedMessage?, peerIsBlocked: Bool, peerIsMuted: Bool, peerDiscussionId: PeerId?, peerGeoLocation: PeerGeoLocation?, callsAvailable: Bool, callsPrivate: Bool, slowmodeState: ChatSlowmodeState?, chatHistoryState: ChatHistoryNodeHistoryState?, botStartPayload: String?, urlPreview: (String, TelegramMediaWebpage)?, editingUrlPreview: (String, TelegramMediaWebpage)?, search: ChatSearchData?, searchQuerySuggestionResult: ChatPresentationInputQueryResult?, chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, accountPeerId: PeerId, mode: ChatControllerPresentationMode, hasScheduledMessages: Bool, subject: ChatControllerSubject?, peerNearbyData: ChatPeerNearbyData?, pendingUnpinnedAllMessages: Bool, activeGroupCallInfo: ChatActiveGroupCallInfo?, hasActiveGroupCall: Bool) { self.interfaceState = interfaceState self.chatLocation = chatLocation self.renderedPeer = renderedPeer @@ -438,6 +440,7 @@ final class ChatPresentationInterfaceState: Equatable { self.peerNearbyData = peerNearbyData self.pendingUnpinnedAllMessages = pendingUnpinnedAllMessages self.activeGroupCallInfo = activeGroupCallInfo + self.hasActiveGroupCall = hasActiveGroupCall } static func ==(lhs: ChatPresentationInterfaceState, rhs: ChatPresentationInterfaceState) -> Bool { @@ -588,35 +591,38 @@ final class ChatPresentationInterfaceState: Equatable { if lhs.activeGroupCallInfo != rhs.activeGroupCallInfo { return false } + if lhs.hasActiveGroupCall != rhs.hasActiveGroupCall { + return false + } return true } func updatedInterfaceState(_ f: (ChatInterfaceState) -> ChatInterfaceState) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: f(self.interfaceState), chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: f(self.interfaceState), chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedPeer(_ f: (RenderedPeer?) -> RenderedPeer?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: f(self.renderedPeer), isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: f(self.renderedPeer), isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedIsNotAccessible(_ isNotAccessible: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedExplicitelyCanPinMessages(_ explicitelyCanPinMessages: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedContactStatus(_ contactStatus: ChatContactStatus?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedHasBots(_ hasBots: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedIsArchived(_ isArchived: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedInputQueryResult(queryKind: ChatPresentationInputQueryKind, _ f: (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult?) -> ChatPresentationInterfaceState { @@ -627,127 +633,131 @@ final class ChatPresentationInterfaceState: Equatable { } else { inputQueryResults.removeValue(forKey: queryKind) } - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedInputTextPanelState(_ f: (ChatTextInputPanelState) -> ChatTextInputPanelState) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: f(self.inputTextPanelState), editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: f(self.inputTextPanelState), editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedEditMessageState(_ editMessageState: ChatEditInterfaceMessageState?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedRecordedMediaPreview(_ recordedMediaPreview: ChatRecordedMediaPreview?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedInputMode(_ f: (ChatInputMode) -> ChatInputMode) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: f(self.inputMode), titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: f(self.inputMode), titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedTitlePanelContext(_ f: ([ChatTitlePanelContext]) -> [ChatTitlePanelContext]) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: f(self.titlePanelContexts), keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: f(self.titlePanelContexts), keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedKeyboardButtonsMessage(_ message: Message?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: message, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: message, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedPinnedMessageId(_ pinnedMessageId: MessageId?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedPinnedMessage(_ pinnedMessage: ChatPinnedMessage?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedPeerIsBlocked(_ peerIsBlocked: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedPeerIsMuted(_ peerIsMuted: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedPeerDiscussionId(_ peerDiscussionId: PeerId?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedPeerGeoLocation(_ peerGeoLocation: PeerGeoLocation?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedCallsAvailable(_ callsAvailable: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedCallsPrivate(_ callsPrivate: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedSlowmodeState(_ slowmodeState: ChatSlowmodeState?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedBotStartPayload(_ botStartPayload: String?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedChatHistoryState(_ chatHistoryState: ChatHistoryNodeHistoryState?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedUrlPreview(_ urlPreview: (String, TelegramMediaWebpage)?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedEditingUrlPreview(_ editingUrlPreview: (String, TelegramMediaWebpage)?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedSearch(_ search: ChatSearchData?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedSearchQuerySuggestionResult(_ f: (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: f(self.searchQuerySuggestionResult), chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: f(self.searchQuerySuggestionResult), chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedMode(_ mode: ChatControllerPresentationMode) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedTheme(_ theme: PresentationTheme) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedStrings(_ strings: PresentationStrings) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedDateTimeFormat(_ dateTimeFormat: PresentationDateTimeFormat) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedChatWallpaper(_ chatWallpaper: TelegramWallpaper) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedBubbleCorners(_ bubbleCorners: PresentationChatBubbleCorners) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedHasScheduledMessages(_ hasScheduledMessages: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedPendingUnpinnedAllMessages(_ pendingUnpinnedAllMessages: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) } func updatedActiveGroupCallInfo(_ activeGroupCallInfo: ChatActiveGroupCallInfo?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: activeGroupCallInfo) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall) + } + + func updatedHasActiveGroupCall(_ hasActiveGroupCall: Bool) -> ChatPresentationInterfaceState { + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, subject: self.subject, peerNearbyData: self.peerNearbyData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: hasActiveGroupCall) } } diff --git a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift index 54c2bcb967..8b910bda2a 100644 --- a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift @@ -217,7 +217,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { self?.openMessageContextMenu(message: message, selectAll: selectAll, node: node, frame: frame) }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in - }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, _, _, _ in + }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, _, _, _ in self?.openUrl(url) }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { [weak self] message, associatedData in if let strongSelf = self, let navigationController = strongSelf.getNavigationController() { diff --git a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift index ac0005fcb8..f35ef17ffb 100644 --- a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift @@ -668,9 +668,20 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { } override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, additionalSideInsets: UIEdgeInsets, maxHeight: CGFloat, isSecondary: Bool, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics) -> CGFloat { + let previousAdditionalSideInsets = self.validLayout?.3 self.validLayout = (width, leftInset, rightInset, additionalSideInsets, maxHeight, metrics, isSecondary) let baseWidth = width - leftInset - rightInset + var transition = transition + var additionalOffset: CGFloat = 0.0 + if let previousAdditionalSideInsets = previousAdditionalSideInsets, previousAdditionalSideInsets.right != additionalSideInsets.right { + additionalOffset = (previousAdditionalSideInsets.right - additionalSideInsets.right) / 3.0 + + if case let .animated(duration, curve) = transition { + transition = .animated(duration: 0.2, curve: .easeInOut) + } + } + var wasEditingMedia = false if let interfaceState = self.presentationInterfaceState, let editMessageState = interfaceState.editMessageState { if case let .media(value) = editMessageState.content { @@ -1236,7 +1247,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { let searchLayoutClearButtonSize = CGSize(width: 44.0, height: minimalHeight) var textFieldInsets = self.textFieldInsets(metrics: metrics) - if additionalSideInsets.right > 0.0 && self.text.isEmpty { + if additionalSideInsets.right > 0.0 { textFieldInsets.right += additionalSideInsets.right / 3.0 } self.actionButtons.micButton.isHidden = additionalSideInsets.right > 0.0 @@ -1330,7 +1341,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { let buttonFrame = CGRect(origin: CGPoint(x: nextButtonTopRight.x - buttonSize.width, y: nextButtonTopRight.y + floor((minimalInputHeight - buttonSize.height) / 2.0)), size: buttonSize) if button.superview == nil { self.view.addSubview(button) - button.frame = buttonFrame + button.frame = buttonFrame.offsetBy(dx: -additionalOffset, dy: 0.0) transition.updateFrame(layer: button.layer, frame: buttonFrame) if animatedTransition { button.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25) @@ -1345,7 +1356,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { if let removeAccessoryButtons = removeAccessoryButtons { for button in removeAccessoryButtons { - let buttonFrame = CGRect(origin: CGPoint(x: button.frame.origin.x, y: panelHeight - textFieldInsets.bottom - minimalInputHeight), size: button.frame.size) + let buttonFrame = CGRect(origin: CGPoint(x: button.frame.origin.x + additionalOffset, y: panelHeight - textFieldInsets.bottom - minimalInputHeight), size: button.frame.size) transition.updateFrame(layer: button.layer, frame: buttonFrame) button.layer.animateScale(from: 1.0, to: 0.2, duration: 0.25, removeOnCompletion: false) button.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.25, removeOnCompletion: false, completion: { [weak button] _ in @@ -1365,7 +1376,9 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { } let mediaInputDisabled: Bool - if let channel = interfaceState.renderedPeer?.peer as? TelegramChannel, channel.hasBannedPermission(.banSendMedia) != nil { + if interfaceState.hasActiveGroupCall { + mediaInputDisabled = true + } else if let channel = interfaceState.renderedPeer?.peer as? TelegramChannel, channel.hasBannedPermission(.banSendMedia) != nil { mediaInputDisabled = true } else if let group = interfaceState.renderedPeer?.peer as? TelegramGroup, group.hasBannedPermission(.banSendMedia) { mediaInputDisabled = true @@ -1485,7 +1498,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { self.counterTextNode.attributedText = NSAttributedString(string: "", font: counterFont, textColor: .black) } - if let (width, leftInset, rightInset, additionalSideInsets, maxHeight, metrics, _) = self.validLayout { + if let (width, leftInset, rightInset, _, maxHeight, metrics, _) = self.validLayout { var composeButtonsOffset: CGFloat = 0.0 if self.extendedSearchLayout { composeButtonsOffset = 44.0 diff --git a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift index cb4eca5ec0..6a1266e225 100644 --- a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift +++ b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift @@ -109,7 +109,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { self.controllerInteraction = ChatControllerInteraction(openMessage: { _, _ in return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in - }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { fileReference, _, node, rect in return selectStickerImpl?(fileReference, node, rect) ?? false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in + }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { fileReference, _, _, node, rect in return selectStickerImpl?(fileReference, node, rect) ?? false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { return nil }, chatControllerNode: { @@ -218,7 +218,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { sendSticker: { fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) } else { return false } @@ -335,7 +335,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { sendSticker: { fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) } else { return false } diff --git a/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift b/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift index 9646ddfcc0..462ba94af1 100755 --- a/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift @@ -177,7 +177,7 @@ final class HorizontalStickersChatContextPanelNode: ChatInputContextPanelNode { var menuItems: [PeekControllerMenuItem] = [] menuItems = [ PeekControllerMenuItem(title: strongSelf.strings.StickerPack_Send, color: .accent, font: .bold, action: { _, _ in - return controllerInteraction.sendSticker(.standalone(media: item.file), true, itemNode, itemNode.bounds) + return controllerInteraction.sendSticker(.standalone(media: item.file), nil, true, itemNode, itemNode.bounds) }), PeekControllerMenuItem(title: isStarred ? strongSelf.strings.Stickers_RemoveFromFavorites : strongSelf.strings.Stickers_AddToFavorites, color: isStarred ? .destructive : .accent, action: { _, _ in if let strongSelf = self { @@ -197,7 +197,7 @@ final class HorizontalStickersChatContextPanelNode: ChatInputContextPanelNode { if let packReference = packReference { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: controllerInteraction.navigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction { - return controllerInteraction.sendSticker(file, true, sourceNode, sourceRect) + return controllerInteraction.sendSticker(file, nil, true, sourceNode, sourceRect) } else { return false } diff --git a/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift b/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift index 9e6c107944..817dcfd341 100644 --- a/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift +++ b/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift @@ -91,7 +91,7 @@ private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollVie var menuItems: [PeekControllerMenuItem] = [] menuItems = [ PeekControllerMenuItem(title: strongSelf.strings.StickerPack_Send, color: .accent, font: .bold, action: { _, _ in - return controllerInteraction.sendSticker(.standalone(media: item.file), true, itemNode, itemNode.bounds) + return controllerInteraction.sendSticker(.standalone(media: item.file), nil, true, itemNode, itemNode.bounds) }), PeekControllerMenuItem(title: isStarred ? strongSelf.strings.Stickers_RemoveFromFavorites : strongSelf.strings.Stickers_AddToFavorites, color: isStarred ? .destructive : .accent, action: { _, _ in if let strongSelf = self { @@ -111,7 +111,7 @@ private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollVie if let packReference = packReference { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: controllerInteraction.navigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self, let controllerInteraction = strongSelf.getControllerInteraction?() { - return controllerInteraction.sendSticker(file, true, sourceNode, sourceRect) + return controllerInteraction.sendSticker(file, nil, true, sourceNode, sourceRect) } else { return false } @@ -392,6 +392,7 @@ final class InlineReactionSearchPanel: ChatInputContextPanelNode { var controllerInteraction: ChatControllerInteraction? private var validLayout: (CGSize, CGFloat)? + private var query: String? override init(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings, fontSize: PresentationFontSize) { self.containerNode = ASDisplayNode() @@ -472,7 +473,7 @@ final class InlineReactionSearchPanel: ChatInputContextPanelNode { guard let strongSelf = self else { return } - let _ = strongSelf.controllerInteraction?.sendSticker(file, true, node, rect) + let _ = strongSelf.controllerInteraction?.sendSticker(file, strongSelf.query, true, node, rect) } self.view.disablesInteractiveTransitionGestureRecognizer = true @@ -484,7 +485,8 @@ final class InlineReactionSearchPanel: ChatInputContextPanelNode { } - func updateResults(results: [TelegramMediaFile]) { + func updateResults(results: [TelegramMediaFile], query: String?) { + self.query = query self.stickersNode.updateItems(items: results) } diff --git a/submodules/TelegramUI/Sources/LegacyCamera.swift b/submodules/TelegramUI/Sources/LegacyCamera.swift index e2e7938699..c253078988 100644 --- a/submodules/TelegramUI/Sources/LegacyCamera.swift +++ b/submodules/TelegramUI/Sources/LegacyCamera.swift @@ -11,7 +11,7 @@ import ShareController import LegacyUI import LegacyMediaPickerUI -func presentedLegacyCamera(context: AccountContext, peer: Peer, chatLocation: ChatLocation, cameraView: TGAttachmentCameraView?, menuController: TGMenuSheetController?, parentController: ViewController, editingMedia: Bool, saveCapturedPhotos: Bool, mediaGrouping: Bool, initialCaption: String, hasSchedule: Bool, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, recognizedQRCode: @escaping (String) -> Void = { _ in }, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?) { +func presentedLegacyCamera(context: AccountContext, peer: Peer, chatLocation: ChatLocation, cameraView: TGAttachmentCameraView?, menuController: TGMenuSheetController?, parentController: ViewController, editingMedia: Bool, saveCapturedPhotos: Bool, mediaGrouping: Bool, initialCaption: String, hasSchedule: Bool, photoOnly: Bool, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, recognizedQRCode: @escaping (String) -> Void = { _ in }, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?) { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let legacyController = LegacyController(presentation: .custom, theme: presentationData.theme) legacyController.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .portrait, compactSize: .portrait) @@ -23,7 +23,7 @@ func presentedLegacyCamera(context: AccountContext, peer: Peer, chatLocation: Ch let controller: TGCameraController if let cameraView = cameraView, let previewView = cameraView.previewView() { - controller = TGCameraController(context: legacyController.context, saveEditedPhotos: saveCapturedPhotos && !isSecretChat, saveCapturedMedia: saveCapturedPhotos && !isSecretChat, camera: previewView.camera, previewView: previewView, intent: TGCameraControllerGenericIntent) + controller = TGCameraController(context: legacyController.context, saveEditedPhotos: saveCapturedPhotos && !isSecretChat, saveCapturedMedia: saveCapturedPhotos && !isSecretChat, camera: previewView.camera, previewView: previewView, intent: photoOnly ? TGCameraControllerGenericPhotoOnlyIntent : TGCameraControllerGenericIntent) controller.inhibitMultipleCapture = editingMedia } else { controller = TGCameraController() diff --git a/submodules/TelegramUI/Sources/NotificationContainerController.swift b/submodules/TelegramUI/Sources/NotificationContainerController.swift index 1207c04486..d7df98709e 100644 --- a/submodules/TelegramUI/Sources/NotificationContainerController.swift +++ b/submodules/TelegramUI/Sources/NotificationContainerController.swift @@ -109,6 +109,7 @@ public final class NotificationContainerController: ViewController { let toAlpha: CGFloat = value ? 0.0 : 1.0 self.controllerNode.alpha = toAlpha self.controllerNode.layer.animateAlpha(from: fromAlpha, to: toAlpha, duration: 0.2) + self.controllerNode.isUserInteractionEnabled = !value } } } diff --git a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift index e392578bfd..a60ceccd78 100644 --- a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift +++ b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift @@ -74,7 +74,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in - }, sendSticker: { _, _, _, _ in + }, sendSticker: { _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index 99b4c2cd9c..79345e9006 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -459,7 +459,7 @@ final class PeerInfoSelectionPanelNode: ASDisplayNode { self.backgroundNode.backgroundColor = presentationData.theme.rootController.navigationBar.backgroundColor self.separatorNode.backgroundColor = presentationData.theme.rootController.navigationBar.separatorColor - let interfaceState = ChatPresentationInterfaceState(chatWallpaper: .color(0), theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, limitsConfiguration: .defaultValue, fontSize: .regular, bubbleCorners: PresentationChatBubbleCorners(mainRadius: 16.0, auxiliaryRadius: 8.0, mergeBubbleCorners: true), accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: .peer(self.peerId), subject: nil, peerNearbyData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil) + let interfaceState = ChatPresentationInterfaceState(chatWallpaper: .color(0), theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, limitsConfiguration: .defaultValue, fontSize: .regular, bubbleCorners: PresentationChatBubbleCorners(mainRadius: 16.0, auxiliaryRadius: 8.0, mergeBubbleCorners: true), accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: .peer(self.peerId), subject: nil, peerNearbyData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false) let panelHeight = self.selectionPanel.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, additionalSideInsets: UIEdgeInsets(), maxHeight: 0.0, isSecondary: false, transition: transition, interfaceState: interfaceState, metrics: layout.metrics) transition.updateFrame(node: self.selectionPanel, frame: CGRect(origin: CGPoint(), size: CGSize(width: layout.size.width, height: panelHeight))) @@ -1838,7 +1838,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD strongSelf.paneContainerNode.updateSelectedMessageIds(strongSelf.state.selectedMessageIds, animated: true) }, sendCurrentMessage: { _ in }, sendMessage: { _ in - }, sendSticker: { _, _, _, _ in + }, sendSticker: { _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false @@ -3036,7 +3036,15 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD } } } else if let group = peer as? TelegramGroup { + var canManageGroupCalls = false if case .creator = group.role { + canManageGroupCalls = true + } else if case let .admin(rights, _) = group.role { + if rights.flags.contains(.canManageCalls) { + canManageGroupCalls = true + } + } + if canManageGroupCalls { items.append(ActionSheetButtonItem(title: presentationData.strings.ChannelInfo_CreateVoiceChat, color: .accent, action: { [weak self] in dismissAction() @@ -3044,18 +3052,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD return } - strongSelf.activeActionDisposable.set((convertGroupToSupergroup(account: strongSelf.context.account, peerId: group.id) - |> deliverOnMainQueue).start(next: { peerId in - guard let strongSelf = self else { - return - } - - if let controller = strongSelf.controller, let navigationController = controller.navigationController as? NavigationController { - rebuildControllerStackAfterSupergroupUpgrade(controller: controller, navigationController: navigationController) - - strongSelf.createAndJoinGroupCall(peerId: peerId) - } - })) + strongSelf.createAndJoinGroupCall(peerId: group.id) })) } @@ -3212,6 +3209,17 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD self.createAndJoinGroupCall(peerId: peer.id) } return + } else if let peer = self.data?.peer as? TelegramGroup { + guard let cachedGroupData = self.data?.cachedData as? CachedGroupData else { + return + } + + if let activeCall = cachedGroupData.activeCall { + self.context.joinGroupCall(peerId: peer.id, activeCall: activeCall) + } else { + self.createAndJoinGroupCall(peerId: peer.id) + } + return } guard let peer = self.data?.peer as? TelegramUser, let cachedUserData = self.data?.cachedData as? CachedUserData else { @@ -3226,7 +3234,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD } private func createAndJoinGroupCall(peerId: PeerId) { - if let callManager = self.context.sharedContext.callManager { + if let _ = self.context.sharedContext.callManager { let startCall: (Bool) -> Void = { [weak self] endCurrentIfAny in guard let strongSelf = self else { return @@ -3273,34 +3281,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD })) } - let _ = (callManager.currentGroupCallSignal - |> take(1) - |> deliverOnMainQueue).start(next: { [weak self] activeCall in - guard let strongSelf = self else { - return - } - - if let activeCall = activeCall { - let currentPeerId = activeCall.peerId - let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } - let _ = (strongSelf.context.account.postbox.transaction { transaction -> (Peer?, Peer?) in - return (transaction.getPeer(peerId), transaction.getPeer(currentPeerId)) - } |> deliverOnMainQueue).start(next: { [weak self] peer, current in - if let peer = peer { - if let strongSelf = self, let current = current { - strongSelf.controller?.present(textAlertController(context: strongSelf.context, title: presentationData.strings.Call_CallInProgressTitle, text: presentationData.strings.Call_CallInProgressMessage(current.compactDisplayTitle, peer.compactDisplayTitle).0, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: { - startCall(true) - })]), in: .window(.root)) - } else { - strongSelf.controller?.present(textAlertController(context: strongSelf.context, title: presentationData.strings.Call_CallInProgressTitle, text: presentationData.strings.Call_ExternalCallInProgressMessage, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: { - })]), in: .window(.root)) - } - } - }) - } else { - startCall(false) - } - }) + startCall(true) } } diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index 7135453d4a..11f4ea0e0f 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -1216,7 +1216,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { tapMessage?(message) }, clickThroughMessage: { clickThroughMessage?() - }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in + }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { diff --git a/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift b/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift index bc55dba5d5..6f585cf323 100644 --- a/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift +++ b/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift @@ -227,7 +227,7 @@ final class StickerPaneSearchContentNode: ASDisplayNode, PaneSearchContentNode { let packReference: StickerPackReference = .id(id: info.id.id, accessHash: info.accessHash) let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: strongSelf.controllerInteraction.navigationController(), sendSticker: { [weak self] fileReference, sourceNode, sourceRect in if let strongSelf = self { - return strongSelf.controllerInteraction.sendSticker(fileReference, false, sourceNode, sourceRect) + return strongSelf.controllerInteraction.sendSticker(fileReference, nil, false, sourceNode, sourceRect) } else { return false } @@ -323,7 +323,7 @@ final class StickerPaneSearchContentNode: ASDisplayNode, PaneSearchContentNode { } }, sendSticker: { [weak self] file, sourceNode, sourceRect in if let strongSelf = self { - let _ = strongSelf.controllerInteraction.sendSticker(file, false, sourceNode, sourceRect) + let _ = strongSelf.controllerInteraction.sendSticker(file, nil, false, sourceNode, sourceRect) } }, getItemIsPreviewed: { item in return inputNodeInteraction.previewedStickerPackItem == .pack(item) diff --git a/submodules/TelegramUI/Sources/StickersChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/StickersChatInputContextPanelNode.swift index 0075a48ca7..3d14a15ae3 100644 --- a/submodules/TelegramUI/Sources/StickersChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/StickersChatInputContextPanelNode.swift @@ -130,7 +130,7 @@ final class StickersChatInputContextPanelNode: ChatInputContextPanelNode { var menuItems: [PeekControllerMenuItem] = [] menuItems = [ PeekControllerMenuItem(title: strongSelf.strings.StickerPack_Send, color: .accent, font: .bold, action: { _, _ in - return controllerInteraction.sendSticker(.standalone(media: item.file), true, itemNode, itemNode.bounds) + return controllerInteraction.sendSticker(.standalone(media: item.file), nil, true, itemNode, itemNode.bounds) }), PeekControllerMenuItem(title: isStarred ? strongSelf.strings.Stickers_RemoveFromFavorites : strongSelf.strings.Stickers_AddToFavorites, color: isStarred ? .destructive : .accent, action: { _, _ in if let strongSelf = self { @@ -150,7 +150,7 @@ final class StickersChatInputContextPanelNode: ChatInputContextPanelNode { if let packReference = packReference { let controller = StickerPackScreen(context: strongSelf.context, mainStickerPack: packReference, stickerPacks: [packReference], parentNavigationController: controllerInteraction.navigationController(), sendSticker: { file, sourceNode, sourceRect in if let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction { - return controllerInteraction.sendSticker(file, true, sourceNode, sourceRect) + return controllerInteraction.sendSticker(file, nil, true, sourceNode, sourceRect) } else { return false } diff --git a/submodules/TgVoipWebrtc/tgcalls b/submodules/TgVoipWebrtc/tgcalls index 6ae73f4c38..6156230e6a 160000 --- a/submodules/TgVoipWebrtc/tgcalls +++ b/submodules/TgVoipWebrtc/tgcalls @@ -1 +1 @@ -Subproject commit 6ae73f4c388854d86a0ce66bf243561a11d9e719 +Subproject commit 6156230e6a50c65e4e6495623989689834e8e09a