diff --git a/Telegram/Telegram-iOS/Resources/Invite.tgs b/Telegram/Telegram-iOS/Resources/Invite.tgs
new file mode 100644
index 0000000000..de9333de44
Binary files /dev/null and b/Telegram/Telegram-iOS/Resources/Invite.tgs differ
diff --git a/Telegram/Telegram-iOS/Resources/PlaneLogo.tgs b/Telegram/Telegram-iOS/Resources/PlaneLogo.tgs
new file mode 100644
index 0000000000..674bb9b4ea
Binary files /dev/null and b/Telegram/Telegram-iOS/Resources/PlaneLogo.tgs differ
diff --git a/Telegram/Telegram-iOS/be.lproj/AppIntentVocabulary.plist b/Telegram/Telegram-iOS/be.lproj/AppIntentVocabulary.plist
new file mode 100644
index 0000000000..504ece4483
--- /dev/null
+++ b/Telegram/Telegram-iOS/be.lproj/AppIntentVocabulary.plist
@@ -0,0 +1,17 @@
+
+
+
+
+ IntentPhrases
+
+
+ IntentName
+ INSendMessageIntent
+ IntentExamples
+
+ Send a Telegram message to Alex saying I'll be there in 10 minutes
+
+
+
+
+
diff --git a/Telegram/Telegram-iOS/be.lproj/InfoPlist.strings b/Telegram/Telegram-iOS/be.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..3f3e41d337
--- /dev/null
+++ b/Telegram/Telegram-iOS/be.lproj/InfoPlist.strings
@@ -0,0 +1,12 @@
+/* Localized versions of Info.plist keys */
+
+"NSContactsUsageDescription" = "Telegram будзе запампоўваць вашы кантакты на свае моцна абароненыя і зашыфраваныя воблачныя серверы, каб вы маглі кантактаваць са сваімі сябрамі з любой вашай прылады.";
+"NSLocationWhenInUseUsageDescription" = "Калі вы адпраўляе месцазнаходжанне сваім сябрам, Telegram патрэбны доступ да сэрвісаў геалакацыі, каб размясціць вас на карце.";
+"NSLocationAlwaysAndWhenInUseUsageDescription" = "Калі вы трансліруеце ваша месцазнаходжанне сябрам у чаце, Telegram патрэбны доступ у фонавым рэжыме да вашага месцазнаходжання, каб абнаўляць яго падчас трансляцыі.";
+"NSLocationAlwaysUsageDescription" = "Калі вы трансліруеце ваша месцазнаходжанне сябрам у чаце, Telegram патрэбны доступ у фонавым рэжыме да вашага месцазнаходжання, каб абнаўляць яго падчас трансляцыі. Гэта таксама неабходна для таго, каб адпраўляць месцазнаходжанне праз Apple Watch.";
+"NSCameraUsageDescription" = "Нам неабходны гэты дазвол, каб вы маглі рабіць і адпраўляць фота і відэа, а таксама відэавыклікі.";
+"NSPhotoLibraryUsageDescription" = "Нам неабходны гэты дазвол, каб вы маглі абагульваць фота і відэа са сваёй галерэі.";
+"NSPhotoLibraryAddUsageDescription" = "Нам неабходны гэты дазвол, каб вы маглі захоўваць фота і відэа ў сваю галерэю.";
+"NSMicrophoneUsageDescription" = "Нам неабходны гэты дазвол, каб вы маглі запісваць і абагульваць галасавыя паведамленні і відэа з гукам.";
+"NSSiriUsageDescription" = "Вы можаце адпраўляць паведамленні праз Siri.";
+"NSFaceIDUsageDescription" = "Вы можаце карыстацца Face ID для разблакіравання праграмы.";
diff --git a/Telegram/Telegram-iOS/be.lproj/Localizable.strings b/Telegram/Telegram-iOS/be.lproj/Localizable.strings
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings
index 372e459d11..6ed4fae02d 100644
--- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings
+++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings
@@ -5816,3 +5816,76 @@ Sorry for the inconvenience.";
"PeerInfo.ButtonVoiceChat" = "Voice Chat";
"VoiceChat.OpenChat" = "Open Chat";
+
+"GroupInfo.InviteLinks" = "Invite Links";
+
+"InviteLink.Title" = "Invite Links";
+"InviteLink.PermanentLink" = "Permanent Link";
+"InviteLink.Share" = "Share Link";
+"InviteLink.PeopleJoinedNone" = "no one joined yet";
+"InviteLink.PeopleJoined_1" = "%@ people joined";
+"InviteLink.PeopleJoined_2" = "%@ people joined";
+"InviteLink.PeopleJoined_3_10" = "%@ people joined";
+"InviteLink.PeopleJoined_many" = "%@ people joined";
+"InviteLink.PeopleJoined_any" = "%@ people joined";
+"InviteLink.CreatePrivateLinkHelp" = "Anyone who has Telegram installed will be able to join your group by following this link.";
+"InviteLink.Manage" = "Manage Invite Links";
+
+"InviteLink.PeopleJoinedShortNoneExpired" = "no one joined";
+"InviteLink.PeopleJoinedShortNone" = "no one joined yet";
+"InviteLink.PeopleJoinedShort_1" = "%@ joined";
+"InviteLink.PeopleJoinedShort_2" = "%@ joined";
+"InviteLink.PeopleJoinedShort_3_10" = "%@ joined";
+"InviteLink.PeopleJoinedShort_many" = "%@ joined";
+"InviteLink.PeopleJoinedShort_any" = "%@ joined";
+
+"InviteLink.Expired" = "expired";
+"InviteLink.UsageLimitReached" = "limit reached";
+"InviteLink.Revoked" = "revoked";
+
+"InviteLink.AdditionalLinks" = "Additional Links";
+"InviteLink.Create" = "Create a New Link";
+"InviteLink.CreateInfo" = "You can create additional invite links that have limited time or number of usages.";
+
+"InviteLink.RevokedLinks" = "Revoked Links";
+"InviteLink.DeleteAllRevokedLinks" = "Delete All Revoked Links";
+
+"InviteLink.ContextCopy" = "Copy";
+"InviteLink.ContextEdit" = "Edit";
+"InviteLink.ContextGetQRCode" = "Get QR Code";
+"InviteLink.ContextShare" = "Share";
+"InviteLink.ContextRevoke" = "Revoke";
+"InviteLink.ContextDelete" = "Delete";
+
+"InviteLink.Create.Title" = "New Link";
+"InviteLink.Create.EditTitle" = "Edit Link";
+
+"InviteLink.Create.TimeLimit" = "Limit By Time Period";
+"InviteLink.Create.TimeLimitExpiryDate" = "Expiry Date";
+"InviteLink.Create.TimeLimitExpiryDateNever" = "Never";
+"InviteLink.Create.TimeLimitExpiryTime" = "Time";
+"InviteLink.Create.TimeLimitInfo" = "You can make the link expire after a certain time.";
+"InviteLink.Create.TimeLimitNoLimit" = "No Limit";
+
+"InviteLink.Create.UsersLimit" = "Limit By Number Of Users";
+"InviteLink.Create.UsersLimitNumberOfUsers" = "Number of Uses";
+"InviteLink.Create.UsersLimitNumberOfUsersUnlimited" = "Unlimited";
+"InviteLink.Create.UsersLimitInfo" = "You can make the link expire after it has been used for a certain number of times.";
+"InviteLink.Create.UsersLimitNoLimit" = "No Limit";
+
+"InviteLink.Create.Revoke" = "Revoke Link";
+
+"InviteLink.QRCode.Title" = "Invite by QR Code";
+"InviteLink.QRCode.Info" = "Everyone on Telegram can scan this code to join your group.";
+"InviteLink.QRCode.Share" = "Share QR Code";
+
+"InviteLink.InviteLink" = "Invite Link";
+"InviteLink.CreatedBy" = "Link Created By";
+
+"InviteLink.DeleteAllRevokedLinksAlert.Text" = "This will delete all revoked links";
+"InviteLink.DeleteAllRevokedLinksAlert.Action" = "Delete";
+
+"Conversation.ChecksTooltip.Delivered" = "Delivered";
+"Conversation.ChecksTooltip.Read" = "Read";
+
+"DialogList.MultipleTypingPair" = "%@ and %@ are typing";
diff --git a/Telegram/Telegram-iOS/ru.lproj/InfoPlist.strings b/Telegram/Telegram-iOS/ru.lproj/InfoPlist.strings
index f4b64e4983..08c349a3c3 100644
--- a/Telegram/Telegram-iOS/ru.lproj/InfoPlist.strings
+++ b/Telegram/Telegram-iOS/ru.lproj/InfoPlist.strings
@@ -2,11 +2,11 @@
"NSContactsUsageDescription" = "Актуальная информация о ваших контактах будет храниться зашифрованной в облаке Telegram, чтобы вы могли связаться с друзьями с любого устройства.";
"NSLocationWhenInUseUsageDescription" = "Когда вы отправляете друзьям геопозицию, Telegram нужно разрешение, чтобы показать им карту.";
-"NSLocationAlwaysAndWhenInUseUsageDescription" = "Фоновый доступ к геопозиции требуется, чтобы обновлять вашу геопозицию, когда вы транслируете её в чат с друзьями. ";
+"NSLocationAlwaysAndWhenInUseUsageDescription" = "Фоновый доступ к геопозиции требуется, чтобы обновлять вашу геопозицию, когда вы транслируете её в чат с друзьями.";
"NSLocationAlwaysUsageDescription" = "Фоновый доступ к геопозиции требуется, чтобы обновлять вашу геопозицию, когда вы транслируете её в чат с друзьями. Он также необходим для отправки геопозиции с Apple Watch.";
"NSCameraUsageDescription" = "Это необходимо, чтобы вы могли делиться снятыми фотографиями и видео.";
"NSPhotoLibraryUsageDescription" = "Это необходимо, чтобы вы могли делиться фото и видео из библиотеки устройства.";
"NSPhotoLibraryAddUsageDescription" = "Это необходимо, чтобы вы могли сохранять фото и видео в библиотеку устройства.";
"NSMicrophoneUsageDescription" = "Это необходимо, чтобы вы могли делиться голосовыми сообщениями и видео со звуком.";
-"NSSiriUsageDescription" = "Вы можете использовать Siri для отправки сообщений";
+"NSSiriUsageDescription" = "Вы можете использовать Siri для отправки сообщений.";
"NSFaceIDUsageDescription" = "Вы можете разблокировать приложение с помощью Face ID.";
diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift
index 37939de157..ef900c946e 100644
--- a/submodules/ChatListUI/Sources/ChatListController.swift
+++ b/submodules/ChatListUI/Sources/ChatListController.swift
@@ -1970,6 +1970,15 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
}
let _ = (signal
|> deliverOnMainQueue).start()
+
+ strongSelf.chatListDisplayNode.containerNode.updateState({ state in
+ var state = state
+ for peerId in peerIds {
+ state.selectedPeerIds.remove(peerId)
+ }
+ return state
+ })
+
return true
} else if value == .undo {
strongSelf.chatListDisplayNode.containerNode.currentItemNode.setCurrentRemovingPeerId(peerIds.first!)
@@ -2524,6 +2533,13 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
deleteSendMessageIntents(peerId: peerId)
})
+
+ strongSelf.chatListDisplayNode.containerNode.updateState({ state in
+ var state = state
+ state.selectedPeerIds.remove(peerId)
+ return state
+ })
+
completion()
return true
} else if value == .undo {
diff --git a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift
index b94b86b190..eb554c3a8a 100644
--- a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift
+++ b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift
@@ -684,7 +684,6 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
let items = context.sharedContext.chatAvailableMessageActions(postbox: context.account.postbox, accountPeerId: context.account.peerId, messageIds: [message.id], messages: messages, peers: peers)
|> map { actions -> [ContextMenuItem] in
var items: [ContextMenuItem] = []
-
if let linkForCopying = linkForCopying {
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Conversation_ContextMenuCopyLink, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
@@ -948,17 +947,25 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
})
}) |> deliverOnMainQueue).start(completed: {
if let strongSelf = self {
-// strongSelf.headerNode.navigationButtonContainer.performAction?(.selectionDone)
-
let controller = strongSelf.context.sharedContext.makeChatController(context: strongSelf.context, chatLocation: .peer(peerId), subject: nil, botStart: nil, mode: .standard(previewing: false))
controller.purposefulAction = { [weak self] in
self?.cancel?()
}
- strongSelf.navigationController?.pushViewController(controller, animated: false, completion: {
- if let peerSelectionController = peerSelectionController {
- peerSelectionController.dismiss()
+
+ if let navigationController = strongSelf.navigationController, let peerSelectionControllerIndex = navigationController.viewControllers.firstIndex(where: { $0 is PeerSelectionController }) {
+ var viewControllers = navigationController.viewControllers
+ viewControllers.insert(controller, at: peerSelectionControllerIndex)
+ navigationController.setViewControllers(viewControllers, animated: false)
+ Queue.mainQueue().after(0.2) {
+ peerSelectionController?.dismiss()
}
- })
+ } else {
+ strongSelf.navigationController?.pushViewController(controller, animated: false, completion: {
+ if let peerSelectionController = peerSelectionController {
+ peerSelectionController.dismiss()
+ }
+ })
+ }
strongSelf.updateState { state in
return state.withUpdatedSelectedMessageIds(nil)
diff --git a/submodules/ChatListUI/Sources/ChatListSearchPaneContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchPaneContainerNode.swift
index 99712212d2..4c2805501b 100644
--- a/submodules/ChatListUI/Sources/ChatListSearchPaneContainerNode.swift
+++ b/submodules/ChatListUI/Sources/ChatListSearchPaneContainerNode.swift
@@ -129,9 +129,7 @@ final class ChatListSearchPaneContainerNode: ASDisplayNode, UIGestureRecognizerD
private var pendingPanes: [ChatListSearchPaneKey: ChatListSearchPendingPane] = [:]
private var transitionFraction: CGFloat = 0.0
-
- var openPeerContextAction: ((Peer, ASDisplayNode, ContextGesture?) -> Void)?
-
+
var currentPaneUpdated: ((ChatListSearchPaneKey?, CGFloat, ContainedViewLayoutTransition) -> Void)?
var requestExpandTabs: (() -> Bool)?
diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift
index c2bb76eed1..3258162d7a 100644
--- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift
+++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift
@@ -1354,7 +1354,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
switch item.content {
case let .peer(_, renderedPeer, _, _, presence, _ ,_ ,_, _, _, displayAsMessage, _):
if !displayAsMessage {
- if let peer = renderedPeer.peer as? TelegramUser, let presence = presence as? TelegramUserPresence, !isServicePeer(peer) && !peer.flags.contains(.isSupport) && peer.id != item.context.account.peerId {
+ if let peer = renderedPeer.chatMainPeer as? TelegramUser, let presence = presence as? TelegramUserPresence, !isServicePeer(peer) && !peer.flags.contains(.isSupport) && peer.id != item.context.account.peerId {
let updatedPresence = TelegramUserPresence(status: presence.status, lastActivity: 0)
let relativeStatus = relativeUserPresenceStatus(updatedPresence, relativeTo: timestamp)
if case .online = relativeStatus {
diff --git a/submodules/ChatListUI/Sources/Node/ChatListTypingNode.swift b/submodules/ChatListUI/Sources/Node/ChatListTypingNode.swift
index ca664a419d..711821cf45 100644
--- a/submodules/ChatListUI/Sources/Node/ChatListTypingNode.swift
+++ b/submodules/ChatListUI/Sources/Node/ChatListTypingNode.swift
@@ -127,7 +127,12 @@ final class ChatListInputActivitiesNode: ASDisplayNode {
let string: NSAttributedString
if activities.count > 1 {
let peerTitle = activities[0].0.compactDisplayTitle
- string = NSAttributedString(string: strings.DialogList_MultipleTyping(peerTitle, strings.DialogList_MultipleTypingSuffix(activities.count - 1).0).0, font: textFont, textColor: color)
+ if activities.count == 2 {
+ let secondPeerTitle = activities[1].0.compactDisplayTitle
+ string = NSAttributedString(string: strings.DialogList_MultipleTypingPair(peerTitle, secondPeerTitle).0, font: textFont, textColor: color)
+ } else {
+ string = NSAttributedString(string: strings.DialogList_MultipleTyping(peerTitle, strings.DialogList_MultipleTypingSuffix(activities.count - 1).0).0, font: textFont, textColor: color)
+ }
} else {
string = NSAttributedString(string: strings.DialogList_MultipleTypingSuffix(activities.count).0, font: textFont, textColor: color)
}
diff --git a/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionControllerNode.swift b/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionControllerNode.swift
index 82b9b60a54..b429fc0be1 100644
--- a/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionControllerNode.swift
+++ b/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionControllerNode.swift
@@ -58,15 +58,21 @@ private func loadCountryCodes() -> [(String, Int)] {
private let countryCodes: [(String, Int)] = loadCountryCodes()
-func localizedCountryNamesAndCodes(strings: PresentationStrings) -> [((String, String), String, Int)] {
+func localizedCountryNamesAndCodes(strings: PresentationStrings) -> [((String, String), String, [Int])] {
let locale = localeWithStrings(strings)
- var result: [((String, String), String, Int)] = []
+ var result: [((String, String), String, [Int])] = []
for country in AuthorizationSequenceCountrySelectionController.countries() {
if country.hidden {
continue
}
- if let englishCountryName = usEnglishLocale.localizedString(forRegionCode: country.id), let countryName = locale.localizedString(forRegionCode: country.id), let codeValue = country.countryCodes.first?.code, let code = Int(codeValue) {
- result.append(((englishCountryName, countryName), country.id, code))
+ if let englishCountryName = usEnglishLocale.localizedString(forRegionCode: country.id), let countryName = locale.localizedString(forRegionCode: country.id) {
+ var codes: [Int] = []
+ for codeValue in country.countryCodes {
+ if let code = Int(codeValue.code) {
+ codes.append(code)
+ }
+ }
+ result.append(((englishCountryName, countryName), country.id, codes))
} else {
assertionFailure()
}
@@ -128,7 +134,7 @@ private func matchStringTokens(_ tokens: [ValueBoxKey], with other: [ValueBoxKey
return false
}
-private func searchCountries(items: [((String, String), String, Int)], query: String) -> [((String, String), String, Int)] {
+private func searchCountries(items: [((String, String), String, [Int])], query: String) -> [((String, String), String, Int)] {
let queryTokens = stringTokens(query.lowercased())
var result: [((String, String), String, Int)] = []
@@ -136,7 +142,9 @@ private func searchCountries(items: [((String, String), String, Int)], query: St
let string = "\(item.0) \(item.1)"
let tokens = stringTokens(string)
if matchStringTokens(tokens, with: queryTokens) {
- result.append(item)
+ for code in item.2 {
+ result.append((item.0, item.1, code))
+ }
}
}
@@ -158,7 +166,7 @@ final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode,
private let sectionTitles: [String]
private var searchResults: [((String, String), String, Int)] = []
- private let countryNamesAndCodes: [((String, String), String, Int)]
+ private let countryNamesAndCodes: [((String, String), String, [Int])]
init(theme: PresentationTheme, strings: PresentationStrings, displayCodes: Bool, itemSelected: @escaping (((String, String), String, Int)) -> Void) {
self.theme = theme
@@ -181,14 +189,16 @@ final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode,
self.countryNamesAndCodes = countryNamesAndCodes
var sections: [(String, [((String, String), String, Int)])] = []
- for (names, id, code) in countryNamesAndCodes.sorted(by: { lhs, rhs in
+ for (names, id, codes) in countryNamesAndCodes.sorted(by: { lhs, rhs in
return lhs.0.1 < rhs.0.1
}) {
let title = String(names.1[names.1.startIndex ..< names.1.index(after: names.1.startIndex)]).uppercased()
if sections.isEmpty || sections[sections.count - 1].0 != title {
sections.append((title, []))
}
- sections[sections.count - 1].1.append((names, id, code))
+ for code in codes {
+ sections[sections.count - 1].1.append((names, id, code))
+ }
}
self.sections = sections
self.sectionTitles = sections.map { $0.0 }
diff --git a/submodules/DatePickerNode/BUILD b/submodules/DatePickerNode/BUILD
new file mode 100644
index 0000000000..f95d63dc3f
--- /dev/null
+++ b/submodules/DatePickerNode/BUILD
@@ -0,0 +1,17 @@
+load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")
+
+swift_library(
+ name = "DatePickerNode",
+ module_name = "DatePickerNode",
+ srcs = glob([
+ "Sources/**/*.swift",
+ ]),
+ deps = [
+ "//submodules/AsyncDisplayKit:AsyncDisplayKit",
+ "//submodules/Display:Display",
+ "//submodules/TelegramPresentationData:TelegramPresentationData",
+ ],
+ visibility = [
+ "//visibility:public",
+ ],
+)
diff --git a/submodules/DatePickerNode/Sources/DatePickerNode.swift b/submodules/DatePickerNode/Sources/DatePickerNode.swift
new file mode 100644
index 0000000000..0a36621dbc
--- /dev/null
+++ b/submodules/DatePickerNode/Sources/DatePickerNode.swift
@@ -0,0 +1,425 @@
+//import Foundation
+//import Display
+//import UIKit
+//import AsyncDisplayKit
+//import TelegramPresentationData
+//
+//private let textFont = Font.regular(13.0)
+//private let selectedTextFont = Font.bold(13.0)
+//
+//public final class DatePickerTheme: Equatable {
+// public let backgroundColor: UIColor
+// public let textColor: UIColor
+// public let secondaryTextColor: UIColor
+// public let accentColor: UIColor
+// public let selectionColor: UIColor
+// public let selectedCurrentTextColor: UIColor
+// public let secondarySelectionColor: UIColor
+//
+// public init(backgroundColor: UIColor, textColor: UIColor, secondaryTextColor: UIColor, accentColor: UIColor, selectionColor: UIColor, selectedCurrentTextColor: UIColor, secondarySelectionColor: UIColor) {
+// self.backgroundColor = backgroundColor
+// self.textColor = textColor
+// self.secondaryTextColor = secondaryTextColor
+// self.accentColor = accentColor
+// self.selectionColor = selectionColor
+// self.selectedCurrentTextColor = selectedCurrentTextColor
+// self.secondarySelectionColor = secondarySelectionColor
+// }
+//
+// public static func ==(lhs: DatePickerTheme, rhs: DatePickerTheme) -> Bool {
+// if lhs.backgroundColor != rhs.backgroundColor {
+// return false
+// }
+// if lhs.textColor != rhs.textColor {
+// return false
+// }
+// if lhs.secondaryTextColor != rhs.secondaryTextColor {
+// return false
+// }
+// if lhs.accentColor != rhs.accentColor {
+// return false
+// }
+// if lhs.selectionColor != rhs.selectionColor {
+// return false
+// }
+// if lhs.selectedCurrentTextColor != rhs.selectedCurrentTextColor {
+// return false
+// }
+// if lhs.secondarySelectionColor != rhs.secondarySelectionColor {
+// return false
+// }
+// return true
+// }
+//}
+//
+//public extension DatePickerTheme {
+// convenience init(theme: PresentationTheme) {
+// self.init(backgroundColor: theme.rootController.navigationBar.segmentedBackgroundColor, foregroundColor: theme.rootController.navigationBar.segmentedForegroundColor, shadowColor: .black, textColor: theme.rootController.navigationBar.segmentedTextColor, dividerColor: theme.rootController.navigationBar.segmentedDividerColor)
+// }
+//}
+//
+//private class SegmentedControlItemNode: HighlightTrackingButtonNode {
+//}
+//
+//private let telegramReleaseDate = Date(timeIntervalSince1970: 1376438400.0)
+//
+//public final class DatePickerNode: ASDisplayNode, UIGestureRecognizerDelegate {
+// private var theme: DatePickerTheme
+// private var _items: [SegmentedControlItem]
+// private var _selectedIndex: Int = 0
+//
+// private var validLayout: SegmentedControlLayout?
+//
+// private let selectionNode: ASImageNode
+// private var itemNodes: [SegmentedControlItemNode]
+// private var dividerNodes: [ASDisplayNode]
+//
+// private var gestureRecognizer: UIPanGestureRecognizer?
+// private var gestureSelectedIndex: Int?
+//
+// public var maximumDate: Date? {
+// didSet {
+//
+// }
+// }
+// public var minimumDate: Date = telegramReleaseDate {
+// didSet {
+//
+// }
+// }
+// public var date: Date = Date() {
+// didSet {
+//
+// }
+// }
+//
+//
+// public var items: [SegmentedControlItem] {
+// get {
+// return self._items
+// }
+// set {
+// let previousItems = self._items
+// self._items = newValue
+// guard previousItems != newValue else {
+// return
+// }
+//
+// self.itemNodes.forEach { $0.removeFromSupernode() }
+// self.itemNodes = self._items.map { item in
+// let itemNode = SegmentedControlItemNode()
+// itemNode.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 8.0, bottom: 0.0, right: 8.0)
+// itemNode.titleNode.maximumNumberOfLines = 1
+// itemNode.titleNode.truncationMode = .byTruncatingTail
+// itemNode.setTitle(item.title, with: textFont, with: self.theme.textColor, for: .normal)
+// itemNode.setTitle(item.title, with: selectedTextFont, with: self.theme.textColor, for: .selected)
+// itemNode.setTitle(item.title, with: selectedTextFont, with: self.theme.textColor, for: [.selected, .highlighted])
+// return itemNode
+// }
+// self.setupButtons()
+// self.itemNodes.forEach(self.addSubnode(_:))
+//
+// let dividersCount = self._items.count > 2 ? self._items.count - 1 : 0
+// if self.dividerNodes.count != dividersCount {
+// self.dividerNodes.forEach { $0.removeFromSupernode() }
+// self.dividerNodes = (0 ..< dividersCount).map { _ in ASDisplayNode() }
+// }
+//
+// if let layout = self.validLayout {
+// let _ = self.updateLayout(layout, transition: .immediate)
+// }
+// }
+// }
+//
+// public var selectedIndex: Int {
+// get {
+// return self._selectedIndex
+// }
+// set {
+// guard newValue != self._selectedIndex else {
+// return
+// }
+// self._selectedIndex = newValue
+// if let layout = self.validLayout {
+// let _ = self.updateLayout(layout, transition: .immediate)
+// }
+// }
+// }
+//
+// public func setSelectedIndex(_ index: Int, animated: Bool) {
+// guard index != self._selectedIndex else {
+// return
+// }
+// self._selectedIndex = index
+// if let layout = self.validLayout {
+// let _ = self.updateLayout(layout, transition: .animated(duration: 0.2, curve: .easeInOut))
+// }
+// }
+//
+// public var selectedIndexChanged: (Int) -> Void = { _ in }
+// public var selectedIndexShouldChange: (Int, @escaping (Bool) -> Void) -> Void = { _, f in
+// f(true)
+// }
+//
+// public init(theme: SegmentedControlTheme, items: [SegmentedControlItem], selectedIndex: Int) {
+// self.theme = theme
+// self._items = items
+// self._selectedIndex = selectedIndex
+//
+// self.selectionNode = ASImageNode()
+// self.selectionNode.displaysAsynchronously = false
+// self.selectionNode.displayWithoutProcessing = true
+//
+// self.itemNodes = items.map { item in
+// let itemNode = SegmentedControlItemNode()
+// itemNode.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 8.0, bottom: 0.0, right: 8.0)
+// itemNode.titleNode.maximumNumberOfLines = 1
+// itemNode.titleNode.truncationMode = .byTruncatingTail
+// itemNode.setTitle(item.title, with: textFont, with: theme.textColor, for: .normal)
+// itemNode.setTitle(item.title, with: selectedTextFont, with: theme.textColor, for: .selected)
+// itemNode.setTitle(item.title, with: selectedTextFont, with: theme.textColor, for: [.selected, .highlighted])
+// return itemNode
+// }
+//
+// let dividersCount = items.count > 2 ? items.count - 1 : 0
+// self.dividerNodes = (0 ..< dividersCount).map { _ in
+// let node = ASDisplayNode()
+// node.backgroundColor = theme.dividerColor
+// return node
+// }
+//
+// super.init()
+//
+// self.clipsToBounds = true
+// self.cornerRadius = 9.0
+//
+// self.addSubnode(self.selectionNode)
+// self.itemNodes.forEach(self.addSubnode(_:))
+// self.setupButtons()
+// self.dividerNodes.forEach(self.addSubnode(_:))
+//
+// self.backgroundColor = self.theme.backgroundColor
+// self.selectionNode.image = generateSelectionImage(theme: self.theme)
+// }
+//
+// override public func didLoad() {
+// super.didLoad()
+//
+// self.view.disablesInteractiveTransitionGestureRecognizer = true
+//
+// let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:)))
+// gestureRecognizer.delegate = self
+// self.view.addGestureRecognizer(gestureRecognizer)
+// self.gestureRecognizer = gestureRecognizer
+// }
+//
+// private func setupButtons() {
+// for i in 0 ..< self.itemNodes.count {
+// let itemNode = self.itemNodes[i]
+// itemNode.addTarget(self, action: #selector(self.buttonPressed(_:)), forControlEvents: .touchUpInside)
+// itemNode.highligthedChanged = { [weak self, weak itemNode] highlighted in
+// if let strongSelf = self, let itemNode = itemNode {
+// let transition = ContainedViewLayoutTransition.animated(duration: 0.25, curve: .easeInOut)
+// if strongSelf.selectedIndex == i {
+// if let gestureRecognizer = strongSelf.gestureRecognizer, case .began = gestureRecognizer.state {
+// } else {
+// strongSelf.updateButtonsHighlights(highlightedIndex: highlighted ? i : nil, gestureSelectedIndex: strongSelf.gestureSelectedIndex)
+// }
+// } else if highlighted {
+// transition.updateAlpha(node: itemNode, alpha: 0.4)
+// }
+// if !highlighted {
+// transition.updateAlpha(node: itemNode, alpha: 1.0)
+// }
+// }
+// }
+// }
+// }
+//
+// private func updateButtonsHighlights(highlightedIndex: Int?, gestureSelectedIndex: Int?) {
+// let transition = ContainedViewLayoutTransition.animated(duration: 0.25, curve: .easeInOut)
+// if highlightedIndex == nil && gestureSelectedIndex == nil {
+// transition.updateTransformScale(node: self.selectionNode, scale: 1.0)
+// } else {
+// transition.updateTransformScale(node: self.selectionNode, scale: 0.92)
+// }
+// for i in 0 ..< self.itemNodes.count {
+// let itemNode = self.itemNodes[i]
+// if i == highlightedIndex || i == gestureSelectedIndex {
+// transition.updateTransformScale(node: itemNode, scale: 0.92)
+// } else {
+// transition.updateTransformScale(node: itemNode, scale: 1.0)
+// }
+// }
+// }
+//
+// private func updateButtonsHighlights() {
+// let transition = ContainedViewLayoutTransition.animated(duration: 0.25, curve: .easeInOut)
+// if let gestureSelectedIndex = self.gestureSelectedIndex {
+// for i in 0 ..< self.itemNodes.count {
+// let itemNode = self.itemNodes[i]
+// transition.updateTransformScale(node: itemNode, scale: i == gestureSelectedIndex ? 0.92 : 1.0)
+// }
+// } else {
+// for itemNode in self.itemNodes {
+// transition.updateTransformScale(node: itemNode, scale: 1.0)
+// }
+// }
+// }
+//
+// public func updateTheme(_ theme: SegmentedControlTheme) {
+// guard theme != self.theme else {
+// return
+// }
+// self.theme = theme
+//
+// self.backgroundColor = self.theme.backgroundColor
+// self.selectionNode.image = generateSelectionImage(theme: self.theme)
+//
+// for itemNode in self.itemNodes {
+// if let title = itemNode.attributedTitle(for: .normal)?.string {
+// itemNode.setTitle(title, with: textFont, with: self.theme.textColor, for: .normal)
+// itemNode.setTitle(title, with: selectedTextFont, with: self.theme.textColor, for: .selected)
+// itemNode.setTitle(title, with: selectedTextFont, with: self.theme.textColor, for: [.selected, .highlighted])
+// }
+// }
+//
+// for dividerNode in self.dividerNodes {
+// dividerNode.backgroundColor = theme.dividerColor
+// }
+// }
+//
+// public func updateLayout(_ layout: SegmentedControlLayout, transition: ContainedViewLayoutTransition) -> CGSize {
+// self.validLayout = layout
+//
+// let calculatedWidth: CGFloat = 0.0
+//
+// let width: CGFloat
+// switch layout {
+// case let .stretchToFill(targetWidth):
+// width = targetWidth
+// case let .sizeToFit(maximumWidth, minimumWidth):
+// width = max(minimumWidth, min(maximumWidth, calculatedWidth))
+// }
+//
+// let selectedIndex: Int
+// if let gestureSelectedIndex = self.gestureSelectedIndex {
+// selectedIndex = gestureSelectedIndex
+// } else {
+// selectedIndex = self.selectedIndex
+// }
+//
+// let size = CGSize(width: width, height: 32.0)
+// if !self.itemNodes.isEmpty {
+// let itemSize = CGSize(width: floorToScreenPixels(size.width / CGFloat(self.itemNodes.count)), height: size.height)
+//
+// transition.updateBounds(node: self.selectionNode, bounds: CGRect(origin: CGPoint(), size: itemSize))
+// transition.updatePosition(node: self.selectionNode, position: CGPoint(x: itemSize.width / 2.0 + itemSize.width * CGFloat(selectedIndex), y: size.height / 2.0))
+//
+// for i in 0 ..< self.itemNodes.count {
+// let itemNode = self.itemNodes[i]
+// let _ = itemNode.measure(itemSize)
+// transition.updateFrame(node: itemNode, frame: CGRect(origin: CGPoint(x: itemSize.width * CGFloat(i), y: (size.height - itemSize.height) / 2.0), size: itemSize))
+//
+// let isSelected = selectedIndex == i
+// if itemNode.isSelected != isSelected {
+// if case .animated = transition {
+// UIView.transition(with: itemNode.view, duration: 0.2, options: .transitionCrossDissolve, animations: {
+// itemNode.isSelected = isSelected
+// }, completion: nil)
+// } else {
+// itemNode.isSelected = isSelected
+// }
+// if isSelected {
+// itemNode.accessibilityTraits.insert(.selected)
+// } else {
+// itemNode.accessibilityTraits.remove(.selected)
+// }
+// }
+// }
+// }
+//
+// if !self.dividerNodes.isEmpty {
+// let dividerSize = CGSize(width: 1.0, height: 16.0)
+// let delta: CGFloat = size.width / CGFloat(self.dividerNodes.count + 1)
+// for i in 0 ..< self.dividerNodes.count {
+// let dividerNode = self.dividerNodes[i]
+// transition.updateFrame(node: dividerNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels(delta * CGFloat(i + 1) - dividerSize.width / 2.0), y: (size.height - dividerSize.height) / 2.0), size: dividerSize))
+//
+// let dividerAlpha: CGFloat
+// if (selectedIndex - 1 ... selectedIndex).contains(i) {
+// dividerAlpha = 0.0
+// } else {
+// dividerAlpha = 1.0
+// }
+// transition.updateAlpha(node: dividerNode, alpha: dividerAlpha)
+// }
+// }
+//
+// return size
+// }
+//
+// @objc private func buttonPressed(_ button: SegmentedControlItemNode) {
+// guard let index = self.itemNodes.firstIndex(of: button) else {
+// return
+// }
+//
+// self.selectedIndexShouldChange(index, { [weak self] commit in
+// if let strongSelf = self, commit {
+// strongSelf._selectedIndex = index
+// strongSelf.selectedIndexChanged(index)
+// if let layout = strongSelf.validLayout {
+// let _ = strongSelf.updateLayout(layout, transition: .animated(duration: 0.2, curve: .slide))
+// }
+// }
+// })
+// }
+//
+// public override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
+// return self.selectionNode.frame.contains(gestureRecognizer.location(in: self.view))
+// }
+//
+// @objc private func panGesture(_ recognizer: UIPanGestureRecognizer) {
+// let location = recognizer.location(in: self.view)
+// switch recognizer.state {
+// case .changed:
+// if !self.selectionNode.frame.contains(location) {
+// let point = CGPoint(x: max(0.0, min(self.bounds.width, location.x)), y: 1.0)
+// for i in 0 ..< self.itemNodes.count {
+// let itemNode = self.itemNodes[i]
+// if itemNode.frame.contains(point) {
+// if i != self.gestureSelectedIndex {
+// self.gestureSelectedIndex = i
+// self.updateButtonsHighlights(highlightedIndex: nil, gestureSelectedIndex: i)
+// if let layout = self.validLayout {
+// let _ = self.updateLayout(layout, transition: .animated(duration: 0.35, curve: .slide))
+// }
+// }
+// break
+// }
+// }
+// }
+// case .ended:
+// if let gestureSelectedIndex = self.gestureSelectedIndex {
+// if gestureSelectedIndex != self.selectedIndex {
+// self.selectedIndexShouldChange(gestureSelectedIndex, { [weak self] commit in
+// if let strongSelf = self {
+// if commit {
+// strongSelf._selectedIndex = gestureSelectedIndex
+// strongSelf.selectedIndexChanged(gestureSelectedIndex)
+// } else {
+// if let layout = strongSelf.validLayout {
+// let _ = strongSelf.updateLayout(layout, transition: .animated(duration: 0.2, curve: .slide))
+// }
+// }
+// }
+// })
+// }
+// self.gestureSelectedIndex = nil
+// }
+// self.updateButtonsHighlights(highlightedIndex: nil, gestureSelectedIndex: nil)
+// default:
+// break
+// }
+// }
+//}
diff --git a/submodules/Display/Source/ContextMenuContainerNode.swift b/submodules/Display/Source/ContextMenuContainerNode.swift
index aea6ae2062..ecbbabef41 100644
--- a/submodules/Display/Source/ContextMenuContainerNode.swift
+++ b/submodules/Display/Source/ContextMenuContainerNode.swift
@@ -51,7 +51,7 @@ public final class ContextMenuContainerNode: ASDisplayNode {
let maskParams = CachedMaskParams(size: self.bounds.size, relativeArrowPosition: self.relativeArrowPosition?.0 ?? self.bounds.size.width / 2.0, arrowOnBottom: self.relativeArrowPosition?.1 ?? true)
if self.cachedMaskParams != maskParams {
let path = UIBezierPath()
- let cornerRadius: CGFloat = 6.0
+ let cornerRadius: CGFloat = 10.0
let verticalInset: CGFloat = 9.0
let arrowWidth: CGFloat = 18.0
let requestedArrowPosition = maskParams.relativeArrowPosition
diff --git a/submodules/Display/Source/TooltipController.swift b/submodules/Display/Source/TooltipController.swift
index 34c320883d..c9ee3dcf3a 100644
--- a/submodules/Display/Source/TooltipController.swift
+++ b/submodules/Display/Source/TooltipController.swift
@@ -3,10 +3,16 @@ import UIKit
import AsyncDisplayKit
import SwiftSignalKit
+public protocol TooltipControllerCustomContentNode: ASDisplayNode {
+ func animateIn()
+ func updateLayout(size: CGSize) -> CGSize
+}
+
public enum TooltipControllerContent: Equatable {
case text(String)
case attributedText(NSAttributedString)
case iconAndText(UIImage, String)
+ case custom(TooltipControllerCustomContentNode)
var text: String {
switch self {
@@ -14,6 +20,8 @@ public enum TooltipControllerContent: Equatable {
return text
case let .attributedText(text):
return text.string
+ case .custom:
+ return ""
}
}
@@ -23,6 +31,35 @@ public enum TooltipControllerContent: Equatable {
}
return nil
}
+
+ public static func == (lhs: TooltipControllerContent, rhs: TooltipControllerContent) -> Bool {
+ switch lhs {
+ case let .text(lhsText):
+ if case let .text(rhsText) = rhs, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .attributedText(lhsText):
+ if case let .attributedText(rhsText) = rhs, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .iconAndText(_, lhsText):
+ if case let .iconAndText(_, rhsText) = rhs, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .custom(lhsNode):
+ if case let .custom(rhsNode) = rhs, lhsNode === rhsNode {
+ return true
+ } else {
+ return false
+ }
+ }
+ }
}
public enum SourceAndRect {
diff --git a/submodules/Display/Source/TooltipControllerNode.swift b/submodules/Display/Source/TooltipControllerNode.swift
index ba0650c6ee..e67cc95e79 100644
--- a/submodules/Display/Source/TooltipControllerNode.swift
+++ b/submodules/Display/Source/TooltipControllerNode.swift
@@ -12,6 +12,7 @@ final class TooltipControllerNode: ASDisplayNode {
private let containerNode: ContextMenuContainerNode
private let imageNode: ASImageNode
private let textNode: ImmediateTextNode
+ private var contentNode: TooltipControllerCustomContentNode?
private let dismissByTapOutside: Bool
@@ -45,10 +46,15 @@ final class TooltipControllerNode: ASDisplayNode {
self.dismiss = dismiss
+ if case let .custom(contentNode) = content {
+ self.contentNode = contentNode
+ }
+
super.init()
self.containerNode.addSubnode(self.imageNode)
self.containerNode.addSubnode(self.textNode)
+ self.contentNode.flatMap { self.containerNode.addSubnode($0) }
self.addSubnode(self.containerNode)
}
@@ -71,20 +77,37 @@ final class TooltipControllerNode: ASDisplayNode {
func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
self.validLayout = layout
- let maxActionsWidth = layout.size.width - 20.0
+ let maxWidth = layout.size.width - 20.0
- var imageSize = CGSize()
- var imageSizeWithInset = CGSize()
- if let image = self.imageNode.image {
- imageSize = image.size
- imageSizeWithInset = CGSize(width: image.size.width + 12.0, height: image.size.height)
+ let contentSize: CGSize
+
+ if let contentNode = self.contentNode {
+ contentSize = contentNode.updateLayout(size: layout.size)
+ contentNode.frame = CGRect(origin: CGPoint(), size: contentSize)
+ } else {
+ var imageSize = CGSize()
+ var imageSizeWithInset = CGSize()
+ if let image = self.imageNode.image {
+ imageSize = image.size
+ imageSizeWithInset = CGSize(width: image.size.width + 12.0, height: image.size.height)
+ }
+
+ var textSize = self.textNode.updateLayout(CGSize(width: maxWidth, height: CGFloat.greatestFiniteMagnitude))
+ textSize.width = ceil(textSize.width / 2.0) * 2.0
+ textSize.height = ceil(textSize.height / 2.0) * 2.0
+
+ contentSize = CGSize(width: imageSizeWithInset.width + textSize.width + 12.0, height: textSize.height + 34.0)
+
+ let textFrame = CGRect(origin: CGPoint(x: 6.0 + imageSizeWithInset.width, y: 17.0), size: textSize)
+ if transition.isAnimated, textFrame.size != self.textNode.frame.size {
+ transition.animatePositionAdditive(node: self.textNode, offset: CGPoint(x: textFrame.minX - self.textNode.frame.minX, y: 0.0))
+ }
+
+ let imageFrame = CGRect(origin: CGPoint(x: 10.0, y: floor((contentSize.height - imageSize.height) / 2.0)), size: imageSize)
+ self.imageNode.frame = imageFrame
+ self.textNode.frame = textFrame
}
-
- var textSize = self.textNode.updateLayout(CGSize(width: maxActionsWidth, height: CGFloat.greatestFiniteMagnitude))
- textSize.width = ceil(textSize.width / 2.0) * 2.0
- textSize.height = ceil(textSize.height / 2.0) * 2.0
- let contentSize = CGSize(width: imageSizeWithInset.width + textSize.width + 12.0, height: textSize.height + 34.0)
-
+
let sourceRect: CGRect = self.sourceRect ?? CGRect(origin: CGPoint(x: layout.size.width / 2.0, y: layout.size.height / 2.0), size: CGSize())
let insets = layout.insets(options: [.statusBar, .input])
@@ -105,19 +128,11 @@ final class TooltipControllerNode: ASDisplayNode {
self.containerNode.relativeArrowPosition = (sourceRect.midX - horizontalOrigin, arrowOnBottom)
self.containerNode.updateLayout(transition: transition)
-
- let textFrame = CGRect(origin: CGPoint(x: 6.0 + imageSizeWithInset.width, y: 17.0), size: textSize)
- if transition.isAnimated, textFrame.size != self.textNode.frame.size {
- transition.animatePositionAdditive(node: self.textNode, offset: CGPoint(x: textFrame.minX - self.textNode.frame.minX, y: 0.0))
- }
-
- let imageFrame = CGRect(origin: CGPoint(x: 10.0, y: floor((contentSize.height - imageSize.height) / 2.0)), size: imageSize)
- self.imageNode.frame = imageFrame
- self.textNode.frame = textFrame
}
func animateIn() {
self.containerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25)
+ self.contentNode?.animateIn()
}
func animateOut(completion: @escaping () -> Void) {
diff --git a/submodules/InviteLinksUI/BUILD b/submodules/InviteLinksUI/BUILD
new file mode 100644
index 0000000000..0ecae93c03
--- /dev/null
+++ b/submodules/InviteLinksUI/BUILD
@@ -0,0 +1,56 @@
+load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")
+
+swift_library(
+ name = "InviteLinksUI",
+ module_name = "InviteLinksUI",
+ srcs = glob([
+ "Sources/**/*.swift",
+ ]),
+ deps = [
+ "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit",
+ "//submodules/AsyncDisplayKit:AsyncDisplayKit",
+ "//submodules/Display:Display",
+ "//submodules/Postbox:Postbox",
+ "//submodules/TelegramCore:TelegramCore",
+ "//submodules/SyncCore:SyncCore",
+ "//submodules/TelegramPresentationData:TelegramPresentationData",
+ "//submodules/AccountContext:AccountContext",
+ "//submodules/ItemListUI:ItemListUI",
+ "//submodules/AlertUI:AlertUI",
+ "//submodules/PresentationDataUtils:PresentationDataUtils",
+ "//submodules/UndoUI:UndoUI",
+ "//submodules/TelegramUIPreferences:TelegramUIPreferences",
+ "//submodules/TemporaryCachedPeerDataManager:TemporaryCachedPeerDataManager",
+ "//submodules/ItemListPeerItem:ItemListPeerItem",
+ "//submodules/ItemListPeerActionItem:ItemListPeerActionItem",
+ "//submodules/OverlayStatusController:OverlayStatusController",
+ "//submodules/TelegramStringFormatting:TelegramStringFormatting",
+ "//submodules/SearchUI:SearchUI",
+ "//submodules/MergeLists:MergeLists",
+ "//submodules/TextFormat:TextFormat",
+ "//submodules/LegacyUI:LegacyUI",
+ "//submodules/ShareController:ShareController",
+ "//submodules/ContactsPeerItem:ContactsPeerItem",
+ "//submodules/ActivityIndicator:ActivityIndicator",
+ "//submodules/TelegramPermissionsUI:TelegramPermissionsUI",
+ "//submodules/ProgressNavigationButtonNode:ProgressNavigationButtonNode",
+ "//submodules/TelegramNotices:TelegramNotices",
+ "//submodules/PhotoResources:PhotoResources",
+ "//submodules/MediaResources:MediaResources",
+ "//submodules/NotificationSoundSelectionUI:NotificationSoundSelectionUI",
+ "//submodules/ContextUI:ContextUI",
+ "//submodules/AppBundle:AppBundle",
+ "//submodules/Markdown:Markdown",
+ "//submodules/SolidRoundedButtonNode:SolidRoundedButtonNode",
+ "//submodules/ChatListSearchItemHeader:ChatListSearchItemHeader",
+ "//submodules/QrCode:QrCode",
+ "//submodules/AnimatedAvatarSetNode:AnimatedAvatarSetNode",
+ "//submodules/DatePickerNode:DatePickerNode",
+ "//submodules/RadialStatusNode:RadialStatusNode",
+ "//submodules/SectionHeaderItem:SectionHeaderItem",
+ "//submodules/DirectionalPanGesture:DirectionalPanGesture",
+ ],
+ visibility = [
+ "//visibility:public",
+ ],
+)
diff --git a/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift b/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift
new file mode 100644
index 0000000000..3e60003bd7
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift
@@ -0,0 +1,428 @@
+import Foundation
+import UIKit
+import AsyncDisplayKit
+import Display
+import SwiftSignalKit
+import Postbox
+import TelegramCore
+import SyncCore
+import TelegramPresentationData
+import TelegramUIPreferences
+import ItemListUI
+import PresentationDataUtils
+import OverlayStatusController
+import AccountContext
+import AlertUI
+import PresentationDataUtils
+import AppBundle
+import ContextUI
+import TelegramStringFormatting
+
+private final class InviteLinkEditControllerArguments {
+ let context: AccountContext
+ let updateState: ((InviteLinkEditControllerState) -> InviteLinkEditControllerState) -> Void
+ let dismissInput: () -> Void
+ let revoke: () -> Void
+
+ init(context: AccountContext, updateState: @escaping ((InviteLinkEditControllerState) -> InviteLinkEditControllerState) -> Void, dismissInput: @escaping () -> Void, revoke: @escaping () -> Void) {
+ self.context = context
+ self.updateState = updateState
+ self.dismissInput = dismissInput
+ self.revoke = revoke
+ }
+}
+
+private enum InviteLinksEditSection: Int32 {
+ case time
+ case usage
+ case revoke
+}
+
+private let invalidAmountCharacters = CharacterSet(charactersIn: "01234567890.,").inverted
+func isValidNumberOfUsers(_ number: String) -> Bool {
+ let number = normalizeArabicNumeralString(number, type: .western)
+ if number.rangeOfCharacter(from: invalidAmountCharacters) != nil || number == "0" {
+ return false
+ }
+ return true
+}
+
+private enum InviteLinksEditEntry: ItemListNodeEntry {
+ case timeHeader(PresentationTheme, String)
+ case timePicker(PresentationTheme, InviteLinkTimeLimit)
+ case timeExpiryDate(PresentationTheme, Int32?)
+ case timeCustomPicker(PresentationTheme, Int32?)
+ case timeInfo(PresentationTheme, String)
+
+ case usageHeader(PresentationTheme, String)
+ case usagePicker(PresentationTheme, InviteLinkUsageLimit)
+ case usageCustomPicker(PresentationTheme, Int32?, Bool)
+ case usageInfo(PresentationTheme, String)
+
+ case revoke(PresentationTheme, String)
+
+ var section: ItemListSectionId {
+ switch self {
+ case .timeHeader, .timePicker, .timeExpiryDate, .timeCustomPicker, .timeInfo:
+ return InviteLinksEditSection.time.rawValue
+ case .usageHeader, .usagePicker, .usageCustomPicker, .usageInfo:
+ return InviteLinksEditSection.usage.rawValue
+ case .revoke:
+ return InviteLinksEditSection.revoke.rawValue
+ }
+ }
+
+ var stableId: Int32 {
+ switch self {
+ case .timeHeader:
+ return 0
+ case .timePicker:
+ return 1
+ case .timeExpiryDate:
+ return 2
+ case .timeCustomPicker:
+ return 3
+ case .timeInfo:
+ return 4
+ case .usageHeader:
+ return 5
+ case .usagePicker:
+ return 6
+ case .usageCustomPicker:
+ return 7
+ case .usageInfo:
+ return 8
+ case .revoke:
+ return 9
+ }
+ }
+
+ static func ==(lhs: InviteLinksEditEntry, rhs: InviteLinksEditEntry) -> Bool {
+ switch lhs {
+ case let .timeHeader(lhsTheme, lhsText):
+ if case let .timeHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .timePicker(lhsTheme, lhsValue):
+ if case let .timePicker(rhsTheme, rhsValue) = rhs, lhsTheme === rhsTheme, lhsValue == rhsValue {
+ return true
+ } else {
+ return false
+ }
+ case let .timeExpiryDate(lhsTheme, lhsDate):
+ if case let .timeExpiryDate(rhsTheme, rhsDate) = rhs, lhsTheme === rhsTheme, lhsDate == rhsDate {
+ return true
+ } else {
+ return false
+ }
+ case let .timeCustomPicker(lhsTheme, lhsDate):
+ if case let .timeCustomPicker(rhsTheme, rhsDate) = rhs, lhsTheme === rhsTheme, lhsDate == rhsDate {
+ return true
+ } else {
+ return false
+ }
+ case let .timeInfo(lhsTheme, lhsText):
+ if case let .timeInfo(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .usageHeader(lhsTheme, lhsText):
+ if case let .usageHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .usagePicker(lhsTheme, lhsValue):
+ if case let .usagePicker(rhsTheme, rhsValue) = rhs, lhsTheme === rhsTheme, lhsValue == rhsValue {
+ return true
+ } else {
+ return false
+ }
+ case let .usageCustomPicker(lhsTheme, lhsValue, lhsFocused):
+ if case let .usageCustomPicker(rhsTheme, rhsValue, rhsFocused) = rhs, lhsTheme === rhsTheme, lhsValue == rhsValue, lhsFocused == rhsFocused {
+ return true
+ } else {
+ return false
+ }
+ case let .usageInfo(lhsTheme, lhsText):
+ if case let .usageInfo(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .revoke(lhsTheme, lhsText):
+ if case let .revoke(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ }
+ }
+
+ static func <(lhs: InviteLinksEditEntry, rhs: InviteLinksEditEntry) -> Bool {
+ return lhs.stableId < rhs.stableId
+ }
+
+ func item(presentationData: ItemListPresentationData, arguments: Any) -> ListViewItem {
+ let arguments = arguments as! InviteLinkEditControllerArguments
+ switch self {
+ case let .timeHeader(_, text):
+ return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section)
+ case let .timePicker(_, value):
+ return ItemListInviteLinkTimeLimitItem(theme: presentationData.theme, strings: presentationData.strings, value: value, enabled: true, sectionId: self.section, updated: { value in
+ arguments.updateState({ state in
+ var updatedState = state
+ if value != updatedState.time {
+ updatedState.pickingTimeLimit = false
+ }
+ updatedState.time = value
+ return updatedState
+ })
+ })
+ case let .timeExpiryDate(_, value):
+ let text: String
+ if let value = value {
+ text = stringForFullDate(timestamp: value, strings: presentationData.strings, dateTimeFormat: PresentationDateTimeFormat(timeFormat: .regular, dateFormat: .monthFirst, dateSeparator: ".", decimalSeparator: ".", groupingSeparator: "."))
+ } else {
+ text = presentationData.strings.InviteLink_Create_TimeLimitExpiryDateNever
+ }
+ return ItemListDisclosureItem(presentationData: presentationData, title: presentationData.strings.InviteLink_Create_TimeLimitExpiryDate, label: text, sectionId: self.section, style: .blocks, disclosureStyle: .none, action: {
+ arguments.dismissInput()
+ arguments.updateState { state in
+ var updatedState = state
+ updatedState.pickingTimeLimit = !state.pickingTimeLimit
+ return updatedState
+ }
+ })
+ case let .timeCustomPicker(_, date):
+ return ItemListDatePickerItem(presentationData: presentationData, date: date, sectionId: self.section, style: .blocks, updated: { date in
+ arguments.updateState({ state in
+ var updatedState = state
+ updatedState.time = .custom(date)
+ return updatedState
+ })
+ })
+ case let .timeInfo(_, text):
+ return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section)
+ case let .usageHeader(_, text):
+ return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section)
+ case let .usagePicker(_, value):
+ return ItemListInviteLinkUsageLimitItem(theme: presentationData.theme, strings: presentationData.strings, value: value, enabled: true, sectionId: self.section, updated: { value in
+ arguments.dismissInput()
+ arguments.updateState({ state in
+ var updatedState = state
+ if value != updatedState.usage {
+ updatedState.pickingTimeLimit = false
+ }
+ updatedState.usage = value
+ return updatedState
+ })
+ })
+ case let .usageCustomPicker(theme, value, focused):
+ let text = value.flatMap { String($0) } ?? (focused ? "" : presentationData.strings.InviteLink_Create_UsersLimitNumberOfUsersUnlimited)
+ return ItemListSingleLineInputItem(presentationData: presentationData, title: NSAttributedString(string: presentationData.strings.InviteLink_Create_UsersLimitNumberOfUsers, textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: "", type: .number, alignment: .right, tag: nil, sectionId: self.section, textUpdated: { updatedText in
+ guard !updatedText.isEmpty else {
+ return
+ }
+ arguments.updateState { state in
+ var updatedState = state
+ updatedState.usage = InviteLinkUsageLimit(value: Int32(updatedText))
+ return updatedState
+ }
+ }, shouldUpdateText: { text in
+ return isValidNumberOfUsers(text)
+ }, updatedFocus: { focus in
+ if focus {
+ arguments.updateState { state in
+ var updatedState = state
+ updatedState.pickingTimeLimit = false
+ updatedState.pickingUsageLimit = true
+ return updatedState
+ }
+ } else {
+ arguments.updateState { state in
+ var updatedState = state
+ updatedState.pickingUsageLimit = false
+ return updatedState
+ }
+ }
+ }, action: {
+
+ })
+ case let .usageInfo(_, text):
+ return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section)
+ case let .revoke(_, text):
+ return ItemListActionItem(presentationData: presentationData, title: text, kind: .destructive, alignment: .center, sectionId: self.section, style: .blocks, action: {
+ arguments.revoke()
+ }, tag: nil)
+ }
+ }
+}
+
+private func inviteLinkEditControllerEntries(invite: ExportedInvitation?, state: InviteLinkEditControllerState, presentationData: PresentationData) -> [InviteLinksEditEntry] {
+ var entries: [InviteLinksEditEntry] = []
+
+ entries.append(.timeHeader(presentationData.theme, presentationData.strings.InviteLink_Create_TimeLimit.uppercased()))
+
+ entries.append(.timePicker(presentationData.theme, state.time))
+
+ let currentTime = Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970)
+ var time: Int32?
+ if case let .custom(value) = state.time {
+ time = value
+ } else if let value = state.time.value {
+ time = currentTime + value
+ }
+ entries.append(.timeExpiryDate(presentationData.theme, time))
+ if state.pickingTimeLimit {
+ entries.append(.timeCustomPicker(presentationData.theme, time ?? currentTime))
+ }
+ entries.append(.timeInfo(presentationData.theme, presentationData.strings.InviteLink_Create_TimeLimitInfo))
+
+ entries.append(.usageHeader(presentationData.theme, presentationData.strings.InviteLink_Create_UsersLimit.uppercased()))
+ entries.append(.usagePicker(presentationData.theme, state.usage))
+ entries.append(.usageCustomPicker(presentationData.theme, state.usage.value, state.pickingUsageLimit))
+
+ entries.append(.usageInfo(presentationData.theme, presentationData.strings.InviteLink_Create_UsersLimitInfo))
+
+ if let _ = invite {
+ entries.append(.revoke(presentationData.theme, presentationData.strings.InviteLink_Create_Revoke))
+ }
+
+ return entries
+}
+
+private struct InviteLinkEditControllerState: Equatable {
+ var usage: InviteLinkUsageLimit
+ var time: InviteLinkTimeLimit
+ var pickingTimeLimit = false
+ var pickingUsageLimit = false
+}
+
+public func inviteLinkEditController(context: AccountContext, peerId: PeerId, invite: ExportedInvitation?, completion: (() -> Void)? = nil) -> ViewController {
+ var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)?
+ let actionsDisposable = DisposableSet()
+
+ let initialState: InviteLinkEditControllerState
+ if let invite = invite {
+ var usageLimit = invite.usageLimit
+ if let limit = usageLimit, let count = invite.count, count > 0 {
+ usageLimit = limit - count
+ }
+
+ let timeLimit: InviteLinkTimeLimit
+ let currentTime = Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970)
+ if let expireDate = invite.expireDate {
+ if currentTime >= expireDate {
+ timeLimit = .day
+ } else {
+ timeLimit = .custom(expireDate)
+ }
+ } else {
+ timeLimit = .unlimited
+ }
+
+ initialState = InviteLinkEditControllerState(usage: InviteLinkUsageLimit(value: usageLimit), time: timeLimit, pickingTimeLimit: false, pickingUsageLimit: false)
+ } else {
+ initialState = InviteLinkEditControllerState(usage: .medium, time: .week, pickingTimeLimit: false, pickingUsageLimit: false)
+ }
+
+ let statePromise = ValuePromise(initialState, ignoreRepeated: true)
+ let stateValue = Atomic(value: initialState)
+ let updateState: ((InviteLinkEditControllerState) -> InviteLinkEditControllerState) -> Void = { f in
+ statePromise.set(stateValue.modify { f($0) })
+ }
+
+ var dismissImpl: (() -> Void)?
+ var dismissInputImpl: (() -> Void)?
+
+ let arguments = InviteLinkEditControllerArguments(context: context, updateState: { f in
+ updateState(f)
+ }, dismissInput: {
+ dismissInputImpl?()
+ }, revoke: {
+ guard let invite = invite else {
+ return
+ }
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ let controller = ActionSheetController(presentationData: presentationData)
+ let dismissAction: () -> Void = { [weak controller] in
+ controller?.dismissAnimated()
+ }
+ controller.setItemGroups([
+ ActionSheetItemGroup(items: [
+ ActionSheetTextItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeAlert_Text),
+ ActionSheetButtonItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeLink, color: .destructive, action: {
+ dismissAction()
+ dismissImpl?()
+
+ let _ = (revokePeerExportedInvitation(account: context.account, peerId: peerId, link: invite.link) |> deliverOnMainQueue).start(completed: {
+ completion?()
+ })
+ })
+ ]),
+ ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
+ ])
+ presentControllerImpl?(controller, nil)
+ })
+
+ let signal = combineLatest(context.sharedContext.presentationData, statePromise.get())
+ |> deliverOnMainQueue
+ |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, Any)) in
+ let leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: {
+ dismissImpl?()
+ })
+
+ let rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: true, action: {
+ let expireDate: Int32?
+ if case let .custom(value) = state.time {
+ expireDate = value
+ } else if let value = state.time.value {
+ let currentTime = Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970)
+ expireDate = currentTime + value
+ } else {
+ expireDate = nil
+ }
+
+ let usageLimit = state.usage.value
+ if invite == nil {
+ let _ = (createPeerExportedInvitation(account: context.account, peerId: peerId, expireDate: expireDate, usageLimit: usageLimit)
+ |> deliverOnMainQueue).start(next: { result in
+ completion?()
+ dismissImpl?()
+ })
+ } else if let invite = invite {
+ let _ = (editPeerExportedInvitation(account: context.account, peerId: peerId, link: invite.link, expireDate: expireDate, usageLimit: usageLimit)
+ |> deliverOnMainQueue).start(next: { result in
+ completion?()
+ dismissImpl?()
+ })
+ }
+ })
+
+ let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(invite == nil ? presentationData.strings.InviteLink_Create_Title : presentationData.strings.InviteLink_Create_EditTitle), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true)
+ let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: inviteLinkEditControllerEntries(invite: invite, state: state, presentationData: presentationData), style: .blocks, emptyStateItem: nil, crossfadeState: false, animateChanges: false)
+
+ return (controllerState, (listState, arguments))
+ }
+ |> afterDisposed {
+ actionsDisposable.dispose()
+ }
+
+ let controller = ItemListController(context: context, state: signal)
+ presentControllerImpl = { [weak controller] c, p in
+ if let controller = controller {
+ controller.present(c, in: .window(.root), with: p)
+ }
+ }
+ dismissInputImpl = { [weak controller] in
+ controller?.view.endEditing(true)
+ }
+ dismissImpl = { [weak controller] in
+ controller?.dismiss()
+ }
+ return controller
+}
diff --git a/submodules/InviteLinksUI/Sources/InviteLinkHeaderItem.swift b/submodules/InviteLinksUI/Sources/InviteLinkHeaderItem.swift
new file mode 100644
index 0000000000..64dd3c37b1
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/InviteLinkHeaderItem.swift
@@ -0,0 +1,124 @@
+import Foundation
+import UIKit
+import Display
+import AsyncDisplayKit
+import SwiftSignalKit
+import TelegramPresentationData
+import ItemListUI
+import PresentationDataUtils
+import AnimatedStickerNode
+import AppBundle
+
+class InviteLinkHeaderItem: ListViewItem, ItemListItem {
+ let theme: PresentationTheme
+ let text: String
+ let sectionId: ItemListSectionId
+
+ init(theme: PresentationTheme, text: String, sectionId: ItemListSectionId) {
+ self.theme = theme
+ self.text = text
+ self.sectionId = sectionId
+ }
+
+ func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) {
+ async {
+ let node = InviteLinkHeaderItemNode()
+ let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+
+ node.contentSize = layout.contentSize
+ node.insets = layout.insets
+
+ Queue.mainQueue().async {
+ completion(node, {
+ return (nil, { _ in apply() })
+ })
+ }
+ }
+ }
+
+ func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
+ Queue.mainQueue().async {
+ guard let nodeValue = node() as? InviteLinkHeaderItemNode else {
+ assertionFailure()
+ return
+ }
+
+ let makeLayout = nodeValue.asyncLayout()
+
+ async {
+ let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+ Queue.mainQueue().async {
+ completion(layout, { _ in
+ apply()
+ })
+ }
+ }
+ }
+ }
+}
+
+private let titleFont = Font.regular(13.0)
+
+class InviteLinkHeaderItemNode: ListViewItemNode {
+ private let titleNode: TextNode
+ private var animationNode: AnimatedStickerNode
+
+ private var item: InviteLinkHeaderItem?
+
+ init() {
+ self.titleNode = TextNode()
+ self.titleNode.isUserInteractionEnabled = false
+ self.titleNode.contentMode = .left
+ self.titleNode.contentsScale = UIScreen.main.scale
+
+ self.animationNode = AnimatedStickerNode()
+ if let path = getAppBundle().path(forResource: "Invite", ofType: "tgs") {
+ self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 192, height: 192, playbackMode: .loop, mode: .direct(cachePathPrefix: nil))
+ self.animationNode.visibility = true
+ }
+
+ super.init(layerBacked: false, dynamicBounce: false)
+
+ self.addSubnode(self.titleNode)
+ self.addSubnode(self.animationNode)
+ }
+
+ func asyncLayout() -> (_ item: InviteLinkHeaderItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) {
+ let makeTitleLayout = TextNode.asyncLayout(self.titleNode)
+
+ return { item, params, neighbors in
+ let leftInset: CGFloat = 32.0 + params.leftInset
+ let topInset: CGFloat = 92.0
+
+ let attributedText = NSAttributedString(string: item.text, font: titleFont, textColor: item.theme.list.freeTextColor)
+ let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: attributedText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - params.rightInset - leftInset * 2.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets()))
+
+ let contentSize = CGSize(width: params.width, height: topInset + titleLayout.size.height)
+ let insets = itemListNeighborsGroupedInsets(neighbors)
+
+ let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets)
+
+ return (layout, { [weak self] in
+ if let strongSelf = self {
+ strongSelf.item = item
+ strongSelf.accessibilityLabel = attributedText.string
+
+ let iconSize = CGSize(width: 96.0, height: 96.0)
+ strongSelf.animationNode.frame = CGRect(origin: CGPoint(x: floor((layout.size.width - iconSize.width) / 2.0), y: -10.0), size: iconSize)
+ strongSelf.animationNode.updateLayout(size: iconSize)
+
+ let _ = titleApply()
+ strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: floor((layout.size.width - titleLayout.size.width) / 2.0), y: topInset + 8.0), size: titleLayout.size)
+ }
+ })
+ }
+ }
+
+ override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4)
+ }
+
+ override func animateRemoved(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false)
+ }
+}
diff --git a/submodules/InviteLinksUI/Sources/InviteLinkInviteController.swift b/submodules/InviteLinksUI/Sources/InviteLinkInviteController.swift
new file mode 100644
index 0000000000..24624caeec
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/InviteLinkInviteController.swift
@@ -0,0 +1,667 @@
+import Foundation
+import UIKit
+import SwiftSignalKit
+import TelegramPresentationData
+import AppBundle
+import AsyncDisplayKit
+import Postbox
+import SyncCore
+import TelegramCore
+import Display
+import AccountContext
+import SolidRoundedButtonNode
+import ItemListUI
+import ItemListPeerItem
+import SectionHeaderItem
+import TelegramStringFormatting
+import MergeLists
+import ContextUI
+import ShareController
+import OverlayStatusController
+import PresentationDataUtils
+import DirectionalPanGesture
+
+class InviteLinkInviteInteraction {
+ let context: AccountContext
+ let mainLinkContextAction: (ExportedInvitation?, ASDisplayNode, ContextGesture?) -> Void
+ let copyLink: (ExportedInvitation) -> Void
+ let shareLink: (ExportedInvitation) -> Void
+ let manageLinks: () -> Void
+
+ init(context: AccountContext, mainLinkContextAction: @escaping (ExportedInvitation?, ASDisplayNode, ContextGesture?) -> Void, copyLink: @escaping (ExportedInvitation) -> Void, shareLink: @escaping (ExportedInvitation) -> Void, manageLinks: @escaping () -> Void) {
+ self.context = context
+ self.mainLinkContextAction = mainLinkContextAction
+ self.copyLink = copyLink
+ self.shareLink = shareLink
+ self.manageLinks = manageLinks
+ }
+}
+
+private struct InviteLinkInviteTransaction {
+ let deletions: [ListViewDeleteItem]
+ let insertions: [ListViewInsertItem]
+ let updates: [ListViewUpdateItem]
+ let isLoading: Bool
+}
+
+private enum InviteLinkInviteEntryId: Hashable {
+ case mainLink
+ case links(Int32)
+}
+
+private enum InviteLinkInviteEntry: Comparable, Identifiable {
+ case mainLink(PresentationTheme, ExportedInvitation)
+ case links(Int32, PresentationTheme, [ExportedInvitation])
+
+ var stableId: InviteLinkInviteEntryId {
+ switch self {
+ case .mainLink:
+ return .mainLink
+ case let .links(index, _, _):
+ return .links(index)
+ }
+ }
+
+ static func ==(lhs: InviteLinkInviteEntry, rhs: InviteLinkInviteEntry) -> Bool {
+ switch lhs {
+ case let .mainLink(lhsTheme, lhsInvitation):
+ if case let .mainLink(rhsTheme, rhsInvitation) = rhs, lhsTheme === rhsTheme, lhsInvitation == rhsInvitation {
+ return true
+ } else {
+ return false
+ }
+ case let .links(lhsIndex, lhsTheme, lhsInvitations):
+ if case let .links(rhsIndex, rhsTheme, rhsInvitations) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsInvitations == rhsInvitations {
+ return true
+ } else {
+ return false
+ }
+ }
+ }
+
+ static func <(lhs: InviteLinkInviteEntry, rhs: InviteLinkInviteEntry) -> Bool {
+ switch lhs {
+ case .mainLink:
+ switch rhs {
+ case .mainLink:
+ return false
+ case .links:
+ return true
+ }
+ case let .links(lhsIndex, _, _):
+ switch rhs {
+ case .mainLink:
+ return false
+ case let .links(rhsIndex, _, _):
+ return lhsIndex < rhsIndex
+ }
+ }
+ }
+
+ func item(account: Account, presentationData: PresentationData, interaction: InviteLinkInviteInteraction) -> ListViewItem {
+ switch self {
+ case let .mainLink(_, invite):
+ return ItemListPermanentInviteLinkItem(context: interaction.context, presentationData: ItemListPresentationData(presentationData), invite: invite, peers: [], buttonColor: nil, sectionId: 0, style: .plain, shareAction: {
+ interaction.shareLink(invite)
+ }, contextAction: { node in
+ interaction.mainLinkContextAction(invite, node, nil)
+ }, viewAction: {
+ })
+ case let .links(_, _, invites):
+ return ItemListInviteLinkGridItem(presentationData: ItemListPresentationData(presentationData), invites: invites, sectionId: 0, style: .plain, tapAction: { invite in
+ interaction.copyLink(invite)
+ }, contextAction: { invite, _ in
+ interaction.shareLink(invite)
+ })
+ }
+ }
+}
+
+private func preparedTransition(from fromEntries: [InviteLinkInviteEntry], to toEntries: [InviteLinkInviteEntry], isLoading: Bool, account: Account, presentationData: PresentationData, interaction: InviteLinkInviteInteraction) -> InviteLinkInviteTransaction {
+ 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(account: account, presentationData: presentationData, interaction: interaction), directionHint: nil) }
+ let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(account: account, presentationData: presentationData, interaction: interaction), directionHint: nil) }
+
+ return InviteLinkInviteTransaction(deletions: deletions, insertions: insertions, updates: updates, isLoading: isLoading)
+}
+
+public final class InviteLinkInviteController: ViewController {
+ private var controllerNode: Node {
+ return self.displayNode as! Node
+ }
+
+ private var animatedIn = false
+
+ private let context: AccountContext
+ private let peerId: PeerId
+
+ private var presentationDataDisposable: Disposable?
+
+ public init(context: AccountContext, peerId: PeerId) {
+ fatalError()
+ self.context = context
+ self.peerId = peerId
+
+ super.init(navigationBarPresentationData: nil)
+
+ self.navigationPresentation = .flatModal
+ self.statusBar.statusBarStyle = .Ignore
+
+ self.blocksBackgroundWhenInOverlay = true
+
+ self.presentationDataDisposable = (context.sharedContext.presentationData
+ |> deliverOnMainQueue).start(next: { [weak self] presentationData in
+ if let strongSelf = self {
+ strongSelf.controllerNode.updatePresentationData(presentationData)
+ }
+ })
+
+ self.statusBar.statusBarStyle = .Ignore
+ }
+
+ required init(coder aDecoder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ deinit {
+ self.presentationDataDisposable?.dispose()
+ }
+
+ override public func loadDisplayNode() {
+ self.displayNode = Node(context: self.context, peerId: self.peerId, controller: self)
+ }
+
+ override public func loadView() {
+ super.loadView()
+ }
+
+ private var didAppearOnce: Bool = false
+ private var isDismissed: Bool = false
+ public override func viewDidAppear(_ animated: Bool) {
+ super.viewDidAppear(animated)
+
+ if !self.didAppearOnce {
+ self.didAppearOnce = true
+
+ self.controllerNode.animateIn()
+ }
+ }
+
+ override public func dismiss(completion: (() -> Void)? = nil) {
+ if !self.isDismissed {
+ self.isDismissed = true
+ self.didAppearOnce = false
+
+ self.controllerNode.animateOut(completion: { [weak self] in
+ completion?()
+ self?.dismiss(animated: false)
+ })
+ }
+ }
+
+ override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
+ super.containerLayoutUpdated(layout, transition: transition)
+
+ self.controllerNode.containerLayoutUpdated(layout, transition: transition)
+ }
+
+ class Node: ViewControllerTracingNode, UIGestureRecognizerDelegate {
+ private weak var controller: InviteLinkInviteController?
+
+ private let context: AccountContext
+ private let peerId: PeerId
+
+ private var interaction: InviteLinkInviteInteraction?
+
+ private var presentationData: PresentationData
+ private let presentationDataPromise: Promise
+
+ private var disposable: Disposable?
+
+ private let dimNode: ASDisplayNode
+ private let contentNode: ASDisplayNode
+ private let headerNode: ASDisplayNode
+ private let headerBackgroundNode: ASDisplayNode
+ private let titleNode: ImmediateTextNode
+ private let doneButton: HighlightableButtonNode
+ private let historyBackgroundNode: ASDisplayNode
+ private let historyBackgroundContentNode: ASDisplayNode
+ private var floatingHeaderOffset: CGFloat?
+ private let listNode: ListView
+
+ private var enqueuedTransitions: [InviteLinkInviteTransaction] = []
+
+ private var validLayout: ContainerViewLayout?
+
+ private var presentationDataDisposable: Disposable?
+ private var revokeDisposable = MetaDisposable()
+
+ init(context: AccountContext, peerId: PeerId, controller: InviteLinkInviteController) {
+ self.context = context
+ self.peerId = peerId
+ self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ self.presentationDataPromise = Promise(self.presentationData)
+ self.controller = controller
+
+ self.dimNode = ASDisplayNode()
+ self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5)
+
+ self.contentNode = ASDisplayNode()
+
+ self.headerNode = ASDisplayNode()
+ self.headerNode.clipsToBounds = true
+
+ self.headerBackgroundNode = ASDisplayNode()
+ self.headerBackgroundNode.backgroundColor = self.presentationData.theme.list.plainBackgroundColor
+ self.headerBackgroundNode.cornerRadius = 16.0
+
+ self.titleNode = ImmediateTextNode()
+ self.titleNode.maximumNumberOfLines = 1
+ self.titleNode.textAlignment = .center
+ self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.InviteLink_InviteLink, font: Font.bold(17.0), textColor: self.presentationData.theme.actionSheet.primaryTextColor)
+
+ self.doneButton = HighlightableButtonNode()
+ self.doneButton.setTitle(self.presentationData.strings.Common_Done, with: Font.bold(17.0), with: self.presentationData.theme.actionSheet.controlAccentColor, for: .normal)
+
+ self.historyBackgroundNode = ASDisplayNode()
+ self.historyBackgroundNode.isLayerBacked = true
+
+ self.historyBackgroundContentNode = ASDisplayNode()
+ self.historyBackgroundContentNode.isLayerBacked = true
+ self.historyBackgroundContentNode.backgroundColor = self.presentationData.theme.list.plainBackgroundColor
+
+ self.historyBackgroundNode.addSubnode(self.historyBackgroundContentNode)
+
+ self.listNode = ListView()
+ self.listNode.verticalScrollIndicatorColor = UIColor(white: 0.0, alpha: 0.3)
+ self.listNode.verticalScrollIndicatorFollowsOverscroll = true
+
+ super.init()
+
+ self.backgroundColor = nil
+ self.isOpaque = false
+
+ self.interaction = InviteLinkInviteInteraction(context: context, mainLinkContextAction: { [weak self] invite, node, gesture in
+ guard let node = node as? ContextExtractedContentContainingNode else {
+ return
+ }
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ var items: [ContextMenuItem] = []
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextCopy, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ if let invite = invite {
+ UIPasteboard.general.string = invite.link
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ self?.controller?.present(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Username_LinkCopied, false)), in: .window(.root))
+ }
+ })))
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextGetQRCode, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Wallet/QrIcon"), color: theme.contextMenu.primaryColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ if let invite = invite {
+ let controller = InviteLinkQRCodeController(context: context, invite: invite)
+ self?.controller?.present(controller, in: .window(.root))
+ }
+ })))
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextRevoke, textColor: .destructive, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ let controller = ActionSheetController(presentationData: presentationData)
+ let dismissAction: () -> Void = { [weak controller] in
+ controller?.dismissAnimated()
+ }
+ controller.setItemGroups([
+ ActionSheetItemGroup(items: [
+ ActionSheetTextItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeAlert_Text),
+ ActionSheetButtonItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeLink, color: .destructive, action: {
+ dismissAction()
+
+ self?.revokeDisposable.set((ensuredExistingPeerExportedInvitation(account: context.account, peerId: peerId, revokeExisted: true) |> deliverOnMainQueue).start(completed: {
+
+ }))
+ })
+ ]),
+ ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
+ ])
+ self?.controller?.present(controller, in: .window(.root))
+ })))
+
+ let contextController = ContextController(account: context.account, presentationData: presentationData, source: .extracted(InviteLinkContextExtractedContentSource(controller: controller, sourceNode: node)), items: .single(items), reactionItems: [], gesture: gesture)
+ self?.controller?.presentInGlobalOverlay(contextController)
+ }, copyLink: { [weak self] invite in
+ let shareController = ShareController(context: context, subject: .url(invite.link))
+ self?.controller?.present(shareController, in: .window(.root))
+ }, shareLink: { [weak self] invite in
+ let shareController = ShareController(context: context, subject: .url(invite.link))
+ self?.controller?.present(shareController, in: .window(.root))
+ }, manageLinks: { [weak self] in
+ let controller = inviteLinkListController(context: context, peerId: peerId)
+ self?.controller?.push(controller)
+ self?.controller?.dismiss()
+ })
+
+ let previousEntries = Atomic<[InviteLinkInviteEntry]?>(value: nil)
+
+ let peerView = context.account.postbox.peerView(id: peerId)
+ self.disposable = (combineLatest(self.presentationDataPromise.get(), peerView)
+ |> deliverOnMainQueue).start(next: { [weak self] presentationData, view in
+ if let strongSelf = self {
+ var entries: [InviteLinkInviteEntry] = []
+
+ if let cachedData = view.cachedData as? CachedGroupData, let invite = cachedData.exportedInvitation {
+ entries.append(.mainLink(presentationData.theme, invite))
+ } else if let cachedData = view.cachedData as? CachedChannelData, let invite = cachedData.exportedInvitation {
+ entries.append(.mainLink(presentationData.theme, invite))
+ }
+
+
+ let previousEntries = previousEntries.swap(entries)
+
+ let transition = preparedTransition(from: previousEntries ?? [], to: entries, isLoading: false, account: context.account, presentationData: presentationData, interaction: strongSelf.interaction!)
+ strongSelf.enqueueTransition(transition)
+ }
+ })
+
+ self.listNode.preloadPages = true
+ self.listNode.stackFromBottom = true
+ self.listNode.updateFloatingHeaderOffset = { [weak self] offset, transition in
+ if let strongSelf = self {
+ strongSelf.updateFloatingHeaderOffset(offset: offset, transition: transition)
+ }
+ }
+ self.listNode.visibleBottomContentOffsetChanged = { [weak self] offset in
+ if case let .known(value) = offset, value < 40.0 {
+
+ }
+ }
+
+ self.addSubnode(self.dimNode)
+ self.addSubnode(self.contentNode)
+ self.contentNode.addSubnode(self.historyBackgroundNode)
+ self.contentNode.addSubnode(self.listNode)
+ self.contentNode.addSubnode(self.headerNode)
+
+ self.headerNode.addSubnode(self.headerBackgroundNode)
+// self.headerNode.addSubnode(self.titleNode)
+ self.headerNode.addSubnode(self.doneButton)
+
+ self.doneButton.addTarget(self, action: #selector(self.doneButtonPressed), forControlEvents: .touchUpInside)
+
+ self.presentationDataDisposable = context.sharedContext.presentationData.start(next: { [weak self] presentationData in
+ if let strongSelf = self {
+ if strongSelf.presentationData.theme !== presentationData.theme || strongSelf.presentationData.strings !== presentationData.strings {
+ strongSelf.updatePresentationData(presentationData)
+ }
+ }
+ })
+ }
+
+ deinit {
+ self.disposable?.dispose()
+ self.presentationDataDisposable?.dispose()
+ self.revokeDisposable.dispose()
+ }
+
+ override func didLoad() {
+ super.didLoad()
+
+ self.view.disablesInteractiveTransitionGestureRecognizer = true
+ self.view.disablesInteractiveModalDismiss = true
+
+ self.dimNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dimTapGesture(_:))))
+
+ let panRecognizer = DirectionalPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:)))
+ panRecognizer.delegate = self
+ panRecognizer.delaysTouchesBegan = false
+ panRecognizer.cancelsTouchesInView = true
+ self.view.addGestureRecognizer(panRecognizer)
+ }
+
+ @objc private func doneButtonPressed() {
+ self.controller?.dismiss()
+ }
+
+ func updatePresentationData(_ presentationData: PresentationData) {
+ self.presentationData = presentationData
+ self.presentationDataPromise.set(.single(presentationData))
+
+ self.historyBackgroundContentNode.backgroundColor = self.presentationData.theme.list.plainBackgroundColor
+ self.headerBackgroundNode.backgroundColor = self.presentationData.theme.list.plainBackgroundColor
+ self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.InviteLink_InviteLink, font: Font.bold(17.0), textColor: self.presentationData.theme.actionSheet.primaryTextColor)
+ self.doneButton.setTitle(self.presentationData.strings.Common_Done, with: Font.bold(17.0), with: self.presentationData.theme.actionSheet.controlAccentColor, for: .normal)
+ }
+
+ private func enqueueTransition(_ transition: InviteLinkInviteTransaction) {
+ self.enqueuedTransitions.append(transition)
+
+ if let _ = self.validLayout {
+ while !self.enqueuedTransitions.isEmpty {
+ self.dequeueTransition()
+ }
+ }
+ }
+
+ private func dequeueTransition() {
+ guard let _ = self.validLayout, let transition = self.enqueuedTransitions.first else {
+ return
+ }
+ self.enqueuedTransitions.remove(at: 0)
+
+ self.listNode.transaction(deleteIndices: transition.deletions, insertIndicesAndItems: transition.insertions, updateIndicesAndItems: transition.updates, options: ListViewDeleteAndInsertOptions(), updateSizeAndInsets: nil, updateOpaqueState: nil, completion: { _ in
+ })
+ }
+
+ func animateIn() {
+ guard let layout = self.validLayout else {
+ return
+ }
+ let transition = ContainedViewLayoutTransition.animated(duration: 0.4, curve: .spring)
+
+ let initialBounds = self.contentNode.bounds
+ self.contentNode.bounds = initialBounds.offsetBy(dx: 0.0, dy: -layout.size.height)
+ transition.animateView({
+ self.contentNode.view.bounds = initialBounds
+ })
+ self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3)
+ }
+
+ func animateOut(completion: (() -> Void)?) {
+ guard let layout = self.validLayout else {
+ return
+ }
+ var offsetCompleted = false
+ let internalCompletion: () -> Void = {
+ if offsetCompleted {
+ completion?()
+ }
+ }
+
+ self.contentNode.layer.animateBoundsOriginYAdditive(from: self.contentNode.bounds.origin.y, to: -layout.size.height, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in
+ offsetCompleted = true
+ internalCompletion()
+ })
+ self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false)
+ }
+
+ func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
+ self.validLayout = layout
+
+ transition.updateFrame(node: self.dimNode, frame: CGRect(origin: CGPoint(), size: layout.size))
+ transition.updateFrame(node: self.contentNode, frame: CGRect(origin: CGPoint(), size: layout.size))
+
+ var insets = UIEdgeInsets()
+ insets.left = layout.safeInsets.left
+ insets.right = layout.safeInsets.right
+ insets.bottom = layout.intrinsicInsets.bottom
+
+ let headerHeight: CGFloat = 54.0
+ let visibleItemsHeight: CGFloat = 147.0 + floor(52.0 * 3.5)
+
+ let layoutTopInset: CGFloat = max(layout.statusBarHeight ?? 0.0, layout.safeInsets.top)
+
+ let listTopInset = layoutTopInset + headerHeight
+ let listNodeSize = CGSize(width: layout.size.width, height: layout.size.height - listTopInset)
+
+ insets.top = max(0.0, listNodeSize.height - visibleItemsHeight)
+
+ let (duration, curve) = listViewAnimationDurationAndCurve(transition: transition)
+ let updateSizeAndInsets = ListViewUpdateSizeAndInsets(size: listNodeSize, 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.listNode, frame: CGRect(origin: CGPoint(x: 0.0, y: listTopInset), size: listNodeSize))
+
+ transition.updateFrame(node: self.headerBackgroundNode, frame: CGRect(x: 0.0, y: 0.0, width: layout.size.width, height: 68.0))
+
+ let titleSize = self.titleNode.updateLayout(CGSize(width: layout.size.width, height: headerHeight))
+ let titleFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - titleSize.width) / 2.0), y: 18.0), size: titleSize)
+ transition.updateFrame(node: self.titleNode, frame: titleFrame)
+
+ let doneSize = self.doneButton.measure(CGSize(width: layout.size.width, height: headerHeight))
+ let doneFrame = CGRect(origin: CGPoint(x: layout.size.width - doneSize.width - 16.0, y: 18.0), size: doneSize)
+ transition.updateFrame(node: self.doneButton, frame: doneFrame)
+ }
+
+ override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
+ let result = super.hitTest(point, with: event)
+
+ if result === self.headerNode.view {
+ return self.view
+ }
+
+ if result === self.headerNode.view {
+ return self.view
+ }
+
+ if !self.bounds.contains(point) {
+ return nil
+ }
+ if point.y < self.headerNode.frame.minY {
+ return self.dimNode.view
+ }
+ return result
+ }
+
+ @objc func dimTapGesture(_ recognizer: UITapGestureRecognizer) {
+ if case .ended = recognizer.state {
+ self.controller?.dismiss()
+ }
+ }
+
+ private var panGestureArguments: CGFloat?
+
+ @objc func panGesture(_ recognizer: UIPanGestureRecognizer) {
+ let contentOffset = self.listNode.visibleContentOffset()
+ switch recognizer.state {
+ case .began:
+ self.panGestureArguments = 0.0
+ case .changed:
+ var translation = recognizer.translation(in: self.contentNode.view).y
+ if let currentPanOffset = self.panGestureArguments {
+
+
+ if case let .known(value) = contentOffset, value <= 0.5 {
+ } else {
+ translation = currentPanOffset
+ }
+
+ self.panGestureArguments = translation
+ }
+
+ var bounds = self.contentNode.bounds
+ bounds.origin.y = -translation
+ bounds.origin.y = min(0.0, bounds.origin.y)
+ self.contentNode.bounds = bounds
+ case .ended:
+ let translation = recognizer.translation(in: self.contentNode.view)
+ var velocity = recognizer.velocity(in: self.contentNode.view)
+
+ if case let .known(value) = contentOffset, value > 0.0 {
+ velocity = CGPoint()
+ } else if case .unknown = contentOffset {
+ velocity = CGPoint()
+ }
+
+ var bounds = self.contentNode.bounds
+ bounds.origin.y = -translation.y
+ bounds.origin.y = min(0.0, bounds.origin.y)
+
+ self.panGestureArguments = nil
+ if bounds.minY < -60 || (bounds.minY < 0.0 && velocity.y > 300.0) {
+ self.controller?.dismiss()
+ } else {
+ var bounds = self.contentNode.bounds
+ let previousBounds = bounds
+ bounds.origin.y = 0.0
+ self.contentNode.bounds = bounds
+ self.contentNode.layer.animateBounds(from: previousBounds, to: self.contentNode.bounds, duration: 0.3, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue)
+ }
+ case .cancelled:
+ self.panGestureArguments = nil
+
+ let previousBounds = self.contentNode.bounds
+ var bounds = self.contentNode.bounds
+ bounds.origin.y = 0.0
+ self.contentNode.bounds = bounds
+ self.contentNode.layer.animateBounds(from: previousBounds, to: self.contentNode.bounds, duration: 0.3, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue)
+ default:
+ break
+ }
+ }
+
+ private func updateFloatingHeaderOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) {
+ guard let validLayout = self.validLayout else {
+ return
+ }
+
+ self.floatingHeaderOffset = offset
+
+ let layoutTopInset: CGFloat = max(validLayout.statusBarHeight ?? 0.0, validLayout.safeInsets.top)
+
+ let controlsHeight: CGFloat = 44.0
+
+ let listTopInset = layoutTopInset + controlsHeight
+
+ let rawControlsOffset = offset + listTopInset - controlsHeight
+ let controlsOffset = max(layoutTopInset, rawControlsOffset)
+ let isOverscrolling = rawControlsOffset <= layoutTopInset
+ let controlsFrame = CGRect(origin: CGPoint(x: 0.0, y: controlsOffset), size: CGSize(width: validLayout.size.width, height: controlsHeight))
+
+ let previousFrame = self.headerNode.frame
+
+ if !controlsFrame.equalTo(previousFrame) {
+ self.headerNode.frame = controlsFrame
+
+ let positionDelta = CGPoint(x: controlsFrame.minX - previousFrame.minX, y: controlsFrame.minY - previousFrame.minY)
+
+ transition.animateOffsetAdditive(node: self.headerNode, offset: positionDelta.y)
+ }
+
+// transition.updateAlpha(node: self.headerNode.separatorNode, alpha: isOverscrolling ? 1.0 : 0.0)
+
+ let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: controlsFrame.maxY), size: CGSize(width: validLayout.size.width, height: validLayout.size.height))
+
+ let previousBackgroundFrame = self.historyBackgroundNode.frame
+
+ if !backgroundFrame.equalTo(previousBackgroundFrame) {
+ self.historyBackgroundNode.frame = backgroundFrame
+ self.historyBackgroundContentNode.frame = CGRect(origin: CGPoint(), size: backgroundFrame.size)
+
+ let positionDelta = CGPoint(x: backgroundFrame.minX - previousBackgroundFrame.minX, y: backgroundFrame.minY - previousBackgroundFrame.minY)
+
+ transition.animateOffsetAdditive(node: self.historyBackgroundNode, offset: positionDelta.y)
+ }
+ }
+ }
+}
diff --git a/submodules/InviteLinksUI/Sources/InviteLinkInviteHeaderItem.swift b/submodules/InviteLinksUI/Sources/InviteLinkInviteHeaderItem.swift
new file mode 100644
index 0000000000..2030a9a011
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/InviteLinkInviteHeaderItem.swift
@@ -0,0 +1,124 @@
+import Foundation
+import UIKit
+import Display
+import AsyncDisplayKit
+import SwiftSignalKit
+import TelegramPresentationData
+import ItemListUI
+import PresentationDataUtils
+import AnimatedStickerNode
+import AppBundle
+
+class InviteLinkInviteHeaderItem: ListViewItem, ItemListItem {
+ var sectionId: ItemListSectionId = 0
+
+ let theme: PresentationTheme
+ let text: String
+
+ init(theme: PresentationTheme, text: String) {
+ self.theme = theme
+ self.text = text
+ }
+
+ func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) {
+ async {
+ let node = InviteLinkInviteHeaderItemNode()
+ let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+
+ node.contentSize = layout.contentSize
+ node.insets = layout.insets
+
+ Queue.mainQueue().async {
+ completion(node, {
+ return (nil, { _ in apply() })
+ })
+ }
+ }
+ }
+
+ func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
+ Queue.mainQueue().async {
+ guard let nodeValue = node() as? InviteLinkInviteHeaderItemNode else {
+ assertionFailure()
+ return
+ }
+
+ let makeLayout = nodeValue.asyncLayout()
+
+ async {
+ let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+ Queue.mainQueue().async {
+ completion(layout, { _ in
+ apply()
+ })
+ }
+ }
+ }
+ }
+}
+
+private let titleFont = Font.regular(13.0)
+
+class InviteLinkInviteHeaderItemNode: ListViewItemNode {
+ private let titleNode: TextNode
+ private var animationNode: AnimatedStickerNode
+
+ private var item: InviteLinkInviteHeaderItem?
+
+ init() {
+ self.titleNode = TextNode()
+ self.titleNode.isUserInteractionEnabled = false
+ self.titleNode.contentMode = .left
+ self.titleNode.contentsScale = UIScreen.main.scale
+
+ self.animationNode = AnimatedStickerNode()
+ if let path = getAppBundle().path(forResource: "Invite", ofType: "tgs") {
+ self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 192, height: 192, playbackMode: .loop, mode: .direct(cachePathPrefix: nil))
+ self.animationNode.visibility = true
+ }
+
+ super.init(layerBacked: false, dynamicBounce: false)
+
+ self.addSubnode(self.titleNode)
+ self.addSubnode(self.animationNode)
+ }
+
+ func asyncLayout() -> (_ item: InviteLinkInviteHeaderItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) {
+ let makeTitleLayout = TextNode.asyncLayout(self.titleNode)
+
+ return { item, params, neighbors in
+ let leftInset: CGFloat = 32.0 + params.leftInset
+ let topInset: CGFloat = 92.0
+
+ let attributedText = NSAttributedString(string: item.text, font: titleFont, textColor: item.theme.list.freeTextColor)
+ let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: attributedText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - params.rightInset - leftInset * 2.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets()))
+
+ let contentSize = CGSize(width: params.width, height: topInset + titleLayout.size.height)
+ let insets = itemListNeighborsGroupedInsets(neighbors)
+
+ let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets)
+
+ return (layout, { [weak self] in
+ if let strongSelf = self {
+ strongSelf.item = item
+ strongSelf.accessibilityLabel = attributedText.string
+
+ let iconSize = CGSize(width: 96.0, height: 96.0)
+ strongSelf.animationNode.frame = CGRect(origin: CGPoint(x: floor((layout.size.width - iconSize.width) / 2.0), y: -10.0), size: iconSize)
+ strongSelf.animationNode.updateLayout(size: iconSize)
+
+ let _ = titleApply()
+ strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: floor((layout.size.width - titleLayout.size.width) / 2.0), y: topInset + 8.0), size: titleLayout.size)
+ }
+ })
+ }
+ }
+
+ override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4)
+ }
+
+ override func animateRemoved(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false)
+ }
+}
diff --git a/submodules/InviteLinksUI/Sources/InviteLinkListController.swift b/submodules/InviteLinksUI/Sources/InviteLinkListController.swift
new file mode 100644
index 0000000000..cfb1615392
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/InviteLinkListController.swift
@@ -0,0 +1,619 @@
+import Foundation
+import UIKit
+import AsyncDisplayKit
+import Display
+import SwiftSignalKit
+import Postbox
+import TelegramCore
+import SyncCore
+import TelegramPresentationData
+import TelegramUIPreferences
+import ItemListUI
+import PresentationDataUtils
+import OverlayStatusController
+import AccountContext
+import AlertUI
+import PresentationDataUtils
+import AppBundle
+import ContextUI
+import TelegramStringFormatting
+import ItemListPeerActionItem
+import ShareController
+
+private final class InviteLinkListControllerArguments {
+ let context: AccountContext
+ let shareMainLink: (ExportedInvitation?) -> Void
+ let openMainLink: (ExportedInvitation?) -> Void
+ let mainLinkContextAction: (ExportedInvitation?, ASDisplayNode, ContextGesture?) -> Void
+ let createLink: () -> Void
+ let openLink: (ExportedInvitation) -> Void
+ let linkContextAction: (ExportedInvitation?, ASDisplayNode, ContextGesture?) -> Void
+ let deleteAllRevokedLinks: () -> Void
+
+ init(context: AccountContext, shareMainLink: @escaping (ExportedInvitation?) -> Void, openMainLink: @escaping (ExportedInvitation?) -> Void, mainLinkContextAction: @escaping (ExportedInvitation?, ASDisplayNode, ContextGesture?) -> Void, createLink: @escaping () -> Void, openLink: @escaping (ExportedInvitation?) -> Void, linkContextAction: @escaping (ExportedInvitation?, ASDisplayNode, ContextGesture?) -> Void, deleteAllRevokedLinks: @escaping () -> Void) {
+ self.context = context
+ self.shareMainLink = shareMainLink
+ self.openMainLink = openMainLink
+ self.mainLinkContextAction = mainLinkContextAction
+ self.createLink = createLink
+ self.openLink = openLink
+ self.linkContextAction = linkContextAction
+ self.deleteAllRevokedLinks = deleteAllRevokedLinks
+ }
+}
+
+private enum InviteLinksListSection: Int32 {
+ case header
+ case mainLink
+ case links
+ case revokedLinks
+}
+
+private enum InviteLinksListEntry: ItemListNodeEntry {
+ case header(PresentationTheme, String)
+
+ case mainLinkHeader(PresentationTheme, String)
+ case mainLink(PresentationTheme, ExportedInvitation?, [Peer])
+
+ case linksHeader(PresentationTheme, String)
+ case linksCreate(PresentationTheme, String)
+ case links(Int32, PresentationTheme, [ExportedInvitation]?)
+ case linksInfo(PresentationTheme, String)
+ case revokedLinksHeader(PresentationTheme, String)
+ case revokedLinksDeleteAll(PresentationTheme, String)
+ case revokedLinks(Int32, PresentationTheme, [ExportedInvitation]?)
+
+ var section: ItemListSectionId {
+ switch self {
+ case .header:
+ return InviteLinksListSection.header.rawValue
+ case .mainLinkHeader, .mainLink:
+ return InviteLinksListSection.mainLink.rawValue
+ case .linksHeader, .linksCreate, .links, .linksInfo:
+ return InviteLinksListSection.links.rawValue
+ case .revokedLinksHeader, .revokedLinksDeleteAll, .revokedLinks:
+ return InviteLinksListSection.revokedLinks.rawValue
+ }
+ }
+
+ var stableId: Int32 {
+ switch self {
+ case .header:
+ return 0
+ case .mainLinkHeader:
+ return 1
+ case .mainLink:
+ return 2
+ case .linksHeader:
+ return 3
+ case .linksCreate:
+ return 4
+ case let .links(index, _, _):
+ return 5 + index
+ case .linksInfo:
+ return 10000
+ case .revokedLinksHeader:
+ return 10001
+ case .revokedLinksDeleteAll:
+ return 10002
+ case let .revokedLinks(index, _, _):
+ return 10003 + index
+ }
+ }
+
+ static func ==(lhs: InviteLinksListEntry, rhs: InviteLinksListEntry) -> Bool {
+ switch lhs {
+ case let .header(lhsTheme, lhsText):
+ if case let .header(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .mainLinkHeader(lhsTheme, lhsText):
+ if case let .mainLinkHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .mainLink(lhsTheme, lhsInvite, lhsPeers):
+ if case let .mainLink(rhsTheme, rhsInvite, rhsPeers) = rhs, lhsTheme === rhsTheme, lhsInvite == rhsInvite, arePeerArraysEqual(lhsPeers, rhsPeers) {
+ return true
+ } else {
+ return false
+ }
+ case let .linksHeader(lhsTheme, lhsText):
+ if case let .linksHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .linksCreate(lhsTheme, lhsText):
+ if case let .linksCreate(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .links(lhsIndex, lhsTheme, lhsLinks):
+ if case let .links(rhsIndex, rhsTheme, rhsLinks) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsLinks == rhsLinks {
+ return true
+ } else {
+ return false
+ }
+ case let .linksInfo(lhsTheme, lhsText):
+ if case let .linksInfo(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .revokedLinksHeader(lhsTheme, lhsText):
+ if case let .revokedLinksHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .revokedLinksDeleteAll(lhsTheme, lhsText):
+ if case let .revokedLinksDeleteAll(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ return true
+ } else {
+ return false
+ }
+ case let .revokedLinks(lhsIndex, lhsTheme, lhsLinks):
+ if case let .revokedLinks(rhsIndex, rhsTheme, rhsLinks) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsLinks == rhsLinks {
+ return true
+ } else {
+ return false
+ }
+ }
+ }
+
+ static func <(lhs: InviteLinksListEntry, rhs: InviteLinksListEntry) -> Bool {
+ return lhs.stableId < rhs.stableId
+ }
+
+ func item(presentationData: ItemListPresentationData, arguments: Any) -> ListViewItem {
+ let arguments = arguments as! InviteLinkListControllerArguments
+ switch self {
+ case let .header(theme, text):
+ return InviteLinkHeaderItem(theme: theme, text: text, sectionId: self.section)
+ case let .mainLinkHeader(_, text):
+ return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section)
+ case let .mainLink(_, invite, peers):
+ return ItemListPermanentInviteLinkItem(context: arguments.context, presentationData: presentationData, invite: invite, peers: peers, buttonColor: nil, sectionId: self.section, style: .blocks, shareAction: {
+ arguments.shareMainLink(invite)
+ }, contextAction: { node in
+ arguments.mainLinkContextAction(invite, node, nil)
+ }, viewAction: {
+ if let invite = invite {
+ arguments.openLink(invite)
+ }
+ })
+ case let .linksHeader(_, text):
+ return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section)
+ case let .linksCreate(theme, text):
+ return ItemListPeerActionItem(presentationData: presentationData, icon: PresentationResourcesItemList.plusIconImage(theme), title: text, hasSeparator: false, sectionId: self.section, editing: false, action: {
+ arguments.createLink()
+ })
+ case let .links(_, _, invites):
+ return ItemListInviteLinkGridItem(presentationData: presentationData, invites: invites, sectionId: self.section, style: .blocks, tapAction: { invite in
+ arguments.openLink(invite)
+ }, contextAction: { invite, node in
+ arguments.linkContextAction(invite, node, nil)
+ })
+ case let .linksInfo(_, text):
+ return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section)
+ case let .revokedLinksHeader(_, text):
+ return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section)
+ case let .revokedLinksDeleteAll(theme, text):
+ return ItemListPeerActionItem(presentationData: presentationData, icon: PresentationResourcesItemList.deleteIconImage(theme), title: text, hasSeparator: false, sectionId: self.section, color: .destructive, editing: false, action: {
+ arguments.deleteAllRevokedLinks()
+ })
+ case let .revokedLinks(_, _, invites):
+ return ItemListInviteLinkGridItem(presentationData: presentationData, invites: invites, sectionId: self.section, style: .blocks, tapAction: { invite in
+ arguments.openLink(invite)
+ }, contextAction: { invite, node in
+ arguments.linkContextAction(invite, node, nil)
+ })
+ }
+ }
+}
+
+private func inviteLinkListControllerEntries(presentationData: PresentationData, view: PeerView, invites: [ExportedInvitation]?, revokedInvites: [ExportedInvitation]?, mainPeers: [Peer]) -> [InviteLinksListEntry] {
+ var entries: [InviteLinksListEntry] = []
+
+ entries.append(.header(presentationData.theme, presentationData.strings.InviteLink_CreatePrivateLinkHelp))
+ entries.append(.mainLinkHeader(presentationData.theme, presentationData.strings.InviteLink_PermanentLink.uppercased()))
+
+ let mainInvite: ExportedInvitation?
+ if let invites = invites, let invite = invites.first(where: { $0.isPermanent && !$0.isRevoked }) {
+ mainInvite = invite
+ } else if let invite = (view.cachedData as? CachedChannelData)?.exportedInvitation {
+ mainInvite = invite
+ } else if let invite = (view.cachedData as? CachedGroupData)?.exportedInvitation {
+ mainInvite = invite
+ } else {
+ mainInvite = nil
+ }
+ entries.append(.mainLink(presentationData.theme, mainInvite, mainPeers))
+
+ entries.append(.linksHeader(presentationData.theme, presentationData.strings.InviteLink_AdditionalLinks.uppercased()))
+ entries.append(.linksCreate(presentationData.theme, presentationData.strings.InviteLink_Create))
+
+ var additionalInvites: [ExportedInvitation]?
+ if let invites = invites {
+ additionalInvites = invites.filter { $0.link != mainInvite?.link }
+ }
+ if let additionalInvites = additionalInvites {
+ var index: Int32 = 0
+ for i in stride(from: 0, to: additionalInvites.endIndex, by: 2) {
+ var invitesPair: [ExportedInvitation] = []
+ invitesPair.append(additionalInvites[i])
+ if i + 1 < additionalInvites.count {
+ invitesPair.append(additionalInvites[i + 1])
+ }
+ entries.append(.links(index, presentationData.theme, invitesPair))
+ index += 1
+ }
+ }
+ entries.append(.linksInfo(presentationData.theme, presentationData.strings.InviteLink_CreateInfo))
+
+ if let revokedInvites = revokedInvites, !revokedInvites.isEmpty {
+ entries.append(.revokedLinksHeader(presentationData.theme, presentationData.strings.InviteLink_RevokedLinks.uppercased()))
+ entries.append(.revokedLinksDeleteAll(presentationData.theme, presentationData.strings.InviteLink_DeleteAllRevokedLinks))
+
+ var index: Int32 = 0
+ for i in stride(from: 0, to: revokedInvites.endIndex, by: 2) {
+ var invitesPair: [ExportedInvitation] = []
+ invitesPair.append(revokedInvites[i])
+ if i + 1 < revokedInvites.count {
+ invitesPair.append(revokedInvites[i + 1])
+ }
+ entries.append(.revokedLinks(index, presentationData.theme, invitesPair))
+ index += 1
+ }
+ }
+
+ return entries
+}
+
+private struct InviteLinkListControllerState: Equatable {
+ var revokingPrivateLink: Bool
+}
+
+
+public func inviteLinkListController(context: AccountContext, peerId: PeerId) -> ViewController {
+ var pushControllerImpl: ((ViewController) -> Void)?
+ var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)?
+ var presentInGlobalOverlayImpl: ((ViewController) -> Void)?
+
+ let actionsDisposable = DisposableSet()
+
+ let statePromise = ValuePromise(InviteLinkListControllerState(revokingPrivateLink: false), ignoreRepeated: true)
+ let stateValue = Atomic(value: InviteLinkListControllerState(revokingPrivateLink: false))
+ let updateState: ((InviteLinkListControllerState) -> InviteLinkListControllerState) -> Void = { f in
+ statePromise.set(stateValue.modify { f($0) })
+ }
+
+ let revokeLinkDisposable = MetaDisposable()
+ actionsDisposable.add(revokeLinkDisposable)
+
+ let deleteAllRevokedLinksDisposable = MetaDisposable()
+ actionsDisposable.add(deleteAllRevokedLinksDisposable)
+
+ actionsDisposable.add((context.account.viewTracker.peerView(peerId) |> filter { $0.cachedData != nil } |> take(1) |> mapToSignal { view -> Signal in
+ return ensuredExistingPeerExportedInvitation(account: context.account, peerId: peerId)
+ |> mapToSignal { _ -> Signal in
+ return .complete()
+ }
+ }).start())
+
+ var getControllerImpl: (() -> ViewController?)?
+
+ let invitesPromise = Promise()
+ invitesPromise.set(.single(nil)
+ |> then(peerExportedInvitations(account: context.account, peerId: peerId, revoked: false)))
+
+ let revokedInvitesPromise = Promise()
+ revokedInvitesPromise.set(.single(nil)
+ |> then(peerExportedInvitations(account: context.account, peerId: peerId, revoked: true)))
+
+ let arguments = InviteLinkListControllerArguments(context: context, shareMainLink: { invite in
+ if let invite = invite {
+ let shareController = ShareController(context: context, subject: .url(invite.link))
+ presentControllerImpl?(shareController, nil)
+ }
+ }, openMainLink: { invite in
+ if let invite = invite {
+ let controller = InviteLinkViewController(context: context, peerId: peerId, invite: invite, importersContext: nil)
+ pushControllerImpl?(controller)
+ }
+ }, mainLinkContextAction: { invite, node, gesture in
+ guard let node = node as? ContextExtractedContentContainingNode, let controller = getControllerImpl?() else {
+ return
+ }
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ var items: [ContextMenuItem] = []
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextCopy, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ if let invite = invite {
+ UIPasteboard.general.string = invite.link
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Username_LinkCopied, false)), nil)
+ }
+ })))
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextGetQRCode, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Wallet/QrIcon"), color: theme.contextMenu.primaryColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ if let invite = invite {
+ let controller = InviteLinkQRCodeController(context: context, invite: invite)
+ presentControllerImpl?(controller, nil)
+ }
+ })))
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextRevoke, textColor: .destructive, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ let controller = ActionSheetController(presentationData: presentationData)
+ let dismissAction: () -> Void = { [weak controller] in
+ controller?.dismissAnimated()
+ }
+ controller.setItemGroups([
+ ActionSheetItemGroup(items: [
+ ActionSheetTextItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeAlert_Text),
+ ActionSheetButtonItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeLink, color: .destructive, action: {
+ dismissAction()
+
+ var revoke = false
+ updateState { state in
+ if !state.revokingPrivateLink {
+ revoke = true
+ var updatedState = state
+ updatedState.revokingPrivateLink = true
+ return updatedState
+ } else {
+ return state
+ }
+ }
+ if revoke {
+ revokeLinkDisposable.set((ensuredExistingPeerExportedInvitation(account: context.account, peerId: peerId, revokeExisted: true) |> deliverOnMainQueue).start(completed: {
+ updateState { state in
+ var updatedState = state
+ updatedState.revokingPrivateLink = false
+ return updatedState
+ }
+ invitesPromise.set(peerExportedInvitations(account: context.account, peerId: peerId, revoked: false))
+ }))
+ }
+ })
+ ]),
+ ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
+ ])
+ presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ })))
+
+ let contextController = ContextController(account: context.account, presentationData: presentationData, source: .extracted(InviteLinkContextExtractedContentSource(controller: controller, sourceNode: node)), items: .single(items), reactionItems: [], gesture: gesture)
+ presentInGlobalOverlayImpl?(contextController)
+ }, createLink: {
+ let controller = inviteLinkEditController(context: context, peerId: peerId, invite: nil, completion: {
+ invitesPromise.set(peerExportedInvitations(account: context.account, peerId: peerId, revoked: false))
+ })
+ controller.navigationPresentation = .modal
+ pushControllerImpl?(controller)
+ }, openLink: { invite in
+ if let invite = invite {
+ let controller = InviteLinkViewController(context: context, peerId: peerId, invite: invite, importersContext: nil)
+ pushControllerImpl?(controller)
+ }
+ }, linkContextAction: { invite, node, gesture in
+ guard let node = node as? ContextExtractedContentContainingNode, let controller = getControllerImpl?(), let invite = invite else {
+ return
+ }
+
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ var items: [ContextMenuItem] = []
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextCopy, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ UIPasteboard.general.string = invite.link
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Username_LinkCopied, false)), nil)
+ })))
+
+ if !invite.isRevoked {
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextGetQRCode, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Wallet/QrIcon"), color: theme.contextMenu.primaryColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ let controller = InviteLinkQRCodeController(context: context, invite: invite)
+ presentControllerImpl?(controller, nil)
+ })))
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextEdit, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ let controller = inviteLinkEditController(context: context, peerId: peerId, invite: invite, completion: {
+ invitesPromise.set(peerExportedInvitations(account: context.account, peerId: peerId, revoked: false))
+ })
+ controller.navigationPresentation = .modal
+ pushControllerImpl?(controller)
+ })))
+ }
+
+ if invite.isRevoked {
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextDelete, textColor: .destructive, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ let controller = ActionSheetController(presentationData: presentationData)
+ let dismissAction: () -> Void = { [weak controller] in
+ controller?.dismissAnimated()
+ }
+ controller.setItemGroups([
+ ActionSheetItemGroup(items: [
+ ActionSheetTextItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeAlert_Text),
+ ActionSheetButtonItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeLink, color: .destructive, action: {
+ dismissAction()
+
+ revokeLinkDisposable.set((revokePeerExportedInvitation(account: context.account, peerId: peerId, link: invite.link) |> deliverOnMainQueue).start(completed: {
+
+ }))
+ })
+ ]),
+ ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
+ ])
+ presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ })))
+ } else {
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextRevoke, textColor: .destructive, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ let controller = ActionSheetController(presentationData: presentationData)
+ let dismissAction: () -> Void = { [weak controller] in
+ controller?.dismissAnimated()
+ }
+ controller.setItemGroups([
+ ActionSheetItemGroup(items: [
+ ActionSheetTextItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeAlert_Text),
+ ActionSheetButtonItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeLink, color: .destructive, action: {
+ dismissAction()
+
+ revokeLinkDisposable.set((revokePeerExportedInvitation(account: context.account, peerId: peerId, link: invite.link) |> deliverOnMainQueue).start(completed: {
+
+ }))
+ })
+ ]),
+ ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
+ ])
+ presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ })))
+ }
+
+ let contextController = ContextController(account: context.account, presentationData: presentationData, source: .extracted(InviteLinkContextExtractedContentSource(controller: controller, sourceNode: node)), items: .single(items), reactionItems: [], gesture: gesture)
+ presentInGlobalOverlayImpl?(contextController)
+ }, deleteAllRevokedLinks: {
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ let controller = ActionSheetController(presentationData: presentationData)
+ let dismissAction: () -> Void = { [weak controller] in
+ controller?.dismissAnimated()
+ }
+ controller.setItemGroups([
+ ActionSheetItemGroup(items: [
+ ActionSheetTextItem(title: presentationData.strings.InviteLink_DeleteAllRevokedLinksAlert_Text),
+ ActionSheetButtonItem(title: presentationData.strings.InviteLink_DeleteAllRevokedLinksAlert_Action, color: .destructive, action: {
+ dismissAction()
+
+ deleteAllRevokedLinksDisposable.set((deleteAllRevokedPeerExportedInvitations(account: context.account, peerId: peerId) |> deliverOnMainQueue).start(completed: {
+
+ }))
+ })
+ ]),
+ ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
+ ])
+ presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ })
+
+ let peerView = context.account.viewTracker.peerView(peerId)
+ |> deliverOnMainQueue
+
+ let importersState = Promise(nil)
+ let importersContext: Signal = peerView
+ |> mapToSignal { view -> Signal in
+ if let cachedData = view.cachedData as? CachedGroupData, let exportedInvitation = cachedData.exportedInvitation {
+ return .single(exportedInvitation)
+ } else if let cachedData = view.cachedData as? CachedChannelData, let exportedInvitation = cachedData.exportedInvitation {
+ return .single(exportedInvitation)
+ } else {
+ return .complete()
+ }
+ }
+ |> distinctUntilChanged
+ |> deliverOnMainQueue
+ |> map { invite -> PeerInvitationImportersContext in
+ return PeerInvitationImportersContext(account: context.account, peerId: peerId, invite: invite)
+ } |> afterNext { context in
+ importersState.set(context.state |> map(Optional.init))
+ }
+
+ let signal = combineLatest(context.sharedContext.presentationData, peerView, importersContext, importersState.get(), invitesPromise.get(), revokedInvitesPromise.get())
+ |> deliverOnMainQueue
+ |> map { presentationData, view, importersContext, importers, invites, revokedInvites -> (ItemListControllerState, (ItemListNodeState, Any)) in
+ let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(presentationData.strings.InviteLink_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true)
+ let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: inviteLinkListControllerEntries(presentationData: presentationData, view: view, invites: invites?.list, revokedInvites: revokedInvites?.list, mainPeers: importers?.importers.compactMap { $0.peer.peer } ?? []), style: .blocks, emptyStateItem: nil, crossfadeState: false, animateChanges: false)
+
+ return (controllerState, (listState, arguments))
+ }
+ |> afterDisposed {
+ actionsDisposable.dispose()
+ }
+
+ let controller = ItemListController(context: context, state: signal)
+ controller.didDisappear = { [weak controller] _ in
+ controller?.clearItemNodesHighlight(animated: true)
+ }
+ controller.visibleBottomContentOffsetChanged = { offset in
+ if case let .known(value) = offset, value < 40.0 {
+
+ }
+ }
+ pushControllerImpl = { [weak controller] c in
+ if let controller = controller {
+ (controller.navigationController as? NavigationController)?.pushViewController(c, animated: true)
+ }
+ }
+ presentControllerImpl = { [weak controller] c, p in
+ if let controller = controller {
+ controller.present(c, in: .window(.root), with: p)
+ }
+ }
+ presentInGlobalOverlayImpl = { [weak controller] c in
+ if let controller = controller {
+ controller.presentInGlobalOverlay(c)
+ }
+ }
+ getControllerImpl = { [weak controller] in
+ return controller
+ }
+ return controller
+}
+
+
+final class InviteLinkContextExtractedContentSource: ContextExtractedContentSource {
+ var keepInPlace: Bool
+ let ignoreContentTouches: Bool = true
+ let blurBackground: Bool
+
+ private let controller: ViewController
+ private let sourceNode: ContextExtractedContentContainingNode
+
+ init(controller: ViewController, sourceNode: ContextExtractedContentContainingNode) {
+ self.controller = controller
+ self.sourceNode = sourceNode
+ self.keepInPlace = true
+ self.blurBackground = false
+ }
+
+ func takeView() -> ContextControllerTakeViewInfo? {
+ return ContextControllerTakeViewInfo(contentContainingNode: self.sourceNode, contentAreaInScreenSpace: UIScreen.main.bounds)
+ }
+
+ func putBack() -> ContextControllerPutBackViewInfo? {
+ return ContextControllerPutBackViewInfo(contentAreaInScreenSpace: UIScreen.main.bounds)
+ }
+}
diff --git a/submodules/InviteLinksUI/Sources/InviteLinkQRCodeController.swift b/submodules/InviteLinksUI/Sources/InviteLinkQRCodeController.swift
new file mode 100644
index 0000000000..7dc743a424
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/InviteLinkQRCodeController.swift
@@ -0,0 +1,414 @@
+import Foundation
+import UIKit
+import SwiftSignalKit
+import TelegramPresentationData
+import AppBundle
+import AsyncDisplayKit
+import SyncCore
+import Display
+import QrCode
+import AccountContext
+import SolidRoundedButtonNode
+import AnimatedStickerNode
+
+private func shareQrCode(context: AccountContext, link: String) {
+ let _ = (qrCode(string: link, color: .black, backgroundColor: .white, icon: .custom(UIImage(bundleImageName: "Chat/Links/QrLogo")))
+ |> map { _, generator -> UIImage? in
+ let imageSize = CGSize(width: 768.0, height: 768.0)
+ let context = generator(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets(), scale: 1.0))
+ return context?.generateImage()
+ }
+ |> deliverOnMainQueue).start(next: { image in
+ guard let image = image else {
+ return
+ }
+
+ let activityController = UIActivityViewController(activityItems: [image], applicationActivities: nil)
+ context.sharedContext.applicationBindings.presentNativeController(activityController)
+ })
+}
+
+public final class InviteLinkQRCodeController: ViewController {
+ private var controllerNode: Node {
+ return self.displayNode as! Node
+ }
+
+ private var animatedIn = false
+
+ private let context: AccountContext
+ private let invite: ExportedInvitation
+
+ private var presentationDataDisposable: Disposable?
+
+ private let idleTimerExtensionDisposable = MetaDisposable()
+
+ public init(context: AccountContext, invite: ExportedInvitation) {
+ self.context = context
+ self.invite = invite
+
+ super.init(navigationBarPresentationData: nil)
+
+ self.statusBar.statusBarStyle = .Ignore
+
+ self.blocksBackgroundWhenInOverlay = true
+
+ self.presentationDataDisposable = (context.sharedContext.presentationData
+ |> deliverOnMainQueue).start(next: { [weak self] presentationData in
+ if let strongSelf = self {
+ strongSelf.controllerNode.updatePresentationData(presentationData)
+ }
+ })
+
+ self.idleTimerExtensionDisposable.set(self.context.sharedContext.applicationBindings.pushIdleTimerExtension())
+
+ self.statusBar.statusBarStyle = .Ignore
+ }
+
+ required init(coder aDecoder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ deinit {
+ self.presentationDataDisposable?.dispose()
+ self.idleTimerExtensionDisposable.dispose()
+ }
+
+ override public func loadDisplayNode() {
+ self.displayNode = Node(context: self.context, invite: self.invite)
+ self.controllerNode.dismiss = { [weak self] in
+ self?.presentingViewController?.dismiss(animated: false, completion: nil)
+ }
+ self.controllerNode.cancel = { [weak self] in
+ self?.dismiss()
+ }
+ }
+
+ override public func loadView() {
+ super.loadView()
+ }
+
+ override public func viewDidAppear(_ animated: Bool) {
+ super.viewDidAppear(animated)
+
+ if !self.animatedIn {
+ self.animatedIn = true
+ self.controllerNode.animateIn()
+ }
+ }
+
+ override public func dismiss(completion: (() -> Void)? = nil) {
+ self.controllerNode.animateOut(completion: completion)
+ }
+
+ override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
+ super.containerLayoutUpdated(layout, transition: transition)
+
+ self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationHeight, transition: transition)
+ }
+
+ class Node: ViewControllerTracingNode, UIScrollViewDelegate {
+ private let context: AccountContext
+ private let invite: ExportedInvitation
+ private var presentationData: PresentationData
+
+ private let dimNode: ASDisplayNode
+ private let wrappingScrollNode: ASScrollNode
+ private let contentContainerNode: ASDisplayNode
+ private let backgroundNode: ASDisplayNode
+ private let contentBackgroundNode: ASDisplayNode
+ private let titleNode: ASTextNode
+ private let subtitleNode: ASTextNode
+ private let cancelButton: HighlightableButtonNode
+
+ private let textNode: ImmediateTextNode
+ private let qrButtonNode: HighlightTrackingButtonNode
+ private let qrImageNode: TransformImageNode
+ private let qrIconNode: AnimatedStickerNode
+ private var qrCodeSize: Int?
+ private let buttonNode: SolidRoundedButtonNode
+
+ private var containerLayout: (ContainerViewLayout, CGFloat)?
+
+ var completion: ((Int32) -> Void)?
+ var dismiss: (() -> Void)?
+ var cancel: (() -> Void)?
+
+ init(context: AccountContext, invite: ExportedInvitation) {
+ self.context = context
+ self.invite = invite
+ self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
+
+ self.wrappingScrollNode = ASScrollNode()
+ self.wrappingScrollNode.view.alwaysBounceVertical = true
+ self.wrappingScrollNode.view.delaysContentTouches = false
+ self.wrappingScrollNode.view.canCancelContentTouches = true
+
+ self.dimNode = ASDisplayNode()
+ self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5)
+
+ self.contentContainerNode = ASDisplayNode()
+ self.contentContainerNode.isOpaque = false
+
+ self.backgroundNode = ASDisplayNode()
+ self.backgroundNode.clipsToBounds = true
+ self.backgroundNode.cornerRadius = 16.0
+
+ let backgroundColor = self.presentationData.theme.actionSheet.opaqueItemBackgroundColor
+ let textColor = self.presentationData.theme.actionSheet.primaryTextColor
+ let secondaryTextColor = self.presentationData.theme.actionSheet.secondaryTextColor
+ let accentColor = self.presentationData.theme.actionSheet.controlAccentColor
+
+ self.contentBackgroundNode = ASDisplayNode()
+ self.contentBackgroundNode.backgroundColor = backgroundColor
+
+ self.titleNode = ASTextNode()
+ self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.InviteLink_QRCode_Title, font: Font.bold(17.0), textColor: textColor)
+
+ self.subtitleNode = ASTextNode()
+ self.subtitleNode.attributedText = NSAttributedString(string: self.presentationData.strings.InviteLink_QRCode_Title, font: Font.regular(13.0), textColor: secondaryTextColor)
+
+ self.cancelButton = HighlightableButtonNode()
+ self.cancelButton.setTitle(self.presentationData.strings.Common_Done, with: Font.bold(17.0), with: accentColor, for: .normal)
+
+ self.buttonNode = SolidRoundedButtonNode(theme: SolidRoundedButtonTheme(theme: self.presentationData.theme), height: 52.0, cornerRadius: 11.0, gloss: false)
+
+ self.textNode = ImmediateTextNode()
+ self.textNode.maximumNumberOfLines = 3
+ self.textNode.textAlignment = .center
+
+ self.qrButtonNode = HighlightTrackingButtonNode()
+ self.qrImageNode = TransformImageNode()
+
+ self.qrIconNode = AnimatedStickerNode()
+ if let path = getAppBundle().path(forResource: "PlaneLogo", ofType: "tgs") {
+ self.qrIconNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 240, height: 240, mode: .direct(cachePathPrefix: nil))
+ self.qrIconNode.visibility = true
+ }
+
+ super.init()
+
+ self.backgroundColor = nil
+ self.isOpaque = false
+
+ self.dimNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dimTapGesture(_:))))
+ self.addSubnode(self.dimNode)
+
+ self.wrappingScrollNode.view.delegate = self
+ self.addSubnode(self.wrappingScrollNode)
+
+ self.wrappingScrollNode.addSubnode(self.backgroundNode)
+ self.wrappingScrollNode.addSubnode(self.contentContainerNode)
+
+ self.backgroundNode.addSubnode(self.contentBackgroundNode)
+ self.contentContainerNode.addSubnode(self.titleNode)
+ self.contentContainerNode.addSubnode(self.cancelButton)
+ self.contentContainerNode.addSubnode(self.buttonNode)
+
+ self.contentContainerNode.addSubnode(self.textNode)
+ self.contentContainerNode.addSubnode(self.qrImageNode)
+ self.contentContainerNode.addSubnode(self.qrIconNode)
+ self.contentContainerNode.addSubnode(self.qrButtonNode)
+
+ let textFont = Font.regular(16.0)
+
+ self.textNode.attributedText = NSAttributedString(string: self.presentationData.strings.InviteLink_QRCode_Info, font: textFont, textColor: secondaryTextColor)
+ self.buttonNode.title = self.presentationData.strings.InviteLink_QRCode_Share
+
+ self.cancelButton.addTarget(self, action: #selector(self.cancelButtonPressed), forControlEvents: .touchUpInside)
+ self.buttonNode.pressed = { [weak self] in
+ if let strongSelf = self{
+ shareQrCode(context: strongSelf.context, link: strongSelf.invite.link)
+ }
+ }
+
+ self.qrImageNode.setSignal(qrCode(string: self.invite.link, color: .black, backgroundColor: .white, icon: .cutout) |> beforeNext { [weak self] size, _ in
+ guard let strongSelf = self else {
+ return
+ }
+ strongSelf.qrCodeSize = size
+ if let (layout, navigationHeight) = strongSelf.containerLayout {
+ strongSelf.containerLayoutUpdated(layout, navigationBarHeight: navigationHeight, transition: .immediate)
+ }
+ } |> map { $0.1 }, attemptSynchronously: true)
+
+ self.qrButtonNode.addTarget(self, action: #selector(self.qrPressed), forControlEvents: .touchUpInside)
+ self.qrButtonNode.highligthedChanged = { [weak self] highlighted in
+ guard let strongSelf = self else {
+ return
+ }
+ if highlighted {
+ strongSelf.qrImageNode.alpha = 0.4
+ strongSelf.qrIconNode.alpha = 0.4
+ } else {
+ strongSelf.qrImageNode.layer.animateAlpha(from: strongSelf.qrImageNode.alpha, to: 1.0, duration: 0.2)
+ strongSelf.qrImageNode.alpha = 1.0
+ strongSelf.qrIconNode.layer.animateAlpha(from: strongSelf.qrIconNode.alpha, to: 1.0, duration: 0.2)
+ strongSelf.qrIconNode.alpha = 1.0
+ }
+ }
+ }
+
+ @objc private func qrPressed() {
+ shareQrCode(context: self.context, link: self.invite.link)
+ }
+
+ func updatePresentationData(_ presentationData: PresentationData) {
+ let previousTheme = self.presentationData.theme
+ self.presentationData = presentationData
+
+ self.contentBackgroundNode.backgroundColor = self.presentationData.theme.actionSheet.opaqueItemBackgroundColor
+ self.titleNode.attributedText = NSAttributedString(string: self.titleNode.attributedText?.string ?? "", font: Font.bold(17.0), textColor: self.presentationData.theme.actionSheet.primaryTextColor)
+
+ if previousTheme !== presentationData.theme, let (layout, navigationBarHeight) = self.containerLayout {
+ self.containerLayoutUpdated(layout, navigationBarHeight: navigationBarHeight, transition: .immediate)
+ }
+
+ self.cancelButton.setTitle(self.presentationData.strings.Common_Done, with: Font.bold(17.0), with: self.presentationData.theme.actionSheet.controlAccentColor, for: .normal)
+ self.buttonNode.updateTheme(SolidRoundedButtonTheme(theme: self.presentationData.theme))
+ }
+
+ override func didLoad() {
+ super.didLoad()
+
+ if #available(iOSApplicationExtension 11.0, iOS 11.0, *) {
+ self.wrappingScrollNode.view.contentInsetAdjustmentBehavior = .never
+ }
+ }
+
+ @objc func cancelButtonPressed() {
+ self.cancel?()
+ }
+
+ @objc func dimTapGesture(_ recognizer: UITapGestureRecognizer) {
+ if case .ended = recognizer.state {
+ self.cancelButtonPressed()
+ }
+ }
+
+ func animateIn() {
+ self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4)
+
+ let offset = self.bounds.size.height - self.contentBackgroundNode.frame.minY
+
+ let dimPosition = self.dimNode.layer.position
+ self.dimNode.layer.animatePosition(from: CGPoint(x: dimPosition.x, y: dimPosition.y - offset), to: dimPosition, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
+ self.layer.animateBoundsOriginYAdditive(from: -offset, to: 0.0, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring)
+ }
+
+ func animateOut(completion: (() -> Void)? = nil) {
+ var dimCompleted = false
+ var offsetCompleted = false
+
+ let internalCompletion: () -> Void = { [weak self] in
+ if let strongSelf = self, dimCompleted && offsetCompleted {
+ strongSelf.dismiss?()
+ }
+ completion?()
+ }
+
+ self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { _ in
+ dimCompleted = true
+ internalCompletion()
+ })
+
+ let offset = self.bounds.size.height - self.contentBackgroundNode.frame.minY
+ let dimPosition = self.dimNode.layer.position
+ self.dimNode.layer.animatePosition(from: dimPosition, to: CGPoint(x: dimPosition.x, y: dimPosition.y - offset), duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false)
+ self.layer.animateBoundsOriginYAdditive(from: 0.0, to: -offset, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in
+ offsetCompleted = true
+ internalCompletion()
+ })
+ }
+
+ override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
+ if self.bounds.contains(point) {
+ if !self.contentBackgroundNode.bounds.contains(self.convert(point, to: self.contentBackgroundNode)) {
+ return self.dimNode.view
+ }
+ }
+ return super.hitTest(point, with: event)
+ }
+
+ func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
+ let contentOffset = scrollView.contentOffset
+ let additionalTopHeight = max(0.0, -contentOffset.y)
+
+ if additionalTopHeight >= 30.0 {
+ self.cancelButtonPressed()
+ }
+ }
+
+ func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) {
+ self.containerLayout = (layout, navigationBarHeight)
+
+ var insets = layout.insets(options: [.statusBar, .input])
+ let cleanInsets = layout.insets(options: [.statusBar])
+ insets.top = max(10.0, insets.top)
+
+ let makeImageLayout = self.qrImageNode.asyncLayout()
+ let imageSide: CGFloat = 240.0
+ let imageSize = CGSize(width: imageSide, height: imageSide)
+ let imageApply = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets(), emptyColor: nil))
+
+ let _ = imageApply()
+
+ let imageFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - imageSize.width) / 2.0), y: insets.top + 24.0), size: imageSize)
+ transition.updateFrame(node: self.qrImageNode, frame: imageFrame)
+ transition.updateFrame(node: self.qrButtonNode, frame: imageFrame)
+
+ if let qrCodeSize = self.qrCodeSize {
+ let (_, cutoutFrame, _) = qrCodeCutout(size: qrCodeSize, dimensions: imageSize, scale: nil)
+ self.qrIconNode.updateLayout(size: cutoutFrame.size)
+ transition.updateBounds(node: self.qrIconNode, bounds: CGRect(origin: CGPoint(), size: cutoutFrame.size))
+ transition.updatePosition(node: self.qrIconNode, position: imageFrame.center.offsetBy(dx: 0.0, dy: -1.0))
+ }
+
+ let inset: CGFloat = 22.0
+ let textSize = self.textNode.updateLayout(CGSize(width: layout.size.width - inset * 2.0, height: CGFloat.greatestFiniteMagnitude))
+ let textFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - textSize.width) / 2.0), y: imageFrame.maxX + 20.0), size: textSize)
+ transition.updateFrame(node: self.textNode, frame: textFrame)
+
+ let buttonSideInset: CGFloat = 16.0
+ let bottomInset = insets.bottom + 10.0
+ let buttonWidth = layout.size.width - buttonSideInset * 2.0
+ let buttonHeight: CGFloat = 50.0
+
+ let buttonFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - buttonWidth) / 2.0), y: layout.size.height - bottomInset - buttonHeight), size: CGSize(width: buttonWidth, height: buttonHeight))
+ transition.updateFrame(node: self.buttonNode, frame: buttonFrame)
+ let _ = self.buttonNode.updateLayout(width: buttonFrame.width, transition: transition)
+
+
+ let titleHeight: CGFloat = 54.0
+ let contentHeight = titleHeight + textSize.height + imageSize.height + bottomInset + 52.0 + 77.0
+
+ let width = horizontalContainerFillingSizeForLayout(layout: layout, sideInset: layout.safeInsets.left)
+
+ let sideInset = floor((layout.size.width - width) / 2.0)
+ let contentContainerFrame = CGRect(origin: CGPoint(x: sideInset, y: layout.size.height - contentHeight), size: CGSize(width: width, height: contentHeight))
+ let contentFrame = contentContainerFrame
+
+ var backgroundFrame = CGRect(origin: CGPoint(x: contentFrame.minX, y: contentFrame.minY), size: CGSize(width: contentFrame.width, height: contentFrame.height + 2000.0))
+ if backgroundFrame.minY < contentFrame.minY {
+ backgroundFrame.origin.y = contentFrame.minY
+ }
+ transition.updateFrame(node: self.backgroundNode, frame: backgroundFrame)
+ transition.updateFrame(node: self.contentBackgroundNode, frame: CGRect(origin: CGPoint(), size: backgroundFrame.size))
+ transition.updateFrame(node: self.wrappingScrollNode, frame: CGRect(origin: CGPoint(), size: layout.size))
+ transition.updateFrame(node: self.dimNode, frame: CGRect(origin: CGPoint(), size: layout.size))
+
+ let titleSize = self.titleNode.measure(CGSize(width: width, height: titleHeight))
+ let titleFrame = CGRect(origin: CGPoint(x: floor((contentFrame.width - titleSize.width) / 2.0), y: 16.0), size: titleSize)
+ transition.updateFrame(node: self.titleNode, frame: titleFrame)
+
+ let cancelSize = self.cancelButton.measure(CGSize(width: width, height: titleHeight))
+ let cancelFrame = CGRect(origin: CGPoint(x: width - cancelSize.width - 16.0, y: 16.0), size: cancelSize)
+ transition.updateFrame(node: self.cancelButton, frame: cancelFrame)
+
+ let buttonInset: CGFloat = 16.0
+ let doneButtonHeight = self.buttonNode.updateLayout(width: contentFrame.width - buttonInset * 2.0, transition: transition)
+ transition.updateFrame(node: self.buttonNode, frame: CGRect(x: buttonInset, y: contentHeight - doneButtonHeight - insets.bottom - 16.0, width: contentFrame.width, height: doneButtonHeight))
+
+ transition.updateFrame(node: self.contentContainerNode, frame: contentContainerFrame)
+ }
+ }
+}
diff --git a/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift b/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift
new file mode 100644
index 0000000000..6c71c6b6ea
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift
@@ -0,0 +1,766 @@
+import Foundation
+import UIKit
+import SwiftSignalKit
+import TelegramPresentationData
+import AppBundle
+import AsyncDisplayKit
+import Postbox
+import SyncCore
+import TelegramCore
+import Display
+import AccountContext
+import SolidRoundedButtonNode
+import ItemListUI
+import ItemListPeerItem
+import SectionHeaderItem
+import TelegramStringFormatting
+import MergeLists
+import ContextUI
+import ShareController
+import OverlayStatusController
+import PresentationDataUtils
+import DirectionalPanGesture
+
+class InviteLinkViewInteraction {
+ let context: AccountContext
+ let openPeer: (PeerId) -> Void
+ let shareLink: (ExportedInvitation) -> Void
+ let contextAction: (ExportedInvitation, ASDisplayNode, ContextGesture?) -> Void
+
+ init(context: AccountContext, openPeer: @escaping (PeerId) -> Void, shareLink: @escaping (ExportedInvitation) -> Void, contextAction: @escaping (ExportedInvitation, ASDisplayNode, ContextGesture?) -> Void) {
+ self.context = context
+ self.openPeer = openPeer
+ self.shareLink = shareLink
+ self.contextAction = contextAction
+ }
+}
+
+private struct InviteLinkViewTransaction {
+ let deletions: [ListViewDeleteItem]
+ let insertions: [ListViewInsertItem]
+ let updates: [ListViewUpdateItem]
+ let isLoading: Bool
+}
+
+private enum InviteLinkViewEntryId: Hashable {
+ case link
+ case creatorHeader
+ case creator
+ case importerHeader
+ case importer(PeerId)
+}
+
+private func color(for invite: ExportedInvitation) -> UIColor? {
+ let color: UIColor?
+ let availability = invitationAvailability(invite)
+ if invite.isRevoked {
+ color = nil
+ } else if invite.expireDate == nil && invite.usageLimit == nil {
+ color = nil
+ } else if availability >= 0.5 {
+ color = UIColor(rgb: 0x4aca62)
+ } else if availability > 0.0 {
+ color = UIColor(rgb: 0xf8a953)
+ } else {
+ color = UIColor(rgb: 0xf2656a)
+ }
+ return color
+}
+
+private enum InviteLinkViewEntry: Comparable, Identifiable {
+ case link(PresentationTheme, ExportedInvitation)
+ case creatorHeader(PresentationTheme, String)
+ case creator(PresentationTheme, PresentationDateTimeFormat, Peer, Int32)
+ case importerHeader(PresentationTheme, String)
+ case importer(Int32, PresentationTheme, PresentationDateTimeFormat, Peer, Int32)
+
+ var stableId: InviteLinkViewEntryId {
+ switch self {
+ case .link:
+ return .link
+ case .creatorHeader:
+ return .creatorHeader
+ case .creator:
+ return .creator
+ case .importerHeader:
+ return .importerHeader
+ case let .importer(_, _, _, peer, _):
+ return .importer(peer.id)
+ }
+ }
+
+ static func ==(lhs: InviteLinkViewEntry, rhs: InviteLinkViewEntry) -> Bool {
+ switch lhs {
+ case let .link(lhsTheme, lhsInvitation):
+ if case let .link(rhsTheme, rhsInvitation) = rhs, lhsTheme === rhsTheme, lhsInvitation == rhsInvitation {
+ return true
+ } else {
+ return false
+ }
+ case let .creatorHeader(lhsTheme, lhsTitle):
+ if case let .creatorHeader(rhsTheme, rhsTitle) = rhs, lhsTheme === rhsTheme, lhsTitle == rhsTitle {
+ return true
+ } else {
+ return false
+ }
+ case let .creator(lhsTheme, lhsDateTimeFormat, lhsPeer, lhsDate):
+ if case let .creator(rhsTheme, rhsDateTimeFormat, rhsPeer, rhsDate) = rhs, lhsTheme === rhsTheme, lhsDateTimeFormat == rhsDateTimeFormat, arePeersEqual(lhsPeer, rhsPeer), lhsDate == rhsDate {
+ return true
+ } else {
+ return false
+ }
+ case let .importerHeader(lhsTheme, lhsTitle):
+ if case let .importerHeader(rhsTheme, rhsTitle) = rhs, lhsTheme === rhsTheme, lhsTitle == rhsTitle {
+ return true
+ } else {
+ return false
+ }
+ case let .importer(lhsIndex, lhsTheme, lhsDateTimeFormat, lhsPeer, lhsDate):
+ if case let .importer(rhsIndex, rhsTheme, rhsDateTimeFormat, rhsPeer, rhsDate) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsDateTimeFormat == rhsDateTimeFormat, arePeersEqual(lhsPeer, rhsPeer), lhsDate == rhsDate {
+ return true
+ } else {
+ return false
+ }
+ }
+ }
+
+ static func <(lhs: InviteLinkViewEntry, rhs: InviteLinkViewEntry) -> Bool {
+ switch lhs {
+ case .link:
+ switch rhs {
+ case .link:
+ return false
+ case .creatorHeader, .creator, .importerHeader, .importer:
+ return true
+ }
+ case .creatorHeader:
+ switch rhs {
+ case .link, .creatorHeader:
+ return false
+ case .creator, .importerHeader, .importer:
+ return true
+ }
+ case .creator:
+ switch rhs {
+ case .link, .creatorHeader, .creator:
+ return false
+ case .importerHeader, .importer:
+ return true
+ }
+ case .importerHeader:
+ switch rhs {
+ case .link, .creatorHeader, .importerHeader:
+ return false
+ case .creator, .importer:
+ return true
+ }
+ case let .importer(lhsIndex, _, _, _, _):
+ switch rhs {
+ case .link, .creatorHeader, .creator, .importerHeader:
+ return false
+ case let .importer(rhsIndex, _, _, _, _):
+ return lhsIndex < rhsIndex
+ }
+ }
+ }
+
+ func item(account: Account, presentationData: PresentationData, interaction: InviteLinkViewInteraction) -> ListViewItem {
+ switch self {
+ case let .link(_, invite):
+ let buttonColor = color(for: invite)
+ return ItemListPermanentInviteLinkItem(context: interaction.context, presentationData: ItemListPresentationData(presentationData), invite: invite, peers: [], buttonColor: buttonColor, sectionId: 0, style: .plain, shareAction: {
+ interaction.shareLink(invite)
+ }, contextAction: { node in
+ interaction.contextAction(invite, node, nil)
+ }, viewAction: {
+ })
+ case let .creatorHeader(_, title):
+ return SectionHeaderItem(presentationData: ItemListPresentationData(presentationData), title: title)
+ case let .creator(_, dateTimeFormat, peer, date):
+ let dateString = stringForFullDate(timestamp: date, strings: presentationData.strings, dateTimeFormat: dateTimeFormat)
+ return ItemListPeerItem(presentationData: ItemListPresentationData(presentationData), dateTimeFormat: dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, context: interaction.context, peer: peer, height: .generic, nameStyle: .distinctBold, presence: nil, text: .text(dateString, .secondary), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: 0, action: {
+ interaction.openPeer(peer.id)
+ }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, hasTopStripe: false, noInsets: true, tag: nil)
+ case let .importerHeader(_, title):
+ return SectionHeaderItem(presentationData: ItemListPresentationData(presentationData), title: title)
+ case let .importer(_, _, dateTimeFormat, peer, date):
+ let dateString = stringForFullDate(timestamp: date, strings: presentationData.strings, dateTimeFormat: dateTimeFormat)
+ return ItemListPeerItem(presentationData: ItemListPresentationData(presentationData), dateTimeFormat: dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, context: interaction.context, peer: peer, height: .generic, nameStyle: .distinctBold, presence: nil, text: .text(dateString, .secondary), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: 0, action: {
+ interaction.openPeer(peer.id)
+ }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, hasTopStripe: false, noInsets: true, tag: nil)
+ }
+ }
+}
+
+private func preparedTransition(from fromEntries: [InviteLinkViewEntry], to toEntries: [InviteLinkViewEntry], isLoading: Bool, account: Account, presentationData: PresentationData, interaction: InviteLinkViewInteraction) -> InviteLinkViewTransaction {
+ 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(account: account, presentationData: presentationData, interaction: interaction), directionHint: nil) }
+ let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(account: account, presentationData: presentationData, interaction: interaction), directionHint: nil) }
+
+ return InviteLinkViewTransaction(deletions: deletions, insertions: insertions, updates: updates, isLoading: isLoading)
+}
+
+public final class InviteLinkViewController: ViewController {
+ private var controllerNode: Node {
+ return self.displayNode as! Node
+ }
+
+ private var animatedIn = false
+
+ private let context: AccountContext
+ private let peerId: PeerId
+ private let invite: ExportedInvitation
+ private let importersContext: PeerInvitationImportersContext?
+
+ private var presentationDataDisposable: Disposable?
+
+ public init(context: AccountContext, peerId: PeerId, invite: ExportedInvitation, importersContext: PeerInvitationImportersContext?) {
+ self.context = context
+ self.peerId = peerId
+ self.invite = invite
+ self.importersContext = importersContext
+
+ super.init(navigationBarPresentationData: nil)
+
+ self.navigationPresentation = .flatModal
+ self.statusBar.statusBarStyle = .Ignore
+
+ self.blocksBackgroundWhenInOverlay = true
+
+ self.presentationDataDisposable = (context.sharedContext.presentationData
+ |> deliverOnMainQueue).start(next: { [weak self] presentationData in
+ if let strongSelf = self {
+ strongSelf.controllerNode.updatePresentationData(presentationData)
+ }
+ })
+
+ self.statusBar.statusBarStyle = .Ignore
+ }
+
+ required init(coder aDecoder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ deinit {
+ self.presentationDataDisposable?.dispose()
+ }
+
+ override public func loadDisplayNode() {
+ self.displayNode = Node(context: self.context, peerId: self.peerId, invite: self.invite, importersContext: self.importersContext, controller: self)
+ }
+
+ override public func loadView() {
+ super.loadView()
+ }
+
+ private var didAppearOnce: Bool = false
+ private var isDismissed: Bool = false
+ public override func viewDidAppear(_ animated: Bool) {
+ super.viewDidAppear(animated)
+
+ if !self.didAppearOnce {
+ self.didAppearOnce = true
+
+ self.controllerNode.animateIn()
+ }
+ }
+
+ override public func dismiss(completion: (() -> Void)? = nil) {
+ if !self.isDismissed {
+ self.isDismissed = true
+ self.didAppearOnce = false
+
+ self.controllerNode.animateOut(completion: { [weak self] in
+ completion?()
+ self?.dismiss(animated: false)
+ })
+ }
+ }
+
+ override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
+ super.containerLayoutUpdated(layout, transition: transition)
+
+ self.controllerNode.containerLayoutUpdated(layout, transition: transition)
+ }
+
+ class Node: ViewControllerTracingNode, UIGestureRecognizerDelegate {
+ private weak var controller: InviteLinkViewController?
+
+ private let context: AccountContext
+ private let peerId: PeerId
+ private let invite: ExportedInvitation
+
+ private var interaction: InviteLinkViewInteraction?
+
+ private var presentationData: PresentationData
+ private let presentationDataPromise: Promise
+
+ private var disposable: Disposable?
+
+ private let dimNode: ASDisplayNode
+ private let contentNode: ASDisplayNode
+ private let headerNode: ASDisplayNode
+ private let headerBackgroundNode: ASDisplayNode
+ private let titleNode: ImmediateTextNode
+ private let subtitleNode: ImmediateTextNode
+ private let editButton: HighlightableButtonNode
+ private let doneButton: HighlightableButtonNode
+ private let historyBackgroundNode: ASDisplayNode
+ private let historyBackgroundContentNode: ASDisplayNode
+ private var floatingHeaderOffset: CGFloat?
+ private let listNode: ListView
+
+ private var enqueuedTransitions: [InviteLinkViewTransaction] = []
+
+ private var validLayout: ContainerViewLayout?
+
+ private var presentationDataDisposable: Disposable?
+
+ private let importersContext: PeerInvitationImportersContext
+
+ init(context: AccountContext, peerId: PeerId, invite: ExportedInvitation, importersContext: PeerInvitationImportersContext?, controller: InviteLinkViewController) {
+ self.context = context
+ self.peerId = peerId
+ self.invite = invite
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ self.presentationData = presentationData
+ self.presentationDataPromise = Promise(self.presentationData)
+ self.controller = controller
+
+ self.importersContext = importersContext ?? PeerInvitationImportersContext(account: context.account, peerId: peerId, invite: invite)
+
+ self.dimNode = ASDisplayNode()
+ self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5)
+
+ self.contentNode = ASDisplayNode()
+
+ self.headerNode = ASDisplayNode()
+ self.headerNode.clipsToBounds = true
+
+ self.headerBackgroundNode = ASDisplayNode()
+ self.headerBackgroundNode.backgroundColor = self.presentationData.theme.list.plainBackgroundColor
+ self.headerBackgroundNode.cornerRadius = 16.0
+
+ self.titleNode = ImmediateTextNode()
+ self.titleNode.maximumNumberOfLines = 1
+ self.titleNode.textAlignment = .center
+ self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.InviteLink_InviteLink, font: Font.bold(17.0), textColor: self.presentationData.theme.actionSheet.primaryTextColor)
+
+ self.subtitleNode = ImmediateTextNode()
+ self.subtitleNode.maximumNumberOfLines = 1
+ self.subtitleNode.textAlignment = .center
+
+ let buttonColor = color(for: invite) ?? presentationData.theme.actionSheet.controlAccentColor
+
+ self.editButton = HighlightableButtonNode()
+ self.editButton.setTitle(self.presentationData.strings.Common_Edit, with: Font.regular(17.0), with: buttonColor, for: .normal)
+
+ self.doneButton = HighlightableButtonNode()
+ self.doneButton.setTitle(self.presentationData.strings.Common_Done, with: Font.bold(17.0), with: buttonColor, for: .normal)
+
+ self.historyBackgroundNode = ASDisplayNode()
+ self.historyBackgroundNode.isLayerBacked = true
+
+ self.historyBackgroundContentNode = ASDisplayNode()
+ self.historyBackgroundContentNode.isLayerBacked = true
+ self.historyBackgroundContentNode.backgroundColor = self.presentationData.theme.list.plainBackgroundColor
+
+ self.historyBackgroundNode.addSubnode(self.historyBackgroundContentNode)
+
+ self.listNode = ListView()
+ self.listNode.verticalScrollIndicatorColor = UIColor(white: 0.0, alpha: 0.3)
+ self.listNode.verticalScrollIndicatorFollowsOverscroll = true
+
+ super.init()
+
+ self.backgroundColor = nil
+ self.isOpaque = false
+
+ self.interaction = InviteLinkViewInteraction(context: context, openPeer: { [weak self] peerId in
+ if let strongSelf = self, let navigationController = strongSelf.controller?.navigationController as? NavigationController {
+ context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId), keepStack: .always))
+ }
+ }, shareLink: { [weak self] invite in
+ let shareController = ShareController(context: context, subject: .url(invite.link))
+ self?.controller?.present(shareController, in: .window(.root))
+ }, contextAction: { [weak self] invite, node, gesture in
+ guard let node = node as? ContextExtractedContentContainingNode else {
+ return
+ }
+
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ var items: [ContextMenuItem] = []
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextCopy, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor)
+ }, action: { [weak self] _, f in
+ f(.dismissWithoutContent)
+
+ UIPasteboard.general.string = invite.link
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ self?.controller?.present(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Username_LinkCopied, false)), in: .window(.root))
+ })))
+
+ if !invite.isRevoked {
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextGetQRCode, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Wallet/QrIcon"), color: theme.contextMenu.primaryColor)
+ }, action: { [weak self] _, f in
+ f(.dismissWithoutContent)
+
+ let controller = InviteLinkQRCodeController(context: context, invite: invite)
+ self?.controller?.present(controller, in: .window(.root))
+ })))
+ }
+
+ let contextController = ContextController(account: context.account, presentationData: presentationData, source: .extracted(InviteLinkContextExtractedContentSource(controller: controller, sourceNode: node)), items: .single(items), reactionItems: [], gesture: gesture)
+ self?.controller?.presentInGlobalOverlay(contextController)
+ })
+
+ let previousEntries = Atomic<[InviteLinkViewEntry]?>(value: nil)
+
+ let creatorPeer = context.account.postbox.loadedPeerWithId(invite.adminId)
+ self.disposable = (combineLatest(self.presentationDataPromise.get(), self.importersContext.state, creatorPeer)
+ |> deliverOnMainQueue).start(next: { [weak self] presentationData, state, creatorPeer in
+ if let strongSelf = self {
+ var entries: [InviteLinkViewEntry] = []
+
+ entries.append(.link(presentationData.theme, invite))
+ entries.append(.creatorHeader(presentationData.theme, presentationData.strings.InviteLink_CreatedBy.uppercased()))
+ entries.append(.creator(presentationData.theme, presentationData.dateTimeFormat, creatorPeer, invite.date))
+
+ if !state.importers.isEmpty {
+ entries.append(.importerHeader(presentationData.theme, presentationData.strings.InviteLink_PeopleJoined(Int32(state.count)).uppercased()))
+ }
+
+ var index: Int32 = 0
+ for importer in state.importers {
+ if let peer = importer.peer.peer {
+ entries.append(.importer(index, presentationData.theme, presentationData.dateTimeFormat, peer, importer.date))
+ }
+ index += 1
+ }
+
+ let previousEntries = previousEntries.swap(entries)
+
+ let transition = preparedTransition(from: previousEntries ?? [], to: entries, isLoading: false, account: context.account, presentationData: presentationData, interaction: strongSelf.interaction!)
+ strongSelf.enqueueTransition(transition)
+ }
+ })
+
+ self.listNode.preloadPages = true
+ self.listNode.stackFromBottom = true
+ self.listNode.updateFloatingHeaderOffset = { [weak self] offset, transition in
+ if let strongSelf = self {
+ strongSelf.updateFloatingHeaderOffset(offset: offset, transition: transition)
+ }
+ }
+ self.listNode.visibleBottomContentOffsetChanged = { [weak self] offset in
+ if case let .known(value) = offset, value < 40.0 {
+ self?.importersContext.loadMore()
+ }
+ }
+
+ self.addSubnode(self.dimNode)
+ self.addSubnode(self.contentNode)
+ self.contentNode.addSubnode(self.historyBackgroundNode)
+ self.contentNode.addSubnode(self.listNode)
+ self.contentNode.addSubnode(self.headerNode)
+
+ self.headerNode.addSubnode(self.headerBackgroundNode)
+ self.headerNode.addSubnode(self.titleNode)
+ self.headerNode.addSubnode(self.subtitleNode)
+ self.headerNode.addSubnode(self.editButton)
+ self.headerNode.addSubnode(self.doneButton)
+
+ self.editButton.addTarget(self, action: #selector(self.editButtonPressed), forControlEvents: .touchUpInside)
+ self.doneButton.addTarget(self, action: #selector(self.doneButtonPressed), forControlEvents: .touchUpInside)
+
+ self.presentationDataDisposable = context.sharedContext.presentationData.start(next: { [weak self] presentationData in
+ if let strongSelf = self {
+ if strongSelf.presentationData.theme !== presentationData.theme || strongSelf.presentationData.strings !== presentationData.strings {
+ strongSelf.updatePresentationData(presentationData)
+ }
+ }
+ })
+
+ if invite.isRevoked {
+ self.editButton.isHidden = true
+ }
+ }
+
+ deinit {
+ self.disposable?.dispose()
+ self.presentationDataDisposable?.dispose()
+ }
+
+ override func didLoad() {
+ super.didLoad()
+
+ self.view.disablesInteractiveTransitionGestureRecognizer = true
+ self.view.disablesInteractiveModalDismiss = true
+
+ self.dimNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dimTapGesture(_:))))
+
+ let panRecognizer = DirectionalPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:)))
+ panRecognizer.delegate = self
+ panRecognizer.delaysTouchesBegan = false
+ panRecognizer.cancelsTouchesInView = true
+ self.view.addGestureRecognizer(panRecognizer)
+ }
+
+ @objc private func editButtonPressed() {
+ let navigationController = self.controller?.navigationController as? NavigationController
+ self.controller?.dismiss()
+
+ if let navigationController = navigationController {
+ let controller = inviteLinkEditController(context: self.context, peerId: self.peerId, invite: self.invite)
+ controller.navigationPresentation = .modal
+ navigationController.pushViewController(controller)
+ }
+ }
+
+ @objc private func doneButtonPressed() {
+ self.controller?.dismiss()
+ }
+
+ func updatePresentationData(_ presentationData: PresentationData) {
+ self.presentationData = presentationData
+ self.presentationDataPromise.set(.single(presentationData))
+
+ self.historyBackgroundContentNode.backgroundColor = self.presentationData.theme.list.plainBackgroundColor
+ self.headerBackgroundNode.backgroundColor = self.presentationData.theme.list.plainBackgroundColor
+ self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.InviteLink_InviteLink, font: Font.bold(17.0), textColor: self.presentationData.theme.actionSheet.primaryTextColor)
+
+ let buttonColor = color(for: invite) ?? self.presentationData.theme.actionSheet.controlAccentColor
+ self.editButton.setTitle(self.presentationData.strings.Common_Edit, with: Font.regular(17.0), with: buttonColor, for: .normal)
+ self.doneButton.setTitle(self.presentationData.strings.Common_Done, with: Font.bold(17.0), with: buttonColor, for: .normal)
+ }
+
+ private func enqueueTransition(_ transition: InviteLinkViewTransaction) {
+ self.enqueuedTransitions.append(transition)
+
+ if let _ = self.validLayout {
+ while !self.enqueuedTransitions.isEmpty {
+ self.dequeueTransition()
+ }
+ }
+ }
+
+ private func dequeueTransition() {
+ guard let _ = self.validLayout, let transition = self.enqueuedTransitions.first else {
+ return
+ }
+ self.enqueuedTransitions.remove(at: 0)
+
+ self.listNode.transaction(deleteIndices: transition.deletions, insertIndicesAndItems: transition.insertions, updateIndicesAndItems: transition.updates, options: ListViewDeleteAndInsertOptions(), updateSizeAndInsets: nil, updateOpaqueState: nil, completion: { _ in
+ })
+ }
+
+ func animateIn() {
+ guard let layout = self.validLayout else {
+ return
+ }
+ let transition = ContainedViewLayoutTransition.animated(duration: 0.4, curve: .spring)
+
+ let initialBounds = self.contentNode.bounds
+ self.contentNode.bounds = initialBounds.offsetBy(dx: 0.0, dy: -layout.size.height)
+ transition.animateView({
+ self.contentNode.view.bounds = initialBounds
+ })
+ self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3)
+ }
+
+ func animateOut(completion: (() -> Void)?) {
+ guard let layout = self.validLayout else {
+ return
+ }
+ var offsetCompleted = false
+ let internalCompletion: () -> Void = {
+ if offsetCompleted {
+ completion?()
+ }
+ }
+
+ self.contentNode.layer.animateBoundsOriginYAdditive(from: self.contentNode.bounds.origin.y, to: -layout.size.height, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in
+ offsetCompleted = true
+ internalCompletion()
+ })
+ self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false)
+ }
+
+ func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
+ self.validLayout = layout
+
+ transition.updateFrame(node: self.dimNode, frame: CGRect(origin: CGPoint(), size: layout.size))
+ transition.updateFrame(node: self.contentNode, frame: CGRect(origin: CGPoint(), size: layout.size))
+
+ var insets = UIEdgeInsets()
+ insets.left = layout.safeInsets.left
+ insets.right = layout.safeInsets.right
+ insets.bottom = layout.intrinsicInsets.bottom
+
+ let headerHeight: CGFloat = 54.0
+ let visibleItemsHeight: CGFloat = 147.0 + floor(52.0 * 3.5)
+
+ let layoutTopInset: CGFloat = max(layout.statusBarHeight ?? 0.0, layout.safeInsets.top)
+
+ let listTopInset = layoutTopInset + headerHeight
+ let listNodeSize = CGSize(width: layout.size.width, height: layout.size.height - listTopInset)
+
+ insets.top = max(0.0, listNodeSize.height - visibleItemsHeight)
+
+ let (duration, curve) = listViewAnimationDurationAndCurve(transition: transition)
+ let updateSizeAndInsets = ListViewUpdateSizeAndInsets(size: listNodeSize, 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.listNode, frame: CGRect(origin: CGPoint(x: 0.0, y: listTopInset), size: listNodeSize))
+
+ transition.updateFrame(node: self.headerBackgroundNode, frame: CGRect(x: 0.0, y: 0.0, width: layout.size.width, height: 68.0))
+
+ let titleSize = self.titleNode.updateLayout(CGSize(width: layout.size.width, height: headerHeight))
+ let titleFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - titleSize.width) / 2.0), y: 18.0), size: titleSize)
+ transition.updateFrame(node: self.titleNode, frame: titleFrame)
+
+ let editSize = self.editButton.measure(CGSize(width: layout.size.width, height: headerHeight))
+ let editFrame = CGRect(origin: CGPoint(x: 16.0, y: 18.0), size: editSize)
+ transition.updateFrame(node: self.editButton, frame: editFrame)
+
+ let doneSize = self.doneButton.measure(CGSize(width: layout.size.width, height: headerHeight))
+ let doneFrame = CGRect(origin: CGPoint(x: layout.size.width - doneSize.width - 16.0, y: 18.0), size: doneSize)
+ transition.updateFrame(node: self.doneButton, frame: doneFrame)
+ }
+
+ override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
+ let result = super.hitTest(point, with: event)
+
+ if result === self.headerNode.view {
+ return self.view
+ }
+
+ if result === self.headerNode.view {
+ return self.view
+ }
+
+ if !self.bounds.contains(point) {
+ return nil
+ }
+ if point.y < self.headerNode.frame.minY {
+ return self.dimNode.view
+ }
+ return result
+ }
+
+ @objc func dimTapGesture(_ recognizer: UITapGestureRecognizer) {
+ if case .ended = recognizer.state {
+ self.controller?.dismiss()
+ }
+ }
+
+ private var panGestureArguments: CGFloat?
+
+ @objc func panGesture(_ recognizer: UIPanGestureRecognizer) {
+ let contentOffset = self.listNode.visibleContentOffset()
+ switch recognizer.state {
+ case .began:
+ self.panGestureArguments = 0.0
+ case .changed:
+ var translation = recognizer.translation(in: self.contentNode.view).y
+ if let currentPanOffset = self.panGestureArguments {
+
+
+ if case let .known(value) = contentOffset, value <= 0.5 {
+ } else {
+ translation = currentPanOffset
+ }
+
+ self.panGestureArguments = translation
+ }
+
+ var bounds = self.contentNode.bounds
+ bounds.origin.y = -translation
+ bounds.origin.y = min(0.0, bounds.origin.y)
+ self.contentNode.bounds = bounds
+ case .ended:
+ let translation = recognizer.translation(in: self.contentNode.view)
+ var velocity = recognizer.velocity(in: self.contentNode.view)
+
+ if case let .known(value) = contentOffset, value > 0.0 {
+ velocity = CGPoint()
+ } else if case .unknown = contentOffset {
+ velocity = CGPoint()
+ }
+
+ var bounds = self.contentNode.bounds
+ bounds.origin.y = -translation.y
+ bounds.origin.y = min(0.0, bounds.origin.y)
+
+ self.panGestureArguments = nil
+ if bounds.minY < -60 || (bounds.minY < 0.0 && velocity.y > 300.0) {
+ self.controller?.dismiss()
+ } else {
+ var bounds = self.contentNode.bounds
+ let previousBounds = bounds
+ bounds.origin.y = 0.0
+ self.contentNode.bounds = bounds
+ self.contentNode.layer.animateBounds(from: previousBounds, to: self.contentNode.bounds, duration: 0.3, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue)
+ }
+ case .cancelled:
+ self.panGestureArguments = nil
+
+ let previousBounds = self.contentNode.bounds
+ var bounds = self.contentNode.bounds
+ bounds.origin.y = 0.0
+ self.contentNode.bounds = bounds
+ self.contentNode.layer.animateBounds(from: previousBounds, to: self.contentNode.bounds, duration: 0.3, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue)
+ default:
+ break
+ }
+ }
+
+ private func updateFloatingHeaderOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) {
+ guard let validLayout = self.validLayout else {
+ return
+ }
+
+ self.floatingHeaderOffset = offset
+
+ let layoutTopInset: CGFloat = max(validLayout.statusBarHeight ?? 0.0, validLayout.safeInsets.top)
+
+ let controlsHeight: CGFloat = 44.0
+
+ let listTopInset = layoutTopInset + controlsHeight
+
+ let rawControlsOffset = offset + listTopInset - controlsHeight
+ let controlsOffset = max(layoutTopInset, rawControlsOffset)
+ let isOverscrolling = rawControlsOffset <= layoutTopInset
+ let controlsFrame = CGRect(origin: CGPoint(x: 0.0, y: controlsOffset), size: CGSize(width: validLayout.size.width, height: controlsHeight))
+
+ let previousFrame = self.headerNode.frame
+
+ if !controlsFrame.equalTo(previousFrame) {
+ self.headerNode.frame = controlsFrame
+
+ let positionDelta = CGPoint(x: controlsFrame.minX - previousFrame.minX, y: controlsFrame.minY - previousFrame.minY)
+
+ transition.animateOffsetAdditive(node: self.headerNode, offset: positionDelta.y)
+ }
+
+// transition.updateAlpha(node: self.headerNode.separatorNode, alpha: isOverscrolling ? 1.0 : 0.0)
+
+ let backgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: controlsFrame.maxY), size: CGSize(width: validLayout.size.width, height: validLayout.size.height))
+
+ let previousBackgroundFrame = self.historyBackgroundNode.frame
+
+ if !backgroundFrame.equalTo(previousBackgroundFrame) {
+ self.historyBackgroundNode.frame = backgroundFrame
+ self.historyBackgroundContentNode.frame = CGRect(origin: CGPoint(), size: backgroundFrame.size)
+
+ let positionDelta = CGPoint(x: backgroundFrame.minX - previousBackgroundFrame.minX, y: backgroundFrame.minY - previousBackgroundFrame.minY)
+
+ transition.animateOffsetAdditive(node: self.historyBackgroundNode, offset: positionDelta.y)
+ }
+ }
+ }
+}
diff --git a/submodules/InviteLinksUI/Sources/InviteLinksGridNode.swift b/submodules/InviteLinksUI/Sources/InviteLinksGridNode.swift
new file mode 100644
index 0000000000..71f6b915a1
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/InviteLinksGridNode.swift
@@ -0,0 +1,504 @@
+import Foundation
+import UIKit
+import Display
+import AsyncDisplayKit
+import SwiftSignalKit
+import SyncCore
+import TelegramPresentationData
+import ItemListUI
+import SolidRoundedButtonNode
+import RadialStatusNode
+
+private let itemSpacing: CGFloat = 10.0
+private let titleFont = Font.semibold(17.0)
+private let subtitleFont = Font.regular(12.0)
+
+private func generateBackgroundImage(colors: NSArray) -> UIImage? {
+ return generateImage(CGSize(width: 45, height: 45), contextGenerator: { size, context in
+ let bounds = CGRect(origin: CGPoint(), size: size)
+ context.clear(bounds)
+
+ let path = UIBezierPath(roundedRect: CGRect(origin: CGPoint(), size: size), cornerRadius: 15)
+ context.addPath(path.cgPath)
+ context.clip()
+
+ var locations: [CGFloat] = [0.0, 1.0]
+ let colorSpace = CGColorSpaceCreateDeviceRGB()
+ let gradient = CGGradient(colorsSpace: colorSpace, colors: colors, locations: &locations)!
+
+ context.drawLinearGradient(gradient, start: CGPoint(), end: CGPoint(x: 0.0, y: bounds.size.height), options: CGGradientDrawingOptions())
+ })?.stretchableImage(withLeftCapWidth: 22, topCapHeight: 22)
+}
+
+func invitationAvailability(_ invite: ExportedInvitation) -> CGFloat {
+ let currentTime = Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970)
+ var availability: CGFloat = 1.0
+ if let expireDate = invite.expireDate {
+ let startDate = invite.startDate ?? invite.date
+ let fraction = CGFloat(expireDate - currentTime) / CGFloat(expireDate - startDate)
+ availability = min(fraction, availability)
+ }
+ if let usageLimit = invite.usageLimit, let count = invite.count {
+ let fraction = 1.0 - (CGFloat(count) / CGFloat(usageLimit))
+ availability = min(fraction, availability)
+ }
+ return availability
+}
+
+private class ItemNode: ASDisplayNode {
+ private let backgroundNode: ASImageNode
+
+ private let iconNode: ASImageNode
+ private var timerNode: TimerNode?
+
+ private let extractedContainerNode: ContextExtractedContentContainingNode
+ private let containerNode: ContextControllerSourceNode
+ private let buttonNode: HighlightTrackingButtonNode
+ private let buttonIconNode: ASImageNode
+
+ private let titleNode: ImmediateTextNode
+ private let subtitleNode: ImmediateTextNode
+
+ private var params: (size: CGSize, wide: Bool, invite: ExportedInvitation, presentationData: ItemListPresentationData)?
+
+ var action: (() -> Void)?
+ var contextAction: ((ASDisplayNode) -> Void)?
+
+ override init() {
+ self.backgroundNode = ASImageNode()
+ self.backgroundNode.displaysAsynchronously = false
+ self.backgroundNode.displayWithoutProcessing = true
+
+ self.iconNode = ASImageNode()
+ self.iconNode.displaysAsynchronously = false
+ self.iconNode.displayWithoutProcessing = true
+
+ self.buttonNode = HighlightTrackingButtonNode()
+ self.extractedContainerNode = ContextExtractedContentContainingNode()
+ self.containerNode = ContextControllerSourceNode()
+ self.containerNode.isGestureEnabled = false
+ self.buttonIconNode = ASImageNode()
+ self.buttonIconNode.displaysAsynchronously = false
+ self.buttonIconNode.displayWithoutProcessing = true
+ self.buttonIconNode.image = generateImage(CGSize(width: 26.0, height: 26.0), contextGenerator: { size, context in
+ context.clear(CGRect(origin: CGPoint(), size: size))
+
+ context.setFillColor(UIColor.white.cgColor)
+ context.fillEllipse(in: CGRect(origin: CGPoint(), size: size))
+
+ context.setBlendMode(.clear)
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: 4.0, y: 11.0), size: CGSize(width: 4.0, height: 4.0)))
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: 11.0, y: 11.0), size: CGSize(width: 4.0, height: 4.0)))
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: 18.0, y: 11.0), size: CGSize(width: 4.0, height: 4.0)))
+ })
+
+ self.titleNode = ImmediateTextNode()
+ self.titleNode.maximumNumberOfLines = 2
+
+ self.subtitleNode = ImmediateTextNode()
+ self.subtitleNode.maximumNumberOfLines = 1
+
+ super.init()
+
+ self.addSubnode(self.backgroundNode)
+ self.addSubnode(self.iconNode)
+
+ self.containerNode.addSubnode(self.extractedContainerNode)
+ self.extractedContainerNode.contentNode.addSubnode(self.buttonIconNode)
+ self.containerNode.targetNodeForActivationProgress = self.extractedContainerNode.contentNode
+ self.buttonNode.addSubnode(self.containerNode)
+ self.addSubnode(self.buttonNode)
+
+ self.addSubnode(self.titleNode)
+ self.addSubnode(self.subtitleNode)
+
+ self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside)
+ self.buttonNode.highligthedChanged = { [weak self] highlighted in
+ if let strongSelf = self {
+ if highlighted {
+ strongSelf.buttonIconNode.layer.removeAnimation(forKey: "opacity")
+ strongSelf.buttonIconNode.alpha = 0.4
+ } else {
+ strongSelf.buttonIconNode.alpha = 1.0
+ strongSelf.buttonIconNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2)
+ }
+ }
+ }
+ }
+
+ override func didLoad() {
+ self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:))))
+ }
+
+ @objc private func tapGesture(_ gestureRecognizer: UITapGestureRecognizer) {
+ self.action?()
+ }
+
+ @objc private func buttonPressed() {
+ self.contextAction?(self.extractedContainerNode)
+ }
+
+ func update(size: CGSize, wide: Bool, invite: ExportedInvitation, presentationData: ItemListPresentationData, transition: ContainedViewLayoutTransition) -> CGSize {
+ let updated = self.params?.size != size || self.params?.wide != wide || self.params?.invite != invite
+ self.params = (size, wide, invite, presentationData)
+
+ let currentTime = Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970)
+ let availability = invitationAvailability(invite)
+
+ var isExpired = false
+ let secondaryTextColor: UIColor
+ if invite.isRevoked {
+ self.backgroundNode.image = generateBackgroundImage(colors: [UIColor(rgb: 0xd4d8db).cgColor, UIColor(rgb: 0xced2d5).cgColor])
+ secondaryTextColor = UIColor(rgb: 0xf8f9f9)
+ } else if invite.expireDate == nil && invite.usageLimit == nil {
+ self.backgroundNode.image = generateBackgroundImage(colors: [UIColor(rgb: 0x00b5f7).cgColor, UIColor(rgb: 0x00b2f6).cgColor])
+ secondaryTextColor = UIColor(rgb: 0xa7f4ff)
+ } else if availability >= 0.5 {
+ self.backgroundNode.image = generateBackgroundImage(colors: [UIColor(rgb: 0x4aca62).cgColor, UIColor(rgb: 0x43c85c).cgColor])
+ secondaryTextColor = UIColor(rgb: 0xc5ffe6)
+ } else if availability > 0.0 {
+ self.backgroundNode.image = generateBackgroundImage(colors: [UIColor(rgb: 0xf8a953).cgColor, UIColor(rgb: 0xf7a64e).cgColor])
+ secondaryTextColor = UIColor(rgb: 0xfeffd7)
+ } else {
+ self.backgroundNode.image = generateBackgroundImage(colors: [UIColor(rgb: 0xf2656a).cgColor, UIColor(rgb: 0xf25f65).cgColor])
+ secondaryTextColor = UIColor(rgb: 0xffd3de)
+ isExpired = true
+ }
+
+ let itemWidth = wide ? size.width : floor((size.width - itemSpacing) / 2.0)
+
+ var inviteLink = invite.link.replacingOccurrences(of: "https://", with: "")
+ if !wide {
+ inviteLink = inviteLink.replacingOccurrences(of: "joinchat/", with: "joinchat/\n")
+ inviteLink = inviteLink.replacingOccurrences(of: "join/", with: "join/\n")
+ }
+ let title: NSMutableAttributedString = NSMutableAttributedString(string: inviteLink, font: titleFont, textColor: UIColor.white)
+ if inviteLink.hasPrefix("t.me/joinchat/") {
+ title.addAttribute(NSAttributedString.Key.foregroundColor, value: secondaryTextColor, range: NSMakeRange(0, "t.me/joinchat/".count))
+ } else if inviteLink.hasPrefix("t.me/join/") {
+ title.addAttribute(NSAttributedString.Key.foregroundColor, value: secondaryTextColor, range: NSMakeRange(0, "t.me/join/".count))
+ }
+ self.titleNode.attributedText = title
+
+ var subtitleText: String = ""
+ if let count = invite.count {
+ subtitleText = presentationData.strings.InviteLink_PeopleJoinedShort(count)
+ } else {
+ subtitleText = isExpired || invite.isRevoked ? presentationData.strings.InviteLink_PeopleJoinedShortNoneExpired : presentationData.strings.InviteLink_PeopleJoinedShortNone
+ }
+ if invite.isRevoked {
+ if !subtitleText.isEmpty {
+ subtitleText += " • "
+ }
+ subtitleText += presentationData.strings.InviteLink_Revoked
+ self.iconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Links/Expired"), color: .white)
+ self.timerNode?.removeFromSupernode()
+ self.timerNode = nil
+ } else if let expireDate = invite.expireDate, currentTime > expireDate {
+ if !subtitleText.isEmpty {
+ subtitleText += " • "
+ }
+ subtitleText += presentationData.strings.InviteLink_Expired
+ self.iconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Links/Expired"), color: .white)
+ self.timerNode?.removeFromSupernode()
+ self.timerNode = nil
+ } else if let expireDate = invite.expireDate {
+ self.iconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Links/Flame"), color: .white)
+ let timerNode: TimerNode
+ if let current = self.timerNode {
+ timerNode = current
+ } else {
+ timerNode = TimerNode()
+ self.timerNode = timerNode
+ self.addSubnode(timerNode)
+ }
+ timerNode.update(color: UIColor.white, creationTimestamp: invite.date, deadlineTimestamp: expireDate)
+ } else {
+ self.iconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Links/Link"), color: .white)
+ self.timerNode?.removeFromSupernode()
+ self.timerNode = nil
+ }
+
+ self.iconNode.frame = CGRect(x: 10.0, y: 10.0, width: 30.0, height: 30.0)
+ self.timerNode?.frame = CGRect(x: 8.0, y: 8.0, width: 34.0, height: 34.0)
+
+ let subtitle: NSMutableAttributedString = NSMutableAttributedString(string: subtitleText, font: subtitleFont, textColor: secondaryTextColor)
+ self.subtitleNode.attributedText = subtitle
+
+ let titleSize = self.titleNode.updateLayout(CGSize(width: itemWidth - 24.0, height: 100.0))
+ let subtitleSize = self.subtitleNode.updateLayout(CGSize(width: itemWidth - 24.0, height: 100.0))
+
+ self.titleNode.frame = CGRect(origin: CGPoint(x: 12.0, y: 52.0), size: titleSize)
+ self.subtitleNode.frame = CGRect(origin: CGPoint(x: 12.0, y: 52.0 + titleSize.height + 3.0), size: subtitleSize)
+
+ let itemSize = CGSize(width: itemWidth, height: wide ? 102.0 : 122.0)
+
+ let backgroundFrame = CGRect(origin: CGPoint(), size: itemSize)
+ transition.updateFrame(node: self.backgroundNode, frame: backgroundFrame)
+
+ let buttonSize = CGSize(width: 26.0, height: 26.0)
+ let buttonFrame = CGRect(origin: CGPoint(x: itemSize.width - buttonSize.width - 12.0, y: 12.0), size: buttonSize)
+ transition.updateFrame(node: self.buttonNode, frame: buttonFrame)
+
+ self.extractedContainerNode.frame = CGRect(origin: CGPoint(), size: buttonSize)
+ self.extractedContainerNode.contentRect = CGRect(origin: CGPoint(), size: buttonSize)
+ self.buttonIconNode.frame = CGRect(origin: CGPoint(), size: buttonSize)
+
+ return itemSize
+ }
+}
+
+class InviteLinksGridNode: ASDisplayNode {
+ private var items: [ExportedInvitation] = []
+ private var itemNodes: [String: ItemNode] = [:]
+
+ var action: ((ExportedInvitation) -> Void)?
+ var contextAction: ((ASDisplayNode, ExportedInvitation) -> Void)?
+
+ override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
+ let result = super.hitTest(point, with: event)
+ return result
+ }
+
+ func update(size: CGSize, safeInset: CGFloat, items: [ExportedInvitation], presentationData: ItemListPresentationData, transition: ContainedViewLayoutTransition) -> CGSize {
+ self.items = items
+
+ var contentSize: CGSize = size
+ var contentHeight: CGFloat = 0.0
+
+ let sideInset: CGFloat = 16.0 + safeInset
+
+ var validIds = Set()
+
+ for i in 0 ..< self.items.count {
+ let invite = self.items[i]
+ validIds.insert(invite.link)
+ var itemNode: ItemNode?
+ var wasAdded = false
+ if let current = self.itemNodes[invite.link] {
+ itemNode = current
+ } else {
+ wasAdded = true
+ let addedItemNode = ItemNode()
+ itemNode = addedItemNode
+ self.itemNodes[invite.link] = addedItemNode
+ self.addSubnode(addedItemNode)
+ }
+ if let itemNode = itemNode {
+ let col = CGFloat(i % 2)
+ let row = floor(CGFloat(i) / 2.0)
+ let wide = (i == self.items.count - 1 && (self.items.count % 2) != 0)
+ let itemSize = itemNode.update(size: CGSize(width: size.width - sideInset * 2.0, height: size.height), wide: wide, invite: invite, presentationData: presentationData, transition: transition)
+ var itemFrame = CGRect(origin: CGPoint(x: sideInset, y: 4.0 + row * (122.0 + itemSpacing)), size: itemSize)
+ if !wide && col > 0 {
+ itemFrame.origin.x += itemSpacing + itemSize.width
+ }
+
+ contentHeight = max(contentHeight, itemFrame.maxY + itemSpacing)
+
+ if wasAdded {
+ itemNode.frame = itemFrame
+ } else {
+ transition.updateFrame(node: itemNode, frame: itemFrame)
+ }
+ itemNode.action = { [weak self] in
+ self?.action?(invite)
+ }
+ itemNode.contextAction = { [weak self] node in
+ self?.contextAction?(node, invite)
+ }
+ }
+ }
+
+ var removeIds: [String] = []
+ for (id, _) in self.itemNodes {
+ if !validIds.contains(id) {
+ removeIds.append(id)
+ }
+ }
+ for id in removeIds {
+ if let itemNode = self.itemNodes.removeValue(forKey: id) {
+ itemNode.removeFromSupernode()
+ }
+ }
+
+ contentSize.height = contentHeight
+ return contentSize
+ }
+}
+
+private struct ContentParticle {
+ var position: CGPoint
+ var direction: CGPoint
+ var velocity: CGFloat
+ var alpha: CGFloat
+ var lifetime: Double
+ var beginTime: Double
+
+ init(position: CGPoint, direction: CGPoint, velocity: CGFloat, alpha: CGFloat, lifetime: Double, beginTime: Double) {
+ self.position = position
+ self.direction = direction
+ self.velocity = velocity
+ self.alpha = alpha
+ self.lifetime = lifetime
+ self.beginTime = beginTime
+ }
+}
+
+private final class TimerNode: ASDisplayNode {
+ private struct Params: Equatable {
+ var color: UIColor
+ var creationTimestamp: Int32
+ var deadlineTimestamp: Int32
+ }
+
+ private let hierarchyTrackingNode: HierarchyTrackingNode
+ private var inHierarchyValue: Bool = false
+
+ private var animator: ConstantDisplayLinkAnimator?
+ private let contentNode: ASDisplayNode
+ private var particles: [ContentParticle] = []
+
+ private var currentParams: Params?
+
+ var reachedTimeout: (() -> Void)?
+
+ override init() {
+ var updateInHierarchy: ((Bool) -> Void)?
+ self.hierarchyTrackingNode = HierarchyTrackingNode({ value in
+ updateInHierarchy?(value)
+ })
+
+ self.contentNode = ASDisplayNode()
+
+ super.init()
+
+ self.addSubnode(self.contentNode)
+
+ updateInHierarchy = { [weak self] value in
+ guard let strongSelf = self else {
+ return
+ }
+ strongSelf.inHierarchyValue = value
+ strongSelf.animator?.isPaused = value
+ }
+ }
+
+ deinit {
+ self.animator?.invalidate()
+ }
+
+ func update(color: UIColor, creationTimestamp: Int32, deadlineTimestamp: Int32) {
+ let params = Params(
+ color: color,
+ creationTimestamp: creationTimestamp,
+ deadlineTimestamp: deadlineTimestamp
+ )
+ self.currentParams = params
+
+ self.updateValues()
+ }
+
+ private func updateValues() {
+ guard let params = self.currentParams else {
+ return
+ }
+
+ let color = params.color
+
+ let currentTimestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970)
+ var fraction = CGFloat(params.deadlineTimestamp - currentTimestamp) / CGFloat(params.deadlineTimestamp - params.creationTimestamp)
+ fraction = 1.0 - max(0.0, min(0.94, fraction))
+
+ let image: UIImage?
+
+ let diameter: CGFloat = 26.0
+ let inset: CGFloat = 8.0
+ let lineWidth: CGFloat = 2.0
+
+ let timestamp = CACurrentMediaTime()
+
+ let center = CGPoint(x: (diameter + inset) / 2.0, y: (diameter + inset) / 2.0)
+ let radius: CGFloat = (diameter - lineWidth / 2.0) / 2.0
+
+ let startAngle: CGFloat = -CGFloat.pi / 2.0
+ let endAngle: CGFloat = -CGFloat.pi / 2.0 + 2.0 * CGFloat.pi * fraction
+
+ let v = CGPoint(x: sin(endAngle), y: -cos(endAngle))
+ let c = CGPoint(x: -v.y * radius + center.x, y: v.x * radius + center.y)
+
+ let dt: CGFloat = 1.0 / 60.0
+ var removeIndices: [Int] = []
+ for i in 0 ..< self.particles.count {
+ let currentTime = timestamp - self.particles[i].beginTime
+ if currentTime > self.particles[i].lifetime {
+ removeIndices.append(i)
+ } else {
+ let input: CGFloat = CGFloat(currentTime / self.particles[i].lifetime)
+ let decelerated: CGFloat = (1.0 - (1.0 - input) * (1.0 - input))
+ self.particles[i].alpha = 1.0 - decelerated
+
+ var p = self.particles[i].position
+ let d = self.particles[i].direction
+ let v = self.particles[i].velocity
+ p = CGPoint(x: p.x + d.x * v * dt, y: p.y + d.y * v * dt)
+ self.particles[i].position = p
+ }
+ }
+
+ for i in removeIndices.reversed() {
+ self.particles.remove(at: i)
+ }
+
+ let newParticleCount = 1
+ for _ in 0 ..< newParticleCount {
+ let degrees: CGFloat = CGFloat(arc4random_uniform(140)) - 40.0
+ let angle: CGFloat = degrees * CGFloat.pi / 180.0
+
+ let direction = CGPoint(x: v.x * cos(angle) - v.y * sin(angle), y: v.x * sin(angle) + v.y * cos(angle))
+ let velocity = (20.0 + (CGFloat(arc4random()) / CGFloat(UINT32_MAX)) * 4.0) * 0.3
+
+ let lifetime = Double(0.4 + CGFloat(arc4random_uniform(100)) * 0.01)
+
+ let particle = ContentParticle(position: c, direction: direction, velocity: velocity, alpha: 1.0, lifetime: lifetime, beginTime: timestamp)
+ self.particles.append(particle)
+ }
+
+ image = generateImage(CGSize(width: diameter + inset, height: diameter + inset), rotatedContext: { size, context in
+ context.clear(CGRect(origin: CGPoint(), size: size))
+ context.setStrokeColor(color.cgColor)
+ context.setFillColor(color.cgColor)
+ context.setLineWidth(lineWidth)
+ context.setLineCap(.round)
+
+ let path = CGMutablePath()
+ path.addArc(center: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
+ context.addPath(path)
+ context.strokePath()
+
+ for particle in self.particles {
+ let size: CGFloat = 2.0
+ context.setAlpha(particle.alpha)
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: particle.position.x - size / 2.0, y: particle.position.y - size / 2.0), size: CGSize(width: size, height: size)))
+ }
+ })
+
+ self.contentNode.contents = image?.cgImage
+ if let image = image {
+ self.contentNode.frame = CGRect(origin: CGPoint(), size: image.size)
+ }
+
+ if fraction <= .ulpOfOne {
+ self.animator?.invalidate()
+ self.animator = nil
+ } else {
+ if self.animator == nil {
+ let animator = ConstantDisplayLinkAnimator(update: { [weak self] in
+ self?.updateValues()
+ })
+ self.animator = animator
+ animator.isPaused = self.inHierarchyValue
+ }
+ }
+ }
+}
diff --git a/submodules/InviteLinksUI/Sources/ItemListDatePickerItem.swift b/submodules/InviteLinksUI/Sources/ItemListDatePickerItem.swift
new file mode 100644
index 0000000000..5d9a244caa
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/ItemListDatePickerItem.swift
@@ -0,0 +1,241 @@
+import Foundation
+import UIKit
+import Display
+import AsyncDisplayKit
+import SwiftSignalKit
+import SyncCore
+import TelegramPresentationData
+import ItemListUI
+
+public class ItemListDatePickerItem: ListViewItem, ItemListItem {
+ let presentationData: ItemListPresentationData
+ let date: Int32?
+ public let sectionId: ItemListSectionId
+ let style: ItemListStyle
+ let updated: ((Int32) -> Void)?
+ public let tag: ItemListItemTag?
+
+ public init(
+ presentationData: ItemListPresentationData,
+ date: Int32?,
+ sectionId: ItemListSectionId,
+ style: ItemListStyle,
+ updated: ((Int32) -> Void)?,
+ tag: ItemListItemTag? = nil
+ ) {
+ self.presentationData = presentationData
+ self.date = date
+ self.sectionId = sectionId
+ self.style = style
+ self.updated = updated
+ self.tag = tag
+ }
+
+ public func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) {
+ async {
+ let node = ItemListDatePickerItemNode()
+ let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+
+ node.contentSize = layout.contentSize
+ node.insets = layout.insets
+
+ Queue.mainQueue().async {
+ completion(node, {
+ return (nil, { _ in apply() })
+ })
+ }
+ }
+ }
+
+ public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
+ Queue.mainQueue().async {
+ if let nodeValue = node() as? ItemListDatePickerItemNode {
+ let makeLayout = nodeValue.asyncLayout()
+
+ async {
+ let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+ Queue.mainQueue().async {
+ completion(layout, { _ in
+ apply()
+ })
+ }
+ }
+ }
+ }
+ }
+
+ public var selectable: Bool = false
+}
+
+public class ItemListDatePickerItemNode: ListViewItemNode, ItemListItemNode {
+ private let backgroundNode: ASDisplayNode
+ private let topStripeNode: ASDisplayNode
+ private let bottomStripeNode: ASDisplayNode
+ private let maskNode: ASImageNode
+
+ private let datePicker: UIDatePicker
+
+ private var item: ItemListDatePickerItem?
+
+ override public var canBeSelected: Bool {
+ return false
+ }
+
+ public var tag: ItemListItemTag? {
+ return self.item?.tag
+ }
+
+ public init() {
+ self.backgroundNode = ASDisplayNode()
+ self.backgroundNode.isLayerBacked = true
+ self.backgroundNode.backgroundColor = .white
+
+ self.maskNode = ASImageNode()
+
+ self.topStripeNode = ASDisplayNode()
+ self.topStripeNode.isLayerBacked = true
+
+ self.bottomStripeNode = ASDisplayNode()
+ self.bottomStripeNode.isLayerBacked = true
+
+ self.datePicker = UIDatePicker()
+ self.datePicker.minimumDate = Date()
+ self.datePicker.datePickerMode = .dateAndTime
+ if #available(iOS 14.0, *) {
+ self.datePicker.preferredDatePickerStyle = .inline
+ }
+ super.init(layerBacked: false, dynamicBounce: false)
+
+ self.datePicker.addTarget(self, action: #selector(self.datePickerUpdated), for: .valueChanged)
+ }
+
+ public override func didLoad() {
+ super.didLoad()
+
+ self.view.addSubview(self.datePicker)
+ }
+
+ @objc private func datePickerUpdated() {
+ self.item?.updated?(Int32(self.datePicker.date.timeIntervalSince1970))
+ }
+
+ public func asyncLayout() -> (_ item: ItemListDatePickerItem, _ params: ListViewItemLayoutParams, _ insets: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) {
+ let currentItem = self.item
+
+ return { item, params, neighbors in
+ var updatedTheme: PresentationTheme?
+ if currentItem?.presentationData.theme !== item.presentationData.theme {
+ updatedTheme = item.presentationData.theme
+ }
+
+ let contentSize: CGSize
+ let insets: UIEdgeInsets
+ let separatorHeight = UIScreenPixel
+ let itemBackgroundColor: UIColor
+ let itemSeparatorColor: UIColor
+
+ let leftInset = 16.0 + params.leftInset
+ let rightInset = 16.0 + params.rightInset
+
+ let height: CGFloat = 360.0
+
+ switch item.style {
+ case .plain:
+ itemBackgroundColor = item.presentationData.theme.list.plainBackgroundColor
+ itemSeparatorColor = item.presentationData.theme.list.itemPlainSeparatorColor
+ contentSize = CGSize(width: params.width, height: height)
+ insets = itemListNeighborsPlainInsets(neighbors)
+ case .blocks:
+ itemBackgroundColor = item.presentationData.theme.list.itemBlocksBackgroundColor
+ itemSeparatorColor = item.presentationData.theme.list.itemBlocksSeparatorColor
+ contentSize = CGSize(width: params.width, height: height)
+ insets = itemListNeighborsGroupedInsets(neighbors)
+ }
+
+ return (ListViewItemNodeLayout(contentSize: contentSize, insets: insets), { [weak self] in
+ if let strongSelf = self {
+ strongSelf.item = item
+
+ if let _ = updatedTheme {
+ strongSelf.topStripeNode.backgroundColor = itemSeparatorColor
+ strongSelf.bottomStripeNode.backgroundColor = itemSeparatorColor
+ strongSelf.backgroundNode.backgroundColor = itemBackgroundColor
+ }
+
+ strongSelf.datePicker.date = item.date.flatMap { Date(timeIntervalSince1970: TimeInterval($0)) } ?? Date()
+ strongSelf.datePicker.frame = CGRect(origin: CGPoint(x: 16.0, y: 3.0), size: CGSize(width: contentSize.width - 32.0, height: contentSize.height))
+
+ switch item.style {
+ case .plain:
+ if strongSelf.backgroundNode.supernode != nil {
+ strongSelf.backgroundNode.removeFromSupernode()
+ }
+ if strongSelf.topStripeNode.supernode != nil {
+ strongSelf.topStripeNode.removeFromSupernode()
+ }
+ if strongSelf.bottomStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0)
+ }
+ if strongSelf.maskNode.supernode != nil {
+ strongSelf.maskNode.removeFromSupernode()
+ }
+ strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - leftInset, height: separatorHeight))
+ case .blocks:
+ if strongSelf.backgroundNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0)
+ }
+ if strongSelf.topStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1)
+ }
+ if strongSelf.bottomStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2)
+ }
+ if strongSelf.maskNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.maskNode, at: 3)
+ }
+
+ let hasCorners = itemListHasRoundedBlockLayout(params)
+ var hasTopCorners = false
+ var hasBottomCorners = false
+ switch neighbors.top {
+ case .sameSection(false):
+ strongSelf.topStripeNode.isHidden = true
+ default:
+ hasTopCorners = true
+ strongSelf.topStripeNode.isHidden = hasCorners
+ }
+ let bottomStripeInset: CGFloat
+ switch neighbors.bottom {
+ case .sameSection(false):
+ bottomStripeInset = leftInset
+ default:
+ bottomStripeInset = 0.0
+ hasBottomCorners = true
+ strongSelf.bottomStripeNode.isHidden = hasCorners
+ }
+
+ strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.presentationData.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
+
+ strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
+ strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0)
+ strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: separatorHeight))
+ strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - bottomStripeInset, height: separatorHeight))
+ }
+ }
+ })
+ }
+ }
+
+ override public func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4)
+ }
+
+ override public func animateAdded(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
+ }
+
+ override public func animateRemoved(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false)
+ }
+}
+
diff --git a/submodules/InviteLinksUI/Sources/ItemListInviteLinkDateLimitItem.swift b/submodules/InviteLinksUI/Sources/ItemListInviteLinkDateLimitItem.swift
new file mode 100644
index 0000000000..73f3d266ad
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/ItemListInviteLinkDateLimitItem.swift
@@ -0,0 +1,409 @@
+import Foundation
+import UIKit
+import Display
+import AsyncDisplayKit
+import SwiftSignalKit
+import TelegramCore
+import SyncCore
+import TelegramUIPreferences
+import TelegramPresentationData
+import LegacyComponents
+import ItemListUI
+import PresentationDataUtils
+
+enum InviteLinkTimeLimit: Equatable {
+ case hour
+ case day
+ case week
+ case unlimited
+ case custom(Int32)
+
+ init(position: Int) {
+ switch position {
+ case 0:
+ self = .hour
+ case 1:
+ self = .day
+ case 2:
+ self = .week
+ default:
+ self = .unlimited
+ }
+ }
+
+ var value: Int32? {
+ switch self {
+ case .hour:
+ return 3600
+ case .day:
+ return 86400
+ case .week:
+ return 604800
+ case .unlimited:
+ return nil
+ case let .custom(value):
+ return value
+ }
+ }
+
+ var position: Int {
+ switch self {
+ case .hour:
+ return 0
+ case .day:
+ return 1
+ case .week:
+ return 2
+ case .unlimited:
+ return 3
+ case let .custom(value):
+ let currentTime = Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970)
+ let relativeValue = value - currentTime
+ if relativeValue < 3600 {
+ return 0
+ } else if relativeValue < 86400 {
+ return 1
+ } else if relativeValue < 604800 {
+ return 2
+ } else {
+ return 3
+ }
+ }
+ }
+}
+
+final class ItemListInviteLinkTimeLimitItem: ListViewItem, ItemListItem {
+ let theme: PresentationTheme
+ let strings: PresentationStrings
+ let value: InviteLinkTimeLimit
+ let enabled: Bool
+ let sectionId: ItemListSectionId
+ let updated: (InviteLinkTimeLimit) -> Void
+
+ init(theme: PresentationTheme, strings: PresentationStrings, value: InviteLinkTimeLimit, enabled: Bool, sectionId: ItemListSectionId, updated: @escaping (InviteLinkTimeLimit) -> Void) {
+ self.theme = theme
+ self.strings = strings
+ self.value = value
+ self.enabled = enabled
+ self.sectionId = sectionId
+ self.updated = updated
+ }
+
+ func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) {
+ async {
+ let node = ItemListInviteLinkTimeLimitItemNode()
+ let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+
+ node.contentSize = layout.contentSize
+ node.insets = layout.insets
+
+ Queue.mainQueue().async {
+ completion(node, {
+ return (nil, { _ in apply() })
+ })
+ }
+ }
+ }
+
+ func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
+ Queue.mainQueue().async {
+ if let nodeValue = node() as? ItemListInviteLinkTimeLimitItemNode {
+ let makeLayout = nodeValue.asyncLayout()
+
+ async {
+ let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+ Queue.mainQueue().async {
+ completion(layout, { _ in
+ apply()
+ })
+ }
+ }
+ }
+ }
+ }
+}
+
+private func generateKnobImage() -> UIImage? {
+ return generateImage(CGSize(width: 40.0, height: 40.0), rotatedContext: { size, context in
+ context.clear(CGRect(origin: CGPoint(), size: size))
+ context.setShadow(offset: CGSize(width: 0.0, height: -2.0), blur: 3.5, color: UIColor(white: 0.0, alpha: 0.35).cgColor)
+ context.setFillColor(UIColor.white.cgColor)
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: 6.0, y: 6.0), size: CGSize(width: 28.0, height: 28.0)))
+ })
+}
+
+private final class ItemListInviteLinkTimeLimitItemNode: ListViewItemNode {
+ private let backgroundNode: ASDisplayNode
+ private let topStripeNode: ASDisplayNode
+ private let bottomStripeNode: ASDisplayNode
+ private let maskNode: ASImageNode
+
+ private let lowTextNode: TextNode
+ private let mediumTextNode: TextNode
+ private let highTextNode: TextNode
+ private let unlimitedTextNode: TextNode
+ private let customTextNode: TextNode
+ private var sliderView: TGPhotoEditorSliderView?
+
+ private var item: ItemListInviteLinkTimeLimitItem?
+ private var layoutParams: ListViewItemLayoutParams?
+
+ init() {
+ self.backgroundNode = ASDisplayNode()
+ self.backgroundNode.isLayerBacked = true
+
+ self.topStripeNode = ASDisplayNode()
+ self.topStripeNode.isLayerBacked = true
+
+ self.bottomStripeNode = ASDisplayNode()
+ self.bottomStripeNode.isLayerBacked = true
+
+ self.maskNode = ASImageNode()
+
+ self.lowTextNode = TextNode()
+ self.lowTextNode.isUserInteractionEnabled = false
+ self.lowTextNode.displaysAsynchronously = false
+
+ self.mediumTextNode = TextNode()
+ self.mediumTextNode.isUserInteractionEnabled = false
+ self.mediumTextNode.displaysAsynchronously = false
+
+ self.highTextNode = TextNode()
+ self.highTextNode.isUserInteractionEnabled = false
+ self.highTextNode.displaysAsynchronously = false
+
+ self.unlimitedTextNode = TextNode()
+ self.unlimitedTextNode.isUserInteractionEnabled = false
+ self.unlimitedTextNode.displaysAsynchronously = false
+
+ self.customTextNode = TextNode()
+ self.customTextNode.isUserInteractionEnabled = false
+ self.customTextNode.displaysAsynchronously = false
+
+ super.init(layerBacked: false, dynamicBounce: false)
+
+ self.addSubnode(self.lowTextNode)
+ self.addSubnode(self.mediumTextNode)
+ self.addSubnode(self.highTextNode)
+ self.addSubnode(self.unlimitedTextNode)
+ self.addSubnode(self.customTextNode)
+ }
+
+ func updateSliderView() {
+ if let sliderView = self.sliderView, let item = self.item {
+ if case .custom = item.value {
+ sliderView.maximumValue = 3.0 + 1
+ sliderView.positionsCount = 4 + 1
+ } else {
+ sliderView.maximumValue = 3.0
+ sliderView.positionsCount = 4
+ }
+ sliderView.value = CGFloat(item.value.position)
+
+ sliderView.isUserInteractionEnabled = item.enabled
+ sliderView.alpha = item.enabled ? 1.0 : 0.4
+ sliderView.layer.allowsGroupOpacity = !item.enabled
+ }
+ }
+
+ override func didLoad() {
+ super.didLoad()
+
+ let sliderView = TGPhotoEditorSliderView()
+ sliderView.enablePanHandling = true
+ sliderView.trackCornerRadius = 1.0
+ sliderView.lineSize = 2.0
+ sliderView.dotSize = 5.0
+ sliderView.minimumValue = 0.0
+ sliderView.startValue = 0.0
+ sliderView.disablesInteractiveTransitionGestureRecognizer = true
+ if let item = self.item, case .custom = item.value {
+ sliderView.maximumValue = 3.0 + 1
+ sliderView.positionsCount = 4 + 1
+ } else {
+ sliderView.maximumValue = 3.0
+ sliderView.positionsCount = 4
+ }
+ sliderView.useLinesForPositions = true
+ if let item = self.item, let params = self.layoutParams {
+ sliderView.value = CGFloat(item.value.position)
+ sliderView.backgroundColor = item.theme.list.itemBlocksBackgroundColor
+ sliderView.backColor = item.theme.list.disclosureArrowColor
+ sliderView.startColor = item.theme.list.disclosureArrowColor
+ sliderView.trackColor = item.theme.list.itemAccentColor
+ sliderView.knobImage = generateKnobImage()
+
+ sliderView.frame = CGRect(origin: CGPoint(x: params.leftInset + 15.0, y: 37.0), size: CGSize(width: params.width - params.leftInset - params.rightInset - 15.0 * 2.0, height: 44.0))
+ sliderView.hitTestEdgeInsets = UIEdgeInsets(top: -sliderView.frame.minX, left: 0.0, bottom: 0.0, right: -sliderView.frame.minX)
+ }
+ self.view.addSubview(sliderView)
+ sliderView.addTarget(self, action: #selector(self.sliderValueChanged), for: .valueChanged)
+ self.sliderView = sliderView
+
+ self.updateSliderView()
+ }
+
+ func asyncLayout() -> (_ item: ItemListInviteLinkTimeLimitItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) {
+ let currentItem = self.item
+ let makeLowTextLayout = TextNode.asyncLayout(self.lowTextNode)
+ let makeMediumTextLayout = TextNode.asyncLayout(self.mediumTextNode)
+ let makeHighTextLayout = TextNode.asyncLayout(self.highTextNode)
+ let makeUnlimitedTextLayout = TextNode.asyncLayout(self.unlimitedTextNode)
+ let makeCustomTextLayout = TextNode.asyncLayout(self.customTextNode)
+
+ return { item, params, neighbors in
+ var themeUpdated = false
+ if currentItem?.theme !== item.theme {
+ themeUpdated = true
+ }
+
+ let contentSize: CGSize
+ let insets: UIEdgeInsets
+ let separatorHeight = UIScreenPixel
+
+ let (lowTextLayout, lowTextApply) = makeLowTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: timeIntervalString(strings: item.strings, value: 3600), font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
+
+ let (mediumTextLayout, mediumTextApply) = makeMediumTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: timeIntervalString(strings: item.strings, value: 86400), font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
+
+ let (highTextLayout, highTextApply) = makeHighTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: timeIntervalString(strings: item.strings, value: 604800), font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
+
+ let (unlimitedTextLayout, unlimitedTextApply) = makeUnlimitedTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.strings.InviteLink_Create_TimeLimitNoLimit, font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
+
+ let customTextString: String
+ if case let .custom(value) = item.value {
+ let currentTime = Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970)
+ let relativeValue = value - currentTime
+ if relativeValue > 0 {
+ customTextString = timeIntervalString(strings: item.strings, value: relativeValue)
+ } else {
+ customTextString = ""
+ }
+ } else {
+ customTextString = ""
+ }
+
+ let (customTextLayout, customTextApply) = makeCustomTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: customTextString, font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
+
+ contentSize = CGSize(width: params.width, height: 88.0)
+ insets = itemListNeighborsGroupedInsets(neighbors)
+
+ let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets)
+ let layoutSize = layout.size
+
+ return (layout, { [weak self] in
+ if let strongSelf = self {
+ strongSelf.item = item
+ strongSelf.layoutParams = params
+
+ strongSelf.backgroundNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor
+ strongSelf.topStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
+ strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
+
+ if strongSelf.backgroundNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0)
+ }
+ if strongSelf.topStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1)
+ }
+ if strongSelf.bottomStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2)
+ }
+ if strongSelf.maskNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.maskNode, at: 3)
+ }
+
+ let hasCorners = itemListHasRoundedBlockLayout(params)
+ var hasTopCorners = false
+ var hasBottomCorners = false
+ switch neighbors.top {
+ case .sameSection(false):
+ strongSelf.topStripeNode.isHidden = true
+ default:
+ hasTopCorners = true
+ strongSelf.topStripeNode.isHidden = hasCorners
+ }
+ let bottomStripeInset: CGFloat
+ let bottomStripeOffset: CGFloat
+ switch neighbors.bottom {
+ case .sameSection(false):
+ bottomStripeInset = 0.0 //params.leftInset + 16.0
+ bottomStripeOffset = -separatorHeight
+ default:
+ bottomStripeInset = 0.0
+ bottomStripeOffset = 0.0
+ hasBottomCorners = true
+ strongSelf.bottomStripeNode.isHidden = hasCorners
+ }
+
+ strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
+
+ strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
+ strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0)
+ strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: layoutSize.width, height: separatorHeight))
+ strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height + bottomStripeOffset), size: CGSize(width: layoutSize.width - bottomStripeInset, height: separatorHeight))
+
+ let _ = lowTextApply()
+ let _ = mediumTextApply()
+ let _ = highTextApply()
+ let _ = unlimitedTextApply()
+ let _ = customTextApply()
+
+ var textNodes: [(TextNode, CGSize)] = [(strongSelf.lowTextNode, lowTextLayout.size),
+ (strongSelf.mediumTextNode, mediumTextLayout.size),
+ (strongSelf.highTextNode, highTextLayout.size),
+ (strongSelf.unlimitedTextNode, unlimitedTextLayout.size)]
+ if case .custom = item.value {
+ textNodes.insert((strongSelf.customTextNode, customTextLayout.size), at: item.value.position)
+ }
+
+ let delta = (params.width - params.leftInset - params.rightInset - 18.0 * 2.0) / CGFloat(textNodes.count - 1)
+ for i in 0 ..< textNodes.count {
+ let (textNode, textSize) = textNodes[i]
+
+ var position = params.leftInset + 18.0 + delta * CGFloat(i)
+ if i == textNodes.count - 1 {
+ position -= textSize.width
+ } else if i > 0 {
+ position -= textSize.width / 2.0
+ }
+
+ textNode.frame = CGRect(origin: CGPoint(x: position, y: 15.0), size: textSize)
+ }
+
+ if let sliderView = strongSelf.sliderView {
+ if themeUpdated {
+ sliderView.backgroundColor = item.theme.list.itemBlocksBackgroundColor
+ sliderView.backColor = item.theme.list.disclosureArrowColor
+ sliderView.trackColor = item.theme.list.itemAccentColor
+ sliderView.knobImage = generateKnobImage()
+ }
+
+ sliderView.frame = CGRect(origin: CGPoint(x: params.leftInset + 15.0, y: 37.0), size: CGSize(width: params.width - params.leftInset - params.rightInset - 15.0 * 2.0, height: 44.0))
+ sliderView.hitTestEdgeInsets = UIEdgeInsets(top: -sliderView.frame.minX, left: 0.0, bottom: 0.0, right: -sliderView.frame.minX)
+
+ strongSelf.updateSliderView()
+ }
+ }
+ })
+ }
+ }
+
+ override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4)
+ }
+
+ override func animateRemoved(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false)
+ }
+
+ @objc func sliderValueChanged() {
+ guard let sliderView = self.sliderView else {
+ return
+ }
+
+ let position = Int(sliderView.value)
+ let value = InviteLinkTimeLimit(position: position)
+ self.item?.updated(value)
+ }
+}
+
diff --git a/submodules/InviteLinksUI/Sources/ItemListInviteLinkGridItem.swift b/submodules/InviteLinksUI/Sources/ItemListInviteLinkGridItem.swift
new file mode 100644
index 0000000000..0e587b8db2
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/ItemListInviteLinkGridItem.swift
@@ -0,0 +1,253 @@
+import Foundation
+import UIKit
+import Display
+import AsyncDisplayKit
+import SwiftSignalKit
+import SyncCore
+import TelegramPresentationData
+import ItemListUI
+
+public class ItemListInviteLinkGridItem: ListViewItem, ItemListItem {
+ let presentationData: ItemListPresentationData
+ let invites: [ExportedInvitation]?
+ public let sectionId: ItemListSectionId
+ let style: ItemListStyle
+ let tapAction: ((ExportedInvitation) -> Void)?
+ let contextAction: ((ExportedInvitation, ASDisplayNode) -> Void)?
+ public let tag: ItemListItemTag?
+
+ public init(
+ presentationData: ItemListPresentationData,
+ invites: [ExportedInvitation]?,
+ sectionId: ItemListSectionId,
+ style: ItemListStyle,
+ tapAction: ((ExportedInvitation) -> Void)?,
+ contextAction: ((ExportedInvitation, ASDisplayNode) -> Void)?,
+ tag: ItemListItemTag? = nil
+ ) {
+ self.presentationData = presentationData
+ self.invites = invites
+ self.sectionId = sectionId
+ self.style = style
+ self.tapAction = tapAction
+ self.contextAction = contextAction
+ self.tag = tag
+ }
+
+ public func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) {
+ async {
+ let node = ItemListInviteLinkGridItemNode()
+ let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+
+ node.contentSize = layout.contentSize
+ node.insets = layout.insets
+
+ Queue.mainQueue().async {
+ completion(node, {
+ return (nil, { _ in apply() })
+ })
+ }
+ }
+ }
+
+ public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
+ Queue.mainQueue().async {
+ if let nodeValue = node() as? ItemListInviteLinkGridItemNode {
+ let makeLayout = nodeValue.asyncLayout()
+
+ async {
+ let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+ Queue.mainQueue().async {
+ completion(layout, { _ in
+ apply()
+ })
+ }
+ }
+ }
+ }
+ }
+
+ public var selectable: Bool = false
+
+ public func selected(listView: ListView){
+ }
+}
+
+public class ItemListInviteLinkGridItemNode: ListViewItemNode, ItemListItemNode {
+ private let backgroundNode: ASDisplayNode
+ private let topStripeNode: ASDisplayNode
+ private let bottomStripeNode: ASDisplayNode
+ private let maskNode: ASImageNode
+
+ private let gridNode: InviteLinksGridNode
+
+ private var item: ItemListInviteLinkGridItem?
+
+ override public var canBeSelected: Bool {
+ return false
+ }
+
+ public var tag: ItemListItemTag? {
+ return self.item?.tag
+ }
+
+ public init() {
+ self.backgroundNode = ASDisplayNode()
+ self.backgroundNode.isLayerBacked = true
+ self.backgroundNode.backgroundColor = .white
+
+ self.maskNode = ASImageNode()
+
+ self.topStripeNode = ASDisplayNode()
+ self.topStripeNode.isLayerBacked = true
+
+ self.bottomStripeNode = ASDisplayNode()
+ self.bottomStripeNode.isLayerBacked = true
+
+ self.gridNode = InviteLinksGridNode()
+
+ super.init(layerBacked: false, dynamicBounce: false)
+
+ self.addSubnode(self.gridNode)
+ }
+
+ public func asyncLayout() -> (_ item: ItemListInviteLinkGridItem, _ params: ListViewItemLayoutParams, _ insets: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) {
+ let currentItem = self.item
+
+ return { item, params, neighbors in
+ var updatedTheme: PresentationTheme?
+ if currentItem?.presentationData.theme !== item.presentationData.theme {
+ updatedTheme = item.presentationData.theme
+ }
+
+ let contentSize: CGSize
+ let insets: UIEdgeInsets
+ let separatorHeight = UIScreenPixel
+ let itemBackgroundColor: UIColor
+ let itemSeparatorColor: UIColor
+
+ let leftInset = 16.0 + params.leftInset
+ let rightInset = 16.0 + params.rightInset
+
+ var height: CGFloat
+ let count = item.invites?.count ?? 0
+ if count > 0 {
+ if count % 2 == 0 {
+ height = 4.0 + 122.0 + 6.0
+ } else {
+ height = 4.0 + 102.0 + 6.0
+ }
+ } else {
+ height = 0.001
+ }
+
+ switch item.style {
+ case .plain:
+ itemBackgroundColor = item.presentationData.theme.list.plainBackgroundColor
+ itemSeparatorColor = item.presentationData.theme.list.itemPlainSeparatorColor
+ insets = itemListNeighborsPlainInsets(neighbors)
+ case .blocks:
+ itemBackgroundColor = item.presentationData.theme.list.itemBlocksBackgroundColor
+ itemSeparatorColor = item.presentationData.theme.list.itemBlocksSeparatorColor
+ insets = itemListNeighborsGroupedInsets(neighbors)
+ }
+ if case .sameSection(false) = neighbors.bottom {
+ } else {
+ height += 6.0
+ }
+ contentSize = CGSize(width: params.width, height: height)
+
+ return (ListViewItemNodeLayout(contentSize: contentSize, insets: insets), { [weak self] in
+ if let strongSelf = self {
+ strongSelf.item = item
+
+ if let _ = updatedTheme {
+ strongSelf.topStripeNode.backgroundColor = itemSeparatorColor
+ strongSelf.bottomStripeNode.backgroundColor = itemSeparatorColor
+ strongSelf.backgroundNode.backgroundColor = itemBackgroundColor
+ }
+
+ let gridSize = strongSelf.gridNode.update(size: contentSize, safeInset: params.leftInset, items: item.invites ?? [], presentationData: item.presentationData, transition: .immediate)
+ strongSelf.gridNode.frame = CGRect(origin: CGPoint(), size: gridSize)
+ strongSelf.gridNode.action = { invite in
+ item.tapAction?(invite)
+ }
+ strongSelf.gridNode.contextAction = { node, invite in
+ item.contextAction?(invite, node)
+ }
+
+ switch item.style {
+ case .plain:
+ if strongSelf.backgroundNode.supernode != nil {
+ strongSelf.backgroundNode.removeFromSupernode()
+ }
+ if strongSelf.topStripeNode.supernode != nil {
+ strongSelf.topStripeNode.removeFromSupernode()
+ }
+ if strongSelf.bottomStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0)
+ }
+ if strongSelf.maskNode.supernode != nil {
+ strongSelf.maskNode.removeFromSupernode()
+ }
+ strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - leftInset, height: separatorHeight))
+ case .blocks:
+ if strongSelf.backgroundNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0)
+ }
+ if strongSelf.topStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1)
+ }
+ if strongSelf.bottomStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2)
+ }
+ if strongSelf.maskNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.maskNode, at: 3)
+ }
+
+ let hasCorners = itemListHasRoundedBlockLayout(params)
+ var hasTopCorners = false
+ var hasBottomCorners = false
+ switch neighbors.top {
+ case .sameSection(false):
+ strongSelf.topStripeNode.isHidden = true
+ default:
+ hasTopCorners = true
+ strongSelf.topStripeNode.isHidden = hasCorners
+ }
+ let bottomStripeInset: CGFloat
+ switch neighbors.bottom {
+ case .sameSection(false):
+ bottomStripeInset = leftInset
+ strongSelf.bottomStripeNode.isHidden = true
+ default:
+ bottomStripeInset = 0.0
+ hasBottomCorners = true
+ strongSelf.bottomStripeNode.isHidden = hasCorners
+ }
+
+ strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.presentationData.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
+
+ strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
+ strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0)
+ strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: separatorHeight))
+ strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - bottomStripeInset, height: separatorHeight))
+ }
+ }
+ })
+ }
+ }
+
+ override public func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4)
+ }
+
+ override public func animateAdded(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
+ }
+
+ override public func animateRemoved(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false)
+ }
+}
+
diff --git a/submodules/InviteLinksUI/Sources/ItemListInviteLinkUsageLimitItem.swift b/submodules/InviteLinksUI/Sources/ItemListInviteLinkUsageLimitItem.swift
new file mode 100644
index 0000000000..2d6a5cfe68
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/ItemListInviteLinkUsageLimitItem.swift
@@ -0,0 +1,415 @@
+import Foundation
+import UIKit
+import Display
+import AsyncDisplayKit
+import SwiftSignalKit
+import TelegramCore
+import SyncCore
+import TelegramUIPreferences
+import TelegramPresentationData
+import LegacyComponents
+import ItemListUI
+import PresentationDataUtils
+
+enum InviteLinkUsageLimit: Equatable {
+ case low
+ case medium
+ case high
+ case unlimited
+ case custom(Int32)
+
+ init(position: Int) {
+ switch position {
+ case 0:
+ self = .low
+ case 1:
+ self = .medium
+ case 2:
+ self = .high
+ default:
+ self = .unlimited
+ }
+ }
+
+ init(value: Int32?) {
+ if let value = value {
+ if value == 1 {
+ self = .low
+ } else if value == 10 {
+ self = .medium
+ } else if value == 100 {
+ self = .high
+ } else {
+ self = .custom(value)
+ }
+ } else {
+ self = .unlimited
+ }
+ }
+
+ var value: Int32? {
+ switch self {
+ case .low:
+ return 1
+ case .medium:
+ return 10
+ case .high:
+ return 100
+ case .unlimited:
+ return nil
+ case let .custom(value):
+ return value
+ }
+ }
+
+ var position: Int {
+ switch self {
+ case .low:
+ return 0
+ case .medium:
+ return 1
+ case .high:
+ return 2
+ case .unlimited:
+ return 3
+ case let .custom(value):
+ if value < 10 {
+ return 1
+ } else if value < 100 {
+ return 2
+ } else {
+ return 3
+ }
+ }
+ }
+}
+
+final class ItemListInviteLinkUsageLimitItem: ListViewItem, ItemListItem {
+ let theme: PresentationTheme
+ let strings: PresentationStrings
+ let value: InviteLinkUsageLimit
+ let enabled: Bool
+ let sectionId: ItemListSectionId
+ let updated: (InviteLinkUsageLimit) -> Void
+
+ init(theme: PresentationTheme, strings: PresentationStrings, value: InviteLinkUsageLimit, enabled: Bool, sectionId: ItemListSectionId, updated: @escaping (InviteLinkUsageLimit) -> Void) {
+ self.theme = theme
+ self.strings = strings
+ self.value = value
+ self.enabled = enabled
+ self.sectionId = sectionId
+ self.updated = updated
+ }
+
+ func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) {
+ async {
+ let node = ItemListInviteLinkUsageLimitItemNode()
+ let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+
+ node.contentSize = layout.contentSize
+ node.insets = layout.insets
+
+ Queue.mainQueue().async {
+ completion(node, {
+ return (nil, { _ in apply() })
+ })
+ }
+ }
+ }
+
+ func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
+ Queue.mainQueue().async {
+ if let nodeValue = node() as? ItemListInviteLinkUsageLimitItemNode {
+ let makeLayout = nodeValue.asyncLayout()
+
+ async {
+ let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+ Queue.mainQueue().async {
+ completion(layout, { _ in
+ apply()
+ })
+ }
+ }
+ }
+ }
+ }
+}
+
+private func generateKnobImage() -> UIImage? {
+ return generateImage(CGSize(width: 40.0, height: 40.0), rotatedContext: { size, context in
+ context.clear(CGRect(origin: CGPoint(), size: size))
+ context.setShadow(offset: CGSize(width: 0.0, height: -2.0), blur: 3.5, color: UIColor(white: 0.0, alpha: 0.35).cgColor)
+ context.setFillColor(UIColor.white.cgColor)
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: 6.0, y: 6.0), size: CGSize(width: 28.0, height: 28.0)))
+ })
+}
+
+private final class ItemListInviteLinkUsageLimitItemNode: ListViewItemNode {
+ private let backgroundNode: ASDisplayNode
+ private let topStripeNode: ASDisplayNode
+ private let bottomStripeNode: ASDisplayNode
+ private let maskNode: ASImageNode
+
+ private let lowTextNode: TextNode
+ private let mediumTextNode: TextNode
+ private let highTextNode: TextNode
+ private let unlimitedTextNode: TextNode
+ private let customTextNode: TextNode
+ private var sliderView: TGPhotoEditorSliderView?
+
+ private var item: ItemListInviteLinkUsageLimitItem?
+ private var layoutParams: ListViewItemLayoutParams?
+
+ init() {
+ self.backgroundNode = ASDisplayNode()
+ self.backgroundNode.isLayerBacked = true
+
+ self.topStripeNode = ASDisplayNode()
+ self.topStripeNode.isLayerBacked = true
+
+ self.bottomStripeNode = ASDisplayNode()
+ self.bottomStripeNode.isLayerBacked = true
+
+ self.maskNode = ASImageNode()
+
+ self.lowTextNode = TextNode()
+ self.lowTextNode.isUserInteractionEnabled = false
+ self.lowTextNode.displaysAsynchronously = false
+
+ self.mediumTextNode = TextNode()
+ self.mediumTextNode.isUserInteractionEnabled = false
+ self.mediumTextNode.displaysAsynchronously = false
+
+ self.highTextNode = TextNode()
+ self.highTextNode.isUserInteractionEnabled = false
+ self.highTextNode.displaysAsynchronously = false
+
+ self.unlimitedTextNode = TextNode()
+ self.unlimitedTextNode.isUserInteractionEnabled = false
+ self.unlimitedTextNode.displaysAsynchronously = false
+
+ self.customTextNode = TextNode()
+ self.customTextNode.isUserInteractionEnabled = false
+ self.customTextNode.displaysAsynchronously = false
+
+ super.init(layerBacked: false, dynamicBounce: false)
+
+ self.addSubnode(self.lowTextNode)
+ self.addSubnode(self.mediumTextNode)
+ self.addSubnode(self.highTextNode)
+ self.addSubnode(self.unlimitedTextNode)
+ self.addSubnode(self.customTextNode)
+ }
+
+ func updateSliderView() {
+ if let sliderView = self.sliderView, let item = self.item {
+ if case .custom = item.value {
+ sliderView.maximumValue = 3.0 + 1
+ sliderView.positionsCount = 4 + 1
+ } else {
+ sliderView.maximumValue = 3.0
+ sliderView.positionsCount = 4
+ }
+ sliderView.value = CGFloat(item.value.position)
+
+ sliderView.isUserInteractionEnabled = item.enabled
+ sliderView.alpha = item.enabled ? 1.0 : 0.4
+ sliderView.layer.allowsGroupOpacity = !item.enabled
+ }
+ }
+
+ override func didLoad() {
+ super.didLoad()
+
+ let sliderView = TGPhotoEditorSliderView()
+ sliderView.enablePanHandling = true
+ sliderView.trackCornerRadius = 1.0
+ sliderView.lineSize = 2.0
+ sliderView.dotSize = 5.0
+ sliderView.minimumValue = 0.0
+ sliderView.startValue = 0.0
+ sliderView.disablesInteractiveTransitionGestureRecognizer = true
+ if let item = self.item, case .custom = item.value {
+ sliderView.maximumValue = 3.0 + 1
+ sliderView.positionsCount = 4 + 1
+ } else {
+ sliderView.maximumValue = 3.0
+ sliderView.positionsCount = 4
+ }
+ sliderView.useLinesForPositions = true
+ if let item = self.item, let params = self.layoutParams {
+ sliderView.value = CGFloat(item.value.position)
+ sliderView.backgroundColor = item.theme.list.itemBlocksBackgroundColor
+ sliderView.backColor = item.theme.list.disclosureArrowColor
+ sliderView.startColor = item.theme.list.disclosureArrowColor
+ sliderView.trackColor = item.theme.list.itemAccentColor
+ sliderView.knobImage = generateKnobImage()
+
+ sliderView.frame = CGRect(origin: CGPoint(x: params.leftInset + 15.0, y: 37.0), size: CGSize(width: params.width - params.leftInset - params.rightInset - 15.0 * 2.0, height: 44.0))
+ sliderView.hitTestEdgeInsets = UIEdgeInsets(top: -sliderView.frame.minX, left: 0.0, bottom: 0.0, right: -sliderView.frame.minX)
+ }
+ self.view.addSubview(sliderView)
+ sliderView.addTarget(self, action: #selector(self.sliderValueChanged), for: .valueChanged)
+ self.sliderView = sliderView
+
+ self.updateSliderView()
+ }
+
+ func asyncLayout() -> (_ item: ItemListInviteLinkUsageLimitItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) {
+ let currentItem = self.item
+ let makeLowTextLayout = TextNode.asyncLayout(self.lowTextNode)
+ let makeMediumTextLayout = TextNode.asyncLayout(self.mediumTextNode)
+ let makeHighTextLayout = TextNode.asyncLayout(self.highTextNode)
+ let makeUnlimitedTextLayout = TextNode.asyncLayout(self.unlimitedTextNode)
+ let makeCustomTextLayout = TextNode.asyncLayout(self.customTextNode)
+
+ return { item, params, neighbors in
+ var themeUpdated = false
+ if currentItem?.theme !== item.theme {
+ themeUpdated = true
+ }
+
+ let contentSize: CGSize
+ let insets: UIEdgeInsets
+ let separatorHeight = UIScreenPixel
+
+ let (lowTextLayout, lowTextApply) = makeLowTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "1", font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
+
+ let (mediumTextLayout, mediumTextApply) = makeMediumTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "10", font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
+
+ let (highTextLayout, highTextApply) = makeHighTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "100", font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
+
+ let (unlimitedTextLayout, unlimitedTextApply) = makeUnlimitedTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.strings.InviteLink_Create_UsersLimitNoLimit, font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
+
+ let customTextString: String
+ if case let .custom(value) = item.value {
+ customTextString = "\(value)"
+ } else {
+ customTextString = ""
+ }
+
+ let (customTextLayout, customTextApply) = makeCustomTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: customTextString, font: Font.regular(13.0), textColor: item.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets()))
+
+ contentSize = CGSize(width: params.width, height: 88.0)
+ insets = itemListNeighborsGroupedInsets(neighbors)
+
+ let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets)
+ let layoutSize = layout.size
+
+ return (layout, { [weak self] in
+ if let strongSelf = self {
+ strongSelf.item = item
+ strongSelf.layoutParams = params
+
+ strongSelf.backgroundNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor
+ strongSelf.topStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
+ strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
+
+ if strongSelf.backgroundNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0)
+ }
+ if strongSelf.topStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1)
+ }
+ if strongSelf.bottomStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2)
+ }
+ if strongSelf.maskNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.maskNode, at: 3)
+ }
+
+ let hasCorners = itemListHasRoundedBlockLayout(params)
+ var hasTopCorners = false
+ var hasBottomCorners = false
+ switch neighbors.top {
+ case .sameSection(false):
+ strongSelf.topStripeNode.isHidden = true
+ default:
+ hasTopCorners = true
+ strongSelf.topStripeNode.isHidden = hasCorners
+ }
+ let bottomStripeInset: CGFloat
+ let bottomStripeOffset: CGFloat
+ switch neighbors.bottom {
+ case .sameSection(false):
+ bottomStripeInset = 0.0 //params.leftInset + 16.0
+ bottomStripeOffset = -separatorHeight
+ default:
+ bottomStripeInset = 0.0
+ bottomStripeOffset = 0.0
+ hasBottomCorners = true
+ strongSelf.bottomStripeNode.isHidden = hasCorners
+ }
+
+ strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
+
+ strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
+ strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0)
+ strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: layoutSize.width, height: separatorHeight))
+ strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height + bottomStripeOffset), size: CGSize(width: layoutSize.width - bottomStripeInset, height: separatorHeight))
+
+ let _ = lowTextApply()
+ let _ = mediumTextApply()
+ let _ = highTextApply()
+ let _ = unlimitedTextApply()
+ let _ = customTextApply()
+
+ var textNodes: [(TextNode, CGSize)] = [(strongSelf.lowTextNode, lowTextLayout.size),
+ (strongSelf.mediumTextNode, mediumTextLayout.size),
+ (strongSelf.highTextNode, highTextLayout.size),
+ (strongSelf.unlimitedTextNode, unlimitedTextLayout.size)]
+ if case .custom = item.value {
+ textNodes.insert((strongSelf.customTextNode, customTextLayout.size), at: item.value.position)
+ }
+
+ let delta = (params.width - params.leftInset - params.rightInset - 18.0 * 2.0) / CGFloat(textNodes.count - 1)
+ for i in 0 ..< textNodes.count {
+ let (textNode, textSize) = textNodes[i]
+
+ var position = params.leftInset + 18.0 + delta * CGFloat(i)
+ if i == textNodes.count - 1 {
+ position -= textSize.width
+ } else if i > 0 {
+ position -= textSize.width / 2.0
+ }
+
+ textNode.frame = CGRect(origin: CGPoint(x: position, y: 15.0), size: textSize)
+ }
+
+ if let sliderView = strongSelf.sliderView {
+ if themeUpdated {
+ sliderView.backgroundColor = item.theme.list.itemBlocksBackgroundColor
+ sliderView.backColor = item.theme.list.disclosureArrowColor
+ sliderView.trackColor = item.theme.list.itemAccentColor
+ sliderView.knobImage = generateKnobImage()
+ }
+
+ sliderView.frame = CGRect(origin: CGPoint(x: params.leftInset + 15.0, y: 37.0), size: CGSize(width: params.width - params.leftInset - params.rightInset - 15.0 * 2.0, height: 44.0))
+ sliderView.hitTestEdgeInsets = UIEdgeInsets(top: -sliderView.frame.minX, left: 0.0, bottom: 0.0, right: -sliderView.frame.minX)
+
+ strongSelf.updateSliderView()
+ }
+ }
+ })
+ }
+ }
+
+ override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4)
+ }
+
+ override func animateRemoved(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false)
+ }
+
+ @objc func sliderValueChanged() {
+ guard let sliderView = self.sliderView else {
+ return
+ }
+
+ let position = Int(sliderView.value)
+ let value = InviteLinkUsageLimit(position: position)
+ self.item?.updated(value)
+ }
+}
+
diff --git a/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift b/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift
new file mode 100644
index 0000000000..a96a635119
--- /dev/null
+++ b/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift
@@ -0,0 +1,451 @@
+import Foundation
+import UIKit
+import Display
+import AsyncDisplayKit
+import SwiftSignalKit
+import Postbox
+import SyncCore
+import AccountContext
+import TelegramPresentationData
+import ItemListUI
+import SolidRoundedButtonNode
+import AnimatedAvatarSetNode
+
+private func actionButtonImage(color: UIColor) -> UIImage? {
+ return generateImage(CGSize(width: 24.0, height: 24.0), contextGenerator: { size, context in
+ context.clear(CGRect(origin: CGPoint(), size: size))
+
+ context.setFillColor(color.cgColor)
+ context.fillEllipse(in: CGRect(origin: CGPoint(), size: size))
+
+ context.setBlendMode(.clear)
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: 4.0, y: 10.0), size: CGSize(width: 4.0, height: 4.0)))
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: 10.0, y: 10.0), size: CGSize(width: 4.0, height: 4.0)))
+ context.fillEllipse(in: CGRect(origin: CGPoint(x: 16.0, y: 10.0), size: CGSize(width: 4.0, height: 4.0)))
+ })
+}
+
+public class ItemListPermanentInviteLinkItem: ListViewItem, ItemListItem {
+ let context: AccountContext
+ let presentationData: ItemListPresentationData
+ let invite: ExportedInvitation?
+ let peers: [Peer]
+ let buttonColor: UIColor?
+ public let sectionId: ItemListSectionId
+ let style: ItemListStyle
+ let shareAction: (() -> Void)?
+ let contextAction: ((ASDisplayNode) -> Void)?
+ let viewAction: (() -> Void)?
+ public let tag: ItemListItemTag?
+
+ public init(
+ context: AccountContext,
+ presentationData: ItemListPresentationData,
+ invite: ExportedInvitation?,
+ peers: [Peer],
+ buttonColor: UIColor?,
+ sectionId: ItemListSectionId,
+ style: ItemListStyle,
+ shareAction: (() -> Void)?,
+ contextAction: ((ASDisplayNode) -> Void)?,
+ viewAction: (() -> Void)?,
+ tag: ItemListItemTag? = nil
+ ) {
+ self.context = context
+ self.presentationData = presentationData
+ self.invite = invite
+ self.peers = peers
+ self.buttonColor = buttonColor
+ self.sectionId = sectionId
+ self.style = style
+ self.shareAction = shareAction
+ self.contextAction = contextAction
+ self.viewAction = viewAction
+ self.tag = tag
+ }
+
+ public func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) {
+ async {
+ let node = ItemListPermanentInviteLinkItemNode()
+ let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+
+ node.contentSize = layout.contentSize
+ node.insets = layout.insets
+
+ Queue.mainQueue().async {
+ completion(node, {
+ return (nil, { _ in apply() })
+ })
+ }
+ }
+ }
+
+ public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
+ Queue.mainQueue().async {
+ if let nodeValue = node() as? ItemListPermanentInviteLinkItemNode {
+ let makeLayout = nodeValue.asyncLayout()
+
+ async {
+ let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
+ Queue.mainQueue().async {
+ completion(layout, { _ in
+ apply()
+ })
+ }
+ }
+ }
+ }
+ }
+
+ public var selectable: Bool = false
+}
+
+public class ItemListPermanentInviteLinkItemNode: ListViewItemNode, ItemListItemNode {
+ private let backgroundNode: ASDisplayNode
+ private let topStripeNode: ASDisplayNode
+ private let bottomStripeNode: ASDisplayNode
+ private let maskNode: ASImageNode
+
+ private let fieldNode: ASImageNode
+ private let addressNode: TextNode
+ private let extractedContainerNode: ContextExtractedContentContainingNode
+ private let containerNode: ContextControllerSourceNode
+ private let addressButtonNode: HighlightTrackingButtonNode
+ private let addressButtonIconNode: ASImageNode
+ private var shareButtonNode: SolidRoundedButtonNode?
+
+ private let avatarsButtonNode: HighlightTrackingButtonNode
+ private let avatarsContext: AnimatedAvatarSetContext
+ private var avatarsContent: AnimatedAvatarSetContext.Content?
+ private let avatarsNode: AnimatedAvatarSetNode
+ private let invitedPeersNode: TextNode
+
+ private let activateArea: AccessibilityAreaNode
+
+ private var item: ItemListPermanentInviteLinkItem?
+
+ override public var canBeSelected: Bool {
+ return false
+ }
+
+ public var tag: ItemListItemTag? {
+ return self.item?.tag
+ }
+
+ public init() {
+ self.backgroundNode = ASDisplayNode()
+ self.backgroundNode.isLayerBacked = true
+ self.backgroundNode.backgroundColor = .white
+
+ self.maskNode = ASImageNode()
+
+ self.topStripeNode = ASDisplayNode()
+ self.topStripeNode.isLayerBacked = true
+
+ self.bottomStripeNode = ASDisplayNode()
+ self.bottomStripeNode.isLayerBacked = true
+
+ self.fieldNode = ASImageNode()
+ self.fieldNode.displaysAsynchronously = false
+ self.fieldNode.displayWithoutProcessing = true
+
+ self.addressNode = TextNode()
+ self.addressNode.isUserInteractionEnabled = false
+
+ self.addressButtonNode = HighlightTrackingButtonNode()
+ self.extractedContainerNode = ContextExtractedContentContainingNode()
+ self.containerNode = ContextControllerSourceNode()
+ self.containerNode.isGestureEnabled = false
+ self.addressButtonIconNode = ASImageNode()
+ self.addressButtonIconNode.displaysAsynchronously = false
+ self.addressButtonIconNode.displayWithoutProcessing = true
+
+ self.avatarsButtonNode = HighlightTrackingButtonNode()
+ self.avatarsContext = AnimatedAvatarSetContext()
+ self.avatarsNode = AnimatedAvatarSetNode()
+ self.invitedPeersNode = TextNode()
+
+ self.activateArea = AccessibilityAreaNode()
+
+ super.init(layerBacked: false, dynamicBounce: false)
+
+ self.addSubnode(self.fieldNode)
+ self.addSubnode(self.addressNode)
+ self.addSubnode(self.avatarsNode)
+ self.addSubnode(self.invitedPeersNode)
+ self.addSubnode(self.avatarsButtonNode)
+
+ self.containerNode.addSubnode(self.extractedContainerNode)
+ self.extractedContainerNode.contentNode.addSubnode(self.addressButtonIconNode)
+ self.containerNode.targetNodeForActivationProgress = self.extractedContainerNode.contentNode
+ self.addressButtonNode.addSubnode(self.containerNode)
+ self.addSubnode(self.addressButtonNode)
+
+ self.addSubnode(self.activateArea)
+
+ self.addressButtonNode.addTarget(self, action: #selector(self.addressButtonPressed), forControlEvents: .touchUpInside)
+ self.addressButtonNode.highligthedChanged = { [weak self] highlighted in
+ if let strongSelf = self {
+ if highlighted {
+ strongSelf.addressButtonIconNode.layer.removeAnimation(forKey: "opacity")
+ strongSelf.addressButtonIconNode.alpha = 0.4
+ } else {
+ strongSelf.addressButtonIconNode.alpha = 1.0
+ strongSelf.addressButtonIconNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2)
+ }
+ }
+ }
+ self.shareButtonNode?.pressed = { [weak self] in
+ if let strongSelf = self, let item = strongSelf.item {
+ item.shareAction?()
+ }
+ }
+ self.avatarsButtonNode.highligthedChanged = { [weak self] highlighted in
+ if let strongSelf = self {
+ if highlighted {
+ strongSelf.avatarsNode.layer.removeAnimation(forKey: "opacity")
+ strongSelf.invitedPeersNode.layer.removeAnimation(forKey: "opacity")
+ strongSelf.avatarsNode.alpha = 0.4
+ strongSelf.invitedPeersNode.alpha = 0.4
+ } else {
+ strongSelf.avatarsNode.alpha = 1.0
+ strongSelf.invitedPeersNode.alpha = 1.0
+ strongSelf.avatarsNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2)
+ strongSelf.invitedPeersNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2)
+ }
+ }
+ }
+ self.avatarsButtonNode.addTarget(self, action: #selector(self.avatarsButtonPressed), forControlEvents: .touchUpInside)
+ }
+
+ @objc private func addressButtonPressed() {
+ if let item = self.item {
+ item.contextAction?(self.extractedContainerNode)
+ }
+ }
+
+ @objc private func avatarsButtonPressed() {
+ if let item = self.item {
+ item.viewAction?()
+ }
+ }
+
+ public func asyncLayout() -> (_ item: ItemListPermanentInviteLinkItem, _ params: ListViewItemLayoutParams, _ insets: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) {
+ let makeAddressLayout = TextNode.asyncLayout(self.addressNode)
+ let makeInvitedPeersLayout = TextNode.asyncLayout(self.invitedPeersNode)
+
+ let currentItem = self.item
+ let avatarsContext = self.avatarsContext
+
+ return { item, params, neighbors in
+ var updatedTheme: PresentationTheme?
+ if currentItem?.presentationData.theme !== item.presentationData.theme {
+ updatedTheme = item.presentationData.theme
+ }
+
+ let contentSize: CGSize
+ let insets: UIEdgeInsets
+ let separatorHeight = UIScreenPixel
+ let itemBackgroundColor: UIColor
+ let itemSeparatorColor: UIColor
+
+ let leftInset = 16.0 + params.leftInset
+ let rightInset = 16.0 + params.rightInset
+
+ let titleColor: UIColor
+ titleColor = item.presentationData.theme.list.itemPrimaryTextColor
+
+ let titleFont = Font.regular(item.presentationData.fontSize.itemListBaseFontSize)
+
+ let (addressLayout, addressApply) = makeAddressLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.invite.flatMap({ $0.link.replacingOccurrences(of: "https://", with: "") }) ?? "", font: titleFont, textColor: titleColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - params.rightInset - 20.0 - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
+
+ let subtitle: String
+ let subtitleColor: UIColor
+ if let count = item.invite?.count {
+ if count > 0 {
+ subtitle = item.presentationData.strings.InviteLink_PeopleJoined(count)
+ subtitleColor = item.presentationData.theme.list.itemAccentColor
+ } else {
+ subtitle = item.presentationData.strings.InviteLink_PeopleJoinedNone
+ subtitleColor = item.presentationData.theme.list.itemSecondaryTextColor
+ }
+ } else {
+ subtitle = item.presentationData.strings.InviteLink_PeopleJoinedNone
+ subtitleColor = item.presentationData.theme.list.itemSecondaryTextColor
+ }
+
+ let (invitedPeersLayout, invitedPeersApply) = makeInvitedPeersLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: subtitle, font: titleFont, textColor: subtitleColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - params.rightInset - 20.0 - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
+
+ let avatarsContent = avatarsContext.update(peers: item.peers, animated: false)
+
+ let verticalInset: CGFloat = 16.0
+ let fieldHeight: CGFloat = 52.0
+ let fieldSpacing: CGFloat = 16.0
+ let buttonHeight: CGFloat = 50.0
+
+ var height = verticalInset * 2.0 + fieldHeight + fieldSpacing + buttonHeight + 54.0
+
+ switch item.style {
+ case .plain:
+ height -= 57.0
+ itemBackgroundColor = item.presentationData.theme.list.plainBackgroundColor
+ itemSeparatorColor = .clear
+ insets = UIEdgeInsets()
+ case .blocks:
+ itemBackgroundColor = item.presentationData.theme.list.itemBlocksBackgroundColor
+ itemSeparatorColor = item.presentationData.theme.list.itemBlocksSeparatorColor
+ insets = itemListNeighborsGroupedInsets(neighbors)
+ }
+ contentSize = CGSize(width: params.width, height: height)
+
+ let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets)
+
+ return (ListViewItemNodeLayout(contentSize: contentSize, insets: insets), { [weak self] in
+ if let strongSelf = self {
+ strongSelf.item = item
+ strongSelf.avatarsContent = avatarsContent
+
+ strongSelf.activateArea.frame = CGRect(origin: CGPoint(x: params.leftInset, y: 0.0), size: CGSize(width: params.width - params.leftInset - params.rightInset, height: layout.contentSize.height))
+// strongSelf.activateArea.accessibilityLabel = item.title
+// strongSelf.activateArea.accessibilityValue = item.label
+ strongSelf.activateArea.accessibilityTraits = []
+
+ if let _ = updatedTheme {
+ strongSelf.topStripeNode.backgroundColor = itemSeparatorColor
+ strongSelf.bottomStripeNode.backgroundColor = itemSeparatorColor
+ strongSelf.backgroundNode.backgroundColor = itemBackgroundColor
+ strongSelf.fieldNode.image = generateStretchableFilledCircleImage(diameter: 18.0, color: item.presentationData.theme.list.freePlainInputField.backgroundColor)
+ strongSelf.addressButtonIconNode.image = actionButtonImage(color: item.presentationData.theme.list.freePlainInputField.controlColor)
+ }
+
+ let _ = addressApply()
+ let _ = invitedPeersApply()
+
+ switch item.style {
+ case .plain:
+ if strongSelf.backgroundNode.supernode != nil {
+ strongSelf.backgroundNode.removeFromSupernode()
+ }
+ if strongSelf.topStripeNode.supernode != nil {
+ strongSelf.topStripeNode.removeFromSupernode()
+ }
+ if strongSelf.bottomStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0)
+ }
+ if strongSelf.maskNode.supernode != nil {
+ strongSelf.maskNode.removeFromSupernode()
+ }
+ strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - leftInset, height: separatorHeight))
+ case .blocks:
+ if strongSelf.backgroundNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0)
+ }
+ if strongSelf.topStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1)
+ }
+ if strongSelf.bottomStripeNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2)
+ }
+ if strongSelf.maskNode.supernode == nil {
+ strongSelf.insertSubnode(strongSelf.maskNode, at: 3)
+ }
+
+ let hasCorners = itemListHasRoundedBlockLayout(params)
+ var hasTopCorners = false
+ var hasBottomCorners = false
+ switch neighbors.top {
+ case .sameSection(false):
+ strongSelf.topStripeNode.isHidden = true
+ default:
+ hasTopCorners = true
+ strongSelf.topStripeNode.isHidden = hasCorners
+ }
+ let bottomStripeInset: CGFloat
+ switch neighbors.bottom {
+ case .sameSection(false):
+ bottomStripeInset = leftInset
+ default:
+ bottomStripeInset = 0.0
+ hasBottomCorners = true
+ strongSelf.bottomStripeNode.isHidden = hasCorners
+ }
+
+ strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.presentationData.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
+
+ strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
+ strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0)
+ strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: separatorHeight))
+ strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - bottomStripeInset, height: separatorHeight))
+ }
+
+ let fieldFrame = CGRect(origin: CGPoint(x: leftInset, y: verticalInset), size: CGSize(width: params.width - leftInset - rightInset, height: fieldHeight))
+ strongSelf.fieldNode.frame = fieldFrame
+
+ strongSelf.addressNode.frame = CGRect(origin: CGPoint(x: fieldFrame.minX + floorToScreenPixels((fieldFrame.width - addressLayout.size.width) / 2.0), y: fieldFrame.minY + floorToScreenPixels((fieldFrame.height - addressLayout.size.height) / 2.0) + 1.0), size: addressLayout.size)
+
+ strongSelf.addressButtonNode.frame = CGRect(origin: CGPoint(x: params.width - rightInset - 38.0, y: verticalInset + 14.0), size: CGSize(width: 24.0, height: 24.0))
+ strongSelf.extractedContainerNode.frame = strongSelf.addressButtonNode.bounds
+ strongSelf.extractedContainerNode.contentRect = strongSelf.addressButtonNode.bounds
+ strongSelf.addressButtonIconNode.frame = strongSelf.addressButtonNode.bounds
+
+ let shareButtonNode: SolidRoundedButtonNode
+ if let currentShareButtonNode = strongSelf.shareButtonNode {
+ shareButtonNode = currentShareButtonNode
+ } else {
+ let buttonTheme: SolidRoundedButtonTheme
+ if let buttonColor = item.buttonColor {
+ buttonTheme = SolidRoundedButtonTheme(backgroundColor: buttonColor, foregroundColor: item.presentationData.theme.list.itemCheckColors.foregroundColor)
+ } else {
+ buttonTheme = SolidRoundedButtonTheme(theme: item.presentationData.theme)
+ }
+ shareButtonNode = SolidRoundedButtonNode(theme: buttonTheme, height: 50.0, cornerRadius: 10.0)
+ shareButtonNode.title = item.presentationData.strings.InviteLink_Share
+ shareButtonNode.pressed = {
+ item.shareAction?()
+ }
+ strongSelf.addSubnode(shareButtonNode)
+ strongSelf.shareButtonNode = shareButtonNode
+ }
+
+ let buttonWidth = contentSize.width - leftInset - rightInset
+ let _ = shareButtonNode.updateLayout(width: buttonWidth, transition: .immediate)
+ shareButtonNode.frame = CGRect(x: leftInset, y: verticalInset + fieldHeight + fieldSpacing, width: buttonWidth, height: buttonHeight)
+
+ var totalWidth = invitedPeersLayout.size.width
+ var leftOrigin: CGFloat = floorToScreenPixels((params.width - invitedPeersLayout.size.width) / 2.0)
+ let avatarSpacing: CGFloat = 21.0
+ if let avatarsContent = strongSelf.avatarsContent {
+ let avatarsSize = strongSelf.avatarsNode.update(context: item.context, content: avatarsContent, itemSize: CGSize(width: 32.0, height: 32.0), animated: true, synchronousLoad: true)
+
+ if !avatarsSize.width.isZero {
+ totalWidth += avatarsSize.width + avatarSpacing
+ }
+
+ let avatarsNodeFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((params.width - totalWidth) / 2.0), y: fieldFrame.maxY + 87.0), size: avatarsSize)
+ strongSelf.avatarsNode.frame = avatarsNodeFrame
+ if !avatarsSize.width.isZero {
+ leftOrigin = avatarsNodeFrame.maxX + avatarSpacing
+ }
+ }
+
+ strongSelf.invitedPeersNode.frame = CGRect(origin: CGPoint(x: leftOrigin, y: fieldFrame.maxY + 92.0), size: invitedPeersLayout.size)
+
+ strongSelf.avatarsButtonNode.frame = CGRect(x: floorToScreenPixels((params.width - totalWidth) / 2.0), y: fieldFrame.maxY + 87.0, width: totalWidth, height: 32.0)
+ strongSelf.avatarsButtonNode.isUserInteractionEnabled = !item.peers.isEmpty
+ }
+ })
+ }
+ }
+
+ override public func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4)
+ }
+
+ override public func animateAdded(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
+ }
+
+ override public func animateRemoved(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false)
+ }
+}
diff --git a/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift b/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift
index 429045ced4..bed1fb9b22 100644
--- a/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift
+++ b/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift
@@ -22,17 +22,19 @@ public class ItemListPeerActionItem: ListViewItem, ItemListItem {
let icon: UIImage?
let title: String
public let alwaysPlain: Bool
+ let hasSeparator: Bool
let editing: Bool
let height: ItemListPeerActionItemHeight
let color: ItemListPeerActionItemColor
public let sectionId: ItemListSectionId
let action: (() -> Void)?
- public init(presentationData: ItemListPresentationData, icon: UIImage?, title: String, alwaysPlain: Bool = false, sectionId: ItemListSectionId, height: ItemListPeerActionItemHeight = .peerList, color: ItemListPeerActionItemColor = .accent, editing: Bool, action: (() -> Void)?) {
+ public init(presentationData: ItemListPresentationData, icon: UIImage?, title: String, alwaysPlain: Bool = false, hasSeparator: Bool = true, sectionId: ItemListSectionId, height: ItemListPeerActionItemHeight = .peerList, color: ItemListPeerActionItemColor = .accent, editing: Bool, action: (() -> Void)?) {
self.presentationData = presentationData
self.icon = icon
self.title = title
self.alwaysPlain = alwaysPlain
+ self.hasSeparator = hasSeparator
self.editing = editing
self.height = height
self.color = color
@@ -257,6 +259,8 @@ class ItemListPeerActionItemNode: ListViewItemNode {
strongSelf.bottomStripeNode.isHidden = hasCorners
}
+ strongSelf.bottomStripeNode.isHidden = strongSelf.bottomStripeNode.isHidden || !item.hasSeparator
+
strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.presentationData.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight)))
diff --git a/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift b/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift
index c45b9769f7..52e80d7863 100644
--- a/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift
+++ b/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift
@@ -29,6 +29,11 @@ public enum ItemListSingleLineInputClearType: Equatable {
}
}
+public enum ItemListSingleLineInputAlignment {
+ case `default`
+ case right
+}
+
public class ItemListSingleLineInputItem: ListViewItem, ItemListItem {
let presentationData: ItemListPresentationData
let title: NSAttributedString
@@ -36,6 +41,7 @@ public class ItemListSingleLineInputItem: ListViewItem, ItemListItem {
let placeholder: String
let type: ItemListSingleLineInputItemType
let returnKeyType: UIReturnKeyType
+ let alignment: ItemListSingleLineInputAlignment
let spacing: CGFloat
let clearType: ItemListSingleLineInputClearType
let maxLength: Int
@@ -49,13 +55,14 @@ public class ItemListSingleLineInputItem: ListViewItem, ItemListItem {
let cleared: (() -> Void)?
public let tag: ItemListItemTag?
- public init(presentationData: ItemListPresentationData, title: NSAttributedString, text: String, placeholder: String, type: ItemListSingleLineInputItemType = .regular(capitalization: true, autocorrection: true), returnKeyType: UIReturnKeyType = .`default`, spacing: CGFloat = 0.0, clearType: ItemListSingleLineInputClearType = .none, maxLength: Int = 0, enabled: Bool = true, tag: ItemListItemTag? = nil, sectionId: ItemListSectionId, textUpdated: @escaping (String) -> Void, shouldUpdateText: @escaping (String) -> Bool = { _ in return true }, processPaste: ((String) -> String)? = nil, updatedFocus: ((Bool) -> Void)? = nil, action: @escaping () -> Void, cleared: (() -> Void)? = nil) {
+ public init(presentationData: ItemListPresentationData, title: NSAttributedString, text: String, placeholder: String, type: ItemListSingleLineInputItemType = .regular(capitalization: true, autocorrection: true), returnKeyType: UIReturnKeyType = .`default`, alignment: ItemListSingleLineInputAlignment = .default, spacing: CGFloat = 0.0, clearType: ItemListSingleLineInputClearType = .none, maxLength: Int = 0, enabled: Bool = true, tag: ItemListItemTag? = nil, sectionId: ItemListSectionId, textUpdated: @escaping (String) -> Void, shouldUpdateText: @escaping (String) -> Bool = { _ in return true }, processPaste: ((String) -> String)? = nil, updatedFocus: ((Bool) -> Void)? = nil, action: @escaping () -> Void, cleared: (() -> Void)? = nil) {
self.presentationData = presentationData
self.title = title
self.text = text
self.placeholder = placeholder
self.type = type
self.returnKeyType = returnKeyType
+ self.alignment = alignment
self.spacing = spacing
self.clearType = clearType
self.maxLength = maxLength
@@ -325,6 +332,13 @@ public class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDeleg
strongSelf.textNode.frame = CGRect(origin: CGPoint(x: leftInset + titleLayout.size.width + item.spacing, y: 1.0), size: CGSize(width: max(1.0, params.width - (leftInset + rightInset + titleLayout.size.width + item.spacing)), height: layout.contentSize.height - 2.0))
+ switch item.alignment {
+ case .default:
+ strongSelf.textNode.textField.textAlignment = .natural
+ case .right:
+ strongSelf.textNode.textField.textAlignment = .right
+ }
+
if let image = updatedClearIcon {
strongSelf.clearIconNode.image = image
}
diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGClipboardGalleryMixin.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGClipboardGalleryMixin.h
index 04c7c032e0..56f8622698 100644
--- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGClipboardGalleryMixin.h
+++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGClipboardGalleryMixin.h
@@ -16,12 +16,15 @@
@property (nonatomic, copy) void (^didTransitionOut)();
@property (nonatomic, copy) UIView *(^referenceViewForItem)(TGClipboardGalleryPhotoItem *);
-@property (nonatomic, copy) void (^completeWithItem)(TGClipboardGalleryPhotoItem *item);
+@property (nonatomic, copy) void (^completeWithItem)(TGClipboardGalleryPhotoItem *item, bool silentPosting, int32_t scheduleTime);
@property (nonatomic, copy) void (^editorOpened)(void);
@property (nonatomic, copy) void (^editorClosed)(void);
-- (instancetype)initWithContext:(id)context image:(UIImage *)image images:(NSArray *)images parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext stickersContext:(id)stickersContext hasCaptions:(bool)hasCaptions hasTimer:(bool)hasTimer recipientName:(NSString *)recipientName;
+@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t));
+@property (nonatomic, copy) void (^presentTimerController)(void (^)(int32_t));
+
+- (instancetype)initWithContext:(id)context image:(UIImage *)image images:(NSArray *)images parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext stickersContext:(id)stickersContext hasCaptions:(bool)hasCaptions hasTimer:(bool)hasTimer hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule reminder:(bool)reminder recipientName:(NSString *)recipientName;
- (void)present;
diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGClipboardMenu.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGClipboardMenu.h
index efe8a725ea..847cf4193b 100644
--- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGClipboardMenu.h
+++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGClipboardMenu.h
@@ -14,7 +14,7 @@
@interface TGClipboardMenu : NSObject
-+ (TGMenuSheetController *)presentInParentController:(TGViewController *)parentController context:(id)context images:(NSArray *)images hasCaption:(bool)hasCaption hasTimer:(bool)hasTimer recipientName:(NSString *)recipientName suggestionContext:(TGSuggestionContext *)suggestionContext stickersContext:(id)stickersContext completed:(void (^)(TGMediaSelectionContext *selectionContext, TGMediaEditingContext *editingContext, id currentItem))completed dismissed:(void (^)(void))dismissed sourceView:(UIView *)sourceView sourceRect:(CGRect (^)(void))sourceRect;
++ (TGMenuSheetController *)presentInParentController:(TGViewController *)parentController context:(id)context images:(NSArray *)images hasCaption:(bool)hasCaption hasTimer:(bool)hasTimer hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule reminder:(bool)reminder recipientName:(NSString *)recipientName suggestionContext:(TGSuggestionContext *)suggestionContext stickersContext:(id)stickersContext presentScheduleController:(void (^)(void(^)(int32_t)))presentScheduleController presentTimerController:(void (^)(void(^)(int32_t)))presentTimerController completed:(void (^)(TGMediaSelectionContext *selectionContext, TGMediaEditingContext *editingContext, id currentItem, bool silentPosting, int32_t scheduleTime))completed dismissed:(void (^)(void))dismissed sourceView:(UIView *)sourceView sourceRect:(CGRect (^)(void))sourceRect;
+ (NSArray *)resultSignalsForSelectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext currentItem:(id)currentItem descriptionGenerator:(id (^)(id, NSString *, NSArray *, NSString *))descriptionGenerator;
diff --git a/submodules/LegacyComponents/Sources/TGClipboardGalleryMixin.m b/submodules/LegacyComponents/Sources/TGClipboardGalleryMixin.m
index 2e8a48022f..f0881f4d1d 100644
--- a/submodules/LegacyComponents/Sources/TGClipboardGalleryMixin.m
+++ b/submodules/LegacyComponents/Sources/TGClipboardGalleryMixin.m
@@ -2,6 +2,8 @@
#import
+#import "LegacyComponentsInternal.h"
+
#import
#import "TGClipboardGalleryPhotoItem.h"
#import "TGClipboardGalleryModel.h"
@@ -15,6 +17,8 @@
#import
#import
+#import "TGMediaPickerSendActionSheetController.h"
+
@interface TGClipboardGalleryMixin ()
{
TGMediaEditingContext *_editingContext;
@@ -35,7 +39,7 @@
@implementation TGClipboardGalleryMixin
-- (instancetype)initWithContext:(id)context image:(UIImage *)image images:(NSArray *)images parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext stickersContext:(id)stickersContext hasCaptions:(bool)hasCaptions hasTimer:(bool)hasTimer recipientName:(NSString *)recipientName
+- (instancetype)initWithContext:(id)context image:(UIImage *)image images:(NSArray *)images parentController:(TGViewController *)parentController thumbnailImage:(UIImage *)thumbnailImage selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext suggestionContext:(TGSuggestionContext *)suggestionContext stickersContext:(id)stickersContext hasCaptions:(bool)hasCaptions hasTimer:(bool)hasTimer hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule reminder:(bool)reminder recipientName:(NSString *)recipientName
{
self = [super init];
if (self != nil)
@@ -109,7 +113,96 @@
strongSelf->_galleryModel.dismiss(true, false);
if (strongSelf.completeWithItem != nil)
- strongSelf.completeWithItem((TGClipboardGalleryPhotoItem *)item);
+ strongSelf.completeWithItem((TGClipboardGalleryPhotoItem *)item, false, 0);
+ };
+
+ model.interfaceView.doneLongPressed = ^(id item) {
+ __strong TGClipboardGalleryMixin *strongSelf = weakSelf;
+ if (strongSelf == nil || !(hasSilentPosting || hasSchedule))
+ return;
+
+ if (iosMajorVersion() >= 10) {
+ UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium];
+ [generator impactOccurred];
+ }
+
+ bool effectiveHasSchedule = hasSchedule;
+ for (id item in strongSelf->_galleryModel.selectionContext.selectedItems)
+ {
+ if ([item isKindOfClass:[TGMediaAsset class]])
+ {
+ if ([[strongSelf->_editingContext timerForItem:item] integerValue] > 0)
+ {
+ effectiveHasSchedule = false;
+ break;
+ }
+ }
+ }
+
+ TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context isDark:true sendButtonFrame:strongSelf.galleryModel.interfaceView.doneButtonFrame canSendSilently:hasSilentPosting canSchedule:effectiveHasSchedule reminder:reminder hasTimer:hasTimer];
+ controller.send = ^{
+ __strong TGClipboardGalleryMixin *strongSelf = weakSelf;
+ if (strongSelf == nil)
+ return;
+
+ strongSelf->_galleryModel.dismiss(true, false);
+
+ if (strongSelf.completeWithItem != nil)
+ strongSelf.completeWithItem((TGClipboardGalleryPhotoItem *)item, false, 0);
+ };
+ controller.sendSilently = ^{
+ __strong TGClipboardGalleryMixin *strongSelf = weakSelf;
+ if (strongSelf == nil)
+ return;
+
+ strongSelf->_galleryModel.dismiss(true, false);
+
+ if (strongSelf.completeWithItem != nil)
+ strongSelf.completeWithItem((TGClipboardGalleryPhotoItem *)item, true, 0);
+ };
+ controller.schedule = ^{
+ __strong TGClipboardGalleryMixin *strongSelf = weakSelf;
+ if (strongSelf == nil)
+ return;
+
+ strongSelf.presentScheduleController(^(int32_t time) {
+ __strong TGClipboardGalleryMixin *strongSelf = weakSelf;
+ if (strongSelf == nil)
+ return;
+
+ strongSelf->_galleryModel.dismiss(true, false);
+
+ if (strongSelf.completeWithItem != nil)
+ strongSelf.completeWithItem((TGClipboardGalleryPhotoItem *)item, false, time);
+ });
+ };
+ controller.sendWithTimer = ^{
+ __strong TGClipboardGalleryMixin *strongSelf = weakSelf;
+ if (strongSelf == nil)
+ return;
+
+ strongSelf.presentTimerController(^(int32_t time) {
+ __strong TGClipboardGalleryMixin *strongSelf = weakSelf;
+ if (strongSelf == nil)
+ return;
+
+ strongSelf->_galleryModel.dismiss(true, false);
+
+ TGMediaEditingContext *editingContext = strongSelf->_editingContext;
+ NSMutableArray *items = [strongSelf->_galleryModel.selectionContext.selectedItems mutableCopy];
+ [items addObject:((TGClipboardGalleryPhotoItem *)item).image];
+
+ for (id editableItem in items) {
+ [editingContext setTimer:@(time) forItem:editableItem];
+ }
+
+ if (strongSelf.completeWithItem != nil)
+ strongSelf.completeWithItem((TGClipboardGalleryPhotoItem *)item, false, 0);
+ });
+ };
+
+ TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithManager:[strongSelf->_context makeOverlayWindowManager] parentController:strongSelf->_parentController contentController:controller];
+ controllerWindow.hidden = false;
};
modernGallery.model = model;
diff --git a/submodules/LegacyComponents/Sources/TGClipboardMenu.m b/submodules/LegacyComponents/Sources/TGClipboardMenu.m
index 219383885d..f9be4fdcfc 100644
--- a/submodules/LegacyComponents/Sources/TGClipboardMenu.m
+++ b/submodules/LegacyComponents/Sources/TGClipboardMenu.m
@@ -9,7 +9,7 @@
@implementation TGClipboardMenu
-+ (TGMenuSheetController *)presentInParentController:(TGViewController *)parentController context:(id)context images:(NSArray *)images hasCaption:(bool)hasCaption hasTimer:(bool)hasTimer recipientName:(NSString *)recipientName suggestionContext:(TGSuggestionContext *)suggestionContext stickersContext:(id)stickersContext completed:(void (^)(TGMediaSelectionContext *selectionContext, TGMediaEditingContext *editingContext, id currentItem))completed dismissed:(void (^)(void))dismissed sourceView:(UIView *)sourceView sourceRect:(CGRect (^)(void))sourceRect
++ (TGMenuSheetController *)presentInParentController:(TGViewController *)parentController context:(id)context images:(NSArray *)images hasCaption:(bool)hasCaption hasTimer:(bool)hasTimer hasSilentPosting:(bool)hasSilentPosting hasSchedule:(bool)hasSchedule reminder:(bool)reminder recipientName:(NSString *)recipientName suggestionContext:(TGSuggestionContext *)suggestionContext stickersContext:(id)stickersContext presentScheduleController:(void (^)(void(^)(int32_t)))presentScheduleController presentTimerController:(void (^)(void(^)(int32_t)))presentTimerController completed:(void (^)(TGMediaSelectionContext *selectionContext, TGMediaEditingContext *editingContext, id currentItem, bool silentPosting, int32_t scheduleTime))completed dismissed:(void (^)(void))dismissed sourceView:(UIView *)sourceView sourceRect:(CGRect (^)(void))sourceRect
{
bool centered = false;
if (sourceRect == nil)
@@ -46,11 +46,16 @@
previewItem.parentController = parentController;
previewItem.allowCaptions = hasCaption;
previewItem.hasTimer = hasTimer;
+ previewItem.hasSilentPosting = hasSilentPosting;
+ previewItem.hasSchedule = hasSchedule;
+ previewItem.reminder = reminder;
previewItem.recipientName = recipientName;
- previewItem.sendPressed = ^(UIImage *currentItem)
+ previewItem.presentScheduleController = presentScheduleController;
+ previewItem.presentTimerController = presentTimerController;
+ previewItem.sendPressed = ^(UIImage *currentItem, bool silentPosting, int32_t scheduleTime)
{
__strong TGClipboardPreviewItemView *strongPreviewItem = weakPreviewItem;
- completed(strongPreviewItem.selectionContext, strongPreviewItem.editingContext, currentItem);
+ completed(strongPreviewItem.selectionContext, strongPreviewItem.editingContext, currentItem, silentPosting, scheduleTime);
__strong TGMenuSheetController *strongController = weakController;
[strongController dismissAnimated:true];
@@ -68,7 +73,7 @@
TGMenuSheetButtonItemView *sendItem = [[TGMenuSheetButtonItemView alloc] initWithTitle:sendTitle type:TGMenuSheetButtonTypeSend fontSize:20.0 action:^
{
__strong TGClipboardPreviewItemView *strongPreviewItem = weakPreviewItem;
- completed(strongPreviewItem.selectionContext, strongPreviewItem.editingContext, nil);
+ completed(strongPreviewItem.selectionContext, strongPreviewItem.editingContext, nil, false, 0);
__strong TGMenuSheetController *strongController = weakController;
[strongController dismissAnimated:true];
diff --git a/submodules/LegacyComponents/Sources/TGClipboardPreviewItemView.h b/submodules/LegacyComponents/Sources/TGClipboardPreviewItemView.h
index 076e999245..c3b5f6ef71 100644
--- a/submodules/LegacyComponents/Sources/TGClipboardPreviewItemView.h
+++ b/submodules/LegacyComponents/Sources/TGClipboardPreviewItemView.h
@@ -14,13 +14,20 @@
@property (nonatomic, assign) bool hasTimer;
@property (nonatomic, strong) NSString *recipientName;
+@property (nonatomic, assign) bool hasSchedule;
+@property (nonatomic, assign) bool hasSilentPosting;
+@property (nonatomic, assign) bool reminder;
+
@property (nonatomic, readonly) TGMediaSelectionContext *selectionContext;
@property (nonatomic, readonly) TGMediaEditingContext *editingContext;
@property (nonatomic, strong) TGSuggestionContext *suggestionContext;
@property (nonatomic, strong) id stickersContext;
@property (nonatomic, copy) void (^selectionChanged)(NSUInteger);
-@property (nonatomic, copy) void (^sendPressed)(UIImage *currentItem);
+@property (nonatomic, copy) void (^sendPressed)(UIImage *currentItem, bool silentPosting, int32_t scheduleTime);
+
+@property (nonatomic, copy) void (^presentScheduleController)(void (^)(int32_t));
+@property (nonatomic, copy) void (^presentTimerController)(void (^)(int32_t));
- (instancetype)initWithContext:(id)context images:(NSArray *)images;
diff --git a/submodules/LegacyComponents/Sources/TGClipboardPreviewItemView.m b/submodules/LegacyComponents/Sources/TGClipboardPreviewItemView.m
index eaf9060867..b36c74226d 100644
--- a/submodules/LegacyComponents/Sources/TGClipboardPreviewItemView.m
+++ b/submodules/LegacyComponents/Sources/TGClipboardPreviewItemView.m
@@ -248,12 +248,13 @@ const CGFloat TGClipboardPreviewEdgeInset = 8.0f;
strongSelf->_galleryMixin = nil;
};
+
- mixin.completeWithItem = ^(TGClipboardGalleryPhotoItem *item)
+ mixin.completeWithItem = ^(TGClipboardGalleryPhotoItem *item, bool silentPosting, int32_t scheduleTime)
{
__strong TGClipboardPreviewItemView *strongSelf = weakSelf;
if (strongSelf != nil && strongSelf.sendPressed != nil)
- strongSelf.sendPressed(item.image);
+ strongSelf.sendPressed(item.image, silentPosting, scheduleTime);
};
}
@@ -266,7 +267,9 @@ const CGFloat TGClipboardPreviewEdgeInset = 8.0f;
if ([cell isKindOfClass:[TGClipboardPreviewCell class]])
thumbnailImage = cell.imageView.image;
- TGClipboardGalleryMixin *mixin = [[TGClipboardGalleryMixin alloc] initWithContext:_context image:image images:_images parentController:self.parentController thumbnailImage:thumbnailImage selectionContext:_selectionContext editingContext:_editingContext suggestionContext:self.suggestionContext stickersContext:self.stickersContext hasCaptions:self.allowCaptions hasTimer:self.hasTimer recipientName:self.recipientName];
+ TGClipboardGalleryMixin *mixin = [[TGClipboardGalleryMixin alloc] initWithContext:_context image:image images:_images parentController:self.parentController thumbnailImage:thumbnailImage selectionContext:_selectionContext editingContext:_editingContext suggestionContext:self.suggestionContext stickersContext:self.stickersContext hasCaptions:self.allowCaptions hasTimer:self.hasTimer hasSilentPosting:self.hasSilentPosting hasSchedule:self.hasSchedule reminder:self.reminder recipientName:self.recipientName];
+ mixin.presentScheduleController = self.presentScheduleController;
+ mixin.presentTimerController = self.presentTimerController;
[self _setupGalleryMixin:mixin];
diff --git a/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m b/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m
index da2484ce0f..a9b1e07199 100644
--- a/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m
+++ b/submodules/LegacyComponents/Sources/TGMediaPickerGalleryInterfaceView.m
@@ -138,7 +138,9 @@
if (strongSelf == nil)
return;
- [strongSelf.window endEditing:true];
+ [strongSelf.window endEditing:true];
+ strongSelf->_portraitToolbarView.doneButton.userInteractionEnabled = false;
+ strongSelf->_landscapeToolbarView.doneButton.userInteractionEnabled = false;
strongSelf->_donePressed(strongSelf->_currentItem);
};
void(^toolbarDoneLongPressed)(id) = ^(id sender)
@@ -591,6 +593,8 @@
[_muteButton setImage:muteIcon forState:UIControlStateNormal];
[_muteButton setImage:muteActiveIcon forState:UIControlStateSelected];
[_muteButton setImage:muteActiveIcon forState:UIControlStateSelected | UIControlStateHighlighted];
+
+ [self setNeedsLayout];
}
- (TGPhotoEditorTab)currentTabs
diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift
index 422ce445e1..775c7fc6ca 100644
--- a/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift
+++ b/submodules/LegacyMediaPickerUI/Sources/LegacyAttachmentMenu.swift
@@ -383,7 +383,7 @@ public func legacyMenuPaletteFromTheme(_ theme: PresentationTheme) -> TGMenuShee
return TGMenuSheetPallete(dark: theme.overallDarkAppearance, backgroundColor: sheetTheme.opaqueItemBackgroundColor, selectionColor: sheetTheme.opaqueItemHighlightedBackgroundColor, separatorColor: sheetTheme.opaqueItemSeparatorColor, accentColor: sheetTheme.controlAccentColor, destructiveColor: sheetTheme.destructiveActionTextColor, textColor: sheetTheme.primaryTextColor, secondaryTextColor: sheetTheme.secondaryTextColor, spinnerColor: sheetTheme.secondaryTextColor, badgeTextColor: sheetTheme.controlAccentColor, badgeImage: nil, cornersImage: generateStretchableFilledCircleImage(diameter: 11.0, color: nil, strokeColor: nil, strokeWidth: nil, backgroundColor: sheetTheme.opaqueItemBackgroundColor))
}
-public func presentLegacyPasteMenu(context: AccountContext, peer: Peer, chatLocation: ChatLocation, saveEditedPhotos: Bool, allowGrouping: Bool, presentationData: PresentationData, images: [UIImage], sendMessagesWithSignals: @escaping ([Any]?) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, present: (ViewController, Any?) -> Void, initialLayout: ContainerViewLayout? = nil) -> ViewController {
+public func presentLegacyPasteMenu(context: AccountContext, peer: Peer, chatLocation: ChatLocation, saveEditedPhotos: Bool, allowGrouping: Bool, hasSchedule: Bool, presentationData: PresentationData, images: [UIImage], presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, present: (ViewController, Any?) -> Void, initialLayout: ContainerViewLayout? = nil) -> ViewController {
let defaultVideoPreset = defaultVideoPresetForContext(context)
UserDefaults.standard.set(defaultVideoPreset.rawValue as NSNumber, forKey: "TG_preferredVideoPreset_v0")
@@ -420,10 +420,18 @@ public func presentLegacyPasteMenu(context: AccountContext, peer: Peer, chatLoca
completion?(coder.makeData(), animated, view, rect)
})
}
-
- let controller = TGClipboardMenu.present(inParentController: emptyController, context: legacyController.context, images: images, hasCaption: true, hasTimer: hasTimer, recipientName: recipientName, suggestionContext: suggestionContext, stickersContext: paintStickersContext, completed: { selectionContext, editingContext, currentItem in
+
+ let controller = TGClipboardMenu.present(inParentController: emptyController, context: legacyController.context, images: images, hasCaption: true, hasTimer: hasTimer, hasSilentPosting: hasSilentPosting, hasSchedule: hasSchedule, reminder: peer.id == context.account.peerId, recipientName: recipientName, suggestionContext: suggestionContext, stickersContext: paintStickersContext, presentScheduleController: { done in
+ presentSchedulePicker { time in
+ done?(time)
+ }
+ }, presentTimerController: { done in
+ presentTimerPicker { time in
+ done?(time)
+ }
+ }, completed: { selectionContext, editingContext, currentItem, silentPosting, scheduleTime in
let signals = TGClipboardMenu.resultSignals(for: selectionContext, editingContext: editingContext, currentItem: currentItem, descriptionGenerator: legacyAssetPickerItemGenerator())
- sendMessagesWithSignals(signals)
+ sendMessagesWithSignals(signals, silentPosting, scheduleTime)
}, dismissed: { [weak legacyController] in
legacyController?.dismiss()
}, sourceView: emptyController.view, sourceRect: nil)!
diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift
index ee8ea08f11..cb9a18d331 100644
--- a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift
+++ b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift
@@ -296,6 +296,48 @@ public func legacyEnqueueGifMessage(account: Account, data: Data) -> Signal runOn(Queue.concurrentDefaultQueue())
}
+public func legacyEnqueueVideoMessage(account: Account, data: Data) -> Signal {
+ return Signal { subscriber in
+ if let previewImage = UIImage(data: data) {
+ let dimensions = previewImage.size
+ var previewRepresentations: [TelegramMediaImageRepresentation] = []
+
+ let thumbnailSize = dimensions.aspectFitted(CGSize(width: 320.0, height: 320.0))
+ let thumbnailImage = TGScaleImageToPixelSize(previewImage, thumbnailSize)!
+ if let thumbnailData = thumbnailImage.jpegData(compressionQuality: 0.4) {
+ let resource = LocalFileMediaResource(fileId: arc4random64())
+ account.postbox.mediaBox.storeResourceData(resource.id, data: thumbnailData)
+ previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailSize), resource: resource, progressiveSizes: []))
+ }
+
+ var randomId: Int64 = 0
+ arc4random_buf(&randomId, 8)
+ let tempFilePath = NSTemporaryDirectory() + "\(randomId).mp4"
+
+ let _ = try? FileManager.default.removeItem(atPath: tempFilePath)
+ let _ = try? data.write(to: URL(fileURLWithPath: tempFilePath), options: [.atomic])
+
+ let resource = LocalFileGifMediaResource(randomId: arc4random64(), path: tempFilePath)
+ let fileName: String = "video.mp4"
+
+ let finalDimensions = TGMediaVideoConverter.dimensions(for: dimensions, adjustments: nil, preset: TGMediaVideoConversionPresetAnimation)
+
+ var fileAttributes: [TelegramMediaFileAttribute] = []
+ fileAttributes.append(.Video(duration: Int(0), size: PixelDimensions(finalDimensions), flags: [.supportsStreaming]))
+ fileAttributes.append(.FileName(fileName: fileName))
+ fileAttributes.append(.Animated)
+
+ let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: arc4random64()), partialReference: nil, resource: resource, previewRepresentations: previewRepresentations, videoThumbnails: [], immediateThumbnailData: nil, mimeType: "video/mp4", size: nil, attributes: fileAttributes)
+ subscriber.putNext(.message(text: "", attributes: [], mediaReference: .standalone(media: media), replyToMessageId: nil, localGroupingKey: nil))
+ subscriber.putCompletion()
+ } else {
+ subscriber.putError(Void())
+ }
+
+ return EmptyDisposable
+ } |> runOn(Queue.concurrentDefaultQueue())
+}
+
public func legacyAssetPickerEnqueueMessages(account: Account, signals: [Any]) -> Signal<[EnqueueMessage], Void> {
return Signal { subscriber in
let disposable = SSignal.combineSignals(signals).start(next: { anyValues in
diff --git a/submodules/LocationUI/Sources/LocationSectionHeaderItem.swift b/submodules/LocationUI/Sources/LocationSectionHeaderItem.swift
index 8674611913..0d138c093f 100644
--- a/submodules/LocationUI/Sources/LocationSectionHeaderItem.swift
+++ b/submodules/LocationUI/Sources/LocationSectionHeaderItem.swift
@@ -1,7 +1,6 @@
import Foundation
import UIKit
import AsyncDisplayKit
-import Postbox
import Display
import SwiftSignalKit
import TelegramPresentationData
diff --git a/submodules/MtProtoKit/Sources/MTApiEnvironment.m b/submodules/MtProtoKit/Sources/MTApiEnvironment.m
index e6e67a701e..f8dd947b67 100644
--- a/submodules/MtProtoKit/Sources/MTApiEnvironment.m
+++ b/submodules/MtProtoKit/Sources/MTApiEnvironment.m
@@ -10,88 +10,10 @@
#import
-#define IFPGA_NAMESTRING @"iFPGA"
-
-#define IPHONE_1G_NAMESTRING @"iPhone 1G"
-#define IPHONE_3G_NAMESTRING @"iPhone 3G"
-#define IPHONE_3GS_NAMESTRING @"iPhone 3GS"
-#define IPHONE_4_NAMESTRING @"iPhone 4"
-#define IPHONE_4S_NAMESTRING @"iPhone 4S"
-#define IPHONE_5_NAMESTRING @"iPhone 5"
-#define IPHONE_5S_NAMESTRING @"iPhone 5S"
-#define IPHONE_6_NAMESTRING @"iPhone 6"
-#define IPHONE_6Plus_NAMESTRING @"iPhone 6 Plus"
-#define IPHONE_6S_NAMESTRING @"iPhone 6S"
-#define IPHONE_6SPlus_NAMESTRING @"iPhone 6S Plus"
-#define IPHONE_7_NAMESTRING @"iPhone 7"
-#define IPHONE_7Plus_NAMESTRING @"iPhone 7 Plus"
-#define IPHONE_8_NAMESTRING @"iPhone 8"
-#define IPHONE_8Plus_NAMESTRING @"iPhone 8 Plus"
-#define IPHONE_X_NAMESTRING @"iPhone X"
-#define IPHONE_SE_NAMESTRING @"iPhone SE"
-#define IPHONE_SE2_NAMESTRING @"iPhone SE (2nd gen)"
-#define IPHONE_XS_NAMESTRING @"iPhone XS"
-#define IPHONE_XSMAX_NAMESTRING @"iPhone XS Max"
-#define IPHONE_XR_NAMESTRING @"iPhone XR"
-#define IPHONE_11_NAMESTRING @"iPhone 11"
-#define IPHONE_11PRO_NAMESTRING @"iPhone 11 Pro"
-#define IPHONE_11PROMAX_NAMESTRING @"iPhone 11 Pro Max"
-#define IPHONE_12MINI_NAMESTRING @"iPhone 12 mini"
-#define IPHONE_12_NAMESTRING @"iPhone 12"
-#define IPHONE_12PRO_NAMESTRING @"iPhone 12 Pro"
-#define IPHONE_12PROMAX_NAMESTRING @"iPhone 12 Pro Max"
-
-#define IPHONE_UNKNOWN_NAMESTRING @"Unknown iPhone"
-
-#define IPOD_1G_NAMESTRING @"iPod touch 1G"
-#define IPOD_2G_NAMESTRING @"iPod touch 2G"
-#define IPOD_3G_NAMESTRING @"iPod touch 3G"
-#define IPOD_4G_NAMESTRING @"iPod touch 4G"
-#define IPOD_5G_NAMESTRING @"iPod touch 5G"
-#define IPOD_6G_NAMESTRING @"iPod touch 6G"
-#define IPOD_7G_NAMESTRING @"iPod touch 7G"
-#define IPOD_UNKNOWN_NAMESTRING @"Unknown iPod"
-
-#define IPAD_1G_NAMESTRING @"iPad 1G"
-#define IPAD_2G_NAMESTRING @"iPad 2G"
-#define IPAD_3G_NAMESTRING @"iPad 3G"
-#define IPAD_4G_NAMESTRING @"iPad 4G"
-#define IPAD_5G_NAMESTRING @"iPad Air 2"
-#define IPAD_6G_NAMESTRING @"iPad Pro"
-#define IPAD_PRO_3G_NAMESTRING @"iPad Pro 12.9 inch (3rd gen)"
-#define IPAD_PRO_11_NAMESTRING @"iPad Pro 11 inch"
-#define IPAD_PRO_6G_NAMESTRING @"iPad (6th gen)"
-#define IPAD_PRO_10_5_NAMESTRING @"iPad Pro 10.5 inch"
-#define IPAD_PRO_12_9_NAMESTRING @"iPad Pro 12.9 inch"
-#define IPAD_UNKNOWN_NAMESTRING @"Unknown iPad"
-
-#define APPLETV_2G_NAMESTRING @"Apple TV 2G"
-#define APPLETV_3G_NAMESTRING @"Apple TV 3G"
-#define APPLETV_4G_NAMESTRING @"Apple TV 4G"
-#define APPLETV_UNKNOWN_NAMESTRING @"Unknown Apple TV"
-
-#define IOS_FAMILY_UNKNOWN_DEVICE @"Unknown iOS device"
-
-#define SIMULATOR_NAMESTRING @"iPhone Simulator"
-#define SIMULATOR_IPHONE_NAMESTRING @"iPhone Simulator"
-#define SIMULATOR_IPAD_NAMESTRING @"iPad Simulator"
-#define SIMULATOR_APPLETV_NAMESTRING @"Apple TV Simulator"
-
-/*
- iPad8,5, iPad8,6, iPad8,7, iPad8,8 - iPad Pro 12.9" (3rd gen)
- iPad8,1, iPad8,2, iPad8,3, iPad8,4 - iPad Pro 11"
- iPad7,5, iPad7,6 - iPad 6th gen
- iPad7,3, iPad7,4 - iPad Pro 10.5"
- iPad7,1, iPad7,2 - iPad Pro 12.9" (2ng gen)
- */
-
typedef enum {
UIDeviceUnknown,
UIDeviceSimulator,
- UIDeviceSimulatoriPhone,
- UIDeviceSimulatoriPad,
- UIDeviceSimulatorAppleTV,
UIDevice1GiPhone,
UIDevice3GiPhone,
@@ -157,15 +79,6 @@ typedef enum {
} UIDevicePlatform;
-typedef enum {
- UIDeviceFamilyiPhone,
- UIDeviceFamilyiPod,
- UIDeviceFamilyiPad,
- UIDeviceFamilyAppleTV,
- UIDeviceFamilyUnknown,
-
-} UIDeviceFamily;
-
static NSData * _Nullable parseHexString(NSString * _Nonnull hex) {
if ([hex length] % 2 != 0) {
return nil;
@@ -587,79 +500,213 @@ NSString *suffix = @"";
- (NSString *)platformString
{
- switch ([self platformType])
- {
- case UIDevice1GiPhone: return IPHONE_1G_NAMESTRING;
- case UIDevice3GiPhone: return IPHONE_3G_NAMESTRING;
- case UIDevice3GSiPhone: return IPHONE_3GS_NAMESTRING;
- case UIDevice4iPhone: return IPHONE_4_NAMESTRING;
- case UIDevice4SiPhone: return IPHONE_4S_NAMESTRING;
- case UIDevice5iPhone: return IPHONE_5_NAMESTRING;
- case UIDevice5SiPhone: return IPHONE_5S_NAMESTRING;
- case UIDevice6iPhone: return IPHONE_6_NAMESTRING;
- case UIDevice6PlusiPhone: return IPHONE_6Plus_NAMESTRING;
- case UIDevice6SiPhone: return IPHONE_6S_NAMESTRING;
- case UIDevice6SPlusiPhone: return IPHONE_6SPlus_NAMESTRING;
- case UIDevice7iPhone: return IPHONE_7_NAMESTRING;
- case UIDevice7PlusiPhone: return IPHONE_7Plus_NAMESTRING;
- case UIDevice8iPhone: return IPHONE_8_NAMESTRING;
- case UIDevice8PlusiPhone: return IPHONE_8Plus_NAMESTRING;
- case UIDeviceXiPhone: return IPHONE_X_NAMESTRING;
- case UIDeviceSEPhone: return IPHONE_SE_NAMESTRING;
- case UIDeviceSE2Phone: return IPHONE_SE2_NAMESTRING;
- case UIDeviceXSiPhone: return IPHONE_XS_NAMESTRING;
- case UIDeviceXSMaxiPhone: return IPHONE_XSMAX_NAMESTRING;
- case UIDeviceXRiPhone: return IPHONE_XR_NAMESTRING;
- case UIDevice11iPhone: return IPHONE_11_NAMESTRING;
- case UIDevice11ProiPhone: return IPHONE_11PRO_NAMESTRING;
- case UIDevice11ProMaxiPhone: return IPHONE_11PROMAX_NAMESTRING;
- case UIDevice12MiniiPhone: return IPHONE_12MINI_NAMESTRING;
- case UIDevice12iPhone: return IPHONE_12_NAMESTRING;
- case UIDevice12ProiPhone: return IPHONE_12PRO_NAMESTRING;
- case UIDevice12ProMaxiPhone: return IPHONE_12PROMAX_NAMESTRING;
- case UIDeviceUnknowniPhone: return IPHONE_UNKNOWN_NAMESTRING;
-
- case UIDevice1GiPod: return IPOD_1G_NAMESTRING;
- case UIDevice2GiPod: return IPOD_2G_NAMESTRING;
- case UIDevice3GiPod: return IPOD_3G_NAMESTRING;
- case UIDevice4GiPod: return IPOD_4G_NAMESTRING;
- case UIDevice5GiPod: return IPOD_5G_NAMESTRING;
- case UIDevice6GiPod: return IPOD_6G_NAMESTRING;
- case UIDevice7GiPod: return IPOD_7G_NAMESTRING;
- case UIDeviceUnknowniPod: return IPOD_UNKNOWN_NAMESTRING;
-
- case UIDevice1GiPad : return IPAD_1G_NAMESTRING;
- case UIDevice2GiPad : return IPAD_2G_NAMESTRING;
- case UIDevice3GiPad : return IPAD_3G_NAMESTRING;
- case UIDevice4GiPad : return IPAD_4G_NAMESTRING;
- case UIDevice5GiPad : return IPAD_5G_NAMESTRING;
- case UIDevice6GiPad : return IPAD_6G_NAMESTRING;
- case UIDeviceiPadPro12_93g : return IPAD_PRO_12_9_NAMESTRING;
- case UIDeviceiPadPro11 : return IPAD_PRO_11_NAMESTRING;
- case UIDeviceiPadPro6g : return IPAD_PRO_6G_NAMESTRING;
- case UIDeviceiPadPro10_5 : return IPAD_PRO_10_5_NAMESTRING;
- case UIDeviceiPadPro12_9 : return IPAD_PRO_12_9_NAMESTRING;
- case UIDeviceUnknowniPad : return IPAD_UNKNOWN_NAMESTRING;
-
- case UIDeviceAppleTV2 : return APPLETV_2G_NAMESTRING;
- case UIDeviceAppleTV3 : return APPLETV_3G_NAMESTRING;
- case UIDeviceAppleTV4 : return APPLETV_4G_NAMESTRING;
- case UIDeviceUnknownAppleTV: return APPLETV_UNKNOWN_NAMESTRING;
-
- case UIDeviceSimulator: return SIMULATOR_NAMESTRING;
- case UIDeviceSimulatoriPhone: return SIMULATOR_IPHONE_NAMESTRING;
- case UIDeviceSimulatoriPad: return SIMULATOR_IPAD_NAMESTRING;
- case UIDeviceSimulatorAppleTV: return SIMULATOR_APPLETV_NAMESTRING;
-
- case UIDeviceIFPGA: return IFPGA_NAMESTRING;
-
- case UIDeviceOSX: return [self macHWName];
+#if TARGET_OS_IPHONE
+ NSString *platform = [self platform];
+
+ if ([platform isEqualToString:@"iPhone1,1"])
+ return @"iPhone";
+ if ([platform isEqualToString:@"iPhone1,2"])
+ return @"iPhone 3G";
+ if ([platform isEqualToString:@"iPhone2,1"])
+ return @"iPhone 3GS";
+ if ([platform hasPrefix:@"iPhone3"])
+ return @"iPhone 4";
+ if ([platform hasPrefix:@"iPhone4"])
+ return @"iPhone 4S";
+ if ([platform isEqualToString:@"iPhone5,1"] ||
+ [platform isEqualToString:@"iPhone5,2"])
+ return @"iPhone 5";
+ if ([platform isEqualToString:@"iPhone5,3"] ||
+ [platform isEqualToString:@"iPhone5,4"])
+ return @"iPhone 5C";
+ if ([platform hasPrefix:@"iPhone6"])
+ return @"iPhone 5S";
+ if ([platform isEqualToString:@"iPhone7,1"])
+ return @"iPhone 6 Plus";
+ if ([platform isEqualToString:@"iPhone7,2"])
+ return @"iPhone 6";
+ if ([platform isEqualToString:@"iPhone8,1"])
+ return @"iPhone 6S";
+ if ([platform isEqualToString:@"iPhone8,2"])
+ return @"iPhone 6S Plus";
+ if ([platform isEqualToString:@"iPhone8,4"])
+ return @"iPhone SE";
+ if ([platform isEqualToString:@"iPhone9,1"] ||
+ [platform isEqualToString:@"iPhone9,3"])
+ return @"iPhone 7";
+ if ([platform isEqualToString:@"iPhone9,2"] ||
+ [platform isEqualToString:@"iPhone9,4"])
+ return @"iPhone 7 Plus";
+ if ([platform isEqualToString:@"iPhone10,1"] ||
+ [platform isEqualToString:@"iPhone10,4"])
+ return @"iPhone 8";
+ if ([platform isEqualToString:@"iPhone10,2"] ||
+ [platform isEqualToString:@"iPhone10,5"])
+ return @"iPhone 8 Plus";
+ if ([platform isEqualToString:@"iPhone10,3"] ||
+ [platform isEqualToString:@"iPhone10,6"])
+ return @"iPhone X";
+ if ([platform isEqualToString:@"iPhone11,2"])
+ return @"iPhone XS";
+ if ([platform isEqualToString:@"iPhone11,4"] ||
+ [platform isEqualToString:@"iPhone11,6"])
+ return @"iPhone XS Max";
+ if ([platform isEqualToString:@"iPhone11,8"])
+ return @"iPhone XR";
+ if ([platform isEqualToString:@"iPhone12,1"])
+ return @"iPhone 11";
+ if ([platform isEqualToString:@"iPhone12,3"])
+ return @"iPhone 11 Pro";
+ if ([platform isEqualToString:@"iPhone12,5"])
+ return @"iPhone 11 Pro Max";
+ if ([platform isEqualToString:@"iPhone12,8"])
+ return @"iPhone SE (2nd gen)";
+ if ([platform isEqualToString:@"iPhone13,1"])
+ return @"iPhone 12 mini";
+ if ([platform isEqualToString:@"iPhone13,2"])
+ return @"iPhone 12";
+ if ([platform isEqualToString:@"iPhone13,3"])
+ return @"iPhone 12 Pro";
+ if ([platform isEqualToString:@"iPhone13,4"])
+ return @"iPhone 12 Pro Max";
+
+ if ([platform hasPrefix:@"iPod1"])
+ return @"iPod touch 1G";
+ if ([platform hasPrefix:@"iPod2"])
+ return @"iPod touch 2G";
+ if ([platform hasPrefix:@"iPod3"])
+ return @"iPod touch 3G";
+ if ([platform hasPrefix:@"iPod4"])
+ return @"iPod touch 4G";
+ if ([platform hasPrefix:@"iPod5"])
+ return @"iPod touch 5G";
+ if ([platform hasPrefix:@"iPod7"])
+ return @"iPod touch 6G";
+ if ([platform hasPrefix:@"iPod9"])
+ return @"iPod touch 7G";
+
+ if ([platform isEqualToString:@"iPad2,5"] ||
+ [platform isEqualToString:@"iPad2,6"] ||
+ [platform isEqualToString:@"iPad2,7"])
+ return @"iPad mini";
+
+ if ([platform hasPrefix:@"iPad2"])
+ return @"iPad 2G";
+
+ if ([platform isEqualToString:@"iPad3,1"] ||
+ [platform isEqualToString:@"iPad3,2"] ||
+ [platform isEqualToString:@"iPad3,3"])
+ return @"iPad 3G";
+
+ if ([platform isEqualToString:@"iPad3,4"] ||
+ [platform isEqualToString:@"iPad3,5"] ||
+ [platform isEqualToString:@"iPad3,6"])
+ return @"iPad 3G";
+
+ if ([platform isEqualToString:@"iPad4,1"] ||
+ [platform isEqualToString:@"iPad4,2"])
+ return @"iPad Air";
- default: return IOS_FAMILY_UNKNOWN_DEVICE;
+ if ([platform isEqualToString:@"iPad4,4"] ||
+ [platform isEqualToString:@"iPad4,5"] ||
+ [platform isEqualToString:@"iPad4,6"])
+ return @"iPad mini Retina";
+
+ if ([platform isEqualToString:@"iPad4,7"] ||
+ [platform isEqualToString:@"iPad4,8"] ||
+ [platform isEqualToString:@"iPad4,9"])
+ return @"iPad mini 3";
+
+ if ([platform isEqualToString:@"iPad5,1"] ||
+ [platform isEqualToString:@"iPad5,2"])
+ return @"iPad mini 4";
+
+ if ([platform isEqualToString:@"iPad5,3"] ||
+ [platform isEqualToString:@"iPad5,4"])
+ return @"iPad Air 2";
+
+ if ([platform isEqualToString:@"iPad6,3"] ||
+ [platform isEqualToString:@"iPad6,4"])
+ return @"iPad Pro 9.7 inch";
+
+ if ([platform isEqualToString:@"iPad6,7"] ||
+ [platform isEqualToString:@"iPad6,8"])
+ return @"iPad Pro 12.9 inch";
+
+ if ([platform isEqualToString:@"iPad6,11"] ||
+ [platform isEqualToString:@"iPad6,12"])
+ return @"iPad (2017)";
+
+ if ([platform isEqualToString:@"iPad7,1"] ||
+ [platform isEqualToString:@"iPad7,2"])
+ return @"iPad Pro (2nd gen)";
+
+ if ([platform isEqualToString:@"iPad7,3"] ||
+ [platform isEqualToString:@"iPad7,4"])
+ return @"iPad Pro 10.5 inch";
+
+ if ([platform isEqualToString:@"iPad7,5"] ||
+ [platform isEqualToString:@"iPad7,6"])
+ return @"iPad (6th gen)";
+
+ if ([platform isEqualToString:@"iPad7,11"] ||
+ [platform isEqualToString:@"iPad7,12"])
+ return @"iPad 10.2 inch (7th gen)";
+
+ if ([platform isEqualToString:@"iPad8,1"] ||
+ [platform isEqualToString:@"iPad8,2"] ||
+ [platform isEqualToString:@"iPad8,3"] ||
+ [platform isEqualToString:@"iPad8,4"])
+ return @"iPad Pro 11 inch (3rd gen)";
+
+ if ([platform isEqualToString:@"iPad8,5"] ||
+ [platform isEqualToString:@"iPad8,6"] ||
+ [platform isEqualToString:@"iPad8,7"] ||
+ [platform isEqualToString:@"iPad8,8"])
+ return @"iPad Pro 12.9 inch (3rd gen)";
+
+ if ([platform isEqualToString:@"iPad8,9"] ||
+ [platform isEqualToString:@"iPad8,10"])
+ return @"iPad Pro 11 inch (4th gen)";
+
+ if ([platform isEqualToString:@"iPad8,11"] ||
+ [platform isEqualToString:@"iPad8,12"])
+ return @"iPad Pro 12.9 inch (4th gen)";
+
+ if ([platform isEqualToString:@"iPad11,1"] ||
+ [platform isEqualToString:@"iPad11,2"])
+ return @"iPad mini (5th gen)";
+
+ if ([platform isEqualToString:@"iPad11,3"] ||
+ [platform isEqualToString:@"iPad11,4"])
+ return @"iPad Air (3rd gen)";
+
+ if ([platform isEqualToString:@"iPad11,6"] ||
+ [platform isEqualToString:@"iPad11,7"])
+ return @"iPad (8th gen)";
+
+ if ([platform isEqualToString:@"iPad13,1"] ||
+ [platform isEqualToString:@"iPad13,2"])
+ return @"iPad Air (4th gen)";
+
+ if ([platform hasPrefix:@"iPhone"])
+ return @"Unknown iPhone";
+ if ([platform hasPrefix:@"iPod"])
+ return @"Unknown iPod";
+ if ([platform hasPrefix:@"iPad"])
+ return @"Unknown iPad";
+
+ if ([platform hasSuffix:@"86"] || [platform isEqual:@"x86_64"] || [platform isEqual:@"arm64"]) {
+ return @"iPhone Simulator";
}
+#else
+ return [self macHWName];
+#endif
+
+ return @"Unknown iOS device";
}
--(NSString *)macHWName {
+- (NSString *)macHWName {
size_t len = 0;
sysctlbyname("hw.model", NULL, &len, NULL, 0);
if (len) {
@@ -672,120 +719,6 @@ NSString *suffix = @"";
return @"macOS";
}
-- (NSUInteger)platformType
-{
-#if TARGET_OS_IPHONE
- NSString *platform = [self platform];
-
- // The ever mysterious iFPGA
- if ([platform isEqualToString:@"iFPGA"]) return UIDeviceIFPGA;
-
- // iPhone
- if ([platform isEqualToString:@"iPhone1,1"]) return UIDevice1GiPhone;
- if ([platform isEqualToString:@"iPhone1,2"]) return UIDevice3GiPhone;
- if ([platform hasPrefix:@"iPhone2"]) return UIDevice3GSiPhone;
- if ([platform hasPrefix:@"iPhone3"]) return UIDevice4iPhone;
- if ([platform hasPrefix:@"iPhone4"]) return UIDevice4SiPhone;
- if ([platform hasPrefix:@"iPhone5"]) return UIDevice5iPhone;
- if ([platform hasPrefix:@"iPhone6"]) return UIDevice5SiPhone;
-
- if ([platform isEqualToString:@"iPhone7,1"]) return UIDevice6PlusiPhone;
- if ([platform isEqualToString:@"iPhone7,2"]) return UIDevice6iPhone;
- if ([platform isEqualToString:@"iPhone8,1"]) return UIDevice6SiPhone;
- if ([platform isEqualToString:@"iPhone8,2"]) return UIDevice6SPlusiPhone;
- if ([platform isEqualToString:@"iPhone9,1"]) return UIDevice7iPhone;
- if ([platform isEqualToString:@"iPhone9,3"]) return UIDevice7iPhone;
- if ([platform isEqualToString:@"iPhone9,2"]) return UIDevice7PlusiPhone;
- if ([platform isEqualToString:@"iPhone9,4"]) return UIDevice7PlusiPhone;
-
- if ([platform isEqualToString:@"iPhone10,1"]) return UIDevice8iPhone;
- if ([platform isEqualToString:@"iPhone10,4"]) return UIDevice8iPhone;
- if ([platform isEqualToString:@"iPhone10,2"]) return UIDevice8PlusiPhone;
- if ([platform isEqualToString:@"iPhone10,5"]) return UIDevice8PlusiPhone;
- if ([platform isEqualToString:@"iPhone10,3"]) return UIDeviceXiPhone;
- if ([platform isEqualToString:@"iPhone10,6"]) return UIDeviceXiPhone;
- if ([platform isEqualToString:@"iPhone11,2"]) return UIDeviceXSiPhone;
- if ([platform isEqualToString:@"iPhone11,6"]) return UIDeviceXSMaxiPhone;
- if ([platform isEqualToString:@"iPhone11,4"]) return UIDeviceXSMaxiPhone;
- if ([platform isEqualToString:@"iPhone11,8"]) return UIDeviceXRiPhone;
- if ([platform isEqualToString:@"iPhone12,1"]) return UIDevice11iPhone;
- if ([platform isEqualToString:@"iPhone12,3"]) return UIDevice11ProiPhone;
- if ([platform isEqualToString:@"iPhone12,5"]) return UIDevice11ProMaxiPhone;
- if ([platform isEqualToString:@"iPhone12,8"]) return UIDeviceSE2Phone;
- if ([platform isEqualToString:@"iPhone13,1"]) return UIDevice12MiniiPhone;
- if ([platform isEqualToString:@"iPhone13,2"]) return UIDevice12iPhone;
- if ([platform isEqualToString:@"iPhone13,3"]) return UIDevice12ProiPhone;
- if ([platform isEqualToString:@"iPhone13,4"]) return UIDevice12ProMaxiPhone;
-
- if ([platform isEqualToString:@"iPhone8,4"]) return UIDeviceSEPhone;
-
- // iPod
- if ([platform hasPrefix:@"iPod1"]) return UIDevice1GiPod;
- if ([platform hasPrefix:@"iPod2"]) return UIDevice2GiPod;
- if ([platform hasPrefix:@"iPod3"]) return UIDevice3GiPod;
- if ([platform hasPrefix:@"iPod4"]) return UIDevice4GiPod;
- if ([platform hasPrefix:@"iPod5"]) return UIDevice5GiPod;
- if ([platform hasPrefix:@"iPod7"]) return UIDevice6GiPod;
- if ([platform hasPrefix:@"iPod9"]) return UIDevice7GiPod;
-
- // iPad
- if ([platform hasPrefix:@"iPad1"]) return UIDevice1GiPad;
- if ([platform hasPrefix:@"iPad2"]) return UIDevice2GiPad;
- if ([platform hasPrefix:@"iPad3"]) return UIDevice3GiPad;
- if ([platform hasPrefix:@"iPad4"]) return UIDevice4GiPad;
- if ([platform hasPrefix:@"iPad5"]) return UIDevice5GiPad;
- if ([platform hasPrefix:@"iPad6"]) return UIDevice6GiPad;
-
- if ([platform isEqualToString:@"iPad8,5"] ||
- [platform isEqualToString:@"iPad8,6"] ||
- [platform isEqualToString:@"iPad8,7"] ||
- [platform isEqualToString:@"iPad8,8"]) {
- return UIDeviceiPadPro12_93g;
- }
-
- if ([platform isEqualToString:@"iPad8,1"] ||
- [platform isEqualToString:@"iPad8,2"] ||
- [platform isEqualToString:@"iPad8,3"] ||
- [platform isEqualToString:@"iPad8,4"]) {
- return UIDeviceiPadPro11;
- }
-
- if ([platform isEqualToString:@"iPad7,5"] ||
- [platform isEqualToString:@"iPad7,6"]) {
- return UIDeviceiPadPro6g;
- }
-
- if ([platform isEqualToString:@"iPad7,3"] ||
- [platform isEqualToString:@"iPad7,4"]) {
- return UIDeviceiPadPro10_5;
- }
-
- if ([platform isEqualToString:@"iPad7,1"] ||
- [platform isEqualToString:@"iPad7,2"]) {
- return UIDeviceiPadPro12_9;
- }
-
- // Apple TV
- if ([platform hasPrefix:@"AppleTV2"]) return UIDeviceAppleTV2;
- if ([platform hasPrefix:@"AppleTV3"]) return UIDeviceAppleTV3;
-
- if ([platform hasPrefix:@"iPhone"]) return UIDeviceUnknowniPhone;
- if ([platform hasPrefix:@"iPod"]) return UIDeviceUnknowniPod;
- if ([platform hasPrefix:@"iPad"]) return UIDeviceUnknowniPad;
- if ([platform hasPrefix:@"AppleTV"]) return UIDeviceUnknownAppleTV;
-
- // Simulator thanks Jordan Breeding
- if ([platform hasSuffix:@"86"] || [platform isEqual:@"x86_64"])
- {
- return UIDeviceSimulatoriPhone;
- }
-#else
- return UIDeviceOSX;
-#endif
-
- return UIDeviceUnknown;
-}
-
- (NSString *)getSysInfoByName:(char *)typeSpecifier
{
size_t size;
diff --git a/submodules/PeerInfoUI/BUILD b/submodules/PeerInfoUI/BUILD
index b8bdb1454d..c89dcb5bc4 100644
--- a/submodules/PeerInfoUI/BUILD
+++ b/submodules/PeerInfoUI/BUILD
@@ -67,6 +67,7 @@ swift_library(
"//submodules/ChatListSearchItemHeader:ChatListSearchItemHeader",
"//submodules/StatisticsUI:StatisticsUI",
"//submodules/ChatListFilterSettingsHeaderItem:ChatListFilterSettingsHeaderItem",
+ "//submodules/InviteLinksUI:InviteLinksUI",
],
visibility = [
"//visibility:public",
diff --git a/submodules/PeerInfoUI/Sources/ChannelAdminController.swift b/submodules/PeerInfoUI/Sources/ChannelAdminController.swift
index e2a10577aa..66a67e3b3e 100644
--- a/submodules/PeerInfoUI/Sources/ChannelAdminController.swift
+++ b/submodules/PeerInfoUI/Sources/ChannelAdminController.swift
@@ -691,7 +691,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
canTransfer = true
}
- if let initialParticipant = initialParticipant, case let .member(participant) = initialParticipant, let adminInfo = participant.adminInfo, !adminInfo.rights.flags.isEmpty && admin.id != accountPeerId {
+ if let initialParticipant = initialParticipant, case let .member(_, _, adminInfoValue, _, _) = initialParticipant, let adminInfo = adminInfoValue, !adminInfo.rights.flags.isEmpty && admin.id != accountPeerId {
if channel.flags.contains(.isCreator) {
canDismiss = true
} else {
@@ -772,6 +772,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
.canBanUsers,
.canInviteUsers,
.canPinMessages,
+ .canManageCalls,
.canBeAnonymous,
.canAddAdmins
]
@@ -782,9 +783,9 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
if let updatedFlags = state.updatedFlags {
currentRightsFlags = updatedFlags
} else if let initialParticipant = initialParticipant, case let .member(_, _, maybeAdminRights, _, _) = initialParticipant, let adminRights = maybeAdminRights {
- currentRightsFlags = adminRights.rights.flags.subtracting(.canAddAdmins)
+ currentRightsFlags = adminRights.rights.flags.subtracting(.canAddAdmins).subtracting(.canBeAnonymous)
} else {
- currentRightsFlags = accountUserRightsFlags.subtracting(.canAddAdmins)
+ currentRightsFlags = accountUserRightsFlags.subtracting(.canAddAdmins).subtracting(.canBeAnonymous)
}
var index = 0
@@ -1126,7 +1127,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi
}))
}
}
- } else if let _ = channelView.peers[channelView.peerId] as? TelegramGroup {
+ } else if let group = channelView.peers[channelView.peerId] as? TelegramGroup {
var updateFlags: TelegramChatAdminRightsFlags?
var updateRank: String?
updateState { current in
@@ -1143,7 +1144,12 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi
}
let maskRightsFlags: TelegramChatAdminRightsFlags = .groupSpecific
- let defaultFlags = maskRightsFlags.subtracting(.canAddAdmins)
+ let defaultFlags: TelegramChatAdminRightsFlags
+ if case .creator = group.role {
+ defaultFlags = maskRightsFlags.subtracting(.canBeAnonymous)
+ } else {
+ defaultFlags = maskRightsFlags.subtracting(.canAddAdmins).subtracting(.canBeAnonymous)
+ }
if updateFlags == nil {
updateFlags = defaultFlags
diff --git a/submodules/PeerInfoUI/Sources/ChannelMembersController.swift b/submodules/PeerInfoUI/Sources/ChannelMembersController.swift
index 5540394f63..d1ed834b2a 100644
--- a/submodules/PeerInfoUI/Sources/ChannelMembersController.swift
+++ b/submodules/PeerInfoUI/Sources/ChannelMembersController.swift
@@ -13,6 +13,7 @@ import AccountContext
import AlertUI
import PresentationDataUtils
import ItemListPeerItem
+import InviteLinksUI
private final class ChannelMembersControllerArguments {
let context: AccountContext
@@ -461,7 +462,7 @@ public func channelMembersController(context: AccountContext, peerId: PeerId) ->
pushControllerImpl?(controller)
}
}, inviteViaLink: {
- presentControllerImpl?(channelVisibilityController(context: context, peerId: peerId, mode: .privateLink, upgradedToSupergroup: { _, f in f() }), ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ pushControllerImpl?(InviteLinkInviteController(context: context, peerId: peerId))
})
let peerView = context.account.viewTracker.peerView(peerId)
diff --git a/submodules/PeerInfoUI/Sources/ChannelMembersSearchControllerNode.swift b/submodules/PeerInfoUI/Sources/ChannelMembersSearchControllerNode.swift
index 6722f996b2..6ffc81a030 100644
--- a/submodules/PeerInfoUI/Sources/ChannelMembersSearchControllerNode.swift
+++ b/submodules/PeerInfoUI/Sources/ChannelMembersSearchControllerNode.swift
@@ -361,16 +361,16 @@ class ChannelMembersSearchControllerNode: ASDisplayNode {
let renderedParticipant: RenderedChannelParticipant
switch participant {
case .creator:
- renderedParticipant = RenderedChannelParticipant(participant: .creator(id: peer.id, adminInfo: nil, rank: nil), peer: peer)
+ renderedParticipant = RenderedChannelParticipant(participant: .creator(id: peer.id, adminInfo: nil, rank: nil), peer: peer, presences: peerView.peerPresences)
case .admin:
var peers: [PeerId: Peer] = [:]
peers[creator.id] = creator
peers[peer.id] = peer
- renderedParticipant = RenderedChannelParticipant(participant: .member(id: peer.id, invitedAt: 0, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(flags: .groupSpecific), promotedBy: creator.id, canBeEditedByAccountPeer: creator.id == context.account.peerId), banInfo: nil, rank: nil), peer: peer, peers: peers)
+ renderedParticipant = RenderedChannelParticipant(participant: .member(id: peer.id, invitedAt: 0, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(flags: .groupSpecific), promotedBy: creator.id, canBeEditedByAccountPeer: creator.id == context.account.peerId), banInfo: nil, rank: nil), peer: peer, peers: peers, presences: peerView.peerPresences)
case .member:
var peers: [PeerId: Peer] = [:]
peers[peer.id] = peer
- renderedParticipant = RenderedChannelParticipant(participant: .member(id: peer.id, invitedAt: 0, adminInfo: nil, banInfo: nil, rank: nil), peer: peer, peers: peers)
+ renderedParticipant = RenderedChannelParticipant(participant: .member(id: peer.id, invitedAt: 0, adminInfo: nil, banInfo: nil, rank: nil), peer: peer, peers: peers, presences: peerView.peerPresences)
}
entries.append(.peer(index, renderedParticipant, ContactsPeerItemEditing(editable: false, editing: false, revealed: false), label, enabled))
diff --git a/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift b/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift
index 45c79c36f3..d4a59cc038 100644
--- a/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift
+++ b/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift
@@ -1,6 +1,7 @@
import Foundation
import UIKit
import Display
+import AsyncDisplayKit
import SwiftSignalKit
import Postbox
import TelegramCore
@@ -16,22 +17,24 @@ import AlertUI
import PresentationDataUtils
import TelegramNotices
import ItemListPeerItem
+import ItemListPeerActionItem
import AccountContext
+import InviteLinksUI
+import ContextUI
private final class ChannelVisibilityControllerArguments {
let context: AccountContext
-
let updateCurrentType: (CurrentChannelType) -> Void
let updatePublicLinkText: (String?, String) -> Void
let scrollToPublicLinkText: () -> Void
let displayPrivateLinkMenu: (String) -> Void
let setPeerIdWithRevealedOptions: (PeerId?, PeerId?) -> Void
let revokePeerId: (PeerId) -> Void
- let copyPrivateLink: () -> Void
- let revokePrivateLink: () -> Void
- let sharePrivateLink: () -> Void
+ let shareLink: () -> Void
+ let linkContextAction: (ASDisplayNode) -> Void
+ let manageInviteLinks: () -> Void
- init(context: AccountContext, updateCurrentType: @escaping (CurrentChannelType) -> Void, updatePublicLinkText: @escaping (String?, String) -> Void, scrollToPublicLinkText: @escaping () -> Void, displayPrivateLinkMenu: @escaping (String) -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, revokePeerId: @escaping (PeerId) -> Void, copyPrivateLink: @escaping () -> Void, revokePrivateLink: @escaping () -> Void, sharePrivateLink: @escaping () -> Void) {
+ init(context: AccountContext, updateCurrentType: @escaping (CurrentChannelType) -> Void, updatePublicLinkText: @escaping (String?, String) -> Void, scrollToPublicLinkText: @escaping () -> Void, displayPrivateLinkMenu: @escaping (String) -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, revokePeerId: @escaping (PeerId) -> Void, shareLink: @escaping () -> Void, linkContextAction: @escaping (ASDisplayNode) -> Void, manageInviteLinks: @escaping () -> Void) {
self.context = context
self.updateCurrentType = updateCurrentType
self.updatePublicLinkText = updatePublicLinkText
@@ -39,9 +42,9 @@ private final class ChannelVisibilityControllerArguments {
self.displayPrivateLinkMenu = displayPrivateLinkMenu
self.setPeerIdWithRevealedOptions = setPeerIdWithRevealedOptions
self.revokePeerId = revokePeerId
- self.copyPrivateLink = copyPrivateLink
- self.revokePrivateLink = revokePrivateLink
- self.sharePrivateLink = sharePrivateLink
+ self.shareLink = shareLink
+ self.linkContextAction = linkContextAction
+ self.manageInviteLinks = manageInviteLinks
}
}
@@ -49,7 +52,6 @@ private enum ChannelVisibilitySection: Int32 {
case type
case link
case linkActions
- case location
}
private enum ChannelVisibilityEntryTag: ItemListItemTag {
@@ -73,12 +75,13 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry {
case publicLinkHeader(PresentationTheme, String)
case publicLinkAvailability(PresentationTheme, String, Bool)
- case privateLink(PresentationTheme, String, String?)
case editablePublicLink(PresentationTheme, PresentationStrings, String, String)
+ case privateLinkHeader(PresentationTheme, String)
+ case privateLink(PresentationTheme, ExportedInvitation?)
case privateLinkInfo(PresentationTheme, String)
- case privateLinkCopy(PresentationTheme, String)
- case privateLinkRevoke(PresentationTheme, String)
- case privateLinkShare(PresentationTheme, String)
+ case privateLinkManage(PresentationTheme, String)
+ case privateLinkManageInfo(PresentationTheme, String)
+
case publicLinkInfo(PresentationTheme, String)
case publicLinkStatus(PresentationTheme, String, AddressNameValidationStatus)
@@ -89,9 +92,9 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry {
switch self {
case .typeHeader, .typePublic, .typePrivate, .typeInfo:
return ChannelVisibilitySection.type.rawValue
- case .publicLinkHeader, .publicLinkAvailability, .privateLink, .editablePublicLink, .privateLinkInfo, .publicLinkInfo, .publicLinkStatus:
+ case .publicLinkHeader, .publicLinkAvailability, .privateLinkHeader, .privateLink, .editablePublicLink, .privateLinkInfo, .publicLinkInfo, .publicLinkStatus:
return ChannelVisibilitySection.link.rawValue
- case .privateLinkCopy, .privateLinkRevoke, .privateLinkShare:
+ case .privateLinkManage, .privateLinkManageInfo:
return ChannelVisibilitySection.linkActions.rawValue
case .existingLinksInfo, .existingLinkPeerItem:
return ChannelVisibilitySection.link.rawValue
@@ -112,17 +115,17 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry {
return 4
case .publicLinkAvailability:
return 5
- case .privateLink:
+ case .privateLinkHeader:
return 6
- case .editablePublicLink:
+ case .privateLink:
return 7
- case .privateLinkInfo:
+ case .editablePublicLink:
return 8
- case .privateLinkCopy:
+ case .privateLinkInfo:
return 9
- case .privateLinkRevoke:
+ case .privateLinkManage:
return 10
- case .privateLinkShare:
+ case .privateLinkManageInfo:
return 11
case .publicLinkStatus:
return 12
@@ -173,8 +176,14 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry {
} else {
return false
}
- case let .privateLink(lhsTheme, lhsText, lhsLink):
- if case let .privateLink(rhsTheme, rhsText, rhsLink) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsLink == rhsLink {
+ case let .privateLinkHeader(lhsTheme, lhsTitle):
+ if case let .privateLinkHeader(rhsTheme, rhsTitle) = rhs, lhsTheme === rhsTheme, lhsTitle == rhsTitle {
+ return true
+ } else {
+ return false
+ }
+ case let .privateLink(lhsTheme, lhsInvite):
+ if case let .privateLink(rhsTheme, rhsInvite) = rhs, lhsTheme === rhsTheme, lhsInvite == rhsInvite {
return true
} else {
return false
@@ -191,20 +200,14 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry {
} else {
return false
}
- case let .privateLinkCopy(lhsTheme, lhsText):
- if case let .privateLinkCopy(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ case let .privateLinkManage(lhsTheme, lhsText):
+ if case let .privateLinkManage(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
return true
} else {
return false
}
- case let .privateLinkRevoke(lhsTheme, lhsText):
- if case let .privateLinkRevoke(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
- return true
- } else {
- return false
- }
- case let .privateLinkShare(lhsTheme, lhsText):
- if case let .privateLinkShare(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
+ case let .privateLinkManageInfo(lhsTheme, lhsText):
+ if case let .privateLinkManageInfo(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
return true
} else {
return false
@@ -267,31 +270,35 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry {
func item(presentationData: ItemListPresentationData, arguments: Any) -> ListViewItem {
let arguments = arguments as! ChannelVisibilityControllerArguments
switch self {
- case let .typeHeader(theme, title):
+ case let .typeHeader(_, title):
return ItemListSectionHeaderItem(presentationData: presentationData, text: title, sectionId: self.section)
- case let .typePublic(theme, text, selected):
+ case let .typePublic(_, text, selected):
return ItemListCheckboxItem(presentationData: presentationData, title: text, style: .left, checked: selected, zeroSeparatorInsets: false, sectionId: self.section, action: {
arguments.updateCurrentType(.publicChannel)
})
- case let .typePrivate(theme, text, selected):
+ case let .typePrivate(_, text, selected):
return ItemListCheckboxItem(presentationData: presentationData, title: text, style: .left, checked: selected, zeroSeparatorInsets: false, sectionId: self.section, action: {
arguments.updateCurrentType(.privateChannel)
})
- case let .typeInfo(theme, text):
+ case let .typeInfo(_, text):
return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section)
- case let .publicLinkHeader(theme, title):
+ case let .publicLinkHeader(_, title):
return ItemListSectionHeaderItem(presentationData: presentationData, text: title, sectionId: self.section)
case let .publicLinkAvailability(theme, text, value):
let attr = NSMutableAttributedString(string: text, textColor: value ? theme.list.freeTextColor : theme.list.freeTextErrorColor)
attr.addAttribute(.font, value: Font.regular(13), range: NSMakeRange(0, attr.length))
return ItemListActivityTextItem(displayActivity: value, presentationData: presentationData, text: attr, sectionId: self.section)
- case let .privateLink(theme, text, value):
- return ItemListActionItem(presentationData: presentationData, title: text, kind: value != nil ? .neutral : .disabled, alignment: .natural, sectionId: self.section, style: .blocks, action: {
- if let value = value {
- arguments.displayPrivateLinkMenu(value)
- }
- }, tag: ChannelVisibilityEntryTag.privateLink)
- case let .editablePublicLink(theme, strings, placeholder, currentText):
+ case let .privateLinkHeader(_, title):
+ return ItemListSectionHeaderItem(presentationData: presentationData, text: title, sectionId: self.section)
+ case let .privateLink(_, invite):
+ return ItemListPermanentInviteLinkItem(context: arguments.context, presentationData: presentationData, invite: invite, peers: [], buttonColor: nil, sectionId: self.section, style: .blocks, shareAction: {
+ arguments.shareLink()
+ }, contextAction: { node in
+ arguments.linkContextAction(node)
+ }, viewAction: {
+
+ })
+ case let .editablePublicLink(theme, _, placeholder, currentText):
return ItemListSingleLineInputItem(presentationData: presentationData, title: NSAttributedString(string: "t.me/", textColor: theme.list.itemPrimaryTextColor), text: currentText, placeholder: placeholder, type: .regular(capitalization: false, autocorrection: false), clearType: .always, tag: ChannelVisibilityEntryTag.publicLink, sectionId: self.section, textUpdated: { updatedText in
arguments.updatePublicLinkText(currentText, updatedText)
}, updatedFocus: { focus in
@@ -300,21 +307,15 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry {
}
}, action: {
})
- case let .privateLinkInfo(theme, text):
+ case let .privateLinkInfo(_, text):
return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section)
- case let .privateLinkCopy(theme, text):
- return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: {
- arguments.copyPrivateLink()
+ case let .privateLinkManage(theme, text):
+ return ItemListPeerActionItem(presentationData: presentationData, icon: PresentationResourcesItemList.linkIcon(theme), title: text, sectionId: self.section, editing: false, action: {
+ arguments.manageInviteLinks()
})
- case let .privateLinkRevoke(theme, text):
- return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: {
- arguments.revokePrivateLink()
- })
- case let .privateLinkShare(theme, text):
- return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: {
- arguments.sharePrivateLink()
- })
- case let .publicLinkInfo(theme, text):
+ case let .privateLinkManageInfo(_, text):
+ return ItemListTextItem(presentationData: presentationData, text: .markdown(text), sectionId: self.section)
+ case let .publicLinkInfo(_, text):
return ItemListTextItem(presentationData: presentationData, text: .markdown(text), sectionId: self.section)
case let .publicLinkStatus(theme, text, status):
var displayActivity = false
@@ -336,9 +337,9 @@ private enum ChannelVisibilityEntry: ItemListNodeEntry {
displayActivity = true
}
return ItemListActivityTextItem(displayActivity: displayActivity, presentationData: presentationData, text: NSAttributedString(string: text, textColor: color), sectionId: self.section)
- case let .existingLinksInfo(theme, text):
+ case let .existingLinksInfo(_, text):
return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section)
- case let .existingLinkPeerItem(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer, editing, enabled):
+ case let .existingLinkPeerItem(_, _, _, dateTimeFormat, nameDisplayOrder, peer, editing, enabled):
var label = ""
if let addressName = peer.addressName {
label = "t.me/" + addressName
@@ -591,14 +592,9 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa
}
}
case .privateChannel:
- let link = (view.cachedData as? CachedChannelData)?.exportedInvitation?.link
- let text: String
- if let link = link {
- text = link
- } else {
- text = presentationData.strings.Channel_NotificationLoading
- }
- entries.append(.privateLink(presentationData.theme, text, link))
+ let invite = (view.cachedData as? CachedChannelData)?.exportedInvitation
+ entries.append(.privateLinkHeader(presentationData.theme, presentationData.strings.InviteLink_PermanentLink.uppercased()))
+ entries.append(.privateLink(presentationData.theme, invite))
if isGroup {
entries.append(.privateLinkInfo(presentationData.theme, presentationData.strings.Group_Username_CreatePrivateLinkHelp))
} else {
@@ -608,34 +604,25 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa
case .initialSetup:
break
case .generic, .privateLink:
- entries.append(.privateLinkCopy(presentationData.theme, presentationData.strings.GroupInfo_InviteLink_CopyLink))
- entries.append(.privateLinkRevoke(presentationData.theme, presentationData.strings.GroupInfo_InviteLink_RevokeLink))
- entries.append(.privateLinkShare(presentationData.theme, presentationData.strings.GroupInfo_InviteLink_ShareLink))
+ entries.append(.privateLinkManage(presentationData.theme, presentationData.strings.InviteLink_Manage))
+ entries.append(.privateLinkManageInfo(presentationData.theme, presentationData.strings.InviteLink_CreateInfo))
}
}
} else if let _ = view.peers[view.peerId] as? TelegramGroup {
switch mode {
- case .privateLink:
- let link = (view.cachedData as? CachedGroupData)?.exportedInvitation?.link
- let text: String
- if let link = link {
- text = link
- } else {
- text = presentationData.strings.Channel_NotificationLoading
- }
- entries.append(.privateLink(presentationData.theme, text, link))
+ case .privateLink:
+ let invite = (view.cachedData as? CachedGroupData)?.exportedInvitation
+ entries.append(.privateLinkHeader(presentationData.theme, presentationData.strings.InviteLink_PermanentLink.uppercased()))
+ entries.append(.privateLink(presentationData.theme, invite))
entries.append(.privateLinkInfo(presentationData.theme, presentationData.strings.GroupInfo_InviteLink_Help))
switch mode {
case .initialSetup:
break
case .generic, .privateLink:
- entries.append(.privateLinkCopy(presentationData.theme, presentationData.strings.GroupInfo_InviteLink_CopyLink))
- entries.append(.privateLinkRevoke(presentationData.theme, presentationData.strings.GroupInfo_InviteLink_RevokeLink))
- entries.append(.privateLinkShare(presentationData.theme, presentationData.strings.GroupInfo_InviteLink_ShareLink))
+ entries.append(.privateLinkManage(presentationData.theme, presentationData.strings.InviteLink_Manage))
+ entries.append(.privateLinkManageInfo(presentationData.theme, presentationData.strings.InviteLink_CreateInfo))
}
- case .generic, .initialSetup:
- let isGroup = true
-
+ case .generic, .initialSetup:
let selectedType: CurrentChannelType
if let current = state.selectedType {
selectedType = current
@@ -723,22 +710,16 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa
entries.append(.publicLinkInfo(presentationData.theme, presentationData.strings.Group_Username_CreatePublicLinkHelp))
}
case .privateChannel:
- let link = (view.cachedData as? CachedGroupData)?.exportedInvitation?.link
- let text: String
- if let link = link {
- text = link
- } else {
- text = presentationData.strings.Channel_NotificationLoading
- }
- entries.append(.privateLink(presentationData.theme, text, link))
+ let invite = (view.cachedData as? CachedGroupData)?.exportedInvitation
+ entries.append(.privateLinkHeader(presentationData.theme, presentationData.strings.InviteLink_PermanentLink.uppercased()))
+ entries.append(.privateLink(presentationData.theme, invite))
entries.append(.privateLinkInfo(presentationData.theme, presentationData.strings.Group_Username_CreatePrivateLinkHelp))
switch mode {
case .initialSetup:
break
case .generic, .privateLink:
- entries.append(.privateLinkCopy(presentationData.theme, presentationData.strings.GroupInfo_InviteLink_CopyLink))
- entries.append(.privateLinkRevoke(presentationData.theme, presentationData.strings.GroupInfo_InviteLink_RevokeLink))
- entries.append(.privateLinkShare(presentationData.theme, presentationData.strings.GroupInfo_InviteLink_ShareLink))
+ entries.append(.privateLinkManage(presentationData.theme, presentationData.strings.InviteLink_Manage))
+ entries.append(.privateLinkManageInfo(presentationData.theme, presentationData.strings.InviteLink_CreateInfo))
}
}
}
@@ -747,7 +728,7 @@ private func channelVisibilityControllerEntries(presentationData: PresentationDa
return entries
}
-private func effectiveChannelType(state: ChannelVisibilityControllerState, peer: TelegramChannel, cachedData: CachedPeerData?) -> CurrentChannelType {
+private func effectiveChannelType(mode: ChannelVisibilityControllerMode, state: ChannelVisibilityControllerState, peer: TelegramChannel, cachedData: CachedPeerData?) -> CurrentChannelType {
let selectedType: CurrentChannelType
if let current = state.selectedType {
selectedType = current
@@ -756,6 +737,8 @@ private func effectiveChannelType(state: ChannelVisibilityControllerState, peer:
selectedType = .publicChannel
} else if let cachedChannelData = cachedData as? CachedChannelData, cachedChannelData.peerGeoLocation != nil {
selectedType = .publicChannel
+ } else if case .initialSetup = mode {
+ selectedType = .publicChannel
} else {
selectedType = .privateChannel
}
@@ -763,9 +746,9 @@ private func effectiveChannelType(state: ChannelVisibilityControllerState, peer:
return selectedType
}
-private func updatedAddressName(state: ChannelVisibilityControllerState, peer: Peer, cachedData: CachedPeerData?) -> String? {
+private func updatedAddressName(mode: ChannelVisibilityControllerMode, state: ChannelVisibilityControllerState, peer: Peer, cachedData: CachedPeerData?) -> String? {
if let peer = peer as? TelegramChannel {
- let selectedType = effectiveChannelType(state: state, peer: peer, cachedData: cachedData)
+ let selectedType = effectiveChannelType(mode: mode, state: state, peer: peer, cachedData: cachedData)
let currentAddressName: String
@@ -831,13 +814,13 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
}))
var dismissImpl: (() -> Void)?
- var dismissInputImpl: (() -> Void)?
var nextImpl: (() -> Void)?
var displayPrivateLinkMenuImpl: ((String) -> Void)?
var scrollToPublicLinkTextImpl: (() -> Void)?
var presentControllerImpl: ((ViewController, Any?) -> Void)?
var pushControllerImpl: ((ViewController) -> Void)?
- var clearHighlightImpl: (() -> Void)?
+ var presentInGlobalOverlayImpl: ((ViewController) -> Void)?
+ var getControllerImpl: (() -> ViewController?)?
let actionsDisposable = DisposableSet()
@@ -915,57 +898,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
}
})
}))
- }, copyPrivateLink: {
- let _ = (context.account.postbox.transaction { transaction -> String? in
- if let cachedData = transaction.getPeerCachedData(peerId: 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 {
- UIPasteboard.general.string = link
- let presentationData = context.sharedContext.currentPresentationData.with { $0 }
- presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Username_LinkCopied, false)), nil)
- }
- })
- }, revokePrivateLink: {
- let presentationData = context.sharedContext.currentPresentationData.with { $0 }
- let controller = ActionSheetController(presentationData: presentationData)
- let dismissAction: () -> Void = { [weak controller] in
- controller?.dismissAnimated()
- }
- controller.setItemGroups([
- ActionSheetItemGroup(items: [
- ActionSheetTextItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeAlert_Text),
- ActionSheetButtonItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeLink, color: .destructive, action: {
- dismissAction()
-
- var revoke = false
- updateState { state in
- if !state.revokingPrivateLink {
- revoke = true
- return state.withUpdatedRevokingPrivateLink(true)
- } else {
- return state
- }
- }
- if revoke {
- revokeLinkDisposable.set((ensuredExistingPeerExportedInvitation(account: context.account, peerId: peerId, revokeExisted: true) |> deliverOnMainQueue).start(completed: {
- updateState {
- $0.withUpdatedRevokingPrivateLink(false)
- }
- }))
- }
- })
- ]),
- ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
- ])
- presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
- }, sharePrivateLink: {
+ }, shareLink: {
let _ = (context.account.postbox.transaction { transaction -> String? in
if let cachedData = transaction.getPeerCachedData(peerId: peerId) {
if let cachedData = cachedData as? CachedChannelData {
@@ -981,6 +914,101 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
presentControllerImpl?(shareController, nil)
}
})
+ }, linkContextAction: { node in
+ guard let node = node as? ContextExtractedContentContainingNode, let controller = getControllerImpl?() else {
+ return
+ }
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ var items: [ContextMenuItem] = []
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextCopy, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ let _ = (context.account.postbox.transaction { transaction -> String? in
+ if let cachedData = transaction.getPeerCachedData(peerId: 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 {
+ UIPasteboard.general.string = link
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Username_LinkCopied, false)), nil)
+ }
+ })
+ })))
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextGetQRCode, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Wallet/QrIcon"), color: theme.contextMenu.primaryColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ let _ = (context.account.postbox.transaction { transaction -> ExportedInvitation? in
+ if let cachedData = transaction.getPeerCachedData(peerId: peerId) {
+ if let cachedData = cachedData as? CachedChannelData {
+ return cachedData.exportedInvitation
+ } else if let cachedData = cachedData as? CachedGroupData {
+ return cachedData.exportedInvitation
+ }
+ }
+ return nil
+ } |> deliverOnMainQueue).start(next: { invite in
+ if let invite = invite {
+ let controller = InviteLinkQRCodeController(context: context, invite: invite)
+ presentControllerImpl?(controller, nil)
+ }
+ })
+ })))
+
+ items.append(.action(ContextMenuActionItem(text: presentationData.strings.InviteLink_ContextRevoke, textColor: .destructive, icon: { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.actionSheet.destructiveActionTextColor)
+ }, action: { _, f in
+ f(.dismissWithoutContent)
+
+ let controller = ActionSheetController(presentationData: presentationData)
+ let dismissAction: () -> Void = { [weak controller] in
+ controller?.dismissAnimated()
+ }
+ controller.setItemGroups([
+ ActionSheetItemGroup(items: [
+ ActionSheetTextItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeAlert_Text),
+ ActionSheetButtonItem(title: presentationData.strings.GroupInfo_InviteLink_RevokeLink, color: .destructive, action: {
+ dismissAction()
+
+ var revoke = false
+ updateState { state in
+ if !state.revokingPrivateLink {
+ revoke = true
+ return state.withUpdatedRevokingPrivateLink(true)
+ } else {
+ return state
+ }
+ }
+ if revoke {
+ revokeLinkDisposable.set((ensuredExistingPeerExportedInvitation(account: context.account, peerId: peerId, revokeExisted: true) |> deliverOnMainQueue).start(completed: {
+ updateState {
+ $0.withUpdatedRevokingPrivateLink(false)
+ }
+ }))
+ }
+ })
+ ]),
+ ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
+ ])
+ presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
+ })))
+
+ let contextController = ContextController(account: context.account, presentationData: presentationData, source: .extracted(InviteLinkContextExtractedContentSource(controller: controller, sourceNode: node)), items: .single(items), reactionItems: [], gesture: nil)
+ presentInGlobalOverlayImpl?(contextController)
+ }, manageInviteLinks: {
+ let controller = inviteLinkListController(context: context, peerId: peerId)
+ pushControllerImpl?(controller)
})
let peerView = context.account.viewTracker.peerView(peerId)
@@ -1022,7 +1050,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
rightNavigationButton = ItemListNavigationButton(content: .text(mode == .initialSetup ? presentationData.strings.Common_Next : presentationData.strings.Common_Done), style: state.updatingAddressName ? .activity : .bold, enabled: doneEnabled, action: {
var updatedAddressNameValue: String?
updateState { state in
- updatedAddressNameValue = updatedAddressName(state: state, peer: peer, cachedData: view.cachedData)
+ updatedAddressNameValue = updatedAddressName(mode: mode, state: state, peer: peer, cachedData: view.cachedData)
return state
}
@@ -1093,7 +1121,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: state.updatingAddressName ? .activity : .bold, enabled: doneEnabled, action: {
var updatedAddressNameValue: String?
updateState { state in
- updatedAddressNameValue = updatedAddressName(state: state, peer: peer, cachedData: nil)
+ updatedAddressNameValue = updatedAddressName(mode: mode, state: state, peer: peer, cachedData: nil)
return state
}
@@ -1251,9 +1279,6 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
controller.dismiss()
}
}
- dismissInputImpl = { [weak controller] in
- controller?.view.endEditing(true)
- }
nextImpl = { [weak controller] in
if let controller = controller {
if case .initialSetup = mode {
@@ -1360,8 +1385,37 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
pushControllerImpl = { [weak controller] c in
controller?.push(c)
}
- clearHighlightImpl = { [weak controller] in
- controller?.clearItemNodesHighlight(animated: true)
+ presentInGlobalOverlayImpl = { [weak controller] c in
+ if let controller = controller {
+ controller.presentInGlobalOverlay(c)
+ }
+ }
+ getControllerImpl = { [weak controller] in
+ return controller
}
return controller
}
+
+private final class InviteLinkContextExtractedContentSource: ContextExtractedContentSource {
+ var keepInPlace: Bool
+ let ignoreContentTouches: Bool = true
+ let blurBackground: Bool
+
+ private let controller: ViewController
+ private let sourceNode: ContextExtractedContentContainingNode
+
+ init(controller: ViewController, sourceNode: ContextExtractedContentContainingNode) {
+ self.controller = controller
+ self.sourceNode = sourceNode
+ self.keepInPlace = false
+ self.blurBackground = false
+ }
+
+ func takeView() -> ContextControllerTakeViewInfo? {
+ return ContextControllerTakeViewInfo(contentContainingNode: self.sourceNode, contentAreaInScreenSpace: UIScreen.main.bounds)
+ }
+
+ func putBack() -> ContextControllerPutBackViewInfo? {
+ return ContextControllerPutBackViewInfo(contentAreaInScreenSpace: UIScreen.main.bounds)
+ }
+}
diff --git a/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift b/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift
index cd39d720cc..ee5ec1a372 100644
--- a/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift
+++ b/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift
@@ -449,7 +449,6 @@ private class PeersNearbyControllerImpl: ItemListController {
}
}
-
public func peersNearbyController(context: AccountContext) -> ViewController {
var pushControllerImpl: ((ViewController) -> Void)?
var replaceTopControllerImpl: ((ViewController) -> Void)?
diff --git a/submodules/Postbox/Sources/ChatListViewState.swift b/submodules/Postbox/Sources/ChatListViewState.swift
index a3fc67730f..765dfc264a 100644
--- a/submodules/Postbox/Sources/ChatListViewState.swift
+++ b/submodules/Postbox/Sources/ChatListViewState.swift
@@ -1341,6 +1341,7 @@ struct ChatListViewState {
case let .IntermediateMessageEntry(index, messageIndex):
var peers = SimpleDictionary()
var notificationsPeerId = index.messageIndex.id.peerId
+ var presence: PeerPresence?
if let peer = postbox.peerTable.get(index.messageIndex.id.peerId) {
peers[peer.id] = peer
if let notificationSettingsPeerId = peer.notificationSettingsPeerId {
@@ -1350,6 +1351,9 @@ struct ChatListViewState {
if let associatedPeer = postbox.peerTable.get(associatedPeerId) {
peers[associatedPeer.id] = associatedPeer
}
+ presence = postbox.peerPresenceTable.get(associatedPeerId)
+ } else {
+ presence = postbox.peerPresenceTable.get(index.messageIndex.id.peerId)
}
}
let renderedPeer = RenderedPeer(peerId: index.messageIndex.id.peerId, peers: peers)
@@ -1387,7 +1391,7 @@ struct ChatListViewState {
}
}
- let updatedEntry: MutableChatListEntry = .MessageEntry(index: index, messages: renderedMessages, readState: postbox.readStateTable.getCombinedState(index.messageIndex.id.peerId), notificationSettings: notificationSettings, isRemovedFromTotalUnreadCount: isRemovedFromTotalUnreadCount, embeddedInterfaceState: postbox.peerChatInterfaceStateTable.get(index.messageIndex.id.peerId)?.chatListEmbeddedState, renderedPeer: renderedPeer, presence: postbox.peerPresenceTable.get(index.messageIndex.id.peerId), tagSummaryInfo: tagSummaryInfo, hasFailedMessages: false, isContact: postbox.contactsTable.isContact(peerId: index.messageIndex.id.peerId))
+ let updatedEntry: MutableChatListEntry = .MessageEntry(index: index, messages: renderedMessages, readState: postbox.readStateTable.getCombinedState(index.messageIndex.id.peerId), notificationSettings: notificationSettings, isRemovedFromTotalUnreadCount: isRemovedFromTotalUnreadCount, embeddedInterfaceState: postbox.peerChatInterfaceStateTable.get(index.messageIndex.id.peerId)?.chatListEmbeddedState, renderedPeer: renderedPeer, presence: presence, tagSummaryInfo: tagSummaryInfo, hasFailedMessages: false, isContact: postbox.contactsTable.isContact(peerId: index.messageIndex.id.peerId))
if directionIndex == 0 {
self.stateBySpace[space]!.orderedEntries.setLowerOrAtAnchorAtArrayIndex(listIndex, to: updatedEntry)
} else {
diff --git a/submodules/Postbox/Sources/Postbox.swift b/submodules/Postbox/Sources/Postbox.swift
index 2e7fb9c916..078c837cdc 100644
--- a/submodules/Postbox/Sources/Postbox.swift
+++ b/submodules/Postbox/Sources/Postbox.swift
@@ -2787,7 +2787,11 @@ public final class Postbox {
let mutableView = MutableChatListView(postbox: self, groupId: groupId, filterPredicate: filterPredicate, aroundIndex: index, count: count, summaryComponents: summaryComponents)
mutableView.render(postbox: self, renderMessage: self.renderIntermediateMessage, getPeer: { id in
return self.peerTable.get(id)
- }, getPeerNotificationSettings: { self.peerNotificationSettingsTable.getEffective($0) }, getPeerPresence: { self.peerPresenceTable.get($0) })
+ }, getPeerNotificationSettings: {
+ self.peerNotificationSettingsTable.getEffective($0)
+ }, getPeerPresence: {
+ self.peerPresenceTable.get($0)
+ })
let (index, signal) = self.viewTracker.addChatListView(mutableView)
diff --git a/submodules/SectionHeaderItem/BUILD b/submodules/SectionHeaderItem/BUILD
new file mode 100644
index 0000000000..e8089be45a
--- /dev/null
+++ b/submodules/SectionHeaderItem/BUILD
@@ -0,0 +1,20 @@
+load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")
+
+swift_library(
+ name = "SectionHeaderItem",
+ module_name = "SectionHeaderItem",
+ srcs = glob([
+ "Sources/**/*.swift",
+ ]),
+ deps = [
+ "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit",
+ "//submodules/AsyncDisplayKit:AsyncDisplayKit",
+ "//submodules/Display:Display",
+ "//submodules/TelegramPresentationData:TelegramPresentationData",
+ "//submodules/ItemListUI:ItemListUI",
+ "//submodules/ListSectionHeaderNode:ListSectionHeaderNode",
+ ],
+ visibility = [
+ "//visibility:public",
+ ],
+)
diff --git a/submodules/SectionHeaderItem/Sources/SectionHeaderItem.swift b/submodules/SectionHeaderItem/Sources/SectionHeaderItem.swift
new file mode 100644
index 0000000000..726cdac204
--- /dev/null
+++ b/submodules/SectionHeaderItem/Sources/SectionHeaderItem.swift
@@ -0,0 +1,119 @@
+import Foundation
+import UIKit
+import AsyncDisplayKit
+import Display
+import SwiftSignalKit
+import TelegramPresentationData
+import ListSectionHeaderNode
+import ItemListUI
+
+public class SectionHeaderItem: ListViewItem {
+ let presentationData: ItemListPresentationData
+ let title: String
+
+ public init(presentationData: ItemListPresentationData, title: String) {
+ self.presentationData = presentationData
+ self.title = title
+ }
+
+ public func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) {
+ async {
+ let node = SectionHeaderItemNode()
+ let makeLayout = node.asyncLayout()
+ let (nodeLayout, nodeApply) = makeLayout(self, params)
+ node.contentSize = nodeLayout.contentSize
+ node.insets = nodeLayout.insets
+
+ completion(node, nodeApply)
+ }
+ }
+
+ public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
+ Queue.mainQueue().async {
+ if let nodeValue = node() as? SectionHeaderItemNode {
+ let layout = nodeValue.asyncLayout()
+ async {
+ let (nodeLayout, apply) = layout(self, params)
+ Queue.mainQueue().async {
+ completion(nodeLayout, { info in
+ apply().1(info)
+ })
+ }
+ }
+ }
+ }
+ }
+
+ public var selectable: Bool {
+ return false
+ }
+}
+
+private class SectionHeaderItemNode: ListViewItemNode {
+ private var headerNode: ListSectionHeaderNode?
+
+ private var item: SectionHeaderItem?
+ private var layoutParams: ListViewItemLayoutParams?
+
+ required init() {
+ super.init(layerBacked: false, dynamicBounce: false, rotated: false, seeThrough: false)
+ }
+
+ override func layoutForParams(_ params: ListViewItemLayoutParams, item: ListViewItem, previousItem: ListViewItem?, nextItem: ListViewItem?) {
+ if let item = self.item {
+ let makeLayout = self.asyncLayout()
+ let (nodeLayout, nodeApply) = makeLayout(item, params)
+ self.contentSize = nodeLayout.contentSize
+ self.insets = nodeLayout.insets
+ let _ = nodeApply()
+ }
+ }
+
+ func asyncLayout() -> (_ item: SectionHeaderItem, _ params: ListViewItemLayoutParams) -> (ListViewItemNodeLayout, () -> (Signal?, (ListViewItemApply) -> Void)) {
+ let currentItem = self.item
+
+ return { [weak self] item, params in
+ let contentSize = CGSize(width: params.width, height: 28.0)
+ let nodeLayout = ListViewItemNodeLayout(contentSize: contentSize, insets: UIEdgeInsets())
+
+ return (nodeLayout, { [weak self] in
+ var updatedTheme: PresentationTheme?
+ if currentItem?.presentationData.theme !== item.presentationData.theme {
+ updatedTheme = item.presentationData.theme
+ }
+
+ return (nil, { _ in
+ if let strongSelf = self {
+ strongSelf.item = item
+ strongSelf.layoutParams = params
+
+ let headerNode: ListSectionHeaderNode
+ if let currentHeaderNode = strongSelf.headerNode {
+ headerNode = currentHeaderNode
+
+ if let _ = updatedTheme {
+ headerNode.updateTheme(theme: item.presentationData.theme)
+ }
+ } else {
+ headerNode = ListSectionHeaderNode(theme: item.presentationData.theme)
+ headerNode.title = item.title
+ strongSelf.addSubnode(headerNode)
+ strongSelf.headerNode = headerNode
+ }
+
+ headerNode.frame = CGRect(origin: CGPoint(), size: contentSize)
+ headerNode.updateLayout(size: contentSize, leftInset: params.leftInset, rightInset: params.rightInset)
+ }
+ })
+ })
+ }
+ }
+
+ override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) {
+ self.layer.animateAlpha(from: 0.0, to: 1.0, duration: duration * 0.5)
+ }
+
+ override func animateRemoved(_ currentTimestamp: Double, duration: Double) {
+ self.layer.animateAlpha(from: 1.0, to: 0.0, duration: duration * 0.5, removeOnCompletion: false)
+ }
+}
diff --git a/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift
index 0f737c2d71..5e332cc700 100644
--- a/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift
+++ b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift
@@ -530,7 +530,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting
return .single(false)
}
} else {
- return .complete()
+ return .single(hasTwoStepAuth)
}
}
diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift
index 7fb91e38c4..9684fc2db0 100644
--- a/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift
+++ b/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift
@@ -78,7 +78,7 @@ final class SettingsSearchItem: ItemListControllerSearch {
let exceptionsList: Signal
let archivedStickerPacks: Signal<[ArchivedStickerPackItem]?, NoError>
let privacySettings: Signal
- let hasWallet: Signal
+ let hasTwoStepAuth: Signal
let activeSessionsContext: Signal
let webSessionsContext: Signal
@@ -86,7 +86,7 @@ final class SettingsSearchItem: ItemListControllerSearch {
private var activity: ValuePromise = ValuePromise(ignoreRepeated: false)
private let activityDisposable = MetaDisposable()
- init(context: AccountContext, theme: PresentationTheme, placeholder: String, activated: Bool, updateActivated: @escaping (Bool) -> Void, presentController: @escaping (ViewController, Any?) -> Void, pushController: @escaping (ViewController) -> Void, getNavigationController: (() -> NavigationController?)?, resolvedFaqUrl: Signal, exceptionsList: Signal, archivedStickerPacks: Signal<[ArchivedStickerPackItem]?, NoError>, privacySettings: Signal, hasWallet: Signal, activeSessionsContext: Signal, webSessionsContext: Signal) {
+ init(context: AccountContext, theme: PresentationTheme, placeholder: String, activated: Bool, updateActivated: @escaping (Bool) -> Void, presentController: @escaping (ViewController, Any?) -> Void, pushController: @escaping (ViewController) -> Void, getNavigationController: (() -> NavigationController?)?, resolvedFaqUrl: Signal, exceptionsList: Signal, archivedStickerPacks: Signal<[ArchivedStickerPackItem]?, NoError>, privacySettings: Signal, hasTwoStepAuth: Signal, activeSessionsContext: Signal, webSessionsContext: Signal) {
self.context = context
self.theme = theme
self.placeholder = placeholder
@@ -99,7 +99,7 @@ final class SettingsSearchItem: ItemListControllerSearch {
self.exceptionsList = exceptionsList
self.archivedStickerPacks = archivedStickerPacks
self.privacySettings = privacySettings
- self.hasWallet = hasWallet
+ self.hasTwoStepAuth = hasTwoStepAuth
self.activeSessionsContext = activeSessionsContext
self.webSessionsContext = webSessionsContext
self.activityDisposable.set((activity.get() |> mapToSignal { value -> Signal in
@@ -165,7 +165,7 @@ final class SettingsSearchItem: ItemListControllerSearch {
pushController(c)
}, presentController: { c, a in
presentController(c, a)
- }, getNavigationController: self.getNavigationController, resolvedFaqUrl: self.resolvedFaqUrl, exceptionsList: self.exceptionsList, archivedStickerPacks: self.archivedStickerPacks, privacySettings: self.privacySettings, hasWallet: self.hasWallet, activeSessionsContext: self.activeSessionsContext, webSessionsContext: self.webSessionsContext)
+ }, getNavigationController: self.getNavigationController, resolvedFaqUrl: self.resolvedFaqUrl, exceptionsList: self.exceptionsList, archivedStickerPacks: self.archivedStickerPacks, privacySettings: self.privacySettings, hasTwoStepAuth: self.hasTwoStepAuth, activeSessionsContext: self.activeSessionsContext, webSessionsContext: self.webSessionsContext)
}
}
}
@@ -362,7 +362,7 @@ public final class SettingsSearchContainerNode: SearchDisplayControllerContentNo
private var presentationDataDisposable: Disposable?
private let presentationDataPromise: Promise
- public init(context: AccountContext, openResult: @escaping (SettingsSearchableItem) -> Void, resolvedFaqUrl: Signal, exceptionsList: Signal, archivedStickerPacks: Signal<[ArchivedStickerPackItem]?, NoError>, privacySettings: Signal, hasWallet: Signal, activeSessionsContext: Signal, webSessionsContext: Signal) {
+ public init(context: AccountContext, openResult: @escaping (SettingsSearchableItem) -> Void, resolvedFaqUrl: Signal, exceptionsList: Signal, archivedStickerPacks: Signal<[ArchivedStickerPackItem]?, NoError>, privacySettings: Signal, hasTwoStepAuth: Signal, activeSessionsContext: Signal, webSessionsContext: Signal) {
self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
self.presentationDataPromise = Promise(self.presentationData)
@@ -389,7 +389,7 @@ public final class SettingsSearchContainerNode: SearchDisplayControllerContentNo
})
let searchableItems = Promise<[SettingsSearchableItem]>()
- searchableItems.set(settingsSearchableItems(context: context, notificationExceptionsList: exceptionsList, archivedStickerPacks: archivedStickerPacks, privacySettings: privacySettings, hasWallet: hasWallet, activeSessionsContext: activeSessionsContext, webSessionsContext: webSessionsContext))
+ searchableItems.set(settingsSearchableItems(context: context, notificationExceptionsList: exceptionsList, archivedStickerPacks: archivedStickerPacks, privacySettings: privacySettings, hasTwoStepAuth: hasTwoStepAuth, activeSessionsContext: activeSessionsContext, webSessionsContext: webSessionsContext))
let faqItems = Promise<[SettingsSearchableItem]>()
faqItems.set(faqSearchableItems(context: context, resolvedUrl: resolvedFaqUrl, suggestAccountDeletion: false))
@@ -662,13 +662,13 @@ private final class SettingsSearchItemNode: ItemListControllerSearchNode {
let exceptionsList: Signal
let archivedStickerPacks: Signal<[ArchivedStickerPackItem]?, NoError>
let privacySettings: Signal
- let hasWallet: Signal
+ let hasTwoStepAuth: Signal
let activeSessionsContext: Signal
let webSessionsContext: Signal
var cancel: () -> Void
- init(context: AccountContext, cancel: @escaping () -> Void, updateActivity: @escaping(Bool) -> Void, pushController: @escaping (ViewController) -> Void, presentController: @escaping (ViewController, Any?) -> Void, getNavigationController: (() -> NavigationController?)?, resolvedFaqUrl: Signal, exceptionsList: Signal, archivedStickerPacks: Signal<[ArchivedStickerPackItem]?, NoError>, privacySettings: Signal, hasWallet: Signal, activeSessionsContext: Signal, webSessionsContext: Signal) {
+ init(context: AccountContext, cancel: @escaping () -> Void, updateActivity: @escaping(Bool) -> Void, pushController: @escaping (ViewController) -> Void, presentController: @escaping (ViewController, Any?) -> Void, getNavigationController: (() -> NavigationController?)?, resolvedFaqUrl: Signal, exceptionsList: Signal, archivedStickerPacks: Signal<[ArchivedStickerPackItem]?, NoError>, privacySettings: Signal, hasTwoStepAuth: Signal, activeSessionsContext: Signal, webSessionsContext: Signal) {
self.context = context
self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
self.cancel = cancel
@@ -679,7 +679,7 @@ private final class SettingsSearchItemNode: ItemListControllerSearchNode {
self.exceptionsList = exceptionsList
self.archivedStickerPacks = archivedStickerPacks
self.privacySettings = privacySettings
- self.hasWallet = hasWallet
+ self.hasTwoStepAuth = hasTwoStepAuth
self.activeSessionsContext = activeSessionsContext
self.webSessionsContext = webSessionsContext
@@ -721,7 +721,7 @@ private final class SettingsSearchItemNode: ItemListControllerSearchNode {
}
})
}
- }, resolvedFaqUrl: self.resolvedFaqUrl, exceptionsList: self.exceptionsList, archivedStickerPacks: self.archivedStickerPacks, privacySettings: self.privacySettings, hasWallet: self.hasWallet, activeSessionsContext: self.activeSessionsContext, webSessionsContext: self.webSessionsContext), cancel: { [weak self] in
+ }, resolvedFaqUrl: self.resolvedFaqUrl, exceptionsList: self.exceptionsList, archivedStickerPacks: self.archivedStickerPacks, privacySettings: self.privacySettings, hasTwoStepAuth: self.hasTwoStepAuth, activeSessionsContext: self.activeSessionsContext, webSessionsContext: self.webSessionsContext), cancel: { [weak self] in
self?.cancel()
})
diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift
index c0fea2181e..da8eb5fbe4 100644
--- a/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift
+++ b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift
@@ -729,7 +729,7 @@ private func languageSearchableItems(context: AccountContext, localizations: [Lo
return items
}
-func settingsSearchableItems(context: AccountContext, notificationExceptionsList: Signal, archivedStickerPacks: Signal<[ArchivedStickerPackItem]?, NoError>, privacySettings: Signal, hasWallet: Signal, activeSessionsContext: Signal, webSessionsContext: Signal) -> Signal<[SettingsSearchableItem], NoError> {
+func settingsSearchableItems(context: AccountContext, notificationExceptionsList: Signal, archivedStickerPacks: Signal<[ArchivedStickerPackItem]?, NoError>, privacySettings: Signal, hasTwoStepAuth: Signal, activeSessionsContext: Signal, webSessionsContext: Signal) -> Signal<[SettingsSearchableItem], NoError> {
let watchAppInstalled = (context.watchManager?.watchAppInstalled ?? .single(false))
|> take(1)
@@ -825,8 +825,8 @@ func settingsSearchableItems(context: AccountContext, notificationExceptionsList
}
}
- return combineLatest(watchAppInstalled, canAddAccount, localizations, notificationSettings, notificationExceptionsList, archivedStickerPacks, proxyServers, privacySettings, hasWallet, activeSessionsContext, activeWebSessionsContext)
- |> map { watchAppInstalled, canAddAccount, localizations, notificationSettings, notificationExceptionsList, archivedStickerPacks, proxyServers, privacySettings, hasWallet, activeSessionsContext, activeWebSessionsContext in
+ return combineLatest(watchAppInstalled, canAddAccount, localizations, notificationSettings, notificationExceptionsList, archivedStickerPacks, proxyServers, privacySettings, hasTwoStepAuth, activeSessionsContext, activeWebSessionsContext)
+ |> map { watchAppInstalled, canAddAccount, localizations, notificationSettings, notificationExceptionsList, archivedStickerPacks, proxyServers, privacySettings, hasTwoStepAuth, activeSessionsContext, activeWebSessionsContext in
let strings = context.sharedContext.currentPresentationData.with { $0 }.strings
var allItems: [SettingsSearchableItem] = []
@@ -875,21 +875,12 @@ func settingsSearchableItems(context: AccountContext, notificationExceptionsList
allItems.append(watch)
}
- let passport = SettingsSearchableItem(id: .passport(0), title: strings.Settings_Passport, alternate: synonyms(strings.SettingsSearch_Synonyms_Passport), icon: .passport, breadcrumbs: [], present: { context, _, present in
- present(.modal, SecureIdAuthController(context: context, mode: .list))
- })
- allItems.append(passport)
-
- #if ENABLE_WALLET
- if hasWallet {
- let wallet = SettingsSearchableItem(id: .wallet(0), title: strings.Settings_Wallet, alternate: synonyms(strings.SettingsSearch_Synonyms_Wallet), icon: .wallet, breadcrumbs: [], present: { context, _, present in
- context.sharedContext.openWallet(context: context, walletContext: .generic, present: { c in
- present(.push, c)
- })
+ if let hasTwoStepAuth = hasTwoStepAuth, hasTwoStepAuth {
+ let passport = SettingsSearchableItem(id: .passport(0), title: strings.Settings_Passport, alternate: synonyms(strings.SettingsSearch_Synonyms_Passport), icon: .passport, breadcrumbs: [], present: { context, _, present in
+ present(.modal, SecureIdAuthController(context: context, mode: .list))
})
- allItems.append(wallet)
+ allItems.append(passport)
}
- #endif
let support = SettingsSearchableItem(id: .support(0), title: strings.Settings_Support, alternate: synonyms(strings.SettingsSearch_Synonyms_Support), icon: .support, breadcrumbs: [], present: { context, _, present in
let _ = (supportPeerId(account: context.account)
diff --git a/submodules/ShareController/Sources/ShareController.swift b/submodules/ShareController/Sources/ShareController.swift
index 0250e1680e..2d56f4729b 100644
--- a/submodules/ShareController/Sources/ShareController.swift
+++ b/submodules/ShareController/Sources/ShareController.swift
@@ -135,6 +135,8 @@ private func collectExternalShareItems(strings: PresentationStrings, dateTimeFor
fileName = value
} else if file.isVideo {
fileName = "telegram_video.mp4"
+ } else if file.isVoice {
+ fileName = "telegram_audio.ogg"
} else {
fileName = "file"
}
diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewControllerNode.swift b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewControllerNode.swift
index a7b3bfebb2..115d019f49 100644
--- a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewControllerNode.swift
+++ b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewControllerNode.swift
@@ -406,9 +406,9 @@ final class StickerPackPreviewControllerNode: ViewControllerTracingNode, UIScrol
let minimallyRevealedRowCount: CGFloat = 3.5
let initiallyRevealedRowCount = min(minimallyRevealedRowCount, CGFloat(rowCount))
- let topInset = max(0.0, contentFrame.size.height - initiallyRevealedRowCount * itemWidth - titleAreaHeight - buttonHeight)
let bottomGridInset = hasShareButton ? buttonHeight * 2.0 : buttonHeight
-
+ let topInset = max(0.0, contentFrame.size.height - initiallyRevealedRowCount * itemWidth - titleAreaHeight - bottomGridInset)
+
transition.updateFrame(node: self.contentContainerNode, frame: contentContainerFrame)
if let activityIndicator = self.activityIndicator {
diff --git a/submodules/SyncCore/Sources/ExportedInvitation.swift b/submodules/SyncCore/Sources/ExportedInvitation.swift
index 41585680b2..2eab693250 100644
--- a/submodules/SyncCore/Sources/ExportedInvitation.swift
+++ b/submodules/SyncCore/Sources/ExportedInvitation.swift
@@ -6,16 +6,18 @@ public struct ExportedInvitation: PostboxCoding, Equatable {
public let isRevoked: Bool
public let adminId: PeerId
public let date: Int32
+ public let startDate: Int32?
public let expireDate: Int32?
public let usageLimit: Int32?
public let count: Int32?
- public init(link: String, isPermanent: Bool, isRevoked: Bool, adminId: PeerId, date: Int32, expireDate: Int32?, usageLimit: Int32?, count: Int32?) {
+ public init(link: String, isPermanent: Bool, isRevoked: Bool, adminId: PeerId, date: Int32, startDate: Int32?, expireDate: Int32?, usageLimit: Int32?, count: Int32?) {
self.link = link
self.isPermanent = isPermanent
self.isRevoked = isRevoked
self.adminId = adminId
self.date = date
+ self.startDate = startDate
self.expireDate = expireDate
self.usageLimit = usageLimit
self.count = count
@@ -27,6 +29,7 @@ public struct ExportedInvitation: PostboxCoding, Equatable {
self.isRevoked = decoder.decodeBoolForKey("revoked", orElse: false)
self.adminId = PeerId(decoder.decodeInt64ForKey("adminId", orElse: 0))
self.date = decoder.decodeInt32ForKey("date", orElse: 0)
+ self.startDate = decoder.decodeOptionalInt32ForKey("startDate")
self.expireDate = decoder.decodeOptionalInt32ForKey("expireDate")
self.usageLimit = decoder.decodeOptionalInt32ForKey("usageLimit")
self.count = decoder.decodeOptionalInt32ForKey("count")
@@ -38,6 +41,11 @@ public struct ExportedInvitation: PostboxCoding, Equatable {
encoder.encodeBool(self.isRevoked, forKey: "revoked")
encoder.encodeInt64(self.adminId.toInt64(), forKey: "adminId")
encoder.encodeInt32(self.date, forKey: "date")
+ if let startDate = self.startDate {
+ encoder.encodeInt32(startDate, forKey: "startDate")
+ } else {
+ encoder.encodeNil(forKey: "startDate")
+ }
if let expireDate = self.expireDate {
encoder.encodeInt32(expireDate, forKey: "expireDate")
} else {
@@ -56,6 +64,6 @@ public struct ExportedInvitation: PostboxCoding, Equatable {
}
public static func ==(lhs: ExportedInvitation, rhs: ExportedInvitation) -> Bool {
- return lhs.link == rhs.link && lhs.isPermanent == rhs.isPermanent && lhs.isRevoked == rhs.isRevoked && lhs.adminId == rhs.adminId && lhs.date == rhs.date && lhs.expireDate == rhs.expireDate && lhs.usageLimit == rhs.usageLimit && lhs.count == rhs.count
+ return lhs.link == rhs.link && lhs.isPermanent == rhs.isPermanent && lhs.isRevoked == rhs.isRevoked && lhs.adminId == rhs.adminId && lhs.date == rhs.date && lhs.startDate == rhs.startDate && lhs.expireDate == rhs.expireDate && lhs.usageLimit == rhs.usageLimit && lhs.count == rhs.count
}
}
diff --git a/submodules/SyncCore/Sources/TelegramChatAdminRights.swift b/submodules/SyncCore/Sources/TelegramChatAdminRights.swift
index d0d18e3648..4d5050cb3e 100644
--- a/submodules/SyncCore/Sources/TelegramChatAdminRights.swift
+++ b/submodules/SyncCore/Sources/TelegramChatAdminRights.swift
@@ -22,7 +22,7 @@ public struct TelegramChatAdminRightsFlags: OptionSet {
public static let canBeAnonymous = TelegramChatAdminRightsFlags(rawValue: 1 << 10)
public static let canManageCalls = TelegramChatAdminRightsFlags(rawValue: 1 << 11)
- public static var all:TelegramChatAdminRightsFlags {
+ public static var all: TelegramChatAdminRightsFlags {
return [.canChangeInfo, .canPostMessages, .canEditMessages, .canDeleteMessages, .canBanUsers, .canInviteUsers, .canPinMessages, .canAddAdmins, .canBeAnonymous, .canManageCalls]
}
@@ -34,8 +34,7 @@ public struct TelegramChatAdminRightsFlags: OptionSet {
.canPinMessages,
.canManageCalls,
.canBeAnonymous,
- .canAddAdmins,
- .canManageCalls
+ .canAddAdmins
]
public static var broadcastSpecific: TelegramChatAdminRightsFlags = [
diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift
index 9bb8a4b1a7..8a960cff3d 100644
--- a/submodules/TelegramApi/Sources/Api0.swift
+++ b/submodules/TelegramApi/Sources/Api0.swift
@@ -737,7 +737,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-1634752813] = { return Api.messages.FavedStickers.parse_favedStickersNotModified($0) }
dict[-209768682] = { return Api.messages.FavedStickers.parse_favedStickers($0) }
dict[1776236393] = { return Api.ExportedChatInvite.parse_chatInviteEmpty($0) }
- dict[-1448589334] = { return Api.ExportedChatInvite.parse_chatInviteExported($0) }
+ dict[1847917725] = { return Api.ExportedChatInvite.parse_chatInviteExported($0) }
dict[-1389486888] = { return Api.account.AuthorizationForm.parse_authorizationForm($0) }
dict[-1392388579] = { return Api.Authorization.parse_authorization($0) }
dict[-1361650766] = { return Api.MaskCoords.parse_maskCoords($0) }
@@ -869,8 +869,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-1417756512] = { return Api.EncryptedChat.parse_encryptedChatEmpty($0) }
dict[1006044124] = { return Api.EncryptedChat.parse_encryptedChatWaiting($0) }
dict[-94974410] = { return Api.EncryptedChat.parse_encryptedChat($0) }
- dict[332848423] = { return Api.EncryptedChat.parse_encryptedChatDiscarded($0) }
dict[1651608194] = { return Api.EncryptedChat.parse_encryptedChatRequested($0) }
+ dict[505183301] = { return Api.EncryptedChat.parse_encryptedChatDiscarded($0) }
dict[-901375139] = { return Api.PeerLocated.parse_peerLocated($0) }
dict[-118740917] = { return Api.PeerLocated.parse_peerSelfLocated($0) }
dict[922273905] = { return Api.Document.parse_documentEmpty($0) }
diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift
index f224f02325..144a3781bb 100644
--- a/submodules/TelegramApi/Sources/Api1.swift
+++ b/submodules/TelegramApi/Sources/Api1.swift
@@ -20979,7 +20979,7 @@ public extension Api {
}
public enum ExportedChatInvite: TypeConstructorDescription {
case chatInviteEmpty
- case chatInviteExported(flags: Int32, link: String, adminId: Int32, date: Int32, expireDate: Int32?, usageLimit: Int32?, usage: Int32?)
+ case chatInviteExported(flags: Int32, link: String, adminId: Int32, date: Int32, startDate: Int32?, expireDate: Int32?, usageLimit: Int32?, usage: Int32?)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
@@ -20989,14 +20989,15 @@ public extension Api {
}
break
- case .chatInviteExported(let flags, let link, let adminId, let date, let expireDate, let usageLimit, let usage):
+ case .chatInviteExported(let flags, let link, let adminId, let date, let startDate, let expireDate, let usageLimit, let usage):
if boxed {
- buffer.appendInt32(-1448589334)
+ buffer.appendInt32(1847917725)
}
serializeInt32(flags, buffer: buffer, boxed: false)
serializeString(link, buffer: buffer, boxed: false)
serializeInt32(adminId, buffer: buffer, boxed: false)
serializeInt32(date, buffer: buffer, boxed: false)
+ if Int(flags) & Int(1 << 4) != 0 {serializeInt32(startDate!, buffer: buffer, boxed: false)}
if Int(flags) & Int(1 << 1) != 0 {serializeInt32(expireDate!, buffer: buffer, boxed: false)}
if Int(flags) & Int(1 << 2) != 0 {serializeInt32(usageLimit!, buffer: buffer, boxed: false)}
if Int(flags) & Int(1 << 3) != 0 {serializeInt32(usage!, buffer: buffer, boxed: false)}
@@ -21008,8 +21009,8 @@ public extension Api {
switch self {
case .chatInviteEmpty:
return ("chatInviteEmpty", [])
- case .chatInviteExported(let flags, let link, let adminId, let date, let expireDate, let usageLimit, let usage):
- return ("chatInviteExported", [("flags", flags), ("link", link), ("adminId", adminId), ("date", date), ("expireDate", expireDate), ("usageLimit", usageLimit), ("usage", usage)])
+ case .chatInviteExported(let flags, let link, let adminId, let date, let startDate, let expireDate, let usageLimit, let usage):
+ return ("chatInviteExported", [("flags", flags), ("link", link), ("adminId", adminId), ("date", date), ("startDate", startDate), ("expireDate", expireDate), ("usageLimit", usageLimit), ("usage", usage)])
}
}
@@ -21026,20 +21027,23 @@ public extension Api {
var _4: Int32?
_4 = reader.readInt32()
var _5: Int32?
- if Int(_1!) & Int(1 << 1) != 0 {_5 = reader.readInt32() }
+ if Int(_1!) & Int(1 << 4) != 0 {_5 = reader.readInt32() }
var _6: Int32?
- if Int(_1!) & Int(1 << 2) != 0 {_6 = reader.readInt32() }
+ if Int(_1!) & Int(1 << 1) != 0 {_6 = reader.readInt32() }
var _7: Int32?
- if Int(_1!) & Int(1 << 3) != 0 {_7 = reader.readInt32() }
+ if Int(_1!) & Int(1 << 2) != 0 {_7 = reader.readInt32() }
+ var _8: Int32?
+ if Int(_1!) & Int(1 << 3) != 0 {_8 = reader.readInt32() }
let _c1 = _1 != nil
let _c2 = _2 != nil
let _c3 = _3 != nil
let _c4 = _4 != nil
- let _c5 = (Int(_1!) & Int(1 << 1) == 0) || _5 != nil
- let _c6 = (Int(_1!) & Int(1 << 2) == 0) || _6 != nil
- let _c7 = (Int(_1!) & Int(1 << 3) == 0) || _7 != nil
- if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 {
- return Api.ExportedChatInvite.chatInviteExported(flags: _1!, link: _2!, adminId: _3!, date: _4!, expireDate: _5, usageLimit: _6, usage: _7)
+ let _c5 = (Int(_1!) & Int(1 << 4) == 0) || _5 != nil
+ let _c6 = (Int(_1!) & Int(1 << 1) == 0) || _6 != nil
+ let _c7 = (Int(_1!) & Int(1 << 2) == 0) || _7 != nil
+ let _c8 = (Int(_1!) & Int(1 << 3) == 0) || _8 != nil
+ if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 {
+ return Api.ExportedChatInvite.chatInviteExported(flags: _1!, link: _2!, adminId: _3!, date: _4!, startDate: _5, expireDate: _6, usageLimit: _7, usage: _8)
}
else {
return nil
@@ -24065,8 +24069,8 @@ public extension Api {
case encryptedChatEmpty(id: Int32)
case encryptedChatWaiting(id: Int32, accessHash: Int64, date: Int32, adminId: Int32, participantId: Int32)
case encryptedChat(id: Int32, accessHash: Int64, date: Int32, adminId: Int32, participantId: Int32, gAOrB: Buffer, keyFingerprint: Int64)
- case encryptedChatDiscarded(id: Int32)
case encryptedChatRequested(flags: Int32, folderId: Int32?, id: Int32, accessHash: Int64, date: Int32, adminId: Int32, participantId: Int32, gA: Buffer)
+ case encryptedChatDiscarded(flags: Int32, id: Int32)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
@@ -24098,12 +24102,6 @@ public extension Api {
serializeBytes(gAOrB, buffer: buffer, boxed: false)
serializeInt64(keyFingerprint, buffer: buffer, boxed: false)
break
- case .encryptedChatDiscarded(let id):
- if boxed {
- buffer.appendInt32(332848423)
- }
- serializeInt32(id, buffer: buffer, boxed: false)
- break
case .encryptedChatRequested(let flags, let folderId, let id, let accessHash, let date, let adminId, let participantId, let gA):
if boxed {
buffer.appendInt32(1651608194)
@@ -24117,6 +24115,13 @@ public extension Api {
serializeInt32(participantId, buffer: buffer, boxed: false)
serializeBytes(gA, buffer: buffer, boxed: false)
break
+ case .encryptedChatDiscarded(let flags, let id):
+ if boxed {
+ buffer.appendInt32(505183301)
+ }
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ serializeInt32(id, buffer: buffer, boxed: false)
+ break
}
}
@@ -24128,10 +24133,10 @@ public extension Api {
return ("encryptedChatWaiting", [("id", id), ("accessHash", accessHash), ("date", date), ("adminId", adminId), ("participantId", participantId)])
case .encryptedChat(let id, let accessHash, let date, let adminId, let participantId, let gAOrB, let keyFingerprint):
return ("encryptedChat", [("id", id), ("accessHash", accessHash), ("date", date), ("adminId", adminId), ("participantId", participantId), ("gAOrB", gAOrB), ("keyFingerprint", keyFingerprint)])
- case .encryptedChatDiscarded(let id):
- return ("encryptedChatDiscarded", [("id", id)])
case .encryptedChatRequested(let flags, let folderId, let id, let accessHash, let date, let adminId, let participantId, let gA):
return ("encryptedChatRequested", [("flags", flags), ("folderId", folderId), ("id", id), ("accessHash", accessHash), ("date", date), ("adminId", adminId), ("participantId", participantId), ("gA", gA)])
+ case .encryptedChatDiscarded(let flags, let id):
+ return ("encryptedChatDiscarded", [("flags", flags), ("id", id)])
}
}
@@ -24198,17 +24203,6 @@ public extension Api {
return nil
}
}
- public static func parse_encryptedChatDiscarded(_ reader: BufferReader) -> EncryptedChat? {
- var _1: Int32?
- _1 = reader.readInt32()
- let _c1 = _1 != nil
- if _c1 {
- return Api.EncryptedChat.encryptedChatDiscarded(id: _1!)
- }
- else {
- return nil
- }
- }
public static func parse_encryptedChatRequested(_ reader: BufferReader) -> EncryptedChat? {
var _1: Int32?
_1 = reader.readInt32()
@@ -24241,6 +24235,20 @@ public extension Api {
return nil
}
}
+ public static func parse_encryptedChatDiscarded(_ reader: BufferReader) -> EncryptedChat? {
+ var _1: Int32?
+ _1 = reader.readInt32()
+ var _2: Int32?
+ _2 = reader.readInt32()
+ let _c1 = _1 != nil
+ let _c2 = _2 != nil
+ if _c1 && _c2 {
+ return Api.EncryptedChat.encryptedChatDiscarded(flags: _1!, id: _2!)
+ }
+ else {
+ return nil
+ }
+ }
}
public enum PeerLocated: TypeConstructorDescription {
diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift
index 26b2b9f5a1..84cb1abb7e 100644
--- a/submodules/TelegramApi/Sources/Api3.swift
+++ b/submodules/TelegramApi/Sources/Api3.swift
@@ -2109,20 +2109,6 @@ public extension Api {
})
}
- public static func discardEncryption(chatId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
- let buffer = Buffer()
- buffer.appendInt32(-304536635)
- serializeInt32(chatId, buffer: buffer, boxed: false)
- return (FunctionDescription(name: "messages.discardEncryption", parameters: [("chatId", chatId)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
- let reader = BufferReader(buffer)
- var result: Api.Bool?
- if let signature = reader.readInt32() {
- result = Api.parse(reader, signature: signature) as? Api.Bool
- }
- return result
- })
- }
-
public static func setEncryptedTyping(peer: Api.InputEncryptedChat, typing: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
let buffer = Buffer()
buffer.appendInt32(2031374829)
@@ -3903,24 +3889,6 @@ public extension Api {
})
}
- public static func getExportedChatInvites(flags: Int32, peer: Api.InputPeer, adminId: Api.InputUser?, offsetLink: String?, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
- let buffer = Buffer()
- buffer.appendInt32(1838984707)
- serializeInt32(flags, buffer: buffer, boxed: false)
- peer.serialize(buffer, true)
- if Int(flags) & Int(1 << 0) != 0 {adminId!.serialize(buffer, true)}
- if Int(flags) & Int(1 << 2) != 0 {serializeString(offsetLink!, buffer: buffer, boxed: false)}
- serializeInt32(limit, buffer: buffer, boxed: false)
- return (FunctionDescription(name: "messages.getExportedChatInvites", parameters: [("flags", flags), ("peer", peer), ("adminId", adminId), ("offsetLink", offsetLink), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.ExportedChatInvites? in
- let reader = BufferReader(buffer)
- var result: Api.messages.ExportedChatInvites?
- if let signature = reader.readInt32() {
- result = Api.parse(reader, signature: signature) as? Api.messages.ExportedChatInvites
- }
- return result
- })
- }
-
public static func exportChatInvite(flags: Int32, peer: Api.InputPeer, expireDate: Int32?, usageLimit: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
let buffer = Buffer()
buffer.appendInt32(347716823)
@@ -3973,6 +3941,96 @@ public extension Api {
return result
})
}
+
+ public static func getExportedChatInvites(flags: Int32, peer: Api.InputPeer, adminId: Api.InputUser?, offsetLink: String?, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(1838984707)
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ peer.serialize(buffer, true)
+ if Int(flags) & Int(1 << 0) != 0 {adminId!.serialize(buffer, true)}
+ if Int(flags) & Int(1 << 2) != 0 {serializeString(offsetLink!, buffer: buffer, boxed: false)}
+ serializeInt32(limit, buffer: buffer, boxed: false)
+ return (FunctionDescription(name: "messages.getExportedChatInvites", parameters: [("flags", flags), ("peer", peer), ("adminId", adminId), ("offsetLink", offsetLink), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.ExportedChatInvites? in
+ let reader = BufferReader(buffer)
+ var result: Api.messages.ExportedChatInvites?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.messages.ExportedChatInvites
+ }
+ return result
+ })
+ }
+
+ public static func deleteRevokedExportedChatInvites(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(1375999075)
+ peer.serialize(buffer, true)
+ return (FunctionDescription(name: "messages.deleteRevokedExportedChatInvites", parameters: [("peer", peer)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
+ let reader = BufferReader(buffer)
+ var result: Api.Bool?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.Bool
+ }
+ return result
+ })
+ }
+
+ public static func deleteExportedChatInvite(peer: Api.InputPeer, link: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(-731601877)
+ peer.serialize(buffer, true)
+ serializeString(link, buffer: buffer, boxed: false)
+ return (FunctionDescription(name: "messages.deleteExportedChatInvite", parameters: [("peer", peer), ("link", link)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
+ let reader = BufferReader(buffer)
+ var result: Api.Bool?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.Bool
+ }
+ return result
+ })
+ }
+
+ public static func discardEncryption(flags: Int32, chatId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(-208425312)
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ serializeInt32(chatId, buffer: buffer, boxed: false)
+ return (FunctionDescription(name: "messages.discardEncryption", parameters: [("flags", flags), ("chatId", chatId)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
+ let reader = BufferReader(buffer)
+ var result: Api.Bool?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.Bool
+ }
+ return result
+ })
+ }
+
+ public static func deleteChat(chatId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(-2094760687)
+ serializeInt32(chatId, buffer: buffer, boxed: false)
+ return (FunctionDescription(name: "messages.deleteChat", parameters: [("chatId", chatId)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
+ let reader = BufferReader(buffer)
+ var result: Api.Bool?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.Bool
+ }
+ return result
+ })
+ }
+
+ public static func deletePhoneCallHistory(flags: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
+ let buffer = Buffer()
+ buffer.appendInt32(1828657989)
+ serializeInt32(flags, buffer: buffer, boxed: false)
+ return (FunctionDescription(name: "messages.deletePhoneCallHistory", parameters: [("flags", flags)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.AffectedHistory? in
+ let reader = BufferReader(buffer)
+ var result: Api.messages.AffectedHistory?
+ if let signature = reader.readInt32() {
+ result = Api.parse(reader, signature: signature) as? Api.messages.AffectedHistory
+ }
+ return result
+ })
+ }
}
public struct channels {
public static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) {
diff --git a/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift b/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift
index 3be5e77363..31aab50b23 100644
--- a/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift
+++ b/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift
@@ -398,10 +398,16 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi
if scrollView.isDecelerating {
self.changeTrack()
}
+
+ self.rateButton.alpha = 0.0
+ self.rateButton.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2)
}
public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
self.changeTrack()
+
+ self.rateButton.alpha = 1.0
+ self.rateButton.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
}
public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
@@ -409,6 +415,9 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi
return
}
self.changeTrack()
+
+ self.rateButton.alpha = 1.0
+ self.rateButton.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
}
private func changeTrack() {
@@ -457,9 +466,11 @@ public final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollVi
self.rightMaskNode.transform = CATransform3DMakeScale(-1.0, 1.0, 1.0)
self.rightMaskNode.frame = CGRect(x: size.width - inset - 12.0, y: 0.0, width: 12.0, height: minHeight)
- self.scrollNode.view.contentSize = contentSize
- self.scrollNode.view.contentOffset = CGPoint(x: contentOffset, y: 0.0)
- self.initialContentOffset = contentOffset
+ if !self.scrollNode.view.isTracking && !self.scrollNode.view.isTracking {
+ self.scrollNode.view.contentSize = contentSize
+ self.scrollNode.view.contentOffset = CGPoint(x: contentOffset, y: 0.0)
+ self.initialContentOffset = contentOffset
+ }
let bounds = CGRect(origin: CGPoint(), size: size)
let closeButtonSize = self.closeButton.measure(CGSize(width: 100.0, height: 100.0))
diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift b/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift
index edb9183ef6..98300a09a4 100644
--- a/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift
+++ b/submodules/TelegramCallsUI/Sources/VoiceChatActionButton.swift
@@ -483,7 +483,8 @@ private final class VoiceChatActionButtonBackgroundNode: ASDisplayNode {
self.growingForegroundCircleLayer.isHidden = true
self.foregroundGradientLayer.type = .radial
- self.foregroundGradientLayer.colors = [lightBlue.cgColor, blue.cgColor]
+ self.foregroundGradientLayer.colors = [lightBlue.cgColor, blue.cgColor, blue.cgColor]
+ self.foregroundGradientLayer.locations = [0.0, 0.85, 1.0]
self.foregroundGradientLayer.startPoint = CGPoint(x: 1.0, y: 0.0)
self.foregroundGradientLayer.endPoint = CGPoint(x: 0.0, y: 1.0)
@@ -655,16 +656,16 @@ private final class VoiceChatActionButtonBackgroundNode: ASDisplayNode {
let targetScale: CGFloat
if let active = active {
if active {
- targetColors = [activeBlue.cgColor, green.cgColor]
+ targetColors = [activeBlue.cgColor, green.cgColor, green.cgColor]
targetScale = 0.89
outerColor = UIColor(rgb: 0x21674f)
} else {
- targetColors = [lightBlue.cgColor, blue.cgColor]
+ targetColors = [lightBlue.cgColor, blue.cgColor, blue.cgColor]
targetScale = 0.85
outerColor = UIColor(rgb: 0x1d588d)
}
} else {
- targetColors = [lightBlue.cgColor, blue.cgColor]
+ targetColors = [lightBlue.cgColor, blue.cgColor, blue.cgColor]
targetScale = 0.3
outerColor = nil
}
diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift
index 06527112c8..548c25ce15 100644
--- a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift
+++ b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift
@@ -1035,6 +1035,14 @@ public final class VoiceChatController: ViewController {
let subtitle = strongSelf.presentationData.strings.VoiceChat_Panel_Members(Int32(max(1, callMembers?.totalCount ?? 0)))
strongSelf.currentSubtitle = subtitle
+ if let callState = strongSelf.callState, callState.canManageCall {
+ strongSelf.optionsButton.isUserInteractionEnabled = true
+ strongSelf.optionsButton.alpha = 1.0
+ } else {
+ strongSelf.optionsButton.isUserInteractionEnabled = false
+ strongSelf.optionsButton.alpha = 0.0
+ }
+
if let (layout, navigationHeight) = strongSelf.validLayout {
strongSelf.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .immediate)
}
@@ -1074,27 +1082,6 @@ public final class VoiceChatController: ViewController {
strongSelf.didSetDataReady = true
strongSelf.controller?.dataReady.set(true)
}
-
- 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
- }
- }
- }
})
self.audioOutputStateDisposable = (call.audioOutputState
@@ -1142,7 +1129,7 @@ public final class VoiceChatController: ViewController {
self.audioOutputNode.addTarget(self, action: #selector(self.audioOutputPressed), forControlEvents: .touchUpInside)
- self.optionsButton.contextAction = { [weak self, weak optionsButton] sourceNode, gesture in
+ self.optionsButton.contextAction = { [weak self] sourceNode, gesture in
guard let strongSelf = self, let controller = strongSelf.controller else {
return
}
@@ -1181,16 +1168,7 @@ public final class VoiceChatController: ViewController {
strongSelf.call.updateDefaultParticipantsAreMuted(isMuted: true)
})))
}
-
- if !items.isEmpty {
- items.append(.separator)
- }
-
- items.append(.custom(VoiceChatRecordingContextItem(timestamp: CFAbsoluteTimeGetCurrent(), action: { (_, f) in
- f(.dismissWithoutContent)
-
- }), false))
-
+
if !items.isEmpty {
items.append(.separator)
}
@@ -1225,6 +1203,10 @@ public final class VoiceChatController: ViewController {
})))
}
+ if items.isEmpty {
+ return
+ }
+
let optionsButton: VoiceChatHeaderButton
if !strongSelf.recButton.isHidden {
optionsButton = strongSelf.recButton
diff --git a/submodules/TelegramCore/Sources/ExportedInvitation.swift b/submodules/TelegramCore/Sources/ExportedInvitation.swift
index fcc085bafd..013b2692e1 100644
--- a/submodules/TelegramCore/Sources/ExportedInvitation.swift
+++ b/submodules/TelegramCore/Sources/ExportedInvitation.swift
@@ -9,8 +9,8 @@ extension ExportedInvitation {
switch apiExportedInvite {
case .chatInviteEmpty:
return nil
- case let .chatInviteExported(flags, link, adminId, date, expireDate, usageLimit, usage):
- self = ExportedInvitation(link: link, isPermanent: (flags & (1 << 5)) != 0, isRevoked: (flags & (1 << 0)) != 0, adminId: PeerId(namespace: Namespaces.Peer.CloudUser, id: adminId), date: date, expireDate: expireDate, usageLimit: usageLimit, count: usage)
+ case let .chatInviteExported(flags, link, adminId, date, startDate, expireDate, usageLimit, usage):
+ self = ExportedInvitation(link: link, isPermanent: (flags & (1 << 5)) != 0, isRevoked: (flags & (1 << 0)) != 0, adminId: PeerId(namespace: Namespaces.Peer.CloudUser, id: adminId), date: date, startDate: startDate, expireDate: expireDate, usageLimit: usageLimit, count: usage)
}
}
}
diff --git a/submodules/TelegramCore/Sources/InvitationLinks.swift b/submodules/TelegramCore/Sources/InvitationLinks.swift
index 760780660e..04a9c3d1d9 100644
--- a/submodules/TelegramCore/Sources/InvitationLinks.swift
+++ b/submodules/TelegramCore/Sources/InvitationLinks.swift
@@ -9,7 +9,7 @@ import SyncCore
public func ensuredExistingPeerExportedInvitation(account: Account, peerId: PeerId, revokeExisted: Bool = false) -> Signal {
return account.postbox.transaction { transaction -> Signal in
if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) {
- var flags: Int32 = (1 << 2)
+ let flags: Int32 = (1 << 2)
if let _ = peer as? TelegramChannel {
if let cachedData = transaction.getPeerCachedData(peerId: peerId) as? CachedChannelData, cachedData.exportedInvitation != nil && !revokeExisted {
return .complete()
@@ -90,17 +90,26 @@ public func createPeerExportedInvitation(account: Account, peerId: PeerId, expir
} |> switchToLatest
}
-public func peerExportedInvitations(account: Account, peerId: PeerId) -> Signal<[ExportedInvitation]?, NoError> {
- return account.postbox.transaction { transaction -> Signal<[ExportedInvitation]?, NoError> in
+public struct ExportedInvitations : Equatable {
+ public let list: [ExportedInvitation]?
+ public let totalCount: Int32
+}
+
+public func peerExportedInvitations(account: Account, peerId: PeerId, revoked: Bool, offsetLink: String? = nil) -> Signal {
+ return account.postbox.transaction { transaction -> Signal in
if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) {
- return account.network.request(Api.functions.messages.getExportedChatInvites(flags: 0, peer: inputPeer, adminId: nil, offsetLink: nil, limit: 100))
+ var flags: Int32 = 0
+ if revoked {
+ flags |= (1 << 3)
+ }
+ return account.network.request(Api.functions.messages.getExportedChatInvites(flags: flags, peer: inputPeer, adminId: nil, offsetLink: nil, limit: 50))
|> map(Optional.init)
|> `catch` { _ -> Signal in
return .single(nil)
}
- |> mapToSignal { result -> Signal<[ExportedInvitation]?, NoError> in
- return account.postbox.transaction { transaction -> [ExportedInvitation]? in
- if let result = result, case let .exportedChatInvites(_, apiInvites, users) = result {
+ |> mapToSignal { result -> Signal in
+ return account.postbox.transaction { transaction -> ExportedInvitations? in
+ if let result = result, case let .exportedChatInvites(count, apiInvites, users) = result {
var peers: [Peer] = []
var peersMap: [PeerId: Peer] = [:]
for user in users {
@@ -118,7 +127,7 @@ public func peerExportedInvitations(account: Account, peerId: PeerId) -> Signal<
invites.append(invite)
}
}
- return invites
+ return ExportedInvitations(list: invites, totalCount: count)
} else {
return nil
}
@@ -146,20 +155,22 @@ public func editPeerExportedInvitation(account: Account, peerId: PeerId, link: S
}
return account.network.request(Api.functions.messages.editExportedChatInvite(flags: flags, peer: inputPeer, link: link, expireDate: expireDate, usageLimit: usageLimit))
|> mapError { _ in return EditPeerExportedInvitationError.generic }
- |> map { result -> ExportedInvitation? in
- if case let .exportedChatInvite(invite, users) = result {
- var peers: [Peer] = []
- for user in users {
- let telegramUser = TelegramUser(user: user)
- peers.append(telegramUser)
+ |> mapToSignal { result -> Signal in
+ return account.postbox.transaction { transaction in
+ if case let .exportedChatInvite(invite, users) = result {
+ var peers: [Peer] = []
+ for user in users {
+ let telegramUser = TelegramUser(user: user)
+ peers.append(telegramUser)
+ }
+ updatePeers(transaction: transaction, peers: peers, update: { _, updated -> Peer in
+ return updated
+ })
+ return ExportedInvitation(apiExportedInvite: invite)
+ } else {
+ return nil
}
- updatePeers(transaction: transaction, peers: peers, update: { _, updated -> Peer in
- return updated
- })
- return ExportedInvitation(apiExportedInvite: invite)
- } else {
- return nil
- }
+ } |> mapError { _ in .generic }
}
} else {
return .complete()
@@ -173,13 +184,29 @@ public enum RevokePeerExportedInvitationError {
case generic
}
-public func revokePeerExportedInvitation(account: Account, peerId: PeerId, link: String) -> Signal {
- return account.postbox.transaction { transaction -> Signal in
+public func revokePeerExportedInvitation(account: Account, peerId: PeerId, link: String) -> Signal {
+ return account.postbox.transaction { transaction -> Signal in
if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) {
let flags: Int32 = (1 << 2)
return account.network.request(Api.functions.messages.editExportedChatInvite(flags: flags, peer: inputPeer, link: link, expireDate: nil, usageLimit: nil))
|> mapError { _ in return RevokePeerExportedInvitationError.generic }
- |> ignoreValues
+ |> mapToSignal { result -> Signal in
+ return account.postbox.transaction { transaction in
+ if case let .exportedChatInvite(invite, users) = result {
+ var peers: [Peer] = []
+ for user in users {
+ let telegramUser = TelegramUser(user: user)
+ peers.append(telegramUser)
+ }
+ updatePeers(transaction: transaction, peers: peers, update: { _, updated -> Peer in
+ return updated
+ })
+ return ExportedInvitation(apiExportedInvite: invite)
+ } else {
+ return nil
+ }
+ } |> mapError { _ in .generic }
+ }
} else {
return .complete()
}
@@ -188,6 +215,39 @@ public func revokePeerExportedInvitation(account: Account, peerId: PeerId, link:
|> switchToLatest
}
+public enum DeletePeerExportedInvitationError {
+ case generic
+}
+
+public func deletePeerExportedInvitation(account: Account, peerId: PeerId, link: String) -> Signal {
+ return account.postbox.transaction { transaction -> Signal in
+ if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) {
+ return account.network.request(Api.functions.messages.deleteExportedChatInvite(peer: inputPeer, link: link))
+ |> mapError { _ in return DeletePeerExportedInvitationError.generic }
+ |> ignoreValues
+ } else {
+ return .complete()
+ }
+ }
+ |> castError(DeletePeerExportedInvitationError.self)
+ |> switchToLatest
+}
+
+public func deleteAllRevokedPeerExportedInvitations(account: Account, peerId: PeerId) -> Signal {
+ return account.postbox.transaction { transaction -> Signal in
+ if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) {
+ return account.network.request(Api.functions.messages.deleteRevokedExportedChatInvites(peer: inputPeer))
+ |> `catch` { _ -> Signal in
+ return .single(.boolFalse)
+ }
+ |> ignoreValues
+ } else {
+ return .complete()
+ }
+ }
+ |> switchToLatest
+}
+
private let cachedPeerInvitationImportersCollectionSpec = ItemCacheCollectionSpec(lowWaterItemCount: 10, highWaterItemCount: 20)
public struct PeerInvitationImportersState: Equatable {
diff --git a/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift b/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift
index 76685ab98e..dfd2f79cb4 100644
--- a/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift
+++ b/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift
@@ -1674,7 +1674,7 @@ private func sendBoxedDecryptedMessage(postbox: Postbox, network: Network, peer:
}
private func requestTerminateSecretChat(postbox: Postbox, network: Network, peerId: PeerId, tagLocalIndex: Int32, reportSpam: Bool) -> Signal {
- return network.request(Api.functions.messages.discardEncryption(chatId: peerId.id))
+ return network.request(Api.functions.messages.discardEncryption(flags: 0, chatId: peerId.id))
|> map(Optional.init)
|> `catch` { _ in
return .single(nil)
diff --git a/submodules/TelegramCore/Sources/PeersNearby.swift b/submodules/TelegramCore/Sources/PeersNearby.swift
index 5d9954c7d7..6823782443 100644
--- a/submodules/TelegramCore/Sources/PeersNearby.swift
+++ b/submodules/TelegramCore/Sources/PeersNearby.swift
@@ -34,7 +34,7 @@ public func updatePeersNearbyVisibility(account: Account, update: PeerNearbyVisi
case let .visible(latitude, longitude):
flags |= (1 << 0)
geoPoint = .inputGeoPoint(flags: 0, lat: latitude, long: longitude, accuracyRadius: nil)
- selfExpires = 0x7fffffff
+ selfExpires = 10800
case let .location(latitude, longitude):
geoPoint = .inputGeoPoint(flags: 0, lat: latitude, long: longitude, accuracyRadius: nil)
case .invisible:
@@ -63,6 +63,15 @@ public func updatePeersNearbyVisibility(account: Account, update: PeerNearbyVisi
|> map(Optional.init)
|> `catch` { error -> Signal in
if error.errorCode == 406 {
+ if error.errorDescription == "USERPIC_PRIVACY_REQUIRED" {
+ let _ = (account.postbox.transaction { transaction in
+ transaction.updatePreferencesEntry(key: PreferencesKeys.peersNearby, { entry in
+ var settings = entry as? PeersNearbyState ?? PeersNearbyState.default
+ settings.visibilityExpires = nil
+ return settings
+ })
+ }).start()
+ }
return .single(nil)
} else {
return .single(nil)
diff --git a/submodules/TelegramCore/Sources/TelegramChannel.swift b/submodules/TelegramCore/Sources/TelegramChannel.swift
index 37830eb04d..92bce42a85 100644
--- a/submodules/TelegramCore/Sources/TelegramChannel.swift
+++ b/submodules/TelegramCore/Sources/TelegramChannel.swift
@@ -138,7 +138,7 @@ public extension TelegramChannel {
}
}
- public func hasBannedPermission(_ rights: TelegramChatBannedRightsFlags) -> (Int32, Bool)? {
+ func hasBannedPermission(_ rights: TelegramChatBannedRightsFlags) -> (Int32, Bool)? {
if self.flags.contains(.isCreator) {
return nil
}
@@ -154,7 +154,7 @@ public extension TelegramChannel {
return nil
}
- public var isRestrictedBySlowmode: Bool {
+ var isRestrictedBySlowmode: Bool {
if self.flags.contains(.isCreator) {
return false
}
diff --git a/submodules/TelegramCore/Sources/UpdateSecretChat.swift b/submodules/TelegramCore/Sources/UpdateSecretChat.swift
index f5bbd39ddd..adbcc5d84e 100644
--- a/submodules/TelegramCore/Sources/UpdateSecretChat.swift
+++ b/submodules/TelegramCore/Sources/UpdateSecretChat.swift
@@ -66,7 +66,7 @@ func updateSecretChat(encryptionProvider: EncryptionProvider, accountPeerId: Pee
} else {
Logger.shared.log("State", "got encryptedChat, but peer or state don't exist or account is not creator")
}
- case .encryptedChatDiscarded(_):
+ case let .encryptedChatDiscarded(flags, _):
if let currentPeer = currentPeer, let currentState = currentState {
let state = currentState.withUpdatedEmbeddedState(.terminated)
let peer = currentPeer.withUpdatedEmbeddedState(state.embeddedState.peerState)
diff --git a/submodules/TelegramCore/Sources/UpdatesApiUtils.swift b/submodules/TelegramCore/Sources/UpdatesApiUtils.swift
index b08bde6309..f4d2f3a289 100644
--- a/submodules/TelegramCore/Sources/UpdatesApiUtils.swift
+++ b/submodules/TelegramCore/Sources/UpdatesApiUtils.swift
@@ -556,7 +556,7 @@ extension Api.EncryptedChat {
switch self {
case let .encryptedChat(id, _, _, _, _, _, _):
return PeerId(namespace: Namespaces.Peer.SecretChat, id: id)
- case let .encryptedChatDiscarded(id):
+ case let .encryptedChatDiscarded(_, id):
return PeerId(namespace: Namespaces.Peer.SecretChat, id: id)
case let .encryptedChatEmpty(id):
return PeerId(namespace: Namespaces.Peer.SecretChat, id: id)
diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift
index 8bccc7a17b..7eeb5ce924 100644
--- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift
+++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift
@@ -233,4880 +233,4929 @@ public final class PresentationStrings: Equatable {
public var Appearance_TintAllColors: String { return self._s[39]! }
public var Group_Setup_TypePublicHelp: String { return self._s[40]! }
public var ChatSettings_Cache: String { return self._s[41]! }
- public var Login_InvalidLastNameError: String { return self._s[42]! }
- public var PeerInfo_PaneMedia: String { return self._s[43]! }
- public var GroupPermission_PermissionGloballyDisabled: String { return self._s[44]! }
- public var LiveLocationUpdated_JustNow: String { return self._s[45]! }
+ public var InviteLink_RevokedLinks: String { return self._s[42]! }
+ public var Login_InvalidLastNameError: String { return self._s[43]! }
+ public var PeerInfo_PaneMedia: String { return self._s[44]! }
+ public var InviteLink_Revoked: String { return self._s[45]! }
+ public var GroupPermission_PermissionGloballyDisabled: String { return self._s[46]! }
+ public var LiveLocationUpdated_JustNow: String { return self._s[47]! }
public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[46]!, self._r[46]!, [_0])
- }
- public var Channel_Info_Members: String { return self._s[47]! }
- public func Channel_CommentsGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[48]!, self._r[48]!, [_0])
}
- public var Common_edit: String { return self._s[49]! }
- public var ChatList_DeleteSavedMessagesConfirmationText: String { return self._s[51]! }
- public var OldChannels_GroupEmptyFormat: String { return self._s[52]! }
+ public var Channel_Info_Members: String { return self._s[49]! }
+ public func Channel_CommentsGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[50]!, self._r[50]!, [_0])
+ }
+ public var Common_edit: String { return self._s[51]! }
+ public var ChatList_DeleteSavedMessagesConfirmationText: String { return self._s[53]! }
+ public var OldChannels_GroupEmptyFormat: String { return self._s[54]! }
public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[53]!, self._r[53]!, [_1])
+ return formatWithArgumentRanges(self._s[55]!, self._r[55]!, [_1])
}
- public var Passport_DiscardMessageAction: String { return self._s[54]! }
- public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[55]! }
- public var Stickers_SuggestNone: String { return self._s[56]! }
- public var Channel_AdminLog_CanPinMessages: String { return self._s[57]! }
- public var Stickers_Search: String { return self._s[59]! }
- public var Passport_Identity_EditPersonalDetails: String { return self._s[60]! }
- public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[61]! }
- public var Login_ContinueWithLocalization: String { return self._s[62]! }
- public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[63]! }
- public var TextFormat_Italic: String { return self._s[65]! }
- public var ChatList_Search_NoResultsFitlerLinks: String { return self._s[67]! }
- public var Stickers_GroupChooseStickerPack: String { return self._s[68]! }
- public var Notification_MessageLifetime1w: String { return self._s[69]! }
- public var Channel_Management_AddModerator: String { return self._s[70]! }
- public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[71]! }
- public var Gif_Search: String { return self._s[72]! }
- public var Checkout_ErrorGeneric: String { return self._s[73]! }
- public var Conversation_ContextMenuSendMessage: String { return self._s[74]! }
- public var Map_SetThisLocation: String { return self._s[75]! }
- public var Notifications_ExceptionsDefaultSound: String { return self._s[76]! }
- public var PrivacySettings_AutoArchiveInfo: String { return self._s[77]! }
- public var Stats_NotificationsTitle: String { return self._s[78]! }
- public var Conversation_ClearSecretHistory: String { return self._s[80]! }
+ public var Passport_DiscardMessageAction: String { return self._s[56]! }
+ public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[57]! }
+ public var Stickers_SuggestNone: String { return self._s[58]! }
+ public var Channel_AdminLog_CanPinMessages: String { return self._s[59]! }
+ public var Stickers_Search: String { return self._s[61]! }
+ public var Passport_Identity_EditPersonalDetails: String { return self._s[62]! }
+ public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[63]! }
+ public var Login_ContinueWithLocalization: String { return self._s[64]! }
+ public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[65]! }
+ public var TextFormat_Italic: String { return self._s[67]! }
+ public var ChatList_Search_NoResultsFitlerLinks: String { return self._s[69]! }
+ public var Stickers_GroupChooseStickerPack: String { return self._s[70]! }
+ public var Notification_MessageLifetime1w: String { return self._s[71]! }
+ public var Channel_Management_AddModerator: String { return self._s[72]! }
+ public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[73]! }
+ public var Gif_Search: String { return self._s[74]! }
+ public var Checkout_ErrorGeneric: String { return self._s[75]! }
+ public var Conversation_ContextMenuSendMessage: String { return self._s[76]! }
+ public var Map_SetThisLocation: String { return self._s[77]! }
+ public var Notifications_ExceptionsDefaultSound: String { return self._s[78]! }
+ public var PrivacySettings_AutoArchiveInfo: String { return self._s[79]! }
+ public var Stats_NotificationsTitle: String { return self._s[80]! }
+ public var Conversation_ClearSecretHistory: String { return self._s[82]! }
public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[81]!, self._r[81]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[83]!, self._r[83]!, [_1, _2])
}
- public var ChatListFolder_DiscardDiscard: String { return self._s[82]! }
- public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[83]! }
- public var Contacts_InviteFriends: String { return self._s[84]! }
- public var Group_LinkedChannel: String { return self._s[85]! }
- public var Notification_PassportValuePhone: String { return self._s[87]! }
+ public var ChatListFolder_DiscardDiscard: String { return self._s[84]! }
+ public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[85]! }
+ public var Contacts_InviteFriends: String { return self._s[86]! }
+ public var Group_LinkedChannel: String { return self._s[87]! }
+ public var Notification_PassportValuePhone: String { return self._s[89]! }
public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[88]!, self._r[88]!, [_0])
+ return formatWithArgumentRanges(self._s[90]!, self._r[90]!, [_0])
}
- public var UserInfo_BotHelp: String { return self._s[90]! }
- public var Passport_Identity_MainPage: String { return self._s[92]! }
- public var LogoutOptions_ContactSupportText: String { return self._s[93]! }
+ public var UserInfo_BotHelp: String { return self._s[92]! }
+ public var Passport_Identity_MainPage: String { return self._s[94]! }
+ public var LogoutOptions_ContactSupportText: String { return self._s[95]! }
public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[94]!, self._r[94]!, [_0])
+ return formatWithArgumentRanges(self._s[96]!, self._r[96]!, [_0])
}
- public var StickerPack_ShowStickers: String { return self._s[96]! }
- public var AttachmentMenu_PhotoOrVideo: String { return self._s[97]! }
- public var Map_Satellite: String { return self._s[98]! }
- public var Passport_Identity_MainPageHelp: String { return self._s[99]! }
- public var Profile_About: String { return self._s[101]! }
- public var Group_Setup_TypePrivate: String { return self._s[102]! }
- public var Notifications_ChannelNotifications: String { return self._s[103]! }
- public var Call_VoiceOver_VoiceCallIncoming: String { return self._s[104]! }
+ public var StickerPack_ShowStickers: String { return self._s[98]! }
+ public var AttachmentMenu_PhotoOrVideo: String { return self._s[99]! }
+ public var Map_Satellite: String { return self._s[100]! }
+ public var Passport_Identity_MainPageHelp: String { return self._s[101]! }
+ public var Profile_About: String { return self._s[103]! }
+ public var Group_Setup_TypePrivate: String { return self._s[104]! }
+ public var Notifications_ChannelNotifications: String { return self._s[105]! }
+ public var Call_VoiceOver_VoiceCallIncoming: String { return self._s[106]! }
public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[105]!, self._r[105]!, [_0])
+ return formatWithArgumentRanges(self._s[107]!, self._r[107]!, [_0])
}
- public var WallpaperPreview_Motion: String { return self._s[106]! }
- public var Message_VideoMessage: String { return self._s[107]! }
- public var SharedMedia_CategoryOther: String { return self._s[108]! }
- public var Passport_FieldIdentityUploadHelp: String { return self._s[109]! }
- public var PUSH_REMINDER_TITLE: String { return self._s[110]! }
- public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[112]! }
- public var Login_ResetAccountProtected_Reset: String { return self._s[114]! }
- public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[115]! }
+ public var WallpaperPreview_Motion: String { return self._s[108]! }
+ public var Message_VideoMessage: String { return self._s[109]! }
+ public var SharedMedia_CategoryOther: String { return self._s[110]! }
+ public var Passport_FieldIdentityUploadHelp: String { return self._s[111]! }
+ public var PUSH_REMINDER_TITLE: String { return self._s[112]! }
+ public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[114]! }
+ public var Login_ResetAccountProtected_Reset: String { return self._s[116]! }
+ public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[117]! }
public func Location_ProximityNotification_Notify(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[116]!, self._r[116]!, [_0])
+ return formatWithArgumentRanges(self._s[118]!, self._r[118]!, [_0])
}
- public var ChatList_PeerTypeContact: String { return self._s[117]! }
- public var Stickers_SuggestAll: String { return self._s[119]! }
- public var EmptyGroupInfo_Line3: String { return self._s[120]! }
- public var Login_InvalidPhoneError: String { return self._s[121]! }
- public var MediaPicker_GroupDescription: String { return self._s[122]! }
- public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[123]! }
- public var Conversation_PrivateChannelTimeLimitedAlertText: String { return self._s[124]! }
- public var PrivateDataSettings_Title: String { return self._s[125]! }
- public var SecretChat_Title: String { return self._s[126]! }
- public var Privacy_ChatsTitle: String { return self._s[127]! }
- public var EditProfile_NameAndPhotoHelp: String { return self._s[128]! }
- public var Watch_MessageView_Forward: String { return self._s[130]! }
- public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[131]! }
+ public var ChatList_PeerTypeContact: String { return self._s[119]! }
+ public var Stickers_SuggestAll: String { return self._s[121]! }
+ public var EmptyGroupInfo_Line3: String { return self._s[122]! }
+ public var Login_InvalidPhoneError: String { return self._s[123]! }
+ public var MediaPicker_GroupDescription: String { return self._s[124]! }
+ public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[125]! }
+ public var Conversation_PrivateChannelTimeLimitedAlertText: String { return self._s[126]! }
+ public var PrivateDataSettings_Title: String { return self._s[127]! }
+ public var SecretChat_Title: String { return self._s[128]! }
+ public var Privacy_ChatsTitle: String { return self._s[129]! }
+ public var EditProfile_NameAndPhotoHelp: String { return self._s[130]! }
+ public var Watch_MessageView_Forward: String { return self._s[132]! }
+ public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[133]! }
public func PUSH_PINNED_QUIZ(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[132]!, self._r[132]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[134]!, self._r[134]!, [_1, _2])
}
public func Channel_AdminLog_EndedVoiceChat(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[133]!, self._r[133]!, [_1])
+ return formatWithArgumentRanges(self._s[135]!, self._r[135]!, [_1])
}
- public var PhotoEditor_DiscardChanges: String { return self._s[134]! }
- public var SocksProxySetup_AdNoticeHelp: String { return self._s[135]! }
- public var Date_DialogDateFormat: String { return self._s[136]! }
- public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[137]! }
- public var Notifications_AlertTones: String { return self._s[138]! }
- public var Permissions_SiriAllow_v0: String { return self._s[139]! }
- public var Tour_StartButton: String { return self._s[140]! }
- public var Stats_InstantViewInteractionsTitle: String { return self._s[141]! }
- public var UserInfo_ScamUserWarning: String { return self._s[143]! }
- public var NotificationsSound_Chime: String { return self._s[144]! }
- public var Update_Skip: String { return self._s[145]! }
+ public var PhotoEditor_DiscardChanges: String { return self._s[136]! }
+ public var SocksProxySetup_AdNoticeHelp: String { return self._s[137]! }
+ public var Date_DialogDateFormat: String { return self._s[138]! }
+ public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[139]! }
+ public var Notifications_AlertTones: String { return self._s[140]! }
+ public var Permissions_SiriAllow_v0: String { return self._s[141]! }
+ public var Tour_StartButton: String { return self._s[142]! }
+ public var Stats_InstantViewInteractionsTitle: String { return self._s[143]! }
+ public var UserInfo_ScamUserWarning: String { return self._s[146]! }
+ public var NotificationsSound_Chime: String { return self._s[147]! }
+ public var Update_Skip: String { return self._s[148]! }
public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[146]!, self._r[146]!, [_0])
+ return formatWithArgumentRanges(self._s[149]!, self._r[149]!, [_0])
}
- public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[147]! }
- public var Notifications_PermissionsTitle: String { return self._s[148]! }
- public var Channel_AdminLog_BanSendMedia: String { return self._s[149]! }
- public var Notifications_Badge_CountUnreadMessages: String { return self._s[150]! }
- public var Appearance_AppIcon: String { return self._s[151]! }
- public var Passport_Identity_FilesUploadNew: String { return self._s[152]! }
+ public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[150]! }
+ public var Notifications_PermissionsTitle: String { return self._s[151]! }
+ public var Channel_AdminLog_BanSendMedia: String { return self._s[152]! }
+ public var Notifications_Badge_CountUnreadMessages: String { return self._s[153]! }
+ public var Appearance_AppIcon: String { return self._s[154]! }
+ public var Passport_Identity_FilesUploadNew: String { return self._s[155]! }
public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[153]!, self._r[153]!, [_0])
+ return formatWithArgumentRanges(self._s[156]!, self._r[156]!, [_0])
}
- public var CreatePoll_QuizTitle: String { return self._s[154]! }
- public var DialogList_DeleteConversationConfirmation: String { return self._s[155]! }
- public var NotificationsSound_Calypso: String { return self._s[156]! }
- public var ChannelMembers_GroupAdminsTitle: String { return self._s[157]! }
- public var Checkout_NewCard_PaymentCard: String { return self._s[158]! }
- public var Wallpaper_SetCustomBackground: String { return self._s[160]! }
- public var Conversation_ContextMenuOpenProfile: String { return self._s[161]! }
+ public var CreatePoll_QuizTitle: String { return self._s[157]! }
+ public var DialogList_DeleteConversationConfirmation: String { return self._s[158]! }
+ public var NotificationsSound_Calypso: String { return self._s[159]! }
+ public var ChannelMembers_GroupAdminsTitle: String { return self._s[160]! }
+ public var Checkout_NewCard_PaymentCard: String { return self._s[161]! }
+ public var Wallpaper_SetCustomBackground: String { return self._s[163]! }
+ public var Conversation_ContextMenuOpenProfile: String { return self._s[164]! }
public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[163]!, self._r[163]!, [_1])
+ return formatWithArgumentRanges(self._s[166]!, self._r[166]!, [_1])
}
- public var AuthSessions_Terminate: String { return self._s[164]! }
- public var ShareFileTip_CloseTip: String { return self._s[165]! }
- public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[166]! }
- public var Channel_Moderator_AccessLevelRevoke: String { return self._s[167]! }
- public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[168]! }
- public var Passport_Language_fr: String { return self._s[169]! }
+ public var AuthSessions_Terminate: String { return self._s[167]! }
+ public var ShareFileTip_CloseTip: String { return self._s[168]! }
+ public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[169]! }
+ public var Channel_Moderator_AccessLevelRevoke: String { return self._s[170]! }
+ public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[171]! }
+ public var Passport_Language_fr: String { return self._s[172]! }
public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[171]!, self._r[171]!, [_0])
- }
- public var Passport_Identity_TypeIdentityCard: String { return self._s[172]! }
- public var VoiceChat_MuteForMe: String { return self._s[173]! }
- public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[174]!, self._r[174]!, [_0])
}
- public var ReportPeer_ReasonCopyright: String { return self._s[175]! }
- public var Permissions_PeopleNearbyText_v0: String { return self._s[177]! }
- public var Channel_Stickers_NotFoundHelp: String { return self._s[178]! }
- public var Passport_Identity_AddDriversLicense: String { return self._s[179]! }
- public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[180]! }
- public var Permissions_SiriAllowInSettings_v0: String { return self._s[181]! }
- public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[182]! }
- public var Map_LocatingError: String { return self._s[184]! }
- public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[185]! }
+ public var Passport_Identity_TypeIdentityCard: String { return self._s[175]! }
+ public var VoiceChat_MuteForMe: String { return self._s[176]! }
+ public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[177]!, self._r[177]!, [_0])
+ }
+ public var ReportPeer_ReasonCopyright: String { return self._s[178]! }
+ public var Permissions_PeopleNearbyText_v0: String { return self._s[180]! }
+ public var Channel_Stickers_NotFoundHelp: String { return self._s[181]! }
+ public var Passport_Identity_AddDriversLicense: String { return self._s[182]! }
+ public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[183]! }
+ public var Permissions_SiriAllowInSettings_v0: String { return self._s[184]! }
+ public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[185]! }
+ public var Map_LocatingError: String { return self._s[187]! }
+ public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[188]! }
public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[187]!, self._r[187]!, [_0])
+ return formatWithArgumentRanges(self._s[190]!, self._r[190]!, [_0])
}
public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[188]!, self._r[188]!, [_0])
+ return formatWithArgumentRanges(self._s[191]!, self._r[191]!, [_0])
}
- public var Channel_AdminLog_EmptyFilterText: String { return self._s[189]! }
- public var Login_SmsRequestState2: String { return self._s[190]! }
- public var Conversation_Unmute: String { return self._s[192]! }
- public var TwoFactorSetup_Intro_Text: String { return self._s[193]! }
- public var Channel_AdminLog_BanSendMessages: String { return self._s[194]! }
+ public var Channel_AdminLog_EmptyFilterText: String { return self._s[192]! }
+ public var Login_SmsRequestState2: String { return self._s[193]! }
+ public var Conversation_Unmute: String { return self._s[195]! }
+ public var TwoFactorSetup_Intro_Text: String { return self._s[196]! }
+ public var Channel_AdminLog_BanSendMessages: String { return self._s[197]! }
public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[195]!, self._r[195]!, [_0])
+ return formatWithArgumentRanges(self._s[198]!, self._r[198]!, [_0])
}
- public var AccessDenied_LocationDenied: String { return self._s[196]! }
- public var Share_AuthTitle: String { return self._s[197]! }
- public var Month_ShortAugust: String { return self._s[198]! }
+ public var AccessDenied_LocationDenied: String { return self._s[199]! }
+ public var Share_AuthTitle: String { return self._s[200]! }
+ public var Month_ShortAugust: String { return self._s[201]! }
public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[199]!, self._r[199]!, [_0])
+ return formatWithArgumentRanges(self._s[202]!, self._r[202]!, [_0])
}
- public var Channel_BanUser_PermissionSendMedia: String { return self._s[200]! }
- public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[201]! }
+ public var Channel_BanUser_PermissionSendMedia: String { return self._s[203]! }
+ public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[204]! }
public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[202]!, self._r[202]!, [_1])
+ return formatWithArgumentRanges(self._s[205]!, self._r[205]!, [_1])
}
- public var WallpaperSearch_ColorTitle: String { return self._s[204]! }
- public var Wallpaper_Search: String { return self._s[205]! }
- public var ClearCache_StorageUsage: String { return self._s[206]! }
- public var CreatePoll_TextPlaceholder: String { return self._s[207]! }
- public var Conversation_EditingMessagePanelTitle: String { return self._s[208]! }
- public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[209]! }
- public var OldChannels_NoticeCreateText: String { return self._s[210]! }
- public var ProfilePhoto_MainVideo: String { return self._s[211]! }
- public var VoiceChat_StatusListening: String { return self._s[212]! }
- public var UserInfo_NotificationsDisabled: String { return self._s[213]! }
- public var Map_Unknown: String { return self._s[214]! }
- public var Notifications_MessageNotificationsAlert: String { return self._s[215]! }
- public var Conversation_StopQuiz: String { return self._s[216]! }
- public var Checkout_LiabilityAlertTitle: String { return self._s[217]! }
+ public var WallpaperSearch_ColorTitle: String { return self._s[207]! }
+ public var Wallpaper_Search: String { return self._s[208]! }
+ public var ClearCache_StorageUsage: String { return self._s[209]! }
+ public var CreatePoll_TextPlaceholder: String { return self._s[210]! }
+ public var Conversation_EditingMessagePanelTitle: String { return self._s[211]! }
+ public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[212]! }
+ public var OldChannels_NoticeCreateText: String { return self._s[213]! }
+ public var ProfilePhoto_MainVideo: String { return self._s[214]! }
+ public var VoiceChat_StatusListening: String { return self._s[215]! }
+ public var UserInfo_NotificationsDisabled: String { return self._s[216]! }
+ public var Map_Unknown: String { return self._s[217]! }
+ public var Notifications_MessageNotificationsAlert: String { return self._s[218]! }
+ public var Conversation_StopQuiz: String { return self._s[219]! }
+ public var Checkout_LiabilityAlertTitle: String { return self._s[220]! }
public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[218]!, self._r[218]!, [_0])
+ return formatWithArgumentRanges(self._s[221]!, self._r[221]!, [_0])
}
- public var CreatePoll_OptionPlaceholder: String { return self._s[219]! }
- public var Conversation_RestrictedStickers: String { return self._s[220]! }
- public var MemberSearch_BotSection: String { return self._s[222]! }
- public var Channel_Management_AddModeratorHelp: String { return self._s[224]! }
- public var MaskStickerSettings_Title: String { return self._s[225]! }
- public var ShareMenu_Comment: String { return self._s[226]! }
- public var GroupInfo_Notifications: String { return self._s[227]! }
- public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[228]! }
+ public var CreatePoll_OptionPlaceholder: String { return self._s[222]! }
+ public var Conversation_RestrictedStickers: String { return self._s[223]! }
+ public var MemberSearch_BotSection: String { return self._s[225]! }
+ public var Channel_Management_AddModeratorHelp: String { return self._s[227]! }
+ public var MaskStickerSettings_Title: String { return self._s[228]! }
+ public var ShareMenu_Comment: String { return self._s[229]! }
+ public var GroupInfo_Notifications: String { return self._s[230]! }
+ public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[231]! }
public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[229]!, self._r[229]!, [_0])
+ return formatWithArgumentRanges(self._s[232]!, self._r[232]!, [_0])
}
- public var Conversation_ContextMenuCopyLink: String { return self._s[230]! }
- public var VoiceChat_MutedHelp: String { return self._s[233]! }
- public var ChatListFolder_CategoryMuted: String { return self._s[234]! }
- public var TwoStepAuth_AddHintDescription: String { return self._s[235]! }
+ public var Conversation_ContextMenuCopyLink: String { return self._s[233]! }
+ public var VoiceChat_MutedHelp: String { return self._s[236]! }
+ public var ChatListFolder_CategoryMuted: String { return self._s[237]! }
+ public var TwoStepAuth_AddHintDescription: String { return self._s[238]! }
public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[236]!, self._r[236]!, [_0])
+ return formatWithArgumentRanges(self._s[239]!, self._r[239]!, [_0])
}
- public var Conversation_ClousStorageInfo_Description3: String { return self._s[237]! }
- public var Contacts_SortByPresence: String { return self._s[238]! }
- public var Watch_Location_Access: String { return self._s[239]! }
- public var WallpaperPreview_CustomColorTopText: String { return self._s[240]! }
- public var Passport_Address_TypeBankStatement: String { return self._s[241]! }
- public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[242]! }
- public var Conversation_ClearPrivateHistory: String { return self._s[243]! }
- public var ChatList_Mute: String { return self._s[246]! }
- public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[247]! }
- public var Stats_PostsTitle: String { return self._s[248]! }
- public var Paint_Masks: String { return self._s[250]! }
- public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[252]! }
- public var Chat_AttachmentLimitReached: String { return self._s[253]! }
- public var StickerPackActionInfo_ArchivedTitle: String { return self._s[254]! }
- public var Watch_Stickers_StickerPacks: String { return self._s[256]! }
- public var Channel_Setup_Title: String { return self._s[257]! }
- public var GroupInfo_Administrators: String { return self._s[258]! }
- public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[260]! }
- public var Conversation_ContextMenuDiscuss: String { return self._s[261]! }
- public var StickerPack_BuiltinPackName: String { return self._s[262]! }
- public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[264]! }
- public var Checkout_ShippingMethod: String { return self._s[266]! }
- public var ClearCache_FreeSpace: String { return self._s[267]! }
- public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[268]! }
- public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[271]! }
+ public var Conversation_ClousStorageInfo_Description3: String { return self._s[240]! }
+ public var Contacts_SortByPresence: String { return self._s[241]! }
+ public var Watch_Location_Access: String { return self._s[242]! }
+ public var WallpaperPreview_CustomColorTopText: String { return self._s[243]! }
+ public var Passport_Address_TypeBankStatement: String { return self._s[244]! }
+ public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[245]! }
+ public var Conversation_ClearPrivateHistory: String { return self._s[246]! }
+ public var ChatList_Mute: String { return self._s[249]! }
+ public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[250]! }
+ public var Stats_PostsTitle: String { return self._s[251]! }
+ public var Paint_Masks: String { return self._s[253]! }
+ public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[255]! }
+ public var Chat_AttachmentLimitReached: String { return self._s[256]! }
+ public var StickerPackActionInfo_ArchivedTitle: String { return self._s[257]! }
+ public var Watch_Stickers_StickerPacks: String { return self._s[259]! }
+ public var Channel_Setup_Title: String { return self._s[260]! }
+ public var GroupInfo_Administrators: String { return self._s[261]! }
+ public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[263]! }
+ public var Conversation_ContextMenuDiscuss: String { return self._s[264]! }
+ public var StickerPack_BuiltinPackName: String { return self._s[265]! }
+ public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[267]! }
+ public var Checkout_ShippingMethod: String { return self._s[269]! }
+ public var ClearCache_FreeSpace: String { return self._s[270]! }
+ public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[271]! }
+ public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[274]! }
public func TwoStepAuth_ConfirmEmailDescription(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[272]!, self._r[272]!, [_1])
+ return formatWithArgumentRanges(self._s[275]!, self._r[275]!, [_1])
}
- public var Conversation_typing: String { return self._s[273]! }
+ public var Conversation_typing: String { return self._s[276]! }
public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[275]!, self._r[275]!, [_0])
+ return formatWithArgumentRanges(self._s[278]!, self._r[278]!, [_0])
}
- public var WebSearch_RecentSectionTitle: String { return self._s[276]! }
- public var VoiceChat_EndConfirmationTitle: String { return self._s[277]! }
- public var ChatList_UnhideAction: String { return self._s[278]! }
- public var PasscodeSettings_6DigitCode: String { return self._s[279]! }
- public var CallFeedback_AddComment: String { return self._s[280]! }
- public var LoginPassword_PasswordHelp: String { return self._s[281]! }
- public var Call_Flip: String { return self._s[282]! }
- public var Weekday_ShortWednesday: String { return self._s[284]! }
- public var VoiceOver_Chat_PollFinalResults: String { return self._s[285]! }
- public var PeerInfo_ButtonAddMember: String { return self._s[286]! }
- public var Call_Decline: String { return self._s[288]! }
- public var VoiceChat_InviteMemberToGroupFirstAdd: String { return self._s[289]! }
- public var Join_ChannelsTooMuch: String { return self._s[291]! }
+ public var WebSearch_RecentSectionTitle: String { return self._s[279]! }
+ public var VoiceChat_EndConfirmationTitle: String { return self._s[280]! }
+ public var ChatList_UnhideAction: String { return self._s[282]! }
+ public var PasscodeSettings_6DigitCode: String { return self._s[283]! }
+ public var CallFeedback_AddComment: String { return self._s[284]! }
+ public var LoginPassword_PasswordHelp: String { return self._s[285]! }
+ public var Call_Flip: String { return self._s[286]! }
+ public var Weekday_ShortWednesday: String { return self._s[288]! }
+ public var VoiceOver_Chat_PollFinalResults: String { return self._s[289]! }
+ public var PeerInfo_ButtonAddMember: String { return self._s[290]! }
+ public var Call_Decline: String { return self._s[292]! }
+ public var VoiceChat_InviteMemberToGroupFirstAdd: String { return self._s[293]! }
+ public var Join_ChannelsTooMuch: String { return self._s[295]! }
public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[292]!, self._r[292]!, [_1])
+ return formatWithArgumentRanges(self._s[296]!, self._r[296]!, [_1])
}
- public var Passport_Identity_Selfie: String { return self._s[293]! }
- public var Privacy_ContactsTitle: String { return self._s[294]! }
- public var GroupInfo_InviteLink_Title: String { return self._s[296]! }
- public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[297]! }
- public var Conversation_OpenFile: String { return self._s[298]! }
- public var Map_SetThisPlace: String { return self._s[299]! }
- public var Channel_Info_Management: String { return self._s[300]! }
- public var Passport_Language_hr: String { return self._s[301]! }
- public var VoiceChat_Title: String { return self._s[302]! }
- public var EditTheme_Edit_Preview_IncomingText: String { return self._s[305]! }
- public var OpenFile_Proceed: String { return self._s[306]! }
- public var Conversation_SecretChatContextBotAlert: String { return self._s[308]! }
- public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[309]! }
- public var Privacy_Calls_P2PContacts: String { return self._s[310]! }
- public var Appearance_PickAccentColor: String { return self._s[311]! }
- public var MediaPicker_TapToUngroupDescription: String { return self._s[312]! }
- public var Localization_EnglishLanguageName: String { return self._s[313]! }
- public var Stickers_SuggestStickers: String { return self._s[314]! }
- public var Passport_Language_ko: String { return self._s[315]! }
- public var Settings_ProxyDisabled: String { return self._s[316]! }
- public var PrivacySettings_PasscodeOff: String { return self._s[317]! }
- public var Undo_LeftChannel: String { return self._s[318]! }
- public var Appearance_AutoNightThemeDisabled: String { return self._s[319]! }
- public var TextFormat_Bold: String { return self._s[320]! }
- public var Login_InfoTitle: String { return self._s[321]! }
- public var Channel_BanUser_PermissionSendPolls: String { return self._s[322]! }
- public var Settings_AddAnotherAccount: String { return self._s[323]! }
- public var GroupPermission_NewTitle: String { return self._s[324]! }
- public var Login_SelectCountry_Title: String { return self._s[325]! }
- public var Cache_ServiceFiles: String { return self._s[326]! }
- public var Passport_Language_nl: String { return self._s[327]! }
- public var Contacts_TopSection: String { return self._s[328]! }
- public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[329]! }
- public var VoiceChat_StatusInvited: String { return self._s[331]! }
- public var Conversation_ContextMenuReport: String { return self._s[332]! }
+ public var Passport_Identity_Selfie: String { return self._s[297]! }
+ public var Privacy_ContactsTitle: String { return self._s[298]! }
+ public var GroupInfo_InviteLink_Title: String { return self._s[300]! }
+ public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[301]! }
+ public var Conversation_OpenFile: String { return self._s[302]! }
+ public var Map_SetThisPlace: String { return self._s[303]! }
+ public var Channel_Info_Management: String { return self._s[304]! }
+ public var Passport_Language_hr: String { return self._s[305]! }
+ public var VoiceChat_Title: String { return self._s[306]! }
+ public var EditTheme_Edit_Preview_IncomingText: String { return self._s[309]! }
+ public var OpenFile_Proceed: String { return self._s[310]! }
+ public var Conversation_SecretChatContextBotAlert: String { return self._s[312]! }
+ public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[313]! }
+ public var Privacy_Calls_P2PContacts: String { return self._s[314]! }
+ public var Appearance_PickAccentColor: String { return self._s[315]! }
+ public var MediaPicker_TapToUngroupDescription: String { return self._s[316]! }
+ public var Localization_EnglishLanguageName: String { return self._s[317]! }
+ public var Stickers_SuggestStickers: String { return self._s[318]! }
+ public var Passport_Language_ko: String { return self._s[319]! }
+ public var Settings_ProxyDisabled: String { return self._s[320]! }
+ public var PrivacySettings_PasscodeOff: String { return self._s[321]! }
+ public var Undo_LeftChannel: String { return self._s[322]! }
+ public var Appearance_AutoNightThemeDisabled: String { return self._s[323]! }
+ public var TextFormat_Bold: String { return self._s[324]! }
+ public var Login_InfoTitle: String { return self._s[325]! }
+ public var Channel_BanUser_PermissionSendPolls: String { return self._s[326]! }
+ public var Settings_AddAnotherAccount: String { return self._s[327]! }
+ public var GroupPermission_NewTitle: String { return self._s[328]! }
+ public var Login_SelectCountry_Title: String { return self._s[329]! }
+ public var Cache_ServiceFiles: String { return self._s[330]! }
+ public var Passport_Language_nl: String { return self._s[331]! }
+ public var Contacts_TopSection: String { return self._s[332]! }
+ public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[333]! }
+ public var VoiceChat_StatusInvited: String { return self._s[335]! }
+ public var Conversation_ContextMenuReport: String { return self._s[336]! }
public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[333]!, self._r[333]!, [_0])
+ return formatWithArgumentRanges(self._s[337]!, self._r[337]!, [_0])
}
- public var Conversation_Search: String { return self._s[334]! }
- public var Group_Setup_HistoryVisibleHelp: String { return self._s[336]! }
- public var ReportPeer_AlertSuccess: String { return self._s[338]! }
- public var AutoNightTheme_Title: String { return self._s[340]! }
+ public var Conversation_Search: String { return self._s[338]! }
+ public var Group_Setup_HistoryVisibleHelp: String { return self._s[340]! }
+ public var ReportPeer_AlertSuccess: String { return self._s[342]! }
+ public var AutoNightTheme_Title: String { return self._s[344]! }
public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[342]!, self._r[342]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[346]!, self._r[346]!, [_0, _1])
}
public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[343]!, self._r[343]!, [_0])
+ return formatWithArgumentRanges(self._s[347]!, self._r[347]!, [_0])
}
- public var Conversation_ShareBotContactConfirmation: String { return self._s[344]! }
- public var TwoStepAuth_RecoveryCode: String { return self._s[345]! }
- public var SocksProxySetup_ConnectAndSave: String { return self._s[346]! }
+ public var Conversation_ShareBotContactConfirmation: String { return self._s[348]! }
+ public var TwoStepAuth_RecoveryCode: String { return self._s[349]! }
+ public var SocksProxySetup_ConnectAndSave: String { return self._s[350]! }
public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[347]!, self._r[347]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[351]!, self._r[351]!, [_1, _2])
}
public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[348]!, self._r[348]!, [_0])
+ return formatWithArgumentRanges(self._s[352]!, self._r[352]!, [_0])
}
- public var Replies_BlockAndDeleteRepliesActionTitle: String { return self._s[349]! }
+ public var Replies_BlockAndDeleteRepliesActionTitle: String { return self._s[353]! }
public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[350]!, self._r[350]!, [_0])
- }
- public var VoiceChat_CopyInviteLink: String { return self._s[351]! }
- public var Conversation_InfoGroup: String { return self._s[352]! }
- public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[354]!, self._r[354]!, [_0])
}
- public var Conversation_ChatBackground: String { return self._s[355]! }
- public var PhotoEditor_Set: String { return self._s[356]! }
- public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) {
+ public var VoiceChat_CopyInviteLink: String { return self._s[355]! }
+ public var Conversation_InfoGroup: String { return self._s[356]! }
+ public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[358]!, self._r[358]!, [_0])
}
- public var IntentsSettings_SuggestedChatsContacts: String { return self._s[359]! }
- public var Passport_Phone_Title: String { return self._s[361]! }
- public var Conversation_EditingMessageMediaChange: String { return self._s[362]! }
- public var Channel_LinkItem: String { return self._s[363]! }
- public var VoiceChat_EndConfirmationText: String { return self._s[364]! }
+ public var Conversation_ChatBackground: String { return self._s[359]! }
+ public var PhotoEditor_Set: String { return self._s[360]! }
+ public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[362]!, self._r[362]!, [_0])
+ }
+ public var IntentsSettings_SuggestedChatsContacts: String { return self._s[363]! }
+ public var Passport_Phone_Title: String { return self._s[365]! }
+ public var Conversation_EditingMessageMediaChange: String { return self._s[366]! }
+ public var Channel_LinkItem: String { return self._s[367]! }
+ public var VoiceChat_EndConfirmationText: String { return self._s[368]! }
public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[365]!, self._r[365]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[369]!, self._r[369]!, [_1, _2, _3])
}
- public var Conversation_DeleteManyMessages: String { return self._s[366]! }
- public var Notifications_Badge_IncludeMutedChats: String { return self._s[367]! }
- public var AuthSessions_AddedDeviceTitle: String { return self._s[370]! }
- public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[371]! }
- public var Settings_ProxyConnecting: String { return self._s[372]! }
- public var Theme_Colors_Accent: String { return self._s[373]! }
- public var Theme_Colors_ColorWallpaperWarning: String { return self._s[374]! }
+ public var Conversation_DeleteManyMessages: String { return self._s[370]! }
+ public var Notifications_Badge_IncludeMutedChats: String { return self._s[371]! }
+ public var AuthSessions_AddedDeviceTitle: String { return self._s[374]! }
+ public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[375]! }
+ public var Settings_ProxyConnecting: String { return self._s[376]! }
+ public var Theme_Colors_Accent: String { return self._s[377]! }
+ public var Theme_Colors_ColorWallpaperWarning: String { return self._s[378]! }
public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[376]!, self._r[376]!, [_1])
+ return formatWithArgumentRanges(self._s[380]!, self._r[380]!, [_1])
}
- public var Passport_Language_lo: String { return self._s[377]! }
+ public var Passport_Language_lo: String { return self._s[381]! }
public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[379]!, self._r[379]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[383]!, self._r[383]!, [_1, _2])
}
- public var Permissions_NotificationsText_v0: String { return self._s[380]! }
- public var ChatList_Context_RemoveFromRecents: String { return self._s[381]! }
- public var Watch_GroupInfo_Title: String { return self._s[382]! }
- public var Settings_AddDevice: String { return self._s[384]! }
- public var WallpaperPreview_SwipeColorsTopText: String { return self._s[385]! }
+ public var Permissions_NotificationsText_v0: String { return self._s[384]! }
+ public var ChatList_Context_RemoveFromRecents: String { return self._s[385]! }
+ public var Watch_GroupInfo_Title: String { return self._s[386]! }
+ public var Settings_AddDevice: String { return self._s[388]! }
+ public var WallpaperPreview_SwipeColorsTopText: String { return self._s[389]! }
public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[386]!, self._r[386]!, [_1])
+ return formatWithArgumentRanges(self._s[390]!, self._r[390]!, [_1])
}
- public var TwoStepAuth_Disable: String { return self._s[388]! }
+ public var TwoStepAuth_Disable: String { return self._s[392]! }
public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[389]!, self._r[389]!, [_0])
+ return formatWithArgumentRanges(self._s[393]!, self._r[393]!, [_0])
}
public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[390]!, self._r[390]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[394]!, self._r[394]!, [_1, _2, _3])
}
public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[391]!, self._r[391]!, [_0])
+ return formatWithArgumentRanges(self._s[395]!, self._r[395]!, [_0])
}
- public var Channel_AdminLog_BanReadMessages: String { return self._s[392]! }
- public var Undo_ChatDeleted: String { return self._s[393]! }
- public var ContactInfo_URLLabelHomepage: String { return self._s[394]! }
+ public var Channel_AdminLog_BanReadMessages: String { return self._s[396]! }
+ public var Undo_ChatDeleted: String { return self._s[397]! }
+ public var ContactInfo_URLLabelHomepage: String { return self._s[398]! }
public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[395]!, self._r[395]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[399]!, self._r[399]!, [_1, _2, _3])
}
- public var FastTwoStepSetup_EmailHelp: String { return self._s[396]! }
- public var Contacts_SelectAll: String { return self._s[397]! }
- public var Privacy_ContactsReset: String { return self._s[398]! }
- public var AttachmentMenu_File: String { return self._s[400]! }
- public var PasscodeSettings_EncryptData: String { return self._s[401]! }
- public var EditTheme_ThemeTemplateAlertText: String { return self._s[402]! }
+ public var FastTwoStepSetup_EmailHelp: String { return self._s[400]! }
+ public var Contacts_SelectAll: String { return self._s[401]! }
+ public var Privacy_ContactsReset: String { return self._s[402]! }
+ public var AttachmentMenu_File: String { return self._s[404]! }
+ public var PasscodeSettings_EncryptData: String { return self._s[405]! }
+ public var EditTheme_ThemeTemplateAlertText: String { return self._s[406]! }
public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[404]!, self._r[404]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[408]!, self._r[408]!, [_0, _1])
}
public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[405]!, self._r[405]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[409]!, self._r[409]!, [_0, _1])
}
- public var PhotoEditor_ShadowsTint: String { return self._s[407]! }
- public var GroupInfo_ChatAdmins: String { return self._s[408]! }
- public var ArchivedChats_IntroTitle2: String { return self._s[409]! }
- public var Cache_LowDiskSpaceText: String { return self._s[410]! }
- public var CreatePoll_Anonymous: String { return self._s[411]! }
- public var Checkout_PaymentMethod_New: String { return self._s[412]! }
- public var Invitation_JoinGroup: String { return self._s[413]! }
+ public var PhotoEditor_ShadowsTint: String { return self._s[411]! }
+ public var GroupInfo_ChatAdmins: String { return self._s[412]! }
+ public var ArchivedChats_IntroTitle2: String { return self._s[413]! }
+ public var Cache_LowDiskSpaceText: String { return self._s[414]! }
+ public var CreatePoll_Anonymous: String { return self._s[415]! }
+ public var Checkout_PaymentMethod_New: String { return self._s[416]! }
+ public var Invitation_JoinGroup: String { return self._s[417]! }
public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[416]!, self._r[416]!, [_0])
- }
- public var CheckoutInfo_SaveInfoHelp: String { return self._s[417]! }
- public var Notification_Reply: String { return self._s[419]! }
- public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[420]!, self._r[420]!, [_0])
}
- public var Login_PhoneTitle: String { return self._s[421]! }
- public var VoiceChat_UnmuteHelp: String { return self._s[422]! }
- public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[423]! }
- public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[424]!, self._r[424]!, [_1, _2, _3])
+ public var CheckoutInfo_SaveInfoHelp: String { return self._s[421]! }
+ public var Notification_Reply: String { return self._s[423]! }
+ public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[424]!, self._r[424]!, [_0])
}
- public var Appearance_TextSize_Title: String { return self._s[425]! }
- public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[427]! }
- public var VoiceOver_Navigation_Compose: String { return self._s[428]! }
- public var Passport_InfoText: String { return self._s[429]! }
- public var ApplyLanguage_ApplyLanguageAction: String { return self._s[430]! }
- public var MessagePoll_LabelClosed: String { return self._s[432]! }
- public var AttachmentMenu_SendAsFiles: String { return self._s[433]! }
- public var KeyCommand_FocusOnInputField: String { return self._s[434]! }
- public var Conversation_ContextViewThread: String { return self._s[435]! }
- public var Privacy_SecretChatsLinkPreviews: String { return self._s[437]! }
- public var Permissions_PeopleNearbyAllow_v0: String { return self._s[438]! }
- public var Conversation_ContextMenuMention: String { return self._s[440]! }
- public var CreatePoll_QuizInfo: String { return self._s[441]! }
- public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[442]! }
- public var Username_LinkCopied: String { return self._s[443]! }
- public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[444]! }
- public var TwoStepAuth_ChangePassword: String { return self._s[445]! }
- public var Watch_Suggestion_Thanks: String { return self._s[446]! }
- public var Channel_TitleInfo: String { return self._s[447]! }
- public var ChatList_ChatTypesSection: String { return self._s[448]! }
+ public var Login_PhoneTitle: String { return self._s[425]! }
+ public var VoiceChat_UnmuteHelp: String { return self._s[426]! }
+ public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[427]! }
+ public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[428]!, self._r[428]!, [_1, _2, _3])
+ }
+ public var Appearance_TextSize_Title: String { return self._s[429]! }
+ public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[431]! }
+ public var VoiceOver_Navigation_Compose: String { return self._s[432]! }
+ public var Passport_InfoText: String { return self._s[433]! }
+ public var ApplyLanguage_ApplyLanguageAction: String { return self._s[434]! }
+ public var MessagePoll_LabelClosed: String { return self._s[436]! }
+ public var AttachmentMenu_SendAsFiles: String { return self._s[437]! }
+ public var KeyCommand_FocusOnInputField: String { return self._s[438]! }
+ public var Conversation_ContextViewThread: String { return self._s[439]! }
+ public var Privacy_SecretChatsLinkPreviews: String { return self._s[441]! }
+ public var Permissions_PeopleNearbyAllow_v0: String { return self._s[442]! }
+ public var Conversation_ContextMenuMention: String { return self._s[444]! }
+ public var CreatePoll_QuizInfo: String { return self._s[445]! }
+ public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[446]! }
+ public var Username_LinkCopied: String { return self._s[447]! }
+ public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[448]! }
+ public var TwoStepAuth_ChangePassword: String { return self._s[449]! }
+ public var Watch_Suggestion_Thanks: String { return self._s[450]! }
+ public var Channel_TitleInfo: String { return self._s[451]! }
+ public var ChatList_ChatTypesSection: String { return self._s[452]! }
public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[449]!, self._r[449]!, [_0])
+ return formatWithArgumentRanges(self._s[453]!, self._r[453]!, [_0])
}
public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[450]!, self._r[450]!, [_0])
+ return formatWithArgumentRanges(self._s[454]!, self._r[454]!, [_0])
}
- public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[451]! }
+ public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[455]! }
public func Call_MicrophoneOff(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[452]!, self._r[452]!, [_0])
+ return formatWithArgumentRanges(self._s[456]!, self._r[456]!, [_0])
}
- public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[453]! }
- public var Profile_MessageLifetimeForever: String { return self._s[454]! }
- public var ArchivedChats_IntroText1: String { return self._s[455]! }
- public var Notifications_ChannelNotificationsPreview: String { return self._s[456]! }
- public var Map_PullUpForPlaces: String { return self._s[458]! }
- public var UserInfo_TelegramCall: String { return self._s[459]! }
- public var Conversation_ShareMyContactInfo: String { return self._s[460]! }
- public var ChatList_Tabs_All: String { return self._s[461]! }
- public var Notification_PassportValueEmail: String { return self._s[462]! }
- public var Notification_VideoCallIncoming: String { return self._s[463]! }
- public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[464]! }
- public var Channel_Username_InvalidTaken: String { return self._s[465]! }
- public var GroupPermission_EditingDisabled: String { return self._s[466]! }
- public var ChatContextMenu_TextSelectionTip: String { return self._s[467]! }
- public var Passport_Language_pl: String { return self._s[469]! }
- public var Call_Accept: String { return self._s[470]! }
- public var ChatListFolder_NameSectionHeader: String { return self._s[471]! }
+ public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[457]! }
+ public var Profile_MessageLifetimeForever: String { return self._s[458]! }
+ public var ArchivedChats_IntroText1: String { return self._s[459]! }
+ public var Notifications_ChannelNotificationsPreview: String { return self._s[460]! }
+ public var Map_PullUpForPlaces: String { return self._s[462]! }
+ public var UserInfo_TelegramCall: String { return self._s[463]! }
+ public var Conversation_ShareMyContactInfo: String { return self._s[464]! }
+ public var ChatList_Tabs_All: String { return self._s[465]! }
+ public var Notification_PassportValueEmail: String { return self._s[466]! }
+ public var Notification_VideoCallIncoming: String { return self._s[467]! }
+ public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[468]! }
+ public var Channel_Username_InvalidTaken: String { return self._s[469]! }
+ public var GroupPermission_EditingDisabled: String { return self._s[470]! }
+ public var InviteLink_PeopleJoinedShortNone: String { return self._s[471]! }
+ public var ChatContextMenu_TextSelectionTip: String { return self._s[472]! }
+ public var Passport_Language_pl: String { return self._s[474]! }
+ public var Call_Accept: String { return self._s[475]! }
+ public var ChatListFolder_NameSectionHeader: String { return self._s[476]! }
public func Passport_Identity_NativeNameTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[472]!, self._r[472]!, [_0])
+ return formatWithArgumentRanges(self._s[477]!, self._r[477]!, [_0])
}
- public var ClearCache_Forever: String { return self._s[473]! }
+ public var ClearCache_Forever: String { return self._s[478]! }
public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[475]!, self._r[475]!, [_0])
+ return formatWithArgumentRanges(self._s[480]!, self._r[480]!, [_0])
}
- public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[476]! }
- public var Calls_SubmitRating: String { return self._s[477]! }
- public var Location_LiveLocationRequired_ShareLocation: String { return self._s[478]! }
+ public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[481]! }
+ public var Calls_SubmitRating: String { return self._s[482]! }
+ public var Location_LiveLocationRequired_ShareLocation: String { return self._s[483]! }
public func ChatList_AddedToFolderTooltip(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[479]!, self._r[479]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[484]!, self._r[484]!, [_1, _2])
}
- public var IntentsSettings_MainAccountInfo: String { return self._s[480]! }
- public var Map_Hybrid: String { return self._s[482]! }
- public var ChatList_Context_Archive: String { return self._s[483]! }
- public var Message_PinnedDocumentMessage: String { return self._s[484]! }
- public var State_ConnectingToProxyInfo: String { return self._s[485]! }
- public var Passport_Identity_NativeNameGenericTitle: String { return self._s[487]! }
- public var Settings_AppLanguage: String { return self._s[488]! }
+ public var IntentsSettings_MainAccountInfo: String { return self._s[485]! }
+ public var Map_Hybrid: String { return self._s[487]! }
+ public var ChatList_Context_Archive: String { return self._s[488]! }
+ public var Message_PinnedDocumentMessage: String { return self._s[489]! }
+ public var State_ConnectingToProxyInfo: String { return self._s[490]! }
+ public var Passport_Identity_NativeNameGenericTitle: String { return self._s[492]! }
+ public var Settings_AppLanguage: String { return self._s[493]! }
public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[489]!, self._r[489]!, [_0])
- }
- public var Notifications_PermissionsEnable: String { return self._s[491]! }
- public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[492]! }
- public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[493]!, self._r[493]!, [_0])
- }
- public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[494]!, self._r[494]!, [_0])
}
- public var NotificationsSound_Aurora: String { return self._s[497]! }
- public var ScheduledMessages_ClearAll: String { return self._s[500]! }
+ public var Notifications_PermissionsEnable: String { return self._s[496]! }
+ public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[497]! }
+ public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[498]!, self._r[498]!, [_0])
+ }
+ public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[499]!, self._r[499]!, [_0])
+ }
+ public var NotificationsSound_Aurora: String { return self._s[502]! }
+ public var ScheduledMessages_ClearAll: String { return self._s[505]! }
public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[501]!, self._r[501]!, [_0])
+ return formatWithArgumentRanges(self._s[506]!, self._r[506]!, [_0])
}
- public var Settings_BlockedUsers: String { return self._s[503]! }
+ public var Settings_BlockedUsers: String { return self._s[508]! }
public func UserInfo_StartSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[505]!, self._r[505]!, [_0])
+ return formatWithArgumentRanges(self._s[510]!, self._r[510]!, [_0])
}
- public var Passport_Language_hu: String { return self._s[506]! }
+ public var Passport_Language_hu: String { return self._s[511]! }
public func Conversation_ScheduleMessage_SendTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[507]!, self._r[507]!, [_0])
+ return formatWithArgumentRanges(self._s[512]!, self._r[512]!, [_0])
}
- public var StickerPack_Share: String { return self._s[508]! }
- public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[509]! }
+ public var StickerPack_Share: String { return self._s[513]! }
+ public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[514]! }
public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[510]!, self._r[510]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[515]!, self._r[515]!, [_0, _1])
}
- public var Privacy_ContactsResetConfirmation: String { return self._s[511]! }
- public var AppleWatch_ReplyPresets: String { return self._s[512]! }
- public var Bot_GenericBotStatus: String { return self._s[513]! }
- public var Appearance_ShareThemeColor: String { return self._s[514]! }
- public var AuthSessions_AddDevice_UrlLoginHint: String { return self._s[515]! }
- public var ReportGroupLocation_Title: String { return self._s[516]! }
+ public var Privacy_ContactsResetConfirmation: String { return self._s[516]! }
+ public var AppleWatch_ReplyPresets: String { return self._s[517]! }
+ public var Bot_GenericBotStatus: String { return self._s[518]! }
+ public var Appearance_ShareThemeColor: String { return self._s[519]! }
+ public var AuthSessions_AddDevice_UrlLoginHint: String { return self._s[520]! }
+ public var ReportGroupLocation_Title: String { return self._s[521]! }
public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[517]!, self._r[517]!, [_0])
+ return formatWithArgumentRanges(self._s[522]!, self._r[522]!, [_0])
}
- public var Profile_CreateEncryptedChatError: String { return self._s[518]! }
- public var Channel_EditAdmin_TransferOwnership: String { return self._s[519]! }
- public var Wallpaper_ErrorNotFound: String { return self._s[520]! }
- public var Bot_GenericSupportStatus: String { return self._s[521]! }
- public var Activity_UploadingPhoto: String { return self._s[523]! }
- public var Watch_UserInfo_Title: String { return self._s[525]! }
- public var SocksProxySetup_ProxyTelegram: String { return self._s[526]! }
- public var Appearance_ThemeDay: String { return self._s[527]! }
+ public var Profile_CreateEncryptedChatError: String { return self._s[523]! }
+ public var Channel_EditAdmin_TransferOwnership: String { return self._s[524]! }
+ public var Wallpaper_ErrorNotFound: String { return self._s[525]! }
+ public var Bot_GenericSupportStatus: String { return self._s[526]! }
+ public var Activity_UploadingPhoto: String { return self._s[528]! }
+ public var Watch_UserInfo_Title: String { return self._s[530]! }
+ public var SocksProxySetup_ProxyTelegram: String { return self._s[531]! }
+ public var Appearance_ThemeDay: String { return self._s[532]! }
public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[528]!, self._r[528]!, [_1])
+ return formatWithArgumentRanges(self._s[533]!, self._r[533]!, [_1])
}
public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[529]!, self._r[529]!, [_0])
+ return formatWithArgumentRanges(self._s[534]!, self._r[534]!, [_0])
}
- public var Passport_Title: String { return self._s[532]! }
+ public var InviteLink_AdditionalLinks: String { return self._s[535]! }
+ public var Passport_Title: String { return self._s[538]! }
public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[534]!, self._r[534]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[540]!, self._r[540]!, [_1, _2, _3])
}
- public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[535]! }
- public var SocksProxySetup_ShareLink: String { return self._s[538]! }
- public var AuthSessions_OtherDevices: String { return self._s[539]! }
- public var IntentsSettings_SuggestedChatsGroups: String { return self._s[540]! }
- public var Watch_MessageView_Reply: String { return self._s[541]! }
- public var Camera_FlashOn: String { return self._s[543]! }
+ public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[541]! }
+ public var SocksProxySetup_ShareLink: String { return self._s[544]! }
+ public var AuthSessions_OtherDevices: String { return self._s[545]! }
+ public var IntentsSettings_SuggestedChatsGroups: String { return self._s[546]! }
+ public var Watch_MessageView_Reply: String { return self._s[547]! }
+ public var Camera_FlashOn: String { return self._s[549]! }
public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[544]!, self._r[544]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[550]!, self._r[550]!, [_1, _2])
}
- public var Conversation_ContextMenuBlock: String { return self._s[545]! }
- public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[547]! }
- public var Privacy_Calls_NeverAllow: String { return self._s[548]! }
- public var SharedMedia_CategoryLinks: String { return self._s[549]! }
- public var Conversation_PinMessageAlertGroup: String { return self._s[552]! }
- public var Passport_Identity_ScansHelp: String { return self._s[553]! }
- public var ShareMenu_CopyShareLink: String { return self._s[554]! }
- public var StickerSettings_MaskContextInfo: String { return self._s[555]! }
- public var SocksProxySetup_ProxyStatusChecking: String { return self._s[556]! }
- public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[558]! }
- public var Checkout_ErrorPrecheckoutFailed: String { return self._s[560]! }
- public var NotificationsSound_Popcorn: String { return self._s[561]! }
- public var FeatureDisabled_Oops: String { return self._s[562]! }
+ public var Conversation_ContextMenuBlock: String { return self._s[551]! }
+ public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[553]! }
+ public var Privacy_Calls_NeverAllow: String { return self._s[554]! }
+ public var SharedMedia_CategoryLinks: String { return self._s[555]! }
+ public var Conversation_PinMessageAlertGroup: String { return self._s[558]! }
+ public var Passport_Identity_ScansHelp: String { return self._s[559]! }
+ public var ShareMenu_CopyShareLink: String { return self._s[560]! }
+ public var StickerSettings_MaskContextInfo: String { return self._s[561]! }
+ public var InviteLink_Create_EditTitle: String { return self._s[562]! }
+ public var SocksProxySetup_ProxyStatusChecking: String { return self._s[563]! }
+ public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[565]! }
+ public var Checkout_ErrorPrecheckoutFailed: String { return self._s[567]! }
+ public var NotificationsSound_Popcorn: String { return self._s[568]! }
+ public var FeatureDisabled_Oops: String { return self._s[569]! }
public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[563]!, self._r[563]!, [_0])
+ return formatWithArgumentRanges(self._s[570]!, self._r[570]!, [_0])
}
- public var Notification_PinnedMessage: String { return self._s[564]! }
- public var Tour_Title4: String { return self._s[565]! }
+ public var Notification_PinnedMessage: String { return self._s[571]! }
+ public var Tour_Title4: String { return self._s[572]! }
public func Notification_VoiceChatInvitationForYou(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[566]!, self._r[566]!, [_1])
+ return formatWithArgumentRanges(self._s[573]!, self._r[573]!, [_1])
}
- public var Watch_Suggestion_OK: String { return self._s[567]! }
- public var Compose_TokenListPlaceholder: String { return self._s[568]! }
- public var EditTheme_Edit_TopInfo: String { return self._s[569]! }
- public var Gif_NoGifsFound: String { return self._s[570]! }
- public var Login_InvalidCountryCode: String { return self._s[571]! }
- public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[572]! }
- public var Call_VoiceOver_VideoCallMissed: String { return self._s[573]! }
+ public var Watch_Suggestion_OK: String { return self._s[574]! }
+ public var Compose_TokenListPlaceholder: String { return self._s[575]! }
+ public var InviteLink_PermanentLink: String { return self._s[576]! }
+ public var EditTheme_Edit_TopInfo: String { return self._s[577]! }
+ public var Gif_NoGifsFound: String { return self._s[578]! }
+ public var Login_InvalidCountryCode: String { return self._s[579]! }
+ public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[580]! }
+ public var Call_VoiceOver_VideoCallMissed: String { return self._s[581]! }
public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[575]!, self._r[575]!, [_1])
+ return formatWithArgumentRanges(self._s[583]!, self._r[583]!, [_1])
}
- public var Profile_CreateNewContact: String { return self._s[576]! }
- public var AutoDownloadSettings_DataUsageLow: String { return self._s[577]! }
- public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[578]! }
- public var Group_Setup_TypePublic: String { return self._s[579]! }
- public var Weekday_ShortSaturday: String { return self._s[580]! }
+ public var Profile_CreateNewContact: String { return self._s[584]! }
+ public var AutoDownloadSettings_DataUsageLow: String { return self._s[585]! }
+ public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[586]! }
+ public var Group_Setup_TypePublic: String { return self._s[587]! }
+ public var Weekday_ShortSaturday: String { return self._s[588]! }
public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[581]!, self._r[581]!, [_0])
+ return formatWithArgumentRanges(self._s[589]!, self._r[589]!, [_0])
}
- public var LiveLocation_MenuStopAll: String { return self._s[582]! }
+ public var LiveLocation_MenuStopAll: String { return self._s[590]! }
public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[583]!, self._r[583]!, [_0])
- }
- public var ChatListFolder_NamePlaceholder: String { return self._s[584]! }
- public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[585]! }
- public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[586]!, self._r[586]!, [_1, _2, _3])
- }
- public var VoiceChat_ChatFullAlertText: String { return self._s[587]! }
- public var Chat_GenericPsaTooltip: String { return self._s[589]! }
- public var ChannelInfo_CreateVoiceChat: String { return self._s[590]! }
- public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[591]!, self._r[591]!, [_0])
}
- public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[592]! }
- public var Login_PhoneAndCountryHelp: String { return self._s[593]! }
- public var SaveIncomingPhotosSettings_From: String { return self._s[595]! }
- public var Conversation_JumpToDate: String { return self._s[596]! }
- public var AuthSessions_AddDevice: String { return self._s[597]! }
- public var Settings_FAQ: String { return self._s[599]! }
- public var Username_Title: String { return self._s[600]! }
- public var DialogList_Read: String { return self._s[601]! }
- public var Conversation_InstantPagePreview: String { return self._s[602]! }
- public var Login_ResetAccountProtected_Title: String { return self._s[604]! }
- public var CallFeedback_ReasonDistortedSpeech: String { return self._s[605]! }
- public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[606]! }
+ public var ChatListFolder_NamePlaceholder: String { return self._s[592]! }
+ public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[593]! }
+ public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[594]!, self._r[594]!, [_1, _2, _3])
+ }
+ public var VoiceChat_ChatFullAlertText: String { return self._s[595]! }
+ public var Chat_GenericPsaTooltip: String { return self._s[597]! }
+ public var ChannelInfo_CreateVoiceChat: String { return self._s[598]! }
+ public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[599]!, self._r[599]!, [_0])
+ }
+ public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[600]! }
+ public var Login_PhoneAndCountryHelp: String { return self._s[601]! }
+ public var SaveIncomingPhotosSettings_From: String { return self._s[603]! }
+ public var Conversation_JumpToDate: String { return self._s[604]! }
+ public var AuthSessions_AddDevice: String { return self._s[605]! }
+ public var Settings_FAQ: String { return self._s[607]! }
+ public var Username_Title: String { return self._s[608]! }
+ public var DialogList_Read: String { return self._s[609]! }
+ public var Conversation_InstantPagePreview: String { return self._s[610]! }
+ public var Login_ResetAccountProtected_Title: String { return self._s[612]! }
+ public var CallFeedback_ReasonDistortedSpeech: String { return self._s[613]! }
+ public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[614]! }
public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[607]!, self._r[607]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[615]!, self._r[615]!, [_1, _2, _3])
}
- public var WallpaperPreview_PreviewBottomText: String { return self._s[609]! }
- public var Privacy_SecretChatsTitle: String { return self._s[612]! }
+ public var WallpaperPreview_PreviewBottomText: String { return self._s[617]! }
+ public var Privacy_SecretChatsTitle: String { return self._s[620]! }
public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[613]!, self._r[613]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[621]!, self._r[621]!, [_1, _2])
}
- public var Checkout_NewCard_SaveInfoHelp: String { return self._s[614]! }
- public var Conversation_ClousStorageInfo_Description4: String { return self._s[615]! }
- public var PasscodeSettings_TurnPasscodeOn: String { return self._s[616]! }
- public var Message_ReplyActionButtonShowReceipt: String { return self._s[617]! }
+ public var Checkout_NewCard_SaveInfoHelp: String { return self._s[622]! }
+ public var Conversation_ClousStorageInfo_Description4: String { return self._s[623]! }
+ public var PasscodeSettings_TurnPasscodeOn: String { return self._s[624]! }
+ public var Message_ReplyActionButtonShowReceipt: String { return self._s[625]! }
public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[618]!, self._r[618]!, [_0])
+ return formatWithArgumentRanges(self._s[626]!, self._r[626]!, [_0])
}
- public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[620]! }
- public var TwoStepAuth_ConfirmationAbort: String { return self._s[621]! }
- public var PrivacySettings_LastSeenEverybody: String { return self._s[622]! }
- public var CallFeedback_ReasonDropped: String { return self._s[623]! }
+ public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[628]! }
+ public var TwoStepAuth_ConfirmationAbort: String { return self._s[629]! }
+ public var PrivacySettings_LastSeenEverybody: String { return self._s[630]! }
+ public var CallFeedback_ReasonDropped: String { return self._s[631]! }
public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[624]!, self._r[624]!, [_0])
+ return formatWithArgumentRanges(self._s[632]!, self._r[632]!, [_0])
}
- public var WebSearch_Images: String { return self._s[625]! }
- public var Passport_Identity_Surname: String { return self._s[626]! }
- public var Channel_Stickers_CreateYourOwn: String { return self._s[627]! }
- public var TwoFactorSetup_Email_Title: String { return self._s[628]! }
- public var Cache_ClearEmpty: String { return self._s[629]! }
- public var AuthSessions_AddDeviceIntro_Action: String { return self._s[630]! }
- public var Theme_Context_Apply: String { return self._s[631]! }
- public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[632]! }
- public var AutoDownloadSettings_DocumentsTitle: String { return self._s[633]! }
+ public var WebSearch_Images: String { return self._s[633]! }
+ public var Passport_Identity_Surname: String { return self._s[634]! }
+ public var Channel_Stickers_CreateYourOwn: String { return self._s[635]! }
+ public var TwoFactorSetup_Email_Title: String { return self._s[636]! }
+ public var Cache_ClearEmpty: String { return self._s[637]! }
+ public var AuthSessions_AddDeviceIntro_Action: String { return self._s[638]! }
+ public var Theme_Context_Apply: String { return self._s[639]! }
+ public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[640]! }
+ public var AutoDownloadSettings_DocumentsTitle: String { return self._s[641]! }
public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[634]!, self._r[634]!, [_0])
+ return formatWithArgumentRanges(self._s[642]!, self._r[642]!, [_0])
}
- public var Call_StatusRinging: String { return self._s[635]! }
+ public var Call_StatusRinging: String { return self._s[643]! }
public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[636]!, self._r[636]!, [_0])
+ return formatWithArgumentRanges(self._s[644]!, self._r[644]!, [_0])
}
public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[637]!, self._r[637]!, [_0])
+ return formatWithArgumentRanges(self._s[645]!, self._r[645]!, [_0])
}
- public var Cache_ClearNone: String { return self._s[638]! }
- public var PrivacyPolicy_Accept: String { return self._s[639]! }
- public var Contacts_PhoneNumber: String { return self._s[640]! }
- public var Passport_Identity_OneOfTypePassport: String { return self._s[641]! }
- public var PhotoEditor_HighlightsTint: String { return self._s[643]! }
- public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[644]! }
- public var Checkout_PaymentMethod_Title: String { return self._s[647]! }
- public var Month_GenAugust: String { return self._s[649]! }
- public var DialogList_Draft: String { return self._s[650]! }
- public var ChatList_EmptyChatListFilterText: String { return self._s[651]! }
- public var PeopleNearby_Description: String { return self._s[652]! }
- public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[653]! }
- public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[655]! }
- public var Watch_Message_ForwardedFrom: String { return self._s[656]! }
- public var Notification_Mute1h: String { return self._s[657]! }
- public var Appearance_ThemePreview_Chat_3_TextWithLink: String { return self._s[658]! }
- public var SettingsSearch_Synonyms_Privacy_AuthSessions: String { return self._s[660]! }
- public var Channel_Edit_LinkItem: String { return self._s[661]! }
- public var Presence_online: String { return self._s[662]! }
- public var AutoDownloadSettings_Title: String { return self._s[663]! }
- public var Conversation_MessageDialogRetry: String { return self._s[664]! }
- public var SettingsSearch_Synonyms_ChatSettings_OpenLinksIn: String { return self._s[666]! }
- public var Channel_About_Placeholder: String { return self._s[668]! }
- public var Passport_Language_sl: String { return self._s[669]! }
- public var AppleWatch_Title: String { return self._s[671]! }
- public var RepliesChat_DescriptionText: String { return self._s[673]! }
- public var Stats_Message_PrivateShares: String { return self._s[674]! }
- public var Settings_ViewPhoto: String { return self._s[675]! }
- public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[676]! }
- public var Cache_ClearProgress: String { return self._s[677]! }
- public var Cache_Music: String { return self._s[678]! }
- public var Conversation_ContextMenuShare: String { return self._s[680]! }
- public var AutoDownloadSettings_Unlimited: String { return self._s[681]! }
- public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[682]! }
- public var Contacts_PermissionsAllow: String { return self._s[683]! }
- public var Passport_Language_vi: String { return self._s[685]! }
+ public var Cache_ClearNone: String { return self._s[646]! }
+ public var PrivacyPolicy_Accept: String { return self._s[647]! }
+ public var Contacts_PhoneNumber: String { return self._s[648]! }
+ public var Passport_Identity_OneOfTypePassport: String { return self._s[649]! }
+ public var PhotoEditor_HighlightsTint: String { return self._s[651]! }
+ public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[652]! }
+ public var Checkout_PaymentMethod_Title: String { return self._s[655]! }
+ public var Month_GenAugust: String { return self._s[657]! }
+ public var DialogList_Draft: String { return self._s[658]! }
+ public var ChatList_EmptyChatListFilterText: String { return self._s[659]! }
+ public var PeopleNearby_Description: String { return self._s[660]! }
+ public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[661]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[663]! }
+ public var Watch_Message_ForwardedFrom: String { return self._s[664]! }
+ public var Notification_Mute1h: String { return self._s[665]! }
+ public var Appearance_ThemePreview_Chat_3_TextWithLink: String { return self._s[666]! }
+ public var SettingsSearch_Synonyms_Privacy_AuthSessions: String { return self._s[668]! }
+ public var Channel_Edit_LinkItem: String { return self._s[669]! }
+ public var Presence_online: String { return self._s[670]! }
+ public var AutoDownloadSettings_Title: String { return self._s[671]! }
+ public var Conversation_MessageDialogRetry: String { return self._s[672]! }
+ public var SettingsSearch_Synonyms_ChatSettings_OpenLinksIn: String { return self._s[674]! }
+ public var Channel_About_Placeholder: String { return self._s[676]! }
+ public var Passport_Language_sl: String { return self._s[677]! }
+ public var AppleWatch_Title: String { return self._s[679]! }
+ public var RepliesChat_DescriptionText: String { return self._s[681]! }
+ public var Stats_Message_PrivateShares: String { return self._s[682]! }
+ public var Settings_ViewPhoto: String { return self._s[683]! }
+ public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[684]! }
+ public var Cache_ClearProgress: String { return self._s[685]! }
+ public var Cache_Music: String { return self._s[686]! }
+ public var Conversation_ContextMenuShare: String { return self._s[688]! }
+ public var AutoDownloadSettings_Unlimited: String { return self._s[689]! }
+ public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[690]! }
+ public var Contacts_PermissionsAllow: String { return self._s[691]! }
+ public var Passport_Language_vi: String { return self._s[693]! }
public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[688]!, self._r[688]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[696]!, self._r[696]!, [_1, _2])
}
- public var Passport_Language_de: String { return self._s[689]! }
- public var Notifications_PermissionsText: String { return self._s[691]! }
- public var GroupRemoved_AddToGroup: String { return self._s[692]! }
- public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[693]! }
- public var ChangePhoneNumberCode_RequestingACall: String { return self._s[694]! }
- public var Login_TermsOfServiceAgree: String { return self._s[695]! }
- public var VoiceOver_Navigation_ProxySettings: String { return self._s[696]! }
+ public var Passport_Language_de: String { return self._s[697]! }
+ public var Notifications_PermissionsText: String { return self._s[699]! }
+ public var GroupRemoved_AddToGroup: String { return self._s[700]! }
+ public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[701]! }
+ public var ChangePhoneNumberCode_RequestingACall: String { return self._s[702]! }
+ public var Login_TermsOfServiceAgree: String { return self._s[703]! }
+ public var VoiceOver_Navigation_ProxySettings: String { return self._s[704]! }
public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[697]!, self._r[697]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[705]!, self._r[705]!, [_1, _2])
}
- public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[699]! }
+ public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[707]! }
public func PUSH_CHAT_VOICECHAT_START(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[700]!, self._r[700]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[708]!, self._r[708]!, [_1, _2])
}
- public var ChatListFolder_NameGroups: String { return self._s[701]! }
- public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[702]! }
+ public var ChatListFolder_NameGroups: String { return self._s[709]! }
+ public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[710]! }
public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[703]!, self._r[703]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[711]!, self._r[711]!, [_1, _2])
}
- public var Watch_Suggestion_TalkLater: String { return self._s[704]! }
- public var Checkout_ShippingOption_Title: String { return self._s[705]! }
- public var Conversation_TitleRepliesEmpty: String { return self._s[706]! }
- public var CreatePoll_TextHeader: String { return self._s[707]! }
- public var VoiceOver_Chat_Message: String { return self._s[709]! }
- public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[710]! }
- public var ContactInfo_Note: String { return self._s[712]! }
- public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[713]! }
- public var Checkout_NewCard_CardholderNameTitle: String { return self._s[714]! }
- public var AutoDownloadSettings_Photos: String { return self._s[715]! }
- public var UserInfo_NotificationsDefaultDisabled: String { return self._s[716]! }
- public var Channel_Info_Subscribers: String { return self._s[717]! }
- public var ChatList_DeleteForCurrentUser: String { return self._s[718]! }
- public var ChatListFolderSettings_FoldersSection: String { return self._s[719]! }
+ public var Watch_Suggestion_TalkLater: String { return self._s[712]! }
+ public var Checkout_ShippingOption_Title: String { return self._s[713]! }
+ public var Conversation_TitleRepliesEmpty: String { return self._s[714]! }
+ public var CreatePoll_TextHeader: String { return self._s[715]! }
+ public var VoiceOver_Chat_Message: String { return self._s[717]! }
+ public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[718]! }
+ public var ContactInfo_Note: String { return self._s[720]! }
+ public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[721]! }
+ public var Checkout_NewCard_CardholderNameTitle: String { return self._s[722]! }
+ public var AutoDownloadSettings_Photos: String { return self._s[723]! }
+ public var UserInfo_NotificationsDefaultDisabled: String { return self._s[724]! }
+ public var Channel_Info_Subscribers: String { return self._s[725]! }
+ public var ChatList_DeleteForCurrentUser: String { return self._s[726]! }
+ public var ChatListFolderSettings_FoldersSection: String { return self._s[727]! }
public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[723]!, self._r[723]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[731]!, self._r[731]!, [_1, _2, _3])
}
- public var AutoNightTheme_System: String { return self._s[724]! }
- public var Call_StatusWaiting: String { return self._s[725]! }
- public var GroupInfo_GroupHistoryHidden: String { return self._s[726]! }
+ public var AutoNightTheme_System: String { return self._s[732]! }
+ public var Call_StatusWaiting: String { return self._s[733]! }
+ public var GroupInfo_GroupHistoryHidden: String { return self._s[734]! }
public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[727]!, self._r[727]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[735]!, self._r[735]!, [_1, _2, _3])
}
- public var Conversation_ContextMenuCopy: String { return self._s[729]! }
- public var Notifications_MessageNotificationsPreview: String { return self._s[730]! }
- public var Notifications_InAppNotificationsVibrate: String { return self._s[731]! }
+ public var Conversation_ContextMenuCopy: String { return self._s[737]! }
+ public var Notifications_MessageNotificationsPreview: String { return self._s[738]! }
+ public var Notifications_InAppNotificationsVibrate: String { return self._s[739]! }
public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[732]!, self._r[732]!, [_0])
+ return formatWithArgumentRanges(self._s[740]!, self._r[740]!, [_0])
}
- public var Group_Status: String { return self._s[734]! }
- public var Group_Setup_HistoryVisible: String { return self._s[735]! }
- public var Conversation_DiscardVoiceMessageAction: String { return self._s[736]! }
- public var Paint_Edit: String { return self._s[737]! }
- public var Channel_EditAdmin_CannotEdit: String { return self._s[739]! }
- public var Username_InvalidTooShort: String { return self._s[740]! }
- public var ClearCache_StorageOtherApps: String { return self._s[741]! }
- public var Conversation_ViewMessage: String { return self._s[742]! }
- public var GroupInfo_PublicLinkAdd: String { return self._s[744]! }
+ public var Group_Status: String { return self._s[742]! }
+ public var Group_Setup_HistoryVisible: String { return self._s[743]! }
+ public var Conversation_DiscardVoiceMessageAction: String { return self._s[744]! }
+ public var Paint_Edit: String { return self._s[745]! }
+ public var Channel_EditAdmin_CannotEdit: String { return self._s[747]! }
+ public var Username_InvalidTooShort: String { return self._s[748]! }
+ public var ClearCache_StorageOtherApps: String { return self._s[749]! }
+ public var Conversation_ViewMessage: String { return self._s[750]! }
+ public var GroupInfo_PublicLinkAdd: String { return self._s[752]! }
public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[745]!, self._r[745]!, [_0])
+ return formatWithArgumentRanges(self._s[753]!, self._r[753]!, [_0])
}
- public var CallSettings_Title: String { return self._s[746]! }
+ public var CallSettings_Title: String { return self._s[754]! }
public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[747]!, self._r[747]!, [_0])
+ return formatWithArgumentRanges(self._s[755]!, self._r[755]!, [_0])
}
public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[750]!, self._r[750]!, [_0])
+ return formatWithArgumentRanges(self._s[758]!, self._r[758]!, [_0])
}
- public var PUSH_SENDER_YOU: String { return self._s[753]! }
- public var Profile_ShareContactButton: String { return self._s[754]! }
- public var GroupInfo_Permissions_SectionTitle: String { return self._s[755]! }
- public var Map_ShareLiveLocation: String { return self._s[756]! }
- public var ChatListFolder_TitleEdit: String { return self._s[757]! }
- public var Passport_Address_Address: String { return self._s[759]! }
- public var LastSeen_JustNow: String { return self._s[761]! }
+ public var PUSH_SENDER_YOU: String { return self._s[761]! }
+ public var Profile_ShareContactButton: String { return self._s[762]! }
+ public var GroupInfo_Permissions_SectionTitle: String { return self._s[763]! }
+ public var Map_ShareLiveLocation: String { return self._s[764]! }
+ public var ChatListFolder_TitleEdit: String { return self._s[765]! }
+ public var Passport_Address_Address: String { return self._s[767]! }
+ public var LastSeen_JustNow: String { return self._s[769]! }
public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[762]!, self._r[762]!, [_0])
+ return formatWithArgumentRanges(self._s[770]!, self._r[770]!, [_0])
}
- public var ContactInfo_PhoneLabelOther: String { return self._s[763]! }
- public var PasscodeSettings_DoNotMatch: String { return self._s[764]! }
- public var Weekday_Today: String { return self._s[767]! }
- public var DialogList_Title: String { return self._s[768]! }
- public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[769]! }
- public var Cache_ClearCache: String { return self._s[770]! }
- public var CreatePoll_ExplanationInfo: String { return self._s[771]! }
- public var Notifications_ResetAllNotificationsHelp: String { return self._s[773]! }
- public var Stats_MessageTitle: String { return self._s[774]! }
- public var Passport_Address_Street: String { return self._s[776]! }
+ public var ContactInfo_PhoneLabelOther: String { return self._s[771]! }
+ public var PasscodeSettings_DoNotMatch: String { return self._s[772]! }
+ public var Weekday_Today: String { return self._s[775]! }
+ public var DialogList_Title: String { return self._s[776]! }
+ public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[777]! }
+ public var Cache_ClearCache: String { return self._s[778]! }
+ public var CreatePoll_ExplanationInfo: String { return self._s[779]! }
+ public var Notifications_ResetAllNotificationsHelp: String { return self._s[781]! }
+ public var Stats_MessageTitle: String { return self._s[782]! }
+ public var Passport_Address_Street: String { return self._s[784]! }
public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[777]!, self._r[777]!, [_0])
+ return formatWithArgumentRanges(self._s[785]!, self._r[785]!, [_0])
}
- public var Channel_AdminLog_ChannelEmptyText: String { return self._s[778]! }
+ public var Channel_AdminLog_ChannelEmptyText: String { return self._s[786]! }
public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[779]!, self._r[779]!, [_0])
+ return formatWithArgumentRanges(self._s[787]!, self._r[787]!, [_0])
}
- public var TwoStepAuth_Email: String { return self._s[781]! }
- public var Conversation_SecretLinkPreviewAlert: String { return self._s[782]! }
- public var PrivacySettings_PasscodeOn: String { return self._s[783]! }
- public var Camera_SquareMode: String { return self._s[785]! }
- public var SocksProxySetup_Port: String { return self._s[786]! }
- public var Watch_LastSeen_JustNow: String { return self._s[788]! }
+ public var TwoStepAuth_Email: String { return self._s[789]! }
+ public var Conversation_SecretLinkPreviewAlert: String { return self._s[790]! }
+ public var PrivacySettings_PasscodeOn: String { return self._s[791]! }
+ public var Camera_SquareMode: String { return self._s[793]! }
+ public var SocksProxySetup_Port: String { return self._s[794]! }
+ public var Watch_LastSeen_JustNow: String { return self._s[796]! }
public func Location_ProximityAlertSetText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[789]!, self._r[789]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[797]!, self._r[797]!, [_1, _2])
}
public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[790]!, self._r[790]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[798]!, self._r[798]!, [_1, _2])
}
public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[791]!, self._r[791]!, [_0])
+ return formatWithArgumentRanges(self._s[799]!, self._r[799]!, [_0])
}
- public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[792]! }
- public var Channel_AdminLogFilter_EventsTitle: String { return self._s[793]! }
- public var Watch_Suggestion_HoldOn: String { return self._s[796]! }
+ public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[800]! }
+ public var Channel_AdminLogFilter_EventsTitle: String { return self._s[801]! }
+ public var Watch_Suggestion_HoldOn: String { return self._s[804]! }
public func PUSH_CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[797]!, self._r[797]!, [_1])
+ return formatWithArgumentRanges(self._s[805]!, self._r[805]!, [_1])
}
- public var CallSettings_TabIcon: String { return self._s[798]! }
- public var ScheduledMessages_SendNow: String { return self._s[799]! }
- public var Stats_GroupTopWeekdaysTitle: String { return self._s[800]! }
- public var UserInfo_PhoneCall: String { return self._s[801]! }
- public var Month_GenMarch: String { return self._s[802]! }
- public var Camera_Discard: String { return self._s[803]! }
- public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[804]! }
- public var Passport_RequestedInformation: String { return self._s[805]! }
+ public var CallSettings_TabIcon: String { return self._s[806]! }
+ public var ScheduledMessages_SendNow: String { return self._s[807]! }
+ public var Stats_GroupTopWeekdaysTitle: String { return self._s[808]! }
+ public var UserInfo_PhoneCall: String { return self._s[809]! }
+ public var Month_GenMarch: String { return self._s[810]! }
+ public var Camera_Discard: String { return self._s[811]! }
+ public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[812]! }
+ public var Passport_RequestedInformation: String { return self._s[813]! }
public func Notification_ProximityYouReached(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[807]!, self._r[807]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_1, _2])
}
- public var Passport_Language_ro: String { return self._s[808]! }
+ public var Passport_Language_ro: String { return self._s[816]! }
public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[809]!, self._r[809]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[817]!, self._r[817]!, [_1, _2])
}
- public var AutoDownloadSettings_ResetHelp: String { return self._s[810]! }
- public var Passport_Identity_DocumentDetails: String { return self._s[812]! }
- public var Passport_Address_ScansHelp: String { return self._s[813]! }
- public var Location_LiveLocationRequired_Title: String { return self._s[814]! }
- public var ClearCache_StorageCache: String { return self._s[815]! }
- public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[816]! }
- public var Conversation_RestrictedText: String { return self._s[817]! }
- public var Notifications_MessageNotifications: String { return self._s[819]! }
- public var Passport_Scans: String { return self._s[820]! }
- public var TwoStepAuth_SetupHintTitle: String { return self._s[822]! }
- public var LogoutOptions_ContactSupportTitle: String { return self._s[823]! }
- public var Passport_Identity_SelfieHelp: String { return self._s[824]! }
- public var Permissions_NotificationsUnreachableText_v0: String { return self._s[825]! }
- public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[826]! }
- public var ShareMenu_CopyShareLinkGame: String { return self._s[827]! }
- public var PeerInfo_ButtonSearch: String { return self._s[828]! }
+ public var AutoDownloadSettings_ResetHelp: String { return self._s[818]! }
+ public var Passport_Identity_DocumentDetails: String { return self._s[820]! }
+ public var Passport_Address_ScansHelp: String { return self._s[821]! }
+ public var Location_LiveLocationRequired_Title: String { return self._s[822]! }
+ public var ClearCache_StorageCache: String { return self._s[823]! }
+ public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[824]! }
+ public var Conversation_RestrictedText: String { return self._s[825]! }
+ public var Notifications_MessageNotifications: String { return self._s[827]! }
+ public var Passport_Scans: String { return self._s[828]! }
+ public var TwoStepAuth_SetupHintTitle: String { return self._s[830]! }
+ public var LogoutOptions_ContactSupportTitle: String { return self._s[831]! }
+ public var Passport_Identity_SelfieHelp: String { return self._s[832]! }
+ public var Permissions_NotificationsUnreachableText_v0: String { return self._s[833]! }
+ public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[834]! }
+ public var ShareMenu_CopyShareLinkGame: String { return self._s[835]! }
+ public var PeerInfo_ButtonSearch: String { return self._s[836]! }
public func Notification_ProximityReachedYou(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[831]!, self._r[831]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[839]!, self._r[839]!, [_1, _2])
}
- public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[832]! }
- public var Passport_FieldIdentityTranslationHelp: String { return self._s[834]! }
- public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[835]! }
- public var Month_GenSeptember: String { return self._s[836]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[840]! }
+ public var Passport_FieldIdentityTranslationHelp: String { return self._s[842]! }
+ public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[843]! }
+ public var Month_GenSeptember: String { return self._s[844]! }
public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[838]!, self._r[838]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[846]!, self._r[846]!, [_1, _2])
}
- public var StickerPacksSettings_ArchivedPacks: String { return self._s[839]! }
+ public var StickerPacksSettings_ArchivedPacks: String { return self._s[847]! }
public func Notification_VoiceChatInvitation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[841]!, self._r[841]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[849]!, self._r[849]!, [_1, _2])
}
public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[842]!, self._r[842]!, [_0])
+ return formatWithArgumentRanges(self._s[850]!, self._r[850]!, [_0])
}
public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[844]!, self._r[844]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[852]!, self._r[852]!, [_1, _2])
}
public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[845]!, self._r[845]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[853]!, self._r[853]!, [_1, _2])
}
- public var Calls_NotNow: String { return self._s[847]! }
- public var Settings_ChatFolders: String { return self._s[851]! }
- public var Login_PadPhoneHelpTitle: String { return self._s[852]! }
- public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[853]! }
- public var Settings_ChatBackground: String { return self._s[854]! }
+ public var Calls_NotNow: String { return self._s[855]! }
+ public var Settings_ChatFolders: String { return self._s[859]! }
+ public var Login_PadPhoneHelpTitle: String { return self._s[860]! }
+ public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[861]! }
+ public var Settings_ChatBackground: String { return self._s[862]! }
public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[856]!, self._r[856]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[864]!, self._r[864]!, [_1, _2])
}
- public var ProxyServer_VoiceOver_Active: String { return self._s[857]! }
- public var Call_StatusBusy: String { return self._s[858]! }
- public var Conversation_MessageDeliveryFailed: String { return self._s[859]! }
- public var Login_NetworkError: String { return self._s[861]! }
- public var TwoStepAuth_SetupPasswordDescription: String { return self._s[862]! }
- public var Privacy_Calls_Integration: String { return self._s[863]! }
- public var DialogList_SearchSectionMessages: String { return self._s[864]! }
- public var AutoDownloadSettings_VideosTitle: String { return self._s[865]! }
- public var Preview_DeletePhoto: String { return self._s[866]! }
- public var PrivacySettings_PhoneNumber: String { return self._s[868]! }
- public var Forward_ErrorDisabledForChat: String { return self._s[869]! }
- public var Watch_Compose_CurrentLocation: String { return self._s[870]! }
- public var Settings_CallSettings: String { return self._s[871]! }
- public var AutoDownloadSettings_TypePrivateChats: String { return self._s[872]! }
- public var ChatList_Context_MarkAllAsRead: String { return self._s[873]! }
- public var ChatSettings_AutoPlayAnimations: String { return self._s[874]! }
- public var SaveIncomingPhotosSettings_Title: String { return self._s[875]! }
- public var OwnershipTransfer_SecurityRequirements: String { return self._s[876]! }
- public var Map_LiveLocationFor1Hour: String { return self._s[877]! }
+ public var ProxyServer_VoiceOver_Active: String { return self._s[865]! }
+ public var Call_StatusBusy: String { return self._s[866]! }
+ public var Conversation_MessageDeliveryFailed: String { return self._s[867]! }
+ public var Login_NetworkError: String { return self._s[869]! }
+ public var TwoStepAuth_SetupPasswordDescription: String { return self._s[870]! }
+ public var Privacy_Calls_Integration: String { return self._s[871]! }
+ public var DialogList_SearchSectionMessages: String { return self._s[872]! }
+ public var AutoDownloadSettings_VideosTitle: String { return self._s[873]! }
+ public var Preview_DeletePhoto: String { return self._s[874]! }
+ public var PrivacySettings_PhoneNumber: String { return self._s[876]! }
+ public var Forward_ErrorDisabledForChat: String { return self._s[877]! }
+ public var Watch_Compose_CurrentLocation: String { return self._s[878]! }
+ public var Settings_CallSettings: String { return self._s[879]! }
+ public var AutoDownloadSettings_TypePrivateChats: String { return self._s[880]! }
+ public var ChatList_Context_MarkAllAsRead: String { return self._s[881]! }
+ public var ChatSettings_AutoPlayAnimations: String { return self._s[882]! }
+ public var SaveIncomingPhotosSettings_Title: String { return self._s[883]! }
+ public var OwnershipTransfer_SecurityRequirements: String { return self._s[884]! }
+ public var Map_LiveLocationFor1Hour: String { return self._s[885]! }
public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[878]!, self._r[878]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[886]!, self._r[886]!, [_0, _1])
}
public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[879]!, self._r[879]!, [_0])
+ return formatWithArgumentRanges(self._s[887]!, self._r[887]!, [_0])
}
- public var Conversation_UnvotePoll: String { return self._s[880]! }
- public var TwoStepAuth_EnterEmailCode: String { return self._s[881]! }
+ public var Conversation_UnvotePoll: String { return self._s[888]! }
+ public var TwoStepAuth_EnterEmailCode: String { return self._s[889]! }
public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[882]!, self._r[882]!, [_1, "\(_2)"])
+ return formatWithArgumentRanges(self._s[890]!, self._r[890]!, [_1, "\(_2)"])
}
- public var Passport_InfoTitle: String { return self._s[883]! }
+ public var Passport_InfoTitle: String { return self._s[891]! }
public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[884]!, self._r[884]!, ["\(_0)"])
+ return formatWithArgumentRanges(self._s[892]!, self._r[892]!, ["\(_0)"])
}
- public var AccentColor_Title: String { return self._s[885]! }
+ public var AccentColor_Title: String { return self._s[893]! }
public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[886]!, self._r[886]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[894]!, self._r[894]!, [_1, _2])
}
public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[889]!, self._r[889]!, [_0])
+ return formatWithArgumentRanges(self._s[897]!, self._r[897]!, [_0])
}
- public var AutoDownloadSettings_DataUsageCustom: String { return self._s[890]! }
- public var Conversation_ShareBotLocationConfirmation: String { return self._s[891]! }
- public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[892]! }
- public var VoiceOver_Editing_ClearText: String { return self._s[893]! }
- public var Conversation_Unarchive: String { return self._s[894]! }
- public var Notification_CallOutgoing: String { return self._s[895]! }
- public var Channel_Setup_PublicNoLink: String { return self._s[896]! }
- public var Passport_Identity_GenderPlaceholder: String { return self._s[897]! }
- public var Message_Animation: String { return self._s[898]! }
- public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[899]! }
- public var ChatSettings_ConnectionType_Title: String { return self._s[900]! }
+ public var AutoDownloadSettings_DataUsageCustom: String { return self._s[898]! }
+ public var Conversation_ShareBotLocationConfirmation: String { return self._s[899]! }
+ public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[900]! }
+ public var VoiceOver_Editing_ClearText: String { return self._s[901]! }
+ public var Conversation_Unarchive: String { return self._s[902]! }
+ public var Notification_CallOutgoing: String { return self._s[903]! }
+ public var Channel_Setup_PublicNoLink: String { return self._s[904]! }
+ public var Passport_Identity_GenderPlaceholder: String { return self._s[905]! }
+ public var Message_Animation: String { return self._s[906]! }
+ public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[907]! }
+ public var ChatSettings_ConnectionType_Title: String { return self._s[908]! }
public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[901]!, self._r[901]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[909]!, self._r[909]!, [_1, _2])
}
- public var Notification_CallBack: String { return self._s[903]! }
- public var Appearance_Title: String { return self._s[905]! }
- public var NotificationsSound_Glass: String { return self._s[907]! }
- public var AutoDownloadSettings_CellularTitle: String { return self._s[909]! }
- public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[911]! }
- public var ChatSearch_SearchPlaceholder: String { return self._s[912]! }
- public var Passport_Identity_AddPassport: String { return self._s[913]! }
- public var GroupPermission_NoAddMembers: String { return self._s[915]! }
- public var ContactList_Context_SendMessage: String { return self._s[916]! }
- public var PhotoEditor_GrainTool: String { return self._s[917]! }
- public var Settings_CopyPhoneNumber: String { return self._s[918]! }
- public var Passport_Address_City: String { return self._s[919]! }
- public var ChannelRemoved_RemoveInfo: String { return self._s[920]! }
- public var SocksProxySetup_Password: String { return self._s[922]! }
- public var Settings_Passport: String { return self._s[923]! }
- public var Channel_MessagePhotoUpdated: String { return self._s[925]! }
- public var Stats_LanguagesTitle: String { return self._s[926]! }
- public var ChatList_PeerTypeGroup: String { return self._s[927]! }
- public var Privacy_Calls_P2PHelp: String { return self._s[928]! }
- public var VoiceOver_Chat_PollNoVotes: String { return self._s[929]! }
- public var Embed_PlayingInPIP: String { return self._s[930]! }
- public var BlockedUsers_BlockUser: String { return self._s[933]! }
- public var Login_CancelPhoneVerificationContinue: String { return self._s[934]! }
+ public var Notification_CallBack: String { return self._s[911]! }
+ public var Appearance_Title: String { return self._s[913]! }
+ public var NotificationsSound_Glass: String { return self._s[915]! }
+ public var AutoDownloadSettings_CellularTitle: String { return self._s[917]! }
+ public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[919]! }
+ public var ChatSearch_SearchPlaceholder: String { return self._s[920]! }
+ public var Passport_Identity_AddPassport: String { return self._s[921]! }
+ public var GroupPermission_NoAddMembers: String { return self._s[923]! }
+ public var ContactList_Context_SendMessage: String { return self._s[924]! }
+ public var PhotoEditor_GrainTool: String { return self._s[925]! }
+ public var Settings_CopyPhoneNumber: String { return self._s[926]! }
+ public var Passport_Address_City: String { return self._s[927]! }
+ public var ChannelRemoved_RemoveInfo: String { return self._s[928]! }
+ public var SocksProxySetup_Password: String { return self._s[930]! }
+ public var Settings_Passport: String { return self._s[931]! }
+ public var Channel_MessagePhotoUpdated: String { return self._s[933]! }
+ public var Stats_LanguagesTitle: String { return self._s[934]! }
+ public var ChatList_PeerTypeGroup: String { return self._s[935]! }
+ public var Privacy_Calls_P2PHelp: String { return self._s[936]! }
+ public var VoiceOver_Chat_PollNoVotes: String { return self._s[937]! }
+ public var Embed_PlayingInPIP: String { return self._s[938]! }
+ public var BlockedUsers_BlockUser: String { return self._s[941]! }
+ public var Login_CancelPhoneVerificationContinue: String { return self._s[942]! }
public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_1])
+ return formatWithArgumentRanges(self._s[943]!, self._r[943]!, [_1])
}
- public var AuthSessions_LoggedIn: String { return self._s[936]! }
- public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[937]! }
- public var Activity_UploadingDocument: String { return self._s[938]! }
- public var PeopleNearby_NoMembers: String { return self._s[939]! }
- public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[942]! }
- public var ChatSettings_AutoPlayVideos: String { return self._s[943]! }
- public var VoiceOver_Chat_OpenLinkHint: String { return self._s[944]! }
- public var Settings_ViewVideo: String { return self._s[945]! }
- public var Map_ShowPlaces: String { return self._s[947]! }
- public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[948]! }
- public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[949]! }
+ public var AuthSessions_LoggedIn: String { return self._s[944]! }
+ public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[945]! }
+ public var Activity_UploadingDocument: String { return self._s[946]! }
+ public var PeopleNearby_NoMembers: String { return self._s[947]! }
+ public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[950]! }
+ public var ChatSettings_AutoPlayVideos: String { return self._s[951]! }
+ public var VoiceOver_Chat_OpenLinkHint: String { return self._s[952]! }
+ public var Settings_ViewVideo: String { return self._s[953]! }
+ public var Map_ShowPlaces: String { return self._s[955]! }
+ public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[956]! }
+ public var InviteLink_Create_Title: String { return self._s[957]! }
+ public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[958]! }
public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[950]!, self._r[950]!, [_0])
+ return formatWithArgumentRanges(self._s[959]!, self._r[959]!, [_0])
}
- public var Conversation_StatusLeftGroup: String { return self._s[951]! }
- public var Theme_Colors_Messages: String { return self._s[952]! }
- public var AuthSessions_EmptyText: String { return self._s[953]! }
+ public var Conversation_StatusLeftGroup: String { return self._s[960]! }
+ public var Theme_Colors_Messages: String { return self._s[961]! }
+ public var AuthSessions_EmptyText: String { return self._s[962]! }
public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[954]!, self._r[954]!, [_1])
+ return formatWithArgumentRanges(self._s[963]!, self._r[963]!, [_1])
}
- public var UserInfo_StartSecretChat: String { return self._s[955]! }
- public var ChatListFolderSettings_EditFoldersInfo: String { return self._s[956]! }
- public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[957]! }
- public var Conversation_ReportSpamGroupConfirmation: String { return self._s[958]! }
- public var Conversation_PrivateMessageLinkCopied: String { return self._s[960]! }
- public var PeerInfo_PaneFiles: String { return self._s[961]! }
- public var PrivacySettings_AutoArchive: String { return self._s[962]! }
- public var Camera_VideoMode: String { return self._s[963]! }
- public var NotificationsSound_Alert: String { return self._s[964]! }
- public var Privacy_Forwards_NeverAllow_Title: String { return self._s[965]! }
- public var Appearance_AutoNightTheme: String { return self._s[966]! }
- public var Passport_Language_he: String { return self._s[967]! }
- public var Passport_InvalidPasswordError: String { return self._s[968]! }
- public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[969]! }
- public var UserInfo_InviteBotToGroup: String { return self._s[970]! }
- public var Conversation_SilentBroadcastTooltipOff: String { return self._s[971]! }
- public var Common_TakePhoto: String { return self._s[972]! }
- public var Passport_Email_UseTelegramEmailHelp: String { return self._s[973]! }
- public var ChatList_Context_JoinChannel: String { return self._s[974]! }
- public var MediaPlayer_UnknownArtist: String { return self._s[975]! }
- public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[978]! }
- public var Channel_OwnershipTransfer_Title: String { return self._s[979]! }
- public var EditTheme_UploadEditedTheme: String { return self._s[980]! }
- public var Settings_SetProfilePhotoOrVideo: String { return self._s[982]! }
- public var Passport_FieldOneOf_Delimeter: String { return self._s[983]! }
- public var MessagePoll_ViewResults: String { return self._s[984]! }
- public var Group_Setup_TypePrivateHelp: String { return self._s[985]! }
- public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[986]! }
- public var ChatList_Search_ShowLess: String { return self._s[987]! }
- public var UserInfo_ShareBot: String { return self._s[988]! }
- public var Privacy_Calls_P2P: String { return self._s[990]! }
- public var WebBrowser_InAppSafari: String { return self._s[991]! }
- public var SharedMedia_EmptyFilesText: String { return self._s[994]! }
- public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[995]! }
- public var GroupInfo_SetSound: String { return self._s[996]! }
- public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[997]! }
- public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[998]! }
- public var Channel_AdminLogFilter_EventsAll: String { return self._s[999]! }
- public var CallSettings_UseLessData: String { return self._s[1000]! }
- public var InfoPlist_NSCameraUsageDescription: String { return self._s[1001]! }
- public var NotificationsSound_Chord: String { return self._s[1002]! }
- public var PhotoEditor_CurvesTool: String { return self._s[1003]! }
- public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1004]! }
- public var Resolve_ErrorNotFound: String { return self._s[1005]! }
- public var Activity_PlayingGame: String { return self._s[1006]! }
+ public var UserInfo_StartSecretChat: String { return self._s[964]! }
+ public var ChatListFolderSettings_EditFoldersInfo: String { return self._s[965]! }
+ public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[966]! }
+ public var Conversation_ReportSpamGroupConfirmation: String { return self._s[967]! }
+ public var Conversation_PrivateMessageLinkCopied: String { return self._s[969]! }
+ public var PeerInfo_PaneFiles: String { return self._s[970]! }
+ public var PrivacySettings_AutoArchive: String { return self._s[971]! }
+ public var Camera_VideoMode: String { return self._s[972]! }
+ public var NotificationsSound_Alert: String { return self._s[973]! }
+ public var Privacy_Forwards_NeverAllow_Title: String { return self._s[974]! }
+ public var Appearance_AutoNightTheme: String { return self._s[975]! }
+ public var Passport_Language_he: String { return self._s[976]! }
+ public var Passport_InvalidPasswordError: String { return self._s[977]! }
+ public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[978]! }
+ public var UserInfo_InviteBotToGroup: String { return self._s[979]! }
+ public var Conversation_SilentBroadcastTooltipOff: String { return self._s[980]! }
+ public var Common_TakePhoto: String { return self._s[981]! }
+ public var Passport_Email_UseTelegramEmailHelp: String { return self._s[982]! }
+ public var ChatList_Context_JoinChannel: String { return self._s[983]! }
+ public var MediaPlayer_UnknownArtist: String { return self._s[984]! }
+ public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[987]! }
+ public var Channel_OwnershipTransfer_Title: String { return self._s[988]! }
+ public var EditTheme_UploadEditedTheme: String { return self._s[989]! }
+ public var Settings_SetProfilePhotoOrVideo: String { return self._s[991]! }
+ public var Passport_FieldOneOf_Delimeter: String { return self._s[992]! }
+ public var MessagePoll_ViewResults: String { return self._s[993]! }
+ public var Group_Setup_TypePrivateHelp: String { return self._s[994]! }
+ public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[995]! }
+ public var ChatList_Search_ShowLess: String { return self._s[996]! }
+ public var InviteLink_Create_UsersLimitNoLimit: String { return self._s[997]! }
+ public var UserInfo_ShareBot: String { return self._s[998]! }
+ public var Privacy_Calls_P2P: String { return self._s[1000]! }
+ public var WebBrowser_InAppSafari: String { return self._s[1001]! }
+ public var SharedMedia_EmptyFilesText: String { return self._s[1004]! }
+ public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[1005]! }
+ public var GroupInfo_SetSound: String { return self._s[1006]! }
+ public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1007]! }
+ public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1008]! }
+ public var Channel_AdminLogFilter_EventsAll: String { return self._s[1009]! }
+ public var CallSettings_UseLessData: String { return self._s[1010]! }
+ public var InfoPlist_NSCameraUsageDescription: String { return self._s[1011]! }
+ public var NotificationsSound_Chord: String { return self._s[1012]! }
+ public var PhotoEditor_CurvesTool: String { return self._s[1013]! }
+ public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1014]! }
+ public var Resolve_ErrorNotFound: String { return self._s[1015]! }
+ public var Activity_PlayingGame: String { return self._s[1016]! }
public func VoiceChat_InvitedPeerText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1009]!, self._r[1009]!, [_0])
+ return formatWithArgumentRanges(self._s[1019]!, self._r[1019]!, [_0])
}
- public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1010]! }
+ public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1020]! }
public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1011]!, self._r[1011]!, [_1])
+ return formatWithArgumentRanges(self._s[1021]!, self._r[1021]!, [_1])
}
- public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[1012]! }
- public var Notification_CallIncoming: String { return self._s[1013]! }
- public var Stats_EnabledNotifications: String { return self._s[1014]! }
- public var Notifications_PermissionsOpenSettings: String { return self._s[1015]! }
- public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1016]! }
+ public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[1022]! }
+ public var Notification_CallIncoming: String { return self._s[1023]! }
+ public var Stats_EnabledNotifications: String { return self._s[1024]! }
+ public var Notifications_PermissionsOpenSettings: String { return self._s[1025]! }
+ public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1026]! }
public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1017]!, self._r[1017]!, [_0])
+ return formatWithArgumentRanges(self._s[1027]!, self._r[1027]!, [_0])
}
- public var VoiceChat_StatusMutedYou: String { return self._s[1018]! }
- public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[1019]! }
- public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[1020]! }
- public var StickerPacksSettings_Title: String { return self._s[1021]! }
+ public var VoiceChat_StatusMutedYou: String { return self._s[1028]! }
+ public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[1029]! }
+ public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[1030]! }
+ public var StickerPacksSettings_Title: String { return self._s[1031]! }
public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1022]!, self._r[1022]!, [_0])
+ return formatWithArgumentRanges(self._s[1032]!, self._r[1032]!, [_0])
}
- public var Watch_NoConnection: String { return self._s[1023]! }
- public var EncryptionKey_Title: String { return self._s[1024]! }
- public var Widget_AuthRequired: String { return self._s[1025]! }
+ public var Watch_NoConnection: String { return self._s[1033]! }
+ public var EncryptionKey_Title: String { return self._s[1034]! }
+ public var Widget_AuthRequired: String { return self._s[1035]! }
public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1026]!, self._r[1026]!, [_1])
+ return formatWithArgumentRanges(self._s[1036]!, self._r[1036]!, [_1])
}
- public var Notifications_ExceptionsTitle: String { return self._s[1027]! }
- public var EditTheme_Expand_TopInfo: String { return self._s[1028]! }
+ public var Notifications_ExceptionsTitle: String { return self._s[1037]! }
+ public var EditTheme_Expand_TopInfo: String { return self._s[1038]! }
public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1029]!, self._r[1029]!, [_0])
+ return formatWithArgumentRanges(self._s[1039]!, self._r[1039]!, [_0])
}
- public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[1031]! }
- public var Notifications_GroupNotificationsSound: String { return self._s[1032]! }
- public var VoiceChat_SpeakPermissionAdmin: String { return self._s[1033]! }
- public var Passport_Email_EnterOtherEmail: String { return self._s[1034]! }
+ public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[1041]! }
+ public var Notifications_GroupNotificationsSound: String { return self._s[1042]! }
+ public var VoiceChat_SpeakPermissionAdmin: String { return self._s[1043]! }
+ public var Passport_Email_EnterOtherEmail: String { return self._s[1044]! }
public func VoiceChat_RemovePeerConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1037]!, self._r[1037]!, [_0])
+ return formatWithArgumentRanges(self._s[1047]!, self._r[1047]!, [_0])
}
- public var Conversation_AddToContacts: String { return self._s[1038]! }
- public var AutoDownloadSettings_DataUsageMedium: String { return self._s[1039]! }
- public var AuthSessions_LogOutApplications: String { return self._s[1041]! }
- public var ChatList_Context_Unpin: String { return self._s[1042]! }
- public var PeopleNearby_DiscoverDescription: String { return self._s[1043]! }
- public var Notification_MessageLifetime1d: String { return self._s[1044]! }
- public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[1045]! }
- public var ChatListFolder_CategoryChannels: String { return self._s[1046]! }
- public var VoiceOver_Chat_SeenByRecipient: String { return self._s[1047]! }
- public var Notifications_PermissionsAllow: String { return self._s[1048]! }
- public var Undo_ScheduledMessagesCleared: String { return self._s[1049]! }
- public var AutoDownloadSettings_PrivateChats: String { return self._s[1051]! }
- public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1052]! }
+ public var Conversation_AddToContacts: String { return self._s[1048]! }
+ public var AutoDownloadSettings_DataUsageMedium: String { return self._s[1049]! }
+ public var AuthSessions_LogOutApplications: String { return self._s[1051]! }
+ public var ChatList_Context_Unpin: String { return self._s[1052]! }
+ public var PeopleNearby_DiscoverDescription: String { return self._s[1053]! }
+ public var Notification_MessageLifetime1d: String { return self._s[1054]! }
+ public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[1055]! }
+ public var ChatListFolder_CategoryChannels: String { return self._s[1056]! }
+ public var VoiceOver_Chat_SeenByRecipient: String { return self._s[1057]! }
+ public var Notifications_PermissionsAllow: String { return self._s[1058]! }
+ public var Undo_ScheduledMessagesCleared: String { return self._s[1059]! }
+ public var AutoDownloadSettings_PrivateChats: String { return self._s[1061]! }
+ public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1062]! }
public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1053]!, self._r[1053]!, [_0])
+ return formatWithArgumentRanges(self._s[1063]!, self._r[1063]!, [_0])
}
- public var Notifications_MessageNotificationsHelp: String { return self._s[1056]! }
- public var WallpaperSearch_ColorPink: String { return self._s[1057]! }
- public var ContactInfo_PhoneNumberHidden: String { return self._s[1058]! }
- public var Passport_Identity_IssueDate: String { return self._s[1060]! }
+ public var Notifications_MessageNotificationsHelp: String { return self._s[1066]! }
+ public var WallpaperSearch_ColorPink: String { return self._s[1067]! }
+ public var ContactInfo_PhoneNumberHidden: String { return self._s[1068]! }
+ public var Passport_Identity_IssueDate: String { return self._s[1070]! }
public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1061]!, self._r[1061]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1071]!, self._r[1071]!, [_1, _2])
}
- public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1062]! }
- public var Channel_Info_Description: String { return self._s[1063]! }
- public var Common_Back: String { return self._s[1064]! }
- public var Weekday_ShortTuesday: String { return self._s[1065]! }
- public var Chat_PinnedMessagesHiddenTitle: String { return self._s[1067]! }
- public var ChatListFolder_AddChats: String { return self._s[1068]! }
- public var Common_Close: String { return self._s[1070]! }
- public var Map_OpenIn: String { return self._s[1071]! }
- public var Group_Setup_HistoryTitle: String { return self._s[1072]! }
- public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[1073]! }
- public var Notification_MessageLifetime1h: String { return self._s[1074]! }
+ public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1072]! }
+ public var Channel_Info_Description: String { return self._s[1073]! }
+ public var Common_Back: String { return self._s[1074]! }
+ public var Weekday_ShortTuesday: String { return self._s[1075]! }
+ public var Chat_PinnedMessagesHiddenTitle: String { return self._s[1077]! }
+ public var ChatListFolder_AddChats: String { return self._s[1078]! }
+ public var Common_Close: String { return self._s[1080]! }
+ public var Map_OpenIn: String { return self._s[1081]! }
+ public var Group_Setup_HistoryTitle: String { return self._s[1082]! }
+ public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[1083]! }
+ public var Notification_MessageLifetime1h: String { return self._s[1084]! }
public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1075]!, self._r[1075]!, [_0])
+ return formatWithArgumentRanges(self._s[1085]!, self._r[1085]!, [_0])
}
- public var Watch_Contacts_NoResults: String { return self._s[1077]! }
- public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1078]! }
- public var Checkout_Phone: String { return self._s[1079]! }
- public var OwnershipTransfer_ComeBackLater: String { return self._s[1080]! }
+ public var Watch_Contacts_NoResults: String { return self._s[1087]! }
+ public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1088]! }
+ public var Checkout_Phone: String { return self._s[1089]! }
+ public var OwnershipTransfer_ComeBackLater: String { return self._s[1090]! }
public func Channel_CommentsGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1081]!, self._r[1081]!, [_0])
+ return formatWithArgumentRanges(self._s[1091]!, self._r[1091]!, [_0])
}
public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1082]!, self._r[1082]!, ["\(_0)"])
+ return formatWithArgumentRanges(self._s[1092]!, self._r[1092]!, ["\(_0)"])
}
- public var ChatAdmins_Title: String { return self._s[1083]! }
- public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[1084]! }
+ public var ChatAdmins_Title: String { return self._s[1093]! }
+ public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[1094]! }
public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1085]!, self._r[1085]!, [_1])
+ return formatWithArgumentRanges(self._s[1095]!, self._r[1095]!, [_1])
}
- public var Common_Done: String { return self._s[1086]! }
- public var Appearance_ThemeCarouselNight: String { return self._s[1089]! }
+ public var Common_Done: String { return self._s[1096]! }
+ public var Appearance_ThemeCarouselNight: String { return self._s[1099]! }
public func PUSH_PINNED_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1091]!, self._r[1091]!, [_1])
+ return formatWithArgumentRanges(self._s[1101]!, self._r[1101]!, [_1])
}
- public var Preview_OpenInInstagram: String { return self._s[1093]! }
- public var VoiceChat_StartRecordingStop: String { return self._s[1097]! }
- public var Wallpaper_SetColor: String { return self._s[1098]! }
- public var VoiceOver_Media_PlaybackRate: String { return self._s[1099]! }
- public var ChatSettings_Groups: String { return self._s[1100]! }
+ public var InviteLink_Expired: String { return self._s[1103]! }
+ public var Preview_OpenInInstagram: String { return self._s[1104]! }
+ public var VoiceChat_StartRecordingStop: String { return self._s[1108]! }
+ public var Wallpaper_SetColor: String { return self._s[1109]! }
+ public var VoiceOver_Media_PlaybackRate: String { return self._s[1110]! }
+ public var ChatSettings_Groups: String { return self._s[1111]! }
public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1101]!, self._r[1101]!, [_0])
+ return formatWithArgumentRanges(self._s[1112]!, self._r[1112]!, [_0])
}
- public var Contacts_SortedByName: String { return self._s[1102]! }
- public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1103]! }
- public var Channel_Management_LabelCreator: String { return self._s[1104]! }
- public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1105]! }
+ public var Contacts_SortedByName: String { return self._s[1113]! }
+ public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1114]! }
+ public var Channel_Management_LabelCreator: String { return self._s[1115]! }
+ public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1116]! }
public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1106]!, self._r[1106]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[1117]!, self._r[1117]!, [_0, _1])
}
- public var Group_GroupMembersHeader: String { return self._s[1107]! }
- public var Group_PublicLink_Title: String { return self._s[1108]! }
- public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1109]! }
- public var VoiceOver_Chat_Photo: String { return self._s[1110]! }
- public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[1111]! }
- public var IntentsSettings_SuggestBy: String { return self._s[1112]! }
- public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[1113]! }
- public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1114]! }
- public var PhoneNumberHelp_ChangeNumber: String { return self._s[1115]! }
- public var LogoutOptions_SetPasscodeText: String { return self._s[1116]! }
- public var Map_OpenInMaps: String { return self._s[1117]! }
- public var ContactInfo_PhoneLabelWorkFax: String { return self._s[1118]! }
- public var BlockedUsers_Unblock: String { return self._s[1119]! }
+ public var Group_GroupMembersHeader: String { return self._s[1118]! }
+ public var Group_PublicLink_Title: String { return self._s[1119]! }
+ public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1120]! }
+ public var VoiceOver_Chat_Photo: String { return self._s[1121]! }
+ public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[1122]! }
+ public var IntentsSettings_SuggestBy: String { return self._s[1123]! }
+ public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[1124]! }
+ public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1125]! }
+ public var PhoneNumberHelp_ChangeNumber: String { return self._s[1126]! }
+ public var LogoutOptions_SetPasscodeText: String { return self._s[1127]! }
+ public var Map_OpenInMaps: String { return self._s[1128]! }
+ public var ContactInfo_PhoneLabelWorkFax: String { return self._s[1129]! }
+ public var BlockedUsers_Unblock: String { return self._s[1130]! }
public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1120]!, self._r[1120]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1131]!, self._r[1131]!, [_1, _2])
}
public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1121]!, self._r[1121]!, [_1, _2])
- }
- public var Conversation_Block: String { return self._s[1123]! }
- public var Passport_Scans_UploadNew: String { return self._s[1124]! }
- public var Share_Title: String { return self._s[1125]! }
- public var Conversation_ApplyLocalization: String { return self._s[1126]! }
- public var SharedMedia_EmptyLinksText: String { return self._s[1127]! }
- public var Settings_NotificationsAndSounds: String { return self._s[1128]! }
- public var Stats_ViewsByHoursTitle: String { return self._s[1129]! }
- public var PhotoEditor_QualityMedium: String { return self._s[1130]! }
- public var Conversation_ContextMenuCancelSending: String { return self._s[1131]! }
- public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1132]!, self._r[1132]!, [_1, _2])
}
- public var Conversation_RestrictedInline: String { return self._s[1133]! }
- public var Passport_Language_tr: String { return self._s[1134]! }
- public var Call_Mute: String { return self._s[1135]! }
+ public var Conversation_Block: String { return self._s[1134]! }
+ public var Passport_Scans_UploadNew: String { return self._s[1135]! }
+ public var Share_Title: String { return self._s[1136]! }
+ public var Conversation_ApplyLocalization: String { return self._s[1137]! }
+ public var SharedMedia_EmptyLinksText: String { return self._s[1138]! }
+ public var Settings_NotificationsAndSounds: String { return self._s[1139]! }
+ public var Stats_ViewsByHoursTitle: String { return self._s[1140]! }
+ public var PhotoEditor_QualityMedium: String { return self._s[1141]! }
+ public var Conversation_ContextMenuCancelSending: String { return self._s[1142]! }
+ public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1143]!, self._r[1143]!, [_1, _2])
+ }
+ public var Conversation_RestrictedInline: String { return self._s[1144]! }
+ public var Passport_Language_tr: String { return self._s[1145]! }
+ public var Call_Mute: String { return self._s[1146]! }
public func Conversation_NoticeInvitedByInGroup(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1136]!, self._r[1136]!, [_0])
+ return formatWithArgumentRanges(self._s[1147]!, self._r[1147]!, [_0])
}
- public var Passport_Language_bn: String { return self._s[1137]! }
- public var AccessDenied_LocationTracking: String { return self._s[1139]! }
- public var Month_ShortOctober: String { return self._s[1140]! }
- public var AutoDownloadSettings_WiFi: String { return self._s[1141]! }
- public var ProfilePhoto_SetMainPhoto: String { return self._s[1143]! }
- public var ChangePhoneNumberNumber_NewNumber: String { return self._s[1144]! }
+ public var Passport_Language_bn: String { return self._s[1148]! }
+ public var AccessDenied_LocationTracking: String { return self._s[1151]! }
+ public var Month_ShortOctober: String { return self._s[1152]! }
+ public var AutoDownloadSettings_WiFi: String { return self._s[1153]! }
+ public var ProfilePhoto_SetMainPhoto: String { return self._s[1155]! }
+ public var ChangePhoneNumberNumber_NewNumber: String { return self._s[1156]! }
public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1145]!, self._r[1145]!, [_0])
+ return formatWithArgumentRanges(self._s[1157]!, self._r[1157]!, [_0])
}
- public var Watch_ChannelInfo_Title: String { return self._s[1146]! }
- public var State_Updating: String { return self._s[1147]! }
- public var Conversation_UnblockUser: String { return self._s[1148]! }
- public var Notifications_ChannelNotificationsSound: String { return self._s[1149]! }
- public var Map_GetDirections: String { return self._s[1150]! }
- public var Watch_Compose_AddContact: String { return self._s[1152]! }
- public var Conversation_Dice_u26BD: String { return self._s[1153]! }
- public var AccessDenied_PhotosRestricted: String { return self._s[1154]! }
+ public var Watch_ChannelInfo_Title: String { return self._s[1158]! }
+ public var State_Updating: String { return self._s[1159]! }
+ public var Conversation_UnblockUser: String { return self._s[1160]! }
+ public var Notifications_ChannelNotificationsSound: String { return self._s[1161]! }
+ public var Map_GetDirections: String { return self._s[1162]! }
+ public var Watch_Compose_AddContact: String { return self._s[1164]! }
+ public var Conversation_Dice_u26BD: String { return self._s[1165]! }
+ public var AccessDenied_PhotosRestricted: String { return self._s[1166]! }
public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1155]!, self._r[1155]!, [_1])
- }
- public var Map_LoadError: String { return self._s[1157]! }
- public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[1158]! }
- public var PhotoEditor_CropAuto: String { return self._s[1159]! }
- public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1162]!, self._r[1162]!, [_0])
- }
- public var Username_TooManyPublicUsernamesError: String { return self._s[1164]! }
- public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1165]!, self._r[1165]!, [_1])
- }
- public var Settings_PhoneNumber: String { return self._s[1166]! }
- public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1167]!, self._r[1167]!, [_1])
}
- public var Month_GenJune: String { return self._s[1169]! }
- public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[1170]! }
- public var ChatListFolder_CategoryRead: String { return self._s[1171]! }
- public var LoginPassword_ResetAccount: String { return self._s[1172]! }
+ public var Map_LoadError: String { return self._s[1169]! }
+ public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[1170]! }
+ public var PhotoEditor_CropAuto: String { return self._s[1171]! }
+ public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1174]!, self._r[1174]!, [_0])
+ }
+ public var Username_TooManyPublicUsernamesError: String { return self._s[1176]! }
+ public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1177]!, self._r[1177]!, [_1])
+ }
+ public var Settings_PhoneNumber: String { return self._s[1178]! }
+ public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1179]!, self._r[1179]!, [_1])
+ }
+ public var Month_GenJune: String { return self._s[1181]! }
+ public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[1182]! }
+ public var ChatListFolder_CategoryRead: String { return self._s[1183]! }
+ public var LoginPassword_ResetAccount: String { return self._s[1184]! }
public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1173]!, self._r[1173]!, [_0])
+ return formatWithArgumentRanges(self._s[1185]!, self._r[1185]!, [_0])
}
- public var Call_CameraConfirmationConfirm: String { return self._s[1174]! }
- public var Notification_RenamedChannel: String { return self._s[1175]! }
+ public var Call_CameraConfirmationConfirm: String { return self._s[1186]! }
+ public var Notification_RenamedChannel: String { return self._s[1187]! }
public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1176]!, self._r[1176]!, [_0])
+ return formatWithArgumentRanges(self._s[1188]!, self._r[1188]!, [_0])
}
- public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[1177]! }
- public var IntentsSettings_Title: String { return self._s[1179]! }
- public var Settings_AppleWatch: String { return self._s[1180]! }
- public var DialogList_NoMessagesText: String { return self._s[1181]! }
- public var GroupPermission_NoChangeInfo: String { return self._s[1182]! }
- public var Channel_ErrorAccessDenied: String { return self._s[1184]! }
- public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1185]! }
+ public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[1189]! }
+ public var IntentsSettings_Title: String { return self._s[1191]! }
+ public var Settings_AppleWatch: String { return self._s[1192]! }
+ public var DialogList_NoMessagesText: String { return self._s[1193]! }
+ public var GroupPermission_NoChangeInfo: String { return self._s[1194]! }
+ public var Channel_ErrorAccessDenied: String { return self._s[1196]! }
+ public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1197]! }
public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1186]!, self._r[1186]!, [_0])
+ return formatWithArgumentRanges(self._s[1198]!, self._r[1198]!, [_0])
}
- public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1187]! }
- public var StickerPacksSettings_AnimatedStickers: String { return self._s[1188]! }
- public var Month_ShortJanuary: String { return self._s[1189]! }
- public var Conversation_UnreadMessages: String { return self._s[1190]! }
- public var Call_VoiceOver_VideoCallCanceled: String { return self._s[1192]! }
- public var Conversation_PrivateChannelTooltip: String { return self._s[1193]! }
- public var PrivacySettings_DeleteAccountTitle: String { return self._s[1195]! }
- public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1196]! }
+ public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1199]! }
+ public var StickerPacksSettings_AnimatedStickers: String { return self._s[1200]! }
+ public var Month_ShortJanuary: String { return self._s[1201]! }
+ public var Conversation_UnreadMessages: String { return self._s[1202]! }
+ public var Call_VoiceOver_VideoCallCanceled: String { return self._s[1204]! }
+ public var Conversation_PrivateChannelTooltip: String { return self._s[1205]! }
+ public var PrivacySettings_DeleteAccountTitle: String { return self._s[1207]! }
+ public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1208]! }
public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1199]!, self._r[1199]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1212]!, self._r[1212]!, [_1, _2])
}
- public var Widget_ApplicationLocked: String { return self._s[1200]! }
+ public var Widget_ApplicationLocked: String { return self._s[1213]! }
public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1201]!, self._r[1201]!, [_0])
+ return formatWithArgumentRanges(self._s[1214]!, self._r[1214]!, [_0])
}
- public var Common_TakePhotoOrVideo: String { return self._s[1202]! }
- public var Passport_Language_ru: String { return self._s[1203]! }
- public var MediaPicker_VideoMuteDescription: String { return self._s[1204]! }
- public var EditTheme_ErrorLinkTaken: String { return self._s[1205]! }
+ public var Common_TakePhotoOrVideo: String { return self._s[1215]! }
+ public var Passport_Language_ru: String { return self._s[1216]! }
+ public var MediaPicker_VideoMuteDescription: String { return self._s[1217]! }
+ public var EditTheme_ErrorLinkTaken: String { return self._s[1218]! }
public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1207]!, self._r[1207]!, [_0])
+ return formatWithArgumentRanges(self._s[1220]!, self._r[1220]!, [_0])
}
- public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[1208]! }
- public var Conversation_Owner: String { return self._s[1210]! }
- public var Settings_FAQ_Intro: String { return self._s[1211]! }
- public var PhotoEditor_QualityLow: String { return self._s[1213]! }
- public var Widget_GalleryTitle: String { return self._s[1214]! }
- public var Call_End: String { return self._s[1215]! }
- public var StickerPacksSettings_FeaturedPacks: String { return self._s[1217]! }
- public var Privacy_ContactsSyncHelp: String { return self._s[1218]! }
- public var OldChannels_NoticeUpgradeText: String { return self._s[1222]! }
- public var Conversation_Call: String { return self._s[1224]! }
- public var Watch_MessageView_Title: String { return self._s[1225]! }
+ public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[1221]! }
+ public var Conversation_Owner: String { return self._s[1223]! }
+ public var Settings_FAQ_Intro: String { return self._s[1224]! }
+ public var PhotoEditor_QualityLow: String { return self._s[1226]! }
+ public var Widget_GalleryTitle: String { return self._s[1227]! }
+ public var Call_End: String { return self._s[1228]! }
+ public var StickerPacksSettings_FeaturedPacks: String { return self._s[1230]! }
+ public var Privacy_ContactsSyncHelp: String { return self._s[1231]! }
+ public var OldChannels_NoticeUpgradeText: String { return self._s[1235]! }
+ public var Conversation_Call: String { return self._s[1237]! }
+ public var Watch_MessageView_Title: String { return self._s[1238]! }
public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1226]!, self._r[1226]!, [_0])
+ return formatWithArgumentRanges(self._s[1239]!, self._r[1239]!, [_0])
}
- public var Passport_PasswordCompleteSetup: String { return self._s[1227]! }
+ public var Passport_PasswordCompleteSetup: String { return self._s[1240]! }
public func Notification_ChangedGroupVideo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1228]!, self._r[1228]!, [_0])
+ return formatWithArgumentRanges(self._s[1241]!, self._r[1241]!, [_0])
}
public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1230]!, self._r[1230]!, [_0])
+ return formatWithArgumentRanges(self._s[1243]!, self._r[1243]!, [_0])
}
- public var Map_Location: String { return self._s[1231]! }
- public var Watch_MessageView_ViewOnPhone: String { return self._s[1232]! }
- public var Login_CountryCode: String { return self._s[1233]! }
- public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[1235]! }
- public var ChatState_ConnectingToProxy: String { return self._s[1236]! }
- public var Login_CallRequestState3: String { return self._s[1237]! }
- public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[1239]! }
- public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1240]! }
- public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[1243]! }
- public var Call_StatusEnded: String { return self._s[1244]! }
- public var MusicPlayer_VoiceNote: String { return self._s[1247]! }
+ public var Map_Location: String { return self._s[1244]! }
+ public var Watch_MessageView_ViewOnPhone: String { return self._s[1245]! }
+ public var Login_CountryCode: String { return self._s[1246]! }
+ public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[1248]! }
+ public var ChatState_ConnectingToProxy: String { return self._s[1249]! }
+ public var Login_CallRequestState3: String { return self._s[1250]! }
+ public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[1252]! }
+ public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1253]! }
+ public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[1256]! }
+ public var Call_StatusEnded: String { return self._s[1257]! }
+ public var MusicPlayer_VoiceNote: String { return self._s[1260]! }
public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1248]!, self._r[1248]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1261]!, self._r[1261]!, [_1, _2])
}
- public var VoiceOver_MessageContextShare: String { return self._s[1249]! }
- public var ProfilePhoto_SearchWeb: String { return self._s[1250]! }
- public var EditProfile_Title: String { return self._s[1251]! }
+ public var VoiceOver_MessageContextShare: String { return self._s[1262]! }
+ public var ProfilePhoto_SearchWeb: String { return self._s[1263]! }
+ public var EditProfile_Title: String { return self._s[1264]! }
public func Notification_PinnedQuizMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1252]!, self._r[1252]!, [_0])
+ return formatWithArgumentRanges(self._s[1265]!, self._r[1265]!, [_0])
}
- public var VoiceChat_Unmute: String { return self._s[1253]! }
- public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[1254]! }
- public var NetworkUsageSettings_ResetStats: String { return self._s[1256]! }
- public var NetworkUsageSettings_GeneralDataSection: String { return self._s[1257]! }
- public var StickerPackActionInfo_AddedTitle: String { return self._s[1258]! }
- public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[1259]! }
+ public var VoiceChat_Unmute: String { return self._s[1266]! }
+ public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[1267]! }
+ public var NetworkUsageSettings_ResetStats: String { return self._s[1269]! }
+ public var NetworkUsageSettings_GeneralDataSection: String { return self._s[1270]! }
+ public var StickerPackActionInfo_AddedTitle: String { return self._s[1271]! }
+ public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[1272]! }
public func Call_ParticipantVideoVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1260]!, self._r[1260]!, [_0])
+ return formatWithArgumentRanges(self._s[1273]!, self._r[1273]!, [_0])
}
- public var Location_ProximityNotification_Title: String { return self._s[1261]! }
- public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[1262]! }
- public var Passport_Identity_LatinNameHelp: String { return self._s[1265]! }
- public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[1266]! }
- public var Stats_GroupMembersTitle: String { return self._s[1267]! }
- public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[1268]! }
- public var Contacts_PermissionsSuppressWarningText: String { return self._s[1269]! }
- public var OpenFile_PotentiallyDangerousContentAlert: String { return self._s[1270]! }
- public var Settings_SetUsername: String { return self._s[1271]! }
- public var GroupInfo_ActionRestrict: String { return self._s[1272]! }
- public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1273]! }
+ public var Location_ProximityNotification_Title: String { return self._s[1274]! }
+ public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[1275]! }
+ public var Passport_Identity_LatinNameHelp: String { return self._s[1278]! }
+ public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[1279]! }
+ public var Stats_GroupMembersTitle: String { return self._s[1280]! }
+ public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[1281]! }
+ public var Contacts_PermissionsSuppressWarningText: String { return self._s[1282]! }
+ public var OpenFile_PotentiallyDangerousContentAlert: String { return self._s[1283]! }
+ public var Settings_SetUsername: String { return self._s[1284]! }
+ public var GroupInfo_ActionRestrict: String { return self._s[1285]! }
+ public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1286]! }
public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1274]!, self._r[1274]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[1287]!, self._r[1287]!, [_1, _2, _3])
}
- public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1275]! }
- public var Notification_Exceptions_AlwaysOff: String { return self._s[1276]! }
- public var Conversation_ContextMenuDelete: String { return self._s[1277]! }
- public var Privacy_Calls_WhoCanCallMe: String { return self._s[1278]! }
- public var ChatList_PsaAlert_covid: String { return self._s[1281]! }
- public var DialogList_Pin: String { return self._s[1282]! }
- public var PrivacySettings_SecurityTitle: String { return self._s[1283]! }
- public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[1284]! }
- public var PeopleNearby_Groups: String { return self._s[1285]! }
- public var Message_File: String { return self._s[1286]! }
- public var Calls_NoCallsPlaceholder: String { return self._s[1287]! }
- public var ChatList_GenericPsaLabel: String { return self._s[1289]! }
- public var UserInfo_LastNamePlaceholder: String { return self._s[1290]! }
- public var IntentsSettings_Reset: String { return self._s[1292]! }
- public var Call_ConnectionErrorTitle: String { return self._s[1293]! }
- public var PhotoEditor_SaturationTool: String { return self._s[1294]! }
- public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[1295]! }
- public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1296]! }
- public var Conversation_SearchNoResults: String { return self._s[1297]! }
- public var Channel_DiscussionGroup_PrivateChannel: String { return self._s[1298]! }
- public var Map_OpenInWaze: String { return self._s[1299]! }
- public var WallpaperPreview_Title: String { return self._s[1300]! }
+ public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1288]! }
+ public var Notification_Exceptions_AlwaysOff: String { return self._s[1289]! }
+ public var Conversation_ContextMenuDelete: String { return self._s[1290]! }
+ public var Privacy_Calls_WhoCanCallMe: String { return self._s[1291]! }
+ public var ChatList_PsaAlert_covid: String { return self._s[1294]! }
+ public var DialogList_Pin: String { return self._s[1295]! }
+ public var PrivacySettings_SecurityTitle: String { return self._s[1296]! }
+ public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[1297]! }
+ public var PeopleNearby_Groups: String { return self._s[1298]! }
+ public var Message_File: String { return self._s[1299]! }
+ public var Calls_NoCallsPlaceholder: String { return self._s[1300]! }
+ public var ChatList_GenericPsaLabel: String { return self._s[1302]! }
+ public var UserInfo_LastNamePlaceholder: String { return self._s[1303]! }
+ public var IntentsSettings_Reset: String { return self._s[1305]! }
+ public var Call_ConnectionErrorTitle: String { return self._s[1306]! }
+ public var PhotoEditor_SaturationTool: String { return self._s[1307]! }
+ public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[1308]! }
+ public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1309]! }
+ public var Conversation_SearchNoResults: String { return self._s[1310]! }
+ public var Channel_DiscussionGroup_PrivateChannel: String { return self._s[1311]! }
+ public var Map_OpenInWaze: String { return self._s[1312]! }
+ public var InviteLink_PeopleJoinedNone: String { return self._s[1313]! }
+ public var WallpaperPreview_Title: String { return self._s[1314]! }
public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1302]!, self._r[1302]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1316]!, self._r[1316]!, [_1, _2])
}
- public var AuthSessions_AddDeviceIntro_Title: String { return self._s[1303]! }
- public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[1304]! }
- public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[1305]! }
- public var Notifications_PermissionsUnreachableTitle: String { return self._s[1307]! }
- public var Stats_Total: String { return self._s[1310]! }
- public var Stats_GroupMessages: String { return self._s[1311]! }
- public var TwoFactorSetup_Email_SkipAction: String { return self._s[1312]! }
- public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[1313]! }
- public var Passport_Identity_Translation: String { return self._s[1314]! }
- public var Notifications_TextTone: String { return self._s[1317]! }
- public var Settings_RemoveConfirmation: String { return self._s[1319]! }
- public var ScheduledMessages_Delete: String { return self._s[1320]! }
- public var Channel_AdminLog_BanEmbedLinks: String { return self._s[1321]! }
- public var Passport_PasswordNext: String { return self._s[1322]! }
+ public var AuthSessions_AddDeviceIntro_Title: String { return self._s[1317]! }
+ public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[1318]! }
+ public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[1319]! }
+ public var Notifications_PermissionsUnreachableTitle: String { return self._s[1321]! }
+ public var Stats_Total: String { return self._s[1324]! }
+ public var Stats_GroupMessages: String { return self._s[1325]! }
+ public var TwoFactorSetup_Email_SkipAction: String { return self._s[1326]! }
+ public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[1327]! }
+ public var Passport_Identity_Translation: String { return self._s[1328]! }
+ public var Notifications_TextTone: String { return self._s[1331]! }
+ public var Settings_RemoveConfirmation: String { return self._s[1333]! }
+ public var ScheduledMessages_Delete: String { return self._s[1334]! }
+ public var Channel_AdminLog_BanEmbedLinks: String { return self._s[1335]! }
+ public var Passport_PasswordNext: String { return self._s[1336]! }
public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1323]!, self._r[1323]!, [_1])
+ return formatWithArgumentRanges(self._s[1337]!, self._r[1337]!, [_1])
}
- public var Passport_Address_EditBankStatement: String { return self._s[1324]! }
- public var PhotoEditor_ShadowsTool: String { return self._s[1325]! }
- public var Notification_VideoCallMissed: String { return self._s[1326]! }
- public var AccessDenied_CameraDisabled: String { return self._s[1327]! }
- public var AuthSessions_AddDevice_ScanInfo: String { return self._s[1328]! }
- public var Notifications_ExceptionsMuted: String { return self._s[1329]! }
- public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[1330]! }
- public var Channel_BlackList_Title: String { return self._s[1331]! }
- public var PasscodeSettings_4DigitCode: String { return self._s[1332]! }
- public var NotificationsSound_Bamboo: String { return self._s[1333]! }
- public var PrivacySettings_LastSeenContacts: String { return self._s[1334]! }
- public var Passport_Address_TypeUtilityBill: String { return self._s[1335]! }
- public var Passport_Address_CountryPlaceholder: String { return self._s[1336]! }
- public var GroupPermission_SectionTitle: String { return self._s[1337]! }
+ public var Passport_Address_EditBankStatement: String { return self._s[1338]! }
+ public var PhotoEditor_ShadowsTool: String { return self._s[1339]! }
+ public var Notification_VideoCallMissed: String { return self._s[1340]! }
+ public var AccessDenied_CameraDisabled: String { return self._s[1341]! }
+ public var AuthSessions_AddDevice_ScanInfo: String { return self._s[1342]! }
+ public var Notifications_ExceptionsMuted: String { return self._s[1343]! }
+ public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[1344]! }
+ public var Channel_BlackList_Title: String { return self._s[1345]! }
+ public var PasscodeSettings_4DigitCode: String { return self._s[1346]! }
+ public var NotificationsSound_Bamboo: String { return self._s[1347]! }
+ public var PrivacySettings_LastSeenContacts: String { return self._s[1348]! }
+ public var Passport_Address_TypeUtilityBill: String { return self._s[1349]! }
+ public var Passport_Address_CountryPlaceholder: String { return self._s[1350]! }
+ public var GroupPermission_SectionTitle: String { return self._s[1351]! }
+ public var InviteLink_ContextRevoke: String { return self._s[1352]! }
public func Notification_InvitedMultiple(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1338]!, self._r[1338]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[1353]!, self._r[1353]!, [_0, _1])
}
- public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1339]! }
- public var Channel_LeaveChannel: String { return self._s[1340]! }
- public var Watch_Notification_Joined: String { return self._s[1341]! }
- public var PeerInfo_ButtonMore: String { return self._s[1342]! }
- public var Passport_FieldEmailHelp: String { return self._s[1343]! }
- public var ChatList_Context_Pin: String { return self._s[1344]! }
+ public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1354]! }
+ public var Channel_LeaveChannel: String { return self._s[1355]! }
+ public var Watch_Notification_Joined: String { return self._s[1356]! }
+ public var PeerInfo_ButtonMore: String { return self._s[1357]! }
+ public var Passport_FieldEmailHelp: String { return self._s[1358]! }
+ public var ChatList_Context_Pin: String { return self._s[1359]! }
public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1345]!, self._r[1345]!, [_0])
+ return formatWithArgumentRanges(self._s[1360]!, self._r[1360]!, [_0])
}
- public var Group_Location_CreateInThisPlace: String { return self._s[1346]! }
- public var PhotoEditor_QualityVeryHigh: String { return self._s[1347]! }
- public var Tour_Title5: String { return self._s[1348]! }
+ public var Group_Location_CreateInThisPlace: String { return self._s[1361]! }
+ public var PhotoEditor_QualityVeryHigh: String { return self._s[1362]! }
+ public var Tour_Title5: String { return self._s[1363]! }
public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1349]!, self._r[1349]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1364]!, self._r[1364]!, [_1, _2])
}
- public var Passport_Language_en: String { return self._s[1350]! }
- public var Checkout_Name: String { return self._s[1351]! }
+ public var Passport_Language_en: String { return self._s[1365]! }
+ public var Checkout_Name: String { return self._s[1366]! }
public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1352]!, self._r[1352]!, [_0])
+ return formatWithArgumentRanges(self._s[1367]!, self._r[1367]!, [_0])
}
- public var PhotoEditor_EnhanceTool: String { return self._s[1353]! }
+ public var PhotoEditor_EnhanceTool: String { return self._s[1368]! }
public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1354]!, self._r[1354]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_1, _2])
}
public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1355]!, self._r[1355]!, [_0])
+ return formatWithArgumentRanges(self._s[1370]!, self._r[1370]!, [_0])
}
- public var Group_ErrorSendRestrictedMedia: String { return self._s[1356]! }
+ public var Group_ErrorSendRestrictedMedia: String { return self._s[1371]! }
public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_0])
+ return formatWithArgumentRanges(self._s[1372]!, self._r[1372]!, [_0])
}
- public var Login_UnknownError: String { return self._s[1358]! }
- public var Passport_Identity_TypeDriversLicense: String { return self._s[1361]! }
- public var ChatList_AutoarchiveSuggestion_Title: String { return self._s[1362]! }
- public var Watch_PhotoView_Title: String { return self._s[1363]! }
- public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[1364]! }
- public var Checkout_TotalAmount: String { return self._s[1365]! }
- public var ChatList_RemoveFolderAction: String { return self._s[1366]! }
- public var GroupInfo_SetGroupPhoto: String { return self._s[1367]! }
- public var Watch_AppName: String { return self._s[1368]! }
+ public var Login_UnknownError: String { return self._s[1373]! }
+ public var Passport_Identity_TypeDriversLicense: String { return self._s[1376]! }
+ public var ChatList_AutoarchiveSuggestion_Title: String { return self._s[1377]! }
+ public var Watch_PhotoView_Title: String { return self._s[1378]! }
+ public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[1379]! }
+ public var Checkout_TotalAmount: String { return self._s[1380]! }
+ public var ChatList_RemoveFolderAction: String { return self._s[1381]! }
+ public var GroupInfo_SetGroupPhoto: String { return self._s[1382]! }
+ public var Watch_AppName: String { return self._s[1383]! }
public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_1])
+ return formatWithArgumentRanges(self._s[1384]!, self._r[1384]!, [_1])
}
- public var Channel_Username_CheckingUsername: String { return self._s[1370]! }
- public var ContactList_Context_Call: String { return self._s[1371]! }
- public var ChatList_ReorderTabs: String { return self._s[1372]! }
- public var Watch_ChatList_Compose: String { return self._s[1373]! }
+ public var Channel_Username_CheckingUsername: String { return self._s[1385]! }
+ public var ContactList_Context_Call: String { return self._s[1386]! }
+ public var ChatList_ReorderTabs: String { return self._s[1387]! }
+ public var Watch_ChatList_Compose: String { return self._s[1388]! }
public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1374]!, self._r[1374]!, [_0])
- }
- public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[1375]! }
- public var ArchivedChats_IntroTitle1: String { return self._s[1376]! }
- public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1377]!, self._r[1377]!, [_1])
- }
- public var Call_StatusRequesting: String { return self._s[1379]! }
- public var Checkout_TotalPaidAmount: String { return self._s[1380]! }
- public var Weekday_Friday: String { return self._s[1382]! }
- public var CreateGroup_ChannelsTooMuch: String { return self._s[1383]! }
- public var Watch_ChatList_NoConversationsText: String { return self._s[1384]! }
- public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1385]!, self._r[1385]!, [_0])
- }
- public var SecretVideo_Title: String { return self._s[1386]! }
- public func Notification_PinnedStickerMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1389]!, self._r[1389]!, [_0])
}
- public var Undo_Undo: String { return self._s[1390]! }
- public var Watch_Microphone_Access: String { return self._s[1391]! }
+ public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[1390]! }
+ public var ArchivedChats_IntroTitle1: String { return self._s[1391]! }
+ public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1392]!, self._r[1392]!, [_1])
+ }
+ public var Call_StatusRequesting: String { return self._s[1394]! }
+ public var Checkout_TotalPaidAmount: String { return self._s[1395]! }
+ public var Weekday_Friday: String { return self._s[1397]! }
+ public var CreateGroup_ChannelsTooMuch: String { return self._s[1398]! }
+ public var Watch_ChatList_NoConversationsText: String { return self._s[1399]! }
+ public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1400]!, self._r[1400]!, [_0])
+ }
+ public var SecretVideo_Title: String { return self._s[1401]! }
+ public func Notification_PinnedStickerMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1404]!, self._r[1404]!, [_0])
+ }
+ public var Undo_Undo: String { return self._s[1405]! }
+ public var Watch_Microphone_Access: String { return self._s[1406]! }
public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1392]!, self._r[1392]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_1, _2])
}
public func ChatList_Search_NoResultsQueryDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1393]!, self._r[1393]!, [_0])
+ return formatWithArgumentRanges(self._s[1408]!, self._r[1408]!, [_0])
}
- public var Checkout_NewCard_PostcodeTitle: String { return self._s[1395]! }
- public var TwoFactorSetup_Intro_Action: String { return self._s[1396]! }
- public var Passport_Language_ne: String { return self._s[1397]! }
- public var TwoStepAuth_EmailHelp: String { return self._s[1399]! }
- public var Profile_MessageLifetime2s: String { return self._s[1400]! }
+ public var Checkout_NewCard_PostcodeTitle: String { return self._s[1410]! }
+ public var TwoFactorSetup_Intro_Action: String { return self._s[1411]! }
+ public var Passport_Language_ne: String { return self._s[1412]! }
+ public var TwoStepAuth_EmailHelp: String { return self._s[1414]! }
+ public var Profile_MessageLifetime2s: String { return self._s[1415]! }
public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1401]!, self._r[1401]!, ["\(_1)"])
+ return formatWithArgumentRanges(self._s[1416]!, self._r[1416]!, ["\(_1)"])
}
public func Items_NOfM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1417]!, self._r[1417]!, [_1, _2])
}
- public var Media_LimitedAccessText: String { return self._s[1403]! }
+ public var Media_LimitedAccessText: String { return self._s[1418]! }
public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1404]!, self._r[1404]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1419]!, self._r[1419]!, [_1, _2])
}
- public var GroupPermission_NoPinMessages: String { return self._s[1405]! }
+ public var GroupPermission_NoPinMessages: String { return self._s[1420]! }
public func Notification_VoiceChatStarted(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1406]!, self._r[1406]!, [_1])
+ return formatWithArgumentRanges(self._s[1421]!, self._r[1421]!, [_1])
}
public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_0])
+ return formatWithArgumentRanges(self._s[1422]!, self._r[1422]!, [_0])
}
- public var FastTwoStepSetup_HintHelp: String { return self._s[1408]! }
- public var WallpaperSearch_ColorRed: String { return self._s[1409]! }
- public var Watch_ConnectionDescription: String { return self._s[1410]! }
- public var Notification_Exceptions_AddException: String { return self._s[1411]! }
- public var LocalGroup_IrrelevantWarning: String { return self._s[1412]! }
- public var VoiceOver_MessageContextDelete: String { return self._s[1413]! }
- public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1414]! }
- public var Passport_PasswordPlaceholder: String { return self._s[1415]! }
- public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[1416]! }
- public var Stats_MessageInteractionsTitle: String { return self._s[1417]! }
- public var Appearance_ThemeCarouselClassic: String { return self._s[1418]! }
- public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1420]! }
- public var Channel_AdminLog_PinMessages: String { return self._s[1421]! }
- public var Passport_Address_AddRentalAgreement: String { return self._s[1422]! }
- public var Watch_Message_Game: String { return self._s[1423]! }
- public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1424]! }
- public var PrivacyPolicy_DeclineLastWarning: String { return self._s[1425]! }
- public var EditTheme_FileReadError: String { return self._s[1426]! }
- public var Group_ErrorAddBlocked: String { return self._s[1427]! }
- public var CallSettings_UseLessDataLongDescription: String { return self._s[1428]! }
+ public var FastTwoStepSetup_HintHelp: String { return self._s[1423]! }
+ public var WallpaperSearch_ColorRed: String { return self._s[1424]! }
+ public var Watch_ConnectionDescription: String { return self._s[1425]! }
+ public var Notification_Exceptions_AddException: String { return self._s[1426]! }
+ public var LocalGroup_IrrelevantWarning: String { return self._s[1427]! }
+ public var VoiceOver_MessageContextDelete: String { return self._s[1428]! }
+ public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1429]! }
+ public var Passport_PasswordPlaceholder: String { return self._s[1430]! }
+ public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[1431]! }
+ public var Stats_MessageInteractionsTitle: String { return self._s[1432]! }
+ public var Appearance_ThemeCarouselClassic: String { return self._s[1433]! }
+ public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1435]! }
+ public var Channel_AdminLog_PinMessages: String { return self._s[1436]! }
+ public var Passport_Address_AddRentalAgreement: String { return self._s[1437]! }
+ public var Watch_Message_Game: String { return self._s[1438]! }
+ public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1439]! }
+ public var PrivacyPolicy_DeclineLastWarning: String { return self._s[1440]! }
+ public var EditTheme_FileReadError: String { return self._s[1441]! }
+ public var Group_ErrorAddBlocked: String { return self._s[1442]! }
+ public var CallSettings_UseLessDataLongDescription: String { return self._s[1443]! }
public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1430]!, self._r[1430]!, [_1])
+ return formatWithArgumentRanges(self._s[1445]!, self._r[1445]!, [_1])
}
public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1431]!, self._r[1431]!, [_0])
+ return formatWithArgumentRanges(self._s[1446]!, self._r[1446]!, [_0])
}
- public var CheckoutInfo_ShippingInfoAddress2Placeholder: String { return self._s[1432]! }
- public var TwoFactorSetup_EmailVerification_Action: String { return self._s[1433]! }
+ public var CheckoutInfo_ShippingInfoAddress2Placeholder: String { return self._s[1447]! }
+ public var TwoFactorSetup_EmailVerification_Action: String { return self._s[1448]! }
public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1434]!, self._r[1434]!, [_0])
+ return formatWithArgumentRanges(self._s[1449]!, self._r[1449]!, [_0])
}
- public var ConversationProfile_ErrorCreatingConversation: String { return self._s[1435]! }
- public var Bot_GroupStatusReadsHistory: String { return self._s[1436]! }
- public var PhotoEditor_CurvesRed: String { return self._s[1437]! }
- public var InstantPage_TapToOpenLink: String { return self._s[1438]! }
- public var FastTwoStepSetup_PasswordHelp: String { return self._s[1439]! }
- public var Conversation_DiscussionNotStarted: String { return self._s[1440]! }
- public var Notification_CallMissedShort: String { return self._s[1441]! }
+ public var ConversationProfile_ErrorCreatingConversation: String { return self._s[1450]! }
+ public var Bot_GroupStatusReadsHistory: String { return self._s[1451]! }
+ public var PhotoEditor_CurvesRed: String { return self._s[1452]! }
+ public var InstantPage_TapToOpenLink: String { return self._s[1453]! }
+ public var InviteLink_PeopleJoinedShortNoneExpired: String { return self._s[1454]! }
+ public var FastTwoStepSetup_PasswordHelp: String { return self._s[1455]! }
+ public var Conversation_DiscussionNotStarted: String { return self._s[1456]! }
+ public var Notification_CallMissedShort: String { return self._s[1457]! }
public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1442]!, self._r[1442]!, [_0])
+ return formatWithArgumentRanges(self._s[1458]!, self._r[1458]!, [_0])
}
- public var Conversation_DeleteMessagesForEveryone: String { return self._s[1443]! }
- public var Permissions_SiriTitle_v0: String { return self._s[1444]! }
- public var GroupInfo_AddUserLeftError: String { return self._s[1445]! }
- public var Conversation_SendMessage_SendSilently: String { return self._s[1446]! }
- public var Paint_Duplicate: String { return self._s[1447]! }
- public var AttachmentMenu_WebSearch: String { return self._s[1448]! }
- public var Bot_Stop: String { return self._s[1450]! }
- public var Conversation_PrivateChannelTimeLimitedAlertTitle: String { return self._s[1451]! }
- public var ReportGroupLocation_Report: String { return self._s[1452]! }
- public var Compose_Create: String { return self._s[1453]! }
- public var Stats_GroupViewers: String { return self._s[1454]! }
- public var AutoDownloadSettings_Channels: String { return self._s[1455]! }
- public var PhotoEditor_QualityHigh: String { return self._s[1456]! }
- public var VoiceChat_Leave: String { return self._s[1457]! }
- public var Call_Speaker: String { return self._s[1458]! }
+ public var Conversation_DeleteMessagesForEveryone: String { return self._s[1459]! }
+ public var Permissions_SiriTitle_v0: String { return self._s[1460]! }
+ public var GroupInfo_AddUserLeftError: String { return self._s[1461]! }
+ public var Conversation_SendMessage_SendSilently: String { return self._s[1462]! }
+ public var Paint_Duplicate: String { return self._s[1463]! }
+ public var AttachmentMenu_WebSearch: String { return self._s[1464]! }
+ public var Bot_Stop: String { return self._s[1466]! }
+ public var Conversation_PrivateChannelTimeLimitedAlertTitle: String { return self._s[1467]! }
+ public var ReportGroupLocation_Report: String { return self._s[1468]! }
+ public var Compose_Create: String { return self._s[1469]! }
+ public var Stats_GroupViewers: String { return self._s[1470]! }
+ public var AutoDownloadSettings_Channels: String { return self._s[1471]! }
+ public var PhotoEditor_QualityHigh: String { return self._s[1472]! }
+ public var VoiceChat_Leave: String { return self._s[1473]! }
+ public var Call_Speaker: String { return self._s[1474]! }
public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1459]!, self._r[1459]!, [_0])
+ return formatWithArgumentRanges(self._s[1475]!, self._r[1475]!, [_0])
}
- public var Conversation_CloudStorage_ChatStatus: String { return self._s[1460]! }
- public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1461]! }
- public var ChatList_Context_AddToFolder: String { return self._s[1462]! }
- public var Conversation_Unblock: String { return self._s[1463]! }
- public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[1464]! }
+ public var Conversation_CloudStorage_ChatStatus: String { return self._s[1476]! }
+ public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1477]! }
+ public var ChatList_Context_AddToFolder: String { return self._s[1478]! }
+ public var InviteLink_QRCode_Info: String { return self._s[1479]! }
+ public var Conversation_Unblock: String { return self._s[1480]! }
+ public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[1481]! }
public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1465]!, self._r[1465]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[1482]!, self._r[1482]!, [_1, _2, _3])
}
- public var Conversation_ContextMenuReply: String { return self._s[1466]! }
- public var Contacts_SearchLabel: String { return self._s[1467]! }
- public var Forward_ErrorPublicQuizDisabledInChannels: String { return self._s[1468]! }
- public var Stats_GroupMessagesTitle: String { return self._s[1470]! }
- public var Notification_CallCanceled: String { return self._s[1471]! }
- public var VoiceOver_Chat_Selected: String { return self._s[1472]! }
- public var NotificationsSound_Tremolo: String { return self._s[1474]! }
- public var ChatList_Search_NoResultsDescription: String { return self._s[1475]! }
- public var AccessDenied_PhotosAndVideos: String { return self._s[1476]! }
- public var LogoutOptions_ClearCacheText: String { return self._s[1477]! }
- public var ChatListFolder_NameUnread: String { return self._s[1479]! }
- public var PeerInfo_ButtonMessage: String { return self._s[1481]! }
- public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[1482]! }
- public var BlockedUsers_SelectUserTitle: String { return self._s[1483]! }
- public var ChatSettings_Other: String { return self._s[1484]! }
- public var UserInfo_NotificationsEnabled: String { return self._s[1485]! }
- public var CreatePoll_OptionsHeader: String { return self._s[1486]! }
- public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1489]! }
- public var Channel_Moderator_Title: String { return self._s[1490]! }
- public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[1491]! }
- public var WallpaperColors_Title: String { return self._s[1492]! }
- public var PrivacyPolicy_DeclineMessage: String { return self._s[1494]! }
- public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[1495]! }
- public var Your_card_was_declined: String { return self._s[1496]! }
- public var SettingsSearch_FAQ: String { return self._s[1498]! }
- public var EditTheme_Expand_Preview_IncomingReplyName: String { return self._s[1499]! }
- public var Conversation_ReportSpamConfirmation: String { return self._s[1500]! }
- public var OwnershipTransfer_SecurityCheck: String { return self._s[1502]! }
- public var PrivacySettings_DataSettingsHelp: String { return self._s[1503]! }
- public var Settings_About_Help: String { return self._s[1504]! }
+ public var Conversation_ContextMenuReply: String { return self._s[1483]! }
+ public var Contacts_SearchLabel: String { return self._s[1484]! }
+ public var Forward_ErrorPublicQuizDisabledInChannels: String { return self._s[1485]! }
+ public var Stats_GroupMessagesTitle: String { return self._s[1487]! }
+ public var Notification_CallCanceled: String { return self._s[1488]! }
+ public var VoiceOver_Chat_Selected: String { return self._s[1489]! }
+ public var NotificationsSound_Tremolo: String { return self._s[1491]! }
+ public var ChatList_Search_NoResultsDescription: String { return self._s[1492]! }
+ public var AccessDenied_PhotosAndVideos: String { return self._s[1493]! }
+ public var LogoutOptions_ClearCacheText: String { return self._s[1494]! }
+ public var ChatListFolder_NameUnread: String { return self._s[1496]! }
+ public var PeerInfo_ButtonMessage: String { return self._s[1498]! }
+ public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[1499]! }
+ public var BlockedUsers_SelectUserTitle: String { return self._s[1500]! }
+ public var ChatSettings_Other: String { return self._s[1501]! }
+ public var UserInfo_NotificationsEnabled: String { return self._s[1502]! }
+ public var CreatePoll_OptionsHeader: String { return self._s[1503]! }
+ public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1506]! }
+ public var Channel_Moderator_Title: String { return self._s[1507]! }
+ public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[1508]! }
+ public var WallpaperColors_Title: String { return self._s[1509]! }
+ public var InviteLink_InviteLink: String { return self._s[1511]! }
+ public var PrivacyPolicy_DeclineMessage: String { return self._s[1512]! }
+ public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[1513]! }
+ public var Your_card_was_declined: String { return self._s[1514]! }
+ public var SettingsSearch_FAQ: String { return self._s[1516]! }
+ public var EditTheme_Expand_Preview_IncomingReplyName: String { return self._s[1517]! }
+ public var Conversation_ReportSpamConfirmation: String { return self._s[1518]! }
+ public var OwnershipTransfer_SecurityCheck: String { return self._s[1520]! }
+ public var PrivacySettings_DataSettingsHelp: String { return self._s[1521]! }
+ public var Settings_About_Help: String { return self._s[1522]! }
public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0])
+ return formatWithArgumentRanges(self._s[1523]!, self._r[1523]!, [_0])
}
- public var Settings_Proxy: String { return self._s[1506]! }
- public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1507]! }
- public var Passport_Identity_TypePassportUploadScan: String { return self._s[1509]! }
- public var NotificationsSound_Bell: String { return self._s[1510]! }
- public var PrivacySettings_Title: String { return self._s[1512]! }
- public var PrivacySettings_DataSettings: String { return self._s[1513]! }
- public var ConversationMedia_Title: String { return self._s[1514]! }
+ public var Settings_Proxy: String { return self._s[1524]! }
+ public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1525]! }
+ public var Passport_Identity_TypePassportUploadScan: String { return self._s[1527]! }
+ public var NotificationsSound_Bell: String { return self._s[1528]! }
+ public var PrivacySettings_Title: String { return self._s[1530]! }
+ public var PrivacySettings_DataSettings: String { return self._s[1531]! }
+ public var ConversationMedia_Title: String { return self._s[1532]! }
public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1515]!, self._r[1515]!, [_0])
+ return formatWithArgumentRanges(self._s[1533]!, self._r[1533]!, [_0])
}
- public var PrivacySettings_BlockedPeersEmpty: String { return self._s[1516]! }
- public var ReportPeer_ReasonPornography: String { return self._s[1518]! }
- public var Privacy_Calls: String { return self._s[1519]! }
- public var TwoFactorSetup_Email_Text: String { return self._s[1520]! }
- public var Conversation_EncryptedDescriptionTitle: String { return self._s[1521]! }
+ public var PrivacySettings_BlockedPeersEmpty: String { return self._s[1534]! }
+ public var ReportPeer_ReasonPornography: String { return self._s[1536]! }
+ public var Privacy_Calls: String { return self._s[1537]! }
+ public var TwoFactorSetup_Email_Text: String { return self._s[1538]! }
+ public var Conversation_EncryptedDescriptionTitle: String { return self._s[1539]! }
public func VoiceOver_Chat_MusicTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1522]!, self._r[1522]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1540]!, self._r[1540]!, [_1, _2])
}
- public var Passport_Identity_FrontSideHelp: String { return self._s[1523]! }
- public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1525]! }
- public var ContactList_Context_VideoCall: String { return self._s[1526]! }
- public var Settings_SaveIncomingPhotos: String { return self._s[1527]! }
- public var Passport_Identity_MiddleName: String { return self._s[1528]! }
- public var MessagePoll_QuizNoUsers: String { return self._s[1529]! }
+ public var Passport_Identity_FrontSideHelp: String { return self._s[1541]! }
+ public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1543]! }
+ public var ContactList_Context_VideoCall: String { return self._s[1544]! }
+ public var Settings_SaveIncomingPhotos: String { return self._s[1545]! }
+ public var Passport_Identity_MiddleName: String { return self._s[1546]! }
+ public var MessagePoll_QuizNoUsers: String { return self._s[1547]! }
public func Channel_AdminLog_MutedParticipant(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1530]!, self._r[1530]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1548]!, self._r[1548]!, [_1, _2])
}
- public var OldChannels_ChannelFormat: String { return self._s[1531]! }
- public var Watch_Message_Call: String { return self._s[1532]! }
- public var Wallpaper_Title: String { return self._s[1533]! }
- public var PasscodeSettings_TurnPasscodeOff: String { return self._s[1534]! }
- public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1535]! }
- public var ReportGroupLocation_Text: String { return self._s[1536]! }
- public var InviteText_URL: String { return self._s[1537]! }
- public var ClearCache_StorageServiceFiles: String { return self._s[1538]! }
- public var MessageTimer_Custom: String { return self._s[1539]! }
- public var Message_PinnedLocationMessage: String { return self._s[1540]! }
+ public var OldChannels_ChannelFormat: String { return self._s[1549]! }
+ public var Watch_Message_Call: String { return self._s[1550]! }
+ public var Wallpaper_Title: String { return self._s[1551]! }
+ public var PasscodeSettings_TurnPasscodeOff: String { return self._s[1552]! }
+ public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1553]! }
+ public var ReportGroupLocation_Text: String { return self._s[1554]! }
+ public var InviteText_URL: String { return self._s[1555]! }
+ public var ClearCache_StorageServiceFiles: String { return self._s[1556]! }
+ public var MessageTimer_Custom: String { return self._s[1557]! }
+ public var Message_PinnedLocationMessage: String { return self._s[1558]! }
public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1541]!, self._r[1541]!, [_0])
+ return formatWithArgumentRanges(self._s[1559]!, self._r[1559]!, [_0])
}
- public var EditTheme_UploadNewTheme: String { return self._s[1542]! }
+ public var EditTheme_UploadNewTheme: String { return self._s[1560]! }
public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1545]!, self._r[1545]!, [_0])
+ return formatWithArgumentRanges(self._s[1563]!, self._r[1563]!, [_0])
}
- public var Login_CodeSentCall: String { return self._s[1547]! }
- public var Conversation_Report: String { return self._s[1548]! }
- public var NotificationSettings_ContactJoined: String { return self._s[1549]! }
+ public var Login_CodeSentCall: String { return self._s[1565]! }
+ public var Conversation_Report: String { return self._s[1566]! }
+ public var NotificationSettings_ContactJoined: String { return self._s[1567]! }
public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1550]!, self._r[1550]!, [_1])
+ return formatWithArgumentRanges(self._s[1568]!, self._r[1568]!, [_1])
}
- public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[1551]! }
- public var IntentsSettings_SuggestByAll: String { return self._s[1552]! }
- public var StickerPacksSettings_ShowStickersButton: String { return self._s[1553]! }
- public var AuthSessions_Title: String { return self._s[1554]! }
+ public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[1569]! }
+ public var IntentsSettings_SuggestByAll: String { return self._s[1570]! }
+ public var StickerPacksSettings_ShowStickersButton: String { return self._s[1571]! }
+ public var AuthSessions_Title: String { return self._s[1572]! }
public func Notification_VoiceChatEnded(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, [_0])
+ return formatWithArgumentRanges(self._s[1573]!, self._r[1573]!, [_0])
}
- public var Channel_AdminLog_TitleAllEvents: String { return self._s[1556]! }
- public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1557]! }
- public var Passport_Address_AddPassportRegistration: String { return self._s[1561]! }
- public var AutoDownloadSettings_MaxVideoSize: String { return self._s[1562]! }
- public var ExplicitContent_AlertTitle: String { return self._s[1563]! }
- public var Channel_UpdatePhotoItem: String { return self._s[1564]! }
- public var ChatList_AutoarchiveSuggestion_Text: String { return self._s[1566]! }
- public var Channel_DiscussionGroup_LinkGroup: String { return self._s[1567]! }
+ public var Channel_AdminLog_TitleAllEvents: String { return self._s[1574]! }
+ public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1575]! }
+ public var Passport_Address_AddPassportRegistration: String { return self._s[1579]! }
+ public var AutoDownloadSettings_MaxVideoSize: String { return self._s[1580]! }
+ public var ExplicitContent_AlertTitle: String { return self._s[1581]! }
+ public var Channel_UpdatePhotoItem: String { return self._s[1582]! }
+ public var ChatList_AutoarchiveSuggestion_Text: String { return self._s[1584]! }
+ public var Channel_DiscussionGroup_LinkGroup: String { return self._s[1585]! }
public func Call_BatteryLow(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1568]!, self._r[1568]!, [_0])
+ return formatWithArgumentRanges(self._s[1586]!, self._r[1586]!, [_0])
}
- public var Login_HaveNotReceivedCodeInternal: String { return self._s[1569]! }
- public var WallpaperPreview_PatternPaternApply: String { return self._s[1570]! }
- public var Notifications_MessageNotificationsSound: String { return self._s[1571]! }
- public var CommentsGroup_ErrorAccessDenied: String { return self._s[1572]! }
- public var Appearance_AccentColor: String { return self._s[1574]! }
- public var GroupInfo_SharedMedia: String { return self._s[1575]! }
- public var Login_PhonePlaceholder: String { return self._s[1576]! }
- public var Appearance_TextSize_Automatic: String { return self._s[1577]! }
- public var EmptyGroupInfo_Line2: String { return self._s[1578]! }
+ public var Login_HaveNotReceivedCodeInternal: String { return self._s[1587]! }
+ public var WallpaperPreview_PatternPaternApply: String { return self._s[1588]! }
+ public var Notifications_MessageNotificationsSound: String { return self._s[1589]! }
+ public var CommentsGroup_ErrorAccessDenied: String { return self._s[1590]! }
+ public var Appearance_AccentColor: String { return self._s[1592]! }
+ public var GroupInfo_SharedMedia: String { return self._s[1593]! }
+ public var Login_PhonePlaceholder: String { return self._s[1594]! }
+ public var Appearance_TextSize_Automatic: String { return self._s[1595]! }
+ public var EmptyGroupInfo_Line2: String { return self._s[1596]! }
public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1579]!, self._r[1579]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1597]!, self._r[1597]!, [_1, _2])
}
- public var Appearance_AppIconDefaultX: String { return self._s[1581]! }
- public var EditProfile_NameAndPhotoOrVideoHelp: String { return self._s[1582]! }
- public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[1583]! }
- public var Notifications_GroupNotificationsHelp: String { return self._s[1584]! }
+ public var Appearance_AppIconDefaultX: String { return self._s[1599]! }
+ public var EditProfile_NameAndPhotoOrVideoHelp: String { return self._s[1600]! }
+ public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[1601]! }
+ public var Notifications_GroupNotificationsHelp: String { return self._s[1602]! }
public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1585]!, self._r[1585]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1603]!, self._r[1603]!, [_1, _2])
}
- public var ChatList_EmptyChatListEditFilter: String { return self._s[1586]! }
- public var ChatSettings_ConnectionType_UseProxy: String { return self._s[1589]! }
- public var Chat_PinnedMessagesHiddenText: String { return self._s[1590]! }
+ public var ChatList_EmptyChatListEditFilter: String { return self._s[1604]! }
+ public var ChatSettings_ConnectionType_UseProxy: String { return self._s[1607]! }
+ public var Chat_PinnedMessagesHiddenText: String { return self._s[1608]! }
public func Message_PinnedGenericMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1591]!, self._r[1591]!, [_0])
+ return formatWithArgumentRanges(self._s[1609]!, self._r[1609]!, [_0])
}
public func Location_ProximityTip(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1592]!, self._r[1592]!, [_0])
+ return formatWithArgumentRanges(self._s[1610]!, self._r[1610]!, [_0])
}
- public var UserInfo_NotificationsEnable: String { return self._s[1593]! }
- public var Checkout_PayWithTouchId: String { return self._s[1594]! }
- public var SharedMedia_ViewInChat: String { return self._s[1595]! }
+ public var UserInfo_NotificationsEnable: String { return self._s[1611]! }
+ public var Checkout_PayWithTouchId: String { return self._s[1612]! }
+ public var SharedMedia_ViewInChat: String { return self._s[1613]! }
public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1596]!, self._r[1596]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[1614]!, self._r[1614]!, [_0, _1])
}
- public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1597]! }
+ public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1615]! }
public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1598]!, self._r[1598]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1616]!, self._r[1616]!, [_1, _2])
}
public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1600]!, self._r[1600]!, [_0])
+ return formatWithArgumentRanges(self._s[1618]!, self._r[1618]!, [_0])
}
- public var Conversation_PeerNearbyText: String { return self._s[1602]! }
- public var Conversation_StopPollConfirmationTitle: String { return self._s[1603]! }
- public var PhotoEditor_Skip: String { return self._s[1604]! }
- public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[1605]! }
- public var ChatList_EmptyChatList: String { return self._s[1606]! }
- public var Channel_BanUser_Unban: String { return self._s[1607]! }
+ public var Conversation_PeerNearbyText: String { return self._s[1620]! }
+ public var Conversation_StopPollConfirmationTitle: String { return self._s[1621]! }
+ public var PhotoEditor_Skip: String { return self._s[1622]! }
+ public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[1623]! }
+ public var ChatList_EmptyChatList: String { return self._s[1624]! }
+ public var Channel_BanUser_Unban: String { return self._s[1625]! }
public func Message_GenericForwardedPsa(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_0])
+ return formatWithArgumentRanges(self._s[1626]!, self._r[1626]!, [_0])
}
- public var Appearance_TextSize_Apply: String { return self._s[1609]! }
+ public var Appearance_TextSize_Apply: String { return self._s[1627]! }
public func Conversation_MessageViewCommentsFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1610]!, self._r[1610]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1628]!, self._r[1628]!, [_1, _2])
}
- public var Login_InfoFirstNamePlaceholder: String { return self._s[1611]! }
- public var TwoStepAuth_HintPlaceholder: String { return self._s[1612]! }
- public var TwoStepAuth_EmailSkip: String { return self._s[1614]! }
- public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1615]! }
- public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[1616]! }
+ public var Login_InfoFirstNamePlaceholder: String { return self._s[1629]! }
+ public var TwoStepAuth_HintPlaceholder: String { return self._s[1630]! }
+ public var TwoStepAuth_EmailSkip: String { return self._s[1632]! }
+ public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1633]! }
+ public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[1634]! }
public func PUSH_MESSAGE_QUIZ(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1617]!, self._r[1617]!, [_1])
+ return formatWithArgumentRanges(self._s[1635]!, self._r[1635]!, [_1])
}
- public var State_WaitingForNetwork: String { return self._s[1619]! }
- public var AccessDenied_CameraRestricted: String { return self._s[1620]! }
- public var ChatSettings_Appearance: String { return self._s[1621]! }
- public var ScheduledMessages_BotActionUnavailable: String { return self._s[1622]! }
- public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[1623]! }
- public var Channel_DiscussionGroupAdd: String { return self._s[1624]! }
- public var Map_NoPlacesNearby: String { return self._s[1626]! }
- public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1627]! }
- public var GroupRemoved_Title: String { return self._s[1628]! }
- public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1630]! }
- public var VoiceChat_Mute: String { return self._s[1631]! }
- public var Paint_Marker: String { return self._s[1632]! }
+ public var State_WaitingForNetwork: String { return self._s[1637]! }
+ public var AccessDenied_CameraRestricted: String { return self._s[1638]! }
+ public var ChatSettings_Appearance: String { return self._s[1639]! }
+ public var ScheduledMessages_BotActionUnavailable: String { return self._s[1640]! }
+ public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[1641]! }
+ public var Channel_DiscussionGroupAdd: String { return self._s[1642]! }
+ public var Map_NoPlacesNearby: String { return self._s[1644]! }
+ public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1645]! }
+ public var GroupRemoved_Title: String { return self._s[1646]! }
+ public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1648]! }
+ public var VoiceChat_Mute: String { return self._s[1649]! }
+ public var Paint_Marker: String { return self._s[1650]! }
public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1633]!, self._r[1633]!, [_1])
+ return formatWithArgumentRanges(self._s[1651]!, self._r[1651]!, [_1])
}
- public var SocksProxySetup_ShareProxyList: String { return self._s[1634]! }
- public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[1635]! }
+ public var SocksProxySetup_ShareProxyList: String { return self._s[1652]! }
+ public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[1653]! }
public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1636]!, self._r[1636]!, [_0])
+ return formatWithArgumentRanges(self._s[1654]!, self._r[1654]!, [_0])
}
- public var EditTheme_ErrorInvalidCharacters: String { return self._s[1637]! }
- public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[1638]! }
- public var Notifications_GroupNotificationsAlert: String { return self._s[1639]! }
- public var SocksProxySetup_ShareQRCode: String { return self._s[1640]! }
- public var Compose_NewGroup: String { return self._s[1641]! }
+ public var EditTheme_ErrorInvalidCharacters: String { return self._s[1655]! }
+ public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[1656]! }
+ public var Notifications_GroupNotificationsAlert: String { return self._s[1657]! }
+ public var SocksProxySetup_ShareQRCode: String { return self._s[1658]! }
+ public var Compose_NewGroup: String { return self._s[1659]! }
public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1642]!, self._r[1642]!, [_0])
- }
- public var Location_LiveLocationRequired_Description: String { return self._s[1644]! }
- public var Conversation_ClearGroupHistory: String { return self._s[1645]! }
- public var GroupInfo_InviteLink_Help: String { return self._s[1648]! }
- public var Channel_BanUser_BlockFor: String { return self._s[1649]! }
- public var Bot_Start: String { return self._s[1650]! }
- public var Your_card_has_expired: String { return self._s[1651]! }
- public var Channel_About_Title: String { return self._s[1652]! }
- public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1653]! }
- public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[1655]! }
- public var Conversation_FileDropbox: String { return self._s[1656]! }
- public var ChatList_Search_NoResultsFitlerMusic: String { return self._s[1657]! }
- public var Month_GenNovember: String { return self._s[1658]! }
- public var IntentsSettings_SuggestByShare: String { return self._s[1659]! }
- public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1660]!, self._r[1660]!, [_0])
}
- public var StickerPack_Add: String { return self._s[1661]! }
- public var Theme_ErrorNotFound: String { return self._s[1662]! }
- public var Wallpaper_SearchShort: String { return self._s[1664]! }
- public var Channel_BanUser_PermissionsHeader: String { return self._s[1665]! }
- public var ConversationProfile_UsersTooMuchError: String { return self._s[1666]! }
- public var ChatList_FolderAllChats: String { return self._s[1667]! }
- public var VoiceChat_EndConfirmationEnd: String { return self._s[1668]! }
- public var Passport_Authorize: String { return self._s[1669]! }
+ public var Location_LiveLocationRequired_Description: String { return self._s[1662]! }
+ public var Conversation_ClearGroupHistory: String { return self._s[1663]! }
+ public var GroupInfo_InviteLink_Help: String { return self._s[1666]! }
+ public var Channel_BanUser_BlockFor: String { return self._s[1667]! }
+ public var Bot_Start: String { return self._s[1668]! }
+ public var Your_card_has_expired: String { return self._s[1669]! }
+ public var Channel_About_Title: String { return self._s[1670]! }
+ public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1671]! }
+ public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[1673]! }
+ public var Conversation_FileDropbox: String { return self._s[1674]! }
+ public var ChatList_Search_NoResultsFitlerMusic: String { return self._s[1675]! }
+ public var Month_GenNovember: String { return self._s[1676]! }
+ public var IntentsSettings_SuggestByShare: String { return self._s[1677]! }
+ public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1678]!, self._r[1678]!, [_0])
+ }
+ public var StickerPack_Add: String { return self._s[1679]! }
+ public var Theme_ErrorNotFound: String { return self._s[1680]! }
+ public var Wallpaper_SearchShort: String { return self._s[1682]! }
+ public var Channel_BanUser_PermissionsHeader: String { return self._s[1683]! }
+ public var ConversationProfile_UsersTooMuchError: String { return self._s[1684]! }
+ public var ChatList_FolderAllChats: String { return self._s[1685]! }
+ public var VoiceChat_EndConfirmationEnd: String { return self._s[1686]! }
+ public var Passport_Authorize: String { return self._s[1687]! }
public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1670]!, self._r[1670]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1688]!, self._r[1688]!, [_1, _2])
}
- public var GroupInfo_GroupHistoryVisible: String { return self._s[1671]! }
+ public var GroupInfo_GroupHistoryVisible: String { return self._s[1689]! }
public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1672]!, self._r[1672]!, [_1])
+ return formatWithArgumentRanges(self._s[1690]!, self._r[1690]!, [_1])
}
- public var LocalGroup_ButtonTitle: String { return self._s[1673]! }
- public var UserInfo_GroupsInCommon: String { return self._s[1675]! }
- public var LoginPassword_Title: String { return self._s[1677]! }
- public var Wallpaper_Set: String { return self._s[1678]! }
- public var Stats_InteractionsTitle: String { return self._s[1679]! }
+ public var LocalGroup_ButtonTitle: String { return self._s[1691]! }
+ public var UserInfo_GroupsInCommon: String { return self._s[1693]! }
+ public var LoginPassword_Title: String { return self._s[1695]! }
+ public var Wallpaper_Set: String { return self._s[1696]! }
+ public var Stats_InteractionsTitle: String { return self._s[1697]! }
public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1681]!, self._r[1681]!, [_0])
+ return formatWithArgumentRanges(self._s[1699]!, self._r[1699]!, [_0])
}
- public var Conversation_MessageDialogEdit: String { return self._s[1682]! }
- public var Paint_Outlined: String { return self._s[1683]! }
- public var VoiceChat_Rec: String { return self._s[1684]! }
+ public var Conversation_MessageDialogEdit: String { return self._s[1700]! }
+ public var Paint_Outlined: String { return self._s[1701]! }
+ public var VoiceChat_Rec: String { return self._s[1702]! }
public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1685]!, self._r[1685]!, [_0])
+ return formatWithArgumentRanges(self._s[1703]!, self._r[1703]!, [_0])
}
public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1686]!, self._r[1686]!, [_0])
+ return formatWithArgumentRanges(self._s[1704]!, self._r[1704]!, [_0])
}
- public var Invite_LargeRecipientsCountWarning: String { return self._s[1687]! }
- public var Passport_Address_Street1Placeholder: String { return self._s[1688]! }
- public var Appearance_ColorThemeNight: String { return self._s[1689]! }
- public var ChannelInfo_Stats: String { return self._s[1690]! }
- public var TwoStepAuth_RecoveryTitle: String { return self._s[1691]! }
- public var MediaPicker_TimerTooltip: String { return self._s[1692]! }
- public var Common_ChoosePhoto: String { return self._s[1693]! }
- public var Media_LimitedAccessTitle: String { return self._s[1694]! }
- public var ChatSettings_AutoDownloadVideos: String { return self._s[1695]! }
- public var PeerInfo_PaneGroups: String { return self._s[1696]! }
- public var SocksProxySetup_UsernamePlaceholder: String { return self._s[1698]! }
- public var ChangePhoneNumberNumber_Title: String { return self._s[1699]! }
- public var ContactInfo_PhoneLabelMobile: String { return self._s[1700]! }
- public var OldChannels_ChannelsHeader: String { return self._s[1701]! }
- public var MuteFor_Forever: String { return self._s[1702]! }
- public var Passport_Address_PostcodePlaceholder: String { return self._s[1703]! }
- public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[1704]! }
- public var MessagePoll_LabelAnonymous: String { return self._s[1705]! }
- public var ContactInfo_Job: String { return self._s[1706]! }
- public var Passport_Language_mk: String { return self._s[1707]! }
- public var EditTheme_ShortLink: String { return self._s[1708]! }
- public var AutoDownloadSettings_PhotosTitle: String { return self._s[1710]! }
- public var Month_GenApril: String { return self._s[1712]! }
- public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[1714]! }
- public var NetworkUsageSettings_TotalSection: String { return self._s[1715]! }
- public var EditTheme_Create_Preview_OutgoingText: String { return self._s[1716]! }
- public var EditTheme_Title: String { return self._s[1717]! }
- public var Conversation_LinkDialogCopy: String { return self._s[1718]! }
+ public var Invite_LargeRecipientsCountWarning: String { return self._s[1705]! }
+ public var Passport_Address_Street1Placeholder: String { return self._s[1706]! }
+ public var Appearance_ColorThemeNight: String { return self._s[1707]! }
+ public var ChannelInfo_Stats: String { return self._s[1708]! }
+ public var TwoStepAuth_RecoveryTitle: String { return self._s[1709]! }
+ public var MediaPicker_TimerTooltip: String { return self._s[1710]! }
+ public var Common_ChoosePhoto: String { return self._s[1711]! }
+ public var Media_LimitedAccessTitle: String { return self._s[1712]! }
+ public var ChatSettings_AutoDownloadVideos: String { return self._s[1713]! }
+ public var PeerInfo_PaneGroups: String { return self._s[1714]! }
+ public var SocksProxySetup_UsernamePlaceholder: String { return self._s[1716]! }
+ public var ChangePhoneNumberNumber_Title: String { return self._s[1717]! }
+ public var ContactInfo_PhoneLabelMobile: String { return self._s[1718]! }
+ public var OldChannels_ChannelsHeader: String { return self._s[1719]! }
+ public var MuteFor_Forever: String { return self._s[1720]! }
+ public var Passport_Address_PostcodePlaceholder: String { return self._s[1721]! }
+ public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[1722]! }
+ public var MessagePoll_LabelAnonymous: String { return self._s[1723]! }
+ public var ContactInfo_Job: String { return self._s[1724]! }
+ public var Passport_Language_mk: String { return self._s[1725]! }
+ public var EditTheme_ShortLink: String { return self._s[1726]! }
+ public var AutoDownloadSettings_PhotosTitle: String { return self._s[1728]! }
+ public var Month_GenApril: String { return self._s[1730]! }
+ public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[1732]! }
+ public var NetworkUsageSettings_TotalSection: String { return self._s[1733]! }
+ public var EditTheme_Create_Preview_OutgoingText: String { return self._s[1734]! }
+ public var EditTheme_Title: String { return self._s[1735]! }
+ public var Conversation_LinkDialogCopy: String { return self._s[1736]! }
public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1719]!, self._r[1719]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1737]!, self._r[1737]!, [_1, _2])
}
- public var Passport_ForgottenPassword: String { return self._s[1720]! }
- public var WallpaperSearch_Recent: String { return self._s[1721]! }
- public var ChatSettings_Title: String { return self._s[1726]! }
- public var Appearance_ReduceMotionInfo: String { return self._s[1727]! }
+ public var Passport_ForgottenPassword: String { return self._s[1738]! }
+ public var WallpaperSearch_Recent: String { return self._s[1739]! }
+ public var ChatSettings_Title: String { return self._s[1744]! }
+ public var Appearance_ReduceMotionInfo: String { return self._s[1745]! }
public func StickerPackActionInfo_AddedText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1728]!, self._r[1728]!, [_0])
+ return formatWithArgumentRanges(self._s[1746]!, self._r[1746]!, [_0])
}
- public var SocksProxySetup_UseForCallsHelp: String { return self._s[1729]! }
- public var LastSeen_WithinAMonth: String { return self._s[1730]! }
- public var VoiceChat_Live: String { return self._s[1731]! }
- public var PeerInfo_ButtonCall: String { return self._s[1732]! }
- public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[1733]! }
- public var Group_Username_InvalidStartsWithNumber: String { return self._s[1734]! }
- public var Call_AudioRouteHide: String { return self._s[1735]! }
- public var DialogList_SavedMessages: String { return self._s[1736]! }
- public var ChatList_Context_Mute: String { return self._s[1737]! }
- public var Conversation_StatusKickedFromChannel: String { return self._s[1738]! }
+ public var SocksProxySetup_UseForCallsHelp: String { return self._s[1747]! }
+ public var LastSeen_WithinAMonth: String { return self._s[1748]! }
+ public var VoiceChat_Live: String { return self._s[1749]! }
+ public var PeerInfo_ButtonCall: String { return self._s[1750]! }
+ public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[1751]! }
+ public var Group_Username_InvalidStartsWithNumber: String { return self._s[1752]! }
+ public var Call_AudioRouteHide: String { return self._s[1753]! }
+ public var DialogList_SavedMessages: String { return self._s[1754]! }
+ public var ChatList_Context_Mute: String { return self._s[1755]! }
+ public var Conversation_StatusKickedFromChannel: String { return self._s[1756]! }
public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_0])
+ return formatWithArgumentRanges(self._s[1757]!, self._r[1757]!, [_0])
}
- public var VoiceChat_StatusMutedForYou: String { return self._s[1740]! }
- public var Passport_Language_et: String { return self._s[1741]! }
- public var Conversation_MessageLeaveCommentShort: String { return self._s[1742]! }
- public var PhotoEditor_CropReset: String { return self._s[1743]! }
- public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[1744]! }
- public var SocksProxySetup_HostnamePlaceholder: String { return self._s[1745]! }
- public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[1746]! }
- public var WallpaperSearch_ColorWhite: String { return self._s[1749]! }
- public var Channel_AdminLog_CanEditMessages: String { return self._s[1751]! }
- public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[1752]! }
- public var Channel_Username_InvalidStartsWithNumber: String { return self._s[1754]! }
- public var CheckoutInfo_ReceiverInfoName: String { return self._s[1756]! }
- public var Map_YouAreHere: String { return self._s[1758]! }
- public var Core_ServiceUserStatus: String { return self._s[1759]! }
- public var Channel_Setup_TypePrivateHelp: String { return self._s[1762]! }
- public var VoiceChat_StartRecording: String { return self._s[1763]! }
- public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[1764]! }
- public var MediaPicker_Videos: String { return self._s[1766]! }
- public var Map_LiveLocationFor15Minutes: String { return self._s[1768]! }
- public var Passport_Identity_TranslationsHelp: String { return self._s[1769]! }
- public var SharedMedia_CategoryMedia: String { return self._s[1770]! }
+ public var VoiceChat_StatusMutedForYou: String { return self._s[1758]! }
+ public var Passport_Language_et: String { return self._s[1759]! }
+ public var Conversation_MessageLeaveCommentShort: String { return self._s[1760]! }
+ public var PhotoEditor_CropReset: String { return self._s[1761]! }
+ public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[1762]! }
+ public var SocksProxySetup_HostnamePlaceholder: String { return self._s[1763]! }
+ public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[1764]! }
+ public var WallpaperSearch_ColorWhite: String { return self._s[1767]! }
+ public var Channel_AdminLog_CanEditMessages: String { return self._s[1769]! }
+ public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[1770]! }
+ public var Channel_Username_InvalidStartsWithNumber: String { return self._s[1772]! }
+ public var CheckoutInfo_ReceiverInfoName: String { return self._s[1774]! }
+ public var Map_YouAreHere: String { return self._s[1776]! }
+ public var Core_ServiceUserStatus: String { return self._s[1777]! }
+ public var Channel_Setup_TypePrivateHelp: String { return self._s[1780]! }
+ public var VoiceChat_StartRecording: String { return self._s[1781]! }
+ public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[1782]! }
+ public var MediaPicker_Videos: String { return self._s[1784]! }
+ public var Map_LiveLocationFor15Minutes: String { return self._s[1786]! }
+ public var Passport_Identity_TranslationsHelp: String { return self._s[1787]! }
+ public var SharedMedia_CategoryMedia: String { return self._s[1788]! }
public func MediaPicker_Nof(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1771]!, self._r[1771]!, [_0])
- }
- public var ChatSettings_AutoPlayGifs: String { return self._s[1772]! }
- public var Passport_Identity_CountryPlaceholder: String { return self._s[1773]! }
- public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[1774]! }
- public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1775]! }
- public func Chat_SlowmodeTooltip(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1776]!, self._r[1776]!, [_0])
- }
- public var Web_Error: String { return self._s[1777]! }
- public var PhotoEditor_SkinTool: String { return self._s[1778]! }
- public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[1779]! }
- public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[1781]! }
- public var PasscodeSettings_Help: String { return self._s[1782]! }
- public var Appearance_ColorTheme: String { return self._s[1783]! }
- public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1784]!, self._r[1784]!, [_0])
- }
- public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1785]!, self._r[1785]!, [_1])
- }
- public var GroupInfo_LeftStatus: String { return self._s[1786]! }
- public var EditTheme_Preview: String { return self._s[1787]! }
- public var Watch_Suggestion_WhatsUp: String { return self._s[1788]! }
- public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[1789]!, self._r[1789]!, [_0])
}
- public var NotificationsSound_Keys: String { return self._s[1790]! }
- public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1791]! }
- public var ChatList_Context_MarkAsUnread: String { return self._s[1792]! }
- public var DialogList_AdNoticeAlert: String { return self._s[1793]! }
- public var UserInfo_Invite: String { return self._s[1794]! }
- public var Checkout_Email: String { return self._s[1795]! }
- public var Stats_GroupActionsTitle: String { return self._s[1796]! }
- public var Coub_TapForSound: String { return self._s[1797]! }
- public var Theme_ThemeChangedText: String { return self._s[1798]! }
- public var Call_ExternalCallInProgressMessage: String { return self._s[1799]! }
- public var Settings_ApplyProxyAlertEnable: String { return self._s[1800]! }
- public var ScheduledMessages_ScheduledToday: String { return self._s[1801]! }
- public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1802]! }
- public var Call_ReportIncludeLogDescription: String { return self._s[1803]! }
- public var Settings_FrequentlyAskedQuestions: String { return self._s[1805]! }
- public var Call_VoiceOver_VoiceCallMissed: String { return self._s[1806]! }
- public var Channel_MessagePhotoRemoved: String { return self._s[1807]! }
- public var Passport_Email_Delete: String { return self._s[1808]! }
+ public var ChatSettings_AutoPlayGifs: String { return self._s[1790]! }
+ public var Passport_Identity_CountryPlaceholder: String { return self._s[1791]! }
+ public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[1792]! }
+ public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1793]! }
+ public func Chat_SlowmodeTooltip(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1794]!, self._r[1794]!, [_0])
+ }
+ public var Web_Error: String { return self._s[1795]! }
+ public var PhotoEditor_SkinTool: String { return self._s[1796]! }
+ public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[1797]! }
+ public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[1799]! }
+ public var PasscodeSettings_Help: String { return self._s[1800]! }
+ public var Appearance_ColorTheme: String { return self._s[1801]! }
+ public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1802]!, self._r[1802]!, [_0])
+ }
+ public var InviteLink_DeleteAllRevokedLinks: String { return self._s[1803]! }
+ public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1804]!, self._r[1804]!, [_1])
+ }
+ public var InviteLink_QRCode_Title: String { return self._s[1805]! }
+ public var GroupInfo_LeftStatus: String { return self._s[1806]! }
+ public var EditTheme_Preview: String { return self._s[1807]! }
+ public var Watch_Suggestion_WhatsUp: String { return self._s[1808]! }
+ public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[1809]!, self._r[1809]!, [_0])
+ }
+ public var NotificationsSound_Keys: String { return self._s[1810]! }
+ public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1811]! }
+ public var ChatList_Context_MarkAsUnread: String { return self._s[1812]! }
+ public var DialogList_AdNoticeAlert: String { return self._s[1813]! }
+ public var UserInfo_Invite: String { return self._s[1814]! }
+ public var Checkout_Email: String { return self._s[1815]! }
+ public var Stats_GroupActionsTitle: String { return self._s[1816]! }
+ public var Coub_TapForSound: String { return self._s[1817]! }
+ public var Theme_ThemeChangedText: String { return self._s[1818]! }
+ public var Call_ExternalCallInProgressMessage: String { return self._s[1819]! }
+ public var Settings_ApplyProxyAlertEnable: String { return self._s[1820]! }
+ public var ScheduledMessages_ScheduledToday: String { return self._s[1821]! }
+ public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1822]! }
+ public var Call_ReportIncludeLogDescription: String { return self._s[1823]! }
+ public var Settings_FrequentlyAskedQuestions: String { return self._s[1825]! }
+ public var Call_VoiceOver_VoiceCallMissed: String { return self._s[1826]! }
+ public var Channel_MessagePhotoRemoved: String { return self._s[1827]! }
+ public var Passport_Email_Delete: String { return self._s[1828]! }
public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1809]!, self._r[1809]!, [_1])
+ return formatWithArgumentRanges(self._s[1829]!, self._r[1829]!, [_1])
}
- public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[1810]! }
- public var Channel_AdminLog_CanAddAdmins: String { return self._s[1811]! }
- public var SocksProxySetup_FailedToConnect: String { return self._s[1813]! }
- public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1814]! }
- public var Common_of: String { return self._s[1815]! }
- public var VoiceChat_StartRecordingStart: String { return self._s[1816]! }
- public var VoiceChat_CreateNewVoiceChatText: String { return self._s[1817]! }
- public var PeerInfo_ButtonUnmute: String { return self._s[1820]! }
+ public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[1830]! }
+ public var Channel_AdminLog_CanAddAdmins: String { return self._s[1831]! }
+ public var SocksProxySetup_FailedToConnect: String { return self._s[1833]! }
+ public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1834]! }
+ public var Common_of: String { return self._s[1835]! }
+ public var VoiceChat_StartRecordingStart: String { return self._s[1836]! }
+ public var VoiceChat_CreateNewVoiceChatText: String { return self._s[1837]! }
+ public var PeerInfo_ButtonUnmute: String { return self._s[1840]! }
public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1821]!, self._r[1821]!, [_0])
+ return formatWithArgumentRanges(self._s[1841]!, self._r[1841]!, [_0])
}
- public var ChatList_AddChatsToFolder: String { return self._s[1822]! }
- public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[1823]! }
- public var Settings_Title: String { return self._s[1825]! }
- public var AutoDownloadSettings_Contacts: String { return self._s[1827]! }
- public var Appearance_BubbleCornersSetting: String { return self._s[1828]! }
- public var Privacy_Calls_AlwaysAllow: String { return self._s[1829]! }
- public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1831]! }
- public var WallpaperPreview_CropBottomText: String { return self._s[1832]! }
- public var SecretTimer_VideoDescription: String { return self._s[1833]! }
- public var WallpaperPreview_Blurred: String { return self._s[1834]! }
- public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[1835]! }
- public var ChatListFolder_ExcludedSectionHeader: String { return self._s[1837]! }
- public var DialogList_PasscodeLockHelp: String { return self._s[1838]! }
- public var SocksProxySetup_SecretPlaceholder: String { return self._s[1839]! }
- public var NetworkUsageSettings_CallDataSection: String { return self._s[1840]! }
- public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[1841]! }
- public var Passport_FieldAddressTranslationHelp: String { return self._s[1842]! }
- public var SocksProxySetup_Connection: String { return self._s[1843]! }
- public var Passport_Address_TypePassportRegistration: String { return self._s[1844]! }
- public var Contacts_PermissionsAllowInSettings: String { return self._s[1845]! }
- public var Conversation_Unpin: String { return self._s[1846]! }
- public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[1847]! }
- public var TwoFactorSetup_Hint_Placeholder: String { return self._s[1848]! }
- public var Call_ReportSkip: String { return self._s[1849]! }
+ public var ChatList_AddChatsToFolder: String { return self._s[1842]! }
+ public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[1843]! }
+ public var Settings_Title: String { return self._s[1845]! }
+ public var AutoDownloadSettings_Contacts: String { return self._s[1847]! }
+ public var Appearance_BubbleCornersSetting: String { return self._s[1848]! }
+ public var Privacy_Calls_AlwaysAllow: String { return self._s[1849]! }
+ public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1851]! }
+ public var WallpaperPreview_CropBottomText: String { return self._s[1852]! }
+ public var SecretTimer_VideoDescription: String { return self._s[1853]! }
+ public var WallpaperPreview_Blurred: String { return self._s[1854]! }
+ public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[1855]! }
+ public var ChatListFolder_ExcludedSectionHeader: String { return self._s[1857]! }
+ public var DialogList_PasscodeLockHelp: String { return self._s[1858]! }
+ public var SocksProxySetup_SecretPlaceholder: String { return self._s[1859]! }
+ public var NetworkUsageSettings_CallDataSection: String { return self._s[1860]! }
+ public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[1861]! }
+ public var Passport_FieldAddressTranslationHelp: String { return self._s[1862]! }
+ public var SocksProxySetup_Connection: String { return self._s[1863]! }
+ public var Passport_Address_TypePassportRegistration: String { return self._s[1864]! }
+ public var Contacts_PermissionsAllowInSettings: String { return self._s[1865]! }
+ public var Conversation_Unpin: String { return self._s[1866]! }
+ public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[1867]! }
+ public var TwoFactorSetup_Hint_Placeholder: String { return self._s[1868]! }
+ public var Call_ReportSkip: String { return self._s[1869]! }
public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1850]!, self._r[1850]!, [_0])
+ return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_0])
}
public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1852]!, self._r[1852]!, [_0])
+ return formatWithArgumentRanges(self._s[1872]!, self._r[1872]!, [_0])
}
- public var AutoNightTheme_Automatic: String { return self._s[1853]! }
- public var Passport_Language_az: String { return self._s[1854]! }
- public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[1855]! }
- public var Watch_UserInfo_Unmute: String { return self._s[1856]! }
- public var Channel_Stickers_YourStickers: String { return self._s[1857]! }
- public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[1858]! }
- public var Tour_Text1: String { return self._s[1859]! }
- public var Common_Delete: String { return self._s[1860]! }
- public var Settings_EditPhoto: String { return self._s[1861]! }
- public var Common_Edit: String { return self._s[1862]! }
+ public var AutoNightTheme_Automatic: String { return self._s[1873]! }
+ public var Passport_Language_az: String { return self._s[1874]! }
+ public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[1875]! }
+ public var Watch_UserInfo_Unmute: String { return self._s[1876]! }
+ public var Channel_Stickers_YourStickers: String { return self._s[1877]! }
+ public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[1878]! }
+ public var Tour_Text1: String { return self._s[1879]! }
+ public var Common_Delete: String { return self._s[1880]! }
+ public var Settings_EditPhoto: String { return self._s[1881]! }
+ public var Common_Edit: String { return self._s[1882]! }
public func Channel_AdminLog_MutedNewMembers(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1864]!, self._r[1864]!, [_1])
+ return formatWithArgumentRanges(self._s[1884]!, self._r[1884]!, [_1])
}
- public var Passport_Identity_ExpiryDate: String { return self._s[1865]! }
- public var ShareMenu_ShareTo: String { return self._s[1866]! }
- public var Preview_DeleteGif: String { return self._s[1867]! }
- public var WallpaperPreview_PatternPaternDiscard: String { return self._s[1868]! }
- public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[1869]! }
- public var Conversation_ViewReply: String { return self._s[1870]! }
- public var Stats_LoadingText: String { return self._s[1871]! }
- public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[1872]! }
- public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[1873]! }
- public var Channel_AdminLog_CanChangeInfo: String { return self._s[1874]! }
+ public var Passport_Identity_ExpiryDate: String { return self._s[1885]! }
+ public var ShareMenu_ShareTo: String { return self._s[1886]! }
+ public var Preview_DeleteGif: String { return self._s[1887]! }
+ public var WallpaperPreview_PatternPaternDiscard: String { return self._s[1888]! }
+ public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[1889]! }
+ public var Conversation_ViewReply: String { return self._s[1890]! }
+ public var Stats_LoadingText: String { return self._s[1891]! }
+ public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[1892]! }
+ public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[1893]! }
+ public var Channel_AdminLog_CanChangeInfo: String { return self._s[1894]! }
public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1875]!, self._r[1875]!, [_0])
+ return formatWithArgumentRanges(self._s[1895]!, self._r[1895]!, [_0])
}
public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1876]!, self._r[1876]!, [_0])
+ return formatWithArgumentRanges(self._s[1896]!, self._r[1896]!, [_0])
}
public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1878]!, self._r[1878]!, [_0])
+ return formatWithArgumentRanges(self._s[1898]!, self._r[1898]!, [_0])
}
- public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[1879]! }
- public var IntentsSettings_MainAccount: String { return self._s[1882]! }
- public var Group_MessagePhotoRemoved: String { return self._s[1885]! }
- public var Conversation_ContextMenuSelect: String { return self._s[1886]! }
- public var GroupInfo_Permissions_Exceptions: String { return self._s[1888]! }
- public var GroupRemoved_UsersSectionTitle: String { return self._s[1889]! }
- public var Contacts_PermissionsEnable: String { return self._s[1890]! }
- public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[1891]! }
- public var Common_NotNow: String { return self._s[1892]! }
- public var Notification_CreatedChannel: String { return self._s[1893]! }
- public var Stats_ViewsBySourceTitle: String { return self._s[1895]! }
- public var Appearance_AppIconClassic: String { return self._s[1896]! }
- public var PhotoEditor_QualityTool: String { return self._s[1897]! }
- public var ClearCache_ClearCache: String { return self._s[1898]! }
- public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[1899]! }
- public var AutoDownloadSettings_Videos: String { return self._s[1900]! }
- public var GroupPermission_Duration: String { return self._s[1901]! }
- public var ChatList_Read: String { return self._s[1902]! }
+ public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[1899]! }
+ public var InviteLink_Share: String { return self._s[1901]! }
+ public var IntentsSettings_MainAccount: String { return self._s[1903]! }
+ public var Group_MessagePhotoRemoved: String { return self._s[1906]! }
+ public var Conversation_ContextMenuSelect: String { return self._s[1907]! }
+ public var GroupInfo_Permissions_Exceptions: String { return self._s[1909]! }
+ public var GroupRemoved_UsersSectionTitle: String { return self._s[1910]! }
+ public var Contacts_PermissionsEnable: String { return self._s[1911]! }
+ public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[1912]! }
+ public var Common_NotNow: String { return self._s[1913]! }
+ public var Notification_CreatedChannel: String { return self._s[1914]! }
+ public var Stats_ViewsBySourceTitle: String { return self._s[1916]! }
+ public var InviteLink_ContextShare: String { return self._s[1917]! }
+ public var Appearance_AppIconClassic: String { return self._s[1918]! }
+ public var PhotoEditor_QualityTool: String { return self._s[1919]! }
+ public var ClearCache_ClearCache: String { return self._s[1920]! }
+ public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[1921]! }
+ public var AutoDownloadSettings_Videos: String { return self._s[1922]! }
+ public var GroupPermission_Duration: String { return self._s[1923]! }
+ public var ChatList_Read: String { return self._s[1924]! }
public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1903]!, self._r[1903]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1925]!, self._r[1925]!, [_1, _2])
}
- public var CallFeedback_Send: String { return self._s[1904]! }
- public var Channel_Stickers_Searching: String { return self._s[1905]! }
- public var ScheduledMessages_ReminderNotification: String { return self._s[1906]! }
- public var FastTwoStepSetup_HintSection: String { return self._s[1907]! }
- public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[1908]! }
- public var EditTheme_CreateTitle: String { return self._s[1909]! }
- public var Application_Name: String { return self._s[1910]! }
- public var Paint_Stickers: String { return self._s[1911]! }
- public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[1912]! }
- public var Call_StatusFailed: String { return self._s[1913]! }
- public var Stickers_FavoriteStickers: String { return self._s[1914]! }
- public var ClearCache_Clear: String { return self._s[1915]! }
- public var Passport_Language_mn: String { return self._s[1916]! }
- public var WallpaperPreview_PreviewTopText: String { return self._s[1917]! }
- public var LogoutOptions_ClearCacheTitle: String { return self._s[1918]! }
- public var Call_VoiceOver_VideoCallOutgoing: String { return self._s[1920]! }
- public var TwoFactorSetup_Hint_Text: String { return self._s[1922]! }
- public var WallpaperPreview_PatternIntensity: String { return self._s[1923]! }
- public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1924]! }
- public var Passport_Address_AddBankStatement: String { return self._s[1925]! }
+ public var CallFeedback_Send: String { return self._s[1926]! }
+ public var Channel_Stickers_Searching: String { return self._s[1927]! }
+ public var ScheduledMessages_ReminderNotification: String { return self._s[1928]! }
+ public var FastTwoStepSetup_HintSection: String { return self._s[1929]! }
+ public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[1930]! }
+ public var EditTheme_CreateTitle: String { return self._s[1931]! }
+ public var Application_Name: String { return self._s[1932]! }
+ public var Paint_Stickers: String { return self._s[1933]! }
+ public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[1934]! }
+ public var Call_StatusFailed: String { return self._s[1935]! }
+ public var Stickers_FavoriteStickers: String { return self._s[1936]! }
+ public var ClearCache_Clear: String { return self._s[1937]! }
+ public var Passport_Language_mn: String { return self._s[1938]! }
+ public var WallpaperPreview_PreviewTopText: String { return self._s[1939]! }
+ public var LogoutOptions_ClearCacheTitle: String { return self._s[1940]! }
+ public var Call_VoiceOver_VideoCallOutgoing: String { return self._s[1942]! }
+ public var TwoFactorSetup_Hint_Text: String { return self._s[1944]! }
+ public var WallpaperPreview_PatternIntensity: String { return self._s[1945]! }
+ public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[1946]! }
+ public var Passport_Address_AddBankStatement: String { return self._s[1947]! }
public func Conversation_TitleRepliesFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1927]!, self._r[1927]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1949]!, self._r[1949]!, [_1, _2])
}
- public var ChatListFolderSettings_RecommendedNewFolder: String { return self._s[1928]! }
- public var UserInfo_ShareContact: String { return self._s[1929]! }
- public var Passport_Identity_NamePlaceholder: String { return self._s[1930]! }
- public var Call_RateCall: String { return self._s[1932]! }
- public var Contacts_AccessDeniedError: String { return self._s[1933]! }
- public var Invite_ChannelsTooMuch: String { return self._s[1934]! }
- public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[1935]! }
- public var Channel_BanUser_PermissionReadMessages: String { return self._s[1936]! }
- public var Cache_NoLimit: String { return self._s[1938]! }
- public var Conversation_EmptyPlaceholder: String { return self._s[1942]! }
- public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[1943]! }
- public var GroupRemoved_RemoveInfo: String { return self._s[1945]! }
- public var Privacy_Calls_IntegrationHelp: String { return self._s[1946]! }
+ public var ChatListFolderSettings_RecommendedNewFolder: String { return self._s[1950]! }
+ public var UserInfo_ShareContact: String { return self._s[1951]! }
+ public var Passport_Identity_NamePlaceholder: String { return self._s[1952]! }
+ public var Call_RateCall: String { return self._s[1954]! }
+ public var Contacts_AccessDeniedError: String { return self._s[1955]! }
+ public var Invite_ChannelsTooMuch: String { return self._s[1956]! }
+ public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[1957]! }
+ public var Channel_BanUser_PermissionReadMessages: String { return self._s[1958]! }
+ public var InviteLink_Create_TimeLimitInfo: String { return self._s[1959]! }
+ public var Cache_NoLimit: String { return self._s[1961]! }
+ public var Conversation_EmptyPlaceholder: String { return self._s[1965]! }
+ public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[1966]! }
+ public var GroupRemoved_RemoveInfo: String { return self._s[1968]! }
+ public var Privacy_Calls_IntegrationHelp: String { return self._s[1969]! }
public func PUSH_VIDEO_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1947]!, self._r[1947]!, [_1])
+ return formatWithArgumentRanges(self._s[1970]!, self._r[1970]!, [_1])
}
- public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1948]! }
- public var Theme_ThemeChanged: String { return self._s[1949]! }
- public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[1951]! }
- public var AutoDownloadSettings_MediaTypes: String { return self._s[1952]! }
+ public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1971]! }
+ public var Theme_ThemeChanged: String { return self._s[1972]! }
+ public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[1974]! }
+ public var AutoDownloadSettings_MediaTypes: String { return self._s[1975]! }
public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_0])
+ return formatWithArgumentRanges(self._s[1976]!, self._r[1976]!, [_0])
}
- public var Channel_AdminLog_InfoPanelTitle: String { return self._s[1954]! }
- public var Passport_Language_da: String { return self._s[1956]! }
- public var Chat_SlowmodeSendError: String { return self._s[1957]! }
- public var Application_Update: String { return self._s[1959]! }
- public var SocksProxySetup_SaveProxy: String { return self._s[1960]! }
+ public var Channel_AdminLog_InfoPanelTitle: String { return self._s[1977]! }
+ public var Passport_Language_da: String { return self._s[1979]! }
+ public var Chat_SlowmodeSendError: String { return self._s[1980]! }
+ public var Application_Update: String { return self._s[1982]! }
+ public var SocksProxySetup_SaveProxy: String { return self._s[1983]! }
public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1961]!, self._r[1961]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[1984]!, self._r[1984]!, [_1, _2])
}
- public var Privacy_AddNewPeer: String { return self._s[1963]! }
- public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[1965]! }
- public var Channel_Members_Title: String { return self._s[1966]! }
- public var Settings_LogoutConfirmationText: String { return self._s[1967]! }
- public var Chat_UnsendMyMessages: String { return self._s[1968]! }
- public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[1970]! }
- public var ChatListFilter_AddChatsTitle: String { return self._s[1971]! }
- public var Passport_FloodError: String { return self._s[1972]! }
- public var NotificationSettings_ContactJoinedInfo: String { return self._s[1973]! }
- public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1974]! }
- public var CallSettings_TabIconDescription: String { return self._s[1975]! }
- public var Group_Setup_HistoryHeader: String { return self._s[1977]! }
+ public var Privacy_AddNewPeer: String { return self._s[1986]! }
+ public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[1988]! }
+ public var Channel_Members_Title: String { return self._s[1989]! }
+ public var Settings_LogoutConfirmationText: String { return self._s[1990]! }
+ public var Chat_UnsendMyMessages: String { return self._s[1991]! }
+ public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[1993]! }
+ public var ChatListFilter_AddChatsTitle: String { return self._s[1994]! }
+ public var Passport_FloodError: String { return self._s[1995]! }
+ public var NotificationSettings_ContactJoinedInfo: String { return self._s[1996]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1997]! }
+ public var CallSettings_TabIconDescription: String { return self._s[1998]! }
+ public var Group_Setup_HistoryHeader: String { return self._s[2000]! }
public func Channel_AdminLog_AllowedNewMembersToSpeak(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1978]!, self._r[1978]!, [_1])
+ return formatWithArgumentRanges(self._s[2001]!, self._r[2001]!, [_1])
}
- public var TwoStepAuth_EmailTitle: String { return self._s[1979]! }
- public var GroupInfo_Permissions_Removed: String { return self._s[1980]! }
- public var DialogList_ClearHistoryConfirmation: String { return self._s[1981]! }
- public var Contacts_Title: String { return self._s[1983]! }
+ public var TwoStepAuth_EmailTitle: String { return self._s[2002]! }
+ public var GroupInfo_Permissions_Removed: String { return self._s[2003]! }
+ public var DialogList_ClearHistoryConfirmation: String { return self._s[2004]! }
+ public var Contacts_Title: String { return self._s[2006]! }
public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1984]!, self._r[1984]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[2007]!, self._r[2007]!, [_0, _1])
}
- public var ChatList_PeerTypeBot: String { return self._s[1987]! }
+ public var ChatList_PeerTypeBot: String { return self._s[2010]! }
public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1988]!, self._r[1988]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2011]!, self._r[2011]!, [_1, _2])
}
- public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[1989]! }
+ public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[2012]! }
public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1990]!, self._r[1990]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2013]!, self._r[2013]!, [_1, _2, _3])
}
- public var Camera_PhotoMode: String { return self._s[1992]! }
+ public var Camera_PhotoMode: String { return self._s[2015]! }
public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1993]!, self._r[1993]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2016]!, self._r[2016]!, [_1, _2, _3])
}
- public var ContactInfo_PhoneLabelPager: String { return self._s[1994]! }
- public var SettingsSearch_Synonyms_FAQ: String { return self._s[1995]! }
- public var Call_CallAgain: String { return self._s[1996]! }
- public var TwoStepAuth_PasswordSet: String { return self._s[1997]! }
+ public var ContactInfo_PhoneLabelPager: String { return self._s[2017]! }
+ public var SettingsSearch_Synonyms_FAQ: String { return self._s[2018]! }
+ public var Call_CallAgain: String { return self._s[2019]! }
+ public var TwoStepAuth_PasswordSet: String { return self._s[2020]! }
public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[1998]!, self._r[1998]!, [_0])
+ return formatWithArgumentRanges(self._s[2021]!, self._r[2021]!, [_0])
}
- public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[1999]! }
- public var ClearCache_FreeSpaceDescription: String { return self._s[2000]! }
- public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2001]! }
- public var Group_LeaveGroup: String { return self._s[2002]! }
- public var GroupInfo_LabelAdmin: String { return self._s[2005]! }
- public var CheckoutInfo_ErrorStateInvalid: String { return self._s[2007]! }
- public var Notification_PassportValuePersonalDetails: String { return self._s[2008]! }
+ public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[2022]! }
+ public var ClearCache_FreeSpaceDescription: String { return self._s[2023]! }
+ public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2024]! }
+ public var Group_LeaveGroup: String { return self._s[2025]! }
+ public var GroupInfo_LabelAdmin: String { return self._s[2028]! }
+ public var CheckoutInfo_ErrorStateInvalid: String { return self._s[2030]! }
+ public var Notification_PassportValuePersonalDetails: String { return self._s[2031]! }
public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2009]!, self._r[2009]!, [_0])
+ return formatWithArgumentRanges(self._s[2032]!, self._r[2032]!, [_0])
}
- public var Stats_GroupNewMembersBySourceTitle: String { return self._s[2010]! }
- public var Appearance_Preview: String { return self._s[2011]! }
- public var VoiceOver_Chat_Contact: String { return self._s[2012]! }
- public var Passport_Language_th: String { return self._s[2013]! }
- public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2015]! }
- public var LastSeen_Offline: String { return self._s[2018]! }
- public var Map_OpenInHereMaps: String { return self._s[2019]! }
- public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[2020]! }
- public var AutoDownloadSettings_Reset: String { return self._s[2022]! }
- public var Conversation_SendMessage_SetReminder: String { return self._s[2023]! }
- public var Channel_AdminLog_EmptyMessageText: String { return self._s[2024]! }
+ public var Stats_GroupNewMembersBySourceTitle: String { return self._s[2033]! }
+ public var Appearance_Preview: String { return self._s[2034]! }
+ public var VoiceOver_Chat_Contact: String { return self._s[2035]! }
+ public var Passport_Language_th: String { return self._s[2036]! }
+ public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2038]! }
+ public var LastSeen_Offline: String { return self._s[2041]! }
+ public var Map_OpenInHereMaps: String { return self._s[2042]! }
+ public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[2043]! }
+ public var InviteLink_ContextEdit: String { return self._s[2045]! }
+ public var AutoDownloadSettings_Reset: String { return self._s[2046]! }
+ public var Conversation_SendMessage_SetReminder: String { return self._s[2047]! }
+ public var Channel_AdminLog_EmptyMessageText: String { return self._s[2048]! }
public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2025]!, self._r[2025]!, [_0])
+ return formatWithArgumentRanges(self._s[2049]!, self._r[2049]!, [_0])
}
public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2026]!, self._r[2026]!, [_0])
+ return formatWithArgumentRanges(self._s[2050]!, self._r[2050]!, [_0])
}
- public var Passport_Identity_EditDriversLicense: String { return self._s[2027]! }
- public var ChatListFolder_NameNonMuted: String { return self._s[2028]! }
- public var Username_Placeholder: String { return self._s[2029]! }
+ public var Passport_Identity_EditDriversLicense: String { return self._s[2051]! }
+ public var ChatListFolder_NameNonMuted: String { return self._s[2052]! }
+ public var Username_Placeholder: String { return self._s[2053]! }
public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2030]!, self._r[2030]!, [_1])
+ return formatWithArgumentRanges(self._s[2054]!, self._r[2054]!, [_1])
}
- public var Passport_Language_it: String { return self._s[2031]! }
- public var Checkout_NewCard_SaveInfo: String { return self._s[2032]! }
+ public var Passport_Language_it: String { return self._s[2055]! }
+ public var Checkout_NewCard_SaveInfo: String { return self._s[2056]! }
public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2033]!, self._r[2033]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2057]!, self._r[2057]!, [_1, _2])
}
- public var NotificationsSound_Pulse: String { return self._s[2034]! }
- public var VoiceOver_DismissContextMenu: String { return self._s[2036]! }
- public var MessagePoll_NoVotes: String { return self._s[2039]! }
- public var Message_Wallpaper: String { return self._s[2040]! }
- public var Appearance_Other: String { return self._s[2041]! }
- public var Passport_Identity_NativeNameHelp: String { return self._s[2043]! }
- public var Group_PublicLink_Placeholder: String { return self._s[2046]! }
- public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2047]! }
- public var VoiceOver_Recording_StopAndPreview: String { return self._s[2048]! }
- public var ChatListFolder_NameBots: String { return self._s[2049]! }
- public var Conversation_StopPollConfirmation: String { return self._s[2050]! }
- public var UserInfo_DeleteContact: String { return self._s[2051]! }
+ public var NotificationsSound_Pulse: String { return self._s[2058]! }
+ public var VoiceOver_DismissContextMenu: String { return self._s[2060]! }
+ public var MessagePoll_NoVotes: String { return self._s[2063]! }
+ public var Message_Wallpaper: String { return self._s[2064]! }
+ public var Appearance_Other: String { return self._s[2065]! }
+ public var Passport_Identity_NativeNameHelp: String { return self._s[2067]! }
+ public var Group_PublicLink_Placeholder: String { return self._s[2070]! }
+ public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2071]! }
+ public var VoiceOver_Recording_StopAndPreview: String { return self._s[2072]! }
+ public var ChatListFolder_NameBots: String { return self._s[2073]! }
+ public var Conversation_StopPollConfirmation: String { return self._s[2074]! }
+ public var UserInfo_DeleteContact: String { return self._s[2075]! }
public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_0])
+ return formatWithArgumentRanges(self._s[2076]!, self._r[2076]!, [_0])
}
- public var Wallpaper_Wallpaper: String { return self._s[2054]! }
+ public var Wallpaper_Wallpaper: String { return self._s[2078]! }
public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2055]!, self._r[2055]!, [_1])
+ return formatWithArgumentRanges(self._s[2079]!, self._r[2079]!, [_1])
}
- public var LoginPassword_ForgotPassword: String { return self._s[2056]! }
- public var FeaturedStickerPacks_Title: String { return self._s[2057]! }
- public var Paint_Pen: String { return self._s[2058]! }
- public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2059]! }
- public var ChatListFolderSettings_Info: String { return self._s[2060]! }
- public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2061]! }
- public var PhotoEditor_CurvesAll: String { return self._s[2063]! }
+ public var LoginPassword_ForgotPassword: String { return self._s[2080]! }
+ public var FeaturedStickerPacks_Title: String { return self._s[2081]! }
+ public var Paint_Pen: String { return self._s[2082]! }
+ public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2083]! }
+ public var ChatListFolderSettings_Info: String { return self._s[2084]! }
+ public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2085]! }
+ public var PhotoEditor_CurvesAll: String { return self._s[2087]! }
public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2065]!, self._r[2065]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2089]!, self._r[2089]!, [_1, _2, _3])
}
- public var Passport_Address_TypeRentalAgreement: String { return self._s[2067]! }
- public var Message_ImageExpired: String { return self._s[2068]! }
- public var Call_ConnectionErrorMessage: String { return self._s[2069]! }
- public var SearchImages_NoImagesFound: String { return self._s[2071]! }
- public var PeerInfo_PaneGifs: String { return self._s[2072]! }
- public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2073]! }
- public var EnterPasscode_RepeatNewPasscode: String { return self._s[2074]! }
- public var PhotoEditor_VignetteTool: String { return self._s[2075]! }
- public var Passport_Language_dz: String { return self._s[2076]! }
- public var Notifications_ChannelNotificationsHelp: String { return self._s[2077]! }
- public var Conversation_BlockUser: String { return self._s[2078]! }
- public var GroupPermission_PermissionDisabledByDefault: String { return self._s[2081]! }
- public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2083]! }
+ public var Passport_Address_TypeRentalAgreement: String { return self._s[2091]! }
+ public var Message_ImageExpired: String { return self._s[2092]! }
+ public var Call_ConnectionErrorMessage: String { return self._s[2093]! }
+ public var SearchImages_NoImagesFound: String { return self._s[2095]! }
+ public var PeerInfo_PaneGifs: String { return self._s[2096]! }
+ public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2097]! }
+ public var EnterPasscode_RepeatNewPasscode: String { return self._s[2098]! }
+ public var PhotoEditor_VignetteTool: String { return self._s[2099]! }
+ public var Passport_Language_dz: String { return self._s[2100]! }
+ public var Notifications_ChannelNotificationsHelp: String { return self._s[2101]! }
+ public var Conversation_BlockUser: String { return self._s[2102]! }
+ public var GroupPermission_PermissionDisabledByDefault: String { return self._s[2105]! }
+ public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2107]! }
public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2084]!, self._r[2084]!, [_0])
+ return formatWithArgumentRanges(self._s[2108]!, self._r[2108]!, [_0])
}
- public var KeyCommand_NewMessage: String { return self._s[2085]! }
- public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[2087]! }
+ public var KeyCommand_NewMessage: String { return self._s[2109]! }
+ public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[2111]! }
public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2089]!, self._r[2089]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2113]!, self._r[2113]!, [_1, _2])
}
- public var ContactList_Context_StartSecretChat: String { return self._s[2090]! }
- public var VoiceOver_Chat_File: String { return self._s[2091]! }
- public var ChatList_EditFolder: String { return self._s[2093]! }
- public var Appearance_BubbleCorners_Title: String { return self._s[2094]! }
- public var PeerInfo_PaneAudio: String { return self._s[2095]! }
- public var ChatListFolder_CategoryContacts: String { return self._s[2097]! }
+ public var ContactList_Context_StartSecretChat: String { return self._s[2114]! }
+ public var VoiceOver_Chat_File: String { return self._s[2115]! }
+ public var ChatList_EditFolder: String { return self._s[2117]! }
+ public var Appearance_BubbleCorners_Title: String { return self._s[2118]! }
+ public var PeerInfo_PaneAudio: String { return self._s[2119]! }
+ public var ChatListFolder_CategoryContacts: String { return self._s[2121]! }
public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2098]!, self._r[2098]!, [_1, _2, _3, _4, _5])
+ return formatWithArgumentRanges(self._s[2122]!, self._r[2122]!, [_1, _2, _3, _4, _5])
}
- public var ChatList_PeerTypeChannel: String { return self._s[2099]! }
- public var VoiceOver_Navigation_Search: String { return self._s[2100]! }
- public var Settings_Search: String { return self._s[2101]! }
- public var WallpaperSearch_ColorYellow: String { return self._s[2102]! }
- public var Login_PhoneBannedError: String { return self._s[2103]! }
- public var KeyCommand_JumpToNextChat: String { return self._s[2104]! }
- public var Passport_Language_fa: String { return self._s[2105]! }
- public var Settings_About: String { return self._s[2106]! }
- public var AutoDownloadSettings_MaxFileSize: String { return self._s[2107]! }
- public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[2108]! }
- public var AutoDownloadSettings_DataUsageHigh: String { return self._s[2109]! }
+ public var ChatList_PeerTypeChannel: String { return self._s[2123]! }
+ public var VoiceOver_Navigation_Search: String { return self._s[2124]! }
+ public var Settings_Search: String { return self._s[2125]! }
+ public var WallpaperSearch_ColorYellow: String { return self._s[2126]! }
+ public var Login_PhoneBannedError: String { return self._s[2127]! }
+ public var KeyCommand_JumpToNextChat: String { return self._s[2128]! }
+ public var Passport_Language_fa: String { return self._s[2129]! }
+ public var Settings_About: String { return self._s[2130]! }
+ public var AutoDownloadSettings_MaxFileSize: String { return self._s[2131]! }
+ public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[2132]! }
+ public var AutoDownloadSettings_DataUsageHigh: String { return self._s[2133]! }
public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2110]!, self._r[2110]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2134]!, self._r[2134]!, [_1, _2, _3])
}
- public var Common_OK: String { return self._s[2111]! }
- public var Contacts_SortBy: String { return self._s[2112]! }
- public var AutoNightTheme_PreferredTheme: String { return self._s[2113]! }
+ public var Common_OK: String { return self._s[2135]! }
+ public var Contacts_SortBy: String { return self._s[2136]! }
+ public var AutoNightTheme_PreferredTheme: String { return self._s[2137]! }
public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2115]!, self._r[2115]!, [_0])
+ return formatWithArgumentRanges(self._s[2139]!, self._r[2139]!, [_0])
}
- public var CallFeedback_IncludeLogs: String { return self._s[2118]! }
+ public var CallFeedback_IncludeLogs: String { return self._s[2142]! }
public func External_OpenIn(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2119]!, self._r[2119]!, [_0])
+ return formatWithArgumentRanges(self._s[2143]!, self._r[2143]!, [_0])
}
- public var Passcode_AppLockedAlert: String { return self._s[2121]! }
- public var TwoStepAuth_SetupPasswordTitle: String { return self._s[2122]! }
- public var Channel_NotificationLoading: String { return self._s[2124]! }
- public var Passport_Identity_DocumentNumber: String { return self._s[2125]! }
- public var VoiceOver_Chat_PagePreview: String { return self._s[2126]! }
- public var VoiceOver_Chat_OpenHint: String { return self._s[2127]! }
- public var Weekday_ShortFriday: String { return self._s[2128]! }
- public var Conversation_TitleMute: String { return self._s[2129]! }
- public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2130]! }
- public var ScheduledMessages_PollUnavailable: String { return self._s[2131]! }
- public var DialogList_LanguageTooltip: String { return self._s[2133]! }
- public var Channel_AdminLogFilter_EventsPinned: String { return self._s[2134]! }
+ public var Passcode_AppLockedAlert: String { return self._s[2145]! }
+ public var TwoStepAuth_SetupPasswordTitle: String { return self._s[2146]! }
+ public var Channel_NotificationLoading: String { return self._s[2148]! }
+ public var Passport_Identity_DocumentNumber: String { return self._s[2149]! }
+ public var VoiceOver_Chat_PagePreview: String { return self._s[2150]! }
+ public var VoiceOver_Chat_OpenHint: String { return self._s[2151]! }
+ public var Weekday_ShortFriday: String { return self._s[2152]! }
+ public var Conversation_TitleMute: String { return self._s[2153]! }
+ public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2154]! }
+ public var ScheduledMessages_PollUnavailable: String { return self._s[2155]! }
+ public var DialogList_LanguageTooltip: String { return self._s[2157]! }
+ public var Channel_AdminLogFilter_EventsPinned: String { return self._s[2158]! }
public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2135]!, self._r[2135]!, [_0])
+ return formatWithArgumentRanges(self._s[2159]!, self._r[2159]!, [_0])
}
- public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[2137]! }
- public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[2138]! }
- public var Settings_EditVideo: String { return self._s[2139]! }
- public var VoiceOver_Common_Off: String { return self._s[2140]! }
- public var Stickers_FrequentlyUsed: String { return self._s[2141]! }
- public var GroupPermission_Title: String { return self._s[2142]! }
- public var AccessDenied_VideoMessageCamera: String { return self._s[2143]! }
- public var Appearance_ThemeCarouselDay: String { return self._s[2144]! }
+ public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[2161]! }
+ public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[2162]! }
+ public var Settings_EditVideo: String { return self._s[2163]! }
+ public var VoiceOver_Common_Off: String { return self._s[2164]! }
+ public var Stickers_FrequentlyUsed: String { return self._s[2165]! }
+ public var GroupPermission_Title: String { return self._s[2166]! }
+ public var AccessDenied_VideoMessageCamera: String { return self._s[2167]! }
+ public var Appearance_ThemeCarouselDay: String { return self._s[2168]! }
public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2145]!, self._r[2145]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2169]!, self._r[2169]!, [_1, _2])
}
- public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2146]! }
- public var Tour_Title6: String { return self._s[2147]! }
- public var EmptyGroupInfo_Title: String { return self._s[2148]! }
+ public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2170]! }
+ public var Tour_Title6: String { return self._s[2171]! }
+ public var EmptyGroupInfo_Title: String { return self._s[2172]! }
public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2149]!, self._r[2149]!, [_0])
+ return formatWithArgumentRanges(self._s[2173]!, self._r[2173]!, [_0])
}
- public var Passport_Language_sk: String { return self._s[2150]! }
- public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[2151]! }
- public var Preview_SaveToCameraRoll: String { return self._s[2152]! }
- public var LogoutOptions_SetPasscodeTitle: String { return self._s[2153]! }
- public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2154]! }
- public var Conversation_ContextMenuMore: String { return self._s[2155]! }
- public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[2156]! }
- public var Channel_AdminLog_CanBeAnonymous: String { return self._s[2157]! }
- public var CallFeedback_ReasonSilentLocal: String { return self._s[2159]! }
+ public var Passport_Language_sk: String { return self._s[2174]! }
+ public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[2175]! }
+ public var Preview_SaveToCameraRoll: String { return self._s[2176]! }
+ public var LogoutOptions_SetPasscodeTitle: String { return self._s[2177]! }
+ public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2178]! }
+ public var Conversation_ContextMenuMore: String { return self._s[2179]! }
+ public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[2180]! }
+ public var Channel_AdminLog_CanBeAnonymous: String { return self._s[2181]! }
+ public var CallFeedback_ReasonSilentLocal: String { return self._s[2183]! }
public func Channel_AdminLog_UnmutedMutedParticipant(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2160]!, self._r[2160]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2184]!, self._r[2184]!, [_1, _2])
}
- public var UserInfo_NotificationsDisable: String { return self._s[2161]! }
+ public var UserInfo_NotificationsDisable: String { return self._s[2185]! }
public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2163]!, self._r[2163]!, [_0])
+ return formatWithArgumentRanges(self._s[2187]!, self._r[2187]!, [_0])
}
- public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[2164]! }
+ public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[2188]! }
public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2166]!, self._r[2166]!, [_1, _2])
- }
- public var WallpaperSearch_ColorPrefix: String { return self._s[2167]! }
- public func Message_ForwardedPsa_covid(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2168]!, self._r[2168]!, [_0])
- }
- public var Conversation_RestrictedMedia: String { return self._s[2170]! }
- public var Group_MessageVideoUpdated: String { return self._s[2171]! }
- public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2172]! }
- public var GroupInfo_DeleteAndExit: String { return self._s[2173]! }
- public var TwoFactorSetup_Email_Action: String { return self._s[2174]! }
- public var Media_ShareThisVideo: String { return self._s[2176]! }
- public var DialogList_Replies: String { return self._s[2177]! }
- public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2178]!, self._r[2178]!, [_0])
- }
- public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2179]! }
- public var Watch_Suggestion_OnMyWay: String { return self._s[2180]! }
- public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2181]! }
- public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2182]!, self._r[2182]!, [_1, _2])
- }
- public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2183]!, self._r[2183]!, [_0])
- }
- public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[2184]! }
- public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2185]! }
- public var ChatList_Search_NoResultsFitlerMedia: String { return self._s[2186]! }
- public var Channel_Members_InviteLink: String { return self._s[2187]! }
- public var Conversation_TapAndHoldToRecord: String { return self._s[2188]! }
- public var WatchRemote_AlertText: String { return self._s[2189]! }
- public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2190]!, self._r[2190]!, [_1, _2])
}
- public var Conversation_Pin: String { return self._s[2191]! }
- public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2192]! }
- public var Stickers_RemoveFromFavorites: String { return self._s[2193]! }
+ public var WallpaperSearch_ColorPrefix: String { return self._s[2191]! }
+ public func Message_ForwardedPsa_covid(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2192]!, self._r[2192]!, [_0])
+ }
+ public var Conversation_RestrictedMedia: String { return self._s[2194]! }
+ public var Group_MessageVideoUpdated: String { return self._s[2195]! }
+ public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2196]! }
+ public var GroupInfo_DeleteAndExit: String { return self._s[2197]! }
+ public var TwoFactorSetup_Email_Action: String { return self._s[2198]! }
+ public var Media_ShareThisVideo: String { return self._s[2200]! }
+ public var DialogList_Replies: String { return self._s[2201]! }
+ public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2202]!, self._r[2202]!, [_0])
+ }
+ public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2203]! }
+ public var Watch_Suggestion_OnMyWay: String { return self._s[2204]! }
+ public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2205]! }
+ public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2206]!, self._r[2206]!, [_1, _2])
+ }
+ public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2207]!, self._r[2207]!, [_0])
+ }
+ public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[2208]! }
+ public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2209]! }
+ public var ChatList_Search_NoResultsFitlerMedia: String { return self._s[2210]! }
+ public var Channel_Members_InviteLink: String { return self._s[2211]! }
+ public var Conversation_TapAndHoldToRecord: String { return self._s[2212]! }
+ public var WatchRemote_AlertText: String { return self._s[2213]! }
+ public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2214]!, self._r[2214]!, [_1, _2])
+ }
+ public var Conversation_Pin: String { return self._s[2215]! }
+ public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2216]! }
+ public var Stickers_RemoveFromFavorites: String { return self._s[2217]! }
public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2194]!, self._r[2194]!, [_0])
+ return formatWithArgumentRanges(self._s[2218]!, self._r[2218]!, [_0])
}
- public var Appearance_AppIconFilled: String { return self._s[2195]! }
- public var StickerPack_ErrorNotFound: String { return self._s[2196]! }
+ public var Appearance_AppIconFilled: String { return self._s[2219]! }
+ public var StickerPack_ErrorNotFound: String { return self._s[2220]! }
public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2197]!, self._r[2197]!, [_1])
+ return formatWithArgumentRanges(self._s[2221]!, self._r[2221]!, [_1])
}
- public var Passport_Identity_AddIdentityCard: String { return self._s[2198]! }
+ public var Passport_Identity_AddIdentityCard: String { return self._s[2222]! }
public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2200]!, self._r[2200]!, [_1])
+ return formatWithArgumentRanges(self._s[2224]!, self._r[2224]!, [_1])
}
- public var Call_Camera: String { return self._s[2201]! }
- public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2202]! }
- public var Group_Location_Info: String { return self._s[2203]! }
- public var Watch_LastSeen_WithinAMonth: String { return self._s[2204]! }
- public var UserInfo_NotificationsDefaultEnabled: String { return self._s[2205]! }
+ public var Call_Camera: String { return self._s[2225]! }
+ public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2226]! }
+ public var Group_Location_Info: String { return self._s[2227]! }
+ public var Watch_LastSeen_WithinAMonth: String { return self._s[2228]! }
+ public var UserInfo_NotificationsDefaultEnabled: String { return self._s[2229]! }
public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2206]!, self._r[2206]!, [_0])
+ return formatWithArgumentRanges(self._s[2230]!, self._r[2230]!, [_0])
}
- public var Weekday_Yesterday: String { return self._s[2207]! }
- public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[2208]! }
- public var ArchivedPacksAlert_Title: String { return self._s[2209]! }
- public var PeerInfo_PaneMembers: String { return self._s[2210]! }
- public var PhotoEditor_SelectCoverFrame: String { return self._s[2211]! }
+ public var Weekday_Yesterday: String { return self._s[2231]! }
+ public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[2232]! }
+ public var InviteLink_Create_UsersLimit: String { return self._s[2233]! }
+ public var ArchivedPacksAlert_Title: String { return self._s[2234]! }
+ public var PeerInfo_PaneMembers: String { return self._s[2235]! }
+ public var PhotoEditor_SelectCoverFrame: String { return self._s[2236]! }
public func Location_ProximityAlertSetTextGroup(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2212]!, self._r[2212]!, [_0])
+ return formatWithArgumentRanges(self._s[2237]!, self._r[2237]!, [_0])
}
- public var ContactInfo_PhoneLabelMain: String { return self._s[2213]! }
+ public var ContactInfo_PhoneLabelMain: String { return self._s[2238]! }
public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2214]!, self._r[2214]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2239]!, self._r[2239]!, [_1, _2, _3])
}
- public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[2215]! }
- public var Channel_DiscussionGroup: String { return self._s[2216]! }
- public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[2217]! }
- public var Channel_EditAdmin_PermissionsHeader: String { return self._s[2219]! }
- public var VoiceOver_MessageContextForward: String { return self._s[2220]! }
- public var SocksProxySetup_TypeNone: String { return self._s[2221]! }
- public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[2223]! }
- public var ProfilePhoto_OpenInEditor: String { return self._s[2225]! }
- public var WallpaperSearch_ColorPurple: String { return self._s[2226]! }
- public var ChatListFolder_IncludeChatsTitle: String { return self._s[2227]! }
- public var Group_Username_InvalidTooShort: String { return self._s[2228]! }
- public var Location_ProximityNotification_DistanceM: String { return self._s[2229]! }
+ public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[2240]! }
+ public var Channel_DiscussionGroup: String { return self._s[2241]! }
+ public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[2242]! }
+ public var InviteLink_Create_TimeLimit: String { return self._s[2244]! }
+ public var Channel_EditAdmin_PermissionsHeader: String { return self._s[2245]! }
+ public var VoiceOver_MessageContextForward: String { return self._s[2246]! }
+ public var SocksProxySetup_TypeNone: String { return self._s[2247]! }
+ public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[2249]! }
+ public var ProfilePhoto_OpenInEditor: String { return self._s[2251]! }
+ public var WallpaperSearch_ColorPurple: String { return self._s[2252]! }
+ public var ChatListFolder_IncludeChatsTitle: String { return self._s[2253]! }
+ public var Group_Username_InvalidTooShort: String { return self._s[2254]! }
+ public var Location_ProximityNotification_DistanceM: String { return self._s[2255]! }
public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2230]!, self._r[2230]!, [_0, _1, _2])
+ return formatWithArgumentRanges(self._s[2256]!, self._r[2256]!, [_0, _1, _2])
}
- public var Passport_Language_tk: String { return self._s[2231]! }
- public var ConvertToSupergroup_Title: String { return self._s[2232]! }
- public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[2233]! }
- public var Cache_KeepMediaHelp: String { return self._s[2234]! }
- public var Channel_Management_Title: String { return self._s[2235]! }
+ public var Passport_Language_tk: String { return self._s[2257]! }
+ public var ConvertToSupergroup_Title: String { return self._s[2258]! }
+ public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[2259]! }
+ public var Cache_KeepMediaHelp: String { return self._s[2260]! }
+ public var Channel_Management_Title: String { return self._s[2261]! }
public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2236]!, self._r[2236]!, [_1])
+ return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_1])
}
- public var Conversation_ForwardChats: String { return self._s[2237]! }
- public var Passport_Language_bg: String { return self._s[2238]! }
- public var SocksProxySetup_TypeSocks: String { return self._s[2239]! }
- public var Permissions_PrivacyPolicy: String { return self._s[2240]! }
- public var VoiceOver_Chat_YourMusic: String { return self._s[2241]! }
- public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[2242]! }
- public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2243]! }
- public var Conversation_ContextMenuOpenChannel: String { return self._s[2244]! }
- public var Activity_UploadingVideo: String { return self._s[2245]! }
- public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[2247]! }
- public var SocksProxySetup_Credentials: String { return self._s[2249]! }
- public var Preview_SaveGif: String { return self._s[2250]! }
- public var Cache_Photos: String { return self._s[2251]! }
- public var Channel_AdminLogFilter_EventsCalls: String { return self._s[2252]! }
- public var Conversation_ContextMenuCancelEditing: String { return self._s[2253]! }
- public var Contacts_FailedToSendInvitesMessage: String { return self._s[2254]! }
- public var Passport_Language_lt: String { return self._s[2255]! }
- public var Passport_DeleteDocument: String { return self._s[2257]! }
- public var GroupInfo_SetGroupPhotoStop: String { return self._s[2258]! }
+ public var Conversation_ForwardChats: String { return self._s[2263]! }
+ public var Passport_Language_bg: String { return self._s[2264]! }
+ public var SocksProxySetup_TypeSocks: String { return self._s[2265]! }
+ public var Permissions_PrivacyPolicy: String { return self._s[2266]! }
+ public var VoiceOver_Chat_YourMusic: String { return self._s[2267]! }
+ public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[2268]! }
+ public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2269]! }
+ public var Conversation_ContextMenuOpenChannel: String { return self._s[2270]! }
+ public var Activity_UploadingVideo: String { return self._s[2271]! }
+ public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[2273]! }
+ public var SocksProxySetup_Credentials: String { return self._s[2275]! }
+ public var Preview_SaveGif: String { return self._s[2276]! }
+ public var Cache_Photos: String { return self._s[2277]! }
+ public var Channel_AdminLogFilter_EventsCalls: String { return self._s[2278]! }
+ public var Conversation_ContextMenuCancelEditing: String { return self._s[2279]! }
+ public var Contacts_FailedToSendInvitesMessage: String { return self._s[2280]! }
+ public var Passport_Language_lt: String { return self._s[2281]! }
+ public var Passport_DeleteDocument: String { return self._s[2283]! }
+ public var GroupInfo_SetGroupPhotoStop: String { return self._s[2284]! }
public func Location_ProximityNotification_NotifyLong(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2259]!, self._r[2259]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2285]!, self._r[2285]!, [_1, _2])
}
- public var AccessDenied_VideoMessageMicrophone: String { return self._s[2260]! }
+ public var AccessDenied_VideoMessageMicrophone: String { return self._s[2286]! }
public func PeopleNearby_VisibleUntil(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2261]!, self._r[2261]!, [_0])
+ return formatWithArgumentRanges(self._s[2287]!, self._r[2287]!, [_0])
}
- public var AccessDenied_VideoCallCamera: String { return self._s[2262]! }
+ public var AccessDenied_VideoCallCamera: String { return self._s[2288]! }
public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2263]!, self._r[2263]!, [_0])
+ return formatWithArgumentRanges(self._s[2289]!, self._r[2289]!, [_0])
}
- public var PhotoEditor_SharpenTool: String { return self._s[2264]! }
+ public var PhotoEditor_SharpenTool: String { return self._s[2290]! }
public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2265]!, self._r[2265]!, [_1])
+ return formatWithArgumentRanges(self._s[2291]!, self._r[2291]!, [_1])
}
- public var DialogList_Unpin: String { return self._s[2266]! }
- public var Stickers_NoStickersFound: String { return self._s[2267]! }
- public var UserInfo_AddContact: String { return self._s[2269]! }
+ public var DialogList_Unpin: String { return self._s[2292]! }
+ public var Stickers_NoStickersFound: String { return self._s[2293]! }
+ public var UserInfo_AddContact: String { return self._s[2295]! }
public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2271]!, self._r[2271]!, [_0])
+ return formatWithArgumentRanges(self._s[2297]!, self._r[2297]!, [_0])
}
public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2272]!, self._r[2272]!, [_0])
+ return formatWithArgumentRanges(self._s[2298]!, self._r[2298]!, [_0])
}
- public var CallFeedback_VideoReasonDistorted: String { return self._s[2273]! }
- public var Tour_Text2: String { return self._s[2274]! }
+ public var CallFeedback_VideoReasonDistorted: String { return self._s[2299]! }
+ public var Tour_Text2: String { return self._s[2300]! }
public func Conversation_TitleCommentsFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2276]!, self._r[2276]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2302]!, self._r[2302]!, [_1, _2])
}
- public var Paint_Delete: String { return self._s[2278]! }
+ public var InviteLink_DeleteAllRevokedLinksAlert_Text: String { return self._s[2304]! }
+ public var Paint_Delete: String { return self._s[2305]! }
public func Call_VoiceChatInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2279]!, self._r[2279]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2306]!, self._r[2306]!, [_1, _2])
}
- public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2280]! }
+ public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2307]! }
public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2282]!, self._r[2282]!, [_0])
+ return formatWithArgumentRanges(self._s[2309]!, self._r[2309]!, [_0])
}
- public var Privacy_Calls_NeverAllow_Title: String { return self._s[2283]! }
- public var Notification_CallOutgoingShort: String { return self._s[2284]! }
- public var Checkout_PasswordEntry_Title: String { return self._s[2285]! }
- public var Channel_AdminLogFilter_AdminsAll: String { return self._s[2286]! }
- public var Notification_MessageLifetime1m: String { return self._s[2287]! }
- public var BlockedUsers_AddNew: String { return self._s[2289]! }
- public var FastTwoStepSetup_EmailSection: String { return self._s[2290]! }
- public var Settings_SaveEditedPhotos: String { return self._s[2291]! }
- public var GroupInfo_GroupNamePlaceholder: String { return self._s[2292]! }
- public var Channel_AboutItem: String { return self._s[2293]! }
- public var GroupInfo_InviteLink_RevokeLink: String { return self._s[2294]! }
- public var Privacy_Calls_P2PNever: String { return self._s[2296]! }
- public var Passport_Language_uk: String { return self._s[2297]! }
- public var NetworkUsageSettings_Wifi: String { return self._s[2298]! }
- public var Conversation_Moderate_Report: String { return self._s[2299]! }
- public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2300]! }
- public var VoiceOver_Chat_SeenByRecipients: String { return self._s[2301]! }
- public var Permissions_SiriText_v0: String { return self._s[2302]! }
- public var Theme_Colors_Background: String { return self._s[2303]! }
- public var Notification_CallMissed: String { return self._s[2304]! }
- public var Stats_ZoomOut: String { return self._s[2305]! }
- public var Profile_AddToExisting: String { return self._s[2306]! }
- public var Passport_FieldAddressUploadHelp: String { return self._s[2309]! }
- public var VoiceChat_RemovePeerRemove: String { return self._s[2310]! }
- public var Undo_DeletedChannel: String { return self._s[2311]! }
+ public var Privacy_Calls_NeverAllow_Title: String { return self._s[2310]! }
+ public var Notification_CallOutgoingShort: String { return self._s[2311]! }
+ public var Checkout_PasswordEntry_Title: String { return self._s[2312]! }
+ public var Channel_AdminLogFilter_AdminsAll: String { return self._s[2313]! }
+ public var Notification_MessageLifetime1m: String { return self._s[2314]! }
+ public var BlockedUsers_AddNew: String { return self._s[2316]! }
+ public var FastTwoStepSetup_EmailSection: String { return self._s[2317]! }
+ public var Settings_SaveEditedPhotos: String { return self._s[2318]! }
+ public var GroupInfo_GroupNamePlaceholder: String { return self._s[2319]! }
+ public var Channel_AboutItem: String { return self._s[2320]! }
+ public var GroupInfo_InviteLink_RevokeLink: String { return self._s[2321]! }
+ public var Privacy_Calls_P2PNever: String { return self._s[2323]! }
+ public var Passport_Language_uk: String { return self._s[2324]! }
+ public var NetworkUsageSettings_Wifi: String { return self._s[2325]! }
+ public var Conversation_Moderate_Report: String { return self._s[2326]! }
+ public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2327]! }
+ public var VoiceOver_Chat_SeenByRecipients: String { return self._s[2328]! }
+ public var Permissions_SiriText_v0: String { return self._s[2329]! }
+ public var Theme_Colors_Background: String { return self._s[2330]! }
+ public var Notification_CallMissed: String { return self._s[2331]! }
+ public var Stats_ZoomOut: String { return self._s[2332]! }
+ public var Profile_AddToExisting: String { return self._s[2333]! }
+ public var Passport_FieldAddressUploadHelp: String { return self._s[2336]! }
+ public var VoiceChat_RemovePeerRemove: String { return self._s[2337]! }
+ public var Undo_DeletedChannel: String { return self._s[2338]! }
public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2312]!, self._r[2312]!, [_0])
+ return formatWithArgumentRanges(self._s[2339]!, self._r[2339]!, [_0])
}
- public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2313]! }
- public var Map_LiveLocationGroupDescription: String { return self._s[2314]! }
- public var Passport_InfoFAQ_URL: String { return self._s[2315]! }
- public var IntentsSettings_SuggestedChats: String { return self._s[2317]! }
+ public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2340]! }
+ public var Map_LiveLocationGroupDescription: String { return self._s[2341]! }
+ public var Passport_InfoFAQ_URL: String { return self._s[2342]! }
+ public var IntentsSettings_SuggestedChats: String { return self._s[2344]! }
public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2318]!, self._r[2318]!, [_1])
+ return formatWithArgumentRanges(self._s[2345]!, self._r[2345]!, [_1])
}
- public var State_connecting: String { return self._s[2319]! }
- public var Passport_Identity_Country: String { return self._s[2320]! }
- public var Passport_PasswordDescription: String { return self._s[2321]! }
- public var ChatList_PsaLabel_covid: String { return self._s[2322]! }
+ public var State_connecting: String { return self._s[2346]! }
+ public var Passport_Identity_Country: String { return self._s[2347]! }
+ public var Passport_PasswordDescription: String { return self._s[2348]! }
+ public var ChatList_PsaLabel_covid: String { return self._s[2349]! }
public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2323]!, self._r[2323]!, [_1])
+ return formatWithArgumentRanges(self._s[2350]!, self._r[2350]!, [_1])
}
- public var Contacts_AddPeopleNearby: String { return self._s[2324]! }
- public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[2325]! }
- public var ClearCache_Description: String { return self._s[2326]! }
- public var Localization_LanguageName: String { return self._s[2327]! }
+ public var Contacts_AddPeopleNearby: String { return self._s[2351]! }
+ public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[2352]! }
+ public var ClearCache_Description: String { return self._s[2353]! }
+ public var Localization_LanguageName: String { return self._s[2354]! }
public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2328]!, self._r[2328]!, [_0])
+ return formatWithArgumentRanges(self._s[2355]!, self._r[2355]!, [_0])
}
- public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[2329]! }
- public var UserInfo_CreateNewContact: String { return self._s[2330]! }
- public var Channel_Stickers_NotFound: String { return self._s[2332]! }
- public var Watch_Message_Poll: String { return self._s[2333]! }
- public var Privacy_Forwards_WhoCanForward: String { return self._s[2334]! }
+ public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[2356]! }
+ public var UserInfo_CreateNewContact: String { return self._s[2357]! }
+ public var Channel_Stickers_NotFound: String { return self._s[2359]! }
+ public var Watch_Message_Poll: String { return self._s[2360]! }
+ public var Privacy_Forwards_WhoCanForward: String { return self._s[2361]! }
public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2335]!, self._r[2335]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[2362]!, self._r[2362]!, [_0, _1])
}
- public var Login_InfoDeletePhoto: String { return self._s[2336]! }
- public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[2337]! }
- public var InstantPage_FeedbackButton: String { return self._s[2338]! }
- public var Appearance_PreviewReplyText: String { return self._s[2339]! }
- public var Passport_FieldPhoneHelp: String { return self._s[2340]! }
- public var Group_ErrorAddTooMuchBots: String { return self._s[2341]! }
- public var Media_SendingOptionsTooltip: String { return self._s[2342]! }
- public var ScheduledMessages_ScheduledOnline: String { return self._s[2343]! }
- public var Notifications_Badge: String { return self._s[2344]! }
- public var VoiceOver_Chat_VideoMessage: String { return self._s[2345]! }
- public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2346]! }
+ public var Login_InfoDeletePhoto: String { return self._s[2363]! }
+ public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[2364]! }
+ public var InstantPage_FeedbackButton: String { return self._s[2365]! }
+ public var Appearance_PreviewReplyText: String { return self._s[2366]! }
+ public var Passport_FieldPhoneHelp: String { return self._s[2367]! }
+ public var Group_ErrorAddTooMuchBots: String { return self._s[2368]! }
+ public var Media_SendingOptionsTooltip: String { return self._s[2369]! }
+ public var ScheduledMessages_ScheduledOnline: String { return self._s[2370]! }
+ public var Notifications_Badge: String { return self._s[2371]! }
+ public var VoiceOver_Chat_VideoMessage: String { return self._s[2372]! }
+ public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2373]! }
public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2348]!, self._r[2348]!, [_0])
+ return formatWithArgumentRanges(self._s[2375]!, self._r[2375]!, [_0])
}
- public var Passport_InfoLearnMore: String { return self._s[2349]! }
- public var EnterPasscode_EnterTitle: String { return self._s[2350]! }
- public var Appearance_EditTheme: String { return self._s[2351]! }
- public var EditTheme_Expand_BottomInfo: String { return self._s[2352]! }
- public var Stats_FollowersTitle: String { return self._s[2353]! }
- public var Passport_Identity_SurnamePlaceholder: String { return self._s[2354]! }
- public var Channel_Subscribers_Title: String { return self._s[2355]! }
- public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2356]! }
- public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[2357]! }
- public var EditTheme_Create_Preview_IncomingText: String { return self._s[2358]! }
- public var Conversation_AddToReadingList: String { return self._s[2359]! }
+ public var Passport_InfoLearnMore: String { return self._s[2376]! }
+ public var EnterPasscode_EnterTitle: String { return self._s[2377]! }
+ public var Appearance_EditTheme: String { return self._s[2378]! }
+ public var EditTheme_Expand_BottomInfo: String { return self._s[2379]! }
+ public var Stats_FollowersTitle: String { return self._s[2380]! }
+ public var Passport_Identity_SurnamePlaceholder: String { return self._s[2381]! }
+ public var Channel_Subscribers_Title: String { return self._s[2382]! }
+ public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2383]! }
+ public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[2384]! }
+ public var EditTheme_Create_Preview_IncomingText: String { return self._s[2385]! }
+ public var Conversation_AddToReadingList: String { return self._s[2386]! }
public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2360]!, self._r[2360]!, [_0])
+ return formatWithArgumentRanges(self._s[2387]!, self._r[2387]!, [_0])
}
- public var Group_AdminLog_EmptyText: String { return self._s[2361]! }
- public var Passport_Identity_EditInternalPassport: String { return self._s[2362]! }
- public var Watch_Location_Current: String { return self._s[2363]! }
- public var PrivacyPolicy_Title: String { return self._s[2364]! }
- public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2371]! }
- public var Channel_TypeSetup_Title: String { return self._s[2374]! }
- public var Appearance_PreviewReplyAuthor: String { return self._s[2375]! }
- public var Passport_Language_ja: String { return self._s[2376]! }
- public var ReportPeer_ReasonSpam: String { return self._s[2377]! }
- public var Widget_GalleryDescription: String { return self._s[2378]! }
- public var Privacy_PaymentsClearInfoHelp: String { return self._s[2379]! }
- public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[2381]! }
- public var Channel_AdminLog_ChangeInfo: String { return self._s[2382]! }
- public var ChatListFolder_NameNonContacts: String { return self._s[2383]! }
- public var Call_Audio: String { return self._s[2384]! }
- public var PhotoEditor_CurvesGreen: String { return self._s[2385]! }
- public var ChatList_Search_NoResultsFitlerFiles: String { return self._s[2386]! }
- public var Settings_PrivacySettings: String { return self._s[2387]! }
- public var Stats_Followers: String { return self._s[2388]! }
- public var Notifications_AddExceptionTitle: String { return self._s[2389]! }
- public var TwoFactorSetup_Password_Title: String { return self._s[2390]! }
- public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2391]! }
- public var OldChannels_NoticeText: String { return self._s[2392]! }
- public var Conversation_SavedMessages: String { return self._s[2393]! }
+ public var Group_AdminLog_EmptyText: String { return self._s[2388]! }
+ public var Passport_Identity_EditInternalPassport: String { return self._s[2389]! }
+ public var Watch_Location_Current: String { return self._s[2390]! }
+ public var PrivacyPolicy_Title: String { return self._s[2391]! }
+ public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2398]! }
+ public var Channel_TypeSetup_Title: String { return self._s[2402]! }
+ public var Appearance_PreviewReplyAuthor: String { return self._s[2403]! }
+ public var Passport_Language_ja: String { return self._s[2404]! }
+ public var ReportPeer_ReasonSpam: String { return self._s[2405]! }
+ public var Widget_GalleryDescription: String { return self._s[2406]! }
+ public var Privacy_PaymentsClearInfoHelp: String { return self._s[2407]! }
+ public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[2409]! }
+ public var Channel_AdminLog_ChangeInfo: String { return self._s[2410]! }
+ public var ChatListFolder_NameNonContacts: String { return self._s[2411]! }
+ public var Call_Audio: String { return self._s[2412]! }
+ public var PhotoEditor_CurvesGreen: String { return self._s[2413]! }
+ public var ChatList_Search_NoResultsFitlerFiles: String { return self._s[2414]! }
+ public var Settings_PrivacySettings: String { return self._s[2415]! }
+ public var InviteLink_UsageLimitReached: String { return self._s[2416]! }
+ public var Stats_Followers: String { return self._s[2417]! }
+ public var Notifications_AddExceptionTitle: String { return self._s[2418]! }
+ public var TwoFactorSetup_Password_Title: String { return self._s[2419]! }
+ public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2420]! }
+ public var OldChannels_NoticeText: String { return self._s[2421]! }
+ public var Conversation_SavedMessages: String { return self._s[2422]! }
public func Conversation_PeerNearbyTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2395]!, self._r[2395]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2424]!, self._r[2424]!, [_1, _2])
}
- public var Passport_Address_TypeResidentialAddress: String { return self._s[2396]! }
- public var Appearance_ThemeNightBlue: String { return self._s[2397]! }
- public var Notification_ChannelInviterSelf: String { return self._s[2398]! }
- public var Watch_UserInfo_Service: String { return self._s[2400]! }
- public var ChatList_Context_Back: String { return self._s[2401]! }
- public var Passport_Email_Title: String { return self._s[2402]! }
- public var Stats_GroupTopAdmin_Promote: String { return self._s[2403]! }
+ public var Passport_Address_TypeResidentialAddress: String { return self._s[2425]! }
+ public var Appearance_ThemeNightBlue: String { return self._s[2426]! }
+ public var Notification_ChannelInviterSelf: String { return self._s[2427]! }
+ public var InviteLink_Create_TimeLimitExpiryDateNever: String { return self._s[2429]! }
+ public var Watch_UserInfo_Service: String { return self._s[2430]! }
+ public var ChatList_Context_Back: String { return self._s[2431]! }
+ public var Passport_Email_Title: String { return self._s[2432]! }
+ public var Stats_GroupTopAdmin_Promote: String { return self._s[2433]! }
public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2404]!, self._r[2404]!, [_1])
+ return formatWithArgumentRanges(self._s[2434]!, self._r[2434]!, [_1])
}
- public var Conversation_UnsupportedMedia: String { return self._s[2405]! }
- public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2406]! }
- public var Privacy_TopPeersHelp: String { return self._s[2408]! }
- public var Privacy_Forwards_AlwaysLink: String { return self._s[2409]! }
- public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2410]! }
- public var Permissions_NotificationsTitle_v0: String { return self._s[2411]! }
+ public var Conversation_UnsupportedMedia: String { return self._s[2435]! }
+ public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2436]! }
+ public var Privacy_TopPeersHelp: String { return self._s[2438]! }
+ public var Privacy_Forwards_AlwaysLink: String { return self._s[2439]! }
+ public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2440]! }
+ public var Permissions_NotificationsTitle_v0: String { return self._s[2441]! }
public func Location_ProximityNotification_AlreadyClose(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2412]!, self._r[2412]!, [_0])
+ return formatWithArgumentRanges(self._s[2442]!, self._r[2442]!, [_0])
}
- public var Notification_PassportValueProofOfAddress: String { return self._s[2413]! }
- public var Map_Map: String { return self._s[2414]! }
- public var WallpaperSearch_ColorBlue: String { return self._s[2415]! }
- public var Privacy_Calls_CustomShareHelp: String { return self._s[2416]! }
- public var PhotoEditor_BlurToolRadial: String { return self._s[2417]! }
- public var ChatList_Search_FilterMusic: String { return self._s[2418]! }
- public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[2419]! }
- public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2420]! }
- public var Settings_LogoutConfirmationTitle: String { return self._s[2422]! }
+ public var Notification_PassportValueProofOfAddress: String { return self._s[2443]! }
+ public var Map_Map: String { return self._s[2444]! }
+ public var WallpaperSearch_ColorBlue: String { return self._s[2445]! }
+ public var Privacy_Calls_CustomShareHelp: String { return self._s[2446]! }
+ public var PhotoEditor_BlurToolRadial: String { return self._s[2447]! }
+ public var ChatList_Search_FilterMusic: String { return self._s[2448]! }
+ public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[2449]! }
+ public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2450]! }
+ public var Settings_LogoutConfirmationTitle: String { return self._s[2452]! }
public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2423]!, self._r[2423]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_1, _2])
}
public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2424]!, self._r[2424]!, [_0])
+ return formatWithArgumentRanges(self._s[2454]!, self._r[2454]!, [_0])
}
- public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2425]! }
- public var Group_Username_CreatePublicLinkHelp: String { return self._s[2426]! }
- public var GroupInfo_Location: String { return self._s[2429]! }
- public var Passport_Language_ka: String { return self._s[2430]! }
+ public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2455]! }
+ public var Group_Username_CreatePublicLinkHelp: String { return self._s[2456]! }
+ public var GroupInfo_Location: String { return self._s[2459]! }
+ public var Passport_Language_ka: String { return self._s[2460]! }
public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2431]!, self._r[2431]!, [_0])
+ return formatWithArgumentRanges(self._s[2461]!, self._r[2461]!, [_0])
}
- public var Conversation_ContextMenuOpenChannelProfile: String { return self._s[2432]! }
- public var ScheduledMessages_ClearAllConfirmation: String { return self._s[2435]! }
- public var DialogList_SearchSectionRecent: String { return self._s[2436]! }
- public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[2437]! }
- public var Conversation_Timer_Send: String { return self._s[2438]! }
- public var ChatState_Updating: String { return self._s[2440]! }
- public var ChannelMembers_WhoCanAddMembers: String { return self._s[2441]! }
- public var ChannelInfo_DeleteGroup: String { return self._s[2442]! }
- public var TwoStepAuth_RecoveryFailed: String { return self._s[2443]! }
- public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2444]! }
- public var ChatList_Search_NoResults: String { return self._s[2445]! }
- public var ChatListFolderSettings_AddRecommended: String { return self._s[2447]! }
- public var ChangePhoneNumberCode_Called: String { return self._s[2448]! }
- public var PeerInfo_GroupAboutItem: String { return self._s[2449]! }
+ public var Conversation_ContextMenuOpenChannelProfile: String { return self._s[2462]! }
+ public var ScheduledMessages_ClearAllConfirmation: String { return self._s[2465]! }
+ public var DialogList_SearchSectionRecent: String { return self._s[2466]! }
+ public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[2467]! }
+ public var Conversation_Timer_Send: String { return self._s[2468]! }
+ public var ChatState_Updating: String { return self._s[2470]! }
+ public var ChannelMembers_WhoCanAddMembers: String { return self._s[2471]! }
+ public var ChannelInfo_DeleteGroup: String { return self._s[2472]! }
+ public var TwoStepAuth_RecoveryFailed: String { return self._s[2473]! }
+ public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2474]! }
+ public var InviteLink_Create_TimeLimitExpiryTime: String { return self._s[2475]! }
+ public var ChatList_Search_NoResults: String { return self._s[2476]! }
+ public var ChatListFolderSettings_AddRecommended: String { return self._s[2478]! }
+ public var ChangePhoneNumberCode_Called: String { return self._s[2479]! }
+ public var PeerInfo_GroupAboutItem: String { return self._s[2480]! }
public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_0])
+ return formatWithArgumentRanges(self._s[2482]!, self._r[2482]!, [_0])
}
- public var PrivacySettings_AuthSessions: String { return self._s[2452]! }
- public var Passport_Address_Postcode: String { return self._s[2453]! }
- public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2454]! }
- public var Passport_Address_Street2Placeholder: String { return self._s[2455]! }
- public var Group_Location_Title: String { return self._s[2456]! }
- public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[2457]! }
- public var PeopleNearby_UsersEmpty: String { return self._s[2458]! }
- public var SettingsSearch_Synonyms_Data_Title: String { return self._s[2460]! }
+ public var PrivacySettings_AuthSessions: String { return self._s[2483]! }
+ public var Passport_Address_Postcode: String { return self._s[2484]! }
+ public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2485]! }
+ public var Passport_Address_Street2Placeholder: String { return self._s[2486]! }
+ public var Group_Location_Title: String { return self._s[2487]! }
+ public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[2488]! }
+ public var PeopleNearby_UsersEmpty: String { return self._s[2489]! }
+ public var SettingsSearch_Synonyms_Data_Title: String { return self._s[2491]! }
public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2462]!, self._r[2462]!, [_0])
+ return formatWithArgumentRanges(self._s[2493]!, self._r[2493]!, [_0])
}
- public var Proxy_TooltipUnavailable: String { return self._s[2463]! }
- public var Map_Search: String { return self._s[2464]! }
- public var AutoDownloadSettings_TypeContacts: String { return self._s[2465]! }
- public var Conversation_SearchByName_Prefix: String { return self._s[2466]! }
+ public var Proxy_TooltipUnavailable: String { return self._s[2494]! }
+ public var Map_Search: String { return self._s[2495]! }
+ public var AutoDownloadSettings_TypeContacts: String { return self._s[2496]! }
+ public var Conversation_SearchByName_Prefix: String { return self._s[2497]! }
public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2467]!, self._r[2467]!, [_0])
+ return formatWithArgumentRanges(self._s[2498]!, self._r[2498]!, [_0])
}
- public var TwoStepAuth_EmailAddSuccess: String { return self._s[2468]! }
- public var ProfilePhoto_MainPhoto: String { return self._s[2469]! }
- public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2470]! }
- public var SharedMedia_EmptyMusicText: String { return self._s[2471]! }
- public var ChatSettings_AutoDownloadPhotos: String { return self._s[2472]! }
- public var NetworkUsageSettings_BytesReceived: String { return self._s[2473]! }
- public var Channel_AdminLog_EmptyText: String { return self._s[2474]! }
- public var Channel_BanUser_PermissionSendMessages: String { return self._s[2475]! }
- public var Undo_ChatDeletedForBothSides: String { return self._s[2476]! }
- public var Notifications_GroupNotifications: String { return self._s[2477]! }
- public var AccessDenied_SaveMedia: String { return self._s[2478]! }
- public var GroupInfo_LabelOwner: String { return self._s[2479]! }
- public var Passport_Language_id: String { return self._s[2480]! }
- public var ChatSettings_AutoDownloadTitle: String { return self._s[2481]! }
- public var Conversation_UnpinMessageAlert: String { return self._s[2482]! }
+ public var TwoStepAuth_EmailAddSuccess: String { return self._s[2499]! }
+ public var ProfilePhoto_MainPhoto: String { return self._s[2500]! }
+ public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2501]! }
+ public var SharedMedia_EmptyMusicText: String { return self._s[2502]! }
+ public var ChatSettings_AutoDownloadPhotos: String { return self._s[2503]! }
+ public var NetworkUsageSettings_BytesReceived: String { return self._s[2504]! }
+ public var Channel_AdminLog_EmptyText: String { return self._s[2505]! }
+ public var Channel_BanUser_PermissionSendMessages: String { return self._s[2506]! }
+ public var Undo_ChatDeletedForBothSides: String { return self._s[2507]! }
+ public var Notifications_GroupNotifications: String { return self._s[2508]! }
+ public var AccessDenied_SaveMedia: String { return self._s[2509]! }
+ public var InviteLink_Create_Revoke: String { return self._s[2510]! }
+ public var GroupInfo_LabelOwner: String { return self._s[2511]! }
+ public var Passport_Language_id: String { return self._s[2512]! }
+ public var ChatSettings_AutoDownloadTitle: String { return self._s[2513]! }
+ public var Conversation_UnpinMessageAlert: String { return self._s[2514]! }
public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2483]!, self._r[2483]!, [_0])
- }
- public func Call_RemoteVideoPaused(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2484]!, self._r[2484]!, [_0])
- }
- public var TwoFactorSetup_Done_Text: String { return self._s[2485]! }
- public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2486]!, self._r[2486]!, [_0])
- }
- public var NetworkUsageSettings_BytesSent: String { return self._s[2487]! }
- public var OwnershipTransfer_Transfer: String { return self._s[2488]! }
- public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2489]!, self._r[2489]!, [_0])
- }
- public var Passport_Language_pt: String { return self._s[2490]! }
- public var PrivacySettings_WebSessions: String { return self._s[2491]! }
- public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[2493]! }
- public var TwoFactorSetup_Hint_Title: String { return self._s[2494]! }
- public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2495]!, self._r[2495]!, [_0])
- }
- public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2496]! }
- public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2497]! }
- public var AutoNightTheme_Scheduled: String { return self._s[2498]! }
- public var CreatePoll_ExplanationHeader: String { return self._s[2499]! }
- public var Calls_TabTitle: String { return self._s[2500]! }
- public var VoiceChat_RecordingInProgress: String { return self._s[2501]! }
- public var ChatList_UndoArchiveHiddenText: String { return self._s[2502]! }
- public var Notification_VideoCallCanceled: String { return self._s[2503]! }
- public var Login_CodeSentInternal: String { return self._s[2504]! }
- public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[2505]! }
- public var Call_RecordingDisabledMessage: String { return self._s[2507]! }
- public func VoiceChat_RemovedPeerText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2508]!, self._r[2508]!, [_0])
- }
- public var AutoDownloadSettings_TypeChannels: String { return self._s[2510]! }
- public var Channel_Info_Stickers: String { return self._s[2511]! }
- public var Passport_DeleteAddressConfirmation: String { return self._s[2512]! }
- public func Conversation_PeerNearbyDistance(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2513]!, self._r[2513]!, [_1, _2])
- }
- public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[2514]! }
- public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2515]!, self._r[2515]!, [_0])
}
- public var Passport_DiscardMessageTitle: String { return self._s[2516]! }
- public var Call_VoiceOver_VideoCallIncoming: String { return self._s[2517]! }
- public var Localization_LanguageOther: String { return self._s[2518]! }
- public var Conversation_EncryptionCanceled: String { return self._s[2519]! }
- public var ChatSettings_AutomaticPhotoDownload: String { return self._s[2520]! }
+ public func Call_RemoteVideoPaused(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2516]!, self._r[2516]!, [_0])
+ }
+ public var TwoFactorSetup_Done_Text: String { return self._s[2517]! }
+ public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2518]!, self._r[2518]!, [_0])
+ }
+ public var NetworkUsageSettings_BytesSent: String { return self._s[2519]! }
+ public var OwnershipTransfer_Transfer: String { return self._s[2520]! }
+ public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2521]!, self._r[2521]!, [_0])
+ }
+ public var Passport_Language_pt: String { return self._s[2522]! }
+ public var PrivacySettings_WebSessions: String { return self._s[2523]! }
+ public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[2525]! }
+ public var TwoFactorSetup_Hint_Title: String { return self._s[2526]! }
+ public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2527]!, self._r[2527]!, [_0])
+ }
+ public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2528]! }
+ public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2529]! }
+ public var AutoNightTheme_Scheduled: String { return self._s[2530]! }
+ public var CreatePoll_ExplanationHeader: String { return self._s[2531]! }
+ public var Calls_TabTitle: String { return self._s[2532]! }
+ public var VoiceChat_RecordingInProgress: String { return self._s[2533]! }
+ public var ChatList_UndoArchiveHiddenText: String { return self._s[2534]! }
+ public var Notification_VideoCallCanceled: String { return self._s[2535]! }
+ public var Login_CodeSentInternal: String { return self._s[2536]! }
+ public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[2537]! }
+ public var Call_RecordingDisabledMessage: String { return self._s[2539]! }
+ public func VoiceChat_RemovedPeerText(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2540]!, self._r[2540]!, [_0])
+ }
+ public var AutoDownloadSettings_TypeChannels: String { return self._s[2542]! }
+ public var Channel_Info_Stickers: String { return self._s[2543]! }
+ public var Passport_DeleteAddressConfirmation: String { return self._s[2544]! }
+ public func Conversation_PeerNearbyDistance(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2545]!, self._r[2545]!, [_1, _2])
+ }
+ public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[2546]! }
+ public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[2547]!, self._r[2547]!, [_0])
+ }
+ public var Passport_DiscardMessageTitle: String { return self._s[2548]! }
+ public var Call_VoiceOver_VideoCallIncoming: String { return self._s[2549]! }
+ public var Localization_LanguageOther: String { return self._s[2550]! }
+ public var Conversation_EncryptionCanceled: String { return self._s[2551]! }
+ public var ChatSettings_AutomaticPhotoDownload: String { return self._s[2552]! }
public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2522]!, self._r[2522]!, [_0])
+ return formatWithArgumentRanges(self._s[2554]!, self._r[2554]!, [_0])
}
- public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2524]! }
- public var SocksProxySetup_SavedProxies: String { return self._s[2525]! }
+ public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2556]! }
+ public var SocksProxySetup_SavedProxies: String { return self._s[2557]! }
+ public var InviteLink_Create_UsersLimitNumberOfUsers: String { return self._s[2558]! }
public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2526]!, self._r[2526]!, [_1])
+ return formatWithArgumentRanges(self._s[2559]!, self._r[2559]!, [_1])
}
- public var Conversation_ScamWarning: String { return self._s[2528]! }
- public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[2529]! }
- public var LocalGroup_Title: String { return self._s[2530]! }
- public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[2532]! }
- public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[2533]! }
- public var Login_PhoneFloodError: String { return self._s[2534]! }
- public var Conversation_PinMessageAlert_PinAndNotifyMembers: String { return self._s[2535]! }
- public var Username_InvalidTaken: String { return self._s[2537]! }
- public var SocksProxySetup_AddProxy: String { return self._s[2539]! }
- public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[2540]! }
- public var MediaPicker_UngroupDescription: String { return self._s[2541]! }
- public var Login_CodeExpired: String { return self._s[2542]! }
- public var Localization_ChooseLanguage: String { return self._s[2543]! }
- public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[2544]! }
+ public var Conversation_ScamWarning: String { return self._s[2561]! }
+ public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[2562]! }
+ public var LocalGroup_Title: String { return self._s[2563]! }
+ public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[2565]! }
+ public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[2566]! }
+ public var Login_PhoneFloodError: String { return self._s[2567]! }
+ public var Conversation_PinMessageAlert_PinAndNotifyMembers: String { return self._s[2568]! }
+ public var Username_InvalidTaken: String { return self._s[2570]! }
+ public var SocksProxySetup_AddProxy: String { return self._s[2572]! }
+ public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[2573]! }
+ public var MediaPicker_UngroupDescription: String { return self._s[2574]! }
+ public var Login_CodeExpired: String { return self._s[2575]! }
+ public var Localization_ChooseLanguage: String { return self._s[2576]! }
+ public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[2577]! }
public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2545]!, self._r[2545]!, [_0])
+ return formatWithArgumentRanges(self._s[2578]!, self._r[2578]!, [_0])
}
public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2546]!, self._r[2546]!, [_0])
+ return formatWithArgumentRanges(self._s[2579]!, self._r[2579]!, [_0])
}
- public var ReportPeer_ReasonOther_Title: String { return self._s[2548]! }
- public var Conversation_ScheduleMessage_Title: String { return self._s[2549]! }
+ public var ReportPeer_ReasonOther_Title: String { return self._s[2581]! }
+ public var Conversation_ScheduleMessage_Title: String { return self._s[2582]! }
public func VoiceChat_UserInvited(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2550]!, self._r[2550]!, [_0])
+ return formatWithArgumentRanges(self._s[2583]!, self._r[2583]!, [_0])
}
- public var PeerInfo_ButtonDiscuss: String { return self._s[2551]! }
- public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[2552]! }
- public var Call_StatusNoAnswer: String { return self._s[2553]! }
- public var ScheduledMessages_DeleteMany: String { return self._s[2555]! }
- public var Channel_DiscussionGroupInfo: String { return self._s[2556]! }
- public var Conversation_UnarchiveDone: String { return self._s[2557]! }
- public var LogoutOptions_AddAccountText: String { return self._s[2558]! }
- public var Message_PinnedContactMessage: String { return self._s[2559]! }
+ public var PeerInfo_ButtonDiscuss: String { return self._s[2584]! }
+ public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[2585]! }
+ public var Call_StatusNoAnswer: String { return self._s[2586]! }
+ public var ScheduledMessages_DeleteMany: String { return self._s[2588]! }
+ public var Channel_DiscussionGroupInfo: String { return self._s[2589]! }
+ public var Conversation_UnarchiveDone: String { return self._s[2590]! }
+ public var LogoutOptions_AddAccountText: String { return self._s[2591]! }
+ public var Message_PinnedContactMessage: String { return self._s[2592]! }
public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2561]!, self._r[2561]!, [_0])
+ return formatWithArgumentRanges(self._s[2594]!, self._r[2594]!, [_0])
}
- public var Stats_GroupLanguagesTitle: String { return self._s[2562]! }
- public var Passport_FieldAddressHelp: String { return self._s[2563]! }
+ public var Stats_GroupLanguagesTitle: String { return self._s[2595]! }
+ public var Passport_FieldAddressHelp: String { return self._s[2596]! }
public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2564]!, self._r[2564]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2597]!, self._r[2597]!, [_1, _2])
}
- public var ChatSettings_OpenLinksIn: String { return self._s[2566]! }
- public var TwoFactorSetup_Hint_SkipAction: String { return self._s[2567]! }
- public var Message_Photo: String { return self._s[2568]! }
- public var Media_LimitedAccessManage: String { return self._s[2570]! }
- public var MediaPicker_AddCaption: String { return self._s[2571]! }
- public var LogoutOptions_Title: String { return self._s[2572]! }
+ public var ChatSettings_OpenLinksIn: String { return self._s[2599]! }
+ public var TwoFactorSetup_Hint_SkipAction: String { return self._s[2600]! }
+ public var Message_Photo: String { return self._s[2601]! }
+ public var Media_LimitedAccessManage: String { return self._s[2603]! }
+ public var MediaPicker_AddCaption: String { return self._s[2604]! }
+ public var LogoutOptions_Title: String { return self._s[2605]! }
public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2573]!, self._r[2573]!, [_1])
+ return formatWithArgumentRanges(self._s[2606]!, self._r[2606]!, [_1])
}
- public var Conversation_StatusKickedFromGroup: String { return self._s[2574]! }
- public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[2575]! }
- public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2576]! }
- public var Channel_AdminLogFilter_Title: String { return self._s[2577]! }
- public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[2578]! }
- public var Compose_GroupTokenListPlaceholder: String { return self._s[2579]! }
- public var Notifications_MessageNotificationsExceptions: String { return self._s[2580]! }
- public var ChannelIntro_Title: String { return self._s[2581]! }
- public var Stats_Message_Views: String { return self._s[2582]! }
- public var Stickers_Install: String { return self._s[2583]! }
+ public var Conversation_StatusKickedFromGroup: String { return self._s[2607]! }
+ public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[2608]! }
+ public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2609]! }
+ public var Channel_AdminLogFilter_Title: String { return self._s[2610]! }
+ public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[2611]! }
+ public var Compose_GroupTokenListPlaceholder: String { return self._s[2612]! }
+ public var Notifications_MessageNotificationsExceptions: String { return self._s[2613]! }
+ public var ChannelIntro_Title: String { return self._s[2614]! }
+ public var Stats_Message_Views: String { return self._s[2615]! }
+ public var Stickers_Install: String { return self._s[2616]! }
public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2584]!, self._r[2584]!, [_0])
+ return formatWithArgumentRanges(self._s[2617]!, self._r[2617]!, [_0])
}
- public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[2585]! }
- public var Conversation_SwipeToReplyHintTitle: String { return self._s[2587]! }
- public var Settings_Username: String { return self._s[2590]! }
- public var FastTwoStepSetup_Title: String { return self._s[2591]! }
- public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2592]! }
- public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[2593]! }
- public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2594]! }
- public var CallFeedback_ReasonEcho: String { return self._s[2595]! }
+ public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[2618]! }
+ public var Conversation_SwipeToReplyHintTitle: String { return self._s[2620]! }
+ public var Settings_Username: String { return self._s[2623]! }
+ public var FastTwoStepSetup_Title: String { return self._s[2624]! }
+ public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2625]! }
+ public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[2626]! }
+ public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2627]! }
+ public var CallFeedback_ReasonEcho: String { return self._s[2628]! }
public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2596]!, self._r[2596]!, [_0])
+ return formatWithArgumentRanges(self._s[2629]!, self._r[2629]!, [_0])
}
- public var Conversation_OpenBotLinkTitle: String { return self._s[2597]! }
- public var SocksProxySetup_Title: String { return self._s[2598]! }
- public var CallFeedback_Success: String { return self._s[2599]! }
- public var WallpaperPreview_SwipeTopText: String { return self._s[2601]! }
- public var InstantPage_AutoNightTheme: String { return self._s[2603]! }
- public var Watch_Conversation_Reply: String { return self._s[2604]! }
- public var VoiceChat_Share: String { return self._s[2606]! }
- public var Chat_PanelUnpinAllMessages: String { return self._s[2607]! }
- public var WallpaperPreview_Pattern: String { return self._s[2608]! }
- public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[2609]! }
+ public var Conversation_OpenBotLinkTitle: String { return self._s[2630]! }
+ public var SocksProxySetup_Title: String { return self._s[2631]! }
+ public var CallFeedback_Success: String { return self._s[2632]! }
+ public var WallpaperPreview_SwipeTopText: String { return self._s[2634]! }
+ public var InstantPage_AutoNightTheme: String { return self._s[2636]! }
+ public var Watch_Conversation_Reply: String { return self._s[2637]! }
+ public var VoiceChat_Share: String { return self._s[2639]! }
+ public var Chat_PanelUnpinAllMessages: String { return self._s[2640]! }
+ public var WallpaperPreview_Pattern: String { return self._s[2641]! }
+ public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[2642]! }
public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2610]!, self._r[2610]!, [_0])
+ return formatWithArgumentRanges(self._s[2643]!, self._r[2643]!, [_0])
}
- public var AutoDownloadSettings_TypeGroupChats: String { return self._s[2611]! }
- public var DialogList_SavedMessagesTooltip: String { return self._s[2613]! }
- public var Update_Title: String { return self._s[2614]! }
- public var Conversation_ShareMyPhoneNumber: String { return self._s[2615]! }
- public var WallpaperPreview_CropTopText: String { return self._s[2617]! }
- public var Channel_EditMessageErrorGeneric: String { return self._s[2618]! }
- public var AccessDenied_LocationAlwaysDenied: String { return self._s[2619]! }
- public var ChatListFolder_DiscardCancel: String { return self._s[2620]! }
- public var Message_PinnedPhotoMessage: String { return self._s[2621]! }
- public var Appearance_ThemeDayClassic: String { return self._s[2622]! }
- public var SocksProxySetup_ProxySocks5: String { return self._s[2623]! }
- public var AccessDenied_Wallpapers: String { return self._s[2629]! }
+ public var AutoDownloadSettings_TypeGroupChats: String { return self._s[2644]! }
+ public var DialogList_SavedMessagesTooltip: String { return self._s[2646]! }
+ public var Update_Title: String { return self._s[2647]! }
+ public var Conversation_ShareMyPhoneNumber: String { return self._s[2648]! }
+ public var WallpaperPreview_CropTopText: String { return self._s[2650]! }
+ public var Channel_EditMessageErrorGeneric: String { return self._s[2651]! }
+ public var AccessDenied_LocationAlwaysDenied: String { return self._s[2652]! }
+ public var ChatListFolder_DiscardCancel: String { return self._s[2653]! }
+ public var Message_PinnedPhotoMessage: String { return self._s[2654]! }
+ public var Appearance_ThemeDayClassic: String { return self._s[2655]! }
+ public var SocksProxySetup_ProxySocks5: String { return self._s[2656]! }
+ public var AccessDenied_Wallpapers: String { return self._s[2662]! }
public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2630]!, self._r[2630]!, [_0])
+ return formatWithArgumentRanges(self._s[2663]!, self._r[2663]!, [_0])
}
- public var Weekday_Sunday: String { return self._s[2631]! }
- public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[2633]! }
- public var PeopleNearby_MakeVisibleDescription: String { return self._s[2634]! }
- public var AccessDenied_LocationDisabled: String { return self._s[2635]! }
- public var Tour_Text3: String { return self._s[2636]! }
- public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2637]! }
+ public var Weekday_Sunday: String { return self._s[2664]! }
+ public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[2666]! }
+ public var PeopleNearby_MakeVisibleDescription: String { return self._s[2667]! }
+ public var AccessDenied_LocationDisabled: String { return self._s[2668]! }
+ public var Tour_Text3: String { return self._s[2669]! }
+ public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2670]! }
public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2638]!, self._r[2638]!, [_0])
+ return formatWithArgumentRanges(self._s[2671]!, self._r[2671]!, [_0])
}
- public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2639]! }
- public var Conversation_ClearCache: String { return self._s[2640]! }
- public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[2641]! }
- public var ChatList_Tabs_AllChats: String { return self._s[2642]! }
- public var DialogList_RecentTitlePeople: String { return self._s[2643]! }
- public var Stickers_AddToFavorites: String { return self._s[2644]! }
- public var ChatList_Context_RemoveFromFolder: String { return self._s[2645]! }
- public var Settings_RemoveVideo: String { return self._s[2646]! }
- public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2647]! }
- public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[2648]! }
- public var VoiceOver_Chat_YourFile: String { return self._s[2649]! }
- public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[2650]! }
- public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[2651]! }
- public var Channel_AdminLog_AddMembers: String { return self._s[2652]! }
- public var Map_SendThisLocation: String { return self._s[2654]! }
- public var TwoStepAuth_EmailSkipAlert: String { return self._s[2656]! }
- public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2657]! }
- public var CloudStorage_Title: String { return self._s[2658]! }
- public var TwoFactorSetup_Password_Action: String { return self._s[2659]! }
- public var TwoStepAuth_ConfirmationText: String { return self._s[2660]! }
- public var Passport_Address_EditTemporaryRegistration: String { return self._s[2662]! }
- public var Undo_LeftGroup: String { return self._s[2663]! }
- public var Conversation_StopLiveLocation: String { return self._s[2664]! }
- public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[2665]! }
- public var Message_PinnedInvoice: String { return self._s[2666]! }
- public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[2667]! }
+ public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2672]! }
+ public var Conversation_ClearCache: String { return self._s[2673]! }
+ public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[2674]! }
+ public var ChatList_Tabs_AllChats: String { return self._s[2675]! }
+ public var DialogList_RecentTitlePeople: String { return self._s[2676]! }
+ public var Stickers_AddToFavorites: String { return self._s[2677]! }
+ public var ChatList_Context_RemoveFromFolder: String { return self._s[2678]! }
+ public var Settings_RemoveVideo: String { return self._s[2679]! }
+ public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2680]! }
+ public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[2681]! }
+ public var VoiceOver_Chat_YourFile: String { return self._s[2682]! }
+ public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[2684]! }
+ public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[2685]! }
+ public var Channel_AdminLog_AddMembers: String { return self._s[2686]! }
+ public var Map_SendThisLocation: String { return self._s[2688]! }
+ public var TwoStepAuth_EmailSkipAlert: String { return self._s[2690]! }
+ public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2691]! }
+ public var CloudStorage_Title: String { return self._s[2692]! }
+ public var TwoFactorSetup_Password_Action: String { return self._s[2693]! }
+ public var TwoStepAuth_ConfirmationText: String { return self._s[2694]! }
+ public var Passport_Address_EditTemporaryRegistration: String { return self._s[2696]! }
+ public var Undo_LeftGroup: String { return self._s[2697]! }
+ public var Conversation_StopLiveLocation: String { return self._s[2698]! }
+ public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[2699]! }
+ public var Message_PinnedInvoice: String { return self._s[2700]! }
+ public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[2701]! }
public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2668]!, self._r[2668]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2702]!, self._r[2702]!, [_1, _2])
}
public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2669]!, self._r[2669]!, [_0])
+ return formatWithArgumentRanges(self._s[2703]!, self._r[2703]!, [_0])
}
- public var Weekday_Tuesday: String { return self._s[2670]! }
- public var ChangePhoneNumberCode_Code: String { return self._s[2671]! }
- public var VoiceOver_Chat_YourMessage: String { return self._s[2672]! }
- public var Calls_CallTabDescription: String { return self._s[2673]! }
- public var SocksProxySetup_UseProxy: String { return self._s[2675]! }
- public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2676]! }
- public var PasscodeSettings_AlphanumericCode: String { return self._s[2677]! }
- public var VoiceOver_Chat_YourVideo: String { return self._s[2678]! }
- public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[2680]! }
- public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2681]! }
- public var Exceptions_AddToExceptions: String { return self._s[2682]! }
- public var UserInfo_Title: String { return self._s[2683]! }
- public var Passport_DeleteDocumentConfirmation: String { return self._s[2685]! }
- public var ChatList_Unmute: String { return self._s[2687]! }
- public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[2688]! }
- public var Stats_GroupTopPostersTitle: String { return self._s[2689]! }
- public var Username_CheckingUsername: String { return self._s[2690]! }
- public var WallpaperColors_SetCustomColor: String { return self._s[2691]! }
- public var Location_ProximityAlertSetTitle: String { return self._s[2695]! }
- public var AuthSessions_AddedDeviceTerminate: String { return self._s[2696]! }
- public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[2697]! }
- public var Settings_ChangePhoneNumber: String { return self._s[2698]! }
- public var PeerInfo_PaneLinks: String { return self._s[2699]! }
- public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2702]! }
- public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[2704]! }
+ public var Weekday_Tuesday: String { return self._s[2704]! }
+ public var ChangePhoneNumberCode_Code: String { return self._s[2705]! }
+ public var VoiceOver_Chat_YourMessage: String { return self._s[2706]! }
+ public var Calls_CallTabDescription: String { return self._s[2707]! }
+ public var SocksProxySetup_UseProxy: String { return self._s[2709]! }
+ public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2710]! }
+ public var PasscodeSettings_AlphanumericCode: String { return self._s[2711]! }
+ public var VoiceOver_Chat_YourVideo: String { return self._s[2712]! }
+ public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[2714]! }
+ public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2715]! }
+ public var Exceptions_AddToExceptions: String { return self._s[2716]! }
+ public var UserInfo_Title: String { return self._s[2717]! }
+ public var Passport_DeleteDocumentConfirmation: String { return self._s[2719]! }
+ public var ChatList_Unmute: String { return self._s[2721]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[2722]! }
+ public var Stats_GroupTopPostersTitle: String { return self._s[2723]! }
+ public var Username_CheckingUsername: String { return self._s[2724]! }
+ public var WallpaperColors_SetCustomColor: String { return self._s[2725]! }
+ public var Location_ProximityAlertSetTitle: String { return self._s[2729]! }
+ public var AuthSessions_AddedDeviceTerminate: String { return self._s[2730]! }
+ public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[2731]! }
+ public var Settings_ChangePhoneNumber: String { return self._s[2732]! }
+ public var PeerInfo_PaneLinks: String { return self._s[2733]! }
+ public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[2736]! }
+ public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[2738]! }
public func PUSH_CHAT_VOICECHAT_INVITE_YOU(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2705]!, self._r[2705]!, [_1])
+ return formatWithArgumentRanges(self._s[2739]!, self._r[2739]!, [_1])
}
- public var LogoutOptions_ChangePhoneNumberText: String { return self._s[2706]! }
- public var VoiceOver_Media_PlaybackPause: String { return self._s[2707]! }
- public var Stats_FollowersBySourceTitle: String { return self._s[2709]! }
+ public var LogoutOptions_ChangePhoneNumberText: String { return self._s[2740]! }
+ public var VoiceOver_Media_PlaybackPause: String { return self._s[2741]! }
+ public var Stats_FollowersBySourceTitle: String { return self._s[2743]! }
public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2710]!, self._r[2710]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[2744]!, self._r[2744]!, [_0, _1])
}
- public var Compose_NewEncryptedChatTitle: String { return self._s[2711]! }
- public var Channel_CommentsGroup_Header: String { return self._s[2713]! }
+ public var Compose_NewEncryptedChatTitle: String { return self._s[2745]! }
+ public var Channel_CommentsGroup_Header: String { return self._s[2747]! }
public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2717]!, self._r[2717]!, [_0])
+ return formatWithArgumentRanges(self._s[2751]!, self._r[2751]!, [_0])
}
public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_1])
+ return formatWithArgumentRanges(self._s[2752]!, self._r[2752]!, [_1])
}
- public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[2720]! }
+ public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[2754]! }
public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2721]!, self._r[2721]!, [_0])
+ return formatWithArgumentRanges(self._s[2755]!, self._r[2755]!, [_0])
}
- public var Conversation_OpenBotLinkOpen: String { return self._s[2722]! }
- public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[2723]! }
- public var PrivacySettings_LastSeen: String { return self._s[2725]! }
- public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[2726]! }
- public var Theme_Colors_Proceed: String { return self._s[2727]! }
- public var UserInfo_ScamBotWarning: String { return self._s[2728]! }
- public var LogoutOptions_LogOut: String { return self._s[2730]! }
- public var Conversation_SendMessage: String { return self._s[2731]! }
- public var Passport_Address_Region: String { return self._s[2733]! }
- public var MediaPicker_CameraRoll: String { return self._s[2735]! }
+ public var Conversation_OpenBotLinkOpen: String { return self._s[2756]! }
+ public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[2757]! }
+ public var PrivacySettings_LastSeen: String { return self._s[2759]! }
+ public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[2760]! }
+ public var Theme_Colors_Proceed: String { return self._s[2761]! }
+ public var UserInfo_ScamBotWarning: String { return self._s[2762]! }
+ public var LogoutOptions_LogOut: String { return self._s[2764]! }
+ public var Conversation_SendMessage: String { return self._s[2765]! }
+ public var Passport_Address_Region: String { return self._s[2767]! }
+ public var MediaPicker_CameraRoll: String { return self._s[2769]! }
public func VoiceOver_Chat_ForwardedFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2737]!, self._r[2737]!, [_0])
+ return formatWithArgumentRanges(self._s[2771]!, self._r[2771]!, [_0])
}
- public var Call_ReportSend: String { return self._s[2739]! }
- public var Month_ShortJune: String { return self._s[2740]! }
- public var AutoDownloadSettings_GroupChats: String { return self._s[2741]! }
+ public var Call_ReportSend: String { return self._s[2773]! }
+ public var Month_ShortJune: String { return self._s[2774]! }
+ public var AutoDownloadSettings_GroupChats: String { return self._s[2775]! }
public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2744]!, self._r[2744]!, [_0])
+ return formatWithArgumentRanges(self._s[2778]!, self._r[2778]!, [_0])
}
- public var TwoStepAuth_DisableSuccess: String { return self._s[2745]! }
- public var Cache_KeepMedia: String { return self._s[2746]! }
+ public var TwoStepAuth_DisableSuccess: String { return self._s[2779]! }
+ public var Cache_KeepMedia: String { return self._s[2780]! }
public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2747]!, self._r[2747]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2781]!, self._r[2781]!, [_1, _2, _3])
}
- public var Appearance_LargeEmoji: String { return self._s[2748]! }
+ public var Appearance_LargeEmoji: String { return self._s[2782]! }
public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2749]!, self._r[2749]!, [_1, _2, _3, _4, _5, _6])
+ return formatWithArgumentRanges(self._s[2783]!, self._r[2783]!, [_1, _2, _3, _4, _5, _6])
}
- public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2750]! }
- public var Call_CameraConfirmationText: String { return self._s[2751]! }
+ public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2784]! }
+ public var Call_CameraConfirmationText: String { return self._s[2785]! }
public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2753]!, self._r[2753]!, [_0])
+ return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_0])
}
- public var VoiceOver_MessageContextReport: String { return self._s[2755]! }
- public var VoiceChat_RemovePeer: String { return self._s[2756]! }
- public var ChatListFolder_ExcludeChatsTitle: String { return self._s[2757]! }
- public var NotificationsSound_Tritone: String { return self._s[2759]! }
- public var Notifications_InAppNotificationsPreview: String { return self._s[2762]! }
- public var Stats_GroupTopAdmin_Actions: String { return self._s[2763]! }
- public var PeerInfo_AddToContacts: String { return self._s[2764]! }
- public var VoiceChat_OpenChat: String { return self._s[2765]! }
- public var AccessDenied_Title: String { return self._s[2766]! }
- public var Tour_Title1: String { return self._s[2767]! }
- public var VoiceOver_AttachMedia: String { return self._s[2768]! }
+ public var VoiceOver_MessageContextReport: String { return self._s[2789]! }
+ public var VoiceChat_RemovePeer: String { return self._s[2790]! }
+ public var ChatListFolder_ExcludeChatsTitle: String { return self._s[2791]! }
+ public var InviteLink_ContextCopy: String { return self._s[2792]! }
+ public var NotificationsSound_Tritone: String { return self._s[2794]! }
+ public var Notifications_InAppNotificationsPreview: String { return self._s[2797]! }
+ public var Stats_GroupTopAdmin_Actions: String { return self._s[2798]! }
+ public var PeerInfo_AddToContacts: String { return self._s[2799]! }
+ public var VoiceChat_OpenChat: String { return self._s[2800]! }
+ public var AccessDenied_Title: String { return self._s[2801]! }
+ public var Tour_Title1: String { return self._s[2802]! }
+ public var VoiceOver_AttachMedia: String { return self._s[2803]! }
public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2770]!, self._r[2770]!, [_0])
+ return formatWithArgumentRanges(self._s[2805]!, self._r[2805]!, [_0])
}
- public var Chat_Gifs_SavedSectionHeader: String { return self._s[2771]! }
- public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2772]! }
+ public var Chat_Gifs_SavedSectionHeader: String { return self._s[2806]! }
+ public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2807]! }
public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2773]!, self._r[2773]!, [_0])
+ return formatWithArgumentRanges(self._s[2808]!, self._r[2808]!, [_0])
}
- public var Channel_AdminLog_MessagePreviousLink: String { return self._s[2774]! }
- public var OldChannels_Title: String { return self._s[2775]! }
- public var LoginPassword_FloodError: String { return self._s[2776]! }
- public var Checkout_ErrorPaymentFailed: String { return self._s[2778]! }
+ public var Channel_AdminLog_MessagePreviousLink: String { return self._s[2809]! }
+ public var OldChannels_Title: String { return self._s[2810]! }
+ public var LoginPassword_FloodError: String { return self._s[2811]! }
+ public var Checkout_ErrorPaymentFailed: String { return self._s[2813]! }
public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2779]!, self._r[2779]!, [_0])
+ return formatWithArgumentRanges(self._s[2814]!, self._r[2814]!, [_0])
}
- public var VoiceOver_Media_PlaybackPlay: String { return self._s[2782]! }
- public var Passport_CorrectErrors: String { return self._s[2784]! }
+ public var VoiceOver_Media_PlaybackPlay: String { return self._s[2817]! }
+ public var Passport_CorrectErrors: String { return self._s[2819]! }
public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2785]!, self._r[2785]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2820]!, self._r[2820]!, [_1, _2])
}
- public var ChatListFolderSettings_Title: String { return self._s[2786]! }
+ public var ChatListFolderSettings_Title: String { return self._s[2821]! }
public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2822]!, self._r[2822]!, [_1, _2])
}
- public var PhotoEditor_HighlightsTool: String { return self._s[2788]! }
- public var Contacts_NotRegisteredSection: String { return self._s[2791]! }
+ public var PhotoEditor_HighlightsTool: String { return self._s[2823]! }
+ public var Contacts_NotRegisteredSection: String { return self._s[2826]! }
public func Call_VoiceChatInProgressCallMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2792]!, self._r[2792]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2827]!, self._r[2827]!, [_1, _2])
}
public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2793]!, self._r[2793]!, [_1])
+ return formatWithArgumentRanges(self._s[2828]!, self._r[2828]!, [_1])
}
- public var User_DeletedAccount: String { return self._s[2794]! }
- public var Conversation_ViewContactDetails: String { return self._s[2795]! }
- public var Conversation_Dice_u1F3B3: String { return self._s[2796]! }
- public var WebSearch_GIFs: String { return self._s[2797]! }
- public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2798]! }
- public var Appearance_PreviewOutgoingText: String { return self._s[2799]! }
- public var Calls_CallTabTitle: String { return self._s[2800]! }
- public var Call_VoiceChatInProgressTitle: String { return self._s[2801]! }
+ public var InviteLink_Create_UsersLimitInfo: String { return self._s[2829]! }
+ public var User_DeletedAccount: String { return self._s[2830]! }
+ public var Conversation_ViewContactDetails: String { return self._s[2831]! }
+ public var Conversation_Dice_u1F3B3: String { return self._s[2832]! }
+ public var WebSearch_GIFs: String { return self._s[2833]! }
+ public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2834]! }
+ public var Appearance_PreviewOutgoingText: String { return self._s[2835]! }
+ public var Calls_CallTabTitle: String { return self._s[2836]! }
+ public var Call_VoiceChatInProgressTitle: String { return self._s[2837]! }
public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2802]!, self._r[2802]!, [_0])
+ return formatWithArgumentRanges(self._s[2838]!, self._r[2838]!, [_0])
}
- public var Channel_Status: String { return self._s[2803]! }
- public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[2805]! }
- public var VoiceOver_Chat_OptionSelected: String { return self._s[2806]! }
- public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2807]! }
+ public var Channel_Status: String { return self._s[2839]! }
+ public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[2841]! }
+ public var VoiceOver_Chat_OptionSelected: String { return self._s[2842]! }
+ public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2843]! }
public func ClearCache_Success(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2808]!, self._r[2808]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[2844]!, self._r[2844]!, [_0, _1])
}
- public var Passport_Identity_ExpiryDateNone: String { return self._s[2810]! }
- public var Your_cards_expiration_month_is_invalid: String { return self._s[2812]! }
- public var Month_ShortDecember: String { return self._s[2813]! }
- public var Username_Help: String { return self._s[2814]! }
- public var Login_InfoAvatarAdd: String { return self._s[2815]! }
- public var Month_ShortMay: String { return self._s[2816]! }
- public var DialogList_UnknownPinLimitError: String { return self._s[2817]! }
- public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[2818]! }
- public var TwoStepAuth_EnabledSuccess: String { return self._s[2819]! }
- public var Weekday_ShortSunday: String { return self._s[2820]! }
- public var Channel_Username_InvalidTooShort: String { return self._s[2821]! }
- public var AuthSessions_TerminateSession: String { return self._s[2822]! }
- public var Passport_Identity_FilesTitle: String { return self._s[2823]! }
+ public var Passport_Identity_ExpiryDateNone: String { return self._s[2846]! }
+ public var Your_cards_expiration_month_is_invalid: String { return self._s[2848]! }
+ public var Month_ShortDecember: String { return self._s[2849]! }
+ public var Username_Help: String { return self._s[2850]! }
+ public var Login_InfoAvatarAdd: String { return self._s[2851]! }
+ public var Month_ShortMay: String { return self._s[2852]! }
+ public var DialogList_UnknownPinLimitError: String { return self._s[2853]! }
+ public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[2854]! }
+ public var TwoStepAuth_EnabledSuccess: String { return self._s[2855]! }
+ public var Weekday_ShortSunday: String { return self._s[2856]! }
+ public var Channel_Username_InvalidTooShort: String { return self._s[2857]! }
+ public var AuthSessions_TerminateSession: String { return self._s[2858]! }
+ public var Passport_Identity_FilesTitle: String { return self._s[2859]! }
public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2824]!, self._r[2824]!, [_0])
+ return formatWithArgumentRanges(self._s[2860]!, self._r[2860]!, [_0])
}
- public var PeopleNearby_MakeVisible: String { return self._s[2826]! }
+ public var PeopleNearby_MakeVisible: String { return self._s[2862]! }
public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2827]!, self._r[2827]!, [_0])
+ return formatWithArgumentRanges(self._s[2863]!, self._r[2863]!, [_0])
}
public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2828]!, self._r[2828]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2864]!, self._r[2864]!, [_1, _2])
}
public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2829]!, self._r[2829]!, [_0])
+ return formatWithArgumentRanges(self._s[2865]!, self._r[2865]!, [_0])
}
- public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2830]! }
- public var Conversation_ContextMenuForward: String { return self._s[2831]! }
- public var Channel_AdminLog_CanManageCalls: String { return self._s[2832]! }
+ public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2866]! }
+ public var Conversation_ContextMenuForward: String { return self._s[2867]! }
+ public var Channel_AdminLog_CanManageCalls: String { return self._s[2868]! }
public func PUSH_CHAT_MESSAGE_QUIZ(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2834]!, self._r[2834]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2870]!, self._r[2870]!, [_1, _2, _3])
}
- public var Notification_GroupInviterSelf: String { return self._s[2836]! }
- public var Privacy_Forwards_NeverLink: String { return self._s[2837]! }
- public var AuthSessions_CurrentSession: String { return self._s[2838]! }
- public var Passport_Address_EditPassportRegistration: String { return self._s[2839]! }
- public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2840]! }
- public var ChatSearch_ResultsTooltip: String { return self._s[2842]! }
- public var CheckoutInfo_Pay: String { return self._s[2843]! }
+ public var Notification_GroupInviterSelf: String { return self._s[2872]! }
+ public var Privacy_Forwards_NeverLink: String { return self._s[2873]! }
+ public var AuthSessions_CurrentSession: String { return self._s[2874]! }
+ public var Passport_Address_EditPassportRegistration: String { return self._s[2875]! }
+ public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2876]! }
+ public var ChatSearch_ResultsTooltip: String { return self._s[2878]! }
+ public var CheckoutInfo_Pay: String { return self._s[2879]! }
public func Conversation_PinMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2845]!, self._r[2845]!, [_0])
+ return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_0])
}
- public var GroupInfo_AddParticipant: String { return self._s[2846]! }
- public var GroupPermission_ApplyAlertAction: String { return self._s[2847]! }
+ public var GroupInfo_AddParticipant: String { return self._s[2882]! }
+ public var GroupPermission_ApplyAlertAction: String { return self._s[2883]! }
public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2848]!, self._r[2848]!, [_0])
+ return formatWithArgumentRanges(self._s[2884]!, self._r[2884]!, [_0])
}
- public var Localization_LanguageCustom: String { return self._s[2849]! }
- public var SettingsSearch_Synonyms_Passport: String { return self._s[2850]! }
- public var Settings_UsernameEmpty: String { return self._s[2851]! }
- public var Settings_FAQ_URL: String { return self._s[2852]! }
- public var ChatList_UndoArchiveText1: String { return self._s[2853]! }
- public var Common_Select: String { return self._s[2855]! }
- public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[2856]! }
- public var Notification_PassportValueAddress: String { return self._s[2857]! }
- public var Conversation_MessageDialogDelete: String { return self._s[2858]! }
- public var Map_OpenInYandexNavigator: String { return self._s[2860]! }
- public var DialogList_SearchSectionDialogs: String { return self._s[2861]! }
- public var AccessDenied_Contacts: String { return self._s[2862]! }
- public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2864]! }
- public var Passport_ScanPassportHelp: String { return self._s[2865]! }
- public var Chat_PinnedListPreview_HidePinnedMessages: String { return self._s[2866]! }
- public var ChatListFolder_NameChannels: String { return self._s[2867]! }
- public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[2868]! }
+ public var Localization_LanguageCustom: String { return self._s[2885]! }
+ public var SettingsSearch_Synonyms_Passport: String { return self._s[2886]! }
+ public var Settings_UsernameEmpty: String { return self._s[2887]! }
+ public var Settings_FAQ_URL: String { return self._s[2888]! }
+ public var ChatList_UndoArchiveText1: String { return self._s[2889]! }
+ public var Common_Select: String { return self._s[2891]! }
+ public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[2892]! }
+ public var Notification_PassportValueAddress: String { return self._s[2893]! }
+ public var Conversation_MessageDialogDelete: String { return self._s[2894]! }
+ public var Map_OpenInYandexNavigator: String { return self._s[2896]! }
+ public var DialogList_SearchSectionDialogs: String { return self._s[2897]! }
+ public var AccessDenied_Contacts: String { return self._s[2898]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2900]! }
+ public var Passport_ScanPassportHelp: String { return self._s[2901]! }
+ public var Chat_PinnedListPreview_HidePinnedMessages: String { return self._s[2902]! }
+ public var ChatListFolder_NameChannels: String { return self._s[2903]! }
+ public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[2904]! }
public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2869]!, self._r[2869]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2905]!, self._r[2905]!, [_1, _2])
}
- public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[2870]! }
+ public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[2906]! }
public func VoiceChat_InviteMemberToGroupFirstText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2871]!, self._r[2871]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2907]!, self._r[2907]!, [_1, _2])
}
- public var Conversation_GifTooltip: String { return self._s[2872]! }
- public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2874]! }
- public var VoiceChat_Connecting: String { return self._s[2875]! }
- public var AutoDownloadSettings_OffForAll: String { return self._s[2876]! }
- public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2877]! }
- public var AutoDownloadSettings_PreloadVideo: String { return self._s[2878]! }
- public var CreatePoll_Quiz: String { return self._s[2879]! }
- public var TwoFactorSetup_Email_Placeholder: String { return self._s[2880]! }
- public var Watch_Message_Invoice: String { return self._s[2881]! }
- public var Settings_AddAnotherAccount_Help: String { return self._s[2882]! }
- public var Watch_Message_Unsupported: String { return self._s[2883]! }
+ public var Conversation_GifTooltip: String { return self._s[2908]! }
+ public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2910]! }
+ public var VoiceChat_Connecting: String { return self._s[2911]! }
+ public var AutoDownloadSettings_OffForAll: String { return self._s[2912]! }
+ public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[2913]! }
+ public var AutoDownloadSettings_PreloadVideo: String { return self._s[2914]! }
+ public var CreatePoll_Quiz: String { return self._s[2915]! }
+ public var TwoFactorSetup_Email_Placeholder: String { return self._s[2917]! }
+ public var Watch_Message_Invoice: String { return self._s[2918]! }
+ public var Settings_AddAnotherAccount_Help: String { return self._s[2919]! }
+ public var Watch_Message_Unsupported: String { return self._s[2920]! }
public func Call_CameraOff(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2885]!, self._r[2885]!, [_0])
+ return formatWithArgumentRanges(self._s[2922]!, self._r[2922]!, [_0])
}
- public var AuthSessions_TerminateOtherSessions: String { return self._s[2886]! }
- public var CreatePoll_AllOptionsAdded: String { return self._s[2888]! }
- public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[2889]! }
- public var Call_IncomingVoiceCall: String { return self._s[2890]! }
+ public var AuthSessions_TerminateOtherSessions: String { return self._s[2923]! }
+ public var CreatePoll_AllOptionsAdded: String { return self._s[2925]! }
+ public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[2926]! }
+ public var Call_IncomingVoiceCall: String { return self._s[2927]! }
public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2891]!, self._r[2891]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2928]!, self._r[2928]!, [_1, _2])
}
- public var PrivacySettings_DeleteAccountHelp: String { return self._s[2892]! }
- public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[2893]! }
- public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[2894]! }
- public var Group_ErrorAccessDenied: String { return self._s[2895]! }
- public var PasscodeSettings_HelpTop: String { return self._s[2896]! }
- public var Watch_ChatList_NoConversationsTitle: String { return self._s[2897]! }
- public var AddContact_SharedContactException: String { return self._s[2898]! }
- public var AccessDenied_MicrophoneRestricted: String { return self._s[2899]! }
- public var Privacy_TopPeers: String { return self._s[2900]! }
- public var Web_OpenExternal: String { return self._s[2901]! }
- public var Group_ErrorSendRestrictedStickers: String { return self._s[2902]! }
- public var Channel_Management_LabelAdministrator: String { return self._s[2903]! }
+ public var PrivacySettings_DeleteAccountHelp: String { return self._s[2929]! }
+ public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[2930]! }
+ public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[2931]! }
+ public var Group_ErrorAccessDenied: String { return self._s[2932]! }
+ public var PasscodeSettings_HelpTop: String { return self._s[2933]! }
+ public var Watch_ChatList_NoConversationsTitle: String { return self._s[2934]! }
+ public var AddContact_SharedContactException: String { return self._s[2935]! }
+ public var AccessDenied_MicrophoneRestricted: String { return self._s[2936]! }
+ public var Privacy_TopPeers: String { return self._s[2937]! }
+ public var Web_OpenExternal: String { return self._s[2938]! }
+ public var Group_ErrorSendRestrictedStickers: String { return self._s[2939]! }
+ public var Channel_Management_LabelAdministrator: String { return self._s[2940]! }
public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2904]!, self._r[2904]!, [_0])
+ return formatWithArgumentRanges(self._s[2941]!, self._r[2941]!, [_0])
}
- public var Permissions_Skip: String { return self._s[2905]! }
- public var Notifications_GroupNotificationsExceptions: String { return self._s[2906]! }
- public var PeopleNearby_Title: String { return self._s[2907]! }
- public var GroupInfo_SharedMediaNone: String { return self._s[2908]! }
+ public var Permissions_Skip: String { return self._s[2942]! }
+ public var Notifications_GroupNotificationsExceptions: String { return self._s[2943]! }
+ public var PeopleNearby_Title: String { return self._s[2944]! }
+ public var GroupInfo_SharedMediaNone: String { return self._s[2945]! }
public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2910]!, self._r[2910]!, [_1])
+ return formatWithArgumentRanges(self._s[2947]!, self._r[2947]!, [_1])
}
- public var Profile_MessageLifetime1w: String { return self._s[2911]! }
+ public var Profile_MessageLifetime1w: String { return self._s[2948]! }
public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2912]!, self._r[2912]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[2949]!, self._r[2949]!, [_1, _2, _3])
}
- public var WebBrowser_DefaultBrowser: String { return self._s[2913]! }
- public var Conversation_PinOlderMessageAlertTitle: String { return self._s[2915]! }
- public var EditTheme_Edit_BottomInfo: String { return self._s[2916]! }
- public var Privacy_Forwards_Preview: String { return self._s[2917]! }
- public var Settings_EditAccount: String { return self._s[2918]! }
+ public var WebBrowser_DefaultBrowser: String { return self._s[2950]! }
+ public var Conversation_PinOlderMessageAlertTitle: String { return self._s[2952]! }
+ public var EditTheme_Edit_BottomInfo: String { return self._s[2953]! }
+ public var Privacy_Forwards_Preview: String { return self._s[2954]! }
+ public var Settings_EditAccount: String { return self._s[2955]! }
public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2919]!, self._r[2919]!, [_0])
+ return formatWithArgumentRanges(self._s[2956]!, self._r[2956]!, [_0])
}
- public var TwoFactorSetup_Intro_Title: String { return self._s[2920]! }
+ public var TwoFactorSetup_Intro_Title: String { return self._s[2957]! }
public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2922]!, self._r[2922]!, [_1])
+ return formatWithArgumentRanges(self._s[2959]!, self._r[2959]!, [_1])
}
- public var PeerInfo_ButtonVideoCall: String { return self._s[2923]! }
+ public var PeerInfo_ButtonVideoCall: String { return self._s[2960]! }
public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2924]!, self._r[2924]!, [_0])
+ return formatWithArgumentRanges(self._s[2961]!, self._r[2961]!, [_0])
}
- public var Login_InfoHelp: String { return self._s[2925]! }
- public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2926]! }
- public var VoiceChat_SpeakPermissionEveryone: String { return self._s[2927]! }
- public var Profile_MessageLifetime1d: String { return self._s[2928]! }
- public var Group_UpgradeConfirmation: String { return self._s[2929]! }
+ public var Login_InfoHelp: String { return self._s[2962]! }
+ public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2963]! }
+ public var VoiceChat_SpeakPermissionEveryone: String { return self._s[2964]! }
+ public var Profile_MessageLifetime1d: String { return self._s[2965]! }
+ public var Group_UpgradeConfirmation: String { return self._s[2966]! }
public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2930]!, self._r[2930]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[2967]!, self._r[2967]!, [_1, _2])
}
- public var Appearance_RemoveThemeColor: String { return self._s[2931]! }
- public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[2932]! }
+ public var Appearance_RemoveThemeColor: String { return self._s[2968]! }
+ public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[2969]! }
public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2933]!, self._r[2933]!, [_0])
+ return formatWithArgumentRanges(self._s[2970]!, self._r[2970]!, [_0])
}
- public var UserInfo_BotSettings: String { return self._s[2934]! }
+ public var UserInfo_BotSettings: String { return self._s[2971]! }
public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2936]!, self._r[2936]!, [_0])
+ return formatWithArgumentRanges(self._s[2973]!, self._r[2973]!, [_0])
}
- public var Permissions_ContactsText_v0: String { return self._s[2937]! }
- public var Conversation_PinMessagesForMe: String { return self._s[2938]! }
- public var VoiceChat_PanelJoin: String { return self._s[2939]! }
- public var Conversation_DiscussionStarted: String { return self._s[2941]! }
- public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2942]! }
- public var SharedMedia_SearchNoResults: String { return self._s[2944]! }
+ public var Permissions_ContactsText_v0: String { return self._s[2974]! }
+ public var Conversation_PinMessagesForMe: String { return self._s[2975]! }
+ public var VoiceChat_PanelJoin: String { return self._s[2976]! }
+ public var Conversation_DiscussionStarted: String { return self._s[2978]! }
+ public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2979]! }
+ public var SharedMedia_SearchNoResults: String { return self._s[2981]! }
public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2946]!, self._r[2946]!, [_0])
+ return formatWithArgumentRanges(self._s[2983]!, self._r[2983]!, [_0])
}
public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2948]!, self._r[2948]!, [_0])
+ return formatWithArgumentRanges(self._s[2985]!, self._r[2985]!, [_0])
}
- public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2949]! }
- public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2950]! }
- public var Call_AudioRouteHeadphones: String { return self._s[2951]! }
+ public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2986]! }
+ public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2987]! }
+ public var Call_AudioRouteHeadphones: String { return self._s[2988]! }
public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2953]!, self._r[2953]!, [_1])
+ return formatWithArgumentRanges(self._s[2990]!, self._r[2990]!, [_1])
}
- public var Passport_Identity_FilesView: String { return self._s[2954]! }
- public var TwoStepAuth_SetupEmail: String { return self._s[2955]! }
- public var Widget_ApplicationStartRequired: String { return self._s[2956]! }
- public var PhotoEditor_Original: String { return self._s[2957]! }
- public var Call_YourMicrophoneOff: String { return self._s[2958]! }
- public var Permissions_ContactsAllow_v0: String { return self._s[2959]! }
- public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[2960]! }
- public var PrivacyPolicy_Decline: String { return self._s[2961]! }
- public var SettingsSearch_Synonyms_ChatFolders: String { return self._s[2962]! }
- public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[2963]! }
- public var ChatListFolder_IncludeSectionInfo: String { return self._s[2964]! }
+ public var Passport_Identity_FilesView: String { return self._s[2991]! }
+ public var TwoStepAuth_SetupEmail: String { return self._s[2992]! }
+ public var Widget_ApplicationStartRequired: String { return self._s[2993]! }
+ public var PhotoEditor_Original: String { return self._s[2994]! }
+ public var Call_YourMicrophoneOff: String { return self._s[2995]! }
+ public var Permissions_ContactsAllow_v0: String { return self._s[2996]! }
+ public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[2997]! }
+ public var PrivacyPolicy_Decline: String { return self._s[2998]! }
+ public var SettingsSearch_Synonyms_ChatFolders: String { return self._s[2999]! }
+ public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[3000]! }
+ public var ChatListFolder_IncludeSectionInfo: String { return self._s[3001]! }
public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2965]!, self._r[2965]!, [_0])
+ return formatWithArgumentRanges(self._s[3002]!, self._r[3002]!, [_0])
}
- public var Passport_Identity_Name: String { return self._s[2966]! }
- public var WallpaperPreview_PatternTitle: String { return self._s[2968]! }
- public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2969]! }
- public var WallpaperSearch_ColorOrange: String { return self._s[2971]! }
- public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[2972]! }
- public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2973]! }
- public var Your_cards_security_code_is_invalid: String { return self._s[2974]! }
- public var IntentsSettings_ResetAll: String { return self._s[2975]! }
- public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[2977]! }
- public var Group_EditAdmin_TransferOwnership: String { return self._s[2978]! }
- public var Notification_Exceptions_Add: String { return self._s[2979]! }
- public var Cache_Help: String { return self._s[2980]! }
- public var Call_AudioRouteMute: String { return self._s[2981]! }
- public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[2982]! }
- public var SocksProxySetup_ProxyEnabled: String { return self._s[2983]! }
+ public var Passport_Identity_Name: String { return self._s[3003]! }
+ public var WallpaperPreview_PatternTitle: String { return self._s[3005]! }
+ public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[3006]! }
+ public var WallpaperSearch_ColorOrange: String { return self._s[3008]! }
+ public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[3009]! }
+ public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[3010]! }
+ public var Your_cards_security_code_is_invalid: String { return self._s[3011]! }
+ public var IntentsSettings_ResetAll: String { return self._s[3012]! }
+ public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3014]! }
+ public var Group_EditAdmin_TransferOwnership: String { return self._s[3015]! }
+ public var Notification_Exceptions_Add: String { return self._s[3016]! }
+ public var Cache_Help: String { return self._s[3017]! }
+ public var Call_AudioRouteMute: String { return self._s[3018]! }
+ public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[3019]! }
+ public var SocksProxySetup_ProxyEnabled: String { return self._s[3020]! }
public func VoiceChat_Status_MembersFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2984]!, self._r[2984]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3021]!, self._r[3021]!, [_1, _2])
}
public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2985]!, self._r[2985]!, [_1])
+ return formatWithArgumentRanges(self._s[3022]!, self._r[3022]!, [_1])
}
public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2986]!, self._r[2986]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3023]!, self._r[3023]!, [_1, _2])
}
- public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[2987]! }
- public var Channel_BanUser_PermissionAddMembers: String { return self._s[2988]! }
+ public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3024]! }
+ public var Channel_BanUser_PermissionAddMembers: String { return self._s[3025]! }
public func PUSH_CHAT_VOICECHAT_INVITE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2989]!, self._r[2989]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[3026]!, self._r[3026]!, [_1, _2, _3])
}
- public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[2990]! }
- public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2991]! }
- public var ClearCache_StorageFree: String { return self._s[2992]! }
+ public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[3027]! }
+ public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[3028]! }
+ public var ClearCache_StorageFree: String { return self._s[3029]! }
public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2993]!, self._r[2993]!, [_0])
+ return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_0])
}
- public var Privacy_Forwards_CustomHelp: String { return self._s[2994]! }
- public var Group_ErrorAddTooMuchAdmins: String { return self._s[2996]! }
- public var DialogList_Typing: String { return self._s[2997]! }
+ public var Privacy_Forwards_CustomHelp: String { return self._s[3031]! }
+ public var Group_ErrorAddTooMuchAdmins: String { return self._s[3033]! }
+ public var DialogList_Typing: String { return self._s[3034]! }
public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[2998]!, self._r[2998]!, [_0])
+ return formatWithArgumentRanges(self._s[3035]!, self._r[3035]!, [_0])
}
- public var Target_SelectGroup: String { return self._s[2999]! }
- public var AuthSessions_IncompleteAttempts: String { return self._s[3000]! }
+ public var Target_SelectGroup: String { return self._s[3036]! }
+ public var AuthSessions_IncompleteAttempts: String { return self._s[3037]! }
public func Notification_ProximityReached(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3001]!, self._r[3001]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_1, _2, _3])
}
- public var Chat_PinnedListPreview_ShowAllMessages: String { return self._s[3002]! }
- public var TwoStepAuth_EmailChangeSuccess: String { return self._s[3003]! }
+ public var Chat_PinnedListPreview_ShowAllMessages: String { return self._s[3039]! }
+ public var TwoStepAuth_EmailChangeSuccess: String { return self._s[3040]! }
public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3004]!, self._r[3004]!, [_0])
+ return formatWithArgumentRanges(self._s[3041]!, self._r[3041]!, [_0])
}
- public var Channel_AdminLog_CanSendMessages: String { return self._s[3005]! }
- public var TwoFactorSetup_EmailVerification_Title: String { return self._s[3006]! }
- public var ChatSettings_TextSize: String { return self._s[3007]! }
- public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[3009]! }
- public var Map_SendThisPlace: String { return self._s[3010]! }
- public var Conversation_TextCopied: String { return self._s[3011]! }
- public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3012]! }
- public var ContactInfo_BirthdayLabel: String { return self._s[3013]! }
- public var Call_ShareStats: String { return self._s[3014]! }
- public var ChatList_UndoArchiveRevealedText: String { return self._s[3016]! }
- public var Notifications_GroupNotificationsPreview: String { return self._s[3017]! }
- public var Settings_Support: String { return self._s[3018]! }
- public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3019]! }
+ public var Channel_AdminLog_CanSendMessages: String { return self._s[3042]! }
+ public var TwoFactorSetup_EmailVerification_Title: String { return self._s[3043]! }
+ public var ChatSettings_TextSize: String { return self._s[3044]! }
+ public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[3046]! }
+ public var Map_SendThisPlace: String { return self._s[3047]! }
+ public var Conversation_TextCopied: String { return self._s[3048]! }
+ public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3049]! }
+ public var ContactInfo_BirthdayLabel: String { return self._s[3050]! }
+ public var Call_ShareStats: String { return self._s[3051]! }
+ public var ChatList_UndoArchiveRevealedText: String { return self._s[3053]! }
+ public var Notifications_GroupNotificationsPreview: String { return self._s[3054]! }
+ public var Settings_Support: String { return self._s[3055]! }
+ public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3056]! }
public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3021]!, self._r[3021]!, [_0])
+ return formatWithArgumentRanges(self._s[3058]!, self._r[3058]!, [_0])
}
- public var Watch_Conversation_GroupInfo: String { return self._s[3022]! }
- public var Tour_Text4: String { return self._s[3023]! }
- public var PasscodeSettings_AutoLock: String { return self._s[3025]! }
- public var Channel_BanList_BlockedTitle: String { return self._s[3026]! }
- public var Bot_DescriptionTitle: String { return self._s[3027]! }
- public var Map_LocationTitle: String { return self._s[3028]! }
- public var ChatListFolder_ExcludeSectionInfo: String { return self._s[3029]! }
+ public var Watch_Conversation_GroupInfo: String { return self._s[3059]! }
+ public var Tour_Text4: String { return self._s[3060]! }
+ public var PasscodeSettings_AutoLock: String { return self._s[3062]! }
+ public var Channel_BanList_BlockedTitle: String { return self._s[3063]! }
+ public var Bot_DescriptionTitle: String { return self._s[3064]! }
+ public var Map_LocationTitle: String { return self._s[3065]! }
+ public var ChatListFolder_ExcludeSectionInfo: String { return self._s[3066]! }
public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_1])
+ return formatWithArgumentRanges(self._s[3067]!, self._r[3067]!, [_1])
}
- public var Login_EmailNotConfiguredError: String { return self._s[3031]! }
- public var AutoDownloadSettings_LimitBySize: String { return self._s[3032]! }
- public var PrivacySettings_LastSeenNobody: String { return self._s[3033]! }
- public var Permissions_CellularDataText_v0: String { return self._s[3034]! }
- public var Conversation_EncryptionProcessing: String { return self._s[3035]! }
- public var GroupPermission_Delete: String { return self._s[3036]! }
- public var Contacts_SortByName: String { return self._s[3037]! }
- public var TwoStepAuth_RecoveryUnavailable: String { return self._s[3038]! }
- public var Compose_ChannelTokenListPlaceholder: String { return self._s[3039]! }
- public var Group_Management_AddModeratorHelp: String { return self._s[3041]! }
- public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[3042]! }
- public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3043]! }
- public var CallFeedback_IncludeLogsInfo: String { return self._s[3045]! }
+ public var Login_EmailNotConfiguredError: String { return self._s[3068]! }
+ public var AutoDownloadSettings_LimitBySize: String { return self._s[3069]! }
+ public var PrivacySettings_LastSeenNobody: String { return self._s[3070]! }
+ public var Permissions_CellularDataText_v0: String { return self._s[3071]! }
+ public var Conversation_EncryptionProcessing: String { return self._s[3072]! }
+ public var GroupPermission_Delete: String { return self._s[3073]! }
+ public var Contacts_SortByName: String { return self._s[3074]! }
+ public var TwoStepAuth_RecoveryUnavailable: String { return self._s[3075]! }
+ public var Compose_ChannelTokenListPlaceholder: String { return self._s[3076]! }
+ public var Group_Management_AddModeratorHelp: String { return self._s[3078]! }
+ public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[3079]! }
+ public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3080]! }
+ public var CallFeedback_IncludeLogsInfo: String { return self._s[3082]! }
public func PUSH_CHANNEL_MESSAGE_QUIZ(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3046]!, self._r[3046]!, [_1])
+ return formatWithArgumentRanges(self._s[3083]!, self._r[3083]!, [_1])
}
public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3047]!, self._r[3047]!, [_0])
+ return formatWithArgumentRanges(self._s[3084]!, self._r[3084]!, [_0])
}
- public var ChatList_Context_Delete: String { return self._s[3048]! }
- public var VoiceChat_InviteMember: String { return self._s[3049]! }
- public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[3050]! }
- public var Conversation_Processing: String { return self._s[3051]! }
- public var TwoStepAuth_EmailCodeExpired: String { return self._s[3052]! }
- public var ChatSettings_Stickers: String { return self._s[3053]! }
- public var AppleWatch_ReplyPresetsHelp: String { return self._s[3054]! }
- public var Passport_Language_cs: String { return self._s[3055]! }
- public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3057]! }
- public var Conversation_Contact: String { return self._s[3058]! }
- public var Passport_Identity_ReverseSideHelp: String { return self._s[3059]! }
- public var SocksProxySetup_PasteFromClipboard: String { return self._s[3060]! }
- public var Theme_Unsupported: String { return self._s[3061]! }
- public var Privacy_TopPeersWarning: String { return self._s[3062]! }
+ public var ChatList_Context_Delete: String { return self._s[3085]! }
+ public var VoiceChat_InviteMember: String { return self._s[3086]! }
+ public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[3087]! }
+ public var Conversation_Processing: String { return self._s[3088]! }
+ public var TwoStepAuth_EmailCodeExpired: String { return self._s[3089]! }
+ public var ChatSettings_Stickers: String { return self._s[3090]! }
+ public var AppleWatch_ReplyPresetsHelp: String { return self._s[3091]! }
+ public var Passport_Language_cs: String { return self._s[3092]! }
+ public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3094]! }
+ public var Conversation_Contact: String { return self._s[3095]! }
+ public var Passport_Identity_ReverseSideHelp: String { return self._s[3096]! }
+ public var SocksProxySetup_PasteFromClipboard: String { return self._s[3097]! }
+ public var Theme_Unsupported: String { return self._s[3098]! }
+ public var Privacy_TopPeersWarning: String { return self._s[3099]! }
+ public var InviteLink_Title: String { return self._s[3101]! }
public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3064]!, self._r[3064]!, [_0])
+ return formatWithArgumentRanges(self._s[3102]!, self._r[3102]!, [_0])
}
- public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3065]! }
- public var TwoStepAuth_RemovePassword: String { return self._s[3066]! }
- public var Settings_CheckPhoneNumberText: String { return self._s[3067]! }
- public var PeopleNearby_Users: String { return self._s[3068]! }
- public var Appearance_TextSize_UseSystem: String { return self._s[3069]! }
- public var Settings_SetProfilePhoto: String { return self._s[3070]! }
- public var Conversation_ContextMenuBan: String { return self._s[3071]! }
- public var KeyCommand_ScrollUp: String { return self._s[3072]! }
- public var Settings_ChatSettings: String { return self._s[3074]! }
- public var CallList_RecentCallsHeader: String { return self._s[3075]! }
+ public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3103]! }
+ public var TwoStepAuth_RemovePassword: String { return self._s[3104]! }
+ public var Settings_CheckPhoneNumberText: String { return self._s[3105]! }
+ public var PeopleNearby_Users: String { return self._s[3106]! }
+ public var Appearance_TextSize_UseSystem: String { return self._s[3107]! }
+ public var Settings_SetProfilePhoto: String { return self._s[3108]! }
+ public var Conversation_ContextMenuBan: String { return self._s[3109]! }
+ public var KeyCommand_ScrollUp: String { return self._s[3110]! }
+ public var Settings_ChatSettings: String { return self._s[3112]! }
+ public var CallList_RecentCallsHeader: String { return self._s[3113]! }
public func PUSH_CHAT_MESSAGE_VIDEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3076]!, self._r[3076]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3114]!, self._r[3114]!, [_1, _2])
}
- public var Stats_GroupTopInvitersTitle: String { return self._s[3077]! }
- public var Passport_Phone_EnterOtherNumber: String { return self._s[3078]! }
- public var VoiceChat_StartRecordingTitle: String { return self._s[3079]! }
- public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[3081]! }
- public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3082]! }
- public var Stats_GroupTopPoster_Promote: String { return self._s[3083]! }
- public var Cache_Title: String { return self._s[3084]! }
- public var Clipboard_SendPhoto: String { return self._s[3085]! }
- public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[3087]! }
- public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3088]! }
- public var WatchRemote_AlertTitle: String { return self._s[3089]! }
- public var Appearance_ReduceMotion: String { return self._s[3090]! }
+ public var Stats_GroupTopInvitersTitle: String { return self._s[3115]! }
+ public var Passport_Phone_EnterOtherNumber: String { return self._s[3116]! }
+ public var VoiceChat_StartRecordingTitle: String { return self._s[3117]! }
+ public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[3119]! }
+ public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3120]! }
+ public var Stats_GroupTopPoster_Promote: String { return self._s[3121]! }
+ public var Cache_Title: String { return self._s[3122]! }
+ public var Clipboard_SendPhoto: String { return self._s[3123]! }
+ public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[3125]! }
+ public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3126]! }
+ public var WatchRemote_AlertTitle: String { return self._s[3127]! }
+ public var Appearance_ReduceMotion: String { return self._s[3128]! }
public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3093]!, self._r[3093]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3131]!, self._r[3131]!, [_1, _2])
}
- public var Notifications_PermissionsSuppressWarningText: String { return self._s[3094]! }
- public var ChatList_UndoArchiveHiddenTitle: String { return self._s[3095]! }
- public var Passport_Identity_TypePersonalDetails: String { return self._s[3096]! }
+ public var Notifications_PermissionsSuppressWarningText: String { return self._s[3132]! }
+ public var ChatList_UndoArchiveHiddenTitle: String { return self._s[3133]! }
+ public var Passport_Identity_TypePersonalDetails: String { return self._s[3134]! }
public func Call_CallInProgressVoiceChatMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3097]!, self._r[3097]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3135]!, self._r[3135]!, [_1, _2])
}
public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3099]!, self._r[3099]!, [_0])
+ return formatWithArgumentRanges(self._s[3137]!, self._r[3137]!, [_0])
}
- public var ChatListFolder_DiscardConfirmation: String { return self._s[3100]! }
+ public var ChatListFolder_DiscardConfirmation: String { return self._s[3138]! }
public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3101]!, self._r[3101]!, [_0])
- }
- public var ChatState_WaitingForNetwork: String { return self._s[3102]! }
- public var GroupInfo_Sound: String { return self._s[3103]! }
- public var NotificationsSound_Telegraph: String { return self._s[3104]! }
- public var NotificationsSound_Hello: String { return self._s[3105]! }
- public var Passport_FieldIdentityDetailsHelp: String { return self._s[3106]! }
- public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[3107]! }
- public var Conversation_HoldForVideo: String { return self._s[3108]! }
- public var Conversation_PinOlderMessageAlertText: String { return self._s[3109]! }
- public var Appearance_ShareTheme: String { return self._s[3110]! }
- public var TwoStepAuth_SetupHint: String { return self._s[3111]! }
- public var Stats_GrowthTitle: String { return self._s[3114]! }
- public var GroupInfo_InviteLink_ShareLink: String { return self._s[3115]! }
- public var Conversation_DefaultRestrictedMedia: String { return self._s[3116]! }
- public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[3117]! }
- public var GroupPermission_NoSendMessages: String { return self._s[3120]! }
- public var Conversation_SetReminder_Title: String { return self._s[3121]! }
- public var Privacy_Calls_CustomHelp: String { return self._s[3122]! }
- public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3123]! }
- public func ClearCache_StorageTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3124]!, self._r[3124]!, [_0])
- }
- public var Undo_SecretChatDeleted: String { return self._s[3126]! }
- public var PhotoEditor_ContrastTool: String { return self._s[3127]! }
- public var Privacy_Forwards: String { return self._s[3128]! }
- public var AuthSessions_LoggedInWithTelegram: String { return self._s[3129]! }
- public var KeyCommand_SendMessage: String { return self._s[3131]! }
- public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3132]!, self._r[3132]!, [_1, _2])
- }
- public var GroupPermission_NoSendGifs: String { return self._s[3133]! }
- public var Notification_MessageLifetime2s: String { return self._s[3134]! }
- public var Message_Theme: String { return self._s[3135]! }
- public var Conversation_Dice_u1F3AF: String { return self._s[3138]! }
- public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3139]!, self._r[3139]!, [_0])
}
- public var Group_UpgradeNoticeHeader: String { return self._s[3141]! }
- public var PeerInfo_BioExpand: String { return self._s[3142]! }
- public var Passport_DeletePersonalDetails: String { return self._s[3143]! }
- public var Widget_NoUsers: String { return self._s[3144]! }
- public var TwoStepAuth_AddHintTitle: String { return self._s[3145]! }
- public var Login_TermsOfServiceDecline: String { return self._s[3146]! }
- public var CreatePoll_QuizTip: String { return self._s[3148]! }
- public var Watch_LastSeen_WithinAWeek: String { return self._s[3149]! }
- public var MessagePoll_SubmitVote: String { return self._s[3151]! }
- public var ChatSettings_AutoDownloadEnabled: String { return self._s[3152]! }
- public var Passport_Address_EditRentalAgreement: String { return self._s[3153]! }
- public var Conversation_SearchByName_Placeholder: String { return self._s[3154]! }
- public var Conversation_UpdateTelegram: String { return self._s[3155]! }
- public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3156]!, self._r[3156]!, [_0])
+ public var ChatState_WaitingForNetwork: String { return self._s[3140]! }
+ public var GroupInfo_Sound: String { return self._s[3141]! }
+ public var NotificationsSound_Telegraph: String { return self._s[3142]! }
+ public var NotificationsSound_Hello: String { return self._s[3143]! }
+ public var Passport_FieldIdentityDetailsHelp: String { return self._s[3144]! }
+ public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[3145]! }
+ public var Conversation_HoldForVideo: String { return self._s[3146]! }
+ public var Conversation_PinOlderMessageAlertText: String { return self._s[3147]! }
+ public var Appearance_ShareTheme: String { return self._s[3148]! }
+ public var TwoStepAuth_SetupHint: String { return self._s[3149]! }
+ public var Stats_GrowthTitle: String { return self._s[3152]! }
+ public var GroupInfo_InviteLink_ShareLink: String { return self._s[3153]! }
+ public var Conversation_DefaultRestrictedMedia: String { return self._s[3154]! }
+ public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[3155]! }
+ public var GroupPermission_NoSendMessages: String { return self._s[3158]! }
+ public var Conversation_SetReminder_Title: String { return self._s[3159]! }
+ public var Privacy_Calls_CustomHelp: String { return self._s[3160]! }
+ public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3161]! }
+ public func ClearCache_StorageTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3162]!, self._r[3162]!, [_0])
}
- public var UserInfo_About_Placeholder: String { return self._s[3157]! }
- public var CallSettings_Always: String { return self._s[3158]! }
- public var ChannelInfo_ScamChannelWarning: String { return self._s[3159]! }
- public var Login_TermsOfServiceHeader: String { return self._s[3160]! }
- public var KeyCommand_ChatInfo: String { return self._s[3161]! }
- public var MessagePoll_LabelPoll: String { return self._s[3162]! }
- public var Paint_Clear: String { return self._s[3163]! }
- public var PeerInfo_ButtonMute: String { return self._s[3164]! }
- public var LastSeen_WithinAWeek: String { return self._s[3165]! }
- public var Passport_Identity_FrontSide: String { return self._s[3166]! }
- public var Stickers_GroupStickers: String { return self._s[3167]! }
- public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[3168]! }
+ public var Undo_SecretChatDeleted: String { return self._s[3164]! }
+ public var PhotoEditor_ContrastTool: String { return self._s[3165]! }
+ public var Privacy_Forwards: String { return self._s[3166]! }
+ public var AuthSessions_LoggedInWithTelegram: String { return self._s[3167]! }
+ public var KeyCommand_SendMessage: String { return self._s[3169]! }
+ public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3170]!, self._r[3170]!, [_1, _2])
+ }
+ public var GroupPermission_NoSendGifs: String { return self._s[3171]! }
+ public var Notification_MessageLifetime2s: String { return self._s[3172]! }
+ public var Message_Theme: String { return self._s[3173]! }
+ public var Conversation_Dice_u1F3AF: String { return self._s[3176]! }
+ public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_0])
+ }
+ public var Group_UpgradeNoticeHeader: String { return self._s[3179]! }
+ public var PeerInfo_BioExpand: String { return self._s[3180]! }
+ public var Passport_DeletePersonalDetails: String { return self._s[3181]! }
+ public var Widget_NoUsers: String { return self._s[3182]! }
+ public var TwoStepAuth_AddHintTitle: String { return self._s[3183]! }
+ public var Login_TermsOfServiceDecline: String { return self._s[3184]! }
+ public var CreatePoll_QuizTip: String { return self._s[3186]! }
+ public var Watch_LastSeen_WithinAWeek: String { return self._s[3187]! }
+ public var MessagePoll_SubmitVote: String { return self._s[3189]! }
+ public var ChatSettings_AutoDownloadEnabled: String { return self._s[3190]! }
+ public var Passport_Address_EditRentalAgreement: String { return self._s[3191]! }
+ public var Conversation_SearchByName_Placeholder: String { return self._s[3192]! }
+ public var Conversation_UpdateTelegram: String { return self._s[3193]! }
+ public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3194]!, self._r[3194]!, [_0])
+ }
+ public var UserInfo_About_Placeholder: String { return self._s[3195]! }
+ public var CallSettings_Always: String { return self._s[3196]! }
+ public var ChannelInfo_ScamChannelWarning: String { return self._s[3197]! }
+ public var Login_TermsOfServiceHeader: String { return self._s[3198]! }
+ public var KeyCommand_ChatInfo: String { return self._s[3199]! }
+ public var MessagePoll_LabelPoll: String { return self._s[3200]! }
+ public var Paint_Clear: String { return self._s[3201]! }
+ public var PeerInfo_ButtonMute: String { return self._s[3202]! }
+ public var LastSeen_WithinAWeek: String { return self._s[3203]! }
+ public var Passport_Identity_FrontSide: String { return self._s[3204]! }
+ public var Stickers_GroupStickers: String { return self._s[3205]! }
+ public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[3206]! }
public func Map_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3169]!, self._r[3169]!, [_0])
+ return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_0])
}
public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_1])
+ return formatWithArgumentRanges(self._s[3210]!, self._r[3210]!, [_1])
}
- public var SocksProxySetup_ProxyStatusConnected: String { return self._s[3173]! }
- public var Chat_MultipleTextMessagesDisabled: String { return self._s[3174]! }
+ public var SocksProxySetup_ProxyStatusConnected: String { return self._s[3211]! }
+ public var Chat_MultipleTextMessagesDisabled: String { return self._s[3212]! }
+ public var InviteLink_ContextDelete: String { return self._s[3213]! }
public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3175]!, self._r[3175]!, [_0])
+ return formatWithArgumentRanges(self._s[3214]!, self._r[3214]!, [_0])
}
- public var WebSearch_SearchNoResults: String { return self._s[3177]! }
- public var Channel_DiscussionGroup_Create: String { return self._s[3178]! }
- public var Passport_Language_es: String { return self._s[3179]! }
- public var EnterPasscode_EnterCurrentPasscode: String { return self._s[3180]! }
- public var Map_LiveLocationShowAll: String { return self._s[3181]! }
- public var Cache_MaximumCacheSizeHelp: String { return self._s[3183]! }
- public var Map_OpenInGoogleMaps: String { return self._s[3184]! }
- public var CheckoutInfo_ErrorNameInvalid: String { return self._s[3186]! }
- public var EditTheme_Create_BottomInfo: String { return self._s[3187]! }
- public var PhotoEditor_BlurToolLinear: String { return self._s[3188]! }
+ public var WebSearch_SearchNoResults: String { return self._s[3216]! }
+ public var Channel_DiscussionGroup_Create: String { return self._s[3217]! }
+ public var Passport_Language_es: String { return self._s[3218]! }
+ public var EnterPasscode_EnterCurrentPasscode: String { return self._s[3219]! }
+ public var Map_LiveLocationShowAll: String { return self._s[3220]! }
+ public var Cache_MaximumCacheSizeHelp: String { return self._s[3222]! }
+ public var Map_OpenInGoogleMaps: String { return self._s[3223]! }
+ public var CheckoutInfo_ErrorNameInvalid: String { return self._s[3225]! }
+ public var EditTheme_Create_BottomInfo: String { return self._s[3226]! }
+ public var PhotoEditor_BlurToolLinear: String { return self._s[3227]! }
public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3189]!, self._r[3189]!, [_0])
+ return formatWithArgumentRanges(self._s[3228]!, self._r[3228]!, [_0])
}
- public var Passport_Phone_Delete: String { return self._s[3190]! }
- public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[3191]! }
- public var PrivacySettings_PrivacyTitle: String { return self._s[3192]! }
- public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3193]! }
+ public var Passport_Phone_Delete: String { return self._s[3229]! }
+ public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[3230]! }
+ public var PrivacySettings_PrivacyTitle: String { return self._s[3231]! }
+ public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3232]! }
public func EncryptionKey_Description(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3194]!, self._r[3194]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_1, _2])
}
- public var LogoutOptions_LogOutInfo: String { return self._s[3195]! }
- public var Cache_ByPeerHeader: String { return self._s[3197]! }
- public var Username_InvalidCharacters: String { return self._s[3198]! }
- public var Checkout_ShippingAddress: String { return self._s[3199]! }
+ public var LogoutOptions_LogOutInfo: String { return self._s[3234]! }
+ public var Cache_ByPeerHeader: String { return self._s[3236]! }
+ public var Username_InvalidCharacters: String { return self._s[3237]! }
+ public var Checkout_ShippingAddress: String { return self._s[3238]! }
public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3200]!, self._r[3200]!, [_1, _2, _3, _4])
+ return formatWithArgumentRanges(self._s[3239]!, self._r[3239]!, [_1, _2, _3, _4])
}
- public var Conversation_AddContact: String { return self._s[3202]! }
- public var Passport_Address_EditUtilityBill: String { return self._s[3203]! }
- public var Message_Video: String { return self._s[3204]! }
+ public var Conversation_AddContact: String { return self._s[3241]! }
+ public var Passport_Address_EditUtilityBill: String { return self._s[3242]! }
+ public var InviteLink_ContextGetQRCode: String { return self._s[3243]! }
+ public var Conversation_ChecksTooltip_Delivered: String { return self._s[3244]! }
+ public var Message_Video: String { return self._s[3245]! }
public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3205]!, self._r[3205]!, [_0])
+ return formatWithArgumentRanges(self._s[3246]!, self._r[3246]!, [_0])
}
public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3206]!, self._r[3206]!, ["\(_0)"])
+ return formatWithArgumentRanges(self._s[3247]!, self._r[3247]!, ["\(_0)"])
}
- public var Passport_Language_km: String { return self._s[3207]! }
+ public var Passport_Language_km: String { return self._s[3248]! }
public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3208]!, self._r[3208]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[3249]!, self._r[3249]!, [_1, _2, _3])
}
- public var EmptyGroupInfo_Line4: String { return self._s[3209]! }
- public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3211]! }
- public var Notification_CallCanceledShort: String { return self._s[3212]! }
- public var PhotoEditor_FadeTool: String { return self._s[3213]! }
- public var Group_PublicLink_Info: String { return self._s[3214]! }
- public var Contacts_DeselectAll: String { return self._s[3215]! }
- public var Conversation_Moderate_Delete: String { return self._s[3216]! }
- public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3217]! }
- public var NotificationsSound_Note: String { return self._s[3220]! }
+ public var EmptyGroupInfo_Line4: String { return self._s[3250]! }
+ public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3252]! }
+ public var Notification_CallCanceledShort: String { return self._s[3253]! }
+ public var PhotoEditor_FadeTool: String { return self._s[3254]! }
+ public var Group_PublicLink_Info: String { return self._s[3255]! }
+ public var Contacts_DeselectAll: String { return self._s[3256]! }
+ public var Conversation_Moderate_Delete: String { return self._s[3257]! }
+ public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3258]! }
+ public var NotificationsSound_Note: String { return self._s[3261]! }
public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3221]!, self._r[3221]!, [_0])
+ return formatWithArgumentRanges(self._s[3262]!, self._r[3262]!, [_0])
}
- public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3222]! }
- public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3224]! }
- public var DialogList_SearchSectionGlobal: String { return self._s[3225]! }
- public var AccessDenied_Settings: String { return self._s[3226]! }
- public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3227]! }
- public var AuthSessions_EmptyTitle: String { return self._s[3228]! }
- public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[3229]! }
- public var GroupInfo_GroupType: String { return self._s[3230]! }
- public var Calls_Missed: String { return self._s[3231]! }
- public var UserInfo_GenericPhoneLabel: String { return self._s[3232]! }
- public var Passport_Language_uz: String { return self._s[3233]! }
- public var Conversation_StopQuizConfirmationTitle: String { return self._s[3234]! }
- public var PhotoEditor_BlurToolPortrait: String { return self._s[3235]! }
- public var Map_ChooseLocationTitle: String { return self._s[3236]! }
- public var Checkout_EnterPassword: String { return self._s[3237]! }
- public var GroupInfo_ConvertToSupergroup: String { return self._s[3238]! }
- public var AutoNightTheme_UpdateLocation: String { return self._s[3239]! }
- public var NetworkUsageSettings_Title: String { return self._s[3240]! }
- public var Location_ProximityAlertCancelled: String { return self._s[3241]! }
- public var SettingsSearch_Synonyms_ChatSettings_IntentsSettings: String { return self._s[3242]! }
- public var Message_PinnedLiveLocationMessage: String { return self._s[3243]! }
- public var Compose_NewChannel: String { return self._s[3244]! }
- public var Privacy_PaymentsClearInfo: String { return self._s[3246]! }
+ public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3263]! }
+ public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3265]! }
+ public var DialogList_SearchSectionGlobal: String { return self._s[3266]! }
+ public var AccessDenied_Settings: String { return self._s[3267]! }
+ public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3268]! }
+ public var AuthSessions_EmptyTitle: String { return self._s[3269]! }
+ public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[3270]! }
+ public var GroupInfo_GroupType: String { return self._s[3271]! }
+ public var Calls_Missed: String { return self._s[3272]! }
+ public var UserInfo_GenericPhoneLabel: String { return self._s[3273]! }
+ public var Passport_Language_uz: String { return self._s[3274]! }
+ public var Conversation_StopQuizConfirmationTitle: String { return self._s[3275]! }
+ public var PhotoEditor_BlurToolPortrait: String { return self._s[3276]! }
+ public var Map_ChooseLocationTitle: String { return self._s[3277]! }
+ public var Checkout_EnterPassword: String { return self._s[3278]! }
+ public var GroupInfo_ConvertToSupergroup: String { return self._s[3279]! }
+ public var AutoNightTheme_UpdateLocation: String { return self._s[3280]! }
+ public var NetworkUsageSettings_Title: String { return self._s[3281]! }
+ public var Location_ProximityAlertCancelled: String { return self._s[3282]! }
+ public var SettingsSearch_Synonyms_ChatSettings_IntentsSettings: String { return self._s[3283]! }
+ public var Message_PinnedLiveLocationMessage: String { return self._s[3284]! }
+ public var Compose_NewChannel: String { return self._s[3285]! }
+ public var Privacy_PaymentsClearInfo: String { return self._s[3287]! }
public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3247]!, self._r[3247]!, [_1])
+ return formatWithArgumentRanges(self._s[3288]!, self._r[3288]!, [_1])
}
- public var Notification_Exceptions_AlwaysOn: String { return self._s[3248]! }
- public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3249]! }
- public var AutoNightTheme_AutomaticSection: String { return self._s[3252]! }
- public var WallpaperSearch_ColorBrown: String { return self._s[3253]! }
- public var Appearance_AppIconDefault: String { return self._s[3254]! }
- public var StickerSettings_ContextInfo: String { return self._s[3257]! }
- public var Channel_AddBotErrorNoRights: String { return self._s[3258]! }
- public var Passport_FieldPhone: String { return self._s[3260]! }
- public var Contacts_PermissionsTitle: String { return self._s[3261]! }
- public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3262]! }
+ public var Notification_Exceptions_AlwaysOn: String { return self._s[3289]! }
+ public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3290]! }
+ public var AutoNightTheme_AutomaticSection: String { return self._s[3293]! }
+ public var WallpaperSearch_ColorBrown: String { return self._s[3294]! }
+ public var Appearance_AppIconDefault: String { return self._s[3295]! }
+ public var StickerSettings_ContextInfo: String { return self._s[3298]! }
+ public var Channel_AddBotErrorNoRights: String { return self._s[3299]! }
+ public var Passport_FieldPhone: String { return self._s[3301]! }
+ public var Contacts_PermissionsTitle: String { return self._s[3302]! }
+ public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3303]! }
public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3263]!, self._r[3263]!, [_0])
+ return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_0])
}
- public var Bot_Unblock: String { return self._s[3264]! }
- public var PasscodeSettings_SimplePasscode: String { return self._s[3265]! }
- public var Passport_PasswordHelp: String { return self._s[3266]! }
- public var Watch_Conversation_UserInfo: String { return self._s[3267]! }
+ public var Bot_Unblock: String { return self._s[3305]! }
+ public var PasscodeSettings_SimplePasscode: String { return self._s[3306]! }
+ public var Passport_PasswordHelp: String { return self._s[3307]! }
+ public var Watch_Conversation_UserInfo: String { return self._s[3308]! }
public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3271]!, self._r[3271]!, [_0])
+ return formatWithArgumentRanges(self._s[3312]!, self._r[3312]!, [_0])
}
- public var State_Connecting: String { return self._s[3273]! }
- public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3274]! }
- public var TextFormat_AddLinkPlaceholder: String { return self._s[3275]! }
- public var Conversation_Dice_u1F3B2: String { return self._s[3276]! }
+ public var State_Connecting: String { return self._s[3314]! }
+ public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3315]! }
+ public var TextFormat_AddLinkPlaceholder: String { return self._s[3316]! }
+ public var Conversation_Dice_u1F3B2: String { return self._s[3317]! }
public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3277]!, self._r[3277]!, [_0])
+ return formatWithArgumentRanges(self._s[3318]!, self._r[3318]!, [_0])
}
- public var Conversation_SendingOptionsTooltip: String { return self._s[3278]! }
- public var ChatList_UndoArchiveTitle: String { return self._s[3279]! }
- public var ChatList_EmptyChatListNewMessage: String { return self._s[3280]! }
- public var WallpaperSearch_ColorGreen: String { return self._s[3282]! }
- public var PhotoEditor_BlurToolOff: String { return self._s[3283]! }
- public var SocksProxySetup_PortPlaceholder: String { return self._s[3284]! }
- public var Weekday_Saturday: String { return self._s[3285]! }
- public var DialogList_Unread: String { return self._s[3286]! }
- public var Watch_LastSeen_ALongTimeAgo: String { return self._s[3287]! }
- public var Stats_GroupPosters: String { return self._s[3288]! }
+ public var Conversation_SendingOptionsTooltip: String { return self._s[3319]! }
+ public var ChatList_UndoArchiveTitle: String { return self._s[3320]! }
+ public var ChatList_EmptyChatListNewMessage: String { return self._s[3321]! }
+ public var WallpaperSearch_ColorGreen: String { return self._s[3323]! }
+ public var PhotoEditor_BlurToolOff: String { return self._s[3324]! }
+ public var SocksProxySetup_PortPlaceholder: String { return self._s[3325]! }
+ public var Weekday_Saturday: String { return self._s[3326]! }
+ public var DialogList_Unread: String { return self._s[3327]! }
+ public var Watch_LastSeen_ALongTimeAgo: String { return self._s[3328]! }
+ public var Stats_GroupPosters: String { return self._s[3329]! }
public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3289]!, self._r[3289]!, [_1])
+ return formatWithArgumentRanges(self._s[3330]!, self._r[3330]!, [_1])
}
public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3292]!, self._r[3292]!, [_0])
+ return formatWithArgumentRanges(self._s[3333]!, self._r[3333]!, [_0])
}
- public var ReportPeer_ReasonChildAbuse: String { return self._s[3293]! }
+ public var ReportPeer_ReasonChildAbuse: String { return self._s[3334]! }
public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3294]!, self._r[3294]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3335]!, self._r[3335]!, [_1, _2])
}
- public var InfoPlist_NSContactsUsageDescription: String { return self._s[3295]! }
- public var AutoNightTheme_UseSunsetSunrise: String { return self._s[3297]! }
- public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[3298]! }
- public var Call_VoiceOver_VoiceCallCanceled: String { return self._s[3299]! }
- public var Passport_Language_dv: String { return self._s[3300]! }
- public var GroupPermission_AddSuccess: String { return self._s[3302]! }
- public var Passport_Email_Help: String { return self._s[3303]! }
- public var Call_ReportPlaceholder: String { return self._s[3304]! }
- public var CreatePoll_AddOption: String { return self._s[3305]! }
- public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3306]! }
- public var PeerInfo_ButtonLeave: String { return self._s[3307]! }
- public var PhotoEditor_TiltShift: String { return self._s[3310]! }
- public var SecretGif_Title: String { return self._s[3312]! }
- public var PhotoEditor_QualityVeryLow: String { return self._s[3313]! }
- public var SocksProxySetup_Connecting: String { return self._s[3314]! }
- public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3315]! }
- public var ContactInfo_PhoneLabelWork: String { return self._s[3316]! }
- public var Stats_GroupTopHoursTitle: String { return self._s[3317]! }
- public var Compose_NewMessage: String { return self._s[3318]! }
- public var VoiceOver_Common_SwitchHint: String { return self._s[3319]! }
- public var NotificationsSound_Synth: String { return self._s[3320]! }
- public var Conversation_FileOpenIn: String { return self._s[3321]! }
- public var AutoDownloadSettings_WifiTitle: String { return self._s[3322]! }
- public var UserInfo_SendMessage: String { return self._s[3323]! }
- public var Checkout_PayWithFaceId: String { return self._s[3324]! }
+ public var InfoPlist_NSContactsUsageDescription: String { return self._s[3336]! }
+ public var AutoNightTheme_UseSunsetSunrise: String { return self._s[3338]! }
+ public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[3339]! }
+ public var Call_VoiceOver_VoiceCallCanceled: String { return self._s[3340]! }
+ public var Passport_Language_dv: String { return self._s[3341]! }
+ public var GroupPermission_AddSuccess: String { return self._s[3343]! }
+ public var Passport_Email_Help: String { return self._s[3344]! }
+ public var Call_ReportPlaceholder: String { return self._s[3345]! }
+ public var CreatePoll_AddOption: String { return self._s[3346]! }
+ public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3348]! }
+ public var PeerInfo_ButtonLeave: String { return self._s[3349]! }
+ public var PhotoEditor_TiltShift: String { return self._s[3352]! }
+ public var SecretGif_Title: String { return self._s[3354]! }
+ public var GroupInfo_InviteLinks: String { return self._s[3355]! }
+ public var PhotoEditor_QualityVeryLow: String { return self._s[3356]! }
+ public var SocksProxySetup_Connecting: String { return self._s[3357]! }
+ public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3358]! }
+ public var ContactInfo_PhoneLabelWork: String { return self._s[3359]! }
+ public var Stats_GroupTopHoursTitle: String { return self._s[3360]! }
+ public var Compose_NewMessage: String { return self._s[3361]! }
+ public var VoiceOver_Common_SwitchHint: String { return self._s[3362]! }
+ public var NotificationsSound_Synth: String { return self._s[3363]! }
+ public var Conversation_FileOpenIn: String { return self._s[3364]! }
+ public var AutoDownloadSettings_WifiTitle: String { return self._s[3365]! }
+ public var UserInfo_SendMessage: String { return self._s[3366]! }
+ public var Checkout_PayWithFaceId: String { return self._s[3367]! }
public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3325]!, self._r[3325]!, [_0])
+ return formatWithArgumentRanges(self._s[3368]!, self._r[3368]!, [_0])
}
- public var TextFormat_Strikethrough: String { return self._s[3326]! }
- public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[3327]! }
- public var Conversation_ViewChannel: String { return self._s[3328]! }
+ public var TextFormat_Strikethrough: String { return self._s[3369]! }
+ public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[3370]! }
+ public var Conversation_ViewChannel: String { return self._s[3371]! }
public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3329]!, self._r[3329]!, [_0])
+ return formatWithArgumentRanges(self._s[3372]!, self._r[3372]!, [_0])
}
- public var Channel_Stickers_Placeholder: String { return self._s[3330]! }
- public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3331]! }
- public var Camera_FlashAuto: String { return self._s[3332]! }
- public var Conversation_EncryptedDescription1: String { return self._s[3333]! }
- public var LocalGroup_Text: String { return self._s[3334]! }
- public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[3335]! }
- public var UserInfo_FirstNamePlaceholder: String { return self._s[3336]! }
- public var Conversation_SendMessageErrorFlood: String { return self._s[3337]! }
- public var Conversation_EncryptedDescription2: String { return self._s[3338]! }
- public var Notification_GroupActivated: String { return self._s[3339]! }
- public var LastSeen_Lately: String { return self._s[3340]! }
- public var Conversation_EncryptedDescription3: String { return self._s[3341]! }
- public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[3342]! }
- public var Conversation_SwipeToReplyHintText: String { return self._s[3343]! }
- public var Conversation_EncryptedDescription4: String { return self._s[3344]! }
- public var SharedMedia_EmptyTitle: String { return self._s[3345]! }
- public var Appearance_CreateTheme: String { return self._s[3346]! }
- public var Stats_SharesPerPost: String { return self._s[3347]! }
- public var Contacts_TabTitle: String { return self._s[3348]! }
- public var Weekday_ShortThursday: String { return self._s[3349]! }
- public var MessageTimer_Forever: String { return self._s[3350]! }
- public var ChatListFolder_CategoryArchived: String { return self._s[3351]! }
- public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3352]! }
- public var EditTheme_Create_TopInfo: String { return self._s[3354]! }
- public var Month_GenDecember: String { return self._s[3355]! }
- public var EnterPasscode_EnterPasscode: String { return self._s[3356]! }
- public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3357]! }
- public var PeopleNearby_CreateGroup: String { return self._s[3359]! }
- public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3360]! }
- public var Paint_ClearConfirm: String { return self._s[3361]! }
- public var ChatList_ReadAll: String { return self._s[3362]! }
- public var ChatSettings_IntentsSettings: String { return self._s[3363]! }
- public var Passport_PassportInformation: String { return self._s[3365]! }
- public var Login_CheckOtherSessionMessages: String { return self._s[3367]! }
- public var Location_ProximityNotification_DistanceMI: String { return self._s[3370]! }
- public var PhotoEditor_ExposureTool: String { return self._s[3371]! }
- public var Group_Username_CreatePrivateLinkHelp: String { return self._s[3372]! }
- public var SettingsSearch_Synonyms_Watch: String { return self._s[3373]! }
- public var Stats_GroupTopPoster_History: String { return self._s[3374]! }
- public var UserInfo_AddPhone: String { return self._s[3375]! }
- public var Media_SendWithTimer: String { return self._s[3377]! }
- public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[3378]! }
- public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3379]! }
- public var PasscodeSettings_AutoLock_Disabled: String { return self._s[3380]! }
- public var ChatList_Context_Unarchive: String { return self._s[3382]! }
+ public var Channel_Stickers_Placeholder: String { return self._s[3373]! }
+ public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3374]! }
+ public var Camera_FlashAuto: String { return self._s[3375]! }
+ public var Conversation_EncryptedDescription1: String { return self._s[3376]! }
+ public var LocalGroup_Text: String { return self._s[3377]! }
+ public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[3378]! }
+ public var UserInfo_FirstNamePlaceholder: String { return self._s[3379]! }
+ public var Conversation_SendMessageErrorFlood: String { return self._s[3380]! }
+ public var Conversation_EncryptedDescription2: String { return self._s[3381]! }
+ public var Notification_GroupActivated: String { return self._s[3382]! }
+ public var LastSeen_Lately: String { return self._s[3383]! }
+ public var Conversation_EncryptedDescription3: String { return self._s[3384]! }
+ public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[3385]! }
+ public var Conversation_SwipeToReplyHintText: String { return self._s[3386]! }
+ public var Conversation_EncryptedDescription4: String { return self._s[3387]! }
+ public var SharedMedia_EmptyTitle: String { return self._s[3388]! }
+ public var Appearance_CreateTheme: String { return self._s[3389]! }
+ public var Stats_SharesPerPost: String { return self._s[3390]! }
+ public var Contacts_TabTitle: String { return self._s[3391]! }
+ public var Weekday_ShortThursday: String { return self._s[3392]! }
+ public var MessageTimer_Forever: String { return self._s[3393]! }
+ public var ChatListFolder_CategoryArchived: String { return self._s[3394]! }
+ public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3395]! }
+ public var EditTheme_Create_TopInfo: String { return self._s[3397]! }
+ public var Month_GenDecember: String { return self._s[3398]! }
+ public var EnterPasscode_EnterPasscode: String { return self._s[3399]! }
+ public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3400]! }
+ public var PeopleNearby_CreateGroup: String { return self._s[3402]! }
+ public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3403]! }
+ public var Paint_ClearConfirm: String { return self._s[3404]! }
+ public var ChatList_ReadAll: String { return self._s[3405]! }
+ public var ChatSettings_IntentsSettings: String { return self._s[3406]! }
+ public var Passport_PassportInformation: String { return self._s[3408]! }
+ public var Login_CheckOtherSessionMessages: String { return self._s[3410]! }
+ public var Location_ProximityNotification_DistanceMI: String { return self._s[3413]! }
+ public var PhotoEditor_ExposureTool: String { return self._s[3414]! }
+ public var Group_Username_CreatePrivateLinkHelp: String { return self._s[3415]! }
+ public var SettingsSearch_Synonyms_Watch: String { return self._s[3416]! }
+ public var Stats_GroupTopPoster_History: String { return self._s[3417]! }
+ public var UserInfo_AddPhone: String { return self._s[3418]! }
+ public var Media_SendWithTimer: String { return self._s[3420]! }
+ public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[3421]! }
+ public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3422]! }
+ public var PasscodeSettings_AutoLock_Disabled: String { return self._s[3423]! }
+ public var ChatList_Context_Unarchive: String { return self._s[3425]! }
public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3383]!, self._r[3383]!, [_0])
+ return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_0])
}
- public var BlockedUsers_Title: String { return self._s[3385]! }
- public var TwoStepAuth_EmailPlaceholder: String { return self._s[3386]! }
- public var Media_ShareThisPhoto: String { return self._s[3387]! }
- public var Notifications_DisplayNamesOnLockScreen: String { return self._s[3388]! }
- public var Conversation_FilePhotoOrVideo: String { return self._s[3389]! }
- public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3393]! }
- public var CallFeedback_ReasonNoise: String { return self._s[3395]! }
- public var WebBrowser_Title: String { return self._s[3396]! }
+ public var BlockedUsers_Title: String { return self._s[3428]! }
+ public var TwoStepAuth_EmailPlaceholder: String { return self._s[3429]! }
+ public var Media_ShareThisPhoto: String { return self._s[3430]! }
+ public var Notifications_DisplayNamesOnLockScreen: String { return self._s[3431]! }
+ public var Conversation_FilePhotoOrVideo: String { return self._s[3432]! }
+ public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3436]! }
+ public var CallFeedback_ReasonNoise: String { return self._s[3438]! }
+ public var WebBrowser_Title: String { return self._s[3439]! }
public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3397]!, self._r[3397]!, [_0])
+ return formatWithArgumentRanges(self._s[3440]!, self._r[3440]!, [_0])
}
- public var Notification_MessageLifetime5s: String { return self._s[3399]! }
- public var Passport_Address_AddResidentialAddress: String { return self._s[3400]! }
- public var Profile_MessageLifetime1m: String { return self._s[3402]! }
- public var Passport_ScanPassport: String { return self._s[3403]! }
- public var Stats_LoadingTitle: String { return self._s[3404]! }
- public var Passport_Address_AddTemporaryRegistration: String { return self._s[3406]! }
- public var Permissions_NotificationsAllow_v0: String { return self._s[3407]! }
- public var Login_InvalidFirstNameError: String { return self._s[3408]! }
- public var Undo_ChatCleared: String { return self._s[3410]! }
+ public var Notification_MessageLifetime5s: String { return self._s[3442]! }
+ public var Passport_Address_AddResidentialAddress: String { return self._s[3443]! }
+ public var Profile_MessageLifetime1m: String { return self._s[3445]! }
+ public var Passport_ScanPassport: String { return self._s[3446]! }
+ public var Stats_LoadingTitle: String { return self._s[3447]! }
+ public var Passport_Address_AddTemporaryRegistration: String { return self._s[3449]! }
+ public var Permissions_NotificationsAllow_v0: String { return self._s[3450]! }
+ public var Login_InvalidFirstNameError: String { return self._s[3451]! }
+ public var Undo_ChatCleared: String { return self._s[3453]! }
public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3412]!, self._r[3412]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3455]!, self._r[3455]!, [_1, _2])
}
- public var Conversation_PinMessageAlertPin: String { return self._s[3413]! }
+ public var Conversation_PinMessageAlertPin: String { return self._s[3456]! }
public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3414]!, self._r[3414]!, [_1, _2, _3, _4, _5])
+ return formatWithArgumentRanges(self._s[3457]!, self._r[3457]!, [_1, _2, _3, _4, _5])
}
public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3415]!, self._r[3415]!, [_1])
+ return formatWithArgumentRanges(self._s[3458]!, self._r[3458]!, [_1])
}
- public var Share_MultipleMessagesDisabled: String { return self._s[3416]! }
- public var TwoStepAuth_EmailInvalid: String { return self._s[3417]! }
- public var EnterPasscode_ChangeTitle: String { return self._s[3419]! }
- public var CallSettings_RecentCalls: String { return self._s[3420]! }
- public var GroupInfo_DeactivatedStatus: String { return self._s[3421]! }
- public var AuthSessions_OtherSessions: String { return self._s[3422]! }
- public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3423]! }
- public var Tour_Text5: String { return self._s[3424]! }
- public var Login_PadPhoneHelp: String { return self._s[3425]! }
- public var Wallpaper_PhotoLibrary: String { return self._s[3427]! }
- public var Conversation_ViewGroup: String { return self._s[3428]! }
- public var PeopleNearby_MakeVisibleTitle: String { return self._s[3430]! }
- public var VoiceOver_Chat_YourContact: String { return self._s[3431]! }
- public var Watch_AuthRequired: String { return self._s[3432]! }
- public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3433]! }
- public var Conversation_ForwardContacts: String { return self._s[3434]! }
- public var Conversation_InputTextPlaceholder: String { return self._s[3435]! }
+ public var Share_MultipleMessagesDisabled: String { return self._s[3459]! }
+ public var TwoStepAuth_EmailInvalid: String { return self._s[3460]! }
+ public var EnterPasscode_ChangeTitle: String { return self._s[3462]! }
+ public var CallSettings_RecentCalls: String { return self._s[3463]! }
+ public var GroupInfo_DeactivatedStatus: String { return self._s[3464]! }
+ public var AuthSessions_OtherSessions: String { return self._s[3465]! }
+ public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3466]! }
+ public var Tour_Text5: String { return self._s[3467]! }
+ public var Login_PadPhoneHelp: String { return self._s[3468]! }
+ public var Wallpaper_PhotoLibrary: String { return self._s[3470]! }
+ public var Conversation_ViewGroup: String { return self._s[3471]! }
+ public var PeopleNearby_MakeVisibleTitle: String { return self._s[3473]! }
+ public var VoiceOver_Chat_YourContact: String { return self._s[3474]! }
+ public var Watch_AuthRequired: String { return self._s[3475]! }
+ public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3476]! }
+ public var Conversation_ForwardContacts: String { return self._s[3477]! }
+ public var Conversation_InputTextPlaceholder: String { return self._s[3478]! }
public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3436]!, self._r[3436]!, [_1])
+ return formatWithArgumentRanges(self._s[3479]!, self._r[3479]!, [_1])
}
public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3437]!, self._r[3437]!, [_0])
+ return formatWithArgumentRanges(self._s[3480]!, self._r[3480]!, [_0])
}
- public var Channel_Setup_TypePrivate: String { return self._s[3438]! }
+ public var Channel_Setup_TypePrivate: String { return self._s[3481]! }
public func Conversation_NoticeInvitedByInChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3439]!, self._r[3439]!, [_0])
- }
- public var InfoPlist_NSSiriUsageDescription: String { return self._s[3440]! }
- public var AutoDownloadSettings_Delimeter: String { return self._s[3441]! }
- public var EmptyGroupInfo_Subtitle: String { return self._s[3442]! }
- public var UserInfo_StartSecretChatStart: String { return self._s[3443]! }
- public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3444]!, self._r[3444]!, [_1, _2])
- }
- public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3445]!, self._r[3445]!, [_0, _1, _2])
- }
- public var PrivacySettings_AutoArchiveTitle: String { return self._s[3446]! }
- public var GroupInfo_InviteLink_LinkSection: String { return self._s[3447]! }
- public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[3448]! }
- public var StickerPacksSettings_ArchivedMasks: String { return self._s[3450]! }
- public var NewContact_Title: String { return self._s[3453]! }
- public var Appearance_ThemeCarouselTintedNight: String { return self._s[3454]! }
- public var VoiceChat_StatusSpeaking: String { return self._s[3455]! }
- public var Notifications_PermissionsKeepDisabled: String { return self._s[3456]! }
- public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3457]!, self._r[3457]!, [_0])
- }
- public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3458]!, self._r[3458]!, [_0, _1])
- }
- public var Chat_SlowmodeTooltipPending: String { return self._s[3459]! }
- public var CallFeedback_ReasonInterruption: String { return self._s[3461]! }
- public var ContactInfo_PhoneLabelHome: String { return self._s[3462]! }
- public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[3463]! }
- public func PUSH_MESSAGE_DOCS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3465]!, self._r[3465]!, [_1, "\(_2)"])
- }
- public var Conversation_MessageEditedLabel: String { return self._s[3466]! }
- public var CallList_ActiveVoiceChatsHeader: String { return self._s[3467]! }
- public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3468]! }
- public var ChatList_Context_AddToContacts: String { return self._s[3469]! }
- public var Passport_Language_is: String { return self._s[3470]! }
- public var Notification_PassportValueProofOfIdentity: String { return self._s[3471]! }
- public var PhotoEditor_CurvesBlue: String { return self._s[3472]! }
- public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3473]!, self._r[3473]!, [_0])
- }
- public var SocksProxySetup_Username: String { return self._s[3474]! }
- public var Login_SmsRequestState3: String { return self._s[3475]! }
- public var Message_PinnedVideoMessage: String { return self._s[3476]! }
- public var SharedMedia_TitleLink: String { return self._s[3477]! }
- public var Passport_FieldIdentity: String { return self._s[3478]! }
- public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3482]!, self._r[3482]!, [_0])
}
- public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[3485]! }
- public var ReportSpam_DeleteThisChat: String { return self._s[3486]! }
- public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3487]! }
- public var Passport_Identity_DateOfBirth: String { return self._s[3488]! }
- public var Call_StatusIncoming: String { return self._s[3489]! }
- public var ChatAdmins_AdminLabel: String { return self._s[3490]! }
- public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3492]!, self._r[3492]!, [_0])
+ public var InviteLink_Create_TimeLimitExpiryDate: String { return self._s[3483]! }
+ public var InfoPlist_NSSiriUsageDescription: String { return self._s[3484]! }
+ public var AutoDownloadSettings_Delimeter: String { return self._s[3485]! }
+ public var EmptyGroupInfo_Subtitle: String { return self._s[3486]! }
+ public var UserInfo_StartSecretChatStart: String { return self._s[3487]! }
+ public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3488]!, self._r[3488]!, [_1, _2])
}
- public var Message_PinnedAnimationMessage: String { return self._s[3493]! }
- public var Conversation_ReportSpamAndLeave: String { return self._s[3494]! }
- public var Preview_CopyAddress: String { return self._s[3495]! }
- public var MediaPlayer_UnknownTrack: String { return self._s[3496]! }
- public var Login_CancelSignUpConfirmation: String { return self._s[3497]! }
- public var Map_OpenInYandexMaps: String { return self._s[3499]! }
- public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_1, _2, _3])
+ public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3489]!, self._r[3489]!, [_0, _1, _2])
}
- public var GroupRemoved_Remove: String { return self._s[3503]! }
- public var ChatListFolder_TitleCreate: String { return self._s[3504]! }
- public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3506]!, self._r[3506]!, [_1, _2])
+ public var PrivacySettings_AutoArchiveTitle: String { return self._s[3490]! }
+ public var GroupInfo_InviteLink_LinkSection: String { return self._s[3491]! }
+ public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[3492]! }
+ public var StickerPacksSettings_ArchivedMasks: String { return self._s[3494]! }
+ public var NewContact_Title: String { return self._s[3497]! }
+ public var Appearance_ThemeCarouselTintedNight: String { return self._s[3498]! }
+ public var VoiceChat_StatusSpeaking: String { return self._s[3499]! }
+ public var Notifications_PermissionsKeepDisabled: String { return self._s[3500]! }
+ public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3501]!, self._r[3501]!, [_0])
}
- public var Watch_UserInfo_MuteTitle: String { return self._s[3507]! }
- public var Group_UpgradeNoticeText2: String { return self._s[3509]! }
- public var Stats_GroupGrowthTitle: String { return self._s[3510]! }
- public var CreatePoll_CancelConfirmation: String { return self._s[3513]! }
- public var Month_GenOctober: String { return self._s[3514]! }
- public var Conversation_TitleCommentsEmpty: String { return self._s[3515]! }
- public var Settings_Appearance: String { return self._s[3516]! }
- public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) {
+ public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3502]!, self._r[3502]!, [_0, _1])
+ }
+ public var Chat_SlowmodeTooltipPending: String { return self._s[3503]! }
+ public var CallFeedback_ReasonInterruption: String { return self._s[3505]! }
+ public var ContactInfo_PhoneLabelHome: String { return self._s[3506]! }
+ public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[3507]! }
+ public func PUSH_MESSAGE_DOCS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3509]!, self._r[3509]!, [_1, "\(_2)"])
+ }
+ public var Conversation_MessageEditedLabel: String { return self._s[3510]! }
+ public var CallList_ActiveVoiceChatsHeader: String { return self._s[3511]! }
+ public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3512]! }
+ public var ChatList_Context_AddToContacts: String { return self._s[3513]! }
+ public var Passport_Language_is: String { return self._s[3514]! }
+ public var Notification_PassportValueProofOfIdentity: String { return self._s[3515]! }
+ public var PhotoEditor_CurvesBlue: String { return self._s[3516]! }
+ public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3517]!, self._r[3517]!, [_0])
}
- public var UserInfo_AddToExisting: String { return self._s[3518]! }
- public var Call_PhoneCallInProgressMessage: String { return self._s[3519]! }
- public var Map_HomeAndWorkInfo: String { return self._s[3520]! }
- public var Paint_Arrow: String { return self._s[3521]! }
- public var CancelResetAccount_Title: String { return self._s[3522]! }
- public var NotificationsSound_Circles: String { return self._s[3523]! }
- public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[3524]! }
- public var ChatState_Connecting: String { return self._s[3526]! }
- public var Profile_MessageLifetime5s: String { return self._s[3527]! }
+ public var SocksProxySetup_Username: String { return self._s[3518]! }
+ public var Login_SmsRequestState3: String { return self._s[3519]! }
+ public var Message_PinnedVideoMessage: String { return self._s[3520]! }
+ public var SharedMedia_TitleLink: String { return self._s[3521]! }
+ public var Passport_FieldIdentity: String { return self._s[3522]! }
+ public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3526]!, self._r[3526]!, [_0])
+ }
+ public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[3529]! }
+ public var ReportSpam_DeleteThisChat: String { return self._s[3530]! }
+ public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3531]! }
+ public var Passport_Identity_DateOfBirth: String { return self._s[3532]! }
+ public var Call_StatusIncoming: String { return self._s[3533]! }
+ public var ChatAdmins_AdminLabel: String { return self._s[3534]! }
+ public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3536]!, self._r[3536]!, [_0])
+ }
+ public var Message_PinnedAnimationMessage: String { return self._s[3537]! }
+ public var Conversation_ReportSpamAndLeave: String { return self._s[3538]! }
+ public var Preview_CopyAddress: String { return self._s[3539]! }
+ public var MediaPlayer_UnknownTrack: String { return self._s[3540]! }
+ public var Login_CancelSignUpConfirmation: String { return self._s[3541]! }
+ public var Map_OpenInYandexMaps: String { return self._s[3543]! }
+ public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3546]!, self._r[3546]!, [_1, _2, _3])
+ }
+ public var GroupRemoved_Remove: String { return self._s[3547]! }
+ public var ChatListFolder_TitleCreate: String { return self._s[3548]! }
+ public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3550]!, self._r[3550]!, [_1, _2])
+ }
+ public var Watch_UserInfo_MuteTitle: String { return self._s[3551]! }
+ public var Group_UpgradeNoticeText2: String { return self._s[3553]! }
+ public var Stats_GroupGrowthTitle: String { return self._s[3554]! }
+ public var CreatePoll_CancelConfirmation: String { return self._s[3557]! }
+ public var Month_GenOctober: String { return self._s[3558]! }
+ public var Conversation_TitleCommentsEmpty: String { return self._s[3559]! }
+ public var Settings_Appearance: String { return self._s[3560]! }
+ public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_0])
+ }
+ public var UserInfo_AddToExisting: String { return self._s[3562]! }
+ public var Call_PhoneCallInProgressMessage: String { return self._s[3563]! }
+ public var Map_HomeAndWorkInfo: String { return self._s[3564]! }
+ public var Paint_Arrow: String { return self._s[3565]! }
+ public var InviteLink_CreatePrivateLinkHelp: String { return self._s[3566]! }
+ public func DialogList_MultipleTypingPair(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3567]!, self._r[3567]!, [_0, _1])
+ }
+ public var CancelResetAccount_Title: String { return self._s[3568]! }
+ public var NotificationsSound_Circles: String { return self._s[3569]! }
+ public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[3570]! }
+ public var ChatState_Connecting: String { return self._s[3572]! }
+ public var Profile_MessageLifetime5s: String { return self._s[3573]! }
public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3528]!, self._r[3528]!, [_0])
+ return formatWithArgumentRanges(self._s[3574]!, self._r[3574]!, [_0])
}
- public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[3529]! }
- public var Channel_Username_CreatePublicLinkHelp: String { return self._s[3530]! }
- public var AutoNightTheme_ScheduledTo: String { return self._s[3531]! }
- public var Conversation_DefaultRestrictedStickers: String { return self._s[3532]! }
- public var TwoStepAuth_ConfirmationTitle: String { return self._s[3533]! }
+ public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[3575]! }
+ public var Channel_Username_CreatePublicLinkHelp: String { return self._s[3576]! }
+ public var AutoNightTheme_ScheduledTo: String { return self._s[3577]! }
+ public var Conversation_DefaultRestrictedStickers: String { return self._s[3578]! }
+ public var TwoStepAuth_ConfirmationTitle: String { return self._s[3579]! }
public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3534]!, self._r[3534]!, [_0])
+ return formatWithArgumentRanges(self._s[3580]!, self._r[3580]!, [_0])
}
- public var Passport_Phone_Help: String { return self._s[3535]! }
- public var Privacy_ContactsSync: String { return self._s[3536]! }
- public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3537]! }
- public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[3538]! }
- public var Map_SendMyCurrentLocation: String { return self._s[3539]! }
- public var Map_AddressOnMap: String { return self._s[3540]! }
- public var DialogList_SearchLabel: String { return self._s[3542]! }
- public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3543]! }
- public var ConversationProfile_UnknownAddMemberError: String { return self._s[3544]! }
- public var ChatList_Search_ShowMore: String { return self._s[3545]! }
- public var DialogList_EncryptionRejected: String { return self._s[3546]! }
- public var VoiceChat_InviteLinkCopiedText: String { return self._s[3547]! }
- public var DialogList_DeleteBotConfirmation: String { return self._s[3548]! }
- public var VoiceChat_StartRecordingText: String { return self._s[3549]! }
- public var Privacy_TopPeersDelete: String { return self._s[3550]! }
- public var AttachmentMenu_SendAsFile: String { return self._s[3551]! }
- public var ChatList_GenericPsaAlert: String { return self._s[3553]! }
- public var SecretTimer_ImageDescription: String { return self._s[3555]! }
+ public var Passport_Phone_Help: String { return self._s[3581]! }
+ public var Privacy_ContactsSync: String { return self._s[3582]! }
+ public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3583]! }
+ public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[3584]! }
+ public var Map_SendMyCurrentLocation: String { return self._s[3585]! }
+ public var Map_AddressOnMap: String { return self._s[3586]! }
+ public var DialogList_SearchLabel: String { return self._s[3588]! }
+ public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3589]! }
+ public var Conversation_ChecksTooltip_Read: String { return self._s[3590]! }
+ public var ConversationProfile_UnknownAddMemberError: String { return self._s[3591]! }
+ public var ChatList_Search_ShowMore: String { return self._s[3592]! }
+ public var DialogList_EncryptionRejected: String { return self._s[3593]! }
+ public var VoiceChat_InviteLinkCopiedText: String { return self._s[3594]! }
+ public var DialogList_DeleteBotConfirmation: String { return self._s[3595]! }
+ public var VoiceChat_StartRecordingText: String { return self._s[3596]! }
+ public var Privacy_TopPeersDelete: String { return self._s[3597]! }
+ public var AttachmentMenu_SendAsFile: String { return self._s[3599]! }
+ public var ChatList_GenericPsaAlert: String { return self._s[3601]! }
+ public var SecretTimer_ImageDescription: String { return self._s[3603]! }
public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3556]!, self._r[3556]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_0, _1])
}
- public var ChatSettings_TextSizeUnits: String { return self._s[3557]! }
- public var Notification_RenamedGroup: String { return self._s[3558]! }
- public var Tour_Title2: String { return self._s[3559]! }
- public var Settings_CopyUsername: String { return self._s[3560]! }
- public var Compose_NewEncryptedChat: String { return self._s[3561]! }
- public var Conversation_CloudStorageInfo_Title: String { return self._s[3562]! }
- public var Month_ShortSeptember: String { return self._s[3563]! }
- public var AutoDownloadSettings_OnForAll: String { return self._s[3564]! }
- public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[3565]! }
- public var Call_StatusConnecting: String { return self._s[3567]! }
- public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[3568]! }
- public var Map_ShareLiveLocationHelp: String { return self._s[3569]! }
- public var Cache_Files: String { return self._s[3570]! }
- public var Notifications_Reset: String { return self._s[3571]! }
+ public var ChatSettings_TextSizeUnits: String { return self._s[3605]! }
+ public var Notification_RenamedGroup: String { return self._s[3606]! }
+ public var Tour_Title2: String { return self._s[3607]! }
+ public var Settings_CopyUsername: String { return self._s[3608]! }
+ public var Compose_NewEncryptedChat: String { return self._s[3609]! }
+ public var Conversation_CloudStorageInfo_Title: String { return self._s[3610]! }
+ public var Month_ShortSeptember: String { return self._s[3611]! }
+ public var AutoDownloadSettings_OnForAll: String { return self._s[3612]! }
+ public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[3613]! }
+ public var Call_StatusConnecting: String { return self._s[3615]! }
+ public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[3616]! }
+ public var Map_ShareLiveLocationHelp: String { return self._s[3617]! }
+ public var Cache_Files: String { return self._s[3618]! }
+ public var Notifications_Reset: String { return self._s[3619]! }
public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3572]!, self._r[3572]!, [_0])
+ return formatWithArgumentRanges(self._s[3620]!, self._r[3620]!, [_0])
}
- public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[3573]! }
+ public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[3621]! }
public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3574]!, self._r[3574]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3622]!, self._r[3622]!, [_1, _2])
}
- public var Notification_CallIncomingShort: String { return self._s[3575]! }
- public var UserInfo_BotPrivacy: String { return self._s[3577]! }
- public var Appearance_BubbleCorners_Apply: String { return self._s[3578]! }
- public var WebSearch_RecentClearConfirmation: String { return self._s[3579]! }
- public var Conversation_ContextMenuLookUp: String { return self._s[3580]! }
- public var Calls_RatingTitle: String { return self._s[3581]! }
- public var SecretImage_Title: String { return self._s[3582]! }
- public var Weekday_Monday: String { return self._s[3583]! }
+ public var Notification_CallIncomingShort: String { return self._s[3623]! }
+ public var UserInfo_BotPrivacy: String { return self._s[3625]! }
+ public var Appearance_BubbleCorners_Apply: String { return self._s[3626]! }
+ public var WebSearch_RecentClearConfirmation: String { return self._s[3627]! }
+ public var Conversation_ContextMenuLookUp: String { return self._s[3628]! }
+ public var Calls_RatingTitle: String { return self._s[3629]! }
+ public var SecretImage_Title: String { return self._s[3630]! }
+ public var Weekday_Monday: String { return self._s[3631]! }
public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3584]!, self._r[3584]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3632]!, self._r[3632]!, [_1, _2])
}
- public var KeyCommand_JumpToPreviousChat: String { return self._s[3585]! }
+ public var KeyCommand_JumpToPreviousChat: String { return self._s[3633]! }
public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3586]!, self._r[3586]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3634]!, self._r[3634]!, [_1, _2])
}
- public var Stats_GroupMembers: String { return self._s[3587]! }
- public var Camera_Retake: String { return self._s[3588]! }
- public var Conversation_SearchPlaceholder: String { return self._s[3590]! }
+ public var Stats_GroupMembers: String { return self._s[3635]! }
+ public var Camera_Retake: String { return self._s[3636]! }
+ public var Conversation_SearchPlaceholder: String { return self._s[3638]! }
public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3591]!, self._r[3591]!, [_0])
+ return formatWithArgumentRanges(self._s[3639]!, self._r[3639]!, [_0])
}
- public var Channel_DiscussionGroup_Info: String { return self._s[3592]! }
- public var SocksProxySetup_Hostname: String { return self._s[3593]! }
- public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3594]! }
- public var Privacy_DeleteDrafts: String { return self._s[3596]! }
+ public var Channel_DiscussionGroup_Info: String { return self._s[3640]! }
+ public var SocksProxySetup_Hostname: String { return self._s[3641]! }
+ public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3642]! }
+ public var Privacy_DeleteDrafts: String { return self._s[3644]! }
public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3597]!, self._r[3597]!, [_1, _1, _1, _2])
+ return formatWithArgumentRanges(self._s[3645]!, self._r[3645]!, [_1, _1, _1, _2])
}
- public var Login_CancelPhoneVerification: String { return self._s[3599]! }
- public var TwoStepAuth_ResetAccountHelp: String { return self._s[3600]! }
+ public var Login_CancelPhoneVerification: String { return self._s[3647]! }
+ public var TwoStepAuth_ResetAccountHelp: String { return self._s[3648]! }
public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3601]!, self._r[3601]!, [_0])
+ return formatWithArgumentRanges(self._s[3649]!, self._r[3649]!, [_0])
}
- public var TwoStepAuth_EmailSent: String { return self._s[3602]! }
- public var Cache_Indexing: String { return self._s[3603]! }
- public var Notifications_ExceptionsNone: String { return self._s[3604]! }
- public var MessagePoll_LabelQuiz: String { return self._s[3605]! }
- public var Call_EncryptionKey_Title: String { return self._s[3606]! }
- public var Common_Yes: String { return self._s[3607]! }
- public var Channel_ErrorAddBlocked: String { return self._s[3608]! }
- public var Month_GenJanuary: String { return self._s[3609]! }
- public var Checkout_NewCard_Title: String { return self._s[3610]! }
+ public var TwoStepAuth_EmailSent: String { return self._s[3650]! }
+ public var Cache_Indexing: String { return self._s[3651]! }
+ public var Notifications_ExceptionsNone: String { return self._s[3652]! }
+ public var MessagePoll_LabelQuiz: String { return self._s[3653]! }
+ public var Call_EncryptionKey_Title: String { return self._s[3654]! }
+ public var Common_Yes: String { return self._s[3655]! }
+ public var Channel_ErrorAddBlocked: String { return self._s[3656]! }
+ public var Month_GenJanuary: String { return self._s[3657]! }
+ public var Checkout_NewCard_Title: String { return self._s[3658]! }
public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3611]!, self._r[3611]!, [_0])
+ return formatWithArgumentRanges(self._s[3659]!, self._r[3659]!, [_0])
}
- public var Conversation_InputTextPlaceholderReply: String { return self._s[3613]! }
- public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3614]! }
- public var Conversation_SendDice: String { return self._s[3615]! }
+ public var Conversation_InputTextPlaceholderReply: String { return self._s[3661]! }
+ public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3662]! }
+ public var Conversation_SendDice: String { return self._s[3663]! }
public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3616]!, self._r[3616]!, [_0])
+ return formatWithArgumentRanges(self._s[3664]!, self._r[3664]!, [_0])
}
public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3617]!, self._r[3617]!, [_0])
+ return formatWithArgumentRanges(self._s[3665]!, self._r[3665]!, [_0])
}
- public var Weekday_Wednesday: String { return self._s[3618]! }
- public var ReportPeer_ReasonOther_Send: String { return self._s[3619]! }
- public var PasscodeSettings_EncryptDataHelp: String { return self._s[3620]! }
- public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[3621]! }
- public var OldChannels_NoticeTitle: String { return self._s[3622]! }
- public var TwoStepAuth_ChangeEmail: String { return self._s[3623]! }
- public var PasscodeSettings_PasscodeOptions: String { return self._s[3624]! }
- public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[3625]! }
- public var Passport_Address_AddUtilityBill: String { return self._s[3626]! }
+ public var Weekday_Wednesday: String { return self._s[3666]! }
+ public var ReportPeer_ReasonOther_Send: String { return self._s[3667]! }
+ public var PasscodeSettings_EncryptDataHelp: String { return self._s[3668]! }
+ public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[3669]! }
+ public var OldChannels_NoticeTitle: String { return self._s[3670]! }
+ public var TwoStepAuth_ChangeEmail: String { return self._s[3671]! }
+ public var PasscodeSettings_PasscodeOptions: String { return self._s[3672]! }
+ public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[3673]! }
+ public var Passport_Address_AddUtilityBill: String { return self._s[3674]! }
public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3628]!, self._r[3628]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[3676]!, self._r[3676]!, [_1, _2, _3])
}
- public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[3630]! }
- public var Stats_GroupTopAdminsTitle: String { return self._s[3631]! }
- public var Paint_Regular: String { return self._s[3632]! }
- public var Message_Contact: String { return self._s[3633]! }
- public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[3634]! }
- public var VoiceOver_Chat_YourPhoto: String { return self._s[3635]! }
- public var Notification_Mute1hMin: String { return self._s[3636]! }
+ public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[3678]! }
+ public var Stats_GroupTopAdminsTitle: String { return self._s[3679]! }
+ public var Paint_Regular: String { return self._s[3680]! }
+ public var Message_Contact: String { return self._s[3681]! }
+ public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[3682]! }
+ public var VoiceOver_Chat_YourPhoto: String { return self._s[3683]! }
+ public var Notification_Mute1hMin: String { return self._s[3684]! }
public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3637]!, self._r[3637]!, [_0])
+ return formatWithArgumentRanges(self._s[3685]!, self._r[3685]!, [_0])
}
- public var Profile_MessageLifetime1h: String { return self._s[3638]! }
- public var TwoStepAuth_GenericHelp: String { return self._s[3639]! }
- public var TextFormat_Monospace: String { return self._s[3640]! }
- public var VoiceOver_Media_PlaybackRateChange: String { return self._s[3642]! }
- public var Conversation_DeleteMessagesForMe: String { return self._s[3643]! }
- public var ChatList_DeleteChat: String { return self._s[3644]! }
- public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[3647]! }
+ public var Profile_MessageLifetime1h: String { return self._s[3686]! }
+ public var TwoStepAuth_GenericHelp: String { return self._s[3687]! }
+ public var TextFormat_Monospace: String { return self._s[3688]! }
+ public var VoiceOver_Media_PlaybackRateChange: String { return self._s[3690]! }
+ public var Conversation_DeleteMessagesForMe: String { return self._s[3691]! }
+ public var ChatList_DeleteChat: String { return self._s[3692]! }
+ public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[3695]! }
public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3648]!, self._r[3648]!, [_1, _2, _3, _4])
+ return formatWithArgumentRanges(self._s[3696]!, self._r[3696]!, [_1, _2, _3, _4])
}
- public var Login_CancelPhoneVerificationStop: String { return self._s[3649]! }
- public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[3650]! }
- public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[3651]! }
+ public var Login_CancelPhoneVerificationStop: String { return self._s[3697]! }
+ public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[3698]! }
+ public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[3699]! }
public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3652]!, self._r[3652]!, [_0])
+ return formatWithArgumentRanges(self._s[3700]!, self._r[3700]!, [_0])
}
- public var Notifications_Badge_IncludeChannels: String { return self._s[3653]! }
- public var StickerPack_ViewPack: String { return self._s[3656]! }
- public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[3658]! }
- public var EditTheme_Expand_Preview_IncomingText: String { return self._s[3659]! }
- public var Notifications_Title: String { return self._s[3660]! }
- public var Conversation_InputTextPlaceholderComment: String { return self._s[3661]! }
- public var GroupInfo_PublicLink: String { return self._s[3662]! }
- public var VoiceOver_DiscardPreparedContent: String { return self._s[3663]! }
- public var Conversation_Moderate_Ban: String { return self._s[3667]! }
+ public var Notifications_Badge_IncludeChannels: String { return self._s[3701]! }
+ public var StickerPack_ViewPack: String { return self._s[3704]! }
+ public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[3706]! }
+ public var EditTheme_Expand_Preview_IncomingText: String { return self._s[3707]! }
+ public var Notifications_Title: String { return self._s[3708]! }
+ public var Conversation_InputTextPlaceholderComment: String { return self._s[3709]! }
+ public var GroupInfo_PublicLink: String { return self._s[3710]! }
+ public var VoiceOver_DiscardPreparedContent: String { return self._s[3711]! }
+ public var Conversation_Moderate_Ban: String { return self._s[3715]! }
+ public var InviteLink_Manage: String { return self._s[3716]! }
public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3668]!, self._r[3668]!, [_0])
+ return formatWithArgumentRanges(self._s[3717]!, self._r[3717]!, [_0])
}
- public var TextFormat_Underline: String { return self._s[3669]! }
+ public var TextFormat_Underline: String { return self._s[3718]! }
public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3670]!, self._r[3670]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[3719]!, self._r[3719]!, [_0, _1])
}
public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3671]!, self._r[3671]!, [_1])
+ return formatWithArgumentRanges(self._s[3720]!, self._r[3720]!, [_1])
}
- public var PollResults_Collapse: String { return self._s[3673]! }
- public var Contacts_GlobalSearch: String { return self._s[3674]! }
+ public var PollResults_Collapse: String { return self._s[3722]! }
+ public var Contacts_GlobalSearch: String { return self._s[3723]! }
public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3675]!, self._r[3675]!, [_0])
+ return formatWithArgumentRanges(self._s[3725]!, self._r[3725]!, [_0])
}
- public var Channel_Management_LabelEditor: String { return self._s[3676]! }
- public var Conversation_VoiceChatMediaRecordingRestricted: String { return self._s[3677]! }
- public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[3678]! }
- public var Conversation_Theme: String { return self._s[3679]! }
+ public var Channel_Management_LabelEditor: String { return self._s[3726]! }
+ public var Conversation_VoiceChatMediaRecordingRestricted: String { return self._s[3727]! }
+ public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[3728]! }
+ public var Conversation_Theme: String { return self._s[3729]! }
public func PUSH_CHANNEL_MESSAGE_DOCS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3680]!, self._r[3680]!, [_1, "\(_2)"])
+ return formatWithArgumentRanges(self._s[3730]!, self._r[3730]!, [_1, "\(_2)"])
}
- public var Conversation_LinkDialogSave: String { return self._s[3681]! }
- public var EnterPasscode_TouchId: String { return self._s[3682]! }
- public var Stats_MessageOverview: String { return self._s[3684]! }
- public var Privacy_Calls_P2PAlways: String { return self._s[3686]! }
- public var Message_Sticker: String { return self._s[3687]! }
- public var Conversation_Mute: String { return self._s[3689]! }
- public var VoiceChat_AnonymousDisabledAlertText: String { return self._s[3690]! }
- public var ContactInfo_Title: String { return self._s[3691]! }
+ public var Conversation_LinkDialogSave: String { return self._s[3731]! }
+ public var EnterPasscode_TouchId: String { return self._s[3732]! }
+ public var Stats_MessageOverview: String { return self._s[3734]! }
+ public var Privacy_Calls_P2PAlways: String { return self._s[3736]! }
+ public var Message_Sticker: String { return self._s[3737]! }
+ public var Conversation_Mute: String { return self._s[3739]! }
+ public var VoiceChat_AnonymousDisabledAlertText: String { return self._s[3740]! }
+ public var ContactInfo_Title: String { return self._s[3741]! }
public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3692]!, self._r[3692]!, [_1])
+ return formatWithArgumentRanges(self._s[3742]!, self._r[3742]!, [_1])
}
- public var Channel_Setup_TypeHeader: String { return self._s[3693]! }
- public var AuthSessions_LogOut: String { return self._s[3694]! }
- public var ChatSettings_AutoDownloadReset: String { return self._s[3695]! }
- public var ChatListFolderSettings_NewFolder: String { return self._s[3697]! }
- public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3698]! }
- public var CreatePoll_Title: String { return self._s[3699]! }
- public var EditTheme_EditTitle: String { return self._s[3700]! }
- public var ChatListFolderSettings_RecommendedFoldersSection: String { return self._s[3701]! }
- public var TwoStepAuth_SetPassword: String { return self._s[3702]! }
+ public var Channel_Setup_TypeHeader: String { return self._s[3743]! }
+ public var AuthSessions_LogOut: String { return self._s[3744]! }
+ public var ChatSettings_AutoDownloadReset: String { return self._s[3745]! }
+ public var ChatListFolderSettings_NewFolder: String { return self._s[3747]! }
+ public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3748]! }
+ public var CreatePoll_Title: String { return self._s[3749]! }
+ public var EditTheme_EditTitle: String { return self._s[3750]! }
+ public var ChatListFolderSettings_RecommendedFoldersSection: String { return self._s[3751]! }
+ public var TwoStepAuth_SetPassword: String { return self._s[3752]! }
public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3703]!, self._r[3703]!, [_0])
- }
- public var BlockedUsers_Info: String { return self._s[3704]! }
- public var AuthSessions_Sessions: String { return self._s[3705]! }
- public var Group_EditAdmin_RankTitle: String { return self._s[3706]! }
- public var Common_ActionNotAllowedError: String { return self._s[3707]! }
- public var WebPreview_GettingLinkInfo: String { return self._s[3708]! }
- public var Appearance_AppIconFilledX: String { return self._s[3709]! }
- public var Passport_Email_EmailPlaceholder: String { return self._s[3710]! }
- public var FeaturedStickers_OtherSection: String { return self._s[3711]! }
- public var VoiceChat_RecordingStarted: String { return self._s[3712]! }
- public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[3713]! }
- public var Profile_Username: String { return self._s[3714]! }
- public var Appearance_RemoveTheme: String { return self._s[3715]! }
- public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[3716]! }
- public var Message_PinnedStickerMessage: String { return self._s[3717]! }
- public var AccessDenied_VideoMicrophone: String { return self._s[3718]! }
- public var WallpaperPreview_CustomColorBottomText: String { return self._s[3719]! }
- public var Passport_Address_RegionPlaceholder: String { return self._s[3720]! }
- public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[3721]! }
- public var TwoStepAuth_Title: String { return self._s[3722]! }
- public var Checkout_WebConfirmation_Title: String { return self._s[3723]! }
- public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[3724]! }
- public var ChatListFolder_CategoryGroups: String { return self._s[3726]! }
- public var Stats_GroupTopInviter_Promote: String { return self._s[3727]! }
- public var Conversation_EditingPhotoPanelTitle: String { return self._s[3728]! }
- public var Month_GenJuly: String { return self._s[3729]! }
- public var Passport_Identity_Gender: String { return self._s[3730]! }
- public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3731]! }
- public var Notification_Exceptions_DeleteAll: String { return self._s[3732]! }
- public var VoiceChat_StopRecording: String { return self._s[3733]! }
- public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3734]!, self._r[3734]!, [_0])
- }
- public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3735]!, self._r[3735]!, [_0, _1, _2])
- }
- public var Login_CodeSentSms: String { return self._s[3736]! }
- public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3737]!, self._r[3737]!, [_0])
- }
- public var Login_CallRequestState2: String { return self._s[3738]! }
- public var Channel_DiscussionGroup_Header: String { return self._s[3739]! }
- public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3740]!, self._r[3740]!, [_0])
- }
- public var Passport_Language_ms: String { return self._s[3741]! }
- public var PeopleNearby_MakeInvisible: String { return self._s[3743]! }
- public var ChatList_Search_FilterVoice: String { return self._s[3745]! }
- public var Camera_TapAndHoldForVideo: String { return self._s[3747]! }
- public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[3748]! }
- public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3749]!, self._r[3749]!, [_0])
- }
- public func Call_VoiceChatInProgressMessageCall(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3750]!, self._r[3750]!, [_1, _2])
- }
- public var Map_Locating: String { return self._s[3751]! }
- public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3753]!, self._r[3753]!, [_0])
}
- public var Passport_Identity_TypeInternalPassport: String { return self._s[3755]! }
- public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3756]! }
- public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[3757]! }
- public var Stickers_Installed: String { return self._s[3758]! }
- public var Notifications_PermissionsAllowInSettings: String { return self._s[3759]! }
- public var StickerPackActionInfo_RemovedTitle: String { return self._s[3760]! }
- public var CallSettings_Never: String { return self._s[3762]! }
- public var Channel_Setup_TypePublicHelp: String { return self._s[3763]! }
- public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3765]!, self._r[3765]!, [_0])
+ public var BlockedUsers_Info: String { return self._s[3754]! }
+ public var AuthSessions_Sessions: String { return self._s[3755]! }
+ public var Group_EditAdmin_RankTitle: String { return self._s[3756]! }
+ public var Common_ActionNotAllowedError: String { return self._s[3757]! }
+ public var WebPreview_GettingLinkInfo: String { return self._s[3758]! }
+ public var Appearance_AppIconFilledX: String { return self._s[3759]! }
+ public var Passport_Email_EmailPlaceholder: String { return self._s[3760]! }
+ public var FeaturedStickers_OtherSection: String { return self._s[3761]! }
+ public var VoiceChat_RecordingStarted: String { return self._s[3762]! }
+ public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[3763]! }
+ public var Profile_Username: String { return self._s[3764]! }
+ public var Appearance_RemoveTheme: String { return self._s[3765]! }
+ public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[3766]! }
+ public var Message_PinnedStickerMessage: String { return self._s[3767]! }
+ public var AccessDenied_VideoMicrophone: String { return self._s[3768]! }
+ public var WallpaperPreview_CustomColorBottomText: String { return self._s[3769]! }
+ public var Passport_Address_RegionPlaceholder: String { return self._s[3770]! }
+ public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[3771]! }
+ public var TwoStepAuth_Title: String { return self._s[3772]! }
+ public var Checkout_WebConfirmation_Title: String { return self._s[3773]! }
+ public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[3774]! }
+ public var ChatListFolder_CategoryGroups: String { return self._s[3776]! }
+ public var Stats_GroupTopInviter_Promote: String { return self._s[3777]! }
+ public var Conversation_EditingPhotoPanelTitle: String { return self._s[3778]! }
+ public var Month_GenJuly: String { return self._s[3779]! }
+ public var Passport_Identity_Gender: String { return self._s[3780]! }
+ public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3781]! }
+ public var Notification_Exceptions_DeleteAll: String { return self._s[3782]! }
+ public var VoiceChat_StopRecording: String { return self._s[3783]! }
+ public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3784]!, self._r[3784]!, [_0])
}
- public var Message_Game: String { return self._s[3766]! }
- public var Call_Message: String { return self._s[3767]! }
- public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3768]!, self._r[3768]!, [_1])
+ public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3785]!, self._r[3785]!, [_0, _1, _2])
}
- public var ChannelIntro_Text: String { return self._s[3769]! }
- public var StickerPack_Send: String { return self._s[3770]! }
- public var Share_AuthDescription: String { return self._s[3771]! }
- public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[3772]! }
- public var CallFeedback_WhatWentWrong: String { return self._s[3773]! }
- public var Common_Create: String { return self._s[3776]! }
- public var Passport_Language_hy: String { return self._s[3777]! }
- public var CreatePoll_Explanation: String { return self._s[3778]! }
- public var GroupPermission_AddMembersNotAvailable: String { return self._s[3779]! }
- public var PeerInfo_ButtonVoiceChat: String { return self._s[3780]! }
- public var Undo_ChatClearedForBothSides: String { return self._s[3781]! }
- public var DialogList_NoMessagesTitle: String { return self._s[3782]! }
- public var GroupInfo_Title: String { return self._s[3784]! }
- public var Channel_AdminLog_CanBanUsers: String { return self._s[3785]! }
- public var PhoneNumberHelp_Help: String { return self._s[3786]! }
- public var TwoStepAuth_AdditionalPassword: String { return self._s[3787]! }
- public var Settings_Logout: String { return self._s[3788]! }
- public var Privacy_PaymentsTitle: String { return self._s[3789]! }
- public var StickerPacksSettings_StickerPacksSection: String { return self._s[3790]! }
- public var Tour_Text6: String { return self._s[3791]! }
- public var Channel_Username_Help: String { return self._s[3793]! }
- public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[3794]! }
- public var AttachmentMenu_Poll: String { return self._s[3795]! }
- public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[3796]! }
- public var Conversation_ReportSpamChannelConfirmation: String { return self._s[3797]! }
- public var Passport_DeletePassport: String { return self._s[3798]! }
- public var Login_Code: String { return self._s[3799]! }
- public var Notification_SecretChatScreenshot: String { return self._s[3800]! }
- public var Login_CodeFloodError: String { return self._s[3801]! }
- public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3802]!, self._r[3802]!, [_0])
+ public var Login_CodeSentSms: String { return self._s[3786]! }
+ public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3787]!, self._r[3787]!, [_0])
}
- public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) {
+ public var Login_CallRequestState2: String { return self._s[3788]! }
+ public var Channel_DiscussionGroup_Header: String { return self._s[3789]! }
+ public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3790]!, self._r[3790]!, [_0])
+ }
+ public var Passport_Language_ms: String { return self._s[3791]! }
+ public var PeopleNearby_MakeInvisible: String { return self._s[3793]! }
+ public var ChatList_Search_FilterVoice: String { return self._s[3795]! }
+ public var Camera_TapAndHoldForVideo: String { return self._s[3797]! }
+ public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[3798]! }
+ public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3799]!, self._r[3799]!, [_0])
+ }
+ public func Call_VoiceChatInProgressMessageCall(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3800]!, self._r[3800]!, [_1, _2])
+ }
+ public var Map_Locating: String { return self._s[3801]! }
+ public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3803]!, self._r[3803]!, [_0])
}
- public var Watch_Stickers_Recents: String { return self._s[3804]! }
- public var Generic_ErrorMoreInfo: String { return self._s[3805]! }
+ public var Passport_Identity_TypeInternalPassport: String { return self._s[3805]! }
+ public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3806]! }
+ public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[3807]! }
+ public var Stickers_Installed: String { return self._s[3808]! }
+ public var Notifications_PermissionsAllowInSettings: String { return self._s[3809]! }
+ public var StickerPackActionInfo_RemovedTitle: String { return self._s[3810]! }
+ public var CallSettings_Never: String { return self._s[3812]! }
+ public var Channel_Setup_TypePublicHelp: String { return self._s[3813]! }
+ public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3815]!, self._r[3815]!, [_0])
+ }
+ public var Message_Game: String { return self._s[3816]! }
+ public var Call_Message: String { return self._s[3817]! }
+ public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3818]!, self._r[3818]!, [_1])
+ }
+ public var ChannelIntro_Text: String { return self._s[3819]! }
+ public var StickerPack_Send: String { return self._s[3820]! }
+ public var Share_AuthDescription: String { return self._s[3821]! }
+ public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[3822]! }
+ public var CallFeedback_WhatWentWrong: String { return self._s[3823]! }
+ public var Common_Create: String { return self._s[3826]! }
+ public var Passport_Language_hy: String { return self._s[3827]! }
+ public var CreatePoll_Explanation: String { return self._s[3828]! }
+ public var GroupPermission_AddMembersNotAvailable: String { return self._s[3829]! }
+ public var PeerInfo_ButtonVoiceChat: String { return self._s[3830]! }
+ public var Undo_ChatClearedForBothSides: String { return self._s[3831]! }
+ public var DialogList_NoMessagesTitle: String { return self._s[3832]! }
+ public var GroupInfo_Title: String { return self._s[3834]! }
+ public var Channel_AdminLog_CanBanUsers: String { return self._s[3835]! }
+ public var PhoneNumberHelp_Help: String { return self._s[3836]! }
+ public var TwoStepAuth_AdditionalPassword: String { return self._s[3837]! }
+ public var Settings_Logout: String { return self._s[3838]! }
+ public var Privacy_PaymentsTitle: String { return self._s[3839]! }
+ public var StickerPacksSettings_StickerPacksSection: String { return self._s[3840]! }
+ public var Tour_Text6: String { return self._s[3841]! }
+ public var Channel_Username_Help: String { return self._s[3843]! }
+ public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[3844]! }
+ public var AttachmentMenu_Poll: String { return self._s[3845]! }
+ public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[3846]! }
+ public var Conversation_ReportSpamChannelConfirmation: String { return self._s[3847]! }
+ public var Passport_DeletePassport: String { return self._s[3848]! }
+ public var Login_Code: String { return self._s[3849]! }
+ public var Notification_SecretChatScreenshot: String { return self._s[3850]! }
+ public var Login_CodeFloodError: String { return self._s[3851]! }
+ public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3852]!, self._r[3852]!, [_0])
+ }
+ public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3853]!, self._r[3853]!, [_0])
+ }
+ public var Watch_Stickers_Recents: String { return self._s[3854]! }
+ public var Generic_ErrorMoreInfo: String { return self._s[3855]! }
public func Call_AccountIsLoggedOnCurrentDevice(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3806]!, self._r[3806]!, [_0])
+ return formatWithArgumentRanges(self._s[3856]!, self._r[3856]!, [_0])
}
- public var AutoDownloadSettings_DataUsage: String { return self._s[3807]! }
- public var Conversation_ViewTheme: String { return self._s[3808]! }
- public var Contacts_InviteSearchLabel: String { return self._s[3809]! }
- public var Settings_CancelUpload: String { return self._s[3811]! }
- public var Settings_AppLanguage_Unofficial: String { return self._s[3812]! }
+ public var AutoDownloadSettings_DataUsage: String { return self._s[3857]! }
+ public var Conversation_ViewTheme: String { return self._s[3858]! }
+ public var Contacts_InviteSearchLabel: String { return self._s[3859]! }
+ public var Settings_CancelUpload: String { return self._s[3861]! }
+ public var Settings_AppLanguage_Unofficial: String { return self._s[3862]! }
public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3813]!, self._r[3813]!, [_0])
+ return formatWithArgumentRanges(self._s[3863]!, self._r[3863]!, [_0])
}
- public var ChatList_AddFolder: String { return self._s[3814]! }
- public var Conversation_Location: String { return self._s[3816]! }
- public var Appearance_BubbleCorners_AdjustAdjacent: String { return self._s[3817]! }
- public var DialogList_AdLabel: String { return self._s[3818]! }
+ public var ChatList_AddFolder: String { return self._s[3864]! }
+ public var Conversation_Location: String { return self._s[3866]! }
+ public var Appearance_BubbleCorners_AdjustAdjacent: String { return self._s[3867]! }
+ public var DialogList_AdLabel: String { return self._s[3868]! }
public func Time_TomorrowAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3820]!, self._r[3820]!, [_0])
+ return formatWithArgumentRanges(self._s[3870]!, self._r[3870]!, [_0])
}
- public var Message_InvoiceLabel: String { return self._s[3821]! }
- public var Channel_TooMuchBots: String { return self._s[3822]! }
+ public var Message_InvoiceLabel: String { return self._s[3871]! }
+ public var Channel_TooMuchBots: String { return self._s[3872]! }
public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3824]!, self._r[3824]!, [_0])
+ return formatWithArgumentRanges(self._s[3874]!, self._r[3874]!, [_0])
}
- public var Call_IncomingVideoCall: String { return self._s[3825]! }
- public var Conversation_LiveLocation: String { return self._s[3826]! }
- public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[3827]! }
- public var Passport_Identity_EditPassport: String { return self._s[3828]! }
- public var Permissions_CellularDataTitle_v0: String { return self._s[3830]! }
- public var ChatList_Search_NoResultsFitlerVoice: String { return self._s[3831]! }
- public var GroupInfo_Permissions_AddException: String { return self._s[3832]! }
- public var Channel_AdminLog_CanInviteUsers: String { return self._s[3834]! }
- public var Channel_MessageVideoUpdated: String { return self._s[3835]! }
- public var GroupInfo_Permissions_EditingDisabled: String { return self._s[3836]! }
- public var AccessDenied_Camera: String { return self._s[3839]! }
+ public var Call_IncomingVideoCall: String { return self._s[3875]! }
+ public var Conversation_LiveLocation: String { return self._s[3876]! }
+ public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[3877]! }
+ public var Passport_Identity_EditPassport: String { return self._s[3878]! }
+ public var Permissions_CellularDataTitle_v0: String { return self._s[3880]! }
+ public var ChatList_Search_NoResultsFitlerVoice: String { return self._s[3881]! }
+ public var GroupInfo_Permissions_AddException: String { return self._s[3882]! }
+ public var Channel_AdminLog_CanInviteUsers: String { return self._s[3884]! }
+ public var Channel_MessageVideoUpdated: String { return self._s[3885]! }
+ public var GroupInfo_Permissions_EditingDisabled: String { return self._s[3886]! }
+ public var AccessDenied_Camera: String { return self._s[3889]! }
public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3840]!, self._r[3840]!, [_0])
+ return formatWithArgumentRanges(self._s[3890]!, self._r[3890]!, [_0])
}
- public var Theme_Context_ChangeColors: String { return self._s[3841]! }
- public var PrivacySettings_TwoStepAuth: String { return self._s[3842]! }
- public var Privacy_Forwards_PreviewMessageText: String { return self._s[3843]! }
- public var Login_CodeExpiredError: String { return self._s[3844]! }
- public var State_ConnectingToProxy: String { return self._s[3845]! }
- public var TextFormat_Link: String { return self._s[3846]! }
- public var Passport_Language_lv: String { return self._s[3847]! }
- public var AccessDenied_VoiceMicrophone: String { return self._s[3848]! }
- public var WallpaperPreview_SwipeBottomText: String { return self._s[3849]! }
- public var ProfilePhoto_SetMainVideo: String { return self._s[3850]! }
- public var AutoDownloadSettings_Cellular: String { return self._s[3852]! }
- public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[3853]! }
+ public var Theme_Context_ChangeColors: String { return self._s[3891]! }
+ public var PrivacySettings_TwoStepAuth: String { return self._s[3892]! }
+ public var Privacy_Forwards_PreviewMessageText: String { return self._s[3893]! }
+ public var Login_CodeExpiredError: String { return self._s[3894]! }
+ public var State_ConnectingToProxy: String { return self._s[3895]! }
+ public var TextFormat_Link: String { return self._s[3896]! }
+ public var Passport_Language_lv: String { return self._s[3897]! }
+ public var AccessDenied_VoiceMicrophone: String { return self._s[3898]! }
+ public var WallpaperPreview_SwipeBottomText: String { return self._s[3899]! }
+ public var ProfilePhoto_SetMainVideo: String { return self._s[3900]! }
+ public var AutoDownloadSettings_Cellular: String { return self._s[3902]! }
+ public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[3903]! }
public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3854]!, self._r[3854]!, [_1, _2])
- }
- public var ChatList_EmptyChatListFilterTitle: String { return self._s[3855]! }
- public var Checkout_PayNone: String { return self._s[3856]! }
- public var NotificationsSound_Complete: String { return self._s[3858]! }
- public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[3859]! }
- public var AuthSessions_DevicesTitle: String { return self._s[3860]! }
- public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3861]!, self._r[3861]!, [_0, _1])
- }
- public var Message_LiveLocation: String { return self._s[3862]! }
- public var Watch_Suggestion_BRB: String { return self._s[3863]! }
- public var Channel_BanUser_Title: String { return self._s[3864]! }
- public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3865]! }
- public var Conversation_Dice_u1F3C0: String { return self._s[3866]! }
- public var Conversation_ClearSelfHistory: String { return self._s[3867]! }
- public var ProfilePhoto_OpenGallery: String { return self._s[3868]! }
- public var PrivacySettings_LastSeenTitle: String { return self._s[3869]! }
- public var Weekday_Thursday: String { return self._s[3870]! }
- public var BroadcastListInfo_AddRecipient: String { return self._s[3871]! }
- public var Privacy_ProfilePhoto: String { return self._s[3873]! }
- public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[3874]! }
- public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3875]!, self._r[3875]!, [_1, _2])
- }
- public var Message_Audio: String { return self._s[3876]! }
- public var Conversation_Info: String { return self._s[3877]! }
- public var Cache_Videos: String { return self._s[3878]! }
- public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[3879]! }
- public var Channel_ErrorAddTooMuch: String { return self._s[3880]! }
- public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3881]!, self._r[3881]!, [_0])
- }
- public var ChannelMembers_ChannelAdminsTitle: String { return self._s[3883]! }
- public var ScheduledMessages_Title: String { return self._s[3885]! }
- public var ShareFileTip_Title: String { return self._s[3888]! }
- public var Chat_Gifs_TrendingSectionHeader: String { return self._s[3889]! }
- public var ChatList_RemoveFolderConfirmation: String { return self._s[3890]! }
- public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3891]!, self._r[3891]!, [_1, _2])
- }
- public var Conversation_ContextViewStats: String { return self._s[3893]! }
- public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3894]! }
- public var PasscodeSettings_Title: String { return self._s[3895]! }
- public var Channel_AdminLog_SendPolls: String { return self._s[3896]! }
- public var LastSeen_ALongTimeAgo: String { return self._s[3897]! }
- public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3898]!, self._r[3898]!, [_1])
- }
- public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3899]! }
- public var CallFeedback_VideoReasonLowQuality: String { return self._s[3900]! }
- public var Conversation_PinnedPreviousMessage: String { return self._s[3901]! }
- public var SocksProxySetup_AddProxyTitle: String { return self._s[3902]! }
- public var Passport_Identity_AddInternalPassport: String { return self._s[3903]! }
- public func ChatList_RemovedFromFolderTooltip(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3904]!, self._r[3904]!, [_1, _2])
}
- public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3905]!, self._r[3905]!, [_0])
+ public var ChatList_EmptyChatListFilterTitle: String { return self._s[3905]! }
+ public var Checkout_PayNone: String { return self._s[3906]! }
+ public var NotificationsSound_Complete: String { return self._s[3908]! }
+ public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[3909]! }
+ public var InviteLink_CreateInfo: String { return self._s[3910]! }
+ public var AuthSessions_DevicesTitle: String { return self._s[3911]! }
+ public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3912]!, self._r[3912]!, [_0, _1])
}
- public var Passport_Identity_GenderFemale: String { return self._s[3906]! }
- public var Location_ProximityNotification_DistanceKM: String { return self._s[3909]! }
- public var ConvertToSupergroup_HelpTitle: String { return self._s[3910]! }
- public var VoiceChat_Audio: String { return self._s[3911]! }
- public var SharedMedia_TitleAll: String { return self._s[3912]! }
- public var Settings_Context_Logout: String { return self._s[3913]! }
- public var GroupInfo_SetGroupPhotoDelete: String { return self._s[3915]! }
- public var Settings_About_Title: String { return self._s[3916]! }
- public var StickerSettings_ContextHide: String { return self._s[3917]! }
+ public var Message_LiveLocation: String { return self._s[3913]! }
+ public var Watch_Suggestion_BRB: String { return self._s[3914]! }
+ public var Channel_BanUser_Title: String { return self._s[3915]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3916]! }
+ public var Conversation_Dice_u1F3C0: String { return self._s[3917]! }
+ public var Conversation_ClearSelfHistory: String { return self._s[3918]! }
+ public var ProfilePhoto_OpenGallery: String { return self._s[3919]! }
+ public var PrivacySettings_LastSeenTitle: String { return self._s[3920]! }
+ public var Weekday_Thursday: String { return self._s[3921]! }
+ public var BroadcastListInfo_AddRecipient: String { return self._s[3922]! }
+ public var Privacy_ProfilePhoto: String { return self._s[3924]! }
+ public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[3925]! }
+ public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3926]!, self._r[3926]!, [_1, _2])
+ }
+ public var Message_Audio: String { return self._s[3927]! }
+ public var Conversation_Info: String { return self._s[3928]! }
+ public var Cache_Videos: String { return self._s[3929]! }
+ public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[3930]! }
+ public var Channel_ErrorAddTooMuch: String { return self._s[3931]! }
+ public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3932]!, self._r[3932]!, [_0])
+ }
+ public var ChannelMembers_ChannelAdminsTitle: String { return self._s[3934]! }
+ public var ScheduledMessages_Title: String { return self._s[3936]! }
+ public var ShareFileTip_Title: String { return self._s[3939]! }
+ public var Chat_Gifs_TrendingSectionHeader: String { return self._s[3940]! }
+ public var ChatList_RemoveFolderConfirmation: String { return self._s[3941]! }
+ public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3942]!, self._r[3942]!, [_1, _2])
+ }
+ public var Conversation_ContextViewStats: String { return self._s[3944]! }
+ public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3945]! }
+ public var PasscodeSettings_Title: String { return self._s[3946]! }
+ public var Channel_AdminLog_SendPolls: String { return self._s[3947]! }
+ public var LastSeen_ALongTimeAgo: String { return self._s[3948]! }
+ public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3949]!, self._r[3949]!, [_1])
+ }
+ public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3950]! }
+ public var CallFeedback_VideoReasonLowQuality: String { return self._s[3951]! }
+ public var Conversation_PinnedPreviousMessage: String { return self._s[3952]! }
+ public var SocksProxySetup_AddProxyTitle: String { return self._s[3953]! }
+ public var Passport_Identity_AddInternalPassport: String { return self._s[3954]! }
+ public func ChatList_RemovedFromFolderTooltip(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3955]!, self._r[3955]!, [_1, _2])
+ }
+ public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[3956]!, self._r[3956]!, [_0])
+ }
+ public var Passport_Identity_GenderFemale: String { return self._s[3957]! }
+ public var Location_ProximityNotification_DistanceKM: String { return self._s[3960]! }
+ public var ConvertToSupergroup_HelpTitle: String { return self._s[3961]! }
+ public var VoiceChat_Audio: String { return self._s[3962]! }
+ public var SharedMedia_TitleAll: String { return self._s[3963]! }
+ public var Settings_Context_Logout: String { return self._s[3964]! }
+ public var GroupInfo_SetGroupPhotoDelete: String { return self._s[3966]! }
+ public var Settings_About_Title: String { return self._s[3967]! }
+ public var StickerSettings_ContextHide: String { return self._s[3968]! }
public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3918]!, self._r[3918]!, [_0])
+ return formatWithArgumentRanges(self._s[3969]!, self._r[3969]!, [_0])
}
public func Conversation_LiveLocationYouAndOther(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3919]!, self._r[3919]!, [_0])
+ return formatWithArgumentRanges(self._s[3970]!, self._r[3970]!, [_0])
}
- public var Common_Cancel: String { return self._s[3921]! }
- public var CallFeedback_Title: String { return self._s[3923]! }
+ public var Common_Cancel: String { return self._s[3972]! }
+ public var CallFeedback_Title: String { return self._s[3974]! }
public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3924]!, self._r[3924]!, [_0])
+ return formatWithArgumentRanges(self._s[3975]!, self._r[3975]!, [_0])
}
- public var Activity_UploadingVideoMessage: String { return self._s[3925]! }
- public var MediaPicker_Send: String { return self._s[3926]! }
- public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[3927]! }
- public var Conversation_LiveLocationYou: String { return self._s[3928]! }
- public var Notifications_ExceptionsUnmuted: String { return self._s[3929]! }
+ public var Activity_UploadingVideoMessage: String { return self._s[3976]! }
+ public var MediaPicker_Send: String { return self._s[3977]! }
+ public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[3978]! }
+ public var Conversation_LiveLocationYou: String { return self._s[3979]! }
+ public var Notifications_ExceptionsUnmuted: String { return self._s[3980]! }
public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3930]!, self._r[3930]!, [_0])
+ return formatWithArgumentRanges(self._s[3981]!, self._r[3981]!, [_0])
}
public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3931]!, self._r[3931]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[3982]!, self._r[3982]!, [_1, _2])
}
- public var Conversation_ViewBackground: String { return self._s[3932]! }
- public var ChatSettings_PrivateChats: String { return self._s[3935]! }
- public var Conversation_ErrorInaccessibleMessage: String { return self._s[3936]! }
- public var Appearance_ThemeNight: String { return self._s[3937]! }
- public var Common_Search: String { return self._s[3938]! }
- public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[3939]! }
- public var ChangePhoneNumberNumber_Help: String { return self._s[3941]! }
- public var Stickers_SuggestAdded: String { return self._s[3942]! }
- public var Conversation_DiscardVoiceMessageDescription: String { return self._s[3945]! }
- public var NetworkUsageSettings_Cellular: String { return self._s[3946]! }
- public var CheckoutInfo_Title: String { return self._s[3947]! }
- public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[3948]! }
- public var Channel_BotDoesntSupportGroups: String { return self._s[3949]! }
+ public var Conversation_ViewBackground: String { return self._s[3983]! }
+ public var ChatSettings_PrivateChats: String { return self._s[3986]! }
+ public var Conversation_ErrorInaccessibleMessage: String { return self._s[3987]! }
+ public var Appearance_ThemeNight: String { return self._s[3988]! }
+ public var Common_Search: String { return self._s[3989]! }
+ public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[3990]! }
+ public var ChangePhoneNumberNumber_Help: String { return self._s[3992]! }
+ public var InviteLink_QRCode_Share: String { return self._s[3993]! }
+ public var Stickers_SuggestAdded: String { return self._s[3994]! }
+ public var Conversation_DiscardVoiceMessageDescription: String { return self._s[3997]! }
+ public var NetworkUsageSettings_Cellular: String { return self._s[3998]! }
+ public var CheckoutInfo_Title: String { return self._s[3999]! }
+ public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[4000]! }
+ public var Channel_BotDoesntSupportGroups: String { return self._s[4001]! }
public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3950]!, self._r[3950]!, [_0])
+ return formatWithArgumentRanges(self._s[4002]!, self._r[4002]!, [_0])
}
- public var MaskStickerSettings_Info: String { return self._s[3952]! }
- public var GroupRemoved_DeleteUser: String { return self._s[3954]! }
- public var Contacts_ShareTelegram: String { return self._s[3955]! }
- public var Group_UpgradeNoticeText1: String { return self._s[3956]! }
+ public var MaskStickerSettings_Info: String { return self._s[4004]! }
+ public var GroupRemoved_DeleteUser: String { return self._s[4006]! }
+ public var Contacts_ShareTelegram: String { return self._s[4007]! }
+ public var Group_UpgradeNoticeText1: String { return self._s[4008]! }
public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3957]!, self._r[3957]!, [_1])
+ return formatWithArgumentRanges(self._s[4009]!, self._r[4009]!, [_1])
}
- public var PrivacyLastSeenSettings_Title: String { return self._s[3958]! }
- public var SettingsSearch_Synonyms_Support: String { return self._s[3962]! }
- public var PhotoEditor_TintTool: String { return self._s[3963]! }
- public var GroupPermission_NoSendPolls: String { return self._s[3965]! }
- public var NotificationsSound_None: String { return self._s[3966]! }
+ public var PrivacyLastSeenSettings_Title: String { return self._s[4010]! }
+ public var SettingsSearch_Synonyms_Support: String { return self._s[4014]! }
+ public var PhotoEditor_TintTool: String { return self._s[4015]! }
+ public var GroupPermission_NoSendPolls: String { return self._s[4017]! }
+ public var NotificationsSound_None: String { return self._s[4018]! }
public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3967]!, self._r[3967]!, [_1, "\(_2)"])
+ return formatWithArgumentRanges(self._s[4019]!, self._r[4019]!, [_1, "\(_2)"])
}
- public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[3969]! }
- public var ExplicitContent_AlertChannel: String { return self._s[3971]! }
- public var Conversation_ClousStorageInfo_Description1: String { return self._s[3972]! }
- public var Contacts_SortedByPresence: String { return self._s[3973]! }
- public var WallpaperSearch_ColorGray: String { return self._s[3974]! }
- public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[3975]! }
- public var Conversation_ReportSpam: String { return self._s[3976]! }
- public var ChatList_Search_NoResultsFilter: String { return self._s[3979]! }
- public var WallpaperSearch_ColorBlack: String { return self._s[3980]! }
- public var ArchivedChats_IntroTitle3: String { return self._s[3981]! }
+ public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[4021]! }
+ public var ExplicitContent_AlertChannel: String { return self._s[4023]! }
+ public var Conversation_ClousStorageInfo_Description1: String { return self._s[4024]! }
+ public var Contacts_SortedByPresence: String { return self._s[4025]! }
+ public var WallpaperSearch_ColorGray: String { return self._s[4026]! }
+ public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[4027]! }
+ public var Conversation_ReportSpam: String { return self._s[4028]! }
+ public var ChatList_Search_NoResultsFilter: String { return self._s[4031]! }
+ public var WallpaperSearch_ColorBlack: String { return self._s[4032]! }
+ public var ArchivedChats_IntroTitle3: String { return self._s[4033]! }
+ public var InviteLink_DeleteAllRevokedLinksAlert_Action: String { return self._s[4034]! }
public func VoiceChat_PeerJoinedText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[3982]!, self._r[3982]!, [_0])
+ return formatWithArgumentRanges(self._s[4035]!, self._r[4035]!, [_0])
}
- public var Conversation_DefaultRestrictedText: String { return self._s[3983]! }
- public var Settings_Devices: String { return self._s[3984]! }
- public var Call_AudioRouteSpeaker: String { return self._s[3985]! }
- public var GroupInfo_InviteLink_CopyLink: String { return self._s[3986]! }
- public var Passport_Address_Country: String { return self._s[3988]! }
- public var Cache_MaximumCacheSize: String { return self._s[3989]! }
- public var Chat_PanelHidePinnedMessages: String { return self._s[3990]! }
- public var Notifications_Badge_IncludePublicGroups: String { return self._s[3991]! }
- public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3993]! }
- public var Login_TermsOfServiceLabel: String { return self._s[3994]! }
- public var Calls_NoMissedCallsPlacehoder: String { return self._s[3995]! }
- public var SocksProxySetup_RequiredCredentials: String { return self._s[3996]! }
- public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[3997]! }
- public var AutoNightTheme_ScheduledFrom: String { return self._s[3998]! }
- public var ChatSettings_AutoDownloadDocuments: String { return self._s[3999]! }
- public var ConvertToSupergroup_Note: String { return self._s[4001]! }
- public var Settings_SetNewProfilePhotoOrVideo: String { return self._s[4002]! }
- public var PrivacySettings_PasscodeAndTouchId: String { return self._s[4003]! }
- public var Common_More: String { return self._s[4004]! }
- public var ShareMenu_SelectChats: String { return self._s[4006]! }
+ public var Conversation_DefaultRestrictedText: String { return self._s[4036]! }
+ public var Settings_Devices: String { return self._s[4037]! }
+ public var Call_AudioRouteSpeaker: String { return self._s[4038]! }
+ public var GroupInfo_InviteLink_CopyLink: String { return self._s[4039]! }
+ public var Passport_Address_Country: String { return self._s[4041]! }
+ public var Cache_MaximumCacheSize: String { return self._s[4042]! }
+ public var Chat_PanelHidePinnedMessages: String { return self._s[4043]! }
+ public var Notifications_Badge_IncludePublicGroups: String { return self._s[4044]! }
+ public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4046]! }
+ public var Login_TermsOfServiceLabel: String { return self._s[4047]! }
+ public var Calls_NoMissedCallsPlacehoder: String { return self._s[4048]! }
+ public var SocksProxySetup_RequiredCredentials: String { return self._s[4049]! }
+ public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[4050]! }
+ public var AutoNightTheme_ScheduledFrom: String { return self._s[4051]! }
+ public var ChatSettings_AutoDownloadDocuments: String { return self._s[4052]! }
+ public var ConvertToSupergroup_Note: String { return self._s[4054]! }
+ public var Settings_SetNewProfilePhotoOrVideo: String { return self._s[4055]! }
+ public var PrivacySettings_PasscodeAndTouchId: String { return self._s[4056]! }
+ public var Common_More: String { return self._s[4057]! }
+ public var ShareMenu_SelectChats: String { return self._s[4059]! }
public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4007]!, self._r[4007]!, [_0])
+ return formatWithArgumentRanges(self._s[4060]!, self._r[4060]!, [_0])
}
public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4008]!, self._r[4008]!, [_0])
+ return formatWithArgumentRanges(self._s[4061]!, self._r[4061]!, [_0])
}
- public var Contacts_PermissionsKeepDisabled: String { return self._s[4010]! }
+ public var Contacts_PermissionsKeepDisabled: String { return self._s[4063]! }
public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4011]!, self._r[4011]!, [_0])
+ return formatWithArgumentRanges(self._s[4064]!, self._r[4064]!, [_0])
}
- public var WatchRemote_AlertOpen: String { return self._s[4012]! }
+ public var WatchRemote_AlertOpen: String { return self._s[4065]! }
public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4013]!, self._r[4013]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[4066]!, self._r[4066]!, [_1, _2, _3])
}
- public var Channel_Members_AddMembersHelp: String { return self._s[4014]! }
- public var Shortcut_SwitchAccount: String { return self._s[4015]! }
- public var Map_LiveLocationFor8Hours: String { return self._s[4016]! }
+ public var Channel_Members_AddMembersHelp: String { return self._s[4067]! }
+ public var Shortcut_SwitchAccount: String { return self._s[4068]! }
+ public var Map_LiveLocationFor8Hours: String { return self._s[4069]! }
public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4017]!, self._r[4017]!, [_0])
+ return formatWithArgumentRanges(self._s[4070]!, self._r[4070]!, [_0])
}
- public var Compose_NewGroupTitle: String { return self._s[4018]! }
- public var Call_VoiceOver_VoiceCallOutgoing: String { return self._s[4019]! }
- public var DialogList_You: String { return self._s[4020]! }
- public var ReportPeer_ReasonViolence: String { return self._s[4021]! }
+ public var Compose_NewGroupTitle: String { return self._s[4071]! }
+ public var Call_VoiceOver_VoiceCallOutgoing: String { return self._s[4072]! }
+ public var DialogList_You: String { return self._s[4073]! }
+ public var ReportPeer_ReasonViolence: String { return self._s[4074]! }
public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4022]!, self._r[4022]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[4075]!, self._r[4075]!, [_1, _2])
}
- public var VoiceChat_Reconnecting: String { return self._s[4024]! }
- public var KeyCommand_ScrollDown: String { return self._s[4027]! }
- public var ChatSettings_DownloadInBackground: String { return self._s[4028]! }
- public var Wallpaper_ResetWallpapers: String { return self._s[4029]! }
- public var Channel_BanList_RestrictedTitle: String { return self._s[4030]! }
- public var ArchivedChats_IntroText3: String { return self._s[4031]! }
- public var HashtagSearch_AllChats: String { return self._s[4033]! }
- public var VoiceChat_EndVoiceChat: String { return self._s[4034]! }
- public var Channel_Info_BlackList: String { return self._s[4036]! }
- public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[4037]! }
- public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[4038]! }
- public var Paint_Neon: String { return self._s[4040]! }
- public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[4041]! }
- public var AutoDownloadSettings_AutoDownload: String { return self._s[4042]! }
+ public var VoiceChat_Reconnecting: String { return self._s[4077]! }
+ public var KeyCommand_ScrollDown: String { return self._s[4080]! }
+ public var ChatSettings_DownloadInBackground: String { return self._s[4081]! }
+ public var Wallpaper_ResetWallpapers: String { return self._s[4082]! }
+ public var Channel_BanList_RestrictedTitle: String { return self._s[4083]! }
+ public var ArchivedChats_IntroText3: String { return self._s[4084]! }
+ public var HashtagSearch_AllChats: String { return self._s[4086]! }
+ public var VoiceChat_EndVoiceChat: String { return self._s[4087]! }
+ public var Channel_Info_BlackList: String { return self._s[4089]! }
+ public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[4090]! }
+ public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[4091]! }
+ public var Paint_Neon: String { return self._s[4093]! }
+ public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[4094]! }
+ public var AutoDownloadSettings_AutoDownload: String { return self._s[4095]! }
public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4044]!, self._r[4044]!, [_0])
+ return formatWithArgumentRanges(self._s[4097]!, self._r[4097]!, [_0])
}
- public var Map_StopLiveLocation: String { return self._s[4045]! }
- public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[4046]! }
- public var Channel_Username_InvalidCharacters: String { return self._s[4047]! }
- public var InstantPage_Reference: String { return self._s[4048]! }
- public var ChatList_HideAction: String { return self._s[4050]! }
- public var Conversation_FileICloudDrive: String { return self._s[4052]! }
+ public var Map_StopLiveLocation: String { return self._s[4098]! }
+ public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[4099]! }
+ public var Channel_Username_InvalidCharacters: String { return self._s[4100]! }
+ public var InstantPage_Reference: String { return self._s[4101]! }
+ public var ChatList_HideAction: String { return self._s[4103]! }
+ public var Conversation_FileICloudDrive: String { return self._s[4105]! }
public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4053]!, self._r[4053]!, [_1])
+ return formatWithArgumentRanges(self._s[4106]!, self._r[4106]!, [_1])
}
- public var Passport_PasswordReset: String { return self._s[4055]! }
- public var ChatList_Context_UnhideArchive: String { return self._s[4057]! }
- public var ConvertToSupergroup_HelpText: String { return self._s[4058]! }
- public var Calls_AddTab: String { return self._s[4059]! }
- public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[4060]! }
- public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[4061]! }
- public var Privacy_GroupsAndChannels: String { return self._s[4064]! }
- public var AutoNightTheme_Disabled: String { return self._s[4065]! }
- public var CreatePoll_MultipleChoice: String { return self._s[4066]! }
+ public var Passport_PasswordReset: String { return self._s[4108]! }
+ public var ChatList_Context_UnhideArchive: String { return self._s[4110]! }
+ public var ConvertToSupergroup_HelpText: String { return self._s[4111]! }
+ public var Calls_AddTab: String { return self._s[4112]! }
+ public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[4113]! }
+ public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[4114]! }
+ public var Privacy_GroupsAndChannels: String { return self._s[4117]! }
+ public var AutoNightTheme_Disabled: String { return self._s[4118]! }
+ public var CreatePoll_MultipleChoice: String { return self._s[4119]! }
public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4067]!, self._r[4067]!, [_1])
+ return formatWithArgumentRanges(self._s[4120]!, self._r[4120]!, [_1])
}
- public var Watch_Bot_Restart: String { return self._s[4069]! }
+ public var Watch_Bot_Restart: String { return self._s[4122]! }
public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4070]!, self._r[4070]!, ["\(_0)"])
+ return formatWithArgumentRanges(self._s[4123]!, self._r[4123]!, ["\(_0)"])
}
- public var GroupInfo_ScamGroupWarning: String { return self._s[4072]! }
- public var Conversation_EditingMessagePanelMedia: String { return self._s[4073]! }
- public var Appearance_PreviewIncomingText: String { return self._s[4074]! }
- public var ChatSettings_WidgetSettings: String { return self._s[4075]! }
- public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[4076]! }
- public var ChatList_UndoArchiveRevealedTitle: String { return self._s[4078]! }
- public var Stats_GroupOverview: String { return self._s[4080]! }
- public var ScheduledMessages_EditTime: String { return self._s[4083]! }
- public var Month_GenFebruary: String { return self._s[4084]! }
- public var ChatList_AutoarchiveSuggestion_OpenSettings: String { return self._s[4085]! }
- public var Stickers_ClearRecent: String { return self._s[4086]! }
- public var TwoStepAuth_EnterPasswordPassword: String { return self._s[4087]! }
- public var Stats_Message_PublicShares: String { return self._s[4088]! }
+ public var GroupInfo_ScamGroupWarning: String { return self._s[4125]! }
+ public var Conversation_EditingMessagePanelMedia: String { return self._s[4126]! }
+ public var Appearance_PreviewIncomingText: String { return self._s[4127]! }
+ public var ChatSettings_WidgetSettings: String { return self._s[4128]! }
+ public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[4129]! }
+ public var ChatList_UndoArchiveRevealedTitle: String { return self._s[4131]! }
+ public var Stats_GroupOverview: String { return self._s[4133]! }
+ public var ScheduledMessages_EditTime: String { return self._s[4136]! }
+ public var Month_GenFebruary: String { return self._s[4137]! }
+ public var ChatList_AutoarchiveSuggestion_OpenSettings: String { return self._s[4138]! }
+ public var Stickers_ClearRecent: String { return self._s[4139]! }
+ public var InviteLink_Create_UsersLimitNumberOfUsersUnlimited: String { return self._s[4140]! }
+ public var TwoStepAuth_EnterPasswordPassword: String { return self._s[4141]! }
+ public var Stats_Message_PublicShares: String { return self._s[4142]! }
public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4089]!, self._r[4089]!, [_0])
+ return formatWithArgumentRanges(self._s[4143]!, self._r[4143]!, [_0])
}
- public var Login_TermsOfServiceSignupDecline: String { return self._s[4090]! }
- public var CheckoutInfo_ErrorCityInvalid: String { return self._s[4091]! }
- public var VoiceOver_Chat_PlayHint: String { return self._s[4092]! }
- public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[4093]! }
- public var CheckoutInfo_ShippingInfoTitle: String { return self._s[4095]! }
- public var CreatePoll_Create: String { return self._s[4096]! }
- public var ChatList_Search_FilterLinks: String { return self._s[4097]! }
- public var Your_cards_number_is_invalid: String { return self._s[4098]! }
- public var Month_ShortApril: String { return self._s[4099]! }
- public var SocksProxySetup_UseForCalls: String { return self._s[4100]! }
- public var Conversation_EditingCaptionPanelTitle: String { return self._s[4101]! }
- public var VoiceChat_UnmuteForMe: String { return self._s[4102]! }
- public var SocksProxySetup_Status: String { return self._s[4103]! }
- public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[4104]! }
- public var ChatListFolder_CategoryBots: String { return self._s[4105]! }
- public var Passport_FieldIdentitySelfieHelp: String { return self._s[4107]! }
- public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[4108]! }
- public var Chat_PinnedListPreview_UnpinAllMessages: String { return self._s[4109]! }
- public var Wallpaper_ResetWallpapersInfo: String { return self._s[4110]! }
- public var Conversation_TitleUnmute: String { return self._s[4111]! }
- public var Group_Setup_TypeHeader: String { return self._s[4112]! }
- public var Stats_ViewsPerPost: String { return self._s[4113]! }
- public var CheckoutInfo_ShippingInfoCountry: String { return self._s[4114]! }
- public var Passport_Identity_TranslationHelp: String { return self._s[4115]! }
+ public var Login_TermsOfServiceSignupDecline: String { return self._s[4144]! }
+ public var CheckoutInfo_ErrorCityInvalid: String { return self._s[4145]! }
+ public var VoiceOver_Chat_PlayHint: String { return self._s[4146]! }
+ public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[4147]! }
+ public var CheckoutInfo_ShippingInfoTitle: String { return self._s[4149]! }
+ public var CreatePoll_Create: String { return self._s[4150]! }
+ public var ChatList_Search_FilterLinks: String { return self._s[4151]! }
+ public var Your_cards_number_is_invalid: String { return self._s[4152]! }
+ public var Month_ShortApril: String { return self._s[4153]! }
+ public var SocksProxySetup_UseForCalls: String { return self._s[4154]! }
+ public var Conversation_EditingCaptionPanelTitle: String { return self._s[4155]! }
+ public var VoiceChat_UnmuteForMe: String { return self._s[4156]! }
+ public var SocksProxySetup_Status: String { return self._s[4157]! }
+ public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[4158]! }
+ public var ChatListFolder_CategoryBots: String { return self._s[4159]! }
+ public var Passport_FieldIdentitySelfieHelp: String { return self._s[4161]! }
+ public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[4162]! }
+ public var Chat_PinnedListPreview_UnpinAllMessages: String { return self._s[4163]! }
+ public var Wallpaper_ResetWallpapersInfo: String { return self._s[4164]! }
+ public var Conversation_TitleUnmute: String { return self._s[4165]! }
+ public var Group_Setup_TypeHeader: String { return self._s[4166]! }
+ public var Stats_ViewsPerPost: String { return self._s[4167]! }
+ public var CheckoutInfo_ShippingInfoCountry: String { return self._s[4168]! }
+ public var Passport_Identity_TranslationHelp: String { return self._s[4169]! }
public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4116]!, self._r[4116]!, [_1])
+ return formatWithArgumentRanges(self._s[4170]!, self._r[4170]!, [_1])
}
- public var GroupInfo_Administrators_Title: String { return self._s[4117]! }
+ public var GroupInfo_Administrators_Title: String { return self._s[4171]! }
public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4118]!, self._r[4118]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[4172]!, self._r[4172]!, [_1, _2])
}
public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4119]!, self._r[4119]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[4173]!, self._r[4173]!, [_1, _2, _3])
}
- public var CheckoutInfo_ShippingInfoState: String { return self._s[4120]! }
- public var Passport_Language_my: String { return self._s[4122]! }
- public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[4123]! }
- public var Map_PlacesNearby: String { return self._s[4124]! }
- public var Channel_About_Help: String { return self._s[4125]! }
- public var LogoutOptions_AddAccountTitle: String { return self._s[4126]! }
- public var ChatSettings_AutomaticAudioDownload: String { return self._s[4127]! }
- public var Channel_Username_Title: String { return self._s[4128]! }
- public var Activity_RecordingVideoMessage: String { return self._s[4129]! }
+ public var CheckoutInfo_ShippingInfoState: String { return self._s[4174]! }
+ public var Passport_Language_my: String { return self._s[4176]! }
+ public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[4177]! }
+ public var Map_PlacesNearby: String { return self._s[4178]! }
+ public var Channel_About_Help: String { return self._s[4179]! }
+ public var LogoutOptions_AddAccountTitle: String { return self._s[4180]! }
+ public var ChatSettings_AutomaticAudioDownload: String { return self._s[4181]! }
+ public var Channel_Username_Title: String { return self._s[4182]! }
+ public var Activity_RecordingVideoMessage: String { return self._s[4183]! }
public func StickerPackActionInfo_RemovedText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4130]!, self._r[4130]!, [_0])
+ return formatWithArgumentRanges(self._s[4184]!, self._r[4184]!, [_0])
}
- public var CheckoutInfo_ShippingInfoCity: String { return self._s[4131]! }
- public var Passport_DiscardMessageDescription: String { return self._s[4132]! }
- public var Conversation_LinkDialogOpen: String { return self._s[4133]! }
- public var ChatList_Context_HideArchive: String { return self._s[4134]! }
+ public var CheckoutInfo_ShippingInfoCity: String { return self._s[4185]! }
+ public var Passport_DiscardMessageDescription: String { return self._s[4186]! }
+ public var Conversation_LinkDialogOpen: String { return self._s[4187]! }
+ public var ChatList_Context_HideArchive: String { return self._s[4188]! }
public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4135]!, self._r[4135]!, [_0])
+ return formatWithArgumentRanges(self._s[4189]!, self._r[4189]!, [_0])
}
- public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[4136]! }
- public var Conversation_Admin: String { return self._s[4137]! }
- public var DialogList_TabTitle: String { return self._s[4138]! }
+ public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[4190]! }
+ public var Conversation_Admin: String { return self._s[4191]! }
+ public var DialogList_TabTitle: String { return self._s[4192]! }
public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4139]!, self._r[4139]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[4193]!, self._r[4193]!, [_1, _2])
}
- public var Notifications_PermissionsUnreachableText: String { return self._s[4140]! }
- public var Passport_Identity_GenderMale: String { return self._s[4142]! }
- public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4144]! }
- public var PhoneNumberHelp_Alert: String { return self._s[4145]! }
- public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[4146]! }
- public var Notifications_InAppNotifications: String { return self._s[4147]! }
+ public var Notifications_PermissionsUnreachableText: String { return self._s[4194]! }
+ public var Passport_Identity_GenderMale: String { return self._s[4196]! }
+ public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4198]! }
+ public var PhoneNumberHelp_Alert: String { return self._s[4199]! }
+ public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[4200]! }
+ public var Notifications_InAppNotifications: String { return self._s[4201]! }
public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4148]!, self._r[4148]!, [_0])
+ return formatWithArgumentRanges(self._s[4202]!, self._r[4202]!, [_0])
}
- public var Notification_VideoCallOutgoing: String { return self._s[4149]! }
- public var Login_InvalidCodeError: String { return self._s[4150]! }
- public var Conversation_PrivateChannelTimeLimitedAlertJoin: String { return self._s[4151]! }
+ public var Notification_VideoCallOutgoing: String { return self._s[4203]! }
+ public var Login_InvalidCodeError: String { return self._s[4204]! }
+ public var Conversation_PrivateChannelTimeLimitedAlertJoin: String { return self._s[4205]! }
public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4153]!, self._r[4153]!, [_0])
+ return formatWithArgumentRanges(self._s[4207]!, self._r[4207]!, [_0])
}
- public var Conversation_InputTextCaptionPlaceholder: String { return self._s[4154]! }
- public var ReportPeer_Report: String { return self._s[4155]! }
- public var Camera_FlashOff: String { return self._s[4158]! }
- public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[4161]! }
- public var PrivacyPolicy_DeclineTitle: String { return self._s[4164]! }
- public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[4165]! }
- public var Passport_FieldEmail: String { return self._s[4166]! }
+ public var Conversation_InputTextCaptionPlaceholder: String { return self._s[4208]! }
+ public var ReportPeer_Report: String { return self._s[4209]! }
+ public var Camera_FlashOff: String { return self._s[4212]! }
+ public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[4215]! }
+ public var PrivacyPolicy_DeclineTitle: String { return self._s[4218]! }
+ public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[4219]! }
+ public var Passport_FieldEmail: String { return self._s[4220]! }
public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4167]!, self._r[4167]!, [_1])
+ return formatWithArgumentRanges(self._s[4221]!, self._r[4221]!, [_1])
}
- public var Notifications_ExceptionsResetToDefaults: String { return self._s[4168]! }
- public var PeerInfo_PaneVoiceAndVideo: String { return self._s[4169]! }
- public var Group_OwnershipTransfer_Title: String { return self._s[4170]! }
- public var Conversation_DefaultRestrictedInline: String { return self._s[4171]! }
- public var Login_PhoneNumberHelp: String { return self._s[4173]! }
- public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[4174]! }
- public var Conversation_PinnedQuiz: String { return self._s[4175]! }
- public var CreateGroup_SoftUserLimitAlert: String { return self._s[4176]! }
- public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[4177]! }
- public var Group_MessagePhotoUpdated: String { return self._s[4178]! }
- public var LoginPassword_PasswordPlaceholder: String { return self._s[4179]! }
- public var Passport_Identity_Translations: String { return self._s[4181]! }
- public var ChatAdmins_AllMembersAreAdmins: String { return self._s[4182]! }
- public var ChannelInfo_DeleteChannel: String { return self._s[4184]! }
- public var PasscodeSettings_HelpBottom: String { return self._s[4185]! }
- public var Channel_Members_AddMembers: String { return self._s[4186]! }
- public var AutoDownloadSettings_LastDelimeter: String { return self._s[4187]! }
- public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[4189]! }
- public var Conversation_HoldForAudio: String { return self._s[4190]! }
- public var Media_LimitedAccessChangeSettings: String { return self._s[4192]! }
- public var Watch_LastSeen_Lately: String { return self._s[4193]! }
- public var ChatList_Context_MarkAsRead: String { return self._s[4194]! }
- public var Conversation_PinnedMessage: String { return self._s[4195]! }
- public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[4196]! }
- public var Passport_UpdateRequiredError: String { return self._s[4198]! }
- public var PrivacySettings_Passcode: String { return self._s[4199]! }
+ public var Notifications_ExceptionsResetToDefaults: String { return self._s[4222]! }
+ public var PeerInfo_PaneVoiceAndVideo: String { return self._s[4223]! }
+ public var Group_OwnershipTransfer_Title: String { return self._s[4224]! }
+ public var Conversation_DefaultRestrictedInline: String { return self._s[4225]! }
+ public var Login_PhoneNumberHelp: String { return self._s[4227]! }
+ public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[4228]! }
+ public var Conversation_PinnedQuiz: String { return self._s[4229]! }
+ public var CreateGroup_SoftUserLimitAlert: String { return self._s[4230]! }
+ public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[4231]! }
+ public var Group_MessagePhotoUpdated: String { return self._s[4232]! }
+ public var LoginPassword_PasswordPlaceholder: String { return self._s[4233]! }
+ public var Passport_Identity_Translations: String { return self._s[4235]! }
+ public var ChatAdmins_AllMembersAreAdmins: String { return self._s[4236]! }
+ public var ChannelInfo_DeleteChannel: String { return self._s[4238]! }
+ public var PasscodeSettings_HelpBottom: String { return self._s[4239]! }
+ public var Channel_Members_AddMembers: String { return self._s[4240]! }
+ public var AutoDownloadSettings_LastDelimeter: String { return self._s[4241]! }
+ public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[4243]! }
+ public var Conversation_HoldForAudio: String { return self._s[4244]! }
+ public var Media_LimitedAccessChangeSettings: String { return self._s[4246]! }
+ public var Watch_LastSeen_Lately: String { return self._s[4247]! }
+ public var ChatList_Context_MarkAsRead: String { return self._s[4248]! }
+ public var Conversation_PinnedMessage: String { return self._s[4249]! }
+ public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[4250]! }
+ public var Passport_UpdateRequiredError: String { return self._s[4252]! }
+ public var PrivacySettings_Passcode: String { return self._s[4253]! }
public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4200]!, self._r[4200]!, [_0])
+ return formatWithArgumentRanges(self._s[4254]!, self._r[4254]!, [_0])
}
- public var AutoNightTheme_NotAvailable: String { return self._s[4201]! }
- public var Conversation_PressVolumeButtonForSound: String { return self._s[4202]! }
- public var VoiceOver_Common_On: String { return self._s[4203]! }
- public var LoginPassword_InvalidPasswordError: String { return self._s[4204]! }
- public var ChatListFolder_IncludedSectionHeader: String { return self._s[4205]! }
- public var Channel_SignMessages_Help: String { return self._s[4206]! }
- public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[4207]! }
- public var Conversation_TitleNoComments: String { return self._s[4208]! }
- public var MediaPicker_LivePhotoDescription: String { return self._s[4209]! }
- public var GroupInfo_Permissions: String { return self._s[4210]! }
- public var GroupPermission_NoSendLinks: String { return self._s[4213]! }
- public var Passport_Identity_ResidenceCountry: String { return self._s[4214]! }
- public var Appearance_ThemeCarouselNightBlue: String { return self._s[4216]! }
- public var ChatList_ArchiveAction: String { return self._s[4217]! }
+ public var AutoNightTheme_NotAvailable: String { return self._s[4255]! }
+ public var Conversation_PressVolumeButtonForSound: String { return self._s[4256]! }
+ public var VoiceOver_Common_On: String { return self._s[4257]! }
+ public var LoginPassword_InvalidPasswordError: String { return self._s[4258]! }
+ public var ChatListFolder_IncludedSectionHeader: String { return self._s[4259]! }
+ public var Channel_SignMessages_Help: String { return self._s[4260]! }
+ public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[4261]! }
+ public var Conversation_TitleNoComments: String { return self._s[4262]! }
+ public var MediaPicker_LivePhotoDescription: String { return self._s[4263]! }
+ public var GroupInfo_Permissions: String { return self._s[4264]! }
+ public var GroupPermission_NoSendLinks: String { return self._s[4267]! }
+ public var Passport_Identity_ResidenceCountry: String { return self._s[4268]! }
+ public var Appearance_ThemeCarouselNightBlue: String { return self._s[4270]! }
+ public var ChatList_ArchiveAction: String { return self._s[4271]! }
public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4218]!, self._r[4218]!, [_0])
+ return formatWithArgumentRanges(self._s[4272]!, self._r[4272]!, [_0])
}
- public var GroupInfo_GroupHistory: String { return self._s[4219]! }
+ public var GroupInfo_GroupHistory: String { return self._s[4273]! }
public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4221]!, self._r[4221]!, [_0])
+ return formatWithArgumentRanges(self._s[4275]!, self._r[4275]!, [_0])
}
- public var Privacy_Forwards_LinkIfAllowed: String { return self._s[4223]! }
- public var Channel_Info_Banned: String { return self._s[4224]! }
- public var Paint_RecentStickers: String { return self._s[4225]! }
- public var VoiceOver_MessageContextSend: String { return self._s[4226]! }
- public var Group_ErrorNotMutualContact: String { return self._s[4227]! }
- public var ReportPeer_ReasonOther: String { return self._s[4229]! }
- public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[4230]! }
- public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[4232]! }
- public var KeyCommand_Find: String { return self._s[4233]! }
+ public var Privacy_Forwards_LinkIfAllowed: String { return self._s[4277]! }
+ public var Channel_Info_Banned: String { return self._s[4278]! }
+ public var Paint_RecentStickers: String { return self._s[4279]! }
+ public var VoiceOver_MessageContextSend: String { return self._s[4280]! }
+ public var Group_ErrorNotMutualContact: String { return self._s[4281]! }
+ public var ReportPeer_ReasonOther: String { return self._s[4283]! }
+ public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[4284]! }
+ public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[4286]! }
+ public var KeyCommand_Find: String { return self._s[4287]! }
public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4234]!, self._r[4234]!, [_0])
+ return formatWithArgumentRanges(self._s[4288]!, self._r[4288]!, [_0])
}
- public var ChatList_Context_Unmute: String { return self._s[4235]! }
- public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[4236]! }
- public var Stickers_GroupStickersHelp: String { return self._s[4237]! }
- public var Checkout_Title: String { return self._s[4238]! }
- public var Activity_RecordingAudio: String { return self._s[4239]! }
- public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4240]! }
- public var BlockedUsers_BlockTitle: String { return self._s[4241]! }
- public var DialogList_SavedMessagesHelp: String { return self._s[4243]! }
- public var Calls_All: String { return self._s[4244]! }
- public var Settings_FAQ_Button: String { return self._s[4246]! }
- public var Conversation_Dice_u1F3B0: String { return self._s[4248]! }
+ public var ChatList_Context_Unmute: String { return self._s[4289]! }
+ public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[4290]! }
+ public var Stickers_GroupStickersHelp: String { return self._s[4291]! }
+ public var Checkout_Title: String { return self._s[4292]! }
+ public var Activity_RecordingAudio: String { return self._s[4293]! }
+ public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4294]! }
+ public var BlockedUsers_BlockTitle: String { return self._s[4295]! }
+ public var DialogList_SavedMessagesHelp: String { return self._s[4297]! }
+ public var Calls_All: String { return self._s[4298]! }
+ public var Settings_FAQ_Button: String { return self._s[4300]! }
+ public var Conversation_Dice_u1F3B0: String { return self._s[4302]! }
public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4249]!, self._r[4249]!, [_0])
+ return formatWithArgumentRanges(self._s[4303]!, self._r[4303]!, [_0])
}
- public var Conversation_ReportGroupLocation: String { return self._s[4250]! }
- public var Passport_Scans_Upload: String { return self._s[4251]! }
- public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[4253]! }
- public var ChatList_UnarchiveAction: String { return self._s[4254]! }
- public var Stats_GroupTopInviter_History: String { return self._s[4255]! }
- public var GroupInfo_Permissions_Title: String { return self._s[4256]! }
- public var VoiceChat_CreateNewVoiceChatStart: String { return self._s[4257]! }
- public var Passport_Language_el: String { return self._s[4258]! }
- public var Channel_DiscussionMessageUnavailable: String { return self._s[4259]! }
- public var GroupInfo_ActionPromote: String { return self._s[4260]! }
- public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[4261]! }
- public var Media_LimitedAccessSelectMore: String { return self._s[4262]! }
+ public var Conversation_ReportGroupLocation: String { return self._s[4304]! }
+ public var Passport_Scans_Upload: String { return self._s[4305]! }
+ public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[4307]! }
+ public var ChatList_UnarchiveAction: String { return self._s[4308]! }
+ public var Stats_GroupTopInviter_History: String { return self._s[4309]! }
+ public var GroupInfo_Permissions_Title: String { return self._s[4310]! }
+ public var VoiceChat_CreateNewVoiceChatStart: String { return self._s[4311]! }
+ public var Passport_Language_el: String { return self._s[4312]! }
+ public var Channel_DiscussionMessageUnavailable: String { return self._s[4313]! }
+ public var GroupInfo_ActionPromote: String { return self._s[4314]! }
+ public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[4315]! }
+ public var Media_LimitedAccessSelectMore: String { return self._s[4316]! }
public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4263]!, self._r[4263]!, [_0])
- }
- public var VoiceOver_Chat_Reply: String { return self._s[4264]! }
- public var Month_GenMay: String { return self._s[4265]! }
- public var DialogList_DeleteBotConversationConfirmation: String { return self._s[4266]! }
- public var Chat_PsaTooltip_covid: String { return self._s[4267]! }
- public var Watch_Suggestion_CantTalk: String { return self._s[4268]! }
- public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[4269]! }
- public var AppUpgrade_Running: String { return self._s[4270]! }
- public var PasscodeSettings_UnlockWithFaceId: String { return self._s[4273]! }
- public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[4274]! }
- public var SharedMedia_EmptyText: String { return self._s[4275]! }
- public var Passport_Address_EditResidentialAddress: String { return self._s[4276]! }
- public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[4277]! }
- public var Message_PinnedGame: String { return self._s[4278]! }
- public var KeyCommand_SearchInChat: String { return self._s[4279]! }
- public var Appearance_ThemeCarouselNewNight: String { return self._s[4280]! }
- public var ChatList_Search_FilterMedia: String { return self._s[4281]! }
- public var Message_PinnedAudioMessage: String { return self._s[4282]! }
- public var ChannelInfo_ConfirmLeave: String { return self._s[4283]! }
- public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4284]!, self._r[4284]!, [_1, _2])
- }
- public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4285]! }
- public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4286]!, self._r[4286]!, [_0])
- }
- public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4287]!, self._r[4287]!, [_0])
- }
- public var Settings_AddAccount: String { return self._s[4288]! }
- public var Channel_AdminLog_CanDeleteMessages: String { return self._s[4289]! }
- public var Conversation_DiscardVoiceMessageTitle: String { return self._s[4290]! }
- public var Channel_JoinChannel: String { return self._s[4291]! }
- public var Watch_UserInfo_Unblock: String { return self._s[4292]! }
- public var PhoneLabel_Title: String { return self._s[4293]! }
- public var Group_Setup_HistoryHiddenHelp: String { return self._s[4295]! }
- public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[4296]! }
- public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4297]!, self._r[4297]!, [_1, _2, _3, _4, _5, _6])
- }
- public var Channel_AddBotErrorHaveRights: String { return self._s[4298]! }
- public var ChatList_TabIconFoldersTooltipNonEmptyFolders: String { return self._s[4299]! }
- public var DialogList_EncryptionProcessing: String { return self._s[4300]! }
- public var ChatList_Search_FilterChats: String { return self._s[4301]! }
- public var WatchRemote_NotificationText: String { return self._s[4302]! }
- public var EditTheme_ChangeColors: String { return self._s[4303]! }
- public var GroupRemoved_ViewUserInfo: String { return self._s[4304]! }
- public var CallSettings_OnMobile: String { return self._s[4306]! }
- public var Month_ShortFebruary: String { return self._s[4308]! }
- public var VoiceOver_MessageContextReply: String { return self._s[4309]! }
- public var Group_Location_ChangeLocation: String { return self._s[4311]! }
- public func PUSH_VIDEO_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4312]!, self._r[4312]!, [_1])
- }
- public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[4313]! }
- public var VoiceOver_Media_PlaybackStop: String { return self._s[4314]! }
- public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[4315]! }
- public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[4317]!, self._r[4317]!, [_0])
}
- public var PhotoEditor_WarmthTool: String { return self._s[4318]! }
- public var Login_InfoAvatarPhoto: String { return self._s[4319]! }
- public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[4320]! }
- public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[4321]! }
- public var Map_PlacesInThisArea: String { return self._s[4322]! }
- public var VoiceOver_Chat_ContactEmail: String { return self._s[4323]! }
- public var Notifications_InAppNotificationsSounds: String { return self._s[4324]! }
+ public var VoiceOver_Chat_Reply: String { return self._s[4318]! }
+ public var Month_GenMay: String { return self._s[4319]! }
+ public var DialogList_DeleteBotConversationConfirmation: String { return self._s[4320]! }
+ public var Chat_PsaTooltip_covid: String { return self._s[4321]! }
+ public var Watch_Suggestion_CantTalk: String { return self._s[4322]! }
+ public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[4323]! }
+ public var AppUpgrade_Running: String { return self._s[4324]! }
+ public var PasscodeSettings_UnlockWithFaceId: String { return self._s[4327]! }
+ public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[4328]! }
+ public var SharedMedia_EmptyText: String { return self._s[4329]! }
+ public var Passport_Address_EditResidentialAddress: String { return self._s[4330]! }
+ public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[4331]! }
+ public var Message_PinnedGame: String { return self._s[4332]! }
+ public var KeyCommand_SearchInChat: String { return self._s[4333]! }
+ public var Appearance_ThemeCarouselNewNight: String { return self._s[4334]! }
+ public var ChatList_Search_FilterMedia: String { return self._s[4335]! }
+ public var Message_PinnedAudioMessage: String { return self._s[4336]! }
+ public var ChannelInfo_ConfirmLeave: String { return self._s[4337]! }
+ public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[4338]!, self._r[4338]!, [_1, _2])
+ }
+ public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4339]! }
+ public var InviteLink_Create: String { return self._s[4340]! }
+ public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[4341]!, self._r[4341]!, [_0])
+ }
+ public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[4342]!, self._r[4342]!, [_0])
+ }
+ public var Settings_AddAccount: String { return self._s[4343]! }
+ public var Channel_AdminLog_CanDeleteMessages: String { return self._s[4344]! }
+ public var Conversation_DiscardVoiceMessageTitle: String { return self._s[4345]! }
+ public var Channel_JoinChannel: String { return self._s[4346]! }
+ public var Watch_UserInfo_Unblock: String { return self._s[4347]! }
+ public var PhoneLabel_Title: String { return self._s[4348]! }
+ public var Group_Setup_HistoryHiddenHelp: String { return self._s[4350]! }
+ public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[4351]! }
+ public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[4352]!, self._r[4352]!, [_1, _2, _3, _4, _5, _6])
+ }
+ public var Channel_AddBotErrorHaveRights: String { return self._s[4353]! }
+ public var ChatList_TabIconFoldersTooltipNonEmptyFolders: String { return self._s[4354]! }
+ public var DialogList_EncryptionProcessing: String { return self._s[4355]! }
+ public var ChatList_Search_FilterChats: String { return self._s[4356]! }
+ public var WatchRemote_NotificationText: String { return self._s[4357]! }
+ public var EditTheme_ChangeColors: String { return self._s[4358]! }
+ public var GroupRemoved_ViewUserInfo: String { return self._s[4359]! }
+ public var CallSettings_OnMobile: String { return self._s[4361]! }
+ public var Month_ShortFebruary: String { return self._s[4363]! }
+ public var VoiceOver_MessageContextReply: String { return self._s[4364]! }
+ public var Group_Location_ChangeLocation: String { return self._s[4366]! }
+ public func PUSH_VIDEO_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[4367]!, self._r[4367]!, [_1])
+ }
+ public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[4368]! }
+ public var VoiceOver_Media_PlaybackStop: String { return self._s[4369]! }
+ public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[4370]! }
+ public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) {
+ return formatWithArgumentRanges(self._s[4372]!, self._r[4372]!, [_0])
+ }
+ public var PhotoEditor_WarmthTool: String { return self._s[4373]! }
+ public var Login_InfoAvatarPhoto: String { return self._s[4374]! }
+ public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[4375]! }
+ public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[4376]! }
+ public var Map_PlacesInThisArea: String { return self._s[4377]! }
+ public var VoiceOver_Chat_ContactEmail: String { return self._s[4378]! }
+ public var Notifications_InAppNotificationsSounds: String { return self._s[4379]! }
public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4325]!, self._r[4325]!, [_1])
+ return formatWithArgumentRanges(self._s[4380]!, self._r[4380]!, [_1])
}
- public var ShareMenu_Send: String { return self._s[4326]! }
- public var Username_InvalidStartsWithNumber: String { return self._s[4327]! }
+ public var ShareMenu_Send: String { return self._s[4381]! }
+ public var Username_InvalidStartsWithNumber: String { return self._s[4382]! }
public func Channel_AdminLog_StartedVoiceChat(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4328]!, self._r[4328]!, [_1])
+ return formatWithArgumentRanges(self._s[4383]!, self._r[4383]!, [_1])
}
- public var Appearance_AppIconClassicX: String { return self._s[4329]! }
+ public var Appearance_AppIconClassicX: String { return self._s[4384]! }
public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4330]!, self._r[4330]!, [_1])
+ return formatWithArgumentRanges(self._s[4385]!, self._r[4385]!, [_1])
}
- public var Conversation_StopPoll: String { return self._s[4331]! }
- public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[4333]! }
- public var Passport_Identity_EditIdentityCard: String { return self._s[4334]! }
- public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[4335]! }
- public var Conversation_Timer_Title: String { return self._s[4336]! }
- public var Common_Next: String { return self._s[4337]! }
- public var Notification_Exceptions_NewException: String { return self._s[4338]! }
+ public var Conversation_StopPoll: String { return self._s[4386]! }
+ public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[4388]! }
+ public var Passport_Identity_EditIdentityCard: String { return self._s[4389]! }
+ public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[4390]! }
+ public var Conversation_Timer_Title: String { return self._s[4391]! }
+ public var Common_Next: String { return self._s[4392]! }
+ public var Notification_Exceptions_NewException: String { return self._s[4393]! }
public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4339]!, self._r[4339]!, [_0])
+ return formatWithArgumentRanges(self._s[4394]!, self._r[4394]!, [_0])
}
- public var AccessDenied_CallMicrophone: String { return self._s[4340]! }
- public var VoiceChat_UnmutePeer: String { return self._s[4341]! }
- public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[4342]! }
- public var ChangePhoneNumberCode_Help: String { return self._s[4343]! }
- public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[4344]! }
- public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[4345]! }
- public var BlockedUsers_LeavePrefix: String { return self._s[4346]! }
+ public var AccessDenied_CallMicrophone: String { return self._s[4395]! }
+ public var VoiceChat_UnmutePeer: String { return self._s[4396]! }
+ public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[4397]! }
+ public var ChangePhoneNumberCode_Help: String { return self._s[4398]! }
+ public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[4399]! }
+ public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[4400]! }
+ public var BlockedUsers_LeavePrefix: String { return self._s[4401]! }
public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4347]!, self._r[4347]!, [_0])
+ return formatWithArgumentRanges(self._s[4402]!, self._r[4402]!, [_0])
}
- public var Group_About_Help: String { return self._s[4348]! }
- public var TwoStepAuth_ChangePasswordDescription: String { return self._s[4349]! }
- public var Tour_Title3: String { return self._s[4350]! }
- public var Watch_Conversation_Unblock: String { return self._s[4351]! }
- public var Watch_UserInfo_Block: String { return self._s[4352]! }
- public var Notifications_ChannelNotificationsAlert: String { return self._s[4353]! }
- public var TwoFactorSetup_Hint_Action: String { return self._s[4354]! }
- public var IntentsSettings_SuggestedChatsInfo: String { return self._s[4355]! }
- public var TextFormat_AddLinkTitle: String { return self._s[4356]! }
- public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[4357]! }
- public var TwoStepAuth_EnterPasswordTitle: String { return self._s[4358]! }
- public var FastTwoStepSetup_PasswordSection: String { return self._s[4359]! }
- public var Compose_ChannelMembers: String { return self._s[4360]! }
- public var Conversation_ForwardTitle: String { return self._s[4361]! }
- public var Conversation_PinnedPoll: String { return self._s[4363]! }
+ public var Group_About_Help: String { return self._s[4403]! }
+ public var TwoStepAuth_ChangePasswordDescription: String { return self._s[4404]! }
+ public var Tour_Title3: String { return self._s[4405]! }
+ public var Watch_Conversation_Unblock: String { return self._s[4406]! }
+ public var Watch_UserInfo_Block: String { return self._s[4407]! }
+ public var Notifications_ChannelNotificationsAlert: String { return self._s[4408]! }
+ public var TwoFactorSetup_Hint_Action: String { return self._s[4409]! }
+ public var IntentsSettings_SuggestedChatsInfo: String { return self._s[4410]! }
+ public var TextFormat_AddLinkTitle: String { return self._s[4411]! }
+ public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[4412]! }
+ public var TwoStepAuth_EnterPasswordTitle: String { return self._s[4413]! }
+ public var FastTwoStepSetup_PasswordSection: String { return self._s[4414]! }
+ public var Compose_ChannelMembers: String { return self._s[4415]! }
+ public var Conversation_ForwardTitle: String { return self._s[4416]! }
+ public var Conversation_PinnedPoll: String { return self._s[4418]! }
public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4364]!, self._r[4364]!, [_0])
+ return formatWithArgumentRanges(self._s[4419]!, self._r[4419]!, [_0])
}
- public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4365]! }
- public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4366]! }
- public var Stats_Overview: String { return self._s[4367]! }
- public var Map_HomeAndWorkTitle: String { return self._s[4368]! }
+ public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4420]! }
+ public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4421]! }
+ public var Stats_Overview: String { return self._s[4422]! }
+ public var Map_HomeAndWorkTitle: String { return self._s[4423]! }
public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4369]!, self._r[4369]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[4424]!, self._r[4424]!, [_1, _2, _3])
}
- public var Passport_Address_CityPlaceholder: String { return self._s[4370]! }
- public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[4371]! }
- public var Privacy_PhoneNumber: String { return self._s[4372]! }
- public var ChatList_Search_FilterFiles: String { return self._s[4373]! }
- public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[4374]! }
- public var ChannelIntro_CreateChannel: String { return self._s[4375]! }
- public var Conversation_InputTextAnonymousPlaceholder: String { return self._s[4376]! }
+ public var Passport_Address_CityPlaceholder: String { return self._s[4425]! }
+ public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[4426]! }
+ public var Privacy_PhoneNumber: String { return self._s[4427]! }
+ public var ChatList_Search_FilterFiles: String { return self._s[4428]! }
+ public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[4429]! }
+ public var ChannelIntro_CreateChannel: String { return self._s[4430]! }
+ public var Conversation_InputTextAnonymousPlaceholder: String { return self._s[4431]! }
public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4377]!, self._r[4377]!, [_0])
+ return formatWithArgumentRanges(self._s[4432]!, self._r[4432]!, [_0])
}
- public var Weekday_ShortMonday: String { return self._s[4378]! }
- public var Passport_Language_ar: String { return self._s[4380]! }
- public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4381]! }
- public var TwoFactorSetup_Done_Title: String { return self._s[4382]! }
- public var Calls_RatingFeedback: String { return self._s[4383]! }
- public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[4384]! }
- public var AutoDownloadSettings_ResetSettings: String { return self._s[4387]! }
- public var Watch_Compose_Send: String { return self._s[4388]! }
- public var PasscodeSettings_ChangePasscode: String { return self._s[4389]! }
- public var WebSearch_RecentSectionClear: String { return self._s[4390]! }
+ public var Weekday_ShortMonday: String { return self._s[4433]! }
+ public var Passport_Language_ar: String { return self._s[4435]! }
+ public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4436]! }
+ public var TwoFactorSetup_Done_Title: String { return self._s[4437]! }
+ public var Calls_RatingFeedback: String { return self._s[4438]! }
+ public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[4439]! }
+ public var AutoDownloadSettings_ResetSettings: String { return self._s[4442]! }
+ public var Watch_Compose_Send: String { return self._s[4443]! }
+ public var PasscodeSettings_ChangePasscode: String { return self._s[4444]! }
+ public var WebSearch_RecentSectionClear: String { return self._s[4445]! }
public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4391]!, self._r[4391]!, [_0])
+ return formatWithArgumentRanges(self._s[4446]!, self._r[4446]!, [_0])
}
- public var WallpaperSearch_ColorTeal: String { return self._s[4392]! }
- public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[4393]! }
- public var Permissions_ContactsTitle_v0: String { return self._s[4394]! }
- public var Checkout_PasswordEntry_Pay: String { return self._s[4396]! }
- public var Settings_SavedMessages: String { return self._s[4397]! }
- public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[4398]! }
- public var Month_ShortMarch: String { return self._s[4399]! }
- public var Message_Location: String { return self._s[4400]! }
+ public var WallpaperSearch_ColorTeal: String { return self._s[4447]! }
+ public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[4448]! }
+ public var Permissions_ContactsTitle_v0: String { return self._s[4449]! }
+ public var Checkout_PasswordEntry_Pay: String { return self._s[4451]! }
+ public var Settings_SavedMessages: String { return self._s[4452]! }
+ public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[4453]! }
+ public var Month_ShortMarch: String { return self._s[4454]! }
+ public var Message_Location: String { return self._s[4455]! }
public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4401]!, self._r[4401]!, [_1])
+ return formatWithArgumentRanges(self._s[4456]!, self._r[4456]!, [_1])
}
public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4402]!, self._r[4402]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[4457]!, self._r[4457]!, [_1, _2])
}
- public var VoiceOver_Chat_VoiceMessage: String { return self._s[4404]! }
+ public var VoiceOver_Chat_VoiceMessage: String { return self._s[4459]! }
public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4405]!, self._r[4405]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[4460]!, self._r[4460]!, [_1, _2])
}
- public var GroupPermission_NoSendMedia: String { return self._s[4406]! }
- public var Conversation_ClousStorageInfo_Description2: String { return self._s[4407]! }
- public var SharedMedia_CategoryDocs: String { return self._s[4408]! }
- public var Appearance_RemoveThemeConfirmation: String { return self._s[4409]! }
- public var Paint_Framed: String { return self._s[4410]! }
- public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[4411]! }
- public var Passport_Identity_DoesNotExpire: String { return self._s[4412]! }
- public var Channel_SignMessages: String { return self._s[4413]! }
- public var Contacts_AccessDeniedHelpON: String { return self._s[4414]! }
- public var Conversation_ContextMenuStickerPackInfo: String { return self._s[4415]! }
+ public var GroupPermission_NoSendMedia: String { return self._s[4461]! }
+ public var Conversation_ClousStorageInfo_Description2: String { return self._s[4462]! }
+ public var SharedMedia_CategoryDocs: String { return self._s[4463]! }
+ public var Appearance_RemoveThemeConfirmation: String { return self._s[4464]! }
+ public var Paint_Framed: String { return self._s[4465]! }
+ public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[4466]! }
+ public var Passport_Identity_DoesNotExpire: String { return self._s[4467]! }
+ public var Channel_SignMessages: String { return self._s[4468]! }
+ public var Contacts_AccessDeniedHelpON: String { return self._s[4469]! }
+ public var Conversation_ContextMenuStickerPackInfo: String { return self._s[4470]! }
public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4416]!, self._r[4416]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[4471]!, self._r[4471]!, [_1, _2])
}
- public var GroupInfo_UpgradeButton: String { return self._s[4417]! }
- public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[4418]! }
- public var AutoDownloadSettings_Files: String { return self._s[4419]! }
+ public var InviteLink_Create_TimeLimitNoLimit: String { return self._s[4472]! }
+ public var GroupInfo_UpgradeButton: String { return self._s[4473]! }
+ public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[4474]! }
+ public var AutoDownloadSettings_Files: String { return self._s[4475]! }
public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4420]!, self._r[4420]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[4476]!, self._r[4476]!, [_0, _1])
}
- public var Login_SendCodeViaSms: String { return self._s[4422]! }
- public var Update_UpdateApp: String { return self._s[4423]! }
- public var Channel_Setup_TypePublic: String { return self._s[4424]! }
- public var Watch_Compose_CreateMessage: String { return self._s[4425]! }
+ public var Login_SendCodeViaSms: String { return self._s[4478]! }
+ public var Update_UpdateApp: String { return self._s[4479]! }
+ public var Channel_Setup_TypePublic: String { return self._s[4480]! }
+ public var Watch_Compose_CreateMessage: String { return self._s[4481]! }
public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4426]!, self._r[4426]!, [_1, _2, _3])
+ return formatWithArgumentRanges(self._s[4482]!, self._r[4482]!, [_1, _2, _3])
}
- public var StickerPacksSettings_ManagingHelp: String { return self._s[4427]! }
- public var VoiceOver_Chat_Video: String { return self._s[4428]! }
- public var Forward_ChannelReadOnly: String { return self._s[4429]! }
- public var StickerPack_HideStickers: String { return self._s[4430]! }
- public var ChatListFolder_NameContacts: String { return self._s[4431]! }
- public var Profile_BotInfo: String { return self._s[4432]! }
- public var Document_TargetConfirmationFormat: String { return self._s[4433]! }
- public var GroupInfo_InviteByLink: String { return self._s[4434]! }
- public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[4435]! }
- public var Watch_Stickers_RecentPlaceholder: String { return self._s[4436]! }
- public var Broadcast_AdminLog_EmptyText: String { return self._s[4437]! }
- public var Passport_NotLoggedInMessage: String { return self._s[4438]! }
- public var Conversation_StopQuizConfirmation: String { return self._s[4439]! }
- public var Checkout_PaymentMethod: String { return self._s[4440]! }
- public var ChatList_ArchivedChatsTitle: String { return self._s[4444]! }
- public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[4445]! }
- public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[4446]! }
- public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[4447]! }
- public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[4448]! }
- public var Camera_Title: String { return self._s[4449]! }
- public var Map_Directions: String { return self._s[4450]! }
- public var Stats_MessagePublicForwardsTitle: String { return self._s[4452]! }
- public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[4453]! }
- public var Profile_EncryptionKey: String { return self._s[4454]! }
+ public var StickerPacksSettings_ManagingHelp: String { return self._s[4483]! }
+ public var VoiceOver_Chat_Video: String { return self._s[4484]! }
+ public var Forward_ChannelReadOnly: String { return self._s[4485]! }
+ public var StickerPack_HideStickers: String { return self._s[4486]! }
+ public var ChatListFolder_NameContacts: String { return self._s[4487]! }
+ public var Profile_BotInfo: String { return self._s[4488]! }
+ public var Document_TargetConfirmationFormat: String { return self._s[4489]! }
+ public var GroupInfo_InviteByLink: String { return self._s[4490]! }
+ public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[4491]! }
+ public var Watch_Stickers_RecentPlaceholder: String { return self._s[4492]! }
+ public var Broadcast_AdminLog_EmptyText: String { return self._s[4493]! }
+ public var Passport_NotLoggedInMessage: String { return self._s[4494]! }
+ public var Conversation_StopQuizConfirmation: String { return self._s[4495]! }
+ public var Checkout_PaymentMethod: String { return self._s[4496]! }
+ public var ChatList_ArchivedChatsTitle: String { return self._s[4500]! }
+ public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[4501]! }
+ public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[4502]! }
+ public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[4503]! }
+ public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[4504]! }
+ public var Camera_Title: String { return self._s[4505]! }
+ public var Map_Directions: String { return self._s[4506]! }
+ public var Stats_MessagePublicForwardsTitle: String { return self._s[4508]! }
+ public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[4509]! }
+ public var Profile_EncryptionKey: String { return self._s[4510]! }
public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4455]!, self._r[4455]!, [_1, "\(_2)"])
+ return formatWithArgumentRanges(self._s[4511]!, self._r[4511]!, [_1, "\(_2)"])
}
public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4456]!, self._r[4456]!, [_0, _1])
+ return formatWithArgumentRanges(self._s[4512]!, self._r[4512]!, [_0, _1])
}
- public var Passport_Identity_TypePassport: String { return self._s[4457]! }
- public var CreatePoll_QuizOptionsHeader: String { return self._s[4459]! }
- public var Common_No: String { return self._s[4460]! }
- public var Conversation_SendMessage_ScheduleMessage: String { return self._s[4461]! }
- public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[4462]! }
- public var Settings_AboutEmpty: String { return self._s[4463]! }
- public var TwoStepAuth_FloodError: String { return self._s[4465]! }
- public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[4466]! }
+ public var Passport_Identity_TypePassport: String { return self._s[4513]! }
+ public var CreatePoll_QuizOptionsHeader: String { return self._s[4515]! }
+ public var Common_No: String { return self._s[4516]! }
+ public var Conversation_SendMessage_ScheduleMessage: String { return self._s[4517]! }
+ public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[4518]! }
+ public var Settings_AboutEmpty: String { return self._s[4519]! }
+ public var TwoStepAuth_FloodError: String { return self._s[4521]! }
+ public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[4522]! }
public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4468]!, self._r[4468]!, [_1])
+ return formatWithArgumentRanges(self._s[4524]!, self._r[4524]!, [_1])
}
- public var Conversation_Edit: String { return self._s[4471]! }
- public var CheckoutInfo_SaveInfo: String { return self._s[4472]! }
- public var VoiceOver_Chat_AnonymousPoll: String { return self._s[4473]! }
- public var Call_CameraTooltip: String { return self._s[4475]! }
- public var InstantPage_FeedbackButtonShort: String { return self._s[4476]! }
- public var Contacts_InviteToTelegram: String { return self._s[4477]! }
- public var Notifications_ResetAllNotifications: String { return self._s[4478]! }
- public var Calls_NewCall: String { return self._s[4479]! }
- public var VoiceOver_Chat_Music: String { return self._s[4482]! }
- public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[4483]! }
- public var Channel_Edit_AboutItem: String { return self._s[4484]! }
- public var Message_VideoExpired: String { return self._s[4485]! }
- public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[4486]! }
+ public var Conversation_Edit: String { return self._s[4527]! }
+ public var CheckoutInfo_SaveInfo: String { return self._s[4528]! }
+ public var VoiceOver_Chat_AnonymousPoll: String { return self._s[4529]! }
+ public var Call_CameraTooltip: String { return self._s[4531]! }
+ public var InstantPage_FeedbackButtonShort: String { return self._s[4532]! }
+ public var Contacts_InviteToTelegram: String { return self._s[4533]! }
+ public var Notifications_ResetAllNotifications: String { return self._s[4534]! }
+ public var Calls_NewCall: String { return self._s[4535]! }
+ public var VoiceOver_Chat_Music: String { return self._s[4538]! }
+ public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[4539]! }
+ public var Channel_Edit_AboutItem: String { return self._s[4540]! }
+ public var Message_VideoExpired: String { return self._s[4541]! }
+ public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[4542]! }
public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4487]!, self._r[4487]!, [_1, _2])
+ return formatWithArgumentRanges(self._s[4543]!, self._r[4543]!, [_1, _2])
}
- public var NotificationsSound_Input: String { return self._s[4489]! }
- public var Notifications_ClassicTones: String { return self._s[4490]! }
- public var Conversation_StatusTyping: String { return self._s[4491]! }
- public var Checkout_ErrorProviderAccountInvalid: String { return self._s[4492]! }
- public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[4493]! }
- public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4494]! }
- public var Conversation_MessageLeaveComment: String { return self._s[4495]! }
- public var UserInfo_TapToCall: String { return self._s[4496]! }
- public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[4497]! }
- public var Conversation_ClearAll: String { return self._s[4499]! }
- public var UserInfo_NotificationsDefault: String { return self._s[4500]! }
- public var Location_ProximityGroupTip: String { return self._s[4501]! }
- public var Map_ChooseAPlace: String { return self._s[4502]! }
- public var GroupInfo_AddParticipantTitle: String { return self._s[4503]! }
- public var ChatList_PeerTypeNonContact: String { return self._s[4504]! }
- public var Conversation_SlideToCancel: String { return self._s[4505]! }
- public var Month_ShortJuly: String { return self._s[4506]! }
- public var SocksProxySetup_ProxyType: String { return self._s[4507]! }
+ public var NotificationsSound_Input: String { return self._s[4545]! }
+ public var Notifications_ClassicTones: String { return self._s[4546]! }
+ public var Conversation_StatusTyping: String { return self._s[4547]! }
+ public var Checkout_ErrorProviderAccountInvalid: String { return self._s[4548]! }
+ public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[4549]! }
+ public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4550]! }
+ public var Conversation_MessageLeaveComment: String { return self._s[4551]! }
+ public var UserInfo_TapToCall: String { return self._s[4552]! }
+ public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[4553]! }
+ public var Conversation_ClearAll: String { return self._s[4555]! }
+ public var UserInfo_NotificationsDefault: String { return self._s[4556]! }
+ public var Location_ProximityGroupTip: String { return self._s[4557]! }
+ public var Map_ChooseAPlace: String { return self._s[4558]! }
+ public var GroupInfo_AddParticipantTitle: String { return self._s[4559]! }
+ public var ChatList_PeerTypeNonContact: String { return self._s[4560]! }
+ public var Conversation_SlideToCancel: String { return self._s[4561]! }
+ public var Month_ShortJuly: String { return self._s[4562]! }
+ public var SocksProxySetup_ProxyType: String { return self._s[4563]! }
public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4508]!, self._r[4508]!, [_0])
+ return formatWithArgumentRanges(self._s[4564]!, self._r[4564]!, [_0])
}
- public var ChatList_EditFolders: String { return self._s[4509]! }
- public var TwoStepAuth_SetPasswordHelp: String { return self._s[4510]! }
- public var ScheduledMessages_RemindersTitle: String { return self._s[4512]! }
+ public var ChatList_EditFolders: String { return self._s[4565]! }
+ public var TwoStepAuth_SetPasswordHelp: String { return self._s[4566]! }
+ public var ScheduledMessages_RemindersTitle: String { return self._s[4568]! }
public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) {
- return formatWithArgumentRanges(self._s[4513]!, self._r[4513]!, [_0])
+ return formatWithArgumentRanges(self._s[4569]!, self._r[4569]!, [_0])
}
- public var Permissions_PeopleNearbyTitle_v0: String { return self._s[4514]! }
- public var Your_cards_expiration_year_is_invalid: String { return self._s[4515]! }
- public var UserInfo_ShareMyContactInfo: String { return self._s[4517]! }
- public var Passport_DeleteAddress: String { return self._s[4519]! }
- public var Passport_DeletePassportConfirmation: String { return self._s[4520]! }
- public var Passport_Identity_ReverseSide: String { return self._s[4521]! }
- public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[4522]! }
- public var Login_InfoLastNamePlaceholder: String { return self._s[4523]! }
- public var Passport_FieldAddress: String { return self._s[4524]! }
- public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[4525]! }
- public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[4528]! }
- public var VoiceChat_Panel_TapToJoin: String { return self._s[4529]! }
- public var Map_Home: String { return self._s[4530]! }
- public var PollResults_Title: String { return self._s[4532]! }
- public var ArchivedChats_IntroText2: String { return self._s[4534]! }
- public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[4535]! }
- public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[4536]! }
- public var VoiceChat_Muted: String { return self._s[4538]! }
- public var CallFeedback_ReasonSilentRemote: String { return self._s[4539]! }
- public var Passport_Identity_AddPersonalDetails: String { return self._s[4540]! }
- public var Group_Info_AdminLog: String { return self._s[4542]! }
- public var ChatSettings_AutoPlayTitle: String { return self._s[4543]! }
- public var Appearance_Animations: String { return self._s[4544]! }
- public var Appearance_TextSizeSetting: String { return self._s[4545]! }
- public func SharedMedia_Video(_ value: Int32) -> String {
- let form = getPluralizationForm(self.lc, value)
- let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
- return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue)
+ public var Permissions_PeopleNearbyTitle_v0: String { return self._s[4570]! }
+ public var Your_cards_expiration_year_is_invalid: String { return self._s[4571]! }
+ public var UserInfo_ShareMyContactInfo: String { return self._s[4573]! }
+ public var Passport_DeleteAddress: String { return self._s[4575]! }
+ public var Passport_DeletePassportConfirmation: String { return self._s[4576]! }
+ public var Passport_Identity_ReverseSide: String { return self._s[4577]! }
+ public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[4578]! }
+ public var Login_InfoLastNamePlaceholder: String { return self._s[4579]! }
+ public var InviteLink_CreatedBy: String { return self._s[4580]! }
+ public var Passport_FieldAddress: String { return self._s[4581]! }
+ public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[4582]! }
+ public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[4585]! }
+ public var VoiceChat_Panel_TapToJoin: String { return self._s[4586]! }
+ public var Map_Home: String { return self._s[4587]! }
+ public var PollResults_Title: String { return self._s[4589]! }
+ public var ArchivedChats_IntroText2: String { return self._s[4591]! }
+ public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[4592]! }
+ public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[4593]! }
+ public var VoiceChat_Muted: String { return self._s[4595]! }
+ public var CallFeedback_ReasonSilentRemote: String { return self._s[4596]! }
+ public var Passport_Identity_AddPersonalDetails: String { return self._s[4597]! }
+ public var Group_Info_AdminLog: String { return self._s[4599]! }
+ public var ChatSettings_AutoPlayTitle: String { return self._s[4600]! }
+ public var Appearance_Animations: String { return self._s[4601]! }
+ public var Appearance_TextSizeSetting: String { return self._s[4602]! }
+ public func PUSH_CHANNEL_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 InstantPage_Views(_ value: Int32) -> String {
+ public func MessageTimer_Years(_ 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 PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
+ public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, _2, _1, _3)
+ return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, _1, _2)
}
- public func Stats_GroupTopInviterInvites(_ value: Int32) -> String {
+ public func ChatList_MessageVideos(_ 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 PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, _1, _2)
+ public func CreatePoll_AddMoreOptions(_ 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 OldChannels_GroupFormat(_ value: Int32) -> String {
+ public func Map_ETAHours(_ 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 MessageTimer_Hours(_ value: Int32) -> String {
+ public func MessageTimer_ShortMinutes(_ 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_StatusOnline(_ value: Int32) -> String {
+ public func MessageTimer_Days(_ 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 PollResults_ShowMore(_ value: Int32) -> String {
+ public func LiveLocationUpdated_MinutesAgo(_ 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 Stats_GroupShowMoreTopPosters(_ value: Int32) -> String {
+ public func ChatList_DeleteConfirmation(_ 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 ForwardedPolls(_ value: Int32) -> String {
+ public func Media_SharePhoto(_ 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 MuteFor_Days(_ value: Int32) -> String {
+ public func InviteLink_PeopleJoinedShort(_ 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 Chat_TitlePinnedMessages(_ value: Int32) -> String {
+ public func PrivacyLastSeenSettings_AddUsers(_ 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 PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, _1, _2)
- }
- public func MessageTimer_Weeks(_ value: Int32) -> String {
+ public func Chat_DeleteMessagesConfirmation(_ 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)
+ return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func Passport_Scans(_ value: Int32) -> String {
+ 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[14 * 6 + Int(form.rawValue)]!, _2, _1, _3)
+ }
+ 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 Stats_GroupTopAdminKicks(_ value: Int32) -> String {
+ public func Notification_GameScoreSelfSimple(_ value: Int32) -> String {
let form = getPluralizationForm(self.lc, value)
let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String {
+ public func SharedMedia_Link(_ 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 Call_ShortMinutes(_ value: Int32) -> String {
+ public func MessageTimer_ShortSeconds(_ 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 LastSeen_HoursAgo(_ value: Int32) -> String {
+ public func Call_ShortSeconds(_ 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)
@@ -5116,141 +5165,139 @@ public final class PresentationStrings: Equatable {
let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String {
+ public func Call_Seconds(_ 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 SharedMedia_Photo(_ value: Int32) -> String {
+ public func MuteFor_Hours(_ 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 Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String {
+ public func StickerPack_AddMaskCount(_ 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 ServiceMessage_GameScoreSimple(_ 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[24 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func Invitation_Members(_ value: Int32) -> String {
+ 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[25 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func ForwardedStickers(_ value: Int32) -> String {
+ public func SharedMedia_Video(_ 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 ChatList_DeleteConfirmation(_ value: Int32) -> String {
+ public func Conversation_SelectedMessages(_ 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 MessageTimer_ShortHours(_ value: Int32) -> String {
+ public func Invitation_Members(_ 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 Contacts_InviteContacts(_ value: Int32) -> String {
+ public func Conversation_StatusMembers(_ 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 PasscodeSettings_FailedAttempts(_ value: Int32) -> String {
+ public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String {
let form = getPluralizationForm(self.lc, value)
let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func ChatList_MessageVideos(_ value: Int32) -> String {
+ public func Conversation_StatusSubscribers(_ 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 PUSH_MESSAGE_DOCS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2)
+ 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[32 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func StickerPack_StickerCount(_ 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[33 * 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[34 * 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[34 * 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[35 * 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[35 * 6 + Int(form.rawValue)]!, _1, _2)
}
- public func Call_Hours(_ value: Int32) -> String {
+ public func Wallpaper_DeleteConfirmation(_ 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 Conversation_SelectedMessages(_ value: Int32) -> String {
+ public func Conversation_TitleReplies(_ 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 MessageTimer_Months(_ value: Int32) -> String {
+ public func InviteText_ContactsCountText(_ 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 MessageTimer_ShortSeconds(_ value: Int32) -> String {
+ public func OldChannels_InactiveMonth(_ 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 SharedMedia_Generic(_ value: Int32) -> String {
+ public func Conversation_StatusOnline(_ 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 MuteExpires_Minutes(_ value: Int32) -> String {
+ 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[41 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func Watch_UserInfo_Mute(_ value: Int32) -> String {
+ public func ChatList_MessagePhotos(_ 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 Notification_GameScoreSelfSimple(_ value: Int32) -> String {
+ public func ForwardedAudios(_ 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 CreatePoll_AddMoreOptions(_ value: Int32) -> String {
+ public func Stats_GroupShowMoreTopAdmins(_ 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 OldChannels_InactiveYear(_ 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 PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ let form = getPluralizationForm(self.lc, selector)
+ return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, _1, _2)
}
- public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String {
+ public func Call_ShortMinutes(_ 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 VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String {
+ public func Call_Days(_ 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 Stats_GroupTopPosterChars(_ value: Int32) -> String {
+ public func MessageTimer_Minutes(_ 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)
@@ -5260,469 +5307,471 @@ public final class PresentationStrings: Equatable {
let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func Stats_MessageForwards(_ value: Int32) -> String {
+ 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 MessageTimer_ShortHours(_ 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)
+ return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, _1, _2)
- }
- public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String {
+ public func ForwardedStickers(_ 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 AttachmentMenu_SendGif(_ value: Int32) -> String {
+ public func ForwardedVideos(_ 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 SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String {
+ public func Stats_GroupShowMoreTopInviters(_ 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 StickerPack_RemoveStickerCount(_ value: Int32) -> String {
+ public func Stats_GroupTopAdminKicks(_ 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 Notification_GameScoreSelfExtended(_ value: Int32) -> String {
+ public func MessageTimer_ShortWeeks(_ 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 MessageTimer_Years(_ value: Int32) -> String {
+ public func OldChannels_InactiveWeek(_ 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 VoiceOver_Chat_PollVotes(_ value: Int32) -> String {
+ public func ServiceMessage_GameScoreExtended(_ 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 ChatList_SelectedChats(_ 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[59 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String {
+ public func MuteFor_Days(_ 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 MessagePoll_QuizCount(_ value: Int32) -> String {
+ public func ServiceMessage_GameScoreSelfExtended(_ 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 PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String {
+ public func Conversation_ContextMenuSelectAll(_ 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 Notification_GameScoreSimple(_ 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[63 * 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[64 * 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[64 * 6 + Int(form.rawValue)]!, _1, _2)
}
- public func StickerPack_AddMaskCount(_ value: Int32) -> String {
+ public func Chat_MessagesUnpinned(_ 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 MessageTimer_Days(_ 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[66 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func GroupInfo_ParticipantCount(_ value: Int32) -> String {
+ 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[67 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func Call_Seconds(_ value: Int32) -> String {
+ public func InviteLink_PeopleJoined(_ 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 PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
+ 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[69 * 6 + Int(form.rawValue)]!, _2, _1, _3)
}
- public func Conversation_MessageViewComments(_ value: Int32) -> String {
+ public func Contacts_ImportersCount(_ 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 MuteExpires_Days(_ value: Int32) -> String {
+ public func Conversation_LiveLocationMembersCount(_ 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 Stats_GroupShowMoreTopInviters(_ value: Int32) -> String {
+ public func ForwardedPhotos(_ 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 PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
- let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, _1, _2)
+ public func StickerPack_AddStickerCount(_ 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 Conversation_StatusMembers(_ value: Int32) -> String {
+ public func Call_Minutes(_ 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 Chat_DeleteMessagesConfirmation(_ value: Int32) -> String {
+ public func ServiceMessage_GameScoreSelfSimple(_ 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 Stats_GroupShowMoreTopAdmins(_ 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 MuteExpires_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 PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, _1, _2)
+ return String(format: self._ps[76 * 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[77 * 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[78 * 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[79 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
let form = getPluralizationForm(self.lc, selector)
return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, _1, _2)
}
- public func MessageTimer_ShortWeeks(_ value: Int32) -> String {
+ 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[81 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func VoiceOver_Chat_MessagesSelected(_ value: Int32) -> String {
+ public func MessageTimer_Months(_ 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 LastSeen_MinutesAgo(_ 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 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[83 * 6 + Int(form.rawValue)]!, _2, _1, _3)
}
- public func ForwardedLocations(_ value: Int32) -> String {
+ 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[84 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func SharedMedia_Link(_ value: Int32) -> String {
+ public func PollResults_ShowMore(_ 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 Notifications_Exceptions(_ value: Int32) -> String {
+ public func SharedMedia_File(_ 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 ChatList_MessageFiles(_ value: Int32) -> String {
+ public func Notifications_Exceptions(_ 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)
}
- public func ChatList_DeletedChats(_ value: Int32) -> String {
+ public func Stats_GroupTopInviterInvites(_ 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 LiveLocation_MenuChatsCount(_ 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_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ public func PUSH_MESSAGE_PHOTOS(_ 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 VoiceOver_Chat_PollOptionCount(_ 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 LiveLocationUpdated_MinutesAgo(_ 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 Stats_GroupTopAdminDeletions(_ 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 ServiceMessage_GameScoreSelfExtended(_ 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 StickerPack_AddStickerCount(_ 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 InviteText_ContactsCountText(_ 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 OldChannels_InactiveMonth(_ 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 Notification_GameScoreExtended(_ 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 Stats_GroupTopPosterMessages(_ 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 Call_Days(_ 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_SendItem(_ 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)
+ return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, _1, _2)
}
public func QuickSend_Photos(_ 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 Forward_ConfirmMultipleFiles(_ 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 VoiceOver_Chat_MessagesSelected(_ 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 GroupInfo_ParticipantCount(_ 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 Stats_MessageForwards(_ 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 LastSeen_MinutesAgo(_ 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 PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
+ let form = getPluralizationForm(self.lc, selector)
+ return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, _2, _1, _3)
+ }
+ public func MuteExpires_Days(_ 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 OldChannels_Leave(_ 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 MessagePoll_VotedCount(_ 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 PUSH_MESSAGE_DOCS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ let form = getPluralizationForm(self.lc, selector)
+ return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, _1, _2)
+ }
+ 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[101 * 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[102 * 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[103 * 6 + Int(form.rawValue)]!, _1, _2)
+ 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[103 * 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[104 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func VoiceChat_Panel_Members(_ value: Int32) -> String {
+ public func LastSeen_HoursAgo(_ 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 MessageTimer_Minutes(_ value: Int32) -> String {
+ public func Notification_GameScoreSelfExtended(_ 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 ForwardedContacts(_ value: Int32) -> String {
+ public func Passport_Scans(_ 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 Conversation_StatusSubscribers(_ value: Int32) -> String {
+ public func OldChannels_InactiveYear(_ 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 PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
- let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, _2, _1, _3)
- }
- 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[110 * 6 + Int(form.rawValue)]!, _2, _1, _3)
- }
- public func Conversation_ContextViewReplies(_ value: Int32) -> String {
+ public func PasscodeSettings_FailedAttempts(_ 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 ChatList_Search_Messages(_ 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 ChatList_MessageMusic(_ 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 SharedMedia_File(_ 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 OldChannels_InactiveWeek(_ 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 Watch_LastSeen_MinutesAgo(_ 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 Map_ETAMinutes(_ 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 ForwardedMessages(_ 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 Map_ETAHours(_ 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 Call_ShortSeconds(_ 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 VoiceChat_Status_Members(_ 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[109 * 6 + Int(form.rawValue)]!, stringValue)
}
public func UserCount(_ 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)
+ return String(format: self._ps[110 * 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[123 * 6 + Int(form.rawValue)]!, _1, _2)
- }
- public func ForwardedPhotos(_ value: Int32) -> String {
+ public func AttachmentMenu_SendGif(_ 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)
+ return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func Chat_MessagesUnpinned(_ value: Int32) -> String {
+ public func MessagePoll_QuizCount(_ 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)
+ return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func ForwardedGifs(_ value: Int32) -> String {
+ public func Contacts_InviteContacts(_ 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)
+ return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func ChatList_MessagePhotos(_ value: Int32) -> String {
+ public func ServiceMessage_GameScoreSimple(_ 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)
+ return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func MessagePoll_VotedCount(_ value: Int32) -> String {
+ public func SharedMedia_DeleteItemsConfirmation(_ 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)
+ return String(format: self._ps[115 * 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[129 * 6 + Int(form.rawValue)]!, _1, _2)
- }
- public func ForwardedVideoMessages(_ value: Int32) -> String {
+ 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)
+ return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func MessageTimer_Seconds(_ value: Int32) -> String {
+ public func Conversation_TitleComments(_ 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)
+ return String(format: self._ps[117 * 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[132 * 6 + Int(form.rawValue)]!, _0, _1)
- }
- public func MuteFor_Hours(_ value: Int32) -> String {
+ public func AttachmentMenu_SendPhoto(_ 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)
+ return String(format: self._ps[118 * 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[119 * 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[120 * 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[134 * 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[135 * 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[136 * 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[137 * 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[138 * 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[139 * 6 + Int(form.rawValue)]!, stringValue)
+ return String(format: self._ps[121 * 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[140 * 6 + Int(form.rawValue)]!, stringValue)
+ return String(format: self._ps[122 * 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[123 * 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[124 * 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[125 * 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[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 Stats_GroupShowMoreTopPosters(_ 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 StickerPack_StickerCount(_ 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 Conversation_ContextViewReplies(_ 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 Conversation_MessageViewComments(_ 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 InstantPage_Views(_ 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 ChatList_MessageFiles(_ 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 PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
+ let form = getPluralizationForm(self.lc, selector)
+ return String(format: self._ps[134 * 6 + Int(form.rawValue)]!, _1, _2)
+ }
+ public func OldChannels_GroupFormat(_ 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 Notification_GameScoreSimple(_ 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 ForwardedMessages(_ 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 MuteExpires_Minutes(_ 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 ForwardedFiles(_ 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 PUSH_CHANNEL_MESSAGE_DOCS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[141 * 6 + Int(form.rawValue)]!, _1, _2)
+ return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, _1, _2)
}
- public func OldChannels_Leave(_ 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[141 * 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[142 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func StickerPack_RemoveMaskCount(_ value: Int32) -> String {
+ 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[143 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func ForwardedVideos(_ value: Int32) -> String {
+ public func ForwardedGifs(_ 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 Contacts_ImportersCount(_ value: Int32) -> String {
+ 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[145 * 6 + Int(form.rawValue)]!, stringValue)
@@ -5732,58 +5781,68 @@ public final class PresentationStrings: Equatable {
let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator)
return String(format: self._ps[146 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func ServiceMessage_GameScoreSelfSimple(_ 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[147 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func Theme_UsersCount(_ 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[148 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func AttachmentMenu_SendPhoto(_ value: Int32) -> String {
+ public func Map_ETAMinutes(_ 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 Wallpaper_DeleteConfirmation(_ value: Int32) -> String {
+ public func Theme_UsersCount(_ 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 PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
- let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[151 * 6 + Int(form.rawValue)]!, _2, _1, _3)
+ 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[151 * 6 + Int(form.rawValue)]!, stringValue)
}
- public func ForwardedAudios(_ value: Int32) -> String {
+ public func AttachmentMenu_SendVideo(_ 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 Call_Minutes(_ value: Int32) -> String {
+ public func MessageTimer_Weeks(_ 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 Media_ShareItem(_ value: Int32) -> String {
+ public func ForwardedContacts(_ 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 PUSH_CHAT_MESSAGE_DOCS_FIX1(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String {
+ public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String {
let form = getPluralizationForm(self.lc, selector)
- return String(format: self._ps[155 * 6 + Int(form.rawValue)]!, _2, _1, _3)
+ return String(format: self._ps[155 * 6 + Int(form.rawValue)]!, _1, _2)
}
- public func Conversation_ContextMenuSelectAll(_ value: Int32) -> String {
+ public func Stats_GroupTopPosterChars(_ 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 ServiceMessage_GameScoreExtended(_ value: Int32) -> String {
+ 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[157 * 6 + Int(form.rawValue)]!, _2, _1, _3)
+ }
+ public func ForwardedPolls(_ 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[158 * 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[159 * 6 + Int(form.rawValue)]!, stringValue)
}
public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) {
diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift
index 0c77121d4f..6f50f080b7 100644
--- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift
+++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift
@@ -38,8 +38,10 @@ public enum PresentationResourceKey: Int32 {
case itemListCheckIcon
case itemListSecondaryCheckIcon
case itemListPlusIcon
+ case itemListDeleteIcon
case itemListDeleteIndicatorIcon
case itemListReorderIndicatorIcon
+ case itemListLinkIcon
case itemListAddPersonIcon
case itemListCreateGroupIcon
case itemListAddExceptionIcon
diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift
index aaf11406da..e9ae56fc13 100644
--- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift
+++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift
@@ -51,6 +51,12 @@ public struct PresentationResourcesItemList {
})
}
+ public static func deleteIconImage(_ theme: PresentationTheme) -> UIImage? {
+ return theme.image(PresentationResourceKey.itemListDeleteIcon.rawValue, { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Accessory Panels/MessageSelectionTrash"), color: theme.list.itemDestructiveColor)
+ })
+ }
+
public static func stickerUnreadDotImage(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.itemListStickerItemUnreadDot.rawValue, { theme in
return generateFilledCircleImage(diameter: 6.0, color: theme.list.itemAccentColor)
@@ -90,6 +96,12 @@ public struct PresentationResourcesItemList {
})
}
+ public static func linkIcon(_ theme: PresentationTheme) -> UIImage? {
+ return theme.image(PresentationResourceKey.itemListLinkIcon.rawValue, { theme in
+ return generateTintedImage(image: UIImage(bundleImageName: "Contact List/LinkActionIcon"), color: theme.list.itemAccentColor)
+ })
+ }
+
public static func addPersonIcon(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.itemListAddPersonIcon.rawValue, { theme in
return generateTintedImage(image: UIImage(bundleImageName: "Contact List/AddMemberIcon"), color: theme.list.itemAccentColor)
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Contents.json
index 38f0c81fc2..6e965652df 100644
--- a/submodules/TelegramUI/Images.xcassets/Chat/Contents.json
+++ b/submodules/TelegramUI/Images.xcassets/Chat/Contents.json
@@ -1,9 +1,9 @@
{
"info" : {
- "version" : 1,
- "author" : "xcode"
+ "author" : "xcode",
+ "version" : 1
},
"properties" : {
"provides-namespace" : true
}
-}
\ No newline at end of file
+}
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Links/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Links/Contents.json
new file mode 100644
index 0000000000..6e965652df
--- /dev/null
+++ b/submodules/TelegramUI/Images.xcassets/Chat/Links/Contents.json
@@ -0,0 +1,9 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "provides-namespace" : true
+ }
+}
diff --git a/submodules/TelegramUI/Images.xcassets/Settings/EditAccount.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Links/Expired.imageset/Contents.json
similarity index 75%
rename from submodules/TelegramUI/Images.xcassets/Settings/EditAccount.imageset/Contents.json
rename to submodules/TelegramUI/Images.xcassets/Chat/Links/Expired.imageset/Contents.json
index 101f377488..3048d94181 100644
--- a/submodules/TelegramUI/Images.xcassets/Settings/EditAccount.imageset/Contents.json
+++ b/submodules/TelegramUI/Images.xcassets/Chat/Links/Expired.imageset/Contents.json
@@ -1,7 +1,7 @@
{
"images" : [
{
- "filename" : "ic_editaccount.pdf",
+ "filename" : "ic_linkexpired.pdf",
"idiom" : "universal"
}
],
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/SendButtonIcon.imageset/Group.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Links/Expired.imageset/ic_linkexpired.pdf
similarity index 54%
rename from submodules/TelegramUI/Images.xcassets/Wallet/SendButtonIcon.imageset/Group.pdf
rename to submodules/TelegramUI/Images.xcassets/Chat/Links/Expired.imageset/ic_linkexpired.pdf
index 7d26197899..d040d312a1 100644
Binary files a/submodules/TelegramUI/Images.xcassets/Wallet/SendButtonIcon.imageset/Group.pdf and b/submodules/TelegramUI/Images.xcassets/Chat/Links/Expired.imageset/ic_linkexpired.pdf differ
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Links/Flame.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Links/Flame.imageset/Contents.json
new file mode 100644
index 0000000000..82d4b2d05d
--- /dev/null
+++ b/submodules/TelegramUI/Images.xcassets/Chat/Links/Flame.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "ic_linkfire.pdf",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/ReceiveButtonIcon.imageset/Group2.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Links/Flame.imageset/ic_linkfire.pdf
similarity index 72%
rename from submodules/TelegramUI/Images.xcassets/Wallet/ReceiveButtonIcon.imageset/Group2.pdf
rename to submodules/TelegramUI/Images.xcassets/Chat/Links/Flame.imageset/ic_linkfire.pdf
index 1f90a5f60c..f5c3521b47 100644
Binary files a/submodules/TelegramUI/Images.xcassets/Wallet/ReceiveButtonIcon.imageset/Group2.pdf and b/submodules/TelegramUI/Images.xcassets/Chat/Links/Flame.imageset/ic_linkfire.pdf differ
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Links/Link.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Links/Link.imageset/Contents.json
new file mode 100644
index 0000000000..c2babf5d8e
--- /dev/null
+++ b/submodules/TelegramUI/Images.xcassets/Chat/Links/Link.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "ic_link.pdf",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/RefreshIcon.imageset/ic_walletupdate.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Links/Link.imageset/ic_link.pdf
similarity index 63%
rename from submodules/TelegramUI/Images.xcassets/Wallet/RefreshIcon.imageset/ic_walletupdate.pdf
rename to submodules/TelegramUI/Images.xcassets/Chat/Links/Link.imageset/ic_link.pdf
index 62702732c7..28f4a67e86 100644
Binary files a/submodules/TelegramUI/Images.xcassets/Wallet/RefreshIcon.imageset/ic_walletupdate.pdf and b/submodules/TelegramUI/Images.xcassets/Chat/Links/Link.imageset/ic_link.pdf differ
diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Links/QrLogo.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Links/QrLogo.imageset/Contents.json
new file mode 100644
index 0000000000..de3bb69a15
--- /dev/null
+++ b/submodules/TelegramUI/Images.xcassets/Chat/Links/QrLogo.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "ic_qrlogo.pdf",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/submodules/TelegramUI/Images.xcassets/Settings/EditAccount.imageset/ic_editaccount.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Links/QrLogo.imageset/ic_qrlogo.pdf
similarity index 60%
rename from submodules/TelegramUI/Images.xcassets/Settings/EditAccount.imageset/ic_editaccount.pdf
rename to submodules/TelegramUI/Images.xcassets/Chat/Links/QrLogo.imageset/ic_qrlogo.pdf
index 005582c532..cbf4e3cb35 100644
Binary files a/submodules/TelegramUI/Images.xcassets/Settings/EditAccount.imageset/ic_editaccount.pdf and b/submodules/TelegramUI/Images.xcassets/Chat/Links/QrLogo.imageset/ic_qrlogo.pdf differ
diff --git a/submodules/TelegramUI/Images.xcassets/Settings/Contents.json b/submodules/TelegramUI/Images.xcassets/Settings/Contents.json
index 38f0c81fc2..6e965652df 100644
--- a/submodules/TelegramUI/Images.xcassets/Settings/Contents.json
+++ b/submodules/TelegramUI/Images.xcassets/Settings/Contents.json
@@ -1,9 +1,9 @@
{
"info" : {
- "version" : 1,
- "author" : "xcode"
+ "author" : "xcode",
+ "version" : 1
},
"properties" : {
"provides-namespace" : true
}
-}
\ No newline at end of file
+}
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/Contents.json b/submodules/TelegramUI/Images.xcassets/Wallet/Contents.json
index 38f0c81fc2..6e965652df 100644
--- a/submodules/TelegramUI/Images.xcassets/Wallet/Contents.json
+++ b/submodules/TelegramUI/Images.xcassets/Wallet/Contents.json
@@ -1,9 +1,9 @@
{
"info" : {
- "version" : 1,
- "author" : "xcode"
+ "author" : "xcode",
+ "version" : 1
},
"properties" : {
"provides-namespace" : true
}
-}
\ No newline at end of file
+}
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/Contents.json
deleted file mode 100644
index 31daa63843..0000000000
--- a/submodules/TelegramUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "filename" : "NavigationSettingsIcon.pdf"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/NavigationSettingsIcon.pdf b/submodules/TelegramUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/NavigationSettingsIcon.pdf
deleted file mode 100644
index 4f188553a0..0000000000
Binary files a/submodules/TelegramUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/NavigationSettingsIcon.pdf and /dev/null differ
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/QrGem.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Wallet/QrGem.imageset/Contents.json
deleted file mode 100644
index ae81ff437c..0000000000
--- a/submodules/TelegramUI/Images.xcassets/Wallet/QrGem.imageset/Contents.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "filename" : "QrGem@2x.png",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "filename" : "QrGem@3x.png",
- "scale" : "3x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/QrGem.imageset/QrGem@2x.png b/submodules/TelegramUI/Images.xcassets/Wallet/QrGem.imageset/QrGem@2x.png
deleted file mode 100644
index 35d164f8b3..0000000000
Binary files a/submodules/TelegramUI/Images.xcassets/Wallet/QrGem.imageset/QrGem@2x.png and /dev/null differ
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/QrGem.imageset/QrGem@3x.png b/submodules/TelegramUI/Images.xcassets/Wallet/QrGem.imageset/QrGem@3x.png
deleted file mode 100644
index 6f2e9e6ed6..0000000000
Binary files a/submodules/TelegramUI/Images.xcassets/Wallet/QrGem.imageset/QrGem@3x.png and /dev/null differ
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/ReceiveButtonIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Wallet/ReceiveButtonIcon.imageset/Contents.json
deleted file mode 100644
index aca2fcc163..0000000000
--- a/submodules/TelegramUI/Images.xcassets/Wallet/ReceiveButtonIcon.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "filename" : "Group2.pdf"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/RefreshIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Wallet/RefreshIcon.imageset/Contents.json
deleted file mode 100644
index 0940c4ae6d..0000000000
--- a/submodules/TelegramUI/Images.xcassets/Wallet/RefreshIcon.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "filename" : "ic_walletupdate.pdf"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/SendButtonIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Wallet/SendButtonIcon.imageset/Contents.json
deleted file mode 100644
index 10de2f9a6b..0000000000
--- a/submodules/TelegramUI/Images.xcassets/Wallet/SendButtonIcon.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "filename" : "Group.pdf"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/TransactionGem.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Wallet/TransactionGem.imageset/Contents.json
deleted file mode 100644
index b5a8966f3f..0000000000
--- a/submodules/TelegramUI/Images.xcassets/Wallet/TransactionGem.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "filename" : "SmallGem.pdf"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/submodules/TelegramUI/Images.xcassets/Wallet/TransactionGem.imageset/SmallGem.pdf b/submodules/TelegramUI/Images.xcassets/Wallet/TransactionGem.imageset/SmallGem.pdf
deleted file mode 100644
index cf1ac9ab53..0000000000
Binary files a/submodules/TelegramUI/Images.xcassets/Wallet/TransactionGem.imageset/SmallGem.pdf and /dev/null differ
diff --git a/submodules/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/Resources/PresentationStrings.mapping
index df910f75e3..dc2e7eef73 100644
Binary files a/submodules/TelegramUI/Resources/PresentationStrings.mapping and b/submodules/TelegramUI/Resources/PresentationStrings.mapping differ
diff --git a/submodules/TelegramUI/Sources/AppDelegate.swift b/submodules/TelegramUI/Sources/AppDelegate.swift
index a1426c628d..d15537ae06 100644
--- a/submodules/TelegramUI/Sources/AppDelegate.swift
+++ b/submodules/TelegramUI/Sources/AppDelegate.swift
@@ -25,14 +25,7 @@ import WatchBridge
import LegacyDataImport
import SettingsUI
import AppBundle
-#if ENABLE_WALLET
-import WalletUI
-#endif
import UrlHandling
-#if ENABLE_WALLET
-import WalletUrl
-import WalletCore
-#endif
import OpenSSLEncryptionProvider
import AppLock
import PresentationDataUtils
@@ -1717,12 +1710,6 @@ final class SharedApplicationContext {
} else if let confirmationCode = parseConfirmationCodeUrl(url) {
authContext.rootController.applyConfirmationCode(confirmationCode)
}
- #if ENABLE_WALLET
- if let _ = parseWalletUrl(url) {
- let presentationData = authContext.sharedContext.currentPresentationData.with { $0 }
- authContext.rootController.currentWindow?.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: presentationData), title: nil, text: "Please log in to your account to use Gram Wallet.", actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), on: .root, blockInteraction: false, completion: {})
- }
- #endif
}
})
}
diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift
index 6e9830a528..b3add99fdc 100644
--- a/submodules/TelegramUI/Sources/ChatController.swift
+++ b/submodules/TelegramUI/Sources/ChatController.swift
@@ -49,10 +49,6 @@ import ReactionSelectionNode
import AvatarNode
import MessageReactionListUI
import AppBundle
-#if ENABLE_WALLET
-import WalletUI
-import WalletUrl
-#endif
import LocalizedPeerData
import PhoneNumberFormat
import SettingsUI
@@ -326,6 +322,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
private weak var mediaRecordingModeTooltipController: TooltipController?
private weak var mediaRestrictedTooltipController: TooltipController?
private var mediaRestrictedTooltipControllerMode = true
+ private weak var checksTooltipController: TooltipController?
private var currentMessageTooltipScreens: [(TooltipScreen, ListViewItemNode)] = []
@@ -469,7 +466,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
guard let strongSelf = self else {
return true
}
- if strongSelf.presentVoiceMessageDiscardAlert(action: action) {
+ if strongSelf.presentVoiceMessageDiscardAlert(action: action, performAction: false) {
return false
}
return true
@@ -877,7 +874,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}, sendCurrentMessage: { [weak self] silentPosting in
if let strongSelf = self {
if let _ = strongSelf.presentationInterfaceState.recordedMediaPreview {
- strongSelf.sendMediaRecording(silently: silentPosting)
+ strongSelf.sendMediaRecording(silentPosting: silentPosting)
} else {
strongSelf.chatDisplayNode.sendCurrentMessage(silentPosting: silentPosting)
}
@@ -1304,6 +1301,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}, openInstantPage: { [weak self] message, associatedData in
if let strongSelf = self, strongSelf.isNodeLoaded, let navigationController = strongSelf.effectiveNavigationController, let message = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(message.id) {
openChatInstantPage(context: strongSelf.context, message: message, sourcePeerType: associatedData?.automaticDownloadPeerType, navigationController: navigationController)
+
+ if case .overlay = strongSelf.presentationInterfaceState.mode {
+ strongSelf.chatDisplayNode.dismissAsOverlay()
+ }
}
}, openWallpaper: { [weak self] message in
if let strongSelf = self, strongSelf.isNodeLoaded, let message = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(message.id) {
@@ -1325,58 +1326,60 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
guard let strongSelf = self else {
return
}
- if strongSelf.resolvePeerByNameDisposable == nil {
- strongSelf.resolvePeerByNameDisposable = MetaDisposable()
- }
- let account = strongSelf.context.account
- var resolveSignal: Signal
- if let peerName = peerName {
- resolveSignal = resolvePeerByName(account: strongSelf.context.account, name: peerName)
- |> mapToSignal { peerId -> Signal in
- if let peerId = peerId {
- return account.postbox.loadedPeerWithId(peerId)
- |> map(Optional.init)
- } else {
- return .single(nil)
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ if strongSelf.resolvePeerByNameDisposable == nil {
+ strongSelf.resolvePeerByNameDisposable = MetaDisposable()
+ }
+ let account = strongSelf.context.account
+ var resolveSignal: Signal
+ if let peerName = peerName {
+ resolveSignal = resolvePeerByName(account: strongSelf.context.account, name: peerName)
+ |> mapToSignal { peerId -> Signal in
+ if let peerId = peerId {
+ return account.postbox.loadedPeerWithId(peerId)
+ |> map(Optional.init)
+ } else {
+ return .single(nil)
+ }
+ }
+ } else {
+ resolveSignal = context.account.postbox.loadedPeerWithId(strongSelf.chatLocation.peerId)
+ |> map(Optional.init)
+ }
+ var cancelImpl: (() -> Void)?
+ let presentationData = strongSelf.presentationData
+ let progressSignal = Signal { subscriber in
+ let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: {
+ cancelImpl?()
+ }))
+ self?.present(controller, in: .window(.root))
+ return ActionDisposable { [weak controller] in
+ Queue.mainQueue().async() {
+ controller?.dismiss()
+ }
}
}
- } else {
- resolveSignal = context.account.postbox.loadedPeerWithId(strongSelf.chatLocation.peerId)
- |> map(Optional.init)
- }
- var cancelImpl: (() -> Void)?
- let presentationData = strongSelf.presentationData
- let progressSignal = Signal { subscriber in
- let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: {
- cancelImpl?()
+ |> runOn(Queue.mainQueue())
+ |> delay(0.15, queue: Queue.mainQueue())
+ let progressDisposable = progressSignal.start()
+
+ resolveSignal = resolveSignal
+ |> afterDisposed {
+ Queue.mainQueue().async {
+ progressDisposable.dispose()
+ }
+ }
+ cancelImpl = {
+ self?.resolvePeerByNameDisposable?.set(nil)
+ }
+ strongSelf.resolvePeerByNameDisposable?.set((resolveSignal
+ |> deliverOnMainQueue).start(next: { peer in
+ if let strongSelf = self, !hashtag.isEmpty {
+ let searchController = HashtagSearchController(context: strongSelf.context, peer: peer, query: hashtag)
+ strongSelf.effectiveNavigationController?.pushViewController(searchController)
+ }
}))
- self?.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()
-
- resolveSignal = resolveSignal
- |> afterDisposed {
- Queue.mainQueue().async {
- progressDisposable.dispose()
- }
- }
- cancelImpl = {
- self?.resolvePeerByNameDisposable?.set(nil)
- }
- strongSelf.resolvePeerByNameDisposable?.set((resolveSignal
- |> deliverOnMainQueue).start(next: { peer in
- if let strongSelf = self, !hashtag.isEmpty {
- let searchController = HashtagSearchController(context: strongSelf.context, peer: peer, query: hashtag)
- strongSelf.effectiveNavigationController?.pushViewController(searchController)
- }
- }))
+ })
}, updateInputState: { [weak self] f in
if let strongSelf = self {
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, {
@@ -1396,14 +1399,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return $0.updatedInputMode(f)
})
}, openMessageShareMenu: { [weak self] id in
- if let strongSelf = self, let messages = strongSelf.chatDisplayNode.historyNode.messageGroupInCurrentHistoryView(id), let message = messages.first {
- var shares: Int = 0
- for attribute in message.attributes {
- if let forwardsAttribute = attribute as? ForwardCountMessageAttribute {
- shares = forwardsAttribute.count
- break
- }
- }
+ if let strongSelf = self, let messages = strongSelf.chatDisplayNode.historyNode.messageGroupInCurrentHistoryView(id), let _ = messages.first {
let shareController = ShareController(context: strongSelf.context, subject: .messages(messages))
shareController.dismissed = { shared in
if shared {
@@ -1425,26 +1421,28 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
self?.presentInGlobalOverlay(controller, with: arguments)
}, callPeer: { [weak self] peerId, isVideo in
if let strongSelf = self {
- strongSelf.commitPurposefulAction()
-
- let _ = (context.account.viewTracker.peerView(peerId)
- |> take(1)
- |> map { view -> Peer? in
- return peerViewMainPeer(view)
- }
- |> deliverOnMainQueue).start(next: { peer in
- guard let peer = peer else {
- return
- }
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ strongSelf.commitPurposefulAction()
- if let cachedUserData = strongSelf.peerView?.cachedData as? CachedUserData, cachedUserData.callsPrivate {
- let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ let _ = (context.account.viewTracker.peerView(peerId)
+ |> take(1)
+ |> map { view -> Peer? in
+ return peerViewMainPeer(view)
+ }
+ |> deliverOnMainQueue).start(next: { peer in
+ guard let peer = peer else {
+ return
+ }
- strongSelf.present(textAlertController(context: strongSelf.context, title: presentationData.strings.Call_ConnectionErrorTitle, text: presentationData.strings.Call_PrivacyErrorMessage(peer.compactDisplayTitle).0, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
- return
- }
-
- context.requestCall(peerId: peer.id, isVideo: isVideo, completion: {})
+ if let cachedUserData = strongSelf.peerView?.cachedData as? CachedUserData, cachedUserData.callsPrivate {
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+
+ strongSelf.present(textAlertController(context: strongSelf.context, title: presentationData.strings.Call_ConnectionErrorTitle, text: presentationData.strings.Call_PrivacyErrorMessage(peer.compactDisplayTitle).0, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
+ return
+ }
+
+ context.requestCall(peerId: peer.id, isVideo: isVideo, completion: {})
+ })
})
}
}, longTap: { [weak self] action, message in
@@ -1900,13 +1898,15 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
}, addContact: { [weak self] phoneNumber in
if let strongSelf = self {
- strongSelf.context.sharedContext.openAddContact(context: strongSelf.context, firstName: "", lastName: "", phoneNumber: phoneNumber, label: defaultContactLabel, present: { [weak self] controller, arguments in
- self?.present(controller, in: .window(.root), with: arguments)
- }, pushController: { [weak self] controller in
- if let strongSelf = self {
- strongSelf.effectiveNavigationController?.pushViewController(controller)
- }
- }, completed: {})
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ strongSelf.context.sharedContext.openAddContact(context: strongSelf.context, firstName: "", lastName: "", phoneNumber: phoneNumber, label: defaultContactLabel, present: { [weak self] controller, arguments in
+ self?.present(controller, in: .window(.root), with: arguments)
+ }, pushController: { [weak self] controller in
+ if let strongSelf = self {
+ strongSelf.effectiveNavigationController?.pushViewController(controller)
+ }
+ }, completed: {})
+ })
}
}, rateCall: { [weak self] message, callId, isVideo in
if let strongSelf = self {
@@ -2019,20 +2019,22 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
guard let strongSelf = self, pollId.namespace == Namespaces.Media.CloudPoll else {
return
}
- let _ = (strongSelf.context.account.postbox.transaction { transaction -> Message? in
- return transaction.getMessage(messageId)
- }
- |> deliverOnMainQueue).start(next: { message in
- guard let message = message else {
- return
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ let _ = (strongSelf.context.account.postbox.transaction { transaction -> Message? in
+ return transaction.getMessage(messageId)
}
- for media in message.media {
- if let poll = media as? TelegramMediaPoll, poll.pollId == pollId {
- strongSelf.push(pollResultsController(context: strongSelf.context, messageId: messageId, poll: poll))
- break
+ |> deliverOnMainQueue).start(next: { message in
+ guard let message = message else {
+ return
}
- }
- })
+ for media in message.media {
+ if let poll = media as? TelegramMediaPoll, poll.pollId == pollId {
+ strongSelf.push(pollResultsController(context: strongSelf.context, messageId: messageId, poll: poll))
+ break
+ }
+ }
+ })
+ }, delay: true)
}, openAppStorePage: { [weak self] in
if let strongSelf = self {
strongSelf.context.sharedContext.applicationBindings.openAppStorePage()
@@ -2083,17 +2085,21 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if let strongSelf = self {
strongSelf.presentScheduleTimePicker(completion: { [weak self] time in
if let strongSelf = self {
- strongSelf.chatDisplayNode.sendCurrentMessage(scheduleTime: time, completion: { [weak self] in
- if let strongSelf = self {
- strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
- $0.updatedInterfaceState { $0.withUpdatedReplyMessageId(nil).withUpdatedComposeInputState(ChatTextInputState(inputText: NSAttributedString(string: ""))) }
- })
-
- if strongSelf.presentationInterfaceState.subject != .scheduledMessages && time != scheduleWhenOnlineTimestamp {
- strongSelf.openScheduledMessages()
+ if let _ = strongSelf.presentationInterfaceState.recordedMediaPreview {
+ strongSelf.sendMediaRecording(scheduleTime: time)
+ } else {
+ strongSelf.chatDisplayNode.sendCurrentMessage(scheduleTime: time, completion: { [weak self] in
+ if let strongSelf = self {
+ strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
+ $0.updatedInterfaceState { $0.withUpdatedReplyMessageId(nil).withUpdatedComposeInputState(ChatTextInputState(inputText: NSAttributedString(string: ""))) }
+ })
+
+ if strongSelf.presentationInterfaceState.subject != .scheduledMessages && time != scheduleWhenOnlineTimestamp {
+ strongSelf.openScheduledMessages()
+ }
}
- }
- })
+ })
+ }
}
})
}
@@ -2110,27 +2116,29 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
}, editScheduledMessagesTime: { [weak self] messageIds in
if let strongSelf = self, let messageId = messageIds.first {
- let _ = (strongSelf.context.account.postbox.transaction { transaction -> Message? in
- return transaction.getMessage(messageId)
- } |> deliverOnMainQueue).start(next: { [weak self] message in
- guard let strongSelf = self, let message = message else {
- return
- }
- strongSelf.presentScheduleTimePicker(selectedTime: message.timestamp, completion: { [weak self] time in
- if let strongSelf = self {
- var entities: TextEntitiesMessageAttribute?
- for attribute in message.attributes {
- if let attribute = attribute as? TextEntitiesMessageAttribute {
- entities = attribute
- break
- }
- }
- strongSelf.editMessageDisposable.set((requestEditMessage(account: strongSelf.context.account, messageId: messageId, text: message.text, media: .keep, entities: entities, disableUrlPreview: false, scheduleTime: time) |> deliverOnMainQueue).start(next: { result in
- }, error: { error in
- }))
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ let _ = (strongSelf.context.account.postbox.transaction { transaction -> Message? in
+ return transaction.getMessage(messageId)
+ } |> deliverOnMainQueue).start(next: { [weak self] message in
+ guard let strongSelf = self, let message = message else {
+ return
}
+ strongSelf.presentScheduleTimePicker(selectedTime: message.timestamp, completion: { [weak self] time in
+ if let strongSelf = self {
+ var entities: TextEntitiesMessageAttribute?
+ for attribute in message.attributes {
+ if let attribute = attribute as? TextEntitiesMessageAttribute {
+ entities = attribute
+ break
+ }
+ }
+ strongSelf.editMessageDisposable.set((requestEditMessage(account: strongSelf.context.account, messageId: messageId, text: message.text, media: .keep, entities: entities, disableUrlPreview: false, scheduleTime: time) |> deliverOnMainQueue).start(next: { result in
+ }, error: { error in
+ }))
+ }
+ })
})
- })
+ }, delay: true)
}
}, performTextSelectionAction: { [weak self] _, text, action in
guard let strongSelf = self else {
@@ -2218,25 +2226,29 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
guard let strongSelf = self else {
return
}
- let _ = (strongSelf.context.account.postbox.transaction { transaction -> Message? in
- return transaction.getMessage(messageId)
- }
- |> deliverOnMainQueue).start(next: { message in
- guard let message = message else {
- return
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ let _ = (strongSelf.context.account.postbox.transaction { transaction -> Message? in
+ return transaction.getMessage(messageId)
}
- for media in message.media {
- if let poll = media as? TelegramMediaPoll, poll.pollId.namespace == Namespaces.Media.CloudPoll {
- strongSelf.push(pollResultsController(context: strongSelf.context, messageId: messageId, poll: poll, focusOnOptionWithOpaqueIdentifier: optionOpaqueIdentifier))
- break
+ |> deliverOnMainQueue).start(next: { message in
+ guard let message = message else {
+ return
}
- }
+ for media in message.media {
+ if let poll = media as? TelegramMediaPoll, poll.pollId.namespace == Namespaces.Media.CloudPoll {
+ strongSelf.push(pollResultsController(context: strongSelf.context, messageId: messageId, poll: poll, focusOnOptionWithOpaqueIdentifier: optionOpaqueIdentifier))
+ break
+ }
+ }
+ })
})
}, openPollCreation: { [weak self] isQuiz in
guard let strongSelf = self else {
return
}
- strongSelf.presentPollCreation(isQuiz: isQuiz)
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ strongSelf.presentPollCreation(isQuiz: isQuiz)
+ })
}, displayPollSolution: { [weak self] solution, sourceNode in
self?.displayPollSolution(solution: solution, sourceNode: sourceNode, isAutomatic: false)
}, displayPsa: { [weak self] type, sourceNode in
@@ -2302,13 +2314,19 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}, action: { _, f in
f(.dismissWithoutContent)
- self?.interfaceInteraction?.updateTextInputStateAndMode { current, inputMode in
- var inputMode = inputMode
- if inputMode == .none {
- inputMode = .text
- }
- return (chatTextInputAddMentionAttribute(current, peer: peer), inputMode)
+ guard let strongSelf = self else {
+ return
}
+
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ strongSelf.interfaceInteraction?.updateTextInputStateAndMode { current, inputMode in
+ var inputMode = inputMode
+ if inputMode == .none {
+ inputMode = .text
+ }
+ return (chatTextInputAddMentionAttribute(current, peer: peer), inputMode)
+ }
+ }, delay: true)
})))
}
return items
@@ -2347,18 +2365,24 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
}
}, openMessageStats: { [weak self] id in
- let _ = (context.account.postbox.transaction { transaction -> (MessageId, CachedPeerData?)? in
- if let message = transaction.getMessage(id), let sourceMessageId = message.forwardInfo?.sourceMessageId {
- return (sourceMessageId, transaction.getPeerCachedData(peerId: sourceMessageId.peerId))
- } else {
- return (id, transaction.getPeerCachedData(peerId: id.peerId))
- }
- } |> deliverOnMainQueue).start(next: { [weak self] messageIdAndCachedPeerData in
- guard let strongSelf = self, let (id, cachedPeerDataValue) = messageIdAndCachedPeerData, let cachedPeerData = cachedPeerDataValue else {
- return
- }
- strongSelf.push(messageStatsController(context: context, messageId: id, cachedPeerData: cachedPeerData))
- })
+ guard let strongSelf = self else {
+ return
+ }
+
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ let _ = (context.account.postbox.transaction { transaction -> (MessageId, CachedPeerData?)? in
+ if let message = transaction.getMessage(id), let sourceMessageId = message.forwardInfo?.sourceMessageId {
+ return (sourceMessageId, transaction.getPeerCachedData(peerId: sourceMessageId.peerId))
+ } else {
+ return (id, transaction.getPeerCachedData(peerId: id.peerId))
+ }
+ } |> deliverOnMainQueue).start(next: { [weak self] messageIdAndCachedPeerData in
+ guard let strongSelf = self, let (id, cachedPeerDataValue) = messageIdAndCachedPeerData, let cachedPeerData = cachedPeerDataValue else {
+ return
+ }
+ strongSelf.push(messageStatsController(context: context, messageId: id, cachedPeerData: cachedPeerData))
+ })
+ }, delay: true)
}, editMessageMedia: { [weak self] messageId, draw in
guard let strongSelf = self else {
return
@@ -4351,6 +4375,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
switch data {
case let .images(images):
self?.displayPasteMenu(images)
+ case let .video(data):
+ self?.enqueueVideoData(data)
case let .gif(data):
self?.enqueueGifData(data)
case let .sticker(image, isMemoji):
@@ -4453,13 +4479,17 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
let interfaceInteraction = ChatPanelInterfaceInteraction(setupReplyMessage: { [weak self] messageId, completion in
if let strongSelf = self, strongSelf.isNodeLoaded, canSendMessagesToChat(strongSelf.presentationInterfaceState) {
- if let message = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(messageId) {
- strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState({ $0.withUpdatedReplyMessageId(message.id) }).updatedSearch(nil) }, completion: completion)
- strongSelf.updateItemNodesSearchTextHighlightStates()
- strongSelf.chatDisplayNode.ensureInputViewFocused()
- } else {
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ if let message = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(messageId) {
+ strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState({ $0.withUpdatedReplyMessageId(message.id) }).updatedSearch(nil) }, completion: completion)
+ strongSelf.updateItemNodesSearchTextHighlightStates()
+ strongSelf.chatDisplayNode.ensureInputViewFocused()
+ } else {
+ completion(.immediate)
+ }
+ }, alertAction: {
completion(.immediate)
- }
+ }, delay: true)
} else {
completion(.immediate)
}
@@ -4477,44 +4507,52 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return
}
- if let message = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(messageId) {
- strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { state in
- var updated = state.updatedInterfaceState {
- var entities: [MessageTextEntity] = []
- for attribute in message.attributes {
- if let attribute = attribute as? TextEntitiesMessageAttribute {
- entities = attribute.entities
- break
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ if let message = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(messageId) {
+ strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { state in
+ var updated = state.updatedInterfaceState {
+ var entities: [MessageTextEntity] = []
+ for attribute in message.attributes {
+ if let attribute = attribute as? TextEntitiesMessageAttribute {
+ entities = attribute.entities
+ break
+ }
}
- }
- var inputTextMaxLength: Int32 = 4096
- for media in message.media {
- if media is TelegramMediaImage || media is TelegramMediaFile {
- inputTextMaxLength = strongSelf.context.currentLimitsConfiguration.with { $0 }.maxMediaCaptionLength
- break
+ var inputTextMaxLength: Int32 = 4096
+ for media in message.media {
+ if media is TelegramMediaImage || media is TelegramMediaFile {
+ inputTextMaxLength = strongSelf.context.currentLimitsConfiguration.with { $0 }.maxMediaCaptionLength
+ break
+ }
}
+ return $0.withUpdatedEditMessage(ChatEditMessageState(messageId: messageId, inputState: ChatTextInputState(inputText: chatInputStateStringWithAppliedEntities(message.text, entities: entities)), disableUrlPreview: nil, inputTextMaxLength: inputTextMaxLength))
}
- return $0.withUpdatedEditMessage(ChatEditMessageState(messageId: messageId, inputState: ChatTextInputState(inputText: chatInputStateStringWithAppliedEntities(message.text, entities: entities)), disableUrlPreview: nil, inputTextMaxLength: inputTextMaxLength))
- }
-
- updated = updatedChatEditInterfaceMessageState(state: updated, message: message)
- updated = updated.updatedInputMode({ _ in
- return .text
- })
-
- return updated
- }, completion: completion)
- }
+
+ updated = updatedChatEditInterfaceMessageState(state: updated, message: message)
+ updated = updated.updatedInputMode({ _ in
+ return .text
+ })
+
+ return updated
+ }, completion: completion)
+ }
+ }, alertAction: {
+ completion(.immediate)
+ }, delay: true)
}
}, beginMessageSelection: { [weak self] messageIds, completion in
if let strongSelf = self, strongSelf.isNodeLoaded {
- strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState { $0.withUpdatedSelectedMessages(messageIds) } }, completion: completion)
-
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedInterfaceState { $0.withUpdatedSelectedMessages(messageIds) } }, completion: completion)
+
if let selectionState = strongSelf.presentationInterfaceState.interfaceState.selectionState {
- let count = selectionState.selectedIds.count
- let text = strongSelf.presentationData.strings.VoiceOver_Chat_MessagesSelected(Int32(count))
- UIAccessibility.post(notification: UIAccessibility.Notification.announcement, argument: text)
- }
+ let count = selectionState.selectedIds.count
+ let text = strongSelf.presentationData.strings.VoiceOver_Chat_MessagesSelected(Int32(count))
+ UIAccessibility.post(notification: UIAccessibility.Notification.announcement, argument: text)
+ }
+ }, alertAction: {
+ completion(.immediate)
+ }, delay: true)
} else {
completion(.immediate)
}
@@ -4751,31 +4789,34 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
guard let strongSelf = self else {
return
}
- var interactive = true
- if strongSelf.chatDisplayNode.isInputViewFocused {
- interactive = false
- strongSelf.context.sharedContext.mainWindow?.doNotAnimateLikelyKeyboardAutocorrectionSwitch()
- }
- strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: interactive, { current in
- return current.updatedTitlePanelContext {
- if let index = $0.firstIndex(where: {
- switch $0 {
- case .chatInfo:
- return true
- default:
- return false
+ let _ = strongSelf.presentVoiceMessageDiscardAlert(action: {
+ var interactive = true
+ if strongSelf.chatDisplayNode.isInputViewFocused {
+ interactive = false
+ strongSelf.context.sharedContext.mainWindow?.doNotAnimateLikelyKeyboardAutocorrectionSwitch()
+ }
+
+ strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: interactive, { current in
+ return current.updatedTitlePanelContext {
+ if let index = $0.firstIndex(where: {
+ switch $0 {
+ case .chatInfo:
+ return true
+ default:
+ return false
+ }
+ }) {
+ var updatedContexts = $0
+ updatedContexts.remove(at: index)
+ return updatedContexts
+ } else {
+ return $0
}
- }) {
- var updatedContexts = $0
- updatedContexts.remove(at: index)
- return updatedContexts
- } else {
- return $0
- }
- }.updatedSearch(current.search == nil ? ChatSearchData(domain: domain).withUpdatedQuery(query) : current.search?.withUpdatedDomain(domain).withUpdatedQuery(query))
+ }.updatedSearch(current.search == nil ? ChatSearchData(domain: domain).withUpdatedQuery(query) : current.search?.withUpdatedDomain(domain).withUpdatedQuery(query))
+ })
+ strongSelf.updateItemNodesSearchTextHighlightStates()
})
- strongSelf.updateItemNodesSearchTextHighlightStates()
}, dismissMessageSearch: { [weak self] in
if let strongSelf = self {
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { current in
@@ -5090,8 +5131,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
strongSelf.lockMediaRecorder()
}, deleteRecordedMedia: { [weak self] in
self?.deleteMediaRecording()
- }, sendRecordedMedia: { [weak self] silently in
- self?.sendMediaRecording(silently: silently)
+ }, sendRecordedMedia: { [weak self] silentPosting in
+ self?.sendMediaRecording(silentPosting: silentPosting)
}, displayRestrictedInfo: { [weak self] subject, displayType in
guard let strongSelf = self else {
return
@@ -6194,6 +6235,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if strongSelf.presentationInterfaceState.subject != .scheduledMessages && namespace == Namespaces.Message.ScheduledCloud {
strongSelf.openScheduledMessages()
}
+
+// strongSelf.displayChecksTooltip()
}
}))
@@ -7379,33 +7422,35 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
self.present(actionSheet, in: .window(.root))
}
case let .openChatInfo(expandAvatar):
- switch self.chatLocationInfoData {
- case let .peer(peerView):
- self.navigationActionDisposable.set((peerView.get()
- |> take(1)
- |> deliverOnMainQueue).start(next: { [weak self] peerView in
- if let strongSelf = self, let peer = peerView.peers[peerView.peerId], peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil && !strongSelf.presentationInterfaceState.isNotAccessible {
- if peer.id == strongSelf.context.account.peerId {
- if let peer = strongSelf.presentationInterfaceState.renderedPeer?.chatMainPeer, let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: true) {
- strongSelf.effectiveNavigationController?.pushViewController(infoController)
- }
- } else {
- var expandAvatar = expandAvatar
- if peer.smallProfileImage == nil {
- expandAvatar = false
- }
- if let validLayout = strongSelf.validLayout, validLayout.deviceMetrics.type == .tablet {
- expandAvatar = false
- }
- if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic, avatarInitiallyExpanded: expandAvatar, fromChat: true) {
- strongSelf.effectiveNavigationController?.pushViewController(infoController)
+ let _ = self.presentVoiceMessageDiscardAlert(action: {
+ switch self.chatLocationInfoData {
+ case let .peer(peerView):
+ self.navigationActionDisposable.set((peerView.get()
+ |> take(1)
+ |> deliverOnMainQueue).start(next: { [weak self] peerView in
+ if let strongSelf = self, let peer = peerView.peers[peerView.peerId], peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil && !strongSelf.presentationInterfaceState.isNotAccessible {
+ if peer.id == strongSelf.context.account.peerId {
+ if let peer = strongSelf.presentationInterfaceState.renderedPeer?.chatMainPeer, let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: true) {
+ strongSelf.effectiveNavigationController?.pushViewController(infoController)
+ }
+ } else {
+ var expandAvatar = expandAvatar
+ if peer.smallProfileImage == nil {
+ expandAvatar = false
+ }
+ if let validLayout = strongSelf.validLayout, validLayout.deviceMetrics.type == .tablet {
+ expandAvatar = false
+ }
+ if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: .generic, avatarInitiallyExpanded: expandAvatar, fromChat: true) {
+ strongSelf.effectiveNavigationController?.pushViewController(infoController)
+ }
}
}
- }
- }))
- case .replyThread:
- break
- }
+ }))
+ case .replyThread:
+ break
+ }
+ })
case .search:
self.interfaceInteraction?.beginMessageSearch(.everything, "")
case .dismiss:
@@ -8074,6 +8119,18 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
})
}))
+ controller.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)
+ return true
+ })
+ strongSelf.present(controller, in: .window(.root))
+ return controller
+ } else {
+ return nil
+ }
+ }
strongSelf.effectiveNavigationController?.pushViewController(controller)
}
}, presentSelectionLimitExceeded: {
@@ -8166,6 +8223,18 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
})
}))
+ controller.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)
+ return true
+ })
+ strongSelf.present(controller, in: .window(.root))
+ return controller
+ } else {
+ return nil
+ }
+ }
strongSelf.present(controller, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
}
})
@@ -8719,7 +8788,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
private func sendMessages(_ messages: [EnqueueMessage], commit: Bool = false) {
- let peerId: PeerId = self.chatLocation.peerId
+ let peerId = self.chatLocation.peerId
var isScheduledMessages = false
if case .scheduledMessages = self.presentationInterfaceState.subject {
@@ -8772,8 +8841,25 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|> deliverOnMainQueue).start(next: { [weak self] settings in
if let strongSelf = self, let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer {
strongSelf.chatDisplayNode.dismissInput()
- let _ = presentLegacyPasteMenu(context: strongSelf.context, peer: peer, chatLocation: strongSelf.chatLocation, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, presentationData: strongSelf.presentationData, images: images, sendMessagesWithSignals: { signals in
- self?.enqueueMediaMessages(signals: signals, silentPosting: false)
+ let _ = presentLegacyPasteMenu(context: strongSelf.context, peer: peer, chatLocation: strongSelf.chatLocation, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, hasSchedule: strongSelf.presentationInterfaceState.subject != .scheduledMessages && peer.id.namespace != Namespaces.Peer.SecretChat, presentationData: strongSelf.presentationData, images: images, presentSchedulePicker: { [weak self] done in
+ if let strongSelf = self {
+ strongSelf.presentScheduleTimePicker(style: .media, completion: { [weak self] time in
+ if let strongSelf = self {
+ done(time)
+ if strongSelf.presentationInterfaceState.subject != .scheduledMessages && time != scheduleWhenOnlineTimestamp {
+ strongSelf.openScheduledMessages()
+ }
+ }
+ })
+ }
+ }, presentTimerPicker: { [weak self] done in
+ if let strongSelf = self {
+ strongSelf.presentTimerPicker(style: .media, completion: { time in
+ done(time)
+ })
+ }
+ }, sendMessagesWithSignals: { signals, silentPosting, scheduleTime in
+ self?.enqueueMediaMessages(signals: signals, silentPosting: silentPosting, scheduleTime: scheduleTime > 0 ? scheduleTime : nil)
}, presentStickers: { [weak self] completion in
if let strongSelf = self {
let controller = DrawingStickersScreen(context: strongSelf.context, selectSticker: { fileReference, node, rect in
@@ -8810,6 +8896,22 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}))
}
+ private func enqueueVideoData(_ data: Data) {
+ self.enqueueMediaMessageDisposable.set((legacyEnqueueGifMessage(account: self.context.account, data: data) |> deliverOnMainQueue).start(next: { [weak self] message in
+ if let strongSelf = self {
+ let replyMessageId = strongSelf.presentationInterfaceState.interfaceState.replyMessageId
+ strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({
+ if let strongSelf = self {
+ strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
+ $0.updatedInterfaceState { $0.withUpdatedReplyMessageId(nil) }
+ })
+ }
+ })
+ strongSelf.sendMessages([message].map { $0.withUpdatedReplyToMessageId(replyMessageId) })
+ }
+ }))
+ }
+
private func enqueueStickerImage(_ image: UIImage, isMemoji: Bool) {
let size = image.size.aspectFitted(CGSize(width: 512.0, height: 512.0))
self.enqueueMediaMessageDisposable.set((convertToWebP(image: image, targetSize: size, targetBoundingSize: size, quality: 0.9) |> deliverOnMainQueue).start(next: { [weak self] data in
@@ -9110,7 +9212,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
})
}
- private func sendMediaRecording(silently: Bool) {
+ private func sendMediaRecording(silentPosting: Bool? = nil, scheduleTime: Int32? = nil) {
self.chatDisplayNode.updateRecordedMediaDeleted(false)
if let recordedMediaPreview = self.presentationInterfaceState.recordedMediaPreview {
var isScheduledMessages = false
@@ -9135,12 +9237,26 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
})
- var attributes: [MessageAttribute] = []
- if silently {
- attributes.append(NotificationInfoMessageAttribute(flags: .muted))
+ let messages: [EnqueueMessage] = [.message(text: "", attributes: [], mediaReference: .standalone(media: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: arc4random64()), partialReference: nil, resource: recordedMediaPreview.resource, previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: Int(recordedMediaPreview.fileSize), attributes: [.Audio(isVoice: true, duration: Int(recordedMediaPreview.duration), title: nil, performer: nil, waveform: waveformBuffer)])), replyToMessageId: self.presentationInterfaceState.interfaceState.replyMessageId, localGroupingKey: nil)]
+
+ let transformedMessages: [EnqueueMessage]
+ if let silentPosting = silentPosting {
+ transformedMessages = self.transformEnqueueMessages(messages, silentPosting: silentPosting)
+ } else if let scheduleTime = scheduleTime {
+ transformedMessages = self.transformEnqueueMessages(messages, silentPosting: false, scheduleTime: scheduleTime)
+ } else {
+ transformedMessages = self.transformEnqueueMessages(messages)
}
- self.sendMessages([.message(text: "", attributes: attributes, mediaReference: .standalone(media: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: arc4random64()), partialReference: nil, resource: recordedMediaPreview.resource, previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: Int(recordedMediaPreview.fileSize), attributes: [.Audio(isVoice: true, duration: Int(recordedMediaPreview.duration), title: nil, performer: nil, waveform: waveformBuffer)])), replyToMessageId: self.presentationInterfaceState.interfaceState.replyMessageId, localGroupingKey: nil)])
+ let peerId = self.chatLocation.peerId
+ let _ = (enqueueMessages(account: self.context.account, peerId: peerId, messages: transformedMessages)
+ |> deliverOnMainQueue).start(next: { [weak self] _ in
+ if let strongSelf = self, strongSelf.presentationInterfaceState.subject != .scheduledMessages {
+ strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory()
+ }
+ })
+
+ donateSendMessageIntent(account: self.context.account, sharedContext: self.context.sharedContext, intentContext: .chat, peerIds: [peerId])
}
}
@@ -9453,43 +9569,45 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return
}
- let progressSignal: Signal = Signal { [weak self] _ in
- guard let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction else {
- return EmptyDisposable
- }
-
- if let displayProgressInMessage = displayProgressInMessage, controllerInteraction.currentMessageWithLoadingReplyThread != displayProgressInMessage {
- let previousId = controllerInteraction.currentMessageWithLoadingReplyThread
- controllerInteraction.currentMessageWithLoadingReplyThread = displayProgressInMessage
- strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(displayProgressInMessage)
- if let previousId = previousId {
- strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(previousId)
+ let _ = self.presentVoiceMessageDiscardAlert(action: {
+ let progressSignal: Signal = Signal { [weak self] _ in
+ guard let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction else {
+ return EmptyDisposable
}
- }
-
- return ActionDisposable {
- Queue.mainQueue().async {
- guard let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction else {
- return
+
+ if let displayProgressInMessage = displayProgressInMessage, controllerInteraction.currentMessageWithLoadingReplyThread != displayProgressInMessage {
+ let previousId = controllerInteraction.currentMessageWithLoadingReplyThread
+ controllerInteraction.currentMessageWithLoadingReplyThread = displayProgressInMessage
+ strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(displayProgressInMessage)
+ if let previousId = previousId {
+ strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(previousId)
}
- if let displayProgressInMessage = displayProgressInMessage, controllerInteraction.currentMessageWithLoadingReplyThread == displayProgressInMessage {
- controllerInteraction.currentMessageWithLoadingReplyThread = nil
- strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(displayProgressInMessage)
+ }
+
+ return ActionDisposable {
+ Queue.mainQueue().async {
+ guard let strongSelf = self, let controllerInteraction = strongSelf.controllerInteraction else {
+ return
+ }
+ if let displayProgressInMessage = displayProgressInMessage, controllerInteraction.currentMessageWithLoadingReplyThread == displayProgressInMessage {
+ controllerInteraction.currentMessageWithLoadingReplyThread = nil
+ strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(displayProgressInMessage)
+ }
}
}
}
- }
- |> runOn(.mainQueue())
-
- let progress = (progressSignal
- |> delay(0.15, queue: .mainQueue())).start()
-
- self.navigationActionDisposable.set((ChatControllerImpl.openMessageReplies(context: self.context, navigationController: navigationController, present: { [weak self] c, a in
- self?.present(c, in: .window(.root), with: a)
- }, messageId: messageId, isChannelPost: isChannelPost, atMessage: atMessageId, displayModalProgress: displayModalProgress)
- |> afterDisposed {
- progress.dispose()
- }).start())
+ |> runOn(.mainQueue())
+
+ let progress = (progressSignal
+ |> delay(0.15, queue: .mainQueue())).start()
+
+ self.navigationActionDisposable.set((ChatControllerImpl.openMessageReplies(context: self.context, navigationController: navigationController, present: { [weak self] c, a in
+ self?.present(c, in: .window(.root), with: a)
+ }, messageId: messageId, isChannelPost: isChannelPost, atMessage: atMessageId, displayModalProgress: displayModalProgress)
+ |> afterDisposed {
+ progress.dispose()
+ }).start())
+ })
}
static func openMessageReplies(context: AccountContext, navigationController: NavigationController, present: @escaping (ViewController, Any?) -> Void, messageId: MessageId, isChannelPost: Bool, atMessage atMessageId: MessageId?, displayModalProgress: Bool) -> Signal {
@@ -9775,341 +9893,349 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
private func forwardMessages(messages: [Message], resetCurrent: Bool) {
- var filter: ChatListNodePeersFilter = [.onlyWriteable, .includeSavedMessages, .excludeDisabled, .doNotSearchMessages]
- var hasPublicPolls = false
- var hasPublicQuiz = false
- for message in messages {
- for media in message.media {
- if let poll = media as? TelegramMediaPoll, case .public = poll.publicity {
- hasPublicPolls = true
- if case .quiz = poll.kind {
- hasPublicQuiz = true
+ let _ = self.presentVoiceMessageDiscardAlert(action: {
+ var filter: ChatListNodePeersFilter = [.onlyWriteable, .includeSavedMessages, .excludeDisabled, .doNotSearchMessages]
+ var hasPublicPolls = false
+ var hasPublicQuiz = false
+ for message in messages {
+ for media in message.media {
+ if let poll = media as? TelegramMediaPoll, case .public = poll.publicity {
+ hasPublicPolls = true
+ if case .quiz = poll.kind {
+ hasPublicQuiz = true
+ }
+ filter.insert(.excludeChannels)
+ break
}
- filter.insert(.excludeChannels)
- break
}
}
- }
- var attemptSelectionImpl: ((Peer) -> Void)?
- let controller = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context, filter: filter, attemptSelection: { peer in
- attemptSelectionImpl?(peer)
- }))
- let context = self.context
- attemptSelectionImpl = { [weak controller] peer in
- guard let controller = controller else {
- return
- }
- let presentationData = context.sharedContext.currentPresentationData.with { $0 }
- if hasPublicPolls {
- if let channel = peer as? TelegramChannel, case .broadcast = channel.info {
- controller.present(textAlertController(context: context, title: nil, text: hasPublicQuiz ? presentationData.strings.Forward_ErrorPublicQuizDisabledInChannels : presentationData.strings.Forward_ErrorPublicPollDisabledInChannels, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
+ var attemptSelectionImpl: ((Peer) -> Void)?
+ let controller = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context, filter: filter, attemptSelection: { peer in
+ attemptSelectionImpl?(peer)
+ }))
+ let context = self.context
+ attemptSelectionImpl = { [weak controller] peer in
+ guard let controller = controller else {
return
}
- }
- controller.present(textAlertController(context: context, title: nil, text: presentationData.strings.Forward_ErrorDisabledForChat, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
- }
- controller.peerSelected = { [weak self, weak controller] peerId in
- guard let strongSelf = self, let strongController = controller else {
- return
- }
-
- if resetCurrent {
- strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withUpdatedForwardMessageIds(nil) }) })
- }
-
- var isPinnedMessages = false
- if case .pinnedMessages = strongSelf.presentationInterfaceState.subject {
- isPinnedMessages = true
- }
-
- if case .peer(peerId) = strongSelf.chatLocation, strongSelf.parentController == nil, !isPinnedMessages {
- strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withUpdatedForwardMessageIds(messages.map { $0.id }).withoutSelectionState() }) })
- strongController.dismiss()
- } else if peerId == strongSelf.context.account.peerId {
- let _ = (enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: messages.map { message -> EnqueueMessage in
- return .forward(source: message.id, grouping: .auto, attributes: [])
- })
- |> deliverOnMainQueue).start(next: { messageIds in
- if let strongSelf = self {
- let signals: [Signal] = messageIds.compactMap({ id -> Signal? in
- guard let id = id else {
- return nil
- }
- return strongSelf.context.account.pendingMessageManager.pendingMessageStatus(id)
- |> mapToSignal { status, _ -> Signal in
- if status != nil {
- return .never()
- } else {
- return .single(true)
- }
- }
- |> take(1)
- })
- if strongSelf.shareStatusDisposable == nil {
- strongSelf.shareStatusDisposable = MetaDisposable()
- }
- strongSelf.shareStatusDisposable?.set((combineLatest(signals)
- |> deliverOnMainQueue).start(completed: {
- guard let strongSelf = self else {
- return
- }
- strongSelf.present(OverlayStatusController(theme: strongSelf.presentationData.theme, type: .success), in: .window(.root))
- }))
- }
- })
- strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withoutSelectionState() }) })
- strongController.dismiss()
- } else {
- if let navigationController = strongSelf.navigationController as? NavigationController {
- for controller in navigationController.viewControllers {
- if let maybeChat = controller as? ChatControllerImpl {
- if case .peer(peerId) = maybeChat.chatLocation {
- var isChatPinnedMessages = false
- if case .pinnedMessages = maybeChat.presentationInterfaceState.subject {
- isChatPinnedMessages = true
- }
- if !isChatPinnedMessages {
- maybeChat.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withUpdatedForwardMessageIds(messages.map { $0.id }).withoutSelectionState() }) })
- strongSelf.dismiss()
- strongController.dismiss()
- return
- }
- }
- }
+ let presentationData = context.sharedContext.currentPresentationData.with { $0 }
+ if hasPublicPolls {
+ if let channel = peer as? TelegramChannel, case .broadcast = channel.info {
+ controller.present(textAlertController(context: context, title: nil, text: hasPublicQuiz ? presentationData.strings.Forward_ErrorPublicQuizDisabledInChannels : presentationData.strings.Forward_ErrorPublicPollDisabledInChannels, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
+ return
}
}
+ controller.present(textAlertController(context: context, title: nil, text: presentationData.strings.Forward_ErrorDisabledForChat, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
+ }
+ controller.peerSelected = { [weak self, weak controller] peerId in
+ guard let strongSelf = self, let strongController = controller else {
+ return
+ }
- let _ = (strongSelf.context.account.postbox.transaction({ transaction -> Void in
- transaction.updatePeerChatInterfaceState(peerId, update: { currentState in
- if let currentState = currentState as? ChatInterfaceState {
- return currentState.withUpdatedForwardMessageIds(messages.map { $0.id })
- } else {
- return ChatInterfaceState().withUpdatedForwardMessageIds(messages.map { $0.id })
+ if resetCurrent {
+ strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withUpdatedForwardMessageIds(nil) }) })
+ }
+
+ var isPinnedMessages = false
+ if case .pinnedMessages = strongSelf.presentationInterfaceState.subject {
+ isPinnedMessages = true
+ }
+
+ if case .peer(peerId) = strongSelf.chatLocation, strongSelf.parentController == nil, !isPinnedMessages {
+ strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withUpdatedForwardMessageIds(messages.map { $0.id }).withoutSelectionState() }).updatedSearch(nil) })
+ strongSelf.updateItemNodesSearchTextHighlightStates()
+ strongSelf.searchResultsController = nil
+ strongController.dismiss()
+ } else if peerId == strongSelf.context.account.peerId {
+ let _ = (enqueueMessages(account: strongSelf.context.account, peerId: peerId, messages: messages.map { message -> EnqueueMessage in
+ return .forward(source: message.id, grouping: .auto, attributes: [])
+ })
+ |> deliverOnMainQueue).start(next: { messageIds in
+ if let strongSelf = self {
+ let signals: [Signal] = messageIds.compactMap({ id -> Signal? in
+ guard let id = id else {
+ return nil
+ }
+ return strongSelf.context.account.pendingMessageManager.pendingMessageStatus(id)
+ |> mapToSignal { status, _ -> Signal in
+ if status != nil {
+ return .never()
+ } else {
+ return .single(true)
+ }
+ }
+ |> take(1)
+ })
+ if strongSelf.shareStatusDisposable == nil {
+ strongSelf.shareStatusDisposable = MetaDisposable()
+ }
+ strongSelf.shareStatusDisposable?.set((combineLatest(signals)
+ |> deliverOnMainQueue).start(completed: {
+ guard let strongSelf = self else {
+ return
+ }
+ strongSelf.present(OverlayStatusController(theme: strongSelf.presentationData.theme, type: .success), in: .window(.root))
+ }))
}
})
- }) |> deliverOnMainQueue).start(completed: {
- if let strongSelf = self {
- strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withoutSelectionState() }) })
-
- let ready = Promise()
-
- strongSelf.controllerNavigationDisposable.set((ready.get()
- |> SwiftSignalKit.filter { $0 }
- |> take(1)
- |> deliverOnMainQueue).start(next: { _ in
- if let strongController = controller {
- strongController.dismiss()
+ strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withoutSelectionState() }) })
+ strongController.dismiss()
+ } else {
+ if let navigationController = strongSelf.navigationController as? NavigationController {
+ for controller in navigationController.viewControllers {
+ if let maybeChat = controller as? ChatControllerImpl {
+ if case .peer(peerId) = maybeChat.chatLocation {
+ var isChatPinnedMessages = false
+ if case .pinnedMessages = maybeChat.presentationInterfaceState.subject {
+ isChatPinnedMessages = true
+ }
+ if !isChatPinnedMessages {
+ maybeChat.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withUpdatedForwardMessageIds(messages.map { $0.id }).withoutSelectionState() }) })
+ strongSelf.dismiss()
+ strongController.dismiss()
+ return
+ }
+ }
}
- }))
-
- if let parentController = strongSelf.parentController {
- (parentController.navigationController as? NavigationController)?.replaceTopController(ChatControllerImpl(context: strongSelf.context, chatLocation: .peer(peerId)), animated: false, ready: ready)
- } else {
- strongSelf.effectiveNavigationController?.replaceTopController(ChatControllerImpl(context: strongSelf.context, chatLocation: .peer(peerId)), animated: false, ready: ready)
}
}
- })
+
+ let _ = (strongSelf.context.account.postbox.transaction({ transaction -> Void in
+ transaction.updatePeerChatInterfaceState(peerId, update: { currentState in
+ if let currentState = currentState as? ChatInterfaceState {
+ return currentState.withUpdatedForwardMessageIds(messages.map { $0.id })
+ } else {
+ return ChatInterfaceState().withUpdatedForwardMessageIds(messages.map { $0.id })
+ }
+ })
+ }) |> deliverOnMainQueue).start(completed: {
+ if let strongSelf = self {
+ strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withoutSelectionState() }) })
+
+ let ready = Promise()
+
+ strongSelf.controllerNavigationDisposable.set((ready.get()
+ |> SwiftSignalKit.filter { $0 }
+ |> take(1)
+ |> deliverOnMainQueue).start(next: { _ in
+ if let strongController = controller {
+ strongController.dismiss()
+ }
+ }))
+
+ if let parentController = strongSelf.parentController {
+ (parentController.navigationController as? NavigationController)?.replaceTopController(ChatControllerImpl(context: strongSelf.context, chatLocation: .peer(peerId)), animated: false, ready: ready)
+ } else {
+ strongSelf.effectiveNavigationController?.replaceTopController(ChatControllerImpl(context: strongSelf.context, chatLocation: .peer(peerId)), animated: false, ready: ready)
+ }
+ }
+ })
+ }
}
- }
- self.chatDisplayNode.dismissInput()
- self.effectiveNavigationController?.pushViewController(controller)
+ self.chatDisplayNode.dismissInput()
+ self.effectiveNavigationController?.pushViewController(controller)
+ })
}
private func openPeer(peerId: PeerId?, navigation: ChatControllerInteractionNavigateToPeer, fromMessage: Message?, expandAvatar: Bool = false) {
- if case let .peer(currentPeerId) = self.chatLocation, peerId == currentPeerId {
- switch navigation {
- case .info:
- self.navigationButtonAction(.openChatInfo(expandAvatar: expandAvatar))
- case let .chat(textInputState, _, _):
- if let textInputState = textInputState {
- self.updateChatPresentationInterfaceState(animated: true, interactive: true, {
- return ($0.updatedInterfaceState {
- return $0.withUpdatedComposeInputState(textInputState)
- }).updatedInputMode({ _ in
- return .text
+ let _ = self.presentVoiceMessageDiscardAlert(action: {
+ if case let .peer(currentPeerId) = self.chatLocation, peerId == currentPeerId {
+ switch navigation {
+ case .info:
+ self.navigationButtonAction(.openChatInfo(expandAvatar: expandAvatar))
+ case let .chat(textInputState, _, _):
+ if let textInputState = textInputState {
+ self.updateChatPresentationInterfaceState(animated: true, interactive: true, {
+ return ($0.updatedInterfaceState {
+ return $0.withUpdatedComposeInputState(textInputState)
+ }).updatedInputMode({ _ in
+ return .text
+ })
})
+ }
+ case let .withBotStartPayload(botStart):
+ self.updateChatPresentationInterfaceState(animated: true, interactive: true, {
+ $0.updatedBotStartPayload(botStart.payload)
})
- }
- case let .withBotStartPayload(botStart):
- self.updateChatPresentationInterfaceState(animated: true, interactive: true, {
- $0.updatedBotStartPayload(botStart.payload)
- })
- default:
- break
- }
- } else {
- if let peerId = peerId {
- do {
- let selfPeerId = self.chatLocation.peerId
- switch navigation {
- case .info, .default:
- let peerSignal: Signal
- if let fromMessage = fromMessage {
- peerSignal = loadedPeerFromMessage(account: self.context.account, peerId: peerId, messageId: fromMessage.id)
- } else {
- peerSignal = self.context.account.postbox.loadedPeerWithId(peerId) |> map(Optional.init)
- }
- self.navigationActionDisposable.set((peerSignal |> take(1) |> deliverOnMainQueue).start(next: { [weak self] peer in
- if let strongSelf = self, let peer = peer {
- var mode: PeerInfoControllerMode = .generic
- if let _ = fromMessage {
- mode = .group(selfPeerId)
- }
- var expandAvatar = expandAvatar
- if peer.smallProfileImage == nil {
- expandAvatar = false
- }
- if let validLayout = strongSelf.validLayout, validLayout.deviceMetrics.type == .tablet {
- expandAvatar = false
- }
- if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: mode, avatarInitiallyExpanded: expandAvatar, fromChat: false) {
- strongSelf.effectiveNavigationController?.pushViewController(infoController)
- }
+ default:
+ break
+ }
+ } else {
+ if let peerId = peerId {
+ do {
+ let selfPeerId = self.chatLocation.peerId
+ switch navigation {
+ case .info, .default:
+ let peerSignal: Signal
+ if let fromMessage = fromMessage {
+ peerSignal = loadedPeerFromMessage(account: self.context.account, peerId: peerId, messageId: fromMessage.id)
+ } else {
+ peerSignal = self.context.account.postbox.loadedPeerWithId(peerId) |> map(Optional.init)
}
- }))
- case let .chat(textInputState, subject, peekData):
- if let textInputState = textInputState {
- let _ = (self.context.account.postbox.transaction({ transaction -> Void in
- transaction.updatePeerChatInterfaceState(peerId, update: { currentState in
- if let currentState = currentState as? ChatInterfaceState {
- return currentState.withUpdatedComposeInputState(textInputState)
- } else {
- return ChatInterfaceState().withUpdatedComposeInputState(textInputState)
+ self.navigationActionDisposable.set((peerSignal |> take(1) |> deliverOnMainQueue).start(next: { [weak self] peer in
+ if let strongSelf = self, let peer = peer {
+ var mode: PeerInfoControllerMode = .generic
+ if let _ = fromMessage {
+ mode = .group(selfPeerId)
+ }
+ var expandAvatar = expandAvatar
+ if peer.smallProfileImage == nil {
+ expandAvatar = false
+ }
+ if let validLayout = strongSelf.validLayout, validLayout.deviceMetrics.type == .tablet {
+ expandAvatar = false
+ }
+ if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, peer: peer, mode: mode, avatarInitiallyExpanded: expandAvatar, fromChat: false) {
+ strongSelf.effectiveNavigationController?.pushViewController(infoController)
+ }
+ }
+ }))
+ case let .chat(textInputState, subject, peekData):
+ if let textInputState = textInputState {
+ let _ = (self.context.account.postbox.transaction({ transaction -> Void in
+ transaction.updatePeerChatInterfaceState(peerId, update: { currentState in
+ if let currentState = currentState as? ChatInterfaceState {
+ return currentState.withUpdatedComposeInputState(textInputState)
+ } else {
+ return ChatInterfaceState().withUpdatedComposeInputState(textInputState)
+ }
+ })
+ })
+ |> deliverOnMainQueue).start(completed: { [weak self] in
+ if let strongSelf = self, let navigationController = strongSelf.effectiveNavigationController {
+ strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), subject: subject, updateTextInputState: textInputState, peekData: peekData))
}
})
- })
- |> deliverOnMainQueue).start(completed: { [weak self] in
- if let strongSelf = self, let navigationController = strongSelf.effectiveNavigationController {
- strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), subject: subject, updateTextInputState: textInputState, peekData: peekData))
+ } else {
+ self.effectiveNavigationController?.pushViewController(ChatControllerImpl(context: self.context, chatLocation: .peer(peerId), subject: subject))
+ }
+ case let .withBotStartPayload(botStart):
+ self.effectiveNavigationController?.pushViewController(ChatControllerImpl(context: self.context, chatLocation: .peer(peerId), botStart: botStart))
+ default:
+ break
+ }
+ }
+ } else {
+ switch navigation {
+ case .info:
+ break
+ case let .chat(textInputState, _, _):
+ if let textInputState = textInputState {
+ let controller = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context))
+ controller.peerSelected = { [weak self, weak controller] peerId in
+ if let strongSelf = self, let strongController = controller {
+ if case let .peer(currentPeerId) = strongSelf.chatLocation, peerId == currentPeerId {
+ strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, {
+ return ($0.updatedInterfaceState {
+ return $0.withUpdatedComposeInputState(textInputState)
+ }).updatedInputMode({ _ in
+ return .text
+ })
+ })
+ strongController.dismiss()
+ } else {
+ let _ = (strongSelf.context.account.postbox.transaction({ transaction -> Void in
+ transaction.updatePeerChatInterfaceState(peerId, update: { currentState in
+ if let currentState = currentState as? ChatInterfaceState {
+ return currentState.withUpdatedComposeInputState(textInputState)
+ } else {
+ return ChatInterfaceState().withUpdatedComposeInputState(textInputState)
+ }
+ })
+ }) |> deliverOnMainQueue).start(completed: {
+ if let strongSelf = self {
+ strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withoutSelectionState() }) })
+
+ let ready = Promise()
+
+ strongSelf.controllerNavigationDisposable.set((ready.get() |> filter { $0 } |> take(1) |> deliverOnMainQueue).start(next: { _ in
+ if let strongController = controller {
+ strongController.dismiss()
+ }
+ }))
+
+ strongSelf.effectiveNavigationController?.replaceTopController(ChatControllerImpl(context: strongSelf.context, chatLocation: .peer(peerId)), animated: false, ready: ready)
+ }
+ })
+ }
}
- })
- } else {
- self.effectiveNavigationController?.pushViewController(ChatControllerImpl(context: self.context, chatLocation: .peer(peerId), subject: subject))
+ }
+ self.chatDisplayNode.dismissInput()
+ self.effectiveNavigationController?.pushViewController(controller)
}
- case let .withBotStartPayload(botStart):
- self.effectiveNavigationController?.pushViewController(ChatControllerImpl(context: self.context, chatLocation: .peer(peerId), botStart: botStart))
default:
break
}
}
- } else {
- switch navigation {
- case .info:
- break
- case let .chat(textInputState, _, _):
- if let textInputState = textInputState {
- let controller = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context))
- controller.peerSelected = { [weak self, weak controller] peerId in
- if let strongSelf = self, let strongController = controller {
- if case let .peer(currentPeerId) = strongSelf.chatLocation, peerId == currentPeerId {
- strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, {
- return ($0.updatedInterfaceState {
- return $0.withUpdatedComposeInputState(textInputState)
- }).updatedInputMode({ _ in
- return .text
- })
- })
- strongController.dismiss()
- } else {
- let _ = (strongSelf.context.account.postbox.transaction({ transaction -> Void in
- transaction.updatePeerChatInterfaceState(peerId, update: { currentState in
- if let currentState = currentState as? ChatInterfaceState {
- return currentState.withUpdatedComposeInputState(textInputState)
- } else {
- return ChatInterfaceState().withUpdatedComposeInputState(textInputState)
- }
- })
- }) |> deliverOnMainQueue).start(completed: {
- if let strongSelf = self {
- strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withoutSelectionState() }) })
-
- let ready = Promise()
-
- strongSelf.controllerNavigationDisposable.set((ready.get() |> filter { $0 } |> take(1) |> deliverOnMainQueue).start(next: { _ in
- if let strongController = controller {
- strongController.dismiss()
- }
- }))
-
- strongSelf.effectiveNavigationController?.replaceTopController(ChatControllerImpl(context: strongSelf.context, chatLocation: .peer(peerId)), animated: false, ready: ready)
- }
- })
- }
- }
- }
- self.chatDisplayNode.dismissInput()
- self.effectiveNavigationController?.pushViewController(controller)
- }
- default:
- break
- }
}
- }
+ })
}
private func openPeerMention(_ name: String, navigation: ChatControllerInteractionNavigateToPeer = .default) {
- let disposable: MetaDisposable
- if let resolvePeerByNameDisposable = self.resolvePeerByNameDisposable {
- disposable = resolvePeerByNameDisposable
- } else {
- disposable = MetaDisposable()
- self.resolvePeerByNameDisposable = disposable
- }
- var resolveSignal = resolvePeerByName(account: self.context.account, name: name, ageLimit: 10)
-
- var cancelImpl: (() -> Void)?
- let presentationData = self.presentationData
- let progressSignal = Signal { [weak self] subscriber in
- let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: {
- cancelImpl?()
- }))
- self?.present(controller, in: .window(.root))
- return ActionDisposable { [weak controller] in
- Queue.mainQueue().async() {
- controller?.dismiss()
- }
+ let _ = self.presentVoiceMessageDiscardAlert(action: {
+ let disposable: MetaDisposable
+ if let resolvePeerByNameDisposable = self.resolvePeerByNameDisposable {
+ disposable = resolvePeerByNameDisposable
+ } else {
+ disposable = MetaDisposable()
+ self.resolvePeerByNameDisposable = disposable
}
- }
- |> runOn(Queue.mainQueue())
- |> delay(0.15, queue: Queue.mainQueue())
- let progressDisposable = progressSignal.start()
-
- resolveSignal = resolveSignal
- |> afterDisposed {
- Queue.mainQueue().async {
- progressDisposable.dispose()
- }
- }
- cancelImpl = { [weak self] in
- self?.resolvePeerByNameDisposable?.set(nil)
- }
- let account = self.context.account
- disposable.set((resolveSignal
- |> take(1)
- |> mapToSignal { peerId -> Signal in
- return account.postbox.transaction { transaction -> Peer? in
- if let peerId = peerId {
- return transaction.getPeer(peerId)
- } else {
- return nil
- }
- }
- }
- |> deliverOnMainQueue).start(next: { [weak self] peer in
- if let strongSelf = self {
- if let peer = peer {
- var navigation = navigation
- if case .default = navigation {
- if let peer = peer as? TelegramUser, peer.botInfo != nil {
- navigation = .chat(textInputState: nil, subject: nil, peekData: nil)
- }
+ var resolveSignal = resolvePeerByName(account: self.context.account, name: name, ageLimit: 10)
+
+ var cancelImpl: (() -> Void)?
+ let presentationData = self.presentationData
+ let progressSignal = Signal { [weak self] subscriber in
+ let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: {
+ cancelImpl?()
+ }))
+ self?.present(controller, in: .window(.root))
+ return ActionDisposable { [weak controller] in
+ Queue.mainQueue().async() {
+ controller?.dismiss()
}
- strongSelf.openResolved(.peer(peer.id, navigation))
- } else {
- strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Resolve_ErrorNotFound, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
}
}
- }))
+ |> runOn(Queue.mainQueue())
+ |> delay(0.15, queue: Queue.mainQueue())
+ let progressDisposable = progressSignal.start()
+
+ resolveSignal = resolveSignal
+ |> afterDisposed {
+ Queue.mainQueue().async {
+ progressDisposable.dispose()
+ }
+ }
+ cancelImpl = { [weak self] in
+ self?.resolvePeerByNameDisposable?.set(nil)
+ }
+ let account = self.context.account
+ disposable.set((resolveSignal
+ |> take(1)
+ |> mapToSignal { peerId -> Signal in
+ return account.postbox.transaction { transaction -> Peer? in
+ if let peerId = peerId {
+ return transaction.getPeer(peerId)
+ } else {
+ return nil
+ }
+ }
+ }
+ |> deliverOnMainQueue).start(next: { [weak self] peer in
+ if let strongSelf = self {
+ if let peer = peer {
+ var navigation = navigation
+ if case .default = navigation {
+ if let peer = peer as? TelegramUser, peer.botInfo != nil {
+ navigation = .chat(textInputState: nil, subject: nil, peekData: nil)
+ }
+ }
+ strongSelf.openResolved(.peer(peer.id, navigation))
+ } else {
+ strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Resolve_ErrorNotFound, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
+ }
+ }
+ }))
+ })
}
private func unblockPeer() {
@@ -10406,63 +10532,65 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
private func openUrl(_ url: String, concealed: Bool, message: Message? = nil) {
self.commitPurposefulAction()
- if self.context.sharedContext.immediateExperimentalUISettings.playlistPlayback {
- if url.hasSuffix(".m3u8") {
- let navigationController = self.navigationController as? NavigationController
-
- let webPage = TelegramMediaWebpage(
- webpageId: MediaId(namespace: 0, id: 0),
- content: .Loaded(TelegramMediaWebpageLoadedContent(
- url: url,
- displayUrl: url,
- hash: 0,
- type: "video",
- websiteName: nil,
- title: nil,
- text: nil,
- embedUrl: url,
- embedType: "video",
- embedSize: nil,
- duration: nil,
- author: nil,
- image: nil,
- file: nil,
- attributes: [],
- instantPage: nil
- ))
- )
- let entry = InstantPageGalleryEntry(
- index: 0,
- pageId: webPage.webpageId,
- media: InstantPageMedia(
+ self.presentVoiceMessageDiscardAlert(action: {
+ if self.context.sharedContext.immediateExperimentalUISettings.playlistPlayback {
+ if url.hasSuffix(".m3u8") {
+ let navigationController = self.navigationController as? NavigationController
+
+ let webPage = TelegramMediaWebpage(
+ webpageId: MediaId(namespace: 0, id: 0),
+ content: .Loaded(TelegramMediaWebpageLoadedContent(
+ url: url,
+ displayUrl: url,
+ hash: 0,
+ type: "video",
+ websiteName: nil,
+ title: nil,
+ text: nil,
+ embedUrl: url,
+ embedType: "video",
+ embedSize: nil,
+ duration: nil,
+ author: nil,
+ image: nil,
+ file: nil,
+ attributes: [],
+ instantPage: nil
+ ))
+ )
+ let entry = InstantPageGalleryEntry(
index: 0,
- media: webPage,
- url: nil,
+ pageId: webPage.webpageId,
+ media: InstantPageMedia(
+ index: 0,
+ media: webPage,
+ url: nil,
+ caption: nil,
+ credit: nil
+ ),
caption: nil,
- credit: nil
- ),
- caption: nil,
- credit: nil,
- location: nil
- )
-
- let gallery = InstantPageGalleryController(context: context, webPage: webPage, entries: [entry], centralIndex: 0, replaceRootController: { [weak navigationController] controller, ready in
- if let navigationController = navigationController {
- navigationController.replaceTopController(controller, animated: false, ready: ready)
- }
- }, baseNavigationController: navigationController)
- self.present(gallery, in: .window(.root), with: InstantPageGalleryControllerPresentationArguments(transitionArguments: { entry -> GalleryTransitionArguments? in
- return nil
- }))
- return;
+ credit: nil,
+ location: nil
+ )
+
+ let gallery = InstantPageGalleryController(context: self.context, webPage: webPage, entries: [entry], centralIndex: 0, replaceRootController: { [weak navigationController] controller, ready in
+ if let navigationController = navigationController {
+ navigationController.replaceTopController(controller, animated: false, ready: ready)
+ }
+ }, baseNavigationController: navigationController)
+ self.present(gallery, in: .window(.root), with: InstantPageGalleryControllerPresentationArguments(transitionArguments: { entry -> GalleryTransitionArguments? in
+ return nil
+ }))
+ return;
+ }
}
- }
-
- openUserGeneratedUrl(context: self.context, url: url, concealed: concealed, present: { [weak self] c in
- self?.present(c, in: .window(.root))
- }, openResolved: { [weak self] resolved in
- self?.openResolved(resolved)
- })
+
+ openUserGeneratedUrl(context: self.context, url: url, concealed: concealed, present: { [weak self] c in
+ self?.present(c, in: .window(.root))
+ }, openResolved: { [weak self] resolved in
+ self?.openResolved(resolved)
+ })
+ }, performAction: true)
}
private func openUrlIn(_ url: String) {
@@ -10924,6 +11052,44 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}))
}
+ private func displayChecksTooltip() {
+ self.checksTooltipController?.dismiss()
+
+ var latestNode: (Int32, ASDisplayNode)?
+ self.chatDisplayNode.historyNode.forEachVisibleItemNode { itemNode in
+ if let itemNode = itemNode as? ChatMessageItemView, let item = itemNode.item, let statusNode = itemNode.getStatusNode() {
+ if let (latestTimestamp, _) = latestNode {
+ if item.message.timestamp > latestTimestamp {
+ latestNode = (item.message.timestamp, statusNode)
+ }
+ } else {
+ latestNode = (item.message.timestamp, statusNode)
+ }
+ }
+ }
+
+ if let (_, latestStatusNode) = latestNode {
+ let bounds = latestStatusNode.view.convert(latestStatusNode.view.bounds, to: self.chatDisplayNode.view)
+ let location = CGPoint(x: bounds.maxX - 7.0, y: bounds.minY + 2.0)
+
+ let contentNode = ChatStatusChecksTooltipContentNode(presentationData: self.presentationData)
+ let tooltipController = TooltipController(content: .custom(contentNode), baseFontSize: self.presentationData.listsFontSize.baseDisplaySize, timeout: 3.5, dismissByTapOutside: true, dismissImmediatelyOnLayoutUpdate: true)
+ self.checksTooltipController = tooltipController
+ tooltipController.dismissed = { [weak self, weak tooltipController] _ in
+ if let strongSelf = self, let tooltipController = tooltipController, strongSelf.checksTooltipController === tooltipController {
+ strongSelf.checksTooltipController = nil
+ // ApplicationSpecificNotice.setVolumeButtonToUnmute(accountManager: strongSelf.context.sharedContext.accountManager)
+ }
+ }
+ self.present(tooltipController, in: .window(.root), with: TooltipControllerPresentationArguments(sourceNodeAndRect: { [weak self] in
+ if let strongSelf = self {
+ return (strongSelf.chatDisplayNode, CGRect(origin: location, size: CGSize()))
+ }
+ return nil
+ }))
+ }
+ }
+
private func dismissAllTooltips() {
self.sendingOptionsTooltipController?.dismiss()
self.searchResultsTooltipController?.dismiss()
@@ -10932,6 +11098,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
self.silentPostTooltipController?.dismiss()
self.mediaRecordingModeTooltipController?.dismiss()
self.mediaRestrictedTooltipController?.dismiss()
+ self.checksTooltipController?.dismiss()
self.window?.forEachController({ controller in
if let controller = controller as? UndoOverlayController {
@@ -11071,16 +11238,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
let otherShortcuts: [KeyShortcut] = [
-// KeyShortcut(title: strings.KeyCommand_ScrollUp, input: UIKeyCommand.inputUpArrow, modifiers: [.shift], action: { [weak self] in
-// if let strongSelf = self {
-// _ = strongSelf.chatDisplayNode.historyNode.scrollWithDirection(.down, distance: 75.0)
-// }
-// }),
-// KeyShortcut(title: strings.KeyCommand_ScrollDown, input: UIKeyCommand.inputDownArrow, modifiers: [.shift], action: { [weak self] in
-// if let strongSelf = self {
-// _ = strongSelf.chatDisplayNode.historyNode.scrollWithDirection(.up, distance: 75.0)
-// }
-// }),
KeyShortcut(title: strings.KeyCommand_ChatInfo, input: "I", modifiers: [.command, .control], action: { [weak self] in
if let strongSelf = self {
strongSelf.interfaceInteraction?.openPeerInfo()
@@ -11105,6 +11262,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return inputShortcuts + otherShortcuts
}
+ public override func joinGroupCall(peerId: PeerId, info: GroupCallInfo) {
+ let _ = self.presentVoiceMessageDiscardAlert(action: {
+ super.joinGroupCall(peerId: peerId, info: info)
+ })
+ }
+
public func getTransitionInfo(messageId: MessageId, media: Media) -> ((UIView) -> Void, ASDisplayNode, () -> (UIView?, UIView?))? {
var selectedNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
self.chatDisplayNode.historyNode.forEachItemNode { itemNode in
@@ -11374,14 +11537,19 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
self.present(controller, in: .window(.root))
}
- private func presentVoiceMessageDiscardAlert(action: @escaping () -> Void = {}) -> Bool {
+ private func presentVoiceMessageDiscardAlert(action: @escaping () -> Void = {}, alertAction: (() -> Void)? = nil, delay: Bool = false, performAction: Bool = true) -> Bool {
if let _ = self.presentationInterfaceState.inputTextPanelState.mediaRecordingState {
- self.present(textAlertController(context: self.context, title: nil, text: self.presentationData.strings.Conversation_DiscardVoiceMessageDescription, actions: [TextAlertAction(type: .genericAction, title: self.presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Conversation_DiscardVoiceMessageAction, action: { [weak self] in
- self?.stopMediaRecorder()
- action()
- })]), in: .window(.root))
+ alertAction?()
+ Queue.mainQueue().after(delay ? 0.2 : 0.0) {
+ self.present(textAlertController(context: self.context, title: nil, text: self.presentationData.strings.Conversation_DiscardVoiceMessageDescription, actions: [TextAlertAction(type: .genericAction, title: self.presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Conversation_DiscardVoiceMessageAction, action: { [weak self] in
+ self?.stopMediaRecorder()
+ action()
+ })]), in: .window(.root))
+ }
return true
+ } else if performAction {
+ action()
}
return false
}
diff --git a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift
index 960b5ba8a3..5d795a1980 100644
--- a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift
+++ b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift
@@ -579,7 +579,7 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState
if resourceAvailable, !message.containsSecretMedia {
var mediaReference: AnyMediaReference?
for media in message.media {
- if let image = media as? TelegramMediaImage, let largest = largestImageRepresentation(image.representations) {
+ if let image = media as? TelegramMediaImage, let _ = largestImageRepresentation(image.representations) {
mediaReference = ImageMediaReference.standalone(media: image).abstract
break
} else if let file = media as? TelegramMediaFile, file.isVideo {
@@ -641,8 +641,15 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState
})
})))
}
+
+ let isMigrated: Bool
+ if chatPresentationInterfaceState.renderedPeer?.peer is TelegramChannel && message.id.peerId.namespace == Namespaces.Peer.CloudGroup {
+ isMigrated = true
+ } else {
+ isMigrated = false
+ }
- if data.canEdit && !isPinnedMessages {
+ if data.canEdit && !isPinnedMessages && !isMigrated {
actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Conversation_MessageDialogEdit, icon: { theme in
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.actionSheet.primaryTextColor)
}, action: { c, f in
@@ -678,7 +685,7 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState
}
}
- if data.canPin, case .peer = chatPresentationInterfaceState.chatLocation {
+ if data.canPin && !isMigrated, case .peer = chatPresentationInterfaceState.chatLocation {
var pinnedSelectedMessageId: MessageId?
for message in messages {
if message.tags.contains(.pinned) {
@@ -744,7 +751,7 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState
}
}
- if let message = messages.first, message.id.namespace == Namespaces.Message.Cloud, let channel = message.peers[message.id.peerId] as? TelegramChannel, !(message.media.first is TelegramMediaAction), !isReplyThreadHead {
+ if let message = messages.first, message.id.namespace == Namespaces.Message.Cloud, let channel = message.peers[message.id.peerId] as? TelegramChannel, !(message.media.first is TelegramMediaAction), !isReplyThreadHead, !isMigrated {
actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Conversation_ContextMenuCopyLink, icon: { theme in
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Link"), color: theme.actionSheet.primaryTextColor)
}, action: { _, f in
@@ -850,7 +857,7 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState
}
var clearCacheAsDelete = false
- if message.id.peerId.namespace == Namespaces.Peer.CloudChannel {
+ if message.id.peerId.namespace == Namespaces.Peer.CloudChannel && !isMigrated {
var views: Int = 0
for attribute in message.attributes {
if let attribute = attribute as? ViewCountMessageAttribute {
diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift
index 323e2a7b45..8f716ff1eb 100644
--- a/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift
+++ b/submodules/TelegramUI/Sources/ChatMessageBubbleContentNode.swift
@@ -205,4 +205,8 @@ class ChatMessageBubbleContentNode: ASDisplayNode {
func reactionTargetNode(value: String) -> (ASDisplayNode, ASDisplayNode)? {
return nil
}
+
+ func getStatusNode() -> ASDisplayNode? {
+ return nil
+ }
}
diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift
index 9675518bbe..f343c2cddb 100644
--- a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift
+++ b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift
@@ -3764,4 +3764,16 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
forwardInfoNode.updatePsaButtonDisplay(isVisible: item.controllerInteraction.currentPsaMessageWithTooltip != item.message.id, animated: animated)
}
}
+
+ override func getStatusNode() -> ASDisplayNode? {
+ for contentNode in self.contentNodes {
+ if let statusNode = contentNode.getStatusNode() {
+ return statusNode
+ }
+ }
+ if let statusNode = self.mosaicStatusNode {
+ return statusNode
+ }
+ return nil
+ }
}
diff --git a/submodules/TelegramUI/Sources/ChatMessageItemView.swift b/submodules/TelegramUI/Sources/ChatMessageItemView.swift
index 2baabb1006..d56b6d58ee 100644
--- a/submodules/TelegramUI/Sources/ChatMessageItemView.swift
+++ b/submodules/TelegramUI/Sources/ChatMessageItemView.swift
@@ -835,4 +835,8 @@ public class ChatMessageItemView: ListViewItemNode {
func targetReactionNode(value: String) -> (ASDisplayNode, ASDisplayNode)? {
return nil
}
+
+ func getStatusNode() -> ASDisplayNode? {
+ return nil
+ }
}
diff --git a/submodules/TelegramUI/Sources/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageTextBubbleContentNode.swift
index f54ab56e51..d693d31514 100644
--- a/submodules/TelegramUI/Sources/ChatMessageTextBubbleContentNode.swift
+++ b/submodules/TelegramUI/Sources/ChatMessageTextBubbleContentNode.swift
@@ -617,4 +617,8 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode {
}
return nil
}
+
+ override func getStatusNode() -> ASDisplayNode? {
+ return self.statusNode
+ }
}
diff --git a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift
index 8b910bda2a..86b987ae05 100644
--- a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift
+++ b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift
@@ -157,6 +157,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
break
}
}
+ let gallerySource = GalleryControllerItemSource.standaloneMessage(message)
return context.sharedContext.openChatMessage(OpenChatMessageParams(context: context, chatLocation: nil, chatLocationContextHolder: nil, message: message, standalone: true, reverseMessageGalleryOrder: false, navigationController: navigationController, dismissInput: {
//self?.chatDisplayNode.dismissInput()
}, present: { c, a in
@@ -204,7 +205,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
}
}))
}
- }))
+ }, gallerySource: gallerySource))
}
return false
}, openPeer: { [weak self] peerId, _, message in
diff --git a/submodules/TelegramUI/Sources/ChatRecentActionsFilterController.swift b/submodules/TelegramUI/Sources/ChatRecentActionsFilterController.swift
index caa24c5850..ae772865e1 100644
--- a/submodules/TelegramUI/Sources/ChatRecentActionsFilterController.swift
+++ b/submodules/TelegramUI/Sources/ChatRecentActionsFilterController.swift
@@ -285,10 +285,10 @@ private func channelRecentActionsFilterControllerEntries(presentationData: Prese
let order: [([AdminLogEventsFlags], String)]
if isGroup {
order = [
- ([.ban, .unban], presentationData.strings.Channel_AdminLogFilter_EventsRestrictions),
+ ([.ban, .unban, .kick, .unkick], presentationData.strings.Channel_AdminLogFilter_EventsRestrictions),
([.promote, .demote], presentationData.strings.Channel_AdminLogFilter_EventsAdmins),
([.invite, .join], presentationData.strings.Channel_AdminLogFilter_EventsNewMembers),
- ([.info], isGroup ? presentationData.strings.Channel_AdminLogFilter_EventsInfo : presentationData.strings.Channel_AdminLogFilter_ChannelEventsInfo),
+ ([.info, .settings], isGroup ? presentationData.strings.Channel_AdminLogFilter_EventsInfo : presentationData.strings.Channel_AdminLogFilter_ChannelEventsInfo),
([.deleteMessages], presentationData.strings.Channel_AdminLogFilter_EventsDeletedMessages),
([.editMessages], presentationData.strings.Channel_AdminLogFilter_EventsEditedMessages),
([.pinnedMessages], presentationData.strings.Channel_AdminLogFilter_EventsPinned),
@@ -299,9 +299,10 @@ private func channelRecentActionsFilterControllerEntries(presentationData: Prese
order = [
([.promote, .demote], presentationData.strings.Channel_AdminLogFilter_EventsAdmins),
([.invite, .join], presentationData.strings.Channel_AdminLogFilter_EventsNewMembers),
- ([.info], isGroup ? presentationData.strings.Channel_AdminLogFilter_EventsInfo : presentationData.strings.Channel_AdminLogFilter_ChannelEventsInfo),
+ ([.info, .settings], isGroup ? presentationData.strings.Channel_AdminLogFilter_EventsInfo : presentationData.strings.Channel_AdminLogFilter_ChannelEventsInfo),
([.deleteMessages], presentationData.strings.Channel_AdminLogFilter_EventsDeletedMessages),
([.editMessages], presentationData.strings.Channel_AdminLogFilter_EventsEditedMessages),
+ ([.pinnedMessages], presentationData.strings.Channel_AdminLogFilter_EventsPinned),
([.leave], presentationData.strings.Channel_AdminLogFilter_EventsLeaving),
]
}
diff --git a/submodules/TelegramUI/Sources/ChatSearchResultsContollerNode.swift b/submodules/TelegramUI/Sources/ChatSearchResultsContollerNode.swift
index d0cae8cb5c..22efb1cc2a 100644
--- a/submodules/TelegramUI/Sources/ChatSearchResultsContollerNode.swift
+++ b/submodules/TelegramUI/Sources/ChatSearchResultsContollerNode.swift
@@ -174,7 +174,11 @@ class ChatSearchResultsControllerNode: ViewControllerTracingNode, UIScrollViewDe
}, messageSelected: { [weak self] peer, message, _ in
if let strongSelf = self {
if let index = strongSelf.searchResult.messages.firstIndex(where: { $0.index == message.index }) {
- strongSelf.resultSelected?(strongSelf.searchResult.messages.count - index - 1)
+ if message.id.peerId.namespace == Namespaces.Peer.SecretChat {
+ strongSelf.resultSelected?(index)
+ } else {
+ strongSelf.resultSelected?(strongSelf.searchResult.messages.count - index - 1)
+ }
}
strongSelf.listNode.clearHighlightAnimated(true)
}
diff --git a/submodules/TelegramUI/Sources/ChatStatusChecksTooltipContentNode.swift b/submodules/TelegramUI/Sources/ChatStatusChecksTooltipContentNode.swift
new file mode 100644
index 0000000000..21d17d7d6d
--- /dev/null
+++ b/submodules/TelegramUI/Sources/ChatStatusChecksTooltipContentNode.swift
@@ -0,0 +1,245 @@
+import Foundation
+import UIKit
+import AsyncDisplayKit
+import Display
+import SwiftSignalKit
+import LegacyComponents
+import TelegramPresentationData
+import TooltipUI
+
+private final class ChecksNodeParameters: NSObject {
+ let color: UIColor
+ let progress: CGFloat
+
+ init(color: UIColor, progress: CGFloat) {
+ self.color = color
+ self.progress = progress
+
+ super.init()
+ }
+}
+
+private class ChecksNode: ASDisplayNode {
+ var state: Bool? = nil
+
+ var color: UIColor {
+ didSet {
+ self.setNeedsDisplay()
+ }
+ }
+
+ private var effectiveProgress: CGFloat = 1.0 {
+ didSet {
+ self.setNeedsDisplay()
+ }
+ }
+
+ init(color: UIColor) {
+ self.color = color
+
+ super.init()
+
+ self.backgroundColor = .clear
+ self.isOpaque = false
+ }
+
+ func animateProgress(from: CGFloat, to: CGFloat) {
+ self.pop_removeAllAnimations()
+
+ let animation = POPBasicAnimation()
+ animation.property = (POPAnimatableProperty.property(withName: "progress", initializer: { property in
+ property?.readBlock = { node, values in
+ values?.pointee = (node as! ChecksNode).effectiveProgress
+ }
+ property?.writeBlock = { node, values in
+ (node as! ChecksNode).effectiveProgress = values!.pointee
+ }
+ property?.threshold = 0.01
+ }) as! POPAnimatableProperty)
+ animation.fromValue = from as NSNumber
+ animation.toValue = to as NSNumber
+ animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
+ animation.duration = 0.2
+ self.pop_add(animation, forKey: "progress")
+ }
+
+ override func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? {
+ return ChecksNodeParameters(color: self.color, progress: self.effectiveProgress)
+ }
+
+ override func didEnterHierarchy() {
+ super.didEnterHierarchy()
+ }
+
+ @objc override class func draw(_ bounds: CGRect, withParameters parameters: Any?, isCancelled: () -> Bool, isRasterizing: Bool) {
+ let context = UIGraphicsGetCurrentContext()!
+
+ if !isRasterizing {
+ context.setBlendMode(.copy)
+ context.setFillColor(UIColor.clear.cgColor)
+ context.fill(bounds)
+ }
+
+ guard let parameters = parameters as? ChecksNodeParameters else {
+ return
+ }
+
+ let scaleFactor: CGFloat = 1.0
+ context.translateBy(x: bounds.width / 2.0, y: bounds.height / 2.0)
+ context.scaleBy(x: scaleFactor, y: scaleFactor)
+ context.translateBy(x: -bounds.width / 2.0, y: -bounds.height / 2.0)
+
+ let progress = parameters.progress
+
+ context.setStrokeColor(parameters.color.cgColor)
+ context.setLineWidth(1.0 + UIScreenPixel)
+ context.setLineCap(.round)
+ context.setLineJoin(.round)
+ context.setMiterLimit(10.0)
+
+ context.saveGState()
+ var s1 = CGPoint(x: 9.0, y: 13.0)
+ var s2 = CGPoint(x: 5.0, y: 13.0)
+ let p1 = CGPoint(x: 3.5, y: 3.5)
+ let p2 = CGPoint(x: 7.5 - UIScreenPixel, y: -8.0)
+
+ let check1FirstSegment: CGFloat = max(0.0, min(1.0, progress * 3.0))
+ let check2FirstSegment: CGFloat = max(0.0, min(1.0, (progress - 1.0) * 3.0))
+
+ let firstProgress = max(0.0, min(1.0, progress))
+ let secondProgress = max(0.0, min(1.0, progress - 1.0))
+
+ let scale: CGFloat = 1.2
+ context.translateBy(x: 16.0, y: 13.0)
+ context.scaleBy(x: scale - abs((scale - 1.0) * (firstProgress - 0.5) / 0.5), y: scale - abs((scale - 1.0) * (firstProgress - 0.5) / 0.5))
+ s1 = s1.offsetBy(dx: -16.0, dy: -13.0)
+
+ if !check1FirstSegment.isZero {
+ if check1FirstSegment < 1.0 {
+ context.move(to: CGPoint(x: s1.x + p1.x * check1FirstSegment, y: s1.y + p1.y * check1FirstSegment))
+ context.addLine(to: s1)
+ } else {
+ let secondSegment = (min(1.0, progress) - 0.33) * 1.5
+ context.move(to: CGPoint(x: s1.x + p1.x + p2.x * secondSegment, y: s1.y + p1.y + p2.y * secondSegment))
+ context.addLine(to: CGPoint(x: s1.x + p1.x, y: s1.y + p1.y))
+ context.addLine(to: CGPoint(x: s1.x + p1.x * min(1.0, check2FirstSegment), y: s1.y + p1.y * min(1.0, check2FirstSegment)))
+ }
+ }
+ context.strokePath()
+
+ context.restoreGState()
+
+ context.translateBy(x: 12.0, y: 13.0)
+ context.scaleBy(x: scale - abs((scale - 1.0) * (secondProgress - 0.5) / 0.5), y: scale - abs((scale - 1.0) * (secondProgress - 0.5) / 0.5))
+ s2 = s2.offsetBy(dx: -12.0, dy: -13.0)
+
+ if !check2FirstSegment.isZero {
+ if check2FirstSegment < 1.0 {
+ context.move(to: CGPoint(x: s2.x + p1.x * check2FirstSegment, y: s2.y + p1.y * check2FirstSegment))
+ context.addLine(to: s2)
+ } else {
+ let secondSegment = (max(0.0, (progress - 1.0)) - 0.33) * 1.5
+ context.move(to: CGPoint(x: s2.x + p1.x + p2.x * secondSegment, y: s2.y + p1.y + p2.y * secondSegment))
+ context.addLine(to: CGPoint(x: s2.x + p1.x, y: s2.y + p1.y))
+ context.addLine(to: s2)
+ }
+ }
+ context.strokePath()
+ }
+
+ func updateState(_ state: Bool, animated: Bool) {
+ guard state != self.state else {
+ return
+ }
+ let previousState = self.state
+ self.state = state
+ if animated {
+ if previousState == nil && self.state == false {
+ self.animateProgress(from: 0.0, to: 1.0)
+ } else if previousState == false && self.state == true {
+ self.animateProgress(from: 1.0, to: 2.0)
+ }
+ } else {
+ if let state = self.state {
+ self.effectiveProgress = state ? 2.0 : 1.0
+ } else {
+ self.effectiveProgress = 0.0
+ }
+ }
+ }
+}
+
+class ChatStatusChecksTooltipContentNode: ASDisplayNode, TooltipControllerCustomContentNode {
+ private let deliveredChecksNode: ChecksNode
+ private let deliveredTextNode: ImmediateTextNode
+ private let readChecksNode: ChecksNode
+ private let readTextNode: ImmediateTextNode
+
+ init(presentationData: PresentationData) {
+ self.deliveredChecksNode = ChecksNode(color: .white)
+ self.deliveredTextNode = ImmediateTextNode()
+ self.readChecksNode = ChecksNode(color: .white)
+ self.readTextNode = ImmediateTextNode()
+
+ self.deliveredTextNode.attributedText = NSAttributedString(string: presentationData.strings.Conversation_ChecksTooltip_Delivered, font: Font.regular(14.0), textColor: UIColor.white)
+ self.readTextNode.attributedText = NSAttributedString(string: presentationData.strings.Conversation_ChecksTooltip_Read, font: Font.regular(14.0), textColor: UIColor.white)
+
+ super.init()
+
+ self.addSubnode(self.deliveredChecksNode)
+ self.addSubnode(self.deliveredTextNode)
+ self.addSubnode(self.readChecksNode)
+ self.addSubnode(self.readTextNode)
+ }
+
+ func animateIn() {
+ self.deliveredChecksNode.updateState(false, animated: true)
+ self.readChecksNode.updateState(false, animated: true)
+
+ self.deliveredChecksNode.layer.animateScale(from: 1.0, to: 1.12, duration: 0.25, delay: 0.1, removeOnCompletion: false, completion: { [weak self] _ in
+ if let strongSelf = self {
+ strongSelf.deliveredChecksNode.layer.animateScale(from: 1.12, to: 1.0, duration: 0.25)
+ }
+ })
+
+ self.deliveredTextNode.layer.animateScale(from: 1.0, to: 1.12, duration: 0.25, delay: 0.1, removeOnCompletion: false, completion: { [weak self] _ in
+ if let strongSelf = self {
+ strongSelf.deliveredTextNode.layer.animateScale(from: 1.12, to: 1.0, duration: 0.25)
+ }
+ })
+
+ Queue.mainQueue().after(0.5) {
+ self.readChecksNode.updateState(true, animated: true)
+
+ self.readChecksNode.layer.animateScale(from: 1.0, to: 1.12, duration: 0.25, removeOnCompletion: false, completion: { [weak self] _ in
+ if let strongSelf = self {
+ strongSelf.readChecksNode.layer.animateScale(from: 1.12, to: 1.0, duration: 0.25)
+ }
+ })
+
+ self.readTextNode.layer.animateScale(from: 1.0, to: 1.12, duration: 0.25, removeOnCompletion: false, completion: { [weak self] _ in
+ if let strongSelf = self {
+ strongSelf.readTextNode.layer.animateScale(from: 1.12, to: 1.0, duration: 0.25)
+ }
+ })
+ }
+ }
+
+ func updateLayout(size: CGSize) -> CGSize {
+ let deliveredSize = self.deliveredTextNode.updateLayout(size)
+ let readSize = self.readTextNode.updateLayout(size)
+
+ let checksInset: CGFloat = 8.0
+ let checksSize = CGSize(width: 24.0, height: 24.0)
+
+ self.deliveredChecksNode.frame = CGRect(origin: CGPoint(x: checksInset, y: 15.0), size: checksSize)
+ self.deliveredTextNode.frame = CGRect(origin: CGPoint(x: checksInset + checksSize.width + 5.0, y: 19.0), size: deliveredSize)
+ self.readChecksNode.frame = CGRect(origin: CGPoint(x: checksInset, y: 38.0), size: checksSize)
+ self.readTextNode.frame = CGRect(origin: CGPoint(x: checksInset + checksSize.width + 5.0, y: 43.0), size: readSize)
+
+ let contentWidth = max(deliveredSize.width, readSize.width) + checksInset + checksSize.width + 18.0
+ let contentHeight: CGFloat = 77.0
+
+ return CGSize(width: contentWidth, height: contentHeight)
+ }
+}
diff --git a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift
index 7151db41a5..f99cde87bc 100644
--- a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift
+++ b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift
@@ -191,6 +191,7 @@ private func textInputBackgroundImage(backgroundColor: UIColor, strokeColor: UIC
enum ChatTextInputPanelPasteData {
case images([UIImage])
+ case video(Data)
case gif(Data)
case sticker(UIImage, Bool)
}
@@ -1911,6 +1912,9 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
if let data = pasteboard.data(forPasteboardType: "com.compuserve.gif") {
self.paste(.gif(data))
return false
+ } else if let data = pasteboard.data(forPasteboardType: "public.mpeg-4") {
+ self.paste(.video(data))
+ return false
} else {
var isPNG = false
var isMemoji = false
diff --git a/submodules/TelegramUI/Sources/OpenUrl.swift b/submodules/TelegramUI/Sources/OpenUrl.swift
index 2d1e643577..e85b6a7b6f 100644
--- a/submodules/TelegramUI/Sources/OpenUrl.swift
+++ b/submodules/TelegramUI/Sources/OpenUrl.swift
@@ -12,10 +12,6 @@ import AccountContext
import UrlEscaping
import PassportUI
import UrlHandling
-#if ENABLE_WALLET
-import WalletUI
-import WalletUrl
-#endif
import OpenInExternalAppUI
public struct ParsedSecureIdUrl {
@@ -142,18 +138,6 @@ func formattedConfirmationCode(_ code: Int) -> String {
}
func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, url: String, forceExternal: Bool, presentationData: PresentationData, navigationController: NavigationController?, dismissInput: @escaping () -> Void) {
- #if ENABLE_WALLET
- if url.hasPrefix("ton://") {
- if let url = URL(string: url), let parsedUrl = parseWalletUrl(url) {
- context.sharedContext.openWallet(context: context, walletContext: .send(address: parsedUrl.address, amount: parsedUrl.amount, comment: parsedUrl.comment)) { c in
- navigationController?.pushViewController(c)
- }
- }
-
- return
- }
- #endif
-
if forceExternal || url.lowercased().hasPrefix("tel:") || url.lowercased().hasPrefix("calshow:") {
context.sharedContext.applicationBindings.openUrl(url)
return
diff --git a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift
index aed16bc4e0..4a3f3d162e 100644
--- a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift
+++ b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift
@@ -15,6 +15,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu
let ready = Promise()
private let context: AccountContext
+
private let peerId: PeerId
private var presentationData: PresentationData
private let type: MediaManagerPlayerType
diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoData.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoData.swift
index 7a9bf48665..029d1b7ade 100644
--- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoData.swift
+++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoData.swift
@@ -861,6 +861,9 @@ func availableActionsForMemberOfPeer(accountPeerId: PeerId, peer: Peer?, member:
if channel.hasPermission(.banMembers) {
result.insert(.restrict)
}
+ if channel.hasPermission(.addAdmins) {
+ result.insert(.promote)
+ }
}
}
case .legacyGroupMember:
@@ -904,7 +907,7 @@ func availableActionsForMemberOfPeer(accountPeerId: PeerId, peer: Peer?, member:
return result
}
-func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFromChat: Bool, videoCallsEnabled: Bool) -> [PeerInfoHeaderButtonKey] {
+func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFromChat: Bool, videoCallsEnabled: Bool, isSecretChat: Bool, isContact: Bool) -> [PeerInfoHeaderButtonKey] {
var result: [PeerInfoHeaderButtonKey] = []
if let user = peer as? TelegramUser {
if !isOpenedFromChat {
@@ -931,7 +934,10 @@ func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFro
if isOpenedFromChat {
result.append(.search)
}
- result.append(.more)
+ if isSecretChat && !isContact {
+ } else {
+ result.append(.more)
+ }
} else if let channel = peer as? TelegramChannel {
var displayLeave = !channel.flags.contains(.isCreator)
var canViewStats = false
diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift
index 3360d09e62..d83b5c5b0e 100644
--- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift
+++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift
@@ -2754,7 +2754,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
self.avatarListNode.listContainerNode.updateEntryIsHidden(entry: entry)
}
- func update(width: CGFloat, containerHeight: CGFloat, containerInset: CGFloat, statusBarHeight: CGFloat, navigationHeight: CGFloat, isModalOverlay: Bool, isMediaOnly: Bool, contentOffset: CGFloat, presentationData: PresentationData, peer: Peer?, cachedData: CachedPeerData?, notificationSettings: TelegramPeerNotificationSettings?, statusData: PeerInfoStatusData?, isContact: Bool, isSettings: Bool, state: PeerInfoState, transition: ContainedViewLayoutTransition, additive: Bool) -> CGFloat {
+ func update(width: CGFloat, containerHeight: CGFloat, containerInset: CGFloat, statusBarHeight: CGFloat, navigationHeight: CGFloat, isModalOverlay: Bool, isMediaOnly: Bool, contentOffset: CGFloat, presentationData: PresentationData, peer: Peer?, cachedData: CachedPeerData?, notificationSettings: TelegramPeerNotificationSettings?, statusData: PeerInfoStatusData?, isSecretChat: Bool, isContact: Bool, isSettings: Bool, state: PeerInfoState, transition: ContainedViewLayoutTransition, additive: Bool) -> CGFloat {
self.state = state
self.peer = peer
self.avatarListNode.listContainerNode.peer = peer
@@ -2848,7 +2848,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
let expandedAvatarListHeight = min(width, containerHeight - expandedAvatarControlsHeight)
let expandedAvatarListSize = CGSize(width: width, height: expandedAvatarListHeight)
- let buttonKeys: [PeerInfoHeaderButtonKey] = self.isSettings ? [] : peerInfoHeaderButtons(peer: peer, cachedData: cachedData, isOpenedFromChat: self.isOpenedFromChat, videoCallsEnabled: self.videoCallsEnabled)
+ let buttonKeys: [PeerInfoHeaderButtonKey] = self.isSettings ? [] : peerInfoHeaderButtons(peer: peer, cachedData: cachedData, isOpenedFromChat: self.isOpenedFromChat, videoCallsEnabled: self.videoCallsEnabled, isSecretChat: isSecretChat, isContact: isContact)
var isVerified = false
let titleString: NSAttributedString
diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift
index 355bce3314..92a2200a07 100644
--- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift
+++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift
@@ -53,6 +53,7 @@ import ListMessageItem
import GalleryData
import ChatInterfaceState
import TelegramVoip
+import InviteLinksUI
protocol PeerInfoScreenItem: class {
var id: AnyHashable { get }
@@ -536,6 +537,7 @@ private final class PeerInfoInteraction {
let openAddBotToGroup: () -> Void
let performBotCommand: (PeerInfoBotCommand) -> Void
let editingOpenPublicLinkSetup: () -> Void
+ let editingOpenInviteLinksSetup: () -> Void
let editingOpenDiscussionGroupSetup: () -> Void
let editingToggleMessageSignatures: (Bool) -> Void
let openParticipantsSection: (PeerInfoParticipantsSection) -> Void
@@ -571,6 +573,7 @@ private final class PeerInfoInteraction {
openAddBotToGroup: @escaping () -> Void,
performBotCommand: @escaping (PeerInfoBotCommand) -> Void,
editingOpenPublicLinkSetup: @escaping () -> Void,
+ editingOpenInviteLinksSetup: @escaping () -> Void,
editingOpenDiscussionGroupSetup: @escaping () -> Void,
editingToggleMessageSignatures: @escaping (Bool) -> Void,
openParticipantsSection: @escaping (PeerInfoParticipantsSection) -> Void,
@@ -605,6 +608,7 @@ private final class PeerInfoInteraction {
self.openAddBotToGroup = openAddBotToGroup
self.performBotCommand = performBotCommand
self.editingOpenPublicLinkSetup = editingOpenPublicLinkSetup
+ self.editingOpenInviteLinksSetup = editingOpenInviteLinksSetup
self.editingOpenDiscussionGroupSetup = editingOpenDiscussionGroupSetup
self.editingToggleMessageSignatures = editingToggleMessageSignatures
self.openParticipantsSection = openParticipantsSection
@@ -1146,9 +1150,10 @@ private func editingItems(data: PeerInfoScreenData?, context: AccountContext, pr
}
} else if let channel = data.peer as? TelegramChannel {
let ItemUsername = 1
- let ItemDiscussionGroup = 2
- let ItemSignMessages = 3
- let ItemSignMessagesHelp = 4
+ let ItemInviteLinks = 2
+ let ItemDiscussionGroup = 3
+ let ItemSignMessages = 4
+ let ItemSignMessagesHelp = 5
switch channel.info {
case .broadcast:
@@ -1250,6 +1255,12 @@ private func editingItems(data: PeerInfoScreenData?, context: AccountContext, pr
interaction.editingOpenPublicLinkSetup()
}))
+ if !isPublic {
+ items[.peerPublicSettings]!.append(PeerInfoScreenDisclosureItem(id: ItemInviteLinks, label: .text(""), text: presentationData.strings.GroupInfo_InviteLinks, action: {
+ interaction.editingOpenInviteLinksSetup()
+ }))
+ }
+
if let linkedDiscussionPeer = data.linkedDiscussionPeer {
let peerTitle: String
if let addressName = linkedDiscussionPeer.addressName, !addressName.isEmpty {
@@ -1357,7 +1368,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
private weak var controller: PeerInfoScreen?
private let context: AccountContext
- private let peerId: PeerId
+ let peerId: PeerId
private let isOpenedFromChat: Bool
private let videoCallsEnabled: Bool
private let callMessages: [Message]
@@ -1499,6 +1510,9 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
editingOpenPublicLinkSetup: { [weak self] in
self?.editingOpenPublicLinkSetup()
},
+ editingOpenInviteLinksSetup: { [weak self] in
+ self?.editingOpenInviteLinksSetup()
+ },
editingOpenDiscussionGroupSetup: { [weak self] in
self?.editingOpenDiscussionGroupSetup()
},
@@ -2899,7 +2913,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
actionSheet?.dismissAnimated()
}
var items: [ActionSheetItem] = []
- if !peerInfoHeaderButtons(peer: peer, cachedData: data.cachedData, isOpenedFromChat: self.isOpenedFromChat, videoCallsEnabled: self.videoCallsEnabled).contains(.search) || (self.headerNode.isAvatarExpanded && self.peerId.namespace == Namespaces.Peer.CloudUser) {
+ if !peerInfoHeaderButtons(peer: peer, cachedData: data.cachedData, isOpenedFromChat: self.isOpenedFromChat, videoCallsEnabled: self.videoCallsEnabled, isSecretChat: self.peerId.namespace == Namespaces.Peer.SecretChat, isContact: self.data?.isContact ?? false).contains(.search) || (self.headerNode.isAvatarExpanded && self.peerId.namespace == Namespaces.Peer.CloudUser) {
items.append(ActionSheetButtonItem(title: presentationData.strings.ChatSearch_SearchPlaceholder, color: .accent, action: { [weak self] in
dismissAction()
self?.openChatWithMessageSearch()
@@ -2955,13 +2969,24 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
}
}))
}
-
+
if self.peerId.namespace == Namespaces.Peer.CloudUser && user.botInfo == nil && !user.flags.contains(.isSupport) {
items.append(ActionSheetButtonItem(title: presentationData.strings.UserInfo_StartSecretChat, color: .accent, action: { [weak self] in
dismissAction()
self?.openStartSecretChat()
}))
if data.isContact {
+ if let cachedData = data.cachedData as? CachedUserData, cachedData.isBlocked {
+ } else {
+ items.append(ActionSheetButtonItem(title: presentationData.strings.Conversation_BlockUser, color: .destructive, action: { [weak self] in
+ dismissAction()
+ self?.updateBlocked(block: true)
+ }))
+ }
+ }
+ } else if self.peerId.namespace == Namespaces.Peer.SecretChat && data.isContact {
+ if let cachedData = data.cachedData as? CachedUserData, cachedData.isBlocked {
+ } else {
items.append(ActionSheetButtonItem(title: presentationData.strings.Conversation_BlockUser, color: .destructive, action: { [weak self] in
dismissAction()
self?.updateBlocked(block: true)
@@ -3010,7 +3035,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
self?.openDeletePeer()
}))
} else {
- if !peerInfoHeaderButtons(peer: peer, cachedData: data.cachedData, isOpenedFromChat: self.isOpenedFromChat, videoCallsEnabled: self.videoCallsEnabled).contains(.leave) {
+ if !peerInfoHeaderButtons(peer: peer, cachedData: data.cachedData, isOpenedFromChat: self.isOpenedFromChat, videoCallsEnabled: self.videoCallsEnabled, isSecretChat: self.peerId.namespace == Namespaces.Peer.SecretChat, isContact: self.data?.isContact ?? false).contains(.leave) {
if case .member = channel.participationStatus {
items.append(ActionSheetButtonItem(title: presentationData.strings.Channel_LeaveChannel, color: .destructive, action: { [weak self] in
dismissAction()
@@ -3653,6 +3678,10 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
self.controller?.push(channelVisibilityController(context: self.context, peerId: self.peerId, mode: .generic, upgradedToSupergroup: { _, f in f() }))
}
+ private func editingOpenInviteLinksSetup() {
+ self.controller?.push(inviteLinkListController(context: self.context, peerId: self.peerId))
+ }
+
private func editingOpenDiscussionGroupSetup() {
guard let data = self.data, let peer = data.peer else {
return
@@ -4513,23 +4542,13 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
}
let mode: ChannelVisibilityControllerMode
if groupPeer.addressName != nil {
- mode = .generic
+ let visibilityController = channelVisibilityController(context: strongSelf.context, peerId: groupPeer.id, mode: .generic, upgradedToSupergroup: { _, f in f() }, onDismissRemoveController: contactsController)
+ //visibilityController.navigationPresentation = .modal
+
+ contactsController?.push(visibilityController)
} else {
- mode = .privateLink
+ contactsController?.push(InviteLinkInviteController(context: context, peerId: groupPeer.id))
}
- let visibilityController = channelVisibilityController(context: strongSelf.context, peerId: groupPeer.id, mode: mode, upgradedToSupergroup: { _, f in f() }, onDismissRemoveController: contactsController)
- //visibilityController.navigationPresentation = .modal
-
- contactsController?.push(visibilityController)
-
- /*if let navigationController = strongSelf.controller?.navigationController as? NavigationController {
- var controllers = navigationController.viewControllers
- if let contactsController = contactsController {
- controllers.removeAll(where: { $0 === contactsController })
- }
- controllers.append(visibilityController)
- navigationController.setViewControllers(controllers, animated: true)
- }*/
}
strongSelf.controller?.push(contactsController)
@@ -4953,7 +4972,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
}
})
}
- }, resolvedFaqUrl: self.cachedFaq.get(), exceptionsList: .single(settings.notificationExceptions), archivedStickerPacks: .single(settings.archivedStickerPacks), privacySettings: .single(settings.privacySettings), hasWallet: .single(false), activeSessionsContext: self.activeSessionsContextAndCount.get() |> map { $0?.0 }, webSessionsContext: self.activeSessionsContextAndCount.get() |> map { $0?.2 }), cancel: { [weak self] in
+ }, resolvedFaqUrl: self.cachedFaq.get(), exceptionsList: .single(settings.notificationExceptions), archivedStickerPacks: .single(settings.archivedStickerPacks), privacySettings: .single(settings.privacySettings), hasTwoStepAuth: self.hasTwoStepAuth.get(), activeSessionsContext: self.activeSessionsContextAndCount.get() |> map { $0?.0 }, webSessionsContext: self.activeSessionsContextAndCount.get() |> map { $0?.2 }), cancel: { [weak self] in
self?.deactivateSearch()
})
}
@@ -5047,7 +5066,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
var contentHeight: CGFloat = 0.0
- let headerHeight = self.headerNode.update(width: layout.size.width, containerHeight: layout.size.height, containerInset: layout.safeInsets.left, statusBarHeight: layout.statusBarHeight ?? 0.0, navigationHeight: navigationHeight, isModalOverlay: layout.isModalOverlay, isMediaOnly: self.isMediaOnly, contentOffset: self.isMediaOnly ? 212.0 : self.scrollNode.view.contentOffset.y, presentationData: self.presentationData, peer: self.data?.peer, cachedData: self.data?.cachedData, notificationSettings: self.data?.notificationSettings, statusData: self.data?.status, isContact: self.data?.isContact ?? false, isSettings: self.isSettings, state: self.state, transition: transition, additive: additive)
+ let headerHeight = self.headerNode.update(width: layout.size.width, containerHeight: layout.size.height, containerInset: layout.safeInsets.left, statusBarHeight: layout.statusBarHeight ?? 0.0, navigationHeight: navigationHeight, isModalOverlay: layout.isModalOverlay, isMediaOnly: self.isMediaOnly, contentOffset: self.isMediaOnly ? 212.0 : self.scrollNode.view.contentOffset.y, presentationData: self.presentationData, peer: self.data?.peer, cachedData: self.data?.cachedData, notificationSettings: self.data?.notificationSettings, statusData: self.data?.status, isSecretChat: self.peerId.namespace == Namespaces.Peer.SecretChat, isContact: self.data?.isContact ?? false, isSettings: self.isSettings, state: self.state, transition: transition, additive: additive)
let headerFrame = CGRect(origin: CGPoint(x: 0.0, y: contentHeight), size: CGSize(width: layout.size.width, height: headerHeight))
if additive {
transition.updateFrameAdditive(node: self.headerNode, frame: headerFrame)
@@ -5294,7 +5313,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
if let (layout, navigationHeight) = self.validLayout {
if !additive {
- let _ = self.headerNode.update(width: layout.size.width, containerHeight: layout.size.height, containerInset: layout.safeInsets.left, statusBarHeight: layout.statusBarHeight ?? 0.0, navigationHeight: navigationHeight, isModalOverlay: layout.isModalOverlay, isMediaOnly: self.isMediaOnly, contentOffset: self.isMediaOnly ? 212.0 : offsetY, presentationData: self.presentationData, peer: self.data?.peer, cachedData: self.data?.cachedData, notificationSettings: self.data?.notificationSettings, statusData: self.data?.status, isContact: self.data?.isContact ?? false, isSettings: self.isSettings, state: self.state, transition: transition, additive: additive)
+ let _ = self.headerNode.update(width: layout.size.width, containerHeight: layout.size.height, containerInset: layout.safeInsets.left, statusBarHeight: layout.statusBarHeight ?? 0.0, navigationHeight: navigationHeight, isModalOverlay: layout.isModalOverlay, isMediaOnly: self.isMediaOnly, contentOffset: self.isMediaOnly ? 212.0 : offsetY, presentationData: self.presentationData, peer: self.data?.peer, cachedData: self.data?.cachedData, notificationSettings: self.data?.notificationSettings, statusData: self.data?.status, isSecretChat: self.peerId.namespace == Namespaces.Peer.SecretChat, isContact: self.data?.isContact ?? false, isSettings: self.isSettings, state: self.state, transition: transition, additive: additive)
}
let paneAreaExpansionDistance: CGFloat = 32.0
@@ -6134,7 +6153,7 @@ private final class PeerInfoNavigationTransitionNode: ASDisplayNode, CustomNavig
self.headerNode.navigationTransition = PeerInfoHeaderNavigationTransition(sourceNavigationBar: bottomNavigationBar, sourceTitleView: previousTitleView, sourceTitleFrame: previousTitleFrame, sourceSubtitleFrame: previousStatusFrame, fraction: fraction)
if let (layout, _) = self.screenNode.validLayout {
- let _ = self.headerNode.update(width: layout.size.width, containerHeight: layout.size.height, containerInset: layout.safeInsets.left, statusBarHeight: layout.statusBarHeight ?? 0.0, navigationHeight: topNavigationBar.bounds.height, isModalOverlay: layout.isModalOverlay, isMediaOnly: false, contentOffset: 0.0, presentationData: self.presentationData, peer: self.screenNode.data?.peer, cachedData: self.screenNode.data?.cachedData, notificationSettings: self.screenNode.data?.notificationSettings, statusData: self.screenNode.data?.status, isContact: self.screenNode.data?.isContact ?? false, isSettings: self.screenNode.isSettings, state: self.screenNode.state, transition: transition, additive: false)
+ let _ = self.headerNode.update(width: layout.size.width, containerHeight: layout.size.height, containerInset: layout.safeInsets.left, statusBarHeight: layout.statusBarHeight ?? 0.0, navigationHeight: topNavigationBar.bounds.height, isModalOverlay: layout.isModalOverlay, isMediaOnly: false, contentOffset: 0.0, presentationData: self.presentationData, peer: self.screenNode.data?.peer, cachedData: self.screenNode.data?.cachedData, notificationSettings: self.screenNode.data?.notificationSettings, statusData: self.screenNode.data?.status, isSecretChat: self.screenNode.peerId.namespace == Namespaces.Peer.SecretChat, isContact: self.screenNode.data?.isContact ?? false, isSettings: self.screenNode.isSettings, state: self.screenNode.state, transition: transition, additive: false)
}
let titleScale = (fraction * previousTitleNode.bounds.height + (1.0 - fraction) * self.headerNode.titleNodeRawContainer.bounds.height) / previousTitleNode.bounds.height
diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift
index f1ef91bb18..950c18fdd2 100644
--- a/submodules/TelegramUI/Sources/SharedAccountContext.swift
+++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift
@@ -17,10 +17,6 @@ import PeersNearbyUI
import PeerInfoUI
import SettingsUI
import UrlHandling
-#if ENABLE_WALLET
-import WalletUI
-import WalletCore
-#endif
import LegacyMediaPickerUI
import LocalMediaResources
import OverlayStatusController
diff --git a/submodules/TelegramUniversalVideoContent/Sources/GenericEmbedImplementation.swift b/submodules/TelegramUniversalVideoContent/Sources/GenericEmbedImplementation.swift
index ce2f67df30..731c1364b5 100644
--- a/submodules/TelegramUniversalVideoContent/Sources/GenericEmbedImplementation.swift
+++ b/submodules/TelegramUniversalVideoContent/Sources/GenericEmbedImplementation.swift
@@ -43,7 +43,7 @@ final class GenericEmbedImplementation: WebEmbedImplementation {
self.onPlaybackStarted = onPlaybackStarted
updateStatus(self.status)
- if self.url.contains("player.twitch.tv/"), let url = URL(string: self.url) {
+ if self.url.contains(".twitch.tv/"), let url = URL(string: self.url) {
webView.load(URLRequest(url: url))
} else {
let html = String(format: htmlTemplate, self.url)
diff --git a/submodules/TooltipUI/Sources/TooltipScreen.swift b/submodules/TooltipUI/Sources/TooltipScreen.swift
index 236e74cb63..a61186f50b 100644
--- a/submodules/TooltipUI/Sources/TooltipScreen.swift
+++ b/submodules/TooltipUI/Sources/TooltipScreen.swift
@@ -11,6 +11,11 @@ import TextFormat
import Postbox
import UrlEscaping
+public protocol TooltipCustomContentNode: ASDisplayNode {
+ func animateIn()
+ func updateLayout(size: CGSize) -> CGSize
+}
+
public enum TooltipActiveTextItem {
case url(String, Bool)
case mention(PeerId, String)
@@ -27,6 +32,7 @@ public enum TooltipActiveTextAction {
private final class TooltipScreenNode: ViewControllerTracingNode {
private let tooltipStyle: TooltipScreen.Style
private let icon: TooltipScreen.Icon?
+ private let customContentNode: TooltipCustomContentNode?
private let location: TooltipScreen.Location
private let displayDuration: TooltipScreen.DisplayDuration
private let shouldDismissOnTouch: (CGPoint) -> TooltipScreen.DismissOnTouch
@@ -47,9 +53,10 @@ private final class TooltipScreenNode: ViewControllerTracingNode {
private var validLayout: ContainerViewLayout?
- init(text: String, textEntities: [MessageTextEntity], style: TooltipScreen.Style, icon: TooltipScreen.Icon?, location: TooltipScreen.Location, displayDuration: TooltipScreen.DisplayDuration, shouldDismissOnTouch: @escaping (CGPoint) -> TooltipScreen.DismissOnTouch, requestDismiss: @escaping () -> Void, openActiveTextItem: @escaping (TooltipActiveTextItem, TooltipActiveTextAction) -> Void) {
+ init(text: String, textEntities: [MessageTextEntity], style: TooltipScreen.Style, icon: TooltipScreen.Icon?, customContentNode: TooltipCustomContentNode? = nil, location: TooltipScreen.Location, displayDuration: TooltipScreen.DisplayDuration, shouldDismissOnTouch: @escaping (CGPoint) -> TooltipScreen.DismissOnTouch, requestDismiss: @escaping () -> Void, openActiveTextItem: @escaping (TooltipActiveTextItem, TooltipActiveTextAction) -> Void) {
self.tooltipStyle = style
self.icon = icon
+ self.customContentNode = customContentNode
self.location = location
self.displayDuration = displayDuration
self.shouldDismissOnTouch = shouldDismissOnTouch
@@ -500,6 +507,7 @@ public final class TooltipScreen: ViewController {
public let textEntities: [MessageTextEntity]
private let style: TooltipScreen.Style
private let icon: TooltipScreen.Icon?
+ private let customContentNode: TooltipCustomContentNode?
private let location: TooltipScreen.Location
private let displayDuration: DisplayDuration
private let shouldDismissOnTouch: (CGPoint) -> TooltipScreen.DismissOnTouch
@@ -517,11 +525,12 @@ public final class TooltipScreen: ViewController {
private var dismissTimer: Foundation.Timer?
- public init(text: String, textEntities: [MessageTextEntity] = [], style: TooltipScreen.Style = .default, icon: TooltipScreen.Icon?, location: TooltipScreen.Location, displayDuration: DisplayDuration = .default, shouldDismissOnTouch: @escaping (CGPoint) -> TooltipScreen.DismissOnTouch, openActiveTextItem: @escaping (TooltipActiveTextItem, TooltipActiveTextAction) -> Void = { _, _ in }) {
+ public init(text: String, textEntities: [MessageTextEntity] = [], style: TooltipScreen.Style = .default, icon: TooltipScreen.Icon?, customContentNode: TooltipCustomContentNode? = nil, location: TooltipScreen.Location, displayDuration: DisplayDuration = .default, shouldDismissOnTouch: @escaping (CGPoint) -> TooltipScreen.DismissOnTouch, openActiveTextItem: @escaping (TooltipActiveTextItem, TooltipActiveTextAction) -> Void = { _, _ in }) {
self.text = text
self.textEntities = textEntities
self.style = style
self.icon = icon
+ self.customContentNode = customContentNode
self.location = location
self.displayDuration = displayDuration
self.shouldDismissOnTouch = shouldDismissOnTouch
@@ -580,7 +589,7 @@ public final class TooltipScreen: ViewController {
}
override public func loadDisplayNode() {
- self.displayNode = TooltipScreenNode(text: self.text, textEntities: self.textEntities, style: self.style, icon: self.icon, location: self.location, displayDuration: self.displayDuration, shouldDismissOnTouch: self.shouldDismissOnTouch, requestDismiss: { [weak self] in
+ self.displayNode = TooltipScreenNode(text: self.text, textEntities: self.textEntities, style: self.style, icon: self.icon, customContentNode: self.customContentNode, location: self.location, displayDuration: self.displayDuration, shouldDismissOnTouch: self.shouldDismissOnTouch, requestDismiss: { [weak self] in
guard let strongSelf = self else {
return
}
diff --git a/submodules/UrlHandling/Sources/UrlHandling.swift b/submodules/UrlHandling/Sources/UrlHandling.swift
index f814af7b40..d24349be69 100644
--- a/submodules/UrlHandling/Sources/UrlHandling.swift
+++ b/submodules/UrlHandling/Sources/UrlHandling.swift
@@ -8,9 +8,6 @@ import MtProtoKit
import TelegramPresentationData
import TelegramUIPreferences
import AccountContext
-#if ENABLE_WALLET
-import WalletUrl
-#endif
private let baseTelegramMePaths = ["telegram.me", "t.me", "telegram.dog"]
private let baseTelegraPhPaths = ["telegra.ph/", "te.legra.ph/", "graph.org/", "t.me/iv?"]
@@ -494,13 +491,6 @@ public func parseWallpaperUrl(_ url: String) -> WallpaperUrlParameter? {
}
public func resolveUrlImpl(account: Account, url: String) -> Signal {
- #if ENABLE_WALLET
- if url.hasPrefix("ton://") {
- if let url = URL(string: url), let parsedUrl = parseWalletUrl(url) {
- return .single(.wallet(address: parsedUrl.address, amount: parsedUrl.amount, comment: parsedUrl.comment))
- }
- }
- #endif
let schemes = ["http://", "https://", ""]
for basePath in baseTelegramMePaths {
for scheme in schemes {
diff --git a/submodules/WebPBinding/Sources/UIImage+WebP.m b/submodules/WebPBinding/Sources/UIImage+WebP.m
index 19f4c6037d..3f541a37c7 100644
--- a/submodules/WebPBinding/Sources/UIImage+WebP.m
+++ b/submodules/WebPBinding/Sources/UIImage+WebP.m
@@ -72,17 +72,24 @@
+ (NSData * _Nullable)convertToWebP:(UIImage * _Nonnull)image quality:(CGFloat)quality error:(NSError ** _Nullable)error {
WebPPreset preset = WEBP_PRESET_DEFAULT;
- CGImageRef webPImageRef = image.CGImage;
- size_t webPBytesPerRow = CGImageGetBytesPerRow(webPImageRef);
-
- size_t webPImageWidth = CGImageGetWidth(webPImageRef);
- size_t webPImageHeight = CGImageGetHeight(webPImageRef);
-
- CGDataProviderRef webPDataProviderRef = CGImageGetDataProvider(webPImageRef);
- CFDataRef webPImageDatRef = CGDataProviderCopyData(webPDataProviderRef);
-
- uint8_t *webPImageData = (uint8_t *)CFDataGetBytePtr(webPImageDatRef);
-
+ CGImageRef imageRef = [image CGImage];
+
+ NSUInteger width = CGImageGetWidth(imageRef);
+ NSUInteger height = CGImageGetHeight(imageRef);
+
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+
+ uint8_t *rawData = malloc(height * width * 4);
+
+ NSUInteger bytesPerPixel = 4;
+ NSUInteger bytesPerRow = bytesPerPixel * width;
+ NSUInteger bitsPerComponent = 8;
+ CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
+ CGColorSpaceRelease(colorSpace);
+
+ CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
+ CGContextRelease(context);
+
WebPConfig config;
if (!WebPConfigPreset(&config, preset, quality)) {
NSMutableDictionary *errorDetail = [NSMutableDictionary dictionary];
@@ -90,7 +97,7 @@
if(error != NULL)
*error = [NSError errorWithDomain:[NSString stringWithFormat:@"%@.errorDomain", [[NSBundle mainBundle] bundleIdentifier]] code:-101 userInfo:errorDetail];
- CFRelease(webPImageDatRef);
+ free(rawData);
return nil;
}
@@ -102,7 +109,7 @@
if(error != NULL)
*error = [NSError errorWithDomain:[NSString stringWithFormat:@"%@.errorDomain", [[NSBundle mainBundle] bundleIdentifier]] code:-101 userInfo:errorDetail];
- CFRelease(webPImageDatRef);
+ free(rawData);
return nil;
}
@@ -113,19 +120,19 @@
if(error != NULL)
*error = [NSError errorWithDomain:[NSString stringWithFormat:@"%@.errorDomain", [[NSBundle mainBundle] bundleIdentifier]] code:-101 userInfo:errorDetail];
- CFRelease(webPImageDatRef);
+ free(rawData);
return nil;
}
- pic.width = (int)webPImageWidth;
- pic.height = (int)webPImageHeight;
+ pic.width = (int)width;
+ pic.height = (int)height;
pic.colorspace = WEBP_YUV420;
- if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){12, 0, 0}]) {
- WebPPictureImportRGBA(&pic, webPImageData, (int)webPBytesPerRow);
- } else {
- WebPPictureImportBGRA(&pic, webPImageData, (int)webPBytesPerRow);
- }
+// if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){12, 0, 0}]) {
+ WebPPictureImportRGBA(&pic, rawData, (int)bytesPerRow);
+// } else {
+// WebPPictureImportBGRA(&pic, webPImageData, (int)webPBytesPerRow);
+// }
WebPPictureARGBToYUVA(&pic, WEBP_YUV420);
WebPCleanupTransparentArea(&pic);
@@ -140,7 +147,7 @@
free(writer.mem);
WebPPictureFree(&pic);
- CFRelease(webPImageDatRef);
+ free(rawData);
return webPFinalData;
}
diff --git a/submodules/WebSearchUI/Sources/WebSearchController.swift b/submodules/WebSearchUI/Sources/WebSearchController.swift
index d15c663dc4..2e872a9aa8 100644
--- a/submodules/WebSearchUI/Sources/WebSearchController.swift
+++ b/submodules/WebSearchUI/Sources/WebSearchController.swift
@@ -150,7 +150,7 @@ public final class WebSearchController: ViewController {
private var navigationContentNode: WebSearchNavigationContentNode?
- var presentStickers: ((@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?)? {
+ public var presentStickers: ((@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?)? {
didSet {
self.controllerNode.presentStickers = self.presentStickers
}